1///////////////////////////////////////////////////////////////////////////// 2// Name: htmlctrl.cpp 3// Purpose: HtmlCtrl sample 4// Author: Julian Smart / Kevin Ollivier 5// Modified by: 6// Created: 04/16/2004 7// RCS-ID: $Id: htmlctrl.cpp 29332 2004-09-24 23:18:16Z RN $ 8// Copyright: (c) Julian Smart / Kevin Ollivier 9// Licence: wxWindows licence 10///////////////////////////////////////////////////////////////////////////// 11 12// ============================================================================ 13// declarations 14// ============================================================================ 15 16// ---------------------------------------------------------------------------- 17// headers 18// ---------------------------------------------------------------------------- 19 20// For compilers that support precompilation, includes "wx/wx.h". 21#include "wx/wxprec.h" 22 23#ifdef __BORLANDC__ 24 #pragma hdrstop 25#endif 26 27// for all others, include the necessary headers (this file is usually all you 28// need because it includes almost all "standard" wxWidgets headers) 29#ifndef WX_PRECOMP 30 #include "wx/wx.h" 31#endif 32 33#include "wx/html/webkit.h" 34 35// ---------------------------------------------------------------------------- 36// resources 37// ---------------------------------------------------------------------------- 38 39enum { 40 ID_BACK = wxID_HIGHEST + 1, 41 ID_NEXT = wxID_HIGHEST + 2, 42 ID_RELOAD = wxID_HIGHEST + 3, 43 ID_URLLIST = wxID_HIGHEST + 4, 44 ID_STOP = wxID_HIGHEST + 5, 45 ID_WEBKIT = wxID_HIGHEST + 6, 46 ID_VIEW_SOURCE = wxID_HIGHEST + 7, 47 ID_OPEN = wxID_HIGHEST + 8, 48 ID_SAVE = wxID_HIGHEST + 9, 49 ID_SET_SOURCE = wxID_HIGHEST + 10 50 }; 51 52// ---------------------------------------------------------------------------- 53// private classes 54// ---------------------------------------------------------------------------- 55 56// Define a new application type, each program should derive a class from wxApp 57class MyApp : public wxApp 58{ 59public: 60 // override base class virtuals 61 // ---------------------------- 62 63 // this one is called on application startup and is a good place for the app 64 // initialization (doing it here and not in the ctor allows to have an error 65 // return: if OnInit() returns false, the application terminates) 66 virtual bool OnInit(); 67}; 68 69// Define a new frame type: this is going to be our main frame 70class MyFrame : public wxFrame 71{ 72public: 73 // ctor(s) 74 MyFrame(const wxString& title); 75 void OnBackButton(wxCommandEvent& myEvent); 76 void OnNextButton(wxCommandEvent& myEvent); 77 void OnURLEnter(wxCommandEvent& myEvent); 78 void OnStopButton(wxCommandEvent& myEvent); 79 void OnReloadButton(wxCommandEvent& myEvent); 80 void OnViewSource(wxCommandEvent& myEvent); 81 void OnSetSource(wxCommandEvent& myEvent); 82 void OnStateChanged(wxWebKitStateChangedEvent& myEvent); 83 wxWebKitCtrl* mySafari; 84 wxTextCtrl* urlText; 85private: 86 // any class wishing to process wxWidgets events must use this macro 87 DECLARE_EVENT_TABLE() 88}; 89 90// ---------------------------------------------------------------------------- 91// event tables and other macros for wxWidgets 92// ---------------------------------------------------------------------------- 93 94// the event tables connect the wxWidgets events with the functions (event 95// handlers) which process them. It can be also done at run-time, but for the 96// simple menu events like this the static method is much simpler. 97BEGIN_EVENT_TABLE(MyFrame, wxFrame) 98 EVT_BUTTON(ID_BACK, MyFrame::OnBackButton) 99 EVT_BUTTON(ID_NEXT, MyFrame::OnNextButton) 100 EVT_BUTTON(ID_STOP, MyFrame::OnStopButton) 101 EVT_BUTTON(ID_RELOAD, MyFrame::OnReloadButton) 102 EVT_MENU(ID_VIEW_SOURCE, MyFrame::OnViewSource) 103 EVT_MENU(ID_SET_SOURCE, MyFrame::OnSetSource) 104 EVT_TEXT_ENTER(ID_URLLIST, MyFrame::OnURLEnter) 105 EVT_WEBKIT_STATE_CHANGED(MyFrame::OnStateChanged) 106 //EVT_MENU(Minimal_Quit, MyFrame::OnQuit) 107 //EVT_MENU(Minimal_About, MyFrame::OnAbout) 108END_EVENT_TABLE() 109 110// Create a new application object: this macro will allow wxWidgets to create 111// the application object during program execution (it's better than using a 112// static object for many reasons) and also implements the accessor function 113// wxGetApp() which will return the reference of the right type (i.e. MyApp and 114// not wxApp) 115IMPLEMENT_APP(MyApp) 116 117// ============================================================================ 118// implementation 119// ============================================================================ 120 121// ---------------------------------------------------------------------------- 122// the application class 123// ---------------------------------------------------------------------------- 124 125// 'Main program' equivalent: the program execution "starts" here 126bool MyApp::OnInit() 127{ 128 // create the main application window 129 MyFrame *frame = new MyFrame(_T("wxWebKit Sample")); 130 131 // and show it (the frames, unlike simple controls, are not shown when 132 // created initially) 133 frame->Show(true); 134 135 // success: wxApp::OnRun() will be called which will enter the main message 136 // loop and the application will run. If we returned false here, the 137 // application would exit immediately. 138 return true; 139} 140 141// ---------------------------------------------------------------------------- 142// main frame 143// ---------------------------------------------------------------------------- 144 145// frame constructor 146MyFrame::MyFrame(const wxString& title) 147 : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(500,500)) 148{ 149 wxMenuBar* myBar = new wxMenuBar(); 150 wxMenu* fileMenu = new wxMenu; 151 fileMenu->Append(ID_OPEN, _("&Open")); 152 fileMenu->Append(ID_SAVE, _("&Save")); 153 myBar->Append(fileMenu, _("&File")); 154 155 wxMenu* editMenu = new wxMenu; 156 editMenu->Append(ID_SET_SOURCE, _("Set Page Source")); 157 myBar->Append(editMenu, _("&Edit")); 158 159 //wxMenu* viewMenu = new wxMenu(_("View")); 160 //viewMenu->Append(ID_VIEW_SOURCE, _("View Source")); 161 //myBar->Append(viewMenu, _("View")); 162 163 SetMenuBar(myBar); 164 165 wxToolBar* myToolbar = CreateToolBar(); 166 wxButton* btnBack = new wxButton(myToolbar, ID_BACK, _("Back")); 167 myToolbar->AddControl(btnBack); 168 myToolbar->AddSeparator(); 169 wxButton* btnNext = new wxButton(myToolbar, ID_NEXT, _("Next")); 170 myToolbar->AddControl(btnNext); 171 myToolbar->AddSeparator(); 172 wxButton* btnStop = new wxButton(myToolbar, ID_STOP, _("Stop")); 173 myToolbar->AddControl(btnStop); 174 myToolbar->AddSeparator(); 175 wxButton* btnReload = new wxButton(myToolbar, ID_RELOAD, _("Reload")); 176 myToolbar->AddControl(btnReload); 177 myToolbar->AddSeparator(); 178 urlText = new wxTextCtrl(myToolbar, ID_URLLIST, _T("http://www.wxwidgets.org"), wxDefaultPosition, wxSize(220, -1), wxTE_PROCESS_ENTER); 179 myToolbar->AddControl(urlText); 180 myToolbar->AddSeparator(); 181 myToolbar->Realize(); 182 183 // Testing wxWebKitCtrl inside a panel 184#if 1 185 wxPanel* panel = new wxPanel(this, wxID_ANY); 186 187 wxBoxSizer* boxSizer = new wxBoxSizer(wxVERTICAL); 188 panel->SetSizer(boxSizer); 189 190 mySafari = new wxWebKitCtrl(panel, ID_WEBKIT, _T("http://www.wxwidgets.org"), wxDefaultPosition, wxSize(200, 200)); 191 192 boxSizer->Add(mySafari, 1, wxEXPAND); 193 194 wxBoxSizer* frameSizer = new wxBoxSizer(wxVERTICAL); 195 SetSizer(frameSizer); 196 frameSizer->Add(panel, 1, wxEXPAND); 197#else 198 mySafari = new wxWebKitCtrl(this, ID_WEBKIT, _T("http://www.wxwidgets.org"), wxDefaultPosition, wxSize(200, 200)); 199#endif 200 201#if wxUSE_STATUSBAR 202 CreateStatusBar(2); 203#endif // wxUSE_STATUSBAR 204} 205 206void MyFrame::OnBackButton(wxCommandEvent& myEvent){ 207 if (mySafari->CanGoBack()) 208 mySafari->GoBack(); 209} 210 211void MyFrame::OnNextButton(wxCommandEvent& myEvent){ 212 if (mySafari->CanGoForward()) 213 mySafari->GoForward(); 214} 215 216void MyFrame::OnStopButton(wxCommandEvent& myEvent){ 217 mySafari->Stop(); 218} 219 220void MyFrame::OnReloadButton(wxCommandEvent& myEvent){ 221 mySafari->Reload(); 222} 223 224void MyFrame::OnURLEnter(wxCommandEvent& myEvent){ 225 mySafari->LoadURL(urlText->GetValue()); 226} 227 228void MyFrame::OnStateChanged(wxWebKitStateChangedEvent& myEvent){ 229 if (GetStatusBar() != NULL){ 230 if (myEvent.GetState() == wxWEBKIT_STATE_NEGOTIATING){ 231 GetStatusBar()->SetStatusText(_("Contacting ") + myEvent.GetURL()); 232 urlText->SetValue(myEvent.GetURL()); 233 } 234 else if (myEvent.GetState() == wxWEBKIT_STATE_TRANSFERRING){ 235 GetStatusBar()->SetStatusText(_("Loading ") + myEvent.GetURL()); 236 } 237 else if (myEvent.GetState() == wxWEBKIT_STATE_STOP){ 238 GetStatusBar()->SetStatusText(_("Load complete.")); 239 SetTitle(mySafari->GetTitle()); 240 } 241 else if (myEvent.GetState() == wxWEBKIT_STATE_FAILED){ 242 GetStatusBar()->SetStatusText(_("Failed to load ") + myEvent.GetURL()); 243 } 244 } 245 246} 247 248void MyFrame::OnViewSource(wxCommandEvent& myEvent){ 249 if (mySafari->CanGetPageSource()) 250 wxMessageBox(mySafari->GetPageSource()); 251} 252 253void MyFrame::OnSetSource(wxCommandEvent& myEvent){ 254 if (mySafari){ 255 wxString myText = wxT("<HTML><HEAD></HEAD><BODY><P>Hello world!</P></BODY></HTML>"); 256 mySafari->SetPageSource(myText); 257 } 258} 259