clipboard.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. define(function(require, exports, module) {
  2. var kity = require('../core/kity');
  3. var utils = require('../core/utils');
  4. var MinderNode = require('../core/node');
  5. var Command = require('../core/command');
  6. var Module = require('../core/module');
  7. Module.register('ClipboardModule', function() {
  8. var km = this,
  9. _clipboardNodes = [],
  10. _selectedNodes = [];
  11. function appendChildNode(parent, child) {
  12. _selectedNodes.push(child);
  13. km.appendNode(child, parent);
  14. child.render();
  15. child.setLayoutOffset(null);
  16. var children = child.children.map(function(node) {
  17. return node.clone();
  18. });
  19. /*
  20. * fixed bug: Modified on 2015.08.05
  21. * 原因:粘贴递归 append 时没有清空原来父节点的子节点,而父节点被复制的时候,是连同子节点一起复制过来的
  22. * 解决办法:增加了下面这一行代码
  23. * by: @zhangbobell zhangbobell@163.com
  24. */
  25. child.clearChildren();
  26. for (var i = 0, ci;
  27. (ci = children[i]); i++) {
  28. appendChildNode(child, ci);
  29. }
  30. }
  31. function sendToClipboard(nodes) {
  32. if (!nodes.length) return;
  33. nodes.sort(function(a, b) {
  34. return a.getIndex() - b.getIndex();
  35. });
  36. _clipboardNodes = nodes.map(function(node) {
  37. return node.clone();
  38. });
  39. }
  40. /**
  41. * @command Copy
  42. * @description 复制当前选中的节点
  43. * @shortcut Ctrl + C
  44. * @state
  45. * 0: 当前有选中的节点
  46. * -1: 当前没有选中的节点
  47. */
  48. var CopyCommand = kity.createClass('CopyCommand', {
  49. base: Command,
  50. execute: function(km) {
  51. sendToClipboard(km.getSelectedAncestors(true));
  52. this.setContentChanged(false);
  53. }
  54. });
  55. /**
  56. * @command Cut
  57. * @description 剪切当前选中的节点
  58. * @shortcut Ctrl + X
  59. * @state
  60. * 0: 当前有选中的节点
  61. * -1: 当前没有选中的节点
  62. */
  63. var CutCommand = kity.createClass('CutCommand', {
  64. base: Command,
  65. execute: function(km) {
  66. var ancestors = km.getSelectedAncestors();
  67. if (ancestors.length === 0) return;
  68. sendToClipboard(ancestors);
  69. km.select(MinderNode.getCommonAncestor(ancestors), true);
  70. ancestors.slice().forEach(function(node) {
  71. km.removeNode(node);
  72. });
  73. km.layout(300);
  74. }
  75. });
  76. /**
  77. * @command Paste
  78. * @description 粘贴已复制的节点到每一个当前选中的节点上
  79. * @shortcut Ctrl + V
  80. * @state
  81. * 0: 当前有选中的节点
  82. * -1: 当前没有选中的节点
  83. */
  84. var PasteCommand = kity.createClass('PasteCommand', {
  85. base: Command,
  86. execute: function(km) {
  87. if (_clipboardNodes.length) {
  88. var nodes = km.getSelectedNodes();
  89. if (!nodes.length) return;
  90. for (var i = 0, ni; ni = _clipboardNodes[i]; i++) {
  91. for (var j = 0, node; node = nodes[j]; j++) {
  92. appendChildNode(node, ni.clone());
  93. }
  94. }
  95. km.select(_selectedNodes, true);
  96. _selectedNodes = [];
  97. km.layout(300);
  98. }
  99. },
  100. queryState: function(km) {
  101. return km.getSelectedNode() ? 0 : -1;
  102. }
  103. });
  104. /**
  105. * @Desc: 若支持原生clipboadr事件则基于原生扩展,否则使用km的基础事件只处理节点的粘贴复制
  106. * @Editor: Naixor
  107. * @Date: 2015.9.20
  108. */
  109. if (km.supportClipboardEvent && !kity.Browser.gecko) {
  110. var Copy = function (e) {
  111. this.fire('beforeCopy', e);
  112. }
  113. var Cut = function (e) {
  114. this.fire('beforeCut', e);
  115. }
  116. var Paste = function (e) {
  117. this.fire('beforePaste', e);
  118. }
  119. return {
  120. 'commands': {
  121. 'copy': CopyCommand,
  122. 'cut': CutCommand,
  123. 'paste': PasteCommand
  124. },
  125. 'clipBoardEvents': {
  126. 'copy': Copy.bind(km),
  127. 'cut': Cut.bind(km),
  128. 'paste': Paste.bind(km)
  129. },
  130. sendToClipboard: sendToClipboard
  131. };
  132. } else {
  133. return {
  134. 'commands': {
  135. 'copy': CopyCommand,
  136. 'cut': CutCommand,
  137. 'paste': PasteCommand
  138. },
  139. 'commandShortcutKeys': {
  140. 'copy': 'normal::ctrl+c|',
  141. 'cut': 'normal::ctrl+x',
  142. 'paste': 'normal::ctrl+v'
  143. },
  144. sendToClipboard: sendToClipboard
  145. };
  146. }
  147. });
  148. });