From 2f01fe57a8d37767827d6db42850aef86a767c53 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Mon, 15 Nov 2010 10:39:52 +0300 Subject: add dijit/dojo stuff; initial ui mockup --- lib/dijit/Editor.js | 473 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 473 insertions(+) create mode 100644 lib/dijit/Editor.js (limited to 'lib/dijit/Editor.js') diff --git a/lib/dijit/Editor.js b/lib/dijit/Editor.js new file mode 100644 index 000000000..69258eade --- /dev/null +++ b/lib/dijit/Editor.js @@ -0,0 +1,473 @@ +/* + Copyright (c) 2004-2010, 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.require("dijit.layout._LayoutWidget"); +dojo.require("dijit._editor.range"); +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,ro,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(){ +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.setValueDeferred=new dojo.Deferred(); +this.inherited(arguments); +this.commands=dojo.i18n.getLocalization("dijit._editor","commands",this.lang); +if(!this.toolbar){ +this.toolbar=new dijit.Toolbar({dir:this.dir,lang:this.lang}); +this.header.appendChild(this.toolbar.domNode); +} +dojo.forEach(this.plugins,this.addPlugin,this); +this.setValueDeferred.callback(true); +dojo.addClass(this.iframe.parentNode,"dijitEditorIFrameContainer"); +dojo.addClass(this.iframe,"dijitEditorIFrame"); +dojo.attr(this.iframe,"allowTransparency",true); +if(dojo.isWebKit){ +dojo.style(this.domNode,"KhtmlUserSelect","none"); +} +this.toolbar.startup(); +this.onNormalizedDisplayChanged(); +},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(){ +var _5=(this._contentBox.h-(this.getHeaderHeight()+this.getFooterHeight()+dojo._getPadBorderExtents(this.iframe.parentNode).h+dojo._getMarginExtents(this.iframe.parentNode).h)); +this.editingArea.style.height=_5+"px"; +if(this.iframe){ +this.iframe.style.height="100%"; +} +this._layoutMode=true; +},_onIEMouseDown:function(e){ +var _6; +var b=this.document.body; +var _7=b.clientWidth; +var _8=b.clientHeight; +var _9=b.clientLeft; +var _a=b.offsetWidth; +var _b=b.offsetHeight; +var _c=b.offsetLeft; +bodyDir=b.dir?b.dir.toLowerCase():""; +if(bodyDir!="rtl"){ +if(_7<_a&&e.x>_7&&e.x<_a){ +_6=true; +} +}else{ +if(e.x<_9&&e.x>_c){ +_6=true; +} +} +if(!_6){ +if(_8<_b&&e.y>_8&&e.y<_b){ +_6=true; +} +} +if(!_6){ +delete this._cursorToStart; +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||dojo.isWebKit,editActionInterval:3,beginEditing:function(_d){ +if(!this._inEditing){ +this._inEditing=true; +this._beginEditing(_d); +} +if(this.editActionInterval>0){ +if(this._editTimer){ +clearTimeout(this._editTimer); +} +this._editTimer=setTimeout(dojo.hitch(this,this.endEditing),this._editInterval); +} +},_steps:[],_undoedSteps:[],execCommand:function(_e){ +if(this.customUndo&&(_e=="undo"||_e=="redo")){ +return this[_e](); +}else{ +if(this.customUndo){ +this.endEditing(); +this._beginEditing(); +} +var r; +try{ +r=this.inherited("execCommand",arguments); +if(dojo.isWebKit&&_e=="paste"&&!r){ +throw {code:1011}; +} +} +catch(e){ +if(e.code==1011&&/copy|cut|paste/.test(_e)){ +var _f=dojo.string.substitute,_10={cut:"X",copy:"C",paste:"V"}; +alert(_f(this.commands.systemShortcut,[this.commands[_e],_f(this.commands[dojo.isMac?"appleKey":"ctrlKey"],[_10[_e]])])); +} +r=false; +} +if(this.customUndo){ +this._endEditing(); +} +return r; +} +},queryCommandEnabled:function(cmd){ +if(this.customUndo&&(cmd=="undo"||cmd=="redo")){ +return cmd=="undo"?(this._steps.length>1):(this._undoedSteps.length>0); +}else{ +return this.inherited("queryCommandEnabled",arguments); +} +},_moveToBookmark:function(b){ +var _11=b.mark; +var _12=b.mark; +var col=b.isCollapsed; +var r,_13,_14,sel; +if(_12){ +if(dojo.isIE){ +if(dojo.isArray(_12)){ +_11=[]; +dojo.forEach(_12,function(n){ +_11.push(dijit.range.getNode(n,this.editNode)); +},this); +dojo.withGlobal(this.window,"moveToBookmark",dijit,[{mark:_11,isCollapsed:col}]); +}else{ +if(_12.startContainer&&_12.endContainer){ +sel=dijit.range.getSelection(this.window); +if(sel&&sel.removeAllRanges){ +sel.removeAllRanges(); +r=dijit.range.create(this.window); +_13=dijit.range.getNode(_12.startContainer,this.editNode); +_14=dijit.range.getNode(_12.endContainer,this.editNode); +if(_13&&_14){ +r.setStart(_13,_12.startOffset); +r.setEnd(_14,_12.endOffset); +sel.addRange(r); +} +} +} +} +}else{ +sel=dijit.range.getSelection(this.window); +if(sel&&sel.removeAllRanges){ +sel.removeAllRanges(); +r=dijit.range.create(this.window); +_13=dijit.range.getNode(_12.startContainer,this.editNode); +_14=dijit.range.getNode(_12.endContainer,this.editNode); +if(_13&&_14){ +r.setStart(_13,_12.startOffset); +r.setEnd(_14,_12.endOffset); +sel.addRange(r); +} +} +} +} +},_changeToStep:function(_15,to){ +this.setValue(to.text); +var b=to.bookmark; +if(!b){ +return; +} +this._moveToBookmark(b); +},undo:function(){ +var ret=false; +if(!this._undoRedoActive){ +this._undoRedoActive=true; +this.endEditing(true); +var s=this._steps.pop(); +if(s&&this._steps.length>0){ +this.focus(); +this._changeToStep(s,this._steps[this._steps.length-1]); +this._undoedSteps.push(s); +this.onDisplayChanged(); +delete this._undoRedoActive; +ret=true; +} +delete this._undoRedoActive; +} +return ret; +},redo:function(){ +var ret=false; +if(!this._undoRedoActive){ +this._undoRedoActive=true; +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(); +ret=true; +} +delete this._undoRedoActive; +} +return ret; +},endEditing:function(_16){ +if(this._editTimer){ +clearTimeout(this._editTimer); +} +if(this._inEditing){ +this._endEditing(_16); +this._inEditing=false; +} +},_getBookmark:function(){ +var b=dojo.withGlobal(this.window,dijit.getBookmark); +var tmp=[]; +if(b&&b.mark){ +var _17=b.mark; +if(dojo.isIE){ +var sel=dijit.range.getSelection(this.window); +if(!dojo.isArray(_17)){ +if(sel){ +var _18; +if(sel.rangeCount){ +_18=sel.getRangeAt(0); +} +if(_18){ +b.mark=_18.cloneRange(); +}else{ +b.mark=dojo.withGlobal(this.window,dijit.getBookmark); +} +} +}else{ +dojo.forEach(b.mark,function(n){ +tmp.push(dijit.range.getIndex(n,this.editNode).o); +},this); +b.mark=tmp; +} +} +try{ +if(b.mark&&b.mark.startContainer){ +tmp=dijit.range.getIndex(b.mark.startContainer,this.editNode).o; +b.mark={startContainer:tmp,startOffset:b.mark.startOffset,endContainer:b.mark.endContainer===b.mark.startContainer?tmp:dijit.range.getIndex(b.mark.endContainer,this.editNode).o,endOffset:b.mark.endOffset}; +} +} +catch(e){ +b.mark=null; +} +} +return b; +},_beginEditing:function(cmd){ +if(this._steps.length===0){ +this._steps.push({"text":dijit._editor.getChildrenHtml(this.editNode),"bookmark":this._getBookmark()}); +} +},_endEditing:function(_19){ +var v=dijit._editor.getChildrenHtml(this.editNode); +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.keyCodedojo.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){ +delete this._cursorToStart; +if(dojo.withGlobal(this.window,"isCollapsed",dijit)){ +this._moveToBookmark(this._savedSelection); +} +delete this._savedSelection; +} +},onClick:function(){ +this.endEditing(true); +this.inherited(arguments); +},_setDisabledAttr:function(_1a){ +if(!this.disabled&&_1a){ +this._buttonEnabledPlugins=dojo.filter(this._plugins,function(p){ +if(p&&p.button&&!p.button.get("disabled")){ +p.button.set("disabled",true); +return true; +} +return false; +}); +}else{ +if(this.disabled&&!_1a){ +dojo.forEach(this._buttonEnabledPlugins,function(p){ +p.button.attr("disabled",false); +p.updateState&&p.updateState(); +}); +} +} +this.inherited(arguments); +},_setStateClass:function(){ +this.inherited(arguments); +if(this.document&&this.document.body){ +dojo.style(this.document.body,"color",dojo.style(this.iframe,"color")); +} +}}); +dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){ +if(o.plugin){ +return; +} +var _1b=o.args,p; +var _1c=dijit._editor._Plugin; +var _1d=_1b.name; +switch(_1d){ +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 _1c({command:_1d}); +break; +case "bold": +case "italic": +case "underline": +case "strikethrough": +case "subscript": +case "superscript": +p=new _1c({buttonClass:dijit.form.ToggleButton,command:_1d}); +break; +case "|": +p=new _1c({button:new dijit.ToolbarSeparator(),setEditor:function(_1e){ +this.editor=_1e; +}}); +} +o.plugin=p; +}); +} -- cgit v1.2.3