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

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.TreeDragAndDropV3");
  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.Deferred");
  14. dojo.require("dojo.html.layout");
  15. dojo.dnd.TreeDragSourceV3 = function (node, syncController, type, treeNode) {
  16. this.controller = syncController;
  17. this.treeNode = treeNode;
  18. dojo.dnd.HtmlDragSource.call(this, node, type);
  19. };
  20. dojo.inherits(dojo.dnd.TreeDragSourceV3, dojo.dnd.HtmlDragSource);
  21. dojo.dnd.TreeDropTargetV3 = function (domNode, controller, type, treeNode) {
  22. this.treeNode = treeNode;
  23. this.controller = controller;
  24. dojo.dnd.HtmlDropTarget.call(this, domNode, type);
  25. };
  26. dojo.inherits(dojo.dnd.TreeDropTargetV3, dojo.dnd.HtmlDropTarget);
  27. dojo.lang.extend(dojo.dnd.TreeDropTargetV3, {autoExpandDelay:1500, autoExpandTimer:null, position:null, indicatorStyle:"2px black groove", showIndicator:function (position) {
  28. if (this.position == position) {
  29. return;
  30. }
  31. this.hideIndicator();
  32. this.position = position;
  33. var node = this.treeNode;
  34. node.contentNode.style.width = dojo.html.getBorderBox(node.labelNode).width + "px";
  35. if (position == "onto") {
  36. node.contentNode.style.border = this.indicatorStyle;
  37. } else {
  38. if (position == "before") {
  39. node.contentNode.style.borderTop = this.indicatorStyle;
  40. } else {
  41. if (position == "after") {
  42. node.contentNode.style.borderBottom = this.indicatorStyle;
  43. }
  44. }
  45. }
  46. }, hideIndicator:function () {
  47. this.treeNode.contentNode.style.borderBottom = "";
  48. this.treeNode.contentNode.style.borderTop = "";
  49. this.treeNode.contentNode.style.border = "";
  50. this.treeNode.contentNode.style.width = "";
  51. this.position = null;
  52. }, onDragOver:function (e) {
  53. var accepts = dojo.dnd.HtmlDropTarget.prototype.onDragOver.apply(this, arguments);
  54. if (accepts && this.treeNode.isFolder && !this.treeNode.isExpanded) {
  55. this.setAutoExpandTimer();
  56. }
  57. if (accepts) {
  58. this.cacheNodeCoords();
  59. }
  60. return accepts;
  61. }, accepts:function (dragObjects) {
  62. var accepts = dojo.dnd.HtmlDropTarget.prototype.accepts.apply(this, arguments);
  63. if (!accepts) {
  64. return false;
  65. }
  66. for (var i = 0; i < dragObjects.length; i++) {
  67. var sourceTreeNode = dragObjects[i].treeNode;
  68. if (sourceTreeNode === this.treeNode) {
  69. return false;
  70. }
  71. }
  72. return true;
  73. }, setAutoExpandTimer:function () {
  74. var _this = this;
  75. var autoExpand = function () {
  76. if (dojo.dnd.dragManager.currentDropTarget === _this) {
  77. _this.controller.expand(_this.treeNode);
  78. dojo.dnd.dragManager.cacheTargetLocations();
  79. }
  80. };
  81. this.autoExpandTimer = dojo.lang.setTimeout(autoExpand, _this.autoExpandDelay);
  82. }, getAcceptPosition:function (e, dragObjects) {
  83. var DndMode = this.treeNode.tree.DndMode;
  84. if (DndMode & dojo.widget.TreeV3.prototype.DndModes.ONTO && this.treeNode.actionIsDisabledNow(this.treeNode.actions.ADDCHILD)) {
  85. DndMode &= ~dojo.widget.TreeV3.prototype.DndModes.ONTO;
  86. }
  87. var position = this.getPosition(e, DndMode);
  88. if (position == "onto") {
  89. return position;
  90. }
  91. for (var i = 0; i < dragObjects.length; i++) {
  92. var source = dragObjects[i].dragSource;
  93. if (source.treeNode && this.isAdjacentNode(source.treeNode, position)) {
  94. continue;
  95. }
  96. if (!this.controller.canMove(source.treeNode ? source.treeNode : source, this.treeNode.parent)) {
  97. return false;
  98. }
  99. }
  100. return position;
  101. }, onDropEnd:function (e) {
  102. this.clearAutoExpandTimer();
  103. this.hideIndicator();
  104. }, onDragOut:function (e) {
  105. this.clearAutoExpandTimer();
  106. this.hideIndicator();
  107. }, clearAutoExpandTimer:function () {
  108. if (this.autoExpandTimer) {
  109. clearTimeout(this.autoExpandTimer);
  110. this.autoExpandTimer = null;
  111. }
  112. }, onDragMove:function (e, dragObjects) {
  113. var position = this.getAcceptPosition(e, dragObjects);
  114. if (position) {
  115. this.showIndicator(position);
  116. }
  117. }, isAdjacentNode:function (sourceNode, position) {
  118. if (sourceNode === this.treeNode) {
  119. return true;
  120. }
  121. if (sourceNode.getNextSibling() === this.treeNode && position == "before") {
  122. return true;
  123. }
  124. if (sourceNode.getPreviousSibling() === this.treeNode && position == "after") {
  125. return true;
  126. }
  127. return false;
  128. }, cacheNodeCoords:function () {
  129. var node = this.treeNode.contentNode;
  130. this.cachedNodeY = dojo.html.getAbsolutePosition(node).y;
  131. this.cachedNodeHeight = dojo.html.getBorderBox(node).height;
  132. }, getPosition:function (e, DndMode) {
  133. var mousey = e.pageY || e.clientY + dojo.body().scrollTop;
  134. var relY = mousey - this.cachedNodeY;
  135. var p = relY / this.cachedNodeHeight;
  136. var position = "";
  137. if (DndMode & dojo.widget.TreeV3.prototype.DndModes.ONTO && DndMode & dojo.widget.TreeV3.prototype.DndModes.BETWEEN) {
  138. if (p <= 0.33) {
  139. position = "before";
  140. } else {
  141. if (p <= 0.66 || this.treeNode.isExpanded && this.treeNode.children.length && !this.treeNode.isLastChild()) {
  142. position = "onto";
  143. } else {
  144. position = "after";
  145. }
  146. }
  147. } else {
  148. if (DndMode & dojo.widget.TreeV3.prototype.DndModes.BETWEEN) {
  149. if (p <= 0.5 || this.treeNode.isExpanded && this.treeNode.children.length && !this.treeNode.isLastChild()) {
  150. position = "before";
  151. } else {
  152. position = "after";
  153. }
  154. } else {
  155. if (DndMode & dojo.widget.TreeV3.prototype.DndModes.ONTO) {
  156. position = "onto";
  157. }
  158. }
  159. }
  160. return position;
  161. }, getTargetParentIndex:function (source, position) {
  162. var index = position == "before" ? this.treeNode.getParentIndex() : this.treeNode.getParentIndex() + 1;
  163. if (source.treeNode && this.treeNode.parent === source.treeNode.parent && this.treeNode.getParentIndex() > source.treeNode.getParentIndex()) {
  164. index--;
  165. }
  166. return index;
  167. }, onDrop:function (e) {
  168. var position = this.position;
  169. var source = e.dragObject.dragSource;
  170. var targetParent, targetIndex;
  171. if (position == "onto") {
  172. targetParent = this.treeNode;
  173. targetIndex = 0;
  174. } else {
  175. targetIndex = this.getTargetParentIndex(source, position);
  176. targetParent = this.treeNode.parent;
  177. }
  178. var r = this.getDropHandler(e, source, targetParent, targetIndex)();
  179. return r;
  180. }, getDropHandler:function (e, source, targetParent, targetIndex) {
  181. var handler;
  182. var _this = this;
  183. handler = function () {
  184. var result;
  185. if (source.treeNode) {
  186. result = _this.controller.move(source.treeNode, targetParent, targetIndex, true);
  187. } else {
  188. if (dojo.lang.isFunction(source.onDrop)) {
  189. source.onDrop(targetParent, targetIndex);
  190. }
  191. var treeNode = source.getTreeNode();
  192. if (treeNode) {
  193. result = _this.controller.createChild(targetParent, targetIndex, treeNode, true);
  194. } else {
  195. result = true;
  196. }
  197. }
  198. if (result instanceof dojo.Deferred) {
  199. var isSuccess = result.fired == 0;
  200. if (!isSuccess) {
  201. _this.handleDropError(source, targetParent, targetIndex, result);
  202. }
  203. return isSuccess;
  204. } else {
  205. return result;
  206. }
  207. };
  208. return handler;
  209. }, handleDropError:function (source, parent, index, result) {
  210. dojo.debug("TreeDropTargetV3.handleDropError: DND error occured");
  211. dojo.debugShallow(result);
  212. }});