]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/listctrl_mac.cpp
fix the confusion in boolean attributes handling in pre-1.3 and 1.3 versions of GLX...
[wxWidgets.git] / src / mac / carbon / listctrl_mac.cpp
index f25737c1afac10e786a55978599393f3f2113898..13a20ac2200f4318dde07d23c6fc9c052949c3d8 100644 (file)
@@ -30,6 +30,7 @@
 
 #ifndef WX_PRECOMP
     #include "wx/intl.h"
+    #include "wx/settings.h"
 #endif
 
 #include "wx/mac/uma.h"
@@ -770,10 +771,13 @@ wxListCtrl::~wxListCtrl()
         delete m_imageListState;
 
     delete m_renameTimer;
+    
+    WX_CLEAR_LIST(wxColumnList, m_colsInfo);
 }
 
 /*static*/
-wxVisualAttributes wxListCtrl::GetClassDefaultAttributes(wxWindowVariant variant)
+wxVisualAttributes
+wxListCtrl::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))
 {
     wxVisualAttributes attr;
 
@@ -1045,31 +1049,37 @@ bool wxListCtrl::SetColumnWidth(int col, int width)
 
     if (m_dbImpl)
     {
-        int mywidth = width;
-        if (width == wxLIST_AUTOSIZE || width == wxLIST_AUTOSIZE_USEHEADER)
-            mywidth = 150;
+        if ( width == wxLIST_AUTOSIZE_USEHEADER )
+        {
+            width = 150; // FIXME
+        }
 
         if (col == -1)
         {
             for (int column = 0; column < GetColumnCount(); column++)
             {
                 wxListItem colInfo;
-                GetColumn(col, colInfo);
+                GetColumn(column, colInfo);
 
                 colInfo.SetWidth(width);
-                SetColumn(col, colInfo);
+                SetColumn(column, colInfo);
 
-                m_dbImpl->SetColumnWidth(col, mywidth);
+                const int mywidth = (width == wxLIST_AUTOSIZE)
+                                    ? CalcColumnAutoWidth(column) : width;
+                m_dbImpl->SetColumnWidth(column, mywidth);
             }
         }
         else
         {
+            if ( width == wxLIST_AUTOSIZE )
+                width = CalcColumnAutoWidth(col);
+
             wxListItem colInfo;
             GetColumn(col, colInfo);
 
             colInfo.SetWidth(width);
             SetColumn(col, colInfo);
-            m_dbImpl->SetColumnWidth(col, mywidth);
+            m_dbImpl->SetColumnWidth(col, width);
         }
         return true;
     }
@@ -2410,6 +2420,7 @@ void wxListCtrl::SetFocus()
 
 wxMacListCtrlItem::~wxMacListCtrlItem()
 {
+    WX_CLEAR_HASH_MAP( wxListItemList, m_rowItems );
 }
 
 void wxMacListCtrlItem::Notification(wxMacDataItemBrowserControl *owner ,
@@ -2766,9 +2777,9 @@ void wxMacDataBrowserListCtrlControl::DrawItem(
         }
         CGContextSaveGState(context);
 
-        CGContextSetRGBFillColor(context, (float)backgroundColor.red / (float)USHRT_MAX,
-                      (float)backgroundColor.green / (float)USHRT_MAX,
-                      (float)backgroundColor.blue / (float)USHRT_MAX, 1.0);
+        CGContextSetRGBFillColor(context, (CGFloat)backgroundColor.red / (CGFloat)USHRT_MAX,
+                      (CGFloat)backgroundColor.green / (CGFloat)USHRT_MAX,
+                      (CGFloat)backgroundColor.blue / (CGFloat)USHRT_MAX, (CGFloat) 1.0);
         CGContextFillRect(context, enclosingCGRect);
 
         CGContextRestoreGState(context);
@@ -2786,9 +2797,9 @@ void wxMacDataBrowserListCtrlControl::DrawItem(
             bgColor.GetRGBColor(&backgroundColor);
             CGContextSaveGState(context);
 
-            CGContextSetRGBFillColor(context, (float)backgroundColor.red / (float)USHRT_MAX,
-                          (float)backgroundColor.green / (float)USHRT_MAX,
-                          (float)backgroundColor.blue / (float)USHRT_MAX, 1.0);
+            CGContextSetRGBFillColor(context, (CGFloat)backgroundColor.red / (CGFloat)USHRT_MAX,
+                          (CGFloat)backgroundColor.green / (CGFloat)USHRT_MAX,
+                          (CGFloat)backgroundColor.blue / (CGFloat)USHRT_MAX, (CGFloat) 1.0);
             CGContextFillRect(context, enclosingCGRect);
 
             CGContextRestoreGState(context);
@@ -2870,9 +2881,9 @@ void wxMacDataBrowserListCtrlControl::DrawItem(
     info.truncationMaxLines = 1;
 
     CGContextSaveGState(context);
-    CGContextSetRGBFillColor (context, (float)labelColor.red / (float)USHRT_MAX,
-                      (float)labelColor.green / (float)USHRT_MAX,
-                      (float)labelColor.blue / (float)USHRT_MAX, 1.0);
+    CGContextSetRGBFillColor (context, (CGFloat)labelColor.red / (CGFloat)USHRT_MAX,
+                      (CGFloat)labelColor.green / (CGFloat)USHRT_MAX,
+                      (CGFloat)labelColor.blue / (CGFloat)USHRT_MAX, (CGFloat) 1.0);
 
     HIThemeDrawTextBox(cfString, &textCGRect, &info, context, kHIThemeOrientationNormal);
 
@@ -2895,7 +2906,7 @@ OSStatus wxMacDataBrowserListCtrlControl::GetSetItemData(DataBrowserItemID itemI
 
     OSStatus err = errDataBrowserPropertyNotSupported;
     wxListCtrl* list = wxDynamicCast( GetPeer() , wxListCtrl );
-    wxMacListCtrlItem* lcItem;
+    wxMacListCtrlItem* lcItem = NULL;
 
     if (listColumn >= 0)
     {
@@ -2989,18 +3000,27 @@ OSStatus wxMacDataBrowserListCtrlControl::GetSetItemData(DataBrowserItemID itemI
 
 void wxMacDataBrowserListCtrlControl::ItemNotification(DataBrowserItemID itemID,
     DataBrowserItemNotification message,
-    DataBrowserItemDataRef WXUNUSED(itemData) )
+    DataBrowserItemDataRef itemData )
 {
+    wxMacListCtrlItem *item = NULL;
+    if ( !m_isVirtual )
+    {
+        item = (wxMacListCtrlItem *) itemID;
+    }
+    
     // we want to depend on as little as possible to make sure tear-down of controls is safe
-    if ( message == kDataBrowserItemRemoved)
+    if ( message == kDataBrowserItemRemoved )
     {
-        // make sure MacDelete does the proper teardown.
+        if ( item )
+            item->Notification(this, message, itemData);
         return;
     }
     else if ( message == kDataBrowserItemAdded )
     {
         // we don't issue events on adding, the item is not really stored in the list yet, so we
         // avoid asserts by getting out now
+        if ( item )
+            item->Notification(this, message, itemData);
         return  ;
     }
 
@@ -3327,5 +3347,36 @@ void wxMacListCtrlItem::SetColumnInfo( unsigned int column, wxListItem* item )
     }
 }
 
+int wxListCtrl::CalcColumnAutoWidth(int col) const
+{
+    int width = 0;
+
+    for ( int i = 0; i < GetItemCount(); i++ )
+    {
+        wxListItem info;
+        info.SetMask(wxLIST_MASK_TEXT | wxLIST_MASK_IMAGE);
+        info.SetId(i);
+        info.SetColumn(col);
+        GetItem(info);
+
+        const wxFont font = info.GetFont();
+
+        int w = 0;
+        if ( font.IsOk() )
+            GetTextExtent(info.GetText(), &w, NULL, NULL, NULL, &font);
+        else
+            GetTextExtent(info.GetText(), &w, NULL);
+
+        w += 2 * kItemPadding;
+
+        if ( info.GetImage() != -1 )
+            w += kIconWidth;
+
+        width = wxMax(width, w);
+    }
+
+    return width;
+}
+
 #endif // wxUSE_LISTCTRL