X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/18680f86512504f043ad5d0b222afc7be87aa3e9..923608c3ac95e2c705fb0f49ab48fbe62fc871bd:/src/generic/listctrl.cpp?ds=sidebyside diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index 93b28ecb70..c6585cd069 100644 --- a/src/generic/listctrl.cpp +++ b/src/generic/listctrl.cpp @@ -961,7 +961,7 @@ bool wxListItemData::IsHit( int x, int y ) const { wxCHECK_MSG( m_rect, false, _T("can't be called in this mode") ); - return wxRect(GetX(), GetY(), GetWidth(), GetHeight()).Inside(x, y); + return wxRect(GetX(), GetY(), GetWidth(), GetHeight()).Contains(x, y); } int wxListItemData::GetX() const @@ -1698,11 +1698,27 @@ void wxListHeaderWindow::AdjustDC(wxDC& dc) int xpix; m_owner->GetScrollPixelsPerUnit( &xpix, NULL ); - int x; - m_owner->GetViewStart( &x, NULL ); + int view_start; + m_owner->GetViewStart( &view_start, NULL ); + + if (GetLayoutDirection() == wxLayout_RightToLeft) + { + // FIXME: we need a better way for RTL scrolling.. + int scroll_lines = m_owner->GetScrollLines( wxHORIZONTAL ); + if (scroll_lines) + { + int client_size = m_owner->GetClientSize().x; + view_start = scroll_lines - (client_size / xpix) - view_start; + view_start = -view_start; + } + } + + int org_x = 0; + int org_y = 0; + dc.GetDeviceOrigin( &org_x, &org_y ); // account for the horz scrollbar offset - dc.SetDeviceOrigin( -x * xpix, 0 ); + dc.SetDeviceOrigin( org_x - (view_start * xpix), org_y ); } void wxListHeaderWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) @@ -2381,7 +2397,7 @@ long wxListMainWindow::HitTestLine(size_t line, int x, int y) const wxListLineData *ld = GetLine(line); - if ( ld->HasImage() && GetLineIconRect(line).Inside(x, y) ) + if ( ld->HasImage() && GetLineIconRect(line).Contains(x, y) ) return wxLIST_HITTEST_ONITEMICON; // VS: Testing for "ld->HasText() || InReportView()" instead of @@ -2392,7 +2408,7 @@ long wxListMainWindow::HitTestLine(size_t line, int x, int y) const wxRect rect = InReportView() ? GetLineRect(line) : GetLineLabelRect(line); - if ( rect.Inside(x, y) ) + if ( rect.Contains(x, y) ) return wxLIST_HITTEST_ONITEMLABEL; } @@ -2629,9 +2645,9 @@ void wxListMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) GetVisibleLinesRange(&visibleFrom, &visibleTo); wxRect rectLine; - wxCoord xOrig, yOrig; - CalcUnscrolledPosition(0, 0, &xOrig, &yOrig); - + int xOrig = dc.LogicalToDeviceX( 0 ); + int yOrig = dc.LogicalToDeviceY( 0 ); + // tell the caller cache to cache the data if ( IsVirtual() ) { @@ -2647,7 +2663,8 @@ void wxListMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) { rectLine = GetLineRect(line); - if ( !IsExposed(rectLine.x - xOrig, rectLine.y - yOrig, + + if ( !IsExposed(rectLine.x + xOrig, rectLine.y + yOrig, rectLine.width, rectLine.height) ) { // don't redraw unaffected lines to avoid flicker @@ -3138,10 +3155,22 @@ void wxListMainWindow::MoveToItem(size_t item) } else // !report { - if (rect.x-view_x < 5) - Scroll( (rect.x - 5) / SCROLL_UNIT_X, -1 ); - if (rect.x + rect.width - 5 > view_x + client_w) - Scroll( (rect.x + rect.width - client_w + SCROLL_UNIT_X) / SCROLL_UNIT_X, -1 ); + if (GetLayoutDirection() == wxLayout_RightToLeft) + { +#if 0 + wxPrintf( wxT("rect %d %d %d %d view_x %d\n"), rect.x, rect.y, rect.width, rect.height, view_x ); + int virtual_width = GetVirtualSize().x; + view_x = virtual_width - view_x - client_w; + wxPrintf( wxT("virtual_width %d view_x = %d client_w = %d\n"), virtual_width, view_x, client_w ); +#endif + } + else + { + if (rect.x-view_x < 5) + Scroll( (rect.x - 5) / SCROLL_UNIT_X, -1 ); + if (rect.x + rect.width - 5 > view_x + client_w) + Scroll( (rect.x + rect.width - client_w + SCROLL_UNIT_X) / SCROLL_UNIT_X, -1 ); + } } } @@ -3264,6 +3293,14 @@ void wxListMainWindow::OnChar( wxKeyEvent &event ) const int pageSize = GetCountPerPage(); wxCHECK_RET( pageSize, _T("should have non zero page size") ); + if (GetLayoutDirection() == wxLayout_RightToLeft) + { + if (event.GetKeyCode() == WXK_RIGHT) + event.m_keyCode = WXK_LEFT; + else if (event.GetKeyCode() == WXK_LEFT) + event.m_keyCode = WXK_RIGHT; + } + switch ( event.GetKeyCode() ) { case WXK_UP: