X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/970b97a267e1e60f4e269fb15317d9364526ac21..a72f1d162b1f511d3e9fa54304be695f07c79832:/src/generic/vlbox.cpp?ds=inline diff --git a/src/generic/vlbox.cpp b/src/generic/vlbox.cpp index bc846054a2..989f6f797d 100644 --- a/src/generic/vlbox.cpp +++ b/src/generic/vlbox.cpp @@ -48,6 +48,8 @@ END_EVENT_TABLE() // implementation // ============================================================================ +IMPLEMENT_ABSTRACT_CLASS(wxVListBox, wxVScrolledWindow) + // ---------------------------------------------------------------------------- // wxVListBox creation // ---------------------------------------------------------------------------- @@ -66,14 +68,22 @@ bool wxVListBox::Create(wxWindow *parent, long style, const wxString& name) { + style |= wxWANTS_CHARS; if ( !wxVScrolledWindow::Create(parent, id, pos, size, style, name) ) return false; - SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_LISTBOX)); - if ( style & wxLB_MULTIPLE ) m_selStore = new wxSelectionStore; + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_LISTBOX)); + SetForegroundColour(parent->GetForegroundColour()); + + // ensure that the font actually changes and is set. + SetFont(wxNullFont); + SetFont(parent->GetFont()); + + m_colBgSel = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT); + return true; } @@ -248,8 +258,11 @@ void wxVListBox::SetSelection(int selection) (selection >= 0 && (size_t)selection < GetItemCount()), _T("wxVListBox::SetSelection(): invalid item index") ); - wxASSERT_MSG( !HasMultipleSelection(), - _T("SetSelection() is invalid with multiselection listbox") ); + if ( HasMultipleSelection() ) + { + Select(selection); + m_anchor = selection; + } DoSetCurrent(selection); } @@ -282,7 +295,7 @@ int wxVListBox::GetNextSelected(unsigned long& cookie) const } // ---------------------------------------------------------------------------- -// wxVListBox painting +// wxVListBox appearance parameters // ---------------------------------------------------------------------------- void wxVListBox::SetMargins(const wxPoint& pt) @@ -295,6 +308,15 @@ void wxVListBox::SetMargins(const wxPoint& pt) } } +void wxVListBox::SetSelectionBackground(const wxColour& col) +{ + m_colBgSel = col; +} + +// ---------------------------------------------------------------------------- +// wxVListBox painting +// ---------------------------------------------------------------------------- + wxCoord wxVListBox::OnGetLineHeight(size_t line) const { return OnMeasureItem(line) + 2*m_ptMargins.y; @@ -306,7 +328,30 @@ void wxVListBox::OnDrawSeparator(wxDC& WXUNUSED(dc), { } -void wxVListBox::OnPaint(wxPaintEvent& event) +void wxVListBox::OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const +{ + // we need to render selected and current items differently + const bool isSelected = IsSelected(n), + isCurrent = IsCurrent(n); + if ( isSelected || isCurrent ) + { + if ( isSelected ) + { + dc.SetBrush(wxBrush(m_colBgSel, wxSOLID)); + } + else // !selected + { + dc.SetBrush(*wxTRANSPARENT_BRUSH); + } + + dc.SetPen(*(isCurrent ? wxBLACK_PEN : wxTRANSPARENT_PEN)); + + dc.DrawRectangle(rect); + } + //else: do nothing for the normal items +} + +void wxVListBox::OnPaint(wxPaintEvent& WXUNUSED(event)) { wxPaintDC dc(this); @@ -331,28 +376,9 @@ void wxVListBox::OnPaint(wxPaintEvent& event) // don't allow drawing outside of the lines rectangle wxDCClipper clip(dc, rectLine); - // we need to render selected and current items differently - const bool isSelected = IsSelected(line); - if ( isSelected || IsCurrent(line) ) - { - if ( isSelected ) - { - wxBrush brush(wxSystemSettings:: - GetColour(wxSYS_COLOUR_HIGHLIGHT), - wxSOLID); - dc.SetBrush(brush); - } - else // !selected - { - dc.SetBrush(*wxTRANSPARENT_BRUSH); - } - - dc.SetPen(*(IsCurrent(line) ? wxBLACK_PEN : wxTRANSPARENT_PEN)); - - dc.DrawRectangle(rectLine); - } - wxRect rect = rectLine; + OnDrawBackground(dc, rect, line); + OnDrawSeparator(dc, rect, line); rect.Deflate(m_ptMargins.x, m_ptMargins.y); @@ -467,7 +493,7 @@ void wxVListBox::OnKeyDown(wxKeyEvent& event) // flags for DoHandleItemClick() int flags = ItemClick_Kbd; - int current = 0; // just to silent the stupid compiler warnings + int current; switch ( event.GetKeyCode() ) { case WXK_HOME: @@ -518,8 +544,23 @@ void wxVListBox::OnKeyDown(wxKeyEvent& event) current = m_current; break; +#ifdef __WXMSW__ + case WXK_TAB: + // Since we are using wxWANTS_CHARS we need to send navigation + // events for the tabs on MSW + { + wxNavigationKeyEvent ne; + ne.SetDirection(!event.ShiftDown()); + ne.SetCurrentFocus(this); + ne.SetEventObject(this); + GetParent()->GetEventHandler()->ProcessEvent(ne); + } + // fall through to default +#endif default: event.Skip(); + current = 0; // just to silent the stupid compiler warnings + wxUnusedVar(current); return; }