X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/467d261e9dd430101119c76eb35aea43a31e7def..08670ea85abf4b4946a9ce64971b591d7b1ee30b:/samples/webview/webview.cpp diff --git a/samples/webview/webview.cpp b/samples/webview/webview.cpp index 452cc699ed..325111fa00 100644 --- a/samples/webview/webview.cpp +++ b/samples/webview/webview.cpp @@ -6,7 +6,7 @@ // Copyright: (c) 2010 Marianne Gagnon, Steven Lamerton // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// - + // ---------------------------------------------------------------------------- // headers // ---------------------------------------------------------------------------- @@ -22,6 +22,10 @@ #include "wx/wx.h" #endif +#if !wxUSE_WEBVIEW_WEBKIT && !wxUSE_WEBVIEW_IE +#error "A wxWebView backend is required by this sample" +#endif + #include "wx/artprov.h" #include "wx/notifmsg.h" #include "wx/settings.h" @@ -63,9 +67,10 @@ class WebFrame : public wxFrame { public: WebFrame(); + ~WebFrame(); - void OnAnimationTimer(wxTimerEvent& evt); void UpdateState(); + void OnIdle(wxIdleEvent& evt); void OnUrl(wxCommandEvent& evt); void OnBack(wxCommandEvent& evt); void OnForward(wxCommandEvent& evt); @@ -128,9 +133,6 @@ private: wxMenuItem* m_selection_clear; wxMenuItem* m_selection_delete; - wxTimer* m_timer; - int m_animation_angle; - wxInfoBar *m_info; wxStaticText* m_info_text; @@ -169,26 +171,22 @@ WebFrame::WebFrame() : wxFrame(NULL, wxID_ANY, "wxWebView Sample") SetIcon(wxICON(sample)); SetTitle("wxWebView Sample"); - m_timer = NULL; - m_animation_angle = 0; - - wxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL); // Create the toolbar m_toolbar = CreateToolBar(wxTB_TEXT); m_toolbar->SetToolBitmapSize(wxSize(32, 32)); - + wxBitmap back = wxArtProvider::GetBitmap(wxART_GO_BACK , wxART_TOOLBAR); wxBitmap forward = wxArtProvider::GetBitmap(wxART_GO_FORWARD , wxART_TOOLBAR); #ifdef __WXGTK__ wxBitmap stop = wxArtProvider::GetBitmap("gtk-stop", wxART_TOOLBAR); - #else + #else wxBitmap stop = wxBitmap(stop_xpm); #endif #ifdef __WXGTK__ wxBitmap refresh = wxArtProvider::GetBitmap("gtk-refresh", wxART_TOOLBAR); - #else + #else wxBitmap refresh = wxBitmap(refresh_xpm); #endif @@ -291,7 +289,7 @@ WebFrame::WebFrame() : wxFrame(NULL, wxID_ANY, "wxWebView Sample") Connect(m_toolbar_tools->GetId(), wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler(WebFrame::OnToolsClicked), NULL, this ); - Connect(m_url->GetId(), wxEVT_COMMAND_TEXT_ENTER, + Connect(m_url->GetId(), wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler(WebFrame::OnUrl), NULL, this ); // Connect the webview events @@ -300,7 +298,7 @@ WebFrame::WebFrame() : wxFrame(NULL, wxID_ANY, "wxWebView Sample") Connect(m_browser->GetId(), wxEVT_COMMAND_WEB_VIEW_NAVIGATED, wxWebViewEventHandler(WebFrame::OnNavigationComplete), NULL, this); Connect(m_browser->GetId(), wxEVT_COMMAND_WEB_VIEW_LOADED, - wxWebViewEventHandler(WebFrame::OnDocumentLoaded), NULL, this); + wxWebViewEventHandler(WebFrame::OnDocumentLoaded), NULL, this); Connect(m_browser->GetId(), wxEVT_COMMAND_WEB_VIEW_ERROR, wxWebViewEventHandler(WebFrame::OnError), NULL, this); Connect(m_browser->GetId(), wxEVT_COMMAND_WEB_VIEW_NEWWINDOW, @@ -351,40 +349,14 @@ WebFrame::WebFrame() : wxFrame(NULL, wxID_ANY, "wxWebView Sample") wxCommandEventHandler(WebFrame::OnSelectAll), NULL, this ); Connect(loadscheme->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WebFrame::OnLoadScheme), NULL, this ); + + //Connect the idle events + Connect(wxID_ANY, wxEVT_IDLE, wxIdleEventHandler(WebFrame::OnIdle), NULL, this); } -void WebFrame::OnAnimationTimer(wxTimerEvent& WXUNUSED(evt)) +WebFrame::~WebFrame() { - m_animation_angle += 15; - if (m_animation_angle > 360) m_animation_angle -= 360; - - wxBitmap image(24, 24); - { - wxMemoryDC dc; - dc.SelectObject(image); - dc.SetBackground(wxBrush(wxColour(255,0,255))); - dc.Clear(); - - if (m_animation_angle >= 0 && m_animation_angle <= 180) - { - dc.SetBrush(*wxYELLOW_BRUSH); - dc.SetPen(*wxYELLOW_PEN); - dc.DrawCircle(16 - int(sin(m_animation_angle*0.01745f /* convert to radians */)*14.0f), - 16 + int(cos(m_animation_angle*0.01745f /* convert to radians */)*14.0f), 3 ); - } - - dc.DrawBitmap(wxBitmap(wxlogo_xpm), 0, 0, true); - - if (m_animation_angle > 180) - { - dc.SetBrush(*wxYELLOW_BRUSH); - dc.SetPen(*wxYELLOW_PEN); - dc.DrawCircle(16 - int(sin(m_animation_angle*0.01745f /* convert to radians */)*14.0f), - 16 + int(cos(m_animation_angle*0.01745f /* convert to radians */)*14.0f), 3 ); - } - } - image.SetMask(new wxMask(image, wxColour(255,0,255))); - m_toolbar->SetToolNormalBitmap(m_toolbar_tools->GetId(), image); + delete m_tools_menu; } /** @@ -395,35 +367,41 @@ void WebFrame::UpdateState() { m_toolbar->EnableTool( m_toolbar_back->GetId(), m_browser->CanGoBack() ); m_toolbar->EnableTool( m_toolbar_forward->GetId(), m_browser->CanGoForward() ); - + if (m_browser->IsBusy()) { - if (m_timer == NULL) - { - m_timer = new wxTimer(this); - this->Connect(wxEVT_TIMER, wxTimerEventHandler(WebFrame::OnAnimationTimer), NULL, this); - } - m_timer->Start(100); // start animation timer - - m_toolbar->EnableTool( m_toolbar_stop->GetId(), true ); + m_toolbar->EnableTool( m_toolbar_stop->GetId(), true ); } else { - if (m_timer != NULL) m_timer->Stop(); // stop animation timer - m_toolbar->SetToolNormalBitmap(m_toolbar_tools->GetId(), wxBitmap(wxlogo_xpm)); - m_toolbar->EnableTool( m_toolbar_stop->GetId(), false ); + m_toolbar->EnableTool( m_toolbar_stop->GetId(), false ); } - + SetTitle( m_browser->GetCurrentTitle() ); m_url->SetValue( m_browser->GetCurrentURL() ); } +void WebFrame::OnIdle(wxIdleEvent& WXUNUSED(evt)) +{ + if(m_browser->IsBusy()) + { + wxSetCursor(wxCURSOR_ARROWWAIT); + m_toolbar->EnableTool(m_toolbar_stop->GetId(), true); + } + else + { + wxSetCursor(wxNullCursor); + m_toolbar->EnableTool(m_toolbar_stop->GetId(), false); + } +} + /** * Callback invoked when user entered an URL and pressed enter */ void WebFrame::OnUrl(wxCommandEvent& WXUNUSED(evt)) { m_browser->LoadURL( m_url->GetValue() ); + m_browser->SetFocus(); UpdateState(); } @@ -529,7 +507,7 @@ void WebFrame::OnNavigationRequest(wxWebViewEvent& evt) wxLogMessage("%s", "Navigation request to '" + evt.GetURL() + "' (target='" + evt.GetTarget() + "')"); - + wxASSERT(m_browser->IsBusy()); //If we don't want to handle navigation then veto the event and navigation @@ -537,9 +515,7 @@ void WebFrame::OnNavigationRequest(wxWebViewEvent& evt) if(!m_tools_handle_navigation->IsChecked()) { evt.Veto(); - if (m_timer != NULL) m_timer->Stop(); // stop animation timer - m_toolbar->SetToolNormalBitmap(m_toolbar_tools->GetId(), wxBitmap(wxlogo_xpm)); - m_toolbar->EnableTool( m_toolbar_stop->GetId(), false ); + m_toolbar->EnableTool( m_toolbar_stop->GetId(), false ); } else { @@ -576,7 +552,7 @@ void WebFrame::OnNewWindow(wxWebViewEvent& evt) { wxLogMessage("%s", "New window; url='" + evt.GetURL() + "'"); - //If we handle new window events then just load them in this window as we + //If we handle new window events then just load them in this window as we //are a single window browser if(m_tools_handle_new_window->IsChecked()) m_browser->LoadURL(evt.GetURL()); @@ -586,8 +562,8 @@ void WebFrame::OnNewWindow(wxWebViewEvent& evt) void WebFrame::OnTitleChanged(wxWebViewEvent& evt) { + SetTitle(evt.GetString()); wxLogMessage("%s", "Title changed; title='" + evt.GetString() + "'"); - UpdateState(); } /** @@ -608,7 +584,7 @@ void WebFrame::OnToolsClicked(wxCommandEvent& WXUNUSED(evt)) return; m_tools_tiny->Check(false); - m_tools_small->Check(false); + m_tools_small->Check(false); m_tools_medium->Check(false); m_tools_large->Check(false); m_tools_largest->Check(false); @@ -656,7 +632,8 @@ void WebFrame::OnToolsClicked(wxCommandEvent& WXUNUSED(evt)) wxMenuItem* item; - for(unsigned int i = 0; i < back.size(); i++) + unsigned int i; + for(i = 0; i < back.size(); i++) { item = m_tools_history_menu->AppendRadioItem(wxID_ANY, back[i]->GetTitle()); m_histMenuItems[item->GetId()] = back[i]; @@ -670,14 +647,14 @@ void WebFrame::OnToolsClicked(wxCommandEvent& WXUNUSED(evt)) //No need to connect the current item m_histMenuItems[item->GetId()] = wxSharedPtr(new wxWebViewHistoryItem(m_browser->GetCurrentURL(), m_browser->GetCurrentTitle())); - for(unsigned int i = 0; i < forward.size(); i++) + for(i = 0; i < forward.size(); i++) { item = m_tools_history_menu->AppendRadioItem(wxID_ANY, forward[i]->GetTitle()); m_histMenuItems[item->GetId()] = forward[i]; Connect(item->GetId(), wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler(WebFrame::OnHistory), NULL, this ); } - + wxPoint position = ScreenToClient( wxGetMousePosition() ); PopupMenu(m_tools_menu, position.x, position.y); } @@ -761,42 +738,42 @@ void WebFrame::OnError(wxWebViewEvent& evt) case wxWEB_NAV_ERR_CONNECTION: errorCategory = "wxWEB_NAV_ERR_CONNECTION"; break; - + case wxWEB_NAV_ERR_CERTIFICATE: errorCategory = "wxWEB_NAV_ERR_CERTIFICATE"; break; - + case wxWEB_NAV_ERR_AUTH: errorCategory = "wxWEB_NAV_ERR_AUTH"; break; - + case wxWEB_NAV_ERR_SECURITY: errorCategory = "wxWEB_NAV_ERR_SECURITY"; break; - + case wxWEB_NAV_ERR_NOT_FOUND: errorCategory = "wxWEB_NAV_ERR_NOT_FOUND"; break; - + case wxWEB_NAV_ERR_REQUEST: errorCategory = "wxWEB_NAV_ERR_REQUEST"; break; - + case wxWEB_NAV_ERR_USER_CANCELLED: errorCategory = "wxWEB_NAV_ERR_USER_CANCELLED"; break; - + case wxWEB_NAV_ERR_OTHER: errorCategory = "wxWEB_NAV_ERR_OTHER"; break; } - - wxLogMessage("Error; url='" + evt.GetURL() + "', error='" + errorCategory + "' (" + evt.GetString() + ")"); - + + wxLogMessage("%s", "Error; url='" + evt.GetURL() + "', error='" + errorCategory + "' (" + evt.GetString() + ")"); + //Show the info bar with an error m_info->ShowMessage(_("An error occurred loading ") + evt.GetURL() + "\n" + "'" + errorCategory + "' (" + evt.GetString() + ")", wxICON_ERROR); - + UpdateState(); } @@ -815,7 +792,7 @@ SourceViewDialog::SourceViewDialog(wxWindow* parent, wxString source) : { wxStyledTextCtrl* text = new wxStyledTextCtrl(this, wxID_ANY); text->SetMarginWidth(1, 30); - text->SetMarginType(1, wxSTC_MARGIN_NUMBER); + text->SetMarginType(1, wxSTC_MARGIN_NUMBER); text->SetText(source); text->StyleClearAll();