diff --git a/include/wx/mac/carbon/private.h b/include/wx/mac/carbon/private.h index 59eeeef2b8..e3e4d35943 100644 --- a/include/wx/mac/carbon/private.h +++ b/include/wx/mac/carbon/private.h @@ -802,6 +802,8 @@ public : OSStatus SetHeaderDesc( DataBrowserPropertyID property, DataBrowserListViewHeaderDesc *desc ); OSStatus SetDisclosureColumn( DataBrowserPropertyID property , Boolean expandableRows ); + + OSStatus GetItemPartBounds( DataBrowserItemID item, DataBrowserPropertyID property, DataBrowserPropertyPart part, Rect * bounds ); protected : static pascal void DataBrowserItemNotificationProc( diff --git a/src/mac/carbon/listctrl_mac.cpp b/src/mac/carbon/listctrl_mac.cpp index edc3254358..d47a8064e0 100644 --- a/src/mac/carbon/listctrl_mac.cpp +++ b/src/mac/carbon/listctrl_mac.cpp @@ -103,7 +103,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 (a la NotebookPageInfo) */ #else IMPLEMENT_DYNAMIC_CLASS(wxListCtrl, wxControl) @@ -619,7 +619,7 @@ void wxListCtrl::OnLeftDown(wxMouseEvent& event) int hitResult; long current = HitTest(event.GetPosition(), hitResult); if ((current == m_current) && - (hitResult == wxLIST_HITTEST_ONITEM) && + (hitResult & wxLIST_HITTEST_ONITEMLABEL) && HasFlag(wxLC_EDIT_LABELS) ) { m_renameTimer->Start( 100, true ); @@ -2019,11 +2019,16 @@ long wxListCtrl::FindItem(long start, const wxPoint& pt, int direction) return -1; } +static void calculateCGDrawingBounds(CGRect inItemRect, CGRect *outIconRect, CGRect *outTextRect, bool hasIcon = false); + // Determines which item (if any) is at the specified point, // giving details in 'flags' (see wxLIST_HITTEST_... flags above) long wxListCtrl::HitTest(const wxPoint& point, int& flags, long *ptrSubItem) const { + if (ptrSubItem) + *ptrSubItem = -1; + if (m_genericImpl) return m_genericImpl->HitTest(point, flags, ptrSubItem); @@ -2050,26 +2055,93 @@ wxListCtrl::HitTest(const wxPoint& point, int& flags, long *ptrSubItem) const DataBrowserItemID id; m_dbImpl->GetItemID( (DataBrowserTableViewRowIndex) row, &id ); - // TODO: Use GetDataBrowserItemPartBounds to return if we are in icon or label - if ( !(GetWindowStyleFlag() & wxLC_VIRTUAL ) && row < GetItemCount() ) + CGPoint click_point = CGPointMake( point.x, point.y ); + if (row < GetItemCount() ) { - wxMacListCtrlItem* lcItem; - lcItem = (wxMacListCtrlItem*) id; - if (lcItem) + short column; + for( column = 0; column < GetColumnCount(); column++ ) { - flags = wxLIST_HITTEST_ONITEM; - return row; - } - } - else - { - if (row < GetItemCount() ) - { - flags = wxLIST_HITTEST_ONITEM; - return row; - } - } + Rect enclosingRect; + CGRect enclosingCGRect, iconCGRect, textCGRect; + int imgIndex = -1; + wxMacListCtrlItem* lcItem; + WXUNUSED_UNLESS_DEBUG( OSStatus status = ) m_dbImpl->GetItemPartBounds( id, kMinColumnId + column, kDataBrowserPropertyEnclosingPart, &enclosingRect ); + wxASSERT( status == noErr ); + + enclosingCGRect = CGRectMake(enclosingRect.left, + enclosingRect.top, + enclosingRect.right - enclosingRect.left, + enclosingRect.bottom - enclosingRect.top); + + if (column >= 0) + { + if ( !(GetWindowStyleFlag() & wxLC_VIRTUAL ) ) + { + lcItem = (wxMacListCtrlItem*) id; + if (lcItem->HasColumnInfo(column)) + { + wxListItem* item = lcItem->GetColumnInfo(column); + + if (item->GetMask() & wxLIST_MASK_IMAGE) + { + imgIndex = item->GetImage(); + } + } + } + else + { + long itemNum = (long)id-1; + if (itemNum >= 0 && itemNum < GetItemCount()) + { + imgIndex = OnGetItemColumnImage( itemNum, column ); + } + } + } + + calculateCGDrawingBounds(enclosingCGRect, &iconCGRect, &textCGRect, (imgIndex != -1) ); + + if ( CGRectContainsPoint( iconCGRect, click_point ) ) + { + flags = wxLIST_HITTEST_ONITEMICON; + if (ptrSubItem) + *ptrSubItem = column; + return row; + } + else if ( CGRectContainsPoint( textCGRect, click_point ) ) + { + flags = wxLIST_HITTEST_ONITEMLABEL; + if (ptrSubItem) + *ptrSubItem = column; + return row; + } + } + + if ( !(GetWindowStyleFlag() & wxLC_VIRTUAL ) ) + { + wxMacListCtrlItem* lcItem; + lcItem = (wxMacListCtrlItem*) id; + if (lcItem) + { + flags = wxLIST_HITTEST_ONITEM; + if (ptrSubItem) + *ptrSubItem = column; + return row; + } + } + else + { + flags = wxLIST_HITTEST_ONITEM; + if (ptrSubItem) + *ptrSubItem = column; + return row; + } + } + else + { + if ( wxControl::HitTest( point ) ) + flags = wxLIST_HITTEST_NOWHERE; + } } return -1; } @@ -2698,7 +2770,7 @@ enum kContentHeight = kIconHeight + kTextBoxHeight + kIconTextSpacingV }; -static void calculateCGDrawingBounds(CGRect inItemRect, CGRect *outIconRect, CGRect *outTextRect, bool hasIcon = false) +static void calculateCGDrawingBounds(CGRect inItemRect, CGRect *outIconRect, CGRect *outTextRect, bool hasIcon) { float textBottom; float iconH, iconW = 0; @@ -2801,6 +2873,8 @@ void wxMacDataBrowserListCtrlControl::DrawItem( ThemeDrawingState savedState = NULL; #endif CGContextRef context = (CGContextRef)list->MacGetDrawingContext(); + wxMacCGContextStateSaver top_saver_cg( context ); + RGBColor labelColor; labelColor.red = 0; labelColor.green = 0; @@ -2844,14 +2918,13 @@ void wxMacDataBrowserListCtrlControl::DrawItem( GetThemeBrushAsColor(kThemeBrushSecondaryHighlightColor, 32, true, &backgroundColor); GetThemeTextColor(kThemeTextColorBlack, gdDepth, colorDevice, &labelColor); } - CGContextSaveGState(context); + wxMacCGContextStateSaver cg( 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, + (float)backgroundColor.red / (float)USHRT_MAX, + (float)backgroundColor.green / (float)USHRT_MAX, + (float)backgroundColor.blue / (float)USHRT_MAX, 1.0); CGContextFillRect(context, enclosingCGRect); - - CGContextRestoreGState(context); } else { @@ -2864,14 +2937,13 @@ void wxMacDataBrowserListCtrlControl::DrawItem( if (bgColor.Ok()) { backgroundColor = MAC_WXCOLORREF( bgColor.GetPixel() ); - CGContextSaveGState(context); + wxMacCGContextStateSaver cg( 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, + (float)backgroundColor.red / (float)USHRT_MAX, + (float)backgroundColor.green / (float)USHRT_MAX, + (float)backgroundColor.blue / (float)USHRT_MAX, 1.0); CGContextFillRect(context, enclosingCGRect); - - CGContextRestoreGState(context); } } @@ -2884,14 +2956,13 @@ void wxMacDataBrowserListCtrlControl::DrawItem( wxBitmap bmp = imageList->GetBitmap(imgIndex); IconRef icon = bmp.GetBitmapData()->GetIconRef(); - CGContextSaveGState(context); + wxMacCGContextStateSaver cg( context ); + CGContextTranslateCTM(context, 0,iconCGRect.origin.y + CGRectGetMaxY(iconCGRect)); CGContextScaleCTM(context,1.0f,-1.0f); PlotIconRefInContext(context, &iconCGRect, kAlignNone, active ? kTransformNone : kTransformDisabled, NULL, kPlotIconRefNormalFlags, icon); - - CGContextRestoreGState(context); } } @@ -2941,14 +3012,14 @@ void wxMacDataBrowserListCtrlControl::DrawItem( info.truncationPosition = kHIThemeTextTruncationEnd; 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); + { + wxMacCGContextStateSaver cg( context ); + CGContextSetRGBFillColor (context, (float)labelColor.red / (float)USHRT_MAX, + (float)labelColor.green / (float)USHRT_MAX, + (float)labelColor.blue / (float)USHRT_MAX, 1.0); - HIThemeDrawTextBox(cfString, &textCGRect, &info, context, kHIThemeOrientationNormal); - - CGContextRestoreGState(context); + HIThemeDrawTextBox(cfString, &textCGRect, &info, context, kHIThemeOrientationNormal); + } #ifndef __LP64__ if (savedState != NULL) diff --git a/src/mac/carbon/utils.cpp b/src/mac/carbon/utils.cpp index 6e0271ed21..3525f0b6b3 100644 --- a/src/mac/carbon/utils.cpp +++ b/src/mac/carbon/utils.cpp @@ -650,10 +650,10 @@ wxString wxGetOsDescription() #ifdef __DARWIN__ struct utsname name; uname(&name); - return wxString::Format(_T("Mac OS X (%s %s %s)"), - wxString::FromAscii(name.sysname).c_str(), - wxString::FromAscii(name.release).c_str(), - wxString::FromAscii(name.machine).c_str()); + return wxString::Format(_T("Mac OS X (%s %s %s)"), + wxString::FromAscii(name.sysname).c_str(), + wxString::FromAscii(name.release).c_str(), + wxString::FromAscii(name.machine).c_str()); #else #ifdef WXWIN_OS_DESCRIPTION // use configure generated description if available @@ -1644,6 +1644,11 @@ OSStatus wxMacDataBrowserControl::SetDisclosureColumn( DataBrowserPropertyID pro return SetDataBrowserListViewDisclosureColumn( m_controlRef, property, expandableRows); } +OSStatus wxMacDataBrowserControl::GetItemPartBounds( DataBrowserItemID item, DataBrowserPropertyID property, DataBrowserPropertyPart part, Rect * bounds ) +{ + return GetDataBrowserItemPartBounds( m_controlRef, item, property, part, bounds); +} + // ============================================================================ // Higher-level Databrowser // ============================================================================