]> git.saurik.com Git - wxWidgets.git/commitdiff
generic wxListCtrl colour/font setting
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 6 Dec 1999 10:43:35 +0000 (10:43 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 6 Dec 1999 10:43:35 +0000 (10:43 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4835 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
docs/latex/wx/listctrl.tex
include/wx/generic/listctrl.h
samples/listctrl/listtest.cpp
src/generic/listctrl.cpp

index 665dd443862479fa14d5f649cb63f4b17e63f4cf..861a746147eb1a52cd59a5588c2a306c1e9a3b80 100644 (file)
@@ -18,6 +18,7 @@ all (GUI):
 - wxMenu(Bar)::Insert() and Remove() functions for dynamic menu menagament
 - wxToolBar supports arbitrary controls (not only buttons) and can be
   dynamically changed (Delete/Insert functions)
+- wxListCtrl allows setting colour/fonts for individual items
 - wxDC::DrawRotatedText() (contributed by Hans-Joachim Baader, limited to
   +/-90 degrees for now - contributions to improve it are welcome!)
 
index 4fac88641cb11ac7c4c3ea8ed723c37e6b4086ef..a380164b2435321d59514574bb59bd0ccfad9751 100644 (file)
@@ -402,7 +402,7 @@ For list view mode (only), inserts a column. For more details, see \helpref{wxLi
 \pythonnote{In place of a single overloaded method name, wxPython
 implements the following methods:\par
 \indented{2cm}{\begin{twocollist}
-\twocolitem{\bf{InsertColumn(col, heading, format=wxLIST_FORMAT_LEFT,
+\twocolitem{\bf{InsertColumn(col, heading, format=wxLIST\_FORMAT\_LEFT,
 width=-1)}}{Creates a column using a header string only.}
 \twocolitem{\bf{InsertColumnInfo(col, item)}}{Creates a column using a
 wxListInfo.}
@@ -529,6 +529,12 @@ The {\bf m\_mask} member contains a bitlist specifying which of the other fields
 
 The {\bf m\_stateMask} and {\bf m\_state} members take flags from the following:
 
+The wxListItem object can also contain item-specific colour and font
+information: for this you need to call one of SetTextColour(),
+SetBackgroundColour() or SetFont() functions on it passing it the colour/font
+to use. If the colour/font is not specified, the default list control
+colour/font is used.
+
 \twocolwidtha{5cm}
 \begin{twocollist}\itemsep=0pt
 \twocolitem{wxLIST\_STATE\_DONTCARE}{Don't care what the state is. Win32 only. }
index cd0ced7b505648d7766ffa2b293cceb7921b4ddd..98b332888d476eb04771688081f1174d7c38d122 100644 (file)
@@ -63,10 +63,13 @@ public:
     long       m_data;
     int        m_xpos,m_ypos;
     int        m_width,m_height;
-    wxColour   *m_colour;
+
+    wxListItemAttr *m_attr;
 
 public:
     wxListItemData();
+    ~wxListItemData() { delete m_attr; }
+
     wxListItemData( const wxListItem &info );
     void SetItem( const wxListItem &info );
     void SetText( const wxString &s );
@@ -74,18 +77,19 @@ public:
     void SetData( long data );
     void SetPosition( int x, int y );
     void SetSize( int width, int height );
-    void SetColour( wxColour *col );
     bool HasImage() const;
     bool HasText() const;
     bool IsHit( int x, int y ) const;
     void GetText( wxString &s );
+    const wxString& GetText() { return m_text; }
     int GetX( void ) const;
     int GetY( void ) const;
     int GetWidth() const;
     int GetHeight() const;
     int GetImage() const;
-    void GetItem( wxListItem &info );
-    wxColour *GetColour();
+    void GetItem( wxListItem &info ) const;
+
+    wxListItemAttr *GetAttributes() const { return m_attr; }
 
 private:
     DECLARE_DYNAMIC_CLASS(wxListItemData);
@@ -174,6 +178,10 @@ public:
     void AssignRect( wxRect &dest, const wxRect &source );
     
 private:
+    void SetAttributes(wxDC *dc,
+                       const wxListItemAttr *attr,
+                       const wxColour& colText, const wxFont& font);
+
     DECLARE_DYNAMIC_CLASS(wxListLineData);
 };
 
@@ -241,8 +249,9 @@ public:
                     bool *accept, wxString *res, wxListMainWindow *owner,
                     const wxString &value = "",
                     const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize,
+                    int style = 0,
 #if wxUSE_VALIDATORS
-                    int style = 0, const wxValidator& validator = wxDefaultValidator,
+                    const wxValidator& validator = wxDefaultValidator,
 #endif
                     const wxString &name = "wxListTextCtrlText" );
     void OnChar( wxKeyEvent &event );
@@ -313,8 +322,8 @@ public:
     void OnSetFocus( wxFocusEvent &event );
     void OnKillFocus( wxFocusEvent &event );
     void OnSize( wxSizeEvent &event );
-       void OnScroll(wxScrollWinEvent& event) ;
-       
+    void OnScroll(wxScrollWinEvent& event) ;
+    
     void DrawImage( int index, wxDC *dc, int x, int y );
     void GetImageSize( int index, int &width, int &height );
     int GetIndexOfLine( const wxListLineData *line );
@@ -411,8 +420,8 @@ public:
     void SetItemSpacing( int spacing, bool isSmall = FALSE );
     int GetItemSpacing( bool isSmall ) const;
     int GetSelectedItemCount() const;
-//  wxColour GetTextColour() const; // wxGLC has colours for every Item (see wxListItem)
-//  void SetTextColour(const wxColour& col);
+    wxColour GetTextColour() const;
+    void SetTextColour(const wxColour& col);
     long GetTopItem() const;
 
     void SetSingleStyle( long style, bool add = TRUE ) ;
index 345bc83be2a79ba1c333a1b2a847c2ef9ac0b880..8c4e700899d04dbe88206f0b641e91035ed11098 100644 (file)
@@ -291,7 +291,7 @@ void MyFrame::OnReportView(wxCommandEvent& WXUNUSED(event))
     // we leave all mask fields to 0 and only change the colour
     wxListItem item;
     item.m_itemId = 0;
-    item.SetTextColour(*wxBLUE);
+    item.SetTextColour(*wxRED);
     m_listCtrl->SetItem( item );
 
     item.m_itemId = 2;
index 16db403d0d165dbf7f27810a2b31fc7bc0d3f3e1..bb31a04f6acaa780a4c0a1885aea16c1a1a1568d 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,30 @@ int wxListLineData::GetImage( int index )
     return -1;
 }
 
+void wxListLineData::SetAttributes(wxDC *dc,
+                                   const wxListItemAttr *attr,
+                                   const wxColour& colText,
+                                   const wxFont& font)
+{
+    if ( 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 +619,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);
+
+    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 +677,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 +697,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 );
             }
         }
     }
@@ -2881,15 +2922,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
 {