| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- /**
- * @Desc: 处理editor的clipboard事件,只在支持ClipboardEvent并且不是FF的情况下工作
- * @Editor: Naixor
- * @Date: 2015.9.21
- */
- define(function(require, exports, module) {
- function ClipboardRuntime () {
- var minder = this.minder;
- var Data = window.kityminder.data;
- if (!minder.supportClipboardEvent || kity.Browser.gecko) {
- return;
- };
- var fsm = this.fsm;
- var receiver = this.receiver;
- var MimeType = this.MimeType;
-
- var kmencode = MimeType.getMimeTypeProtocol('application/km'),
- decode = Data.getRegisterProtocol('json').decode;
- var _selectedNodes = [];
- /*
- * 增加对多节点赋值粘贴的处理
- */
- function encode (nodes) {
- var _nodes = [];
- for (var i = 0, l = nodes.length; i < l; i++) {
- _nodes.push(minder.exportNode(nodes[i]));
- }
- return kmencode(Data.getRegisterProtocol('json').encode(_nodes));
- }
- var beforeCopy = function (e) {
- if (document.activeElement == receiver.element) {
- var clipBoardEvent = e;
- var state = fsm.state();
- switch (state) {
- case 'input': {
- break;
- }
- case 'normal': {
- var nodes = [].concat(minder.getSelectedNodes());
- if (nodes.length) {
- // 这里由于被粘贴复制的节点的id信息也都一样,故做此算法
- // 这里有个疑问,使用node.getParent()或者node.parent会离奇导致出现非选中节点被渲染成选中节点,因此使用isAncestorOf,而没有使用自行回溯的方式
- if (nodes.length > 1) {
- var targetLevel;
- nodes.sort(function(a, b) {
- return a.getLevel() - b.getLevel();
- });
- targetLevel = nodes[0].getLevel();
- if (targetLevel !== nodes[nodes.length-1].getLevel()) {
- var plevel, pnode,
- idx = 0, l = nodes.length, pidx = l-1;
-
- pnode = nodes[pidx];
- while (pnode.getLevel() !== targetLevel) {
- idx = 0;
- while (idx < l && nodes[idx].getLevel() === targetLevel) {
- if (nodes[idx].isAncestorOf(pnode)) {
- nodes.splice(pidx, 1);
- break;
- }
- idx++;
- }
- pidx--;
- pnode = nodes[pidx];
- }
- };
- };
- var str = encode(nodes);
- clipBoardEvent.clipboardData.setData('text/plain', str);
- }
- e.preventDefault();
- break;
- }
- }
- }
- }
- var beforeCut = function (e) {
- if (document.activeElement == receiver.element) {
- if (minder.getStatus() !== 'normal') {
- e.preventDefault();
- return;
- };
- var clipBoardEvent = e;
- var state = fsm.state();
- switch (state) {
- case 'input': {
- break;
- }
- case 'normal': {
- var nodes = minder.getSelectedNodes();
- if (nodes.length) {
- clipBoardEvent.clipboardData.setData('text/plain', encode(nodes));
- minder.execCommand('removenode');
- }
- e.preventDefault();
- break;
- }
- }
- };
- }
- var beforePaste = function(e) {
- if (document.activeElement == receiver.element) {
- if (minder.getStatus() !== 'normal') {
- e.preventDefault();
- return;
- };
- var clipBoardEvent = e;
- var state = fsm.state();
- var textData = clipBoardEvent.clipboardData.getData('text/plain');
- switch (state) {
- case 'input': {
- // input状态下如果格式为application/km则不进行paste操作
- if (!MimeType.isPureText(textData)) {
- e.preventDefault();
- return;
- };
- break;
- }
- case 'normal': {
- /*
- * 针对normal状态下通过对选中节点粘贴导入子节点文本进行单独处理
- */
- var sNodes = minder.getSelectedNodes();
-
- if (MimeType.whichMimeType(textData) === 'application/km') {
- var nodes = decode(MimeType.getPureText(textData));
- var _node;
- sNodes.forEach(function(node) {
- // 由于粘贴逻辑中为了排除子节点重新排序导致逆序,因此复制的时候倒过来
- for (var i = nodes.length-1; i >= 0; i--) {
- _node = minder.createNode(null, node);
- minder.importNode(_node, nodes[i]);
- _selectedNodes.push(_node);
- node.appendChild(_node);
- }
- });
- minder.select(_selectedNodes, true);
- _selectedNodes = [];
- minder.refresh();
- }
- else if (clipBoardEvent.clipboardData && clipBoardEvent.clipboardData.items[0].type.indexOf('image') > -1) {
- var imageFile = clipBoardEvent.clipboardData.items[0].getAsFile();
- var serverService = angular.element(document.body).injector().get('server');
- return serverService.uploadImage(imageFile).then(function (json) {
- var resp = json.data;
- if (resp.errno === 0) {
- minder.execCommand('image', resp.data.url);
- }
- });
- }
- else {
- sNodes.forEach(function(node) {
- minder.Text2Children(node, textData);
- });
- }
- e.preventDefault();
- break;
- }
- }
- }
- }
- /**
- * 由editor的receiver统一处理全部事件,包括clipboard事件
- * @Editor: Naixor
- * @Date: 2015.9.24
- */
- document.addEventListener('copy', beforeCopy);
- document.addEventListener('cut', beforeCut);
- document.addEventListener('paste', beforePaste);
- }
- return module.exports = ClipboardRuntime;
- });
|