X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/99c75ebc5e447e1bb25439e22f07130583dc5783..82c5e9ab462170405c8f08df7c5a38585abf78bd:/src/mac/carbon/databrow.cpp?ds=sidebyside diff --git a/src/mac/carbon/databrow.cpp b/src/mac/carbon/databrow.cpp index 180327d493..a4485f8bc5 100644 --- a/src/mac/carbon/databrow.cpp +++ b/src/mac/carbon/databrow.cpp @@ -9,24 +9,26 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifndef wxUSE_GENERICDATAVIEWCTRL +#include "wx/wxprec.h" -#include +#if wxUSE_DATAVIEWCTRL +#ifndef wxUSE_GENERICDATAVIEWCTRL -#include "wx/wxprec.h" #ifndef WX_PRECOMP #include "wx/app.h" #include "wx/toplevel.h" #include "wx/font.h" + #include "wx/settings.h" + #include "wx/utils.h" #endif #include "wx/dataview.h" -#include "wx/utils.h" - #include "wx/mac/carbon/databrow.h" #include "wx/mac/private.h" #include "wx/mac/uma.h" +#include + // ============================================================================ // Variables used globally in databrow.cpp // ============================================================================ @@ -611,7 +613,7 @@ Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserCompareProc(DataBrow { DataBrowserSortOrder sortOrder; - DataBrowserTableViewColumnIndex columnIndex; + DataBrowserTableViewColumnIndex modelColumnIndex; wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast(this->GetPeer())); @@ -620,13 +622,17 @@ Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserCompareProc(DataBrow wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,false,_("Pointer to model not set correctly.")); if (sortProperty >= kMinPropertyID) { - wxCHECK_MSG(this->GetColumnIndex(sortProperty,&columnIndex) == noErr,false,_("Could not determine column index.")); + // variable definition and initialization: + wxDataViewColumn* ColumnPtr(dataViewCtrlPtr->GetColumnPtr(sortProperty)); + + wxCHECK_MSG(ColumnPtr != NULL,false,_("Could not determine column index.")); + modelColumnIndex = ColumnPtr->GetModelColumn(); } /* if */ else - columnIndex = 0; + modelColumnIndex = 0; this->GetSortOrder(&sortOrder); return static_cast(dataViewCtrlPtr->GetModel()->Compare(wxDataViewItem(reinterpret_cast(itemOneID)),wxDataViewItem(reinterpret_cast(itemTwoID)), - columnIndex,sortOrder != kDataBrowserOrderDecreasing) < 0); + modelColumnIndex,sortOrder != kDataBrowserOrderDecreasing) < 0); } /* wxMacDataViewDataBrowserListViewControl::DataBrowserCompareProc(DataBrowserItemID, DataBrowserItemID, DataBrowserPropertyID) */ void wxMacDataViewDataBrowserListViewControl::DataBrowserGetContextualMenuProc(MenuRef* menu, UInt32* helpType, CFStringRef* helpItemString, AEDesc* WXUNUSED(selection)) @@ -668,14 +674,11 @@ OSStatus wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc( else { // variable definitions: - DataBrowserTableViewColumnIndex columnIndex; - OSStatus errorStatus; - wxDataViewColumn* dataViewColumnPtr; + OSStatus errorStatus; + wxDataViewColumn* dataViewColumnPtr; wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,errDataBrowserNotConfigured,_("Pointer to model not set correctly.")); - errorStatus = this->GetColumnIndex(propertyID,&columnIndex); - wxCHECK_MSG(errorStatus == noErr,errorStatus,_("Could not determine column index")); - dataViewColumnPtr = dataViewCtrlPtr->GetColumn(columnIndex); + dataViewColumnPtr = dataViewCtrlPtr->GetColumnPtr(propertyID); wxCHECK_MSG((dataViewColumnPtr != NULL) && (dataViewColumnPtr->GetRenderer() != NULL),errDataBrowserNotConfigured,_("There is no column or renderer for the specified column index.")); switch (dataViewColumnPtr->GetRenderer()->GetPropertyType()) { @@ -692,14 +695,14 @@ OSStatus wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc( // variable definition and initialization: wxVariant modifiedData(true); - return (dataViewCtrlPtr->GetModel()->SetValue(modifiedData,wxDataViewItem(reinterpret_cast(itemID)),static_cast(columnIndex)) ? OSStatus(noErr) : OSStatus(errDataBrowserNotConfigured)); + return (dataViewCtrlPtr->GetModel()->SetValue(modifiedData,wxDataViewItem(reinterpret_cast(itemID)),dataViewColumnPtr->GetModelColumn()) ? OSStatus(noErr) : OSStatus(errDataBrowserNotConfigured)); } /* if */ else if (buttonValue == kThemeButtonOff) { // variable definition and initialization: wxVariant modifiedData(false); - return (dataViewCtrlPtr->GetModel()->SetValue(modifiedData,wxDataViewItem(reinterpret_cast(itemID)),static_cast(columnIndex)) ? OSStatus(noErr) : OSStatus(errDataBrowserNotConfigured)); + return (dataViewCtrlPtr->GetModel()->SetValue(modifiedData,wxDataViewItem(reinterpret_cast(itemID)),dataViewColumnPtr->GetModelColumn()) ? OSStatus(noErr) : OSStatus(errDataBrowserNotConfigured)); } /* if */ else return errDataBrowserInvalidPropertyData; @@ -723,7 +726,7 @@ OSStatus wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc( #endif wxVariant modifiedData(modifiedString.AsString()); - if (dataViewCtrlPtr->GetModel()->SetValue(modifiedData,wxDataViewItem(reinterpret_cast(itemID)),static_cast(columnIndex))) + if (dataViewCtrlPtr->GetModel()->SetValue(modifiedData,wxDataViewItem(reinterpret_cast(itemID)),dataViewColumnPtr->GetModelColumn())) return noErr; else return errDataBrowserNotConfigured; @@ -979,6 +982,8 @@ void wxMacDataViewDataBrowserListViewControl::DataBrowserItemNotificationProc(Da void wxMacDataViewDataBrowserListViewControl::DataBrowserDrawItemProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemState state, Rect const* rectangle, SInt16 bitDepth, Boolean colorDevice) { + DataBrowserTableViewColumnIndex columnIndex; + wxDataViewColumn* dataViewColumnPtr; wxDataViewCtrl* dataViewCtrlPtr; @@ -987,10 +992,10 @@ void wxMacDataViewDataBrowserListViewControl::DataBrowserDrawItemProc(DataBrowse wxVariant dataToRender; - dataViewCtrlPtr = dynamic_cast(this->GetPeer()); wxCHECK_RET(dataViewCtrlPtr != NULL, _("Pointer to data view control not set correctly.")); wxCHECK_RET(dataViewCtrlPtr->GetModel() != NULL,_("Pointer to model not set correctly.")); + wxCHECK_RET(this->GetColumnIndex(propertyID,&columnIndex) == noErr,_("Could not determine column index.")); dataViewColumnPtr = dataViewCtrlPtr->GetColumnPtr(propertyID); wxCHECK_RET(dataViewColumnPtr != NULL,_("No column for the specified column index existing.")); dataViewCustomRendererPtr = dynamic_cast(dataViewColumnPtr->GetRenderer()); @@ -998,6 +1003,10 @@ void wxMacDataViewDataBrowserListViewControl::DataBrowserDrawItemProc(DataBrowse dataViewCtrlPtr->GetModel()->GetValue(dataToRender,wxDataViewItem(reinterpret_cast(itemID)),dataViewColumnPtr->GetModelColumn()); dataViewCustomRendererPtr->SetValue(dataToRender); + wxDataViewItem dataitem( reinterpret_cast(itemID) ); + dataViewCtrlPtr->GetModel()->GetValue(dataToRender,dataitem,columnIndex); + dataViewCustomRendererPtr->SetValue(dataToRender); + // try to determine the content's size (drawable part): Rect content; RgnHandle rgn(NewRgn()); @@ -1016,16 +1025,53 @@ void wxMacDataViewDataBrowserListViewControl::DataBrowserDrawItemProc(DataBrowse content.left += 5; content.right -= 3; content.bottom -= 3; - // extra space for the scrollbars: + // extra space for the scrollbars: content.bottom -= wxSystemSettings::GetMetric(wxSYS_HSCROLL_Y); content.right -= wxSystemSettings::GetMetric(wxSYS_VSCROLL_X); - // make sure that 'Render' can draw only in the allowed area: - dataViewCustomRendererPtr->GetDC()->SetClippingRegion(content.left,content.top,content.right-content.left+1,content.bottom-content.top+1); - (void) (dataViewCustomRendererPtr->Render(wxRect(static_cast(rectangle->left),static_cast(rectangle->top), - static_cast(1+rectangle->right-rectangle->left),static_cast(1+rectangle->bottom-rectangle->top)), - dataViewCustomRendererPtr->GetDC(),((state == kDataBrowserItemIsSelected) ? wxDATAVIEW_CELL_SELECTED : 0))); - dataViewCustomRendererPtr->GetDC()->DestroyClippingRegion(); // probably not necessary + wxDC *dc = dataViewCustomRendererPtr->GetDC(); + + wxRect cellrect( static_cast(rectangle->left), + static_cast(rectangle->top+2), + static_cast(1+rectangle->right-rectangle->left), + static_cast(rectangle->bottom-rectangle->top) ); + + bool is_active = IsControlActive( this->m_controlRef ); + if (state == kDataBrowserItemIsSelected) + { + + wxColour col( wxMacCreateCGColorFromHITheme( (is_active) ? + kThemeBrushAlternatePrimaryHighlightColor + : kThemeBrushSecondaryHighlightColor ) ); + + wxRect rect = cellrect; + Rect itemrect; + GetDataBrowserItemPartBounds( this->m_controlRef, itemID, propertyID, + kDataBrowserPropertyEnclosingPart, &itemrect ); + rect.x = itemrect.left; + rect.width = itemrect.right-itemrect.left+1; + + wxBrush selBrush( col ); + wxPen oldpen( dc->GetPen() ); + wxBrush oldbrush( dc->GetBrush() ); + dc->SetPen( *wxTRANSPARENT_PEN ); + dc->SetBrush( selBrush ); + dc->DrawRectangle(rect); + dc->SetBrush( oldbrush ); + dc->SetPen( oldpen ); + } + + wxDataViewModel *model = dataViewCtrlPtr->GetModel(); + if ((columnIndex == 0) || !model->IsContainer(dataitem) || model->HasContainerColumns(dataitem)) + { + // make sure that 'Render' can draw only in the allowed area: + dc->SetClippingRegion(content.left,content.top,content.right-content.left+1,content.bottom-content.top+1); + (void) (dataViewCustomRendererPtr->Render( cellrect, dc, + ((state == kDataBrowserItemIsSelected) ? wxDATAVIEW_CELL_SELECTED : 0))); + dc->DestroyClippingRegion(); // probably not necessary + } + + dataViewCustomRendererPtr->SetDC(NULL); } /* wxMacDataViewDataBrowserListViewControl::DataBrowserDrawItemProc(DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemState, Rect const*, SInt16, Boolean) */ Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserEditItemProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, CFStringRef theString, Rect* maxEditTextRect, Boolean* shrinkToFit) @@ -1082,3 +1128,4 @@ DataBrowserTrackingResult wxMacDataViewDataBrowserListViewControl::DataBrowserTr } /* wxMacDataViewDataBrowserListViewControl::DataBrowserTrackingProc(DataBrowserItemID, DataBrowserPropertyID, Rect const*, Point, EventModifiers) */ #endif // wxUSE_GENERICDATAVIEWCTRL +#endif // wxUSE_DATAVIEWCTRL