| /* |
| 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"); |
| dojo.require("dojo.widget.Menu2"); |
| dojo.event.topic.subscribe("dojo.widget.Editor2::onLoad", function (editor) { |
| dojo.widget.Editor2Plugin.ContextMenuManager.getContextMenu(editor); |
| }); |
| 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); |
| case "Anchor": |
| case "List": |
| } |
| }, registerGroupSet:function (name, set) { |
| 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; |
| } |
| } |
| } |
| }, 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; |
| }, createItems:function () { |
| }, 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; |
| } |
| }}); |
| |