From a65a684b1547d3849d3a268e74ecb811ffca60d2 Mon Sep 17 00:00:00 2001 From: "sfraser%netscape.com" Date: Tue, 18 Jan 2000 21:50:15 +0000 Subject: [PATCH] WIP for 18395, various editor command handling and updating changes. r=akkana git-svn-id: svn://10.0.0.236/trunk@58123 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/editor/base/TypeInState.h | 1 + mozilla/editor/base/nsEditor.cpp | 2 +- mozilla/editor/base/nsEditor.h | 3 + mozilla/editor/base/nsEditorController.cpp | 323 +++++++++--------- mozilla/editor/base/nsEditorController.h | 92 ++--- mozilla/editor/base/nsEditorShell.cpp | 22 +- mozilla/editor/base/nsHTMLEditor.cpp | 108 +++++- mozilla/editor/base/nsHTMLEditor.h | 6 + mozilla/editor/base/nsInterfaceState.cpp | 68 ++-- mozilla/editor/base/nsInterfaceState.h | 12 +- mozilla/editor/composer/src/nsEditorShell.cpp | 22 +- .../editor/composer/src/nsInterfaceState.cpp | 68 ++-- .../editor/composer/src/nsInterfaceState.h | 12 +- mozilla/editor/libeditor/base/nsEditor.cpp | 2 +- mozilla/editor/libeditor/base/nsEditor.h | 3 + .../libeditor/base/nsEditorController.cpp | 323 +++++++++--------- .../libeditor/base/nsEditorController.h | 92 ++--- mozilla/editor/libeditor/html/TypeInState.h | 1 + .../editor/libeditor/html/nsHTMLEditor.cpp | 108 +++++- mozilla/editor/libeditor/html/nsHTMLEditor.h | 6 + mozilla/editor/public/nsIEditor.h | 14 + 21 files changed, 766 insertions(+), 522 deletions(-) diff --git a/mozilla/editor/base/TypeInState.h b/mozilla/editor/base/TypeInState.h index 7c550bb34af..efa8dc2df1c 100644 --- a/mozilla/editor/base/TypeInState.h +++ b/mozilla/editor/base/TypeInState.h @@ -25,6 +25,7 @@ #include "nsIDOMSelectionListener.h" #include "nsIEditProperty.h" +#include "nsString.h" class TypeInState : public nsIDOMSelectionListener { diff --git a/mozilla/editor/base/nsEditor.cpp b/mozilla/editor/base/nsEditor.cpp index a85609af03b..419cd7f545c 100644 --- a/mozilla/editor/base/nsEditor.cpp +++ b/mozilla/editor/base/nsEditor.cpp @@ -1480,7 +1480,7 @@ nsEditor::SetCompositionString(const nsString& aCompositionString, nsIPrivateTex return NS_ERROR_NOT_IMPLEMENTED; } -nsIWidget * GetDeepestWidget(nsIView * aView) +static nsIWidget* GetDeepestWidget(nsIView * aView) { PRInt32 count; diff --git a/mozilla/editor/base/nsEditor.h b/mozilla/editor/base/nsEditor.h index fde82734a71..433b7c288ad 100644 --- a/mozilla/editor/base/nsEditor.h +++ b/mozilla/editor/base/nsEditor.h @@ -156,8 +156,11 @@ public: // these are pure virtual in this base class NS_IMETHOD Cut() = 0; + NS_IMETHOD CanCut(PRBool &aCanCut)=0; NS_IMETHOD Copy() = 0; + NS_IMETHOD CanCopy(PRBool &aCanCopy)=0; NS_IMETHOD Paste() = 0; + NS_IMETHOD CanPaste(PRBool &aCanPaste)=0; NS_IMETHOD SelectAll(); diff --git a/mozilla/editor/base/nsEditorController.cpp b/mozilla/editor/base/nsEditorController.cpp index 8d747862416..d78641078d5 100644 --- a/mozilla/editor/base/nsEditorController.cpp +++ b/mozilla/editor/base/nsEditorController.cpp @@ -26,14 +26,13 @@ #include "nsIEditor.h" #include "nsIFormControlFrame.h" #include "nsIDOMSelection.h" +#include "nsIHTMLEditor.h" +#include "nsISupportsPrimitives.h" #include "nsISelectionController.h" #include "nsIDocument.h" #include "nsIPresShell.h" -//USED FOR DEPRICATED CALL... -//#include "nsGenericHTMLElement.h" - NS_IMPL_ADDREF(nsEditorController) NS_IMPL_RELEASE(nsEditorController) @@ -48,60 +47,60 @@ nsEditorController::nsEditorController() NS_INIT_REFCNT(); mContent = nsnull; mEditor = nsnull; - mUndoString = "cmd_undo"; - mRedoString = "cmd_redo"; - mCutString = "cmd_cut"; - mCopyString = "cmd_copy"; - mPasteString = "cmd_paste"; + + mUndoCmd = getter_AddRefs(NS_NewAtom("cmd_undo")); + mRedoCmd = getter_AddRefs(NS_NewAtom("cmd_redo")); + mCutCmd = getter_AddRefs(NS_NewAtom("cmd_cut")); + mCopyCmd = getter_AddRefs(NS_NewAtom("cmd_copy")); + mPasteCmd = getter_AddRefs(NS_NewAtom("cmd_paste")); + mDeleteCmd = getter_AddRefs(NS_NewAtom("cmd_delete")); + mSelectAllCmd = getter_AddRefs(NS_NewAtom("cmd_selectAll")); - mDeleteString = "cmd_delete"; - mSelectAllString = "cmd_selectAll"; - mBeginLineString = "cmd_beginLine"; - mEndLineString = "cmd_endLine"; - mSelectBeginLineString = "cmd_selectBeginLine"; - mSelectEndLineString = "cmd_selectEndLine"; + mBeginLineCmd = getter_AddRefs(NS_NewAtom("cmd_beginLine")); + mEndLineCmd = getter_AddRefs(NS_NewAtom("cmd_endLine")); + mSelectBeginLineCmd = getter_AddRefs(NS_NewAtom("cmd_selectBeginLine")); + mSelectEndLineCmd = getter_AddRefs(NS_NewAtom("cmd_selectEndLine")); - mScrollTopString = "cmd_scrollTop"; - mScrollBottomString = "cmd_scrollBottom"; + mScrollTopCmd = getter_AddRefs(NS_NewAtom("cmd_scrollTop")); + mScrollBottomCmd = getter_AddRefs(NS_NewAtom("cmd_scrollBottom")); - mMoveTopString = "cmd_moveTop"; - mMoveBottomString= "cmd_moveBottom"; - mSelectMoveTopString = "cmd_selectTop"; - mSelectMoveBottomString= "cmd_selectBottom"; + mMoveTopCmd = getter_AddRefs(NS_NewAtom("cmd_moveTop")); + mMoveBottomCmd = getter_AddRefs(NS_NewAtom("cmd_moveBottom")); + mSelectMoveTopCmd = getter_AddRefs(NS_NewAtom("cmd_selectTop")); + mSelectMoveBottomCmd = getter_AddRefs(NS_NewAtom("cmd_selectBottom")); - mLineNextString = "cmd_lineNext"; - mLinePreviousString = "cmd_linePrevious"; - mSelectLineNextString = "cmd_selectLineNext"; - mSelectLinePreviousString = "cmd_selectLinePrevious"; + mLineNextCmd = getter_AddRefs(NS_NewAtom("cmd_lineNext")); + mLinePreviousCmd = getter_AddRefs(NS_NewAtom("cmd_linePrevious")); + mSelectLineNextCmd = getter_AddRefs(NS_NewAtom("cmd_selectLineNext")); + mSelectLinePreviousCmd = getter_AddRefs(NS_NewAtom("cmd_selectLinePrevious")); - mLeftString = "cmd_charPrevious"; - mRightString = "cmd_charNext"; - mSelectLeftString = "cmd_selectCharPrevious"; - mSelectRightString= "cmd_selectCharNext"; + mLeftCmd = getter_AddRefs(NS_NewAtom("cmd_charPrevious")); + mRightCmd = getter_AddRefs(NS_NewAtom("cmd_charNext")); + mSelectLeftCmd = getter_AddRefs(NS_NewAtom("cmd_selectCharPrevious")); + mSelectRightCmd = getter_AddRefs(NS_NewAtom("cmd_selectCharNext")); + mWordLeftCmd = getter_AddRefs(NS_NewAtom("cmd_wordPrevious")); + mWordRightCmd = getter_AddRefs(NS_NewAtom("cmd_wordNext")); + mSelectWordLeftCmd = getter_AddRefs(NS_NewAtom("cmd_selectWordPrevious")); + mSelectWordRightCmd = getter_AddRefs(NS_NewAtom("cmd_selectWordNext")); - mWordLeftString = "cmd_wordPrevious"; - mWordRightString = "cmd_wordNext"; - mSelectWordLeftString = "cmd_selectWordPrevious"; - mSelectWordRightString= "cmd_selectWordNext"; + mScrollPageUpCmd = getter_AddRefs(NS_NewAtom("cmd_scrollPageUp")); + mScrollPageDownCmd = getter_AddRefs(NS_NewAtom("cmd_scrollPageDown")); + mScrollLineUpCmd = getter_AddRefs(NS_NewAtom("cmd_scrollLineUp")); + mScrollLineDownCmd = getter_AddRefs(NS_NewAtom("cmd_scrollLineDown")); - mScrollPageUp = "cmd_scrollPageUp"; - mScrollPageDown = "cmd_scrollPageDown"; - mScrollLineUp = "cmd_scrollLineUp"; - mScrollLineDown = "cmd_scrollLineDown"; + mMovePageUpCmd = getter_AddRefs(NS_NewAtom("cmd_scrollPageUp")); + mMovePageDownCmd = getter_AddRefs(NS_NewAtom("cmd_scrollPageDown")); + mSelectMovePageUpCmd = getter_AddRefs(NS_NewAtom("cmd_selectPageUp")); + mSelectMovePageDownCmd = getter_AddRefs(NS_NewAtom("cmd_selectPageDown")); - mMovePageUp = "cmd_scrollPageUp"; - mMovePageDown = "cmd_scrollPageDown"; - mSelectMovePageUp = "cmd_selectPageUp"; - mSelectMovePageDown = "cmd_selectPageDown"; + mDeleteCharBackwardCmd = getter_AddRefs(NS_NewAtom("cmd_deleteCharBackward")); + mDeleteCharForwardCmd = getter_AddRefs(NS_NewAtom("cmd_deleteCharForward")); + mDeleteWordBackwardCmd = getter_AddRefs(NS_NewAtom("cmd_deleteWordBackward")); + mDeleteWordForwardCmd = getter_AddRefs(NS_NewAtom("cmd_deleteWordForward")); - mDeleteCharBackward = "cmd_deleteCharBackward"; - mDeleteCharForward = "cmd_deleteCharForward"; - mDeleteWordBackward = "cmd_deleteWordBackward"; - mDeleteWordForward = "cmd_deleteWordForward"; - - mDeleteToBeginningOfLine = "cmd_deleteToBeginningOfLine"; - mDeleteToEndOfLine = "cmd_deleteToEndOfLine"; + mDeleteToBeginningOfLineCmd = getter_AddRefs(NS_NewAtom("cmd_deleteToBeginningOfLine")); + mDeleteToEndOfLineCmd = getter_AddRefs(NS_NewAtom("cmd_deleteToEndOfLine")); } nsEditorController::~nsEditorController() @@ -134,11 +133,13 @@ NS_IMETHODIMP nsEditorController::IsCommandEnabled(const PRUnichar *aCommand, PR *aResult = PR_FALSE; + nsCOMPtr cmdAtom = getter_AddRefs(NS_NewAtom(aCommand)); + nsCOMPtr editor; NS_ENSURE_SUCCESS(GetEditor(getter_AddRefs(editor)), NS_ERROR_FAILURE); // a null editor is a legal state - if (PR_TRUE==mUndoString.Equals(aCommand)) + if (cmdAtom == mUndoCmd) { // we can undo if the editor says we can undo if (editor) { @@ -146,7 +147,7 @@ NS_IMETHODIMP nsEditorController::IsCommandEnabled(const PRUnichar *aCommand, PR NS_ENSURE_SUCCESS(editor->CanUndo(isEnabled, *aResult), NS_ERROR_FAILURE); } } - else if (PR_TRUE==mRedoString.Equals(aCommand)) + else if (cmdAtom == mRedoCmd) { // we can redo if the editor says we can undo if (editor) { @@ -154,48 +155,35 @@ NS_IMETHODIMP nsEditorController::IsCommandEnabled(const PRUnichar *aCommand, PR NS_ENSURE_SUCCESS(editor->CanRedo(isEnabled, *aResult), NS_ERROR_FAILURE); } } - else if (PR_TRUE==mCutString.Equals(aCommand)) + else if (cmdAtom == mCutCmd) { // we can cut if the editor has a non-collapsed selection and is not readonly if (editor) { - nsCOMPtr selection; - NS_ENSURE_SUCCESS(editor->GetSelection(getter_AddRefs(selection)), NS_ERROR_FAILURE); - if (selection) - { - PRBool collapsed; - NS_ENSURE_SUCCESS(selection->GetIsCollapsed(&collapsed), NS_ERROR_FAILURE); - if ((PR_FALSE==collapsed) && (PR_TRUE==IsEnabled())) { - *aResult = PR_TRUE; - } - } + NS_ENSURE_SUCCESS(editor->CanCut(*aResult), NS_ERROR_FAILURE); } } - else if (PR_TRUE==mCopyString.Equals(aCommand)) + else if (cmdAtom == mCopyCmd) { // we can copy if the editor has a non-collapsed selection if (editor) { - nsCOMPtr selection; - NS_ENSURE_SUCCESS(editor->GetSelection(getter_AddRefs(selection)), NS_ERROR_FAILURE); - if (selection) - { - PRBool collapsed; - NS_ENSURE_SUCCESS(selection->GetIsCollapsed(&collapsed), NS_ERROR_FAILURE); - if (PR_FALSE==collapsed) { - *aResult = PR_TRUE; - } - } + NS_ENSURE_SUCCESS(editor->CanCopy(*aResult), NS_ERROR_FAILURE); } } - else if (PR_TRUE==mPasteString.Equals(aCommand)) - { // paste is enabled if there is text on the clipbard and if the editor is not readonly or disabled - // XXX: implement me - *aResult = PR_TRUE; + else if (cmdAtom == mPasteCmd) + { + if (editor) + { + NS_ENSURE_SUCCESS(editor->CanPaste(*aResult), NS_ERROR_FAILURE); + } } - else if (PR_TRUE==mDeleteString.Equals(aCommand)) - { // delete is enabled if there is any content and if the editor is not readonly or disabled - *aResult = PR_TRUE; + else if (cmdAtom == mDeleteCmd) + { // we can delete if the editor has a non-collapsed selection and is modifiable (same as cut) + if (editor) + { + NS_ENSURE_SUCCESS(editor->CanCut(*aResult), NS_ERROR_FAILURE); + } } - else if (PR_TRUE==mSelectAllString.Equals(aCommand)) + else if (cmdAtom == mSelectAllCmd) { // selectAll is enabled if there is any content and if the editor is not disabled (readonly is ok) *aResult = PR_TRUE; } @@ -211,49 +199,52 @@ NS_IMETHODIMP nsEditorController::SupportsCommand(const PRUnichar *aCommand, PRB // XXX: need to check the readonly and disabled states *aResult = PR_FALSE; - if ((PR_TRUE==mUndoString.Equals(aCommand)) || - (PR_TRUE==mRedoString.Equals(aCommand)) || - (PR_TRUE==mCutString.Equals(aCommand)) || - (PR_TRUE==mCopyString.Equals(aCommand)) || - (PR_TRUE==mPasteString.Equals(aCommand)) || - (PR_TRUE==mDeleteString.Equals(aCommand)) || - (PR_TRUE==mDeleteCharForward.Equals(aCommand)) || - (PR_TRUE==mDeleteCharBackward.Equals(aCommand)) || - (PR_TRUE==mDeleteWordForward.Equals(aCommand)) || - (PR_TRUE==mDeleteWordBackward.Equals(aCommand)) || - (PR_TRUE==mDeleteToBeginningOfLine.Equals(aCommand)) || - (PR_TRUE==mDeleteToEndOfLine.Equals(aCommand)) || - (PR_TRUE==mSelectAllString.Equals(aCommand)) || - (PR_TRUE==mBeginLineString.Equals(aCommand)) || - (PR_TRUE==mEndLineString.Equals(aCommand)) || - (PR_TRUE==mSelectBeginLineString.Equals(aCommand)) || - (PR_TRUE==mSelectEndLineString.Equals(aCommand)) || - (PR_TRUE==mScrollTopString.Equals(aCommand)) || - (PR_TRUE==mScrollBottomString.Equals(aCommand)) || - (PR_TRUE==mMoveTopString.Equals(aCommand)) || - (PR_TRUE==mMoveBottomString.Equals(aCommand)) || - (PR_TRUE==mSelectMoveTopString.Equals(aCommand)) || - (PR_TRUE==mSelectMoveBottomString.Equals(aCommand)) || - (PR_TRUE==mLineNextString.Equals(aCommand)) || - (PR_TRUE==mLinePreviousString.Equals(aCommand)) || - (PR_TRUE==mLeftString.Equals(aCommand)) || - (PR_TRUE==mRightString.Equals(aCommand)) || - (PR_TRUE==mSelectLineNextString.Equals(aCommand)) || - (PR_TRUE==mSelectLinePreviousString.Equals(aCommand)) || - (PR_TRUE==mSelectLeftString.Equals(aCommand)) || - (PR_TRUE==mSelectRightString.Equals(aCommand)) || - (PR_TRUE==mWordLeftString.Equals(aCommand)) || - (PR_TRUE==mWordRightString.Equals(aCommand)) || - (PR_TRUE==mSelectWordLeftString.Equals(aCommand)) || - (PR_TRUE==mSelectWordRightString.Equals(aCommand)) || - (PR_TRUE==mScrollPageUp.Equals(aCommand)) || - (PR_TRUE==mScrollPageDown.Equals(aCommand)) || - (PR_TRUE==mScrollLineUp.Equals(aCommand)) || - (PR_TRUE==mScrollLineDown.Equals(aCommand)) || - (PR_TRUE==mMovePageUp.Equals(aCommand)) || - (PR_TRUE==mMovePageDown.Equals(aCommand)) || - (PR_TRUE==mSelectMovePageUp.Equals(aCommand)) || - (PR_TRUE==mSelectMovePageDown.Equals(aCommand)) + nsCOMPtr cmdAtom = getter_AddRefs(NS_NewAtom(aCommand)); + + if ( + (cmdAtom == mUndoCmd) || + (cmdAtom == mRedoCmd) || + (cmdAtom == mCutCmd) || + (cmdAtom == mCopyCmd) || + (cmdAtom == mPasteCmd) || + (cmdAtom == mDeleteCmd) || + (cmdAtom == mSelectAllCmd) || + (cmdAtom == mBeginLineCmd) || + (cmdAtom == mEndLineCmd) || + (cmdAtom == mSelectBeginLineCmd) || + (cmdAtom == mSelectEndLineCmd) || + (cmdAtom == mScrollTopCmd) || + (cmdAtom == mScrollBottomCmd) || + (cmdAtom == mMoveTopCmd) || + (cmdAtom == mMoveBottomCmd) || + (cmdAtom == mSelectMoveTopCmd) || + (cmdAtom == mSelectMoveBottomCmd) || + (cmdAtom == mLineNextCmd) || + (cmdAtom == mLinePreviousCmd) || + (cmdAtom == mLeftCmd) || + (cmdAtom == mRightCmd) || + (cmdAtom == mSelectLineNextCmd) || + (cmdAtom == mSelectLinePreviousCmd) || + (cmdAtom == mSelectLeftCmd) || + (cmdAtom == mSelectRightCmd) || + (cmdAtom == mWordLeftCmd) || + (cmdAtom == mWordRightCmd) || + (cmdAtom == mSelectWordLeftCmd) || + (cmdAtom == mSelectWordRightCmd) || + (cmdAtom == mScrollPageUpCmd) || + (cmdAtom == mScrollPageDownCmd) || + (cmdAtom == mScrollLineUpCmd) || + (cmdAtom == mScrollLineDownCmd) || + (cmdAtom == mMovePageUpCmd) || + (cmdAtom == mMovePageDownCmd) || + (cmdAtom == mSelectMovePageUpCmd) || + (cmdAtom == mSelectMovePageDownCmd) || + (cmdAtom == mDeleteCharForwardCmd) || + (cmdAtom == mDeleteCharBackwardCmd) || + (cmdAtom == mDeleteWordForwardCmd) || + (cmdAtom == mDeleteWordBackwardCmd) || + (cmdAtom == mDeleteToBeginningOfLineCmd) || + (cmdAtom == mDeleteToEndOfLineCmd) ) { *aResult = PR_TRUE; @@ -274,237 +265,239 @@ NS_IMETHODIMP nsEditorController::DoCommand(const PRUnichar *aCommand) return NS_OK; } + nsCOMPtr cmdAtom = getter_AddRefs(NS_NewAtom(aCommand)); + nsresult rv = NS_ERROR_NO_INTERFACE; - if (PR_TRUE==mUndoString.Equals(aCommand)) + if (cmdAtom == mUndoCmd) { rv = editor->Undo(1); } - else if (PR_TRUE==mRedoString.Equals(aCommand)) + else if (cmdAtom == mRedoCmd) { rv = editor->Redo(1); } - else if (PR_TRUE==mCutString.Equals(aCommand)) + else if (cmdAtom == mCutCmd) { rv = editor->Cut(); } - else if (PR_TRUE==mCopyString.Equals(aCommand)) + else if (cmdAtom == mCopyCmd) { rv = editor->Copy(); } - else if (PR_TRUE==mPasteString.Equals(aCommand)) + else if (cmdAtom == mPasteCmd) { rv = editor->Paste(); } - else if (PR_TRUE==mDeleteString.Equals(aCommand)) + else if (cmdAtom == mDeleteCmd) { rv = editor->DeleteSelection(nsIEditor::eNext); } - else if (PR_TRUE==mSelectAllString.Equals(aCommand)) //SelectALL + else if (cmdAtom == mSelectAllCmd) //SelectALL { rv = editor->SelectAll(); } - else if (PR_TRUE==mDeleteCharForward.Equals(aCommand)) + else if (cmdAtom == mDeleteCharForwardCmd) { rv = editor->DeleteSelection(nsIEditor::eNext); } - else if (PR_TRUE==mDeleteCharBackward.Equals(aCommand)) + else if (cmdAtom == mDeleteCharBackwardCmd) { rv = editor->DeleteSelection(nsIEditor::ePrevious); } - else if (PR_TRUE==mDeleteWordForward.Equals(aCommand)) + else if (cmdAtom == mDeleteWordForwardCmd) { rv = editor->DeleteSelection(nsIEditor::eNextWord); } - else if (PR_TRUE==mDeleteWordBackward.Equals(aCommand)) + else if (cmdAtom == mDeleteWordBackwardCmd) { rv = editor->DeleteSelection(nsIEditor::ePreviousWord); } - else if (PR_TRUE==mDeleteToBeginningOfLine.Equals(aCommand)) + else if (cmdAtom == mDeleteToBeginningOfLineCmd) { rv = editor->DeleteSelection(nsIEditor::eToBeginningOfLine); } - else if (PR_TRUE==mDeleteToEndOfLine.Equals(aCommand)) + else if (cmdAtom == mDeleteToEndOfLineCmd) { rv = editor->DeleteSelection(nsIEditor::eToEndOfLine); } - else if (PR_TRUE==mScrollTopString.Equals(aCommand)) //ScrollTOP + else if (cmdAtom == mScrollTopCmd) //ScrollTOP { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->CompleteScroll(PR_FALSE); } - else if (PR_TRUE==mScrollBottomString.Equals(aCommand)) //ScrollBOTTOM + else if (cmdAtom == mScrollBottomCmd) //ScrollBOTTOM { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->CompleteScroll(PR_TRUE); } - else if (PR_TRUE==mMoveTopString.Equals(aCommand)) //MoveTop + else if (cmdAtom == mMoveTopCmd) //MoveTop { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->CompleteMove(PR_FALSE,PR_FALSE); } - else if (PR_TRUE==mMoveBottomString.Equals(aCommand)) //MoveBottom + else if (cmdAtom == mMoveBottomCmd) //MoveBottom { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->CompleteMove(PR_TRUE,PR_FALSE); } - else if (PR_TRUE==mSelectMoveTopString.Equals(aCommand)) // SelectMoveTop + else if (cmdAtom == mSelectMoveTopCmd) // SelectMoveTop { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->CompleteMove(PR_FALSE,PR_TRUE); } - else if (PR_TRUE==mSelectMoveBottomString.Equals(aCommand)) //SelectMoveBottom + else if (cmdAtom == mSelectMoveBottomCmd) //SelectMoveBottom { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->CompleteMove(PR_TRUE,PR_TRUE); } - else if (PR_TRUE==mLineNextString.Equals(aCommand)) //DOWN + else if (cmdAtom == mLineNextCmd) //DOWN { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->LineMove(PR_TRUE,PR_FALSE); } - else if (PR_TRUE==mLinePreviousString.Equals(aCommand)) //UP + else if (cmdAtom == mLinePreviousCmd) //UP { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->LineMove(PR_FALSE,PR_FALSE); } - else if (PR_TRUE==mSelectLineNextString.Equals(aCommand)) //SelectDown + else if (cmdAtom == mSelectLineNextCmd) //SelectDown { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->LineMove(PR_TRUE,PR_TRUE); } - else if (PR_TRUE==mSelectLinePreviousString.Equals(aCommand)) //SelectUp + else if (cmdAtom == mSelectLinePreviousCmd) //SelectUp { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->LineMove(PR_FALSE,PR_TRUE); } - else if (PR_TRUE==mLeftString.Equals(aCommand)) //LeftChar + else if (cmdAtom == mLeftCmd) //LeftChar { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->CharacterMove(PR_FALSE,PR_FALSE); } - else if (PR_TRUE==mRightString.Equals(aCommand)) //Right char + else if (cmdAtom == mRightCmd) //Right char { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->CharacterMove(PR_TRUE,PR_FALSE); } - else if (PR_TRUE==mSelectLeftString.Equals(aCommand)) //SelectLeftChar + else if (cmdAtom == mSelectLeftCmd) //SelectLeftChar { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->CharacterMove(PR_FALSE,PR_TRUE); } - else if (PR_TRUE==mSelectRightString.Equals(aCommand)) //SelectRightChar + else if (cmdAtom == mSelectRightCmd) //SelectRightChar { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->CharacterMove(PR_TRUE,PR_TRUE); } - else if (PR_TRUE==mBeginLineString.Equals(aCommand)) //BeginLine + else if (cmdAtom == mBeginLineCmd) //BeginLine { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->IntraLineMove(PR_FALSE,PR_FALSE); } - else if (PR_TRUE==mEndLineString.Equals(aCommand)) //EndLine + else if (cmdAtom == mEndLineCmd) //EndLine { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->IntraLineMove(PR_TRUE,PR_FALSE); } - else if (PR_TRUE==mSelectBeginLineString.Equals(aCommand)) //SelectBeginLine + else if (cmdAtom == mSelectBeginLineCmd) //SelectBeginLine { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->IntraLineMove(PR_FALSE,PR_TRUE); } - else if (PR_TRUE==mSelectEndLineString.Equals(aCommand)) //SelectEndLine + else if (cmdAtom == mSelectEndLineCmd) //SelectEndLine { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->IntraLineMove(PR_TRUE,PR_TRUE); } - else if (PR_TRUE==mWordLeftString.Equals(aCommand)) //LeftWord + else if (cmdAtom == mWordLeftCmd) //LeftWord { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->WordMove(PR_FALSE,PR_FALSE); } - else if (PR_TRUE==mWordRightString.Equals(aCommand)) //RightWord + else if (cmdAtom == mWordRightCmd) //RightWord { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->WordMove(PR_TRUE,PR_FALSE); } - else if (PR_TRUE==mSelectWordLeftString.Equals(aCommand)) //SelectLeftWord + else if (cmdAtom == mSelectWordLeftCmd) //SelectLeftWord { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->WordMove(PR_FALSE,PR_TRUE); } - else if (PR_TRUE==mSelectWordRightString.Equals(aCommand)) //SelectRightWord + else if (cmdAtom == mSelectWordRightCmd) //SelectRightWord { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->WordMove(PR_TRUE,PR_TRUE); } - else if (PR_TRUE==mScrollPageUp.Equals(aCommand)) //ScrollPageUp + else if (cmdAtom == mScrollPageUpCmd) //ScrollPageUp { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->ScrollPage(PR_FALSE); } - else if (PR_TRUE==mScrollPageDown.Equals(aCommand)) //ScrollPageDown + else if (cmdAtom == mScrollPageDownCmd) //ScrollPageDown { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->ScrollPage(PR_TRUE); } - else if (PR_TRUE==mScrollLineUp.Equals(aCommand)) //ScrollLineUp + else if (cmdAtom == mScrollLineUpCmd) //ScrollLineUp { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->ScrollLine(PR_FALSE); } - else if (PR_TRUE==mScrollLineDown.Equals(aCommand)) //ScrollLineDown + else if (cmdAtom == mScrollLineDownCmd) //ScrollLineDown { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->ScrollLine(PR_TRUE); } - else if (PR_TRUE==mMovePageUp.Equals(aCommand)) //MovePageUp + else if (cmdAtom == mMovePageUpCmd) //MovePageUp { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->PageMove(PR_FALSE,PR_FALSE); } - else if (PR_TRUE==mMovePageDown.Equals(aCommand)) //MovePageDown + else if (cmdAtom == mMovePageDownCmd) //MovePageDown { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->PageMove(PR_TRUE,PR_FALSE); } - else if (PR_TRUE==mSelectMovePageUp.Equals(aCommand)) //SelectMovePageUp + else if (cmdAtom == mSelectMovePageUpCmd) //SelectMovePageUp { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->PageMove(PR_FALSE,PR_TRUE); } - else if (PR_TRUE==mSelectMovePageDown.Equals(aCommand)) //SelectMovePageDown + else if (cmdAtom == mSelectMovePageDownCmd) //SelectMovePageDown { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) diff --git a/mozilla/editor/base/nsEditorController.h b/mozilla/editor/base/nsEditorController.h index 752471cd9b7..6df1ae03140 100644 --- a/mozilla/editor/base/nsEditorController.h +++ b/mozilla/editor/base/nsEditorController.h @@ -26,7 +26,7 @@ #include "nsIController.h" #include "nsIEditorController.h" -#include "nsString2.h" +#include "nsString.h" #include "nsCOMPtr.h" class nsIHTMLContent; @@ -65,59 +65,61 @@ protected: /** return PR_TRUE if the editor associated with mContent is enabled */ PRBool IsEnabled(); - // XXX: should be static - nsString mUndoString; - nsString mRedoString; - nsString mCutString; - nsString mCopyString; - nsString mPasteString; - nsString mDeleteString; - nsString mSelectAllString; + /* Return true if we have pastable data on the clipboard */ + PRBool DataOnClipboard(); + + nsCOMPtr mUndoCmd; + nsCOMPtr mRedoCmd; + nsCOMPtr mCutCmd; + nsCOMPtr mCopyCmd; + nsCOMPtr mPasteCmd; + nsCOMPtr mDeleteCmd; + nsCOMPtr mSelectAllCmd; - nsString mBeginLineString; - nsString mEndLineString ; - nsString mSelectBeginLineString; - nsString mSelectEndLineString ; + nsCOMPtr mBeginLineCmd; + nsCOMPtr mEndLineCmd; + nsCOMPtr mSelectBeginLineCmd; + nsCOMPtr mSelectEndLineCmd; - nsString mScrollTopString; - nsString mScrollBottomString; + nsCOMPtr mScrollTopCmd; + nsCOMPtr mScrollBottomCmd; - nsString mMoveTopString ; - nsString mMoveBottomString; - nsString mSelectMoveTopString; - nsString mSelectMoveBottomString; + nsCOMPtr mMoveTopCmd; + nsCOMPtr mMoveBottomCmd; + nsCOMPtr mSelectMoveTopCmd; + nsCOMPtr mSelectMoveBottomCmd; - nsString mLineNextString; - nsString mLinePreviousString; - nsString mSelectLineNextString; - nsString mSelectLinePreviousString; + nsCOMPtr mLineNextCmd; + nsCOMPtr mLinePreviousCmd; + nsCOMPtr mSelectLineNextCmd; + nsCOMPtr mSelectLinePreviousCmd; - nsString mLeftString; - nsString mRightString; - nsString mSelectLeftString; - nsString mSelectRightString; + nsCOMPtr mLeftCmd; + nsCOMPtr mRightCmd; + nsCOMPtr mSelectLeftCmd; + nsCOMPtr mSelectRightCmd; - nsString mWordLeftString; - nsString mWordRightString; - nsString mSelectWordLeftString; - nsString mSelectWordRightString; + nsCOMPtr mWordLeftCmd; + nsCOMPtr mWordRightCmd; + nsCOMPtr mSelectWordLeftCmd; + nsCOMPtr mSelectWordRightCmd; - nsString mScrollPageUp; - nsString mScrollPageDown; - nsString mScrollLineUp; - nsString mScrollLineDown; + nsCOMPtr mScrollPageUpCmd; + nsCOMPtr mScrollPageDownCmd; + nsCOMPtr mScrollLineUpCmd; + nsCOMPtr mScrollLineDownCmd; - nsString mMovePageUp; - nsString mMovePageDown; - nsString mSelectMovePageUp; - nsString mSelectMovePageDown; + nsCOMPtr mMovePageUpCmd; + nsCOMPtr mMovePageDownCmd; + nsCOMPtr mSelectMovePageUpCmd; + nsCOMPtr mSelectMovePageDownCmd; - nsString mDeleteCharBackward; - nsString mDeleteCharForward; - nsString mDeleteWordBackward; - nsString mDeleteWordForward; - nsString mDeleteToBeginningOfLine; - nsString mDeleteToEndOfLine; + nsCOMPtr mDeleteCharBackwardCmd; + nsCOMPtr mDeleteCharForwardCmd; + nsCOMPtr mDeleteWordBackwardCmd; + nsCOMPtr mDeleteWordForwardCmd; + nsCOMPtr mDeleteToBeginningOfLineCmd; + nsCOMPtr mDeleteToEndOfLineCmd; protected: nsIHTMLContent* mContent; // weak reference, the content object owns this object diff --git a/mozilla/editor/base/nsEditorShell.cpp b/mozilla/editor/base/nsEditorShell.cpp index c01531ff605..ffb30f5dc12 100644 --- a/mozilla/editor/base/nsEditorShell.cpp +++ b/mozilla/editor/base/nsEditorShell.cpp @@ -317,10 +317,27 @@ nsEditorShell::PrepareDocumentForEditing(nsIURI *aUrl) if (NS_FAILED(rv)) return rv; // make the UI state maintainer - mStateMaintainer = new nsInterfaceState; + NS_NEWXPCOM(mStateMaintainer, nsInterfaceState); if (!mStateMaintainer) return NS_ERROR_OUT_OF_MEMORY; mStateMaintainer->AddRef(); // the owning reference - rv = mStateMaintainer->Init(mEditor, mWebShell); + + // get the XULDoc from the webshell + nsCOMPtr cv; + rv = mWebShell->GetContentViewer(getter_AddRefs(cv)); + if (NS_FAILED(rv)) return rv; + + nsCOMPtr docViewer = do_QueryInterface(cv, &rv); + if (NS_FAILED(rv)) return rv; + + nsCOMPtr chromeDoc; + rv = docViewer->GetDocument(*getter_AddRefs(chromeDoc)); + if (NS_FAILED(rv)) return rv; + + nsCOMPtr xulDoc = do_QueryInterface(chromeDoc, &rv); + if (NS_FAILED(rv)) return rv; + + // now init the state maintainer + rv = mStateMaintainer->Init(mEditor, xulDoc); if (NS_FAILED(rv)) return rv; // set it up as a selection listener @@ -337,7 +354,6 @@ nsEditorShell::PrepareDocumentForEditing(nsIURI *aUrl) rv = editor->AddDocumentStateListener(mStateMaintainer); if (NS_FAILED(rv)) return rv; - if (NS_SUCCEEDED(rv) && mContentWindow) { nsCOMPtr controller; diff --git a/mozilla/editor/base/nsHTMLEditor.cpp b/mozilla/editor/base/nsHTMLEditor.cpp index 68d34492818..55620f48ca2 100644 --- a/mozilla/editor/base/nsHTMLEditor.cpp +++ b/mozilla/editor/base/nsHTMLEditor.cpp @@ -610,6 +610,17 @@ void nsHTMLEditor::InitRules() mRules->Init(this, mFlags); } + +PRBool nsHTMLEditor::IsModifiable() +{ + PRUint32 flags; + if (NS_SUCCEEDED(GetFlags(&flags))) + return ((flags & eEditorReadonlyMask) == 0); + else + return PR_FALSE; +} + + #ifdef XP_MAC #pragma mark - #pragma mark --- nsIHTMLEditor methods --- @@ -3525,10 +3536,7 @@ nsHTMLEditor::Redo(PRUint32 aCount) NS_IMETHODIMP nsHTMLEditor::Cut() { nsCOMPtr selection; - if (!mPresShellWeak) return NS_ERROR_NOT_INITIALIZED; - nsCOMPtr ps = do_QueryReferent(mPresShellWeak); - if (!ps) return NS_ERROR_NOT_INITIALIZED; - nsresult res = ps->GetSelection(SELECTION_NORMAL, getter_AddRefs(selection)); + nsresult res = GetSelection(getter_AddRefs(selection)); if (!NS_SUCCEEDED(res)) return res; @@ -3542,6 +3550,22 @@ NS_IMETHODIMP nsHTMLEditor::Cut() return res; } +NS_IMETHODIMP nsHTMLEditor::CanCut(PRBool &aCanCut) +{ + aCanCut = PR_FALSE; + + nsCOMPtr selection; + nsresult res = GetSelection(getter_AddRefs(selection)); + if (NS_FAILED(res)) return res; + + PRBool isCollapsed; + res = selection->GetIsCollapsed(&isCollapsed); + if (NS_FAILED(res)) return res; + + aCanCut = !isCollapsed && IsModifiable(); + return NS_OK; +} + NS_IMETHODIMP nsHTMLEditor::Copy() { //printf("nsEditor::Copy\n"); @@ -3552,6 +3576,22 @@ NS_IMETHODIMP nsHTMLEditor::Copy() return ps->DoCopy(); } +NS_IMETHODIMP nsHTMLEditor::CanCopy(PRBool &aCanCopy) +{ + aCanCopy = PR_FALSE; + + nsCOMPtr selection; + nsresult res = GetSelection(getter_AddRefs(selection)); + if (NS_FAILED(res)) return res; + + PRBool isCollapsed; + res = selection->GetIsCollapsed(&isCollapsed); + if (NS_FAILED(res)) return res; + + aCanCopy = !isCollapsed; + return NS_OK; +} + NS_IMETHODIMP nsHTMLEditor::Paste() { ForceCompositionEnd(); @@ -3648,6 +3688,66 @@ NS_IMETHODIMP nsHTMLEditor::Paste() return rv; } + +NS_IMETHODIMP nsHTMLEditor::CanPaste(PRBool &aCanPaste) +{ + aCanPaste = PR_FALSE; + + nsresult rv; + NS_WITH_SERVICE(nsIClipboard, clipboard, kCClipboardCID, &rv); + if (NS_FAILED(rv)) return rv; + + // the flavors that we can deal with + char* textEditorFlavors[] = { kTextMime, kUnicodeMime, nsnull }; + char* htmlEditorFlavors[] = { kJPEGImageMime, kHTMLMime, nsnull }; + + nsCOMPtr flavorsList; + rv = nsComponentManager::CreateInstance(NS_SUPPORTSARRAY_PROGID, nsnull, + NS_GET_IID(nsISupportsArray), getter_AddRefs(flavorsList)); + if (NS_FAILED(rv)) return rv; + + PRUint32 editorFlags; + GetFlags(&editorFlags); + + // add the flavors for all editors + for (char** flavor = textEditorFlavors; *flavor; flavor++) + { + nsCOMPtr flavorString; + nsComponentManager::CreateInstance(NS_SUPPORTS_STRING_PROGID, nsnull, + NS_GET_IID(nsISupportsString), getter_AddRefs(flavorString)); + if (flavorString) + { + flavorString->SetData(*flavor); + flavorsList->AppendElement(flavorString); + } + } + + // add the HTML-editor only flavors + if ((editorFlags & eEditorPlaintextMask) == 0) + { + + for (char** flavor = htmlEditorFlavors; *flavor; flavor++) + { + nsCOMPtr flavorString; + nsComponentManager::CreateInstance(NS_SUPPORTS_STRING_PROGID, nsnull, + NS_GET_IID(nsISupportsString), getter_AddRefs(flavorString)); + if (flavorString) + { + flavorString->SetData(*flavor); + flavorsList->AppendElement(flavorString); + } + } + } + + PRBool haveFlavors; + rv = clipboard->HasDataMatchingFlavors(flavorsList, &haveFlavors); + if (NS_FAILED(rv)) return rv; + + aCanPaste = haveFlavors; + return NS_OK; +} + + // // HTML PasteAsQuotation: Paste in a blockquote type=cite // diff --git a/mozilla/editor/base/nsHTMLEditor.h b/mozilla/editor/base/nsHTMLEditor.h index 551df50ae99..56166562dfa 100644 --- a/mozilla/editor/base/nsHTMLEditor.h +++ b/mozilla/editor/base/nsHTMLEditor.h @@ -231,8 +231,11 @@ public: NS_IMETHOD Redo(PRUint32 aCount); NS_IMETHOD Cut(); + NS_IMETHOD CanCut(PRBool &aCanCut); NS_IMETHOD Copy(); + NS_IMETHOD CanCopy(PRBool &aCanCopy); NS_IMETHOD Paste(); + NS_IMETHOD CanPaste(PRBool &aCanPaste); NS_IMETHOD OutputToString(nsString& aOutputString, const nsString& aFormatType, @@ -520,6 +523,9 @@ protected: /** simple utility to handle any error with event listener allocation or registration */ void HandleEventListenerError(); + /* small utility routine to test the eEditorReadonly bit */ + PRBool IsModifiable(); + // Data members protected: diff --git a/mozilla/editor/base/nsInterfaceState.cpp b/mozilla/editor/base/nsInterfaceState.cpp index 309a00c043f..8bd74b2fbd7 100644 --- a/mozilla/editor/base/nsInterfaceState.cpp +++ b/mozilla/editor/base/nsInterfaceState.cpp @@ -35,6 +35,7 @@ #include "nsIDOMElement.h" #include "nsIDOMSelection.h" #include "nsIDOMAttr.h" +#include "nsIDOMXULCommandDispatcher.h" #include "nsIEditor.h" #include "nsIHTMLEditor.h" @@ -45,11 +46,12 @@ nsInterfaceState::nsInterfaceState() : mEditor(nsnull) -, mWebShell(nsnull) +, mChromeDoc(nsnull) , mBoldState(eStateUninitialized) , mItalicState(eStateUninitialized) , mUnderlineState(eStateUninitialized) , mDirtyState(eStateUninitialized) +, mSelectionCollapsed(eStateUninitialized) { NS_INIT_REFCNT(); } @@ -94,16 +96,16 @@ nsInterfaceState::QueryInterface(const nsIID& aIID, void** aInstancePtr) } NS_IMETHODIMP -nsInterfaceState::Init(nsIHTMLEditor* aEditor, nsIWebShell *aChromeWebShell) +nsInterfaceState::Init(nsIHTMLEditor* aEditor, nsIDOMXULDocument *aChromeDoc) { if (!aEditor) return NS_ERROR_INVALID_ARG; - if (!aChromeWebShell) + if (!aChromeDoc) return NS_ERROR_INVALID_ARG; mEditor = aEditor; // no addreffing here - mWebShell = aChromeWebShell; + mChromeDoc = aChromeDoc; return NS_OK; } @@ -130,6 +132,23 @@ nsInterfaceState::NotifyDocumentStateChanged(PRBool aNowDirty) NS_IMETHODIMP nsInterfaceState::NotifySelectionChanged() { + // if the selection state has changed, update stuff + PRBool isCollapsed = SelectionIsCollapsed(); + if (isCollapsed != mSelectionCollapsed) + { + mSelectionCollapsed = isCollapsed; + + // force command updating to happen. Slow, we'll speed it up later + // we could do this in JS, but we can't be a selection listener there + nsCOMPtr dispatcher; + nsresult rv = mChromeDoc->GetCommandDispatcher(getter_AddRefs(dispatcher)); + if (NS_FAILED(rv)) return rv; + if (!dispatcher) return NS_ERROR_UNEXPECTED; + + rv = dispatcher->UpdateCommands(nsAutoString("selection-change")); + if (NS_FAILED(rv)) return rv; + } + return ForceUpdate(); } @@ -150,7 +169,6 @@ nsInterfaceState::ForceUpdate() // update the paragraph format popup rv = UpdateParagraphState("Editor:Paragraph:Format", "format", mParagraphFormat); - // udpate the font face rv = UpdateFontFace("Editor:Font:Face", "font", mFontString); @@ -365,25 +383,11 @@ nsInterfaceState::SetNodeAttribute(const char* nodeID, const char* attributeName { nsresult rv = NS_OK; - if (!mWebShell) + if (!mChromeDoc) return NS_ERROR_NOT_INITIALIZED; - nsCOMPtr cv; - rv = mWebShell->GetContentViewer(getter_AddRefs(cv)); - if (NS_FAILED(rv)) return rv; - - nsCOMPtr docViewer = do_QueryInterface(cv, &rv); - if (NS_FAILED(rv)) return rv; - - nsCOMPtr chromeDoc; - rv = docViewer->GetDocument(*getter_AddRefs(chromeDoc)); - if (NS_FAILED(rv)) return rv; - - nsCOMPtr xulDoc = do_QueryInterface(chromeDoc, &rv); - if (NS_FAILED(rv)) return rv; - nsCOMPtr elem; - rv = xulDoc->GetElementById( nodeID, getter_AddRefs(elem) ); + rv = mChromeDoc->GetElementById( nodeID, getter_AddRefs(elem) ); if (NS_FAILED(rv) || !elem) return rv; return elem->SetAttribute(attributeName, newValue); @@ -395,39 +399,25 @@ nsInterfaceState::UnsetNodeAttribute(const char* nodeID, const char* attributeNa { nsresult rv = NS_OK; - if (!mWebShell) + if (!mChromeDoc) return NS_ERROR_NOT_INITIALIZED; - nsCOMPtr cv; - rv = mWebShell->GetContentViewer(getter_AddRefs(cv)); - if (NS_FAILED(rv)) return rv; - - nsCOMPtr docViewer = do_QueryInterface(cv, &rv); - if (NS_FAILED(rv)) return rv; - - nsCOMPtr chromeDoc; - rv = docViewer->GetDocument(*getter_AddRefs(chromeDoc)); - if (NS_FAILED(rv)) return rv; - - nsCOMPtr xulDoc = do_QueryInterface(chromeDoc, &rv); - if (NS_FAILED(rv)) return rv; - nsCOMPtr elem; - rv = xulDoc->GetElementById( nodeID, getter_AddRefs(elem) ); + rv = mChromeDoc->GetElementById( nodeID, getter_AddRefs(elem) ); if (NS_FAILED(rv) || !elem) return rv; return elem->RemoveAttribute(attributeName); } -nsresult NS_NewInterfaceState(nsIHTMLEditor* aEditor, nsIWebShell* aWebShell, nsIDOMSelectionListener** aInstancePtrResult) +nsresult NS_NewInterfaceState(nsIHTMLEditor* aEditor, nsIDOMXULDocument* aChromeDoc, nsIDOMSelectionListener** aInstancePtrResult) { nsInterfaceState* newThang = new nsInterfaceState; if (!newThang) return NS_ERROR_OUT_OF_MEMORY; *aInstancePtrResult = nsnull; - nsresult rv = newThang->Init(aEditor, aWebShell); + nsresult rv = newThang->Init(aEditor, aChromeDoc); if (NS_FAILED(rv)) { delete newThang; diff --git a/mozilla/editor/base/nsInterfaceState.h b/mozilla/editor/base/nsInterfaceState.h index 766c66e81ef..409f29b0b0c 100644 --- a/mozilla/editor/base/nsInterfaceState.h +++ b/mozilla/editor/base/nsInterfaceState.h @@ -30,6 +30,7 @@ #include "nsIWebShell.h" class nsIHTMLEditor; +class nsIDOMXULDocument; // class responsible for communicating changes in local state back to the UI. // This is currently somewhat tied to a given XUL UI implementation @@ -44,7 +45,7 @@ public: NS_DECL_ISUPPORTS - NS_IMETHOD Init(nsIHTMLEditor* aEditor, nsIWebShell *aChromeWebShell); + NS_IMETHOD Init(nsIHTMLEditor* aEditor, nsIDOMXULDocument *aChromeDoc); // force an update of the UI. At some point, we could pass flags // here to target certain things for updating. @@ -77,8 +78,8 @@ 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 - nsIWebShell* mWebShell; // web shell for the chrome area + nsIHTMLEditor* mEditor; // the HTML editor + nsIDOMXULDocument* mChromeDoc; // XUL document for the chrome area // current state PRInt8 mBoldState; @@ -87,12 +88,15 @@ protected: PRInt8 mDirtyState; + PRInt8 mSelectionCollapsed; + + nsString mParagraphFormat; nsString mFontString; nsString mListTag; // contains "" for none, "ol" or "ul" }; -extern "C" nsresult NS_NewInterfaceState(nsIHTMLEditor* aEditor, nsIWebShell* aWebShell, nsIDOMSelectionListener** aInstancePtrResult); +extern "C" nsresult NS_NewInterfaceState(nsIHTMLEditor* aEditor, nsIDOMXULDocument* aChromeDoc, nsIDOMSelectionListener** aInstancePtrResult); #endif // nsInterfaceState_h__ diff --git a/mozilla/editor/composer/src/nsEditorShell.cpp b/mozilla/editor/composer/src/nsEditorShell.cpp index c01531ff605..ffb30f5dc12 100644 --- a/mozilla/editor/composer/src/nsEditorShell.cpp +++ b/mozilla/editor/composer/src/nsEditorShell.cpp @@ -317,10 +317,27 @@ nsEditorShell::PrepareDocumentForEditing(nsIURI *aUrl) if (NS_FAILED(rv)) return rv; // make the UI state maintainer - mStateMaintainer = new nsInterfaceState; + NS_NEWXPCOM(mStateMaintainer, nsInterfaceState); if (!mStateMaintainer) return NS_ERROR_OUT_OF_MEMORY; mStateMaintainer->AddRef(); // the owning reference - rv = mStateMaintainer->Init(mEditor, mWebShell); + + // get the XULDoc from the webshell + nsCOMPtr cv; + rv = mWebShell->GetContentViewer(getter_AddRefs(cv)); + if (NS_FAILED(rv)) return rv; + + nsCOMPtr docViewer = do_QueryInterface(cv, &rv); + if (NS_FAILED(rv)) return rv; + + nsCOMPtr chromeDoc; + rv = docViewer->GetDocument(*getter_AddRefs(chromeDoc)); + if (NS_FAILED(rv)) return rv; + + nsCOMPtr xulDoc = do_QueryInterface(chromeDoc, &rv); + if (NS_FAILED(rv)) return rv; + + // now init the state maintainer + rv = mStateMaintainer->Init(mEditor, xulDoc); if (NS_FAILED(rv)) return rv; // set it up as a selection listener @@ -337,7 +354,6 @@ nsEditorShell::PrepareDocumentForEditing(nsIURI *aUrl) rv = editor->AddDocumentStateListener(mStateMaintainer); if (NS_FAILED(rv)) return rv; - if (NS_SUCCEEDED(rv) && mContentWindow) { nsCOMPtr controller; diff --git a/mozilla/editor/composer/src/nsInterfaceState.cpp b/mozilla/editor/composer/src/nsInterfaceState.cpp index 309a00c043f..8bd74b2fbd7 100644 --- a/mozilla/editor/composer/src/nsInterfaceState.cpp +++ b/mozilla/editor/composer/src/nsInterfaceState.cpp @@ -35,6 +35,7 @@ #include "nsIDOMElement.h" #include "nsIDOMSelection.h" #include "nsIDOMAttr.h" +#include "nsIDOMXULCommandDispatcher.h" #include "nsIEditor.h" #include "nsIHTMLEditor.h" @@ -45,11 +46,12 @@ nsInterfaceState::nsInterfaceState() : mEditor(nsnull) -, mWebShell(nsnull) +, mChromeDoc(nsnull) , mBoldState(eStateUninitialized) , mItalicState(eStateUninitialized) , mUnderlineState(eStateUninitialized) , mDirtyState(eStateUninitialized) +, mSelectionCollapsed(eStateUninitialized) { NS_INIT_REFCNT(); } @@ -94,16 +96,16 @@ nsInterfaceState::QueryInterface(const nsIID& aIID, void** aInstancePtr) } NS_IMETHODIMP -nsInterfaceState::Init(nsIHTMLEditor* aEditor, nsIWebShell *aChromeWebShell) +nsInterfaceState::Init(nsIHTMLEditor* aEditor, nsIDOMXULDocument *aChromeDoc) { if (!aEditor) return NS_ERROR_INVALID_ARG; - if (!aChromeWebShell) + if (!aChromeDoc) return NS_ERROR_INVALID_ARG; mEditor = aEditor; // no addreffing here - mWebShell = aChromeWebShell; + mChromeDoc = aChromeDoc; return NS_OK; } @@ -130,6 +132,23 @@ nsInterfaceState::NotifyDocumentStateChanged(PRBool aNowDirty) NS_IMETHODIMP nsInterfaceState::NotifySelectionChanged() { + // if the selection state has changed, update stuff + PRBool isCollapsed = SelectionIsCollapsed(); + if (isCollapsed != mSelectionCollapsed) + { + mSelectionCollapsed = isCollapsed; + + // force command updating to happen. Slow, we'll speed it up later + // we could do this in JS, but we can't be a selection listener there + nsCOMPtr dispatcher; + nsresult rv = mChromeDoc->GetCommandDispatcher(getter_AddRefs(dispatcher)); + if (NS_FAILED(rv)) return rv; + if (!dispatcher) return NS_ERROR_UNEXPECTED; + + rv = dispatcher->UpdateCommands(nsAutoString("selection-change")); + if (NS_FAILED(rv)) return rv; + } + return ForceUpdate(); } @@ -150,7 +169,6 @@ nsInterfaceState::ForceUpdate() // update the paragraph format popup rv = UpdateParagraphState("Editor:Paragraph:Format", "format", mParagraphFormat); - // udpate the font face rv = UpdateFontFace("Editor:Font:Face", "font", mFontString); @@ -365,25 +383,11 @@ nsInterfaceState::SetNodeAttribute(const char* nodeID, const char* attributeName { nsresult rv = NS_OK; - if (!mWebShell) + if (!mChromeDoc) return NS_ERROR_NOT_INITIALIZED; - nsCOMPtr cv; - rv = mWebShell->GetContentViewer(getter_AddRefs(cv)); - if (NS_FAILED(rv)) return rv; - - nsCOMPtr docViewer = do_QueryInterface(cv, &rv); - if (NS_FAILED(rv)) return rv; - - nsCOMPtr chromeDoc; - rv = docViewer->GetDocument(*getter_AddRefs(chromeDoc)); - if (NS_FAILED(rv)) return rv; - - nsCOMPtr xulDoc = do_QueryInterface(chromeDoc, &rv); - if (NS_FAILED(rv)) return rv; - nsCOMPtr elem; - rv = xulDoc->GetElementById( nodeID, getter_AddRefs(elem) ); + rv = mChromeDoc->GetElementById( nodeID, getter_AddRefs(elem) ); if (NS_FAILED(rv) || !elem) return rv; return elem->SetAttribute(attributeName, newValue); @@ -395,39 +399,25 @@ nsInterfaceState::UnsetNodeAttribute(const char* nodeID, const char* attributeNa { nsresult rv = NS_OK; - if (!mWebShell) + if (!mChromeDoc) return NS_ERROR_NOT_INITIALIZED; - nsCOMPtr cv; - rv = mWebShell->GetContentViewer(getter_AddRefs(cv)); - if (NS_FAILED(rv)) return rv; - - nsCOMPtr docViewer = do_QueryInterface(cv, &rv); - if (NS_FAILED(rv)) return rv; - - nsCOMPtr chromeDoc; - rv = docViewer->GetDocument(*getter_AddRefs(chromeDoc)); - if (NS_FAILED(rv)) return rv; - - nsCOMPtr xulDoc = do_QueryInterface(chromeDoc, &rv); - if (NS_FAILED(rv)) return rv; - nsCOMPtr elem; - rv = xulDoc->GetElementById( nodeID, getter_AddRefs(elem) ); + rv = mChromeDoc->GetElementById( nodeID, getter_AddRefs(elem) ); if (NS_FAILED(rv) || !elem) return rv; return elem->RemoveAttribute(attributeName); } -nsresult NS_NewInterfaceState(nsIHTMLEditor* aEditor, nsIWebShell* aWebShell, nsIDOMSelectionListener** aInstancePtrResult) +nsresult NS_NewInterfaceState(nsIHTMLEditor* aEditor, nsIDOMXULDocument* aChromeDoc, nsIDOMSelectionListener** aInstancePtrResult) { nsInterfaceState* newThang = new nsInterfaceState; if (!newThang) return NS_ERROR_OUT_OF_MEMORY; *aInstancePtrResult = nsnull; - nsresult rv = newThang->Init(aEditor, aWebShell); + nsresult rv = newThang->Init(aEditor, aChromeDoc); if (NS_FAILED(rv)) { delete newThang; diff --git a/mozilla/editor/composer/src/nsInterfaceState.h b/mozilla/editor/composer/src/nsInterfaceState.h index 766c66e81ef..409f29b0b0c 100644 --- a/mozilla/editor/composer/src/nsInterfaceState.h +++ b/mozilla/editor/composer/src/nsInterfaceState.h @@ -30,6 +30,7 @@ #include "nsIWebShell.h" class nsIHTMLEditor; +class nsIDOMXULDocument; // class responsible for communicating changes in local state back to the UI. // This is currently somewhat tied to a given XUL UI implementation @@ -44,7 +45,7 @@ public: NS_DECL_ISUPPORTS - NS_IMETHOD Init(nsIHTMLEditor* aEditor, nsIWebShell *aChromeWebShell); + NS_IMETHOD Init(nsIHTMLEditor* aEditor, nsIDOMXULDocument *aChromeDoc); // force an update of the UI. At some point, we could pass flags // here to target certain things for updating. @@ -77,8 +78,8 @@ 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 - nsIWebShell* mWebShell; // web shell for the chrome area + nsIHTMLEditor* mEditor; // the HTML editor + nsIDOMXULDocument* mChromeDoc; // XUL document for the chrome area // current state PRInt8 mBoldState; @@ -87,12 +88,15 @@ protected: PRInt8 mDirtyState; + PRInt8 mSelectionCollapsed; + + nsString mParagraphFormat; nsString mFontString; nsString mListTag; // contains "" for none, "ol" or "ul" }; -extern "C" nsresult NS_NewInterfaceState(nsIHTMLEditor* aEditor, nsIWebShell* aWebShell, nsIDOMSelectionListener** aInstancePtrResult); +extern "C" nsresult NS_NewInterfaceState(nsIHTMLEditor* aEditor, nsIDOMXULDocument* aChromeDoc, nsIDOMSelectionListener** aInstancePtrResult); #endif // nsInterfaceState_h__ diff --git a/mozilla/editor/libeditor/base/nsEditor.cpp b/mozilla/editor/libeditor/base/nsEditor.cpp index a85609af03b..419cd7f545c 100644 --- a/mozilla/editor/libeditor/base/nsEditor.cpp +++ b/mozilla/editor/libeditor/base/nsEditor.cpp @@ -1480,7 +1480,7 @@ nsEditor::SetCompositionString(const nsString& aCompositionString, nsIPrivateTex return NS_ERROR_NOT_IMPLEMENTED; } -nsIWidget * GetDeepestWidget(nsIView * aView) +static nsIWidget* GetDeepestWidget(nsIView * aView) { PRInt32 count; diff --git a/mozilla/editor/libeditor/base/nsEditor.h b/mozilla/editor/libeditor/base/nsEditor.h index fde82734a71..433b7c288ad 100644 --- a/mozilla/editor/libeditor/base/nsEditor.h +++ b/mozilla/editor/libeditor/base/nsEditor.h @@ -156,8 +156,11 @@ public: // these are pure virtual in this base class NS_IMETHOD Cut() = 0; + NS_IMETHOD CanCut(PRBool &aCanCut)=0; NS_IMETHOD Copy() = 0; + NS_IMETHOD CanCopy(PRBool &aCanCopy)=0; NS_IMETHOD Paste() = 0; + NS_IMETHOD CanPaste(PRBool &aCanPaste)=0; NS_IMETHOD SelectAll(); diff --git a/mozilla/editor/libeditor/base/nsEditorController.cpp b/mozilla/editor/libeditor/base/nsEditorController.cpp index 8d747862416..d78641078d5 100644 --- a/mozilla/editor/libeditor/base/nsEditorController.cpp +++ b/mozilla/editor/libeditor/base/nsEditorController.cpp @@ -26,14 +26,13 @@ #include "nsIEditor.h" #include "nsIFormControlFrame.h" #include "nsIDOMSelection.h" +#include "nsIHTMLEditor.h" +#include "nsISupportsPrimitives.h" #include "nsISelectionController.h" #include "nsIDocument.h" #include "nsIPresShell.h" -//USED FOR DEPRICATED CALL... -//#include "nsGenericHTMLElement.h" - NS_IMPL_ADDREF(nsEditorController) NS_IMPL_RELEASE(nsEditorController) @@ -48,60 +47,60 @@ nsEditorController::nsEditorController() NS_INIT_REFCNT(); mContent = nsnull; mEditor = nsnull; - mUndoString = "cmd_undo"; - mRedoString = "cmd_redo"; - mCutString = "cmd_cut"; - mCopyString = "cmd_copy"; - mPasteString = "cmd_paste"; + + mUndoCmd = getter_AddRefs(NS_NewAtom("cmd_undo")); + mRedoCmd = getter_AddRefs(NS_NewAtom("cmd_redo")); + mCutCmd = getter_AddRefs(NS_NewAtom("cmd_cut")); + mCopyCmd = getter_AddRefs(NS_NewAtom("cmd_copy")); + mPasteCmd = getter_AddRefs(NS_NewAtom("cmd_paste")); + mDeleteCmd = getter_AddRefs(NS_NewAtom("cmd_delete")); + mSelectAllCmd = getter_AddRefs(NS_NewAtom("cmd_selectAll")); - mDeleteString = "cmd_delete"; - mSelectAllString = "cmd_selectAll"; - mBeginLineString = "cmd_beginLine"; - mEndLineString = "cmd_endLine"; - mSelectBeginLineString = "cmd_selectBeginLine"; - mSelectEndLineString = "cmd_selectEndLine"; + mBeginLineCmd = getter_AddRefs(NS_NewAtom("cmd_beginLine")); + mEndLineCmd = getter_AddRefs(NS_NewAtom("cmd_endLine")); + mSelectBeginLineCmd = getter_AddRefs(NS_NewAtom("cmd_selectBeginLine")); + mSelectEndLineCmd = getter_AddRefs(NS_NewAtom("cmd_selectEndLine")); - mScrollTopString = "cmd_scrollTop"; - mScrollBottomString = "cmd_scrollBottom"; + mScrollTopCmd = getter_AddRefs(NS_NewAtom("cmd_scrollTop")); + mScrollBottomCmd = getter_AddRefs(NS_NewAtom("cmd_scrollBottom")); - mMoveTopString = "cmd_moveTop"; - mMoveBottomString= "cmd_moveBottom"; - mSelectMoveTopString = "cmd_selectTop"; - mSelectMoveBottomString= "cmd_selectBottom"; + mMoveTopCmd = getter_AddRefs(NS_NewAtom("cmd_moveTop")); + mMoveBottomCmd = getter_AddRefs(NS_NewAtom("cmd_moveBottom")); + mSelectMoveTopCmd = getter_AddRefs(NS_NewAtom("cmd_selectTop")); + mSelectMoveBottomCmd = getter_AddRefs(NS_NewAtom("cmd_selectBottom")); - mLineNextString = "cmd_lineNext"; - mLinePreviousString = "cmd_linePrevious"; - mSelectLineNextString = "cmd_selectLineNext"; - mSelectLinePreviousString = "cmd_selectLinePrevious"; + mLineNextCmd = getter_AddRefs(NS_NewAtom("cmd_lineNext")); + mLinePreviousCmd = getter_AddRefs(NS_NewAtom("cmd_linePrevious")); + mSelectLineNextCmd = getter_AddRefs(NS_NewAtom("cmd_selectLineNext")); + mSelectLinePreviousCmd = getter_AddRefs(NS_NewAtom("cmd_selectLinePrevious")); - mLeftString = "cmd_charPrevious"; - mRightString = "cmd_charNext"; - mSelectLeftString = "cmd_selectCharPrevious"; - mSelectRightString= "cmd_selectCharNext"; + mLeftCmd = getter_AddRefs(NS_NewAtom("cmd_charPrevious")); + mRightCmd = getter_AddRefs(NS_NewAtom("cmd_charNext")); + mSelectLeftCmd = getter_AddRefs(NS_NewAtom("cmd_selectCharPrevious")); + mSelectRightCmd = getter_AddRefs(NS_NewAtom("cmd_selectCharNext")); + mWordLeftCmd = getter_AddRefs(NS_NewAtom("cmd_wordPrevious")); + mWordRightCmd = getter_AddRefs(NS_NewAtom("cmd_wordNext")); + mSelectWordLeftCmd = getter_AddRefs(NS_NewAtom("cmd_selectWordPrevious")); + mSelectWordRightCmd = getter_AddRefs(NS_NewAtom("cmd_selectWordNext")); - mWordLeftString = "cmd_wordPrevious"; - mWordRightString = "cmd_wordNext"; - mSelectWordLeftString = "cmd_selectWordPrevious"; - mSelectWordRightString= "cmd_selectWordNext"; + mScrollPageUpCmd = getter_AddRefs(NS_NewAtom("cmd_scrollPageUp")); + mScrollPageDownCmd = getter_AddRefs(NS_NewAtom("cmd_scrollPageDown")); + mScrollLineUpCmd = getter_AddRefs(NS_NewAtom("cmd_scrollLineUp")); + mScrollLineDownCmd = getter_AddRefs(NS_NewAtom("cmd_scrollLineDown")); - mScrollPageUp = "cmd_scrollPageUp"; - mScrollPageDown = "cmd_scrollPageDown"; - mScrollLineUp = "cmd_scrollLineUp"; - mScrollLineDown = "cmd_scrollLineDown"; + mMovePageUpCmd = getter_AddRefs(NS_NewAtom("cmd_scrollPageUp")); + mMovePageDownCmd = getter_AddRefs(NS_NewAtom("cmd_scrollPageDown")); + mSelectMovePageUpCmd = getter_AddRefs(NS_NewAtom("cmd_selectPageUp")); + mSelectMovePageDownCmd = getter_AddRefs(NS_NewAtom("cmd_selectPageDown")); - mMovePageUp = "cmd_scrollPageUp"; - mMovePageDown = "cmd_scrollPageDown"; - mSelectMovePageUp = "cmd_selectPageUp"; - mSelectMovePageDown = "cmd_selectPageDown"; + mDeleteCharBackwardCmd = getter_AddRefs(NS_NewAtom("cmd_deleteCharBackward")); + mDeleteCharForwardCmd = getter_AddRefs(NS_NewAtom("cmd_deleteCharForward")); + mDeleteWordBackwardCmd = getter_AddRefs(NS_NewAtom("cmd_deleteWordBackward")); + mDeleteWordForwardCmd = getter_AddRefs(NS_NewAtom("cmd_deleteWordForward")); - mDeleteCharBackward = "cmd_deleteCharBackward"; - mDeleteCharForward = "cmd_deleteCharForward"; - mDeleteWordBackward = "cmd_deleteWordBackward"; - mDeleteWordForward = "cmd_deleteWordForward"; - - mDeleteToBeginningOfLine = "cmd_deleteToBeginningOfLine"; - mDeleteToEndOfLine = "cmd_deleteToEndOfLine"; + mDeleteToBeginningOfLineCmd = getter_AddRefs(NS_NewAtom("cmd_deleteToBeginningOfLine")); + mDeleteToEndOfLineCmd = getter_AddRefs(NS_NewAtom("cmd_deleteToEndOfLine")); } nsEditorController::~nsEditorController() @@ -134,11 +133,13 @@ NS_IMETHODIMP nsEditorController::IsCommandEnabled(const PRUnichar *aCommand, PR *aResult = PR_FALSE; + nsCOMPtr cmdAtom = getter_AddRefs(NS_NewAtom(aCommand)); + nsCOMPtr editor; NS_ENSURE_SUCCESS(GetEditor(getter_AddRefs(editor)), NS_ERROR_FAILURE); // a null editor is a legal state - if (PR_TRUE==mUndoString.Equals(aCommand)) + if (cmdAtom == mUndoCmd) { // we can undo if the editor says we can undo if (editor) { @@ -146,7 +147,7 @@ NS_IMETHODIMP nsEditorController::IsCommandEnabled(const PRUnichar *aCommand, PR NS_ENSURE_SUCCESS(editor->CanUndo(isEnabled, *aResult), NS_ERROR_FAILURE); } } - else if (PR_TRUE==mRedoString.Equals(aCommand)) + else if (cmdAtom == mRedoCmd) { // we can redo if the editor says we can undo if (editor) { @@ -154,48 +155,35 @@ NS_IMETHODIMP nsEditorController::IsCommandEnabled(const PRUnichar *aCommand, PR NS_ENSURE_SUCCESS(editor->CanRedo(isEnabled, *aResult), NS_ERROR_FAILURE); } } - else if (PR_TRUE==mCutString.Equals(aCommand)) + else if (cmdAtom == mCutCmd) { // we can cut if the editor has a non-collapsed selection and is not readonly if (editor) { - nsCOMPtr selection; - NS_ENSURE_SUCCESS(editor->GetSelection(getter_AddRefs(selection)), NS_ERROR_FAILURE); - if (selection) - { - PRBool collapsed; - NS_ENSURE_SUCCESS(selection->GetIsCollapsed(&collapsed), NS_ERROR_FAILURE); - if ((PR_FALSE==collapsed) && (PR_TRUE==IsEnabled())) { - *aResult = PR_TRUE; - } - } + NS_ENSURE_SUCCESS(editor->CanCut(*aResult), NS_ERROR_FAILURE); } } - else if (PR_TRUE==mCopyString.Equals(aCommand)) + else if (cmdAtom == mCopyCmd) { // we can copy if the editor has a non-collapsed selection if (editor) { - nsCOMPtr selection; - NS_ENSURE_SUCCESS(editor->GetSelection(getter_AddRefs(selection)), NS_ERROR_FAILURE); - if (selection) - { - PRBool collapsed; - NS_ENSURE_SUCCESS(selection->GetIsCollapsed(&collapsed), NS_ERROR_FAILURE); - if (PR_FALSE==collapsed) { - *aResult = PR_TRUE; - } - } + NS_ENSURE_SUCCESS(editor->CanCopy(*aResult), NS_ERROR_FAILURE); } } - else if (PR_TRUE==mPasteString.Equals(aCommand)) - { // paste is enabled if there is text on the clipbard and if the editor is not readonly or disabled - // XXX: implement me - *aResult = PR_TRUE; + else if (cmdAtom == mPasteCmd) + { + if (editor) + { + NS_ENSURE_SUCCESS(editor->CanPaste(*aResult), NS_ERROR_FAILURE); + } } - else if (PR_TRUE==mDeleteString.Equals(aCommand)) - { // delete is enabled if there is any content and if the editor is not readonly or disabled - *aResult = PR_TRUE; + else if (cmdAtom == mDeleteCmd) + { // we can delete if the editor has a non-collapsed selection and is modifiable (same as cut) + if (editor) + { + NS_ENSURE_SUCCESS(editor->CanCut(*aResult), NS_ERROR_FAILURE); + } } - else if (PR_TRUE==mSelectAllString.Equals(aCommand)) + else if (cmdAtom == mSelectAllCmd) { // selectAll is enabled if there is any content and if the editor is not disabled (readonly is ok) *aResult = PR_TRUE; } @@ -211,49 +199,52 @@ NS_IMETHODIMP nsEditorController::SupportsCommand(const PRUnichar *aCommand, PRB // XXX: need to check the readonly and disabled states *aResult = PR_FALSE; - if ((PR_TRUE==mUndoString.Equals(aCommand)) || - (PR_TRUE==mRedoString.Equals(aCommand)) || - (PR_TRUE==mCutString.Equals(aCommand)) || - (PR_TRUE==mCopyString.Equals(aCommand)) || - (PR_TRUE==mPasteString.Equals(aCommand)) || - (PR_TRUE==mDeleteString.Equals(aCommand)) || - (PR_TRUE==mDeleteCharForward.Equals(aCommand)) || - (PR_TRUE==mDeleteCharBackward.Equals(aCommand)) || - (PR_TRUE==mDeleteWordForward.Equals(aCommand)) || - (PR_TRUE==mDeleteWordBackward.Equals(aCommand)) || - (PR_TRUE==mDeleteToBeginningOfLine.Equals(aCommand)) || - (PR_TRUE==mDeleteToEndOfLine.Equals(aCommand)) || - (PR_TRUE==mSelectAllString.Equals(aCommand)) || - (PR_TRUE==mBeginLineString.Equals(aCommand)) || - (PR_TRUE==mEndLineString.Equals(aCommand)) || - (PR_TRUE==mSelectBeginLineString.Equals(aCommand)) || - (PR_TRUE==mSelectEndLineString.Equals(aCommand)) || - (PR_TRUE==mScrollTopString.Equals(aCommand)) || - (PR_TRUE==mScrollBottomString.Equals(aCommand)) || - (PR_TRUE==mMoveTopString.Equals(aCommand)) || - (PR_TRUE==mMoveBottomString.Equals(aCommand)) || - (PR_TRUE==mSelectMoveTopString.Equals(aCommand)) || - (PR_TRUE==mSelectMoveBottomString.Equals(aCommand)) || - (PR_TRUE==mLineNextString.Equals(aCommand)) || - (PR_TRUE==mLinePreviousString.Equals(aCommand)) || - (PR_TRUE==mLeftString.Equals(aCommand)) || - (PR_TRUE==mRightString.Equals(aCommand)) || - (PR_TRUE==mSelectLineNextString.Equals(aCommand)) || - (PR_TRUE==mSelectLinePreviousString.Equals(aCommand)) || - (PR_TRUE==mSelectLeftString.Equals(aCommand)) || - (PR_TRUE==mSelectRightString.Equals(aCommand)) || - (PR_TRUE==mWordLeftString.Equals(aCommand)) || - (PR_TRUE==mWordRightString.Equals(aCommand)) || - (PR_TRUE==mSelectWordLeftString.Equals(aCommand)) || - (PR_TRUE==mSelectWordRightString.Equals(aCommand)) || - (PR_TRUE==mScrollPageUp.Equals(aCommand)) || - (PR_TRUE==mScrollPageDown.Equals(aCommand)) || - (PR_TRUE==mScrollLineUp.Equals(aCommand)) || - (PR_TRUE==mScrollLineDown.Equals(aCommand)) || - (PR_TRUE==mMovePageUp.Equals(aCommand)) || - (PR_TRUE==mMovePageDown.Equals(aCommand)) || - (PR_TRUE==mSelectMovePageUp.Equals(aCommand)) || - (PR_TRUE==mSelectMovePageDown.Equals(aCommand)) + nsCOMPtr cmdAtom = getter_AddRefs(NS_NewAtom(aCommand)); + + if ( + (cmdAtom == mUndoCmd) || + (cmdAtom == mRedoCmd) || + (cmdAtom == mCutCmd) || + (cmdAtom == mCopyCmd) || + (cmdAtom == mPasteCmd) || + (cmdAtom == mDeleteCmd) || + (cmdAtom == mSelectAllCmd) || + (cmdAtom == mBeginLineCmd) || + (cmdAtom == mEndLineCmd) || + (cmdAtom == mSelectBeginLineCmd) || + (cmdAtom == mSelectEndLineCmd) || + (cmdAtom == mScrollTopCmd) || + (cmdAtom == mScrollBottomCmd) || + (cmdAtom == mMoveTopCmd) || + (cmdAtom == mMoveBottomCmd) || + (cmdAtom == mSelectMoveTopCmd) || + (cmdAtom == mSelectMoveBottomCmd) || + (cmdAtom == mLineNextCmd) || + (cmdAtom == mLinePreviousCmd) || + (cmdAtom == mLeftCmd) || + (cmdAtom == mRightCmd) || + (cmdAtom == mSelectLineNextCmd) || + (cmdAtom == mSelectLinePreviousCmd) || + (cmdAtom == mSelectLeftCmd) || + (cmdAtom == mSelectRightCmd) || + (cmdAtom == mWordLeftCmd) || + (cmdAtom == mWordRightCmd) || + (cmdAtom == mSelectWordLeftCmd) || + (cmdAtom == mSelectWordRightCmd) || + (cmdAtom == mScrollPageUpCmd) || + (cmdAtom == mScrollPageDownCmd) || + (cmdAtom == mScrollLineUpCmd) || + (cmdAtom == mScrollLineDownCmd) || + (cmdAtom == mMovePageUpCmd) || + (cmdAtom == mMovePageDownCmd) || + (cmdAtom == mSelectMovePageUpCmd) || + (cmdAtom == mSelectMovePageDownCmd) || + (cmdAtom == mDeleteCharForwardCmd) || + (cmdAtom == mDeleteCharBackwardCmd) || + (cmdAtom == mDeleteWordForwardCmd) || + (cmdAtom == mDeleteWordBackwardCmd) || + (cmdAtom == mDeleteToBeginningOfLineCmd) || + (cmdAtom == mDeleteToEndOfLineCmd) ) { *aResult = PR_TRUE; @@ -274,237 +265,239 @@ NS_IMETHODIMP nsEditorController::DoCommand(const PRUnichar *aCommand) return NS_OK; } + nsCOMPtr cmdAtom = getter_AddRefs(NS_NewAtom(aCommand)); + nsresult rv = NS_ERROR_NO_INTERFACE; - if (PR_TRUE==mUndoString.Equals(aCommand)) + if (cmdAtom == mUndoCmd) { rv = editor->Undo(1); } - else if (PR_TRUE==mRedoString.Equals(aCommand)) + else if (cmdAtom == mRedoCmd) { rv = editor->Redo(1); } - else if (PR_TRUE==mCutString.Equals(aCommand)) + else if (cmdAtom == mCutCmd) { rv = editor->Cut(); } - else if (PR_TRUE==mCopyString.Equals(aCommand)) + else if (cmdAtom == mCopyCmd) { rv = editor->Copy(); } - else if (PR_TRUE==mPasteString.Equals(aCommand)) + else if (cmdAtom == mPasteCmd) { rv = editor->Paste(); } - else if (PR_TRUE==mDeleteString.Equals(aCommand)) + else if (cmdAtom == mDeleteCmd) { rv = editor->DeleteSelection(nsIEditor::eNext); } - else if (PR_TRUE==mSelectAllString.Equals(aCommand)) //SelectALL + else if (cmdAtom == mSelectAllCmd) //SelectALL { rv = editor->SelectAll(); } - else if (PR_TRUE==mDeleteCharForward.Equals(aCommand)) + else if (cmdAtom == mDeleteCharForwardCmd) { rv = editor->DeleteSelection(nsIEditor::eNext); } - else if (PR_TRUE==mDeleteCharBackward.Equals(aCommand)) + else if (cmdAtom == mDeleteCharBackwardCmd) { rv = editor->DeleteSelection(nsIEditor::ePrevious); } - else if (PR_TRUE==mDeleteWordForward.Equals(aCommand)) + else if (cmdAtom == mDeleteWordForwardCmd) { rv = editor->DeleteSelection(nsIEditor::eNextWord); } - else if (PR_TRUE==mDeleteWordBackward.Equals(aCommand)) + else if (cmdAtom == mDeleteWordBackwardCmd) { rv = editor->DeleteSelection(nsIEditor::ePreviousWord); } - else if (PR_TRUE==mDeleteToBeginningOfLine.Equals(aCommand)) + else if (cmdAtom == mDeleteToBeginningOfLineCmd) { rv = editor->DeleteSelection(nsIEditor::eToBeginningOfLine); } - else if (PR_TRUE==mDeleteToEndOfLine.Equals(aCommand)) + else if (cmdAtom == mDeleteToEndOfLineCmd) { rv = editor->DeleteSelection(nsIEditor::eToEndOfLine); } - else if (PR_TRUE==mScrollTopString.Equals(aCommand)) //ScrollTOP + else if (cmdAtom == mScrollTopCmd) //ScrollTOP { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->CompleteScroll(PR_FALSE); } - else if (PR_TRUE==mScrollBottomString.Equals(aCommand)) //ScrollBOTTOM + else if (cmdAtom == mScrollBottomCmd) //ScrollBOTTOM { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->CompleteScroll(PR_TRUE); } - else if (PR_TRUE==mMoveTopString.Equals(aCommand)) //MoveTop + else if (cmdAtom == mMoveTopCmd) //MoveTop { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->CompleteMove(PR_FALSE,PR_FALSE); } - else if (PR_TRUE==mMoveBottomString.Equals(aCommand)) //MoveBottom + else if (cmdAtom == mMoveBottomCmd) //MoveBottom { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->CompleteMove(PR_TRUE,PR_FALSE); } - else if (PR_TRUE==mSelectMoveTopString.Equals(aCommand)) // SelectMoveTop + else if (cmdAtom == mSelectMoveTopCmd) // SelectMoveTop { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->CompleteMove(PR_FALSE,PR_TRUE); } - else if (PR_TRUE==mSelectMoveBottomString.Equals(aCommand)) //SelectMoveBottom + else if (cmdAtom == mSelectMoveBottomCmd) //SelectMoveBottom { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->CompleteMove(PR_TRUE,PR_TRUE); } - else if (PR_TRUE==mLineNextString.Equals(aCommand)) //DOWN + else if (cmdAtom == mLineNextCmd) //DOWN { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->LineMove(PR_TRUE,PR_FALSE); } - else if (PR_TRUE==mLinePreviousString.Equals(aCommand)) //UP + else if (cmdAtom == mLinePreviousCmd) //UP { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->LineMove(PR_FALSE,PR_FALSE); } - else if (PR_TRUE==mSelectLineNextString.Equals(aCommand)) //SelectDown + else if (cmdAtom == mSelectLineNextCmd) //SelectDown { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->LineMove(PR_TRUE,PR_TRUE); } - else if (PR_TRUE==mSelectLinePreviousString.Equals(aCommand)) //SelectUp + else if (cmdAtom == mSelectLinePreviousCmd) //SelectUp { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->LineMove(PR_FALSE,PR_TRUE); } - else if (PR_TRUE==mLeftString.Equals(aCommand)) //LeftChar + else if (cmdAtom == mLeftCmd) //LeftChar { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->CharacterMove(PR_FALSE,PR_FALSE); } - else if (PR_TRUE==mRightString.Equals(aCommand)) //Right char + else if (cmdAtom == mRightCmd) //Right char { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->CharacterMove(PR_TRUE,PR_FALSE); } - else if (PR_TRUE==mSelectLeftString.Equals(aCommand)) //SelectLeftChar + else if (cmdAtom == mSelectLeftCmd) //SelectLeftChar { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->CharacterMove(PR_FALSE,PR_TRUE); } - else if (PR_TRUE==mSelectRightString.Equals(aCommand)) //SelectRightChar + else if (cmdAtom == mSelectRightCmd) //SelectRightChar { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->CharacterMove(PR_TRUE,PR_TRUE); } - else if (PR_TRUE==mBeginLineString.Equals(aCommand)) //BeginLine + else if (cmdAtom == mBeginLineCmd) //BeginLine { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->IntraLineMove(PR_FALSE,PR_FALSE); } - else if (PR_TRUE==mEndLineString.Equals(aCommand)) //EndLine + else if (cmdAtom == mEndLineCmd) //EndLine { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->IntraLineMove(PR_TRUE,PR_FALSE); } - else if (PR_TRUE==mSelectBeginLineString.Equals(aCommand)) //SelectBeginLine + else if (cmdAtom == mSelectBeginLineCmd) //SelectBeginLine { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->IntraLineMove(PR_FALSE,PR_TRUE); } - else if (PR_TRUE==mSelectEndLineString.Equals(aCommand)) //SelectEndLine + else if (cmdAtom == mSelectEndLineCmd) //SelectEndLine { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->IntraLineMove(PR_TRUE,PR_TRUE); } - else if (PR_TRUE==mWordLeftString.Equals(aCommand)) //LeftWord + else if (cmdAtom == mWordLeftCmd) //LeftWord { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->WordMove(PR_FALSE,PR_FALSE); } - else if (PR_TRUE==mWordRightString.Equals(aCommand)) //RightWord + else if (cmdAtom == mWordRightCmd) //RightWord { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->WordMove(PR_TRUE,PR_FALSE); } - else if (PR_TRUE==mSelectWordLeftString.Equals(aCommand)) //SelectLeftWord + else if (cmdAtom == mSelectWordLeftCmd) //SelectLeftWord { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->WordMove(PR_FALSE,PR_TRUE); } - else if (PR_TRUE==mSelectWordRightString.Equals(aCommand)) //SelectRightWord + else if (cmdAtom == mSelectWordRightCmd) //SelectRightWord { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->WordMove(PR_TRUE,PR_TRUE); } - else if (PR_TRUE==mScrollPageUp.Equals(aCommand)) //ScrollPageUp + else if (cmdAtom == mScrollPageUpCmd) //ScrollPageUp { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->ScrollPage(PR_FALSE); } - else if (PR_TRUE==mScrollPageDown.Equals(aCommand)) //ScrollPageDown + else if (cmdAtom == mScrollPageDownCmd) //ScrollPageDown { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->ScrollPage(PR_TRUE); } - else if (PR_TRUE==mScrollLineUp.Equals(aCommand)) //ScrollLineUp + else if (cmdAtom == mScrollLineUpCmd) //ScrollLineUp { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->ScrollLine(PR_FALSE); } - else if (PR_TRUE==mScrollLineDown.Equals(aCommand)) //ScrollLineDown + else if (cmdAtom == mScrollLineDownCmd) //ScrollLineDown { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->ScrollLine(PR_TRUE); } - else if (PR_TRUE==mMovePageUp.Equals(aCommand)) //MovePageUp + else if (cmdAtom == mMovePageUpCmd) //MovePageUp { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->PageMove(PR_FALSE,PR_FALSE); } - else if (PR_TRUE==mMovePageDown.Equals(aCommand)) //MovePageDown + else if (cmdAtom == mMovePageDownCmd) //MovePageDown { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->PageMove(PR_TRUE,PR_FALSE); } - else if (PR_TRUE==mSelectMovePageUp.Equals(aCommand)) //SelectMovePageUp + else if (cmdAtom == mSelectMovePageUpCmd) //SelectMovePageUp { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) rv = selCont->PageMove(PR_FALSE,PR_TRUE); } - else if (PR_TRUE==mSelectMovePageDown.Equals(aCommand)) //SelectMovePageDown + else if (cmdAtom == mSelectMovePageDownCmd) //SelectMovePageDown { rv = GetSelectionController(getter_AddRefs(selCont)); if (NS_SUCCEEDED(rv)) diff --git a/mozilla/editor/libeditor/base/nsEditorController.h b/mozilla/editor/libeditor/base/nsEditorController.h index 752471cd9b7..6df1ae03140 100644 --- a/mozilla/editor/libeditor/base/nsEditorController.h +++ b/mozilla/editor/libeditor/base/nsEditorController.h @@ -26,7 +26,7 @@ #include "nsIController.h" #include "nsIEditorController.h" -#include "nsString2.h" +#include "nsString.h" #include "nsCOMPtr.h" class nsIHTMLContent; @@ -65,59 +65,61 @@ protected: /** return PR_TRUE if the editor associated with mContent is enabled */ PRBool IsEnabled(); - // XXX: should be static - nsString mUndoString; - nsString mRedoString; - nsString mCutString; - nsString mCopyString; - nsString mPasteString; - nsString mDeleteString; - nsString mSelectAllString; + /* Return true if we have pastable data on the clipboard */ + PRBool DataOnClipboard(); + + nsCOMPtr mUndoCmd; + nsCOMPtr mRedoCmd; + nsCOMPtr mCutCmd; + nsCOMPtr mCopyCmd; + nsCOMPtr mPasteCmd; + nsCOMPtr mDeleteCmd; + nsCOMPtr mSelectAllCmd; - nsString mBeginLineString; - nsString mEndLineString ; - nsString mSelectBeginLineString; - nsString mSelectEndLineString ; + nsCOMPtr mBeginLineCmd; + nsCOMPtr mEndLineCmd; + nsCOMPtr mSelectBeginLineCmd; + nsCOMPtr mSelectEndLineCmd; - nsString mScrollTopString; - nsString mScrollBottomString; + nsCOMPtr mScrollTopCmd; + nsCOMPtr mScrollBottomCmd; - nsString mMoveTopString ; - nsString mMoveBottomString; - nsString mSelectMoveTopString; - nsString mSelectMoveBottomString; + nsCOMPtr mMoveTopCmd; + nsCOMPtr mMoveBottomCmd; + nsCOMPtr mSelectMoveTopCmd; + nsCOMPtr mSelectMoveBottomCmd; - nsString mLineNextString; - nsString mLinePreviousString; - nsString mSelectLineNextString; - nsString mSelectLinePreviousString; + nsCOMPtr mLineNextCmd; + nsCOMPtr mLinePreviousCmd; + nsCOMPtr mSelectLineNextCmd; + nsCOMPtr mSelectLinePreviousCmd; - nsString mLeftString; - nsString mRightString; - nsString mSelectLeftString; - nsString mSelectRightString; + nsCOMPtr mLeftCmd; + nsCOMPtr mRightCmd; + nsCOMPtr mSelectLeftCmd; + nsCOMPtr mSelectRightCmd; - nsString mWordLeftString; - nsString mWordRightString; - nsString mSelectWordLeftString; - nsString mSelectWordRightString; + nsCOMPtr mWordLeftCmd; + nsCOMPtr mWordRightCmd; + nsCOMPtr mSelectWordLeftCmd; + nsCOMPtr mSelectWordRightCmd; - nsString mScrollPageUp; - nsString mScrollPageDown; - nsString mScrollLineUp; - nsString mScrollLineDown; + nsCOMPtr mScrollPageUpCmd; + nsCOMPtr mScrollPageDownCmd; + nsCOMPtr mScrollLineUpCmd; + nsCOMPtr mScrollLineDownCmd; - nsString mMovePageUp; - nsString mMovePageDown; - nsString mSelectMovePageUp; - nsString mSelectMovePageDown; + nsCOMPtr mMovePageUpCmd; + nsCOMPtr mMovePageDownCmd; + nsCOMPtr mSelectMovePageUpCmd; + nsCOMPtr mSelectMovePageDownCmd; - nsString mDeleteCharBackward; - nsString mDeleteCharForward; - nsString mDeleteWordBackward; - nsString mDeleteWordForward; - nsString mDeleteToBeginningOfLine; - nsString mDeleteToEndOfLine; + nsCOMPtr mDeleteCharBackwardCmd; + nsCOMPtr mDeleteCharForwardCmd; + nsCOMPtr mDeleteWordBackwardCmd; + nsCOMPtr mDeleteWordForwardCmd; + nsCOMPtr mDeleteToBeginningOfLineCmd; + nsCOMPtr mDeleteToEndOfLineCmd; protected: nsIHTMLContent* mContent; // weak reference, the content object owns this object diff --git a/mozilla/editor/libeditor/html/TypeInState.h b/mozilla/editor/libeditor/html/TypeInState.h index 7c550bb34af..efa8dc2df1c 100644 --- a/mozilla/editor/libeditor/html/TypeInState.h +++ b/mozilla/editor/libeditor/html/TypeInState.h @@ -25,6 +25,7 @@ #include "nsIDOMSelectionListener.h" #include "nsIEditProperty.h" +#include "nsString.h" class TypeInState : public nsIDOMSelectionListener { diff --git a/mozilla/editor/libeditor/html/nsHTMLEditor.cpp b/mozilla/editor/libeditor/html/nsHTMLEditor.cpp index 68d34492818..55620f48ca2 100644 --- a/mozilla/editor/libeditor/html/nsHTMLEditor.cpp +++ b/mozilla/editor/libeditor/html/nsHTMLEditor.cpp @@ -610,6 +610,17 @@ void nsHTMLEditor::InitRules() mRules->Init(this, mFlags); } + +PRBool nsHTMLEditor::IsModifiable() +{ + PRUint32 flags; + if (NS_SUCCEEDED(GetFlags(&flags))) + return ((flags & eEditorReadonlyMask) == 0); + else + return PR_FALSE; +} + + #ifdef XP_MAC #pragma mark - #pragma mark --- nsIHTMLEditor methods --- @@ -3525,10 +3536,7 @@ nsHTMLEditor::Redo(PRUint32 aCount) NS_IMETHODIMP nsHTMLEditor::Cut() { nsCOMPtr selection; - if (!mPresShellWeak) return NS_ERROR_NOT_INITIALIZED; - nsCOMPtr ps = do_QueryReferent(mPresShellWeak); - if (!ps) return NS_ERROR_NOT_INITIALIZED; - nsresult res = ps->GetSelection(SELECTION_NORMAL, getter_AddRefs(selection)); + nsresult res = GetSelection(getter_AddRefs(selection)); if (!NS_SUCCEEDED(res)) return res; @@ -3542,6 +3550,22 @@ NS_IMETHODIMP nsHTMLEditor::Cut() return res; } +NS_IMETHODIMP nsHTMLEditor::CanCut(PRBool &aCanCut) +{ + aCanCut = PR_FALSE; + + nsCOMPtr selection; + nsresult res = GetSelection(getter_AddRefs(selection)); + if (NS_FAILED(res)) return res; + + PRBool isCollapsed; + res = selection->GetIsCollapsed(&isCollapsed); + if (NS_FAILED(res)) return res; + + aCanCut = !isCollapsed && IsModifiable(); + return NS_OK; +} + NS_IMETHODIMP nsHTMLEditor::Copy() { //printf("nsEditor::Copy\n"); @@ -3552,6 +3576,22 @@ NS_IMETHODIMP nsHTMLEditor::Copy() return ps->DoCopy(); } +NS_IMETHODIMP nsHTMLEditor::CanCopy(PRBool &aCanCopy) +{ + aCanCopy = PR_FALSE; + + nsCOMPtr selection; + nsresult res = GetSelection(getter_AddRefs(selection)); + if (NS_FAILED(res)) return res; + + PRBool isCollapsed; + res = selection->GetIsCollapsed(&isCollapsed); + if (NS_FAILED(res)) return res; + + aCanCopy = !isCollapsed; + return NS_OK; +} + NS_IMETHODIMP nsHTMLEditor::Paste() { ForceCompositionEnd(); @@ -3648,6 +3688,66 @@ NS_IMETHODIMP nsHTMLEditor::Paste() return rv; } + +NS_IMETHODIMP nsHTMLEditor::CanPaste(PRBool &aCanPaste) +{ + aCanPaste = PR_FALSE; + + nsresult rv; + NS_WITH_SERVICE(nsIClipboard, clipboard, kCClipboardCID, &rv); + if (NS_FAILED(rv)) return rv; + + // the flavors that we can deal with + char* textEditorFlavors[] = { kTextMime, kUnicodeMime, nsnull }; + char* htmlEditorFlavors[] = { kJPEGImageMime, kHTMLMime, nsnull }; + + nsCOMPtr flavorsList; + rv = nsComponentManager::CreateInstance(NS_SUPPORTSARRAY_PROGID, nsnull, + NS_GET_IID(nsISupportsArray), getter_AddRefs(flavorsList)); + if (NS_FAILED(rv)) return rv; + + PRUint32 editorFlags; + GetFlags(&editorFlags); + + // add the flavors for all editors + for (char** flavor = textEditorFlavors; *flavor; flavor++) + { + nsCOMPtr flavorString; + nsComponentManager::CreateInstance(NS_SUPPORTS_STRING_PROGID, nsnull, + NS_GET_IID(nsISupportsString), getter_AddRefs(flavorString)); + if (flavorString) + { + flavorString->SetData(*flavor); + flavorsList->AppendElement(flavorString); + } + } + + // add the HTML-editor only flavors + if ((editorFlags & eEditorPlaintextMask) == 0) + { + + for (char** flavor = htmlEditorFlavors; *flavor; flavor++) + { + nsCOMPtr flavorString; + nsComponentManager::CreateInstance(NS_SUPPORTS_STRING_PROGID, nsnull, + NS_GET_IID(nsISupportsString), getter_AddRefs(flavorString)); + if (flavorString) + { + flavorString->SetData(*flavor); + flavorsList->AppendElement(flavorString); + } + } + } + + PRBool haveFlavors; + rv = clipboard->HasDataMatchingFlavors(flavorsList, &haveFlavors); + if (NS_FAILED(rv)) return rv; + + aCanPaste = haveFlavors; + return NS_OK; +} + + // // HTML PasteAsQuotation: Paste in a blockquote type=cite // diff --git a/mozilla/editor/libeditor/html/nsHTMLEditor.h b/mozilla/editor/libeditor/html/nsHTMLEditor.h index 551df50ae99..56166562dfa 100644 --- a/mozilla/editor/libeditor/html/nsHTMLEditor.h +++ b/mozilla/editor/libeditor/html/nsHTMLEditor.h @@ -231,8 +231,11 @@ public: NS_IMETHOD Redo(PRUint32 aCount); NS_IMETHOD Cut(); + NS_IMETHOD CanCut(PRBool &aCanCut); NS_IMETHOD Copy(); + NS_IMETHOD CanCopy(PRBool &aCanCopy); NS_IMETHOD Paste(); + NS_IMETHOD CanPaste(PRBool &aCanPaste); NS_IMETHOD OutputToString(nsString& aOutputString, const nsString& aFormatType, @@ -520,6 +523,9 @@ protected: /** simple utility to handle any error with event listener allocation or registration */ void HandleEventListenerError(); + /* small utility routine to test the eEditorReadonly bit */ + PRBool IsModifiable(); + // Data members protected: diff --git a/mozilla/editor/public/nsIEditor.h b/mozilla/editor/public/nsIEditor.h index 044489a5042..f9d29ea7530 100644 --- a/mozilla/editor/public/nsIEditor.h +++ b/mozilla/editor/public/nsIEditor.h @@ -224,6 +224,11 @@ public: */ NS_IMETHOD Cut()=0; + /** Can we cut? True if the doc is modifiable, and we have a non- + * collapsed selection. + */ + NS_IMETHOD CanCut(PRBool &aCanCut)=0; + /** copy the currently selected text, putting it into the OS clipboard * What if no text is selected? * What about mixed selections? @@ -231,11 +236,20 @@ public: */ NS_IMETHOD Copy()=0; + /** Can we copy? True if we have a non-collapsed selection. + */ + NS_IMETHOD CanCopy(PRBool &aCanCopy)=0; + /** paste the text in the OS clipboard at the cursor position, replacing * the selected text (if any) */ NS_IMETHOD Paste()=0; + /** Can we paste? True if the doc is modifiable, and we have + * pasteable data in the clipboard. + */ + NS_IMETHOD CanPaste(PRBool &aCanPaste)=0; + /* ------------ Selection methods -------------- */ /** sets the document selection to the entire contents of the document */