From d61a3333a10b5e37c8fa0e7f0b24eccb8143b457 Mon Sep 17 00:00:00 2001 From: "chak%netscape.com" Date: Fri, 28 Feb 2003 01:01:31 +0000 Subject: [PATCH] Fix for #193479 - Implement InsertLink functionality in MfcEmbed editor r=mjudge, sr=kin --- embedding/tests/mfcembed/Dialogs.cpp | 38 +++++ embedding/tests/mfcembed/Dialogs.h | 19 +++ embedding/tests/mfcembed/EditorFrm.cpp | 190 +++++++++++++++++++------ embedding/tests/mfcembed/EditorFrm.h | 15 +- embedding/tests/mfcembed/Makefile.in | 1 + embedding/tests/mfcembed/MfcEmbed.rc | 15 ++ embedding/tests/mfcembed/resource.h | 3 + 7 files changed, 235 insertions(+), 46 deletions(-) diff --git a/embedding/tests/mfcembed/Dialogs.cpp b/embedding/tests/mfcembed/Dialogs.cpp index 3e1b31fdc42..56f8e5f257c 100644 --- a/embedding/tests/mfcembed/Dialogs.cpp +++ b/embedding/tests/mfcembed/Dialogs.cpp @@ -121,3 +121,41 @@ BOOL CFindDialog::SearchBackwards() return pChk ? pChk->GetCheck() : FALSE; } + +///////////////////////////////////////////////////////////////////////////// +// CLinkPropertiesDlg dialog +CLinkPropertiesDlg::CLinkPropertiesDlg(CWnd* pParent /*=NULL*/) + : CDialog(CLinkPropertiesDlg::IDD, pParent) +{ + m_LinkText = _T(""); + m_LinkLocation = _T(""); +} + +void CLinkPropertiesDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + DDX_Text(pDX, IDC_EDIT_LINK_TEXT, m_LinkText); + DDX_Text(pDX, IDC_EDIT_LINK_LOCATION, m_LinkLocation); +} + + +BEGIN_MESSAGE_MAP(CLinkPropertiesDlg, CDialog) +END_MESSAGE_MAP() + +void CLinkPropertiesDlg::OnOK() +{ + UpdateData(TRUE); + + if (m_LinkLocation.IsEmpty() || (m_LinkText.IsEmpty() && m_LinkLocation.IsEmpty())) + { + MessageBox("Please enter a Link Location"); + return; + } + + if (m_LinkText.IsEmpty()) + { + m_LinkText = m_LinkLocation; + } + + EndDialog(IDOK); +} diff --git a/embedding/tests/mfcembed/Dialogs.h b/embedding/tests/mfcembed/Dialogs.h index 6f9030687cf..55f5fda51d3 100644 --- a/embedding/tests/mfcembed/Dialogs.h +++ b/embedding/tests/mfcembed/Dialogs.h @@ -66,4 +66,23 @@ protected: virtual void PostNcDestroy(); }; +///////////////////////////////////////////////////////////////////////////// +// CLinkPropertiesDlg dialog + +class CLinkPropertiesDlg : public CDialog +{ +public: + CLinkPropertiesDlg(CWnd* pParent = NULL); + + enum { IDD = IDD_DIALOG_LINK_PROPERTIES }; + CString m_LinkText; + CString m_LinkLocation; + +protected: + virtual void DoDataExchange(CDataExchange* pDX); + virtual void OnOK(); + + DECLARE_MESSAGE_MAP() +}; + #endif //_DIALOG_H_ diff --git a/embedding/tests/mfcembed/EditorFrm.cpp b/embedding/tests/mfcembed/EditorFrm.cpp index b5d9b26c344..77638ea4c09 100644 --- a/embedding/tests/mfcembed/EditorFrm.cpp +++ b/embedding/tests/mfcembed/EditorFrm.cpp @@ -34,6 +34,7 @@ #include "MfcEmbed.h" #include "BrowserFrm.h" #include "EditorFrm.h" +#include "Dialogs.h" //------------------------------------------------------------ // Editor Command/Parameter Names @@ -244,18 +245,17 @@ NS_METHOD CEditorFrame::MakeEditable() { nsresult rv; - nsCOMPtr domWindow; - m_wndBrowserView.mWebBrowser->GetContentDOMWindow(getter_AddRefs(domWindow)); - if (!domWindow) + + m_wndBrowserView.mWebBrowser->GetContentDOMWindow(getter_AddRefs(mDOMWindow)); + if (!mDOMWindow) return NS_ERROR_FAILURE; - nsCOMPtr editingSession = do_GetInterface(m_wndBrowserView.mWebBrowser); - if (!editingSession) + mEditingSession = do_GetInterface(m_wndBrowserView.mWebBrowser); + if (!mEditingSession) return NS_ERROR_FAILURE; - rv= editingSession->MakeWindowEditable(domWindow, NULL, PR_TRUE); + rv= mEditingSession->MakeWindowEditable(mDOMWindow, NULL, PR_TRUE); - return rv; } @@ -292,26 +292,22 @@ CEditorFrame::ExecuteNoParam(const char *aCommand) void CEditorFrame::OnIndent() { - // TODO: Add your command handler code here ExecuteNoParam(INDENT_COMMAND); } void CEditorFrame::OnUpdateIndent(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here - } void CEditorFrame::OnOutdent() { - // TODO: Add your command handler code here ExecuteNoParam(OUTDENT_COMMAND); } void CEditorFrame::OnUpdateOutdent(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here - } NS_METHOD @@ -352,94 +348,77 @@ CEditorFrame::GetAttributeParamValue(const char *aCommand, nsCString &aValue) void CEditorFrame::OnFontred() { - // TODO: Add your command handler code here ExecuteAttribParam(FONTCOLOR_COMMAND,COLOR_RED); } void CEditorFrame::OnUpdateFontred(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here - } void CEditorFrame::OnFontblack() { - // TODO: Add your command handler code here ExecuteAttribParam(FONTCOLOR_COMMAND,COLOR_BLACK); } void CEditorFrame::OnUpdateFontblack(CCmdUI* pCmdUI) { - // TODO: Add your command update UI handler code here - + // TODO: Add your command update UI handler code here } void CEditorFrame::OnBgcolor() { - // TODO: Add your command handler code here - ExecuteAttribParam(BACKGROUNDCOLOR_COMMAND,COLOR_RED); - + ExecuteAttribParam(BACKGROUNDCOLOR_COMMAND,COLOR_RED); } void CEditorFrame::OnUpdateBgcolor(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here - } void CEditorFrame::OnNobgcolor() { - // TODO: Add your command handler code here ExecuteAttribParam(BACKGROUNDCOLOR_COMMAND,STATE_EMPTY); } void CEditorFrame::OnUpdateNobgcolor(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here - } void CEditorFrame::OnFontsizeincrease() { - // TODO: Add your command handler code here ExecuteNoParam(INCREASEFONT_COMMAND); } void CEditorFrame::OnFontsizedecrease() { - // TODO: Add your command handler code here ExecuteNoParam(DECREASEFONT_COMMAND); } void CEditorFrame::OnArial() { - // TODO: Add your command handler code here ExecuteAttribParam(FONTFACE_COMMAND,FONT_ARIAL); } void CEditorFrame::OnTimes() { - // TODO: Add your command handler code here ExecuteAttribParam(FONTFACE_COMMAND,FONT_TIMES); } void CEditorFrame::OnCourier() { - // TODO: Add your command handler code here ExecuteAttribParam(FONTFACE_COMMAND,FONT_COURIER); } void CEditorFrame::OnAlignleft() { - // TODO: Add your command handler code here - ExecuteAttribParam(ALIGN_COMMAND,ALIGN_LEFT); - + ExecuteAttribParam(ALIGN_COMMAND,ALIGN_LEFT); } void CEditorFrame::OnUpdateAlignleft(CCmdUI* pCmdUI) { - // TODO: Add your command update UI handler code here nsCAutoString tValue; nsresult rv = GetAttributeParamValue(ALIGN_COMMAND,tValue); @@ -454,15 +433,11 @@ void CEditorFrame::OnUpdateAlignleft(CCmdUI* pCmdUI) void CEditorFrame::OnAlignright() { - // TODO: Add your command handler code here ExecuteAttribParam(ALIGN_COMMAND,ALIGN_RIGHT); - } void CEditorFrame::OnUpdateAlignright(CCmdUI* pCmdUI) { - // TODO: Add your command update UI handler code here - // TODO: Add your command update UI handler code here nsCAutoString tValue; nsresult rv = GetAttributeParamValue(ALIGN_COMMAND,tValue); if (NS_SUCCEEDED(rv)) @@ -476,15 +451,11 @@ void CEditorFrame::OnUpdateAlignright(CCmdUI* pCmdUI) void CEditorFrame::OnAligncenter() { - // TODO: Add your command handler code here ExecuteAttribParam(ALIGN_COMMAND,ALIGN_CENTER); - } void CEditorFrame::OnUpdateAligncenter(CCmdUI* pCmdUI) { - // TODO: Add your command update UI handler code here - // TODO: Add your command update UI handler code here nsCAutoString tValue; nsresult rv = GetAttributeParamValue(ALIGN_COMMAND,tValue); if (NS_SUCCEEDED(rv)) @@ -498,25 +469,118 @@ void CEditorFrame::OnUpdateAligncenter(CCmdUI* pCmdUI) void CEditorFrame::OnInsertlink() { - // TODO: Add your command handler code here - + if (InLink()) + ShowEditLinkDlg(); + else + ShowInsertLinkDlg(); +} + +void CEditorFrame::ShowInsertLinkDlg() +{ + CLinkPropertiesDlg dlg; + + if(dlg.DoModal() == IDOK) + { + InsertLink(dlg.m_LinkText, dlg.m_LinkLocation); + } +} + +void CEditorFrame::InsertLink(CString& linkText, CString& linkLocation) +{ + CString html = "  " + linkText + "  "; + + InsertHTML(html); +} + +void CEditorFrame::InsertHTML(CString& str) +{ + nsString htmlToInsert; + htmlToInsert.AssignWithConversion(str.GetBuffer(0)); + + nsCOMPtr htmlEditor; + GetHTMLEditor(getter_AddRefs(htmlEditor)); + if (htmlEditor) + htmlEditor->InsertHTML(htmlToInsert); +} + +void CEditorFrame::ShowEditLinkDlg() +{ + nsCOMPtr anchorElement; + CLinkPropertiesDlg dlg; + + if (GetCurrentLinkInfo(dlg.m_LinkText, dlg.m_LinkLocation, getter_AddRefs(anchorElement))) + { + if(dlg.DoModal() == IDOK) + { + //Select the link being edited and then insert the + //new link into it's place i.e. essentially a replace operation + nsCOMPtr htmlEditor; + GetHTMLEditor(getter_AddRefs(htmlEditor)); + if (htmlEditor) + htmlEditor->SelectElement(anchorElement); + + InsertLink(dlg.m_LinkText, dlg.m_LinkLocation); + } + } +} + +BOOL CEditorFrame::GetCurrentLinkInfo(CString& strLinkText, CString& strLinkLocation, nsIDOMHTMLAnchorElement** anchorElement) +{ + USES_CONVERSION; + + nsCOMPtr htmlEditor; + + GetHTMLEditor(getter_AddRefs(htmlEditor)); + if (!htmlEditor) + return FALSE; + + nsCOMPtr domElement; + htmlEditor->GetElementOrParentByTagName(NS_LITERAL_STRING("href"), + nsnull, + getter_AddRefs(domElement)); + if (!domElement) + return FALSE; + + nsAutoString linkLocation, linkText; + nsresult rv = NS_ERROR_FAILURE; + + // Determine linkLocation + nsCOMPtr linkElement(do_QueryInterface(domElement, &rv)); + if (NS_SUCCEEDED(rv)) + rv = linkElement->GetHref(linkLocation); + if (NS_FAILED(rv)) + return FALSE; + + // Determine linkText + nsCOMPtr firstChild; + rv = linkElement->GetFirstChild(getter_AddRefs(firstChild)); + if (NS_FAILED(rv)) + return FALSE; + firstChild->GetNodeValue(linkText); + if (NS_FAILED(rv)) + return FALSE; + + strLinkText = W2T(linkText.get()); + strLinkLocation = W2T(linkLocation.get()); + + *anchorElement = linkElement; + NS_ADDREF(*anchorElement); + + return TRUE; } void CEditorFrame::OnEditUndo() { - // TODO: Add your command handler code here ExecuteNoParam(UNDO_COMMAND); } void CEditorFrame::OnEditRedo() { - // TODO: Add your command handler code here ExecuteNoParam(REDO_COMMAND); } void CEditorFrame::OnUpdateEditRedo(CCmdUI* pCmdUI) { - // TODO: Add your command update UI handler code here nsresult rv; nsCOMPtr params; rv = MakeCommandParams(REDO_COMMAND,getter_AddRefs(params)); @@ -540,7 +604,6 @@ void CEditorFrame::OnUpdateEditRedo(CCmdUI* pCmdUI) void CEditorFrame::OnUpdateEditUndo(CCmdUI* pCmdUI) { - // TODO: Add your command update UI handler code here nsresult rv; nsCOMPtr params; rv = MakeCommandParams(UNDO_COMMAND,getter_AddRefs(params)); @@ -561,3 +624,40 @@ void CEditorFrame::OnUpdateEditUndo(CCmdUI* pCmdUI) } pCmdUI->Enable(FALSE); } + +void CEditorFrame::GetEditor(nsIEditor** editor) +{ + mEditingSession->GetEditorForWindow(mDOMWindow, editor); +} + +void CEditorFrame::GetHTMLEditor(nsIHTMLEditor** htmlEditor) +{ + *htmlEditor = 0; + + nsCOMPtr editor; + GetEditor(getter_AddRefs(editor)); + if (!editor) + { + return; + } + + editor->QueryInterface(NS_GET_IID(nsIHTMLEditor), (void**)htmlEditor); +} + +BOOL CEditorFrame::InLink() +{ + nsCOMPtr htmlEditor; + + GetHTMLEditor(getter_AddRefs(htmlEditor)); + + if (htmlEditor) + { + nsCOMPtr domElememt; + htmlEditor->GetElementOrParentByTagName(NS_LITERAL_STRING("href"), + nsnull, + getter_AddRefs(domElememt)); + return domElememt ? TRUE : FALSE; + } + + return false; +} diff --git a/embedding/tests/mfcembed/EditorFrm.h b/embedding/tests/mfcembed/EditorFrm.h index 4c267f07075..d9d357be7b0 100644 --- a/embedding/tests/mfcembed/EditorFrm.h +++ b/embedding/tests/mfcembed/EditorFrm.h @@ -38,7 +38,9 @@ #include "nsICommandManager.h" #include "nsIScriptGlobalObject.h" #include "nsISimpleEnumerator.h" - +#include "nsIEditor.h" +#include "nsIHTMLEditor.h" + class CEditorFrame : public CBrowserFrame { public: @@ -55,6 +57,15 @@ public: NS_METHOD IsCommandEnabled(const char *aCommand, PRBool *retval); NS_METHOD GetCommandState(const char *aCommand, nsICommandParams *aCommandParams); + void GetEditor(nsIEditor** editor); + void GetHTMLEditor(nsIHTMLEditor** htmlEditor); + BOOL InLink(); + void ShowInsertLinkDlg(); + void ShowEditLinkDlg(); + BOOL GetCurrentLinkInfo(CString& strLinkText, CString& strLinkLocation, nsIDOMHTMLAnchorElement** anchorElement); + void InsertLink(CString& linkText, CString& linkLocation); + void InsertHTML(CString& str); + // Generated message map functions protected: //{{AFX_MSG(CEditorFrame) @@ -107,6 +118,8 @@ private: private: nsCOMPtr mCommandManager; + nsCOMPtr mDOMWindow; + nsCOMPtr mEditingSession; }; #endif //_EDITORFRM_H_ diff --git a/embedding/tests/mfcembed/Makefile.in b/embedding/tests/mfcembed/Makefile.in index 49745a7cd9b..376d7b62faa 100644 --- a/embedding/tests/mfcembed/Makefile.in +++ b/embedding/tests/mfcembed/Makefile.in @@ -61,6 +61,7 @@ REQUIRES = \ commandhandler \ imglib2 \ webbrwsr \ + editor \ $(NULL) ifdef NS_TRACE_MALLOC diff --git a/embedding/tests/mfcembed/MfcEmbed.rc b/embedding/tests/mfcembed/MfcEmbed.rc index 5810d57654c..ecf4e3ef894 100644 --- a/embedding/tests/mfcembed/MfcEmbed.rc +++ b/embedding/tests/mfcembed/MfcEmbed.rc @@ -517,6 +517,21 @@ BEGIN LTEXT "Custom:",IDC_STATIC,7,8,26,8 END +IDD_DIALOG_LINK_PROPERTIES DIALOG DISCARDABLE 0, 0, 262, 162 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Link Properties" +FONT 8, "MS Sans Serif" +BEGIN + GROUPBOX " Link Text ",IDC_STATIC,7,7,248,52 + GROUPBOX " Link Location ",IDC_STATIC,7,73,248,52 + LTEXT "Enter &text to display for the link:",IDC_STATIC,16,20, + 223,8 + EDITTEXT IDC_EDIT_LINK_TEXT,16,34,232,14,ES_AUTOHSCROLL + LTEXT "Enter a web page &location:",IDC_STATIC,16,88,223,8 + EDITTEXT IDC_EDIT_LINK_LOCATION,16,103,232,14,ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,69,140,50,14 + PUSHBUTTON "Cancel",IDCANCEL,128,140,50,14 +END #ifndef _MAC ///////////////////////////////////////////////////////////////////////////// diff --git a/embedding/tests/mfcembed/resource.h b/embedding/tests/mfcembed/resource.h index 2a61118a1e4..c6e970afaba 100644 --- a/embedding/tests/mfcembed/resource.h +++ b/embedding/tests/mfcembed/resource.h @@ -34,6 +34,7 @@ #define IDD_HEADERFOOTER_TAB 156 #define IDD_FORMAT_OPTIONS_TAB 157 #define IDD_CUSTOM_PROMPT_DIALOG 159 +#define IDD_DIALOG_LINK_PROPERTIES 160 #define ID_URL_BAR 1001 #define ID_PROG_BAR 1002 #define IDC_PROMPT_ANSWER 1003 @@ -92,6 +93,8 @@ #define IDC_EDIT_HOMEPAGE 1055 #define IDC_PRT_PORTRAIT_RD 1056 #define IDC_PRT_LANDSCAPE_RD 1057 +#define IDC_EDIT_LINK_TEXT 1058 +#define IDC_EDIT_LINK_LOCATION 1059 #define IDC_FIND_EDIT 0x0480 #define ID_NAV_BACK 32773 #define ID_NAV_FORWARD 32774