blob: c3f4ead03b2e59ce0b7d73b0684ec5fe1ef7f35c [file] [log] [blame]
/*
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;
}
}
});