]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/html/test/test.cpp
wxHtmlWindow background drawing fixes for OS X and optimizations
[wxWidgets.git] / samples / html / test / test.cpp
index d9e8cd3c22eb56f1e309889152af2316eb28774b..6931da1ba3e11aaf5f75907ac6a3736b42529c50 100644 (file)
@@ -8,11 +8,6 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#if defined(__GNUG__) && !defined(__APPLE__)
-    #pragma implementation "test.cpp"
-    #pragma interface "test.cpp"
-#endif
-
 // For compilers that support precompilation, includes "wx/wx.h".
 #include "wx/wxprec.h"
 
@@ -21,7 +16,7 @@
 #endif
 
 // For all others, include the necessary headers (this file is usually all you
-// need because it includes almost all "standard" wxWindows headers
+// need because it includes almost all "standard" wxWidgets headers
 #ifndef WX_PRECOMP
     #include "wx/wx.h"
 #endif
 #include "wx/html/htmlproc.h"
 #include "wx/fs_inet.h"
 #include "wx/filedlg.h"
+#include "wx/utils.h"
+#include "wx/clipbrd.h"
+#include "wx/dataobj.h"
+#include "wx/stopwatch.h"
+
+#include "../../sample.xpm"
 
 // ----------------------------------------------------------------------------
 // private classes
@@ -44,6 +45,39 @@ public:
     virtual bool OnInit();
 };
 
+// Define a new html window type: this is a wrapper for handling wxHtmlWindow events
+class MyHtmlWindow : public wxHtmlWindow
+{
+public:
+    MyHtmlWindow(wxWindow *parent) : wxHtmlWindow( parent )
+    {
+        // no custom background initially to avoid confusing people
+        m_drawCustomBg = false;
+    }
+
+    virtual wxHtmlOpeningStatus OnOpeningURL(wxHtmlURLType WXUNUSED(type),
+                                             const wxString& WXUNUSED(url),
+                                             wxString *WXUNUSED(redirect)) const;
+
+    // toggle drawing of custom background
+    void DrawCustomBg(bool draw)
+    {
+        m_drawCustomBg = draw;
+        Refresh();
+    }
+
+private:
+#if wxUSE_CLIPBOARD
+    void OnClipboardEvent(wxClipboardTextEvent& event);
+#endif // wxUSE_CLIPBOARD
+    void OnEraseBgEvent(wxEraseEvent& event);
+
+    bool m_drawCustomBg;
+
+    DECLARE_EVENT_TABLE()
+    wxDECLARE_NO_COPY_CLASS(MyHtmlWindow);
+};
+
 // Define a new frame type: this is going to be our main frame
 class MyFrame : public wxFrame
 {
@@ -54,15 +88,22 @@ public:
     // event handlers (these functions should _not_ be virtual)
     void OnQuit(wxCommandEvent& event);
     void OnPageOpen(wxCommandEvent& event);
+    void OnDefaultLocalBrowser(wxCommandEvent& event);
+    void OnDefaultWebBrowser(wxCommandEvent& event);
     void OnBack(wxCommandEvent& event);
     void OnForward(wxCommandEvent& event);
     void OnProcessor(wxCommandEvent& event);
+    void OnDrawCustomBg(wxCommandEvent& event);
+
+    void OnHtmlLinkClicked(wxHtmlLinkEvent& event);
+    void OnHtmlCellHover(wxHtmlCellEvent &event);
+    void OnHtmlCellClicked(wxHtmlCellEvent &event);
 
 private:
-    wxHtmlWindow *m_Html;
+    MyHtmlWindow *m_Html;
     wxHtmlProcessor *m_Processor;
 
-    // Any class wishing to process wxWindows events must use this macro
+    // Any class wishing to process wxWidgets events must use this macro
     DECLARE_EVENT_TABLE()
 };
 
@@ -91,21 +132,31 @@ enum
 {
     // menu items
     ID_PageOpen = wxID_HIGHEST,
+    ID_DefaultLocalBrowser,
+    ID_DefaultWebBrowser,
     ID_Back,
     ID_Forward,
-    ID_Processor
+    ID_Processor,
+    ID_DrawCustomBg
 };
 
 // ----------------------------------------------------------------------------
-// event tables and other macros for wxWindows
+// event tables and other macros for wxWidgets
 // ----------------------------------------------------------------------------
 
 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
     EVT_MENU(wxID_EXIT,  MyFrame::OnQuit)
     EVT_MENU(ID_PageOpen, MyFrame::OnPageOpen)
+    EVT_MENU(ID_DefaultLocalBrowser, MyFrame::OnDefaultLocalBrowser)
+    EVT_MENU(ID_DefaultWebBrowser, MyFrame::OnDefaultWebBrowser)
     EVT_MENU(ID_Back, MyFrame::OnBack)
     EVT_MENU(ID_Forward, MyFrame::OnForward)
     EVT_MENU(ID_Processor, MyFrame::OnProcessor)
