Subversion Repositories Applications.papyrus

Rev

Rev 1371 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
        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;
        }
}});