'use strict'; /*@ Ox.MenuButton Menu Button options Options object disabled If true, button is disabled id Element id items Menu items maxWidth Maximum menu width style Style ('rounded' or 'square') title Menu title tooltip Tooltip title, or function that returns one (e) -> Tooltip title e Mouse event type Type ('text' or 'image') width Width in px, or 'auto' click click change change hide hide show show self Shared private variable ([options[, self]]) -> Menu Button @*/ Ox.MenuButton = function(options, self) { self = self || {}; var that = Ox.Element({ tooltip: options.tooltip || '' }, self) .defaults({ disabled: false, id: '', items: [], maxWidth: 0, overlap: 'none', style: 'rounded', title: '', type: 'text', width: 'auto' }) .options(options || {}) .update({ title: function() { if (self.options.type == 'text') { self.$title.html(self.options.title); } else { self.$button.options({title: self.options.title}); } }, width: function() { that.css({width: self.options.width - 2 + 'px'}); self.$title.css({width: self.options.width - 24 + 'px'}); } }) .addClass( 'OxSelect Ox' + Ox.toTitleCase(self.options.style) ) .css(self.options.width == 'auto' ? {} : { width: self.options.width - 2 + 'px' }) .bindEvent({ anyclick: function(e) { showMenu($(e.target).is('.OxButton') ? 'button' : null); }, }); if (self.options.type == 'text') { self.$title = Ox.$('
') .addClass('OxTitle') .css({width: self.options.width - 24 + 'px'}) .html(self.options.title) .appendTo(that); } self.$button = Ox.Button({ id: self.options.id + 'Button', selectable: true, overlap: self.options.overlap, style: 'symbol', title: self.options.type == 'text' || !self.options.title ? 'select' : self.options.title, type: 'image' }) .appendTo(that); self.$menu = Ox.Menu({ edge: 'bottom', // FIXME: should be edge element: self.$title || self.$button, id: self.options.id + 'Menu', items: self.options.items, maxWidth: self.options.maxWidth }) .bindEvent({ change: changeMenu, click: clickMenu, hide: hideMenu }); self.options.type == 'image' && self.$menu.addClass('OxRight'); function clickMenu(data) { that.triggerEvent('click', data); } function changeMenu(data) { that.triggerEvent('change', data); } function hideMenu(data) { that.loseFocus(); that.removeClass('OxSelected'); self.$button.options({value: false}); that.triggerEvent('hide'); } function showMenu(from) { that.gainFocus(); that.addClass('OxSelected'); from != 'button' && self.$button.options({value: true}); that.$tooltip && that.$tooltip.hide(); self.$menu.showMenu(); that.triggerEvent('show'); } /*@ checkItem checkItem (id) -> check item with id @*/ that.checkItem = function(id) { self.$menu.checkItem(id); return that; }; /*@ disableItem disableItem (id) -> disable item with id @*/ that.disableItem = function(id) { self.$menu.getItem(id).options({disabled: true}); return that; }; /*@ enableItem enableItem (id) -> enable item @*/ that.enableItem = function(id) { self.$menu.getItem(id).options({disabled: false}); return that; }; /*@ remove remove () -> remove item @*/ self.superRemove = that.remove; that.remove = function() { self.$menu.remove(); self.superRemove(); return that; }; /*@ setItemTitle setItemTitle (id, title) -> set item title @*/ that.setItemTitle = function(id, title) { self.$menu.setItemTitle(id, title); return that; }; /*@ uncheckItem uncheck item (id) -> uncheck item with id @*/ that.uncheckItem = function(id) { self.$menu.uncheckItem(id); return that; }; return that; };