]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/listctrl.cpp
Some doc updates.
[wxWidgets.git] / src / generic / listctrl.cpp
index 16db403d0d165dbf7f27810a2b31fc7bc0d3f3e1..30ef6ea2a6c313fd6bced1f13e764bb31f078077 100644 (file)
@@ -41,14 +41,15 @@ wxListItemData::wxListItemData()
     m_ypos = 0;
     m_width = 0;
     m_height = 0;
-    m_colour = wxBLACK;
+    m_attr = NULL;
 }
 
 wxListItemData::wxListItemData( const wxListItem &info )
 {
     m_image = -1;
     m_data = 0;
-    m_colour = (wxColour *)&info.GetTextColour();
+    m_attr = NULL;
+
     SetItem( info );
 }
 
@@ -57,7 +58,15 @@ void wxListItemData::SetItem( const wxListItem &info )
     if (info.m_mask & wxLIST_MASK_TEXT) m_text = info.m_text;
     if (info.m_mask & wxLIST_MASK_IMAGE) m_image = info.m_image;
     if (info.m_mask & wxLIST_MASK_DATA) m_data = info.m_data;
-    m_colour = (wxColour *)&info.GetTextColour();
+
+    if ( info.HasAttributes() )
+    {
+        if ( m_attr )
+            *m_attr = *info.GetAttributes();
+        else
+            m_attr = new wxListItemAttr(*info.GetAttributes());
+    }
+
     m_xpos = 0;
     m_ypos = 0;
     m_width = info.m_width;
@@ -91,11 +100,6 @@ void wxListItemData::SetSize( int width, int height )
     if (height != -1) m_height = height;
 }
 
-void wxListItemData::SetColour( wxColour *col )
-{
-    m_colour = col;
-}
-
 bool wxListItemData::HasImage() const
 {
     return (m_image >= 0);
@@ -141,17 +145,21 @@ int wxListItemData::GetImage() const
     return m_image;
 }
 
-void wxListItemData::GetItem( wxListItem &info )
+void wxListItemData::GetItem( wxListItem &info ) const
 {
     info.m_text = m_text;
     info.m_image = m_image;
     info.m_data = m_data;
-    info.SetTextColour(*m_colour);
-}
 
-wxColour *wxListItemData::GetColour()
-{
-    return m_colour;
+    if ( m_attr )
+    {
+        if ( m_attr->HasTextColour() )
+            info.SetTextColour(m_attr->GetTextColour());
+        if ( m_attr->HasBackgroundColour() )
+            info.SetBackgroundColour(m_attr->GetBackgroundColour());
+        if ( m_attr->HasFont() )
+            info.SetFont(m_attr->GetFont());
+    }
 }
 
 //-----------------------------------------------------------------------------
@@ -286,8 +294,7 @@ void wxListLineData::CalculateSize( wxDC *dc, int spacing )
             if (node)
             {
                 wxListItemData *item = (wxListItemData*)node->Data();
-                wxString s;
-                item->GetText( s );
+                wxString s = item->GetText();
                 long lw,lh;
                 dc->GetTextExtent( s, &lw, &lh );
                 if (lw > m_spacing) m_bound_all.width = lw;
@@ -300,8 +307,7 @@ void wxListLineData::CalculateSize( wxDC *dc, int spacing )
             if (node)
             {
                 wxListItemData *item = (wxListItemData*)node->Data();
-                wxString s;
-                item->GetText( s );
+                wxString s = item->GetText();
                 long lw,lh;
                 dc->GetTextExtent( s, &lw, &lh );
                 m_bound_all.width = lw;
@@ -577,6 +583,34 @@ int wxListLineData::GetImage( int index )
     return -1;
 }
 
+void wxListLineData::SetAttributes(wxDC *dc,
+                                   const wxListItemAttr *attr,
+                                   const wxColour& colText,
+                                   const wxFont& font,
+                                   bool hilight)
+{
+    // 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());
+    }
+    else
+    {
+        dc->SetTextForeground(colText);
+    }
+
+    if ( attr && attr->HasFont() )
+    {
+        dc->SetFont(attr->GetFont());
+    }
+    else
+    {
+        dc->SetFont(font);
+    }
+}
+
 void wxListLineData::DoDraw( wxDC *dc, bool hilight, bool paintBG )
 {
     long dev_x = dc->LogicalToDeviceX( m_bound_all.x-2 );
@@ -589,27 +623,51 @@ void wxListLineData::DoDraw( wxDC *dc, bool hilight, bool paintBG )
         return;
     }
 
