dojo.provide("dojox.widget.FilePicker"); dojo.require("dojox.widget.RollingList"); dojo.require("dojo.i18n"); dojo.requireLocalization("dojox.widget", "FilePicker"); dojo.declare("dojox.widget._FileInfoPane", [dojox.widget._RollingListPane], { // summary: a pane to display the information for the currently-selected // file // templateString: string // delete our template string templateString: "", // templatePath: string // Our template path templatePath: dojo.moduleUrl("dojox.widget", "FilePicker/_FileInfoPane.html"), postMixInProperties: function(){ this._messages = dojo.i18n.getLocalization("dojox.widget", "FilePicker", this.lang); this.inherited(arguments); }, onItems: function(){ // summary: // called after a fetch or load - at this point, this.items should be // set and loaded. var store = this.store, item = this.items[0]; if(!item){ this._onError("Load", new Error("No item defined")); }else{ this.nameNode.innerHTML = store.getLabel(item); this.pathNode.innerHTML = store.getIdentity(item); this.sizeNode.innerHTML = store.getValue(item, "size"); this.parentWidget.scrollIntoView(this); this.inherited(arguments); } } }); dojo.declare("dojox.widget.FilePicker", dojox.widget.RollingList, { // summary: a specialized version of RollingList that handles file information // in a store className: "dojoxFilePicker", // pathSeparator: string // Our file separator - it will be guessed if not set pathSeparator: "", // topDir: string // The top directory string - it will be guessed if not set topDir: "", // parentAttr: string // the attribute to read for finding our parent directory parentAttr: "parentDir", // pathAttr: string // the attribute to read for getting the full path of our file pathAttr: "path", // preloadItems: boolean or int // Set this to a sane number - since we expect to mostly be using the // dojox.data.FileStore - which doesn't like loading lots of items // all at once. preloadItems: 50, // selectDirectories: boolean // whether or not we allow selection of directories - that is, whether or // our value can be set to a directory. selectDirectories: true, // selectFiles: boolean // whether or not we allow selection of files - that is, we will disable // the file entries. selectFiles: true, _itemsMatch: function(/*item*/ item1, /*item*/ item2){ // Summary: returns whether or not the two items match - checks ID if // they aren't the exact same object - ignoring trailing slashes if(!item1 && !item2){ return true; }else if(!item1 || !item2){ return false; }else if(item1 == item2){ return true; }else if (this._isIdentity){ var iArr = [ this.store.getIdentity(item1), this.store.getIdentity(item2) ]; dojo.forEach(iArr, function(i, idx){ if(i.lastIndexOf(this.pathSeparator) == (i.length - 1)){ iArr[idx] = i.substring(0, i.length - 1); }else{ } }, this); return (iArr[0] == iArr[1]); } return false; }, startup: function(){ if(this._started){ return; } this.inherited(arguments); // Figure out our file separator if we don't have it yet var conn, child = this.getChildren()[0]; var setSeparator = dojo.hitch(this, function(){ if(conn){ this.disconnect(conn); } delete conn; var item = child.items[0]; if(item){ var store = this.store; var parent = store.getValue(item, this.parentAttr); var path = store.getValue(item, this.pathAttr); this.pathSeparator = this.pathSeparator || store.pathSeparator; if(!this.pathSeparator){ this.pathSeparator = path.substring(parent.length, parent.length + 1); } if(!this.topDir){ this.topDir = parent; if(this.topDir.lastIndexOf(this.pathSeparator) != (this.topDir.length - 1)){ this.topDir += this.pathSeparator; } } } }); if(!this.pathSeparator || !this.topDir){ if(!child.items){ conn = this.connect(child, "onItems", setSeparator); }else{ setSeparator(); } } }, getChildItems: function(item){ var ret = this.inherited(arguments); if(!ret && this.store.getValue(item, "directory")){ // It's an empty directory - so pass through an empty array ret = []; } return ret; }, getMenuItemForItem: function(/*item*/ item, /* dijit._Contained */ parentPane, /* item[]? */ children){ var menuOptions = {iconClass: "dojoxDirectoryItemIcon"}; if(!this.store.getValue(item, "directory")){ menuOptions.iconClass = "dojoxFileItemIcon"; var l = this.store.getLabel(item), idx = l.lastIndexOf("."); if(idx >= 0){ menuOptions.iconClass += " dojoxFileItemIcon_" + l.substring(idx + 1); } if(!this.selectFiles){ menuOptions.disabled = true; } } var ret = new dijit.MenuItem(menuOptions); return ret; }, getPaneForItem: function(/*item*/ item, /* dijit._Contained */ parentPane, /* item[]? */ children){ var ret = null; if(!item || (this.store.isItem(item) && this.store.getValue(item, "directory"))){ ret = new dojox.widget._RollingListGroupPane({}); }else if(this.store.isItem(item) && !this.store.getValue(item, "directory")){ ret = new dojox.widget._FileInfoPane({}); } return ret; }, _setPathValueAttr: function(/*string*/ path, /*boolean?*/ resetLastExec, /*function?*/ onSet){ // Summary: sets the value of this widget based off the given path if(!path){ this.attr("value", null); return; } if(path.lastIndexOf(this.pathSeparator) == (path.length - 1)){ path = path.substring(0, path.length - 1); } this.store.fetchItemByIdentity({identity: path, onItem: function(v){ if(resetLastExec){ this._lastExecutedValue = v; } this.attr("value", v); if(onSet){ onSet(); } }, scope: this}); }, _getPathValueAttr: function(/*item?*/val){ // summary: returns the path value of the given value (or current value // if not passed a value) if(!val){ val = this.value; } if(val && this.store.isItem(val)){ return this.store.getValue(val, this.pathAttr); }else{ return ""; } }, _setValue: function(/* item */ value){ // summary: internally sets the value and fires onchange delete this._setInProgress; var store = this.store; if(value && store.isItem(value)){ var isDirectory = this.store.getValue(value, "directory"); if((isDirectory && !this.selectDirectories) || (!isDirectory && !this.selectFiles)){ return; } }else{ value = null; } if(!this._itemsMatch(this.value, value)){ this.value = value; this._onChange(value); } } });