]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/listctrlcmn.cpp
Better compatibility with old files when creating an image cache
[wxWidgets.git] / src / common / listctrlcmn.cpp
index 861beef99454112132f73f330a6cc641057ae219..4c89a84d266c6bef75f6b869f199a772cfa4e910 100644 (file)
@@ -136,6 +136,14 @@ IMPLEMENT_DYNAMIC_CLASS(wxListEvent, wxNotifyEvent)
 // wxListCtrlBase implementation
 // ----------------------------------------------------------------------------
 
+long
+wxListCtrlBase::AppendColumn(const wxString& heading,
+                             int format,
+                             int width)
+{
+    return InsertColumn(GetColumnCount(), heading, format, width);
+}
+
 long
 wxListCtrlBase::InsertColumn(long col,
                              const wxString& heading,
@@ -145,7 +153,9 @@ wxListCtrlBase::InsertColumn(long col,
     wxListItem item;
     item.m_mask = wxLIST_MASK_TEXT | wxLIST_MASK_FORMAT;
     item.m_text = heading;
-    if ( width > -1 )
+    if ( width >= 0
+            || width == wxLIST_AUTOSIZE
+                || width == wxLIST_AUTOSIZE_USEHEADER )
     {
         item.m_mask |= wxLIST_MASK_WIDTH;
         item.m_width = width;
@@ -175,6 +185,9 @@ wxSize wxListCtrlBase::DoGetBestClientSize() const
     if ( !InReportView() )
         return wxControl::DoGetBestClientSize();
 
+    int totalWidth;
+    wxClientDC dc(const_cast<wxListCtrlBase*>(this));
+
     // In report mode, we use only the column headers, not items, to determine
     // the best width. The reason for this is that it's easier (we can't just
     // iterate over all items, especially not in a virtual control, so we'd
@@ -186,19 +199,55 @@ wxSize wxListCtrlBase::DoGetBestClientSize() const
     // headers are just truncated if there is not enough place for them.
     const int columns = GetColumnCount();
     if ( HasFlag(wxLC_NO_HEADER) || !columns )
-        return wxControl::DoGetBestClientSize();
-
-    wxClientDC dc(const_cast<wxListCtrlBase*>(this));
-
-    // Total width of all headers determines the best control width.
-    int totalWidth = 0;
-    for ( int col = 0; col < columns; col++ )
     {
-        totalWidth += GetColumnWidth(col);
+        // Use some arbitrary width.
+        totalWidth = 50*dc.GetCharWidth();
+    }
+    else // We do have columns, use them to determine the best width.
+    {
+        totalWidth = 0;
+        for ( int col = 0; col < columns; col++ )
+        {
+            totalWidth += GetColumnWidth(col);
+        }
     }
 
     // Use some arbitrary height, there is no good way to determine it.
     return wxSize(totalWidth, 10*dc.GetCharHeight());
 }
 
+void wxListCtrlBase::SetAlternateRowColour(const wxColour& colour)
+{
+    wxASSERT(HasFlag(wxLC_VIRTUAL));
+    m_alternateRowColour.SetBackgroundColour(colour);
+}
+
+void wxListCtrlBase::EnableAlternateRowColours(bool enable)
+{
+    if ( enable )
+    {
+        // This code is copied from wxDataViewMainWindow::OnPaint()
+
+        // Determine the alternate rows colour automatically from the
+        // background colour.
+        const wxColour bgColour = GetBackgroundColour();
+
+        // Depending on the background, alternate row color
+        // will be 3% more dark or 50% brighter.
+        int alpha = bgColour.GetRGB() > 0x808080 ? 97 : 150;
+        SetAlternateRowColour(bgColour.ChangeLightness(alpha));
+    }
+    else // Disable striping by setting invalid alternative colour.
+    {
+        SetAlternateRowColour(wxColour());
+    }
+}
+
+wxListItemAttr *wxListCtrlBase::OnGetItemAttr(long item) const
+{
+    return (m_alternateRowColour.GetBackgroundColour().IsOk() && (item % 2))
+        ? wxConstCast(&m_alternateRowColour, wxListItemAttr)
+        : NULL; // no attributes by default
+}
+
 #endif // wxUSE_LISTCTRL