X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/201ca879820627087a23d5bdba09dbbfefea297c..6feaaaedd69b30001afcfe54620f08f635094819:/samples/htlbox/htlbox.cpp?ds=sidebyside diff --git a/samples/htlbox/htlbox.cpp b/samples/htlbox/htlbox.cpp index 5c2d7dae69..1a87b03df6 100644 --- a/samples/htlbox/htlbox.cpp +++ b/samples/htlbox/htlbox.cpp @@ -24,16 +24,32 @@ #pragma hdrstop #endif -// for all others, include the necessary headers (this file is usually all you -// need because it includes almost all "standard" wxWindows headers) +// for all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/app.h" #include "wx/frame.h" #include "wx/log.h" + #include "wx/textdlg.h" + #include "wx/sizer.h" + + #include "wx/menu.h" + #include "wx/msgdlg.h" + #include "wx/textctrl.h" + + #include "wx/dc.h" #endif +#include "wx/colordlg.h" + #include "wx/htmllbox.h" +// you can also have a file containing HTML strings for testing, enable this if +// you want to use it +//#define USE_HTML_FILE +#ifdef USE_HTML_FILE + #include "wx/textfile.h" +#endif + // ---------------------------------------------------------------------------- // resources // ---------------------------------------------------------------------------- @@ -47,10 +63,27 @@ // private classes // ---------------------------------------------------------------------------- -class MyApp : public wxApp +// to use wxHtmlListBox you must derive a new class from it as you must +// implement pure virtual OnGetItem() +class MyHtmlListBox : public wxHtmlListBox { public: - virtual bool OnInit(); + MyHtmlListBox(wxWindow *parent, bool multi = false); + + void SetChangeSelFg(bool change) { m_change = change; } + +protected: + virtual wxString OnGetItem(size_t n) const; + + // change the appearance by overriding these functions + virtual void OnDrawSeparator(wxDC& dc, wxRect& rect, size_t n) const; + virtual wxColour GetSelectedTextColour(const wxColour& colFg) const; + + bool m_change; + +#ifdef USE_HTML_FILE + wxTextFile m_file; +#endif }; class MyFrame : public wxFrame @@ -63,56 +96,35 @@ public: void OnQuit(wxCommandEvent& event); void OnAbout(wxCommandEvent& event); - void OnLboxSelect(wxCommandEvent& event) - { - wxLogMessage(_T("Listbox selection is now %d."), event.GetInt()); - } + void OnSetMargins(wxCommandEvent& event); + void OnDrawSeparator(wxCommandEvent&) { m_hlbox->RefreshAll(); } + void OnToggleMulti(wxCommandEvent& event); + void OnSelectAll(wxCommandEvent& event); + + void OnSetBgCol(wxCommandEvent& event); + void OnSetSelBgCol(wxCommandEvent& event); + void OnSetSelFgCol(wxCommandEvent& event); + + + void OnUpdateUISelectAll(wxUpdateUIEvent& event); + void OnLboxSelect(wxCommandEvent& event); void OnLboxDClick(wxCommandEvent& event) { - wxLogMessage(_T("Listbox item %d double clicked."), event.GetInt()); + wxLogMessage(_T("Listbox item %ld double clicked."), event.GetInt()); } private: + MyHtmlListBox *m_hlbox; + // any class wishing to process wxWindows events must use this macro DECLARE_EVENT_TABLE() }; -// to use wxHtmlListBox you must derive a new class from it as you must -// implement pure virtual OnGetItem() -class MyHtmlListBox : public wxHtmlListBox +class MyApp : public wxApp { public: - MyHtmlListBox(wxWindow *parent) : wxHtmlListBox(parent) - { - SetItemCount(1000); - SetSelection(10); - SetMargins(5, 5); - } - -protected: - virtual wxString OnGetItem(size_t n) const - { - int level = n % 6 + 1; - return wxString::Format(_T("") - _T("Item %lu") - _T(""), - level, - abs(n - 192) % 256, - abs(n - 256) % 256, - abs(n - 128) % 256, - (unsigned long)n, level); - } - - virtual void OnDrawSeparator(wxDC& dc, - wxRect& rect, - size_t WXUNUSED(n)) const - { - dc.SetPen(*wxBLACK_DASHED_PEN); - dc.DrawLine(rect.x, rect.y, rect.GetRight(), rect.y); - dc.DrawLine(rect.x, rect.GetBottom(), rect.GetRight(), rect.GetBottom()); - } - + virtual bool OnInit() { (new MyFrame())->Show(); return TRUE; } }; // ---------------------------------------------------------------------------- @@ -125,6 +137,15 @@ enum // menu items HtmlLbox_Quit = 1, + HtmlLbox_SetMargins, + HtmlLbox_DrawSeparator, + HtmlLbox_ToggleMulti, + HtmlLbox_SelectAll, + + HtmlLbox_SetBgCol, + HtmlLbox_SetSelBgCol, + HtmlLbox_SetSelFgCol, + // 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) @@ -135,42 +156,35 @@ enum // event tables and other macros for wxWindows // ---------------------------------------------------------------------------- -// the event tables connect the wxWindows events with the functions (event -// handlers) which process them. It can be also done at run-time, but for the -// simple menu events like this the static method is much simpler. BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(HtmlLbox_Quit, MyFrame::OnQuit) + + EVT_MENU(HtmlLbox_SetMargins, MyFrame::OnSetMargins) + EVT_MENU(HtmlLbox_DrawSeparator, MyFrame::OnDrawSeparator) + EVT_MENU(HtmlLbox_ToggleMulti, MyFrame::OnToggleMulti) + EVT_MENU(HtmlLbox_SelectAll, MyFrame::OnSelectAll) + EVT_MENU(HtmlLbox_About, MyFrame::OnAbout) + EVT_MENU(HtmlLbox_SetBgCol, MyFrame::OnSetBgCol) + EVT_MENU(HtmlLbox_SetSelBgCol, MyFrame::OnSetSelBgCol) + EVT_MENU(HtmlLbox_SetSelFgCol, MyFrame::OnSetSelFgCol) + + EVT_UPDATE_UI(HtmlLbox_SelectAll, MyFrame::OnUpdateUISelectAll) + + EVT_LISTBOX(wxID_ANY, MyFrame::OnLboxSelect) EVT_LISTBOX_DCLICK(wxID_ANY, MyFrame::OnLboxDClick) END_EVENT_TABLE() -// Create a new application object: this macro will allow wxWindows to create -// the application object during program execution (it's better than using a -// static object for many reasons) and also declares the accessor function -// wxGetApp() which will return the reference of the right type (i.e. MyApp and -// not wxApp) IMPLEMENT_APP(MyApp) // ============================================================================ -// implementation +// MyFrame // ============================================================================ // ---------------------------------------------------------------------------- -// the application class -// ---------------------------------------------------------------------------- - -// 'Main program' equivalent: the program execution "starts" here -bool MyApp::OnInit() -{ - (new MyFrame())->Show(); - - return TRUE; -} - -// ---------------------------------------------------------------------------- -// main frame +// MyFrame ctor/dtor // ---------------------------------------------------------------------------- // frame constructor @@ -184,18 +198,41 @@ MyFrame::MyFrame() #if wxUSE_MENUS // create a menu bar wxMenu *menuFile = new wxMenu; + menuFile->Append(HtmlLbox_Quit, _T("E&xit\tAlt-X"), _T("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")); + menuHLbox->AppendCheckItem(HtmlLbox_DrawSeparator, + _T("&Draw separators\tCtrl-D"), + _T("Toggle drawing separators between cells")); + menuHLbox->AppendSeparator(); + menuHLbox->AppendCheckItem(HtmlLbox_ToggleMulti, + _T("&Multiple selection\tCtrl-M"), + _T("Toggle multiple selection on/off")); + menuHLbox->AppendSeparator(); + menuHLbox->Append(HtmlLbox_SelectAll, _T("Select &all items\tCtrl-A")); + menuHLbox->AppendSeparator(); + menuHLbox->Append(HtmlLbox_SetBgCol, _T("Set &background...\tCtrl-B")); + menuHLbox->Append(HtmlLbox_SetSelBgCol, + _T("Set &selection background...\tCtrl-S")); + menuHLbox->AppendCheckItem(HtmlLbox_SetSelFgCol, + _T("Keep &foreground in selection\tCtrl-F")); // the "About" item should be in the help menu wxMenu *helpMenu = new wxMenu; helpMenu->Append(HtmlLbox_About, _T("&About...\tF1"), _T("Show about dialog")); - menuFile->Append(HtmlLbox_Quit, _T("E&xit\tAlt-X"), _T("Quit this program")); - // 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->Check(HtmlLbox_DrawSeparator, true); + // ... and attach this menu bar to the frame SetMenuBar(menuBar); #endif // wxUSE_MENUS @@ -207,7 +244,7 @@ MyFrame::MyFrame() #endif // wxUSE_STATUSBAR // create the child controls - MyHtmlListBox *hlbox = new MyHtmlListBox(this); + m_hlbox = new MyHtmlListBox(this); wxTextCtrl *text = new wxTextCtrl(this, -1, _T(""), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE); @@ -215,7 +252,7 @@ MyFrame::MyFrame() // and lay them out wxSizer *sizer = new wxBoxSizer(wxHORIZONTAL); - sizer->Add(hlbox, 1, wxGROW); + sizer->Add(m_hlbox, 1, wxGROW); sizer->Add(text, 1, wxGROW); SetSizer(sizer); @@ -226,7 +263,10 @@ MyFrame::~MyFrame() delete wxLog::SetActiveTarget(NULL); } -// event handlers +// ---------------------------------------------------------------------------- +// menu event handlers +// ---------------------------------------------------------------------------- + void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) { // TRUE is to force the frame to close @@ -243,3 +283,175 @@ void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) this); } +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"), + 0, 0, 20, + this + ); + + if ( margin != -1 ) + { + m_hlbox->SetMargins(margin, margin); + m_hlbox->RefreshAll(); + } +} + +void MyFrame::OnToggleMulti(wxCommandEvent& event) +{ + // we need to recreate the listbox + wxSizer *sizer = GetSizer(); + sizer->Detach(m_hlbox); + delete m_hlbox; + + m_hlbox = new MyHtmlListBox(this, event.IsChecked()); + sizer->Prepend(m_hlbox, 1, wxGROW); + + sizer->Layout(); +} + +void MyFrame::OnSelectAll(wxCommandEvent& WXUNUSED(event)) +{ + m_hlbox->SelectAll(); +} + +void MyFrame::OnUpdateUISelectAll(wxUpdateUIEvent& event) +{ + event.Enable( m_hlbox && m_hlbox->HasMultipleSelection() ); +} + +void MyFrame::OnSetBgCol(wxCommandEvent& WXUNUSED(event)) +{ + wxColour col = wxGetColourFromUser(this, m_hlbox->GetBackgroundColour()); + if ( col.Ok() ) + { + m_hlbox->SetBackgroundColour(col); + m_hlbox->Refresh(); + + SetStatusText(_T("Background colour changed.")); + } +} + +void MyFrame::OnSetSelBgCol(wxCommandEvent& WXUNUSED(event)) +{ + wxColour col = wxGetColourFromUser(this, m_hlbox->GetSelectionBackground()); + if ( col.Ok() ) + { + m_hlbox->SetSelectionBackground(col); + m_hlbox->Refresh(); + + SetStatusText(_T("Selection background colour changed.")); + } +} + +void MyFrame::OnSetSelFgCol(wxCommandEvent& event) +{ + m_hlbox->SetChangeSelFg(!event.IsChecked()); + m_hlbox->Refresh(); +} + +// ---------------------------------------------------------------------------- +// listbox event handlers +// ---------------------------------------------------------------------------- + +void MyFrame::OnLboxSelect(wxCommandEvent& event) +{ + wxLogMessage(_T("Listbox selection is now %ld."), event.GetInt()); + + if ( m_hlbox->HasMultipleSelection() ) + { + wxString s; + + bool first = true; + unsigned long cookie; + for ( int item = m_hlbox->GetFirstSelected(cookie); + item != wxNOT_FOUND; + item = m_hlbox->GetNextSelected(cookie) ) + { + if ( first ) + first = false; + else + s << _T(", "); + + s << item; + } + + if ( !s.empty() ) + wxLogMessage(_T("Selected items: %s"), s.c_str()); + } + + SetStatusText(wxString::Format( + _T("# items selected = %lu"), + (unsigned long)m_hlbox->GetSelectedCount() + )); +} + +// ============================================================================ +// MyHtmlListBox +// ============================================================================ + +MyHtmlListBox::MyHtmlListBox(wxWindow *parent, bool multi) + : wxHtmlListBox(parent, -1, wxDefaultPosition, wxDefaultSize, + multi ? wxLB_MULTIPLE : 0) +{ + m_change = true; + + SetMargins(5, 5); + +#ifdef USE_HTML_FILE + if ( !m_file.Open("results") ) + { + wxLogError("Failed to open results file"); + } + else + { + SetItemCount(m_file.GetLineCount()); + } +#else + SetItemCount(1000); +#endif + + SetSelection(3); +} + +void MyHtmlListBox::OnDrawSeparator(wxDC& dc, wxRect& rect, size_t) const +{ + if ( ((MyFrame *)GetParent())-> + GetMenuBar()->IsChecked(HtmlLbox_DrawSeparator) ) + { + dc.SetPen(*wxBLACK_DASHED_PEN); + dc.DrawLine(rect.x, rect.y, rect.GetRight(), rect.y); + dc.DrawLine(rect.x, rect.GetBottom(), rect.GetRight(), rect.GetBottom()); + } +} + +wxString MyHtmlListBox::OnGetItem(size_t n) const +{ +#ifdef USE_HTML_FILE + wxString s; + if ( m_file.IsOpened() ) + s = m_file[n]; + + return s; +#else + int level = n % 6 + 1; + return wxString::Format(_T("") + _T("Item %lu") + _T(""), + level, + abs(n - 192) % 256, + abs(n - 256) % 256, + abs(n - 128) % 256, + (unsigned long)n, level); +#endif +} + +wxColour MyHtmlListBox::GetSelectedTextColour(const wxColour& colFg) const +{ + return m_change ? wxHtmlListBox::GetSelectedTextColour(colFg) : colFg; +} +