#include "wx/wxprec.h"
#ifdef __BORLANDC__
-#pragma hdrstop
+ #pragma hdrstop
#endif
#if wxUSE_LISTCTRL
-#ifndef WX_PRECOMP
- #include "wx/app.h"
- #include "wx/dynarray.h"
- #include "wx/dcscreen.h"
- #include "wx/textctrl.h"
-#endif
-
// under Win32 we always use the native version and also may use the generic
// one, however some things should be done only if we use only the generic
// version
IMPLEMENT_DYNAMIC_CLASS(wxListCtrl, wxGenericListCtrl)
#endif // HAVE_NATIVE_LISTCTRL/!HAVE_NATIVE_LISTCTRL
+#ifndef WX_PRECOMP
+ #include "wx/dynarray.h"
+ #include "wx/app.h"
+ #include "wx/dcscreen.h"
+ #include "wx/textctrl.h"
+ #include "wx/listbox.h"
+ #include "wx/math.h"
+#endif
+
#include "wx/selstore.h"
#include "wx/renderer.h"
-#include "wx/math.h"
#ifdef __WXMAC__
#include "wx/mac/private.h"
{
protected:
wxListMainWindow *m_owner;
- wxCursor *m_currentCursor;
+ const wxCursor *m_currentCursor;
wxCursor *m_resizeCursor;
bool m_isDragging;
long FindItem( long start, const wxString& str, bool partial = false );
long FindItem( long start, wxUIntPtr data);
long FindItem( const wxPoint& pt );
- long HitTest( int x, int y, int &flags );
+ long HitTest( int x, int y, int &flags ) const;
void InsertItem( wxListItem &item );
void InsertColumn( long col, wxListItem &item );
int GetItemWidthWithImage(wxListItem * item);
{
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
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) )
m_text->Create(owner, wxID_ANY, m_startValue,
wxPoint(rectLabel.x-4,rectLabel.y-4),
wxSize(rectLabel.width+11,rectLabel.height+8));
+ m_text->SetFocus();
+
m_text->PushEventHandler(this);
}
m_text->RemoveEventHandler(this);
m_owner->FinishEditing(m_text);
- delete this;
+ wxPendingDelete.Append( this );
}
}
break;
case WXK_ESCAPE:
- Finish();
m_owner->OnRenameCancelled( m_itemEdited );
+ Finish();
break;
default:
{
if ( !m_finished && !m_aboutToFinish )
{
- // We must finish regardless of success, otherwise we'll get
- // focus problems:
- Finish();
-
if ( !AcceptChanges() )
m_owner->OnRenameCancelled( m_itemEdited );
+
+ Finish();
}
- // We must let the native text control handle focus, too, otherwise
- // it could have problems with the cursor (e.g., in wxGTK).
+ // We must let the native text control handle focus
event.Skip();
}
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
wxRect rect = InReportView() ? GetLineRect(line)
: GetLineLabelRect(line);
- if ( rect.Inside(x, y) )
+ if ( rect.Contains(x, y) )
return wxLIST_HITTEST_ONITEMLABEL;
}
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() )
{
{
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
// reset the selection and bail out
HighlightAll(false);
}
-
+
return;
}
}
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 );
+ }
}
}
return;
}
- switch (event.GetKeyCode())
+ // don't use m_linesPerPage directly as it might not be computed yet
+ 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:
if ( m_current > 0 )
case WXK_PAGEUP:
{
- // we get a floating point exception without this
- if (m_linesPerPage == 0)
- m_linesPerPage = 1;
-
- int steps = InReportView() ? m_linesPerPage - 1 : m_current % m_linesPerPage;
+ int steps = InReportView() ? pageSize - 1
+ : m_current % pageSize;
int index = m_current - steps;
if (index < 0)
case WXK_PAGEDOWN:
{
- // we get a floating point exception without this
- if (m_linesPerPage == 0)
- m_linesPerPage = 1;
-
int steps = InReportView()
- ? m_linesPerPage - 1
- : m_linesPerPage - (m_current % m_linesPerPage) - 1;
+ ? pageSize - 1
+ : pageSize - (m_current % pageSize) - 1;
size_t index = m_current + steps;
size_t count = GetItemCount();
case WXK_LEFT:
if ( !InReportView() )
{
- int index = m_current - m_linesPerPage;
+ int index = m_current - pageSize;
if (index < 0)
index = 0;
case WXK_RIGHT:
if ( !InReportView() )
{
- size_t index = m_current + m_linesPerPage;
+ size_t index = m_current + pageSize;
size_t count = GetItemCount();
if ( index >= count )
return wxNOT_FOUND;
}
-long wxListMainWindow::HitTest( int x, int y, int &flags )
+long wxListMainWindow::HitTest( int x, int y, int &flags ) const
{
CalcUnscrolledPosition( x, y, &x, &y );
void wxListMainWindow::OnScroll(wxScrollWinEvent& event)
{
- int cw, ch, vw, vh;
- GetVirtualSize(&vw, &vh);
- GetClientSize(&cw, &ch);
-
- if( event.GetOrientation() == wxVERTICAL && ch >= vh)
- return;
- // update our idea of which lines are shown when we redraw the window the
+ // update our idea of which lines are shown when we redraw the window the
// next time
ResetVisibleLinesRange();
return wxSize(spacing, spacing);
}
+#if WXWIN_COMPATIBILITY_2_6
int wxGenericListCtrl::GetItemSpacing( bool isSmall ) const
{
return m_mainWin->GetItemSpacing( isSmall );
}
+#endif // WXWIN_COMPATIBILITY_2_6
void wxGenericListCtrl::SetItemTextColour( long item, const wxColour &col )
{
return m_mainWin->FindItem( pt );
}
-long wxGenericListCtrl::HitTest( const wxPoint &point, int &flags )
+// TODO: sub item hit testing
+long wxGenericListCtrl::HitTest(const wxPoint& point, int& flags, long *) const
{
return m_mainWin->HitTest( (int)point.x, (int)point.y, flags );
}
return true;
}
-#if _USE_VISATTR
-#include "wx/listbox.h"
-#endif
-
// static
wxVisualAttributes
wxGenericListCtrl::GetClassDefaultAttributes(wxWindowVariant variant)
void wxGenericListCtrl::DoClientToScreen( int *x, int *y ) const
{
- return m_mainWin->DoClientToScreen(x, y);
+ m_mainWin->DoClientToScreen(x, y);
}
void wxGenericListCtrl::DoScreenToClient( int *x, int *y ) const
{
- return m_mainWin->DoScreenToClient(x, y);
+ m_mainWin->DoScreenToClient(x, y);
}
void wxGenericListCtrl::SetFocus()