gecko-dev/editor/ui/composer/content/ComposerCommands.js

1352 lines
39 KiB
JavaScript

/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998-1999 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
* Simon Fraser (sfraser@netscape.com)
* Ryan Cassin (rcassin@supernova.org)
*/
/* Implementations of nsIControllerCommand for composer commands */
var gHTMLEditorCommandManager = null;
var gComposerWindowCommandManager = null;
var commonDialogsService = Components.classes["@mozilla.org/appshell/commonDialogs;1"].getService();
commonDialogsService = commonDialogsService.QueryInterface(Components.interfaces.nsICommonDialogs);
//-----------------------------------------------------------------------------------
function SetupHTMLEditorCommands()
{
gHTMLEditorCommandManager = GetHTMLEditorController();
if (!gHTMLEditorCommandManager)
return;
dump("Registering commands\n");
gHTMLEditorCommandManager.registerCommand("cmd_find", nsFindCommand);
gHTMLEditorCommandManager.registerCommand("cmd_findNext", nsFindNextCommand);
gHTMLEditorCommandManager.registerCommand("cmd_spelling", nsSpellingCommand);
gHTMLEditorCommandManager.registerCommand("cmd_insertChars", nsInsertCharsCommand);
gHTMLEditorCommandManager.registerCommand("cmd_listProperties", nsListPropertiesCommand);
gHTMLEditorCommandManager.registerCommand("cmd_pageProperties", nsPagePropertiesCommand);
gHTMLEditorCommandManager.registerCommand("cmd_colorProperties", nsColorPropertiesCommand);
gHTMLEditorCommandManager.registerCommand("cmd_advancedProperties", nsAdvancedPropertiesCommand);
gHTMLEditorCommandManager.registerCommand("cmd_objectProperties", nsObjectPropertiesCommand);
gHTMLEditorCommandManager.registerCommand("cmd_removeLinks", nsRemoveLinksCommand);
gHTMLEditorCommandManager.registerCommand("cmd_image", nsImageCommand);
gHTMLEditorCommandManager.registerCommand("cmd_hline", nsHLineCommand);
gHTMLEditorCommandManager.registerCommand("cmd_link", nsLinkCommand);
gHTMLEditorCommandManager.registerCommand("cmd_anchor", nsAnchorCommand);
gHTMLEditorCommandManager.registerCommand("cmd_insertHTML", nsInsertHTMLCommand);
gHTMLEditorCommandManager.registerCommand("cmd_insertBreak", nsInsertBreakCommand);
gHTMLEditorCommandManager.registerCommand("cmd_insertBreakAll",nsInsertBreakAllCommand);
gHTMLEditorCommandManager.registerCommand("cmd_table", nsInsertOrEditTableCommand);
gHTMLEditorCommandManager.registerCommand("cmd_editTable", nsEditTableCommand);
gHTMLEditorCommandManager.registerCommand("cmd_SelectTable", nsSelectTableCommand);
gHTMLEditorCommandManager.registerCommand("cmd_SelectRow", nsSelectTableRowCommand);
gHTMLEditorCommandManager.registerCommand("cmd_SelectColumn", nsSelectTableColumnCommand);
gHTMLEditorCommandManager.registerCommand("cmd_SelectCell", nsSelectTableCellCommand);
gHTMLEditorCommandManager.registerCommand("cmd_SelectAllCells", nsSelectAllTableCellsCommand);
gHTMLEditorCommandManager.registerCommand("cmd_InsertTable", nsInsertTableCommand);
gHTMLEditorCommandManager.registerCommand("cmd_InsertRowAbove", nsInsertTableRowAboveCommand);
gHTMLEditorCommandManager.registerCommand("cmd_InsertRowBelow", nsInsertTableRowBelowCommand);
gHTMLEditorCommandManager.registerCommand("cmd_InsertColumnBefore", nsInsertTableColumnBeforeCommand);
gHTMLEditorCommandManager.registerCommand("cmd_InsertColumnAfter", nsInsertTableColumnAfterCommand);
gHTMLEditorCommandManager.registerCommand("cmd_InsertCellBefore", nsInsertTableCellBeforeCommand);
gHTMLEditorCommandManager.registerCommand("cmd_InsertCellAfter", nsInsertTableCellAfterCommand);
gHTMLEditorCommandManager.registerCommand("cmd_DeleteTable", nsDeleteTableCommand);
gHTMLEditorCommandManager.registerCommand("cmd_DeleteRow", nsDeleteTableRowCommand);
gHTMLEditorCommandManager.registerCommand("cmd_DeleteColumn", nsDeleteTableColumnCommand);
gHTMLEditorCommandManager.registerCommand("cmd_DeleteCell", nsDeleteTableCellCommand);
gHTMLEditorCommandManager.registerCommand("cmd_DeleteCellContents", nsDeleteTableCellContentsCommand);
gHTMLEditorCommandManager.registerCommand("cmd_JoinTableCells", nsJoinTableCellsCommand);
gHTMLEditorCommandManager.registerCommand("cmd_SplitTableCell", nsSplitTableCellCommand);
gHTMLEditorCommandManager.registerCommand("cmd_TableOrCellColor", nsTableOrCellColorCommand);
gHTMLEditorCommandManager.registerCommand("cmd_NormalizeTable", nsNormalizeTableCommand);
gHTMLEditorCommandManager.registerCommand("cmd_FinishHTMLSource", nsFinishHTMLSource);
gHTMLEditorCommandManager.registerCommand("cmd_CancelHTMLSource", nsCancelHTMLSource);
}
function SetupComposerWindowCommands()
{
// Create a command controller and register commands
// specific to Web Composer window (file-related commands, HTML Source...)
// IMPORTANT: For each of these commands, the doCommand method
// must first call FinishHTMLSource()
// to go from HTML Source mode to any other edit mode
var gComposerWindowCommandManager = window.controllers;
if (!gComposerWindowCommandManager) return;
var composerController = Components.classes["@mozilla.org/editor/composercontroller;1"].createInstance();
if (!composerController)
{
dump("Failed to create composerController\n");
return;
}
var editorController = composerController.QueryInterface(Components.interfaces.nsIEditorController);
if (!editorController)
{
dump("Failed to get interface for nsIEditorController\n");
return;
}
// Note: We init with the editorShell for the main composer window, not the HTML Source textfield?
editorController.Init(window.editorShell);
var interfaceRequestor = composerController.QueryInterface(Components.interfaces.nsIInterfaceRequestor);
if (!interfaceRequestor)
{
dump("Failed to get iterfaceRequestor for composerController\n");
return;
}
// Get the nsIControllerCommandManager interface we need to register more commands
var commandManager = interfaceRequestor.getInterface(Components.interfaces.nsIControllerCommandManager);
if (!commandManager)
{
dump("Failed to get interface for nsIControllerCommandManager\n");
return;
}
// File-related commands
commandManager.registerCommand("cmd_newEditor", nsNewEditorCommand);
commandManager.registerCommand("cmd_open", nsOpenCommand);
commandManager.registerCommand("cmd_save", nsSaveCommand);
commandManager.registerCommand("cmd_saveAs", nsSaveAsCommand);
commandManager.registerCommand("cmd_saveAsCharset", nsSaveAsCharsetCommand);
commandManager.registerCommand("cmd_revert", nsRevertCommand);
commandManager.registerCommand("cmd_openRemote", nsOpenRemoteCommand);
commandManager.registerCommand("cmd_preview", nsPreviewCommand);
commandManager.registerCommand("cmd_editSendPage", nsSendPageCommand);
commandManager.registerCommand("cmd_quit", nsQuitCommand);
commandManager.registerCommand("cmd_close", nsCloseCommand);
commandManager.registerCommand("cmd_preferences", nsPreferencesCommand);
// Edit Mode commands
commandManager.registerCommand("cmd_NormalMode", nsNormalModeCommand);
commandManager.registerCommand("cmd_AllTagsMode", nsAllTagsModeCommand);
commandManager.registerCommand("cmd_HTMLSourceMode", nsHTMLSourceModeCommand);
commandManager.registerCommand("cmd_PreviewMode", nsPreviewModeCommand);
commandManager.registerCommand("cmd_FinishHTMLSource", nsFinishHTMLSource);
commandManager.registerCommand("cmd_CancelHTMLSource", nsCancelHTMLSource);
gComposerWindowCommandManager.insertControllerAt(0, editorController);
}
//-----------------------------------------------------------------------------------
function GetHTMLEditorController()
{
var numControllers = window._content.controllers.getControllerCount();
// count down to find a controller that supplies a nsIControllerCommandManager interface
for (var i = numControllers; i >= 0 ; i --)
{
var commandManager = null;
try {
var controller = window._content.controllers.getControllerAt(i);
var interfaceRequestor = controller.QueryInterface(Components.interfaces.nsIInterfaceRequestor);
if (!interfaceRequestor) continue;
commandManager = interfaceRequestor.getInterface(Components.interfaces.nsIControllerCommandManager);
} catch(ex) {
dump("failed to get command manager number "+i+"\n");
}
if (commandManager)
return commandManager;
}
dump("Failed to find a controller to register commands with\n");
return null;
}
//-----------------------------------------------------------------------------------
function goUpdateComposerMenuItems(commandset)
{
// dump("Updating commands for " + commandset.id + "\n");
for (var i = 0; i < commandset.childNodes.length; i++)
{
var commandID = commandset.childNodes[i].getAttribute("id");
if (commandID)
{
goUpdateCommand(commandID);
}
}
}
//-----------------------------------------------------------------------------------
function PrintObject(obj)
{
dump("-----" + obj + "------\n");
var names = "";
for (var i in obj)
{
if (i == "value")
names += i + ": " + obj.value + "\n";
else if (i == "id")
names += i + ": " + obj.id + "\n";
else
names += i + "\n";
}
dump(names + "-----------\n");
}
//-----------------------------------------------------------------------------------
function PrintNodeID(id)
{
PrintObject(document.getElementById(id));
}
//-----------------------------------------------------------------------------------
var nsOpenCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return true; // we can always do this
},
doCommand: function(aCommand)
{
var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
fp.init(window, window.editorShell.GetString("OpenHTMLFile"), nsIFilePicker.modeOpen);
// When loading into Composer, direct user to prefer HTML files and text files,
// so we call separately to control the order of the filter list
fp.appendFilters(nsIFilePicker.filterHTML);
fp.appendFilters(nsIFilePicker.filterText);
fp.appendFilters(nsIFilePicker.filterAll);
/* doesn't handle *.shtml files */
try {
fp.show();
/* need to handle cancel (uncaught exception at present) */
}
catch (ex) {
dump("filePicker.chooseInputFile threw an exception\n");
}
/* This checks for already open window and activates it...
* note that we have to test the native path length
* since fileURL.spec will be "file:///" if no filename picked (Cancel button used)
*/
if (fp.file && fp.file.path.length > 0) {
EditorOpenUrl(fp.fileURL.spec);
}
}
};
//-----------------------------------------------------------------------------------
var nsSaveCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return window.editorShell &&
(window.editorShell.documentModified || window.editorShell.editorDocument.location == "about:blank");
},
doCommand: function(aCommand)
{
if (window.editorShell)
{
FinishHTMLSource(); // In editor.js
var doSaveAs = window.editorShell.editorDocument.location == "about:blank";
return window.editorShell.saveDocument(doSaveAs, false);
}
return false;
}
}
var nsSaveAsCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return (window.editorShell && window.editorShell.documentEditable);
},
doCommand: function(aCommand)
{
if (window.editorShell)
{
FinishHTMLSource();
return window.editorShell.saveDocument(true, false);
}
return false;
}
}
var nsSaveAsCharsetCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return (window.editorShell && window.editorShell.documentEditable);
},
doCommand: function(aCommand)
{
FinishHTMLSource();
window.ok = false;
if (window.openDialog("chrome://editor/content/EditorSaveAsCharset.xul","_blank", "chrome,close,titlebar,modal"))
{
window.ok = window.editorShell.saveDocument(true, false);
}
window._content.focus();
return window.ok;
}
};
//-----------------------------------------------------------------------------------
var nsRevertCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return (window.editorShell &&
window.editorShell.documentModified &&
window.editorShell.editorDocument.location != "about:blank");
},
doCommand: function(aCommand)
{
// Confirm with the user to abandon current changes
if (commonDialogsService)
{
var result = {value:0};
// Put the page title in the message string
var title = window.editorShell.editorDocument.title;
if (!title || title.length == 0)
title = window.editorShell.GetTitle("untitled");
var msg = window.editorShell.GetString("AbandonChanges").replace(/%title%/,title);
commonDialogsService.UniversalDialog(
window,
null,
window.editorShell.GetString("RevertCaption"),
msg,
null,
window.editorShell.GetString("Revert"),
window.editorShell.GetString("Cancel"),
null,
null,
null,
null,
{value:0},
{value:0},
"chrome://global/skin/question-icon.gif",
{value:"false"},
2,
0,
0,
result
);
// Reload page if first button (Revert) was pressed
if(result.value == 0)
{
FinishHTMLSource();
window.editorShell.LoadUrl(editorShell.editorDocument.location);
}
}
}
};
//-----------------------------------------------------------------------------------
var nsCloseCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return window.editorShell;
},
doCommand: function(aCommand)
{
CloseWindow();
}
};
function CloseWindow()
{
FinishHTMLSource();
// Check to make sure document is saved. "true" means allow "Don't Save" button,
// so user can choose to close without saving
if (CheckAndSaveDocument(window.editorShell.GetString("BeforeClosing"), true))
{
if (window.InsertCharWindow)
SwitchInsertCharToAnotherEditorOrClose();
window.editorShell.CloseWindowWithoutSaving();
}
}
//-----------------------------------------------------------------------------------
var nsNewEditorCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return true; // we can always do this
},
doCommand: function(aCommand)
{
NewEditorWindow();
}
};
//-----------------------------------------------------------------------------------
var nsOpenRemoteCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return true; // we can always do this
},
doCommand: function(aCommand)
{
/* The last parameter is the current browser window.
Use 0 and the default checkbox will be to load into an editor
and loading into existing browser option is removed
*/
window.openDialog( "chrome://navigator/content/openLocation.xul", "_blank", "chrome,modal", 0);
window._content.focus();
}
};
//-----------------------------------------------------------------------------------
var nsPreviewCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return (window.editorShell != null && (DocumentHasBeenSaved() || window.editorShell.documentModified));
},
doCommand: function(aCommand)
{
FinishHTMLSource();
// Don't continue if user canceled during prompt for saving
// DocumentHasBeenSaved will test if we have a URL and suppress "Don't Save" button if not
if (!CheckAndSaveDocument(window.editorShell.GetString("BeforePreview"), DocumentHasBeenSaved()))
return;
// Check if we saved again just in case?
if (DocumentHasBeenSaved())
window.openDialog(getBrowserURL(), "EditorPreview", "chrome,all,dialog=no", window._content.location);
}
};
//-----------------------------------------------------------------------------------
var nsSendPageCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return (window.editorShell != null && (DocumentHasBeenSaved() || window.editorShell.documentModified));
},
doCommand: function(aCommand)
{
FinishHTMLSource();
// Don't continue if user canceled during prompt for saving
// DocumentHasBeenSaved will test if we have a URL and suppress "Don't Save" button if not
if (!CheckAndSaveDocument(window.editorShell.GetString("SendPageReason"), DocumentHasBeenSaved()))
return;
// Check if we saved again just in case?
if (DocumentHasBeenSaved())
{
// Lauch Messenger Composer window with current page as contents
var pageTitle = window.editorShell.editorDocument.title;
var pageUrl = window.editorShell.editorDocument.location;
window.openDialog("chrome://messenger/content/messengercompose/messengercompose.xul", "_blank",
"chrome,all,dialog=no", "attachment='" + pageUrl + "',body='" + pageUrl +
"',subject='" + pageTitle + "',bodyislink=true");
}
}
};
//-----------------------------------------------------------------------------------
var nsQuitCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return true; // we can always do this
},
doCommand: function(aCommand)
{
// In editor.js
FinishHTMLSource();
goQuitApplication();
}
};
//-----------------------------------------------------------------------------------
var nsFindCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return (window.editorShell != null);
},
doCommand: function(aCommand)
{
window.editorShell.Find();
}
};
//-----------------------------------------------------------------------------------
var nsFindNextCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
// we can only do this if the search pattern is non-empty. Not sure how
// to get that from here
return (window.editorShell != null);
},
doCommand: function(aCommand)
{
window.editorShell.FindNext();
}
};
//-----------------------------------------------------------------------------------
var nsSpellingCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return (window.editorShell != null) && IsSpellCheckerInstalled();
},
doCommand: function(aCommand)
{
var spellChecker = window.editorShell.QueryInterface(Components.interfaces.nsIEditorSpellCheck);
if (spellChecker)
{
var firstMisspelledWord;
// Start the spell checker module. Return is first misspelled word
try {
spellChecker.InitSpellChecker();
// XXX: We need to read in a pref here so we can set the
// default language for the spellchecker!
// spellChecker.SetCurrentDictionary();
firstMisspelledWord = spellChecker.GetNextMisspelledWord();
}
catch(ex) {
dump("*** Exception error: InitSpellChecker\n");
return;
}
if( firstMisspelledWord == "")
{
try {
spellChecker.UninitSpellChecker();
}
catch(ex) {
dump("*** Exception error: UnInitSpellChecker\n");
return;
}
// No misspelled word - tell user
window.editorShell.AlertWithTitle(window.editorShell.GetString("CheckSpelling"),
window.editorShell.GetString("NoMisspelledWord"));
} else {
// Set spellChecker variable on window
window.spellChecker = spellChecker;
try {
window.openDialog("chrome://editor/content/EdSpellCheck.xul", "_blank",
"chrome,close,titlebar,modal", "", firstMisspelledWord);
}
catch(ex) {
dump("*** Exception error: SpellChecker Dialog Closing\n");
}
}
}
window._content.focus();
}
};
//-----------------------------------------------------------------------------------
var nsImageCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return (window.editorShell && window.editorShell.documentEditable);
},
doCommand: function(aCommand)
{
window.openDialog("chrome://editor/content/EdImageProps.xul","_blank", "chrome,close,titlebar,modal");
window._content.focus();
}
};
//-----------------------------------------------------------------------------------
var nsHLineCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return (window.editorShell && window.editorShell.documentEditable);
},
doCommand: function(aCommand)
{
// Inserting an HLine is different in that we don't use properties dialog
// unless we are editing an existing line's attributes
// We get the last-used attributes from the prefs and insert immediately
var tagName = "hr";
var hLine = window.editorShell.GetSelectedElement(tagName);
if (hLine) {
// We only open the dialog for an existing HRule
window.openDialog("chrome://editor/content/EdHLineProps.xul", "_blank", "chrome,close,titlebar,modal");
window._content.focus();
} else {
hLine = window.editorShell.CreateElementWithDefaults(tagName);
if (hLine) {
// We change the default attributes to those saved in the user prefs
if (gPrefs) {
try {
var align = gPrefs.GetIntPref("editor.hrule.align");
if (align == 0 ) {
hLine.setAttribute("align", "left");
} else if (align == 2) {
hLine.setAttribute("align", "right");
} else {
// Default is center
hLine.setAttribute("align", "center");
}
var width = gPrefs.GetIntPref("editor.hrule.width");
var percent = gPrefs.GetBoolPref("editor.hrule.width_percent");
if (percent)
width = width +"%";
hLine.setAttribute("width", width);
var height = gPrefs.GetIntPref("editor.hrule.height");
hLine.setAttribute("size", String(height));
var shading = gPrefs.GetBoolPref("editor.hrule.shading");
if (shading) {
hLine.removeAttribute("noshade");
} else {
hLine.setAttribute("noshade", "");
}
}
catch (ex) {
dump("failed to get HLine prefs\n");
}
}
try {
window.editorShell.InsertElementAtSelection(hLine, true);
} catch (e) {
dump("Exception occured in InsertElementAtSelection\n");
}
}
}
}
};
//-----------------------------------------------------------------------------------
var nsLinkCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return (window.editorShell && window.editorShell.documentEditable);
},
doCommand: function(aCommand)
{
window.openDialog("chrome://editor/content/EdLinkProps.xul","_blank", "chrome,close,titlebar,modal");
window._content.focus();
}
};
//-----------------------------------------------------------------------------------
var nsAnchorCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return (window.editorShell && window.editorShell.documentEditable);
},
doCommand: function(aCommand)
{
window.openDialog("chrome://editor/content/EdNamedAnchorProps.xul", "_blank", "chrome,close,titlebar,modal", "");
window._content.focus();
}
};
//-----------------------------------------------------------------------------------
var nsInsertHTMLCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return (window.editorShell && window.editorShell.documentEditable);
},
doCommand: function(aCommand)
{
window.openDialog("chrome://editor/content/EdInsSrc.xul","_blank", "chrome,close,titlebar,modal,resizable", "");
window._content.focus();
}
};
//-----------------------------------------------------------------------------------
var nsInsertCharsCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return (window.editorShell && window.editorShell.documentEditable);
},
doCommand: function(aCommand)
{
EditorFindOrCreateInsertCharWindow();
}
};
//-----------------------------------------------------------------------------------
var nsInsertBreakCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return false;
},
doCommand: function(aCommand)
{
_EditorNotImplemented();
}
};
//-----------------------------------------------------------------------------------
var nsInsertBreakAllCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return false;
},
doCommand: function(aCommand)
{
_EditorNotImplemented();
}
};
//-----------------------------------------------------------------------------------
var nsListPropertiesCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return (window.editorShell && window.editorShell.documentEditable);
},
doCommand: function(aCommand)
{
window.openDialog("chrome://editor/content/EdListProps.xul","_blank", "chrome,close,titlebar,modal");
window._content.focus();
}
};
//-----------------------------------------------------------------------------------
var nsPagePropertiesCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return (window.editorShell && window.editorShell.documentEditable);
},
doCommand: function(aCommand)
{
window.openDialog("chrome://editor/content/EdPageProps.xul","_blank", "chrome,close,titlebar,modal", "");
}
};
//-----------------------------------------------------------------------------------
var nsObjectPropertiesCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
var isEnabled = false;
if (window.editorShell && window.editorShell.documentEditable)
{
isEnabled = (GetObjectForProperties() != null ||
window.editorShell.GetSelectedElement("href") != null);
}
return isEnabled;
},
doCommand: function(aCommand)
{
// Launch Object properties for appropriate selected element
var element = GetObjectForProperties();
if (element)
{
var name = element.nodeName.toLowerCase();
switch (name)
{
case 'img':
goDoCommand("cmd_image");
break;
case 'hr':
goDoCommand("cmd_hline");
break;
case 'table':
EditorInsertOrEditTable(false);
break;
case 'td':
case 'th':
EditorTableCellProperties();
break;
case 'ol':
case 'ul':
case 'dl':
goDoCommand("cmd_listProperties");
break;
case 'a':
if (element.name)
{
goDoCommand("cmd_anchor");
}
else if(element.href)
{
goDoCommand("cmd_link");
}
break;
default:
doAdvancedProperties(element);
break;
}
} else {
// We get a partially-selected link if asked for specifically
element = window.editorShell.GetSelectedElement("href");
if (element)
goDoCommand("cmd_link");
}
window._content.focus();
}
};
function doAdvancedProperties(element)
{
if (element)
{
window.openDialog("chrome://editor/content/EdAdvancedEdit.xul", "_blank", "chrome,close,titlebar,modal,resizable=yes", "", element);
window._content.focus();
}
}
var nsAdvancedPropertiesCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return (window.editorShell && window.editorShell.documentEditable);
},
doCommand: function(aCommand)
{
// Launch AdvancedEdit dialog for the selected element
var element = window.editorShell.GetSelectedElement("");
doAdvancedProperties(element);
}
};
//-----------------------------------------------------------------------------------
var nsColorPropertiesCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return (window.editorShell && window.editorShell.documentEditable);
},
doCommand: function(aCommand)
{
window.openDialog("chrome://editor/content/EdColorProps.xul","_blank", "chrome,close,titlebar,modal", "");
window._content.focus();
}
};
//-----------------------------------------------------------------------------------
var nsRemoveLinksCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
// We could see if there's any link in selection, but it doesn't seem worth the work!
return (window.editorShell && window.editorShell.documentEditable);
},
doCommand: function(aCommand)
{
window.editorShell.RemoveTextProperty("href", "");
window._content.focus();
}
};
//-----------------------------------------------------------------------------------
var nsNormalModeCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return true; //(window.editorShell && window.editorShell.documentEditable);
},
doCommand: function(aCommand)
{
if (gEditorDisplayMode != DisplayModeNormal)
SetEditMode(DisplayModeNormal);
}
};
var nsAllTagsModeCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return (window.editorShell && window.editorShell.documentEditable);
},
doCommand: function(aCommand)
{
if (gEditorDisplayMode != DisplayModeAllTags)
SetEditMode(DisplayModeAllTags);
}
};
var nsHTMLSourceModeCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return (window.editorShell && window.editorShell.documentEditable);
},
doCommand: function(aCommand)
{
if (gEditorDisplayMode != DisplayModeSource)
SetEditMode(DisplayModeSource);
}
};
var nsPreviewModeCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return (window.editorShell && window.editorShell.documentEditable);
},
doCommand: function(aCommand)
{
FinishHTMLSource();
if (gEditorDisplayMode != DisplayModePreview)
SetEditMode(DisplayModePreview);
}
};
//-----------------------------------------------------------------------------------
var nsInsertOrEditTableCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return (window.editorShell && window.editorShell.documentEditable);
},
doCommand: function(aCommand)
{
EditorInsertOrEditTable(true);
}
};
//-----------------------------------------------------------------------------------
var nsEditTableCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return IsInTable();
},
doCommand: function(aCommand)
{
EditorInsertOrEditTable(false);
}
};
//-----------------------------------------------------------------------------------
var nsSelectTableCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return IsInTable();
},
doCommand: function(aCommand)
{
window.editorShell.SelectTable();
window._content.focus();
}
};
var nsSelectTableRowCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return IsInTableCell();
},
doCommand: function(aCommand)
{
window.editorShell.SelectTableRow();
window._content.focus();
}
};
var nsSelectTableColumnCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return IsInTableCell();
},
doCommand: function(aCommand)
{
window.editorShell.SelectTableColumn();
window._content.focus();
}
};
var nsSelectTableCellCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return IsInTableCell();
},
doCommand: function(aCommand)
{
window.editorShell.SelectTableCell();
window._content.focus();
}
};
var nsSelectAllTableCellsCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return IsInTable();
},
doCommand: function(aCommand)
{
window.editorShell.SelectAllTableCells();
window._content.focus();
}
};
//-----------------------------------------------------------------------------------
var nsInsertTableCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return (window.editorShell && window.editorShell.documentEditable);
},
doCommand: function(aCommand)
{
EditorInsertTable();
}
};
var nsInsertTableRowAboveCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return IsInTableCell();
},
doCommand: function(aCommand)
{
window.editorShell.InsertTableRow(1, false);
window._content.focus();
}
};
var nsInsertTableRowBelowCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return IsInTableCell();
},
doCommand: function(aCommand)
{
window.editorShell.InsertTableRow(1,true);
window._content.focus();
}
};
var nsInsertTableColumnBeforeCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return IsInTableCell();
},
doCommand: function(aCommand)
{
window.editorShell.InsertTableColumn(1, false);
window._content.focus();
}
};
var nsInsertTableColumnAfterCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return IsInTableCell();
},
doCommand: function(aCommand)
{
window.editorShell.InsertTableColumn(1, true);
window._content.focus();
}
};
var nsInsertTableCellBeforeCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return IsInTableCell();
},
doCommand: function(aCommand)
{
window.editorShell.InsertTableCell(1, false);
}
};
var nsInsertTableCellAfterCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return IsInTableCell();
},
doCommand: function(aCommand)
{
window.editorShell.InsertTableCell(1, true);
window._content.focus();
}
};
//-----------------------------------------------------------------------------------
var nsDeleteTableCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return IsInTable();
},
doCommand: function(aCommand)
{
window.editorShell.DeleteTable();
window._content.focus();
}
};
var nsDeleteTableRowCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return IsInTableCell();
},
doCommand: function(aCommand)
{
window.editorShell.DeleteTableRow(1);
window._content.focus();
}
};
var nsDeleteTableColumnCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return IsInTableCell();
},
doCommand: function(aCommand)
{
window.editorShell.DeleteTableColumn(1);
window._content.focus();
}
};
var nsDeleteTableCellCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return IsInTableCell();
},
doCommand: function(aCommand)
{
window.editorShell.DeleteTableCell(1);
window._content.focus();
}
};
var nsDeleteTableCellContentsCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return IsInTableCell();
},
doCommand: function(aCommand)
{
window.editorShell.DeleteTableCellContents();
window._content.focus();
}
};
//-----------------------------------------------------------------------------------
var nsNormalizeTableCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return IsInTable();
},
doCommand: function(aCommand)
{
// Use nsnull to let editor find table enclosing current selection
window.editorShell.NormalizeTable(null);
window._content.focus();
}
};
//-----------------------------------------------------------------------------------
var nsJoinTableCellsCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
if (window.editorShell && window.editorShell.documentEditable)
{
var tagNameObj = new Object;
var countObj = new Object;
var cell = window.editorShell.GetSelectedOrParentTableElement(tagNameObj, countObj);
// We need a cell and either > 1 selected cell or a cell to the right
// (this cell may originate in a row spanned from above current row)
// Note that editorShell returns "td" for "th" also.
// (tis is a pain! Editor and gecko use lowercase tagNames, JS uses uppercase!)
if( cell && (tagNameObj.value == "td"))
{
// Selected cells
if (countObj.value > 1) return true;
var colSpan = cell.getAttribute("colspan");
if (!colSpan) colSpan = 1;
// cells with 0 span should never have cells to the right
// (if there is, user can select the 2 cells to join them)
return (colSpan != 0 &&
window.editorShell.GetCellAt(null,
window.editorShell.GetRowIndex(cell),
window.editorShell.GetColumnIndex(cell) + colSpan));
}
}
return false;
},
doCommand: function(aCommand)
{
// Param: Don't merge non-contiguous cells
window.editorShell.JoinTableCells(false);
window._content.focus();
}
};
//-----------------------------------------------------------------------------------
var nsSplitTableCellCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
if (window.editorShell && window.editorShell.documentEditable)
{
var tagNameObj = new Object;
var countObj = new Object;
var cell = window.editorShell.GetSelectedOrParentTableElement(tagNameObj, countObj);
// We need a cell parent and there's just 1 selected cell
// or selection is entirely inside 1 cell
if ( cell && (tagNameObj.value == "td") &&
countObj.value <= 1 &&
IsSelectionInOneCell() )
{
var colSpan = cell.getAttribute("colspan");
var rowSpan = cell.getAttribute("colspan");
if (!colSpan) colSpan = 1;
if (!rowSpan) rowSpan = 1;
return (colSpan > 1 || rowSpan > 1 ||
colSpan == 0 || rowSpan == 0);
}
}
return false;
},
doCommand: function(aCommand)
{
window.editorShell.SplitTableCell();
window._content.focus();
}
};
//-----------------------------------------------------------------------------------
var nsTableOrCellColorCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return IsInTable();
},
doCommand: function(aCommand)
{
EditorSelectColor("TableOrCell");
}
};
//-----------------------------------------------------------------------------------
var nsPreferencesCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return true;
},
doCommand: function(aCommand)
{
goPreferences('navigator.xul', 'chrome://editor/content/pref-composer.xul','editor');
window._content.focus();
}
};
var nsFinishHTMLSource =
{
isCommandEnabled: function(aCommand, dummy)
{
return true;
},
doCommand: function(aCommand)
{
// In editor.js
FinishHTMLSource();
}
};
var nsCancelHTMLSource =
{
isCommandEnabled: function(aCommand, dummy)
{
return true;
},
doCommand: function(aCommand)
{
// In editor.js
CancelHTMLSource();
}
};