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.TreeSelectorV3");dojo.require("dojo.widget.HtmlWidget");dojo.require("dojo.widget.TreeCommon");dojo.widget.defineWidget("dojo.widget.TreeSelectorV3", [dojo.widget.HtmlWidget, dojo.widget.TreeCommon], function () {this.eventNames = {};this.listenedTrees = {};this.selectedNodes = [];this.lastClicked = {};}, {listenTreeEvents:["afterTreeCreate", "afterCollapse", "afterChangeTree", "afterDetach", "beforeTreeDestroy"], listenNodeFilter:function (elem) {return elem instanceof dojo.widget.Widget;}, allowedMulti:true, dblselectTimeout:300, eventNamesDefault:{select:"select", deselect:"deselect", dblselect:"dblselect"}, onAfterTreeCreate:function (message) {var tree = message.source;dojo.event.browser.addListener(tree.domNode, "onclick", dojo.lang.hitch(this, this.onTreeClick));if (dojo.render.html.ie) {dojo.event.browser.addListener(tree.domNode, "ondblclick", dojo.lang.hitch(this, this.onTreeDblClick));}dojo.event.browser.addListener(tree.domNode, "onKey", dojo.lang.hitch(this, this.onKey));}, onKey:function (e) {if (!e.key || e.ctrkKey || e.altKey) {return;}switch (e.key) {case e.KEY_ENTER:var node = this.domElement2TreeNode(e.target);if (node) {this.processNode(node, e);}}}, onAfterChangeTree:function (message) {if (!message.oldTree && message.node.selected) {this.select(message.node);}if (!message.newTree || !this.listenedTrees[message.newTree.widgetId]) {if (this.selectedNode && message.node.children) {this.deselectIfAncestorMatch(message.node);}}}, initialize:function (args) {for (var name in this.eventNamesDefault) {if (dojo.lang.isUndefined(this.eventNames[name])) {this.eventNames[name] = this.widgetId + "/" + this.eventNamesDefault[name];}}}, onBeforeTreeDestroy:function (message) {this.unlistenTree(message.source);}, onAfterCollapse:function (message) {this.deselectIfAncestorMatch(message.source);}, onTreeDblClick:function (event) {this.onTreeClick(event);}, checkSpecialEvent:function (event) {return event.shiftKey || event.ctrlKey;}, onTreeClick:function (event) {var node = this.domElement2TreeNode(event.target);if (!node) {return;}var checkLabelClick = function (domElement) {return domElement === node.labelNode;};if (this.checkPathCondition(event.target, checkLabelClick)) {this.processNode(node, event);}}, processNode:function (node, event) {if (node.actionIsDisabled(node.actions.SELECT)) {return;}if (dojo.lang.inArray(this.selectedNodes, node)) {if (this.checkSpecialEvent(event)) {this.deselect(node);return;}var _this = this;var i = 0;var selectedNode;while (this.selectedNodes.length > i) {selectedNode = this.selectedNodes[i];if (selectedNode !== node) {this.deselect(selectedNode);continue;}i++;}var wasJustClicked = this.checkRecentClick(node);eventName = wasJustClicked ? this.eventNames.dblselect : this.eventNames.select;if (wasJustClicked) {eventName = this.eventNames.dblselect;this.forgetLastClicked();} else {eventName = this.eventNames.select;this.setLastClicked(node);}dojo.event.topic.publish(eventName, {node:node});return;}this.deselectIfNoMulti(event);this.setLastClicked(node);this.select(node);}, forgetLastClicked:function () {this.lastClicked = {};}, setLastClicked:function (node) {this.lastClicked.date = new Date();this.lastClicked.node = node;}, checkRecentClick:function (node) {var diff = new Date() - this.lastClicked.date;if (this.lastClicked.node && diff < this.dblselectTimeout) {return true;} else {return false;}}, deselectIfNoMulti:function (event) {if (!this.checkSpecialEvent(event) || !this.allowedMulti) {this.deselectAll();}}, deselectIfAncestorMatch:function (ancestor) {var _this = this;dojo.lang.forEach(this.selectedNodes, function (node) {var selectedNode = node;node = node.parent;while (node && node.isTreeNode) {if (node === ancestor) {_this.deselect(selectedNode);return;}node = node.parent;}});}, onAfterDetach:function (message) {this.deselectIfAncestorMatch(message.child);}, select:function (node) {var index = dojo.lang.find(this.selectedNodes, node, true);if (index >= 0) {return;}this.selectedNodes.push(node);dojo.event.topic.publish(this.eventNames.select, {node:node});}, deselect:function (node) {var index = dojo.lang.find(this.selectedNodes, node, true);if (index < 0) {return;}this.selectedNodes.splice(index, 1);dojo.event.topic.publish(this.eventNames.deselect, {node:node});}, deselectAll:function () {while (this.selectedNodes.length) {this.deselect(this.selectedNodes[0]);}}});