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

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.Tree");
  9. dojo.require("dojo.widget.*");
  10. dojo.require("dojo.event.*");
  11. dojo.require("dojo.io.*");
  12. dojo.require("dojo.widget.HtmlWidget");
  13. dojo.require("dojo.widget.TreeNode");
  14. dojo.require("dojo.html.common");
  15. dojo.require("dojo.html.selection");
  16. dojo.widget.defineWidget("dojo.widget.Tree", dojo.widget.HtmlWidget, function () {
  17. this.eventNames = {};
  18. this.tree = this;
  19. this.DNDAcceptTypes = [];
  20. this.actionsDisabled = [];
  21. }, {widgetType:"Tree", eventNamesDefault:{createDOMNode:"createDOMNode", treeCreate:"treeCreate", treeDestroy:"treeDestroy", treeClick:"treeClick", iconClick:"iconClick", titleClick:"titleClick", moveFrom:"moveFrom", moveTo:"moveTo", addChild:"addChild", removeNode:"removeNode", expand:"expand", collapse:"collapse"}, isContainer:true, DNDMode:"off", lockLevel:0, strictFolders:true, DNDModes:{BETWEEN:1, ONTO:2}, DNDAcceptTypes:"", templateCssString:"n.dojoTree {ntfont: caption;ntfont-size: 11px;ntfont-weight: normal;ntoverflow: auto;n}nnn.dojoTreeNodeLabelTitle {ntpadding-left: 2px;ntcolor: WindowText;n}nn.dojoTreeNodeLabel {ntcursor:hand;ntcursor:pointer;n}nn.dojoTreeNodeLabelTitle:hover {nttext-decoration: underline;n}nn.dojoTreeNodeLabelSelected {ntbackground-color: Highlight;ntcolor: HighlightText;n}nn.dojoTree div {ntwhite-space: nowrap;n}nn.dojoTree img, .dojoTreeNodeLabel img {ntvertical-align: middle;n}nn", templateCssPath:dojo.uri.moduleUri("dojo.widget", "templates/images/Tree/Tree.css"), templateString:"<div class="dojoTree"></div>", isExpanded:true, isTree:true, objectId:"", controller:"", selector:"", menu:"", expandLevel:"", blankIconSrc:dojo.uri.moduleUri("dojo.widget", "templates/images/Tree/treenode_blank.gif"), gridIconSrcT:dojo.uri.moduleUri("dojo.widget", "templates/images/Tree/treenode_grid_t.gif"), gridIconSrcL:dojo.uri.moduleUri("dojo.widget", "templates/images/Tree/treenode_grid_l.gif"), gridIconSrcV:dojo.uri.moduleUri("dojo.widget", "templates/images/Tree/treenode_grid_v.gif"), gridIconSrcP:dojo.uri.moduleUri("dojo.widget", "templates/images/Tree/treenode_grid_p.gif"), gridIconSrcC:dojo.uri.moduleUri("dojo.widget", "templates/images/Tree/treenode_grid_c.gif"), gridIconSrcX:dojo.uri.moduleUri("dojo.widget", "templates/images/Tree/treenode_grid_x.gif"), gridIconSrcY:dojo.uri.moduleUri("dojo.widget", "templates/images/Tree/treenode_grid_y.gif"), gridIconSrcZ:dojo.uri.moduleUri("dojo.widget", "templates/images/Tree/treenode_grid_z.gif"), expandIconSrcPlus:dojo.uri.moduleUri("dojo.widget", "templates/images/Tree/treenode_expand_plus.gif"), expandIconSrcMinus:dojo.uri.moduleUri("dojo.widget", "templates/images/Tree/treenode_expand_minus.gif"), expandIconSrcLoading:dojo.uri.moduleUri("dojo.widget", "templates/images/Tree/treenode_loading.gif"), iconWidth:18, iconHeight:18, showGrid:true, showRootGrid:true, actionIsDisabled:function (action) {
  22. var _this = this;
  23. return dojo.lang.inArray(_this.actionsDisabled, action);
  24. }, actions:{ADDCHILD:"ADDCHILD"}, getInfo:function () {
  25. var info = {widgetId:this.widgetId, objectId:this.objectId};
  26. return info;
  27. }, initializeController:function () {
  28. if (this.controller != "off") {
  29. if (this.controller) {
  30. this.controller = dojo.widget.byId(this.controller);
  31. } else {
  32. dojo.require("dojo.widget.TreeBasicController");
  33. this.controller = dojo.widget.createWidget("TreeBasicController", {DNDController:(this.DNDMode ? "create" : ""), dieWithTree:true});
  34. }
  35. this.controller.listenTree(this);
  36. } else {
  37. this.controller = null;
  38. }
  39. }, initializeSelector:function () {
  40. if (this.selector != "off") {
  41. if (this.selector) {
  42. this.selector = dojo.widget.byId(this.selector);
  43. } else {
  44. dojo.require("dojo.widget.TreeSelector");
  45. this.selector = dojo.widget.createWidget("TreeSelector", {dieWithTree:true});
  46. }
  47. this.selector.listenTree(this);
  48. } else {
  49. this.selector = null;
  50. }
  51. }, initialize:function (args, frag) {
  52. var _this = this;
  53. for (name in this.eventNamesDefault) {
  54. if (dojo.lang.isUndefined(this.eventNames[name])) {
  55. this.eventNames[name] = this.widgetId + "/" + this.eventNamesDefault[name];
  56. }
  57. }
  58. for (var i = 0; i < this.actionsDisabled.length; i++) {
  59. this.actionsDisabled[i] = this.actionsDisabled[i].toUpperCase();
  60. }
  61. if (this.DNDMode == "off") {
  62. this.DNDMode = 0;
  63. } else {
  64. if (this.DNDMode == "between") {
  65. this.DNDMode = this.DNDModes.ONTO | this.DNDModes.BETWEEN;
  66. } else {
  67. if (this.DNDMode == "onto") {
  68. this.DNDMode = this.DNDModes.ONTO;
  69. }
  70. }
  71. }
  72. this.expandLevel = parseInt(this.expandLevel);
  73. this.initializeSelector();
  74. this.initializeController();
  75. if (this.menu) {
  76. this.menu = dojo.widget.byId(this.menu);
  77. this.menu.listenTree(this);
  78. }
  79. this.containerNode = this.domNode;
  80. }, postCreate:function () {
  81. this.createDOMNode();
  82. }, createDOMNode:function () {
  83. dojo.html.disableSelection(this.domNode);
  84. for (var i = 0; i < this.children.length; i++) {
  85. this.children[i].parent = this;
  86. var node = this.children[i].createDOMNode(this, 0);
  87. this.domNode.appendChild(node);
  88. }
  89. if (!this.showRootGrid) {
  90. for (var i = 0; i < this.children.length; i++) {
  91. this.children[i].expand();
  92. }
  93. }
  94. dojo.event.topic.publish(this.eventNames.treeCreate, {source:this});
  95. }, destroy:function () {
  96. dojo.event.topic.publish(this.tree.eventNames.treeDestroy, {source:this});
  97. return dojo.widget.HtmlWidget.prototype.destroy.apply(this, arguments);
  98. }, addChild:function (child, index) {
  99. var message = {child:child, index:index, parent:this, domNodeInitialized:child.domNodeInitialized};
  100. this.doAddChild.apply(this, arguments);
  101. dojo.event.topic.publish(this.tree.eventNames.addChild, message);
  102. }, doAddChild:function (child, index) {
  103. if (dojo.lang.isUndefined(index)) {
  104. index = this.children.length;
  105. }
  106. if (!child.isTreeNode) {
  107. dojo.raise("You can only add TreeNode widgets to a " + this.widgetType + " widget!");
  108. return;
  109. }
  110. if (this.isTreeNode) {
  111. if (!this.isFolder) {
  112. this.setFolder();
  113. }
  114. }
  115. var _this = this;
  116. dojo.lang.forEach(child.getDescendants(), function (elem) {
  117. elem.tree = _this.tree;
  118. });
  119. child.parent = this;
  120. if (this.isTreeNode) {
  121. this.state = this.loadStates.LOADED;
  122. }
  123. if (index < this.children.length) {
  124. dojo.html.insertBefore(child.domNode, this.children[index].domNode);
  125. } else {
  126. this.containerNode.appendChild(child.domNode);
  127. if (this.isExpanded && this.isTreeNode) {
  128. this.showChildren();
  129. }
  130. }
  131. this.children.splice(index, 0, child);
  132. if (child.domNodeInitialized) {
  133. var d = this.isTreeNode ? this.depth : -1;
  134. child.adjustDepth(d - child.depth + 1);
  135. child.updateIconTree();
  136. } else {
  137. child.depth = this.isTreeNode ? this.depth + 1 : 0;
  138. child.createDOMNode(child.tree, child.depth);
  139. }
  140. var prevSibling = child.getPreviousSibling();
  141. if (child.isLastChild() && prevSibling) {
  142. prevSibling.updateExpandGridColumn();
  143. }
  144. }, makeBlankImg:function () {
  145. var img = document.createElement("img");
  146. img.style.width = this.iconWidth + "px";
  147. img.style.height = this.iconHeight + "px";
  148. img.src = this.blankIconSrc;
  149. img.style.verticalAlign = "middle";
  150. return img;
  151. }, updateIconTree:function () {
  152. if (!this.isTree) {
  153. this.updateIcons();
  154. }
  155. for (var i = 0; i < this.children.length; i++) {
  156. this.children[i].updateIconTree();
  157. }
  158. }, toString:function () {
  159. return "[" + this.widgetType + " ID:" + this.widgetId + "]";
  160. }, move:function (child, newParent, index) {
  161. var oldParent = child.parent;
  162. var oldTree = child.tree;
  163. this.doMove.apply(this, arguments);
  164. var newParent = child.parent;
  165. var newTree = child.tree;
  166. var message = {oldParent:oldParent, oldTree:oldTree, newParent:newParent, newTree:newTree, child:child};
  167. dojo.event.topic.publish(oldTree.eventNames.moveFrom, message);
  168. dojo.event.topic.publish(newTree.eventNames.moveTo, message);
  169. }, doMove:function (child, newParent, index) {
  170. child.parent.doRemoveNode(child);
  171. newParent.doAddChild(child, index);
  172. }, removeNode:function (child) {
  173. if (!child.parent) {
  174. return;
  175. }
  176. var oldTree = child.tree;
  177. var oldParent = child.parent;
  178. var removedChild = this.doRemoveNode.apply(this, arguments);
  179. dojo.event.topic.publish(this.tree.eventNames.removeNode, {child:removedChild, tree:oldTree, parent:oldParent});
  180. return removedChild;
  181. }, doRemoveNode:function (child) {
  182. if (!child.parent) {
  183. return;
  184. }
  185. var parent = child.parent;
  186. var children = parent.children;
  187. var index = child.getParentIndex();
  188. if (index < 0) {
  189. dojo.raise("Couldn't find node " + child + " for removal");
  190. }
  191. children.splice(index, 1);
  192. dojo.html.removeNode(child.domNode);
  193. if (parent.children.length == 0 && !parent.isTree) {
  194. parent.containerNode.style.display = "none";
  195. }
  196. if (index == children.length && index > 0) {
  197. children[index - 1].updateExpandGridColumn();
  198. }
  199. if (parent instanceof dojo.widget.Tree && index == 0 && children.length > 0) {
  200. children[0].updateExpandGrid();
  201. }
  202. child.parent = child.tree = null;
  203. return child;
  204. }, markLoading:function () {
  205. }, unMarkLoading:function () {
  206. }, lock:function () {
  207. !this.lockLevel && this.markLoading();
  208. this.lockLevel++;
  209. }, unlock:function () {
  210. if (!this.lockLevel) {
  211. dojo.raise("unlock: not locked");
  212. }
  213. this.lockLevel--;
  214. !this.lockLevel && this.unMarkLoading();
  215. }, isLocked:function () {
  216. var node = this;
  217. while (true) {
  218. if (node.lockLevel) {
  219. return true;
  220. }
  221. if (node instanceof dojo.widget.Tree) {
  222. break;
  223. }
  224. node = node.parent;
  225. }
  226. return false;
  227. }, flushLock:function () {
  228. this.lockLevel = 0;
  229. this.unMarkLoading();
  230. }});