Home | History | Annotate | Download | only in wx
      1 /*
      2  * Copyright (C) 2007 Kevin Ollivier  All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  *
     25  * This class provides a default new window implementation for wxWebView clients
     26  * who don't want/need to roll their own browser frame UI.
     27  */
     28 
     29 #include "config.h"
     30 
     31 #include "wx/wxprec.h"
     32 #ifndef WX_PRECOMP
     33     #include "wx/wx.h"
     34 #endif
     35 
     36 #include "wx/artprov.h"
     37 
     38 #include "WebView.h"
     39 #include "WebBrowserShell.h"
     40 #include "WebViewPrivate.h"
     41 
     42 wxPageSourceViewFrame::wxPageSourceViewFrame(const wxString& source)
     43         : wxFrame(NULL, wxID_ANY, _("Page Source View"), wxDefaultPosition, wxSize(600, 500))
     44 {
     45     wxTextCtrl* control = new wxTextCtrl(this, -1, source, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);
     46 }
     47 
     48 enum {
     49     ID_LOADFILE = wxID_HIGHEST + 1,
     50     ID_TEXTCTRL = wxID_HIGHEST + 2,
     51     ID_BACK = wxID_HIGHEST + 3,
     52     ID_FORWARD = wxID_HIGHEST + 4,
     53     ID_TOGGLE_BEFORE_LOAD = wxID_HIGHEST + 5,
     54     ID_MAKE_TEXT_LARGER = wxID_HIGHEST + 6,
     55     ID_MAKE_TEXT_SMALLER = wxID_HIGHEST + 7,
     56     ID_STOP = wxID_HIGHEST + 8,
     57     ID_RELOAD = wxID_HIGHEST + 9,
     58     ID_GET_SOURCE = wxID_HIGHEST + 10,
     59     ID_SET_SOURCE = wxID_HIGHEST + 11,
     60     ID_SEARCHCTRL = wxID_HIGHEST + 12,
     61     ID_LOADURL = wxID_HIGHEST + 13,
     62     ID_NEW_WINDOW = wxID_HIGHEST + 14,
     63     ID_BROWSE = wxID_HIGHEST + 15,
     64     ID_EDIT = wxID_HIGHEST + 16,
     65     ID_RUN_SCRIPT = wxID_HIGHEST + 17,
     66     ID_WEBVIEW = wxID_HIGHEST + 18
     67 };
     68 
     69 BEGIN_EVENT_TABLE(wxWebBrowserShell, wxFrame)
     70     EVT_MENU(wxID_CUT, wxWebBrowserShell::OnCut)
     71     EVT_MENU(wxID_COPY, wxWebBrowserShell::OnCopy)
     72     EVT_MENU(wxID_PASTE, wxWebBrowserShell::OnPaste)
     73     EVT_MENU(wxID_EXIT,  wxWebBrowserShell::OnQuit)
     74     EVT_MENU(wxID_ABOUT, wxWebBrowserShell::OnAbout)
     75     EVT_MENU(ID_LOADFILE, wxWebBrowserShell::OnLoadFile)
     76     EVT_TEXT_ENTER(ID_TEXTCTRL, wxWebBrowserShell::OnAddressBarEnter)
     77     EVT_TEXT_ENTER(ID_SEARCHCTRL, wxWebBrowserShell::OnSearchCtrlEnter)
     78     EVT_WEBVIEW_LOAD(ID_WEBVIEW, wxWebBrowserShell::OnLoadEvent)
     79     EVT_WEBVIEW_BEFORE_LOAD(ID_WEBVIEW, wxWebBrowserShell::OnBeforeLoad)
     80     EVT_MENU(ID_BACK, wxWebBrowserShell::OnBack)
     81     EVT_MENU(ID_FORWARD, wxWebBrowserShell::OnForward)
     82     EVT_MENU(ID_STOP, wxWebBrowserShell::OnStop)
     83     EVT_MENU(ID_RELOAD, wxWebBrowserShell::OnReload)
     84     EVT_MENU(ID_MAKE_TEXT_LARGER, wxWebBrowserShell::OnMakeTextLarger)
     85     EVT_MENU(ID_MAKE_TEXT_SMALLER, wxWebBrowserShell::OnMakeTextSmaller)
     86     EVT_MENU(ID_GET_SOURCE, wxWebBrowserShell::OnGetSource)
     87     EVT_MENU(ID_SET_SOURCE, wxWebBrowserShell::OnSetSource)
     88     EVT_MENU(ID_BROWSE, wxWebBrowserShell::OnBrowse)
     89     EVT_MENU(ID_EDIT, wxWebBrowserShell::OnEdit)
     90     EVT_MENU(ID_RUN_SCRIPT, wxWebBrowserShell::OnRunScript)
     91 END_EVENT_TABLE()
     92 
     93 
     94 wxWebBrowserShell::wxWebBrowserShell(const wxString& title) :
     95         wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(600, 500)),
     96         m_checkBeforeLoad(false)
     97 {
     98 
     99     // create a menu bar
    100     wxMenu *fileMenu = new wxMenu;
    101     fileMenu->Append(ID_NEW_WINDOW, _T("New Window\tCTRL+N"));
    102     fileMenu->Append(ID_LOADFILE, _T("Open File...\tCTRL+O"));
    103     fileMenu->Append(ID_LOADURL, _("Open Location...\tCTRL+L"));
    104     fileMenu->Append(wxID_EXIT, _T("E&xit\tAlt-X"), _T("Quit this program"));
    105 
    106     wxMenu *editMenu = new wxMenu;
    107     editMenu->Append(wxID_CUT, _T("Cut\tCTRL+X"));
    108     editMenu->Append(wxID_COPY, _T("Copy\tCTRL+C"));
    109     editMenu->Append(wxID_PASTE, _T("Paste\tCTRL+V"));
    110 
    111     wxMenu* viewMenu = new wxMenu;
    112     viewMenu->AppendRadioItem(ID_BROWSE, _("Browse"));
    113     viewMenu->AppendRadioItem(ID_EDIT, _("Edit"));
    114     viewMenu->AppendSeparator();
    115     viewMenu->Append(ID_STOP, _("Stop"));
    116     viewMenu->Append(ID_RELOAD, _("Reload Page"));
    117     viewMenu->Append(ID_MAKE_TEXT_SMALLER, _("Make Text Smaller\tCTRL+-"));
    118     viewMenu->Append(ID_MAKE_TEXT_LARGER, _("Make Text Bigger\tCTRL++"));
    119     viewMenu->AppendSeparator();
    120     viewMenu->Append(ID_GET_SOURCE, _("View Page Source"));
    121     viewMenu->AppendSeparator();
    122 
    123     m_debugMenu = new wxMenu;
    124     m_debugMenu->Append(ID_SET_SOURCE, _("Test SetPageSource"));
    125     m_debugMenu->Append(ID_RUN_SCRIPT, _("Test RunScript"));
    126 
    127     // the "About" item should be in the help menu
    128     wxMenu *helpMenu = new wxMenu;
    129     helpMenu->Append(wxID_ABOUT, _T("&About...\tF1"), _T("Show about dialog"));
    130 
    131     // now append the freshly created menu to the menu bar...
    132     wxMenuBar *menuBar = new wxMenuBar();
    133     menuBar->Append(fileMenu, _T("&File"));
    134     menuBar->Append(editMenu, _T("&Edit"));
    135     menuBar->Append(viewMenu, _T("&View"));
    136     menuBar->Append(helpMenu, _T("&Help"));
    137 
    138     // ... and attach this menu bar to the frame
    139     SetMenuBar(menuBar);
    140 
    141     wxToolBar* toolbar = CreateToolBar();
    142     toolbar->SetToolBitmapSize(wxSize(32, 32));
    143 
    144     wxBitmap back = wxArtProvider::GetBitmap(wxART_GO_BACK, wxART_TOOLBAR, wxSize(32,32));
    145     toolbar->AddTool(ID_BACK, back, wxT("Back"));
    146 
    147     wxBitmap forward = wxArtProvider::GetBitmap(wxART_GO_FORWARD, wxART_TOOLBAR, wxSize(32,32));
    148     toolbar->AddTool(ID_FORWARD, forward, wxT("Next"));
    149 
    150     addressBar = new wxTextCtrl(toolbar, ID_TEXTCTRL, _T(""), wxDefaultPosition, wxSize(400, -1), wxTE_PROCESS_ENTER);
    151     toolbar->AddControl(addressBar);
    152 
    153     searchCtrl = new wxSearchCtrl(toolbar, ID_SEARCHCTRL, _("Search"), wxDefaultPosition, wxSize(200, -1), wxTE_PROCESS_ENTER);
    154     toolbar->AddControl(searchCtrl);
    155     toolbar->Realize();
    156 
    157     SetToolBar(toolbar);
    158 
    159     // Create the wxWebView Window
    160     webview = new wxWebView((wxWindow*)this, ID_WEBVIEW, wxDefaultPosition, wxSize(200, 200));
    161     webview->SetBackgroundColour(*wxWHITE);
    162 
    163     // create a status bar just for fun (by default with 1 pane only)
    164     CreateStatusBar(2);
    165 }
    166 
    167 wxWebBrowserShell::~wxWebBrowserShell()
    168 {
    169     if (m_debugMenu && GetMenuBar()->FindMenu(_("&Debug")) == wxNOT_FOUND)
    170         delete m_debugMenu;
    171 }
    172 
    173 void wxWebBrowserShell::ShowDebugMenu(bool show)
    174 {
    175     int debugMenu = GetMenuBar()->FindMenu(_("&Debug"));
    176     if (show && debugMenu == wxNOT_FOUND) {
    177         int prevMenu = GetMenuBar()->FindMenu(_("&View"));
    178         if (prevMenu != wxNOT_FOUND)
    179             GetMenuBar()->Insert((size_t)prevMenu+1, m_debugMenu, _("&Debug"));
    180     }
    181     else if (!show && debugMenu != wxNOT_FOUND) {
    182         GetMenuBar()->Remove(debugMenu);
    183     }
    184 }
    185 
    186 // event handlers
    187 
    188 void wxWebBrowserShell::OnQuit(wxCommandEvent& WXUNUSED(event))
    189 {
    190     // true is to force the frame to close
    191     Close(true);
    192 }
    193 
    194 void wxWebBrowserShell::OnAbout(wxCommandEvent& WXUNUSED(event))
    195 {
    196     wxString msg;
    197     msg.Printf(_T("This is the About dialog of the wxWebKit sample.\n")
    198                _T("Welcome to %s"), wxVERSION_STRING);
    199 
    200     wxMessageBox(msg, _T("About wxWebKit Sample"), wxOK | wxICON_INFORMATION, this);
    201 
    202 }
    203 
    204 void wxWebBrowserShell::OnLoadFile(wxCommandEvent& WXUNUSED(event))
    205 {
    206     wxFileDialog* dialog = new wxFileDialog(this, wxT("Choose a file"));
    207     if (dialog->ShowModal() == wxID_OK) {
    208         wxString path = dialog->GetPath().Prepend(wxT("file://"));
    209 
    210         if (webview)
    211             webview->LoadURL(path);
    212     }
    213 }
    214 
    215 void wxWebBrowserShell::OnLoadEvent(wxWebViewLoadEvent& event)
    216 {
    217     if (GetStatusBar() != NULL){
    218         if (event.GetState() == wxWEBVIEW_LOAD_NEGOTIATING) {
    219             GetStatusBar()->SetStatusText(_("Contacting ") + event.GetURL());
    220         }
    221         else if (event.GetState() == wxWEBVIEW_LOAD_TRANSFERRING) {
    222             GetStatusBar()->SetStatusText(_("Loading ") + event.GetURL());
    223         }
    224         else if (event.GetState() == wxWEBVIEW_LOAD_ONLOAD_HANDLED) {
    225             GetStatusBar()->SetStatusText(_("Load complete."));
    226             addressBar->SetValue(event.GetURL());
    227             SetTitle(webview->GetPageTitle());
    228         }
    229         else if (event.GetState() == wxWEBVIEW_LOAD_FAILED) {
    230             GetStatusBar()->SetStatusText(_("Failed to load ") + event.GetURL());
    231         }
    232     }
    233 }
    234 
    235 void wxWebBrowserShell::OnBeforeLoad(wxWebViewBeforeLoadEvent& myEvent)
    236 {
    237     if (m_checkBeforeLoad) {
    238         int reply = wxMessageBox(_("Would you like to continue loading ") + myEvent.GetURL() + wxT("?"), _("Continue Loading?"), wxYES_NO);
    239         if (reply == wxNO) {
    240             myEvent.Cancel();
    241         }
    242     }
    243 }
    244 
    245 void wxWebBrowserShell::OnAddressBarEnter(wxCommandEvent& event)
    246 {
    247     if (webview)
    248         webview->LoadURL(addressBar->GetValue());
    249 }
    250 
    251 void wxWebBrowserShell::OnSearchCtrlEnter(wxCommandEvent& event)
    252 {
    253     if (webview) {
    254         webview->LoadURL(wxString::Format(wxT("http://www.google.com/search?rls=en&q=%s&ie=UTF-8&oe=UTF-8"), searchCtrl->GetValue().wc_str()));
    255     }
    256 }
    257 
    258 void wxWebBrowserShell::OnCut(wxCommandEvent& event)
    259 {
    260     if (webview && webview->CanCut())
    261         webview->Cut();
    262 }
    263 
    264 void wxWebBrowserShell::OnCopy(wxCommandEvent& event)
    265 {
    266     if (webview && webview->CanCopy())
    267         webview->Copy();
    268 }
    269 
    270 void wxWebBrowserShell::OnPaste(wxCommandEvent& event)
    271 {
    272     if (webview && webview->CanPaste())
    273         webview->Paste();
    274 }
    275 
    276 void wxWebBrowserShell::OnBack(wxCommandEvent& event)
    277 {
    278     if (webview)
    279         webview->GoBack();
    280 }
    281 
    282 void wxWebBrowserShell::OnForward(wxCommandEvent& event)
    283 {
    284     if (webview)
    285         webview->GoForward();
    286 }
    287 
    288 void wxWebBrowserShell::OnStop(wxCommandEvent& myEvent)
    289 {
    290     if (webview)
    291         webview->Stop();
    292 }
    293 
    294 void wxWebBrowserShell::OnReload(wxCommandEvent& myEvent)
    295 {
    296     if (webview)
    297         webview->Reload();
    298 }
    299 
    300 void wxWebBrowserShell::OnMakeTextLarger(wxCommandEvent& myEvent)
    301 {
    302     if (webview) {
    303         if (webview->CanIncreaseTextSize())
    304             webview->IncreaseTextSize();
    305     }
    306 }
    307 
    308 void wxWebBrowserShell::OnMakeTextSmaller(wxCommandEvent& myEvent)
    309 {
    310     if (webview) {
    311         if (webview->CanDecreaseTextSize())
    312             webview->DecreaseTextSize();
    313     }
    314 }
    315 
    316 void wxWebBrowserShell::OnGetSource(wxCommandEvent& myEvent)
    317 {
    318     if (webview) {
    319         wxPageSourceViewFrame* pageSourceFrame = new wxPageSourceViewFrame(webview->GetPageSource());
    320         pageSourceFrame->Show();
    321     }
    322 }
    323 
    324 void wxWebBrowserShell::OnSetSource(wxCommandEvent& event)
    325 {
    326     if (webview)
    327         webview->SetPageSource(wxString(wxT("<p>Hello World!</p>")));
    328 }
    329 
    330 void wxWebBrowserShell::OnBrowse(wxCommandEvent& event)
    331 {
    332     if (webview)
    333         webview->MakeEditable(!event.IsChecked());
    334 }
    335 
    336 void wxWebBrowserShell::OnEdit(wxCommandEvent& event)
    337 {
    338     if (webview)
    339         webview->MakeEditable(event.IsChecked());
    340 }
    341 
    342 void wxWebBrowserShell::OnRunScript(wxCommandEvent& myEvent){
    343     if (webview) {
    344         wxTextEntryDialog* dialog = new wxTextEntryDialog(this, _("Type in a JavaScript to exectute."));
    345         if (dialog->ShowModal() == wxID_OK)
    346             wxMessageBox(wxT("Result is: ") + webview->RunScript(dialog->GetValue()));
    347 
    348         dialog->Destroy();
    349     }
    350 }
    351