/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* ***** BEGIN LICENSE BLOCK ***** * Version: NPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Netscape Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/NPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is mozilla.org code. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1998 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Chak Nanga * * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the NPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the NPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ // File Overview.... // // When the CBrowserFrm creates this View: // - CreateBrowser() is called in OnCreate() to create the // mozilla embeddable browser // // OnSize() method handles the window resizes and calls the approriate // interface method to resize the embedded browser properly // // Command handlers to handle browser navigation - OnNavBack(), // OnNavForward() etc // // DestroyBrowser() called for cleaning up during object destruction // // Some important coding notes.... // // 1. Make sure we do not have the CS_HREDRAW|CS_VREDRAW in the call // to AfxRegisterWndClass() inside of PreCreateWindow() below // If these flags are present then you'll see screen flicker when // you resize the frame window // // Next suggested file to look at : BrowserImpl.cpp // #include "stdafx.h" #include "MfcEmbed.h" #include "BrowserView.h" #include "BrowserImpl.h" #include "BrowserFrm.h" #include "Dialogs.h" // Print Includes #include "PrintProgressDialog.h" #include "PrintSetupDialog.h" // Mozilla Includes #include "nsIWidget.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // Register message for FindDialog communication static UINT WM_FINDMSG = ::RegisterWindowMessage(FINDMSGSTRING); BEGIN_MESSAGE_MAP(CBrowserView, CWnd) //{{AFX_MSG_MAP(CBrowserView) ON_WM_CREATE() ON_WM_DESTROY() ON_WM_SIZE() // UrlBar command handlers ON_COMMAND(IDOK, OnNewUrlEnteredInUrlBar) ON_CBN_SELENDOK(ID_URL_BAR, OnUrlSelectedInUrlBar) // Menu/Toolbar command handlers ON_COMMAND(ID_FILE_OPEN, OnFileOpen) ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs) ON_COMMAND(ID_VIEW_SOURCE, OnViewSource) ON_COMMAND(ID_VIEW_INFO, OnViewInfo) ON_COMMAND(ID_NAV_BACK, OnNavBack) ON_COMMAND(ID_NAV_FORWARD, OnNavForward) ON_COMMAND(ID_NAV_HOME, OnNavHome) ON_COMMAND(ID_NAV_RELOAD, OnNavReload) ON_COMMAND(ID_NAV_STOP, OnNavStop) ON_COMMAND(ID_EDIT_CUT, OnCut) ON_COMMAND(ID_EDIT_COPY, OnCopy) ON_COMMAND(ID_EDIT_PASTE, OnPaste) ON_COMMAND(ID_EDIT_UNDO, OnUndoUrlBarEditOp) ON_COMMAND(ID_EDIT_SELECT_ALL, OnSelectAll) ON_COMMAND(ID_EDIT_SELECT_NONE, OnSelectNone) ON_COMMAND(ID_OPEN_LINK_IN_NEW_WINDOW, OnOpenLinkInNewWindow) ON_COMMAND(ID_VIEW_IMAGE, OnViewImageInNewWindow) ON_COMMAND(ID_COPY_LINK_LOCATION, OnCopyLinkLocation) ON_COMMAND(ID_SAVE_LINK_AS, OnSaveLinkAs) ON_COMMAND(ID_SAVE_IMAGE_AS, OnSaveImageAs) ON_COMMAND(ID_EDIT_FIND, OnShowFindDlg) ON_COMMAND(ID_FILE_PRINT, OnFilePrint) ON_COMMAND(ID_FILE_PRINTPREVIEW, OnFilePrintPreview) ON_COMMAND(ID_FILE_PRINTSETUP, OnFilePrintSetup) ON_REGISTERED_MESSAGE(WM_FINDMSG, OnFindMsg) ON_COMMAND(ID_VIEW_FRAME_SOURCE, OnViewFrameSource) ON_COMMAND(ID_OPEN_FRAME_IN_NEW_WINDOW, OnOpenFrameInNewWindow) // Menu/Toolbar UI update handlers ON_UPDATE_COMMAND_UI(ID_NAV_BACK, OnUpdateNavBack) ON_UPDATE_COMMAND_UI(ID_NAV_FORWARD, OnUpdateNavForward) ON_UPDATE_COMMAND_UI(ID_NAV_STOP, OnUpdateNavStop) ON_UPDATE_COMMAND_UI(ID_EDIT_CUT, OnUpdateCut) ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateCopy) ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdatePaste) ON_UPDATE_COMMAND_UI(ID_FILE_PRINT, OnUpdateFilePrint) //}}AFX_MSG_MAP END_MESSAGE_MAP() CBrowserView::CBrowserView() { mWebBrowser = nsnull; mBaseWindow = nsnull; mWebNav = nsnull; mpBrowserImpl = nsnull; mpBrowserFrame = nsnull; mpBrowserFrameGlue = nsnull; mbDocumentLoading = PR_FALSE; m_pFindDlg = NULL; m_pPrintProgressDlg = NULL; m_bUrlBarClipOp = FALSE; m_bCurrentlyPrinting = FALSE; m_SecurityState = SECURITY_STATE_INSECURE; } CBrowserView::~CBrowserView() { } // This is a good place to create the embeddable browser // instance // int CBrowserView::OnCreate(LPCREATESTRUCT lpCreateStruct) { CreateBrowser(); return 0; } void CBrowserView::OnDestroy() { DestroyBrowser(); } // Create an instance of the Mozilla embeddable browser // HRESULT CBrowserView::CreateBrowser() { // Create web shell nsresult rv; mWebBrowser = do_CreateInstance(NS_WEBBROWSER_CONTRACTID, &rv); if(NS_FAILED(rv)) return rv; // Save off the nsIWebNavigation interface pointer // in the mWebNav member variable which we'll use // later for web page navigation // rv = NS_OK; mWebNav = do_QueryInterface(mWebBrowser, &rv); if(NS_FAILED(rv)) return rv; // Create the CBrowserImpl object - this is the object // which implements the interfaces which are required // by an app embedding mozilla i.e. these are the interfaces // thru' which the *embedded* browser communicates with the // *embedding* app // // The CBrowserImpl object will be passed in to the // SetContainerWindow() call below // // Also note that we're passing the BrowserFrameGlue pointer // and also the mWebBrowser interface pointer via CBrowserImpl::Init() // of CBrowserImpl object. // These pointers will be saved by the CBrowserImpl object. // The CBrowserImpl object uses the BrowserFrameGlue pointer to // call the methods on that interface to update the status/progress bars // etc. mpBrowserImpl = new CBrowserImpl(); if(mpBrowserImpl == nsnull) return NS_ERROR_OUT_OF_MEMORY; // Pass along the mpBrowserFrameGlue pointer to the BrowserImpl object // This is the interface thru' which the XP BrowserImpl code communicates // with the platform specific code to update status bars etc. mpBrowserImpl->Init(mpBrowserFrameGlue, mWebBrowser); mpBrowserImpl->AddRef(); mWebBrowser->SetContainerWindow(NS_STATIC_CAST(nsIWebBrowserChrome*, mpBrowserImpl)); rv = NS_OK; nsCOMPtr dsti = do_QueryInterface(mWebBrowser, &rv); if(NS_FAILED(rv)) return rv; // If the browser window hosting chrome or content? dsti->SetItemType(((CMfcEmbedApp *)AfxGetApp())->m_bChrome ? nsIDocShellTreeItem::typeChromeWrapper : nsIDocShellTreeItem::typeContentWrapper); // Create the real webbrowser window // Note that we're passing the m_hWnd in the call below to InitWindow() // (CBrowserView inherits the m_hWnd from CWnd) // This m_hWnd will be used as the parent window by the embeddable browser // rv = NS_OK; mBaseWindow = do_QueryInterface(mWebBrowser, &rv); if(NS_FAILED(rv)) return rv; // Get the view's ClientRect which to be passed in to the InitWindow() // call below RECT rcLocation; GetClientRect(&rcLocation); if(IsRectEmpty(&rcLocation)) { rcLocation.bottom++; rcLocation.top++; } rv = mBaseWindow->InitWindow(nsNativeWidget(m_hWnd), nsnull, 0, 0, rcLocation.right - rcLocation.left, rcLocation.bottom - rcLocation.top); rv = mBaseWindow->Create(); // Register the BrowserImpl object to receive progress messages // These callbacks will be used to update the status/progress bars nsWeakPtr weakling( dont_AddRef(NS_GetWeakReference(NS_STATIC_CAST(nsIWebProgressListener*, mpBrowserImpl)))); (void)mWebBrowser->AddWebBrowserListener(weakling, NS_GET_IID(nsIWebProgressListener)); // Finally, show the web browser window mBaseWindow->SetVisibility(PR_TRUE); nsCOMPtr print(do_GetInterface(mWebBrowser)); if (print) { print->GetNewPrintSettings(getter_AddRefs(m_PrintSettings)); } return S_OK; } HRESULT CBrowserView::DestroyBrowser() { if(mBaseWindow) { mBaseWindow->Destroy(); mBaseWindow = nsnull; } if(mpBrowserImpl) { mpBrowserImpl->Release(); mpBrowserImpl = nsnull; } return NS_OK; } BOOL CBrowserView::PreCreateWindow(CREATESTRUCT& cs) { if (!CWnd::PreCreateWindow(cs)) return FALSE; cs.dwExStyle |= WS_EX_CLIENTEDGE; cs.style &= ~WS_BORDER; cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS, ::LoadCursor(NULL, IDC_ARROW), HBRUSH(COLOR_WINDOW+1), NULL); return TRUE; } // Adjust the size of the embedded browser // in response to any container size changes // void CBrowserView::OnSize( UINT nType, int cx, int cy) { mBaseWindow->SetPositionAndSize(0, 0, cx, cy, PR_TRUE); } // Called by this object's creator i.e. the CBrowserFrame object // to pass it's pointer to us // void CBrowserView::SetBrowserFrame(CBrowserFrame* pBrowserFrame) { mpBrowserFrame = pBrowserFrame; } void CBrowserView::SetBrowserFrameGlue(PBROWSERFRAMEGLUE pBrowserFrameGlue) { mpBrowserFrameGlue = pBrowserFrameGlue; } // A new URL was entered in the URL bar // Get the URL's text from the Urlbar's (ComboBox's) EditControl // and navigate to that URL // void CBrowserView::OnNewUrlEnteredInUrlBar() { // Get the currently entered URL CString strUrl; mpBrowserFrame->m_wndUrlBar.GetEnteredURL(strUrl); if(IsViewSourceUrl(strUrl)) OpenViewSourceWindow(strUrl.GetBuffer(0)); else // Navigate to that URL OpenURL(strUrl.GetBuffer(0)); // Add what was just entered into the UrlBar mpBrowserFrame->m_wndUrlBar.AddURLToList(strUrl); } // A URL has been selected from the UrlBar's dropdown list // void CBrowserView::OnUrlSelectedInUrlBar() { CString strUrl; mpBrowserFrame->m_wndUrlBar.GetSelectedURL(strUrl); if(IsViewSourceUrl(strUrl)) OpenViewSourceWindow(strUrl.GetBuffer(0)); else OpenURL(strUrl.GetBuffer(0)); } BOOL CBrowserView::IsViewSourceUrl(CString& strUrl) { return (strUrl.Find("view-source:", 0) != -1) ? TRUE : FALSE; } BOOL CBrowserView::OpenViewSourceWindow(const char* pUrl) { // Create a new browser frame in which we'll show the document source // Note that we're getting rid of the toolbars etc. by specifying // the appropriate chromeFlags PRUint32 chromeFlags = nsIWebBrowserChrome::CHROME_WINDOW_BORDERS | nsIWebBrowserChrome::CHROME_TITLEBAR | nsIWebBrowserChrome::CHROME_WINDOW_RESIZE; CBrowserFrame* pFrm = CreateNewBrowserFrame(chromeFlags); if(!pFrm) return FALSE; // Finally, load this URI into the newly created frame pFrm->m_wndBrowserView.OpenURL(pUrl); pFrm->BringWindowToTop(); return TRUE; } void CBrowserView::OnViewSource() { if(! mWebNav) return; // Get the URI object whose source we want to view. nsresult rv = NS_OK; nsCOMPtr currentURI; rv = mWebNav->GetCurrentURI(getter_AddRefs(currentURI)); if(NS_FAILED(rv) || !currentURI) return; // Get the uri string associated with the nsIURI object nsCAutoString uriString; rv = currentURI->GetSpec(uriString); if(NS_FAILED(rv)) return; // Build the view-source: url nsCAutoString viewSrcUrl; viewSrcUrl.Append("view-source:"); viewSrcUrl.Append(uriString); OpenViewSourceWindow(viewSrcUrl.get()); } void CBrowserView::OnViewInfo() { AfxMessageBox("To Be Done..."); } void CBrowserView::OnNavBack() { if(mWebNav) mWebNav->GoBack(); } void CBrowserView::OnUpdateNavBack(CCmdUI* pCmdUI) { PRBool canGoBack = PR_FALSE; if (mWebNav) mWebNav->GetCanGoBack(&canGoBack); pCmdUI->Enable(canGoBack); } void CBrowserView::OnNavForward() { if(mWebNav) mWebNav->GoForward(); } void CBrowserView::OnUpdateNavForward(CCmdUI* pCmdUI) { PRBool canGoFwd = PR_FALSE; if (mWebNav) mWebNav->GetCanGoForward(&canGoFwd); pCmdUI->Enable(canGoFwd); } void CBrowserView::OnNavHome() { // Get the currently configured HomePage URL CString strHomeURL; CMfcEmbedApp *pApp = (CMfcEmbedApp *)AfxGetApp(); if(pApp) pApp->GetHomePage(strHomeURL); if(strHomeURL.GetLength() > 0) OpenURL(strHomeURL); } void CBrowserView::OnNavReload() { if(mWebNav) mWebNav->Reload(nsIWebNavigation::LOAD_FLAGS_NONE); } void CBrowserView::OnNavStop() { if(mWebNav) mWebNav->Stop(nsIWebNavigation::STOP_ALL); } void CBrowserView::OnUpdateNavStop(CCmdUI* pCmdUI) { pCmdUI->Enable(mbDocumentLoading); } void CBrowserView::OnCut() { if(m_bUrlBarClipOp) { // We need to operate on the URLBar selection mpBrowserFrame->CutUrlBarSelToClipboard(); m_bUrlBarClipOp = FALSE; } else { nsCOMPtr clipCmds = do_GetInterface(mWebBrowser); if(clipCmds) clipCmds->CutSelection(); } } void CBrowserView::OnUpdateCut(CCmdUI* pCmdUI) { PRBool canCutSelection = PR_FALSE; nsCOMPtr clipCmds = do_GetInterface(mWebBrowser); if (clipCmds) clipCmds->CanCutSelection(&canCutSelection); if(!canCutSelection) { // Check to see if the Cut cmd is to cut the URL // selection in the UrlBar if(mpBrowserFrame->CanCutUrlBarSelection()) { canCutSelection = TRUE; m_bUrlBarClipOp = TRUE; } } pCmdUI->Enable(canCutSelection); } void CBrowserView::OnCopy() { if(m_bUrlBarClipOp) { // We need to operate on the URLBar selection mpBrowserFrame->CopyUrlBarSelToClipboard(); m_bUrlBarClipOp = FALSE; } else { // We need to operate on the web page content nsCOMPtr clipCmds = do_GetInterface(mWebBrowser); if(clipCmds) clipCmds->CopySelection(); } } void CBrowserView::OnUpdateCopy(CCmdUI* pCmdUI) { PRBool canCopySelection = PR_FALSE; nsCOMPtr clipCmds = do_GetInterface(mWebBrowser); if (clipCmds) clipCmds->CanCopySelection(&canCopySelection); if(!canCopySelection) { // Check to see if the Copy cmd is to copy the URL // selection in the UrlBar if(mpBrowserFrame->CanCopyUrlBarSelection()) { canCopySelection = TRUE; m_bUrlBarClipOp = TRUE; } } pCmdUI->Enable(canCopySelection); } void CBrowserView::OnPaste() { if(m_bUrlBarClipOp) { mpBrowserFrame->PasteFromClipboardToUrlBar(); m_bUrlBarClipOp = FALSE; } else { nsCOMPtr clipCmds = do_GetInterface(mWebBrowser); if(clipCmds) clipCmds->Paste(); } } void CBrowserView::OnUndoUrlBarEditOp() { if(mpBrowserFrame->CanUndoUrlBarEditOp()) mpBrowserFrame->UndoUrlBarEditOp(); } void CBrowserView::OnUpdatePaste(CCmdUI* pCmdUI) { PRBool canPaste = PR_FALSE; nsCOMPtr clipCmds = do_GetInterface(mWebBrowser); if (clipCmds) clipCmds->CanPaste(&canPaste); if(!canPaste) { if(mpBrowserFrame->CanPasteToUrlBar()) { canPaste = TRUE; m_bUrlBarClipOp = TRUE; } } pCmdUI->Enable(canPaste); } void CBrowserView::OnSelectAll() { nsCOMPtr clipCmds = do_GetInterface(mWebBrowser); if(clipCmds) clipCmds->SelectAll(); } void CBrowserView::OnSelectNone() { nsCOMPtr clipCmds = do_GetInterface(mWebBrowser); if(clipCmds) clipCmds->SelectNone(); } void CBrowserView::OnFileOpen() { char *lpszFilter = "HTML Files Only (*.htm;*.html)|*.htm;*.html|" "All Files (*.*)|*.*||"; CFileDialog cf(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, lpszFilter, this); if(cf.DoModal() == IDOK) { CString strFullPath = cf.GetPathName(); // Will be like: c:\tmp\junk.htm OpenURL(strFullPath); } } void CBrowserView::GetBrowserWindowTitle(nsCString& title) { nsXPIDLString idlStrTitle; if(mBaseWindow) mBaseWindow->GetTitle(getter_Copies(idlStrTitle)); title.AssignWithConversion(idlStrTitle); // Sanitize the title of all illegal characters title.CompressWhitespace(); // Remove whitespace from the ends title.StripChars("\\*|:\"> persist(do_QueryInterface(mWebBrowser)); if(persist) { nsCOMPtr file; NS_NewNativeLocalFile(nsDependentCString(T2A(pStrFullPath)), TRUE, getter_AddRefs(file)); nsCOMPtr dataPath; if (pStrDataPath) { NS_NewNativeLocalFile(nsDependentCString(pStrDataPath), TRUE, getter_AddRefs(dataPath)); } if(bSaveAll) persist->SaveDocument(nsnull, file, dataPath, nsnull, 0, 0); else persist->SaveURI(nsnull, nsnull, file); } } } void CBrowserView::OpenURL(const char* pUrl) { OpenURL(NS_ConvertASCIItoUCS2(pUrl).get()); } void CBrowserView::OpenURL(const PRUnichar* pUrl) { if(mWebNav) mWebNav->LoadURI(pUrl, // URI string nsIWebNavigation::LOAD_FLAGS_NONE, // Load flags nsnull, // Refering URI nsnull, // Post data nsnull); // Extra headers } CBrowserFrame* CBrowserView::CreateNewBrowserFrame(PRUint32 chromeMask, PRInt32 x, PRInt32 y, PRInt32 cx, PRInt32 cy, PRBool bShowWindow) { CMfcEmbedApp *pApp = (CMfcEmbedApp *)AfxGetApp(); if(!pApp) return NULL; return pApp->CreateNewBrowserFrame(chromeMask, x, y, cx, cy, bShowWindow); } void CBrowserView::OpenURLInNewWindow(const PRUnichar* pUrl) { if(!pUrl) return; CBrowserFrame* pFrm = CreateNewBrowserFrame(); if(!pFrm) return; // Load the URL into it... // Note that OpenURL() is overloaded - one takes a "char *" // and the other a "PRUniChar *". We're using the "PRUnichar *" // version here pFrm->m_wndBrowserView.OpenURL(pUrl); } void CBrowserView::LoadHomePage() { OnNavHome(); } void CBrowserView::OnCopyLinkLocation() { if(! mCtxMenuLinkUrl.Length()) return; if (! OpenClipboard()) return; HGLOBAL hClipData = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, mCtxMenuLinkUrl.Length() + 1); if(! hClipData) return; char *pszClipData = (char*)::GlobalLock(hClipData); if(!pszClipData) return; mCtxMenuLinkUrl.ToCString(pszClipData, mCtxMenuLinkUrl.Length() + 1); GlobalUnlock(hClipData); EmptyClipboard(); SetClipboardData(CF_TEXT, hClipData); CloseClipboard(); } void CBrowserView::OnOpenLinkInNewWindow() { if(mCtxMenuLinkUrl.Length()) OpenURLInNewWindow(mCtxMenuLinkUrl.get()); } void CBrowserView::OnViewImageInNewWindow() { if(mCtxMenuImgSrc.Length()) OpenURLInNewWindow(mCtxMenuImgSrc.get()); } void CBrowserView::OnSaveLinkAs() { if(! mCtxMenuLinkUrl.Length()) return; // Try to get the file name part from the URL // To do that we first construct an obj which supports // nsIRUI interface. Makes it easy to extract portions // of a URL like the filename, scheme etc. + We'll also // use it while saving this link to a file nsresult rv = NS_OK; nsCOMPtr linkURI; rv = NS_NewURI(getter_AddRefs(linkURI), mCtxMenuLinkUrl); if (NS_FAILED(rv)) return; // Get the "path" portion (see nsIURI.h for more info // on various parts of a URI) nsCAutoString fileName; linkURI->GetPath(fileName); // The path may have the "/" char in it - strip those fileName.StripChars("\\/"); // Now, use this file name in a File Save As dlg... char *lpszFilter = "HTML Files (*.htm;*.html)|*.htm;*.html|" "Text Files (*.txt)|*.txt|" "All Files (*.*)|*.*||"; const char *pFileName = fileName.Length() ? fileName.get() : NULL; CFileDialog cf(FALSE, "htm", pFileName, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, lpszFilter, this); if(cf.DoModal() == IDOK) { CString strFullPath = cf.GetPathName(); nsCOMPtr persist(do_QueryInterface(mWebBrowser)); if(persist) { nsCOMPtr file; NS_NewNativeLocalFile(nsDependentCString(strFullPath.GetBuffer(0)), TRUE, getter_AddRefs(file)); persist->SaveURI(linkURI, nsnull, file); } } } void CBrowserView::OnSaveImageAs() { if(! mCtxMenuImgSrc.Length()) return; // Try to get the file name part from the URL // To do that we first construct an obj which supports // nsIRUI interface. Makes it easy to extract portions // of a URL like the filename, scheme etc. + We'll also // use it while saving this link to a file nsresult rv = NS_OK; nsCOMPtr linkURI; rv = NS_NewURI(getter_AddRefs(linkURI), mCtxMenuImgSrc); if (NS_FAILED(rv)) return; // Get the "path" portion (see nsIURI.h for more info // on various parts of a URI) nsCAutoString path; linkURI->GetPath(path); // The path may have the "/" char in it - strip those nsCAutoString fileName(path); fileName.StripChars("\\/"); // Now, use this file name in a File Save As dlg... char *lpszFilter = "All Files (*.*)|*.*||"; const char *pFileName = fileName.Length() ? fileName.get() : NULL; CFileDialog cf(FALSE, NULL, pFileName, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, lpszFilter, this); if(cf.DoModal() == IDOK) { CString strFullPath = cf.GetPathName(); nsCOMPtr persist(do_QueryInterface(mWebBrowser)); if(persist) { nsCOMPtr file; NS_NewNativeLocalFile(nsDependentCString(strFullPath.GetBuffer(0)), TRUE, getter_AddRefs(file)); persist->SaveURI(linkURI, nsnull, file); } } } void CBrowserView::OnShowFindDlg() { // When the the user chooses the Find menu item // and if a Find dlg. is already being shown // just set focus to the existing dlg instead of // creating a new one if(m_pFindDlg) { m_pFindDlg->SetFocus(); return; } CString csSearchStr; PRBool bMatchCase = PR_FALSE; PRBool bMatchWholeWord = PR_FALSE; PRBool bWrapAround = PR_FALSE; PRBool bSearchBackwards = PR_FALSE; // See if we can get and initialize the dlg box with // the values/settings the user specified in the previous search nsCOMPtr finder(do_GetInterface(mWebBrowser)); if(finder) { nsXPIDLString stringBuf; finder->GetSearchString(getter_Copies(stringBuf)); csSearchStr = stringBuf.get(); finder->GetMatchCase(&bMatchCase); finder->GetEntireWord(&bMatchWholeWord); finder->GetWrapFind(&bWrapAround); finder->GetFindBackwards(&bSearchBackwards); } m_pFindDlg = new CFindDialog(csSearchStr, bMatchCase, bMatchWholeWord, bWrapAround, bSearchBackwards, this); m_pFindDlg->Create(TRUE, NULL, NULL, 0, this); } // This will be called whenever the user pushes the Find // button in the Find dialog box // This method gets bound to the WM_FINDMSG windows msg via the // // ON_REGISTERED_MESSAGE(WM_FINDMSG, OnFindMsg) // // message map entry. // // WM_FINDMSG (which is registered towards the beginning of this file) // is the message via which the FindDialog communicates with this view // LRESULT CBrowserView::OnFindMsg(WPARAM wParam, LPARAM lParam) { nsCOMPtr finder(do_GetInterface(mWebBrowser)); if(!finder) return NULL; // Get the pointer to the current Find dialog box CFindDialog* dlg = (CFindDialog *) CFindReplaceDialog::GetNotifier(lParam); if(!dlg) return NULL; // Has the user decided to terminate the dialog box? if(dlg->IsTerminating()) return NULL; if(dlg->FindNext()) { nsString searchString; searchString.AssignWithConversion(dlg->GetFindString().GetBuffer(0)); finder->SetSearchString(searchString.get()); finder->SetMatchCase(dlg->MatchCase() ? PR_TRUE : PR_FALSE); finder->SetEntireWord(dlg->MatchWholeWord() ? PR_TRUE : PR_FALSE); finder->SetWrapFind(dlg->WrapAround() ? PR_TRUE : PR_FALSE); finder->SetFindBackwards(dlg->SearchBackwards() ? PR_TRUE : PR_FALSE); PRBool didFind; nsresult rv = finder->FindNext(&didFind); if(!didFind) { AfxMessageBox(IDS_SRCH_STR_NOT_FOUND); dlg->SetFocus(); } return (NS_SUCCEEDED(rv) && didFind); } return 0; } void CBrowserView::OnFilePrint() { nsresult rv; nsCOMPtr print(do_GetInterface(mWebBrowser)); if(print) { if (!m_PrintSettings) { print->GetGlobalPrintSettings(getter_AddRefs(m_PrintSettings)); } m_PrintSettings->SetShowPrintProgress(PR_FALSE); CPrintProgressDialog dlg(mWebBrowser, m_PrintSettings); nsCOMPtr currentURI; nsresult rv = mWebNav->GetCurrentURI(getter_AddRefs(currentURI)); if(NS_SUCCEEDED(rv) || currentURI) { nsCAutoString path; currentURI->GetPath(path); dlg.SetURI(path.get()); } m_bCurrentlyPrinting = TRUE; dlg.DoModal(); m_bCurrentlyPrinting = FALSE; } } void CBrowserView::OnFilePrintPreview() { nsCOMPtr print(do_GetInterface(mWebBrowser)); if(print) { print->PrintPreview(m_PrintSettings, nsnull); } } static float GetFloatFromStr(const char* aStr, float aMaxVal = 1.0) { float val; sscanf(aStr, "%f", &val); if (val <= aMaxVal) { return val; } else { return 0.5; } } static PRUnichar* GetUnicodeFromCString(const CString& aStr) { nsString str; str.AssignWithConversion(LPCSTR(aStr)); return ToNewUnicode(str); } void CBrowserView::OnFilePrintSetup() { CPrintSetupDialog dlg(m_PrintSettings); if (dlg.DoModal() == IDOK && m_PrintSettings != NULL) { m_PrintSettings->SetMarginTop(GetFloatFromStr(dlg.m_TopMargin)); m_PrintSettings->SetMarginLeft(GetFloatFromStr(dlg.m_LeftMargin)); m_PrintSettings->SetMarginRight(GetFloatFromStr(dlg.m_RightMargin)); m_PrintSettings->SetMarginBottom(GetFloatFromStr(dlg.m_BottomMargin)); m_PrintSettings->SetScaling(double(dlg.m_Scaling) / 100.0); m_PrintSettings->SetPrintBGColors(dlg.m_PrintBGColors); m_PrintSettings->SetPrintBGColors(dlg.m_PrintBGImages); short type; double width; double height; dlg.GetPaperSizeInfo(type, width, height); m_PrintSettings->SetPaperSizeType(type); m_PrintSettings->SetPaperWidth(width); m_PrintSettings->SetPaperHeight(height); PRUnichar* uStr; uStr = GetUnicodeFromCString(dlg.m_HeaderLeft); m_PrintSettings->SetHeaderStrLeft(uStr); if (uStr != nsnull) nsMemory::Free(uStr); uStr = GetUnicodeFromCString(dlg.m_HeaderMiddle); m_PrintSettings->SetHeaderStrCenter(uStr); if (uStr != nsnull) nsMemory::Free(uStr); uStr = GetUnicodeFromCString(dlg.m_HeaderRight); m_PrintSettings->SetHeaderStrRight(uStr); if (uStr != nsnull) nsMemory::Free(uStr); uStr = GetUnicodeFromCString(dlg.m_FooterLeft); m_PrintSettings->SetFooterStrLeft(uStr); if (uStr != nsnull) nsMemory::Free(uStr); uStr = GetUnicodeFromCString(dlg.m_FooterMiddle); m_PrintSettings->SetFooterStrCenter(uStr); if (uStr != nsnull) nsMemory::Free(uStr); uStr = GetUnicodeFromCString(dlg.m_FooterRight); m_PrintSettings->SetFooterStrRight(uStr); if (uStr != nsnull) nsMemory::Free(uStr); } } ///////////////////////////////////////////////////////////////////////////// void CBrowserView::OnUpdateFilePrint(CCmdUI* pCmdUI) { pCmdUI->Enable(!m_bCurrentlyPrinting); } // Called from the busy state related methods in the // BrowserFrameGlue object // // When aBusy is TRUE it means that browser is busy loading a URL // When aBusy is FALSE, it's done loading // We use this to update our STOP tool bar button // // We basically note this state into a member variable // The actual toolbar state will be updated in response to the // ON_UPDATE_COMMAND_UI method - OnUpdateNavStop() being called // void CBrowserView::UpdateBusyState(PRBool aBusy) { mbDocumentLoading = aBusy; } void CBrowserView::SetCtxMenuLinkUrl(nsAutoString& strLinkUrl) { mCtxMenuLinkUrl = strLinkUrl; } void CBrowserView::SetCtxMenuImageSrc(nsAutoString& strImgSrc) { mCtxMenuImgSrc = strImgSrc; } void CBrowserView::SetCurrentFrameURL(nsAutoString& strCurrentFrameURL) { mCtxMenuCurrentFrameURL = strCurrentFrameURL; } void CBrowserView::Activate(UINT nState, CWnd* pWndOther, BOOL bMinimized) { nsCOMPtr focus(do_GetInterface(mWebBrowser)); if(!focus) return; switch(nState) { case WA_ACTIVE: case WA_CLICKACTIVE: focus->Activate(); break; case WA_INACTIVE: focus->Deactivate(); break; default: break; } } void CBrowserView::ShowSecurityInfo() { HWND hParent = mpBrowserFrame->m_hWnd; if(m_SecurityState == SECURITY_STATE_INSECURE) { CString csMsg; csMsg.LoadString(IDS_NOSECURITY_INFO); ::MessageBox(hParent, csMsg, "MfcEmbed", MB_OK); return; } ::MessageBox(hParent, "To Be Done..........", "MfcEmbed", MB_OK); } // Determintes if the currently loaded document // contains frames // BOOL CBrowserView::ViewContentContainsFrames() { nsresult rv = NS_OK; // Get nsIDOMDocument from nsIWebNavigation nsCOMPtr domDoc; rv = mWebNav->GetDocument(getter_AddRefs(domDoc)); if(NS_FAILED(rv)) return FALSE; // QI nsIDOMDocument for nsIDOMHTMLDocument nsCOMPtr htmlDoc = do_QueryInterface(domDoc); if (!htmlDoc) return FALSE; // Get the element of the doc nsCOMPtr body; rv = htmlDoc->GetBody(getter_AddRefs(body)); if(NS_FAILED(rv)) return FALSE; // Is it of type nsIDOMHTMLFrameSetElement? nsCOMPtr frameset = do_QueryInterface(body); return (frameset != nsnull); } void CBrowserView::OnViewFrameSource() { USES_CONVERSION; // Build the view-source: url // nsCAutoString viewSrcUrl; viewSrcUrl.Append("view-source:"); viewSrcUrl.Append(W2T(mCtxMenuCurrentFrameURL.get())); OpenViewSourceWindow(viewSrcUrl.get()); } void CBrowserView::OnOpenFrameInNewWindow() { if(mCtxMenuCurrentFrameURL.Length()) OpenURLInNewWindow(mCtxMenuCurrentFrameURL.get()); }