| 1 |
- MWF.xApplication.MinderEditor.History=new Class({initialize:function(e){this.minder=e;this.MAX_HISTORY=100;this.lastSnap;this.patchLock;this.undoDiffs=[];this.redoDiffs=[];this.reset();e.on("contentchange",this.changed.bind(this));e.on("import",this.reset.bind(this));e.on("patch",this.updateSelection.bind(this))},reset:function(){this.undoDiffs=[];this.redoDiffs=[];this.lastSnap=this.minder.exportJson()},makeUndoDiff:function(){var e=this.minder.exportJson();var t=MWF.xApplication.MinderEditor.JsonDiff(e,this.lastSnap);if(t.length){this.undoDiffs.push(t);while(this.undoDiffs.length>this.MAX_HISTORY){this.undoDiffs.shift()}this.lastSnap=e;return true}},makeRedoDiff:function(){var e=this.minder.exportJson();this.redoDiffs.push(MWF.xApplication.MinderEditor.JsonDiff(e,this.lastSnap));this.lastSnap=e},undo:function(){this.patchLock=true;var e=this.undoDiffs.pop();if(e){this.minder.applyPatches(e);this.makeRedoDiff()}this.patchLock=false},redo:function(){this.patchLock=true;var e=this.redoDiffs.pop();if(e){this.minder.applyPatches(e);this.makeUndoDiff()}this.patchLock=false},changed:function(){if(this.patchLock)return;if(this.makeUndoDiff())this.redoDiffs=[]},hasUndo:function(){return!!this.undoDiffs.length},hasRedo:function(){return!!this.redoDiffs.length},updateSelection:function(e){if(!this.patchLock)return;var t=e.patch;switch(t.express){case"node.add":this.minder.select(t.node.getChild(t.index),true);break;case"node.remove":case"data.replace":case"data.remove":case"data.add":this.minder.select(t.node,true);break}}});MWF.xApplication.MinderEditor.ClipboardMimeType=new Class({initialize:function(){this.SPLITOR="\ufeff";this.MIMETYPE={"application/km":""};this.SIGN={"\ufeff":"SPLITOR","":"application/km"}},process:function(e,t){t=t||"";if(!this.isPureText(t)){var i=this.whichMimeType(t);if(!i){throw new Error("unknow mimetype!")}t=this.getPureText(t)}if(e===false){return t}return e+this.SPLITOR+t},registMimeTypeProtocol:function(e,t){if(t&&this.SIGN[t]){throw new Error("sing has registed!")}if(e&&!!this.MIMETYPE[e]){throw new Error("mimetype has registed!")}this.SIGN[t]=e;this.MIMETYPE[e]=t},getMimeTypeProtocol:function(e,t){var i=this.MIMETYPE[e]||false;if(t===undefined){return this.process(i)}return this.process(i,t)},getSpitor:function(){return this.SPLITOR},getMimeType:function(e){if(e!==undefined){return this.SIGN[e]||null}return this.MIMETYPE},isPureText:function(e){if(!e)return true;return!~e.indexOf(this.getSpitor())},getPureText:function(e){if(this.isPureText(e)){return e}return e.split(this.getSpitor())[1]},whichMimeType:function(e){if(this.isPureText(e)){return null}return this.getMimeType(e.split(this.getSpitor())[0])}});MWF.xApplication.MinderEditor.Clipboard=new Class({initialize:function(e){this.editor=e;this.minder=e.minder;this.Data=window.kityminder.data;if(!this.minder.supportClipboardEvent||kity.Browser.gecko){return}this.fsm=this.editor.fsm;this.receiver=this.editor.receiver;this.MimeType=this.editor.MimeType;this.kmencode=this.MimeType.getMimeTypeProtocol("application/km");this.decode=this.Data.getRegisterProtocol("json").decode;this._selectedNodes=[];document.addEventListener("copy",this.beforeCopy.bind(this));document.addEventListener("cut",this.beforeCut.bind(this));document.addEventListener("paste",this.beforePaste.bind(this))},encode:function(e){var t=[];for(var i=0,n=e.length;i<n;i++){t.push(this.minder.exportNode(e[i]))}return kmencode(this.Data.getRegisterProtocol("json").encode(t))},beforeCopy:function(e){if(document.activeElement==this.receiver.element){var t=e;var i=this.fsm.state();switch(i){case"input":{break}case"normal":{var n=[].concat(this.minder.getSelectedNodes());if(n.length){if(n.length>1){var r;n.sort(function(e,t){return e.getLevel()-t.getLevel()});r=n[0].getLevel();if(r!==n[n.length-1].getLevel()){var s,o,a=0,h=n.length,l=h-1;o=n[l];while(o.getLevel()!==r){a=0;while(a<h&&n[a].getLevel()===r){if(n[a].isAncestorOf(o)){n.splice(l,1);break}a++}l--;o=n[l]}}}var d=encode(n);t.clipboardData.setData("text/plain",d)}e.preventDefault();break}}}},beforeCut:function(e){if(document.activeElement==this.receiver.element){if(this.minder.getStatus()!=="normal"){e.preventDefault();return}var t=e;var i=this.fsm.state();switch(this.state){case"input":{break}case"normal":{var n=this.minder.getSelectedNodes();if(n.length){t.clipboardData.setData("text/plain",encode(n));this.minder.execCommand("removenode")}e.preventDefault();break}}}},beforePaste:function(e){if(document.activeElement==this.receiver.element){if(this.minder.getStatus()!=="normal"){e.preventDefault();return}var t=e;var i=this.fsm.state();var n=t.clipboardData.getData("text/plain");switch(i){case"input":{if(!this.MimeType.isPureText(n)){e.preventDefault();return}break}case"normal":{var r=this.minder.getSelectedNodes();if(this.MimeType.whichMimeType(n)==="application/km"){var s=this.decode(this.MimeType.getPureText(n));var o;r.forEach(function(e){for(var t=s.length-1;t>=0;t--){o=this.minder.createNode(null,e);this.minder.importNode(o,s[t]);this._selectedNodes.push(o);e.appendChild(o)}});this.minder.select(this._selectedNodes,true);this._selectedNodes=[];this.minder.refresh()}else if(t.clipboardData&&t.clipboardData.items[0].type.indexOf("image")>-1){}else{r.forEach(function(e){this.minder.Text2Children(e,n)})}e.preventDefault();break}}}}});MWF.xApplication.MinderEditor.Input=new Class({initialize:function(e){this.editor=e;this.fsm=e.fsm;this.minder=e.minder;this.receiver=e.receiver;this.receiverElement=this.receiver.element;this.isGecko=window.kity.Browser.gecko;this.debug=this.editor.debug;this.setupReciverElement();this.setupFsm()},setupFsm:function(){this.fsm.when("* -> input",this.enterInputMode.bind(this));this.fsm.when("input -> *",function(e,t,i){switch(i){case"input-cancel":return this.exitInputMode();case"input-commit":default:return this.commitInputResult()}}.bind(this));this.receiver.onblur(function(e){if(this.fsm.state()=="input"){this.fsm.jump("normal","input-commit")}}.bind(this));this.minder.on("beforemousedown",function(){if(this.fsm.state()=="input"){this.fsm.jump("normal","input-commit")}}.bind(this));this.minder.on("dblclick",function(){if(this.minder.getSelectedNode()&&this.minder._status!=="readonly"){this.editText()}}.bind(this))},setupReciverElement:function(){if(this.debug.flaged){this.receiverElement.classList.add("debug")}this.receiverElement.onmousedown=function(e){e.stopPropagation()};this.minder.on("layoutallfinish viewchange viewchanged selectionchange",function(e){if(e.type=="viewchange"&&this.fsm.state()!="input")return;this.updatePosition()}.bind(this));this.updatePosition()},setupHotbox:function(){hotbox.state("main").button({position:"center",label:"编辑",key:"F2",enable:function(){return minder.queryCommandState("text")!=-1},action:editText})},editText:function(){var e=this.minder.getSelectedNode();if(!e){return}var t=this.receiverElement;this.receiverElement.innerText="";if(e.getData("font-weight")==="bold"){var i=document.createElement("b");t.appendChild(i);t=i}if(e.getData("font-style")==="italic"){var n=document.createElement("i");t.appendChild(n);t=n}t.innerText=this.minder.queryCommandValue("text")||"";if(this.isGecko){this.receiver.fixFFCaretDisappeared()}this.fsm.jump("input","input-request");this.receiver.selectAll()},enterInputMode:function(){var e=this.minder.getSelectedNode();var t=this.receiverElement;if(e){var i=e.getData("font-size")||e.getStyle("font-size");t.style.fontSize=i+"px";t.style.minWidth=0;t.style.minWidth=t.clientWidth+"px";t.style.fontWeight=e.getData("font-weight")||"";t.style.fontStyle=e.getData("font-style")||"";t.classList.add("input");t.focus()}},commitInputText:function(e){var t="";var i="\t",n="\n",r=/\S/,s=" ",o=new RegExp("( |"+String.fromCharCode(160)+")"),a=document.createElement("br");var h=false,l=false;for(var d,c,u,f,m,p=0,v=e.length;p<v;p++){d=e[p];switch(Object.prototype.toString.call(d)){case"[object HTMLBRElement]":{t+=n;break}case"[object Text]":{d=d.textContent.replace(" "," ");if(!r.test(d)){u=d.length;while(u--){if(o.test(d[u])){t+=s}else if(d[u]===i){t+=i}}}else{t+=d}break}case"[object HTMLElement]":{switch(d.nodeName){case"B":{h=true;break}case"I":{l=true;break}default:{}}[].splice.apply(e,[p,1].concat([].slice.call(d.childNodes)));v=e.length;p--;break}case"[object HTMLSpanElement]":{[].splice.apply(e,[p,1].concat([].slice.call(d.childNodes)));v=e.length;p--;break}case"[object HTMLImageElement]":{if(d.src){if(/http(|s):\/\//.test(d.src)){minder.execCommand("Image",d.src,d.alt)}else{}}break}case"[object HTMLDivElement]":{c=[];for(var g=0,v=d.childNodes.length;g<v;g++){c.push(d.childNodes[g])}c.push(a);[].splice.apply(e,[p,1].concat(c));v=e.length;p--;break}default:{if(d&&d.childNodes.length){c=[];for(var g=0,v=d.childNodes.length;g<v;g++){c.push(d.childNodes[g])}c.push(a);[].splice.apply(e,[p,1].concat(c));v=e.length;p--}else{if(d&&d.textContent!==undefined){t+=d.textContent}else{t+=""}}}}}t=t.replace(/^\n*|\n*$/g,"");t=t.replace(new RegExp("(\n|\r|\n\r)( |"+String.fromCharCode(160)+"){4}","g"),"$1\t");this.minder.getSelectedNode().setText(t);if(h){this.minder.queryCommandState("bold")||this.minder.execCommand("bold")}else{this.minder.queryCommandState("bold")&&this.minder.execCommand("bold")}if(l){this.minder.queryCommandState("italic")||this.minder.execCommand("italic")}else{this.minder.queryCommandState("italic")&&this.minder.execCommand("italic")}this.exitInputMode();return t},commitInputNode:function(t,e){try{this.minder.decodeData("text",e).then(function(e){function a(e,t,i){var n=t.data;e.setText(n.text||"");var r=t.children||[];for(var s=0;s<r.length;s++){var o=i.createNode(null,e);a(o,r[s],i)}return e}a(t,e,this.minder);this.minder.fire("contentchange");this.minder.getRoot().renderTree();this.minder.layout(300)}.bind(this))}catch(e){this.minder.fire("contentchange");this.minder.getRoot().renderTree();if(e.toString()!=="Error: Invalid local format"){throw e}}},commitInputResult:function(){var e=[].slice.call(this.receiverElement.childNodes);setTimeout(function(){this.receiverElement.innerHTML=""}.bind(this),0);var t=this.minder.getSelectedNode();e=this.commitInputText(e);this.commitInputNode(t,e);if(t.type=="root"){var i=this.minder.getRoot().getText();this.minder.fire("initChangeRoot",{text:i})}},exitInputMode:function(){this.receiverElement.classList.remove("input");this.receiver.selectAll()},updatePosition:function(){var t=this.minder.getSelectedNode();if(!t)return;if(!this.timer){this.timer=setTimeout(function(){var e=t.getRenderBox("TextRenderer");this.receiverElement.style.left=Math.round(e.x)+"px";this.receiverElement.style.top=(this.debug.flaged?Math.round(e.bottom+30):Math.round(e.y))+"px";this.timer=0}.bind(this))}}});MWF.xApplication.MinderEditor.Drag=new Class({initialize:function(e){this.editor=e;this.fsm=e.fsm;this.minder=e.minder;this.receiver=e.receiver;this.receiverElement=this.receiver.element;this.setupFsm();var i,n;var r=0;var t=1;var s=20;var o=t;var a,h,l,d,c;var u=this.freeHorizen=false;var f=this.freeVirtical=false;this.frame=null;this.minder.on("mousedown",function(e){o=r;var t=this.minder.getPaper().container.getBoundingClientRect();i=e.originEvent.clientX;n=e.originEvent.clientY;c=t.top;a=t.width;h=t.height}.bind(this));this.minder.on("mousemove",function(e){if(this.fsm.state()==="drag"&&o==r&&this.minder.getSelectedNode()&&(Math.abs(i-e.originEvent.clientX)>s||Math.abs(n-e.originEvent.clientY)>s)){l=e.originEvent.clientX;d=e.originEvent.clientY-c;if(l<s){this.move("right",s-l)}else if(l>a-s){this.move("left",s+l-a)}else{u=true}if(d<s){this.move("bottom",d)}else if(d>h-s){this.move("top",s+d-h)}else{f=true}if(u&&f){this.move(false)}}if(this.fsm.state()!=="drag"&&o===r&&this.minder.getSelectedNode()&&(Math.abs(i-e.originEvent.clientX)>s||Math.abs(n-e.originEvent.clientY)>s)){if(this.fsm.state()==="hotbox"){}return this.fsm.jump("drag","user-drag")}}.bind(this));window.addEventListener("mouseup",function(){o=t;if(this.fsm.state()==="drag"){this.move(false);return this.fsm.jump("normal","drag-finish")}}.bind(this),false)},setupFsm:function(){this.fsm.when("* -> drag",function(){});this.fsm.when("drag -> *",function(e,t,i){if(i=="drag-finish"){}})},move:function(e,t){if(!e){this.freeHorizen=this.freeVirtical=false;this.frame&&kity.releaseFrame(this.frame);this.frame=null;return}if(!this.frame){this.frame=kity.requestFrame(function(t,i,n){return function(e){switch(t){case"left":n._viewDragger.move({x:-i,y:0},0);break;case"top":n._viewDragger.move({x:0,y:-i},0);break;case"right":n._viewDragger.move({x:i,y:0},0);break;case"bottom":n._viewDragger.move({x:0,y:i},0);break;default:return}e.next()}}(e,t,this.minder))}}});MWF.xApplication.MinderEditor.FSM=new Class({initialize:function(e){this.currentState=e;this.BEFORE_ARROW=" - ";this.AFTER_ARROW=" -> ";this.handlers=[];this.debug=new MWF.xApplication.MinderEditor.Debug("fsm")},jump:function(e,t){if(!t)throw new Error("Please tell fsm the reason to jump");var i=this.currentState;var n=[i,e].concat([].slice.call(arguments,1));var r,s;for(r=0;r<this.handlers.length;r++){s=this.handlers[r];if(this.handlerConditionMatch(s.condition,"before",i,e)){if(s.apply(null,n))return}}this.currentState=e;this.debug.log("[{0}] {1} -> {2}",t,i,e);for(r=0;r<this.handlers.length;r++){s=this.handlers[r];if(this.handlerConditionMatch(s.condition,"after",i,e)){s.apply(null,n)}}return this.currentState},state:function(){return this.currentState},when:function(e,t){if(arguments.length==1){t=e;e="* -> *"}var i,n,r,s;n=e.split(this.BEFORE_ARROW);if(n.length==2){i="before"}else{n=e.split(this.AFTER_ARROW);if(n.length==2){i="after"}}if(!i)throw new Error("Illegal fsm condition: "+e);r=n[0];s=n[1];t.condition={when:i,exit:r,enter:s};this.handlers.push(t)},handlerConditionMatch:function(e,t,i,n){if(e.when!=t)return false;if(e.enter!="*"&&e.enter!=n)return false;if(e.exit!="*"&&e.exit!=i)return;return true}});MWF.xApplication.MinderEditor.Jumping=function(){var i=this.fsm;var t=this.minder;var n=this.receiver;var e=this.container;var r=n.element;var s=this.hotbox;function o(e){if(e.ctrlKey||e.metaKey||e.altKey)return false;if(e.keyCode>=65&&e.keyCode<=90)return true;if(e.keyCode>=48&&e.keyCode<=57)return true;if(e.keyCode!=108&&e.keyCode>=96&&e.keyCode<=111)return true;if(e.keyCode!=108&&e.keyCode>=96&&e.keyCode<=111)return true;if(e.keyCode==229||e.keyCode===0)return true;return false}n.listen("normal",function(e){n.enable();if(e.is("Space")){e.preventDefault();if(kity.Browser.safari){r.innerHTML=""}return i.jump("hotbox","space-trigger")}switch(e.type){case"keydown":{if(t.getSelectedNode()){if(o(e)){return i.jump("input","user-input")}}else{r.innerHTML=""}i.jump("normal","shortcut-handle",e);break}case"keyup":{break}default:{}}});n.listen("hotbox",function(e){n.disable();e.preventDefault();var t=s.dispatch(e);if(s.state()==Hotbox.STATE_IDLE&&i.state()=="hotbox"){return i.jump("normal","hotbox-idle")}});n.listen("input",function(e){n.enable();if(e.type=="keydown"){if(e.is("Enter")){e.preventDefault();return i.jump("normal","input-commit")}if(e.is("Esc")){e.preventDefault();return i.jump("normal","input-cancel")}if(e.is("Tab")||e.is("Shift + Tab")){e.preventDefault()}}else if(e.type=="keyup"&&e.is("Esc")){e.preventDefault();return i.jump("normal","input-cancel")}});var a,h;var l=2;e.addEventListener("mousedown",function(e){if(e.button==l){e.preventDefault()}if(i.state()=="hotbox"){s.active(Hotbox.STATE_IDLE);i.jump("normal","blur")}else if(i.state()=="normal"&&e.button==l){a=e.clientX;h=e.clientY}},false);e.addEventListener("mousewheel",function(e){if(i.state()=="hotbox"){s.active(Hotbox.STATE_IDLE);i.jump("normal","mousemove-blur")}},false);e.addEventListener("contextmenu",function(e){e.preventDefault()});e.addEventListener("mouseup",function(e){if(i.state()!="normal"){return}if(e.button!=l||e.clientX!=a||e.clientY!=h){return}if(!t.getSelectedNode()){return}i.jump("hotbox","content-menu")},false);s.$element.addEventListener("mousedown",function(e){e.stopPropagation()})};MWF.xApplication.MinderEditor.Receiver=new Class({initialize:function(e){this.editor=e;this.minder=e.minder;this.fsm=e.fsm;var t=this.element=document.createElement("div");t.contentEditable=true;t.setAttribute("tabindex",-1);t.classList.add("receiver");t.onkeydown=t.onkeypress=t.onkeyup=this.dispatchKeyEvent.bind(this);this.editor.contentNode.appendChild(t);this.selectAll();this.minder.on("beforemousedown",this.selectAll.bind(this));this.minder.on("receiverfocus",this.selectAll.bind(this));this.minder.on("readonly",function(){this.minder.disable();this.element.parentElement.removeChild(this.element)}.bind(this));this.listeners=[]},selectAll:function(){if(!this.element.innerHTML)this.element.innerHTML=" ";var e=document.createRange();var t=window.getSelection();e.selectNodeContents(this.element);t.removeAllRanges();t.addRange(e);this.element.focus()},enable:function(){this.element.setAttribute("contenteditable",true)},disable:function(){this.element.setAttribute("contenteditable",false)},fixFFCaretDisappeared:function(){this.element.removeAttribute("contenteditable");this.element.setAttribute("contenteditable","true");this.element.blur();this.element.focus()},onblur:function(e){this.element.onblur=e},listen:function(e,t){if(arguments.length==1){t=e;e="*"}t.notifyState=e;listeners.push(t)},dispatchKeyEvent:function(e){e.is=function(e){var t=e.split("|");for(var i=0;i<t.length;i++){if(key.is(this,t[i]))return true}return false};var t,i;for(var n=0;n<this.listeners.length;n++){t=listeners[n];if(t.notifyState!="*"&&t.notifyState!=fsm.state()){continue}if(this.listener.call(null,e)){return}}}});
|