TreeSelectorV3.js
上传用户:kimgenplus
上传日期:2016-06-05
资源大小:20877k
文件大小:5k
源码类别:

OA系统

开发平台:

Java

  1. /*
  2. Copyright (c) 2004-2006, The Dojo Foundation
  3. All Rights Reserved.
  4. Licensed under the Academic Free License version 2.1 or above OR the
  5. modified BSD license. For more information on Dojo licensing, see:
  6. http://dojotoolkit.org/community/licensing.shtml
  7. */
  8. dojo.provide("dojo.widget.TreeSelectorV3");
  9. dojo.require("dojo.widget.HtmlWidget");
  10. dojo.require("dojo.widget.TreeCommon");
  11. dojo.widget.defineWidget("dojo.widget.TreeSelectorV3", [dojo.widget.HtmlWidget, dojo.widget.TreeCommon], function () {
  12. this.eventNames = {};
  13. this.listenedTrees = {};
  14. this.selectedNodes = [];
  15. this.lastClicked = {};
  16. }, {listenTreeEvents:["afterTreeCreate", "afterCollapse", "afterChangeTree", "afterDetach", "beforeTreeDestroy"], listenNodeFilter:function (elem) {
  17. return elem instanceof dojo.widget.Widget;
  18. }, allowedMulti:true, dblselectTimeout:300, eventNamesDefault:{select:"select", deselect:"deselect", dblselect:"dblselect"}, onAfterTreeCreate:function (message) {
  19. var tree = message.source;
  20. dojo.event.browser.addListener(tree.domNode, "onclick", dojo.lang.hitch(this, this.onTreeClick));
  21. if (dojo.render.html.ie) {
  22. dojo.event.browser.addListener(tree.domNode, "ondblclick", dojo.lang.hitch(this, this.onTreeDblClick));
  23. }
  24. dojo.event.browser.addListener(tree.domNode, "onKey", dojo.lang.hitch(this, this.onKey));
  25. }, onKey:function (e) {
  26. if (!e.key || e.ctrkKey || e.altKey) {
  27. return;
  28. }
  29. switch (e.key) {
  30.   case e.KEY_ENTER:
  31. var node = this.domElement2TreeNode(e.target);
  32. if (node) {
  33. this.processNode(node, e);
  34. }
  35. }
  36. }, onAfterChangeTree:function (message) {
  37. if (!message.oldTree && message.node.selected) {
  38. this.select(message.node);
  39. }
  40. if (!message.newTree || !this.listenedTrees[message.newTree.widgetId]) {
  41. if (this.selectedNode && message.node.children) {
  42. this.deselectIfAncestorMatch(message.node);
  43. }
  44. }
  45. }, initialize:function (args) {
  46. for (var name in this.eventNamesDefault) {
  47. if (dojo.lang.isUndefined(this.eventNames[name])) {
  48. this.eventNames[name] = this.widgetId + "/" + this.eventNamesDefault[name];
  49. }
  50. }
  51. }, onBeforeTreeDestroy:function (message) {
  52. this.unlistenTree(message.source);
  53. }, onAfterCollapse:function (message) {
  54. this.deselectIfAncestorMatch(message.source);
  55. }, onTreeDblClick:function (event) {
  56. this.onTreeClick(event);
  57. }, checkSpecialEvent:function (event) {
  58. return event.shiftKey || event.ctrlKey;
  59. }, onTreeClick:function (event) {
  60. var node = this.domElement2TreeNode(event.target);
  61. if (!node) {
  62. return;
  63. }
  64. var checkLabelClick = function (domElement) {
  65. return domElement === node.labelNode;
  66. };
  67. if (this.checkPathCondition(event.target, checkLabelClick)) {
  68. this.processNode(node, event);
  69. }
  70. }, processNode:function (node, event) {
  71. if (node.actionIsDisabled(node.actions.SELECT)) {
  72. return;
  73. }
  74. if (dojo.lang.inArray(this.selectedNodes, node)) {
  75. if (this.checkSpecialEvent(event)) {
  76. this.deselect(node);
  77. return;
  78. }
  79. var _this = this;
  80. var i = 0;
  81. var selectedNode;
  82. while (this.selectedNodes.length > i) {
  83. selectedNode = this.selectedNodes[i];
  84. if (selectedNode !== node) {
  85. this.deselect(selectedNode);
  86. continue;
  87. }
  88. i++;
  89. }
  90. var wasJustClicked = this.checkRecentClick(node);
  91. eventName = wasJustClicked ? this.eventNames.dblselect : this.eventNames.select;
  92. if (wasJustClicked) {
  93. eventName = this.eventNames.dblselect;
  94. this.forgetLastClicked();
  95. } else {
  96. eventName = this.eventNames.select;
  97. this.setLastClicked(node);
  98. }
  99. dojo.event.topic.publish(eventName, {node:node});
  100. return;
  101. }
  102. this.deselectIfNoMulti(event);
  103. this.setLastClicked(node);
  104. this.select(node);
  105. }, forgetLastClicked:function () {
  106. this.lastClicked = {};
  107. }, setLastClicked:function (node) {
  108. this.lastClicked.date = new Date();
  109. this.lastClicked.node = node;
  110. }, checkRecentClick:function (node) {
  111. var diff = new Date() - this.lastClicked.date;
  112. if (this.lastClicked.node && diff < this.dblselectTimeout) {
  113. return true;
  114. } else {
  115. return false;
  116. }
  117. }, deselectIfNoMulti:function (event) {
  118. if (!this.checkSpecialEvent(event) || !this.allowedMulti) {
  119. this.deselectAll();
  120. }
  121. }, deselectIfAncestorMatch:function (ancestor) {
  122. var _this = this;
  123. dojo.lang.forEach(this.selectedNodes, function (node) {
  124. var selectedNode = node;
  125. node = node.parent;
  126. while (node && node.isTreeNode) {
  127. if (node === ancestor) {
  128. _this.deselect(selectedNode);
  129. return;
  130. }
  131. node = node.parent;
  132. }
  133. });
  134. }, onAfterDetach:function (message) {
  135. this.deselectIfAncestorMatch(message.child);
  136. }, select:function (node) {
  137. var index = dojo.lang.find(this.selectedNodes, node, true);
  138. if (index >= 0) {
  139. return;
  140. }
  141. this.selectedNodes.push(node);
  142. dojo.event.topic.publish(this.eventNames.select, {node:node});
  143. }, deselect:function (node) {
  144. var index = dojo.lang.find(this.selectedNodes, node, true);
  145. if (index < 0) {
  146. return;
  147. }
  148. this.selectedNodes.splice(index, 1);
  149. dojo.event.topic.publish(this.eventNames.deselect, {node:node});
  150. }, deselectAll:function () {
  151. while (this.selectedNodes.length) {
  152. this.deselect(this.selectedNodes[0]);
  153. }
  154. }});