1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        htmllbox.cpp
3 // Purpose:     HtmlLbox wxWidgets sample
4 // Author:      Vadim Zeitlin
5 // Modified by:
6 // Created:     31.05.03
7 // RCS-ID:      $Id: htlbox.cpp 51132 2008-01-09 14:43:15Z VZ $
8 // Copyright:   (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org>
9 // Licence:     wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11 
12 // ============================================================================
13 // declarations
14 // ============================================================================
15 
16 // ----------------------------------------------------------------------------
17 // headers
18 // ----------------------------------------------------------------------------
19 
20 // For compilers that support precompilation, includes "wx/wx.h".
21 #include "wx/wxprec.h"
22 
23 #ifdef __BORLANDC__
24     #pragma hdrstop
25 #endif
26 
27 // for all others, include the necessary headers
28 #ifndef WX_PRECOMP
29     #include "wx/app.h"
30     #include "wx/frame.h"
31     #include "wx/log.h"
32     #include "wx/textdlg.h"
33     #include "wx/sizer.h"
34 
35     #include "wx/menu.h"
36     #include "wx/msgdlg.h"
37     #include "wx/textctrl.h"
38 
39     #include "wx/dc.h"
40     #include "wx/icon.h"
41 #endif
42 
43 #include "wx/colordlg.h"
44 #include "wx/numdlg.h"
45 
46 #include "wx/htmllbox.h"
47 
48 // you can also have a file containing HTML strings for testing, enable this if
49 // you want to use it
50 //#define USE_HTML_FILE
51 #ifdef USE_HTML_FILE
52     #include "wx/textfile.h"
53 #endif
54 
55 #include "../sample.xpm"
56 
57 // ----------------------------------------------------------------------------
58 // private classes
59 // ----------------------------------------------------------------------------
60 
61 // to use wxHtmlListBox you must derive a new class from it as you must
62 // implement pure virtual OnGetItem()
63 class MyHtmlListBox : public wxHtmlListBox
64 {
65 public:
MyHtmlListBox()66     MyHtmlListBox() { }
67     MyHtmlListBox(wxWindow *parent, bool multi = false);
68 
SetChangeSelFg(bool change)69     void SetChangeSelFg(bool change) { m_change = change; }
70     void UpdateFirstItem();
71 
72 protected:
73     // override this method to return data to be shown in the listbox (this is
74     // mandatory)
75     virtual wxString OnGetItem(size_t n) const;
76 
77     // change the appearance by overriding these functions (this is optional)
78     virtual void OnDrawSeparator(wxDC& dc, wxRect& rect, size_t n) const;
79     virtual wxColour GetSelectedTextColour(const wxColour& colFg) const;
80 
81     // flag telling us whether we should use fg colour even for the selected
82     // item
83     bool m_change;
84 
85     // flag which we toggle to update the first items text in OnGetItem()
86     bool m_firstItemUpdated;
87 
88 public:
89 
90     // flag which we toggle when the user clicks on the link in 2nd item
91     // to change 2nd item's text
92     bool m_linkClicked;
93 
94 #ifdef USE_HTML_FILE
95     wxTextFile m_file;
96 #endif
97 
98     DECLARE_NO_COPY_CLASS(MyHtmlListBox)
99     DECLARE_DYNAMIC_CLASS(MyHtmlListBox)
100 };
101 
102 
103 class MyFrame : public wxFrame
104 {
105 public:
106     MyFrame();
107     virtual ~MyFrame();
108 
109     // event handlers
110     void OnSimpleOrCustomBox(wxCommandEvent& event);
111     void OnQuit(wxCommandEvent& event);
112     void OnAbout(wxCommandEvent& event);
113 
114     void OnSetMargins(wxCommandEvent& event);
OnDrawSeparator(wxCommandEvent &)115     void OnDrawSeparator(wxCommandEvent&) { m_hlbox->RefreshAll(); }
116     void OnToggleMulti(wxCommandEvent& event);
117     void OnSelectAll(wxCommandEvent& event);
118     void OnUpdateItem(wxCommandEvent& event);
119 
120     void OnSetBgCol(wxCommandEvent& event);
121     void OnSetSelBgCol(wxCommandEvent& event);
122     void OnSetSelFgCol(wxCommandEvent& event);
123 
124     void OnClear(wxCommandEvent& event);
125 
126     void OnUpdateUISelectAll(wxUpdateUIEvent& event);
127 
128     void OnLboxSelect(wxCommandEvent& event);
OnLboxDClick(wxCommandEvent & event)129     void OnLboxDClick(wxCommandEvent& event)
130     {
131         wxLogMessage(_T("Listbox item %d double clicked."), event.GetInt());
132     }
133 
134     void OnHtmlLinkClicked(wxHtmlLinkEvent& event);
135     void OnHtmlCellHover(wxHtmlCellEvent &event);
136     void OnHtmlCellClicked(wxHtmlCellEvent &event);
137 
GetSimpleBox()138     wxSimpleHtmlListBox *GetSimpleBox()
139         { return wxDynamicCast(m_hlbox, wxSimpleHtmlListBox); }
GetMyBox()140     MyHtmlListBox *GetMyBox()
141         { return wxDynamicCast(m_hlbox, MyHtmlListBox); }
142 
143     void CreateBox();
144 
145 private:
146     wxHtmlListBox *m_hlbox;
147 
148     // any class wishing to process wxWidgets events must use this macro
149     DECLARE_EVENT_TABLE()
150 };
151 
152 class MyApp : public wxApp
153 {
154 public:
OnInit()155     virtual bool OnInit() { (new MyFrame())->Show(); return true; }
156 };
157 
158 // ----------------------------------------------------------------------------
159 // constants
160 // ----------------------------------------------------------------------------
161 
162 // IDs for the controls and the menu commands
163 enum
164 {
165     // menu items
166     HtmlLbox_CustomBox = 1,
167     HtmlLbox_SimpleBox,
168     HtmlLbox_Quit,
169 
170     HtmlLbox_SetMargins,
171     HtmlLbox_DrawSeparator,
172     HtmlLbox_ToggleMulti,
173     HtmlLbox_SelectAll,
174     HtmlLbox_UpdateItem,
175 
176     HtmlLbox_SetBgCol,
177     HtmlLbox_SetSelBgCol,
178     HtmlLbox_SetSelFgCol,
179 
180     HtmlLbox_Clear,
181 
182     // it is important for the id corresponding to the "About" command to have
183     // this standard value as otherwise it won't be handled properly under Mac
184     // (where it is special and put into the "Apple" menu)
185     HtmlLbox_About = wxID_ABOUT
186 };
187 
188 // ----------------------------------------------------------------------------
189 // event tables and other macros for wxWidgets
190 // ----------------------------------------------------------------------------
191 
BEGIN_EVENT_TABLE(MyFrame,wxFrame)192 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
193     EVT_MENU(HtmlLbox_CustomBox,  MyFrame::OnSimpleOrCustomBox)
194     EVT_MENU(HtmlLbox_SimpleBox,  MyFrame::OnSimpleOrCustomBox)
195     EVT_MENU(HtmlLbox_Quit,  MyFrame::OnQuit)
196 
197     EVT_MENU(HtmlLbox_SetMargins, MyFrame::OnSetMargins)
198     EVT_MENU(HtmlLbox_DrawSeparator, MyFrame::OnDrawSeparator)
199     EVT_MENU(HtmlLbox_ToggleMulti, MyFrame::OnToggleMulti)
200     EVT_MENU(HtmlLbox_SelectAll, MyFrame::OnSelectAll)
201     EVT_MENU(HtmlLbox_UpdateItem, MyFrame::OnUpdateItem)
202 
203     EVT_MENU(HtmlLbox_About, MyFrame::OnAbout)
204 
205     EVT_MENU(HtmlLbox_SetBgCol, MyFrame::OnSetBgCol)
206     EVT_MENU(HtmlLbox_SetSelBgCol, MyFrame::OnSetSelBgCol)
207     EVT_MENU(HtmlLbox_SetSelFgCol, MyFrame::OnSetSelFgCol)
208 
209     EVT_MENU(HtmlLbox_Clear, MyFrame::OnClear)
210 
211     EVT_UPDATE_UI(HtmlLbox_SelectAll, MyFrame::OnUpdateUISelectAll)
212 
213 
214     EVT_LISTBOX(wxID_ANY, MyFrame::OnLboxSelect)
215     EVT_LISTBOX_DCLICK(wxID_ANY, MyFrame::OnLboxDClick)
216 
217 
218     // the HTML listbox's events
219     EVT_HTML_LINK_CLICKED(wxID_ANY, MyFrame::OnHtmlLinkClicked)
220     EVT_HTML_CELL_HOVER(wxID_ANY, MyFrame::OnHtmlCellHover)
221     EVT_HTML_CELL_CLICKED(wxID_ANY, MyFrame::OnHtmlCellClicked)
222 
223 END_EVENT_TABLE()
224 
225 IMPLEMENT_APP(MyApp)
226 
227 // ============================================================================
228 // MyFrame
229 // ============================================================================
230 
231 // ----------------------------------------------------------------------------
232 // MyFrame ctor/dtor
233 // ----------------------------------------------------------------------------
234 
235 // frame constructor
236 MyFrame::MyFrame()
237        : wxFrame(NULL, wxID_ANY, _T("HtmlLbox wxWidgets Sample"),
238                  wxDefaultPosition, wxSize(500, 500))
239 {
240     // set the frame icon
241     SetIcon(wxIcon(sample_xpm));
242 
243 #if wxUSE_MENUS
244     // create a menu bar
245     wxMenu *menuFile = new wxMenu;
246     menuFile->AppendRadioItem(HtmlLbox_CustomBox, _T("Use custom box"),
247                               _T("Use a wxHtmlListBox virtual class control"));
248     menuFile->AppendRadioItem(HtmlLbox_SimpleBox, _T("Use simple box"),
249                               _T("Use a wxSimpleHtmlListBox control"));
250     menuFile->AppendSeparator();
251     menuFile->Append(HtmlLbox_Quit, _T("E&xit\tAlt-X"), _T("Quit this program"));
252 
253     // create our specific menu
254     wxMenu *menuHLbox = new wxMenu;
255     menuHLbox->Append(HtmlLbox_SetMargins,
256                       _T("Set &margins...\tCtrl-G"),
257                       _T("Change the margins around the items"));
258     menuHLbox->AppendCheckItem(HtmlLbox_DrawSeparator,
259                                _T("&Draw separators\tCtrl-D"),
260                                _T("Toggle drawing separators between cells"));
261     menuHLbox->AppendSeparator();
262     menuHLbox->AppendCheckItem(HtmlLbox_ToggleMulti,
263                                _T("&Multiple selection\tCtrl-M"),
264                                _T("Toggle multiple selection on/off"));
265     menuHLbox->AppendSeparator();
266     menuHLbox->Append(HtmlLbox_SelectAll, _T("Select &all items\tCtrl-A"));
267     menuHLbox->Append(HtmlLbox_UpdateItem, _T("Update &first item\tCtrl-U"));
268     menuHLbox->AppendSeparator();
269     menuHLbox->Append(HtmlLbox_SetBgCol, _T("Set &background...\tCtrl-B"));
270     menuHLbox->Append(HtmlLbox_SetSelBgCol,
271                       _T("Set &selection background...\tCtrl-S"));
272     menuHLbox->AppendCheckItem(HtmlLbox_SetSelFgCol,
273                                _T("Keep &foreground in selection\tCtrl-F"));
274 
275     menuHLbox->AppendSeparator();
276     menuHLbox->Append(HtmlLbox_Clear, _T("&Clear\tCtrl-L"));
277 
278     // the "About" item should be in the help menu
279     wxMenu *helpMenu = new wxMenu;
280     helpMenu->Append(HtmlLbox_About, _T("&About...\tF1"), _T("Show about dialog"));
281 
282     // now append the freshly created menu to the menu bar...
283     wxMenuBar *menuBar = new wxMenuBar();
284     menuBar->Append(menuFile, _T("&File"));
285     menuBar->Append(menuHLbox, _T("&Listbox"));
286     menuBar->Append(helpMenu, _T("&Help"));
287 
288     menuBar->Check(HtmlLbox_DrawSeparator, true);
289 
290     // ... and attach this menu bar to the frame
291     SetMenuBar(menuBar);
292 #endif // wxUSE_MENUS
293 
294 #if wxUSE_STATUSBAR
295     // create a status bar just for fun (by default with 1 pane only)
296     CreateStatusBar(2);
297     SetStatusText(_T("Welcome to wxWidgets!"));
298 #endif // wxUSE_STATUSBAR
299 
300     // create the child controls
301     CreateBox();
302     wxTextCtrl *text = new wxTextCtrl(this, wxID_ANY, _T(""),
303                                       wxDefaultPosition, wxDefaultSize,
304                                       wxTE_MULTILINE);
305     delete wxLog::SetActiveTarget(new wxLogTextCtrl(text));
306 
307     // and lay them out
308     wxSizer *sizer = new wxBoxSizer(wxHORIZONTAL);
309     sizer->Add(m_hlbox, 2, wxGROW);
310     sizer->Add(text, 3, wxGROW);
311 
312     SetSizer(sizer);
313 }
314 
~MyFrame()315 MyFrame::~MyFrame()
316 {
317     delete wxLog::SetActiveTarget(NULL);
318 }
319 
CreateBox()320 void MyFrame::CreateBox()
321 {
322     bool multi = GetMenuBar()->IsChecked(HtmlLbox_ToggleMulti);
323 
324     if ( GetMenuBar()->IsChecked(HtmlLbox_CustomBox) )
325     {
326         m_hlbox = new MyHtmlListBox(this, multi);
327     }
328     else // simple listbox
329     {
330         m_hlbox = new wxSimpleHtmlListBox(this, wxID_ANY, wxDefaultPosition, wxDefaultSize,
331                                           0, NULL, multi ? wxLB_MULTIPLE : 0);
332 
333         // unlike wxHtmlListBox which is abstract, wxSimpleHtmlListBox is a
334         // concrete control and doesn't support virtual mode, this we need
335         // to add all of its items from the beginning
336         wxArrayString arr;
337         for (size_t n = 0; n < 1000; n++ )
338         {
339             wxColour clr((unsigned char)(abs((int)n - 192) % 256),
340                          (unsigned char)(abs((int)n - 256) % 256),
341                          (unsigned char)(abs((int)n - 128) % 256));
342             int level = n % 6 + 1;
343 
344             wxString label = wxString::Format(_T("<h%d><font color=%s>")
345                     _T("Item</font> <b>%lu</b>")
346                     _T("</h%d>"),
347                     level,
348                     clr.GetAsString(wxC2S_HTML_SYNTAX).c_str(),
349                     (unsigned long)n, level);
350             arr.Add(label);
351         }
352 
353         GetSimpleBox()->Append(arr);
354     }
355 }
356 
357 
358 // ----------------------------------------------------------------------------
359 // menu event handlers
360 // ----------------------------------------------------------------------------
361 
OnSimpleOrCustomBox(wxCommandEvent & WXUNUSED (event))362 void MyFrame::OnSimpleOrCustomBox(wxCommandEvent& WXUNUSED(event))
363 {
364     wxWindow *old = m_hlbox;
365 
366     // we need to recreate the listbox
367     CreateBox();
368     GetSizer()->Replace(old, m_hlbox);
369     delete old;
370 
371     GetSizer()->Layout();
372     Refresh();
373 }
374 
OnQuit(wxCommandEvent & WXUNUSED (event))375 void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
376 {
377     // true is to force the frame to close
378     Close(true);
379 }
380 
OnAbout(wxCommandEvent & WXUNUSED (event))381 void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
382 {
383     wxMessageBox(_T("This sample shows wxHtmlListBox class.\n")
384                  _T("\n")
385                  _T("(c) 2003 Vadim Zeitlin"),
386                  _T("About HtmlLbox"),
387                  wxOK | wxICON_INFORMATION,
388                  this);
389 }
390 
OnSetMargins(wxCommandEvent & WXUNUSED (event))391 void MyFrame::OnSetMargins(wxCommandEvent& WXUNUSED(event))
392 {
393     long margin = wxGetNumberFromUser
394                   (
395                     _T("Enter the margins to use for the listbox items."),
396                     _T("Margin: "),
397                     _T("HtmlLbox: Set the margins"),
398                     0, 0, 20,
399                     this
400                   );
401 
402     if ( margin != -1 )
403     {
404         m_hlbox->SetMargins(margin, margin);
405         m_hlbox->RefreshAll();
406     }
407 }
408 
OnToggleMulti(wxCommandEvent & WXUNUSED (event))409 void MyFrame::OnToggleMulti(wxCommandEvent& WXUNUSED(event))
410 {
411     wxWindow *old = m_hlbox;
412 
413     // we need to recreate the listbox
414     CreateBox();
415     GetSizer()->Replace(old, m_hlbox);
416     delete old;
417 
418     GetSizer()->Layout();
419 }
420 
OnSelectAll(wxCommandEvent & WXUNUSED (event))421 void MyFrame::OnSelectAll(wxCommandEvent& WXUNUSED(event))
422 {
423     m_hlbox->SelectAll();
424 }
425 
OnUpdateUISelectAll(wxUpdateUIEvent & event)426 void MyFrame::OnUpdateUISelectAll(wxUpdateUIEvent& event)
427 {
428     event.Enable( m_hlbox && m_hlbox->HasMultipleSelection() );
429 }
430 
OnUpdateItem(wxCommandEvent & WXUNUSED (event))431 void MyFrame::OnUpdateItem(wxCommandEvent& WXUNUSED(event))
432 {
433     if (GetMyBox())
434         GetMyBox()->UpdateFirstItem();
435 }
436 
OnSetBgCol(wxCommandEvent & WXUNUSED (event))437 void MyFrame::OnSetBgCol(wxCommandEvent& WXUNUSED(event))
438 {
439     wxColour col = wxGetColourFromUser(this, m_hlbox->GetBackgroundColour());
440     if ( col.Ok() )
441     {
442         m_hlbox->SetBackgroundColour(col);
443         m_hlbox->Refresh();
444 
445 #if wxUSE_STATUSBAR
446         SetStatusText(_T("Background colour changed."));
447 #endif // wxUSE_STATUSBAR
448     }
449 }
450 
OnSetSelBgCol(wxCommandEvent & WXUNUSED (event))451 void MyFrame::OnSetSelBgCol(wxCommandEvent& WXUNUSED(event))
452 {
453     wxColour col = wxGetColourFromUser(this, m_hlbox->GetSelectionBackground());
454     if ( col.Ok() )
455     {
456         m_hlbox->SetSelectionBackground(col);
457         m_hlbox->Refresh();
458 
459 #if wxUSE_STATUSBAR
460         SetStatusText(_T("Selection background colour changed."));
461 #endif // wxUSE_STATUSBAR
462     }
463 }
464 
OnSetSelFgCol(wxCommandEvent & event)465 void MyFrame::OnSetSelFgCol(wxCommandEvent& event)
466 {
467     if (GetMyBox())
468     {
469         GetMyBox()->SetChangeSelFg(!event.IsChecked());
470         GetMyBox()->Refresh();
471     }
472 }
473 
OnClear(wxCommandEvent & WXUNUSED (event))474 void MyFrame::OnClear(wxCommandEvent& WXUNUSED(event))
475 {
476     m_hlbox->Clear();
477 }
478 
OnHtmlLinkClicked(wxHtmlLinkEvent & event)479 void MyFrame::OnHtmlLinkClicked(wxHtmlLinkEvent &event)
480 {
481     wxLogMessage(wxT("The url '%s' has been clicked!"), event.GetLinkInfo().GetHref().c_str());
482 
483     if (GetMyBox())
484     {
485         GetMyBox()->m_linkClicked = true;
486         GetMyBox()->RefreshLine(1);
487     }
488 }
489 
OnHtmlCellHover(wxHtmlCellEvent & event)490 void MyFrame::OnHtmlCellHover(wxHtmlCellEvent &event)
491 {
492     wxLogMessage(wxT("Mouse moved over cell %p at %d;%d"),
493                  event.GetCell(), event.GetPoint().x, event.GetPoint().y);
494 }
495 
OnHtmlCellClicked(wxHtmlCellEvent & event)496 void MyFrame::OnHtmlCellClicked(wxHtmlCellEvent &event)
497 {
498     wxLogMessage(wxT("Click over cell %p at %d;%d"),
499                  event.GetCell(), event.GetPoint().x, event.GetPoint().y);
500 
501     // if we don't skip the event, OnHtmlLinkClicked won't be called!
502     event.Skip();
503 }
504 
505 // ----------------------------------------------------------------------------
506 // listbox event handlers
507 // ----------------------------------------------------------------------------
508 
OnLboxSelect(wxCommandEvent & event)509 void MyFrame::OnLboxSelect(wxCommandEvent& event)
510 {
511     wxLogMessage(_T("Listbox selection is now %d."), event.GetInt());
512 
513     if ( m_hlbox->HasMultipleSelection() )
514     {
515         wxString s;
516 
517         bool first = true;
518         unsigned long cookie;
519         for ( int item = m_hlbox->GetFirstSelected(cookie);
520               item != wxNOT_FOUND;
521               item = m_hlbox->GetNextSelected(cookie) )
522         {
523             if ( first )
524                 first = false;
525             else
526                 s << _T(", ");
527 
528             s << item;
529         }
530 
531         if ( !s.empty() )
532             wxLogMessage(_T("Selected items: %s"), s.c_str());
533     }
534 
535 #if wxUSE_STATUSBAR
536     SetStatusText(wxString::Format(
537                     _T("# items selected = %lu"),
538                     (unsigned long)m_hlbox->GetSelectedCount()
539                   ));
540 #endif // wxUSE_STATUSBAR
541 }
542 
543 // ============================================================================
544 // MyHtmlListBox
545 // ============================================================================
546 
IMPLEMENT_DYNAMIC_CLASS(MyHtmlListBox,wxHtmlListBox)547 IMPLEMENT_DYNAMIC_CLASS(MyHtmlListBox, wxHtmlListBox)
548 
549 MyHtmlListBox::MyHtmlListBox(wxWindow *parent, bool multi)
550              : wxHtmlListBox(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize,
551                              multi ? wxLB_MULTIPLE : 0)
552 {
553     m_change = true;
554     m_firstItemUpdated = false;
555     m_linkClicked = false;
556 
557 
558     SetMargins(5, 5);
559 
560 #ifdef USE_HTML_FILE
561     if ( !m_file.Open(_T("results")) )
562     {
563         wxLogError(_T("Failed to open results file"));
564     }
565     else
566     {
567         SetItemCount(m_file.GetLineCount());
568     }
569 #else
570     SetItemCount(1000);
571 #endif
572 
573     SetSelection(3);
574 }
575 
OnDrawSeparator(wxDC & dc,wxRect & rect,size_t) const576 void MyHtmlListBox::OnDrawSeparator(wxDC& dc, wxRect& rect, size_t) const
577 {
578     if ( ((MyFrame *)GetParent())->
579             GetMenuBar()->IsChecked(HtmlLbox_DrawSeparator) )
580     {
581         dc.SetPen(*wxBLACK_DASHED_PEN);
582         dc.DrawLine(rect.x, rect.y, rect.GetRight(), rect.y);
583         dc.DrawLine(rect.x, rect.GetBottom(), rect.GetRight(), rect.GetBottom());
584     }
585 }
586 
OnGetItem(size_t n) const587 wxString MyHtmlListBox::OnGetItem(size_t n) const
588 {
589     if ( !n && m_firstItemUpdated )
590     {
591         return wxString::Format(_T("<h1><b>Just updated</b></h1>"));
592     }
593 
594 #ifdef USE_HTML_FILE
595     wxString s;
596     if ( m_file.IsOpened() )
597         s = m_file[n];
598 
599     return s;
600 #else
601     int level = n % 6 + 1;
602 
603     wxColour clr((unsigned char)(abs((int)n - 192) % 256),
604                  (unsigned char)(abs((int)n - 256) % 256),
605                  (unsigned char)(abs((int)n - 128) % 256));
606 
607     wxString label = wxString::Format(_T("<h%d><font color=%s>")
608                                       _T("Item</font> <b>%lu</b>")
609                                       _T("</h%d>"),
610                                       level,
611                                       clr.GetAsString(wxC2S_HTML_SYNTAX).c_str(),
612                                       (unsigned long)n, level);
613     if ( n == 1 )
614     {
615         if ( !m_linkClicked )
616             label += _T("<a href='1'>Click here...</a>");
617         else
618             label += _T("<font color='#9999ff'>Clicked here...</font>");
619     }
620 
621     return label;
622 #endif
623 }
624 
GetSelectedTextColour(const wxColour & colFg) const625 wxColour MyHtmlListBox::GetSelectedTextColour(const wxColour& colFg) const
626 {
627     return m_change ? wxHtmlListBox::GetSelectedTextColour(colFg) : colFg;
628 }
629 
UpdateFirstItem()630 void MyHtmlListBox::UpdateFirstItem()
631 {
632     m_firstItemUpdated = !m_firstItemUpdated;
633 
634     RefreshLine(0);
635 }
636