зеркало из https://github.com/mozilla/pjs.git
Removal of some crufty old code that used to do UI udpating, and was obsolete by XUL command nodes. r=akkana
This commit is contained in:
Родитель
31df005b0c
Коммит
aa4d5be8ea
|
@ -973,16 +973,6 @@ nsEditorShell::DoEditorMode(nsIDocShell *aDocShell)
|
|||
return InstantiateEditor(domDoc, presShell);
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsEditorShell::UpdateInterfaceState(const PRUnichar *tagToUpdate)
|
||||
{
|
||||
if (!mStateMaintainer)
|
||||
return NS_ERROR_NOT_INITIALIZED;
|
||||
|
||||
return mStateMaintainer->ForceUpdate(tagToUpdate);
|
||||
}
|
||||
|
||||
// Deletion routines
|
||||
nsresult
|
||||
nsEditorShell::ScrollSelectionIntoView()
|
||||
|
@ -1071,7 +1061,7 @@ nsEditorShell::SetAttribute(nsIDOMElement *element, const PRUnichar *attr, const
|
|||
nsAutoString valueStr(value);
|
||||
result = editor->SetAttribute(element, attributeStr, valueStr);
|
||||
}
|
||||
UpdateInterfaceState(nsnull);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -1087,7 +1077,7 @@ nsEditorShell::RemoveAttribute(nsIDOMElement *element, const PRUnichar *attr)
|
|||
nsAutoString attributeStr(attr);
|
||||
result = editor->RemoveAttribute(element, attributeStr);
|
||||
}
|
||||
UpdateInterfaceState(nsnull);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -1115,7 +1105,6 @@ nsEditorShell::SetTextProperty(const PRUnichar *prop, const PRUnichar *attr, con
|
|||
err = NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
UpdateInterfaceState(prop);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -1140,7 +1129,6 @@ nsEditorShell::RemoveOneProperty(const nsString& aProp, const nsString &aAttr)
|
|||
err = NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
UpdateInterfaceState(aProp.GetUnicode());
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
@ -44,46 +44,10 @@
|
|||
|
||||
#include "nsInterfaceState.h"
|
||||
|
||||
|
||||
/*
|
||||
static PRBool StringHashDestroyFunc(nsHashKey *aKey, void *aData, void* closure)
|
||||
{
|
||||
nsString* stringData = NS_REINTERPRET_CAST(nsString*, aData);
|
||||
delete stringData;
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
static void* StringHashCloneElementFunc(nsHashKey *aKey, void *aData, void* closure)
|
||||
{
|
||||
nsString* stringData = NS_REINTERPRET_CAST(nsString*, aData);
|
||||
if (stringData)
|
||||
{
|
||||
nsString* newString = new nsString(*stringData);
|
||||
return newString;
|
||||
}
|
||||
|
||||
return nsnull;
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
#ifdef XP_MAC
|
||||
#pragma mark -
|
||||
#endif
|
||||
|
||||
nsInterfaceState::nsInterfaceState()
|
||||
: mEditor(nsnull)
|
||||
, mChromeDoc(nsnull)
|
||||
, mDOMWindow(nsnull)
|
||||
, mUpdateParagraph(PR_FALSE)
|
||||
, mUpdateFont(PR_FALSE)
|
||||
, mUpdateList(PR_FALSE)
|
||||
, mUpdateBold(PR_FALSE)
|
||||
, mUpdateItalics(PR_FALSE)
|
||||
, mUpdateUnderline(PR_FALSE)
|
||||
, mBoldState(eStateUninitialized)
|
||||
, mItalicState(eStateUninitialized)
|
||||
, mUnderlineState(eStateUninitialized)
|
||||
, mDirtyState(eStateUninitialized)
|
||||
, mSelectionCollapsed(eStateUninitialized)
|
||||
, mFirstDoOfFirstUndo(PR_TRUE)
|
||||
|
@ -111,16 +75,6 @@ nsInterfaceState::Init(nsIHTMLEditor* aEditor, nsIDOMDocument *aChromeDoc)
|
|||
mEditor = aEditor; // no addreffing here
|
||||
mChromeDoc = aChromeDoc;
|
||||
|
||||
// it sucks explicitly naming XUL nodes here. Would be better to have
|
||||
// some way to register things that we want to observe from JS
|
||||
mUpdateParagraph = XULNodeExists("ParagraphSelect");
|
||||
mUpdateFont = XULNodeExists("FontFaceSelect");
|
||||
mUpdateList = XULNodeExists("ulButton") || XULNodeExists("olButton");
|
||||
|
||||
mUpdateBold = XULNodeExists("boldButton");
|
||||
mUpdateItalics = XULNodeExists("italicButton");
|
||||
mUpdateUnderline = XULNodeExists("underlineButton");
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -286,10 +240,21 @@ void nsInterfaceState::TimerCallback()
|
|||
mSelectionCollapsed = isCollapsed;
|
||||
}
|
||||
|
||||
// (void)ForceUpdate();
|
||||
CallUpdateCommands(NS_ConvertASCIItoUCS2("style"));
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsInterfaceState::UpdateDirtyState(PRBool aNowDirty)
|
||||
{
|
||||
if (mDirtyState != aNowDirty)
|
||||
{
|
||||
CallUpdateCommands(NS_ConvertASCIItoUCS2("save"));
|
||||
|
||||
mDirtyState = aNowDirty;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult nsInterfaceState::CallUpdateCommands(const nsString& aCommand)
|
||||
{
|
||||
|
@ -316,65 +281,6 @@ nsresult nsInterfaceState::CallUpdateCommands(const nsString& aCommand)
|
|||
return mDOMWindow->UpdateCommands(aCommand);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInterfaceState::ForceUpdate(const PRUnichar *tagToUpdate)
|
||||
{
|
||||
PRBool updateEverything = !tagToUpdate || !*tagToUpdate;
|
||||
|
||||
#if 0
|
||||
// This code is obsolete now that commanders are doing the work
|
||||
nsresult rv;
|
||||
|
||||
// update bold
|
||||
if (mUpdateBold && (updateEverything || nsAutoString("b").Equals(tagToUpdate)))
|
||||
{
|
||||
rv = UpdateTextState("b", "cmd_bold", "bold", mBoldState);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Failed to update state");
|
||||
}
|
||||
|
||||
// update italic
|
||||
if (mUpdateItalics && (updateEverything || nsAutoString("i").Equals(tagToUpdate)))
|
||||
{
|
||||
rv = UpdateTextState("i", "cmd_italic", "italic", mItalicState);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Failed to update state");
|
||||
}
|
||||
|
||||
// update underline
|
||||
if (mUpdateUnderline && (updateEverything || nsAutoString("u").Equals(tagToUpdate)))
|
||||
{
|
||||
rv = UpdateTextState("u", "cmd_underline", "underline", mUnderlineState);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Failed to update state");
|
||||
}
|
||||
|
||||
// update the paragraph format popup
|
||||
if (mUpdateParagraph && (updateEverything || nsAutoString("format").Equals(tagToUpdate)))
|
||||
{
|
||||
rv = UpdateParagraphState("Editor:Paragraph:Format", "format");
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Failed to update state");
|
||||
}
|
||||
|
||||
// udpate the font face
|
||||
if (mUpdateFont && (updateEverything || nsAutoString("font").Equals(tagToUpdate)))
|
||||
{
|
||||
rv = UpdateFontFace("Editor:Font:Face", "font");
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Failed to update state");
|
||||
}
|
||||
|
||||
// TODO: FINISH FONT FACE AND ADD FONT SIZE ("Editor:Font:Size", "fontsize", mFontSize)
|
||||
|
||||
// update the list buttons
|
||||
if (mUpdateList && (updateEverything ||
|
||||
nsAutoString("ol").Equals(tagToUpdate) ||
|
||||
nsAutoString("ul").Equals(tagToUpdate)))
|
||||
{
|
||||
rv = UpdateListState("Editor:Paragraph:ListType");
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Failed to update state");
|
||||
}
|
||||
#endif
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
PRBool
|
||||
nsInterfaceState::SelectionIsCollapsed()
|
||||
{
|
||||
|
@ -395,256 +301,6 @@ nsInterfaceState::SelectionIsCollapsed()
|
|||
return PR_FALSE;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsInterfaceState::UpdateParagraphState(const char* observerName, const char* attributeName)
|
||||
{
|
||||
nsCOMPtr<nsISelection> domSelection;
|
||||
nsCOMPtr<nsIEditor> editor = do_QueryInterface(mEditor);
|
||||
// Get the nsIEditor pointer (mEditor is nsIHTMLEditor)
|
||||
if (!editor) return NS_ERROR_NULL_POINTER;
|
||||
nsresult rv = editor->GetSelection(getter_AddRefs(domSelection));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
PRBool selectionCollapsed = PR_FALSE;
|
||||
rv = domSelection->GetIsCollapsed(&selectionCollapsed);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
// Get anchor and focus nodes:
|
||||
nsCOMPtr<nsIDOMNode> anchorNode;
|
||||
rv = domSelection->GetAnchorNode(getter_AddRefs(anchorNode));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
if (!anchorNode) return NS_ERROR_NULL_POINTER;
|
||||
|
||||
nsCOMPtr<nsIDOMNode> focusNode;
|
||||
rv = domSelection->GetFocusNode(getter_AddRefs(focusNode));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
if (!focusNode) return NS_ERROR_NULL_POINTER;
|
||||
|
||||
nsCOMPtr<nsIDOMNode> anchorNodeBlockParent;
|
||||
PRBool isBlock;
|
||||
rv = editor->NodeIsBlock(anchorNode, isBlock);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
if (isBlock)
|
||||
{
|
||||
anchorNodeBlockParent = anchorNode;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Get block parent of anchorNode node
|
||||
// We could simply use this if it was in nsIEditor interface!
|
||||
//rv = editor->GetBlockParent(anchorNode, getter_AddRefs(anchorNodeBlockParent));
|
||||
// if (NS_FAILED(rv)) return rv;
|
||||
|
||||
nsCOMPtr<nsIDOMNode>parent;
|
||||
nsCOMPtr<nsIDOMNode>temp;
|
||||
rv = anchorNode->GetParentNode(getter_AddRefs(parent));
|
||||
while (NS_SUCCEEDED(rv) && parent)
|
||||
{
|
||||
rv = editor->NodeIsBlock(parent, isBlock);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
if (isBlock)
|
||||
{
|
||||
anchorNodeBlockParent = parent;
|
||||
break;
|
||||
}
|
||||
rv = parent->GetParentNode(getter_AddRefs(temp));
|
||||
parent = do_QueryInterface(temp);
|
||||
}
|
||||
}
|
||||
if (!anchorNodeBlockParent) // return NS_ERROR_NULL_POINTER;
|
||||
anchorNodeBlockParent = anchorNode;
|
||||
|
||||
nsAutoString tagName;
|
||||
|
||||
// Check if we have a selection that extends into multiple nodes,
|
||||
// so we can check for "mixed" selection state
|
||||
if (selectionCollapsed || focusNode == anchorNode)
|
||||
{
|
||||
// Entire selection is within one block
|
||||
anchorNodeBlockParent->GetNodeName(tagName);
|
||||
}
|
||||
else
|
||||
{
|
||||
// We may have different block parent node types WITHIN the selection,
|
||||
// even if the anchor and focus parents are the same type.
|
||||
// Getting the list of all block, e.g., by using GetParagraphTags(&tagList)
|
||||
// is too inefficient for long documents.
|
||||
// TODO: Change to use selection iterator to detect each block node in the
|
||||
// selection and if different from the anchorNodeBlockParent, use "mixed" state
|
||||
// *** Not doing this now reduces risk for Beta1 -- simply assume mixed state
|
||||
// Note that "mixed" displays as "normal" in UI as of 3/6.
|
||||
tagName.AssignWithConversion("mixed");
|
||||
}
|
||||
|
||||
if (tagName != mParagraphFormat)
|
||||
{
|
||||
rv = SetNodeAttribute(observerName, attributeName, tagName);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
mParagraphFormat = tagName;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsInterfaceState::UpdateListState(const char* observerName)
|
||||
{
|
||||
nsresult rv = NS_ERROR_NO_INTERFACE;
|
||||
nsAutoString tagStr; // empty by default.
|
||||
|
||||
PRBool bMixed, bOL, bUL, bDL;
|
||||
rv = mEditor->GetListState(bMixed, bOL, bUL, bDL);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
if (bMixed)
|
||||
{} // leave tagStr empty
|
||||
else if (bOL)
|
||||
tagStr.AssignWithConversion("ol");
|
||||
else if (bUL)
|
||||
tagStr.AssignWithConversion("ul");
|
||||
else if (bDL)
|
||||
tagStr.AssignWithConversion("dl");
|
||||
// else leave tagStr empty
|
||||
|
||||
rv = SetNodeAttribute(observerName, "format", tagStr);
|
||||
|
||||
mListTag = tagStr;
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsInterfaceState::UpdateFontFace(const char* observerName, const char* attributeName)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
PRBool firstOfSelectionHasProp = PR_FALSE;
|
||||
PRBool anyOfSelectionHasProp = PR_FALSE;
|
||||
PRBool allOfSelectionHasProp = PR_FALSE;
|
||||
|
||||
nsCOMPtr<nsIAtom> styleAtom = getter_AddRefs(NS_NewAtom("font"));
|
||||
nsAutoString faceStr; faceStr.AssignWithConversion("face");
|
||||
nsAutoString thisFace;
|
||||
|
||||
// Use to test for "Default Fixed Width"
|
||||
nsCOMPtr<nsIAtom> fixedStyleAtom = getter_AddRefs(NS_NewAtom("tt"));
|
||||
|
||||
PRBool testBoolean;
|
||||
|
||||
rv = mEditor->GetInlineProperty(styleAtom, &faceStr, &thisFace, firstOfSelectionHasProp, anyOfSelectionHasProp, allOfSelectionHasProp);
|
||||
if( !anyOfSelectionHasProp )
|
||||
{
|
||||
// No font face set -- check for "tt". This can return an error if the selection isn't in a node
|
||||
rv = mEditor->GetInlineProperty(fixedStyleAtom, nsnull, nsnull, firstOfSelectionHasProp, anyOfSelectionHasProp, allOfSelectionHasProp);
|
||||
if (NS_SUCCEEDED(rv))
|
||||
{
|
||||
testBoolean = anyOfSelectionHasProp;
|
||||
if (anyOfSelectionHasProp)
|
||||
thisFace.AssignWithConversion("tt");
|
||||
}
|
||||
else
|
||||
rv = NS_OK; // we don't want to propagate this error
|
||||
}
|
||||
|
||||
// TODO: HANDLE "MIXED" STATE
|
||||
if (thisFace != mFontString)
|
||||
{
|
||||
rv = SetNodeAttribute(observerName, "face", thisFace);
|
||||
if (NS_SUCCEEDED(rv))
|
||||
mFontString = thisFace;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
nsresult
|
||||
nsInterfaceState::UpdateTextState(const char* tagName, const char* observerName, const char* attributeName, PRInt8& ioState)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
nsCOMPtr<nsIAtom> styleAtom = getter_AddRefs(NS_NewAtom(tagName));
|
||||
|
||||
PRBool testBoolean;
|
||||
PRBool firstOfSelectionHasProp = PR_FALSE;
|
||||
PRBool anyOfSelectionHasProp = PR_FALSE;
|
||||
PRBool allOfSelectionHasProp = PR_FALSE;
|
||||
|
||||
rv = mEditor->GetInlineProperty(styleAtom, nsnull, nsnull, firstOfSelectionHasProp, anyOfSelectionHasProp, allOfSelectionHasProp);
|
||||
testBoolean = allOfSelectionHasProp; // change this to alter the behaviour
|
||||
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
if (testBoolean != ioState)
|
||||
{
|
||||
rv = SetNodeAttribute(observerName, attributeName, NS_ConvertASCIItoUCS2(testBoolean ? "true" : "false"));
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
|
||||
ioState = testBoolean;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsInterfaceState::UpdateDirtyState(PRBool aNowDirty)
|
||||
{
|
||||
if (mDirtyState != aNowDirty)
|
||||
{
|
||||
CallUpdateCommands(NS_ConvertASCIItoUCS2("save"));
|
||||
|
||||
mDirtyState = aNowDirty;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
PRBool
|
||||
nsInterfaceState::XULNodeExists(const char* nodeID)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
if (!mChromeDoc)
|
||||
return NS_ERROR_NOT_INITIALIZED;
|
||||
|
||||
nsCOMPtr<nsIDOMElement> elem;
|
||||
rv = mChromeDoc->GetElementById( NS_ConvertASCIItoUCS2(nodeID), getter_AddRefs(elem) );
|
||||
|
||||
return NS_SUCCEEDED(rv) && elem;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsInterfaceState::SetNodeAttribute(const char* nodeID, const char* attributeName, const nsString& newValue)
|
||||
{
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
if (!mChromeDoc)
|
||||
return NS_ERROR_NOT_INITIALIZED;
|
||||
|
||||
nsCOMPtr<nsIDOMElement> elem;
|
||||
rv = mChromeDoc->GetElementById( NS_ConvertASCIItoUCS2(nodeID), getter_AddRefs(elem) );
|
||||
if (NS_FAILED(rv) || !elem) return rv;
|
||||
|
||||
return elem->SetAttribute(NS_ConvertASCIItoUCS2(attributeName), newValue);
|
||||
}
|
||||
|
||||
|
||||
nsresult
|
||||
nsInterfaceState::UnsetNodeAttribute(const char* nodeID, const char* attributeName)
|
||||
{
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
if (!mChromeDoc)
|
||||
return NS_ERROR_NOT_INITIALIZED;
|
||||
|
||||
nsCOMPtr<nsIDOMElement> elem;
|
||||
rv = mChromeDoc->GetElementById( NS_ConvertASCIItoUCS2(nodeID), getter_AddRefs(elem) );
|
||||
if (NS_FAILED(rv) || !elem) return rv;
|
||||
|
||||
return elem->RemoveAttribute(NS_ConvertASCIItoUCS2(attributeName));
|
||||
}
|
||||
|
||||
|
||||
#ifdef XP_MAC
|
||||
#pragma mark -
|
||||
|
|
|
@ -52,10 +52,6 @@ public:
|
|||
|
||||
NS_IMETHOD Init(nsIHTMLEditor* aEditor, nsIDOMDocument *aChromeDoc);
|
||||
|
||||
// force an update of the UI. At some point, we could pass flags
|
||||
// here to target certain things for updating.
|
||||
NS_IMETHOD ForceUpdate(const PRUnichar *tagToUpdate);
|
||||
|
||||
// nsISelectionListener interface
|
||||
NS_IMETHOD NotifySelectionChanged(nsIDOMDocument *aDoc, nsISelection *aSel, short aReason);
|
||||
|
||||
|
@ -92,18 +88,7 @@ protected:
|
|||
};
|
||||
|
||||
PRBool SelectionIsCollapsed();
|
||||
|
||||
PRBool XULNodeExists(const char* nodeID);
|
||||
|
||||
nsresult SetNodeAttribute(const char* nodeID, const char* attributeName, const nsString& newValue);
|
||||
nsresult UnsetNodeAttribute(const char* nodeID, const char* attributeName);
|
||||
|
||||
nsresult UpdateParagraphState(const char* observerName, const char* attributeName);
|
||||
nsresult UpdateListState(const char* observerName);
|
||||
nsresult UpdateTextState(const char* tagName, const char* observerName, const char* attributeName, PRInt8& ioState);
|
||||
nsresult UpdateFontFace(const char* observerName, const char* attributeName);
|
||||
nsresult UpdateDirtyState(PRBool aNowDirty);
|
||||
|
||||
nsresult UpdateDirtyState(PRBool aNowDirty);
|
||||
nsresult CallUpdateCommands(const nsString& aCommand);
|
||||
|
||||
nsresult PrimeUpdateTimer();
|
||||
|
@ -112,37 +97,17 @@ protected:
|
|||
// this class should not hold references to the editor or editorShell. Doing
|
||||
// so would result in cirular reference chains.
|
||||
|
||||
nsIHTMLEditor* mEditor; // the HTML editor
|
||||
nsIHTMLEditor* mEditor; // the HTML editor
|
||||
nsIDOMDocument* mChromeDoc; // XUL document for the chrome area
|
||||
|
||||
nsIDOMWindowInternal* mDOMWindow; // nsIDOMWindowInternal used for calling UpdateCommands
|
||||
|
||||
nsCOMPtr<nsITimer> mUpdateTimer;
|
||||
|
||||
// what we need to update
|
||||
PRPackedBool mUpdateParagraph;
|
||||
PRPackedBool mUpdateFont;
|
||||
PRPackedBool mUpdateList;
|
||||
|
||||
PRPackedBool mUpdateBold;
|
||||
PRPackedBool mUpdateItalics;
|
||||
PRPackedBool mUpdateUnderline;
|
||||
|
||||
// current state
|
||||
PRInt8 mBoldState;
|
||||
PRInt8 mItalicState;
|
||||
PRInt8 mUnderlineState;
|
||||
|
||||
PRInt8 mDirtyState;
|
||||
|
||||
PRInt8 mSelectionCollapsed;
|
||||
|
||||
PRInt8 mDirtyState;
|
||||
PRInt8 mSelectionCollapsed;
|
||||
PRPackedBool mFirstDoOfFirstUndo;
|
||||
|
||||
nsString mParagraphFormat;
|
||||
nsString mFontString;
|
||||
nsString mListTag; // contains "" for none, "ol" or "ul"
|
||||
|
||||
|
||||
};
|
||||
|
||||
extern "C" nsresult NS_NewInterfaceState(nsIHTMLEditor* aEditor, nsIDOMDocument* aChromeDoc, nsISelectionListener** aInstancePtrResult);
|
||||
|
|
|
@ -973,16 +973,6 @@ nsEditorShell::DoEditorMode(nsIDocShell *aDocShell)
|
|||
return InstantiateEditor(domDoc, presShell);
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsEditorShell::UpdateInterfaceState(const PRUnichar *tagToUpdate)
|
||||
{
|
||||
if (!mStateMaintainer)
|
||||
return NS_ERROR_NOT_INITIALIZED;
|
||||
|
||||
return mStateMaintainer->ForceUpdate(tagToUpdate);
|
||||
}
|
||||
|
||||
// Deletion routines
|
||||
nsresult
|
||||
nsEditorShell::ScrollSelectionIntoView()
|
||||
|
@ -1071,7 +1061,7 @@ nsEditorShell::SetAttribute(nsIDOMElement *element, const PRUnichar *attr, const
|
|||
nsAutoString valueStr(value);
|
||||
result = editor->SetAttribute(element, attributeStr, valueStr);
|
||||
}
|
||||
UpdateInterfaceState(nsnull);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -1087,7 +1077,7 @@ nsEditorShell::RemoveAttribute(nsIDOMElement *element, const PRUnichar *attr)
|
|||
nsAutoString attributeStr(attr);
|
||||
result = editor->RemoveAttribute(element, attributeStr);
|
||||
}
|
||||
UpdateInterfaceState(nsnull);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -1115,7 +1105,6 @@ nsEditorShell::SetTextProperty(const PRUnichar *prop, const PRUnichar *attr, con
|
|||
err = NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
UpdateInterfaceState(prop);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -1140,7 +1129,6 @@ nsEditorShell::RemoveOneProperty(const nsString& aProp, const nsString &aAttr)
|
|||
err = NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
UpdateInterfaceState(aProp.GetUnicode());
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
@ -44,46 +44,10 @@
|
|||
|
||||
#include "nsInterfaceState.h"
|
||||
|
||||
|
||||
/*
|
||||
static PRBool StringHashDestroyFunc(nsHashKey *aKey, void *aData, void* closure)
|
||||
{
|
||||
nsString* stringData = NS_REINTERPRET_CAST(nsString*, aData);
|
||||
delete stringData;
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
static void* StringHashCloneElementFunc(nsHashKey *aKey, void *aData, void* closure)
|
||||
{
|
||||
nsString* stringData = NS_REINTERPRET_CAST(nsString*, aData);
|
||||
if (stringData)
|
||||
{
|
||||
nsString* newString = new nsString(*stringData);
|
||||
return newString;
|
||||
}
|
||||
|
||||
return nsnull;
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
#ifdef XP_MAC
|
||||
#pragma mark -
|
||||
#endif
|
||||
|
||||
nsInterfaceState::nsInterfaceState()
|
||||
: mEditor(nsnull)
|
||||
, mChromeDoc(nsnull)
|
||||
, mDOMWindow(nsnull)
|
||||
, mUpdateParagraph(PR_FALSE)
|
||||
, mUpdateFont(PR_FALSE)
|
||||
, mUpdateList(PR_FALSE)
|
||||
, mUpdateBold(PR_FALSE)
|
||||
, mUpdateItalics(PR_FALSE)
|
||||
, mUpdateUnderline(PR_FALSE)
|
||||
, mBoldState(eStateUninitialized)
|
||||
, mItalicState(eStateUninitialized)
|
||||
, mUnderlineState(eStateUninitialized)
|
||||
, mDirtyState(eStateUninitialized)
|
||||
, mSelectionCollapsed(eStateUninitialized)
|
||||
, mFirstDoOfFirstUndo(PR_TRUE)
|
||||
|
@ -111,16 +75,6 @@ nsInterfaceState::Init(nsIHTMLEditor* aEditor, nsIDOMDocument *aChromeDoc)
|
|||
mEditor = aEditor; // no addreffing here
|
||||
mChromeDoc = aChromeDoc;
|
||||
|
||||
// it sucks explicitly naming XUL nodes here. Would be better to have
|
||||
// some way to register things that we want to observe from JS
|
||||
mUpdateParagraph = XULNodeExists("ParagraphSelect");
|
||||
mUpdateFont = XULNodeExists("FontFaceSelect");
|
||||
mUpdateList = XULNodeExists("ulButton") || XULNodeExists("olButton");
|
||||
|
||||
mUpdateBold = XULNodeExists("boldButton");
|
||||
mUpdateItalics = XULNodeExists("italicButton");
|
||||
mUpdateUnderline = XULNodeExists("underlineButton");
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -286,10 +240,21 @@ void nsInterfaceState::TimerCallback()
|
|||
mSelectionCollapsed = isCollapsed;
|
||||
}
|
||||
|
||||
// (void)ForceUpdate();
|
||||
CallUpdateCommands(NS_ConvertASCIItoUCS2("style"));
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsInterfaceState::UpdateDirtyState(PRBool aNowDirty)
|
||||
{
|
||||
if (mDirtyState != aNowDirty)
|
||||
{
|
||||
CallUpdateCommands(NS_ConvertASCIItoUCS2("save"));
|
||||
|
||||
mDirtyState = aNowDirty;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult nsInterfaceState::CallUpdateCommands(const nsString& aCommand)
|
||||
{
|
||||
|
@ -316,65 +281,6 @@ nsresult nsInterfaceState::CallUpdateCommands(const nsString& aCommand)
|
|||
return mDOMWindow->UpdateCommands(aCommand);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsInterfaceState::ForceUpdate(const PRUnichar *tagToUpdate)
|
||||
{
|
||||
PRBool updateEverything = !tagToUpdate || !*tagToUpdate;
|
||||
|
||||
#if 0
|
||||
// This code is obsolete now that commanders are doing the work
|
||||
nsresult rv;
|
||||
|
||||
// update bold
|
||||
if (mUpdateBold && (updateEverything || nsAutoString("b").Equals(tagToUpdate)))
|
||||
{
|
||||
rv = UpdateTextState("b", "cmd_bold", "bold", mBoldState);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Failed to update state");
|
||||
}
|
||||
|
||||
// update italic
|
||||
if (mUpdateItalics && (updateEverything || nsAutoString("i").Equals(tagToUpdate)))
|
||||
{
|
||||
rv = UpdateTextState("i", "cmd_italic", "italic", mItalicState);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Failed to update state");
|
||||
}
|
||||
|
||||
// update underline
|
||||
if (mUpdateUnderline && (updateEverything || nsAutoString("u").Equals(tagToUpdate)))
|
||||
{
|
||||
rv = UpdateTextState("u", "cmd_underline", "underline", mUnderlineState);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Failed to update state");
|
||||
}
|
||||
|
||||
// update the paragraph format popup
|
||||
if (mUpdateParagraph && (updateEverything || nsAutoString("format").Equals(tagToUpdate)))
|
||||
{
|
||||
rv = UpdateParagraphState("Editor:Paragraph:Format", "format");
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Failed to update state");
|
||||
}
|
||||
|
||||
// udpate the font face
|
||||
if (mUpdateFont && (updateEverything || nsAutoString("font").Equals(tagToUpdate)))
|
||||
{
|
||||
rv = UpdateFontFace("Editor:Font:Face", "font");
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Failed to update state");
|
||||
}
|
||||
|
||||
// TODO: FINISH FONT FACE AND ADD FONT SIZE ("Editor:Font:Size", "fontsize", mFontSize)
|
||||
|
||||
// update the list buttons
|
||||
if (mUpdateList && (updateEverything ||
|
||||
nsAutoString("ol").Equals(tagToUpdate) ||
|
||||
nsAutoString("ul").Equals(tagToUpdate)))
|
||||
{
|
||||
rv = UpdateListState("Editor:Paragraph:ListType");
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Failed to update state");
|
||||
}
|
||||
#endif
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
PRBool
|
||||
nsInterfaceState::SelectionIsCollapsed()
|
||||
{
|
||||
|
@ -395,256 +301,6 @@ nsInterfaceState::SelectionIsCollapsed()
|
|||
return PR_FALSE;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsInterfaceState::UpdateParagraphState(const char* observerName, const char* attributeName)
|
||||
{
|
||||
nsCOMPtr<nsISelection> domSelection;
|
||||
nsCOMPtr<nsIEditor> editor = do_QueryInterface(mEditor);
|
||||
// Get the nsIEditor pointer (mEditor is nsIHTMLEditor)
|
||||
if (!editor) return NS_ERROR_NULL_POINTER;
|
||||
nsresult rv = editor->GetSelection(getter_AddRefs(domSelection));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
PRBool selectionCollapsed = PR_FALSE;
|
||||
rv = domSelection->GetIsCollapsed(&selectionCollapsed);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
// Get anchor and focus nodes:
|
||||
nsCOMPtr<nsIDOMNode> anchorNode;
|
||||
rv = domSelection->GetAnchorNode(getter_AddRefs(anchorNode));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
if (!anchorNode) return NS_ERROR_NULL_POINTER;
|
||||
|
||||
nsCOMPtr<nsIDOMNode> focusNode;
|
||||
rv = domSelection->GetFocusNode(getter_AddRefs(focusNode));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
if (!focusNode) return NS_ERROR_NULL_POINTER;
|
||||
|
||||
nsCOMPtr<nsIDOMNode> anchorNodeBlockParent;
|
||||
PRBool isBlock;
|
||||
rv = editor->NodeIsBlock(anchorNode, isBlock);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
if (isBlock)
|
||||
{
|
||||
anchorNodeBlockParent = anchorNode;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Get block parent of anchorNode node
|
||||
// We could simply use this if it was in nsIEditor interface!
|
||||
//rv = editor->GetBlockParent(anchorNode, getter_AddRefs(anchorNodeBlockParent));
|
||||
// if (NS_FAILED(rv)) return rv;
|
||||
|
||||
nsCOMPtr<nsIDOMNode>parent;
|
||||
nsCOMPtr<nsIDOMNode>temp;
|
||||
rv = anchorNode->GetParentNode(getter_AddRefs(parent));
|
||||
while (NS_SUCCEEDED(rv) && parent)
|
||||
{
|
||||
rv = editor->NodeIsBlock(parent, isBlock);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
if (isBlock)
|
||||
{
|
||||
anchorNodeBlockParent = parent;
|
||||
break;
|
||||
}
|
||||
rv = parent->GetParentNode(getter_AddRefs(temp));
|
||||
parent = do_QueryInterface(temp);
|
||||
}
|
||||
}
|
||||
if (!anchorNodeBlockParent) // return NS_ERROR_NULL_POINTER;
|
||||
anchorNodeBlockParent = anchorNode;
|
||||
|
||||
nsAutoString tagName;
|
||||
|
||||
// Check if we have a selection that extends into multiple nodes,
|
||||
// so we can check for "mixed" selection state
|
||||
if (selectionCollapsed || focusNode == anchorNode)
|
||||
{
|
||||
// Entire selection is within one block
|
||||
anchorNodeBlockParent->GetNodeName(tagName);
|
||||
}
|
||||
else
|
||||
{
|
||||
// We may have different block parent node types WITHIN the selection,
|
||||
// even if the anchor and focus parents are the same type.
|
||||
// Getting the list of all block, e.g., by using GetParagraphTags(&tagList)
|
||||
// is too inefficient for long documents.
|
||||
// TODO: Change to use selection iterator to detect each block node in the
|
||||
// selection and if different from the anchorNodeBlockParent, use "mixed" state
|
||||
// *** Not doing this now reduces risk for Beta1 -- simply assume mixed state
|
||||
// Note that "mixed" displays as "normal" in UI as of 3/6.
|
||||
tagName.AssignWithConversion("mixed");
|
||||
}
|
||||
|
||||
if (tagName != mParagraphFormat)
|
||||
{
|
||||
rv = SetNodeAttribute(observerName, attributeName, tagName);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
mParagraphFormat = tagName;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsInterfaceState::UpdateListState(const char* observerName)
|
||||
{
|
||||
nsresult rv = NS_ERROR_NO_INTERFACE;
|
||||
nsAutoString tagStr; // empty by default.
|
||||
|
||||
PRBool bMixed, bOL, bUL, bDL;
|
||||
rv = mEditor->GetListState(bMixed, bOL, bUL, bDL);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
if (bMixed)
|
||||
{} // leave tagStr empty
|
||||
else if (bOL)
|
||||
tagStr.AssignWithConversion("ol");
|
||||
else if (bUL)
|
||||
tagStr.AssignWithConversion("ul");
|
||||
else if (bDL)
|
||||
tagStr.AssignWithConversion("dl");
|
||||
// else leave tagStr empty
|
||||
|
||||
rv = SetNodeAttribute(observerName, "format", tagStr);
|
||||
|
||||
mListTag = tagStr;
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsInterfaceState::UpdateFontFace(const char* observerName, const char* attributeName)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
PRBool firstOfSelectionHasProp = PR_FALSE;
|
||||
PRBool anyOfSelectionHasProp = PR_FALSE;
|
||||
PRBool allOfSelectionHasProp = PR_FALSE;
|
||||
|
||||
nsCOMPtr<nsIAtom> styleAtom = getter_AddRefs(NS_NewAtom("font"));
|
||||
nsAutoString faceStr; faceStr.AssignWithConversion("face");
|
||||
nsAutoString thisFace;
|
||||
|
||||
// Use to test for "Default Fixed Width"
|
||||
nsCOMPtr<nsIAtom> fixedStyleAtom = getter_AddRefs(NS_NewAtom("tt"));
|
||||
|
||||
PRBool testBoolean;
|
||||
|
||||
rv = mEditor->GetInlineProperty(styleAtom, &faceStr, &thisFace, firstOfSelectionHasProp, anyOfSelectionHasProp, allOfSelectionHasProp);
|
||||
if( !anyOfSelectionHasProp )
|
||||
{
|
||||
// No font face set -- check for "tt". This can return an error if the selection isn't in a node
|
||||
rv = mEditor->GetInlineProperty(fixedStyleAtom, nsnull, nsnull, firstOfSelectionHasProp, anyOfSelectionHasProp, allOfSelectionHasProp);
|
||||
if (NS_SUCCEEDED(rv))
|
||||
{
|
||||
testBoolean = anyOfSelectionHasProp;
|
||||
if (anyOfSelectionHasProp)
|
||||
thisFace.AssignWithConversion("tt");
|
||||
}
|
||||
else
|
||||
rv = NS_OK; // we don't want to propagate this error
|
||||
}
|
||||
|
||||
// TODO: HANDLE "MIXED" STATE
|
||||
if (thisFace != mFontString)
|
||||
{
|
||||
rv = SetNodeAttribute(observerName, "face", thisFace);
|
||||
if (NS_SUCCEEDED(rv))
|
||||
mFontString = thisFace;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
nsresult
|
||||
nsInterfaceState::UpdateTextState(const char* tagName, const char* observerName, const char* attributeName, PRInt8& ioState)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
nsCOMPtr<nsIAtom> styleAtom = getter_AddRefs(NS_NewAtom(tagName));
|
||||
|
||||
PRBool testBoolean;
|
||||
PRBool firstOfSelectionHasProp = PR_FALSE;
|
||||
PRBool anyOfSelectionHasProp = PR_FALSE;
|
||||
PRBool allOfSelectionHasProp = PR_FALSE;
|
||||
|
||||
rv = mEditor->GetInlineProperty(styleAtom, nsnull, nsnull, firstOfSelectionHasProp, anyOfSelectionHasProp, allOfSelectionHasProp);
|
||||
testBoolean = allOfSelectionHasProp; // change this to alter the behaviour
|
||||
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
if (testBoolean != ioState)
|
||||
{
|
||||
rv = SetNodeAttribute(observerName, attributeName, NS_ConvertASCIItoUCS2(testBoolean ? "true" : "false"));
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
|
||||
ioState = testBoolean;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsInterfaceState::UpdateDirtyState(PRBool aNowDirty)
|
||||
{
|
||||
if (mDirtyState != aNowDirty)
|
||||
{
|
||||
CallUpdateCommands(NS_ConvertASCIItoUCS2("save"));
|
||||
|
||||
mDirtyState = aNowDirty;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
PRBool
|
||||
nsInterfaceState::XULNodeExists(const char* nodeID)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
if (!mChromeDoc)
|
||||
return NS_ERROR_NOT_INITIALIZED;
|
||||
|
||||
nsCOMPtr<nsIDOMElement> elem;
|
||||
rv = mChromeDoc->GetElementById( NS_ConvertASCIItoUCS2(nodeID), getter_AddRefs(elem) );
|
||||
|
||||
return NS_SUCCEEDED(rv) && elem;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsInterfaceState::SetNodeAttribute(const char* nodeID, const char* attributeName, const nsString& newValue)
|
||||
{
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
if (!mChromeDoc)
|
||||
return NS_ERROR_NOT_INITIALIZED;
|
||||
|
||||
nsCOMPtr<nsIDOMElement> elem;
|
||||
rv = mChromeDoc->GetElementById( NS_ConvertASCIItoUCS2(nodeID), getter_AddRefs(elem) );
|
||||
if (NS_FAILED(rv) || !elem) return rv;
|
||||
|
||||
return elem->SetAttribute(NS_ConvertASCIItoUCS2(attributeName), newValue);
|
||||
}
|
||||
|
||||
|
||||
nsresult
|
||||
nsInterfaceState::UnsetNodeAttribute(const char* nodeID, const char* attributeName)
|
||||
{
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
if (!mChromeDoc)
|
||||
return NS_ERROR_NOT_INITIALIZED;
|
||||
|
||||
nsCOMPtr<nsIDOMElement> elem;
|
||||
rv = mChromeDoc->GetElementById( NS_ConvertASCIItoUCS2(nodeID), getter_AddRefs(elem) );
|
||||
if (NS_FAILED(rv) || !elem) return rv;
|
||||
|
||||
return elem->RemoveAttribute(NS_ConvertASCIItoUCS2(attributeName));
|
||||
}
|
||||
|
||||
|
||||
#ifdef XP_MAC
|
||||
#pragma mark -
|
||||
|
|
|
@ -52,10 +52,6 @@ public:
|
|||
|
||||
NS_IMETHOD Init(nsIHTMLEditor* aEditor, nsIDOMDocument *aChromeDoc);
|
||||
|
||||
// force an update of the UI. At some point, we could pass flags
|
||||
// here to target certain things for updating.
|
||||
NS_IMETHOD ForceUpdate(const PRUnichar *tagToUpdate);
|
||||
|
||||
// nsISelectionListener interface
|
||||
NS_IMETHOD NotifySelectionChanged(nsIDOMDocument *aDoc, nsISelection *aSel, short aReason);
|
||||
|
||||
|
@ -92,18 +88,7 @@ protected:
|
|||
};
|
||||
|
||||
PRBool SelectionIsCollapsed();
|
||||
|
||||
PRBool XULNodeExists(const char* nodeID);
|
||||
|
||||
nsresult SetNodeAttribute(const char* nodeID, const char* attributeName, const nsString& newValue);
|
||||
nsresult UnsetNodeAttribute(const char* nodeID, const char* attributeName);
|
||||
|
||||
nsresult UpdateParagraphState(const char* observerName, const char* attributeName);
|
||||
nsresult UpdateListState(const char* observerName);
|
||||
nsresult UpdateTextState(const char* tagName, const char* observerName, const char* attributeName, PRInt8& ioState);
|
||||
nsresult UpdateFontFace(const char* observerName, const char* attributeName);
|
||||
nsresult UpdateDirtyState(PRBool aNowDirty);
|
||||
|
||||
nsresult UpdateDirtyState(PRBool aNowDirty);
|
||||
nsresult CallUpdateCommands(const nsString& aCommand);
|
||||
|
||||
nsresult PrimeUpdateTimer();
|
||||
|
@ -112,37 +97,17 @@ protected:
|
|||
// this class should not hold references to the editor or editorShell. Doing
|
||||
// so would result in cirular reference chains.
|
||||
|
||||
nsIHTMLEditor* mEditor; // the HTML editor
|
||||
nsIHTMLEditor* mEditor; // the HTML editor
|
||||
nsIDOMDocument* mChromeDoc; // XUL document for the chrome area
|
||||
|
||||
nsIDOMWindowInternal* mDOMWindow; // nsIDOMWindowInternal used for calling UpdateCommands
|
||||
|
||||
nsCOMPtr<nsITimer> mUpdateTimer;
|
||||
|
||||
// what we need to update
|
||||
PRPackedBool mUpdateParagraph;
|
||||
PRPackedBool mUpdateFont;
|
||||
PRPackedBool mUpdateList;
|
||||
|
||||
PRPackedBool mUpdateBold;
|
||||
PRPackedBool mUpdateItalics;
|
||||
PRPackedBool mUpdateUnderline;
|
||||
|
||||
// current state
|
||||
PRInt8 mBoldState;
|
||||
PRInt8 mItalicState;
|
||||
PRInt8 mUnderlineState;
|
||||
|
||||
PRInt8 mDirtyState;
|
||||
|
||||
PRInt8 mSelectionCollapsed;
|
||||
|
||||
PRInt8 mDirtyState;
|
||||
PRInt8 mSelectionCollapsed;
|
||||
PRPackedBool mFirstDoOfFirstUndo;
|
||||
|
||||
nsString mParagraphFormat;
|
||||
nsString mFontString;
|
||||
nsString mListTag; // contains "" for none, "ol" or "ul"
|
||||
|
||||
|
||||
};
|
||||
|
||||
extern "C" nsresult NS_NewInterfaceState(nsIHTMLEditor* aEditor, nsIDOMDocument* aChromeDoc, nsISelectionListener** aInstancePtrResult);
|
||||
|
|
|
@ -178,11 +178,6 @@ interface nsIEditorShell : nsISupports
|
|||
|
||||
/* General Utilities */
|
||||
|
||||
/* UI updating
|
||||
* tagToUpdate can be null or "" to update everything
|
||||
*/
|
||||
void UpdateInterfaceState(in wstring tagToUpdate);
|
||||
|
||||
/* Get string from the Editor's localized string bundle */
|
||||
wstring GetString(in wstring name);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче