]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/listctrl.cpp
added test mode to wxLongLongWx which allowed to find the bug in operator*=()
[wxWidgets.git] / src / generic / listctrl.cpp
index bb31a04f6acaa780a4c0a1885aea16c1a1a1568d..98060e7927f09c674755b70a50727870b93f2771 100644 (file)
@@ -295,7 +295,7 @@ void wxListLineData::CalculateSize( wxDC *dc, int spacing )
             {
                 wxListItemData *item = (wxListItemData*)node->Data();
                 wxString s = item->GetText();
-                long lw,lh;
+                wxCoord lw,lh;
                 dc->GetTextExtent( s, &lw, &lh );
                 if (lw > m_spacing) m_bound_all.width = lw;
             }
@@ -308,14 +308,14 @@ void wxListLineData::CalculateSize( wxDC *dc, int spacing )
             {
                 wxListItemData *item = (wxListItemData*)node->Data();
                 wxString s = item->GetText();
-                long lw,lh;
+                wxCoord lw,lh;
                 dc->GetTextExtent( s, &lw, &lh );
                 m_bound_all.width = lw;
                 m_bound_all.height = lh;
                 if (item->HasImage())
                 {
-                    int w = 0;
-                    int h = 0;
+                    wxCoord w = 0;
+                    wxCoord h = 0;
                     m_owner->GetImageSize( item->GetImage(), w, h );
                     m_bound_all.width += 4 + w;
                     if (h > m_bound_all.height) m_bound_all.height = h;
@@ -334,7 +334,7 @@ void wxListLineData::CalculateSize( wxDC *dc, int spacing )
                 wxString s;
                 item->GetText( s );
                 if (s.IsNull()) s = "H";
-                long lw,lh;
+                wxCoord lw,lh;
                 dc->GetTextExtent( s, &lw, &lh );
                 item->SetSize( item->GetWidth(), lh );
                 m_bound_all.width += lw;
@@ -384,7 +384,7 @@ void wxListLineData::SetPosition( wxDC *dc, int x, int y, int window_width )
                 {
                     wxString s;
                     item->GetText( s );
-                    long lw,lh;
+                    wxCoord lw,lh;
                     dc->GetTextExtent( s, &lw, &lh );
                     if (m_bound_all.width > m_spacing)
                         m_bound_label.x = m_bound_all.x;
@@ -432,7 +432,7 @@ void wxListLineData::SetPosition( wxDC *dc, int x, int y, int window_width )
         }
         case wxLC_REPORT:
         {
-            long lw,lh;
+            wxCoord lw,lh;
             dc->GetTextExtent( "H", &lw, &lh );
             m_bound_all.x = 0;
             m_bound_all.y -= 0;
@@ -448,7 +448,7 @@ void wxListLineData::SetPosition( wxDC *dc, int x, int y, int window_width )
                 wxString s;
                 item->GetText( s );
                 if (s.IsEmpty()) s = wxT("H");
-                long lw,lh;
+                wxCoord lw,lh;
                 dc->GetTextExtent( s, &lw, &lh );
                 m_bound_label.width = lw;
                 m_bound_label.height = lh;
@@ -471,8 +471,7 @@ void wxListLineData::SetPosition( wxDC *dc, int x, int y, int window_width )
 
 void wxListLineData::SetColumnPosition( int index, int x )
 {
-    int i = index;
-    wxNode *node = m_items.Nth( i );
+    wxNode *node = m_items.Nth( (size_t)index );
     if (node)
     {
         wxListItemData *item = (wxListItemData*)node->Data();
@@ -586,9 +585,13 @@ int wxListLineData::GetImage( int index )
 void wxListLineData::SetAttributes(wxDC *dc,
                                    const wxListItemAttr *attr,
                                    const wxColour& colText,
-                                   const wxFont& font)
+                                   const wxFont& font,
+                                   bool hilight)
 {
-    if ( attr && attr->HasTextColour() )
+    // don't use foregroud colour for drawing highlighted items - this might
+    // make them completely invisible (and there is no way to do bit
+    // arithmetics on wxColour, unfortunately)
+    if ( !hilight && attr && attr->HasTextColour() )
     {
         dc->SetTextForeground(attr->GetTextColour());
     }
@@ -609,10 +612,10 @@ void wxListLineData::SetAttributes(wxDC *dc,
 
 void wxListLineData::DoDraw( wxDC *dc, bool hilight, bool paintBG )
 {
-    long dev_x = dc->LogicalToDeviceX( m_bound_all.x-2 );
-    long dev_y = dc->LogicalToDeviceY( m_bound_all.y-2 );
-    long dev_w = dc->LogicalToDeviceXRel( m_bound_all.width+4 );
-    long dev_h = dc->LogicalToDeviceYRel( m_bound_all.height+4 );
+    wxCoord dev_x = dc->LogicalToDeviceX( m_bound_all.x-2 );
+    wxCoord dev_y = dc->LogicalToDeviceY( m_bound_all.y-2 );
+    wxCoord dev_w = dc->LogicalToDeviceXRel( m_bound_all.width+4 );
+    wxCoord dev_h = dc->LogicalToDeviceYRel( m_bound_all.height+4 );
 
     if (!m_owner->IsExposed( dev_x, dev_y, dev_w, dev_h ))
     {
@@ -640,7 +643,7 @@ void wxListLineData::DoDraw( wxDC *dc, bool hilight, bool paintBG )
     //     customize the subitems (in report mode) too.
     wxListItemData *item = (wxListItemData*)m_items.First()->Data();
     wxListItemAttr *attr = item->GetAttributes();
-    SetAttributes(dc, attr, colText, font);
+    SetAttributes(dc, attr, colText, font, hilight);
 
     bool hasBgCol = attr && attr->HasBackgroundColour();
     if ( paintBG || hasBgCol )
@@ -706,11 +709,11 @@ void wxListLineData::DoDraw( wxDC *dc, bool hilight, bool paintBG )
 void wxListLineData::Hilight( bool on )
 {
     if (on == m_hilighted) return;
+    m_hilighted = on;
     if (on)
         m_owner->SelectLine( this );
     else
         m_owner->DeselectLine( this );
-    m_hilighted = on;
 }
 
 void wxListLineData::ReverseHilight( void )
@@ -853,7 +856,9 @@ void wxListHeaderWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
 
     dc.SetBackgroundMode(wxTRANSPARENT);
     dc.SetTextForeground( *wxBLACK );
-    if (m_foregroundColour.Ok()) dc.SetTextForeground( m_foregroundColour );
+
+    // do *not* use the listctrl colour for headers - one day we will have a
+    // function to set it separately
 
     x = 1;
     y = 1;
@@ -865,9 +870,10 @@ void wxListHeaderWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
         int cw = item.m_width-2;
 #if wxUSE_GENERIC_LIST_EXTENSIONS
         if ((i+1 == numColumns) || ( dc.LogicalToDeviceX(x+item.m_width) > w-5))
-                cw = dc.DeviceToLogicalX(w)-x-1;
+            cw = dc.DeviceToLogicalX(w)-x-1;
 #else
-        if ((i+1 == numColumns) || (x+item.m_width > w-5)) cw = w-x-1;
+        if ((i+1 == numColumns) || (x+item.m_width > w-5))
+            cw = w-x-1;
 #endif
         dc.SetPen( *wxWHITE_PEN );
 
@@ -911,8 +917,8 @@ void wxListHeaderWindow::DrawCurrent()
 
 void wxListHeaderWindow::OnMouse( wxMouseEvent &event )
 {
-    int x = event.GetX();
-    int y = event.GetY();
+    wxCoord x = (wxCoord)event.GetX();
+    wxCoord y = (wxCoord)event.GetY();
     if (m_isDragging)
     {
         DrawCurrent();
@@ -1021,13 +1027,18 @@ BEGIN_EVENT_TABLE(wxListTextCtrl,wxTextCtrl)
     EVT_KILL_FOCUS     (wxListTextCtrl::OnKillFocus)
 END_EVENT_TABLE()
 
-wxListTextCtrl::wxListTextCtrl( wxWindow *parent, const wxWindowID id,
-    bool *accept, wxString *res, wxListMainWindow *owner,
-    const wxString &value, const wxPoint &pos, const wxSize &size,
-#if wxUSE_VALIDATORS
-    int style, const wxValidator& validator, const wxString &name ) :
-#endif
-  wxTextCtrl( parent, id, value, pos, size, style, validator, name )
+wxListTextCtrl::wxListTextCtrl( wxWindow *parent,
+                                const wxWindowID id,
+                                bool *accept,
+                                wxString *res,
+                                wxListMainWindow *owner,
+                                const wxString &value,
+                                const wxPoint &pos,
+                                const wxSize &size,
+                                int style,
+                                const wxValidator& validator,
+                                const wxString &name )
+              : wxTextCtrl( parent, id, value, pos, size, style, validator, name )
 {
     m_res = res;
     m_accept = accept;
@@ -1161,6 +1172,8 @@ wxListMainWindow::~wxListMainWindow()
 
 void wxListMainWindow::RefreshLine( wxListLineData *line )
 {
+    if (m_dirty) return;
+
     int x = 0;
     int y = 0;
     int w = 0;
@@ -1251,8 +1264,8 @@ void wxListMainWindow::SendNotify( wxListLineData *line, wxEventType command )
     le.SetEventObject( GetParent() );
     le.m_itemIndex = GetIndexOfLine( line );
     line->GetItem( 0, le.m_item );
-//    GetParent()->GetEventHandler()->ProcessEvent( le );
-    GetParent()->GetEventHandler()->AddPendingEvent( le );
+    GetParent()->GetEventHandler()->ProcessEvent( le );
+//    GetParent()->GetEventHandler()->AddPendingEvent( le );
 }
 
 void wxListMainWindow::FocusLine( wxListLineData *WXUNUSED(line) )
@@ -1284,7 +1297,7 @@ void wxListMainWindow::DeleteLine( wxListLineData *line )
 
 void wxListMainWindow::EditLabel( long item )
 {
-    wxNode *node = m_lines.Nth( item );
+    wxNode *node = m_lines.Nth( (size_t)item );
     wxCHECK_RET( node, wxT("wrong index in wxListCtrl::Edit()") );
 
     m_currentEdit = (wxListLineData*) node->Data();
@@ -1357,8 +1370,8 @@ void wxListMainWindow::OnMouse( wxMouseEvent &event )
 
     wxClientDC dc(this);
     PrepareDC(dc);
-    long x = dc.DeviceToLogicalX( (long)event.GetX() );
-    long y = dc.DeviceToLogicalY( (long)event.GetY() );
+    wxCoord x = dc.DeviceToLogicalX( (wxCoord)event.GetX() );
+    wxCoord y = dc.DeviceToLogicalY( (wxCoord)event.GetY() );
 
     /* Did we actually hit an item ? */
     long hitResult = 0;
@@ -1581,7 +1594,7 @@ void wxListMainWindow::OnChar( wxKeyEvent &event )
 
     /* we send a list_key event up */
     wxListEvent le( wxEVT_COMMAND_LIST_KEY_DOWN, GetParent()->GetId() );
-    le.m_code = event.KeyCode();
+    le.m_code = (int)event.KeyCode();
     le.SetEventObject( parent );
     parent->GetEventHandler()->ProcessEvent( le );
 
@@ -1821,8 +1834,8 @@ void wxListMainWindow::GetImageSize( int index, int &width, int &height )
 int wxListMainWindow::GetTextLength( wxString &s )
 {
     wxClientDC dc( this );
-    long lw = 0;
-    long lh = 0;
+    wxCoord lw = 0;
+    wxCoord lh = 0;
     dc.GetTextExtent( s, &lw, &lh );
     return lw + 6;
 }
@@ -1902,7 +1915,7 @@ void wxListMainWindow::SetColumnWidth( int col, int width )
             {
                 wxListItemData *item = (wxListItemData*)n->Data();
                 int current = 0, ix = 0, iy = 0;
-                long lx = 0, ly = 0;
+                wxCoord lx = 0, ly = 0;
                 if (item->HasImage())
                 {
                     GetImageSize( item->GetImage(), ix, iy );
@@ -1991,7 +2004,7 @@ int wxListMainWindow::GetCountPerPage()
 void wxListMainWindow::SetItem( wxListItem &item )
 {
     m_dirty = TRUE;
-    wxNode *node = m_lines.Nth( item.m_itemId );
+    wxNode *node = m_lines.Nth( (size_t)item.m_itemId );
     if (node)
     {
         wxListLineData *line = (wxListLineData*)node->Data();
@@ -2008,7 +2021,7 @@ void wxListMainWindow::SetItemState( long item, long state, long stateMask )
 
     if (stateMask & wxLIST_STATE_FOCUSED)
     {
-        wxNode *node = m_lines.Nth( item );
+        wxNode *node = m_lines.Nth( (size_t)item );
         if (node)
         {
             wxListLineData *line = (wxListLineData*)node->Data();
@@ -2022,10 +2035,10 @@ void wxListMainWindow::SetItemState( long item, long state, long stateMask )
 
     if (stateMask & wxLIST_STATE_SELECTED)
     {
-        bool on = state & wxLIST_STATE_SELECTED;
+        bool on = (state & wxLIST_STATE_SELECTED) != 0;
         if (!on && (m_mode & wxLC_SINGLE_SEL)) return;
 
-        wxNode *node = m_lines.Nth( item );
+        wxNode *node = m_lines.Nth( (size_t)item );
         if (node)
         {
             wxListLineData *line = (wxListLineData*)node->Data();
@@ -2038,7 +2051,7 @@ void wxListMainWindow::SetItemState( long item, long state, long stateMask )
                 RefreshLine( m_current );
                 if (oldCurrent) RefreshLine( oldCurrent );
             }
-            bool on = state & wxLIST_STATE_SELECTED;
+            bool on = (state & wxLIST_STATE_SELECTED) != 0;
             if (on != line->IsHilighted())
             {
                 line->Hilight( on );
@@ -2053,7 +2066,7 @@ int wxListMainWindow::GetItemState( long item, long stateMask )
     int ret = wxLIST_STATE_DONTCARE;
     if (stateMask & wxLIST_STATE_FOCUSED)
     {
-        wxNode *node = m_lines.Nth( item );
+        wxNode *node = m_lines.Nth( (size_t)item );
         if (node)
         {
             wxListLineData *line = (wxListLineData*)node->Data();
@@ -2062,7 +2075,7 @@ int wxListMainWindow::GetItemState( long item, long stateMask )
     }
     if (stateMask & wxLIST_STATE_SELECTED)
     {
-        wxNode *node = m_lines.Nth( item );
+        wxNode *node = m_lines.Nth( (size_t)item );
         if (node)
         {
             wxListLineData *line = (wxListLineData*)node->Data();
@@ -2074,7 +2087,7 @@ int wxListMainWindow::GetItemState( long item, long stateMask )
 
 void wxListMainWindow::GetItem( wxListItem &item )
 {
-    wxNode *node = m_lines.Nth( item.m_itemId );
+    wxNode *node = m_lines.Nth( (size_t)item.m_itemId );
     if (node)
     {
         wxListLineData *line = (wxListLineData*)node->Data();
@@ -2096,7 +2109,7 @@ int wxListMainWindow::GetItemCount()
 
 void wxListMainWindow::GetItemRect( long index, wxRect &rect )
 {
-    wxNode *node = m_lines.Nth( index );
+    wxNode *node = m_lines.Nth( (size_t)index );
     if (node)
     {
         wxListLineData *line = (wxListLineData*)node->Data();
@@ -2113,7 +2126,7 @@ void wxListMainWindow::GetItemRect( long index, wxRect &rect )
 
 bool wxListMainWindow::GetItemPosition(long item, wxPoint& pos)
 {
-    wxNode *node = m_lines.Nth( item );
+    wxNode *node = m_lines.Nth( (size_t)item );
     if (node)
     {
         wxRect rect;
@@ -2313,7 +2326,7 @@ long wxListMainWindow::GetNextItem( long item, int WXUNUSED(geometry), int state
     long ret = 0;
     if (item > 0) ret = item;
     if(ret >= GetItemCount()) return -1;
-    wxNode *node = m_lines.Nth( ret );
+    wxNode *node = m_lines.Nth( (size_t)ret );
     while (node)
     {
         wxListLineData *line = (wxListLineData*)node->Data();
@@ -2329,7 +2342,7 @@ long wxListMainWindow::GetNextItem( long item, int WXUNUSED(geometry), int state
 void wxListMainWindow::DeleteItem( long index )
 {
     m_dirty = TRUE;
-    wxNode *node = m_lines.Nth( index );
+    wxNode *node = m_lines.Nth( (size_t)index );
     if (node)
     {
         wxListLineData *line = (wxListLineData*)node->Data();
@@ -2397,8 +2410,7 @@ void wxListMainWindow::EnsureVisible( long index )
 
     wxListLineData *oldCurrent = m_current;
     m_current = (wxListLineData *) NULL;
-    int i = index;
-    wxNode *node = m_lines.Nth( i );
+    wxNode *node = m_lines.Nth( (size_t)index );
     if (node) m_current = (wxListLineData*)node->Data();
     if (m_current) MoveToFocus();
     m_current = oldCurrent;
@@ -2409,7 +2421,7 @@ long wxListMainWindow::FindItem(long start, const wxString& str, bool WXUNUSED(p
     long pos = start;
     wxString tmp = str;
     if (pos < 0) pos = 0;
-    wxNode *node = m_lines.Nth( pos );
+    wxNode *node = m_lines.Nth( (size_t)pos );
     while (node)
     {
         wxListLineData *line = (wxListLineData*)node->Data();
@@ -2426,7 +2438,7 @@ long wxListMainWindow::FindItem(long start, long data)
 {
     long pos = start;
     if (pos < 0) pos = 0;
-    wxNode *node = m_lines.Nth( pos );
+    wxNode *node = m_lines.Nth( (size_t)pos );
     while (node)
     {
         wxListLineData *line = (wxListLineData*)node->Data();
@@ -2449,7 +2461,7 @@ long wxListMainWindow::HitTest( int x, int y, int &flags )
         long ret = line->IsHit( x, y );
         if (ret & flags)
         {
-            flags = ret;
+            flags = (int)ret;
             return count;
         }
         node = node->Next();
@@ -2482,7 +2494,7 @@ void wxListMainWindow::InsertItem( wxListItem &item )
     line->SetItem( 0, item );
     if ((item.m_itemId >= 0) && (item.m_itemId < (int)m_lines.GetCount()))
     {
-        wxNode *node = m_lines.Nth( item.m_itemId );
+        wxNode *node = m_lines.Nth( (size_t)item.m_itemId );
         if (node) m_lines.Insert( node, line );
     }
     else
@@ -2500,7 +2512,7 @@ void wxListMainWindow::InsertColumn( long col, wxListItem &item )
         wxListHeaderData *column = new wxListHeaderData( item );
         if ((col >= 0) && (col < (int)m_columns.GetCount()))
         {
-            wxNode *node = m_columns.Nth( col );
+            wxNode *node = m_columns.Nth( (size_t)col );
             if (node)
                  m_columns.Insert( node, column );
         }
@@ -2573,6 +2585,29 @@ wxListItem::wxListItem()
     m_attr = NULL;
 }
 
+void wxListItem::Clear()
+{
+    m_mask = 0;
+    m_itemId = 0;
+    m_col = 0;
+    m_state = 0;
+    m_stateMask = 0;
+    m_image = 0;
+    m_data = 0;
+    m_format = wxLIST_FORMAT_CENTRE;
+    m_width = 0;
+    m_text = wxEmptyString;
+
+    if (m_attr) delete m_attr;
+    m_attr = NULL;
+}
+
+void wxListItem::ClearAttributes()
+{
+    if (m_attr) delete m_attr;
+    m_attr = NULL;
+}
+
 // -------------------------------------------------------------------------------------
 // wxListEvent
 // -------------------------------------------------------------------------------------
@@ -2644,12 +2679,13 @@ wxListCtrl::~wxListCtrl()
 {
 }
 
-bool wxListCtrl::Create( wxWindow *parent, wxWindowID id,
-      const wxPoint &pos, const wxSize &size,
-#if wxUSE_VALIDATORS
-      long style, const wxValidator &validator,
-#endif
-      const wxString &name )
+bool wxListCtrl::Create(wxWindow *parent,
+                        wxWindowID id,
+                        const wxPoint &pos,
+                        const wxSize &size,
+                        long style,
+                        const wxValidator &validator,
+                        const wxString &name)
 {
     m_imageListNormal = (wxImageList *) NULL;
     m_imageListSmall = (wxImageList *) NULL;
@@ -2657,32 +2693,18 @@ bool wxListCtrl::Create( wxWindow *parent, wxWindowID id,
     m_mainWin = (wxListMainWindow*) NULL;
     m_headerWin = (wxListHeaderWindow*) NULL;
 
-    long s = style;
-
-#ifdef __VMS__
-#pragma message disable codcauunr
-   // VMS reports on this part the warning:
-   // statement either is unreachable or causes unreachable code
-#endif
-   if ((s & wxLC_REPORT == 0) &&
-        (s & wxLC_LIST == 0) &&
-        (s & wxLC_ICON == 0))
+    if ( !(style & (wxLC_REPORT | wxLC_LIST | wxLC_ICON)) )
     {
-        s = s | wxLC_LIST;
+        style = style | wxLC_LIST;
     }
-#ifdef __VMS__
-#pragma message enable codcauunr
-#endif
+  
+    bool ret = wxControl::Create( parent, id, pos, size, style, validator, name );
+  
+    
+    if (style & wxSUNKEN_BORDER)
+        style -= wxSUNKEN_BORDER;
 
-    bool ret = wxControl::Create( parent, id, pos, size, s, name );
-
-#if wxUSE_VALIDATORS
-    SetValidator( validator );
-#endif
-
-    if (s & wxSUNKEN_BORDER) s -= wxSUNKEN_BORDER;
-
-    m_mainWin = new wxListMainWindow( this, -1, wxPoint(0,0), size, s );
+    m_mainWin = new wxListMainWindow( this, -1, wxPoint(0,0), size, style );
 
     if (HasFlag(wxLC_REPORT))
         m_headerWin = new wxListHeaderWindow( this, -1, m_mainWin, wxPoint(0,0), wxSize(size.x,23), wxTAB_TRAVERSAL );
@@ -3068,7 +3090,10 @@ long wxListCtrl::InsertItem( long index, const wxString &label, int imageIndex )
 
 long wxListCtrl::InsertColumn( long col, wxListItem &item )
 {
+    wxASSERT( m_headerWin );
     m_mainWin->InsertColumn( col, item );
+    m_headerWin->Refresh();
+
     return 0;
 }