blob: 02a4a251b6ec01110c64d188a6c2134f24b5fc15 [file] [log] [blame]
/*
Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
if(!dojo._hasResource["dojox.form.ListInput"]){
dojo._hasResource["dojox.form.ListInput"]=true;
dojo.experimental("dojox.form.ListInput");
dojo.provide("dojox.form.ListInput");
dojo.require("dijit.form._FormWidget");
dojo.require("dijit.form.ValidationTextBox");
dojo.require("dijit.InlineEditBox");
dojo.requireLocalization("dijit","common",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
dojo.declare("dojox.form.ListInput",[dijit.form._FormValueWidget],{constructor:function(){
this._items=[];
if(!dojo.isArray(this.delimiter)){
this.delimiter=[this.delimiter];
}
var r="("+this.delimiter.join("|")+")?";
this.regExp="^"+this.regExp+r+"$";
},inputClass:"dojox.form._ListInputInputBox",inputHandler:"onChange",inputProperties:{minWidth:50},submitOnlyValidValue:true,useOnBlur:true,readOnlyInput:false,maxItems:null,showCloseButtonWhenValid:true,showCloseButtonWhenInvalid:true,regExp:".*",delimiter:",",constraints:{},baseClass:"dojoxListInput",type:"select",value:"",templateString:"<div dojoAttachPoint=\"focusNode\" class=\"dijit dijitReset dijitLeft dojoxListInput\"><select dojoAttachpoint=\"_selectNode\" multiple=\"multiple\" class=\"dijitHidden\" ${nameAttrSetting}></select><ul dojoAttachPoint=\"_listInput\"><li dojoAttachEvent=\"onclick: _onClick\" class=\"dijitInputField dojoxListInputNode dijitHidden\" dojoAttachPoint=\"_inputNode\"></li></ul></div>",useAnim:true,duration:500,easingIn:null,easingOut:null,readOnlyItem:false,useArrowForEdit:true,_items:null,_lastAddedItem:null,_currentItem:null,_input:null,_count:0,postCreate:function(){
this.inherited(arguments);
this._createInputBox();
},_setReadOnlyInputAttr:function(_1){
console.warn("_setReadOnlyInputAttr",this.id,_1);
if(!this._started){
return this._createInputBox();
}
this.readOnlyInput=_1;
this._createInputBox();
},_setReadOnlyItemAttr:function(_2){
if(!this._started){
return;
}
for(var i in this._items){
this._items[i].attr("readOnlyItem",_2);
}
},_createInputBox:function(){
console.warn("_createInputBox",this.id,this.readOnlyInput);
dojo[(this.readOnlyInput?"add":"remove")+"Class"](this._inputNode,"dijitHidden");
if(this.readOnlyInput){
return;
}
if(this._input){
return;
}
if(this.inputHandler===null){
return !console.warn("you must add some handler to connect to input field");
}
if(dojo.isString(this.inputHandler)){
this.inputHandler=this.inputHandler.split(",");
}
if(dojo.isString(this.inputProperties)){
this.inputProperties=dojo.fromJson(this.inputProperties);
}
var _3=dojo.getObject(this.inputClass,false);
this.inputProperties.regExp=this.regExpGen(this.constraints);
this._input=new _3(this.inputProperties);
this._input.startup();
this._inputNode.appendChild(this._input.domNode);
dojo.forEach(this.inputHandler,function(_4){
this.connect(this._input,dojo.string.trim(_4),"_onHandler");
},this);
this.connect(this._input,"onKeyDown","_inputOnKeyDown");
this.connect(this._input,"onBlur","_inputOnBlur");
},compare:function(_5,_6){
_5=_5.join(",");
_6=_6.join(",");
if(_5>_6){
return 1;
}else{
if(_5<_6){
return -1;
}else{
return 0;
}
}
},add:function(_7){
if(this._count>=this.maxItems&&this.maxItems!==null){
return;
}
this._lastValueReported=this._getValues();
if(!dojo.isArray(_7)){
_7=[_7];
}
for(var i in _7){
var _8=_7[i];
if(_8===""||typeof _8!="string"){
continue;
}
this._count++;
var re=new RegExp(this.regExpGen(this.constraints));
this._lastAddedItem=new dojox.form._ListInputInputItem({"index":this._items.length,readOnlyItem:this.readOnlyItem,value:_8,regExp:this.regExpGen(this.constraints)});
this._lastAddedItem.startup();
this._testItem(this._lastAddedItem,_8);
this._lastAddedItem.onClose=dojo.hitch(this,"_onItemClose",this._lastAddedItem);
this._lastAddedItem.onChange=dojo.hitch(this,"_onItemChange",this._lastAddedItem);
this._lastAddedItem.onEdit=dojo.hitch(this,"_onItemEdit",this._lastAddedItem);
this._lastAddedItem.onKeyDown=dojo.hitch(this,"_onItemKeyDown",this._lastAddedItem);
if(this.useAnim){
dojo.style(this._lastAddedItem.domNode,{opacity:0,display:""});
}
this._placeItem(this._lastAddedItem.domNode);
if(this.useAnim){
var _9=dojo.fadeIn({node:this._lastAddedItem.domNode,duration:this.duration,easing:this.easingIn}).play();
}
this._items[this._lastAddedItem.index]=this._lastAddedItem;
if(this._onChangeActive&&this.intermediateChanges){
this.onChange(_8);
}
if(this._count>=this.maxItems&&this.maxItems!==null){
break;
}
}
this._updateValues();
if(this._lastValueReported.length==0){
this._lastValueReported=this.value;
}
if(!this.readOnlyInput){
this._input.attr("value","");
}
if(this._onChangeActive){
this.onChange(this.value);
}
this._setReadOnlyWhenMaxItemsReached();
},_setReadOnlyWhenMaxItemsReached:function(){
this.attr("readOnlyInput",(this._count>=this.maxItems&&this.maxItems!==null));
},_setSelectNode:function(){
this._selectNode.options.length=0;
var _a=this.submitOnlyValidValue?this.attr("MatchedValue"):this.value;
if(!dojo.isArray(_a)){
return;
}
dojo.forEach(_a,function(_b){
this._selectNode.options[this._selectNode.options.length]=new Option(_b,_b,true,true);
},this);
},_placeItem:function(_c){
dojo.place(_c,this._inputNode,"before");
},_getCursorPos:function(_d){
if(typeof _d.selectionStart!="undefined"){
return _d.selectionStart;
}
try{
_d.focus();
}
catch(e){
}
var _e=_d.createTextRange();
_e.moveToBookmark(dojo.doc.selection.createRange().getBookmark());
_e.moveEnd("character",_d.value.length);
try{
return _d.value.length-_e.text.length;
}
finally{
_e=null;
}
},_onItemClose:function(_f){
if(this.disabled){
return;
}
if(this.useAnim){
var _10=dojo.fadeOut({node:_f.domNode,duration:this.duration,easing:this.easingOut,onEnd:dojo.hitch(this,"_destroyItem",_f)}).play();
}else{
this._destroyItem(_f);
}
},_onItemKeyDown:function(_11,e){
if(this.readOnlyItem||!this.useArrowForEdit){
return;
}
if(e.keyCode==dojo.keys.LEFT_ARROW&&this._getCursorPos(e.target)==0){
this._editBefore(_11);
}else{
if(e.keyCode==dojo.keys.RIGHT_ARROW&&this._getCursorPos(e.target)==e.target.value.length){
this._editAfter(_11);
}
}
},_editBefore:function(_12){
this._currentItem=this._getPreviousItem(_12);
if(this._currentItem!==null){
this._currentItem.edit();
}
},_editAfter:function(_13){
this._currentItem=this._getNextItem(_13);
if(this._currentItem!==null){
this._currentItem.edit();
}
if(!this.readOnlyInput){
if(this._currentItem===null){
this._focusInput();
}
}
},_onItemChange:function(_14,_15){
if(!_15){
_15=_14.attr("value");
}
this._testItem(_14,_15);
this._updateValues();
},_onItemEdit:function(_16){
dojo.removeClass(_16.domNode,"dijitError");
dojo.removeClass(_16.domNode,this.baseClass+"Match");
dojo.removeClass(_16.domNode,this.baseClass+"Mismatch");
},_testItem:function(_17,_18){
var re=new RegExp(this.regExpGen(this.constraints));
var _19=_18.match(re);
dojo.removeClass(_17.domNode,this.baseClass+(!_19?"Match":"Mismatch"));
dojo.addClass(_17.domNode,this.baseClass+(_19?"Match":"Mismatch"));
dojo[(!_19?"add":"remove")+"Class"](_17.domNode,"dijitError");
if((this.showCloseButtonWhenValid&&_19)||(this.showCloseButtonWhenInvalid&&!_19)){
dojo.addClass(_17.domNode,this.baseClass+"Closable");
}else{
dojo.removeClass(_17.domNode,this.baseClass+"Closable");
}
},_getValueAttr:function(){
return this.value;
},_setValueAttr:function(_1a){
this._destroyAllItems();
this.add(this._parseValue(_1a));
},_parseValue:function(_1b){
if(typeof _1b=="string"){
if(dojo.isString(this.delimiter)){
this.delimiter=[this.delimiter];
}
var re=new RegExp("^.*("+this.delimiter.join("|")+").*");
if(_1b.match(re)){
re=new RegExp(this.delimiter.join("|"));
return _1b.split(re);
}
}
return _1b;
},regExpGen:function(_1c){
return this.regExp;
},_setDisabledAttr:function(_1d){
if(!this.readOnlyItem){
for(var i in this._items){
this._items[i].attr("disabled",_1d);
}
}
if(!this.readOnlyInput){
this._input.attr("disabled",_1d);
}
this.inherited(arguments);
},_onHandler:function(_1e){
var _1f=this._parseValue(_1e);
if(dojo.isArray(_1f)){
this.add(_1f);
}
},_onClick:function(e){
this._focusInput();
},_focusInput:function(){
if(!this.readOnlyInput&&this._input.focus){
this._input.focus();
}
},_inputOnKeyDown:function(e){
this._currentItem=null;
if(e.keyCode==dojo.keys.BACKSPACE&&this._input.attr("value")==""&&this.attr("lastItem")){
this._destroyItem(this.attr("lastItem"));
}else{
if(e.keyCode==dojo.keys.ENTER&&this._input.attr("value")!=""){
this.add(this._input.attr("value"));
}else{
if(e.keyCode==dojo.keys.LEFT_ARROW&&this._getCursorPos(this._input.focusNode)==0&&!this.readOnlyItem&&this.useArrowForEdit){
this._editBefore();
}
}
}
},_inputOnBlur:function(){
if(this.useOnBlur&&this._input.attr("value")!=""){
this.add(this._input.attr("value"));
}
},_getMatchedValueAttr:function(){
return this._getValues(dojo.hitch(this,this._matchValidator));
},_getMismatchedValueAttr:function(){
return this._getValues(dojo.hitch(this,this._mismatchValidator));
},_getValues:function(_20){
var _21=[];
_20=_20||this._nullValidator;
for(var i in this._items){
var _22=this._items[i];
if(_22===null){
continue;
}
var _23=_22.attr("value");
if(_20(_23)){
_21.push(_23);
}
}
return _21;
},_nullValidator:function(_24){
return true;
},_matchValidator:function(_25){
var re=new RegExp(this.regExpGen(this.constraints));
return _25.match(re);
},_mismatchValidator:function(_26){
var re=new RegExp(this.regExpGen(this.constraints));
return !(_26.match(re));
},_getLastItemAttr:function(){
return this._getSomeItem();
},_getSomeItem:function(_27,_28){
_27=_27||false;
_28=_28||"last";
var _29=null;
var _2a=-1;
for(var i in this._items){
if(this._items[i]===null){
continue;
}
if(_28=="before"&&this._items[i]===_27){
break;
}
_29=this._items[i];
if(_28=="first"||_2a==0){
_2a=1;
break;
}
if(_28=="after"&&this._items[i]===_27){
_2a=0;
}
}
if(_28=="after"&&_2a==0){
_29=null;
}
return _29;
},_getPreviousItem:function(_2b){
return this._getSomeItem(_2b,"before");
},_getNextItem:function(_2c){
return this._getSomeItem(_2c,"after");
},_destroyItem:function(_2d,_2e){
this._items[_2d.index]=null;
_2d.destroy();
this._count--;
if(_2e!==false){
this._updateValues();
this._setReadOnlyWhenMaxItemsReached();
}
},_updateValues:function(){
this.value=this._getValues();
this._setSelectNode();
},_destroyAllItems:function(){
for(var i in this._items){
if(this._items[i]==null){
continue;
}
this._destroyItem(this._items[i],false);
}
this._items=[];
this._count=0;
this.value=null;
this._setSelectNode();
this._setReadOnlyWhenMaxItemsReached();
},destroy:function(){
this._destroyAllItems();
this._lastAddedItem=null;
if(!this._input){
this._input.destroy();
}
this.inherited(arguments);
}});
dojo.declare("dojox.form._ListInputInputItem",[dijit._Widget,dijit._Templated],{templateString:"<li class=\"dijit dijitReset dijitLeft dojoxListInputItem\" dojoAttachEvent=\"onclick: onClick\" ><span dojoAttachPoint=\"labelNode\"></span></li>",closeButtonNode:null,readOnlyItem:true,baseClass:"dojoxListInputItem",value:"",regExp:".*",_editBox:null,_handleKeyDown:null,attributeMap:{value:{node:"labelNode",type:"innerHTML"}},postMixInProperties:function(){
var _2f=dojo.i18n.getLocalization("dijit","common");
dojo.mixin(this,_2f);
this.inherited(arguments);
},postCreate:function(){
this.inherited(arguments);
this.closeButtonNode=dojo.create("span",{"class":"dijitButtonNode dijitDialogCloseIcon",title:this.itemClose,onclick:dojo.hitch(this,"onClose"),onmouseenter:dojo.hitch(this,"_onCloseEnter"),onmouseleave:dojo.hitch(this,"_onCloseLeave")},this.domNode);
dojo.create("span",{"class":"closeText",title:this.itemClose,innerHTML:"x"},this.closeButtonNode);
},startup:function(){
this.inherited(arguments);
this._createInlineEditBox();
},_setReadOnlyItemAttr:function(_30){
this.readOnlyItem=_30;
if(!_30){
this._createInlineEditBox();
}else{
if(this._editBox){
this._editBox.attr("disabled",true);
}
}
},_createInlineEditBox:function(){
if(this.readOnlyItem){
return;
}
if(!this._started){
return;
}
if(this._editBox){
this._editBox.attr("disabled",false);
return;
}
this._editBox=new dijit.InlineEditBox({value:this.value,editor:"dijit.form.ValidationTextBox",editorParams:{regExp:this.regExp}},this.labelNode);
this.connect(this._editBox,"edit","_onEdit");
this.connect(this._editBox,"onChange","_onCloseEdit");
this.connect(this._editBox,"onCancel","_onCloseEdit");
},edit:function(){
if(!this.readOnlyItem){
this._editBox.edit();
}
},_onCloseEdit:function(_31){
dojo.removeClass(this.closeButtonNode,this.baseClass+"Edited");
dojo.disconnect(this._handleKeyDown);
this.onChange(_31);
},_onEdit:function(){
dojo.addClass(this.closeButtonNode,this.baseClass+"Edited");
this._handleKeyDown=dojo.connect(this._editBox.editWidget,"_onKeyPress",this,"onKeyDown");
this.onEdit();
},_setDisabledAttr:function(_32){
if(!this.readOnlyItem){
this._editBox.attr("disabled",_32);
}
},_getValueAttr:function(){
return (!this.readOnlyItem&&this._started?this._editBox.attr("value"):this.value);
},destroy:function(){
if(this._editBox){
this._editBox.destroy();
}
this.inherited(arguments);
},_onCloseEnter:function(){
dojo.addClass(this.closeButtonNode,"dijitDialogCloseIcon-hover");
},_onCloseLeave:function(){
dojo.removeClass(this.closeButtonNode,"dijitDialogCloseIcon-hover");
},onClose:function(){
},onEdit:function(){
},onClick:function(){
},onChange:function(_33){
},onKeyDown:function(_34){
}});
dojo.declare("dojox.form._ListInputInputBox",[dijit.form.ValidationTextBox],{minWidth:50,intermediateChanges:true,regExp:".*",_sizer:null,onChange:function(_35){
this.inherited(arguments);
if(this._sizer===null){
this._sizer=dojo.create("div",{style:{position:"absolute",left:"-10000px",top:"-10000px"}},dojo.body());
}
this._sizer.innerHTML=_35;
var w=dojo.contentBox(this._sizer).w+this.minWidth;
dojo.contentBox(this.domNode,{w:w});
},destroy:function(){
dojo.destroy(this._sizer);
this.inherited(arguments);
}});
}