]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/webview/webview.cpp
Update version to 2.9.4 in version.bkl too and rebake everything.
[wxWidgets.git] / samples / webview / webview.cpp
index 452cc699ed76cda53ee312fc12becd83ea1fdb04..325111fa0074f93cfe26cf7cb8a3856c7e9675bb 100644 (file)
@@ -6,7 +6,7 @@
 // Copyright:   (c) 2010 Marianne Gagnon, Steven Lamerton
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
+
 // ----------------------------------------------------------------------------
 // headers
 // ----------------------------------------------------------------------------
     #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<wxWebViewHistoryItem>(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();