X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8b375198b712f4f014e7853b7877f3777b31c1b4..3863c5ebd92650ba88f29db4f5f8d794ec11bf80:/src/mac/carbon/listctrl_mac.cpp?ds=sidebyside diff --git a/src/mac/carbon/listctrl_mac.cpp b/src/mac/carbon/listctrl_mac.cpp index 01045405ec..fc27f289ef 100644 --- a/src/mac/carbon/listctrl_mac.cpp +++ b/src/mac/carbon/listctrl_mac.cpp @@ -102,7 +102,7 @@ wxEND_HANDLERS_TABLE() wxCONSTRUCTOR_5( wxListCtrl , wxWindow* , Parent , wxWindowID , Id , wxPoint , Position , wxSize , Size , long , WindowStyle ) /* - TODO : Expose more information of a list's layout etc. via appropriate objects (à la NotebookPageInfo) + TODO : Expose more information of a list's layout etc. via appropriate objects (ï¿  la NotebookPageInfo) */ #else IMPLEMENT_DYNAMIC_CLASS(wxListCtrl, wxControl) @@ -152,7 +152,7 @@ static pascal OSStatus wxMacListCtrlEventHandler( EventHandlerCallRef handler , // FIXME: we can't use the sort property for virtual listctrls // so we need to find a better way to determine which column was clicked... if (!window->IsVirtual()) - window->GetEventHandler()->ProcessEvent( le ); + window->HandleWindowEvent( le ); } result = CallNextEventHandler(handler, event); break; @@ -259,11 +259,11 @@ protected: Rect *maxEditTextRect, Boolean *shrinkToFit); - static pascal Boolean DataBrowserHitTestProc(ControlRef browser, - DataBrowserItemID itemID, - DataBrowserPropertyID property, - const Rect *theRect, - const Rect *mouseRect) { return true; } + static pascal Boolean DataBrowserHitTestProc(ControlRef WXUNUSED(browser), + DataBrowserItemID WXUNUSED(itemID), + DataBrowserPropertyID WXUNUSED(property), + const Rect *WXUNUSED(theRect), + const Rect *WXUNUSED(mouseRect)) { return true; } virtual bool ConfirmEditText(DataBrowserItemID item, DataBrowserPropertyID property, @@ -305,7 +305,7 @@ bool wxMacListCtrlEventDelegate::ProcessEvent( wxEvent& event ) if ( !event.IsKindOf( CLASSINFO( wxCommandEvent ) ) ) { - if (m_list->GetEventHandler()->ProcessEvent( event )) + if (m_list->HandleWindowEvent( event )) return true; } return wxEvtHandler::ProcessEvent(event); @@ -648,7 +648,7 @@ void wxListCtrl::FireMouseEvent(wxEventType eventType, wxPoint position) le.m_itemIndex = item; le.m_item.m_itemId = item; GetItem(le.m_item); - GetEventHandler()->ProcessEvent(le); + HandleWindowEvent(le); } } @@ -697,7 +697,7 @@ void wxListCtrl::OnChar(wxKeyEvent& event) le.m_itemIndex = m_current; le.m_item.m_itemId = m_current; GetItem(le.m_item); - GetEventHandler()->ProcessEvent(le); + HandleWindowEvent(le); } } event.Skip(); @@ -970,7 +970,7 @@ bool wxListCtrl::SetColumn(int col, wxListItem& item) enc = m_font.GetEncoding(); else enc = wxLocale::GetSystemEncoding(); - wxMacCFStringHolder cfTitle; + wxCFStringRef cfTitle; cfTitle.Assign( item.GetText() , enc ); if(columnDesc.titleString) CFRelease(columnDesc.titleString); @@ -980,13 +980,13 @@ bool wxListCtrl::SetColumn(int col, wxListItem& item) if (item.GetMask() & wxLIST_MASK_IMAGE && item.GetImage() != -1 ) { - columnDesc.btnContentInfo.contentType = kControlContentIconRef; wxImageList* imageList = GetImageList(wxIMAGE_LIST_SMALL); if (imageList && imageList->GetImageCount() > 0 ) { wxBitmap bmp = imageList->GetBitmap( item.GetImage() ); - IconRef icon = bmp.GetBitmapData()->GetIconRef(); + IconRef icon = bmp.GetIconRef(); columnDesc.btnContentInfo.u.iconRef = icon; + columnDesc.btnContentInfo.contentType = kControlContentIconRef; } } @@ -1743,7 +1743,7 @@ bool wxListCtrl::DeleteItem(long item) wxListEvent event( wxEVT_COMMAND_LIST_DELETE_ITEM, GetId() ); event.SetEventObject( this ); event.m_itemIndex = item; - GetEventHandler()->ProcessEvent( event ); + HandleWindowEvent( event ); } return true; @@ -1760,7 +1760,7 @@ bool wxListCtrl::DeleteAllItems() m_dbImpl->MacClear(); wxListEvent event( wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS, GetId() ); event.SetEventObject( this ); - GetEventHandler()->ProcessEvent( event ); + HandleWindowEvent( event ); } return true; } @@ -1834,7 +1834,7 @@ wxTextCtrl* wxListCtrl::EditLabel(long item, wxClassInfo* textControlClass) le.m_col = 0; GetItem( le.m_item ); - if ( GetParent()->GetEventHandler()->ProcessEvent( le ) && !le.IsAllowed() ) + if ( GetParent()->HandleWindowEvent( le ) && !le.IsAllowed() ) { // vetoed by user code return NULL; @@ -1848,7 +1848,7 @@ wxTextCtrl* wxListCtrl::EditLabel(long item, wxClassInfo* textControlClass) } // End label editing, optionally cancelling the edit -bool wxListCtrl::EndEditLabel(bool cancel) +bool wxListCtrl::EndEditLabel(bool WXUNUSED(cancel)) { // TODO: generic impl. doesn't have this method - is it needed for us? if (m_genericImpl) @@ -2033,7 +2033,7 @@ long wxListCtrl::InsertItem(wxListItem& info) wxListEvent event( wxEVT_COMMAND_LIST_INSERT_ITEM, GetId() ); event.SetEventObject( this ); event.m_itemIndex = info.m_itemId; - GetEventHandler()->ProcessEvent( event ); + HandleWindowEvent( event ); return info.m_itemId; } return -1; @@ -2200,7 +2200,7 @@ bool wxListCtrl::OnRenameAccept(long itemEdit, const wxString& value) GetItem( le.m_item ); le.m_item.m_text = value; - return !GetEventHandler()->ProcessEvent( le ) || + return !HandleWindowEvent( le ) || le.IsAllowed(); } @@ -2215,7 +2215,7 @@ void wxListCtrl::OnRenameCancelled(long itemEdit) le.m_itemIndex = itemEdit; GetItem( le.m_item ); - GetEventHandler()->ProcessEvent( le ); + HandleWindowEvent( le ); } // ---------------------------------------------------------------------------- @@ -2297,9 +2297,26 @@ void wxListCtrl::RefreshItem(long item) return; } - wxRect rect; - GetItemRect(item, rect); - RefreshRect(rect); + if (m_dbImpl) + { + DataBrowserItemID id; + + if ( !IsVirtual() ) + { + wxMacDataItem* thisItem = m_dbImpl->GetItemFromLine(item); + id = (DataBrowserItemID) thisItem; + } + else + id = item+1; + + m_dbImpl->wxMacDataBrowserControl::UpdateItems + ( + kDataBrowserNoItem, + 1, &id, + kDataBrowserItemNoProperty, // preSortProperty + kDataBrowserNoItem // update all columns + ); + } } void wxListCtrl::RefreshItems(long itemFrom, long itemTo) @@ -2310,14 +2327,35 @@ void wxListCtrl::RefreshItems(long itemFrom, long itemTo) return; } - wxRect rect1, rect2; - GetItemRect(itemFrom, rect1); - GetItemRect(itemTo, rect2); + if (m_dbImpl) + { + const long count = itemTo - itemFrom + 1; + DataBrowserItemID *ids = new DataBrowserItemID[count]; - wxRect rect = rect1; - rect.height = rect2.GetBottom() - rect1.GetTop(); + if ( !IsVirtual() ) + { + for ( long i = 0; i < count; i++ ) + { + wxMacDataItem* thisItem = m_dbImpl->GetItemFromLine(itemFrom+i); + ids[i] = (DataBrowserItemID) thisItem; + } + } + else + { + for ( long i = 0; i < count; i++ ) + ids[i] = itemFrom+i+1; + } + + m_dbImpl->wxMacDataBrowserControl::UpdateItems + ( + kDataBrowserNoItem, + count, ids, + kDataBrowserItemNoProperty, // preSortProperty + kDataBrowserNoItem // update all columns + ); - RefreshRect(rect); + delete[] ids; + } } void wxListCtrl::SetDropTarget( wxDropTarget *dropTarget ) @@ -2364,7 +2402,7 @@ wxMacListCtrlItem::~wxMacListCtrlItem() void wxMacListCtrlItem::Notification(wxMacDataItemBrowserControl *owner , DataBrowserItemNotification message, - DataBrowserItemDataRef itemData ) const + DataBrowserItemDataRef WXUNUSED(itemData) ) const { wxMacDataBrowserListCtrlControl *lb = wxDynamicCast(owner, wxMacDataBrowserListCtrlControl); @@ -2510,9 +2548,7 @@ wxMacDataBrowserListCtrlControl::wxMacDataBrowserListCtrlControl( wxWindow *peer if ( style & wxLC_VRULES ) { -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 verify_noerr( DataBrowserChangeAttributes(m_controlRef, kDataBrowserAttributeListViewDrawColumnDividers, kDataBrowserAttributeNone) ); -#endif } verify_noerr( SetHiliteStyle(kDataBrowserTableViewFillHilite ) ); @@ -2538,11 +2574,11 @@ pascal Boolean wxMacDataBrowserListCtrlControl::DataBrowserEditTextProc( } bool wxMacDataBrowserListCtrlControl::ConfirmEditText( - DataBrowserItemID itemID, - DataBrowserPropertyID property, - CFStringRef theString, - Rect *maxEditTextRect, - Boolean *shrinkToFit) + DataBrowserItemID WXUNUSED(itemID), + DataBrowserPropertyID WXUNUSED(property), + CFStringRef WXUNUSED(theString), + Rect *WXUNUSED(maxEditTextRect), + Boolean *WXUNUSED(shrinkToFit)) { return false; } @@ -2601,7 +2637,7 @@ void wxMacDataBrowserListCtrlControl::DrawItem( DataBrowserItemID itemID, DataBrowserPropertyID property, DataBrowserItemState itemState, - const Rect *itemRect, + const Rect *WXUNUSED(itemRect), SInt16 gdDepth, Boolean colorDevice) { @@ -2668,8 +2704,7 @@ void wxMacDataBrowserListCtrlControl::DrawItem( if (font == wxNullFont) font = listFont; - wxMacCFStringHolder cfString; - cfString.Assign( text, wxLocale::GetSystemEncoding() ); + wxCFStringRef cfString( text, wxLocale::GetSystemEncoding() ); Rect enclosingRect; CGRect enclosingCGRect, iconCGRect, textCGRect; @@ -2731,13 +2766,13 @@ void wxMacDataBrowserListCtrlControl::DrawItem( { if (color.Ok()) - labelColor = MAC_WXCOLORREF( color.GetPixel() ); + color.GetRGBColor(&labelColor); else if (list->GetTextColour().Ok()) - labelColor = MAC_WXCOLORREF( list->GetTextColour().GetPixel() ); + list->GetTextColour().GetRGBColor(&labelColor); if (bgColor.Ok()) { - backgroundColor = MAC_WXCOLORREF( bgColor.GetPixel() ); + bgColor.GetRGBColor(&backgroundColor); CGContextSaveGState(context); CGContextSetRGBFillColor(context, (float)backgroundColor.red / (float)USHRT_MAX, @@ -2756,7 +2791,7 @@ void wxMacDataBrowserListCtrlControl::DrawItem( wxImageList* imageList = list->GetImageList(wxIMAGE_LIST_SMALL); if (imageList && imageList->GetImageCount() > 0){ wxBitmap bmp = imageList->GetBitmap(imgIndex); - IconRef icon = bmp.GetBitmapData()->GetIconRef(); + IconRef icon = bmp.GetIconRef(); CGContextSaveGState(context); CGContextTranslateCTM(context, 0,iconCGRect.origin.y + CGRectGetMaxY(iconCGRect)); @@ -2770,19 +2805,37 @@ void wxMacDataBrowserListCtrlControl::DrawItem( } HIThemeTextHorizontalFlush hFlush = kHIThemeTextHorizontalFlushLeft; - UInt16 fontID = kThemeViewsFont; - - if (font.Ok()) + HIThemeTextInfo info; + bool setup = false; +#if wxMAC_USE_CORE_TEXT + if ( UMAGetSystemVersion() >= 0x1050 ) { - if (font.GetFamily() != wxFONTFAMILY_DEFAULT) - fontID = font.MacGetThemeFontID(); - -// FIXME: replace these with CG or ATSUI calls so we can remove this #ifndef. -#ifndef __LP64__ - ::TextSize( (short)(font.MacGetFontSize()) ) ; - ::TextFace( font.MacGetFontStyle() ) ; + info.version = kHIThemeTextInfoVersionOne; + info.fontID = kThemeViewsFont; + if (font.Ok()) + { + info.fontID = kThemeSpecifiedFont; + info.font = (CTFontRef) font.MacGetCTFont(); + setup = true; + } + } #endif +#if wxMAC_USE_ATSU_TEXT + if ( !setup ) + { + info.version = kHIThemeTextInfoVersionZero; + info.fontID = kThemeViewsFont; + + if (font.Ok()) + { + if (font.GetFamily() != wxFONTFAMILY_DEFAULT) + info.fontID = font.MacGetThemeFontID(); + + ::TextSize( (short)(font.MacGetFontSize()) ) ; + ::TextFace( font.MacGetFontStyle() ) ; + } } +#endif wxListItem item; list->GetColumn(listColumn, item); @@ -2799,10 +2852,7 @@ void wxMacDataBrowserListCtrlControl::DrawItem( } } - HIThemeTextInfo info; - info.version = kHIThemeTextInfoVersionZero; info.state = active ? kThemeStateActive : kThemeStateInactive; - info.fontID = fontID; info.horizontalFlushness = hFlush; info.verticalFlushness = kHIThemeTextVerticalFlushCenter; info.options = kHIThemeTextBoxOptionNone; @@ -2818,8 +2868,10 @@ void wxMacDataBrowserListCtrlControl::DrawItem( CGContextRestoreGState(context); +#ifndef __LP64__ if (savedState != NULL) SetThemeDrawingState(savedState, true); +#endif } OSStatus wxMacDataBrowserListCtrlControl::GetSetItemData(DataBrowserItemID itemID, @@ -2867,13 +2919,17 @@ OSStatus wxMacDataBrowserListCtrlControl::GetSetItemData(DataBrowserItemID itemI if ( list && list->HasFlag( wxLC_EDIT_LABELS ) ) { verify_noerr(SetDataBrowserItemDataBooleanValue( itemData, true )); + err = noErr ; } break ; default : if ( property >= kMinColumnId ) { - wxMacCFStringHolder cfStr(text); - verify_noerr( ::SetDataBrowserItemDataText( itemData, cfStr) ); + if (!text.IsEmpty()){ + wxCFStringRef cfStr( text, wxLocale::GetSystemEncoding() ); + err = ::SetDataBrowserItemDataText( itemData, cfStr ); + err = noErr; + } @@ -2882,7 +2938,7 @@ OSStatus wxMacDataBrowserListCtrlControl::GetSetItemData(DataBrowserItemID itemI wxImageList* imageList = list->GetImageList(wxIMAGE_LIST_SMALL); if (imageList && imageList->GetImageCount() > 0){ wxBitmap bmp = imageList->GetBitmap(imgIndex); - IconRef icon = bmp.GetBitmapData()->GetIconRef(); + IconRef icon = bmp.GetIconRef(); ::SetDataBrowserItemDataIcon(itemData, icon); } } @@ -2905,7 +2961,7 @@ OSStatus wxMacDataBrowserListCtrlControl::GetSetItemData(DataBrowserItemID itemI // can then deal with the veto CFStringRef sr ; verify_noerr( GetDataBrowserItemDataText( itemData , &sr ) ) ; - wxMacCFStringHolder cfStr(sr) ;; + wxCFStringRef cfStr(sr) ;; if (m_isVirtual) list->SetItem( (long)itemData-1 , listColumn, cfStr.AsString() ) ; else @@ -2923,7 +2979,7 @@ OSStatus wxMacDataBrowserListCtrlControl::GetSetItemData(DataBrowserItemID itemI void wxMacDataBrowserListCtrlControl::ItemNotification(DataBrowserItemID itemID, DataBrowserItemNotification message, - DataBrowserItemDataRef itemData ) + DataBrowserItemDataRef WXUNUSED(itemData) ) { // we want to depend on as little as possible to make sure tear-down of controls is safe if ( message == kDataBrowserItemRemoved) @@ -2944,7 +3000,6 @@ void wxMacDataBrowserListCtrlControl::ItemNotification(DataBrowserItemID itemID, bool trigger = false; wxListEvent event( wxEVT_COMMAND_LIST_ITEM_SELECTED, list->GetId() ); - bool isSingle = (list->GetWindowStyle() & wxLC_SINGLE_SEL) != 0; event.SetEventObject( list ); if ( !list->IsVirtual() ) @@ -2964,8 +3019,9 @@ void wxMacDataBrowserListCtrlControl::ItemNotification(DataBrowserItemID itemID, { case kDataBrowserItemDeselected: event.SetEventType(wxEVT_COMMAND_LIST_ITEM_DESELECTED); - if ( !isSingle ) - trigger = !IsSelectionSuppressed(); + // as the generic implementation is also triggering this + // event for single selection, we do the same (different than listbox) + trigger = !IsSelectionSuppressed(); break; case kDataBrowserItemSelected: