/* ***** BEGIN LICENSE BLOCK ***** * Version: Mozilla-sample-code 1.0 * * Copyright (c) 2002 Netscape Communications Corporation and * other contributors * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this Mozilla sample software and associated documentation files * (the "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to permit * persons to whom the Software is furnished to do so, subject to the * following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * * Contributor(s): * * ***** END LICENSE BLOCK ***** */ #include "global.h" #include "wx/strconv.h" #include "BrowserFrame.h" #include "nsIURI.h" BEGIN_EVENT_TABLE(BrowserFrame, GeckoFrame) // View menu EVT_MENU(XRCID("view_pagesource"), BrowserFrame::OnViewPageSource) EVT_UPDATE_UI(XRCID("view_pagesource"), BrowserFrame::OnUpdateViewPageSource) // Browser operations, back / forward etc. // TODO some of these can go in GeckoFrame EVT_MENU(XRCID("browse_back"), BrowserFrame::OnBrowserBack) EVT_UPDATE_UI(XRCID("browse_back"), BrowserFrame::OnUpdateBrowserBack) EVT_MENU(XRCID("browse_fwd"), BrowserFrame::OnBrowserForward) EVT_UPDATE_UI(XRCID("browse_fwd"), BrowserFrame::OnUpdateBrowserForward) EVT_MENU(XRCID("browse_reload"), BrowserFrame::OnBrowserReload) EVT_MENU(XRCID("browse_stop"), BrowserFrame::OnBrowserStop) EVT_UPDATE_UI(XRCID("browse_stop"), BrowserFrame::OnUpdateBrowserStop) EVT_MENU(XRCID("browse_home"), BrowserFrame::OnBrowserHome) EVT_BUTTON(XRCID("browser_go"), BrowserFrame::OnBrowserGo) EVT_TEXT_ENTER(XRCID("url"), BrowserFrame::OnBrowserUrl) EVT_MENU(XRCID("browser_open_in_new_window"), BrowserFrame::OnBrowserOpenLinkInNewWindow) END_EVENT_TABLE() BrowserFrame::BrowserFrame(wxWindow* aParent) { wxXmlResource::Get()->LoadFrame(this, aParent, wxT("browser_frame")); SetIcon(wxICON(appicon)); SetName("browser"); SetupDefaultGeckoWindow(); CreateStatusBar(); } nsresult BrowserFrame::LoadURI(const wchar_t *aURI) { if (mWebBrowser) { nsCOMPtr webNav = do_QueryInterface(mWebBrowser); if (webNav) { return webNav->LoadURI(aURI, nsIWebNavigation::LOAD_FLAGS_NONE, nsnull, nsnull, nsnull); } } return NS_ERROR_FAILURE; } nsresult BrowserFrame::LoadURI(const char *aURI) { wxMBConv conv; return LoadURI(conv.cWX2WC(aURI)); } /////////////////////////////////////////////////////////////////////////////// // Browser specific handlers void BrowserFrame::OnFileSave(wxCommandEvent & WXUNUSED(event)) { } void BrowserFrame::OnFilePrint(wxCommandEvent & WXUNUSED(event)) { } void BrowserFrame::OnViewPageSource(wxCommandEvent &event) { nsCOMPtr webNav = do_QueryInterface(mWebBrowser); if(!webNav) return; // Get the URI object whose source we want to view. nsresult rv = NS_OK; nsCOMPtr currentURI; rv = webNav->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 nsAutoString viewSrcUrl(L"view-source:"); viewSrcUrl.AppendWithConversion(uriString.get()); BrowserFrame *frame = new BrowserFrame(NULL); if (frame) { frame->Show(TRUE); frame->LoadURI(viewSrcUrl.get()); } } void BrowserFrame::OnUpdateViewPageSource(wxUpdateUIEvent &event) { } void BrowserFrame::OnBrowserGo(wxCommandEvent & WXUNUSED(event)) { wxTextCtrl *txtCtrl = (wxTextCtrl *) FindWindowById(XRCID("url"), this); wxString url = txtCtrl->GetValue(); if (!url.IsEmpty()) { LoadURI(url); } } void BrowserFrame::OnBrowserUrl(wxCommandEvent & event) { OnBrowserGo(event); } void BrowserFrame::OnBrowserBack(wxCommandEvent & WXUNUSED(event)) { if (mWebBrowser) { nsCOMPtr webNav = do_QueryInterface(mWebBrowser); webNav->GoBack(); } } void BrowserFrame::OnUpdateBrowserBack(wxUpdateUIEvent &event) { PRBool canGoBack = PR_FALSE; if (mWebBrowser) { nsCOMPtr webNav = do_QueryInterface(mWebBrowser); webNav->GetCanGoBack(&canGoBack); } event.Enable(canGoBack ? true : false); } void BrowserFrame::OnBrowserForward(wxCommandEvent & WXUNUSED(event)) { if (mWebBrowser) { nsCOMPtr webNav = do_QueryInterface(mWebBrowser); webNav->GoForward(); } } void BrowserFrame::OnUpdateBrowserForward(wxUpdateUIEvent &event) { PRBool canGoForward = PR_FALSE; if (mWebBrowser) { nsCOMPtr webNav = do_QueryInterface(mWebBrowser); webNav->GetCanGoForward(&canGoForward); } event.Enable(canGoForward ? true : false); } void BrowserFrame::OnBrowserReload(wxCommandEvent & WXUNUSED(event)) { if (mWebBrowser) { nsCOMPtr webNav = do_QueryInterface(mWebBrowser); webNav->Reload(nsIWebNavigation::LOAD_FLAGS_NONE); } } void BrowserFrame::OnBrowserStop(wxCommandEvent & WXUNUSED(event)) { if (mWebBrowser) { nsCOMPtr webNav = do_QueryInterface(mWebBrowser); webNav->Stop(nsIWebNavigation::STOP_ALL); } } void BrowserFrame::OnUpdateBrowserStop(wxUpdateUIEvent &event) { event.Enable(mBusy ? true : false); } void BrowserFrame::OnBrowserHome(wxCommandEvent & WXUNUSED(event)) { LoadURI("http://www.mozilla.org/projects/embedding/"); } void BrowserFrame::OnBrowserOpenLinkInNewWindow(wxCommandEvent & WXUNUSED(event)) { BrowserFrame* frame = new BrowserFrame(NULL); frame->Show(TRUE); frame->LoadURI(mContextLinkUrl.get()); } /////////////////////////////////////////////////////////////////////////////// // GeckoContainerUI overrides nsresult BrowserFrame::CreateBrowserWindow(PRUint32 aChromeFlags, nsIWebBrowserChrome *aParent, nsIWebBrowserChrome **aNewWindow) { // Create the main frame window BrowserFrame* frame = new BrowserFrame(NULL); if (!frame) return NS_ERROR_OUT_OF_MEMORY; frame->Show(TRUE); GeckoContainer *container = frame->mGeckoWnd->GetGeckoContainer(); return container->QueryInterface(NS_GET_IID(nsIWebBrowserChrome), (void **) aNewWindow); } void BrowserFrame::UpdateStatusBarText(const PRUnichar* aStatusText) { SetStatusText(aStatusText); } void BrowserFrame::UpdateCurrentURI() { if (mWebBrowser) { nsCOMPtr webNav = do_QueryInterface(mWebBrowser); nsCOMPtr currentURI; webNav->GetCurrentURI(getter_AddRefs(currentURI)); nsCAutoString spec; currentURI->GetSpec(spec); wxTextCtrl *txtCtrl = (wxTextCtrl *) FindWindowById(XRCID("url"), this); if (txtCtrl) { txtCtrl->SetValue(spec.get()); } } } #include "nsIDOMMouseEvent.h" void BrowserFrame::ShowContextMenu(PRUint32 aContextFlags, nsIContextMenuInfo *aContextMenuInfo) { nsCOMPtr event; aContextMenuInfo->GetMouseEvent(getter_AddRefs(event)); if (!event) { return; } mContextLinkUrl.SetLength(0); nsCOMPtr mouseEvent = do_QueryInterface(event); if (mouseEvent) { PRInt32 x, y; mouseEvent->GetScreenX(&x); mouseEvent->GetScreenY(&y); char *menuName = NULL; // CONTEXT_LINK // CONTEXT_IMAGE // CONTEXT_IMAGE | CONTEXT_LINK with as an ancestor // CONTEXT_INPUT // CONTEXT_INPUT | CONTEXT_IMAGE with type=image // CONTEXT_TEXT