/** onyx.MoreToolbar is a kind of onyx.Toolbar that can adapt to different screen sizes by moving overflowing controls and content into an onyx.Menu {kind: "onyx.MoreToolbar", components: [ {content: "More Toolbar", unmoveable: true}, {kind: "onyx.Button", content: "Alpha"}, {kind: "onyx.Button", content: "Beta"}, {kind: "onyx.Button", content: "Gamma", unmoveable: true}, {kind: "onyx.Button", content: "Epsilon"} ]}, A control can be forced to never move to the menu by setting the optional unmovable property to true (default is false). Optionally you can specify a class to be applied to the menu via the menuClass property. You can also specify a class for items that have been moved via the the movedClass property. */ enyo.kind({ name: "onyx.MoreToolbar", //* @public classes: "onyx-toolbar onyx-more-toolbar", //* style class to be applied to the menu menuClass: "", //* style class to be applied to individual controls moved from the toolbar to the menu movedClass: "", //* @protected layoutKind: "FittableColumnsLayout", noStretch: true, handlers: { onHide: "reflow" }, tools: [ {name: "client", fit: true, classes: "onyx-toolbar-inline"}, {name: "nard", kind: "onyx.MenuDecorator", showing: false, onActivate: "activated", components: [ {kind: "onyx.IconButton", classes: "onyx-more-button"}, {name: "menu", kind: "onyx.Menu", classes: "onyx-more-menu", prepend: true} ]} ], initComponents: function() { if(this.menuClass && this.menuClass.length>0 && !this.$.menu.hasClass(this.menuClass)) { this.$.menu.addClass(this.menuClass); } this.createChrome(this.tools); this.inherited(arguments); }, reflow: function() { this.inherited(arguments); if (this.isContentOverflowing()) { this.$.nard.show(); if (this.popItem()) { this.reflow(); } } else if (this.tryPushItem()) { this.reflow(); } else if (!this.$.menu.children.length) { this.$.nard.hide(); this.$.menu.hide(); } }, activated: function(inSender, inEvent) { this.addRemoveClass("active",inEvent.originator.active); }, popItem: function() { var c = this.findCollapsibleItem(); if (c) { //apply movedClass is needed if(this.movedClass && this.movedClass.length>0 && !c.hasClass(this.movedClass)) { c.addClass(this.movedClass); } this.$.menu.addChild(c); var p = this.$.menu.hasNode(); if (p && c.hasNode()) { c.insertNodeInParent(p); } return true; } }, pushItem: function() { var c$ = this.$.menu.children; var c = c$[0]; if (c) { //remove any applied movedClass if(this.movedClass && this.movedClass.length>0 && c.hasClass(this.movedClass)) { c.removeClass(this.movedClass); } this.$.client.addChild(c); var p = this.$.client.hasNode(); if (p && c.hasNode()) { var nextChild = undefined; var currIndex; for(var i=0; i this.$.client.node.clientWidth); return ((n.offsetLeft + n.offsetWidth) > this.$.client.node.clientWidth); } } }, findCollapsibleItem: function() { var c$ = this.$.client.children; for (var i=c$.length-1; c=c$[i]; i--) { if (!c.unmoveable) { return c; } else { if(c.toolbarIndex==undefined) { c.toolbarIndex = i; } } } } });