X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8a39593ebe391bed763e2baa22b113086709a450..6c72a026888de208bc7095b23dd16ea6c320a2bf:/src/generic/listctrl.cpp diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index dc42f4b08a..bdb8733169 100644 --- a/src/generic/listctrl.cpp +++ b/src/generic/listctrl.cpp @@ -106,9 +106,7 @@ DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_CACHE_HINT) // // the height of the header window (FIXME: should depend on its font!) // static const int HEADER_HEIGHT = 23; -// the scrollbar units static const int SCROLL_UNIT_X = 15; -static const int SCROLL_UNIT_Y = 15; // the spacing between the lines (in report mode) static const int LINE_SPACING = 0; @@ -1147,8 +1145,6 @@ void wxListLineData::CalculateSize( wxDC *dc, int spacing ) else // has label { dc->GetTextExtent( s, &lw, &lh ); - if (lh < SCROLL_UNIT_Y) - lh = SCROLL_UNIT_Y; lw += EXTRA_WIDTH; lh += EXTRA_HEIGHT; @@ -1189,8 +1185,6 @@ void wxListLineData::CalculateSize( wxDC *dc, int spacing ) s = item->GetTextForMeasuring(); dc->GetTextExtent( s, &lw, &lh ); - if (lh < SCROLL_UNIT_Y) - lh = SCROLL_UNIT_Y; lw += EXTRA_WIDTH; lh += EXTRA_HEIGHT; @@ -2199,7 +2193,7 @@ wxListMainWindow::wxListMainWindow( wxWindow *parent, wxSize sz = size; sz.y = 25; - SetScrollbars( SCROLL_UNIT_X, SCROLL_UNIT_Y, 0, 0, 0, 0 ); + SetScrollbars( 0, 0, 0, 0, 0, 0 ); SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_LISTBOX ) ); } @@ -2267,8 +2261,6 @@ wxListLineData *wxListMainWindow::GetDummyLine() const wxCoord wxListMainWindow::GetLineHeight() const { - wxASSERT_MSG( HasFlag(wxLC_REPORT), _T("only works in report mode") ); - // we cache the line height as calling GetTextExtent() is slow if ( !m_lineHeight ) { @@ -2280,9 +2272,6 @@ wxCoord wxListMainWindow::GetLineHeight() const wxCoord y; dc.GetTextExtent(_T("H"), NULL, &y); - if ( y < SCROLL_UNIT_Y ) - y = SCROLL_UNIT_Y; - if ( m_small_image_list && m_small_image_list->GetImageCount() ) { int iw = 0; @@ -2682,7 +2671,6 @@ void wxListMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) { wxPen pen(GetRuleColour(), 1, wxSOLID); - int col = 0; wxRect firstItemRect; wxRect lastItemRect; GetItemRect(visibleFrom, firstItemRect); @@ -2690,7 +2678,7 @@ void wxListMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) int x = firstItemRect.GetX(); dc.SetPen(pen); dc.SetBrush(* wxTRANSPARENT_BRUSH); - for (col = 0; col < GetColumnCount(); col++) + for (int col = 0; col < GetColumnCount(); col++) { int colWidth = GetColumnWidth(col); x += colWidth; @@ -2834,25 +2822,12 @@ bool wxListMainWindow::OnRenameAccept(size_t itemEdit, const wxString& value) le.IsAllowed(); } -#ifdef __VMS__ // Ignore unreacheable code -# pragma message disable initnotreach -#endif - -void wxListMainWindow::OnRenameCancelled(size_t WXUNUSED(itemEdit)) +void wxListMainWindow::OnRenameCancelled(size_t itemEdit) { - // wxMSW seems not to notify the program about - // cancelled label edits. - return; - - #if 0 - // above unconditional return cause warning about not reachable code - // let owner know that the edit was cancelled wxListEvent le( wxEVT_COMMAND_LIST_END_LABEL_EDIT, GetParent()->GetId() ); - // These only exist for wxTreeCtrl, which should probably be changed - // le.m_editCancelled = TRUE; - // le.m_label = wxEmptyString; + le.SetEditCanceled(TRUE); le.SetEventObject( GetParent() ); le.m_itemIndex = itemEdit; @@ -2863,11 +2838,7 @@ void wxListMainWindow::OnRenameCancelled(size_t WXUNUSED(itemEdit)) data->GetItem( 0, le.m_item ); GetEventHandler()->ProcessEvent( le ); - #endif } -#ifdef __VMS__ -# pragma message enable initnotreach -#endif void wxListMainWindow::OnMouse( wxMouseEvent &event ) { @@ -3054,8 +3025,10 @@ void wxListMainWindow::MoveToItem(size_t item) int client_w, client_h; GetClientSize( &client_w, &client_h ); + const int hLine = GetLineHeight(); + int view_x = SCROLL_UNIT_X*GetScrollPos( wxHORIZONTAL ); - int view_y = SCROLL_UNIT_Y*GetScrollPos( wxVERTICAL ); + int view_y = hLine*GetScrollPos( wxVERTICAL ); if ( HasFlag(wxLC_REPORT) ) { @@ -3064,9 +3037,9 @@ void wxListMainWindow::MoveToItem(size_t item) ResetVisibleLinesRange(); if (rect.y < view_y ) - Scroll( -1, rect.y/SCROLL_UNIT_Y ); + Scroll( -1, rect.y/hLine ); if (rect.y+rect.height+5 > view_y+client_h) - Scroll( -1, (rect.y+rect.height-client_h+SCROLL_UNIT_Y)/SCROLL_UNIT_Y ); + Scroll( -1, (rect.y+rect.height-client_h+hLine)/hLine ); } else // !report { @@ -3213,15 +3186,7 @@ void wxListMainWindow::OnChar( wxKeyEvent &event ) case WXK_PRIOR: { - int steps = 0; - if ( HasFlag(wxLC_REPORT) ) - { - steps = m_linesPerPage - 1; - } - else - { - steps = m_current % m_linesPerPage; - } + int steps = HasFlag(wxLC_REPORT) ? m_linesPerPage - 1 : m_current % m_linesPerPage; int index = m_current - steps; if (index < 0) @@ -3233,15 +3198,9 @@ void wxListMainWindow::OnChar( wxKeyEvent &event ) case WXK_NEXT: { - int steps = 0; - if ( HasFlag(wxLC_REPORT) ) - { - steps = m_linesPerPage - 1; - } - else - { - steps = m_linesPerPage - (m_current % m_linesPerPage) - 1; - } + int steps = HasFlag(wxLC_REPORT) + ? m_linesPerPage - 1 + : m_linesPerPage - (m_current % m_linesPerPage) - 1; size_t index = m_current + steps; size_t count = GetItemCount(); @@ -3328,6 +3287,14 @@ void wxListMainWindow::SetFocus() void wxListMainWindow::OnSetFocus( wxFocusEvent &WXUNUSED(event) ) { + if ( GetParent() ) + { + wxFocusEvent event( wxEVT_SET_FOCUS, GetParent()->GetId() ); + event.SetEventObject( GetParent() ); + if ( GetParent()->GetEventHandler()->ProcessEvent( event) ) + return; + } + // wxGTK sends us EVT_SET_FOCUS events even if we had never got // EVT_KILL_FOCUS before which means that we finish by redrawing the items // which are already drawn correctly resulting in horrible flicker - avoid @@ -3338,19 +3305,18 @@ void wxListMainWindow::OnSetFocus( wxFocusEvent &WXUNUSED(event) ) RefreshSelected(); } - - if ( !GetParent() ) - return; - - wxFocusEvent event( wxEVT_SET_FOCUS, GetParent()->GetId() ); - event.SetEventObject( GetParent() ); - GetParent()->GetEventHandler()->ProcessEvent( event ); } void wxListMainWindow::OnKillFocus( wxFocusEvent &WXUNUSED(event) ) { + if ( GetParent() ) + { + wxFocusEvent event( wxEVT_KILL_FOCUS, GetParent()->GetId() ); + event.SetEventObject( GetParent() ); + if ( GetParent()->GetEventHandler()->ProcessEvent( event) ) + return; + } m_hasFocus = FALSE; - RefreshSelected(); } @@ -3887,11 +3853,11 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh) clientHeight; GetSize( &clientWidth, &clientHeight ); + const int lineHeight = GetLineHeight(); + if ( HasFlag(wxLC_REPORT) ) { // all lines have the same height and we scroll one line per step - int lineHeight = GetLineHeight(); - int entireHeight = count*lineHeight + LINE_SPACING; m_linesPerPage = clientHeight / lineHeight; @@ -3955,9 +3921,9 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh) SetScrollbars ( SCROLL_UNIT_X, - SCROLL_UNIT_Y, + lineHeight, (x + SCROLL_UNIT_X) / SCROLL_UNIT_X, - (y + SCROLL_UNIT_Y) / SCROLL_UNIT_Y, + (y + lineHeight) / lineHeight, GetScrollPos( wxHORIZONTAL ), GetScrollPos( wxVERTICAL ), TRUE @@ -3970,18 +3936,10 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh) // scrollbar int entireWidth = 0; - #if 0 - // entireHeight is not used so no need to define it - int entireHeight = 0; - #endif for (int tries = 0; tries < 2; tries++) { entireWidth = 2*EXTRA_BORDER_X; - #if 0 - // entireHeight is not used so no need to define it - entireHeight = 2*EXTRA_BORDER_Y; - #endif if (tries == 1) { @@ -4033,7 +3991,6 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh) clientHeight -= wxSystemSettings:: GetMetric(wxSYS_HSCROLL_Y); m_linesPerPage = 0; - currentlyVisibleLines = 0; break; } @@ -4045,7 +4002,7 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh) SetScrollbars ( SCROLL_UNIT_X, - SCROLL_UNIT_Y, + lineHeight, (entireWidth + SCROLL_UNIT_X) / SCROLL_UNIT_X, 0, GetScrollPos( wxHORIZONTAL ), @@ -4576,6 +4533,17 @@ wxGenericListCtrl::wxGenericListCtrl() m_headerHeight = 0; } +wxGenericListCtrl::wxGenericListCtrl(wxWindow *parent, + wxWindowID winid, + const wxPoint &pos, + const wxSize &size, + long style, + const wxValidator& validator, + const wxString &name) +{ + Create(parent, winid, pos, size, style, validator, name); +} + wxGenericListCtrl::~wxGenericListCtrl() { if (m_ownsImageListNormal) @@ -4595,8 +4563,8 @@ void wxGenericListCtrl::CalculateAndSetHeaderHeight() m_headerWin->GetTextExtent(wxT("Hg"), &w, &h, &d); h += d + 2 * HEADER_OFFSET_Y + EXTRA_HEIGHT; - // only update if there is not enough space - if ( h > m_headerHeight ) + // only update if changed + if ( h != m_headerHeight ) { m_headerHeight = h; @@ -4638,6 +4606,8 @@ bool wxGenericListCtrl::Create(wxWindow *parent, m_mainWin = (wxListMainWindow*) NULL; m_headerWin = (wxListHeaderWindow*) NULL; + m_headerHeight = 0; + if ( !(style & wxLC_MASK_TYPE) ) { style = style | wxLC_LIST; @@ -5335,7 +5305,8 @@ int wxGenericListCtrl::OnGetItemImage(long WXUNUSED(item)) const return -1; } -wxListItemAttr *wxGenericListCtrl::OnGetItemAttr(long item) const +wxListItemAttr * +wxGenericListCtrl::OnGetItemAttr(long WXUNUSED_UNLESS_DEBUG(item)) const { wxASSERT_MSG( item >= 0 && item < GetItemCount(), _T("invalid item index in OnGetItemAttr()") ); @@ -5422,5 +5393,39 @@ void wxGenericListCtrl::Thaw() m_mainWin->Thaw(); } +#if !defined(__WXMSW__) || defined(__WIN16__) || defined(__WXUNIVERSAL__) + +wxListCtrl::wxListCtrl() +{ +} + +wxListCtrl::wxListCtrl(wxWindow *parent, + wxWindowID winid, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator &validator, + const wxString &name) + : wxGenericListCtrl(parent, winid, pos, size, style, validator, name) +{ +} + +#endif // !__WXMSW__ || __WIN16__ || __WXUNIVERSAL__ + +wxListView::wxListView() +{ +} + +wxListView::wxListView(wxWindow *parent, + wxWindowID winid, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString &name) +{ + Create(parent, winid, pos, size, style, validator, name); +} + #endif // wxUSE_LISTCTRL