X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/80d72f726da59d59c9eea9ac0adebdd064736936..b73b21173698adb858573d233497657099991b03:/src/mac/carbon/listctrl_mac.cpp diff --git a/src/mac/carbon/listctrl_mac.cpp b/src/mac/carbon/listctrl_mac.cpp index f25737c1af..13a20ac220 100644 --- a/src/mac/carbon/listctrl_mac.cpp +++ b/src/mac/carbon/listctrl_mac.cpp @@ -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