X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6bdcf0b14376e887647691552375ba4396c45b79..30738aae14dfbce0c492d8696c861947228028c2:/samples/htlbox/htlbox.cpp diff --git a/samples/htlbox/htlbox.cpp b/samples/htlbox/htlbox.cpp index a5a87d3431..831dd2c839 100644 --- a/samples/htlbox/htlbox.cpp +++ b/samples/htlbox/htlbox.cpp @@ -63,6 +63,7 @@ class MyHtmlListBox : public wxHtmlListBox { public: + MyHtmlListBox() { } MyHtmlListBox(wxWindow *parent, bool multi = false); void SetChangeSelFg(bool change) { m_change = change; } @@ -77,9 +78,6 @@ protected: virtual void OnDrawSeparator(wxDC& dc, wxRect& rect, size_t n) const; virtual wxColour GetSelectedTextColour(const wxColour& colFg) const; - // override this method to handle mouse clicks - virtual void OnLinkClicked(size_t n, const wxHtmlLinkInfo& link); - // flag telling us whether we should use fg colour even for the selected // item bool m_change; @@ -87,18 +85,21 @@ protected: // flag which we toggle to update the first items text in OnGetItem() bool m_firstItemUpdated; +public: + // flag which we toggle when the user clicks on the link in 2nd item // to change 2nd item's text bool m_linkClicked; - #ifdef USE_HTML_FILE wxTextFile m_file; #endif DECLARE_NO_COPY_CLASS(MyHtmlListBox) + DECLARE_DYNAMIC_CLASS(MyHtmlListBox) }; + class MyFrame : public wxFrame { public: @@ -106,6 +107,7 @@ public: virtual ~MyFrame(); // event handlers + void OnSimpleOrCustomBox(wxCommandEvent& event); void OnQuit(wxCommandEvent& event); void OnAbout(wxCommandEvent& event); @@ -119,17 +121,29 @@ public: void OnSetSelBgCol(wxCommandEvent& event); void OnSetSelFgCol(wxCommandEvent& event); + void OnClear(wxCommandEvent& event); void OnUpdateUISelectAll(wxUpdateUIEvent& event); void OnLboxSelect(wxCommandEvent& event); void OnLboxDClick(wxCommandEvent& event) { - wxLogMessage(_T("Listbox item %ld double clicked."), event.GetInt()); + wxLogMessage(_T("Listbox item %d double clicked."), event.GetInt()); } + void OnHtmlLinkClicked(wxHtmlLinkEvent& event); + void OnHtmlCellHover(wxHtmlCellEvent &event); + void OnHtmlCellClicked(wxHtmlCellEvent &event); + + wxSimpleHtmlListBox *GetSimpleBox() + { return wxDynamicCast(m_hlbox, wxSimpleHtmlListBox); } + MyHtmlListBox *GetMyBox() + { return wxDynamicCast(m_hlbox, MyHtmlListBox); } + + void CreateBox(); + private: - MyHtmlListBox *m_hlbox; + wxHtmlListBox *m_hlbox; // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() @@ -149,7 +163,9 @@ public: enum { // menu items - HtmlLbox_Quit = 1, + HtmlLbox_CustomBox = 1, + HtmlLbox_SimpleBox, + HtmlLbox_Quit, HtmlLbox_SetMargins, HtmlLbox_DrawSeparator, @@ -161,6 +177,8 @@ enum HtmlLbox_SetSelBgCol, HtmlLbox_SetSelFgCol, + HtmlLbox_Clear, + // it is important for the id corresponding to the "About" command to have // this standard value as otherwise it won't be handled properly under Mac // (where it is special and put into the "Apple" menu) @@ -172,6 +190,8 @@ enum // ---------------------------------------------------------------------------- BEGIN_EVENT_TABLE(MyFrame, wxFrame) + EVT_MENU(HtmlLbox_CustomBox, MyFrame::OnSimpleOrCustomBox) + EVT_MENU(HtmlLbox_SimpleBox, MyFrame::OnSimpleOrCustomBox) EVT_MENU(HtmlLbox_Quit, MyFrame::OnQuit) EVT_MENU(HtmlLbox_SetMargins, MyFrame::OnSetMargins) @@ -186,11 +206,20 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(HtmlLbox_SetSelBgCol, MyFrame::OnSetSelBgCol) EVT_MENU(HtmlLbox_SetSelFgCol, MyFrame::OnSetSelFgCol) + EVT_MENU(HtmlLbox_Clear, MyFrame::OnClear) + EVT_UPDATE_UI(HtmlLbox_SelectAll, MyFrame::OnUpdateUISelectAll) EVT_LISTBOX(wxID_ANY, MyFrame::OnLboxSelect) EVT_LISTBOX_DCLICK(wxID_ANY, MyFrame::OnLboxDClick) + + + // the HTML listbox's events + 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) @@ -206,7 +235,7 @@ IMPLEMENT_APP(MyApp) // frame constructor MyFrame::MyFrame() : wxFrame(NULL, wxID_ANY, _T("HtmlLbox wxWidgets Sample"), - wxDefaultPosition, wxSize(400, 500)) + wxDefaultPosition, wxSize(500, 500)) { // set the frame icon SetIcon(wxIcon(sample_xpm)); @@ -214,6 +243,11 @@ MyFrame::MyFrame() #if wxUSE_MENUS // create a menu bar wxMenu *menuFile = new wxMenu; + menuFile->AppendRadioItem(HtmlLbox_CustomBox, _T("Use custom box"), + _T("Use a wxHtmlListBox virtual class control")); + menuFile->AppendRadioItem(HtmlLbox_SimpleBox, _T("Use simple box"), + _T("Use a wxSimpleHtmlListBox control")); + menuFile->AppendSeparator(); menuFile->Append(HtmlLbox_Quit, _T("E&xit\tAlt-X"), _T("Quit this program")); // create our specific menu @@ -238,6 +272,9 @@ MyFrame::MyFrame() menuHLbox->AppendCheckItem(HtmlLbox_SetSelFgCol, _T("Keep &foreground in selection\tCtrl-F")); + menuHLbox->AppendSeparator(); + menuHLbox->Append(HtmlLbox_Clear, _T("&Clear\tCtrl-L")); + // the "About" item should be in the help menu wxMenu *helpMenu = new wxMenu; helpMenu->Append(HtmlLbox_About, _T("&About...\tF1"), _T("Show about dialog")); @@ -261,7 +298,7 @@ MyFrame::MyFrame() #endif // wxUSE_STATUSBAR // create the child controls - m_hlbox = new MyHtmlListBox(this); + CreateBox(); wxTextCtrl *text = new wxTextCtrl(this, wxID_ANY, _T(""), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE); @@ -269,8 +306,8 @@ MyFrame::MyFrame() // and lay them out wxSizer *sizer = new wxBoxSizer(wxHORIZONTAL); - sizer->Add(m_hlbox, 1, wxGROW); - sizer->Add(text, 1, wxGROW); + sizer->Add(m_hlbox, 2, wxGROW); + sizer->Add(text, 3, wxGROW); SetSizer(sizer); } @@ -280,10 +317,61 @@ MyFrame::~MyFrame() delete wxLog::SetActiveTarget(NULL); } +void MyFrame::CreateBox() +{ + bool multi = GetMenuBar()->IsChecked(HtmlLbox_ToggleMulti); + + if ( GetMenuBar()->IsChecked(HtmlLbox_CustomBox) ) + { + m_hlbox = new MyHtmlListBox(this, multi); + } + else // simple listbox + { + m_hlbox = new wxSimpleHtmlListBox(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, + 0, NULL, multi ? wxLB_MULTIPLE : 0); + + // unlike wxHtmlListBox which is abstract, wxSimpleHtmlListBox is a + // concrete control and doesn't support virtual mode, this we need + // to add all of its items from the beginning + wxArrayString arr; + for (size_t n = 0; n < 1000; n++ ) + { + wxColour clr((unsigned char)(abs((int)n - 192) % 256), + (unsigned char)(abs((int)n - 256) % 256), + (unsigned char)(abs((int)n - 128) % 256)); + int level = n % 6 + 1; + + wxString label = wxString::Format(_T("") + _T("Item %lu") + _T(""), + level, + clr.GetAsString(wxC2S_HTML_SYNTAX).c_str(), + (unsigned long)n, level); + arr.Add(label); + } + + GetSimpleBox()->Append(arr); + } +} + + // ---------------------------------------------------------------------------- // menu event handlers // ---------------------------------------------------------------------------- +void MyFrame::OnSimpleOrCustomBox(wxCommandEvent& WXUNUSED(event)) +{ + wxWindow *old = m_hlbox; + + // we need to recreate the listbox + CreateBox(); + GetSizer()->Replace(old, m_hlbox); + delete old; + + GetSizer()->Layout(); + Refresh(); +} + void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) { // true is to force the frame to close @@ -318,17 +406,16 @@ void MyFrame::OnSetMargins(wxCommandEvent& WXUNUSED(event)) } } -void MyFrame::OnToggleMulti(wxCommandEvent& event) +void MyFrame::OnToggleMulti(wxCommandEvent& WXUNUSED(event)) { - // we need to recreate the listbox - wxSizer *sizer = GetSizer(); - sizer->Detach(m_hlbox); - delete m_hlbox; + wxWindow *old = m_hlbox; - m_hlbox = new MyHtmlListBox(this, event.IsChecked()); - sizer->Prepend(m_hlbox, 1, wxGROW); + // we need to recreate the listbox + CreateBox(); + GetSizer()->Replace(old, m_hlbox); + delete old; - sizer->Layout(); + GetSizer()->Layout(); } void MyFrame::OnSelectAll(wxCommandEvent& WXUNUSED(event)) @@ -343,7 +430,8 @@ void MyFrame::OnUpdateUISelectAll(wxUpdateUIEvent& event) void MyFrame::OnUpdateItem(wxCommandEvent& WXUNUSED(event)) { - m_hlbox->UpdateFirstItem(); + if (GetMyBox()) + GetMyBox()->UpdateFirstItem(); } void MyFrame::OnSetBgCol(wxCommandEvent& WXUNUSED(event)) @@ -376,8 +464,42 @@ void MyFrame::OnSetSelBgCol(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnSetSelFgCol(wxCommandEvent& event) { - m_hlbox->SetChangeSelFg(!event.IsChecked()); - m_hlbox->Refresh(); + if (GetMyBox()) + { + GetMyBox()->SetChangeSelFg(!event.IsChecked()); + GetMyBox()->Refresh(); + } +} + +void MyFrame::OnClear(wxCommandEvent& WXUNUSED(event)) +{ + m_hlbox->Clear(); +} + +void MyFrame::OnHtmlLinkClicked(wxHtmlLinkEvent &event) +{ + wxLogMessage(wxT("The url '%s' has been clicked!"), event.GetLinkInfo().GetHref().c_str()); + + if (GetMyBox()) + { + GetMyBox()->m_linkClicked = true; + GetMyBox()->RefreshRow(1); + } +} + +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(); } // ---------------------------------------------------------------------------- @@ -386,7 +508,7 @@ void MyFrame::OnSetSelFgCol(wxCommandEvent& event) void MyFrame::OnLboxSelect(wxCommandEvent& event) { - wxLogMessage(_T("Listbox selection is now %ld."), event.GetInt()); + wxLogMessage(_T("Listbox selection is now %d."), event.GetInt()); if ( m_hlbox->HasMultipleSelection() ) { @@ -422,6 +544,8 @@ void MyFrame::OnLboxSelect(wxCommandEvent& event) // MyHtmlListBox // ============================================================================ +IMPLEMENT_DYNAMIC_CLASS(MyHtmlListBox, wxHtmlListBox) + MyHtmlListBox::MyHtmlListBox(wxWindow *parent, bool multi) : wxHtmlListBox(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, multi ? wxLB_MULTIPLE : 0) @@ -464,7 +588,7 @@ wxString MyHtmlListBox::OnGetItem(size_t n) const { if ( !n && m_firstItemUpdated ) { - return wxString::Format(_T("

Just updated

")); + return _T("

Just updated

"); } #ifdef USE_HTML_FILE @@ -476,9 +600,9 @@ wxString MyHtmlListBox::OnGetItem(size_t n) const #else int level = n % 6 + 1; - wxColour clr(abs((int)n - 192) % 256, - abs((int)n - 256) % 256, - abs((int)n - 128) % 256); + wxColour clr((unsigned char)(abs((int)n - 192) % 256), + (unsigned char)(abs((int)n - 256) % 256), + (unsigned char)(abs((int)n - 128) % 256)); wxString label = wxString::Format(_T("") _T("Item %lu") @@ -507,13 +631,5 @@ void MyHtmlListBox::UpdateFirstItem() { m_firstItemUpdated = !m_firstItemUpdated; - RefreshLine(0); -} - -void MyHtmlListBox::OnLinkClicked(size_t WXUNUSED(n), - const wxHtmlLinkInfo& WXUNUSED(link)) -{ - m_linkClicked = true; - - RefreshLine(1); + RefreshRow(0); }