'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({ items: function() { self.$menu.options({items: self.options.items}); }, 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) + ( self.options.overlap != 'none' ? ' OxOverlap' + Ox.toTitleCase(self.options.overlap) : '' ) ) .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', 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; }; /*@ removeElement removeElement @*/ that.removeElement = function() { self.$menu.remove(); return Ox.Element.prototype.removeElement.apply(that, arguments); }; /*@ 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; };