X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9a9b4940a1f8eef8eb3e7ff65ed45f1daf14c2d9..eed9e4791274d68ea1fb0c556bf3199ecf88a7d9:/src/generic/vlbox.cpp diff --git a/src/generic/vlbox.cpp b/src/generic/vlbox.cpp index 86501ead57..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,6 +68,7 @@ bool wxVListBox::Create(wxWindow *parent, long style, const wxString& name) { + style |= wxWANTS_CHARS; if ( !wxVScrolledWindow::Create(parent, id, pos, size, style, name) ) return false; @@ -73,6 +76,12 @@ bool wxVListBox::Create(wxWindow *parent, 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; @@ -249,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); } @@ -316,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); @@ -341,25 +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 ) - { - dc.SetBrush(wxBrush(m_colBgSel, wxSOLID)); - } - 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); @@ -474,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: @@ -525,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; }