/** enyo.TabPanels is a subkind of enyo.Panels that displays a set of tabs, which allow navigation between the individual panels. Unlike enyo.Panels, by default, the user cannot drag between the panels of a TabPanels. This behavior can be enabled by setting *draggable* to true. Here's an example: enyo.kind({ name: "App", kind: "TabPanels", fit: true, components: [ {kind: "MyStartPanel"}, {kind: "MyMiddlePanel"}, {kind: "MyLastPanel"} ] }); new App().write(); */ enyo.kind({ name: "enyo.TabPanels", kind: "Panels", //* @protected draggable: false, tabTools: [ {name: "scroller", kind: "Scroller", maxHeight: "100px", strategyKind: "TranslateScrollStrategy", thumb: false, vertical: "hidden", horizontal: "auto", components: [ {name: "tabs", kind: "onyx.RadioGroup", style: "text-align: left; white-space: nowrap", controlClasses: "onyx-tabbutton", onActivate: "tabActivate"} ]}, {name: "client", fit: true, kind: "Panels", classes: "enyo-tab-panels", onTransitionStart: "clientTransitionStart"} ], create: function() { this.inherited(arguments); this.$.client.getPanels = enyo.bind(this, "getClientPanels"); this.draggableChanged(); this.animateChanged(); this.wrapChanged(); }, initComponents: function() { this.createChrome(this.tabTools); this.inherited(arguments); }, getClientPanels: function() { return this.getPanels(); }, flow: function() { this.inherited(arguments); this.$.client.flow(); }, reflow: function() { this.inherited(arguments); this.$.client.reflow(); }, draggableChanged: function() { this.$.client.setDraggable(this.draggable); this.draggable = false; }, animateChanged: function() { this.$.client.setAnimate(this.animate); this.animate = false; }, wrapChanged: function() { this.$.client.setWrap(this.wrap); this.wrap = false; }, isPanel: function(inControl) { var n = inControl.name; return !(n == "tabs" || n == "client" || n == "scroller"); }, addControl: function(inControl) { this.inherited(arguments); if (this.isPanel(inControl)) { var c = inControl.caption || ("Tab " + this.$.tabs.controls.length); var t = inControl._tab = this.$.tabs.createComponent({content: c}); if (this.hasNode()) { t.render(); } } }, removeControl: function(inControl) { if (this.isPanel(inControl) && inControl._tab) { inControl._tab.destroy(); } this.inherited(arguments); }, layoutKindChanged: function() { if (!this.layout) { this.layout = enyo.createFromKind("FittableRowsLayout", this); } this.$.client.setLayoutKind(this.layoutKind); }, indexChanged: function() { // FIXME: initialization order problem if (this.$.client.layout) { this.$.client.setIndex(this.index); } this.index = this.$.client.getIndex(); }, tabActivate: function(inSender, inEvent) { if (this.hasNode()) { if (inEvent.originator.active) { var i = inEvent.originator.indexInContainer(); if (this.getIndex() != i) { this.setIndex(i); } } } }, clientTransitionStart: function(inSender, inEvent) { var i = inEvent.toIndex; var t = this.$.tabs.getClientControls()[i]; if (t && t.hasNode()) { this.$.tabs.setActive(t); var tn = t.node; var tl = tn.offsetLeft; var tr = tl + tn.offsetWidth; var sb = this.$.scroller.getScrollBounds(); if (tr < sb.left || tr > sb.left + sb.clientWidth) { this.$.scroller.scrollToControl(t); } } return true; }, startTransition: enyo.nop, finishTransition: enyo.nop, stepTransition: enyo.nop, refresh: enyo.nop });