summaryrefslogtreecommitdiff
path: root/includes/js/dojox/form/CheckedMultiSelect.js
diff options
context:
space:
mode:
Diffstat (limited to 'includes/js/dojox/form/CheckedMultiSelect.js')
-rw-r--r--includes/js/dojox/form/CheckedMultiSelect.js223
1 files changed, 223 insertions, 0 deletions
diff --git a/includes/js/dojox/form/CheckedMultiSelect.js b/includes/js/dojox/form/CheckedMultiSelect.js
new file mode 100644
index 0000000..eb80c72
--- /dev/null
+++ b/includes/js/dojox/form/CheckedMultiSelect.js
@@ -0,0 +1,223 @@
+if(!dojo._hasResource["dojox.form.CheckedMultiSelect"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.form.CheckedMultiSelect"] = true;
+dojo.provide("dojox.form.CheckedMultiSelect");
+
+dojo.require("dijit.form.MultiSelect");
+dojo.require("dijit.form.CheckBox");
+
+dojo.declare("dojox.form._CheckedMultiSelectItem",
+ [dijit._Widget, dijit._Templated],
+ {
+ // summary:
+ // The individual items for a CheckedMultiSelect
+
+ widgetsInTemplate: true,
+ templateString:"<div class=\"dijitReset ${baseClass}\"\n\t><input class=\"${baseClass}Box\" dojoType=\"dijit.form.CheckBox\" dojoAttachPoint=\"checkBox\" dojoAttachEvent=\"_onClick:_changeBox\" type=\"checkbox\" \n\t><div class=\"dijitInline ${baseClass}Label\" dojoAttachPoint=\"labelNode\" dojoAttachEvent=\"onmousedown:_onMouse,onmouseover:_onMouse,onmouseout:_onMouse,onclick:_onClick\">${option.innerHTML}</div\n></div>\n",
+
+ baseClass: "dojoxMultiSelectItem",
+
+ // option: Element
+ // The option that is associated with this item
+ option: null,
+ parent: null,
+
+ // disabled: boolean
+ // Whether or not this widget is disabled
+ disabled: false,
+
+ _changeBox: function(){
+ // summary:
+ // Called to force the select to match the state of the check box
+ // (only on click of the checkbox)
+ this.option.selected = this.checkBox.getValue() && true;
+
+ // fire the parent's change
+ this.parent._onChange();
+
+ // refocus the parent
+ this.parent.focus();
+ },
+
+ _labelClick: function(){
+ // summary:
+ // Called when the label portion is clicked
+ dojo.stopEvent(e);
+ if(this.disabled){
+ return;
+ }
+ var cb = this.checkBox;
+ cb.setValue(!cb.getValue());
+ this._changeBox();
+ },
+
+ _onMouse: function(e){
+ // summary:
+ // Sets the hover state depending on mouse state (passes through
+ // to the check box)
+ this.checkBox._onMouse(e);
+ },
+
+ _onClick: function(e){
+ // summary:
+ // Sets the click state (passes through to the check box)
+ this.checkBox._onClick(e);
+ },
+
+ _updateBox: function(){
+ // summary:
+ // Called to force the box to match the state of the select
+ this.checkBox.setValue(this.option.selected);
+ },
+
+ setAttribute: function(attr, value){
+ // summary:
+ // Disables (or enables) all the children as well
+ this.inherited(arguments);
+ switch(attr){
+ case "disabled":
+ this.checkBox.setAttribute(attr, value);
+ break;
+ default:
+ break;
+ }
+ }
+});
+
+dojo.declare("dojox.form.CheckedMultiSelect", dijit.form.MultiSelect, {
+ // summary:
+ // Extends the core dijit MultiSelect to provide a "checkbox" selector
+
+ templateString: "",
+ templateString:"<div class=\"dijit dijitReset dijitInline\" dojoAttachEvent=\"onmousedown:_mouseDown,onclick:focus\"\n\t><select class=\"${baseClass}Select\" multiple=\"true\" dojoAttachPoint=\"containerNode,focusNode\" dojoAttachEvent=\"onchange: _onChange\"></select\n\t><div dojoAttachPoint=\"wrapperDiv\"></div\n></div>\n",
+
+ baseClass: "dojoxMultiSelect",
+
+ // children: dojox.form._CheckedMultiSelectItem[]
+ // Array of all our children (for updating them)
+ children: [],
+
+ /*=====
+ dojox.form.__SelectOption = function(){
+ // value: String
+ // The value of the option. Setting to empty (or missing) will
+ // place a separator at that location
+ // label: String
+ // The label for our option. It can contain html tags.
+ this.value = value;
+ this.label = label;
+ }
+ =====*/
+
+ // options: dojox.form.__SelectOption[]
+ // our set of options
+ options: null,
+
+ _mouseDown: function(e){
+ // summary:
+ // Cancels the mousedown event to prevent others from stealing
+ // focus
+ dojo.stopEvent(e);
+ },
+
+ _updateChildren: function(){
+ // summary:
+ // Called to update the checked states of my children to match me
+ dojo.forEach(this.children,function(child){
+ child._updateBox();
+ });
+ },
+
+ _addChild: function(/*Element*/ option){
+ // summary:
+ // Adds and returns a child for the given option.
+ var item = new dojox.form._CheckedMultiSelectItem({
+ option: option,
+ parent: this
+ });
+ this.wrapperDiv.appendChild(item.domNode);
+ return item;
+ },
+
+ _loadChildren: function(){
+ // summary:
+ // Reloads the children to match our box.
+
+ // Destroy any existing children before loading them again
+ dojo.forEach(this.children, function(child){
+ child.destroyRecursive();
+ });
+ this.children = dojo.query("option", this.domNode).map(function(child){
+ return this._addChild(child);
+ }, this);
+ this.options = dojo.map(this.children, function(child){
+ var opt = child.option;
+ return { value:opt.value, label: opt.text };
+ });
+ // Update the statuses of the children
+ this._updateChildren();
+ },
+
+ addOption: function(/* dojox.form.__SelectOption or string, optional */ value, /* string? */ label){
+ // summary: Adds the given option to the select
+
+ var o = new Option("","");
+ o.value = value.value || value;
+ o.innerHTML = value.label || label;
+ this.containerNode.appendChild(o);
+ },
+
+ removeOption: function(/*String*/ optionId){
+ dojo.query("option[value=" + optionId + "]", this.domNode).forEach(function(node){
+ node.parentNode.removeChild(node);
+ }, this);
+ },
+
+ setOptionLabel: function(/*string*/ optionId, /*string*/ label){
+ dojo.query("option[value=" + optionId + "]", this.domNode).forEach(function(node){
+ node.innerHTML = label;
+ });
+ },
+
+ addSelected: function(select){
+ this.inherited(arguments);
+
+ // Reload my children and the children of the guy pointing to me
+ if(select._loadChildren){
+ select._loadChildren();
+ }
+ this._loadChildren();
+ },
+
+ setAttribute: function(attr, value){
+ // summary:
+ // Disable (or enable) all the children as well
+ this.inherited(arguments);
+ switch(attr){
+ case "disabled":
+ dojo.forEach(this.children, function(node){
+ if(node && node.setAttribute){
+ node.setAttribute(attr, value);
+ }
+ });
+ break;
+ default:
+ break;
+ }
+ },
+
+ startup: function(){
+ if(this._started){ return; }
+ this.inherited(arguments);
+
+ // Load children and make connections
+ this._loadChildren();
+ this.connect(this, "setValue", "_updateChildren");
+ this.connect(this, "invertSelection", "_updateChildren");
+ this.connect(this, "addOption", "_loadChildren");
+ this.connect(this, "removeOption", "_loadChildren");
+ this.connect(this, "setOptionLabel", "_loadChildren");
+ this._started = true;
+ }
+});
+
+}