X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9ebb7cade2df5aeb8531950d2a79cd57a336bcec..9696657f22ee2f10017c0bc305ae1843ee8fe768:/samples/htlbox/htlbox.cpp diff --git a/samples/htlbox/htlbox.cpp b/samples/htlbox/htlbox.cpp index a53accf347..94a17e5112 100644 --- a/samples/htlbox/htlbox.cpp +++ b/samples/htlbox/htlbox.cpp @@ -78,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; @@ -88,16 +85,17 @@ 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) + wxDECLARE_NO_COPY_CLASS(MyHtmlListBox); DECLARE_DYNAMIC_CLASS(MyHtmlListBox) }; @@ -118,21 +116,27 @@ public: void OnToggleMulti(wxCommandEvent& event); void OnSelectAll(wxCommandEvent& event); void OnUpdateItem(wxCommandEvent& event); + void OnGetItemRect(wxCommandEvent& event); void OnSetBgCol(wxCommandEvent& event); 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 %d double clicked."), event.GetInt()); + wxLogMessage(wxT("Listbox item %d double clicked."), event.GetInt()); } - - wxSimpleHtmlListBox *GetSimpleBox() + + 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); } @@ -169,11 +173,14 @@ enum HtmlLbox_ToggleMulti, HtmlLbox_SelectAll, HtmlLbox_UpdateItem, + HtmlLbox_GetItemRect, HtmlLbox_SetBgCol, 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) @@ -194,6 +201,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(HtmlLbox_ToggleMulti, MyFrame::OnToggleMulti) EVT_MENU(HtmlLbox_SelectAll, MyFrame::OnSelectAll) EVT_MENU(HtmlLbox_UpdateItem, MyFrame::OnUpdateItem) + EVT_MENU(HtmlLbox_GetItemRect, MyFrame::OnGetItemRect) EVT_MENU(HtmlLbox_About, MyFrame::OnAbout) @@ -201,11 +209,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) @@ -220,53 +237,57 @@ IMPLEMENT_APP(MyApp) // frame constructor MyFrame::MyFrame() - : wxFrame(NULL, wxID_ANY, _T("HtmlLbox wxWidgets Sample"), + : wxFrame(NULL, wxID_ANY, wxT("HtmlLbox wxWidgets Sample"), wxDefaultPosition, wxSize(500, 500)) { // set the frame icon - SetIcon(wxIcon(sample_xpm)); + SetIcon(wxICON(sample)); #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->AppendRadioItem(HtmlLbox_CustomBox, wxT("Use custom box"), + wxT("Use a wxHtmlListBox virtual class control")); + menuFile->AppendRadioItem(HtmlLbox_SimpleBox, wxT("Use simple box"), + wxT("Use a wxSimpleHtmlListBox control")); menuFile->AppendSeparator(); - menuFile->Append(HtmlLbox_Quit, _T("E&xit\tAlt-X"), _T("Quit this program")); + menuFile->Append(HtmlLbox_Quit, wxT("E&xit\tAlt-X"), wxT("Quit this program")); // create our specific menu wxMenu *menuHLbox = new wxMenu; menuHLbox->Append(HtmlLbox_SetMargins, - _T("Set &margins...\tCtrl-G"), - _T("Change the margins around the items")); + wxT("Set &margins...\tCtrl-G"), + wxT("Change the margins around the items")); menuHLbox->AppendCheckItem(HtmlLbox_DrawSeparator, - _T("&Draw separators\tCtrl-D"), - _T("Toggle drawing separators between cells")); + wxT("&Draw separators\tCtrl-D"), + wxT("Toggle drawing separators between cells")); menuHLbox->AppendSeparator(); menuHLbox->AppendCheckItem(HtmlLbox_ToggleMulti, - _T("&Multiple selection\tCtrl-M"), - _T("Toggle multiple selection on/off")); + wxT("&Multiple selection\tCtrl-M"), + wxT("Toggle multiple selection on/off")); menuHLbox->AppendSeparator(); - menuHLbox->Append(HtmlLbox_SelectAll, _T("Select &all items\tCtrl-A")); - menuHLbox->Append(HtmlLbox_UpdateItem, _T("Update &first item\tCtrl-U")); + menuHLbox->Append(HtmlLbox_SelectAll, wxT("Select &all items\tCtrl-A")); + menuHLbox->Append(HtmlLbox_UpdateItem, wxT("Update &first item\tCtrl-U")); + menuHLbox->Append(HtmlLbox_GetItemRect, wxT("Show &rectangle of item #10\tCtrl-R")); menuHLbox->AppendSeparator(); - menuHLbox->Append(HtmlLbox_SetBgCol, _T("Set &background...\tCtrl-B")); + menuHLbox->Append(HtmlLbox_SetBgCol, wxT("Set &background...\tCtrl-B")); menuHLbox->Append(HtmlLbox_SetSelBgCol, - _T("Set &selection background...\tCtrl-S")); + wxT("Set &selection background...\tCtrl-S")); menuHLbox->AppendCheckItem(HtmlLbox_SetSelFgCol, - _T("Keep &foreground in selection\tCtrl-F")); + wxT("Keep &foreground in selection\tCtrl-F")); + + menuHLbox->AppendSeparator(); + menuHLbox->Append(HtmlLbox_Clear, wxT("&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")); + helpMenu->Append(HtmlLbox_About, wxT("&About\tF1"), wxT("Show about dialog")); // now append the freshly created menu to the menu bar... wxMenuBar *menuBar = new wxMenuBar(); - menuBar->Append(menuFile, _T("&File")); - menuBar->Append(menuHLbox, _T("&Listbox")); - menuBar->Append(helpMenu, _T("&Help")); + menuBar->Append(menuFile, wxT("&File")); + menuBar->Append(menuHLbox, wxT("&Listbox")); + menuBar->Append(helpMenu, wxT("&Help")); menuBar->Check(HtmlLbox_DrawSeparator, true); @@ -277,12 +298,12 @@ MyFrame::MyFrame() #if wxUSE_STATUSBAR // create a status bar just for fun (by default with 1 pane only) CreateStatusBar(2); - SetStatusText(_T("Welcome to wxWidgets!")); + SetStatusText(wxT("Welcome to wxWidgets!")); #endif // wxUSE_STATUSBAR - + // create the child controls CreateBox(); - wxTextCtrl *text = new wxTextCtrl(this, wxID_ANY, _T(""), + wxTextCtrl *text = new wxTextCtrl(this, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE); delete wxLog::SetActiveTarget(new wxLogTextCtrl(text)); @@ -312,7 +333,7 @@ void MyFrame::CreateBox() { 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 @@ -324,9 +345,9 @@ void MyFrame::CreateBox() (unsigned char)(abs((int)n - 128) % 256)); int level = n % 6 + 1; - wxString label = wxString::Format(_T("") - _T("Item %lu") - _T(""), + wxString label = wxString::Format(wxT("") + wxT("Item %lu") + wxT(""), level, clr.GetAsString(wxC2S_HTML_SYNTAX).c_str(), (unsigned long)n, level); @@ -345,12 +366,12 @@ void MyFrame::CreateBox() 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(); } @@ -363,10 +384,10 @@ void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) { - wxMessageBox(_T("This sample shows wxHtmlListBox class.\n") - _T("\n") - _T("(c) 2003 Vadim Zeitlin"), - _T("About HtmlLbox"), + wxMessageBox(wxT("This sample shows wxHtmlListBox class.\n") + wxT("\n") + wxT("(c) 2003 Vadim Zeitlin"), + wxT("About HtmlLbox"), wxOK | wxICON_INFORMATION, this); } @@ -375,9 +396,9 @@ void MyFrame::OnSetMargins(wxCommandEvent& WXUNUSED(event)) { long margin = wxGetNumberFromUser ( - _T("Enter the margins to use for the listbox items."), - _T("Margin: "), - _T("HtmlLbox: Set the margins"), + wxT("Enter the margins to use for the listbox items."), + wxT("Margin: "), + wxT("HtmlLbox: Set the margins"), 0, 0, 20, this ); @@ -392,7 +413,7 @@ void MyFrame::OnSetMargins(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnToggleMulti(wxCommandEvent& WXUNUSED(event)) { wxWindow *old = m_hlbox; - + // we need to recreate the listbox CreateBox(); GetSizer()->Replace(old, m_hlbox); @@ -417,16 +438,24 @@ void MyFrame::OnUpdateItem(wxCommandEvent& WXUNUSED(event)) GetMyBox()->UpdateFirstItem(); } +void MyFrame::OnGetItemRect(wxCommandEvent& WXUNUSED(event)) +{ + static const int ITEM = 10; + const wxRect r = m_hlbox->GetItemRect(ITEM); + wxLogMessage("Rect of item %d: (%d, %d)-(%d, %d)", + ITEM, r.x, r.y, r.x + r.width, r.y + r.height); +} + void MyFrame::OnSetBgCol(wxCommandEvent& WXUNUSED(event)) { wxColour col = wxGetColourFromUser(this, m_hlbox->GetBackgroundColour()); - if ( col.Ok() ) + if ( col.IsOk() ) { m_hlbox->SetBackgroundColour(col); m_hlbox->Refresh(); #if wxUSE_STATUSBAR - SetStatusText(_T("Background colour changed.")); + SetStatusText(wxT("Background colour changed.")); #endif // wxUSE_STATUSBAR } } @@ -434,13 +463,13 @@ void MyFrame::OnSetBgCol(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnSetSelBgCol(wxCommandEvent& WXUNUSED(event)) { wxColour col = wxGetColourFromUser(this, m_hlbox->GetSelectionBackground()); - if ( col.Ok() ) + if ( col.IsOk() ) { m_hlbox->SetSelectionBackground(col); m_hlbox->Refresh(); #if wxUSE_STATUSBAR - SetStatusText(_T("Selection background colour changed.")); + SetStatusText(wxT("Selection background colour changed.")); #endif // wxUSE_STATUSBAR } } @@ -454,13 +483,44 @@ void MyFrame::OnSetSelFgCol(wxCommandEvent& event) } } +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(); +} + // ---------------------------------------------------------------------------- // listbox event handlers // ---------------------------------------------------------------------------- void MyFrame::OnLboxSelect(wxCommandEvent& event) { - wxLogMessage(_T("Listbox selection is now %d."), event.GetInt()); + wxLogMessage(wxT("Listbox selection is now %d."), event.GetInt()); if ( m_hlbox->HasMultipleSelection() ) { @@ -475,18 +535,20 @@ void MyFrame::OnLboxSelect(wxCommandEvent& event) if ( first ) first = false; else - s << _T(", "); + s << wxT(", "); s << item; } if ( !s.empty() ) - wxLogMessage(_T("Selected items: %s"), s.c_str()); + { + wxLogMessage(wxT("Selected items: %s"), s.c_str()); + } } #if wxUSE_STATUSBAR SetStatusText(wxString::Format( - _T("# items selected = %lu"), + wxT("# items selected = %lu"), (unsigned long)m_hlbox->GetSelectedCount() )); #endif // wxUSE_STATUSBAR @@ -510,9 +572,9 @@ MyHtmlListBox::MyHtmlListBox(wxWindow *parent, bool multi) SetMargins(5, 5); #ifdef USE_HTML_FILE - if ( !m_file.Open(_T("results")) ) + if ( !m_file.Open(wxT("results")) ) { - wxLogError(_T("Failed to open results file")); + wxLogError(wxT("Failed to open results file")); } else { @@ -540,7 +602,7 @@ wxString MyHtmlListBox::OnGetItem(size_t n) const { if ( !n && m_firstItemUpdated ) { - return wxString::Format(_T("

Just updated

")); + return wxT("

Just updated

"); } #ifdef USE_HTML_FILE @@ -556,18 +618,18 @@ wxString MyHtmlListBox::OnGetItem(size_t n) const (unsigned char)(abs((int)n - 256) % 256), (unsigned char)(abs((int)n - 128) % 256)); - wxString label = wxString::Format(_T("") - _T("Item %lu") - _T(""), + wxString label = wxString::Format(wxT("") + wxT("Item %lu") + wxT(""), level, clr.GetAsString(wxC2S_HTML_SYNTAX).c_str(), (unsigned long)n, level); if ( n == 1 ) { if ( !m_linkClicked ) - label += _T("Click here..."); + label += wxT("Click here..."); else - label += _T("Clicked here..."); + label += wxT("Clicked here..."); } return label; @@ -583,14 +645,5 @@ void MyHtmlListBox::UpdateFirstItem() { m_firstItemUpdated = !m_firstItemUpdated; - RefreshLine(0); + RefreshRow(0); } - -void MyHtmlListBox::OnLinkClicked(size_t WXUNUSED(n), - const wxHtmlLinkInfo& WXUNUSED(link)) -{ - m_linkClicked = true; - - RefreshLine(1); -} -