X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/293b15f78d8873a65837c3d165dd739ec23dad8c..6f026b5b63fe7ccb025e84509886f74772b9df13:/src/generic/vlbox.cpp?ds=sidebyside diff --git a/src/generic/vlbox.cpp b/src/generic/vlbox.cpp index df4a9bbfb0..e277070b3d 100644 --- a/src/generic/vlbox.cpp +++ b/src/generic/vlbox.cpp @@ -4,9 +4,8 @@ // Author: Vadim Zeitlin // Modified by: // Created: 31.05.03 -// RCS-ID: $Id$ // Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwindows.org> -// License: wxWindows license +// Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -51,6 +50,8 @@ BEGIN_EVENT_TABLE(wxVListBox, wxVScrolledWindow) EVT_SET_FOCUS(wxVListBox::OnSetOrKillFocus) EVT_KILL_FOCUS(wxVListBox::OnSetOrKillFocus) + + EVT_SIZE(wxVListBox::OnSize) END_EVENT_TABLE() // ============================================================================ @@ -58,6 +59,7 @@ END_EVENT_TABLE() // ============================================================================ IMPLEMENT_ABSTRACT_CLASS(wxVListBox, wxVScrolledWindow) +const char wxVListBoxNameStr[] = "wxVListBox"; // ---------------------------------------------------------------------------- // wxVListBox creation @@ -135,10 +137,10 @@ bool wxVListBox::IsSelected(size_t line) const bool wxVListBox::Select(size_t item, bool select) { wxCHECK_MSG( m_selStore, false, - _T("Select() may only be used with multiselection listbox") ); + wxT("Select() may only be used with multiselection listbox") ); wxCHECK_MSG( item < GetItemCount(), false, - _T("Select(): invalid item index") ); + wxT("Select(): invalid item index") ); bool changed = m_selStore->SelectItem(item, select); if ( changed ) @@ -155,7 +157,7 @@ bool wxVListBox::Select(size_t item, bool select) bool wxVListBox::SelectRange(size_t from, size_t to) { wxCHECK_MSG( m_selStore, false, - _T("SelectRange() may only be used with multiselection listbox") ); + wxT("SelectRange() may only be used with multiselection listbox") ); // make sure items are in correct order if ( from > to ) @@ -166,7 +168,7 @@ bool wxVListBox::SelectRange(size_t from, size_t to) } wxCHECK_MSG( to < GetItemCount(), false, - _T("SelectRange(): invalid item index") ); + wxT("SelectRange(): invalid item index") ); wxArrayInt changed; if ( !m_selStore->SelectRange(from, to, true, &changed) ) @@ -198,7 +200,7 @@ bool wxVListBox::SelectRange(size_t from, size_t to) bool wxVListBox::DoSelectAll(bool select) { wxCHECK_MSG( m_selStore, false, - _T("SelectAll may only be used with multiselection listbox") ); + wxT("SelectAll may only be used with multiselection listbox") ); size_t count = GetItemCount(); if ( count ) @@ -221,7 +223,7 @@ bool wxVListBox::DoSetCurrent(int current) { wxASSERT_MSG( current == wxNOT_FOUND || (current >= 0 && (size_t)current < GetItemCount()), - _T("wxVListBox::DoSetCurrent(): invalid item index") ); + wxT("wxVListBox::DoSetCurrent(): invalid item index") ); if ( current == m_current ) { @@ -246,7 +248,10 @@ bool wxVListBox::DoSetCurrent(int current) { // it is, indeed, only partly visible, so scroll it into view to // make it entirely visible + // BUT scrolling down when m_current is first visible makes it + // completely hidden, so that is even worse while ( (size_t)m_current + 1 == GetVisibleRowsEnd() && + (size_t)m_current != GetVisibleRowsBegin() && ScrollToRow(GetVisibleBegin() + 1) ) ; // but in any case refresh it as even if it was only partly visible @@ -258,15 +263,19 @@ bool wxVListBox::DoSetCurrent(int current) return true; } +void wxVListBox::InitEvent(wxCommandEvent& event, int n) +{ + event.SetEventObject(this); + event.SetInt(n); +} + void wxVListBox::SendSelectedEvent() { wxASSERT_MSG( m_current != wxNOT_FOUND, - _T("SendSelectedEvent() shouldn't be called") ); - - wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, GetId()); - event.SetEventObject(this); - event.SetInt(m_current); + wxT("SendSelectedEvent() shouldn't be called") ); + wxCommandEvent event(wxEVT_LISTBOX, GetId()); + InitEvent(event, m_current); (void)GetEventHandler()->ProcessEvent(event); } @@ -274,7 +283,7 @@ void wxVListBox::SetSelection(int selection) { wxCHECK_RET( selection == wxNOT_FOUND || (selection >= 0 && (size_t)selection < GetItemCount()), - _T("wxVListBox::SetSelection(): invalid item index") ); + wxT("wxVListBox::SetSelection(): invalid item index") ); if ( HasMultipleSelection() ) { @@ -304,7 +313,7 @@ int wxVListBox::GetFirstSelected(unsigned long& cookie) const int wxVListBox::GetNextSelected(unsigned long& cookie) const { wxCHECK_MSG( m_selStore, wxNOT_FOUND, - _T("GetFirst/NextSelected() may only be used with multiselection listboxes") ); + wxT("GetFirst/NextSelected() may only be used with multiselection listboxes") ); while ( cookie < GetItemCount() ) { @@ -424,11 +433,11 @@ void wxVListBox::OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const flags |= wxCONTROL_SELECTED; if ( IsCurrent(n) ) flags |= wxCONTROL_CURRENT; - if ( wxWindow::FindFocus() == wx_const_cast(wxVListBox*, this) ) + if ( wxWindow::FindFocus() == const_cast<wxVListBox*>(this) ) flags |= wxCONTROL_FOCUSED; wxRendererNative::Get().DrawItemSelectionRect( - wx_const_cast(wxVListBox *, this), dc, rect, flags); + const_cast<wxVListBox *>(this), dc, rect, flags); } } @@ -494,6 +503,11 @@ void wxVListBox::OnSetOrKillFocus(wxFocusEvent& WXUNUSED(event)) RefreshSelected(); } +void wxVListBox::OnSize(wxSizeEvent& event) +{ + UpdateScrollbar(); + event.Skip(); +} // ============================================================================ // wxVListBox keyboard/mouse handling @@ -593,14 +607,17 @@ void wxVListBox::OnKeyDown(wxKeyEvent& event) switch ( event.GetKeyCode() ) { case WXK_HOME: + case WXK_NUMPAD_HOME: current = 0; break; case WXK_END: + case WXK_NUMPAD_END: current = GetRowCount() - 1; break; case WXK_DOWN: + case WXK_NUMPAD_DOWN: if ( m_current == (int)GetRowCount() - 1 ) return; @@ -608,6 +625,7 @@ void wxVListBox::OnKeyDown(wxKeyEvent& event) break; case WXK_UP: + case WXK_NUMPAD_UP: if ( m_current == wxNOT_FOUND ) current = GetRowCount() - 1; else if ( m_current != 0 ) @@ -617,11 +635,13 @@ void wxVListBox::OnKeyDown(wxKeyEvent& event) break; case WXK_PAGEDOWN: + case WXK_NUMPAD_PAGEDOWN: PageDown(); current = GetVisibleBegin(); break; case WXK_PAGEUP: + case WXK_NUMPAD_PAGEUP: if ( m_current == (int)GetVisibleBegin() ) { PageUp(); @@ -699,10 +719,8 @@ void wxVListBox::OnLeftDClick(wxMouseEvent& eventMouse) // this event as a left-click instead if ( item == m_current ) { - wxCommandEvent event(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, GetId()); - event.SetEventObject(this); - event.SetInt(item); - + wxCommandEvent event(wxEVT_LISTBOX_DCLICK, GetId()); + InitEvent(event, item); (void)GetEventHandler()->ProcessEvent(event); } else