]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/listctrl.cpp
call SetAnimation() from the ctor instead of just assigning m_animation directly...
[wxWidgets.git] / src / generic / listctrl.cpp
index d83f686fbfc7125044117896efe0dfbd79fd0c55..08e3146d1e4df0e36fe769513d4b6601ddcc0bb0 100644 (file)
     #include "wx/mac/private.h"
 #endif
 
+#ifdef __WXGTK20__
+    #include "wx/gtk/private.h"
+    #include "wx/gtk/win_gtk.h"
+#endif
+
+
 
 // NOTE: If using the wxListBox visual attributes works everywhere then this can
 // be removed, as well as the #else case below.
@@ -71,7 +77,11 @@ static const int SCROLL_UNIT_X = 15;
 static const int LINE_SPACING = 0;
 
 // extra margins around the text label
+#ifdef __WXGTK__
+static const int EXTRA_WIDTH = 6;
+#else
 static const int EXTRA_WIDTH = 4;
+#endif
 static const int EXTRA_HEIGHT = 4;
 
 // margin between the window and the items
@@ -687,7 +697,7 @@ public:
 
     // send out a wxListEvent
     void SendNotify( size_t line,
-                     wxEventType command,
+                     wxEventType command, 
                      const wxPoint& point = wxDefaultPosition );
 
     // override base class virtual to reset m_lineHeight when the font changes
@@ -720,6 +730,11 @@ public:
     {
         return m_hasFocus ? m_highlightBrush : m_highlightUnfocusedBrush;
     }
+    
+    bool HasFocus() const
+    {
+        return m_hasFocus;
+    }
 
 //protected:
     // the array of all line objects for a non virtual list control (for the
