Rev 1422 | Blame | Compare with Previous | Last modification | View Log | RSS feed
/*Copyright (c) 2004-2006, The Dojo FoundationAll Rights Reserved.Licensed under the Academic Free License version 2.1 or above OR themodified BSD license. For more information on Dojo licensing, see:http://dojotoolkit.org/community/licensing.shtml*/dojo.provide("dojo.widget.TreeBasicControllerV3");dojo.require("dojo.event.*");dojo.require("dojo.json");dojo.require("dojo.io.*");dojo.require("dojo.widget.TreeCommon");dojo.require("dojo.widget.TreeNodeV3");dojo.require("dojo.widget.TreeV3");dojo.widget.defineWidget("dojo.widget.TreeBasicControllerV3", [dojo.widget.HtmlWidget, dojo.widget.TreeCommon], function () {this.listenedTrees = {};}, {listenTreeEvents:["afterSetFolder", "afterTreeCreate", "beforeTreeDestroy"], listenNodeFilter:function (elem) {return elem instanceof dojo.widget.Widget;}, editor:null, initialize:function (args) {if (args.editor) {this.editor = dojo.widget.byId(args.editor);this.editor.controller = this;}}, getInfo:function (elem) {return elem.getInfo();}, onBeforeTreeDestroy:function (message) {this.unlistenTree(message.source);}, onAfterSetFolder:function (message) {if (message.source.expandLevel > 0) {this.expandToLevel(message.source, message.source.expandLevel);}if (message.source.loadLevel > 0) {this.loadToLevel(message.source, message.source.loadLevel);}}, _focusNextVisible:function (nodeWidget) {if (nodeWidget.isFolder && nodeWidget.isExpanded && nodeWidget.children.length > 0) {returnWidget = nodeWidget.children[0];} else {while (nodeWidget.isTreeNode && nodeWidget.isLastChild()) {nodeWidget = nodeWidget.parent;}if (nodeWidget.isTreeNode) {var returnWidget = nodeWidget.parent.children[nodeWidget.getParentIndex() + 1];}}if (returnWidget && returnWidget.isTreeNode) {this._focusLabel(returnWidget);return returnWidget;}}, _focusPreviousVisible:function (nodeWidget) {var returnWidget = nodeWidget;if (!nodeWidget.isFirstChild()) {var previousSibling = nodeWidget.parent.children[nodeWidget.getParentIndex() - 1];nodeWidget = previousSibling;while (nodeWidget.isFolder && nodeWidget.isExpanded && nodeWidget.children.length > 0) {returnWidget = nodeWidget;nodeWidget = nodeWidget.children[nodeWidget.children.length - 1];}} else {nodeWidget = nodeWidget.parent;}if (nodeWidget && nodeWidget.isTreeNode) {returnWidget = nodeWidget;}if (returnWidget && returnWidget.isTreeNode) {this._focusLabel(returnWidget);return returnWidget;}}, _focusZoomIn:function (nodeWidget) {var returnWidget = nodeWidget;if (nodeWidget.isFolder && !nodeWidget.isExpanded) {this.expand(nodeWidget);} else {if (nodeWidget.children.length > 0) {nodeWidget = nodeWidget.children[0];}}if (nodeWidget && nodeWidget.isTreeNode) {returnWidget = nodeWidget;}if (returnWidget && returnWidget.isTreeNode) {this._focusLabel(returnWidget);return returnWidget;}}, _focusZoomOut:function (node) {var returnWidget = node;if (node.isFolder && node.isExpanded) {this.collapse(node);} else {node = node.parent;}if (node && node.isTreeNode) {returnWidget = node;}if (returnWidget && returnWidget.isTreeNode) {this._focusLabel(returnWidget);return returnWidget;}}, onFocusNode:function (e) {var node = this.domElement2TreeNode(e.target);if (node) {node.viewFocus();dojo.event.browser.stopEvent(e);}}, onBlurNode:function (e) {var node = this.domElement2TreeNode(e.target);if (!node) {return;}var labelNode = node.labelNode;labelNode.setAttribute("tabIndex", "-1");node.viewUnfocus();dojo.event.browser.stopEvent(e);node.tree.domNode.setAttribute("tabIndex", "0");}, _focusLabel:function (node) {var lastFocused = node.tree.lastFocused;var labelNode;if (lastFocused && lastFocused.labelNode) {labelNode = lastFocused.labelNode;dojo.event.disconnect(labelNode, "onblur", this, "onBlurNode");labelNode.setAttribute("tabIndex", "-1");dojo.html.removeClass(labelNode, "TreeLabelFocused");}labelNode = node.labelNode;labelNode.setAttribute("tabIndex", "0");node.tree.lastFocused = node;dojo.html.addClass(labelNode, "TreeLabelFocused");dojo.event.connectOnce(labelNode, "onblur", this, "onBlurNode");dojo.event.connectOnce(labelNode, "onfocus", this, "onFocusNode");labelNode.focus();}, onKey:function (e) {if (!e.key || e.ctrkKey || e.altKey) {return;}var nodeWidget = this.domElement2TreeNode(e.target);if (!nodeWidget) {return;}var treeWidget = nodeWidget.tree;if (treeWidget.lastFocused && treeWidget.lastFocused.labelNode) {nodeWidget = treeWidget.lastFocused;}switch (e.key) {case e.KEY_TAB:if (e.shiftKey) {treeWidget.domNode.setAttribute("tabIndex", "-1");}break;case e.KEY_RIGHT_ARROW:this._focusZoomIn(nodeWidget);dojo.event.browser.stopEvent(e);break;case e.KEY_LEFT_ARROW:this._focusZoomOut(nodeWidget);dojo.event.browser.stopEvent(e);break;case e.KEY_UP_ARROW:this._focusPreviousVisible(nodeWidget);dojo.event.browser.stopEvent(e);break;case e.KEY_DOWN_ARROW:this._focusNextVisible(nodeWidget);dojo.event.browser.stopEvent(e);break;}}, onFocusTree:function (e) {if (!e.currentTarget) {return;}try {var treeWidget = this.getWidgetByNode(e.currentTarget);if (!treeWidget || !treeWidget.isTree) {return;}var nodeWidget = this.getWidgetByNode(treeWidget.domNode.firstChild);if (nodeWidget && nodeWidget.isTreeNode) {if (treeWidget.lastFocused && treeWidget.lastFocused.isTreeNode) {nodeWidget = treeWidget.lastFocused;}this._focusLabel(nodeWidget);}}catch (e) {}}, onAfterTreeCreate:function (message) {var tree = message.source;dojo.event.browser.addListener(tree.domNode, "onKey", dojo.lang.hitch(this, this.onKey));dojo.event.browser.addListener(tree.domNode, "onmousedown", dojo.lang.hitch(this, this.onTreeMouseDown));dojo.event.browser.addListener(tree.domNode, "onclick", dojo.lang.hitch(this, this.onTreeClick));dojo.event.browser.addListener(tree.domNode, "onfocus", dojo.lang.hitch(this, this.onFocusTree));tree.domNode.setAttribute("tabIndex", "0");if (tree.expandLevel) {this.expandToLevel(tree, tree.expandLevel);}if (tree.loadLevel) {this.loadToLevel(tree, tree.loadLevel);}}, onTreeMouseDown:function (e) {}, onTreeClick:function (e) {var domElement = e.target;var node = this.domElement2TreeNode(domElement);if (!node || !node.isTreeNode) {return;}var checkExpandClick = function (el) {return el === node.expandNode;};if (this.checkPathCondition(domElement, checkExpandClick)) {this.processExpandClick(node);}this._focusLabel(node);}, processExpandClick:function (node) {if (node.isExpanded) {this.collapse(node);} else {this.expand(node);}}, batchExpandTimeout:20, expandAll:function (nodeOrTree) {return this.expandToLevel(nodeOrTree, Number.POSITIVE_INFINITY);}, collapseAll:function (nodeOrTree) {var _this = this;var filter = function (elem) {return (elem instanceof dojo.widget.Widget) && elem.isFolder && elem.isExpanded;};if (nodeOrTree.isTreeNode) {this.processDescendants(nodeOrTree, filter, this.collapse);} else {if (nodeOrTree.isTree) {dojo.lang.forEach(nodeOrTree.children, function (c) {_this.processDescendants(c, filter, _this.collapse);});}}}, expandToNode:function (node, withSelected) {n = withSelected ? node : node.parent;s = [];while (!n.isExpanded) {s.push(n);n = n.parent;}dojo.lang.forEach(s, function (n) {n.expand();});}, expandToLevel:function (nodeOrTree, level) {dojo.require("dojo.widget.TreeTimeoutIterator");var _this = this;var filterFunc = function (elem) {var res = elem.isFolder || elem.children && elem.children.length;return res;};var callFunc = function (node, iterator) {_this.expand(node, true);iterator.forward();};var iterator = new dojo.widget.TreeTimeoutIterator(nodeOrTree, callFunc, this);iterator.setFilter(filterFunc);iterator.timeout = this.batchExpandTimeout;iterator.setMaxLevel(nodeOrTree.isTreeNode ? level - 1 : level);return iterator.start(nodeOrTree.isTreeNode);}, getWidgetByNode:function (node) {var widgetId;var newNode = node;while (!(widgetId = newNode.widgetId)) {newNode = newNode.parentNode;if (newNode == null) {break;}}if (widgetId) {return dojo.widget.byId(widgetId);} else {if (node == null) {return null;} else {return dojo.widget.manager.byNode(node);}}}, expand:function (node) {if (node.isFolder) {node.expand();}}, collapse:function (node) {if (node.isFolder) {node.collapse();}}, canEditLabel:function (node) {if (node.actionIsDisabledNow(node.actions.EDIT)) {return false;}return true;}, editLabelStart:function (node) {if (!this.canEditLabel(node)) {return false;}if (!this.editor.isClosed()) {this.editLabelFinish(this.editor.saveOnBlur);}this.doEditLabelStart(node);}, editLabelFinish:function (save) {this.doEditLabelFinish(save);}, doEditLabelStart:function (node) {if (!this.editor) {dojo.raise(this.widgetType + ": no editor specified");}this.editor.open(node);}, doEditLabelFinish:function (save, server_data) {if (!this.editor) {dojo.raise(this.widgetType + ": no editor specified");}var node = this.editor.node;var editorTitle = this.editor.getContents();this.editor.close(save);if (save) {var data = {title:editorTitle};if (server_data) {dojo.lang.mixin(data, server_data);}if (node.isPhantom) {var parent = node.parent;var index = node.getParentIndex();node.destroy();dojo.widget.TreeBasicControllerV3.prototype.doCreateChild.call(this, parent, index, data);} else {var title = server_data && server_data.title ? server_data.title : editorTitle;node.setTitle(title);}} else {if (node.isPhantom) {node.destroy();}}}, makeDefaultNode:function (parent, index) {var data = {title:parent.tree.defaultChildTitle};return dojo.widget.TreeBasicControllerV3.prototype.doCreateChild.call(this, parent, index, data);}, runStages:function (check, prepare, make, finalize, expose, args) {if (check && !check.apply(this, args)) {return false;}if (prepare && !prepare.apply(this, args)) {return false;}var result = make.apply(this, args);if (finalize) {finalize.apply(this, args);}if (!result) {return result;}if (expose) {expose.apply(this, args);}return result;}});dojo.lang.extend(dojo.widget.TreeBasicControllerV3, {createAndEdit:function (parent, index) {var data = {title:parent.tree.defaultChildTitle};if (!this.canCreateChild(parent, index, data)) {return false;}var child = this.doCreateChild(parent, index, data);if (!child) {return false;}this.exposeCreateChild(parent, index, data);child.isPhantom = true;if (!this.editor.isClosed()) {this.editLabelFinish(this.editor.saveOnBlur);}this.doEditLabelStart(child);}});dojo.lang.extend(dojo.widget.TreeBasicControllerV3, {canClone:function (child, newParent, index, deep) {return true;}, clone:function (child, newParent, index, deep) {return this.runStages(this.canClone, this.prepareClone, this.doClone, this.finalizeClone, this.exposeClone, arguments);}, exposeClone:function (child, newParent) {if (newParent.isTreeNode) {this.expand(newParent);}}, doClone:function (child, newParent, index, deep) {var cloned = child.clone(deep);newParent.addChild(cloned, index);return cloned;}});dojo.lang.extend(dojo.widget.TreeBasicControllerV3, {canDetach:function (child) {if (child.actionIsDisabledNow(child.actions.DETACH)) {return false;}return true;}, detach:function (node) {return this.runStages(this.canDetach, this.prepareDetach, this.doDetach, this.finalizeDetach, this.exposeDetach, arguments);}, doDetach:function (node, callObj, callFunc) {node.detach();}});dojo.lang.extend(dojo.widget.TreeBasicControllerV3, {canDestroyChild:function (child) {if (child.parent && !this.canDetach(child)) {return false;}return true;}, destroyChild:function (node) {return this.runStages(this.canDestroyChild, this.prepareDestroyChild, this.doDestroyChild, this.finalizeDestroyChild, this.exposeDestroyChild, arguments);}, doDestroyChild:function (node) {node.destroy();}});dojo.lang.extend(dojo.widget.TreeBasicControllerV3, {canMoveNotANode:function (child, parent) {if (child.treeCanMove) {return child.treeCanMove(parent);}return true;}, canMove:function (child, newParent) {if (!child.isTreeNode) {return this.canMoveNotANode(child, newParent);}if (child.actionIsDisabledNow(child.actions.MOVE)) {return false;}if (child.parent !== newParent && newParent.actionIsDisabledNow(newParent.actions.ADDCHILD)) {return false;}var node = newParent;while (node.isTreeNode) {if (node === child) {return false;}node = node.parent;}return true;}, move:function (child, newParent, index) {return this.runStages(this.canMove, this.prepareMove, this.doMove, this.finalizeMove, this.exposeMove, arguments);}, doMove:function (child, newParent, index) {child.tree.move(child, newParent, index);return true;}, exposeMove:function (child, newParent) {if (newParent.isTreeNode) {this.expand(newParent);}}});dojo.lang.extend(dojo.widget.TreeBasicControllerV3, {canCreateChild:function (parent, index, data) {if (parent.actionIsDisabledNow(parent.actions.ADDCHILD)) {return false;}return true;}, createChild:function (parent, index, data) {if (!data) {data = {title:parent.tree.defaultChildTitle};}return this.runStages(this.canCreateChild, this.prepareCreateChild, this.doCreateChild, this.finalizeCreateChild, this.exposeCreateChild, [parent, index, data]);}, prepareCreateChild:function () {return true;}, finalizeCreateChild:function () {}, doCreateChild:function (parent, index, data) {var newChild = parent.tree.createNode(data);parent.addChild(newChild, index);return newChild;}, exposeCreateChild:function (parent) {return this.expand(parent);}});