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

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.dnd.TreeDragAndDrop");
  9. dojo.require("dojo.dnd.HtmlDragAndDrop");
  10. dojo.require("dojo.lang.func");
  11. dojo.require("dojo.lang.array");
  12. dojo.require("dojo.lang.extras");
  13. dojo.require("dojo.html.layout");
  14. dojo.dnd.TreeDragSource = function (node, syncController, type, treeNode) {
  15. this.controller = syncController;
  16. this.treeNode = treeNode;
  17. dojo.dnd.HtmlDragSource.call(this, node, type);
  18. };
  19. dojo.inherits(dojo.dnd.TreeDragSource, dojo.dnd.HtmlDragSource);
  20. dojo.lang.extend(dojo.dnd.TreeDragSource, {onDragStart:function () {
  21. var dragObject = dojo.dnd.HtmlDragSource.prototype.onDragStart.call(this);
  22. dragObject.treeNode = this.treeNode;
  23. dragObject.onDragStart = dojo.lang.hitch(dragObject, function (e) {
  24. this.savedSelectedNode = this.treeNode.tree.selector.selectedNode;
  25. if (this.savedSelectedNode) {
  26. this.savedSelectedNode.unMarkSelected();
  27. }
  28. var result = dojo.dnd.HtmlDragObject.prototype.onDragStart.apply(this, arguments);
  29. var cloneGrid = this.dragClone.getElementsByTagName("img");
  30. for (var i = 0; i < cloneGrid.length; i++) {
  31. cloneGrid.item(i).style.backgroundImage = "url()";
  32. }
  33. return result;
  34. });
  35. dragObject.onDragEnd = function (e) {
  36. if (this.savedSelectedNode) {
  37. this.savedSelectedNode.markSelected();
  38. }
  39. return dojo.dnd.HtmlDragObject.prototype.onDragEnd.apply(this, arguments);
  40. };
  41. return dragObject;
  42. }, onDragEnd:function (e) {
  43. var res = dojo.dnd.HtmlDragSource.prototype.onDragEnd.call(this, e);
  44. return res;
  45. }});
  46. dojo.dnd.TreeDropTarget = function (domNode, controller, type, treeNode) {
  47. this.treeNode = treeNode;
  48. this.controller = controller;
  49. dojo.dnd.HtmlDropTarget.apply(this, [domNode, type]);
  50. };
  51. dojo.inherits(dojo.dnd.TreeDropTarget, dojo.dnd.HtmlDropTarget);
  52. dojo.lang.extend(dojo.dnd.TreeDropTarget, {autoExpandDelay:1500, autoExpandTimer:null, position:null, indicatorStyle:"2px black solid", showIndicator:function (position) {
  53. if (this.position == position) {
  54. return;
  55. }
  56. this.hideIndicator();
  57. this.position = position;
  58. if (position == "before") {
  59. this.treeNode.labelNode.style.borderTop = this.indicatorStyle;
  60. } else {
  61. if (position == "after") {
  62. this.treeNode.labelNode.style.borderBottom = this.indicatorStyle;
  63. } else {
  64. if (position == "onto") {
  65. this.treeNode.markSelected();
  66. }
  67. }
  68. }
  69. }, hideIndicator:function () {
  70. this.treeNode.labelNode.style.borderBottom = "";
  71. this.treeNode.labelNode.style.borderTop = "";
  72. this.treeNode.unMarkSelected();
  73. this.position = null;
  74. }, onDragOver:function (e) {
  75. var accepts = dojo.dnd.HtmlDropTarget.prototype.onDragOver.apply(this, arguments);
  76. if (accepts && this.treeNode.isFolder && !this.treeNode.isExpanded) {
  77. this.setAutoExpandTimer();
  78. }
  79. return accepts;
  80. }, accepts:function (dragObjects) {
  81. var accepts = dojo.dnd.HtmlDropTarget.prototype.accepts.apply(this, arguments);
  82. if (!accepts) {
  83. return false;
  84. }
  85. var sourceTreeNode = dragObjects[0].treeNode;
  86. if (dojo.lang.isUndefined(sourceTreeNode) || !sourceTreeNode || !sourceTreeNode.isTreeNode) {
  87. dojo.raise("Source is not TreeNode or not found");
  88. }
  89. if (sourceTreeNode === this.treeNode) {
  90. return false;
  91. }
  92. return true;
  93. }, setAutoExpandTimer:function () {
  94. var _this = this;
  95. var autoExpand = function () {
  96. if (dojo.dnd.dragManager.currentDropTarget === _this) {
  97. _this.controller.expand(_this.treeNode);
  98. }
  99. };
  100. this.autoExpandTimer = dojo.lang.setTimeout(autoExpand, _this.autoExpandDelay);
  101. }, getDNDMode:function () {
  102. return this.treeNode.tree.DNDMode;
  103. }, getAcceptPosition:function (e, sourceTreeNode) {
  104. var DNDMode = this.getDNDMode();
  105. if (DNDMode & dojo.widget.Tree.prototype.DNDModes.ONTO && !(!this.treeNode.actionIsDisabled(dojo.widget.TreeNode.prototype.actions.ADDCHILD) && sourceTreeNode.parent !== this.treeNode && this.controller.canMove(sourceTreeNode, this.treeNode))) {
  106. DNDMode &= ~dojo.widget.Tree.prototype.DNDModes.ONTO;
  107. }
  108. var position = this.getPosition(e, DNDMode);
  109. if (position == "onto" || (!this.isAdjacentNode(sourceTreeNode, position) && this.controller.canMove(sourceTreeNode, this.treeNode.parent))) {
  110. return position;
  111. } else {
  112. return false;
  113. }
  114. }, onDragOut:function (e) {
  115. this.clearAutoExpandTimer();
  116. this.hideIndicator();
  117. }, clearAutoExpandTimer:function () {
  118. if (this.autoExpandTimer) {
  119. clearTimeout(this.autoExpandTimer);
  120. this.autoExpandTimer = null;
  121. }
  122. }, onDragMove:function (e, dragObjects) {
  123. var sourceTreeNode = dragObjects[0].treeNode;
  124. var position = this.getAcceptPosition(e, sourceTreeNode);
  125. if (position) {
  126. this.showIndicator(position);
  127. }
  128. }, isAdjacentNode:function (sourceNode, position) {
  129. if (sourceNode === this.treeNode) {
  130. return true;
  131. }
  132. if (sourceNode.getNextSibling() === this.treeNode && position == "before") {
  133. return true;
  134. }
  135. if (sourceNode.getPreviousSibling() === this.treeNode && position == "after") {
  136. return true;
  137. }
  138. return false;
  139. }, getPosition:function (e, DNDMode) {
  140. var node = dojo.byId(this.treeNode.labelNode);
  141. var mousey = e.pageY || e.clientY + dojo.body().scrollTop;
  142. var nodey = dojo.html.getAbsolutePosition(node).y;
  143. var height = dojo.html.getBorderBox(node).height;
  144. var relY = mousey - nodey;
  145. var p = relY / height;
  146. var position = "";
  147. if (DNDMode & dojo.widget.Tree.prototype.DNDModes.ONTO && DNDMode & dojo.widget.Tree.prototype.DNDModes.BETWEEN) {
  148. if (p <= 0.3) {
  149. position = "before";
  150. } else {
  151. if (p <= 0.7) {
  152. position = "onto";
  153. } else {
  154. position = "after";
  155. }
  156. }
  157. } else {
  158. if (DNDMode & dojo.widget.Tree.prototype.DNDModes.BETWEEN) {
  159. if (p <= 0.5) {
  160. position = "before";
  161. } else {
  162. position = "after";
  163. }
  164. } else {
  165. if (DNDMode & dojo.widget.Tree.prototype.DNDModes.ONTO) {
  166. position = "onto";
  167. }
  168. }
  169. }
  170. return position;
  171. }, getTargetParentIndex:function (sourceTreeNode, position) {
  172. var index = position == "before" ? this.treeNode.getParentIndex() : this.treeNode.getParentIndex() + 1;
  173. if (this.treeNode.parent === sourceTreeNode.parent && this.treeNode.getParentIndex() > sourceTreeNode.getParentIndex()) {
  174. index--;
  175. }
  176. return index;
  177. }, onDrop:function (e) {
  178. var position = this.position;
  179. this.onDragOut(e);
  180. var sourceTreeNode = e.dragObject.treeNode;
  181. if (!dojo.lang.isObject(sourceTreeNode)) {
  182. dojo.raise("TreeNode not found in dragObject");
  183. }
  184. if (position == "onto") {
  185. return this.controller.move(sourceTreeNode, this.treeNode, 0);
  186. } else {
  187. var index = this.getTargetParentIndex(sourceTreeNode, position);
  188. return this.controller.move(sourceTreeNode, this.treeNode.parent, index);
  189. }
  190. }});
  191. dojo.dnd.TreeDNDController = function (treeController) {
  192. this.treeController = treeController;
  193. this.dragSources = {};
  194. this.dropTargets = {};
  195. };
  196. dojo.lang.extend(dojo.dnd.TreeDNDController, {listenTree:function (tree) {
  197. dojo.event.topic.subscribe(tree.eventNames.createDOMNode, this, "onCreateDOMNode");
  198. dojo.event.topic.subscribe(tree.eventNames.moveFrom, this, "onMoveFrom");
  199. dojo.event.topic.subscribe(tree.eventNames.moveTo, this, "onMoveTo");
  200. dojo.event.topic.subscribe(tree.eventNames.addChild, this, "onAddChild");
  201. dojo.event.topic.subscribe(tree.eventNames.removeNode, this, "onRemoveNode");
  202. dojo.event.topic.subscribe(tree.eventNames.treeDestroy, this, "onTreeDestroy");
  203. }, unlistenTree:function (tree) {
  204. dojo.event.topic.unsubscribe(tree.eventNames.createDOMNode, this, "onCreateDOMNode");
  205. dojo.event.topic.unsubscribe(tree.eventNames.moveFrom, this, "onMoveFrom");
  206. dojo.event.topic.unsubscribe(tree.eventNames.moveTo, this, "onMoveTo");
  207. dojo.event.topic.unsubscribe(tree.eventNames.addChild, this, "onAddChild");
  208. dojo.event.topic.unsubscribe(tree.eventNames.removeNode, this, "onRemoveNode");
  209. dojo.event.topic.unsubscribe(tree.eventNames.treeDestroy, this, "onTreeDestroy");
  210. }, onTreeDestroy:function (message) {
  211. this.unlistenTree(message.source);
  212. }, onCreateDOMNode:function (message) {
  213. this.registerDNDNode(message.source);
  214. }, onAddChild:function (message) {
  215. this.registerDNDNode(message.child);
  216. }, onMoveFrom:function (message) {
  217. var _this = this;
  218. dojo.lang.forEach(message.child.getDescendants(), function (node) {
  219. _this.unregisterDNDNode(node);
  220. });
  221. }, onMoveTo:function (message) {
  222. var _this = this;
  223. dojo.lang.forEach(message.child.getDescendants(), function (node) {
  224. _this.registerDNDNode(node);
  225. });
  226. }, registerDNDNode:function (node) {
  227. if (!node.tree.DNDMode) {
  228. return;
  229. }
  230. var source = null;
  231. var target = null;
  232. if (!node.actionIsDisabled(node.actions.MOVE)) {
  233. var source = new dojo.dnd.TreeDragSource(node.labelNode, this, node.tree.widgetId, node);
  234. this.dragSources[node.widgetId] = source;
  235. }
  236. var target = new dojo.dnd.TreeDropTarget(node.labelNode, this.treeController, node.tree.DNDAcceptTypes, node);
  237. this.dropTargets[node.widgetId] = target;
  238. }, unregisterDNDNode:function (node) {
  239. if (this.dragSources[node.widgetId]) {
  240. dojo.dnd.dragManager.unregisterDragSource(this.dragSources[node.widgetId]);
  241. delete this.dragSources[node.widgetId];
  242. }
  243. if (this.dropTargets[node.widgetId]) {
  244. dojo.dnd.dragManager.unregisterDropTarget(this.dropTargets[node.widgetId]);
  245. delete this.dropTargets[node.widgetId];
  246. }
  247. }});