//>>built require({cache:{ 'url:dojox/form/resources/TriStateCheckBox.html':"
"}}); define("dojox/form/TriStateCheckBox", [ "dojo/_base/kernel", "dojo/_base/declare", "dojo/_base/array", "dojo/_base/event", "dojo/query", "dojo/dom-attr", "dojo/text!./resources/TriStateCheckBox.html", "dijit/form/ToggleButton" ], function(kernel, declare, array, event, query, domAttr, template, ToggleButton){ // module: // dojox/form/TriStateCheckBox // summary: // Checkbox with three states // /*===== ToggleButton = dijit.form.ToggleButton; =====*/ return declare("dojox.form.TriStateCheckBox", ToggleButton, { // summary: // Checkbox with three states templateString: template, baseClass: "dojoxTriStateCheckBox", // type: [private] String // type attribute on node. // Overrides `dijit.form.Button.type`. Users should not change this value. type: "checkbox", /*===== // states: Array // States of TriStateCheckBox. // The value of This.checked should be one of these three states. states: [false, true, "mixed"], =====*/ /*===== // _stateLabels: Object // These characters are used to replace the image to show // current state of TriStateCheckBox in high contrast mode. _stateLabels: { "False": '', "True": '√', "Mixed": '≡' }, =====*/ /*===== // stateValues: Object // The values of the TriStateCheckBox in corresponding states. stateValues: { "False": "off", "True": "on", "Mixed": "mixed" }, =====*/ // _currentState: Integer // The current state of the TriStateCheckBox _currentState: 0, // _stateType: String // The current state type of the TriStateCheckBox // Could be "False", "True" or "Mixed" _stateType: "False", // readOnly: Boolean // Should this widget respond to user input? // In markup, this is specified as "readOnly". // Similar to disabled except readOnly form values are submitted. readOnly: false, constructor: function(){ // summary: // Runs on widget initialization to setup arrays etc. // tags: // private this.states = [false, true, "mixed"]; this._stateLabels = { "False": '', "True": '√', "Mixed": '≡' }; this.stateValues = { "False": "off", "True": "on", "Mixed": "mixed" }; }, // Override behavior from Button, since we don't have an iconNode _setIconClassAttr: null, _setCheckedAttr: function(/*String|Boolean*/ checked, /*Boolean?*/ priorityChange){ // summary: // Handler for checked = attribute to constructor, and also calls to // set('checked', val). // checked: // true, false or 'mixed' // description: // Controls the state of the TriStateCheckBox. Set this.checked, // this._currentState, value attribute of the // according to the value of 'checked'. this._set("checked", checked); this._currentState = array.indexOf(this.states, checked); this._stateType = this._getStateType(checked); domAttr.set(this.focusNode || this.domNode, "checked", checked); domAttr.set(this.focusNode, "value", this.stateValues[this._stateType]); (this.focusNode || this.domNode).setAttribute("aria-checked", checked); this._handleOnChange(checked, priorityChange); }, setChecked: function(/*String|Boolean*/ checked){ // summary: // Deprecated. Use set('checked', true/false) instead. kernel.deprecated("setChecked("+checked+") is deprecated. Use set('checked',"+checked+") instead.", "", "2.0"); this.set('checked', checked); }, _setReadOnlyAttr: function(/*Boolean*/ value){ this._set("readOnly", value); domAttr.set(this.focusNode, "readOnly", value); this.focusNode.setAttribute("aria-readonly", value); }, _setValueAttr: function(/*String|Boolean*/ newValue, /*Boolean*/ priorityChange){ // summary: // Handler for value = attribute to constructor, and also calls to // set('value', val). // description: // During initialization, just saves as attribute to the . // // After initialization, // when passed a boolean or the string 'mixed', controls the state of the // TriStateCheckBox. // If passed a string except 'mixed', changes the value attribute of the // TriStateCheckBox. Sets the state of the TriStateCheckBox to checked. if(typeof newValue == "string" && (array.indexOf(this.states, newValue) < 0)){ if(newValue == ""){ newValue = "on"; } this.stateValues["True"] = newValue; newValue = true; } if(this._created){ this._currentState = array.indexOf(this.states, newValue); this.set('checked', newValue, priorityChange); domAttr.set(this.focusNode, "value", this.stateValues[this._stateType]); } }, _setValuesAttr: function(/*Array*/ newValues){ // summary: // Handler for values = attribute to constructor, and also calls to // set('values', val). // newValues: // If the length of newValues is 1, it will replace the value of // the TriStateCheckBox in true state. Otherwise, the values of // the TriStateCheckBox in true state and 'mixed' state will be // replaced by the first two values in newValues. // description: // Change the value of the TriStateCheckBox in 'mixed' and true states. this.stateValues["True"] = newValues[0] ? newValues[0] : this.stateValues["True"]; this.stateValues["Mixed"] = newValues[1] ? newValues[1] : this.stateValues["False"]; }, _getValueAttr: function(){ // summary: // Hook so get('value') works. // description: // Returns value according to current state of the TriStateCheckBox. return this.stateValues[this._stateType]; }, startup: function(){ this.set("checked", this.params.checked || this.states[this._currentState]); domAttr.set(this.stateLabelNode, 'innerHTML', this._stateLabels[this._stateType]); this.inherited(arguments); }, _fillContent: function(/*DomNode*/ source){ // Override Button::_fillContent() since it doesn't make sense for CheckBox, // since CheckBox doesn't even have a container }, reset: function(){ this._hasBeenBlurred = false; this.stateValues = { "False" : "off", "True" : "on", "Mixed" : "mixed" }; this.set('checked', this.params.checked || this.states[0]); }, _onFocus: function(){ if(this.id){ query("label[for='"+this.id+"']").addClass("dijitFocusedLabel"); } this.inherited(arguments); }, _onBlur: function(){ if(this.id){ query("label[for='"+this.id+"']").removeClass("dijitFocusedLabel"); } this.inherited(arguments); }, _onClick: function(/*Event*/ e){ // summary: // Internal function to handle click actions - need to check // readOnly and disabled if(this.readOnly || this.disabled){ event.stop(e); return false; } if(this._currentState >= this.states.length - 1){ this._currentState = 0; }else{ this._currentState++; } this.set("checked", this.states[this._currentState]); domAttr.set(this.stateLabelNode, 'innerHTML', this._stateLabels[this._stateType]); return this.onClick(e); // user click actions }, _getStateType: function(/*String|Boolean*/ state){ // summary: // Internal function to return the type of a certain state // false: False // true: True // "mixed": Mixed return state ? (state == "mixed" ? "Mixed" : "True") : "False"; } } ); });