123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330 |
- require({cache:{
- 'url:dojox/form/resources/FilePickerTextBox.html':"<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\trole=\"combobox\" tabIndex=\"-1\"\n\t><div style=\"overflow:hidden;\"\n\t\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton'\n\t\t\tdojoAttachPoint=\"downArrowNode,_buttonNode,_popupStateNode\" role=\"presentation\"\n\t\t\t><div class=\"dijitArrowButtonInner\"> </div\n\t\t\t><div class=\"dijitArrowButtonChar\">▼</div\n\t\t></div\n\t\t><div class=\"dijitReset dijitValidationIcon\"><br></div\n\t\t><div class=\"dijitReset dijitValidationIconText\">Χ</div\n\t\t><div class=\"dijitReset dijitInputField\"\n\t\t\t><input type=\"text\" autocomplete=\"off\" ${!nameAttrSetting} class='dijitReset'\n\t\t\t\tdojoAttachEvent='onkeypress:_onKey' \n\t\t\t\tdojoAttachPoint='textbox,focusNode' role=\"textbox\" aria-haspopup=\"true\" aria-autocomplete=\"list\"\n\t\t/></div\n\t></div\n></div>\n"}});
- define("dojox/form/FilePickerTextBox", [
- "dojo/_base/lang",
- "dojo/_base/array",
- "dojo/_base/event",
- "dojo/window",
- "dijit/focus",
- "dijit/registry",
- "dijit/form/_TextBoxMixin",
- "dijit/form/ValidationTextBox",
- "dijit/_HasDropDown",
- "dojox/widget/FilePicker",
- "dojo/text!./resources/FilePickerTextBox.html",
- "dojo/_base/declare",
- "dojo/keys" // keys
- ], function(lang, array, event, windowUtils, focus, registry, _TextBoxMixin, ValidationTextBox, _HasDropDown, FilePicker, template, declare, keys){
- /*=====
- ValidationTextBox = dijit.form.ValidationTextBox;
- _HasDropDown = dijit._HasDropDown;
- =====*/
- return declare( "dojox.form.FilePickerTextBox", [ValidationTextBox, _HasDropDown],
- {
- // summary:
- // A validating text box tied to a file picker popup
- baseClass: "dojoxFilePickerTextBox",
- templateString: template,
- // searchDelay: Integer
- // Delay in milliseconds between when user types something and we start
- // searching based on that value
- searchDelay: 500,
- // valueItem: item
- // The item, in our store, of the directory relating to our value
- valueItem: null,
- // numPanes: number
- // The number of panes to display in our box (if we don't have any
- // minPaneWidth specified by our constraints)
- numPanes: 2.25,
- postMixInProperties: function(){
- this.inherited(arguments);
- this.dropDown = new FilePicker(this.constraints);
- },
- postCreate: function(){
- this.inherited(arguments);
- // Make our connections we want
- this.connect(this.dropDown, "onChange", this._onWidgetChange);
- this.connect(this.focusNode, "onblur", "_focusBlur");
- this.connect(this.focusNode, "onfocus", "_focusFocus");
- this.connect(this.focusNode, "ondblclick", function(){
- _TextBoxMixin.selectInputText(this.focusNode);
- });
- },
- _setValueAttr: function(/*string*/value, priorityChange, fromWidget){
- // summary: sets the value of this widget
- if(!this._searchInProgress){
- this.inherited(arguments);
- value = value || "";
- var tVal = this.dropDown.get("pathValue") || "";
- if(value !== tVal){
- this._skip = true;
- var fx = lang.hitch(this, "_setBlurValue");
- this.dropDown._setPathValueAttr(value, !fromWidget,
- this._settingBlurValue ? fx : null);
- }
- }
- },
- _onWidgetChange: function(/*item*/item){
- // summary: called when the path gets changed in the dropdown
- if(!item && this.focusNode.value){
- this._hasValidPath = false;
- this.focusNode.value = "";
- }else{
- this.valueItem = item;
- var value = this.dropDown._getPathValueAttr(item);
- if(value){
- this._hasValidPath = true;
- }
- if(!this._skip){
- this._setValueAttr(value, undefined, true);
- }
- delete this._skip;
- }
- this.validate();
- },
- startup: function(){
- if(!this.dropDown._started){
- this.dropDown.startup();
- }
- this.inherited(arguments);
- },
- openDropDown: function(){
- // set width to 0 so that it will resize automatically
- this.dropDown.domNode.style.width="0px";
- if(!("minPaneWidth" in (this.constraints||{}))){
- this.dropDown.set("minPaneWidth", (this.domNode.offsetWidth / this.numPanes));
- }
- this.inherited(arguments);
- },
- toggleDropDown: function(){
- this.inherited(arguments);
- // Make sure our display is up-to-date with our value
- if(this._opened){
- this.dropDown.set("pathValue", this.get("value"));
- }
- },
- _focusBlur: function(/*Event*/ e){
- // summary: called when the focus node gets blurred
- if(e.explicitOriginalTarget == this.focusNode && !this._allowBlur){
- window.setTimeout(lang.hitch(this, function(){
- if(!this._allowBlur){
- this.focus();
- }
- }), 1);
- }else if(this._menuFocus){
- this.dropDown._updateClass(this._menuFocus, "Item", {"Hover": false});
- delete this._menuFocus;
- }
- },
- _focusFocus: function(/*Event*/ e){
- // summary: called when the focus node gets focus
- if(this._menuFocus){
- this.dropDown._updateClass(this._menuFocus, "Item", {"Hover": false});
- }
- delete this._menuFocus;
- var focusNode = focus.curNode;
- if(focusNode){
- focusNode = registry.byNode(focusNode);
- if(focusNode){
- this._menuFocus = focusNode.domNode;
- }
- }
- if(this._menuFocus){
- this.dropDown._updateClass(this._menuFocus, "Item", {"Hover": true});
- }
- delete this._allowBlur;
- },
- _onBlur: function(){
- // summary: called when focus is shifted away from this widget
- this._allowBlur = true;
- delete this.dropDown._savedFocus;
- this.inherited(arguments);
- },
- _setBlurValue: function(){
- // summary: sets the value of the widget once focus has left
- if(this.dropDown && !this._settingBlurValue){
- this._settingBlurValue = true;
- this.set("value", this.focusNode.value);
- }else{
- delete this._settingBlurValue;
- this.inherited(arguments);
- }
- },
- parse: function(/* String */ value, /* Object */ constraints){
- // summary:
- // Function to convert a formatted string to a value - we use
- // it to verify that it *really* is a valid value
- if(this._hasValidPath || this._hasSelection){
- return value;
- }
- var dd = this.dropDown, topDir = dd.topDir, sep = dd.pathSeparator;
- var ddVal = dd.get("pathValue");
- var norm = function(v){
- if(topDir.length && v.indexOf(topDir) === 0){
- v = v.substring(topDir.length);
- }
- if(sep && v[v.length - 1] == sep){
- v = v.substring(0, v.length - 1);
- }
- return v;
- };
- ddVal = norm(ddVal);
- var val = norm(value);
- if(val == ddVal){
- return value;
- }
- return undefined;
- },
- _startSearchFromInput: function(){
- // summary: kicks off a search based off the current text value of the widget
- var dd = this.dropDown, fn = this.focusNode;
- var val = fn.value, oVal = val, topDir = dd.topDir;
- if(this._hasSelection){
- _TextBoxMixin.selectInputText(fn, oVal.length);
- }
- this._hasSelection = false;
- if(topDir.length && val.indexOf(topDir) === 0){
- val = val.substring(topDir.length);
- }
- var dirs = val.split(dd.pathSeparator);
- var setFromChain = lang.hitch(this, function(idx){
- var dir = dirs[idx];
- var child = dd.getChildren()[idx];
- var conn;
- this._searchInProgress = true;
- var _cleanup = lang.hitch(this, function(){
- delete this._searchInProgress;
- });
- if((dir || child) && !this._opened){
- this.toggleDropDown();
- }
- if(dir && child){
- var fx = lang.hitch(this, function(){
- if(conn){
- this.disconnect(conn);
- }
- delete conn;
- var children = child._menu.getChildren();
- var exact = array.filter(children, function(i){
- return i.label == dir;
- })[0];
- var first = array.filter(children, function(i){
- return (i.label.indexOf(dir) === 0);
- })[0];
- if(exact &&
- ((dirs.length > idx + 1 && exact.children) ||
- (!exact.children))){
- idx++;
- child._menu.onItemClick(exact, {type: "internal",
- stopPropagation: function(){},
- preventDefault: function(){}});
- if(dirs[idx]){
- setFromChain(idx);
- }else{
- _cleanup();
- }
- }else{
- child._setSelected(null);
- if(first && dirs.length === idx + 1){
- dd._setInProgress = true;
- dd._removeAfter(child);
- delete dd._setInProgress;
- var targetString = first.label;
- if(first.children){
- targetString += dd.pathSeparator;
- }
- targetString = targetString.substring(dir.length);
- window.setTimeout(function(){
- windowUtils.scrollIntoView(first.domNode);
- }, 1);
- fn.value = oVal + targetString;
- _TextBoxMixin.selectInputText(fn, oVal.length);
- this._hasSelection = true;
- try{first.focusNode.focus();}catch(e){}
- }else{
- if(this._menuFocus){
- this.dropDown._updateClass(this._menuFocus, "Item", {"Hover": false, "Focus": false});
- }
- delete this._menuFocus;
- }
- _cleanup();
- }
- });
- if(!child.isLoaded){
- conn = this.connect(child, "onLoad", fx);
- }else{
- fx();
- }
- }else{
- if(child){
- child._setSelected(null);
- dd._setInProgress = true;
- dd._removeAfter(child);
- delete dd._setInProgress;
- }
- _cleanup();
- }
- });
- setFromChain(0);
- },
- _onKey: function(/*Event*/ e){
- // summary: callback when the user presses a key on menu popup node
- if(this.disabled || this.readOnly){ return; }
- var c = e.charOrCode;
- if(c==keys.DOWN_ARROW){
- this._allowBlur = true;
- }
- if(c==keys.ENTER && this._opened){
- this.dropDown.onExecute();
- _TextBoxMixin.selectInputText(this.focusNode, this.focusNode.value.length);
- this._hasSelection = false;
- event.stop(e);
- return;
- }
- if((c==keys.RIGHT_ARROW || c==keys.LEFT_ARROW || c==keys.TAB) && this._hasSelection){
- this._startSearchFromInput();
- event.stop(e);
- return;
- }
- this.inherited(arguments);
- var doSearch = false;
- if((c==keys.BACKSPACE || c==keys.DELETE) && this._hasSelection){
- this._hasSelection = false;
- }else if(c==keys.BACKSPACE || c==keys.DELETE || c==" "){
- doSearch = true;
- }else{
- doSearch = e.keyChar !== "";
- }
- if(this._searchTimer){
- window.clearTimeout(this._searchTimer);
- }
- delete this._searchTimer;
- if(doSearch){
- this._hasValidPath = false;
- this._hasSelection = false;
- this._searchTimer = window.setTimeout(lang.hitch(this, "_startSearchFromInput"), this.searchDelay + 1);
- }
- }
- }
- );
- });
|