Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2.js
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2.js Mon Feb 19 09:56:06 2007 @@ -0,0 +1,809 @@ +/* + Copyright (c) 2004-2006, The Dojo Foundation + All Rights Reserved. + + Licensed under the Academic Free License version 2.1 or above OR the + modified BSD license. For more information on Dojo licensing, see: + + http://dojotoolkit.org/community/licensing.shtml +*/ + +dojo.provide("dojo.widget.Editor2"); + +dojo.require("dojo.io.*"); +dojo.require("dojo.widget.RichText"); +dojo.require("dojo.widget.Editor2Toolbar"); + +dojo.widget.Editor2Manager = new dojo.widget.HandlerManager; +dojo.lang.mixin(dojo.widget.Editor2Manager, +{ + // summary: Manager of current focused Editor2 Instance and available editor2 commands + + _currentInstance: null, + + // commandState: Object: state a command may be in + commandState: {Disabled: 0, Latched: 1, Enabled: 2}, + + getCurrentInstance: function(){ + // summary: Return the current focused Editor2 instance + return this._currentInstance; + }, + setCurrentInstance: function(/*Widget*/inst){ + // summary: Set current focused Editor2 instance + this._currentInstance = inst; + }, + getCommand: function(/*dojo.widget.Editor2*/editor,/*String*/name){ + // summary: Return Editor2 command with the given name + // name: name of the command (case insensitive) + var oCommand; + name = name.toLowerCase(); + for(var i=0;i<this._registeredHandlers.length;i++){ + oCommand = this._registeredHandlers[i](editor, name); + if(oCommand){ + return oCommand; + } + } + switch(name){ + case 'htmltoggle': + //Editor2 natively provide the htmltoggle functionalitity + //and it is treated as a builtin command + oCommand = new dojo.widget.Editor2BrowserCommand(editor, name); + break; + case 'formatblock': + oCommand = new dojo.widget.Editor2FormatBlockCommand(editor, name); + break; + case 'anchor': + oCommand = new dojo.widget.Editor2Command(editor, name); + break; + + //dialog command + case 'createlink': + oCommand = new dojo.widget.Editor2DialogCommand(editor, name, + {contentFile: "dojo.widget.Editor2Plugin.CreateLinkDialog", + contentClass: "Editor2CreateLinkDialog", + title: "Insert/Edit Link", width: "300px", height: "200px"}); + break; + case 'insertimage': + oCommand = new dojo.widget.Editor2DialogCommand(editor, name, + {contentFile: "dojo.widget.Editor2Plugin.InsertImageDialog", + contentClass: "Editor2InsertImageDialog", + title: "Insert/Edit Image", width: "400px", height: "270px"}); + break; + // By default we assume that it is a builtin simple command. + default: + var curtInst = this.getCurrentInstance(); + if((curtInst && curtInst.queryCommandAvailable(name)) || + (!curtInst && dojo.widget.Editor2.prototype.queryCommandAvailable(name))){ + oCommand = new dojo.widget.Editor2BrowserCommand(editor, name); + }else{ + dojo.debug("dojo.widget.Editor2Manager.getCommand: Unknown command "+name); + return; + } + } + return oCommand; + }, + destroy: function(){ + // summary: Cleaning up. This is called automatically on page unload. + this._currentInstance = null; + dojo.widget.HandlerManager.prototype.destroy.call(this); + } +}); + +dojo.addOnUnload(dojo.widget.Editor2Manager, "destroy"); + +dojo.lang.declare("dojo.widget.Editor2Command",null, + function(editor,name){ + // summary: + // dojo.widget.Editor2Command is the base class for all commands in Editor2 + + this._editor = editor; + this._updateTime = 0; + this._name = name; + }, +{ + _text: 'Unknown', + execute: function(para){ + // summary: Execute the command. should be implemented in subclass + // description: this function should be re-implemented in subclass + dojo.unimplemented("dojo.widget.Editor2Command.execute"); + }, + getText: function(){ + // summary: return the text name of this command + return this._text; + }, + getState: function(){ + // summary: + // Return the state of the command. The default behavior is + // to always return Enabled + return dojo.widget.Editor2Manager.commandState.Enabled; + }, + destroy: function(){ + // summary: Destructor + } + } +); + +dojo.widget.Editor2BrowserCommandNames={ + 'bold': 'Bold', + 'copy': 'Copy', + 'cut': 'Cut', + 'Delete': 'Delete', + 'indent': 'Indent', + 'inserthorizontalrule': 'Horizental Rule', + 'insertorderedlist': 'Numbered List', + 'insertunorderedlist': 'Bullet List', + 'italic': 'Italic', + 'justifycenter': 'Align Center', + 'justifyfull': 'Justify', + 'justifyleft': 'Align Left', + 'justifyright': 'Align Right', + 'outdent': 'Outdent', + 'paste': 'Paste', + 'redo': 'Redo', + 'removeformat': 'Remove Format', + 'selectall': 'Select All', + 'strikethrough': 'Strikethrough', + 'subscript': 'Subscript', + 'superscript': 'Superscript', + 'underline': 'Underline', + 'undo': 'Undo', + 'unlink': 'Remove Link', + 'createlink': 'Create Link', + 'insertimage': 'Insert Image', + 'htmltoggle': 'HTML Source', + 'forecolor': 'Foreground Color', + 'hilitecolor': 'Background Color', + 'plainformatblock': 'Paragraph Style', + 'formatblock': 'Paragraph Style', + 'fontsize': 'Font Size', + 'fontname': 'Font Name'//, +// 'inserttable': 'Insert Table', +// 'insertcell': +// 'insertcol': +// 'insertrow': +// 'deletecells': +// 'deletecols': +// 'deleterows': +// 'mergecells': +// 'splitcell': +// 'inserthtml': +// 'blockdirltr': +// 'blockdirrtl': +// 'dirltr': +// 'dirrtl': +// 'inlinedirltr': +// 'inlinedirrtl': +} + +dojo.lang.declare("dojo.widget.Editor2BrowserCommand", dojo.widget.Editor2Command, + function(editor,name){ + // summary: + // dojo.widget.Editor2BrowserCommand is the base class for all the browser built + // in commands + + var text = dojo.widget.Editor2BrowserCommandNames[name.toLowerCase()]; + if(text){ + this._text = text; + } + }, +{ + execute: function(para){ + this._editor.execCommand(this._name, para); + }, + getState: function(){ + if(this._editor._lastStateTimestamp > this._updateTime || this._state == undefined){ + this._updateTime = this._editor._lastStateTimestamp; + try{ + if(this._editor.queryCommandEnabled(this._name)){ + if(this._editor.queryCommandState(this._name)){ + this._state = dojo.widget.Editor2Manager.commandState.Latched; + }else{ + this._state = dojo.widget.Editor2Manager.commandState.Enabled; + } + }else{ + this._state = dojo.widget.Editor2Manager.commandState.Disabled; + } + }catch (e) { + //dojo.debug("exception when getting state for command "+this._name+": "+e); + this._state = dojo.widget.Editor2Manager.commandState.Enabled; + } + } + return this._state; + }, + getValue: function(){ + try{ + return this._editor.queryCommandValue(this._name); + }catch(e){} + } + } +); + +dojo.lang.declare("dojo.widget.Editor2FormatBlockCommand", dojo.widget.Editor2BrowserCommand, { + /* In none-ActiveX mode under IE, <p> and no <p> text can not be distinguished + getCurrentValue: function(){ + var curInst = dojo.widget.Editor2Manager.getCurrentInstance(); + if(!curInst){ return ''; } + + var h = dojo.render.html; + + // safari f's us for selection primitives + if(h.safari){ return ''; } + + var selectedNode = (h.ie) ? curInst.document.selection.createRange().parentElement() : curInst.window.getSelection().anchorNode; + // make sure we actuall have an element + while((selectedNode)&&(selectedNode.nodeType != 1)){ + selectedNode = selectedNode.parentNode; + } + if(!selectedNode){ return ''; } + + var formats = ["p", "pre", "h1", "h2", "h3", "h4", "h5", "h6", "address"]; + // gotta run some specialized updates for the various + // formatting options + var type = formats[dojo.lang.find(formats, selectedNode.nodeName.toLowerCase())]; + while((selectedNode!=curInst.editNode)&&(!type)){ + selectedNode = selectedNode.parentNode; + if(!selectedNode){ break; } + type = formats[dojo.lang.find(formats, selectedNode.nodeName.toLowerCase())]; + } + if(!type){ + type = ""; + } + return type; + }*/ + } +); + +dojo.require("dojo.widget.FloatingPane"); +dojo.widget.defineWidget( + "dojo.widget.Editor2Dialog", + [dojo.widget.HtmlWidget, dojo.widget.FloatingPaneBase, dojo.widget.ModalDialogBase], + { + // summary: + // Provides a Dialog which can be modal or normal for the Editor2. + + templatePath: dojo.uri.dojoUri("src/widget/templates/Editor2/EditorDialog.html"), + + // modal: Boolean: Whether this is a modal dialog. True by default. + modal: true, + +// refreshOnShow: true, //for debug for now + + // width: String: Width of the dialog. None by default. + width: "", + + // height: String: Height of the dialog. None by default. + height: "", + + // windowState: String: startup state of the dialog + windowState: "minimized", + + displayCloseAction: true, + + // contentFile: String + // TODO + contentFile: "", + + // contentClass: String + // TODO + contentClass: "", + + fillInTemplate: function(args, frag){ + this.fillInFloatingPaneTemplate(args, frag); + dojo.widget.Editor2Dialog.superclass.fillInTemplate.call(this, args, frag); + }, + postCreate: function(){ + if(this.contentFile){ + dojo.require(this.contentFile); + } + if(this.modal){ + dojo.widget.ModalDialogBase.prototype.postCreate.call(this); + }else{ + with(this.domNode.style) { + zIndex = 999; + display = "none"; + } + } + dojo.widget.FloatingPaneBase.prototype.postCreate.apply(this, arguments); + dojo.widget.Editor2Dialog.superclass.postCreate.call(this); + if(this.width && this.height){ + with(this.domNode.style){ + width = this.width; + height = this.height; + } + } + }, + createContent: function(){ + if(!this.contentWidget && this.contentClass){ + this.contentWidget = dojo.widget.createWidget(this.contentClass); + this.addChild(this.contentWidget); + } + }, + show: function(){ + if(!this.contentWidget){ + //buggy IE: if the dialog is hidden, the button widgets + //in the dialog can not be shown, so show it temporary (as the + //dialog may decide not to show it in loadContent() later) + dojo.widget.Editor2Dialog.superclass.show.apply(this, arguments); + this.createContent(); + dojo.widget.Editor2Dialog.superclass.hide.call(this); + } + + if(!this.contentWidget || !this.contentWidget.loadContent()){ + return; + } + this.showFloatingPane(); + dojo.widget.Editor2Dialog.superclass.show.apply(this, arguments); + if(this.modal){ + this.showModalDialog(); + } + if(this.modal){ + //place the background div under this modal pane + this.bg.style.zIndex = this.domNode.style.zIndex-1; + } + }, + onShow: function(){ + dojo.widget.Editor2Dialog.superclass.onShow.call(this); + this.onFloatingPaneShow(); + }, + closeWindow: function(){ + this.hide(); + dojo.widget.Editor2Dialog.superclass.closeWindow.apply(this, arguments); + }, + hide: function(){ + if(this.modal){ + this.hideModalDialog(); + } + dojo.widget.Editor2Dialog.superclass.hide.call(this); + }, + //modified from ModalDialogBase.checkSize to call _sizeBackground conditionally + checkSize: function(){ + if(this.isShowing()){ + if(this.modal){ + this._sizeBackground(); + } + this.placeModalDialog(); + this.onResized(); + } + } + } +); + +dojo.widget.defineWidget( + "dojo.widget.Editor2DialogContent", + dojo.widget.HtmlWidget, +{ + // summary: + // dojo.widget.Editor2DialogContent is the actual content of a Editor2Dialog. + // This class should be subclassed to provide the content. + + widgetsInTemplate: true, + + loadContent:function(){ + // summary: Load the content. Called by Editor2Dialog when first shown + return true; + }, + cancel: function(){ + // summary: Default handler when cancel button is clicked. + this.parent.hide(); + } +}); + +dojo.lang.declare("dojo.widget.Editor2DialogCommand", dojo.widget.Editor2BrowserCommand, + function(editor, name, dialogParas){ + // summary: + // Provides an easy way to popup a dialog when + // the command is executed. + this.dialogParas = dialogParas; + }, +{ + execute: function(){ + if(!this.dialog){ + if(!this.dialogParas.contentFile || !this.dialogParas.contentClass){ + alert("contentFile and contentClass should be set for dojo.widget.Editor2DialogCommand.dialogParas!"); + return; + } + this.dialog = dojo.widget.createWidget("Editor2Dialog", this.dialogParas); + + dojo.body().appendChild(this.dialog.domNode); + + dojo.event.connect(this, "destroy", this.dialog, "destroy"); + } + this.dialog.show(); + }, + getText: function(){ + return this.dialogParas.title || dojo.widget.Editor2DialogCommand.superclass.getText.call(this); + } +}); + +dojo.widget.Editor2ToolbarGroups = { + // summary: keeping track of all available share toolbar groups +}; + +dojo.widget.defineWidget( + "dojo.widget.Editor2", + dojo.widget.RichText, + function(){ + this._loadedCommands={}; + }, + { + // summary: + // dojo.widget.Editor2 is the WYSIWYG editor in dojo with toolbar. It supports a plugin + // framework which can be used to extend the functionalities of the editor, such as + // adding a context menu, table operation etc. + // description: + // Plugins are available using dojo's require syntax. Please find available built-in plugins + // under src/widget/Editor2Plugin. + +// // saveUrl: String: url to which save action should send content to +// saveUrl: "", +// // saveMethod: String: HTTP method for save (post or get) +// saveMethod: "post", +// saveArgName: "editorContent", +// closeOnSave: false, + + // toolbarAlwaysVisible: Boolean: Whether the toolbar should scroll to keep it in the view + toolbarAlwaysVisible: false, + +// htmlEditing: false, + + toolbarWidget: null, + scrollInterval: null, + + // toolbarTemplatePath: dojo.uri.Uri + // to specify the template file for the toolbar + toolbarTemplatePath: dojo.uri.dojoUri("src/widget/templates/EditorToolbarOneline.html"), + + // toolbarTemplateCssPath: dojo.uri.Uri + // to specify the css file for the toolbar + toolbarTemplateCssPath: null, + + // toolbarPlaceHolder: String + // element id to specify where to attach the toolbar + toolbarPlaceHolder: '', + +// toolbarTemplatePath: dojo.uri.dojoUri("src/widget/templates/Editor2/EditorToolbarFCKStyle.html"), +// toolbarTemplateCssPath: dojo.uri.dojoUri("src/widget/templates/Editor2/FCKDefault/EditorToolbarFCKStyle.css"), + + _inSourceMode: false, + _htmlEditNode: null, + + // toolbarGroup: String: + // This instance of editor will share the same toolbar with other editor with the same toolbarGroup. + // By default, toolbarGroup is empty and standalone toolbar is used for this instance. + toolbarGroup: '', + + // shareToolbar: Boolean: Whether to share toolbar with other instances of Editor2. Deprecated in favor of toolbarGroup + shareToolbar: false, + + // contextMenuGroupSet: String: specify which context menu set should be used for this instance. Include ContextMenu plugin to use this + contextMenuGroupSet: '', + + editorOnLoad: function(){ + // summary: + // Create toolbar and other initialization routines. This is called after + // the finish of the loading of document in the editing element +// dojo.profile.start("dojo.widget.Editor2::editorOnLoad"); + + dojo.event.topic.publish("dojo.widget.Editor2::preLoadingToolbar", this); + if(this.toolbarAlwaysVisible){ + dojo.require("dojo.widget.Editor2Plugin.AlwaysShowToolbar"); + } + + if(this.toolbarWidget){ + this.toolbarWidget.show(); + //re-add the toolbar to the new domNode (caused by open() on another element) + dojo.html.insertBefore(this.toolbarWidget.domNode, this.domNode.firstChild); + }else{ + if(this.shareToolbar){ + dojo.deprecated("Editor2:shareToolbar is deprecated in favor of toolbarGroup", "0.5"); + this.toolbarGroup = 'defaultDojoToolbarGroup'; + } + if(this.toolbarGroup){ + if(dojo.widget.Editor2ToolbarGroups[this.toolbarGroup]){ + this.toolbarWidget = dojo.widget.Editor2ToolbarGroups[this.toolbarGroup]; + } + } + if(!this.toolbarWidget){ + var tbOpts = {shareGroup: this.toolbarGroup, parent: this}; + tbOpts.templatePath = this.toolbarTemplatePath; + if(this.toolbarTemplateCssPath){ + tbOpts.templateCssPath = this.toolbarTemplateCssPath; + } + if(this.toolbarPlaceHolder){ + this.toolbarWidget = dojo.widget.createWidget("Editor2Toolbar", tbOpts, dojo.byId(this.toolbarPlaceHolder), "after"); + }else{ + this.toolbarWidget = dojo.widget.createWidget("Editor2Toolbar", tbOpts, this.domNode.firstChild, "before"); + } + if(this.toolbarGroup){ + dojo.widget.Editor2ToolbarGroups[this.toolbarGroup] = this.toolbarWidget; + } + dojo.event.connect(this, "close", this.toolbarWidget, "hide"); + + this.toolbarLoaded(); + } + } + + dojo.event.topic.registerPublisher("Editor2.clobberFocus", this, "clobberFocus"); + dojo.event.topic.subscribe("Editor2.clobberFocus", this, "setBlur"); + + dojo.event.topic.publish("dojo.widget.Editor2::onLoad", this); +// dojo.profile.end("dojo.widget.Editor2::editorOnLoad"); + }, + + //event for plugins to use + toolbarLoaded: function(){ + // summary: + // Fired when the toolbar for this editor is created. + // This event is for plugins to use + }, + + //TODO: provide a query mechanism about loaded plugins? + registerLoadedPlugin: function(/*Object*/obj){ + // summary: Register a plugin which is loaded for this instance + if(!this.loadedPlugins){ + this.loadedPlugins = []; + } + this.loadedPlugins.push(obj); + }, + unregisterLoadedPlugin: function(/*Object*/obj){ + // summary: Delete a loaded plugin for this instance + for(var i in this.loadedPlugins){ + if(this.loadedPlugins[i] === obj){ + delete this.loadedPlugins[i]; + return; + } + } + dojo.debug("dojo.widget.Editor2.unregisterLoadedPlugin: unknow plugin object: "+obj); + }, + + //overload the original ones to provide extra commands + execCommand: function(/*String*/command, argument){ + switch(command.toLowerCase()){ + case 'htmltoggle': + this.toggleHtmlEditing(); + break; + default: + dojo.widget.Editor2.superclass.execCommand.apply(this, arguments); + } + }, + queryCommandEnabled: function(/*String*/command, argument){ + switch(command.toLowerCase()){ + case 'htmltoggle': + return true; + default: + if(this._inSourceMode){ return false;} + return dojo.widget.Editor2.superclass.queryCommandEnabled.apply(this, arguments); + } + }, + queryCommandState: function(/*String*/command, argument){ + switch(command.toLowerCase()){ + case 'htmltoggle': + return this._inSourceMode; + default: + return dojo.widget.Editor2.superclass.queryCommandState.apply(this, arguments); + } + }, + + onClick: function(/*Event*/e){ + dojo.widget.Editor2.superclass.onClick.call(this, e); + //if Popup is used, call dojo.widget.PopupManager.onClick + //manually when click in the editing area to close all + //open popups (dropdowns) + if(dojo.widget.PopupManager){ + if(!e){ //IE + e = this.window.event; + } + dojo.widget.PopupManager.onClick(e); + } + }, + + clobberFocus: function(){ + // summary: stub to signal other instances to clobber focus + }, + toggleHtmlEditing: function(){ + // summary: toggle between WYSIWYG mode and HTML source mode + if(this===dojo.widget.Editor2Manager.getCurrentInstance()){ + if(!this._inSourceMode){ + var html = this.getEditorContent(); + this._inSourceMode = true; + + if(!this._htmlEditNode){ + this._htmlEditNode = dojo.doc().createElement("textarea"); + dojo.html.insertAfter(this._htmlEditNode, this.editorObject); + } + + this._htmlEditNode.style.display = ""; + this._htmlEditNode.style.width = "100%"; + this._htmlEditNode.style.height = dojo.html.getBorderBox(this.editNode).height+"px"; + this._htmlEditNode.value = html; + + //activeX object (IE) doesn't like to be hidden, so move it outside of screen instead + with(this.editorObject.style){ + position = "absolute"; + left = "-2000px"; + top = "-2000px"; + } + }else{ + this._inSourceMode = false; + + //In IE activeX mode, if _htmlEditNode is focused, + //when toggling, an error would occur, so unfocus it + this._htmlEditNode.blur(); + + with(this.editorObject.style){ + position = ""; + left = ""; + top = ""; + } + var html = this._htmlEditNode.value; + + dojo.lang.setTimeout(this, "replaceEditorContent", 1, html); + this._htmlEditNode.style.display = "none"; + this.focus(); + } + this.onDisplayChanged(null, true); + } + }, + + setFocus: function(){ + // summary: focus is set on this instance +// dojo.debug("setFocus: start "+this.widgetId); + if(dojo.widget.Editor2Manager.getCurrentInstance() === this){ return; } + + this.clobberFocus(); +// dojo.debug("setFocus:", this); + dojo.widget.Editor2Manager.setCurrentInstance(this); + }, + + setBlur: function(){ + // summary: focus on this instance is lost +// dojo.debug("setBlur:", this); + //dojo.event.disconnect(this.toolbarWidget, "exec", this, "execCommand"); + }, + + saveSelection: function(){ + // summary: save the current selection for restoring it + this._bookmark = null; + this._bookmark = dojo.withGlobal(this.window, dojo.html.selection.getBookmark); + }, + restoreSelection: function(){ + // summary: restore the last saved selection + if(this._bookmark){ + this.focus(); //require for none-activeX IE + dojo.withGlobal(this.window, "moveToBookmark", dojo.html.selection, [this._bookmark]); + this._bookmark = null; + }else{ + dojo.debug("restoreSelection: no saved selection is found!"); + } + }, + + _updateToolbarLastRan: null, + _updateToolbarTimer: null, + _updateToolbarFrequency: 500, + + updateToolbar: function(/*Boolean*/force){ + // summary: update the associated toolbar of this Editor2 + if((!this.isLoaded)||(!this.toolbarWidget)){ return; } + + // keeps the toolbar from updating too frequently + // TODO: generalize this functionality? + var diff = new Date() - this._updateToolbarLastRan; + if( (!force)&&(this._updateToolbarLastRan)&& + ((diff < this._updateToolbarFrequency)) ){ + + clearTimeout(this._updateToolbarTimer); + var _this = this; + this._updateToolbarTimer = setTimeout(function() { + _this.updateToolbar(); + }, this._updateToolbarFrequency/2); + return; + + }else{ + this._updateToolbarLastRan = new Date(); + } + // end frequency checker + + //IE has the habit of generating events even when this editor is blurred, prevent this + if(dojo.widget.Editor2Manager.getCurrentInstance() !== this){ return; } + + this.toolbarWidget.update(); + }, + + destroy: function(/*Boolean*/finalize){ + this._htmlEditNode = null; + dojo.event.disconnect(this, "close", this.toolbarWidget, "hide"); + if(!finalize){ + this.toolbarWidget.destroy(); + } + dojo.widget.Editor2.superclass.destroy.call(this); + }, + + _lastStateTimestamp: 0, + onDisplayChanged: function(/*Object*/e, /*Boolean*/forceUpdate){ + this._lastStateTimestamp = (new Date()).getTime(); + dojo.widget.Editor2.superclass.onDisplayChanged.call(this,e); + this.updateToolbar(forceUpdate); + }, + + onLoad: function(){ + try{ + dojo.widget.Editor2.superclass.onLoad.call(this); + }catch(e){ // FIXME: debug why this is throwing errors in IE! + dojo.debug(e); + } + this.editorOnLoad(); + }, + + onFocus: function(){ + dojo.widget.Editor2.superclass.onFocus.call(this); + this.setFocus(); + }, + + //overload to support source editing mode + getEditorContent: function(){ + if(this._inSourceMode){ + return this._htmlEditNode.value; + } + return dojo.widget.Editor2.superclass.getEditorContent.call(this); + }, + + replaceEditorContent: function(html){ + if(this._inSourceMode){ + this._htmlEditNode.value = html; + return; + } + dojo.widget.Editor2.superclass.replaceEditorContent.apply(this,arguments); + }, + getCommand: function(/*String*/name){ + // summary: return a command associated with this instance of editor + if(this._loadedCommands[name]){ + return this._loadedCommands[name]; + } + var cmd = dojo.widget.Editor2Manager.getCommand(this, name); + this._loadedCommands[name] = cmd; + return cmd; + }, + // Array: Commands shortcuts. Each element can has up to 3 fields: + // 1. String: the name of the command + // 2. String Optional: the char for shortcut key, by default the first char from the command name is used + // 3. Int Optional: specify the modifier of the shortcut, by default ctrl is used + shortcuts: [['bold'],['italic'],['underline'],['selectall','a'],['insertunorderedlist','\\']], + setupDefaultShortcuts: function(){ + // summary: setup default shortcuts using Editor2 commands + var exec = function(cmd){ return function(){ cmd.execute(); } }; +// if(!dojo.render.html.ie){ +// this.shortcuts.push(['redo','Z']); +// } + var self = this; + dojo.lang.forEach(this.shortcuts, function(item){ + var cmd = self.getCommand(item[0]); + if(cmd){ + self.addKeyHandler(item[1]?item[1]:item[0].charAt(0), item[2]==undefined?self.KEY_CTRL:item[2], exec(cmd)); + } + }); +// this.addKeyHandler("s", ctrl, function () { this.save(true); }); + } + /*, + // FIXME: probably not needed any more with new design, but need to verify + _save: function(e){ + // FIXME: how should this behave when there's a larger form in play? + if(!this.isClosed){ + dojo.debug("save attempt"); + if(this.saveUrl.length){ + var content = {}; + content[this.saveArgName] = this.getEditorContent(); + dojo.io.bind({ + method: this.saveMethod, + url: this.saveUrl, + content: content + }); + }else{ + dojo.debug("please set a saveUrl for the editor"); + } + if(this.closeOnSave){ + this.close(e.getName().toLowerCase() == "save"); + } + } + }*/ + } +); \ No newline at end of file Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2.js ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2.js ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/AlwaysShowToolbar.js URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/AlwaysShowToolbar.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/AlwaysShowToolbar.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/AlwaysShowToolbar.js Mon Feb 19 09:56:06 2007 @@ -0,0 +1,145 @@ +/* + Copyright (c) 2004-2006, The Dojo Foundation + All Rights Reserved. + + Licensed under the Academic Free License version 2.1 or above OR the + modified BSD license. For more information on Dojo licensing, see: + + http://dojotoolkit.org/community/licensing.shtml +*/ + +dojo.provide("dojo.widget.Editor2Plugin.AlwaysShowToolbar"); + +//dojo.widget.Editor2Manager.registerPerInstancePlugin("dojo.widget.Editor2Plugin.AlwaysShowToolbar"); + +dojo.event.topic.subscribe("dojo.widget.Editor2::onLoad", function(editor){ + if(editor.toolbarAlwaysVisible){ + var p = new dojo.widget.Editor2Plugin.AlwaysShowToolbar(editor); + } +}); +dojo.declare("dojo.widget.Editor2Plugin.AlwaysShowToolbar", null, + function(editor){ + this.editor = editor; + this.editor.registerLoadedPlugin(this); + this.setup(); + }, + { + _scrollSetUp: false, + _fixEnabled: false, + _scrollThreshold: false, + _handleScroll: true, + + setup: function(){ + var tdn = this.editor.toolbarWidget; + if(!tdn.tbBgIframe){ + tdn.tbBgIframe = new dojo.html.BackgroundIframe(tdn.domNode); + tdn.tbBgIframe.onResized(); + } + this.scrollInterval = setInterval(dojo.lang.hitch(this, "globalOnScrollHandler"), 100); + + dojo.event.connect("before", this.editor.toolbarWidget, "destroy", this, "destroy"); + }, + + globalOnScrollHandler: function(){ + var isIE = dojo.render.html.ie; + if(!this._handleScroll){ return; } + var dh = dojo.html; + var tdn = this.editor.toolbarWidget.domNode; + var db = dojo.body(); + + if(!this._scrollSetUp){ + this._scrollSetUp = true; + var editorWidth = dh.getMarginBox(this.editor.domNode).width; + this._scrollThreshold = dh.abs(tdn, true).y; + // dojo.debug("threshold:", this._scrollThreshold); + if((isIE)&&(db)&&(dh.getStyle(db, "background-image")=="none")){ + with(db.style){ + backgroundImage = "url(" + dojo.uri.dojoUri("src/widget/templates/images/blank.gif") + ")"; + backgroundAttachment = "fixed"; + } + } + } + + var scrollPos = (window["pageYOffset"]) ? window["pageYOffset"] : (document["documentElement"]||document["body"]).scrollTop; + + // FIXME: need to have top and bottom thresholds so toolbar doesn't keep scrolling past the bottom + if(scrollPos > this._scrollThreshold){ + // dojo.debug(scrollPos); + if(!this._fixEnabled){ + var tdnbox = dojo.html.getMarginBox(tdn); + this.editor.editorObject.style.marginTop = tdnbox.height+"px"; + + if(isIE){ + // FIXME: should we just use setBehvior() here instead? + tdn.style.left = dojo.html.abs(tdn, dojo.html.boxSizing.MARGIN_BOX).x; + if(tdn.previousSibling){ + this._IEOriginalPos = ['after',tdn.previousSibling]; + }else if(tdn.nextSibling){ + this._IEOriginalPos = ['before',tdn.nextSibling]; + }else{ + this._IEOriginalPos = ['',tdn.parentNode]; + } + dojo.body().appendChild(tdn); + + dojo.html.addClass(tdn, "IEFixedToolbar"); + }else{ + with(tdn.style){ + position = "fixed"; + top = "0px"; + } + } + + tdn.style.width = tdnbox.width + "px"; + tdn.style.zIndex = 1000; + this._fixEnabled = true; + } + // if we're showing the floating toolbar, make sure that if + // we've scrolled past the bottom of the editor that we hide + // the toolbar for this instance of the editor. + + // TODO: when we get multiple editor toolbar support working + // correctly, ensure that we check this against the scroll + // position of the bottom-most editor instance. + if(!dojo.render.html.safari){ + // safari reports a bunch of things incorrectly here + var eHeight = (this.height) ? parseInt(this.editor.height) : this.editor._lastHeight; + if(scrollPos > (this._scrollThreshold+eHeight)){ + tdn.style.display = "none"; + }else{ + tdn.style.display = ""; + } + } + }else if(this._fixEnabled){ + (this.editor.object || this.editor.iframe).style.marginTop = null; + with(tdn.style){ + position = ""; + top = ""; + zIndex = ""; + display = ""; + } + if(isIE){ + tdn.style.left = ""; + dojo.html.removeClass(tdn, "IEFixedToolbar"); + if(this._IEOriginalPos){ + dojo.html.insertAtPosition(tdn, this._IEOriginalPos[1], this._IEOriginalPos[0]); + this._IEOriginalPos = null; + }else{ + dojo.html.insertBefore(tdn, this.editor.object||this.editor.iframe); + } + } + tdn.style.width = ""; + this._fixEnabled = false; + } + }, + + destroy: function(){ + this._IEOriginalPos = null; + this._handleScroll = false; + clearInterval(this.scrollInterval); + this.editor.unregisterLoadedPlugin(this); + + if(dojo.render.html.ie){ + dojo.html.removeClass(this.editor.toolbarWidget.domNode, "IEFixedToolbar"); + } + } +}); \ No newline at end of file Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/AlwaysShowToolbar.js ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/AlwaysShowToolbar.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/AlwaysShowToolbar.js ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/ContextMenu.js URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/ContextMenu.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/ContextMenu.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/ContextMenu.js Mon Feb 19 09:56:06 2007 @@ -0,0 +1,278 @@ +/* + Copyright (c) 2004-2006, The Dojo Foundation + All Rights Reserved. + + Licensed under the Academic Free License version 2.1 or above OR the + modified BSD license. For more information on Dojo licensing, see: + + http://dojotoolkit.org/community/licensing.shtml +*/ + +dojo.provide("dojo.widget.Editor2Plugin.ContextMenu"); + +// summary: dojo.widget.Editor2Plugin.ContextMenu provides context menu for Editor2 widget +// description: +// This plugin should be dojo.required-ed before all other plugins which +// support contextmenu, otherwise the menu for that plugin won't be shown +// For each Editor2, what will appear in its context menu can be set by changing +// Editor2.contextMenuGroupSet property (by default it is empty, which means use the +// default contextMenu). A contextMenuGroupSet has to be registered by calling +// dojo.widget.Editor2Plugin.ContextMenuManager.registerGroupSet() +// All Editor2 with the same contextMenuGroupSet will share the same ContextMenu + +dojo.require("dojo.widget.Menu2"); + +dojo.event.topic.subscribe("dojo.widget.Editor2::onLoad", function(editor){ + dojo.widget.Editor2Plugin.ContextMenuManager.getContextMenu(editor); +// var p = new dojo.widget.Editor2Plugin.ContextMenu(); +}); + +dojo.widget.Editor2Plugin.ContextMenuManager = { + menuGroups: ['Generic', 'Link', 'Anchor', 'Image', 'List', 'Table'], + _contextMenuGroupSets: {}, + _registeredGroups: {}, + _menus: {}, + registerGroup: function(name, handler){ + if(this._registeredGroups[name]){ + alert("dojo.widget.Editor2Plugin.ContextMenuManager.registerGroup: menu group "+name+"is already registered. Ignored."); + return; + } + this._registeredGroups[name] = handler; + }, + removeGroup: function(name){ + delete this._registeredGroups[name]; + }, + getGroup: function(name, contextmenuplugin){ + if(this._registeredGroups[name]){ + var item = this._registeredGroups[name](name, contextmenuplugin); + if(item){ + return item; + } + } + switch(name){ + case 'Generic': + case 'Link': + case 'Image': + return new dojo.widget.Editor2Plugin[name+"ContextMenuGroup"](contextmenuplugin); + //TODO + case 'Anchor': + case 'List': + } + }, + registerGroupSet: function(/*String*/name, /*Array*/set){ + // summary: register a group set + // name: name of the group set + // set: an array of groups, such as ['Generic','Link'] + this._contextMenuGroupSets[name] = set; + }, + removeGroupSet: function(name){ + var set = this._contextMenuGroupSets[name]; + delete this._contextMenuGroupSets[name]; + return set; + }, + getContextMenu: function(editor){ + var set = editor.contextMenuGroupSet || 'defaultDojoEditor2MenuGroupSet'; + if(this._menus[set]){ + this._menus[set].bindEditor(editor); + return this._menus[set]; + } + + var gs = (editor.contextMenuGroupSet && this._contextMenuGroupSets[editor.contextMenuGroupSet]) || this.menuGroups; + var menu = new dojo.widget.Editor2Plugin.ContextMenu(editor, gs); + this._menus[set] = menu; + return menu; + } +}; + +dojo.declare("dojo.widget.Editor2Plugin.ContextMenu", null, + function(editor, gs){ + this.groups = []; + this.separators = []; + this.editor = editor; + this.editor.registerLoadedPlugin(this); + this.contextMenu = dojo.widget.createWidget("PopupMenu2", {}); + dojo.body().appendChild(this.contextMenu.domNode); + this.bindEditor(this.editor); + + dojo.event.connect(this.contextMenu, "aboutToShow", this, "aboutToShow"); + dojo.event.connect(this.editor, "destroy", this, "destroy"); + + this.setup(gs); + }, + { + bindEditor: function(editor){ + this.contextMenu.bindDomNode(editor.document.body); + }, + setup: function(gs){ + for(var i in gs){ + var g = dojo.widget.Editor2Plugin.ContextMenuManager.getGroup(gs[i], this); + if(g){ + this.groups.push(g); + } + } + }, + aboutToShow: function(){ + var first = true; + for(var i in this.groups){ + if(i>0 && this.separators.length != this.groups.length-1){ + this.separators.push(dojo.widget.createWidget("MenuSeparator2", {})); + this.contextMenu.addChild(this.separators[this.separators.length-1]); + } + if(this.groups[i].refresh()){ + if(i>0){ + if(first){ + this.separators[i-1].hide(); + }else{ + this.separators[i-1].show(); + } + } + if(first){ first = false; } + }else{ + if(i>0){ + this.separators[i-1].hide(); + } + } + } + }, + destroy: function(){ + this.editor.unregisterLoadedPlugin(this); + delete this.groups; + delete this.separators; + this.contextMenu.destroy(); + delete this.contextMenu; + } +}); + +dojo.widget.defineWidget( + "dojo.widget.Editor2ContextMenuItem", + dojo.widget.MenuItem2, +{ + command: '', + buildRendering: function(){ + var curInst = dojo.widget.Editor2Manager.getCurrentInstance(); + this.caption = curInst.getCommand(this.command).getText(); + + dojo.widget.Editor2ContextMenuItem.superclass.buildRendering.apply(this, arguments); + }, + onClick: function(){ + var curInst = dojo.widget.Editor2Manager.getCurrentInstance(); + if(curInst){ + var _command = curInst.getCommand(this.command); + if(_command){ + _command.execute(); + } + } + }, + refresh: function(){ + var curInst = dojo.widget.Editor2Manager.getCurrentInstance(); + if(curInst){ + var _command = curInst.getCommand(this.command); + if(_command){ + if(_command.getState() == dojo.widget.Editor2Manager.commandState.Disabled){ + this.disable(); + return false; + }else{ + this.enable(); + return true; + } + } + } + }, + //improve performance by skipping animation + hide: function(){ + this.domNode.style.display = "none"; + }, + show: function(){ + this.domNode.style.display = ""; + } +}); +dojo.declare("dojo.widget.Editor2Plugin.SimpleContextMenuGroup", null, + function(contextmenuplugin){ + this.contextMenu = contextmenuplugin.contextMenu; + this.items = []; + + dojo.event.connect(contextmenuplugin, "destroy", this, "destroy"); + }, + { + refresh: function(){ + if(!this.items.length){ + this.createItems(); + for(var i in this.items){ + this.contextMenu.addChild(this.items[i]); + } + } + + return this.checkVisibility(); + }, + destroy: function(){ + this.contextmenu = null; + delete this.items; + delete this.contextMenu; + }, + //implement this to fill in the menu items + createItems: function(){ }, + + //overload this to show/hide items + checkVisibility: function(){ + var show = false; + for(var i in this.items){ + show = show || this.items[i].refresh(); + } + var action = show ? "show" : "hide"; + for(var i in this.items){ + this.items[i][action](); + } + return show; + } +}); +dojo.declare("dojo.widget.Editor2Plugin.GenericContextMenuGroup", + dojo.widget.Editor2Plugin.SimpleContextMenuGroup, +{ + createItems: function(){ + this.items.push(dojo.widget.createWidget("Editor2ContextMenuItem", {command: "cut", iconClass: "dojoE2TBIcon dojoE2TBIcon_Cut"})); + this.items.push(dojo.widget.createWidget("Editor2ContextMenuItem", {command: "copy", iconClass: "dojoE2TBIcon dojoE2TBIcon_Copy"})); + this.items.push(dojo.widget.createWidget("Editor2ContextMenuItem", {command: "paste", iconClass: "dojoE2TBIcon dojoE2TBIcon_Paste"})); + } +}); +dojo.declare("dojo.widget.Editor2Plugin.LinkContextMenuGroup", + dojo.widget.Editor2Plugin.SimpleContextMenuGroup, +{ + createItems: function(){ + this.items.push(dojo.widget.createWidget("Editor2ContextMenuItem", {command: 'createlink', iconClass: "dojoE2TBIcon dojoE2TBIcon_Link"})); + this.items.push(dojo.widget.createWidget("Editor2ContextMenuItem", {command: 'unlink', iconClass: "dojoE2TBIcon dojoE2TBIcon_UnLink"})); + }, + checkVisibility: function(){ + var show = this.items[1].refresh(); + if(show){ + this.items[0].refresh(); + for(var i in this.items){ + this.items[i].show(); + } + }else{ + for(var i in this.items){ + this.items[i].hide(); + } + } + + return show; + } +}); +dojo.declare("dojo.widget.Editor2Plugin.ImageContextMenuGroup", + dojo.widget.Editor2Plugin.SimpleContextMenuGroup, +{ + createItems: function(){ + this.items.push(dojo.widget.createWidget("Editor2ContextMenuItem", {command: 'insertimage', iconClass: "dojoE2TBIcon dojoE2TBIcon_Image"})); + }, + checkVisibility: function(){ + var curInst = dojo.widget.Editor2Manager.getCurrentInstance(); + var img = dojo.withGlobal(curInst.window, "getSelectedElement", dojo.html.selection); + + if(img && img.tagName.toLowerCase() == 'img'){ + this.items[0].show(); + return true; + }else{ + this.items[0].hide(); + return false; + } + } +}); \ No newline at end of file Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/ContextMenu.js ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/ContextMenu.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/ContextMenu.js ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/CreateLinkDialog.js URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/CreateLinkDialog.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/CreateLinkDialog.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/CreateLinkDialog.js Mon Feb 19 09:56:06 2007 @@ -0,0 +1,78 @@ +/* + Copyright (c) 2004-2006, The Dojo Foundation + All Rights Reserved. + + Licensed under the Academic Free License version 2.1 or above OR the + modified BSD license. For more information on Dojo licensing, see: + + http://dojotoolkit.org/community/licensing.shtml +*/ + +dojo.provide("dojo.widget.Editor2Plugin.CreateLinkDialog"); + +dojo.widget.defineWidget( + "dojo.widget.Editor2CreateLinkDialog", + dojo.widget.Editor2DialogContent, +{ + templatePath: dojo.uri.dojoUri("src/widget/templates/Editor2/Dialog/createlink.html"), + + editableAttributes: ['href', 'target', 'class'], + loadContent: function(){ + var curInst = dojo.widget.Editor2Manager.getCurrentInstance(); + + curInst.saveSelection(); //save selection (none-activeX IE) + + this.linkNode = dojo.withGlobal(curInst.window, "getAncestorElement", dojo.html.selection, ['a']); + var linkAttributes = {}; + this.extraAttribText = ""; + if(this.linkNode){ + var attrs = this.linkNode.attributes; + for(var i=0; i<attrs.length; i++) { + if(dojo.lang.find(this.editableAttributes, attrs[i].name.toLowerCase())>-1){ + linkAttributes[attrs[i].name] = attrs[i].value; + }else{ + //IE lists all attributes, even default ones, filter them + if(attrs[i].specified == undefined || attrs[i].specified){ + this.extraAttribText += attrs[i].name + '="'+attrs[i].value+'" '; + } + } + } + }else{ + var html = dojo.withGlobal(curInst.window, "getSelectedText", dojo.html.selection); + if(html == null || html.length == 0){ + alert("Please select some text to create a link."); + return false;//do not show the dialog + } + } + + for(var i=0; i<this.editableAttributes.length; ++i){ + name = this.editableAttributes[i]; + this["link_"+name].value = (linkAttributes[name] == undefined) ? "" : linkAttributes[name] ; + } + return true; + }, + ok: function(){ + var curInst = dojo.widget.Editor2Manager.getCurrentInstance(); + curInst.restoreSelection(); //restore previous selection, required for none-activeX IE + + if(!this.linkNode){ + var html = dojo.withGlobal(curInst.window, "getSelectedHtml", dojo.html.selection); + }else{ + var html = this.linkNode.innerHTML; + dojo.withGlobal(curInst.window, "selectElement", dojo.html.selection, [this.linkNode]); + } + + var attstr=''; + for(var i=0; i<this.editableAttributes.length; ++i){ + name = this.editableAttributes[i]; + var value = this["link_"+name].value; + if(value.length > 0){ + attstr += name + '="'+value+'" '; + } + } + + curInst.execCommand('inserthtml', '<a '+attstr+this.extraAttribText+'>'+html+'</a>'); + + this.cancel(); + } +}); \ No newline at end of file Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/CreateLinkDialog.js ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/CreateLinkDialog.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/CreateLinkDialog.js ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/FindReplace.js URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/FindReplace.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/FindReplace.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/FindReplace.js Mon Feb 19 09:56:06 2007 @@ -0,0 +1,84 @@ +/* + Copyright (c) 2004-2006, The Dojo Foundation + All Rights Reserved. + + Licensed under the Academic Free License version 2.1 or above OR the + modified BSD license. For more information on Dojo licensing, see: + + http://dojotoolkit.org/community/licensing.shtml +*/ + +dojo.provide("dojo.widget.Editor2Plugin.FindReplace"); + +dojo.require("dojo.widget.Editor2"); + +//TODO replace, better GUI + +dojo.declare("dojo.widget.Editor2Plugin.FindCommand", dojo.widget.Editor2DialogCommand,{ + SearchOption: { + CaseSensitive: 4, + SearchBackwards: 64, + WholeWord: 2, + WrapSearch: 128 + }, + find: function(text, option){ + this._editor.focus(); + if(window.find){ //moz + this._editor.window.find(text, + option & this.SearchOption.CaseSensitive ? true : false, + option & this.SearchOption.SearchBackwards ? true : false, + option & this.SearchOption.WrapSearch ? true : false, + option & this.SearchOption.WholeWord ? true : false + ); + }else if(dojo.body().createTextRange){ //IE + var range = this._editor.document.body.createTextRange(); + var found = range.findText(text, (option&this.SearchOption.SearchBackwards)?1:-1, option ); + if(found){ + range.scrollIntoView() ; + range.select() ; + }else{ + alert("Can not find "+text+" in the document"); + } + }else{ + alert("No idea how to search in this browser. Please submit patch if you know."); + } + }, + getText: function(){ + return 'Find'; + } +}); + +dojo.widget.Editor2Plugin.FindReplace ={ + getCommand: function(editor, name){ + var name = name.toLowerCase(); + var command; + if(name == 'find'){ + command = new dojo.widget.Editor2Plugin.FindCommand(editor, 'find', + {contentFile: "dojo.widget.Editor2Plugin.FindReplaceDialog", + contentClass: "Editor2FindDialog", + title: "Find", width: "350px", height: "150px", modal: false}); + }else if(name == 'replace') { + command = new dojo.widget.Editor2DialogCommand(editor, 'replace', + {contentFile: "dojo.widget.Editor2Plugin.FindReplaceDialog", + contentClass: "Editor2ReplaceDialog", + href: dojo.uri.dojoUri("src/widget/templates/Editor2/Dialog/replace.html"), + title: "Replace", width: "350px", height: "200px", modal: false}); + } + + return command; + }, + getToolbarItem: function(name){ + var name = name.toLowerCase(); + + var item; + if(name == 'replace'){ + item = new dojo.widget.Editor2ToolbarButton('Replace'); + }else if(name == 'find') { + item = new dojo.widget.Editor2ToolbarButton('Find'); + } + + return item; + } +} +dojo.widget.Editor2Manager.registerHandler(dojo.widget.Editor2Plugin.FindReplace.getCommand); +dojo.widget.Editor2ToolbarItemManager.registerHandler(dojo.widget.Editor2Plugin.FindReplace.getToolbarItem); \ No newline at end of file Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/FindReplace.js ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/FindReplace.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/FindReplace.js ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/FindReplaceDialog.js URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/FindReplaceDialog.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/FindReplaceDialog.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/FindReplaceDialog.js Mon Feb 19 09:56:06 2007 @@ -0,0 +1,50 @@ +/* + Copyright (c) 2004-2006, The Dojo Foundation + All Rights Reserved. + + Licensed under the Academic Free License version 2.1 or above OR the + modified BSD license. For more information on Dojo licensing, see: + + http://dojotoolkit.org/community/licensing.shtml +*/ + +dojo.provide("dojo.widget.Editor2Plugin.FindReplaceDialog"); + +dojo.widget.defineWidget( + "dojo.widget.Editor2FindDialog", + dojo.widget.Editor2DialogContent, +{ + templatePath: dojo.uri.dojoUri("src/widget/templates/Editor2/Dialog/find.html"), + + find: function(){ + var curInst = dojo.widget.Editor2Manager.getCurrentInstance(); + var findcmd = curInst.getCommand('find'); + var option = 0; + + if(this["find_option_casesens"].checked){ + option |= findcmd.SearchOption.CaseSensitive; + } + if(this["find_option_backwards"].checked){ + option |= findcmd.SearchOption.SearchBackwards; + } + + if(this["find_option_wholeword"].checked){ + option |= findcmd.SearchOption.WholeWord; + } + findcmd.find(this["find_text"].value, option); + } +}); + +dojo.widget.defineWidget( + "dojo.widget.Editor2ReplaceDialog", + dojo.widget.Editor2DialogContent, +{ + templatePath: dojo.uri.dojoUri("src/widget/templates/Editor2/Dialog/replace.html"), + + replace: function(){ + alert("not implemented yet"); + }, + replaceAll: function(){ + alert("not implemented yet"); + } +}); \ No newline at end of file Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/FindReplaceDialog.js ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/FindReplaceDialog.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/FindReplaceDialog.js ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/InsertImageDialog.js URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/InsertImageDialog.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/InsertImageDialog.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/InsertImageDialog.js Mon Feb 19 09:56:06 2007 @@ -0,0 +1,64 @@ +/* + Copyright (c) 2004-2006, The Dojo Foundation + All Rights Reserved. + + Licensed under the Academic Free License version 2.1 or above OR the + modified BSD license. For more information on Dojo licensing, see: + + http://dojotoolkit.org/community/licensing.shtml +*/ + +dojo.provide("dojo.widget.Editor2Plugin.InsertImageDialog"); + +dojo.widget.defineWidget( + "dojo.widget.Editor2InsertImageDialog", + dojo.widget.Editor2DialogContent, +{ + templatePath: dojo.uri.dojoUri("src/widget/templates/Editor2/Dialog/insertimage.html"), + + editableAttributes: ['src', 'alt', 'width', 'height', 'hspace', 'vspace', 'border', 'align'], + loadContent: function(){ + var curInst = dojo.widget.Editor2Manager.getCurrentInstance(); + this.imageNode = dojo.withGlobal(curInst.window, "getSelectedElement", dojo.html.selection); + if(!this.imageNode){ + this.imageNode = dojo.withGlobal(curInst.window, "getAncestorElement", dojo.html.selection, ['img']); + } + var imageAttributes = {}; + this.extraAttribText = ""; + if(this.imageNode){ + var attrs = this.imageNode.attributes; + for(var i=0; i<attrs.length; i++) { + if(dojo.lang.find(this.editableAttributes, attrs[i].name.toLowerCase())>-1){ + imageAttributes[attrs[i].name] = attrs[i].value; + }else{ + this.extraAttribText += attrs[i].name + '="'+attrs[i].value+'" '; + } + } + } + for(var i=0; i<this.editableAttributes.length; ++i){ + name = this.editableAttributes[i]; + this["image_"+name].value = (imageAttributes[name] == undefined) ? "" : imageAttributes[name] ; + } + return true; + }, + ok: function(){ + var curInst = dojo.widget.Editor2Manager.getCurrentInstance(); + var insertcmd = curInst.getCommand('inserthtml'); + var option = 0; + + var attstr=''; + for(var i=0; i<this.editableAttributes.length; ++i){ + name = this.editableAttributes[i]; + var value = this["image_"+name].value; + if(value.length > 0){ + attstr += name + '="'+value+'" '; + } + } + if(this.imageNode){ + dojo.withGlobal(curInst.window, "selectElement", dojo.html.selection, [this.imageNode]); + } + insertcmd.execute('<img '+attstr+this.extraAttribText+'/>'); + + this.cancel(); + } +}); \ No newline at end of file Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/InsertImageDialog.js ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/InsertImageDialog.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/InsertImageDialog.js ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/InsertTableDialog.js URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/InsertTableDialog.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/InsertTableDialog.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Editor2Plugin/InsertTableDialog.js Mon Feb 19 09:56:06 2007 @@ -0,0 +1,149 @@ +/* + Copyright (c) 2004-2006, The Dojo Foundation + All Rights Reserved. + + Licensed under the Academic Free License version 2.1 or above OR the + modified BSD license. For more information on Dojo licensing, see: + + http://dojotoolkit.org/community/licensing.shtml +*/ + +dojo.provide("dojo.widget.Editor2Plugin.InsertTableDialog"); + +dojo.widget.defineWidget( + "dojo.widget.Editor2InsertTableDialog", + dojo.widget.Editor2DialogContent, +{ + templatePath: dojo.uri.dojoUri("src/widget/templates/Editor2/Dialog/inserttable.html"), + + editableAttributes: ['summary', 'height', 'cellspacing', 'cellpadding', 'border', 'align'], + + loadContent: function(){ + var curInst = dojo.widget.Editor2Manager.getCurrentInstance(); + curInst.saveSelection(); //save selection (none-activeX IE) + this.tableNode = dojo.withGlobal(curInst.window, "getSelectedElement", dojo.html.selection); + if(!this.tableNode || this.tableNode.tagName.toLowerCase() != 'table'){ + this.tableNode = dojo.withGlobal(curInst.window, "getAncestorElement", dojo.html.selection, ['table']); + } + + var tableAttributes = {}; + this.extraAttribText = ""; + if(this.tableNode){ + this["table_rows"].value = this.tableNode.rows.length; + this["table_rows"].disabled = true; + this["table_cols"].value = this.tableNode.rows[0].cells.length; + this["table_cols"].disabled = true; + + if (this.tableNode.caption){ + this["table_caption"].value = this.tableNode.caption.innerHTML; + }else{ + this["table_caption"].value = ""; + } + + var width = this.tableNode.style.width || this.tableNode.width; + if(width){ + this["table_width"].value = parseInt(width); + if (width.indexOf('%') > -1){ + this["table_widthtype"].value = "percent"; + }else{ + this["table_widthtype"].value = "pixels"; + } + }else{ + this["table_width"].value = "100"; + } + + var height = this.tableNode.style.height || this.tableNode.height; + if(height){ + this["table_height"].value = parseInt(width); + }else{ + this["table_height"].value = ""; + } + + var attrs = this.tableNode.attributes; + for(var i=0; i<attrs.length; i++) { + if(dojo.lang.find(this.editableAttributes, attrs[i].name.toLowerCase())>-1){ + tableAttributes[attrs[i].name] = attrs[i].value; + }else{ + this.extraAttribText += attrs[i].name + '="'+attrs[i].value+'" '; + } + } + }else{ + this["table_rows"].value = 3; + this["table_rows"].disabled = false; + this["table_cols"].value = 2; + this["table_cols"].disabled = false; + this["table_width"].value = 100; + this["table_widthtype"].value = "percent"; + this["table_height"].value = ""; + } + + for(var i=0; i<this.editableAttributes.length; ++i){ + name = this.editableAttributes[i]; + this["table_"+name].value = (tableAttributes[name] == undefined) ? "" : tableAttributes[name]; + if(name == 'height' && tableAttributes[name] != undefined){ + this["table_"+name].value = tableAttributes[name]; + } + } + return true; + }, + ok: function(){ + var curInst = dojo.widget.Editor2Manager.getCurrentInstance(); + var args = {}; + + args['rows'] = this["table_rows"].value; + args['cols'] = this["table_cols"].value; + args['caption'] = this["table_caption"].value; + args["tableattrs"] = ""; + if(this["table_widthtype"].value == "percent"){ + args["tableattrs"] += 'width="'+this["table_width"].value +'%" '; + }else{ + args["tableattrs"] += 'width="'+this["table_width"].value +'px" '; + } + for(var i=0; i<this.editableAttributes.length; ++i){ + var name = this.editableAttributes[i]; + var value = this["table_"+name].value; + if(value.length > 0){ + args["tableattrs"] += name + '="'+value+'" '; + } + } + + if(!args["tableattrs"]){ + args["tableattrs"] = ""; + } + + //show the border in IE by applying a custom class + if(dojo.render.html.ie && !this["table_border"].value){ + args["tableattrs"] += 'class="dojoShowIETableBorders" '; + } + + var html = "<table "+args["tableattrs"]+">"; + if(args['caption']){ + html += "<caption>"+args["caption |
Free forum by Nabble | Edit this page |