dijit
Version:
Dijit provides a complete collection of user interface controls based on Dojo, giving you the power to create web applications that are highly optimized for usability, performance, internationalization, accessibility, but above all deliver an incredible u
183 lines (154 loc) • 5.58 kB
JavaScript
define([
"dojo/_base/declare", // declare
"dojo/dom", // dom.setSelectable
"dojo/dom-attr", // domAttr.attr
"dojo/dom-class", // domClass.toggle
"dojo/has",
"dojo/i18n", // i18n.getLocalization
"dojo/_base/lang", // lang.hitch lang.trim
"./StackController",
"../registry",
"../Menu",
"../MenuItem",
"dojo/text!./templates/_TabButton.html",
"dojo/i18n!../nls/common"
], function(declare, dom, domAttr, domClass, has, i18n, lang, StackController, registry, Menu, MenuItem, template){
// module:
// dijit/layout/TabController
var TabButton = declare("dijit.layout._TabButton" + (has("dojo-bidi") ? "_NoBidi" : ""), StackController.StackButton, {
// summary:
// A tab (the thing you click to select a pane).
// description:
// Contains the title of the pane, and optionally a close-button to destroy the pane.
// This is an internal widget and should not be instantiated directly.
// tags:
// private
// baseClass: String
// The CSS class applied to the domNode.
baseClass: "dijitTab",
// Apply dijitTabCloseButtonHover when close button is hovered
cssStateNodes: {
closeNode: "dijitTabCloseButton"
},
templateString: template,
// Button superclass maps name to a this.valueNode, but we don't have a this.valueNode attach point
_setNameAttr: "focusNode",
// Override _FormWidget.scrollOnFocus.
// Don't scroll the whole tab container into view when the button is focused.
scrollOnFocus: false,
buildRendering: function(){
this.inherited(arguments);
dom.setSelectable(this.containerNode, false);
},
startup: function(){
this.inherited(arguments);
var n = this.domNode;
// Required to give IE6 a kick, as it initially hides the
// tabs until they are focused on.
this.defer(function(){
n.className = n.className;
}, 1);
},
_setCloseButtonAttr: function(/*Boolean*/ disp){
// summary:
// Hide/show close button
this._set("closeButton", disp);
domClass.toggle(this.domNode, "dijitClosable", disp);
this.closeNode.style.display = disp ? "" : "none";
if(disp){
var _nlsResources = i18n.getLocalization("dijit", "common");
if(this.closeNode){
domAttr.set(this.closeNode, "title", _nlsResources.itemClose);
}
}
},
_setDisabledAttr: function(/*Boolean*/ disabled){
// summary:
// Make tab selected/unselectable
this.inherited(arguments);
// Don't show tooltip for close button when tab is disabled
if(this.closeNode){
if(disabled){
domAttr.remove(this.closeNode, "title");
}else{
var _nlsResources = i18n.getLocalization("dijit", "common");
domAttr.set(this.closeNode, "title", _nlsResources.itemClose);
}
}
},
_setLabelAttr: function(/*String*/ content){
// summary:
// Hook for set('label', ...) to work.
// description:
// takes an HTML string.
// Inherited ToggleButton implementation will Set the label (text) of the button;
// Need to set the alt attribute of icon on tab buttons if no label displayed
this.inherited(arguments);
if(!this.showLabel && !this.params.title){
this.iconNode.alt = lang.trim(this.containerNode.innerText || this.containerNode.textContent || '');
}
}
});
if(has("dojo-bidi")){
TabButton = declare("dijit.layout._TabButton", TabButton, {
_setLabelAttr: function(/*String*/ content){
this.inherited(arguments);
this.applyTextDir(this.iconNode, this.iconNode.alt);
}
});
}
var TabController = declare("dijit.layout.TabController", StackController, {
// summary:
// Set of tabs (the things with titles and a close button, that you click to show a tab panel).
// Used internally by `dijit/layout/TabContainer`.
// description:
// Lets the user select the currently shown pane in a TabContainer or StackContainer.
// TabController also monitors the TabContainer, and whenever a pane is
// added or deleted updates itself accordingly.
// tags:
// private
baseClass: "dijitTabController",
templateString: "<div role='tablist' data-dojo-attach-event='onkeydown:onkeydown'></div>",
// tabPosition: String
// Defines where tabs go relative to the content.
// "top", "bottom", "left-h", "right-h"
tabPosition: "top",
// buttonWidget: Constructor
// The tab widget to create to correspond to each page
buttonWidget: TabButton,
// buttonWidgetCloseClass: String
// Class of [x] close icon, used by event delegation code to tell when close button was clicked
buttonWidgetCloseClass: "dijitTabCloseButton",
postCreate: function(){
this.inherited(arguments);
// Setup a close menu to be shared between all the closable tabs (excluding disabled tabs)
var closeMenu = new Menu({
id: this.id + "_Menu",
ownerDocument: this.ownerDocument,
dir: this.dir,
lang: this.lang,
textDir: this.textDir,
targetNodeIds: [this.domNode],
selector: function(node){
return domClass.contains(node, "dijitClosable") && !domClass.contains(node, "dijitTabDisabled");
}
});
this.own(closeMenu);
var _nlsResources = i18n.getLocalization("dijit", "common"),
controller = this;
closeMenu.addChild(new MenuItem({
label: _nlsResources.itemClose,
ownerDocument: this.ownerDocument,
dir: this.dir,
lang: this.lang,
textDir: this.textDir,
onClick: function(evt){
var button = registry.byNode(this.getParent().currentTarget);
controller.onCloseButtonClick(button.page);
}
}));
}
});
TabController.TabButton = TabButton; // for monkey patching
return TabController;
});