node.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. define(function(require, exports, module) {
  2. var kity = require('../core/kity');
  3. var utils = require('../core/utils');
  4. var Minder = require('../core/minder');
  5. var MinderNode = require('../core/node');
  6. var Command = require('../core/command');
  7. var Module = require('../core/module');
  8. var Renderer = require('../core/render');
  9. /**
  10. * @command AppendChildNode
  11. * @description 添加子节点到选中的节点中
  12. * @param {string|object} textOrData 要插入的节点的文本或数据
  13. * @state
  14. * 0: 当前有选中的节点
  15. * -1: 当前没有选中的节点
  16. */
  17. var AppendChildCommand = kity.createClass('AppendChildCommand', {
  18. base: Command,
  19. execute: function(km, text) {
  20. var parent = km.getSelectedNode();
  21. if (!parent) {
  22. return null;
  23. }
  24. var node = km.createNode(text, parent);
  25. km.select(node, true);
  26. if (parent.isExpanded()) {
  27. node.render();
  28. }
  29. else {
  30. parent.expand();
  31. parent.renderTree();
  32. }
  33. km.layout(600);
  34. },
  35. queryState: function(km) {
  36. var selectedNode = km.getSelectedNode();
  37. return selectedNode ? 0 : -1;
  38. }
  39. });
  40. /**
  41. * @command AppendSiblingNode
  42. * @description 添加选中的节点的兄弟节点
  43. * @param {string|object} textOrData 要添加的节点的文本或数据
  44. * @state
  45. * 0: 当前有选中的节点
  46. * -1: 当前没有选中的节点
  47. */
  48. var AppendSiblingCommand = kity.createClass('AppendSiblingCommand', {
  49. base: Command,
  50. execute: function(km, text) {
  51. var sibling = km.getSelectedNode();
  52. var parent = sibling.parent;
  53. if (!parent) {
  54. return km.execCommand('AppendChildNode', text);
  55. }
  56. var node = km.createNode(text, parent, sibling.getIndex() + 1);
  57. node.setGlobalLayoutTransform(sibling.getGlobalLayoutTransform());
  58. km.select(node, true);
  59. node.render();
  60. km.layout(600);
  61. },
  62. queryState: function(km) {
  63. var selectedNode = km.getSelectedNode();
  64. return selectedNode ? 0 : -1;
  65. }
  66. });
  67. /**
  68. * @command RemoveNode
  69. * @description 移除选中的节点
  70. * @state
  71. * 0: 当前有选中的节点
  72. * -1: 当前没有选中的节点
  73. */
  74. var RemoveNodeCommand = kity.createClass('RemoverNodeCommand', {
  75. base: Command,
  76. execute: function(km) {
  77. var nodes = km.getSelectedNodes();
  78. var ancestor = MinderNode.getCommonAncestor.apply(null, nodes);
  79. var index = nodes[0].getIndex();
  80. nodes.forEach(function(node) {
  81. if (!node.isRoot()) km.removeNode(node);
  82. });
  83. if (nodes.length == 1) {
  84. var selectBack = ancestor.children[index - 1] || ancestor.children[index];
  85. km.select(selectBack || ancestor || km.getRoot(), true);
  86. } else {
  87. km.select(ancestor || km.getRoot(), true);
  88. }
  89. km.layout(600);
  90. },
  91. queryState: function(km) {
  92. var selectedNode = km.getSelectedNode();
  93. return selectedNode && !selectedNode.isRoot() ? 0 : -1;
  94. }
  95. });
  96. var AppendParentCommand = kity.createClass('AppendParentCommand', {
  97. base: Command,
  98. execute: function(km, text) {
  99. var nodes = km.getSelectedNodes();
  100. nodes.sort(function(a, b) {
  101. return a.getIndex() - b.getIndex();
  102. });
  103. var parent = nodes[0].parent;
  104. var newParent = km.createNode(text, parent, nodes[0].getIndex());
  105. nodes.forEach(function(node) {
  106. newParent.appendChild(node);
  107. });
  108. newParent.setGlobalLayoutTransform(nodes[nodes.length >> 1].getGlobalLayoutTransform());
  109. km.select(newParent, true);
  110. km.layout(600);
  111. },
  112. queryState: function(km) {
  113. var nodes = km.getSelectedNodes();
  114. if (!nodes.length) return -1;
  115. var parent = nodes[0].parent;
  116. if (!parent) return -1;
  117. for (var i = 1; i < nodes.length; i++) {
  118. if (nodes[i].parent != parent) return -1;
  119. }
  120. return 0;
  121. }
  122. });
  123. Module.register('NodeModule', function() {
  124. return {
  125. commands: {
  126. 'AppendChildNode': AppendChildCommand,
  127. 'AppendSiblingNode': AppendSiblingCommand,
  128. 'RemoveNode': RemoveNodeCommand,
  129. 'AppendParentNode': AppendParentCommand
  130. },
  131. 'commandShortcutKeys': {
  132. 'appendsiblingnode': 'normal::Enter',
  133. 'appendchildnode': 'normal::Insert|Tab',
  134. 'appendparentnode': 'normal::Shift+Tab|normal::Shift+Insert',
  135. 'removenode': 'normal::Del|Backspace'
  136. }
  137. };
  138. });
  139. });