// 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"
{
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);
wxMenuItem* m_selection_clear;
wxMenuItem* m_selection_delete;
- wxTimer* m_timer;
- int m_animation_angle;
-
wxInfoBar *m_info;
wxStaticText* m_info_text;
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
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
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,
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;
}
/**
{
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();
}
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
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
{
{
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());
void WebFrame::OnTitleChanged(wxWebViewEvent& evt)
{
+ SetTitle(evt.GetString());
wxLogMessage("%s", "Title changed; title='" + evt.GetString() + "'");
- UpdateState();
}
/**
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);
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];
//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);
}
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();
}
{
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();