X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/999836aacade840a5d9a0cbb5fad7b1d4de62c93..0ffb2aa6e47721eebc485931efaad028b51b0565:/src/generic/listctrl.cpp diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index f5b0ef401a..4c7760728a 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; @@ -1738,7 +1732,8 @@ void wxListHeaderWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) // for this we need the width of the text wxCoord wLabel; - dc.GetTextExtent(item.GetText(), &wLabel, NULL); + wxCoord hLabel; + dc.GetTextExtent(item.GetText(), &wLabel, &hLabel); wLabel += 2*EXTRA_WIDTH; // and the width of the icon, if any @@ -1803,7 +1798,7 @@ void wxListHeaderWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) wxDCClipper clipper(dc, x, HEADER_OFFSET_Y, cw, h - 4 ); dc.DrawText( item.GetText(), - xAligned + EXTRA_WIDTH, HEADER_OFFSET_Y + EXTRA_HEIGHT ); + xAligned + EXTRA_WIDTH, h / 2 - hLabel / 2 ); //HEADER_OFFSET_Y + EXTRA_HEIGHT ); x += wCol; } @@ -1923,8 +1918,8 @@ void wxListHeaderWindow::OnMouse( wxMouseEvent &event ) { m_isDragging = TRUE; m_currentX = x; - DrawCurrent(); CaptureMouse(); + DrawCurrent(); } //else: column resizing was vetoed by the user code } @@ -1959,6 +1954,7 @@ void wxListHeaderWindow::OnMouse( wxMouseEvent &event ) void wxListHeaderWindow::OnSetFocus( wxFocusEvent &WXUNUSED(event) ) { m_owner->SetFocus(); + m_owner->Update(); } bool wxListHeaderWindow::SendListEvent(wxEventType type, wxPoint pos) @@ -2199,7 +2195,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 +2263,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 +2274,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; @@ -3036,8 +3027,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) ) { @@ -3046,9 +3039,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 { @@ -3076,6 +3069,9 @@ void wxListMainWindow::OnArrowChar(size_t newCurrent, const wxKeyEvent& event) { ChangeCurrent(newCurrent); + // refresh the old focus to remove it + RefreshLine( oldCurrent ); + // select all the items between the old and the new one if ( oldCurrent > newCurrent ) { @@ -3093,8 +3089,8 @@ void wxListMainWindow::OnArrowChar(size_t newCurrent, const wxKeyEvent& event) ChangeCurrent(newCurrent); - // refresh the old focus to remove it - RefreshLine( oldCurrent ); + // refresh the old focus to remove it + RefreshLine( oldCurrent ); if ( !event.ControlDown() ) { @@ -3102,6 +3098,7 @@ void wxListMainWindow::OnArrowChar(size_t newCurrent, const wxKeyEvent& event) } } + RefreshLine( m_current ); MoveToFocus(); @@ -3862,11 +3859,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; @@ -3930,9 +3927,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 @@ -3945,18 +3942,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) { @@ -4019,7 +4008,7 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh) SetScrollbars ( SCROLL_UNIT_X, - SCROLL_UNIT_Y, + lineHeight, (entireWidth + SCROLL_UNIT_X) / SCROLL_UNIT_X, 0, GetScrollPos( wxHORIZONTAL ), @@ -4612,6 +4601,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;