SemanticScuttle/includes/js/dojox/form/CheckedMultiSelect.js

224 lines
6.2 KiB
JavaScript
Raw Normal View History

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;
}
});
}