| 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,d=n.length,c=d-1;o=n[c];while(o.getLevel()!==r){a=0;while(a<d&&n[a].getLevel()===r){if(n[a].isAncestorOf(o)){n.splice(c,1);break}a++}c--;o=n[c]}}}var h=encode(n);t.clipboardData.setData("text/plain",h)}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.popmenu=e.popmenu;this.receiver=e.receiver;this.receiverElement=this.receiver.element;this.isGecko=window.kity.Browser.gecko;this.debug=this.editor.debug;this.setupReciverElement();this.setupFsm();this.setupPopmenu()},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()},setupPopmenu:function(){},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.display="";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 d=false,c=false;for(var h,l,u,f,m,p=0,v=e.length;p<v;p++){h=e[p];switch(Object.prototype.toString.call(h)){case"[object HTMLBRElement]":{t+=n;break}case"[object Text]":{h=h.textContent.replace(" "," ");if(!r.test(h)){u=h.length;while(u--){if(o.test(h[u])){t+=s}else if(h[u]===i){t+=i}}}else{t+=h}break}case"[object HTMLElement]":{switch(h.nodeName){case"B":{d=true;break}case"I":{c=true;break}default:{}}[].splice.apply(e,[p,1].concat([].slice.call(h.childNodes)));v=e.length;p--;break}case"[object HTMLSpanElement]":{[].splice.apply(e,[p,1].concat([].slice.call(h.childNodes)));v=e.length;p--;break}case"[object HTMLImageElement]":{if(h.src){if(/http(|s):\/\//.test(h.src)){minder.execCommand("Image",h.src,h.alt)}else{}}break}case"[object HTMLDivElement]":{l=[];for(var g=0,v=h.childNodes.length;g<v;g++){l.push(h.childNodes[g])}l.push(a);[].splice.apply(e,[p,1].concat(l));v=e.length;p--;break}default:{if(h&&h.childNodes.length){l=[];for(var g=0,v=h.childNodes.length;g<v;g++){l.push(h.childNodes[g])}l.push(a);[].splice.apply(e,[p,1].concat(l));v=e.length;p--}else{if(h&&h.textContent!==undefined){t+=h.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(d){this.minder.queryCommandState("bold")||this.minder.execCommand("bold")}else{this.minder.queryCommandState("bold")&&this.minder.execCommand("bold")}if(c){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.style.cursor="default";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.JumpingInEditMode=function(e){var i=e.fsm;var t=e.minder;var n=e.receiver;var r=e.contentNode;var s=n.element;var o=e.popmenu;function a(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){s.innerHTML=""}return i.jump("popmenu","space-trigger")}switch(e.type){case"keydown":{if(t.getSelectedNode()){if(a(e)){return i.jump("input","user-input")}}else{s.innerHTML=""}i.jump("normal","shortcut-handle",e);break}case"keyup":{break}default:{}}});n.listen("popmenu",function(e){n.disable();e.preventDefault();var t=o.dispatch(e);if(o.state()==Popmenu.STATE_IDLE&&i.state()=="popmenu"){return i.jump("normal","popmenu-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 d,c;var h=2;r.addEventListener("mousedown",function(e){if(e.button==h){e.preventDefault()}if(i.state()=="popmenu"){o.active(Popmenu.STATE_IDLE);i.jump("normal","blur");d=e.clientX;c=e.clientY}else if(i.state()=="normal"&&e.button==h){d=e.clientX;c=e.clientY}},false);r.addEventListener("mousewheel",function(e){if(i.state()=="popmenu"){o.active(Popmenu.STATE_IDLE);i.jump("normal","mousemove-blur")}},false);r.addEventListener("contextmenu",function(e){e.preventDefault()});r.addEventListener("mouseup",function(e){if(i.state()!="normal"){return}if(e.button!=h||e.clientX!=d||e.clientY!=c){return}if(!t.getSelectedNode()){return}i.jump("popmenu","content-menu")},false)};
|