| /* |
| Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved. |
| Available via Academic Free License >= 2.1 OR the modified BSD license. |
| see: http://dojotoolkit.org/license for details |
| */ |
| |
| |
| if(!dojo._hasResource["dijit.Editor"]){ |
| dojo._hasResource["dijit.Editor"]=true; |
| dojo.provide("dijit.Editor"); |
| dojo.require("dijit._editor.RichText"); |
| dojo.require("dijit.Toolbar"); |
| dojo.require("dijit.ToolbarSeparator"); |
| dojo.require("dijit._editor._Plugin"); |
| dojo.require("dijit._editor.plugins.EnterKeyHandling"); |
| dojo.require("dijit._editor.range"); |
| dojo.require("dijit._Container"); |
| dojo.require("dojo.i18n"); |
| dojo.requireLocalization("dijit._editor","commands",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw"); |
| dojo.declare("dijit.Editor",dijit._editor.RichText,{plugins:null,extraPlugins:null,constructor:function(){ |
| if(!dojo.isArray(this.plugins)){ |
| this.plugins=["undo","redo","|","cut","copy","paste","|","bold","italic","underline","strikethrough","|","insertOrderedList","insertUnorderedList","indent","outdent","|","justifyLeft","justifyRight","justifyCenter","justifyFull","dijit._editor.plugins.EnterKeyHandling"]; |
| } |
| this._plugins=[]; |
| this._editInterval=this.editActionInterval*1000; |
| if(dojo.isIE){ |
| this.events.push("onBeforeDeactivate"); |
| this.events.push("onBeforeActivate"); |
| } |
| },postCreate:function(){ |
| if(this.customUndo){ |
| dojo["require"]("dijit._editor.range"); |
| this._steps=this._steps.slice(0); |
| this._undoedSteps=this._undoedSteps.slice(0); |
| } |
| if(dojo.isArray(this.extraPlugins)){ |
| this.plugins=this.plugins.concat(this.extraPlugins); |
| } |
| this.inherited(arguments); |
| this.commands=dojo.i18n.getLocalization("dijit._editor","commands",this.lang); |
| if(!this.toolbar){ |
| this.toolbar=new dijit.Toolbar({}); |
| dojo.place(this.toolbar.domNode,this.editingArea,"before"); |
| } |
| dojo.forEach(this.plugins,this.addPlugin,this); |
| this.onNormalizedDisplayChanged(); |
| this.toolbar.startup(); |
| },destroy:function(){ |
| dojo.forEach(this._plugins,function(p){ |
| if(p&&p.destroy){ |
| p.destroy(); |
| } |
| }); |
| this._plugins=[]; |
| this.toolbar.destroyRecursive(); |
| delete this.toolbar; |
| this.inherited(arguments); |
| },addPlugin:function(_1,_2){ |
| var _3=dojo.isString(_1)?{name:_1}:_1; |
| if(!_3.setEditor){ |
| var o={"args":_3,"plugin":null,"editor":this}; |
| dojo.publish(dijit._scopeName+".Editor.getPlugin",[o]); |
| if(!o.plugin){ |
| var pc=dojo.getObject(_3.name); |
| if(pc){ |
| o.plugin=new pc(_3); |
| } |
| } |
| if(!o.plugin){ |
| console.warn("Cannot find plugin",_1); |
| return; |
| } |
| _1=o.plugin; |
| } |
| if(arguments.length>1){ |
| this._plugins[_2]=_1; |
| }else{ |
| this._plugins.push(_1); |
| } |
| _1.setEditor(this); |
| if(dojo.isFunction(_1.setToolbar)){ |
| _1.setToolbar(this.toolbar); |
| } |
| },startup:function(){ |
| },resize:function(_4){ |
| if(_4){ |
| dijit.layout._LayoutWidget.prototype.resize.apply(this,arguments); |
| } |
| },layout:function(){ |
| this.editingArea.style.height=(this._contentBox.h-dojo.marginBox(this.toolbar.domNode).h)+"px"; |
| if(this.iframe){ |
| this.iframe.style.height="100%"; |
| } |
| this._layoutMode=true; |
| },_onIEMouseDown:function(e){ |
| var _5=this.document.body.componentFromPoint(e.x,e.y); |
| if(!_5){ |
| delete this._savedSelection; |
| if(e.target.tagName=="BODY"){ |
| setTimeout(dojo.hitch(this,"placeCursorAtEnd"),0); |
| } |
| this.inherited(arguments); |
| } |
| },onBeforeActivate:function(e){ |
| this._restoreSelection(); |
| },onBeforeDeactivate:function(e){ |
| if(this.customUndo){ |
| this.endEditing(true); |
| } |
| if(e.target.tagName!="BODY"){ |
| this._saveSelection(); |
| } |
| },customUndo:dojo.isIE,editActionInterval:3,beginEditing:function(_6){ |
| if(!this._inEditing){ |
| this._inEditing=true; |
| this._beginEditing(_6); |
| } |
| if(this.editActionInterval>0){ |
| if(this._editTimer){ |
| clearTimeout(this._editTimer); |
| } |
| this._editTimer=setTimeout(dojo.hitch(this,this.endEditing),this._editInterval); |
| } |
| },_steps:[],_undoedSteps:[],execCommand:function(_7){ |
| if(this.customUndo&&(_7=="undo"||_7=="redo")){ |
| return this[_7](); |
| }else{ |
| if(this.customUndo){ |
| this.endEditing(); |
| this._beginEditing(); |
| } |
| var r; |
| try{ |
| r=this.inherited("execCommand",arguments); |
| if(dojo.isWebKit&&_7=="paste"&&!r){ |
| throw {code:1011}; |
| } |
| } |
| catch(e){ |
| if(e.code==1011&&/copy|cut|paste/.test(_7)){ |
| var _8=dojo.string.substitute,_9={cut:"X",copy:"C",paste:"V"}; |
| alert(_8(this.commands.systemShortcut,[this.commands[_7],_8(this.commands[dojo.isMac?"appleKey":"ctrlKey"],[_9[_7]])])); |
| } |
| r=false; |
| } |
| if(this.customUndo){ |
| this._endEditing(); |
| } |
| return r; |
| } |
| },queryCommandEnabled:function(_a){ |
| if(this.customUndo&&(_a=="undo"||_a=="redo")){ |
| return _a=="undo"?(this._steps.length>1):(this._undoedSteps.length>0); |
| }else{ |
| return this.inherited("queryCommandEnabled",arguments); |
| } |
| },_moveToBookmark:function(b){ |
| var _b=b.mark; |
| var _c=b.mark; |
| var _d=b.isCollapsed; |
| if(dojo.isIE){ |
| if(dojo.isArray(_c)){ |
| _b=[]; |
| dojo.forEach(_c,function(n){ |
| _b.push(dijit.range.getNode(n,this.editNode)); |
| },this); |
| } |
| }else{ |
| var r=dijit.range.create(this.window); |
| r.setStart(dijit.range.getNode(b.startContainer,this.editNode),b.startOffset); |
| r.setEnd(dijit.range.getNode(b.endContainer,this.editNode),b.endOffset); |
| _b=r; |
| } |
| dojo.withGlobal(this.window,"moveToBookmark",dijit,[{mark:_b,isCollapsed:_d}]); |
| },_changeToStep:function(_e,to){ |
| this.setValue(to.text); |
| var b=to.bookmark; |
| if(!b){ |
| return; |
| } |
| this._moveToBookmark(b); |
| },undo:function(){ |
| this.endEditing(true); |
| var s=this._steps.pop(); |
| if(this._steps.length>0){ |
| this.focus(); |
| this._changeToStep(s,this._steps[this._steps.length-1]); |
| this._undoedSteps.push(s); |
| this.onDisplayChanged(); |
| return true; |
| } |
| return false; |
| },redo:function(){ |
| this.endEditing(true); |
| var s=this._undoedSteps.pop(); |
| if(s&&this._steps.length>0){ |
| this.focus(); |
| this._changeToStep(this._steps[this._steps.length-1],s); |
| this._steps.push(s); |
| this.onDisplayChanged(); |
| return true; |
| } |
| return false; |
| },endEditing:function(_f){ |
| if(this._editTimer){ |
| clearTimeout(this._editTimer); |
| } |
| if(this._inEditing){ |
| this._endEditing(_f); |
| this._inEditing=false; |
| } |
| },_getBookmark:function(){ |
| var b=dojo.withGlobal(this.window,dijit.getBookmark); |
| var tmp=[]; |
| if(b.mark){ |
| var _10=b.mark; |
| if(dojo.isIE){ |
| if(dojo.isArray(_10)){ |
| dojo.forEach(_10,function(n){ |
| tmp.push(dijit.range.getIndex(n,this.editNode).o); |
| },this); |
| b.mark=tmp; |
| } |
| }else{ |
| tmp=dijit.range.getIndex(_10.startContainer,this.editNode).o; |
| b.mark={startContainer:tmp,startOffset:_10.startOffset,endContainer:_10.endContainer===_10.startContainer?tmp:dijit.range.getIndex(_10.endContainer,this.editNode).o,endOffset:_10.endOffset}; |
| } |
| } |
| return b; |
| },_beginEditing:function(cmd){ |
| if(this._steps.length===0){ |
| this._steps.push({"text":this.savedContent,"bookmark":this._getBookmark()}); |
| } |
| },_endEditing:function(_11){ |
| var v=this.getValue(true); |
| this._undoedSteps=[]; |
| this._steps.push({text:v,bookmark:this._getBookmark()}); |
| },onKeyDown:function(e){ |
| if(!dojo.isIE&&!this.iframe&&e.keyCode==dojo.keys.TAB&&!this.tabIndent){ |
| this._saveSelection(); |
| } |
| if(!this.customUndo){ |
| this.inherited(arguments); |
| return; |
| } |
| var k=e.keyCode,ks=dojo.keys; |
| if(e.ctrlKey&&!e.altKey){ |
| if(k==90||k==122){ |
| dojo.stopEvent(e); |
| this.undo(); |
| return; |
| }else{ |
| if(k==89||k==121){ |
| dojo.stopEvent(e); |
| this.redo(); |
| return; |
| } |
| } |
| } |
| this.inherited(arguments); |
| switch(k){ |
| case ks.ENTER: |
| case ks.BACKSPACE: |
| case ks.DELETE: |
| this.beginEditing(); |
| break; |
| case 88: |
| case 86: |
| if(e.ctrlKey&&!e.altKey&&!e.metaKey){ |
| this.endEditing(); |
| if(e.keyCode==88){ |
| this.beginEditing("cut"); |
| setTimeout(dojo.hitch(this,this.endEditing),1); |
| }else{ |
| this.beginEditing("paste"); |
| setTimeout(dojo.hitch(this,this.endEditing),1); |
| } |
| break; |
| } |
| default: |
| if(!e.ctrlKey&&!e.altKey&&!e.metaKey&&(e.keyCode<dojo.keys.F1||e.keyCode>dojo.keys.F15)){ |
| this.beginEditing(); |
| break; |
| } |
| case ks.ALT: |
| this.endEditing(); |
| break; |
| case ks.UP_ARROW: |
| case ks.DOWN_ARROW: |
| case ks.LEFT_ARROW: |
| case ks.RIGHT_ARROW: |
| case ks.HOME: |
| case ks.END: |
| case ks.PAGE_UP: |
| case ks.PAGE_DOWN: |
| this.endEditing(true); |
| break; |
| case ks.CTRL: |
| case ks.SHIFT: |
| case ks.TAB: |
| break; |
| } |
| },_onBlur:function(){ |
| this.inherited("_onBlur",arguments); |
| this.endEditing(true); |
| },_saveSelection:function(){ |
| this._savedSelection=this._getBookmark(); |
| },_restoreSelection:function(){ |
| if(this._savedSelection){ |
| if(dojo.withGlobal(this.window,"isCollapsed",dijit)){ |
| this._moveToBookmark(this._savedSelection); |
| } |
| delete this._savedSelection; |
| } |
| },onClick:function(){ |
| this.endEditing(true); |
| this.inherited(arguments); |
| }}); |
| dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){ |
| if(o.plugin){ |
| return; |
| } |
| var _12=o.args,p; |
| var _13=dijit._editor._Plugin; |
| var _14=_12.name; |
| switch(_14){ |
| case "undo": |
| case "redo": |
| case "cut": |
| case "copy": |
| case "paste": |
| case "insertOrderedList": |
| case "insertUnorderedList": |
| case "indent": |
| case "outdent": |
| case "justifyCenter": |
| case "justifyFull": |
| case "justifyLeft": |
| case "justifyRight": |
| case "delete": |
| case "selectAll": |
| case "removeFormat": |
| case "unlink": |
| case "insertHorizontalRule": |
| p=new _13({command:_14}); |
| break; |
| case "bold": |
| case "italic": |
| case "underline": |
| case "strikethrough": |
| case "subscript": |
| case "superscript": |
| p=new _13({buttonClass:dijit.form.ToggleButton,command:_14}); |
| break; |
| case "|": |
| p=new _13({button:new dijit.ToolbarSeparator()}); |
| } |
| o.plugin=p; |
| }); |
| } |