/* Copyright (c) 2006-2009, ePages GmbH All Rights Reserved. epages.cartridges.de_epages.mediagallery.widget.Filetree $Revision: 1.17 $ */ dojo.provide("epages.cartridges.de_epages.mediagallery.widget.Filetree"); dojo.require("dijit.Tree"); dojo.require("epages.io.json"); dojo.require("epages.lang.hash"); dojo.require("epages.widget"); dojo.require("epages.event"); dojo.declare( "epages.cartridges.de_epages.mediagallery.widget.Filetree", [dijit.Tree], { /** * public properties */ listId : "", viewAction : "JSONViewResponse", url : "?", directory : 'MediaGallery', label : 'Files', persist : false, /** * private properties */ _currentDirectory : undefined, _lastSelectedNode : undefined, /** * public methods */ postCreate : function() { this.inherited("postCreate", arguments); this._currentDirectory = this.directory; this.rootNode.item.id = this.directory; this.rootNode.item.directory = this.directory; if (this.listId != "") { dojo.subscribe(this.listId + '/rename', this.model.store, 'renameFile'); } }, _getFileList : function(directory) { var files = this.model.store.getFiles(directory); return files; }, onClick: function(item, node){ if(item && item.children !== undefined){ this._expandNode(node); } if(this.lastFocused === undefined){ this.lastFocused = node; } //check if title of tree was clicked and load files if neccessary var directory = undefined; if(item && item.root == true){ var files = this._getFileList(this.directory); if(this.listId != ""){ var filelist = $$(this.listId); if(files){ filelist.setChildren(files); } else{ filelist.setChildren([]); } } this._lastSelectedNode = node; directory = this.directory; this._currentDirectory = this.directory; } if(item && item.root != true){ directory = item.directory; this.model.store._loadList(directory); this._lastSelectedNode = node; this._currentDirectory = directory; var files = this._getFileList(directory); if(this.listId != ""){ var filelist = $$(this.listId); if(files){ filelist.setChildren(files); } else{ filelist.setChildren([]); } } } //fix for ie without timeout is can not give focus to element window.setTimeout(dojo.hitch(this,this.focusNode,node),10); dojo.publish(this.id+'/select',[{node:node, currentDirectory: directory}]); }, getCurrentDirectory: function () { // summary: get full path name return this._currentDirectory; //String? }, getCurrentDirectoryName: function () { // summary: get folder name // returns: folder name if(this._lastSelectedNode == undefined) { return false; } return this._lastSelectedNode.label; //String? }, getLastSelectedNode: function () { return this._lastSelectedNode; //String? }, deleteFiles: function(selectedNodes) { // summary: delete specified (or selected) files if(selectedNodes === undefined && this.listId){ selectedNodes = $$(this.listId).selectedNodes(); } if(selectedNodes == undefined || selectedNodes.length == 0){ console.warn('nothing selected'); return; } else{ if(this.model.store.deleteFiles(selectedNodes,this._currentDirectory) == true){ this.reloadFiles(); } else{ console.warn('cant delete files'); } } }, createDirectory: function (name) { if(this.model.store.createDirectory(name,this._currentDirectory) == true) { if(this._lastSelectedNode.item.children == undefined){ this._lastSelectedNode.item.children = []; } this._refreshNode(this._lastSelectedNode); return true; } else { return false; } }, renameDirectory: function (name) { if(this._lastSelectedNode == undefined || this._lastSelectedNode.isTree == true){ return; } var node = this._lastSelectedNode; var oldName = node.item.title; var newName = this.model.store.renameDirectory(name,oldName,this._currentDirectory); if(newName != false) { // set node elements this.setLabelNode(node,newName); node.item.directory = node.item.directory.substr(0,node.item.directory.lastIndexOf("/"))+'/'+newName; this._collapseNode(node); this.onClick(node.item, node); return true; } else { return false; } }, deleteDirectory: function (directory) { //summary: delete given or current directory if(directory == undefined){ directory = this._currentDirectory; } if(this._lastSelectedNode == undefined || this._lastSelectedNode.isTree == true){ return; } if(this.model.store.deleteDirectory(directory) == true){ var node = this._lastSelectedNode; parentNode = node.getParent(); var children = parentNode.item.children; for( var i=0,iLength=children.length ; i<iLength ; i++ ){ var child = children[i]; if(child.directory == directory){ var deleteIndex = i; } } children.splice(deleteIndex,1); if(parentNode.getChildren().length == 1){ parentNode.isExpandable = false; } this._refreshNode(parentNode); epages.event.fire(parentNode.domNode,'click'); } }, selectDirectory: function (directory) { var node = this._getNodeByDirectory(directory); var item = node.item ? node.item : undefined; this.onClick(item, node); }, _getNodeByDirectory: function(directory, parentNode) { if (parentNode == undefined){ parentNode = this; } if(directory == this.directory){ return this; } var nodesWithChildren = []; var children = parentNode.getChildren(); for( var i=0,iLength=children.length ; i<iLength ; i++ ) { var node = children[i]; if (node.item.directory == directory){ return node; } if (node.getChildren() && node.getChildren().length > 0){ nodesWithChildren.push(node); } } for( var i=0,iLength=nodesWithChildren.length ; i<iLength ; i++ ) { var node = this._getNodeByDirectory(directory, nodesWithChildren[i]); if (node != null){ return node; } } return null; }, openNode:function(directory){ if (directory === undefined || directory == "") { directory = this.directory; } //convert directory from string to array var selectedNodePath = new Array(); var directories = directory.split("/"); for( var i=0,l=directories.length ; i<l ; i++ ){ if(i === 0){ selectedNodePath[i] = directories[i]; } else{ selectedNodePath[i] = selectedNodePath[i-1]+'/'+directories[i]; } } for( var i=0,iLength=selectedNodePath.length ; i<iLength ; i++ ) { var directory = selectedNodePath[i]; var node = this._getNodeByDirectory(directory); if(node == undefined){ this.model.store._loadList(directory); node = this._getNodeByDirectory(directory); } if(node == undefined){ window.setTimeout(dojo.hitch(this,this.focusNode,this._lastSelectedNode),10); return false; } if (i == selectedNodePath.length - 1) { this._lastSelectedNode = node; this._currentDirectory = directory; //need timeout for ie window.setTimeout(dojo.hitch(this,this.focusNode,node),10); dojo.publish(this.id+'/select', [{ node : node, currentDirectory : directory }]); return true; } else{ this._lastSelectedNode = node; this._currentDirectory = directory; this._expandNode(node); } } }, reloadFiles: function(){ var files = this._getFileList(this._currentDirectory); if(this.listId != ""){ var filelist = $$(this.listId); if(files){ filelist.setChildren(files); } else{ filelist.destroyDescendants(); } } }, getLabelClass: function(/*dojo.data.Item*/ item){ // summary: user overridable function to return CSS class name to display label //if no return value is set dojo adds a class "undefined" to every label in the tree return ''; }, focusNode: function(node) { this._onNodeFocus(node); }, _onNodeFocus: function(/*dijit._Widget*/ node){ // summary: // Called when a TreeNode gets focus, either by user clicking // it, or programatically by arrow key handling code. // description: // It marks that the current node is the selected one, and the previously // selected node no longer is. if(node){ if(node != this.lastFocused && this.lastFocused && !this.lastFocused._destroyed){ // mark that the previously selected node is no longer the selected one this.blurNode(); if(this.lastFocused){ this.lastFocused.setSelected(false); } } // mark that the new node is the currently selected one dojo.addClass(node.labelNode,"Selected"); node.setSelected(true); this.lastFocused = node; } }, blurNode: function() { var node = this.lastFocused; if(!node){ return; } dojo.removeClass(node.labelNode, "Selected"); var labelNode = node.labelNode; dojo.removeClass(labelNode, "dijitTreeLabelFocused"); labelNode.setAttribute("tabIndex", "-1"); this.lastFocused = null; }, _refreshNode: function(/*Object*/ node) { // summary: Refreshes the given node in the tree. // description: There's also a thread on dojo campus: // http://dojocampus.org/content/2008/06/04/refreshing-a-data-store/. // example: // _refreshNode(this._lastSelectedNode); if(node.isExpanded == true || node.item.children != undefined){ this._collapseNode(node); node.state = "UNCHECKED"; node.isExpandable = true; node._setExpando(false); if(node == this.rootNode){ this.rootNode.item.children = this.model.store.getValues(this.rootNode.item,'children'); } this._expandNode(node); } else{ node.state = "UNCHECKED"; node.isExpandable = false; node._setExpando(false); } }, setLabelNode: function(node,label){ node.labelNode.innerHTML = ""; node.labelNode.appendChild(dojo.doc.createTextNode(label)); } });