UNPKG

kityminder

Version:
338 lines (252 loc) 10.6 kB
/* global Renderer: true */ KityMinder.registerModule('TextEditModule', function() { var km = this; var sel = new Minder.Selection(); var range = new Minder.Range(); var receiver = new Minder.Receiver(this,sel,range); var keyboarder = new Minder.keyboarder(receiver); this.receiver = receiver; //鼠标被点击,并未太抬起时为真 var mouseDownStatus = false; var dblclickEvent = false; //当前是否有选区存在 var selectionReadyShow = false; var mousedownNode,mouseupTimer,mousedownTimer; var lastMinderNode; function inputStatusReady(node){ if (node && km.isSingleSelect() && node.isSelected()) { node.getTextGroup().setStyle('cursor','default'); var color = node.getStyle('text-selection-color'); //准备输入状态 receiver.updateByMinderNode(node); sel.setHide() .setStartOffset(0) .setEndOffset(receiver.getTxtOfContainer().length) .setColor(color); receiver.updateContainerRangeBySel(); if(browser.ie ){ var timer = setInterval(function(){ var nativeRange = range.nativeSel.getRangeAt(0); if(!nativeRange || nativeRange.collapsed){ range.select(); }else { clearInterval(timer); } }); } km.setStatus('inputready'); } } km.textEditNode = function(node){ inputStatusReady(node); km.setStatus('textedit'); receiver.updateSelection(); }; return { 'events': { 'ready': function() { document.body.appendChild(receiver.container); }, 'normal.beforemousedown textedit.beforemousedown inputready.beforemousedown': function(e) { //右键直接退出 if (e.isRightMB()) { if (!e.getTargetNode()) this.setStatus('normal'); return; } mouseDownStatus = true; selectionReadyShow = sel.isShow(); sel.setHide(); var node = e.getTargetNode(); //点击在之前的选区上 if (!node) { var selectionShape = e.kityEvent.targetShape; if (selectionShape && selectionShape.getType() == 'Selection') { node = receiver.getMinderNode(); e.stopPropagationImmediately(); } } if(node){ if (this.isSingleSelect() && node.isSelected()) { lastMinderNode = node; mousedownNode = node; var textGroup = node.getTextGroup(); sel.collapse(true); sel.setColor(node.getStyle('text-selection-color')); receiver .updateByMinderNode(node) .updateIndexByMouse(e.getPosition(node.getRenderContainer())) .setRange(range) .setReady(); if(selectionReadyShow){ sel.setShowStatus(); clearTimeout(mousedownTimer); mousedownTimer = setTimeout(function() { if(dblclickEvent){ dblclickEvent = false; return; } sel.collapse(true) .updatePosition(receiver.getOffsetByIndex()) .setShow(); textGroup.setStyle('cursor','text'); },200); km.setStatus('textedit'); } return; } } //模拟光标没有准备好 receiver.clearReady(); //当点击空白处时,光标需要消失 receiver.clear(); if(lastMinderNode){ lastMinderNode.getTextGroup().setStyle('cursor','default'); } }, 'inputready.keyup':function(){ if(sel.isHide()){ inputStatusReady(this.getSelectedNode()); } }, //当节点选区通过键盘发生变化时,输入状态要准备好 'normal.keyup': function(e) { var node = this.getSelectedNode(); var keyCode = e.getKeyCode(); if (node) { if (this.isSingleSelect() && node.isSelected() && !sel.isShow() ) { var orgEvt = e.originEvent; if (keymap.isSelectedNodeKey[keyCode] && !orgEvt.ctrlKey && !orgEvt.metaKey && !orgEvt.shiftKey && !orgEvt.altKey) { inputStatusReady(node); } } } }, 'normal.mouseup textedit.mouseup inputready.mouseup': function(e) { mouseDownStatus = false; var node = e.getTargetNode(); mousedownNode = null; if (node && !selectionReadyShow && receiver.isReady()) { sel.collapse(true); sel.setColor(node.getStyle('text-selection-color')); //必须再次focus,要不不能呼出键盘 if(browser.ipad){ receiver.focus(); } clearTimeout(mouseupTimer); mouseupTimer = setTimeout(function() { if(dblclickEvent){ dblclickEvent = false; return; } sel.collapse(true) .updatePosition(receiver.getOffsetByIndex()) .setShow(); node.getTextGroup().setStyle('cursor','text'); }, 200); km.setStatus('textedit'); return; } //当选中节点后,输入状态准备 if(sel.isHide()){ inputStatusReady(e.getTargetNode()); }else { //当有光标时,要同步选区 if(!sel.collapsed){ receiver.updateContainerRangeBySel(); } } }, 'textedit.beforemousemove inputready.beforemousemove': function(e) { if(browser.ipad){ return; } //ipad下不做框选 if (mouseDownStatus && receiver.isReady() && selectionReadyShow) { e.stopPropagationImmediately(); if(mousedownNode){ var offset = e.getPosition( mousedownNode.getRenderContainer()); receiver .updateSelectionByMousePosition(offset) .updateSelection(offset); setTimeout(function(){ receiver.updateContainerRangeBySel(); }); } }else if(mouseDownStatus && !selectionReadyShow){ //第一次点中,第二次再次点中进行拖拽 km.setStatus('normal'); receiver.clearReady(); } }, 'normal.dblclick textedit.dblclick inputready.dblclick': function(e) { var node = e.getTargetNode(); dblclickEvent = true; if(node){ //跟mouseup的timeout有冲突,这里做标记处理 inputStatusReady(node); km.setStatus('textedit'); receiver.updateSelection(); } }, 'restoreScene': function() { receiver.clear(); inputStatusReady(this.getSelectedNode()); }, 'stopTextEdit': function() { receiver.clear(); km.setStatus('normal'); }, 'resize': function(e) { sel.setHide(); }, 'execCommand': function(e) { var cmds = { 'appendchildnode': 1, 'appendsiblingnode': 1, 'editnode': 1 }; if (cmds[e.commandName]) { inputStatusReady(km.getSelectedNode()); receiver.updateSelection(); return; } if(sel.isShow()){ receiver.updateTextOffsetData().updateSelection(); } }, 'layoutfinish':function(e){ if (e.node === receiver.minderNode && (this.getStatus() == 'textedit' || this.getStatus() == 'inputready') ) {//&& selectionReadyShow receiver.setContainerStyle(); } }, 'selectionclear': function() { var node = km.getSelectedNode(); if(node){ inputStatusReady(node); }else{ km.setStatus('normal'); receiver.clear(); } }, 'blur': function() { !/\?debug#?/.test(location.href) && receiver.clear(); }, 'textedit.import': function() { km.setStatus('normal'); receiver.clear(); }, 'inputready.mousewheel textedit.mousewheel': function() { receiver.setContainerStyle(); }, 'statuschange':function(e){ if(e.lastStatus == 'textedit'){ this.fire('contentchange'); } } } }; });