2009-01-10 Darin Adler <darin@apple.com>
[WebKit-https.git] / WebKit / wx / WebBrowserShell.cpp
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_EXIT,  wxWebBrowserShell::OnQuit)
71     EVT_MENU(wxID_ABOUT, wxWebBrowserShell::OnAbout)
72     EVT_MENU(ID_LOADFILE, wxWebBrowserShell::OnLoadFile)
73     EVT_TEXT_ENTER(ID_TEXTCTRL, wxWebBrowserShell::OnAddressBarEnter)
74     EVT_TEXT_ENTER(ID_SEARCHCTRL, wxWebBrowserShell::OnSearchCtrlEnter)
75     EVT_WEBVIEW_LOAD(ID_WEBVIEW, wxWebBrowserShell::OnLoadEvent)
76     EVT_WEBVIEW_BEFORE_LOAD(ID_WEBVIEW, wxWebBrowserShell::OnBeforeLoad)
77     EVT_MENU(ID_BACK, wxWebBrowserShell::OnBack)
78     EVT_MENU(ID_FORWARD, wxWebBrowserShell::OnForward)
79     EVT_MENU(ID_STOP, wxWebBrowserShell::OnStop)
80     EVT_MENU(ID_RELOAD, wxWebBrowserShell::OnReload)
81     EVT_MENU(ID_MAKE_TEXT_LARGER, wxWebBrowserShell::OnMakeTextLarger)
82     EVT_MENU(ID_MAKE_TEXT_SMALLER, wxWebBrowserShell::OnMakeTextSmaller)
83     EVT_MENU(ID_GET_SOURCE, wxWebBrowserShell::OnGetSource)
84     EVT_MENU(ID_SET_SOURCE, wxWebBrowserShell::OnSetSource)
85     EVT_MENU(ID_BROWSE, wxWebBrowserShell::OnBrowse)
86     EVT_MENU(ID_EDIT, wxWebBrowserShell::OnEdit)
87     EVT_MENU(ID_RUN_SCRIPT, wxWebBrowserShell::OnRunScript)
88 END_EVENT_TABLE()
89
90
91 wxWebBrowserShell::wxWebBrowserShell(const wxString& title) : 
92         wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(600, 500)),
93         m_checkBeforeLoad(false)
94 {
95
96     // create a menu bar
97     wxMenu *fileMenu = new wxMenu;
98     fileMenu->Append(ID_NEW_WINDOW, _T("New Window\tCTRL+N"));
99     fileMenu->Append(ID_LOADFILE, _T("Open File...\tCTRL+O"));
100     fileMenu->Append(ID_LOADURL, _("Open Location...\tCTRL+L"));
101     fileMenu->Append(wxID_EXIT, _T("E&xit\tAlt-X"), _T("Quit this program"));
102     
103     wxMenu *editMenu = new wxMenu;
104     editMenu->Append(wxID_CUT, _T("Cut\tCTRL+X"));
105     editMenu->Append(wxID_COPY, _T("Copy\tCTRL+C"));
106     editMenu->Append(wxID_PASTE, _T("Paste\tCTRL+V"));
107     
108     wxMenu* viewMenu = new wxMenu;
109     viewMenu->AppendRadioItem(ID_BROWSE, _("Browse"));
110     viewMenu->AppendRadioItem(ID_EDIT, _("Edit"));
111     viewMenu->AppendSeparator();
112     viewMenu->Append(ID_STOP, _("Stop"));
113     viewMenu->Append(ID_RELOAD, _("Reload Page"));
114     viewMenu->Append(ID_MAKE_TEXT_SMALLER, _("Make Text Smaller\tCTRL+-"));
115     viewMenu->Append(ID_MAKE_TEXT_LARGER, _("Make Text Bigger\tCTRL++"));
116     viewMenu->AppendSeparator();
117     viewMenu->Append(ID_GET_SOURCE, _("View Page Source"));
118     viewMenu->AppendSeparator();
119     
120     m_debugMenu = new wxMenu;
121     m_debugMenu->Append(ID_SET_SOURCE, _("Test SetPageSource"));
122     m_debugMenu->Append(ID_RUN_SCRIPT, _("Test RunScript"));
123
124     // the "About" item should be in the help menu
125     wxMenu *helpMenu = new wxMenu;
126     helpMenu->Append(wxID_ABOUT, _T("&About...\tF1"), _T("Show about dialog"));
127
128     // now append the freshly created menu to the menu bar...
129     wxMenuBar *menuBar = new wxMenuBar();
130     menuBar->Append(fileMenu, _T("&File"));
131     menuBar->Append(editMenu, _T("&Edit"));
132     menuBar->Append(viewMenu, _T("&View"));
133     menuBar->Append(helpMenu, _T("&Help"));
134
135     // ... and attach this menu bar to the frame
136     SetMenuBar(menuBar);
137     
138     wxToolBar* toolbar = CreateToolBar();
139     toolbar->SetToolBitmapSize(wxSize(32, 32));
140     
141     wxBitmap back = wxArtProvider::GetBitmap(wxART_GO_BACK, wxART_TOOLBAR, wxSize(32,32));
142     toolbar->AddTool(ID_BACK, back, wxT("Back"));
143     
144     wxBitmap forward = wxArtProvider::GetBitmap(wxART_GO_FORWARD, wxART_TOOLBAR, wxSize(32,32));
145     toolbar->AddTool(ID_FORWARD, forward, wxT("Next"));
146
147     addressBar = new wxTextCtrl(toolbar, ID_TEXTCTRL, _T(""), wxDefaultPosition, wxSize(400, -1), wxTE_PROCESS_ENTER);
148     toolbar->AddControl(addressBar);
149     
150     searchCtrl = new wxSearchCtrl(toolbar, ID_SEARCHCTRL, _("Search"), wxDefaultPosition, wxSize(200, -1), wxTE_PROCESS_ENTER);
151     toolbar->AddControl(searchCtrl);
152     toolbar->Realize();
153     
154     SetToolBar(toolbar);
155
156     // Create the wxWebView Window
157     webview = new wxWebView((wxWindow*)this, ID_WEBVIEW, wxDefaultPosition, wxSize(200, 200));
158     webview->SetBackgroundColour(*wxWHITE);
159
160     // create a status bar just for fun (by default with 1 pane only)
161     CreateStatusBar(2);
162 }
163
164 wxWebBrowserShell::~wxWebBrowserShell()
165 {
166     if (m_debugMenu && GetMenuBar()->FindMenu(_("&Debug")) == wxNOT_FOUND)
167         delete m_debugMenu;
168 }
169
170 void wxWebBrowserShell::ShowDebugMenu(bool show)
171 {
172     int debugMenu = GetMenuBar()->FindMenu(_("&Debug"));
173     if (show && debugMenu == wxNOT_FOUND) {
174         int prevMenu = GetMenuBar()->FindMenu(_("&View"));
175         if (prevMenu != wxNOT_FOUND)
176             GetMenuBar()->Insert((size_t)prevMenu+1, m_debugMenu, _("&Debug"));
177     }
178     else if (!show && debugMenu != wxNOT_FOUND) {
179         GetMenuBar()->Remove(debugMenu);
180     }
181 }
182
183 // event handlers
184
185 void wxWebBrowserShell::OnQuit(wxCommandEvent& WXUNUSED(event))
186 {
187     // true is to force the frame to close
188     Close(true);
189 }
190
191 void wxWebBrowserShell::OnAbout(wxCommandEvent& WXUNUSED(event))
192 {
193     wxString msg;
194     msg.Printf(_T("This is the About dialog of the wxWebKit sample.\n")
195                _T("Welcome to %s"), wxVERSION_STRING);
196
197     wxMessageBox(msg, _T("About wxWebKit Sample"), wxOK | wxICON_INFORMATION, this);
198
199 }
200
201 void wxWebBrowserShell::OnLoadFile(wxCommandEvent& WXUNUSED(event))
202 {
203     wxFileDialog* dialog = new wxFileDialog(this, wxT("Choose a file"));
204     if (dialog->ShowModal() == wxID_OK) {  
205         wxString path = dialog->GetPath().Prepend(wxT("file://"));
206         
207         if (webview)
208             webview->LoadURL(path);
209     }
210 }
211
212 void wxWebBrowserShell::OnLoadEvent(wxWebViewLoadEvent& event)
213 {
214     if (GetStatusBar() != NULL){
215         if (event.GetState() == wxWEBVIEW_LOAD_NEGOTIATING) {
216             GetStatusBar()->SetStatusText(_("Contacting ") + event.GetURL());
217         }
218         else if (event.GetState() == wxWEBVIEW_LOAD_TRANSFERRING) {
219             GetStatusBar()->SetStatusText(_("Loading ") + event.GetURL());
220         }
221         else if (event.GetState() == wxWEBVIEW_LOAD_ONLOAD_HANDLED) {
222             GetStatusBar()->SetStatusText(_("Load complete."));
223             addressBar->SetValue(event.GetURL());
224             SetTitle(webview->GetPageTitle());
225         }
226         else if (event.GetState() == wxWEBVIEW_LOAD_FAILED) {
227             GetStatusBar()->SetStatusText(_("Failed to load ") + event.GetURL());
228         }
229     }
230 }
231
232 void wxWebBrowserShell::OnBeforeLoad(wxWebViewBeforeLoadEvent& myEvent)
233 {
234     if (m_checkBeforeLoad) {
235         int reply = wxMessageBox(_("Would you like to continue loading ") + myEvent.GetURL() + wxT("?"), _("Continue Loading?"), wxYES_NO); 
236         if (reply == wxNO) {
237             myEvent.Cancel();
238         }
239     }
240 }
241
242 void wxWebBrowserShell::OnAddressBarEnter(wxCommandEvent& event)
243 {
244     if (webview)
245         webview->LoadURL(addressBar->GetValue());
246 }
247
248 void wxWebBrowserShell::OnSearchCtrlEnter(wxCommandEvent& event)
249 {
250     if (webview) {
251         webview->LoadURL(wxString::Format(wxT("http://www.google.com/search?rls=en&q=%s&ie=UTF-8&oe=UTF-8"), searchCtrl->GetValue().wc_str()));
252     }
253 }
254
255 void wxWebBrowserShell::OnBack(wxCommandEvent& event)
256 {
257     if (webview)
258         webview->GoBack();
259 }
260
261 void wxWebBrowserShell::OnForward(wxCommandEvent& event)
262 {
263     if (webview)
264         webview->GoForward();
265 }
266
267 void wxWebBrowserShell::OnStop(wxCommandEvent& myEvent)
268 {
269     if (webview)
270         webview->Stop();
271 }
272
273 void wxWebBrowserShell::OnReload(wxCommandEvent& myEvent)
274 {
275     if (webview)
276         webview->Reload();
277 }
278
279 void wxWebBrowserShell::OnMakeTextLarger(wxCommandEvent& myEvent)
280 {
281     if (webview) {
282         if (webview->CanIncreaseTextSize())
283             webview->IncreaseTextSize();
284     }
285 }
286
287 void wxWebBrowserShell::OnMakeTextSmaller(wxCommandEvent& myEvent)
288 {
289     if (webview) {
290         if (webview->CanDecreaseTextSize())
291             webview->DecreaseTextSize();
292     }
293 }
294
295 void wxWebBrowserShell::OnGetSource(wxCommandEvent& myEvent)
296 {
297     if (webview) {
298         wxPageSourceViewFrame* pageSourceFrame = new wxPageSourceViewFrame(webview->GetPageSource());
299         pageSourceFrame->Show();
300     }
301 }
302
303 void wxWebBrowserShell::OnSetSource(wxCommandEvent& event)
304 {
305     if (webview)
306         webview->SetPageSource(wxString(wxT("<p>Hello World!</p>")));
307 }
308
309 void wxWebBrowserShell::OnBrowse(wxCommandEvent& event)
310 {
311     if (webview)
312         webview->MakeEditable(!event.IsChecked());
313 }
314
315 void wxWebBrowserShell::OnEdit(wxCommandEvent& event)
316 {
317     if (webview)
318         webview->MakeEditable(event.IsChecked());
319 }
320
321 void wxWebBrowserShell::OnRunScript(wxCommandEvent& myEvent){
322     if (webview) {
323         wxTextEntryDialog* dialog = new wxTextEntryDialog(this, _("Type in a JavaScript to exectute."));
324         if (dialog->ShowModal() == wxID_OK)
325             wxMessageBox(wxT("Result is: ") + webview->RunScript(dialog->GetValue()));
326     
327         dialog->Destroy();
328     }
329 }