129 lines
4.4 KiB
JavaScript
129 lines
4.4 KiB
JavaScript
|
dojo.provide("dijit.layout.TabContainer");
|
||
|
|
||
|
dojo.require("dijit.layout.StackContainer");
|
||
|
dojo.require("dijit._Templated");
|
||
|
dojo.require("dijit.layout.TabController");
|
||
|
|
||
|
dojo.declare("dijit.layout.TabContainer",
|
||
|
[dijit.layout.StackContainer, dijit._Templated],
|
||
|
{
|
||
|
// summary:
|
||
|
// A Container with tabs to select each child (only one of which is displayed at a time).
|
||
|
// description:
|
||
|
// A TabContainer is a container that has multiple panes, but shows only
|
||
|
// one pane at a time. There are a set of tabs corresponding to each pane,
|
||
|
// where each tab has the title (aka title) of the pane, and optionally a close button.
|
||
|
//
|
||
|
// Publishes topics [widgetId]-addChild, [widgetId]-removeChild, and [widgetId]-selectChild
|
||
|
// (where [widgetId] is the id of the TabContainer itself.
|
||
|
|
||
|
// tabPosition: String
|
||
|
// Defines where tabs go relative to tab content.
|
||
|
// "top", "bottom", "left-h", "right-h"
|
||
|
tabPosition: "top",
|
||
|
|
||
|
baseClass: "dijitTabContainer",
|
||
|
|
||
|
// tabStrip: Boolean
|
||
|
// Defines whether the tablist gets an extra class for layouting, putting a border/shading
|
||
|
// around the set of tabs.
|
||
|
tabStrip: false,
|
||
|
|
||
|
// nested: Boolean
|
||
|
// If true, use styling for a TabContainer nested inside another TabContainer.
|
||
|
// For tundra etc., makes tabs look like links, and hides the outer
|
||
|
// border since the outer TabContainer already has a border.
|
||
|
nested: false,
|
||
|
|
||
|
templateString: null, // override setting in StackContainer
|
||
|
templatePath: dojo.moduleUrl("dijit.layout", "templates/TabContainer.html"),
|
||
|
|
||
|
// _controllerWidget: String
|
||
|
// An optional parameter to overrider the default TabContainer controller used.
|
||
|
_controllerWidget: "dijit.layout.TabController",
|
||
|
|
||
|
postMixInProperties: function(){
|
||
|
// set class name according to tab position, ex: dijiTabContainerTop
|
||
|
this.baseClass += this.tabPosition.charAt(0).toUpperCase() + this.tabPosition.substr(1).replace(/-.*/, "");
|
||
|
this.inherited(arguments);
|
||
|
},
|
||
|
|
||
|
postCreate: function(){
|
||
|
this.inherited(arguments);
|
||
|
|
||
|
// create the tab list that will have a tab (a.k.a. tab button) for each tab panel
|
||
|
var TabController = dojo.getObject(this._controllerWidget);
|
||
|
this.tablist = new TabController({
|
||
|
id: this.id + "_tablist",
|
||
|
tabPosition: this.tabPosition,
|
||
|
doLayout: this.doLayout,
|
||
|
containerId: this.id,
|
||
|
"class": this.baseClass + "-tabs" + (this.doLayout ? "" : " dijitTabNoLayout")
|
||
|
}, this.tablistNode);
|
||
|
|
||
|
// add Class for tabstrip
|
||
|
if (this.tabStrip){ dojo.addClass(this.tablist.domNode, this.baseClass+"Strip"); }
|
||
|
|
||
|
if(!this.doLayout){ dojo.addClass(this.domNode, "dijitTabContainerNoLayout"); }
|
||
|
|
||
|
if(this.nested){
|
||
|
/* workaround IE's lack of support for "a > b" selectors by
|
||
|
* tagging each node in the template.
|
||
|
*/
|
||
|
dojo.addClass(this.domNode, "dijitTabContainerNested");
|
||
|
dojo.addClass(this.tablist.domNode, "dijitTabContainerTabListNested");
|
||
|
dojo.addClass(this.tablistSpacer, "dijitTabContainerSpacerNested");
|
||
|
dojo.addClass(this.containerNode, "dijitTabPaneWrapperNested");
|
||
|
}
|
||
|
},
|
||
|
|
||
|
_setupChild: function(/* Widget */tab){
|
||
|
// Overrides StackContainer._setupChild().
|
||
|
dojo.addClass(tab.domNode, "dijitTabPane");
|
||
|
this.inherited(arguments);
|
||
|
return tab; // Widget (TODO: remove this, return code is unused)
|
||
|
},
|
||
|
|
||
|
startup: function(){
|
||
|
if(this._started){ return; }
|
||
|
|
||
|
// wire up the tablist and its tabs
|
||
|
this.tablist.startup();
|
||
|
this.inherited(arguments);
|
||
|
},
|
||
|
|
||
|
layout: function(){
|
||
|
// Overrides StackContainer.layout().
|
||
|
// Configure the content pane to take up all the space except for where the tabs are
|
||
|
if(!this.doLayout){ return; }
|
||
|
|
||
|
// position and size the titles and the container node
|
||
|
var titleAlign = this.tabPosition.replace(/-h/,"");
|
||
|
var children = [
|
||
|
{ domNode: this.tablist.domNode, layoutAlign: titleAlign },
|
||
|
{ domNode: this.tablistSpacer, layoutAlign: titleAlign },
|
||
|
{ domNode: this.containerNode, layoutAlign: "client" }
|
||
|
];
|
||
|
dijit.layout.layoutChildren(this.domNode, this._contentBox, children);
|
||
|
|
||
|
// Compute size to make each of my children.
|
||
|
// children[2] is the margin-box size of this.containerNode, set by layoutChildren() call above
|
||
|
this._containerContentBox = dijit.layout.marginBox2contentBox(this.containerNode, children[2]);
|
||
|
|
||
|
if(this.selectedChildWidget){
|
||
|
this._showChild(this.selectedChildWidget);
|
||
|
if(this.doLayout && this.selectedChildWidget.resize){
|
||
|
this.selectedChildWidget.resize(this._containerContentBox);
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
|
||
|
destroy: function(){
|
||
|
if(this.tablist){
|
||
|
this.tablist.destroy();
|
||
|
}
|
||
|
this.inherited(arguments);
|
||
|
}
|
||
|
});
|
||
|
|