blob: 2ddde7fae0e5e4287d76ada89971c75b1e34283b [file] [log] [blame]
/*
Copyright (c) 2004-2005, The Dojo Foundation
All Rights Reserved.
Licensed under the Academic Free License version 2.1 or above OR the
modified BSD license. For more information on Dojo licensing, see:
http://dojotoolkit.org/community/licensing.shtml
*/
dojo.provide("dojo.widget.TabPane");
dojo.provide("dojo.widget.html.TabPane");
dojo.provide("dojo.widget.Tab");
dojo.provide("dojo.widget.html.Tab");
dojo.require("dojo.widget.*");
dojo.require("dojo.widget.LayoutPane");
dojo.require("dojo.event.*");
dojo.require("dojo.html");
dojo.require("dojo.style");
//////////////////////////////////////////
// TabPane -- a set of Tabs
//////////////////////////////////////////
dojo.widget.html.TabPane = function() {
dojo.widget.html.LayoutPane.call(this);
}
dojo.inherits(dojo.widget.html.TabPane, dojo.widget.html.LayoutPane);
dojo.lang.extend(dojo.widget.html.TabPane, {
widgetType: "TabPane",
// Constructor arguments
labelPosition: "top",
useVisibility: false, // true-->use visibility:hidden instead of display:none
templateCssPath: dojo.uri.dojoUri("src/widget/templates/HtmlTabPane.css"),
selectedTab: "", // initially selected tab (widgetId)
fillInTemplate: function(args, frag) {
dojo.widget.html.TabPane.superclass.fillInTemplate.call(this, args, frag);
dojo.style.insertCssFile(this.templateCssPath, null, true);
dojo.html.prependClass(this.domNode, "dojoTabPane");
},
postCreate: function(args, frag) {
// Create <ul> with special formatting to store all the tab labels
// TODO: set "bottom" css tag if label is on bottom
this.ul = document.createElement("ul");
dojo.html.addClass(this.ul, "tabs");
dojo.html.addClass(this.ul, this.labelPosition);
// Load all the tabs, creating a label for each one
for(var i=0; i<this.children.length; i++){
this._setupTab(this.children[i]);
}
dojo.widget.html.TabPane.superclass.postCreate.call(this, args, frag);
// Put tab labels in a panel on the top (or bottom)
this.filterAllowed(this, 'labelPosition', ['top', 'bottom']);
this.labelPanel = dojo.widget.createWidget("LayoutPane", {layoutAlign: this.labelPosition});
this.labelPanel.domNode.appendChild(this.ul);
dojo.widget.html.TabPane.superclass.addChild.call(this, this.labelPanel);
// workaround CSS loading race condition bug
dojo.lang.setTimeout(this, this.onResized, 50);
},
addChild: function(child, overrideContainerNode, pos, ref, insertIndex){
this._setupTab(child);
dojo.widget.html.TabPane.superclass.addChild.call(this,child, overrideContainerNode, pos, ref, insertIndex);
},
_setupTab: function(tab){
tab.layoutAlign = "client";
tab.domNode.style.display="none";
dojo.html.prependClass(tab.domNode, "dojoTabPanel");
// Create label
tab.li = document.createElement("li");
var span = document.createElement("span");
span.innerHTML = tab.label;
dojo.html.disableSelection(span);
tab.li.appendChild(span);
this.ul.appendChild(tab.li);
var self = this;
dojo.event.connect(tab.li, "onclick", function(){ self.selectTab(tab); });
if(!this.selectedTabWidget || this.selectedTab==tab.widgetId || tab.selected){
this.selectedTabWidget=tab;
}
},
selectTab: function(tab) {
// Deselect old tab and select new one
if (this.selectedTabWidget) {
this._hideTab(this.selectedTabWidget);
}
this.selectedTabWidget = tab;
this._showTab(tab);
},
_showTab: function(tab) {
dojo.html.addClass(tab.li, "current");
tab.selected=true;
if ( this.useVisibility && !dojo.render.html.ie ) {
tab.domNode.style.visibility="visible";
} else {
tab.show();
}
},
_hideTab: function(tab) {
dojo.html.removeClass(tab.li, "current");
tab.selected=false;
if( this.useVisibility ){
tab.domNode.style.visibility="hidden";
}else{
tab.hide();
}
},
onResized: function() {
// Display the selected tab
if(this.selectedTabWidget){
this.selectTab(this.selectedTabWidget);
}
dojo.widget.html.TabPane.superclass.onResized.call(this);
}
});
dojo.widget.tags.addParseTreeHandler("dojo:TabPane");
// These arguments can be specified for the children of a TabPane.
// Since any widget can be specified as a TabPane child, mix them
// into the base widget class. (This is a hack, but it's effective.)
dojo.lang.extend(dojo.widget.Widget, {
label: "",
selected: false // is this tab currently selected?
});
// Deprecated class. TabPane can take any widget as input.
// Use ContentPane, LayoutPane, etc.
dojo.widget.html.Tab = function() {
dojo.widget.html.LayoutPane.call(this);
}
dojo.inherits(dojo.widget.html.Tab, dojo.widget.html.LayoutPane);
dojo.lang.extend(dojo.widget.html.Tab, {
widgetType: "Tab"
});
dojo.widget.tags.addParseTreeHandler("dojo:Tab");