diff --git a/editor/base/nsHTMLEditor.cpp b/editor/base/nsHTMLEditor.cpp index a9135e50fce3..f04f012078a8 100644 --- a/editor/base/nsHTMLEditor.cpp +++ b/editor/base/nsHTMLEditor.cpp @@ -232,6 +232,36 @@ NS_IMETHODIMP nsHTMLEditor::InsertBreak() return result; } +NS_IMETHODIMP nsHTMLEditor::GetParagraphFormat(nsString& aParagraphFormat) +{ + nsresult result = NS_ERROR_NOT_INITIALIZED; + + return result; +} + +NS_IMETHODIMP nsHTMLEditor::SetParagraphFormat(const nsString& aParagraphFormat) +{ + nsresult result = NS_ERROR_NOT_INITIALIZED; + //Kinda sad to waste memory just to force lower case + nsAutoString tag = aParagraphFormat; + tag.ToLowerCase(); + if (tag == "normal" || tag == "p") { + result = RemoveParagraphStyle(); + } else { + result = ReplaceBlockParent(tag); + } + +// XXXX: Horrible hack! We are doing this because +// of an error in Gecko which is not rendering the +// document after a change via the DOM - gpk 2/13/99 + // BEGIN HACK!!! + HACKForceRedraw(); + // END HACK + + return result; +} + + // Methods shared with the base editor. // Note: We could call each of these via nsTextEditor -- is that better? NS_IMETHODIMP nsHTMLEditor::EnableUndo(PRBool aEnable) @@ -1037,7 +1067,7 @@ NS_IMETHODIMP nsHTMLEditor::RemoveParent(const nsString &aParentTag) { if (gNoisy) { - printf("---------- nsHTMLEditor::RemoveParagraphStyle ----------\n"); + printf("---------- nsHTMLEditor::RemoveParent ----------\n"); } nsresult result=NS_ERROR_NOT_INITIALIZED; diff --git a/editor/base/nsHTMLEditor.h b/editor/base/nsHTMLEditor.h index 73d9f3794b21..ad4ea563d9c9 100644 --- a/editor/base/nsHTMLEditor.h +++ b/editor/base/nsHTMLEditor.h @@ -110,6 +110,9 @@ public: NS_IMETHOD RemoveParagraphStyle(); NS_IMETHOD RemoveParent(const nsString &aParentTag); + NS_IMETHOD GetParagraphFormat(nsString& aParagraphFormat); + NS_IMETHOD SetParagraphFormat(const nsString& aParagraphFormat); + NS_IMETHOD InsertLink(nsString& aURL); NS_IMETHOD InsertImage(nsString& aURL, nsString& aWidth, nsString& aHeight, diff --git a/editor/libeditor/html/nsHTMLEditor.cpp b/editor/libeditor/html/nsHTMLEditor.cpp index a9135e50fce3..f04f012078a8 100644 --- a/editor/libeditor/html/nsHTMLEditor.cpp +++ b/editor/libeditor/html/nsHTMLEditor.cpp @@ -232,6 +232,36 @@ NS_IMETHODIMP nsHTMLEditor::InsertBreak() return result; } +NS_IMETHODIMP nsHTMLEditor::GetParagraphFormat(nsString& aParagraphFormat) +{ + nsresult result = NS_ERROR_NOT_INITIALIZED; + + return result; +} + +NS_IMETHODIMP nsHTMLEditor::SetParagraphFormat(const nsString& aParagraphFormat) +{ + nsresult result = NS_ERROR_NOT_INITIALIZED; + //Kinda sad to waste memory just to force lower case + nsAutoString tag = aParagraphFormat; + tag.ToLowerCase(); + if (tag == "normal" || tag == "p") { + result = RemoveParagraphStyle(); + } else { + result = ReplaceBlockParent(tag); + } + +// XXXX: Horrible hack! We are doing this because +// of an error in Gecko which is not rendering the +// document after a change via the DOM - gpk 2/13/99 + // BEGIN HACK!!! + HACKForceRedraw(); + // END HACK + + return result; +} + + // Methods shared with the base editor. // Note: We could call each of these via nsTextEditor -- is that better? NS_IMETHODIMP nsHTMLEditor::EnableUndo(PRBool aEnable) @@ -1037,7 +1067,7 @@ NS_IMETHODIMP nsHTMLEditor::RemoveParent(const nsString &aParentTag) { if (gNoisy) { - printf("---------- nsHTMLEditor::RemoveParagraphStyle ----------\n"); + printf("---------- nsHTMLEditor::RemoveParent ----------\n"); } nsresult result=NS_ERROR_NOT_INITIALIZED; diff --git a/editor/libeditor/html/nsHTMLEditor.h b/editor/libeditor/html/nsHTMLEditor.h index 73d9f3794b21..ad4ea563d9c9 100644 --- a/editor/libeditor/html/nsHTMLEditor.h +++ b/editor/libeditor/html/nsHTMLEditor.h @@ -110,6 +110,9 @@ public: NS_IMETHOD RemoveParagraphStyle(); NS_IMETHOD RemoveParent(const nsString &aParentTag); + NS_IMETHOD GetParagraphFormat(nsString& aParagraphFormat); + NS_IMETHOD SetParagraphFormat(const nsString& aParagraphFormat); + NS_IMETHOD InsertLink(nsString& aURL); NS_IMETHOD InsertImage(nsString& aURL, nsString& aWidth, nsString& aHeight, diff --git a/editor/public/nsIHTMLEditor.h b/editor/public/nsIHTMLEditor.h index b73f10a940fd..7963d55301b2 100644 --- a/editor/public/nsIHTMLEditor.h +++ b/editor/public/nsIHTMLEditor.h @@ -57,6 +57,8 @@ public: const nsString *aAttribute, const nsString *aValue, PRBool &aFirst, PRBool &aAll, PRBool &aAny)=0; + NS_IMETHOD GetParagraphFormat(nsString& aParagraphFormat)=0; + NS_IMETHOD SetParagraphFormat(const nsString& aParagraphFormat)=0; NS_IMETHOD RemoveTextProperty(nsIAtom *aProperty, const nsString *aAttribute)=0; NS_IMETHOD DeleteSelection(nsIEditor::ECollapsedSelectionAction aAction)=0; NS_IMETHOD InsertText(const nsString& aStringToInsert)=0; diff --git a/editor/ui/composer/content/EditorAppShell.xul b/editor/ui/composer/content/EditorAppShell.xul index 1ff0a70ae83d..8a9be208bdb8 100644 --- a/editor/ui/composer/content/EditorAppShell.xul +++ b/editor/ui/composer/content/EditorAppShell.xul @@ -1,11 +1,11 @@ <?xml version="1.0"?> <?xml-stylesheet href="chrome://global/skin/" type="text/css"?> -<?xml-stylesheet href="chrome://navigator/skin/" type="text/css"?> +<?xml-stylesheet href="chrome://editor/skin/" type="text/css"?> <!DOCTYPE window [ -<!-- These entity declarations will go into a separare, locale file at some point --> +<!-- These entity declarations will go into a separate, locale file at some point --> <!-- Window title --> <!ENTITY editorWindow.title "Editor"> @@ -78,7 +78,19 @@ <menuitem name=".Color..." onclick=""/> <menuitem name=".Remove All Style(s)" onclick=""/> <separator /> - <menuitem name=".Heading" onclick=""/> + <menu name="Paragraph/Heading"> + <menuitem name="Normal" onclick="SetParagraphFormat('normal')"/> + <menuitem name="Heading 1" onclick="SetParagraphFormat('h1')"/> + <menuitem name="Heading 2" onclick="SetParagraphFormat('h2')"/> + <menuitem name="Heading 3" onclick="SetParagraphFormat('h3')"/> + <menuitem name="Heading 4" onclick="SetParagraphFormat('h4')"/> + <menuitem name="Heading 5" onclick="SetParagraphFormat('h5')"/> + <menuitem name="Address" onclick="SetParagraphFormat('address')"/> + <menuitem name="Preformat" onclick="SetParagraphFormat('pre')"/> + <menuitem name="List item" onclick="SetParagraphFormat('li')"/> + <menuitem name="Definition term" onclick="SetParagraphFormat('dt')"/> + <menuitem name="Definition description" onclick="SetParagraphFormat('dd')"/> + </menu> </menu> <menu name="Tools"> <menuitem name=".Spell Check" onclick=""/> @@ -100,21 +112,43 @@ </menubar> - <box id="outer-box" align="vertical"> - <broadcaster id="Editor:Style:IsBold" bold="false"/> <broadcaster id="Editor:Style:IsItalic"/> <broadcaster id="Editor:Style:IsUnderline"/> - + <box id="outer-box" align="vertical"> + <toolbox> - <toolbar> - <titledbutton align="left" class="popup" value="Normal"/> - <titledbutton align="left" class="popup" value="Size"/> - <titledbutton align="left" class="popup" value="Color"/> - <titledbutton src="chrome://editor/skin/images/ED_Bold.gif" align="bottom" - onclick="EditorApplyStyle('b')"> + <toolbar> + <!-- Most of the message handlers don't work! --> + <html:select class="combobox" size="1" id="paraFormat" onchange="OnChangeParaFormat()"> + <html:optgroup> + <html:option onclick="SetParagraphFormat('normal')">Normal</html:option> + <html:option onclick="SetParagraphFormat('h1')">Heading 1</html:option> + <html:option onclick="SetParagraphFormat('h2')">Heading 2</html:option> + <html:option onclick="SetParagraphFormat('h3')">Heading 3</html:option> + <html:option onclick="SetParagraphFormat('h4')">Heading 4</html:option> + <html:option onclick="SetParagraphFormat('h5')">Heading 5</html:option> + <html:option onclick="SetParagraphFormat('address')">Address</html:option> + <html:option onclick="SetParagraphFormat('li')">List Item</html:option> + <html:option onclick="SetParagraphFormat('dt')">Definition Term</html:option> + <html:option onclick="SetParagraphFormat('dd')">Definition Description</html:option> + </html:optgroup> + </html:select> + <html:select class="combobox" size="1" id="fontSize" onchange="OnChangeFontSize()"> + <html:optgroup label="fontSize"> + <html:option>-2</html:option> + <html:option>-1</html:option> + <html:option>0</html:option> + <html:option>1</html:option> + <html:option>2</html:option> + <html:option>3</html:option> + <html:option>4</html:option> + </html:optgroup> + </html:select> + <titledbutton align="left" class="popup" value="Color"/> + <titledbutton src="chrome://editor/skin/images/ED_Bold.gif" align="bottom" onclick="EditorApplyStyle('b')"> <observes element="Editor:Style:IsBold" attribute="bold" onchange="onBoldChange()"/> - </titledbutton> + </titledbutton> <titledbutton src="chrome://editor/skin/images/ED_Italic.gif" align="bottom" onclick="EditorApplyStyle('i')"/> <titledbutton src="chrome://editor/skin/images/ED_Underline.gif" align="bottom" onclick="EditorApplyStyle('u')"/> <titledbutton src="chrome://editor/skin/images/ED_ClearStyle.gif" align="bottom" onclick="EditorRemoveStyle('all')"/> @@ -122,13 +156,14 @@ <titledbutton src="chrome://editor/skin/images/ED_Numbers.gif" align="bottom" onclick="EditorInsertList('ol')"/> <titledbutton src="chrome://editor/skin/images/ED_Indent.gif" align="bottom" onclick="EditorIndent('indent')"/> <titledbutton src="chrome://editor/skin/images/ED_Left.gif" align="bottom" class="popup" onclick="EditorAlign('left')"/> - <titledbutton src="chrome://editor/skin/images/ED_Link.gif" align="bottom" class="popup" onclick="EditorInsertLink()"/> + <titledbutton src="chrome://editor/skin/images/ED_Link.gif" align="bottom" onclick="EditorInsertLink()"/> + <titledbutton src="chrome://editor/skin/images/ED_Image.gif" align="bottom" onclick= "EditorInsertImage()"/> </toolbar> </toolbox> - <html:iframe type="content" id="content-frame" html:name="content" html:src="chrome://editor/content/EditorInitPage.html" flex="100%" /> - + <html:iframe type="content" id="content-frame" html:src="chrome://editor/content/EditorInitPage.html" flex="100%" /> </box> + </window> diff --git a/editor/ui/composer/content/EditorCommands.js b/editor/ui/composer/content/EditorCommands.js index e54959d447c9..3e59ad28e981 100644 --- a/editor/ui/composer/content/EditorCommands.js +++ b/editor/ui/composer/content/EditorCommands.js @@ -1,247 +1,219 @@ - var editorType = "html"; - var editorName = "EditorAppCoreHTML"; - - /* the following variables are expected to be defined - in the embedding file: +/* Main Composer window UI control */ + + /*the editor type, i.e. "text" or "html" */ + var editorType = "html"; + /* the name of the editor. Must be unique to this window clique */ + var editorName = "EditorAppCoreHTML"; + var appCore = null; + var toolkitCore = null; - var editorType -- the editor type, i.e. "text" or "html" - var editorName -- the name of the editor. Must be unique to this window clique - */ - function Startup() { dump("Doing Startup...\n"); + + /* Get the global Editor AppCore and the XPFE toolkit core into globals here */ appCore = XPAppCoresManager.Find(editorName); dump("Looking up EditorAppCore...\n"); if (appCore == null) { dump("Creating EditorAppCore...\n"); appCore = new EditorAppCore(); - if (appCore != null) { + if (appCore) { dump("EditorAppCore has been created.\n"); appCore.Init(editorName); appCore.setEditorType(editorType); - appCore.setContentWindow(window.frames[0]); - appCore.setWebShellWindow(window); - appCore.setToolbarWindow(window); + appCore.setContentWindow( window.frames[0] ); + appCore.setWebShellWindow(window); + appCore.setToolbarWindow(window); + dump("EditorAppCore windows have been set.\n"); } } else { dump("EditorAppCore has already been created! Why?\n"); } + toolkitCore = XPAppCoresManager.Find("ToolkitCore"); + if (!toolkitCore) { + toolkitCore = new ToolkitCore(); + if (toolkitCore) { + toolkitCore.Init("ToolkitCore"); + dump("ToolkitCore initialized for Editor\n"); + } + } else { + dump("ToolkitCore found\n"); + } } function EditorFind(firstTime) { - var toolkitCore = XPAppCoresManager.Find("ToolkitCore"); - if (!toolkitCore) { - toolkitCore = new ToolkitCore(); - if (toolkitCore) { - toolkitCore.Init("ToolkitCore"); - } - } if (toolkitCore && firstTime) { toolkitCore.ShowWindow("resource:/res/samples/find.xul", window); } - appCore = XPAppCoresManager.Find(editorName); - if (appCore != null) { + if (appCore) { appCore.find("test", true, true); - } - } function EditorShowClipboard() { dump("In EditorShowClipboard...\n"); - appCore = XPAppCoresManager.Find(editorName); - if (appCore != null) { + if (appCore) { dump("Doing EditorShowClipboard...\n"); appCore.showClipboard(); } - + } + + function SetParagraphFormat(paraFormat) + { + if (appCore) { + dump("Doing SetParagraphFormat...\n"); + appCore.setParagraphFormat(paraFormat); + } + } + +// Debug methods to test the SELECT element used in a toolbar: + function OnChangeParaFormat() + { + dump(" *** Change Paragraph Format combobox setting\n"); + } + + function OnFocusParaFormat() + { + dump(" *** OnFocus -- Paragraph Format\n"); + } + + function OnBlurParaFormat() + { + dump(" *** OnBlur -- Paragraph Format\n"); } function EditorApplyStyle(styleName) { - appCore = XPAppCoresManager.Find(editorName); - if (appCore != null) { + if (appCore) { dump("Applying Style\n"); appCore.setTextProperty(styleName, null, null); - } else { - dump("EditorAppCore has not been created!\n"); } } function EditorRemoveStyle(styleName) { - appCore = XPAppCoresManager.Find(editorName); - if (appCore != null) { + if (appCore) { dump("Removing Style\n"); appCore.removeTextProperty(styleName, null); - } else { - dump("EditorAppCore has not been created!\n"); } } function EditorGetText() { - appCore = XPAppCoresManager.Find(editorName); - if (appCore != null) { + if (appCore) { dump("Getting text\n"); var outputText = appCore.contentsAsText; dump(outputText + "\n"); - } else { - dump("EditorAppCore has not been created!\n"); } } function EditorGetHTML() { - appCore = XPAppCoresManager.Find(editorName); - if (appCore != null) { + if (appCore) { dump("Getting HTML\n"); var outputText = appCore.contentsAsHTML; dump(outputText + "\n"); - } else { - dump("EditorAppCore has not been created!\n"); } } function EditorUndo() { - appCore = XPAppCoresManager.Find(editorName); - if (appCore != null) { + if (appCore) { dump("Undoing\n"); appCore.undo(); - } else { - dump("EditorAppCore has not been created!\n"); } } function EditorRedo() { - appCore = XPAppCoresManager.Find(editorName); - if (appCore != null) { + if (appCore) { dump("Redoing\n"); appCore.redo(); - } else { - dump("EditorAppCore has not been created!\n"); } } function EditorCut() { - appCore = XPAppCoresManager.Find(editorName); - if (appCore != null) { + if (appCore) { dump("Cutting\n"); appCore.cut(); - } else { - dump("EditorAppCore has not been created!\n"); } } function EditorCopy() { - appCore = XPAppCoresManager.Find(editorName); - if (appCore != null) { + if (appCore) { dump("Copying\n"); appCore.copy(); - } else { - dump("EditorAppCore has not been created!\n"); } } function EditorPaste() { - appCore = XPAppCoresManager.Find(editorName); - if (appCore != null) { + if (appCore) { dump("Pasting\n"); appCore.paste(); - } else { - dump("EditorAppCore has not been created!\n"); } } function EditorSelectAll() { - appCore = XPAppCoresManager.Find(editorName); - if (appCore != null) { + if (appCore) { dump("Selecting all\n"); appCore.selectAll(); - } else { - dump("EditorAppCore has not been created!\n"); } } function EditorInsertText() { - appCore = XPAppCoresManager.Find(editorName); - if (appCore != null) { + if (appCore) { dump("Inserting text\n"); appCore.insertText("Once more into the breach, dear friends.\n"); - } else { - dump("EditorAppCore has not been created!\n"); } } function EditorInsertLink() { - dump("Starting Insert Link...\n"); - appCore = XPAppCoresManager.Find(editorName); - if (appCore != null) { - dump("Link Properties Dialog starting...\n"); - var toolkitCore = GetToolkitCore(); - if (toolkitCore) { - toolkitCore.ShowModalDialog("chrome://editordlgs/content/EdLinkProps.xul", - window); - } - } else { - dump("EditorAppCore has not been created!\n"); + dump("Starting Insert Link... appCore, toolkitCore: "+(appCore==null)+(toolkitCore==null)+"\n"); + if (appCore && toolkitCore) { + dump("Link Properties Dialog starting...\n"); + toolkitCore.ShowModalDialog("chrome://editordlgs/content/EdLinkProps.xul", + window); } } function EditorInsertList(listType) { - appCore = XPAppCoresManager.Find(editorName); - if (appCore != null) { + if (appCore) { dump("Inserting link\n"); appCore.insertList(listType); - } else { - dump("EditorAppCore has not been created!\n"); } } function EditorInsertImage() { - appCore = XPAppCoresManager.Find(editorName); - if (appCore != null) { - dump("Inserting image\n"); - appCore.insertImage(); - } else { - dump("EditorAppCore has not been created!\n"); + dump("Starting Insert Image...\n"); + if (appCore && toolkitCore) { + dump("Link Properties Dialog starting...\n"); + toolkitCore.ShowModalDialog("chrome://editordlgs/content/EdImageProps.xul", + window); } } - + function EditorExit() { - appCore = XPAppCoresManager.Find(editorName); - if (appCore != null) { + if (appCore) { dump("Exiting\n"); appCore.exit(); - } else { - dump("EditorAppCore has not been created!\n"); } } function EditorPrintPreview() { - var toolkitCore = XPAppCoresManager.Find("ToolkitCore"); - if (!toolkitCore) { - toolkitCore = new ToolkitCore(); - if (toolkitCore) - toolkitCore.Init("ToolkitCore"); - } if (toolkitCore) { toolkitCore.ShowWindow("resource:/res/samples/printsetup.html", window); } @@ -250,8 +222,7 @@ function EditorInsertLink() function EditorTestSelection() { - appCore = XPAppCoresManager.Find(editorName); - if (appCore != null) + if (appCore) { dump("Testing selection\n"); var selection = appCore.editorSelection; @@ -266,17 +237,12 @@ function EditorInsertLink() } } - } - else - { - dump("EditorAppCore has not been created!\n"); } } function EditorTestDocument() { - appCore = XPAppCoresManager.Find(editorName); - if (appCore != null) + if (appCore) { dump("Getting document\n"); var theDoc = appCore.editorDocument; @@ -290,10 +256,6 @@ function EditorInsertLink() { dump("Failed to get the doc\n"); } - } - else - { - dump("EditorAppCore has not been created!\n"); } } @@ -319,12 +281,3 @@ function EditorInsertLink() } } - function GetToolkitCore() { - var toolkitCore = XPAppCoresManager.Find("ToolkitCore"); - if (!toolkitCore) { - toolkitCore = new ToolkitCore(); - if (toolkitCore) - toolkitCore.Init("ToolkitCore"); - } - return toolkitCore; - } diff --git a/editor/ui/composer/content/EditorInitPage.html b/editor/ui/composer/content/EditorInitPage.html index dc135b50939b..9f958e688944 100644 --- a/editor/ui/composer/content/EditorInitPage.html +++ b/editor/ui/composer/content/EditorInitPage.html @@ -19,7 +19,7 @@ the writings of my later "hard-livin" years. It's titled "Reruns": <blockquote> <h4>Reruns</h4> Reruns are about as much fun,<br> -as your dad taking all your mon,<br> +as your dad taking all your money,<br> and giving it to a nun,<br> as a contribution. </blockquote> diff --git a/editor/ui/composer/skin/Editor.css b/editor/ui/composer/skin/Editor.css index e69de29bb2d1..2057c0cc8155 100644 --- a/editor/ui/composer/skin/Editor.css +++ b/editor/ui/composer/skin/Editor.css @@ -0,0 +1,40 @@ +/* These are critical - should be in xul.css */ +window#main-window { + width: 100%; + height: 100%; +} + +box#outer-box { + width: 100%; + height: 100%; +} + +select#paraFormat { +} + +select#fontFace { +} + +select#fontSize { +} + +select.combobox { + font-family: Sans-Serif; + font-size: 8pt; + border-top: 3px; + border-left: 4px; + border-right: 4px; + border-style: outset; + //background: silver; +} + +select[pseudoclass~="hover"] { +/* NOT WORKING */ + background: red; +} + +p, br, td { + font-color: red; + background-color: #ffffcc +} + diff --git a/editor/ui/composer/skin/makefile.win b/editor/ui/composer/skin/makefile.win index 436a41cdc186..5ae6ae7d574a 100644 --- a/editor/ui/composer/skin/makefile.win +++ b/editor/ui/composer/skin/makefile.win @@ -20,6 +20,7 @@ DEPTH=..\..\..\.. include <$(DEPTH)\config\rules.mak> install:: $(DLL) + $(MAKE_INSTALL) Editor.css $(DIST)\bin\chrome\editor\composer\skin\default $(MAKE_INSTALL) images\ED_Bold.gif $(DIST)\bin\chrome\editor\composer\skin\default\images $(MAKE_INSTALL) images\ED_Bullets.gif $(DIST)\bin\chrome\editor\composer\skin\default\images $(MAKE_INSTALL) images\ED_Center.gif $(DIST)\bin\chrome\editor\composer\skin\default\images @@ -45,6 +46,7 @@ install:: $(DLL) $(MAKE_INSTALL) images\ED_Undo.gif $(DIST)\bin\chrome\editor\composer\skin\default\images clobber:: + rm -f $(DIST)\bin\chrome\editor\composer\skin\default\Editor.css rm -f $(DIST)\bin\chrome\editor\composer\skin\default\images\ED_Bold.gif rm -f $(DIST)\bin\chrome\editor\composer\skin\default\images\ED_Bullets.gif rm -f $(DIST)\bin\chrome\editor\composer\skin\default\images\ED_Center.gif diff --git a/editor/ui/dialogs/content/EdCharacterProps.xul b/editor/ui/dialogs/content/EdCharacterProps.xul index 161cea6bae05..5736afc6833c 100644 --- a/editor/ui/dialogs/content/EdCharacterProps.xul +++ b/editor/ui/dialogs/content/EdCharacterProps.xul @@ -7,87 +7,6 @@ xmlns:xul ="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" onload = "Startup()"> - <html:script> - // dialog initialization code - function Startup() - { - dump("Doing Startup...\n"); - appCore = XPAppCoresManager.Find("EditorAppCore"); - dump("Looking up EditorAppCore...\n"); - if (appCore == null) { - dump("Creating EditorAppCore...\n"); - appCore = new EditorAppCore(); - if (appCore != null) { - dump("EditorAppCore has been created.\n"); - appCore.Init("EditorAppCore"); -// appCore.setContentWindow(window.frames[0]); -// appCore.setWebShellWindow(window); -// appCore.setToolbarWindow(window); - dump("Adding EditorAppCore to AppCoreManager...\n"); - XPAppCoresManager.Add(appCore); - } - } else { - dump("EditorAppCore has already been created! Why?\n"); - } - } - - function EditorCut() - { - appCore = XPAppCoresManager.Find("EditorAppCore"); - if (appCore != null) { - dump("Cutting\n"); - appCore.cut(); - } else { - dump("EditorAppCore has not been created!\n"); - } - } - - function EditorCopy() - { - appCore = XPAppCoresManager.Find("EditorAppCore"); - if (appCore != null) { - dump("Copying\n"); - appCore.copy(); - } else { - dump("EditorAppCore has not been created!\n"); - } - } - - function EditorPaste() - { - appCore = XPAppCoresManager.Find("EditorAppCore"); - if (appCore != null) { - dump("Pasting\n"); - appCore.paste(); - } else { - dump("EditorAppCore has not been created!\n"); - } - } - - // find and return the DOM element with the given ID - // the equivalent of document.getElementById(), but also - // works for XML documents (unused in the example) - function ElementByID(id) { - var element; - var ctr; - var taglist = document.getElementsByTagName("*"); - - element = null; - for (ctr = 0; ctr < taglist.length; ctr++) - if (taglist[ctr].getAttribute("id") == id) { - element = taglist[ctr]; - break; - } - return element; - } + <html:script language="JavaScript" src="chrome://editordlgs/content/EdCharacterProps.js"> </html:script> - - <table xmlns="http://www.w3.org/TR/REC-html40"> - <tr> - <td><button onclick="EditorCopy()">Copy</button></td> - <td><button onclick="EditorCut()">Cut</button></td> - <td><button onclick="EditorPaste()">Paste</button></td> - </tr> - </table> - </xul:window> diff --git a/editor/ui/dialogs/content/EdImageProps.xul b/editor/ui/dialogs/content/EdImageProps.xul index 81dc213b757e..cc3837bca183 100644 --- a/editor/ui/dialogs/content/EdImageProps.xul +++ b/editor/ui/dialogs/content/EdImageProps.xul @@ -1,57 +1,51 @@ <?xml version="1.0"?> -<?xml-stylesheet href="xul.css" type="text/css"?> -<?xml-stylesheet href="EditorDialog.css" type="text/css"?> +<?xml-stylesheet href="chrome://global/skin/xul.css" type="text/css"?> +<?xml-stylesheet href="chrome://editordlgs/skin/EditorDialog.css" type="text/css"?> <!DOCTYPE window> <!-- dialog containing a control requiring initial setup --> -<xul:window width="200" height="200" - xmlns:html="http://www.w3.org/TR/REC-html40" +<xul:window width="370" height="255" title="Image Properties" xmlns:xul ="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" + xmlns="http://www.w3.org/TR/REC-html40" onload = "Startup()"> - <html:script> - // dialog initialization code - function Startup() - { - dump("Doing Startup...\n"); - appCore = XPAppCoresManager.Find("EditorAppCore"); - if (appCore == null) { - dump("EditorAppCore has NOT been created!\n"); - } else { - dump("EditorAppCore was found\n"); - } - } - - // find and return the DOM element with the given ID - // the equivalent of document.getElementById(), but also - // works for XML documents (unused in the example) - function ElementByID(id) { - var element; - var ctr; - var taglist = document.getElementsByTagName("*"); - - element = null; - for (ctr = 0; ctr < taglist.length; ctr++) - if (taglist[ctr].getAttribute("id") == id) { - element = taglist[ctr]; - break; - } - return element; - } - </html:script> - - <table xmlns="http://www.w3.org/TR/REC-html40"> + <script language="JavaScript" src="chrome://editordlgs/content/EdImageProps.js"> + </script> + <table> <tr> - <td width="500"> - <fieldset><legend align="left"> <xul:checkbox value="Image Location and Name"/>Image Location and Name </legend> + <td> + <fieldset><legend align="left">Image Information </legend> + <input type="file" value=" Choose File... " size="50" length="50" maxlength="255" id="image.url" /> + <br/> + <p class="smallmargin">Alternative Text</p> + <input type="text" size="30" length="30" maxlength="255" id="image.AltText" /> + </fieldset> + </td> + </tr> + <tr> + <td align = "right"> + <button class="spaced" id="OK" onclick="onOK()" width="50">OK</button> + <button class="spaced" id="Preview" onclick="applyChanges()" width="50">Preview</button> + <button class="spaced" id="Undo" onclick="onUndo()" width="50">Undo</button> + <button class="spaced" id="Cancel" onclick="onCancel()" width="50">Cancel</button> + </td> + </tr> +</table> +</xul:window> + +<!-- The old stuff: + <table> + <tr> + <td> + <fieldset><legend align="left">Image Location and Name </legend> <input type="file" value=" Choose File... " size="50" length="50" maxlength="255" name="image.url" /> <br/> - <xul:checkbox value="Leave Image at Original Location" disabled /> + <xul:checkbox value="1"/> Leave Image at Original Location - <xul:checkbox value="Page Background" disabled /> + <xul:checkbox value="1"/> Page Background - <input type="button" value=" Edit Image " disabled /> + <input type="button" value=" Edit Image "/> <br/> Alternative Text <input type="text" size="30" length="30" maxlength="255" name="image.alttext" /> @@ -67,13 +61,13 @@ <xul:radio name="image.dimensionType" value="Custom Size" /> Custom Size - <table cellspacing="0" cellpadding="2" width="100%" valign="top"> + <table> <tr> <td width="8"></td> <td width="40" valign="middle" align="right"> <p>Height</p> </td> - <td valign="middle"> + <td> <input type="text" size="4" length="4" maxlength="4" name="image.height" /> <select size="1" name="image.heightType"> <optgroup label="pixels"> @@ -100,8 +94,6 @@ </tr> <tr> - <td/> - <td/> <td> <p> <xul:checkbox value="Constrain" disabled /> @@ -141,7 +133,7 @@ </td> </tr> - <tr valign="middle"> + <tr> <td> <p>Top and Bottom</p> </td> @@ -153,7 +145,7 @@ </td> </tr> - <tr valign="middle"> + <tr> <td align="right"> <p>Solid Border</p> </td> @@ -187,5 +179,5 @@ </td> </tr> </table> +--> -</xul:window> diff --git a/editor/ui/dialogs/content/EdLinkProps.js b/editor/ui/dialogs/content/EdLinkProps.js index d338b3c35faa..c4798aa11533 100644 --- a/editor/ui/dialogs/content/EdLinkProps.js +++ b/editor/ui/dialogs/content/EdLinkProps.js @@ -1,106 +1,157 @@ - var appCore; - var toolkitCore; +var appCore; +var toolkitCore; +var anchorElement = null; +var insertNew = true; +var needLinkText = false; +var selectionIsCollapsed = false; +var undoCount = 0; - var editElement = null; - var insertNew = true; +// NOTE: Use "HREF" instead of "A" to distinguish from Named Anchor +// The returned node is has an "A" tagName +var tagName = "HREF"; +var data; +var dialog; - // NOTE: Use "HREF" instead of "A" to distinguish from Named Anchor - // The returned nodes will have the "A" tagName - var tagName = "HREF"; +// dialog initialization code +function Startup() { + dump("Doing Startup...\n"); + toolkitCore = XPAppCoresManager.Find("ToolkitCore"); + if (!toolkitCore) { + toolkitCore = new ToolkitCore(); + if (toolkitCore) + toolkitCore.Init("ToolkitCore"); + } + if(!toolkitCore) { + dump("toolkitCore not found!!! And we can't close the dialog!\n"); + } - // dialog initialization code - function Startup() { - dump("Doing Startup...\n"); - toolkitCore = GetToolkitCore(); - if(!toolkitCore) { - dump("toolkitCore not found!!! And we can't close the dialog!\n"); - } - // NEVER create an appcore here - we must find parent editor's - appCore = XPAppCoresManager.Find("EditorAppCoreHTML"); - if(!appCore || !toolkitCore) { - dump("EditorAppCore not found!!!\n"); - toolkitCore.CloseWindow(); - } - dump("EditorAppCore found for Link Properties dialog\n"); - - // Get a single selected element and edit its properites - editElement = appCore.getSelectedElement(tagName); + // NEVER create an appcore here - we must find parent editor's + appCore = XPAppCoresManager.Find("EditorAppCoreHTML"); + if(!appCore || !toolkitCore) { + dump("EditorAppCore not found!!!\n"); + toolkitCore.CloseWindow(window); + } + dump("EditorAppCore found for Link Properties dialog\n"); + + // Create dialog object to store controls for easy access + dialog = new Object; + dialog.linkTextInput = document.getElementById("linkTextInput"); + dialog.hrefInput = document.getElementById("hrefInput"); + dialog.linkMessage = document.getElementById("linkMessage"); + dialog.ok = document.getElementById("OK"); - if (editElement) { - // We found an element and don't need to insert it - insertNew = false; - } else { - // We don't have an element selected, - // so create one with default attributes - dump("Element not selected - calling createElementWithDefaults\n"); - editElement = appCore.createElementWithDefaults(tagName); - } + if (null == dialog.linkTextInput || + null == dialog.hrefInput || + null == dialog.linkMessage || + null == dialog.ok ) + { + dump("Not all dialog controls were found!!!\n"); + } - if(!editElement) - { - dump("Failed to get selected element or create a new one!\n"); - toolkitCore.CloseWindow(window); - } - dump("GetSelectedElement...\n"); - - hrefInput = document.getElementById("textHREF"); - // Set the input element value to current HREF - if (hrefInput) - { - dump("Setting HREF editbox value\n"); - hrefInput.value = editNode.href; - } - } - - function applyChanges() { - // Set the input element value to current HREF - hrefInput = document.getElementById("textHREF"); - if (hrefInput) - { - dump("Copying edit field HREF value to node attribute\n"); - editElement.setAttribute("href",hrefInput.value); - } - // Get text to use for a new link - if (insertNew) - { - textLink = document.getElementById("textLink"); - if (textLink) - { - // Append the link text as the last child node - // of the docFrag - textNode = appCore.editorDocument.createTextNode(textLink.value); - if (textNode) - { - editElement.appendChild(textNode); - dump("Text for new link appended to HREF node\n"); - newElement = appCore.insertElement(editElement, true); - if (newElement != editElement) - { - dump("Returned element from insertElement is different from orginal element.\n"); - } - } - } - // Once inserted, we can modify properties, but don't insert again - insertNew = false; - } + if (!insertNew) + { + var parent = dialog.linkTextInput.parentNode; + if (parent) { + parent.removeChild(dialog.linkTextInput); + dialog.linkTextInput = null; + // TODO: Replace the text with the currently-selected text } + } + initDialog(); +} - function onOK() { - applyChanges(); - toolkitCore.CloseWindow(window); - } +function initDialog() { + // Get a single selected anchor element + anchorElement = appCore.getSelectedElement(tagName); - function onCancel() { - dump("Calling CloseWindow...\n"); - toolkitCore.CloseWindow(window); - } + selection = appCore.editorSelection; + if (selection) + { + selectionIsCollapsed = selection.selectionIsCollapsed; + dump("There is a selection: collapsed = "+selectionIsCollapsed+"\n"); + } else { + dump("Failed to get selection\n"); + } - function GetToolkitCore() { - var toolkitCore = XPAppCoresManager.Find("ToolkitCore"); - if (!toolkitCore) { - toolkitCore = new ToolkitCore(); - if (toolkitCore) - toolkitCore.Init("ToolkitCore"); - } - return toolkitCore; + if (anchorElement) { + // We found an element and don't need to insert one + insertNew = false; + + // BUT href is a weird case: If selection extends beyond + // the link, user probably wants to extend link to + // entire selection. We do this by "inserting" the link + // (actually does the appropriate reparenting) + if (!selectionIsCollapsed) + { + insertNew = true; } + } else { + insertNew = true; + // We don't have an element selected, + // so create one with default attributes + dump("Element not selected - calling createElementWithDefaults\n"); + anchorElement = appCore.createElementWithDefaults(tagName); + } + + if(!anchorElement) + { + dump("Failed to get selected element or create a new one!\n"); + toolkitCore.CloseWindow(window); + } +} + +function applyChanges() +{ + // Coalesce into one undo transaction + appCore.beginBatchChanges(); + + // Set the HREF directly on the editor document's anchor node + // or on the newly-created node if insertNew is true + anchorElement.setAttribute("href",dialog.hrefInput.value); + + // Get text to use for a new link + if (insertNew) + { + // Append the link text as the last child node + // of the anchor node + textNode = appCore.editorDocument.createTextNode(dialog.linkTextInput.value); + if (textNode) + { + anchorElement.appendChild(textNode); + } + newElement = appCore.insertElement(anchorElement, true); + if (newElement != anchorElement) + { + dump("Returned element from insertElement is different from orginal element.\n"); + } + } + undoCount = undoCount + 1; + appCore.endBatchChanges(); + + // Reinitialize dialog data + initDialog(); +} + +function onUndo() { + if (undoCount > 0) + { + dump("Undo count = "+undoCount+"\n"); + undoCount = undoCount - 1; + appCore.undo(); + } +} + +function onOK() { + applyChanges(); + //toolkitCore.CloseWindow(window); +} + +function onCancel() { + // Undo all actions performed within the dialog + // TODO: We need to suppress reflow/redraw untill all levels are undone + while (undoCount > 0) { + appCore.undo(); + } + //toolkitCore.CloseWindow(window); +} + diff --git a/editor/ui/dialogs/content/EdLinkProps.xul b/editor/ui/dialogs/content/EdLinkProps.xul index 49a9be2a47d9..d365778dd4bf 100644 --- a/editor/ui/dialogs/content/EdLinkProps.xul +++ b/editor/ui/dialogs/content/EdLinkProps.xul @@ -2,40 +2,38 @@ <?xml-stylesheet href="chrome://global/skin/xul.css" type="text/css"?> <?xml-stylesheet href="chrome://editordlgs/skin/EditorDialog.css" type="text/css"?> <!DOCTYPE window> -<xul:window width="380" height="240" - xmlns:html="http://www.w3.org/TR/REC-html40" +<xul:window width="320" height="255" title="Link Properties" xmlns:xul ="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" + xmlns="http://www.w3.org/TR/REC-html40" onload = "Startup()"> - <html:script> - </html:script> - - <html:script language="JavaScript" src="chrome://editordlgs/content/EdLinkProps.js"> - </html:script> - - <html:table> - <html:tr> - <html:td> - <html:fieldset><html:legend align="left">Link source </html:legend> - Enter text to display for a new link:<html:br/> - <html:input type="text" size="25" length="25" maxlength="100" name="textLink" html:id="textLink"></html:input> - </html:fieldset> - </html:td> - </html:tr> - <html:tr> - <html:td> - <html:fieldset><html:legend align="left">Link to </html:legend> - Enter a web page location or local file:<html:br/> - <html:input type="text" size="25" length="25" maxlength="100" name="textHREF" html:id="textHREF"></html:input> - </html:fieldset> - </html:td> - </html:tr> - <html:tr> - <html:td align = "right"> - <html:button onclick="onOK();">OK</html:button> - <html:button onclick="onCancel();">Cancel</html:button> - </html:td> - </html:tr> - </html:table> - + <script language="JavaScript" src="chrome://editordlgs/content/EdLinkProps.js"> + </script> + <table> + <tr> + <td> + <fieldset><legend align="left">Link source </legend> + <p class="smallmargin" id="linkMessage"> Enter text to display for a new link:</p> + <input type="text" size="25" length="25" maxlength="100" id="linkTextInput"></input> + </fieldset> + </td> + </tr> + <tr> + <td> + <fieldset><legend align="left">Link to </legend> + <p class="smallmargin">Enter a web page location or local file: + <button class="ChooseFile" id="ChooseFile" align="top">Choose File</button></p> + <input type="text" size="25" length="25" maxlength="100" id="hrefInput"></input> + </fieldset> + </td> + </tr> + <tr> + <td align = "right"> + <button class="spaced" id="OK" onclick="onOK()" width="50">OK</button> + <button class="spaced" id="Preview" onclick="applyChanges()" width="50">Preview</button> + <button class="spaced" id="Undo" onclick="onUndo()" width="50">Undo</button> + <button class="spaced" id="Cancel" onclick="onCancel()" width="50">Cancel</button> + </td> + </tr> + </table> </xul:window> diff --git a/editor/ui/dialogs/content/Makefile.in b/editor/ui/dialogs/content/Makefile.in index ca84430b20c0..64ec9457c260 100644 --- a/editor/ui/dialogs/content/Makefile.in +++ b/editor/ui/dialogs/content/Makefile.in @@ -31,6 +31,8 @@ EXPORT_RESOURCE_CONTENT = \ $(srcdir)/EdImageProps.xul \ $(srcdir)/EdCharacterProps.xul \ $(srcdir)/EdLinkProps.js \ + $(srcdir)/EdImageProps.js \ + $(srcdir)/EdCharacterProps.js \ $(NULL) install:: diff --git a/editor/ui/dialogs/content/makefile.win b/editor/ui/dialogs/content/makefile.win index 4bf669109e0d..8981f33f01d5 100644 --- a/editor/ui/dialogs/content/makefile.win +++ b/editor/ui/dialogs/content/makefile.win @@ -23,10 +23,14 @@ install:: $(MAKE_INSTALL) EdLinkProps.xul $(DIST)\bin\chrome\editor\dialogs\content\default $(MAKE_INSTALL) EdLinkProps.js $(DIST)\bin\chrome\editor\dialogs\content\default $(MAKE_INSTALL) EdImageProps.xul $(DIST)\bin\chrome\editor\dialogs\content\default + $(MAKE_INSTALL) EdImageProps.js $(DIST)\bin\chrome\editor\dialogs\content\default $(MAKE_INSTALL) EdCharacterProps.xul $(DIST)\bin\chrome\editor\dialogs\content\default + $(MAKE_INSTALL) EdCharacterProps.js $(DIST)\bin\chrome\editor\dialogs\content\default clobber:: rm -f $(DIST)\bin\chrome\editor\dialogs\content\default\EdLinkProps.xul rm -f $(DIST)\bin\chrome\editor\dialogs\content\default\EdLinkProps.js rm -f $(DIST)\bin\chrome\editor\dialogs\content\default\EdImageProps.xul + rm -f $(DIST)\bin\chrome\editor\dialogs\content\default\EdImageProps.js rm -f $(DIST)\bin\chrome\editor\dialogs\content\default\EdCharacterProps.xul + rm -f $(DIST)\bin\chrome\editor\dialogs\content\default\EdCharacterProps.js diff --git a/editor/ui/dialogs/skin/EditorDialog.css b/editor/ui/dialogs/skin/EditorDialog.css index 3785aa0f3cb1..d051e4caa832 100644 --- a/editor/ui/dialogs/skin/EditorDialog.css +++ b/editor/ui/dialogs/skin/EditorDialog.css @@ -9,15 +9,40 @@ window, WINDOW { font-size: 8pt; } -/* Defeat the default behavior of borderless until rollover */ -button { border: 2px outset } - /* values = margin, padding. Padding doesn't work yet */ -checkbox, CHECKBOX { margin: 5px 3px } +checkbox { margin: 5px 3px } -radio, RADIO { margin: 5px 3px } +tristatecheckbox { + /* DOESN'T WORK! */ + margin-top: 3px; + margin-bottom:3px; + margin-left: 2px; + margin-right: 2px; + border-style: inset; + background-color: #ffffff; + valign: center; + align: center; +} -tree, TREE { +select.combobox { + font-family: Sans-Serif; + font-size: 8pt; + border-top: 2px; + border-left: 4px; + border-right: 2px; + border-style: outset; +} + +.checkboxtext { + margin-top: -9px; + margin-left: 3px; + margin-right: 5px; + margin-bottom: 2px; +} + +radio { margin: 5px 3px } + +tree { display: table; background-color: #000000; border: none; @@ -30,10 +55,8 @@ tree, TREE { /* Force all rows to line up cell contents at the top */ tr, TR { vertical-align: top } -/* FOR DEBUG PURPOSE -- SHOW CELL BORDER */ -td, TD { border-width: 0px; border-style: inset } - -table, TABLE { border-width: 0px } +/* FOR DEBUG PURPOSE -- use border-width: 1px */ +td, table { border-width: 0px; } p, br, td { font-family: Sans-Serif; @@ -42,15 +65,18 @@ p, br, td { margin-bottom: 4px } -fieldset, FIELDSET { - border-width: 3px; +p.smallmargin { margin-bottom: 2px } + +fieldset { + border-width: 2px; border-style: groove; - padding: 3px; - margin: 5px; + padding: 5px; +/* BUG: If this is set, border is chopped off at the right */ +/* margin: 5px; */ text-align: left; } -legend, LEGEND { +legend { font-family: Sans-Serif; font-size: 10pt; border-width: 0; @@ -58,14 +84,27 @@ legend, LEGEND { } /* CLASSES */ -[CLASS~=GrooveBorder] { border: 2px groove; padding: 3px } +/* Use these primarily with TD to create 3D "panels" */ +.GrooveBorder { border: 2px groove; padding: 5px } -[CLASS~=RidgeBorder] { border: 2px ridge; padding: 3px } +.RidgeBorder { border: 2px ridge; padding: 5px } -[CLASS~=OutsetBorder] { border: 1px outset; padding: 3px } +.OutsetBorder { border: 1px outset; padding: 5px } -[CLASS~=InsetBorder] { border: 1px inset; padding: 3px } +.InsetBorder { border: 1px inset; padding: 5px } +button.spaced { +/* BUG - Setting size doesn't work? + width: 80px; + height: 20px; +*/ + margin: 5px; +} + +button.ChooseFile { + margin-bottom: 3px; + margin-right: 5px; +} .tableCenterAlign { vertical-align: middle; @@ -78,6 +117,14 @@ legend, LEGEND { margin-bottom: 5px; } +.spacedtext { + margin-top: 0px; + margin-left: 3px; + margin-right: 5px; + margin-bottom: 2px; +} + + /* IDs only one button per dialog */ #okbutton { width: 80px; diff --git a/suite/debugQA/content/EditorInitPage.html b/suite/debugQA/content/EditorInitPage.html index dc135b50939b..9f958e688944 100644 --- a/suite/debugQA/content/EditorInitPage.html +++ b/suite/debugQA/content/EditorInitPage.html @@ -19,7 +19,7 @@ the writings of my later "hard-livin" years. It's titled "Reruns": <blockquote> <h4>Reruns</h4> Reruns are about as much fun,<br> -as your dad taking all your mon,<br> +as your dad taking all your money,<br> and giving it to a nun,<br> as a contribution. </blockquote>