/**
|
|
enyo.TabPanels is a subkind of <a href="#enyo.Panels">enyo.Panels</a> 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
|
|
});
|