📄 ext.ux.filetreepanel.js
字号:
// vim: ts=4:sw=4:nu:fdc=4:nospell/** * Ext.ux.FileTreePanel * * @author Ing. Jozef Sakáloš * @version $Id: Ext.ux.FileTreePanel.js 266 2008-05-18 23:24:47Z jozo $ * @date 13. March 2008 * * @license Ext.ux.FileTreePanel is licensed under the terms of * the Open Source LGPL 3.0 license. Commercial use is permitted to the extent * that the code/component(s) do NOT become part of another Open Source or Commercially * licensed development library or toolkit without explicit permission. * * License details: http://www.gnu.org/licenses/lgpl.html *//*global Ext, window, document, setTimeout *//** * @class Ext.ux.FileTreePanel * @extends Ext.tree.TreePanel */Ext.ux.FileTreePanel = Ext.extend(Ext.tree.TreePanel, { // config variables overridable from outside // {{{ /** * @cfg {Object} baseParams This object is not used directly by FileTreePanel but it is * propagated to lower level objects instead. Included here for convenience. */ /** * @cfg {String} confirmText Text to display as title of confirmation message box */ confirmText:'Confirm' /** * @cfg {Boolean} containerScroll true to register * this container with ScrollManager (defaults to true) */ ,containerScroll:true /** * @cfg {String} deleteText Delete text (for message box title or other displayed texts) */ ,deleteText:'Delete' /** * @cfg {String} deleteUrl URL to use when deleting; this.url is used if not set (defaults to undefined) */ /** * @cfg {String} downloadUrl URL to use when downloading; this.url is used if not set (defaults to undefined) */ /** * @cfg {Boolean} enableDD true to enable drag & drop of files and folders (defaults to true) */ ,enableDD:true /** * @cfg {Boolean) enableDelete true to enable to delete files and directories. * If false context menu item is not shown (defaults to true) */ ,enableDelete:true /** * @cfg {Boolean) enableNewDir true to enable to create new directory. * If false context menu item is not shown (defaults to true) */ ,enableNewDir:true /** * @cfg {Boolean) enableOpen true to enable open submenu * If false context menu item is not shown (defaults to true) */ ,enableOpen:true /** * @cfg {Boolean} enableProgress true to enable querying server for progress information * Passed to underlying uploader. Included here for convenience. */ ,enableProgress:true /** * @cfg {Boolean) enableRename true to enable to rename files and directories. * If false context menu item is not shown (defaults to true) */ ,enableRename:true /** * @cfg {Boolean} enableSort true to enable sorting of tree. See also folderSort (defaults to true) */ ,enableSort:true /** * @cfg {Boolean) enableUpload true to enable to upload files. * If false context menu item is not shown (defaults to true) */ ,enableUpload:true /** * @cfg {String} errorText Text to display for an error */ ,errorText:'Error' /** * @cfg {String} existsText Text to display in message box if file exists */ ,existsText:'File <b>{0}</b> already exists' /** * @cfg {Boolean} true to expand root node on FileTreePanel render (defaults to true) */ ,expandOnRender:true /** * @cfg {String} fileCls class prefix to add to nodes. "-extension" is appended to * this prefix to form filetype class, for example: file-odt, file-pdf. These classes * are used to display correct filetype icons in the tree. css file and icons must * exist of course. */ ,fileCls:'file' /** * @cfg {String} fileText */ ,fileText:'File' /** * @cfg {Boolean} focusPopup true to focus new browser popup window for 'popup' openMode * (defaults to true) */ ,focusPopup:true /** * @cfg {Boolean} folderSort true to place directories at the top of the tree (defaults to true) */ ,folderSort:true /** * @cfg {String} hrefPrefix Text to prepend before file href for file open command. * (defaults to '') */ ,hrefPrefix:'' /** * @cfg {String} hrefSuffix Text to append to file href for file open command. * (defaults to '') */ ,hrefSuffix:'' /** * @cfg {String} layout Layout to use for this panel (defaults to 'fit') */ ,layout:'fit' /** * @cfg {String} loadingText Text to use for load mask msg */ ,loadingText:'Loading' /** * @cfg {Boolean} loadMask True to mask tree panel while loading */ ,loadMask:false /** * @cfg {Number} maxFileSize Maximum upload file size in bytes * This config property is propagated down to uploader for convenience */ ,maxFileSize:524288 /** * @cfg {Number} maxMsgLen Maximum message length for message box (defaults to 2000). * If message is longer Ext.util.Format.ellipsis is used to truncate it and append ... */ ,maxMsgLen:2000 /** * @cfg {String} method Method to use when posting to server. Other valid value is 'get' * (defaults to 'post') */ ,method:'post' /** * @cfg {String} newdirText Default name for new directories (defaults to 'New Folder') */ ,newdirText:'New Folder' /** * @cfg {String} newdirUrl URL to use when creating new directory; * this.url is used if not set (defaults to undefined) */ /** * @cfg {String} openMode Default file open mode. This mode is used when user dblclicks * a file. Other valid values are '_self', '_blank' and 'download' (defaults to 'popup') */ ,openMode:'popup' /** * @cfg {String} overwriteText Text to use in overwrite confirmation message box */ ,overwriteText:'Do you want to overwrite it?' /** * @cfg {String} popupFeatures Features for new browser window opened by popup open mode */ ,popupFeatures:'width=800,height=600,dependent=1,scrollbars=1,resizable=1,toolbar=1' /** * @cfg {Boolean} readOnly true to disable write operations. treeEditor and context menu * are not created if true (defaults to false) */ ,readOnly:false /** * @cfg {String} reallyWantText Text to display for that question */ ,reallyWantText:'Do you really want to' /** * @cfg {String} renameUrl URL to use when renaming; this.url is used if not set (defaults to undefined) */ /** * @cfg {String} rootPath Relative path pointing to the directory that is root of this tree (defaults to 'root') */ ,rootPath:'root' /** * @cfg {String} rootText Text to display for root node (defaults to 'Tree Root') */ ,rootText:'Tree Root' /** * @cfg {Boolean} rootVisible true = root node visible, false = hidden (defaults to true) */ ,rootVisible:true /** * @cfg {Boolean} selectOnEdit true to select the edited text on edit start (defaults to true) */ ,selectOnEdit:true /** * @cfg {Boolean} singleUpload true to upload files in one form, false to upload one by one * This config property is propagated down to uploader for convenience */ ,singleUpload:false /** * @cfg {Boolean} topMenu true to create top toolbar with menu in addition to contextmenu */ ,topMenu:false /** * @cfg {String} url URL to use when communicating with server */ ,url:'filetree.php' // }}} // overrides // {{{ /** * called by Ext when instantiating * @private * @param {Object} config Configuration object */ ,initComponent:function() { // {{{ Ext.apply(this, { // create root node root:new Ext.tree.AsyncTreeNode({ text:this.rootText ,path:this.rootPath ,rootVisible:this.rootVisible ,allowDrag:false }) // create treeEditor ,treeEditor:!this.readOnly ? new Ext.tree.TreeEditor(this, { allowBlank:false ,cancelOnEsc:true ,completeOnEnter:true ,ignoreNoChange:true ,selectOnFocus:this.selectOnEdit }) : undefined // drop config ,dropConfig:this.dropConfig ? this.dropConfig : { ddGroup:this.ddGroup || 'TreeDD' ,appendOnly:this.enableSort ,expandDelay:3600000 // do not expand on drag over node } // create treeSorter ,treeSorter:this.enableSort ? new Ext.tree.TreeSorter(this, {folderSort:this.folderSort}) : undefined // {{{ ,keys:[{ // Enter = open key:Ext.EventObject.ENTER, scope:this ,fn:function(key, e) { var sm = this.getSelectionModel(); var node = sm.getSelectedNode(); if(node && 0 !== node.getDepth() && node.isLeaf()) { this.openNode(node); } }},{ // F2 = edit key:113, scope:this ,fn:function(key, e) { var sm = this.getSelectionModel(); var node = sm.getSelectedNode(); if(node && 0 !== node.getDepth() && this.enableRename && this.readOnly !== true) { this.treeEditor.triggerEdit(node); } }},{ // Delete Key = Delete key:46, stopEvent:true, scope:this ,fn:function(key, e) { var sm = this.getSelectionModel(); var node = sm.getSelectedNode(); if(node && 0 !== node.getDepth() && this.enableDelete && this.readOnly !== true) { this.deleteNode(node); } }},{ // Ctrl + E = reload key:69, ctrl:true, stopEvent:true, scope:this ,fn:function(key, e) { var sm = this.getSelectionModel(); var node = sm.getSelectedNode(); if(node) { node = node.isLeaf() ? node.parentNode : node; sm.select(node); node.reload(); } }},{ // Ctrl + -> = expand deep key:39, ctrl:true, stopEvent:true, scope:this ,fn:function(key, e) { var sm = this.getSelectionModel(); var node = sm.getSelectedNode(); if(node && !node.isLeaf()) { sm.select(node); node.expand.defer(1, node, [true]); } }},{ // Ctrl + <- = collapse deep key:37, ctrl:true, scope:this, stopEvent:true ,fn:function(key, e) { var sm = this.getSelectionModel(); var node = sm.getSelectedNode(); if(node && !node.isLeaf()) { sm.select(node); node.collapse.defer(1, node, [true]); } }},{ // Ctrl + N = New Directory key:78, ctrl:true, scope:this, stopEvent:true ,fn:function(key, e) { var sm, node; sm = this.getSelectionModel(); node = sm.getSelectedNode(); if(node && this.enableNewDir && this.readOnly !== true) { node = node.isLeaf() ? node.parentNode : node; this.createNewDir(node); } }}] // }}} }); // eo apply // }}} // {{{ // create loader if(!this.loader) { this.loader = new Ext.tree.TreeLoader({ url:this.url ,baseParams:{cmd:'get'} ,listeners:{ beforeload:{scope:this, fn:function(loader, node) { loader.baseParams.path = this.getPath(node); }} } }); } // }}} // {{{ // install top menu if configured if(true === this.topMenu) { this.tbar = [{ text:this.fileText ,disabled:true ,scope:this ,menu:this.getContextMenu() }]; } // }}} // call parent Ext.ux.FileTreePanel.superclass.initComponent.apply(this, arguments); // {{{ // install treeEditor event handlers if(this.treeEditor) { // do not enter edit mode on selected node click this.treeEditor.beforeNodeClick = function(node,e){return true;}; // treeEditor event handlers this.treeEditor.on({ complete:{scope:this, fn:this.onEditComplete} ,beforecomplete:{scope:this, fn:this.onBeforeEditComplete} }); } // }}} // {{{ // install event handlers this.on({ contextmenu:{scope:this, fn:this.onContextMenu, stopEvent:true} ,dblclick:{scope:this, fn:this.onDblClick} ,beforenodedrop:{scope:this, fn:this.onBeforeNodeDrop} ,nodedrop:{scope:this, fn:this.onNodeDrop} ,nodedragover:{scope:this, fn:this.onNodeDragOver} }); // }}} // {{{ // add events this.addEvents( /** * @event beforeopen * Fires before file open. Return false to cancel the event * @param {Ext.ux.FileTreePanel} this * @param {String} fileName name of the file being opened * @param {String} url url of the file being opened * @param {String} mode open mode */ 'beforeopen' /** * @event open * Fires after file open has been initiated * @param {Ext.ux.FileTreePanel} this * @param {String} fileName name of the file being opened * @param {String} url url of the file being opened * @param {String} mode open mode */ ,'open' /** * @event beforerename * Fires after the user completes file name editing * but before the file is renamed. Return false to cancel the event * @param {Ext.ux.FileTreePanel} this * @param {Ext.tree.AsyncTreeNode} node being renamed * @param {String} newPath including file name * @param {String} oldPath including file name */ ,'beforerename' /** * @event rename * Fires after the file has been successfully renamed * @param {Ext.ux.FileTreePanel} this * @param {Ext.tree.AsyncTreeNode} node that has been renamed * @param {String} newPath including file name * @param {String} oldPath including file name */ ,'rename' /** * @event renamefailure * Fires after a failure when renaming file * @param {Ext.ux.FileTreePanel} this * @param {Ext.tree.AsyncTreeNode} node rename of which failed * @param {String} newPath including file name * @param {String} oldPath including file name */ ,'renamefailure' /** * @event beforedelete * Fires before a file or directory is deleted. Return false to cancel the event. * @param {Ext.ux.FileTreePanel} this * @param {Ext.tree.AsyncTreeNode} node being deleted */ ,'beforedelete' /** * @event delete * Fires after a file or directory has been deleted * @param {Ext.ux.FileTreePanel} this * @param {String} path including file name that has been deleted */ ,'delete' /** * @event deletefailure * Fires if node delete failed * @param {Ext.ux.FileTreePanel} this * @param {Ext.tree.AsyncTreeNode} node delete of which failed */ ,'deletefailure' /** * @event beforenewdir * Fires before new directory is created. Return false to cancel the event * @param {Ext.ux.FileTreePanel} this * @param {Ext.tree.AsyncTreeNode} node under which the new directory is being created */ ,'beforenewdir'
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -