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

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.TreeBasicControllerV3");
  9. dojo.require("dojo.event.*");
  10. dojo.require("dojo.json");
  11. dojo.require("dojo.io.*");
  12. dojo.require("dojo.widget.TreeCommon");
  13. dojo.require("dojo.widget.TreeNodeV3");
  14. dojo.require("dojo.widget.TreeV3");
  15. dojo.widget.defineWidget("dojo.widget.TreeBasicControllerV3", [dojo.widget.HtmlWidget, dojo.widget.TreeCommon], function () {
  16. this.listenedTrees = {};
  17. }, {listenTreeEvents:["afterSetFolder", "afterTreeCreate", "beforeTreeDestroy"], listenNodeFilter:function (elem) {
  18. return elem instanceof dojo.widget.Widget;
  19. }, editor:null, initialize:function (args) {
  20. if (args.editor) {
  21. this.editor = dojo.widget.byId(args.editor);
  22. this.editor.controller = this;
  23. }
  24. }, getInfo:function (elem) {
  25. return elem.getInfo();
  26. }, onBeforeTreeDestroy:function (message) {
  27. this.unlistenTree(message.source);
  28. }, onAfterSetFolder:function (message) {
  29. if (message.source.expandLevel > 0) {
  30. this.expandToLevel(message.source, message.source.expandLevel);
  31. }
  32. if (message.source.loadLevel > 0) {
  33. this.loadToLevel(message.source, message.source.loadLevel);
  34. }
  35. }, _focusNextVisible:function (nodeWidget) {
  36. if (nodeWidget.isFolder && nodeWidget.isExpanded && nodeWidget.children.length > 0) {
  37. returnWidget = nodeWidget.children[0];
  38. } else {
  39. while (nodeWidget.isTreeNode && nodeWidget.isLastChild()) {
  40. nodeWidget = nodeWidget.parent;
  41. }
  42. if (nodeWidget.isTreeNode) {
  43. var returnWidget = nodeWidget.parent.children[nodeWidget.getParentIndex() + 1];
  44. }
  45. }
  46. if (returnWidget && returnWidget.isTreeNode) {
  47. this._focusLabel(returnWidget);
  48. return returnWidget;
  49. }
  50. }, _focusPreviousVisible:function (nodeWidget) {
  51. var returnWidget = nodeWidget;
  52. if (!nodeWidget.isFirstChild()) {
  53. var previousSibling = nodeWidget.parent.children[nodeWidget.getParentIndex() - 1];
  54. nodeWidget = previousSibling;
  55. while (nodeWidget.isFolder && nodeWidget.isExpanded && nodeWidget.children.length > 0) {
  56. returnWidget = nodeWidget;
  57. nodeWidget = nodeWidget.children[nodeWidget.children.length - 1];
  58. }
  59. } else {
  60. nodeWidget = nodeWidget.parent;
  61. }
  62. if (nodeWidget && nodeWidget.isTreeNode) {
  63. returnWidget = nodeWidget;
  64. }
  65. if (returnWidget && returnWidget.isTreeNode) {
  66. this._focusLabel(returnWidget);
  67. return returnWidget;
  68. }
  69. }, _focusZoomIn:function (nodeWidget) {
  70. var returnWidget = nodeWidget;
  71. if (nodeWidget.isFolder && !nodeWidget.isExpanded) {
  72. this.expand(nodeWidget);
  73. } else {
  74. if (nodeWidget.children.length > 0) {
  75. nodeWidget = nodeWidget.children[0];
  76. }
  77. }
  78. if (nodeWidget && nodeWidget.isTreeNode) {
  79. returnWidget = nodeWidget;
  80. }
  81. if (returnWidget && returnWidget.isTreeNode) {
  82. this._focusLabel(returnWidget);
  83. return returnWidget;
  84. }
  85. }, _focusZoomOut:function (node) {
  86. var returnWidget = node;
  87. if (node.isFolder && node.isExpanded) {
  88. this.collapse(node);
  89. } else {
  90. node = node.parent;
  91. }
  92. if (node && node.isTreeNode) {
  93. returnWidget = node;
  94. }
  95. if (returnWidget && returnWidget.isTreeNode) {
  96. this._focusLabel(returnWidget);
  97. return returnWidget;
  98. }
  99. }, onFocusNode:function (e) {
  100. var node = this.domElement2TreeNode(e.target);
  101. if (node) {
  102. node.viewFocus();
  103. dojo.event.browser.stopEvent(e);
  104. }
  105. }, onBlurNode:function (e) {
  106. var node = this.domElement2TreeNode(e.target);
  107. if (!node) {
  108. return;
  109. }
  110. var labelNode = node.labelNode;
  111. labelNode.setAttribute("tabIndex", "-1");
  112. node.viewUnfocus();
  113. dojo.event.browser.stopEvent(e);
  114. node.tree.domNode.setAttribute("tabIndex", "0");
  115. }, _focusLabel:function (node) {
  116. var lastFocused = node.tree.lastFocused;
  117. var labelNode;
  118. if (lastFocused && lastFocused.labelNode) {
  119. labelNode = lastFocused.labelNode;
  120. dojo.event.disconnect(labelNode, "onblur", this, "onBlurNode");
  121. labelNode.setAttribute("tabIndex", "-1");
  122. dojo.html.removeClass(labelNode, "TreeLabelFocused");
  123. }
  124. labelNode = node.labelNode;
  125. labelNode.setAttribute("tabIndex", "0");
  126. node.tree.lastFocused = node;
  127. dojo.html.addClass(labelNode, "TreeLabelFocused");
  128. dojo.event.connectOnce(labelNode, "onblur", this, "onBlurNode");
  129. dojo.event.connectOnce(labelNode, "onfocus", this, "onFocusNode");
  130. labelNode.focus();
  131. }, onKey:function (e) {
  132. if (!e.key || e.ctrkKey || e.altKey) {
  133. return;
  134. }
  135. var nodeWidget = this.domElement2TreeNode(e.target);
  136. if (!nodeWidget) {
  137. return;
  138. }
  139. var treeWidget = nodeWidget.tree;
  140. if (treeWidget.lastFocused && treeWidget.lastFocused.labelNode) {
  141. nodeWidget = treeWidget.lastFocused;
  142. }
  143. switch (e.key) {
  144.   case e.KEY_TAB:
  145. if (e.shiftKey) {
  146. treeWidget.domNode.setAttribute("tabIndex", "-1");
  147. }
  148. break;
  149.   case e.KEY_RIGHT_ARROW:
  150. this._focusZoomIn(nodeWidget);
  151. dojo.event.browser.stopEvent(e);
  152. break;
  153.   case e.KEY_LEFT_ARROW:
  154. this._focusZoomOut(nodeWidget);
  155. dojo.event.browser.stopEvent(e);
  156. break;
  157.   case e.KEY_UP_ARROW:
  158. this._focusPreviousVisible(nodeWidget);
  159. dojo.event.browser.stopEvent(e);
  160. break;
  161.   case e.KEY_DOWN_ARROW:
  162. this._focusNextVisible(nodeWidget);
  163. dojo.event.browser.stopEvent(e);
  164. break;
  165. }
  166. }, onFocusTree:function (e) {
  167. if (!e.currentTarget) {
  168. return;
  169. }
  170. try {
  171. var treeWidget = this.getWidgetByNode(e.currentTarget);
  172. if (!treeWidget || !treeWidget.isTree) {
  173. return;
  174. }
  175. var nodeWidget = this.getWidgetByNode(treeWidget.domNode.firstChild);
  176. if (nodeWidget && nodeWidget.isTreeNode) {
  177. if (treeWidget.lastFocused && treeWidget.lastFocused.isTreeNode) {
  178. nodeWidget = treeWidget.lastFocused;
  179. }
  180. this._focusLabel(nodeWidget);
  181. }
  182. }
  183. catch (e) {
  184. }
  185. }, onAfterTreeCreate:function (message) {
  186. var tree = message.source;
  187. dojo.event.browser.addListener(tree.domNode, "onKey", dojo.lang.hitch(this, this.onKey));
  188. dojo.event.browser.addListener(tree.domNode, "onmousedown", dojo.lang.hitch(this, this.onTreeMouseDown));
  189. dojo.event.browser.addListener(tree.domNode, "onclick", dojo.lang.hitch(this, this.onTreeClick));
  190. dojo.event.browser.addListener(tree.domNode, "onfocus", dojo.lang.hitch(this, this.onFocusTree));
  191. tree.domNode.setAttribute("tabIndex", "0");
  192. if (tree.expandLevel) {
  193. this.expandToLevel(tree, tree.expandLevel);
  194. }
  195. if (tree.loadLevel) {
  196. this.loadToLevel(tree, tree.loadLevel);
  197. }
  198. }, onTreeMouseDown:function (e) {
  199. }, onTreeClick:function (e) {
  200. var domElement = e.target;
  201. var node = this.domElement2TreeNode(domElement);
  202. if (!node || !node.isTreeNode) {
  203. return;
  204. }
  205. var checkExpandClick = function (el) {
  206. return el === node.expandNode;
  207. };
  208. if (this.checkPathCondition(domElement, checkExpandClick)) {
  209. this.processExpandClick(node);
  210. }
  211. this._focusLabel(node);
  212. }, processExpandClick:function (node) {
  213. if (node.isExpanded) {
  214. this.collapse(node);
  215. } else {
  216. this.expand(node);
  217. }
  218. }, batchExpandTimeout:20, expandAll:function (nodeOrTree) {
  219. return this.expandToLevel(nodeOrTree, Number.POSITIVE_INFINITY);
  220. }, collapseAll:function (nodeOrTree) {
  221. var _this = this;
  222. var filter = function (elem) {
  223. return (elem instanceof dojo.widget.Widget) && elem.isFolder && elem.isExpanded;
  224. };
  225. if (nodeOrTree.isTreeNode) {
  226. this.processDescendants(nodeOrTree, filter, this.collapse);
  227. } else {
  228. if (nodeOrTree.isTree) {
  229. dojo.lang.forEach(nodeOrTree.children, function (c) {
  230. _this.processDescendants(c, filter, _this.collapse);
  231. });
  232. }
  233. }
  234. }, expandToNode:function (node, withSelected) {
  235. n = withSelected ? node : node.parent;
  236. s = [];
  237. while (!n.isExpanded) {
  238. s.push(n);
  239. n = n.parent;
  240. }
  241. dojo.lang.forEach(s, function (n) {
  242. n.expand();
  243. });
  244. }, expandToLevel:function (nodeOrTree, level) {
  245. dojo.require("dojo.widget.TreeTimeoutIterator");
  246. var _this = this;
  247. var filterFunc = function (elem) {
  248. var res = elem.isFolder || elem.children && elem.children.length;
  249. return res;
  250. };
  251. var callFunc = function (node, iterator) {
  252. _this.expand(node, true);
  253. iterator.forward();
  254. };
  255. var iterator = new dojo.widget.TreeTimeoutIterator(nodeOrTree, callFunc, this);
  256. iterator.setFilter(filterFunc);
  257. iterator.timeout = this.batchExpandTimeout;
  258. iterator.setMaxLevel(nodeOrTree.isTreeNode ? level - 1 : level);
  259. return iterator.start(nodeOrTree.isTreeNode);
  260. }, getWidgetByNode:function (node) {
  261. var widgetId;
  262. var newNode = node;
  263. while (!(widgetId = newNode.widgetId)) {
  264. newNode = newNode.parentNode;
  265. if (newNode == null) {
  266. break;
  267. }
  268. }
  269. if (widgetId) {
  270. return dojo.widget.byId(widgetId);
  271. } else {
  272. if (node == null) {
  273. return null;
  274. } else {
  275. return dojo.widget.manager.byNode(node);
  276. }
  277. }
  278. }, expand:function (node) {
  279. if (node.isFolder) {
  280. node.expand();
  281. }
  282. }, collapse:function (node) {
  283. if (node.isFolder) {
  284. node.collapse();
  285. }
  286. }, canEditLabel:function (node) {
  287. if (node.actionIsDisabledNow(node.actions.EDIT)) {
  288. return false;
  289. }
  290. return true;
  291. }, editLabelStart:function (node) {
  292. if (!this.canEditLabel(node)) {
  293. return false;
  294. }
  295. if (!this.editor.isClosed()) {
  296. this.editLabelFinish(this.editor.saveOnBlur);
  297. }
  298. this.doEditLabelStart(node);
  299. }, editLabelFinish:function (save) {
  300. this.doEditLabelFinish(save);
  301. }, doEditLabelStart:function (node) {
  302. if (!this.editor) {
  303. dojo.raise(this.widgetType + ": no editor specified");
  304. }
  305. this.editor.open(node);
  306. }, doEditLabelFinish:function (save, server_data) {
  307. if (!this.editor) {
  308. dojo.raise(this.widgetType + ": no editor specified");
  309. }
  310. var node = this.editor.node;
  311. var editorTitle = this.editor.getContents();
  312. this.editor.close(save);
  313. if (save) {
  314. var data = {title:editorTitle};
  315. if (server_data) {
  316. dojo.lang.mixin(data, server_data);
  317. }
  318. if (node.isPhantom) {
  319. var parent = node.parent;
  320. var index = node.getParentIndex();
  321. node.destroy();
  322. dojo.widget.TreeBasicControllerV3.prototype.doCreateChild.call(this, parent, index, data);
  323. } else {
  324. var title = server_data && server_data.title ? server_data.title : editorTitle;
  325. node.setTitle(title);
  326. }
  327. } else {
  328. if (node.isPhantom) {
  329. node.destroy();
  330. }
  331. }
  332. }, makeDefaultNode:function (parent, index) {
  333. var data = {title:parent.tree.defaultChildTitle};
  334. return dojo.widget.TreeBasicControllerV3.prototype.doCreateChild.call(this, parent, index, data);
  335. }, runStages:function (check, prepare, make, finalize, expose, args) {
  336. if (check && !check.apply(this, args)) {
  337. return false;
  338. }
  339. if (prepare && !prepare.apply(this, args)) {
  340. return false;
  341. }
  342. var result = make.apply(this, args);
  343. if (finalize) {
  344. finalize.apply(this, args);
  345. }
  346. if (!result) {
  347. return result;
  348. }
  349. if (expose) {
  350. expose.apply(this, args);
  351. }
  352. return result;
  353. }});
  354. dojo.lang.extend(dojo.widget.TreeBasicControllerV3, {createAndEdit:function (parent, index) {
  355. var data = {title:parent.tree.defaultChildTitle};
  356. if (!this.canCreateChild(parent, index, data)) {
  357. return false;
  358. }
  359. var child = this.doCreateChild(parent, index, data);
  360. if (!child) {
  361. return false;
  362. }
  363. this.exposeCreateChild(parent, index, data);
  364. child.isPhantom = true;
  365. if (!this.editor.isClosed()) {
  366. this.editLabelFinish(this.editor.saveOnBlur);
  367. }
  368. this.doEditLabelStart(child);
  369. }});
  370. dojo.lang.extend(dojo.widget.TreeBasicControllerV3, {canClone:function (child, newParent, index, deep) {
  371. return true;
  372. }, clone:function (child, newParent, index, deep) {
  373. return this.runStages(this.canClone, this.prepareClone, this.doClone, this.finalizeClone, this.exposeClone, arguments);
  374. }, exposeClone:function (child, newParent) {
  375. if (newParent.isTreeNode) {
  376. this.expand(newParent);
  377. }
  378. }, doClone:function (child, newParent, index, deep) {
  379. var cloned = child.clone(deep);
  380. newParent.addChild(cloned, index);
  381. return cloned;
  382. }});
  383. dojo.lang.extend(dojo.widget.TreeBasicControllerV3, {canDetach:function (child) {
  384. if (child.actionIsDisabledNow(child.actions.DETACH)) {
  385. return false;
  386. }
  387. return true;
  388. }, detach:function (node) {
  389. return this.runStages(this.canDetach, this.prepareDetach, this.doDetach, this.finalizeDetach, this.exposeDetach, arguments);
  390. }, doDetach:function (node, callObj, callFunc) {
  391. node.detach();
  392. }});
  393. dojo.lang.extend(dojo.widget.TreeBasicControllerV3, {canDestroyChild:function (child) {
  394. if (child.parent && !this.canDetach(child)) {
  395. return false;
  396. }
  397. return true;
  398. }, destroyChild:function (node) {
  399. return this.runStages(this.canDestroyChild, this.prepareDestroyChild, this.doDestroyChild, this.finalizeDestroyChild, this.exposeDestroyChild, arguments);
  400. }, doDestroyChild:function (node) {
  401. node.destroy();
  402. }});
  403. dojo.lang.extend(dojo.widget.TreeBasicControllerV3, {canMoveNotANode:function (child, parent) {
  404. if (child.treeCanMove) {
  405. return child.treeCanMove(parent);
  406. }
  407. return true;
  408. }, canMove:function (child, newParent) {
  409. if (!child.isTreeNode) {
  410. return this.canMoveNotANode(child, newParent);
  411. }
  412. if (child.actionIsDisabledNow(child.actions.MOVE)) {
  413. return false;
  414. }
  415. if (child.parent !== newParent && newParent.actionIsDisabledNow(newParent.actions.ADDCHILD)) {
  416. return false;
  417. }
  418. var node = newParent;
  419. while (node.isTreeNode) {
  420. if (node === child) {
  421. return false;
  422. }
  423. node = node.parent;
  424. }
  425. return true;
  426. }, move:function (child, newParent, index) {
  427. return this.runStages(this.canMove, this.prepareMove, this.doMove, this.finalizeMove, this.exposeMove, arguments);
  428. }, doMove:function (child, newParent, index) {
  429. child.tree.move(child, newParent, index);
  430. return true;
  431. }, exposeMove:function (child, newParent) {
  432. if (newParent.isTreeNode) {
  433. this.expand(newParent);
  434. }
  435. }});
  436. dojo.lang.extend(dojo.widget.TreeBasicControllerV3, {canCreateChild:function (parent, index, data) {
  437. if (parent.actionIsDisabledNow(parent.actions.ADDCHILD)) {
  438. return false;
  439. }
  440. return true;
  441. }, createChild:function (parent, index, data) {
  442. if (!data) {
  443. data = {title:parent.tree.defaultChildTitle};
  444. }
  445. return this.runStages(this.canCreateChild, this.prepareCreateChild, this.doCreateChild, this.finalizeCreateChild, this.exposeCreateChild, [parent, index, data]);
  446. }, prepareCreateChild:function () {
  447. return true;
  448. }, finalizeCreateChild:function () {
  449. }, doCreateChild:function (parent, index, data) {
  450. var newChild = parent.tree.createNode(data);
  451. parent.addChild(newChild, index);
  452. return newChild;
  453. }, exposeCreateChild:function (parent) {
  454. return this.expand(parent);
  455. }});