Make setting doc title undoable (add SetDocumentTitle transaction) b=60129, add export to text file, b=51798, some interface param changes to table editing methods as part of embedding work (b=66300). r=brade, sr=sfraser

This commit is contained in:
cmanske%netscape.com 2001-02-26 22:02:58 +00:00
Родитель ea5f6e6237
Коммит d2efc15e1b
18 изменённых файлов: 381 добавлений и 356 удалений

Просмотреть файл

@ -91,6 +91,7 @@ CPPSRCS += nsAOLCiter.cpp \
nsWrapUtils.cpp \
TextEditorTest.cpp \
TypeInState.cpp \
SetDocTitleTxn.cpp \
$(NULL)
# Enable Editor API Logging!

Просмотреть файл

@ -35,6 +35,7 @@
#include "JoinElementTxn.h"
#include "nsStyleSheetTxns.h"
#include "IMETextTxn.h"
#include "SetDocTitleTxn.h"
TransactionFactory::TransactionFactory()
{
@ -75,6 +76,8 @@ TransactionFactory::GetNewTransaction(REFNSIID aTxnType, EditTxn **aResult)
*aResult = new AddStyleSheetTxn();
else if (aTxnType.Equals(RemoveStyleSheetTxn::GetCID()))
*aResult = new RemoveStyleSheetTxn();
else if (aTxnType.Equals(SetDocTitleTxn::GetCID()))
*aResult = new SetDocTitleTxn();
else if (aTxnType.Equals(PlaceholderTxn::GetCID()))
*aResult = new PlaceholderTxn();
else

Просмотреть файл

@ -126,6 +126,7 @@ CPPSRCS = $(CPPSRCS) \
nsWrapUtils.cpp \
TextEditorTest.cpp \
TypeInState.cpp \
SetDocTitleTxn.cpp \
$(NULL)
CPP_OBJS = $(CPP_OBJS) \
@ -145,6 +146,7 @@ CPP_OBJS = $(CPP_OBJS) \
.\$(OBJDIR)\nsWrapUtils.obj \
.\$(OBJDIR)\TextEditorTest.obj \
.\$(OBJDIR)\TypeInState.obj \
.\$(OBJDIR)\SetDocTitleTxn.obj \
$(NULL)
# Enable Editor API Logging!

Просмотреть файл

@ -889,15 +889,23 @@ nsEditor::SaveFile(nsIFile *aFileSpec, PRBool aReplaceExisting,
if (!diskDoc)
return NS_ERROR_NO_INTERFACE;
// Should we prettyprint?
PRUint32 flags = nsIDocumentEncoder::OutputEncodeEntities;
NS_WITH_SERVICE(nsIPref, prefService, kPrefServiceCID, &rv);
if (NS_SUCCEEDED(rv) && prefService)
if (aFormat == NS_LITERAL_STRING("text/plain"))
{
PRBool prettyprint = PR_FALSE;;
rv = prefService->GetBoolPref("editor.prettyprint", &prettyprint);
if (NS_SUCCEEDED(rv) && prettyprint)
flags |= nsIDocumentEncoder::OutputFormatted;
// When saving in "text/plain" format, always do formatting
flags |= nsIDocumentEncoder::OutputFormatted;
}
else
{
// Should we prettyprint? Check the pref
NS_WITH_SERVICE(nsIPref, prefService, kPrefServiceCID, &rv);
if (NS_SUCCEEDED(rv) && prefService)
{
PRBool prettyprint = PR_FALSE;;
rv = prefService->GetBoolPref("editor.prettyprint", &prettyprint);
if (NS_SUCCEEDED(rv) && prettyprint)
flags |= nsIDocumentEncoder::OutputFormatted;
}
}
PRInt32 wrapColumn = 72;

Просмотреть файл

@ -583,7 +583,7 @@ nsEditorShell::PrepareDocumentForEditing(nsIDOMWindow* aDOMWindow, nsIURI *aUrl)
}
// Set the editor-specific Window caption
UpdateWindowTitle();
UpdateWindowTitleAndRecentMenu(PR_TRUE);
nsCOMPtr<nsIEditorStyleSheets> styleSheets = do_QueryInterface(mEditor);
if (!styleSheets)
@ -878,16 +878,12 @@ nsEditorShell::SetEditorType(const PRUnichar *editorType)
NS_IMETHODIMP
nsEditorShell::GetEditorType(PRUnichar **_retval)
{
*_retval = nsnull;
if (!_retval)
return NS_ERROR_NULL_POINTER;
nsresult err = NS_NOINTERFACE;
nsCOMPtr<nsIEditor> editor = do_QueryInterface(mEditor);
*_retval = mEditorTypeString.ToNewUnicode();
if (editor)
{
*_retval = mEditorTypeString.ToNewUnicode();
}
return err;
return NS_OK;
}
@ -1701,11 +1697,20 @@ nsEditorShell::CheckOpenWindowForURLMatch(const PRUnichar* inFileURL, nsIDOMWind
}
NS_IMETHODIMP
nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
nsEditorShell::SaveDocument(PRBool aSaveAs, PRBool aSaveCopy, const PRUnichar* aMimeType, PRBool *_retval)
{
nsresult res = NS_NOINTERFACE;
*_retval = PR_FALSE;
NS_ENSURE_ARG_POINTER((aMimeType));
nsAutoString mimeType(aMimeType);
PRBool saveAsText = mimeType.EqualsWithConversion("text/plain");
// Currently, we only understand plain text and html
if (!mimeType.EqualsWithConversion("text/html") && !saveAsText)
return NS_ERROR_FAILURE;
switch (mEditorType)
{
case ePlainTextEditorType:
@ -1727,8 +1732,9 @@ nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
// find out if the doc already has a fileSpec associated with it.
nsCOMPtr<nsIFile> docFile;
PRBool noFileSpec = (diskDoc->GetFileSpec(getter_AddRefs(docFile)) == NS_ERROR_NOT_INITIALIZED);
PRBool mustShowFileDialog = saveAs || noFileSpec;
PRBool replacing = !saveAs;
PRBool mustShowFileDialog = aSaveAs || noFileSpec;
PRBool replacing = !aSaveAs;
PRBool titleChanged = PR_FALSE;
// Get existing document title
nsAutoString title;
@ -1739,8 +1745,8 @@ nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
if (mustShowFileDialog)
{
// Prompt for title ONLY if existing title is empty
if (!mMailCompose && (mEditorType == eHTMLTextEditorType) && (title.Length() == 0))
// Prompt for title ONLY if existing title is empty and we are saving to HTML
if (!mMailCompose && (!saveAsText && mEditorType == eHTMLTextEditorType) && (title.Length() == 0))
{
// Use a "prompt" common dialog to get title string from user
NS_WITH_SERVICE(nsICommonDialogs, dialog, kCommonDialogsCID, &res);
@ -1770,11 +1776,12 @@ nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
*_retval = PR_FALSE;
return NS_OK;
}
// This sets title in HTML node
mEditor->SetDocumentTitle(titleUnicode);
title = titleUnicode;
nsCRT::free(titleUnicode);
titleChanged = PR_TRUE;
}
// This sets title in HTML node
SetDocumentTitle(title.GetUnicode());
}
nsCOMPtr<nsIFilePicker> filePicker = do_CreateInstance("@mozilla.org/filepicker;1", &res);
@ -1783,7 +1790,10 @@ nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
nsAutoString fileName;
nsAutoString promptString;
GetBundleString(NS_LITERAL_STRING("SaveDocumentAs"), promptString);
if (saveAsText)
GetBundleString(NS_LITERAL_STRING("ExportToText"), promptString);
else
GetBundleString(NS_LITERAL_STRING("SaveDocumentAs"), promptString);
// Initialize nsIFilePicker
nsCOMPtr<nsIDOMWindowInternal> parentWindow(do_QueryReferent(mContentWindow));
@ -1791,9 +1801,12 @@ nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
if (NS_FAILED(res))
return res;
// append in order so that HTML comes first and is default. test me on windows
filePicker->AppendFilters(nsIFilePicker::filterHTML);
filePicker->AppendFilters(nsIFilePicker::filterText);
// Set filters according to the type of output
if (saveAsText)
filePicker->AppendFilters(nsIFilePicker::filterText);
else
filePicker->AppendFilters(nsIFilePicker::filterHTML);
filePicker->AppendFilters(nsIFilePicker::filterAll);
if (noFileSpec)
@ -1802,10 +1815,6 @@ nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
nsString urlstring;
res = htmlDoc->GetURL(urlstring);
// ?????
// res = htmlDoc->GetSourceDocumentURL(jscx, uri);
// do a QI to get an nsIURL and then call GetFileName()
// if it's not a local file already, grab the current file name
if ( (urlstring.CompareWithConversion("file", PR_TRUE, 4) != 0 )
&& (urlstring.CompareWithConversion("about:blank", PR_TRUE, -1) != 0) )
@ -1836,15 +1845,18 @@ nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
}
if (urlstring.Length() > 0)
{
fileName.Assign( urlstring );
fileName.AppendWithConversion(".html");
title = urlstring;
}
}
}
}
// Use page title as suggested name for new document
if (fileName.Length() == 0 && title.Length() > 0)
if (title.IsEmpty())
{
title.AppendWithConversion("untitled");
}
else
{
// Strip out quote character
PRUnichar quote = (PRUnichar)'\"';
@ -1852,9 +1864,13 @@ nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
//Replace "bad" filename characteres with "_"
title.ReplaceChar(" .\\/@:", (PRUnichar)'_');
fileName = title;
fileName.AppendWithConversion(".html");
}
fileName = title;
if (saveAsText)
fileName.AppendWithConversion(".txt");
else
fileName.AppendWithConversion(".html");
}
else // have a file spec
{
@ -1863,6 +1879,22 @@ nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
if (leafName.get() && *leafName)
fileName.Assign(leafName);
if (saveAsText)
{
// Replace html-related extension with "txt"
PRInt32 index = fileName.RFind(".html", PR_TRUE);
if (index == -1)
index = fileName.RFind(".htm", PR_TRUE);
if (index == -1)
index = fileName.RFind(".shtml", PR_TRUE);
if (index > 0)
{
// Truncate after "." and append "txt" extension
fileName.SetLength(index+1);
fileName.AppendWithConversion("txt");
}
}
nsCOMPtr<nsIFile> parentPath;
if (NS_SUCCEEDED(docFile->GetParent(getter_AddRefs(parentPath))))
{
@ -1884,6 +1916,8 @@ nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
if (dialogResult == nsIFilePicker::returnCancel)
{
// Note that *_retval = PR_FALSE at this point
if (titleChanged)
UpdateWindowTitleAndRecentMenu(PR_FALSE);
return NS_OK;
}
replacing = (dialogResult == nsIFilePicker::returnReplace);
@ -1902,33 +1936,31 @@ nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
}
// Set the new URL for the webshell
nsCOMPtr<nsIWebShell> webShell(do_QueryInterface(mContentAreaDocShell));
if (webShell)
if (!aSaveCopy)
{
// would like to use nsIFile::GetURL here, but it is not implemented
// on all platforms
nsCOMPtr<nsIFileURL> fileURL(do_CreateInstance(kStandardURLCID, &res));
if (NS_FAILED(res)) return res;
nsCOMPtr<nsIWebShell> webShell(do_QueryInterface(mContentAreaDocShell));
if (webShell)
{
// would like to use nsIFile::GetURL here, but it is not implemented
// on all platforms
nsCOMPtr<nsIFileURL> fileURL(do_CreateInstance(kStandardURLCID, &res));
if (NS_FAILED(res)) return res;
res = fileURL->SetFile(docFile);
if (NS_FAILED(res)) return res;
res = fileURL->SetFile(docFile);
if (NS_FAILED(res)) return res;
nsXPIDLCString docURLSpec;
res = fileURL->GetSpec(getter_Copies(docURLSpec));
if (NS_FAILED(res)) return res;
nsXPIDLCString docURLSpec;
res = fileURL->GetSpec(getter_Copies(docURLSpec));
if (NS_FAILED(res)) return res;
nsAutoString fileURLUnicode; fileURLUnicode.AssignWithConversion(docURLSpec);
res = webShell->SetURL(fileURLUnicode.GetUnicode());
if (NS_FAILED(res)) return res;
nsAutoString fileURLUnicode; fileURLUnicode.AssignWithConversion(docURLSpec);
res = webShell->SetURL(fileURLUnicode.GetUnicode());
if (NS_FAILED(res)) return res;
}
}
} // mustShowFileDialog
// TODO: Get the file type (from the extension?) the user set for the file
// How do we do this in an XP way???
// For now, just save as HTML type
nsString format;
format.AssignWithConversion("text/html");
res = editor->SaveFile(docFile, replacing, saveCopy, format);
res = editor->SaveFile(docFile, replacing, aSaveCopy, mimeType);
if (NS_FAILED(res))
{
nsAutoString saveDocStr, failedStr;
@ -1938,11 +1970,11 @@ nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
} else {
// File was saved successfully
*_retval = PR_TRUE;
// Update window title to show possibly different filename
if (mustShowFileDialog)
UpdateWindowTitle();
}
// Update window title to show possibly different filename
// This also covers problem that after undoing a title change,
// window title looses the extra [filename] part that this adds
UpdateWindowTitleAndRecentMenu(PR_TRUE);
}
break;
}
@ -1952,6 +1984,7 @@ nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
return res;
}
NS_IMETHODIMP
nsEditorShell::CloseWindowWithoutSaving()
{
@ -2094,7 +2127,7 @@ nsEditorShell::GetLocalFileURL(nsIDOMWindowInternal *parent, const PRUnichar *fi
}
nsresult
nsEditorShell::UpdateWindowTitle()
nsEditorShell::UpdateWindowTitleAndRecentMenu(PRBool aSaveToPrefs)
{
nsresult res = NS_ERROR_NOT_INITIALIZED;
@ -2137,6 +2170,17 @@ nsEditorShell::UpdateWindowTitle()
NS_ASSERTION(contentAreaAsWin, "This object should implement nsIBaseWindow");
res = contentAreaAsWin->SetTitle(windowCaption.GetUnicode());
}
// Rebuild Recent Pages menu and save any changed URLs or titles to editor prefs
// TODO: We need to pass on aSaveToPrefs to command, but must wait for
// new command system before we can do that.
// For now, don't update the menu at all if aSaveToPrefs is false
if (aSaveToPrefs)
{
nsAutoString commandName(NS_LITERAL_STRING("cmd_buildRecentPagesMenu"));
res = DoControllerCommand(commandName);
}
return res;
}
@ -2197,107 +2241,14 @@ nsEditorShell::SetDocumentTitle(const PRUnichar *title)
if (mEditorType != eHTMLTextEditorType)
return NS_ERROR_NOT_IMPLEMENTED;
nsCOMPtr<nsIEditor> editor = do_QueryInterface(mEditor);
if (!editor)
return NS_ERROR_FAILURE;
res = mEditor->SetDocumentTitle(title);
if (NS_FAILED(res)) return res;
nsAutoString titleStr(title);
nsCOMPtr<nsIDOMDocument> domDoc;
res = editor->GetDocument(getter_AddRefs(domDoc));
if (domDoc)
{
// Get existing document title node
nsCOMPtr<nsIDOMHTMLDocument> HTMLDoc = do_QueryInterface(domDoc);
if (HTMLDoc)
{
// This sets the window title, and saves the title as a member varialble,
// but does NOT insert the <title> node.
HTMLDoc->SetTitle(titleStr);
nsCOMPtr<nsIDOMNodeList> titleList;
nsCOMPtr<nsIDOMNode>titleNode;
nsCOMPtr<nsIDOMNode>headNode;
nsCOMPtr<nsIDOMNode> resultNode;
res = domDoc->GetElementsByTagName(NS_ConvertASCIItoUCS2("title"), getter_AddRefs(titleList));
if (NS_SUCCEEDED(res))
{
if(titleList)
{
/* I'm tempted to just get the 1st title element in the list
(there should always be just 1). But in case there's > 1,
I assume the last one will be used, so this finds that one.
*/
PRUint32 len = 0;
titleList->GetLength(&len);
if (len >= 1)
titleList->Item(len-1, getter_AddRefs(titleNode));
if (titleNode)
{
//Delete existing children (text) of title node
nsCOMPtr<nsIDOMNodeList> children;
res = titleNode->GetChildNodes(getter_AddRefs(children));
if(NS_SUCCEEDED(res) && children)
{
PRUint32 count = 0;
children->GetLength(&count);
for( PRUint32 i = 0; i < count; i++)
{
nsCOMPtr<nsIDOMNode> child;
res = children->Item(i,getter_AddRefs(child));
if(NS_SUCCEEDED(res) && child)
titleNode->RemoveChild(child,getter_AddRefs(resultNode));
}
}
}
}
}
// Get the <HEAD> node, create a <TITLE> and insert it under the HEAD
nsCOMPtr<nsIDOMNodeList> headList;
res = domDoc->GetElementsByTagName(NS_ConvertASCIItoUCS2("head"),getter_AddRefs(headList));
if (NS_FAILED(res)) return res;
if (headList)
{
headList->Item(0, getter_AddRefs(headNode));
if (headNode)
{
PRBool newTitleNode = PR_FALSE;
if (!titleNode)
{
// Didn't find one above: Create a new one
nsCOMPtr<nsIDOMElement>titleElement;
res = domDoc->CreateElement(NS_ConvertASCIItoUCS2("title"), getter_AddRefs(titleElement));
if (NS_SUCCEEDED(res) && titleElement)
{
titleNode = do_QueryInterface(titleElement);
newTitleNode = PR_TRUE;
}
// Note: There should ALWAYS be a <title> in any HTML document,
// so we will insert the node and not make it undoable
res = headNode->AppendChild(titleNode, getter_AddRefs(resultNode));
if (NS_FAILED(res)) return res;
}
// Append a text node under the TITLE
// only if the title text isn't empty
if (titleNode && titleStr.Length() > 0)
{
nsCOMPtr<nsIDOMText> textNode;
res = domDoc->CreateTextNode(titleStr, getter_AddRefs(textNode));
if (NS_FAILED(res)) return res;
if (!textNode) return NS_ERROR_FAILURE;
// Do NOT use editor transaction -- we don't want this to be undoable
res = titleNode->AppendChild(textNode, getter_AddRefs(resultNode));
if (NS_FAILED(res)) return res;
}
}
}
}
}
return res;
// PR_FALSE means don't save menu to prefs
return UpdateWindowTitleAndRecentMenu(PR_FALSE);
}
NS_IMETHODIMP
nsEditorShell::CloneAttributes(nsIDOMNode *destNode, nsIDOMNode *sourceNode)
{
@ -4342,7 +4293,7 @@ nsEditorShell::GetCellAt(nsIDOMElement *tableElement, PRInt32 rowIndex, PRInt32
nsCOMPtr<nsITableEditor> tableEditor = do_QueryInterface(mEditor);
if (tableEditor)
{
result = tableEditor->GetCellAt(tableElement, rowIndex, colIndex, *_retval);
result = tableEditor->GetCellAt(tableElement, rowIndex, colIndex, _retval);
// Don't return NS_EDITOR_ELEMENT_NOT_FOUND (passes NS_SUCCEEDED macro)
// to JavaScript
if(NS_SUCCEEDED(result)) return NS_OK;
@ -4379,7 +4330,7 @@ nsEditorShell::GetCellDataAt(nsIDOMElement *tableElement, PRInt32 rowIndex, PRIn
{
nsCOMPtr<nsITableEditor> tableEditor = do_QueryInterface(mEditor);
if (tableEditor)
result = tableEditor->GetCellDataAt(tableElement, rowIndex, colIndex, *_retval,
result = tableEditor->GetCellDataAt(tableElement, rowIndex, colIndex, _retval,
*aStartRowIndex, *aStartColIndex,
*aRowSpan, *aColSpan,
*aActualRowSpan, *aActualColSpan,
@ -4397,7 +4348,7 @@ nsEditorShell::GetCellDataAt(nsIDOMElement *tableElement, PRInt32 rowIndex, PRIn
}
NS_IMETHODIMP
nsEditorShell::GetFirstRow(nsIDOMElement *aTableElement, nsIDOMElement **_retval)
nsEditorShell::GetFirstRow(nsIDOMElement *aTableElement, nsIDOMNode **_retval)
{
if (!_retval || !aTableElement)
return NS_ERROR_NULL_POINTER;
@ -4409,7 +4360,7 @@ nsEditorShell::GetFirstRow(nsIDOMElement *aTableElement, nsIDOMElement **_retval
{
nsCOMPtr<nsITableEditor> tableEditor = do_QueryInterface(mEditor);
if (tableEditor)
result = tableEditor->GetFirstRow(aTableElement, *_retval);
result = tableEditor->GetFirstRow(aTableElement, _retval);
}
break;
default:
@ -4419,7 +4370,7 @@ nsEditorShell::GetFirstRow(nsIDOMElement *aTableElement, nsIDOMElement **_retval
}
NS_IMETHODIMP
nsEditorShell::GetNextRow(nsIDOMElement *aCurrentRow, nsIDOMElement **_retval)
nsEditorShell::GetNextRow(nsIDOMNode *aCurrentRow, nsIDOMNode **_retval)
{
if (!_retval || !*_retval || !aCurrentRow)
return NS_ERROR_NULL_POINTER;
@ -4432,7 +4383,7 @@ nsEditorShell::GetNextRow(nsIDOMElement *aCurrentRow, nsIDOMElement **_retval)
{
nsCOMPtr<nsITableEditor> tableEditor = do_QueryInterface(mEditor);
if (tableEditor)
result = tableEditor->GetNextRow(aCurrentRow, *_retval);
result = tableEditor->GetNextRow(aCurrentRow, _retval);
}
break;
default:

Просмотреть файл

@ -153,7 +153,10 @@ class nsEditorShell : public nsIEditorShell,
// Get the current document title an use it as part of the window title
// Uses "(Untitled)" for empty title
nsresult UpdateWindowTitle();
// Also rebuilds the "Recent Pages" menu.
// If aSaveToPrefs is true, then titles and URLs
// for menu are saved to prefs
nsresult UpdateWindowTitleAndRecentMenu(PRBool aSaveToPrefs);
// Helper method which is called at the beginning of a new page load
nsresult StartPageLoad();
@ -241,7 +244,6 @@ class nsEditorShell : public nsIEditorShell,
nsStringArray mDictionaryList;
PRInt32 mDictionaryIndex;
};
#endif // nsEditorShell_h___

Просмотреть файл

@ -81,6 +81,7 @@
#include "nsInternetCiter.h"
#include "nsISupportsPrimitives.h"
#include "InsertTextTxn.h"
#include "SetDocTitleTxn.h"
// netwerk
#include "nsIURI.h"
@ -415,6 +416,25 @@ NS_IMETHODIMP nsHTMLEditor::InitRules()
return res;
}
NS_IMETHODIMP
nsHTMLEditor::SetDocumentTitle(const PRUnichar *aTitle)
{
SetDocTitleTxn *txn;
nsresult result = TransactionFactory::GetNewTransaction(SetDocTitleTxn::GetCID(), (EditTxn **)&txn);
if (NS_SUCCEEDED(result))
{
nsAutoString title(aTitle);
result = txn->Init(this, &title);
if (NS_SUCCEEDED(result))
{
result = nsEditor::Do(txn);
}
// The transaction system (if any) has taken ownwership of txn
NS_IF_RELEASE(txn);
}
return result;
}
PRBool nsHTMLEditor::IsModifiable()
{
@ -613,7 +633,7 @@ NS_IMETHODIMP nsHTMLEditor::TabInTable(PRBool inIsShift, PRBool *outHandled)
&row, nsnull);
if (NS_FAILED(res)) return res;
// ...so that we can ask for first cell in that row...
res = GetCellAt(tblElement, row, 0, *(getter_AddRefs(cell)));
res = GetCellAt(tblElement, row, 0, getter_AddRefs(cell));
if (NS_FAILED(res)) return res;
// ...and then set selection there.
// (Note that normally you should use CollapseSelectionToDeepestNonTableFirstChild(),
@ -1792,7 +1812,7 @@ nsHTMLEditor::Align(const nsString& aAlignType)
}
NS_IMETHODIMP
nsHTMLEditor::GetElementOrParentByTagName(const nsString &aTagName, nsIDOMNode *aNode, nsIDOMElement** aReturn)
nsHTMLEditor::GetElementOrParentByTagName(const nsAReadableString& aTagName, nsIDOMNode *aNode, nsIDOMElement** aReturn)
{
if (aTagName.Length() == 0 || !aReturn )
return NS_ERROR_NULL_POINTER;
@ -1838,8 +1858,8 @@ nsHTMLEditor::GetElementOrParentByTagName(const nsString &aTagName, nsIDOMNode *
{
TagName.AssignWithConversion("a");
}
PRBool findTableCell = aTagName.EqualsIgnoreCase("td");
PRBool findList = aTagName.EqualsIgnoreCase("list");
PRBool findTableCell = TagName.EqualsWithConversion("td");
PRBool findList = TagName.EqualsWithConversion("list");
// default is null - no element found
*aReturn = nsnull;
@ -2159,13 +2179,14 @@ nsHTMLEditor::GetSelectedElement(const nsString& aTagName, nsIDOMElement** aRetu
}
NS_IMETHODIMP
nsHTMLEditor::CreateElementWithDefaults(const nsString& aTagName, nsIDOMElement** aReturn)
nsHTMLEditor::CreateElementWithDefaults(const nsAReadableString& aTagName, nsIDOMElement** aReturn)
{
nsresult res=NS_ERROR_NOT_INITIALIZED;
if (aReturn)
*aReturn = nsnull;
if (aTagName.IsEmpty() || !aReturn)
// if (!aTagName || !aReturn)
return NS_ERROR_NULL_POINTER;
nsAutoString TagName(aTagName);

Просмотреть файл

@ -143,9 +143,9 @@ public:
NS_IMETHOD Indent(const nsString& aIndent);
NS_IMETHOD Align(const nsString& aAlign);
NS_IMETHOD GetElementOrParentByTagName(const nsString& aTagName, nsIDOMNode *aNode, nsIDOMElement** aReturn);
NS_IMETHOD GetElementOrParentByTagName(const nsAReadableString& aTagName, nsIDOMNode *aNode, nsIDOMElement** aReturn);
NS_IMETHOD GetSelectedElement(const nsString& aTagName, nsIDOMElement** aReturn);
NS_IMETHOD CreateElementWithDefaults(const nsString& aTagName, nsIDOMElement** aReturn);
NS_IMETHOD CreateElementWithDefaults(const nsAReadableString& aTagName, nsIDOMElement** aReturn);
NS_IMETHOD GetNextElementByTagName(nsIDOMElement *aCurrentElement, const nsString *aTagName, nsIDOMElement **aReturn);
@ -204,14 +204,18 @@ public:
NS_IMETHOD NormalizeTable(nsIDOMElement *aTable);
NS_IMETHOD GetCellIndexes(nsIDOMElement *aCell, PRInt32& aRowIndex, PRInt32& aColIndex);
NS_IMETHOD GetTableSize(nsIDOMElement *aTable, PRInt32& aRowCount, PRInt32& aColCount);
NS_IMETHOD GetCellAt(nsIDOMElement* aTable, PRInt32 aRowIndex, PRInt32 aColIndex, nsIDOMElement* &aCell);
NS_IMETHOD GetCellDataAt(nsIDOMElement* aTable, PRInt32 aRowIndex, PRInt32 aColIndex, nsIDOMElement* &aCell,
NS_IMETHOD GetCellAt(nsIDOMElement* aTable, PRInt32 aRowIndex, PRInt32 aColIndex, nsIDOMElement **aCell);
NS_IMETHOD GetCellDataAt(nsIDOMElement* aTable, PRInt32 aRowIndex, PRInt32 aColIndex, nsIDOMElement **aCell,
PRInt32& aStartRowIndex, PRInt32& aStartColIndex,
PRInt32& aRowSpan, PRInt32& aColSpan,
PRInt32& aActualRowSpan, PRInt32& aActualColSpan,
PRBool& aIsSelected);
NS_IMETHOD GetFirstRow(nsIDOMElement* aTableElement, nsIDOMElement* &aRow);
NS_IMETHOD GetNextRow(nsIDOMElement* aTableElement, nsIDOMElement* &aRow);
NS_IMETHOD GetFirstRow(nsIDOMElement* aTableElement, nsIDOMNode** aRowNode);
NS_IMETHOD GetNextRow(nsIDOMNode* aCurrentRowNode, nsIDOMNode** aRowNode);
NS_IMETHOD GetFirstCellInRow(nsIDOMNode* aRowNode, nsIDOMNode** aCellNode);
NS_IMETHOD GetNextCellInRow(nsIDOMNode* aCurrentCellNode, nsIDOMNode** aRowNode);
NS_IMETHOD GetLastCellInRow(nsIDOMNode* aRowNode, nsIDOMNode** aCellNode);
NS_IMETHOD SetSelectionAfterTableEdit(nsIDOMElement* aTable, PRInt32 aRow, PRInt32 aCol,
PRInt32 aDirection, PRBool aSelected);
NS_IMETHOD GetSelectedOrParentTableElement(nsIDOMElement* &aTableElement, nsString& aTagName, PRInt32 &aSelectedCount);
@ -237,6 +241,8 @@ public:
// or calls into nsTextEditor to set the page background
NS_IMETHOD SetBackgroundColor(const nsString& aColor);
NS_IMETHOD SetBodyAttribute(const nsString& aAttr, const nsString& aValue);
// aTitle may be null or empty string to remove child contents of <title>
NS_IMETHOD SetDocumentTitle(const PRUnichar *aTitle);
/* ------------ Overrides of nsEditor interface methods -------------- */

Просмотреть файл

@ -768,6 +768,25 @@ nsHTMLEditorLog::ApplyStyleSheet(const nsString& aURL, nsICSSStyleSheet **aStyle
return nsHTMLEditor::ApplyStyleSheet(aURL, aStyleSheet);
}
NS_IMETHODIMP
nsHTMLEditorLog::SetDocumentTitle(const PRUnichar* aTitle)
{
nsAutoHTMLEditorLogLock logLock(this);
if (!mLocked && mFileStream)
{
PrintSelection();
Write("window.editorShell.SetDocumentTitle(\"");
nsAutoString str(aTitle);
PrintUnicode(str);
Write("\");\n");
Flush();
}
return nsHTMLEditor::SetDocumentTitle(aTitle);
}
NS_IMETHODIMP
nsHTMLEditorLog::StartLogging(nsIFile *aLogFile)
{

Просмотреть файл

@ -81,6 +81,7 @@ public:
NS_IMETHOD InsertAsCitedQuotation(const nsString& aQuotedText, const nsString& aCitation, PRBool aInsertHTML, const nsString& aCharset, nsIDOMNode** aNodeInserted);
NS_IMETHOD ApplyStyleSheet(const nsString& aURL, nsICSSStyleSheet **aStyleSheet);
NS_IMETHOD SetDocumentTitle(const PRUnichar* aTitle);
NS_IMETHOD SetBackgroundColor(const nsString& aColor);
NS_IMETHOD SetBodyAttribute(const nsString& aAttr, const nsString& aValue);

Просмотреть файл

@ -583,7 +583,7 @@ nsEditorShell::PrepareDocumentForEditing(nsIDOMWindow* aDOMWindow, nsIURI *aUrl)
}
// Set the editor-specific Window caption
UpdateWindowTitle();
UpdateWindowTitleAndRecentMenu(PR_TRUE);
nsCOMPtr<nsIEditorStyleSheets> styleSheets = do_QueryInterface(mEditor);
if (!styleSheets)
@ -878,16 +878,12 @@ nsEditorShell::SetEditorType(const PRUnichar *editorType)
NS_IMETHODIMP
nsEditorShell::GetEditorType(PRUnichar **_retval)
{
*_retval = nsnull;
if (!_retval)
return NS_ERROR_NULL_POINTER;
nsresult err = NS_NOINTERFACE;
nsCOMPtr<nsIEditor> editor = do_QueryInterface(mEditor);
*_retval = mEditorTypeString.ToNewUnicode();
if (editor)
{
*_retval = mEditorTypeString.ToNewUnicode();
}
return err;
return NS_OK;
}
@ -1701,11 +1697,20 @@ nsEditorShell::CheckOpenWindowForURLMatch(const PRUnichar* inFileURL, nsIDOMWind
}
NS_IMETHODIMP
nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
nsEditorShell::SaveDocument(PRBool aSaveAs, PRBool aSaveCopy, const PRUnichar* aMimeType, PRBool *_retval)
{
nsresult res = NS_NOINTERFACE;
*_retval = PR_FALSE;
NS_ENSURE_ARG_POINTER((aMimeType));
nsAutoString mimeType(aMimeType);
PRBool saveAsText = mimeType.EqualsWithConversion("text/plain");
// Currently, we only understand plain text and html
if (!mimeType.EqualsWithConversion("text/html") && !saveAsText)
return NS_ERROR_FAILURE;
switch (mEditorType)
{
case ePlainTextEditorType:
@ -1727,8 +1732,9 @@ nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
// find out if the doc already has a fileSpec associated with it.
nsCOMPtr<nsIFile> docFile;
PRBool noFileSpec = (diskDoc->GetFileSpec(getter_AddRefs(docFile)) == NS_ERROR_NOT_INITIALIZED);
PRBool mustShowFileDialog = saveAs || noFileSpec;
PRBool replacing = !saveAs;
PRBool mustShowFileDialog = aSaveAs || noFileSpec;
PRBool replacing = !aSaveAs;
PRBool titleChanged = PR_FALSE;
// Get existing document title
nsAutoString title;
@ -1739,8 +1745,8 @@ nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
if (mustShowFileDialog)
{
// Prompt for title ONLY if existing title is empty
if (!mMailCompose && (mEditorType == eHTMLTextEditorType) && (title.Length() == 0))
// Prompt for title ONLY if existing title is empty and we are saving to HTML
if (!mMailCompose && (!saveAsText && mEditorType == eHTMLTextEditorType) && (title.Length() == 0))
{
// Use a "prompt" common dialog to get title string from user
NS_WITH_SERVICE(nsICommonDialogs, dialog, kCommonDialogsCID, &res);
@ -1770,11 +1776,12 @@ nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
*_retval = PR_FALSE;
return NS_OK;
}
// This sets title in HTML node
mEditor->SetDocumentTitle(titleUnicode);
title = titleUnicode;
nsCRT::free(titleUnicode);
titleChanged = PR_TRUE;
}
// This sets title in HTML node
SetDocumentTitle(title.GetUnicode());
}
nsCOMPtr<nsIFilePicker> filePicker = do_CreateInstance("@mozilla.org/filepicker;1", &res);
@ -1783,7 +1790,10 @@ nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
nsAutoString fileName;
nsAutoString promptString;
GetBundleString(NS_LITERAL_STRING("SaveDocumentAs"), promptString);
if (saveAsText)
GetBundleString(NS_LITERAL_STRING("ExportToText"), promptString);
else
GetBundleString(NS_LITERAL_STRING("SaveDocumentAs"), promptString);
// Initialize nsIFilePicker
nsCOMPtr<nsIDOMWindowInternal> parentWindow(do_QueryReferent(mContentWindow));
@ -1791,9 +1801,12 @@ nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
if (NS_FAILED(res))
return res;
// append in order so that HTML comes first and is default. test me on windows
filePicker->AppendFilters(nsIFilePicker::filterHTML);
filePicker->AppendFilters(nsIFilePicker::filterText);
// Set filters according to the type of output
if (saveAsText)
filePicker->AppendFilters(nsIFilePicker::filterText);
else
filePicker->AppendFilters(nsIFilePicker::filterHTML);
filePicker->AppendFilters(nsIFilePicker::filterAll);
if (noFileSpec)
@ -1802,10 +1815,6 @@ nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
nsString urlstring;
res = htmlDoc->GetURL(urlstring);
// ?????
// res = htmlDoc->GetSourceDocumentURL(jscx, uri);
// do a QI to get an nsIURL and then call GetFileName()
// if it's not a local file already, grab the current file name
if ( (urlstring.CompareWithConversion("file", PR_TRUE, 4) != 0 )
&& (urlstring.CompareWithConversion("about:blank", PR_TRUE, -1) != 0) )
@ -1836,15 +1845,18 @@ nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
}
if (urlstring.Length() > 0)
{
fileName.Assign( urlstring );
fileName.AppendWithConversion(".html");
title = urlstring;
}
}
}
}
// Use page title as suggested name for new document
if (fileName.Length() == 0 && title.Length() > 0)
if (title.IsEmpty())
{
title.AppendWithConversion("untitled");
}
else
{
// Strip out quote character
PRUnichar quote = (PRUnichar)'\"';
@ -1852,9 +1864,13 @@ nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
//Replace "bad" filename characteres with "_"
title.ReplaceChar(" .\\/@:", (PRUnichar)'_');
fileName = title;
fileName.AppendWithConversion(".html");
}
fileName = title;
if (saveAsText)
fileName.AppendWithConversion(".txt");
else
fileName.AppendWithConversion(".html");
}
else // have a file spec
{
@ -1863,6 +1879,22 @@ nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
if (leafName.get() && *leafName)
fileName.Assign(leafName);
if (saveAsText)
{
// Replace html-related extension with "txt"
PRInt32 index = fileName.RFind(".html", PR_TRUE);
if (index == -1)
index = fileName.RFind(".htm", PR_TRUE);
if (index == -1)
index = fileName.RFind(".shtml", PR_TRUE);
if (index > 0)
{
// Truncate after "." and append "txt" extension
fileName.SetLength(index+1);
fileName.AppendWithConversion("txt");
}
}
nsCOMPtr<nsIFile> parentPath;
if (NS_SUCCEEDED(docFile->GetParent(getter_AddRefs(parentPath))))
{
@ -1884,6 +1916,8 @@ nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
if (dialogResult == nsIFilePicker::returnCancel)
{
// Note that *_retval = PR_FALSE at this point
if (titleChanged)
UpdateWindowTitleAndRecentMenu(PR_FALSE);
return NS_OK;
}
replacing = (dialogResult == nsIFilePicker::returnReplace);
@ -1902,33 +1936,31 @@ nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
}
// Set the new URL for the webshell
nsCOMPtr<nsIWebShell> webShell(do_QueryInterface(mContentAreaDocShell));
if (webShell)
if (!aSaveCopy)
{
// would like to use nsIFile::GetURL here, but it is not implemented
// on all platforms
nsCOMPtr<nsIFileURL> fileURL(do_CreateInstance(kStandardURLCID, &res));
if (NS_FAILED(res)) return res;
nsCOMPtr<nsIWebShell> webShell(do_QueryInterface(mContentAreaDocShell));
if (webShell)
{
// would like to use nsIFile::GetURL here, but it is not implemented
// on all platforms
nsCOMPtr<nsIFileURL> fileURL(do_CreateInstance(kStandardURLCID, &res));
if (NS_FAILED(res)) return res;
res = fileURL->SetFile(docFile);
if (NS_FAILED(res)) return res;
res = fileURL->SetFile(docFile);
if (NS_FAILED(res)) return res;
nsXPIDLCString docURLSpec;
res = fileURL->GetSpec(getter_Copies(docURLSpec));
if (NS_FAILED(res)) return res;
nsXPIDLCString docURLSpec;
res = fileURL->GetSpec(getter_Copies(docURLSpec));
if (NS_FAILED(res)) return res;
nsAutoString fileURLUnicode; fileURLUnicode.AssignWithConversion(docURLSpec);
res = webShell->SetURL(fileURLUnicode.GetUnicode());
if (NS_FAILED(res)) return res;
nsAutoString fileURLUnicode; fileURLUnicode.AssignWithConversion(docURLSpec);
res = webShell->SetURL(fileURLUnicode.GetUnicode());
if (NS_FAILED(res)) return res;
}
}
} // mustShowFileDialog
// TODO: Get the file type (from the extension?) the user set for the file
// How do we do this in an XP way???
// For now, just save as HTML type
nsString format;
format.AssignWithConversion("text/html");
res = editor->SaveFile(docFile, replacing, saveCopy, format);
res = editor->SaveFile(docFile, replacing, aSaveCopy, mimeType);
if (NS_FAILED(res))
{
nsAutoString saveDocStr, failedStr;
@ -1938,11 +1970,11 @@ nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
} else {
// File was saved successfully
*_retval = PR_TRUE;
// Update window title to show possibly different filename
if (mustShowFileDialog)
UpdateWindowTitle();
}
// Update window title to show possibly different filename
// This also covers problem that after undoing a title change,
// window title looses the extra [filename] part that this adds
UpdateWindowTitleAndRecentMenu(PR_TRUE);
}
break;
}
@ -1952,6 +1984,7 @@ nsEditorShell::SaveDocument(PRBool saveAs, PRBool saveCopy, PRBool *_retval)
return res;
}
NS_IMETHODIMP
nsEditorShell::CloseWindowWithoutSaving()
{
@ -2094,7 +2127,7 @@ nsEditorShell::GetLocalFileURL(nsIDOMWindowInternal *parent, const PRUnichar *fi
}
nsresult
nsEditorShell::UpdateWindowTitle()
nsEditorShell::UpdateWindowTitleAndRecentMenu(PRBool aSaveToPrefs)
{
nsresult res = NS_ERROR_NOT_INITIALIZED;
@ -2137,6 +2170,17 @@ nsEditorShell::UpdateWindowTitle()
NS_ASSERTION(contentAreaAsWin, "This object should implement nsIBaseWindow");
res = contentAreaAsWin->SetTitle(windowCaption.GetUnicode());
}
// Rebuild Recent Pages menu and save any changed URLs or titles to editor prefs
// TODO: We need to pass on aSaveToPrefs to command, but must wait for
// new command system before we can do that.
// For now, don't update the menu at all if aSaveToPrefs is false
if (aSaveToPrefs)
{
nsAutoString commandName(NS_LITERAL_STRING("cmd_buildRecentPagesMenu"));
res = DoControllerCommand(commandName);
}
return res;
}
@ -2197,107 +2241,14 @@ nsEditorShell::SetDocumentTitle(const PRUnichar *title)
if (mEditorType != eHTMLTextEditorType)
return NS_ERROR_NOT_IMPLEMENTED;
nsCOMPtr<nsIEditor> editor = do_QueryInterface(mEditor);
if (!editor)
return NS_ERROR_FAILURE;
res = mEditor->SetDocumentTitle(title);
if (NS_FAILED(res)) return res;
nsAutoString titleStr(title);
nsCOMPtr<nsIDOMDocument> domDoc;
res = editor->GetDocument(getter_AddRefs(domDoc));
if (domDoc)
{
// Get existing document title node
nsCOMPtr<nsIDOMHTMLDocument> HTMLDoc = do_QueryInterface(domDoc);
if (HTMLDoc)
{
// This sets the window title, and saves the title as a member varialble,
// but does NOT insert the <title> node.
HTMLDoc->SetTitle(titleStr);
nsCOMPtr<nsIDOMNodeList> titleList;
nsCOMPtr<nsIDOMNode>titleNode;
nsCOMPtr<nsIDOMNode>headNode;
nsCOMPtr<nsIDOMNode> resultNode;
res = domDoc->GetElementsByTagName(NS_ConvertASCIItoUCS2("title"), getter_AddRefs(titleList));
if (NS_SUCCEEDED(res))
{
if(titleList)
{
/* I'm tempted to just get the 1st title element in the list
(there should always be just 1). But in case there's > 1,
I assume the last one will be used, so this finds that one.
*/
PRUint32 len = 0;
titleList->GetLength(&len);
if (len >= 1)
titleList->Item(len-1, getter_AddRefs(titleNode));
if (titleNode)
{
//Delete existing children (text) of title node
nsCOMPtr<nsIDOMNodeList> children;
res = titleNode->GetChildNodes(getter_AddRefs(children));
if(NS_SUCCEEDED(res) && children)
{
PRUint32 count = 0;
children->GetLength(&count);
for( PRUint32 i = 0; i < count; i++)
{
nsCOMPtr<nsIDOMNode> child;
res = children->Item(i,getter_AddRefs(child));
if(NS_SUCCEEDED(res) && child)
titleNode->RemoveChild(child,getter_AddRefs(resultNode));
}
}
}
}
}
// Get the <HEAD> node, create a <TITLE> and insert it under the HEAD
nsCOMPtr<nsIDOMNodeList> headList;
res = domDoc->GetElementsByTagName(NS_ConvertASCIItoUCS2("head"),getter_AddRefs(headList));
if (NS_FAILED(res)) return res;
if (headList)
{
headList->Item(0, getter_AddRefs(headNode));
if (headNode)
{
PRBool newTitleNode = PR_FALSE;
if (!titleNode)
{
// Didn't find one above: Create a new one
nsCOMPtr<nsIDOMElement>titleElement;
res = domDoc->CreateElement(NS_ConvertASCIItoUCS2("title"), getter_AddRefs(titleElement));
if (NS_SUCCEEDED(res) && titleElement)
{
titleNode = do_QueryInterface(titleElement);
newTitleNode = PR_TRUE;
}
// Note: There should ALWAYS be a <title> in any HTML document,
// so we will insert the node and not make it undoable
res = headNode->AppendChild(titleNode, getter_AddRefs(resultNode));
if (NS_FAILED(res)) return res;
}
// Append a text node under the TITLE
// only if the title text isn't empty
if (titleNode && titleStr.Length() > 0)
{
nsCOMPtr<nsIDOMText> textNode;
res = domDoc->CreateTextNode(titleStr, getter_AddRefs(textNode));
if (NS_FAILED(res)) return res;
if (!textNode) return NS_ERROR_FAILURE;
// Do NOT use editor transaction -- we don't want this to be undoable
res = titleNode->AppendChild(textNode, getter_AddRefs(resultNode));
if (NS_FAILED(res)) return res;
}
}
}
}
}
return res;
// PR_FALSE means don't save menu to prefs
return UpdateWindowTitleAndRecentMenu(PR_FALSE);
}
NS_IMETHODIMP
nsEditorShell::CloneAttributes(nsIDOMNode *destNode, nsIDOMNode *sourceNode)
{
@ -4342,7 +4293,7 @@ nsEditorShell::GetCellAt(nsIDOMElement *tableElement, PRInt32 rowIndex, PRInt32
nsCOMPtr<nsITableEditor> tableEditor = do_QueryInterface(mEditor);
if (tableEditor)
{
result = tableEditor->GetCellAt(tableElement, rowIndex, colIndex, *_retval);
result = tableEditor->GetCellAt(tableElement, rowIndex, colIndex, _retval);
// Don't return NS_EDITOR_ELEMENT_NOT_FOUND (passes NS_SUCCEEDED macro)
// to JavaScript
if(NS_SUCCEEDED(result)) return NS_OK;
@ -4379,7 +4330,7 @@ nsEditorShell::GetCellDataAt(nsIDOMElement *tableElement, PRInt32 rowIndex, PRIn
{
nsCOMPtr<nsITableEditor> tableEditor = do_QueryInterface(mEditor);
if (tableEditor)
result = tableEditor->GetCellDataAt(tableElement, rowIndex, colIndex, *_retval,
result = tableEditor->GetCellDataAt(tableElement, rowIndex, colIndex, _retval,
*aStartRowIndex, *aStartColIndex,
*aRowSpan, *aColSpan,
*aActualRowSpan, *aActualColSpan,
@ -4397,7 +4348,7 @@ nsEditorShell::GetCellDataAt(nsIDOMElement *tableElement, PRInt32 rowIndex, PRIn
}
NS_IMETHODIMP
nsEditorShell::GetFirstRow(nsIDOMElement *aTableElement, nsIDOMElement **_retval)
nsEditorShell::GetFirstRow(nsIDOMElement *aTableElement, nsIDOMNode **_retval)
{
if (!_retval || !aTableElement)
return NS_ERROR_NULL_POINTER;
@ -4409,7 +4360,7 @@ nsEditorShell::GetFirstRow(nsIDOMElement *aTableElement, nsIDOMElement **_retval
{
nsCOMPtr<nsITableEditor> tableEditor = do_QueryInterface(mEditor);
if (tableEditor)
result = tableEditor->GetFirstRow(aTableElement, *_retval);
result = tableEditor->GetFirstRow(aTableElement, _retval);
}
break;
default:
@ -4419,7 +4370,7 @@ nsEditorShell::GetFirstRow(nsIDOMElement *aTableElement, nsIDOMElement **_retval
}
NS_IMETHODIMP
nsEditorShell::GetNextRow(nsIDOMElement *aCurrentRow, nsIDOMElement **_retval)
nsEditorShell::GetNextRow(nsIDOMNode *aCurrentRow, nsIDOMNode **_retval)
{
if (!_retval || !*_retval || !aCurrentRow)
return NS_ERROR_NULL_POINTER;
@ -4432,7 +4383,7 @@ nsEditorShell::GetNextRow(nsIDOMElement *aCurrentRow, nsIDOMElement **_retval)
{
nsCOMPtr<nsITableEditor> tableEditor = do_QueryInterface(mEditor);
if (tableEditor)
result = tableEditor->GetNextRow(aCurrentRow, *_retval);
result = tableEditor->GetNextRow(aCurrentRow, _retval);
}
break;
default:

Просмотреть файл

@ -153,7 +153,10 @@ class nsEditorShell : public nsIEditorShell,
// Get the current document title an use it as part of the window title
// Uses "(Untitled)" for empty title
nsresult UpdateWindowTitle();
// Also rebuilds the "Recent Pages" menu.
// If aSaveToPrefs is true, then titles and URLs
// for menu are saved to prefs
nsresult UpdateWindowTitleAndRecentMenu(PRBool aSaveToPrefs);
// Helper method which is called at the beginning of a new page load
nsresult StartPageLoad();
@ -241,7 +244,6 @@ class nsEditorShell : public nsIEditorShell,
nsStringArray mDictionaryList;
PRInt32 mDictionaryIndex;
};
#endif // nsEditorShell_h___

Просмотреть файл

@ -35,6 +35,7 @@
#include "JoinElementTxn.h"
#include "nsStyleSheetTxns.h"
#include "IMETextTxn.h"
#include "SetDocTitleTxn.h"
TransactionFactory::TransactionFactory()
{
@ -75,6 +76,8 @@ TransactionFactory::GetNewTransaction(REFNSIID aTxnType, EditTxn **aResult)
*aResult = new AddStyleSheetTxn();
else if (aTxnType.Equals(RemoveStyleSheetTxn::GetCID()))
*aResult = new RemoveStyleSheetTxn();
else if (aTxnType.Equals(SetDocTitleTxn::GetCID()))
*aResult = new SetDocTitleTxn();
else if (aTxnType.Equals(PlaceholderTxn::GetCID()))
*aResult = new PlaceholderTxn();
else

Просмотреть файл

@ -889,15 +889,23 @@ nsEditor::SaveFile(nsIFile *aFileSpec, PRBool aReplaceExisting,
if (!diskDoc)
return NS_ERROR_NO_INTERFACE;
// Should we prettyprint?
PRUint32 flags = nsIDocumentEncoder::OutputEncodeEntities;
NS_WITH_SERVICE(nsIPref, prefService, kPrefServiceCID, &rv);
if (NS_SUCCEEDED(rv) && prefService)
if (aFormat == NS_LITERAL_STRING("text/plain"))
{
PRBool prettyprint = PR_FALSE;;
rv = prefService->GetBoolPref("editor.prettyprint", &prettyprint);
if (NS_SUCCEEDED(rv) && prettyprint)
flags |= nsIDocumentEncoder::OutputFormatted;
// When saving in "text/plain" format, always do formatting
flags |= nsIDocumentEncoder::OutputFormatted;
}
else
{
// Should we prettyprint? Check the pref
NS_WITH_SERVICE(nsIPref, prefService, kPrefServiceCID, &rv);
if (NS_SUCCEEDED(rv) && prefService)
{
PRBool prettyprint = PR_FALSE;;
rv = prefService->GetBoolPref("editor.prettyprint", &prettyprint);
if (NS_SUCCEEDED(rv) && prettyprint)
flags |= nsIDocumentEncoder::OutputFormatted;
}
}
PRInt32 wrapColumn = 72;

Просмотреть файл

@ -81,6 +81,7 @@
#include "nsInternetCiter.h"
#include "nsISupportsPrimitives.h"
#include "InsertTextTxn.h"
#include "SetDocTitleTxn.h"
// netwerk
#include "nsIURI.h"
@ -415,6 +416,25 @@ NS_IMETHODIMP nsHTMLEditor::InitRules()
return res;
}
NS_IMETHODIMP
nsHTMLEditor::SetDocumentTitle(const PRUnichar *aTitle)
{
SetDocTitleTxn *txn;
nsresult result = TransactionFactory::GetNewTransaction(SetDocTitleTxn::GetCID(), (EditTxn **)&txn);
if (NS_SUCCEEDED(result))
{
nsAutoString title(aTitle);
result = txn->Init(this, &title);
if (NS_SUCCEEDED(result))
{
result = nsEditor::Do(txn);
}
// The transaction system (if any) has taken ownwership of txn
NS_IF_RELEASE(txn);
}
return result;
}
PRBool nsHTMLEditor::IsModifiable()
{
@ -613,7 +633,7 @@ NS_IMETHODIMP nsHTMLEditor::TabInTable(PRBool inIsShift, PRBool *outHandled)
&row, nsnull);
if (NS_FAILED(res)) return res;
// ...so that we can ask for first cell in that row...
res = GetCellAt(tblElement, row, 0, *(getter_AddRefs(cell)));
res = GetCellAt(tblElement, row, 0, getter_AddRefs(cell));
if (NS_FAILED(res)) return res;
// ...and then set selection there.
// (Note that normally you should use CollapseSelectionToDeepestNonTableFirstChild(),
@ -1792,7 +1812,7 @@ nsHTMLEditor::Align(const nsString& aAlignType)
}
NS_IMETHODIMP
nsHTMLEditor::GetElementOrParentByTagName(const nsString &aTagName, nsIDOMNode *aNode, nsIDOMElement** aReturn)
nsHTMLEditor::GetElementOrParentByTagName(const nsAReadableString& aTagName, nsIDOMNode *aNode, nsIDOMElement** aReturn)
{
if (aTagName.Length() == 0 || !aReturn )
return NS_ERROR_NULL_POINTER;
@ -1838,8 +1858,8 @@ nsHTMLEditor::GetElementOrParentByTagName(const nsString &aTagName, nsIDOMNode *
{
TagName.AssignWithConversion("a");
}
PRBool findTableCell = aTagName.EqualsIgnoreCase("td");
PRBool findList = aTagName.EqualsIgnoreCase("list");
PRBool findTableCell = TagName.EqualsWithConversion("td");
PRBool findList = TagName.EqualsWithConversion("list");
// default is null - no element found
*aReturn = nsnull;
@ -2159,13 +2179,14 @@ nsHTMLEditor::GetSelectedElement(const nsString& aTagName, nsIDOMElement** aRetu
}
NS_IMETHODIMP
nsHTMLEditor::CreateElementWithDefaults(const nsString& aTagName, nsIDOMElement** aReturn)
nsHTMLEditor::CreateElementWithDefaults(const nsAReadableString& aTagName, nsIDOMElement** aReturn)
{
nsresult res=NS_ERROR_NOT_INITIALIZED;
if (aReturn)
*aReturn = nsnull;
if (aTagName.IsEmpty() || !aReturn)
// if (!aTagName || !aReturn)
return NS_ERROR_NULL_POINTER;
nsAutoString TagName(aTagName);

Просмотреть файл

@ -143,9 +143,9 @@ public:
NS_IMETHOD Indent(const nsString& aIndent);
NS_IMETHOD Align(const nsString& aAlign);
NS_IMETHOD GetElementOrParentByTagName(const nsString& aTagName, nsIDOMNode *aNode, nsIDOMElement** aReturn);
NS_IMETHOD GetElementOrParentByTagName(const nsAReadableString& aTagName, nsIDOMNode *aNode, nsIDOMElement** aReturn);
NS_IMETHOD GetSelectedElement(const nsString& aTagName, nsIDOMElement** aReturn);
NS_IMETHOD CreateElementWithDefaults(const nsString& aTagName, nsIDOMElement** aReturn);
NS_IMETHOD CreateElementWithDefaults(const nsAReadableString& aTagName, nsIDOMElement** aReturn);
NS_IMETHOD GetNextElementByTagName(nsIDOMElement *aCurrentElement, const nsString *aTagName, nsIDOMElement **aReturn);
@ -204,14 +204,18 @@ public:
NS_IMETHOD NormalizeTable(nsIDOMElement *aTable);
NS_IMETHOD GetCellIndexes(nsIDOMElement *aCell, PRInt32& aRowIndex, PRInt32& aColIndex);
NS_IMETHOD GetTableSize(nsIDOMElement *aTable, PRInt32& aRowCount, PRInt32& aColCount);
NS_IMETHOD GetCellAt(nsIDOMElement* aTable, PRInt32 aRowIndex, PRInt32 aColIndex, nsIDOMElement* &aCell);
NS_IMETHOD GetCellDataAt(nsIDOMElement* aTable, PRInt32 aRowIndex, PRInt32 aColIndex, nsIDOMElement* &aCell,
NS_IMETHOD GetCellAt(nsIDOMElement* aTable, PRInt32 aRowIndex, PRInt32 aColIndex, nsIDOMElement **aCell);
NS_IMETHOD GetCellDataAt(nsIDOMElement* aTable, PRInt32 aRowIndex, PRInt32 aColIndex, nsIDOMElement **aCell,
PRInt32& aStartRowIndex, PRInt32& aStartColIndex,
PRInt32& aRowSpan, PRInt32& aColSpan,
PRInt32& aActualRowSpan, PRInt32& aActualColSpan,
PRBool& aIsSelected);
NS_IMETHOD GetFirstRow(nsIDOMElement* aTableElement, nsIDOMElement* &aRow);
NS_IMETHOD GetNextRow(nsIDOMElement* aTableElement, nsIDOMElement* &aRow);
NS_IMETHOD GetFirstRow(nsIDOMElement* aTableElement, nsIDOMNode** aRowNode);
NS_IMETHOD GetNextRow(nsIDOMNode* aCurrentRowNode, nsIDOMNode** aRowNode);
NS_IMETHOD GetFirstCellInRow(nsIDOMNode* aRowNode, nsIDOMNode** aCellNode);
NS_IMETHOD GetNextCellInRow(nsIDOMNode* aCurrentCellNode, nsIDOMNode** aRowNode);
NS_IMETHOD GetLastCellInRow(nsIDOMNode* aRowNode, nsIDOMNode** aCellNode);
NS_IMETHOD SetSelectionAfterTableEdit(nsIDOMElement* aTable, PRInt32 aRow, PRInt32 aCol,
PRInt32 aDirection, PRBool aSelected);
NS_IMETHOD GetSelectedOrParentTableElement(nsIDOMElement* &aTableElement, nsString& aTagName, PRInt32 &aSelectedCount);
@ -237,6 +241,8 @@ public:
// or calls into nsTextEditor to set the page background
NS_IMETHOD SetBackgroundColor(const nsString& aColor);
NS_IMETHOD SetBodyAttribute(const nsString& aAttr, const nsString& aValue);
// aTitle may be null or empty string to remove child contents of <title>
NS_IMETHOD SetDocumentTitle(const PRUnichar *aTitle);
/* ------------ Overrides of nsEditor interface methods -------------- */

Просмотреть файл

@ -768,6 +768,25 @@ nsHTMLEditorLog::ApplyStyleSheet(const nsString& aURL, nsICSSStyleSheet **aStyle
return nsHTMLEditor::ApplyStyleSheet(aURL, aStyleSheet);
}
NS_IMETHODIMP
nsHTMLEditorLog::SetDocumentTitle(const PRUnichar* aTitle)
{
nsAutoHTMLEditorLogLock logLock(this);
if (!mLocked && mFileStream)
{
PrintSelection();
Write("window.editorShell.SetDocumentTitle(\"");
nsAutoString str(aTitle);
PrintUnicode(str);
Write("\");\n");
Flush();
}
return nsHTMLEditor::SetDocumentTitle(aTitle);
}
NS_IMETHODIMP
nsHTMLEditorLog::StartLogging(nsIFile *aLogFile)
{

Просмотреть файл

@ -81,6 +81,7 @@ public:
NS_IMETHOD InsertAsCitedQuotation(const nsString& aQuotedText, const nsString& aCitation, PRBool aInsertHTML, const nsString& aCharset, nsIDOMNode** aNodeInserted);
NS_IMETHOD ApplyStyleSheet(const nsString& aURL, nsICSSStyleSheet **aStyleSheet);
NS_IMETHOD SetDocumentTitle(const PRUnichar* aTitle);
NS_IMETHOD SetBackgroundColor(const nsString& aColor);
NS_IMETHOD SetBodyAttribute(const nsString& aAttr, const nsString& aValue);