-    if (paintBG)
+    wxWindow *listctrl = m_owner->GetParent();
+
+    // default foreground colour
+    wxColour colText;
+    if ( hilight )
+    {
+        colText = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_HIGHLIGHTTEXT );
+    }
+    else
+    {
+        colText = listctrl->GetForegroundColour();
+    }
+
+    // default font
+    wxFont font = listctrl->GetFont();
+
+    // VZ: currently we set the colours/fonts only once, but like this (i.e.
+    //     using SetAttributes() inside the loop), it will be trivial to
+    //     customize the subitems (in report mode) too.
+    wxListItemData *item = (wxListItemData*)m_items.First()->Data();
+    wxListItemAttr *attr = item->GetAttributes();
+    SetAttributes(dc, attr, colText, font, hilight);
+
+    bool hasBgCol = attr && attr->HasBackgroundColour();
+    if ( paintBG || hasBgCol )
     {
         if (hilight)
         {
             dc->SetBrush( * m_hilightBrush );
-            dc->SetPen( * wxTRANSPARENT_PEN );
         }
         else
         {
-            dc->SetBrush( * wxWHITE_BRUSH );
-            dc->SetPen( * wxTRANSPARENT_PEN );
+            if ( hasBgCol )
+                dc->SetBrush(wxBrush(attr->GetBackgroundColour(), wxSOLID));
+            else
+                dc->SetBrush( * wxWHITE_BRUSH );
         }
+
+        dc->SetPen( * wxTRANSPARENT_PEN );
         dc->DrawRectangle( m_bound_hilight.x, m_bound_hilight.y,
                            m_bound_hilight.width, m_bound_hilight.height );
     }
 
-    dc->SetBackgroundMode(wxTRANSPARENT);
     if (m_mode == wxLC_REPORT)
     {
-        wxString s;
-       wxColour *colour = (wxColour*) NULL;
         wxNode *node = m_items.First();
         while (node)
         {
@@ -623,16 +681,9 @@ void wxListLineData::DoDraw( wxDC *dc, bool hilight, bool paintBG )
                 m_owner->GetImageSize( item->GetImage(), x, y );
                 x += item->GetX() + 5;
             }
-           if (!colour)
-               colour = item->GetColour();
             if (item->HasText())
             {
-                item->GetText( s );
-                if (hilight)
-                    dc->SetTextForeground( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_HIGHLIGHTTEXT ) );
-                else
-                    dc->SetTextForeground( *colour );
-                dc->DrawText( s, x, item->GetY() );
+                dc->DrawText( item->GetText(), x, item->GetY() );
             }
             dc->DestroyClippingRegion();
             node = node->Next();
@@ -650,13 +701,7 @@ void wxListLineData::DoDraw( wxDC *dc, bool hilight, bool paintBG )
             }
             if (item->HasText())
             {
-                wxString s;
-                item->GetText( s );
-                if (hilight)
-                    dc->SetTextForeground( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_HIGHLIGHTTEXT ) );
-                else
-                    dc->SetTextForeground( * item->GetColour() );
-                dc->DrawText( s, m_bound_label.x, m_bound_label.y );
+                dc->DrawText( item->GetText(), m_bound_label.x, m_bound_label.y );
             }
         }
     }
@@ -665,11 +710,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 )
@@ -812,7 +857,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;
@@ -824,9 +871,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 );
 
@@ -1210,8 +1258,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) )
@@ -2532,6 +2580,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
 // -------------------------------------------------------------------------------------
@@ -2881,15 +2952,15 @@ int wxListCtrl::GetSelectedItemCount() const
     return m_mainWin->GetSelectedItemCount();
 }
 
-/*
 wxColour wxListCtrl::GetTextColour() const
 {
+    return GetForegroundColour();
 }
 
-void wxListCtrl::SetTextColour(const wxColour& WXUNUSED(col))
+void wxListCtrl::SetTextColour(const wxColour& col)
 {
+    SetForegroundColour(col);
 }
-*/
 
 long wxListCtrl::GetTopItem() const
 {