+    EVT_MENU(ID_DrawCustomBg, MyFrame::OnDrawCustomBg)
+
+    EVT_HTML_LINK_CLICKED(wxID_ANY, MyFrame::OnHtmlLinkClicked)
+    EVT_HTML_CELL_HOVER(wxID_ANY, MyFrame::OnHtmlCellHover)
+    EVT_HTML_CELL_CLICKED(wxID_ANY, MyFrame::OnHtmlCellClicked)
 END_EVENT_TABLE()
 
 IMPLEMENT_APP(MyApp)
@@ -121,6 +172,9 @@ IMPLEMENT_APP(MyApp)
 // `Main program' equivalent: the program execution "starts" here
 bool MyApp::OnInit()
 {
+    if ( !wxApp::OnInit() )
+        return false;
+
 #if wxUSE_SYSTEM_OPTIONS
     wxSystemOptions::SetOption(wxT("no-maskblt"), 1);
 #endif
@@ -130,7 +184,7 @@ bool MyApp::OnInit()
     wxFileSystem::AddHandler(new wxInternetFSHandler);
 #endif
 
-    SetVendorName(wxT("wxWindows"));
+    SetVendorName(wxT("wxWidgets"));
     SetAppName(wxT("wxHtmlTest"));
     // the following call to wxConfig::Get will use it to create an object...
 
@@ -156,11 +210,14 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
     wxMenu *menuFile = new wxMenu;
     wxMenu *menuNav = new wxMenu;
 
-    menuFile->Append(ID_PageOpen, _("&Open HTML page..."));
+    menuFile->Append(ID_PageOpen, _("&Open HTML page...\tCtrl-O"));
+    menuFile->Append(ID_DefaultLocalBrowser, _("&Open current page with default browser"));
+    menuFile->Append(ID_DefaultWebBrowser, _("Open a &web page with default browser"));
     menuFile->AppendSeparator();
     menuFile->Append(ID_Processor, _("&Remove bold attribute"),
                      wxEmptyString, wxITEM_CHECK);
-
+    menuFile->AppendSeparator();
+    menuFile->AppendCheckItem(ID_DrawCustomBg, "&Draw custom background");
     menuFile->AppendSeparator();
     menuFile->Append(wxID_EXIT, _("&Close frame"));
     menuNav->Append(ID_Back, _("Go &BACK"));
@@ -174,6 +231,8 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
     // ... and attach this menu bar to the frame
     SetMenuBar(menuBar);
 
+    SetIcon(wxIcon(sample_xpm));
+
 #if wxUSE_ACCEL
     // Create convenient accelerators for Back and Forward navigation
     wxAcceleratorEntry entries[2];
@@ -184,16 +243,31 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
     SetAcceleratorTable(accel);
 #endif // wxUSE_ACCEL
 
-    CreateStatusBar(1);
+#if wxUSE_STATUSBAR
+    CreateStatusBar(2);
+#endif // wxUSE_STATUSBAR
 
     m_Processor = new BoldProcessor;
     m_Processor->Enable(false);
-    m_Html = new wxHtmlWindow(this);
+    m_Html = new MyHtmlWindow(this);
     m_Html->SetRelatedFrame(this, _("HTML : %s"));
-    m_Html->SetRelatedStatusBar(0);
+#if wxUSE_STATUSBAR
+    m_Html->SetRelatedStatusBar(1);
+#endif // wxUSE_STATUSBAR
     m_Html->ReadCustomization(wxConfig::Get());
     m_Html->LoadFile(wxFileName(wxT("test.htm")));
     m_Html->AddProcessor(m_Processor);
+
+    wxTextCtrl *text = new wxTextCtrl(this, wxID_ANY, _T(""),
+                                      wxDefaultPosition, wxDefaultSize,
+                                      wxTE_MULTILINE);
+
+    delete wxLog::SetActiveTarget(new wxLogTextCtrl(text));
+
+    wxSizer *sz = new wxBoxSizer(wxVERTICAL);
+    sz->Add(m_Html, 3, wxGROW);
+    sz->Add(text, 1, wxGROW);
+    SetSizer(sz);
 }
 
 
@@ -210,11 +284,39 @@ void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
 
 void MyFrame::OnPageOpen(wxCommandEvent& WXUNUSED(event))
 {
+#if wxUSE_FILEDLG
     wxString p = wxFileSelector(_("Open HTML document"), wxEmptyString,
-        wxEmptyString, wxEmptyString, wxT("HTML files|*.htm"));
+        wxEmptyString, wxEmptyString, wxT("HTML files|*.htm;*.html"));
+
+    if (!p.empty())
+    {
+#if wxUSE_STOPWATCH
+        wxStopWatch sw;
+#endif
+        m_Html->LoadFile(wxFileName(p));
+#if wxUSE_STOPWATCH
+        wxLogStatus("Loaded \"%s\" in %lums", p, sw.Time());
+#endif
+    }
+#endif // wxUSE_FILEDLG
+}
+
+void MyFrame::OnDefaultLocalBrowser(wxCommandEvent& WXUNUSED(event))
+{
+    wxString page = m_Html->GetOpenedPage();
+    if (!page.empty())
+    {
+        wxLaunchDefaultBrowser(page);
+    }
+}
 
