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

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.TreeNodeV3");
  9. dojo.require("dojo.html.*");
  10. dojo.require("dojo.event.*");
  11. dojo.require("dojo.io.*");
  12. dojo.require("dojo.widget.TreeWithNode");
  13. dojo.widget.defineWidget("dojo.widget.TreeNodeV3", [dojo.widget.HtmlWidget, dojo.widget.TreeWithNode], function () {
  14. this.actionsDisabled = [];
  15. this.object = {};
  16. }, {tryLazyInit:true, actions:{MOVE:"MOVE", DETACH:"DETACH", EDIT:"EDIT", ADDCHILD:"ADDCHILD", SELECT:"SELECT"}, labelClass:"", contentClass:"", expandNode:null, labelNode:null, nodeDocType:"", selected:false, getnodeDocType:function () {
  17. return this.nodeDocType;
  18. }, cloneProperties:["actionsDisabled", "tryLazyInit", "nodeDocType", "objectId", "object", "title", "isFolder", "isExpanded", "state"], clone:function (deep) {
  19. var ret = new this.constructor();
  20. for (var i = 0; i < this.cloneProperties.length; i++) {
  21. var prop = this.cloneProperties[i];
  22. ret[prop] = dojo.lang.shallowCopy(this[prop], true);
  23. }
  24. if (this.tree.unsetFolderOnEmpty && !deep && this.isFolder) {
  25. ret.isFolder = false;
  26. }
  27. ret.toggleObj = this.toggleObj;
  28. dojo.widget.manager.add(ret);
  29. ret.tree = this.tree;
  30. ret.buildRendering({}, {});
  31. ret.initialize({}, {});
  32. if (deep && this.children.length) {
  33. for (var i = 0; i < this.children.length; i++) {
  34. var child = this.children[i];
  35. if (child.clone) {
  36. ret.children.push(child.clone(deep));
  37. } else {
  38. ret.children.push(dojo.lang.shallowCopy(child, deep));
  39. }
  40. }
  41. ret.setChildren();
  42. }
  43. return ret;
  44. }, markProcessing:function () {
  45. this.markProcessingSavedClass = dojo.html.getClass(this.expandNode);
  46. dojo.html.setClass(this.expandNode, this.tree.classPrefix + "ExpandLoading");
  47. }, unmarkProcessing:function () {
  48. dojo.html.setClass(this.expandNode, this.markProcessingSavedClass);
  49. }, buildRendering:function (args, fragment, parent) {
  50. if (args.tree) {
  51. this.tree = dojo.lang.isString(args.tree) ? dojo.widget.manager.getWidgetById(args.tree) : args.tree;
  52. } else {
  53. if (parent && parent.tree) {
  54. this.tree = parent.tree;
  55. }
  56. }
  57. if (!this.tree) {
  58. dojo.raise("Can't evaluate tree from arguments or parent");
  59. }
  60. this.domNode = this.tree.nodeTemplate.cloneNode(true);
  61. this.expandNode = this.domNode.firstChild;
  62. this.contentNode = this.domNode.childNodes[1];
  63. this.labelNode = this.contentNode.firstChild;
  64. if (this.labelClass) {
  65. dojo.html.addClass(this.labelNode, this.labelClass);
  66. }
  67. if (this.contentClass) {
  68. dojo.html.addClass(this.contentNode, this.contentClass);
  69. }
  70. this.domNode.widgetId = this.widgetId;
  71. this.labelNode.innerHTML = this.title;
  72. }, isTreeNode:true, object:{}, title:"", isFolder:null, contentNode:null, expandClass:"", isExpanded:false, containerNode:null, getInfo:function () {
  73. var info = {widgetId:this.widgetId, objectId:this.objectId, index:this.getParentIndex()};
  74. return info;
  75. }, setFolder:function () {
  76. this.isFolder = true;
  77. this.viewSetExpand();
  78. if (!this.containerNode) {
  79. this.viewAddContainer();
  80. }
  81. dojo.event.topic.publish(this.tree.eventNames.afterSetFolder, {source:this});
  82. }, initialize:function (args, frag, parent) {
  83. if (args.isFolder) {
  84. this.isFolder = true;
  85. }
  86. if (this.children.length || this.isFolder) {
  87. this.setFolder();
  88. } else {
  89. this.viewSetExpand();
  90. }
  91. for (var i = 0; i < this.actionsDisabled.length; i++) {
  92. this.actionsDisabled[i] = this.actionsDisabled[i].toUpperCase();
  93. }
  94. dojo.event.topic.publish(this.tree.eventNames.afterChangeTree, {oldTree:null, newTree:this.tree, node:this});
  95. }, unsetFolder:function () {
  96. this.isFolder = false;
  97. this.viewSetExpand();
  98. dojo.event.topic.publish(this.tree.eventNames.afterUnsetFolder, {source:this});
  99. }, insertNode:function (parent, index) {
  100. if (!index) {
  101. index = 0;
  102. }
  103. if (index == 0) {
  104. dojo.html.prependChild(this.domNode, parent.containerNode);
  105. } else {
  106. dojo.html.insertAfter(this.domNode, parent.children[index - 1].domNode);
  107. }
  108. }, updateTree:function (newTree) {
  109. if (this.tree === newTree) {
  110. return;
  111. }
  112. var oldTree = this.tree;
  113. dojo.lang.forEach(this.getDescendants(), function (elem) {
  114. elem.tree = newTree;
  115. });
  116. if (oldTree.classPrefix != newTree.classPrefix) {
  117. var stack = [this.domNode];
  118. var elem;
  119. var reg = new RegExp("(^|\s)" + oldTree.classPrefix, "g");
  120. while (elem = stack.pop()) {
  121. for (var i = 0; i < elem.childNodes.length; i++) {
  122. var childNode = elem.childNodes[i];
  123. if (childNode.nodeDocType != 1) {
  124. continue;
  125. }
  126. dojo.html.setClass(childNode, dojo.html.getClass(childNode).replace(reg, "$1" + newTree.classPrefix));
  127. stack.push(childNode);
  128. }
  129. }
  130. }
  131. var message = {oldTree:oldTree, newTree:newTree, node:this};
  132. dojo.event.topic.publish(this.tree.eventNames.afterChangeTree, message);
  133. dojo.event.topic.publish(newTree.eventNames.afterChangeTree, message);
  134. }, addedTo:function (parent, index, dontPublishEvent) {
  135. if (this.tree !== parent.tree) {
  136. this.updateTree(parent.tree);
  137. }
  138. if (parent.isTreeNode) {
  139. if (!parent.isFolder) {
  140. parent.setFolder();
  141. parent.state = parent.loadStates.LOADED;
  142. }
  143. }
  144. var siblingsCount = parent.children.length;
  145. this.insertNode(parent, index);
  146. this.viewAddLayout();
  147. if (siblingsCount > 1) {
  148. if (index == 0 && parent.children[1] instanceof dojo.widget.Widget) {
  149. parent.children[1].viewUpdateLayout();
  150. }
  151. if (index == siblingsCount - 1 && parent.children[siblingsCount - 2] instanceof dojo.widget.Widget) {
  152. parent.children[siblingsCount - 2].viewUpdateLayout();
  153. }
  154. } else {
  155. if (parent.isTreeNode) {
  156. parent.viewSetHasChildren();
  157. }
  158. }
  159. if (!dontPublishEvent) {
  160. var message = {child:this, index:index, parent:parent};
  161. dojo.event.topic.publish(this.tree.eventNames.afterAddChild, message);
  162. }
  163. }, createSimple:function (args, parent) {
  164. if (args.tree) {
  165. var tree = args.tree;
  166. } else {
  167. if (parent) {
  168. var tree = parent.tree;
  169. } else {
  170. dojo.raise("createSimple: can't evaluate tree");
  171. }
  172. }
  173. tree = dojo.widget.byId(tree);
  174. var treeNode = new tree.defaultChildWidget();
  175. for (var x in args) {
  176. treeNode[x] = args[x];
  177. }
  178. treeNode.toggleObj = dojo.lfx.toggle[treeNode.toggle.toLowerCase()] || dojo.lfx.toggle.plain;
  179. dojo.widget.manager.add(treeNode);
  180. treeNode.buildRendering(args, {}, parent);
  181. treeNode.initialize(args, {}, parent);
  182. if (treeNode.parent) {
  183. delete dojo.widget.manager.topWidgets[treeNode.widgetId];
  184. }
  185. return treeNode;
  186. }, viewUpdateLayout:function () {
  187. this.viewRemoveLayout();
  188. this.viewAddLayout();
  189. }, viewAddContainer:function () {
  190. this.containerNode = this.tree.containerNodeTemplate.cloneNode(true);
  191. this.domNode.appendChild(this.containerNode);
  192. }, viewAddLayout:function () {
  193. if (this.parent["isTree"]) {
  194. dojo.html.setClass(this.domNode, dojo.html.getClass(this.domNode) + " " + this.tree.classPrefix + "IsRoot");
  195. }
  196. if (this.isLastChild()) {
  197. dojo.html.setClass(this.domNode, dojo.html.getClass(this.domNode) + " " + this.tree.classPrefix + "IsLast");
  198. }
  199. }, viewRemoveLayout:function () {
  200. dojo.html.removeClass(this.domNode, this.tree.classPrefix + "IsRoot");
  201. dojo.html.removeClass(this.domNode, this.tree.classPrefix + "IsLast");
  202. }, viewGetExpandClass:function () {
  203. if (this.isFolder) {
  204. return this.isExpanded ? "ExpandOpen" : "ExpandClosed";
  205. } else {
  206. return "ExpandLeaf";
  207. }
  208. }, viewSetExpand:function () {
  209. var expand = this.tree.classPrefix + this.viewGetExpandClass();
  210. var reg = new RegExp("(^|\s)" + this.tree.classPrefix + "Expand\w+", "g");
  211. dojo.html.setClass(this.domNode, dojo.html.getClass(this.domNode).replace(reg, "") + " " + expand);
  212. this.viewSetHasChildrenAndExpand();
  213. }, viewGetChildrenClass:function () {
  214. return "Children" + (this.children.length ? "Yes" : "No");
  215. }, viewSetHasChildren:function () {
  216. var clazz = this.tree.classPrefix + this.viewGetChildrenClass();
  217. var reg = new RegExp("(^|\s)" + this.tree.classPrefix + "Children\w+", "g");
  218. dojo.html.setClass(this.domNode, dojo.html.getClass(this.domNode).replace(reg, "") + " " + clazz);
  219. this.viewSetHasChildrenAndExpand();
  220. }, viewSetHasChildrenAndExpand:function () {
  221. var clazz = this.tree.classPrefix + "State" + this.viewGetChildrenClass() + "-" + this.viewGetExpandClass();
  222. var reg = new RegExp("(^|\s)" + this.tree.classPrefix + "State[\w-]+", "g");
  223. dojo.html.setClass(this.domNode, dojo.html.getClass(this.domNode).replace(reg, "") + " " + clazz);
  224. }, viewUnfocus:function () {
  225. dojo.html.removeClass(this.labelNode, this.tree.classPrefix + "LabelFocused");
  226. }, viewFocus:function () {
  227. dojo.html.addClass(this.labelNode, this.tree.classPrefix + "LabelFocused");
  228. }, viewEmphasize:function () {
  229. dojo.html.clearSelection(this.labelNode);
  230. dojo.html.addClass(this.labelNode, this.tree.classPrefix + "NodeEmphasized");
  231. }, viewUnemphasize:function () {
  232. dojo.html.removeClass(this.labelNode, this.tree.classPrefix + "NodeEmphasized");
  233. }, detach:function () {
  234. if (!this.parent) {
  235. return;
  236. }
  237. var parent = this.parent;
  238. var index = this.getParentIndex();
  239. this.doDetach.apply(this, arguments);
  240. dojo.event.topic.publish(this.tree.eventNames.afterDetach, {child:this, parent:parent, index:index});
  241. }, doDetach:function () {
  242. var parent = this.parent;
  243. if (!parent) {
  244. return;
  245. }
  246. var index = this.getParentIndex();
  247. this.viewRemoveLayout();
  248. dojo.widget.DomWidget.prototype.removeChild.call(parent, this);
  249. var siblingsCount = parent.children.length;
  250. if (siblingsCount > 0) {
  251. if (index == 0) {
  252. parent.children[0].viewUpdateLayout();
  253. }
  254. if (index == siblingsCount) {
  255. parent.children[siblingsCount - 1].viewUpdateLayout();
  256. }
  257. } else {
  258. if (parent.isTreeNode) {
  259. parent.viewSetHasChildren();
  260. }
  261. }
  262. if (this.tree.unsetFolderOnEmpty && !parent.children.length && parent.isTreeNode) {
  263. parent.unsetFolder();
  264. }
  265. this.parent = null;
  266. }, destroy:function () {
  267. dojo.event.topic.publish(this.tree.eventNames.beforeNodeDestroy, {source:this});
  268. this.detach();
  269. return dojo.widget.HtmlWidget.prototype.destroy.apply(this, arguments);
  270. }, expand:function () {
  271. if (this.isExpanded) {
  272. return;
  273. }
  274. if (this.tryLazyInit) {
  275. this.setChildren();
  276. this.tryLazyInit = false;
  277. }
  278. this.isExpanded = true;
  279. this.viewSetExpand();
  280. this.showChildren();
  281. }, collapse:function () {
  282. if (!this.isExpanded) {
  283. return;
  284. }
  285. this.isExpanded = false;
  286. this.hideChildren();
  287. }, hideChildren:function () {
  288. this.tree.toggleObj.hide(this.containerNode, this.tree.toggleDuration, this.explodeSrc, dojo.lang.hitch(this, "onHideChildren"));
  289. }, showChildren:function () {
  290. this.tree.toggleObj.show(this.containerNode, this.tree.toggleDuration, this.explodeSrc, dojo.lang.hitch(this, "onShowChildren"));
  291. }, onShowChildren:function () {
  292. this.onShow();
  293. dojo.event.topic.publish(this.tree.eventNames.afterExpand, {source:this});
  294. }, onHideChildren:function () {
  295. this.viewSetExpand();
  296. this.onHide();
  297. dojo.event.topic.publish(this.tree.eventNames.afterCollapse, {source:this});
  298. }, setTitle:function (title) {
  299. var oldTitle = this.title;
  300. this.labelNode.innerHTML = this.title = title;
  301. dojo.event.topic.publish(this.tree.eventNames.afterSetTitle, {source:this, oldTitle:oldTitle});
  302. }, toString:function () {
  303. return "[" + this.widgetType + ", " + this.title + "]";
  304. }});