@@ -1238,9 +1253,9 @@ void wxListLineData::SetPosition( int x, int y, int spacing )
             if ( item->HasText() )
             {
                 if (m_gi->m_rectAll.width > spacing)
-                    m_gi->m_rectLabel.x = m_gi->m_rectAll.x + 2;
+                    m_gi->m_rectLabel.x = m_gi->m_rectAll.x + (EXTRA_WIDTH/2);
                 else
-                    m_gi->m_rectLabel.x = m_gi->m_rectAll.x + 2 + (spacing / 2) - (m_gi->m_rectLabel.width / 2);
+                    m_gi->m_rectLabel.x = m_gi->m_rectAll.x + (EXTRA_WIDTH/2) + (spacing / 2) - (m_gi->m_rectLabel.width / 2);
                 m_gi->m_rectLabel.y = m_gi->m_rectAll.y + m_gi->m_rectAll.height + 2 - m_gi->m_rectLabel.height;
                 m_gi->m_rectHighlight.x = m_gi->m_rectLabel.x - 2;
                 m_gi->m_rectHighlight.y = m_gi->m_rectLabel.y - 2;
@@ -1264,11 +1279,11 @@ void wxListLineData::SetPosition( int x, int y, int spacing )
             {
                 m_gi->m_rectIcon.x = m_gi->m_rectAll.x + 2;
                 m_gi->m_rectIcon.y = m_gi->m_rectAll.y + 2;
-                m_gi->m_rectLabel.x = m_gi->m_rectAll.x + 6 + m_gi->m_rectIcon.width;
+                m_gi->m_rectLabel.x = m_gi->m_rectAll.x + 4 + (EXTRA_WIDTH/2) + m_gi->m_rectIcon.width;
             }
             else
             {
-                m_gi->m_rectLabel.x = m_gi->m_rectAll.x + 2;
+                m_gi->m_rectLabel.x = m_gi->m_rectAll.x + (EXTRA_WIDTH/2);
             }
             break;
 
@@ -1381,7 +1396,12 @@ bool wxListLineData::SetAttributes(wxDC *dc,
     wxColour colText;
     if ( highlighted )
 #ifdef __WXMAC__
-        colText = *wxWHITE;
+    {
+        if (m_owner->HasFocus())
+            colText = *wxWHITE;
+        else
+            colText = *wxBLACK;
+    }
 #else
         colText = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT);
 #endif
@@ -1428,7 +1448,32 @@ void wxListLineData::Draw( wxDC *dc )
     wxListItemAttr *attr = GetAttr();
 
     if ( SetAttributes(dc, attr, highlighted) )
+#ifndef __WXGTK20__
+    {
         dc->DrawRectangle( m_gi->m_rectHighlight );
+    }
+#else
+    {
+        if (highlighted)
+        {
+            wxRect rect2( m_gi->m_rectHighlight );
+            m_owner->CalcScrolledPosition( rect2.x, rect2.y, &rect2.x, &rect2.y );
+        
+            gtk_paint_flat_box( m_owner->m_widget->style, 
+                            GTK_PIZZA(m_owner->m_wxwindow)->bin_window,
+                                       GTK_STATE_SELECTED,
+                            GTK_SHADOW_NONE,
+                            NULL,
+                            m_owner->m_wxwindow,
+                            "cell_even",
+                            rect2.x, rect2.y, rect2.width, rect2.height );
+        }
+        else
+        {
+            dc->DrawRectangle( m_gi->m_rectHighlight );
+        }
+    }
+#endif
 
     // just for debugging to better see where the items are
 #if 0
@@ -1468,10 +1513,41 @@ void wxListLineData::DrawInReportMode( wxDC *dc,
     //       GetAttr() and move these lines into the loop below
     wxListItemAttr *attr = GetAttr();
     if ( SetAttributes(dc, attr, highlighted) )
+#ifndef __WXGTK20__
+    {
         dc->DrawRectangle( rectHL );
+    }
+#else
+    {
+        if (highlighted)
+        {
+            wxRect rect2( rectHL );
+            m_owner->CalcScrolledPosition( rect2.x, rect2.y, &rect2.x, &rect2.y );
+        
+            gtk_paint_flat_box( m_owner->m_widget->style, 
+                            GTK_PIZZA(m_owner->m_wxwindow)->bin_window,
+                                       GTK_STATE_SELECTED,
+                            GTK_SHADOW_NONE,
+                            NULL,
+                            m_owner->m_wxwindow,
+                            "cell_even",
+                            rect2.x, rect2.y, rect2.width, rect2.height );
+        }
+        else
+        {
+            dc->DrawRectangle( rectHL );
+        }
+    }
+#endif
 
     wxCoord x = rect.x + HEADER_OFFSET_X,
             yMid = rect.y + rect.height/2;
+#ifdef __WXGTK__
+    // This probably needs to be done
+    // on all platforms as the icons
+    // otherwise nearly touch the border
+    x += 2;
+#endif
 
     size_t col = 0;
     for ( wxListItemDataList::compatibility_iterator node = m_items.GetFirst();
@@ -2719,9 +2795,23 @@ void wxListMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
     {
         if ( m_hasFocus )
         {
+            wxRect rect( GetLineHighlightRect( m_current ) );
+#ifndef __WXGTK20__
             dc.SetPen( *wxBLACK_PEN );
             dc.SetBrush( *wxTRANSPARENT_BRUSH );
-            dc.DrawRectangle( GetLineHighlightRect( m_current ) );
+            dc.DrawRectangle( rect );
+#else
+            CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y );
+        
+            gtk_paint_focus( m_widget->style, 
+                             GTK_PIZZA(m_wxwindow)->bin_window,
+                             GTK_STATE_SELECTED,
+                             NULL,
+                             m_wxwindow,
+                             "treeview",
+                             rect.x, rect.y, rect.width, rect.height );
+            
+#endif
         }
     }
 #endif
@@ -2752,6 +2842,7 @@ void wxListMainWindow::SendNotify( size_t line,
 {
     wxListEvent le( command, GetParent()->GetId() );
     le.SetEventObject( GetParent() );
+    
     le.m_itemIndex = line;
 
     // set only for events which have position
@@ -2762,7 +2853,7 @@ void wxListMainWindow::SendNotify( size_t line,
     // program has it anyhow and if we did it would result in accessing all
     // the lines, even those which are not visible now and this is precisely
     // what we're trying to avoid
-    if ( !IsVirtual() && (command != wxEVT_COMMAND_LIST_DELETE_ITEM) )
+    if ( !IsVirtual() )
     {
         if ( line != (size_t)-1 )
         {
@@ -4242,11 +4333,11 @@ void wxListMainWindow::DeleteItem( long lindex )
         if ( m_current != index || m_current == count - 1 )
             m_current--;
     }
-
     if ( InReportView() )
     {
-    //  mark the Column Max Width cache as dirty if the items in the line
-    //  we're deleting contain the Max Column Width
+        //  mark the Column Max Width cache as dirty if the items in the line
+        //  we're deleting contain the Max Column Width
         wxListLineData * const line = GetLine(index);
         wxListItemDataList::compatibility_iterator n;
         wxListItemData *itemData;
@@ -4268,6 +4359,8 @@ void wxListMainWindow::DeleteItem( long lindex )
         ResetVisibleLinesRange();
     }
 
+    SendNotify( index, wxEVT_COMMAND_LIST_DELETE_ITEM, wxDefaultPosition );
+
     if ( IsVirtual() )
     {
         m_countVirt--;
@@ -4281,8 +4374,6 @@ void wxListMainWindow::DeleteItem( long lindex )
     // we need to refresh the (vert) scrollbar as the number of items changed
     m_dirty = true;
 
-    SendNotify( index, wxEVT_COMMAND_LIST_DELETE_ITEM );
-
     RefreshAfter(index);
 }
 
@@ -4826,7 +4917,7 @@ bool wxGenericListCtrl::Create(wxWindow *parent,
             m_headerWin->Show( false );
     }
 
-    SetBestSize(size);
+    SetInitialSize(size);
 
     return true;
 }