-    if (p != wxEmptyString)
-        m_Html->LoadPage(p);
+void MyFrame::OnDefaultWebBrowser(wxCommandEvent& WXUNUSED(event))
+{
+    wxString page = m_Html->GetOpenedPage();
+    if (!page.empty())
+    {
+        wxLaunchDefaultBrowser(wxT("http://www.google.com"));
+    }
 }
 
 void MyFrame::OnBack(wxCommandEvent& WXUNUSED(event))
@@ -238,3 +340,101 @@ void MyFrame::OnProcessor(wxCommandEvent& WXUNUSED(event))
     m_Processor->Enable(!m_Processor->IsEnabled());
     m_Html->LoadPage(m_Html->GetOpenedPage());
 }
+
+void MyFrame::OnDrawCustomBg(wxCommandEvent& event)
+{
+    m_Html->DrawCustomBg(event.IsChecked());
+}
+
+void MyFrame::OnHtmlLinkClicked(wxHtmlLinkEvent &event)
+{
+    wxLogMessage(wxT("The url '%s' has been clicked!"), event.GetLinkInfo().GetHref().c_str());
+
+    // skipping this event the default behaviour (load the clicked URL)
+    // will happen...
+    event.Skip();
+}
+
+void MyFrame::OnHtmlCellHover(wxHtmlCellEvent &event)
+{
+    wxLogMessage(wxT("Mouse moved over cell %p at %d;%d"),
+                 event.GetCell(), event.GetPoint().x, event.GetPoint().y);
+}
+
+void MyFrame::OnHtmlCellClicked(wxHtmlCellEvent &event)
+{
+    wxLogMessage(wxT("Click over cell %p at %d;%d"),
+                 event.GetCell(), event.GetPoint().x, event.GetPoint().y);
+
+    // if we don't skip the event, OnHtmlLinkClicked won't be called!
+    event.Skip();
+}
+
+wxHtmlOpeningStatus MyHtmlWindow::OnOpeningURL(wxHtmlURLType WXUNUSED(type),
+                                               const wxString& url,
+                                               wxString *WXUNUSED(redirect)) const
+{
+    GetRelatedFrame()->SetStatusText(url + _T(" lately opened"),1);
+    return wxHTML_OPEN;
+}
+
+BEGIN_EVENT_TABLE(MyHtmlWindow, wxHtmlWindow)
+#if wxUSE_CLIPBOARD
+    EVT_TEXT_COPY(wxID_ANY, MyHtmlWindow::OnClipboardEvent)
+#endif // wxUSE_CLIPBOARD
+    EVT_ERASE_BACKGROUND(MyHtmlWindow::OnEraseBgEvent)
+END_EVENT_TABLE()
+
+#if wxUSE_CLIPBOARD
+void MyHtmlWindow::OnClipboardEvent(wxClipboardTextEvent& WXUNUSED(event))
+{
+    // explicitly call wxHtmlWindow::CopySelection() method
+    // and show the first 100 characters of the text copied in the status bar
+    if ( CopySelection() )
+    {
+        wxTextDataObject data;
+        if ( wxTheClipboard && wxTheClipboard->Open() && wxTheClipboard->GetData(data) )
+        {
+            const wxString text = data.GetText();
+            const size_t maxTextLength = 100;
+
+            wxLogStatus(wxString::Format(_T("Clipboard: '%s%s'"),
+                        wxString(text, maxTextLength).c_str(),
+                        (text.length() > maxTextLength) ? _T("...")
+                                                        : _T("")));
+            wxTheClipboard->Close();
+
+            return;
+        }
+    }
+
+    wxLogStatus(_T("Clipboard: nothing"));
+}
+#endif // wxUSE_CLIPBOARD
+
+void MyHtmlWindow::OnEraseBgEvent(wxEraseEvent& event)
+{
+    if ( !m_drawCustomBg )
+    {
+        event.Skip();
+        return;
+    }
+
+    // draw a background grid to show that this handler is indeed executed
+
+    wxDC& dc = *event.GetDC();
+    dc.SetPen(*wxBLUE_PEN);
+    dc.Clear();
+
+    const wxSize size = GetVirtualSize();
+    for ( int x = 0; x < size.x; x += 15 )
+    {
+        dc.DrawLine(x, 0, x, size.y);
+    }
+
+    for ( int y = 0; y < size.y; y += 15 )
+    {
+        dc.DrawLine(0, y, size.x, y);
+    }
+}
+