1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/osx/carbon/dataview.cpp
3 // Purpose: wxDataViewCtrl native carbon implementation
5 // Id: $Id: dataview.cpp 58317 2009-01-23
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
10 // For compilers that support precompilation, includes "wx.h".
11 #include "wx/wxprec.h"
13 #if (wxUSE_DATAVIEWCTRL == 1) && !defined(wxUSE_GENERICDATAVIEWCTRL)
17 #include "wx/toplevel.h"
19 #include "wx/settings.h"
23 #include "wx/osx/carbon/dataview.h"
24 #include "wx/osx/private.h"
25 #include "wx/osx/uma.h"
26 #include "wx/renderer.h"
30 // ============================================================================
31 // Variables used locally in dataview.cpp
32 // ============================================================================
33 static DataBrowserGetContextualMenuUPP gDataBrowserTableViewGetContextualMenuUPP
= NULL
;
34 static DataBrowserItemCompareUPP gDataBrowserTableViewItemCompareUPP
= NULL
;
35 static DataBrowserItemDataUPP gDataBrowserTableViewItemDataUPP
= NULL
;
36 static DataBrowserItemNotificationUPP gDataBrowserTableViewItemNotificationUPP
= NULL
;
38 static DataBrowserAcceptDragUPP gDataBrowserTableViewAcceptDragUPP
= NULL
;
39 static DataBrowserAddDragItemUPP gDataBrowserTableViewAddDragItemUPP
= NULL
;
40 static DataBrowserReceiveDragUPP gDataBrowserTableViewReceiveDragUPP
= NULL
;
42 static DataBrowserDrawItemUPP gDataBrowserTableViewDrawItemUPP
= NULL
;
43 static DataBrowserEditItemUPP gDataBrowserTableViewEditItemUPP
= NULL
;
44 static DataBrowserHitTestUPP gDataBrowserTableViewHitTestUPP
= NULL
;
45 static DataBrowserTrackingUPP gDataBrowserTableViewTrackingUPP
= NULL
;
47 // ============================================================================
48 // Functions used locally in dataview.cpp
49 // ============================================================================
50 static DataBrowserItemID
* CreateDataBrowserItemIDArray(size_t& noOfEntries
, wxDataViewItemArray
const& items
) // returns a newly allocated pointer to valid data browser item IDs
52 size_t const noOfItems
= items
.GetCount();
54 DataBrowserItemID
* itemIDs(new DataBrowserItemID
[noOfItems
]);
57 // convert all valid data view items to data browser items
59 for (size_t i
=0; i
<noOfItems
; ++i
)
62 itemIDs
[noOfEntries
] = reinterpret_cast<DataBrowserItemID
>(items
[i
].GetID());
69 static const EventTypeSpec eventList
[] =
71 { kEventClassControl
, kEventControlHit
},
72 { kEventClassControl
, kEventControlDraw
}
75 static pascal OSStatus
DataBrowserCtrlEventHandler(EventHandlerCallRef handler
, EventRef EventReference
, void* Data
)
77 wxDataViewCtrl
* DataViewCtrlPtr((wxDataViewCtrl
*) Data
); // the 'Data' variable always contains a pointer to the data view control that installed the handler
79 wxMacCarbonEvent
CarbonEvent(EventReference
) ;
82 switch (GetEventKind(EventReference
))
84 case kEventControlDraw
:
88 DataViewCtrlPtr
->MacSetDrawingContext(CarbonEvent
.GetParameter
<CGContextRef
>(kEventParamCGContextRef
,typeCGContextRef
));
89 status
= ::CallNextEventHandler(handler
,EventReference
);
90 DataViewCtrlPtr
->MacSetDrawingContext(NULL
);
93 case kEventControlHit
:
94 if (CarbonEvent
.GetParameter
<ControlPartCode
>(kEventParamControlPart
,typeControlPartCode
) == kControlButtonPart
) // we only care about the header
96 ControlRef controlReference
;
97 DataBrowserPropertyID columnPropertyID
;
98 DataBrowserSortOrder order
;
99 unsigned long columnIndex
;
100 wxDataViewColumn
* column
;
102 wxDataViewEvent
DataViewEvent(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK
,DataViewCtrlPtr
->GetId());
104 CarbonEvent
.GetParameter(kEventParamDirectObject
,&controlReference
);
105 // determine the column that triggered the event (this is the column that is responsible for sorting the data view):
106 status
= ::GetDataBrowserSortProperty(controlReference
,&columnPropertyID
);
107 wxCHECK(status
== noErr
,status
);
108 status
= ::GetDataBrowserTableViewColumnPosition(controlReference
,columnPropertyID
,&columnIndex
);
109 if (status
== errDataBrowserPropertyNotFound
) // user clicked into part of the header that does not have a property
110 return ::CallNextEventHandler(handler
,EventReference
);
111 wxCHECK(status
== noErr
,status
);
112 column
= DataViewCtrlPtr
->GetColumn(columnIndex
);
113 // set the column sort order:
114 status
= ::GetDataBrowserSortOrder(controlReference
,&order
);
115 wxCHECK(status
== noErr
,status
);
116 column
->SetSortOrderVariable(order
== kDataBrowserOrderIncreasing
);
117 // initialize wxWidget event handler:
118 DataViewEvent
.SetEventObject(DataViewCtrlPtr
);
119 DataViewEvent
.SetColumn(columnIndex
);
120 DataViewEvent
.SetDataViewColumn(column
);
121 // finally sent the equivalent wxWidget event:
122 DataViewCtrlPtr
->HandleWindowEvent(DataViewEvent
);
123 return ::CallNextEventHandler(handler
,EventReference
);
126 return eventNotHandledErr
;
128 return eventNotHandledErr
;
131 static bool InitializeColumnDescription(DataBrowserListViewColumnDesc
& columnDescription
, wxDataViewColumn
const* columnPtr
, wxCFStringRef
const& title
)
133 // set properties for the column:
134 columnDescription
.propertyDesc
.propertyID
= columnPtr
->GetNativeData()->GetPropertyID();
135 columnDescription
.propertyDesc
.propertyType
= columnPtr
->GetRenderer()->GetNativeData()->GetPropertyType();
136 columnDescription
.propertyDesc
.propertyFlags
= kDataBrowserListViewSelectionColumn
; // make the column selectable
137 if (columnPtr
->IsReorderable())
138 columnDescription
.propertyDesc
.propertyFlags
|= kDataBrowserListViewMovableColumn
;
139 if (columnPtr
->IsResizeable())
141 columnDescription
.headerBtnDesc
.minimumWidth
= 0;
142 columnDescription
.headerBtnDesc
.maximumWidth
= 30000; // 32767 is the theoretical maximum though but 30000 looks nicer
146 columnDescription
.headerBtnDesc
.minimumWidth
= columnPtr
->GetWidth();
147 columnDescription
.headerBtnDesc
.maximumWidth
= columnPtr
->GetWidth();
149 if (columnPtr
->IsSortable())
150 columnDescription
.propertyDesc
.propertyFlags
|= kDataBrowserListViewSortableColumn
;
151 if ((columnPtr
->GetRenderer()->GetMode() == wxDATAVIEW_CELL_EDITABLE
) ||
152 (columnPtr
->GetRenderer()->GetMode() == wxDATAVIEW_CELL_ACTIVATABLE
))
153 columnDescription
.propertyDesc
.propertyFlags
|= kDataBrowserPropertyIsEditable
;
154 if ((columnDescription
.propertyDesc
.propertyType
== kDataBrowserCustomType
) ||
155 (columnDescription
.propertyDesc
.propertyType
== kDataBrowserDateTimeType
) ||
156 (columnDescription
.propertyDesc
.propertyType
== kDataBrowserIconAndTextType
) ||
157 (columnDescription
.propertyDesc
.propertyType
== kDataBrowserTextType
))
158 columnDescription
.propertyDesc
.propertyFlags
|= kDataBrowserListViewTypeSelectColumn
; // enables generally the possibility to have user input for the mentioned types
159 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
160 columnDescription
.propertyDesc
.propertyFlags
|= kDataBrowserListViewNoGapForIconInHeaderButton
;
162 // set header's properties:
163 columnDescription
.headerBtnDesc
.version
= kDataBrowserListViewLatestHeaderDesc
;
164 columnDescription
.headerBtnDesc
.titleOffset
= 0;
165 columnDescription
.headerBtnDesc
.titleString
= ::CFStringCreateCopy(kCFAllocatorDefault
,title
);
166 columnDescription
.headerBtnDesc
.initialOrder
= kDataBrowserOrderIncreasing
; // choose one of the orders as "undefined" is not supported anyway (s. ControlDefs.h in the HIToolbox framework)
167 columnDescription
.headerBtnDesc
.btnFontStyle
.flags
= kControlUseFontMask
| kControlUseJustMask
;
168 switch (columnPtr
->GetAlignment())
171 case wxALIGN_CENTER_HORIZONTAL
:
172 columnDescription
.headerBtnDesc
.btnFontStyle
.just
= teCenter
;
175 columnDescription
.headerBtnDesc
.btnFontStyle
.just
= teFlushLeft
;
178 columnDescription
.headerBtnDesc
.btnFontStyle
.just
= teFlushRight
;
181 columnDescription
.headerBtnDesc
.btnFontStyle
.just
= teFlushDefault
;
183 columnDescription
.headerBtnDesc
.btnFontStyle
.font
= kControlFontViewSystemFont
;
184 columnDescription
.headerBtnDesc
.btnFontStyle
.style
= normal
;
185 if (columnPtr
->GetBitmap().IsOk())
187 columnDescription
.headerBtnDesc
.btnContentInfo
.contentType
= kControlContentIconRef
;
188 columnDescription
.headerBtnDesc
.btnContentInfo
.u
.iconRef
= columnPtr
->GetBitmap().GetIconRef();
192 // not text only as we otherwise could not add a bitmap later
193 // columnDescription.headerBtnDesc.btnContentInfo.contentType = kControlContentTextOnly;
194 columnDescription
.headerBtnDesc
.btnContentInfo
.contentType
= kControlContentIconRef
;
195 columnDescription
.headerBtnDesc
.btnContentInfo
.u
.iconRef
= NULL
;
202 // ============================================================================
203 // Type definitions of locally used function pointers
204 // ============================================================================
205 DEFINE_ONE_SHOT_HANDLER_GETTER(DataBrowserCtrlEventHandler
)
207 // ============================================================================
208 // Helper functions for dataview implementation on OSX
209 // ============================================================================
210 wxWidgetImplType
* CreateDataView(wxWindowMac
* wxpeer
, wxWindowMac
* WXUNUSED(parent
), wxWindowID
WXUNUSED(id
), wxPoint
const& pos
, wxSize
const& size
,
211 long style
, long WXUNUSED(extraStyle
))
213 return new wxMacDataViewDataBrowserListViewControl(wxpeer
,pos
,size
,style
);
216 // ============================================================================
217 // wxMacDataBrowserTableViewControl
218 // ============================================================================
219 pascal Boolean
wxMacDataBrowserTableViewControl::DataBrowserCompareProc(ControlRef browser
, DataBrowserItemID itemOneID
, DataBrowserItemID itemTwoID
, DataBrowserPropertyID sortProperty
)
221 wxMacDataBrowserTableViewControl
* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
224 if (ControlPtr
!= NULL
)
225 return ControlPtr
->DataBrowserCompareProc(itemOneID
,itemTwoID
,sortProperty
);
230 pascal void wxMacDataBrowserTableViewControl::DataBrowserGetContextualMenuProc(ControlRef browser
, MenuRef
* menu
, UInt32
* helpType
, CFStringRef
* helpItemString
, AEDesc
* selection
)
232 wxMacDataBrowserTableViewControl
* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
235 if (ControlPtr
!= NULL
)
236 ControlPtr
->DataBrowserGetContextualMenuProc(menu
,helpType
,helpItemString
,selection
);
239 pascal OSStatus
wxMacDataBrowserTableViewControl::DataBrowserGetSetItemDataProc(ControlRef browser
, DataBrowserItemID itemID
, DataBrowserPropertyID propertyID
, DataBrowserItemDataRef itemData
, Boolean getValue
)
241 wxMacDataBrowserTableViewControl
* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
244 if (ControlPtr
!= NULL
)
245 return ControlPtr
->DataBrowserGetSetItemDataProc(itemID
,propertyID
,itemData
,getValue
);
247 return errDataBrowserPropertyNotSupported
;
250 pascal void wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc(ControlRef browser
, DataBrowserItemID itemID
, DataBrowserItemNotification message
, DataBrowserItemDataRef itemData
)
252 wxMacDataBrowserTableViewControl
* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
255 if (ControlPtr
!= NULL
)
256 ControlPtr
->DataBrowserItemNotificationProc(itemID
,message
,itemData
);
259 pascal void wxMacDataBrowserTableViewControl::DataBrowserDrawItemProc(ControlRef browser
, DataBrowserItemID itemID
, DataBrowserPropertyID propertyID
, DataBrowserItemState state
, Rect
const* rectangle
, SInt16 bitDepth
, Boolean colorDevice
)
261 wxMacDataBrowserTableViewControl
* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
264 if (ControlPtr
!= NULL
)
265 ControlPtr
->DataBrowserDrawItemProc(itemID
,propertyID
,state
,rectangle
,bitDepth
,colorDevice
);
268 pascal Boolean
wxMacDataBrowserTableViewControl::DataBrowserEditItemProc(ControlRef browser
, DataBrowserItemID itemID
, DataBrowserPropertyID propertyID
, CFStringRef theString
, Rect
* maxEditTextRect
, Boolean
* shrinkToFit
)
270 wxMacDataBrowserTableViewControl
* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
273 return ((ControlPtr
!= NULL
) && ControlPtr
->DataBrowserEditItemProc(itemID
,propertyID
,theString
,maxEditTextRect
,shrinkToFit
));
276 pascal Boolean
wxMacDataBrowserTableViewControl::DataBrowserHitTestProc(ControlRef browser
, DataBrowserItemID itemID
, DataBrowserPropertyID propertyID
, Rect
const* theRect
, Rect
const* mouseRect
)
278 wxMacDataBrowserTableViewControl
* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
281 return ((ControlPtr
!= NULL
) && ControlPtr
->DataBrowserHitTestProc(itemID
,propertyID
,theRect
,mouseRect
));
284 pascal DataBrowserTrackingResult
wxMacDataBrowserTableViewControl::DataBrowserTrackingProc(ControlRef browser
, DataBrowserItemID itemID
, DataBrowserPropertyID propertyID
, Rect
const* theRect
, Point startPt
, EventModifiers modifiers
)
286 wxMacDataBrowserTableViewControl
* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
289 if (ControlPtr
!= NULL
)
290 return ControlPtr
->DataBrowserTrackingProc(itemID
,propertyID
,theRect
,startPt
,modifiers
);
292 return kDataBrowserNothingHit
;
295 pascal Boolean
wxMacDataBrowserTableViewControl::DataBrowserAcceptDragProc(ControlRef browser
, DragReference dragRef
, DataBrowserItemID itemID
)
297 wxMacDataBrowserTableViewControl
* controlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
300 return ((controlPtr
!= NULL
) && controlPtr
->DataBrowserAcceptDragProc(dragRef
,itemID
));
303 pascal Boolean
wxMacDataBrowserTableViewControl::DataBrowserAddDragItemProc(ControlRef browser
, DragReference dragRef
, DataBrowserItemID itemID
, ItemReference
* itemRef
)
305 wxMacDataBrowserTableViewControl
* controlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
308 return ((controlPtr
!= NULL
) && controlPtr
->DataBrowserAddDragItemProc(dragRef
,itemID
,itemRef
));
311 pascal Boolean
wxMacDataBrowserTableViewControl::DataBrowserReceiveDragProc(ControlRef browser
, DragReference dragRef
, DataBrowserItemID itemID
)
313 wxMacDataBrowserTableViewControl
* controlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
316 return ((controlPtr
!= NULL
) && controlPtr
->DataBrowserReceiveDragProc(dragRef
,itemID
));
319 wxMacDataBrowserTableViewControl::wxMacDataBrowserTableViewControl(wxWindow
* peer
, wxPoint
const& pos
, wxSize
const& size
, long style
)
322 Rect bounds
= wxMacGetBoundsForControl(peer
,pos
,size
);
323 OSStatus err
= ::CreateDataBrowserControl(MAC_WXHWND(peer
->MacGetTopLevelWindowRef()),&bounds
,kDataBrowserListView
,&(m_controlRef
));
326 SetReferenceInNativeControl();
329 ::InstallControlEventHandler(m_controlRef
, GetDataBrowserCtrlEventHandlerUPP(), GetEventTypeCount(eventList
), eventList
, peer
, (EventHandlerRef
*)&m_macDataViewCtrlEventHandler
);
331 // setup standard callbacks:
332 if (gDataBrowserTableViewGetContextualMenuUPP
== NULL
) gDataBrowserTableViewGetContextualMenuUPP
= NewDataBrowserGetContextualMenuUPP(wxMacDataBrowserTableViewControl::DataBrowserGetContextualMenuProc
);
333 if (gDataBrowserTableViewItemCompareUPP
== NULL
) gDataBrowserTableViewItemCompareUPP
= NewDataBrowserItemCompareUPP (wxMacDataBrowserTableViewControl::DataBrowserCompareProc
);
334 if (gDataBrowserTableViewItemDataUPP
== NULL
) gDataBrowserTableViewItemDataUPP
= NewDataBrowserItemDataUPP (wxMacDataBrowserTableViewControl::DataBrowserGetSetItemDataProc
);
335 if (gDataBrowserTableViewItemNotificationUPP
== NULL
)
337 gDataBrowserTableViewItemNotificationUPP
=
338 #if TARGET_API_MAC_OSX
339 (DataBrowserItemNotificationUPP
) NewDataBrowserItemNotificationWithItemUPP(wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc
);
341 NewDataBrowserItemNotificationUPP(wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc
);
344 // setup drag and drop callbacks:
345 if (gDataBrowserTableViewAcceptDragUPP
== NULL
) gDataBrowserTableViewAcceptDragUPP
= NewDataBrowserAcceptDragUPP (wxMacDataBrowserTableViewControl::DataBrowserAcceptDragProc
);
346 if (gDataBrowserTableViewAddDragItemUPP
== NULL
) gDataBrowserTableViewAddDragItemUPP
= NewDataBrowserAddDragItemUPP(wxMacDataBrowserTableViewControl::DataBrowserAddDragItemProc
);
347 if (gDataBrowserTableViewReceiveDragUPP
== NULL
) gDataBrowserTableViewReceiveDragUPP
= NewDataBrowserReceiveDragUPP(wxMacDataBrowserTableViewControl::DataBrowserReceiveDragProc
);
349 DataBrowserCallbacks callbacks
; // variable definition
351 InitializeDataBrowserCallbacks(&callbacks
,kDataBrowserLatestCallbacks
);
352 callbacks
.u
.v1
.getContextualMenuCallback
= gDataBrowserTableViewGetContextualMenuUPP
;
353 callbacks
.u
.v1
.itemDataCallback
= gDataBrowserTableViewItemDataUPP
;
354 callbacks
.u
.v1
.itemCompareCallback
= gDataBrowserTableViewItemCompareUPP
;
355 callbacks
.u
.v1
.itemNotificationCallback
= gDataBrowserTableViewItemNotificationUPP
;
356 callbacks
.u
.v1
.acceptDragCallback
= gDataBrowserTableViewAcceptDragUPP
;
357 callbacks
.u
.v1
.addDragItemCallback
= gDataBrowserTableViewAddDragItemUPP
;
358 callbacks
.u
.v1
.receiveDragCallback
= gDataBrowserTableViewReceiveDragUPP
;
359 SetCallbacks(&callbacks
);
361 // setup callbacks for customized items:
362 if (gDataBrowserTableViewDrawItemUPP
== NULL
) gDataBrowserTableViewDrawItemUPP
= NewDataBrowserDrawItemUPP(wxMacDataBrowserTableViewControl::DataBrowserDrawItemProc
);
363 if (gDataBrowserTableViewEditItemUPP
== NULL
) gDataBrowserTableViewEditItemUPP
= NewDataBrowserEditItemUPP(wxMacDataBrowserTableViewControl::DataBrowserEditItemProc
);
364 if (gDataBrowserTableViewHitTestUPP
== NULL
) gDataBrowserTableViewHitTestUPP
= NewDataBrowserHitTestUPP (wxMacDataBrowserTableViewControl::DataBrowserHitTestProc
);
365 if (gDataBrowserTableViewTrackingUPP
== NULL
) gDataBrowserTableViewTrackingUPP
= NewDataBrowserTrackingUPP(wxMacDataBrowserTableViewControl::DataBrowserTrackingProc
);
367 DataBrowserCustomCallbacks customCallbacks
; // variable definition
369 InitializeDataBrowserCustomCallbacks(&customCallbacks
,kDataBrowserLatestCallbacks
);
370 customCallbacks
.u
.v1
.drawItemCallback
= gDataBrowserTableViewDrawItemUPP
;
371 customCallbacks
.u
.v1
.editTextCallback
= gDataBrowserTableViewEditItemUPP
;
372 customCallbacks
.u
.v1
.hitTestCallback
= gDataBrowserTableViewHitTestUPP
;
373 customCallbacks
.u
.v1
.trackingCallback
= gDataBrowserTableViewTrackingUPP
;
374 SetCustomCallbacks(&customCallbacks
);
377 EnableCellSizeModification( ((style
& wxDV_VARIABLE_LINE_HEIGHT
) != 0), true );
379 DataBrowserSelectionFlags flags
; // variable definition
381 if (GetSelectionFlags(&flags
) == noErr
) // get default settings
383 if ((style
& wxDV_MULTIPLE
) != 0)
384 flags
&= ~kDataBrowserSelectOnlyOne
;
386 flags
|= kDataBrowserSelectOnlyOne
;
387 (void) SetSelectionFlags(flags
);
390 OptionBits attributes
; // variable definition
392 if (GetAttributes(&attributes
) == noErr
) // get default settings
394 if ((style
& wxDV_VERT_RULES
) != 0)
395 attributes
|= kDataBrowserAttributeListViewDrawColumnDividers
;
397 attributes
&= ~kDataBrowserAttributeListViewDrawColumnDividers
;
398 if ((style
& wxDV_ROW_LINES
) != 0)
399 attributes
|= kDataBrowserAttributeListViewAlternatingRowColors
;
401 attributes
&= ~kDataBrowserAttributeListViewAlternatingRowColors
;
402 (void) SetAttributes(attributes
);
405 if ((style
& wxDV_NO_HEADER
) != 0)
406 SetHeaderButtonHeight(0);
409 wxMacDataBrowserTableViewControl::~wxMacDataBrowserTableViewControl()
411 ::RemoveEventHandler((EventHandlerRef
) m_macDataViewCtrlEventHandler
);
417 OSStatus
wxMacDataBrowserTableViewControl::SetCallbacks(DataBrowserCallbacks
const* callbacks
)
419 return ::SetDataBrowserCallbacks(m_controlRef
,callbacks
);
422 OSStatus
wxMacDataBrowserTableViewControl::SetCustomCallbacks(DataBrowserCustomCallbacks
const* customCallbacks
)
424 return ::SetDataBrowserCustomCallbacks(m_controlRef
,customCallbacks
);
430 OSStatus
wxMacDataBrowserTableViewControl::EnableAutomaticDragTracking(bool enable
)
432 return ::SetAutomaticControlDragTrackingEnabledForWindow(::GetControlOwner(m_controlRef
),enable
);
438 OSStatus
wxMacDataBrowserTableViewControl::GetHeaderDesc(DataBrowserPropertyID propertyID
, DataBrowserListViewHeaderDesc
* desc
) const
440 desc
->version
= kDataBrowserListViewLatestHeaderDesc
; // if this statement is missing the next call will fail (NOT DOCUMENTED!!)
441 return ::GetDataBrowserListViewHeaderDesc(m_controlRef
,propertyID
,desc
);
444 OSStatus
wxMacDataBrowserTableViewControl::SetHeaderDesc(DataBrowserPropertyID propertyID
, DataBrowserListViewHeaderDesc
* desc
)
446 return ::SetDataBrowserListViewHeaderDesc(m_controlRef
,propertyID
,desc
);
452 OSStatus
wxMacDataBrowserTableViewControl::AutoSizeColumns()
454 return AutoSizeDataBrowserListViewColumns(m_controlRef
);
457 OSStatus
wxMacDataBrowserTableViewControl::EnableCellSizeModification(bool enableHeight
, bool enableWidth
)
459 return ::SetDataBrowserTableViewGeometry(GetControlRef(),enableWidth
,enableHeight
);
462 OSStatus
wxMacDataBrowserTableViewControl::GetAttributes(OptionBits
* attributes
)
464 return ::DataBrowserGetAttributes(GetControlRef(),attributes
);
467 OSStatus
wxMacDataBrowserTableViewControl::GetColumnWidth(DataBrowserPropertyID propertyID
, UInt16
* width
) const
469 return ::GetDataBrowserTableViewNamedColumnWidth(m_controlRef
,propertyID
,width
);
472 OSStatus
wxMacDataBrowserTableViewControl::GetDefaultColumnWidth( UInt16
*width
) const
474 return GetDataBrowserTableViewColumnWidth(m_controlRef
, width
);
477 OSStatus
wxMacDataBrowserTableViewControl::GetDefaultRowHeight(UInt16
* height
) const
479 return ::GetDataBrowserTableViewRowHeight(m_controlRef
,height
);
482 OSStatus
wxMacDataBrowserTableViewControl::GetHeaderButtonHeight(UInt16
*height
)
484 return ::GetDataBrowserListViewHeaderBtnHeight(m_controlRef
,height
);
487 OSStatus
wxMacDataBrowserTableViewControl::GetPartBounds(DataBrowserItemID item
, DataBrowserPropertyID propertyID
, DataBrowserPropertyPart part
, Rect
* bounds
)
489 return ::GetDataBrowserItemPartBounds(m_controlRef
,item
,propertyID
,part
,bounds
);
492 OSStatus
wxMacDataBrowserTableViewControl::GetRowHeight(DataBrowserItemID item
, UInt16
* height
) const
494 return ::GetDataBrowserTableViewItemRowHeight(m_controlRef
,item
,height
);
497 OSStatus
wxMacDataBrowserTableViewControl::GetScrollPosition( UInt32
*top
, UInt32
*left
) const
499 return GetDataBrowserScrollPosition(m_controlRef
, top
, left
);
502 OSStatus
wxMacDataBrowserTableViewControl::SetAttributes(OptionBits attributes
)
504 return ::DataBrowserChangeAttributes(GetControlRef(),attributes
,~attributes
);
507 OSStatus
wxMacDataBrowserTableViewControl::SetColumnWidth(DataBrowserPropertyID propertyID
, UInt16 width
)
509 return ::SetDataBrowserTableViewNamedColumnWidth(m_controlRef
,propertyID
,width
);
512 OSStatus
wxMacDataBrowserTableViewControl::SetDefaultColumnWidth(UInt16 width
)
514 return ::SetDataBrowserTableViewColumnWidth(m_controlRef
,width
);
517 OSStatus
wxMacDataBrowserTableViewControl::SetDefaultRowHeight(UInt16 height
)
519 return ::SetDataBrowserTableViewRowHeight(m_controlRef
,height
);
522 OSStatus
wxMacDataBrowserTableViewControl::SetHasScrollBars(bool horiz
, bool vert
)
524 return ::SetDataBrowserHasScrollBars(m_controlRef
,horiz
,vert
);
527 OSStatus
wxMacDataBrowserTableViewControl::SetHeaderButtonHeight(UInt16 height
)
529 return ::SetDataBrowserListViewHeaderBtnHeight(m_controlRef
,height
);
532 OSStatus
wxMacDataBrowserTableViewControl::SetHiliteStyle(DataBrowserTableViewHiliteStyle hiliteStyle
)
534 return ::SetDataBrowserTableViewHiliteStyle(m_controlRef
,hiliteStyle
);
537 OSStatus
wxMacDataBrowserTableViewControl::SetIndent(float Indent
)
539 return ::DataBrowserSetMetric(m_controlRef
,kDataBrowserMetricDisclosureColumnPerDepthGap
,true,Indent
);
542 OSStatus
wxMacDataBrowserTableViewControl::SetItemRowHeight(DataBrowserItemID item
, UInt16 height
)
544 return ::SetDataBrowserTableViewItemRowHeight(m_controlRef
,item
,height
);
547 OSStatus
wxMacDataBrowserTableViewControl::SetScrollPosition(UInt32 top
, UInt32 left
)
549 return ::SetDataBrowserScrollPosition(m_controlRef
,top
,left
);
555 OSStatus
wxMacDataBrowserTableViewControl::GetColumnCount(UInt32
* numColumns
) const
557 return ::GetDataBrowserTableViewColumnCount(m_controlRef
,numColumns
);
560 OSStatus
wxMacDataBrowserTableViewControl::GetColumnIndex(DataBrowserPropertyID propertyID
, DataBrowserTableViewColumnIndex
* index
) const
562 return ::GetDataBrowserTableViewColumnPosition(m_controlRef
,propertyID
,index
);
565 OSStatus
wxMacDataBrowserTableViewControl::GetFreePropertyID(DataBrowserPropertyID
* propertyID
) const
567 for (*propertyID
=kMinPropertyID
; *propertyID
<std::numeric_limits
<DataBrowserPropertyID
>::max(); ++(*propertyID
))
568 if (IsUsedPropertyID(*propertyID
) == errDataBrowserPropertyNotFound
)
570 return errDataBrowserPropertyNotSupported
;
573 OSStatus
wxMacDataBrowserTableViewControl::GetPropertyFlags(DataBrowserPropertyID propertyID
, DataBrowserPropertyFlags
*flags
) const
575 return ::GetDataBrowserPropertyFlags(m_controlRef
,propertyID
,flags
);
578 OSStatus
wxMacDataBrowserTableViewControl::GetPropertyID(DataBrowserItemDataRef itemData
, DataBrowserPropertyID
* propertyID
) const
580 return ::GetDataBrowserItemDataProperty(itemData
,propertyID
);
583 OSStatus
wxMacDataBrowserTableViewControl::GetPropertyID(DataBrowserTableViewColumnIndex index
, DataBrowserTableViewColumnID
* propertyID
) const
585 return ::GetDataBrowserTableViewColumnProperty(m_controlRef
,index
,propertyID
);
588 OSStatus
wxMacDataBrowserTableViewControl::IsUsedPropertyID(DataBrowserPropertyID propertyID
) const
590 // as the Mac interface does not provide a function that checks if the property id is in use or not a function is chosen that should not
591 // lead to a large overhead for the call but returns an error code if the property id does not exist, here we use the function that returns
592 // the column position for the property id:
593 DataBrowserTableViewColumnIndex index
;
595 return ::GetDataBrowserTableViewColumnPosition(m_controlRef
,propertyID
,&index
);
598 OSStatus
wxMacDataBrowserTableViewControl::RemoveColumnByProperty(DataBrowserTableViewColumnID propertyID
)
600 return ::RemoveDataBrowserTableViewColumn(m_controlRef
,propertyID
);
603 OSStatus
wxMacDataBrowserTableViewControl::RemoveColumnByIndex(DataBrowserTableViewColumnIndex index
)
605 DataBrowserTableViewColumnID propertyID
;
608 GetPropertyID(index
,&propertyID
);
609 return ::RemoveDataBrowserTableViewColumn(m_controlRef
,propertyID
);
612 OSStatus
wxMacDataBrowserTableViewControl::SetColumnIndex(DataBrowserPropertyID propertyID
, DataBrowserTableViewColumnIndex index
)
614 return ::SetDataBrowserTableViewColumnPosition(m_controlRef
,propertyID
,index
);
617 OSStatus
wxMacDataBrowserTableViewControl::SetDisclosureColumn(DataBrowserPropertyID propertyID
, Boolean expandableRows
)
619 return ::SetDataBrowserListViewDisclosureColumn(m_controlRef
,propertyID
,expandableRows
);
622 OSStatus
wxMacDataBrowserTableViewControl::SetPropertyFlags(DataBrowserPropertyID propertyID
, DataBrowserPropertyFlags flags
)
624 return ::SetDataBrowserPropertyFlags(m_controlRef
,propertyID
,flags
);
630 OSStatus
wxMacDataBrowserTableViewControl::AddItems(DataBrowserItemID container
, UInt32 numItems
, DataBrowserItemID
const* items
, DataBrowserPropertyID preSortProperty
)
632 return ::AddDataBrowserItems(m_controlRef
,container
,numItems
,items
,preSortProperty
);
635 OSStatus
wxMacDataBrowserTableViewControl::GetFreeItemID(DataBrowserItemID
* id
) const
642 status
= GetItemCount(&noOfItems
);
643 wxCHECK_MSG(status
== noErr
,status
,_("Could not retrieve number of items"));
651 // as there might be a lot of items in the data browser and mostly the data is added item by item the largest used ID number is roughly in the order of magnitude
652 // as the number of items; therefore, start from the number of items to look for a new ID:
653 for (*id
=noOfItems
; *id
<std::numeric_limits
<DataBrowserItemID
>::max(); ++(*id
))
654 if (IsUsedItemID(*id
) == errDataBrowserItemNotFound
)
656 // as the first approach was not successful, try from the beginning:
657 for (*id
=0; *id
<noOfItems
; ++(*id
))
658 if (IsUsedItemID(*id
) == errDataBrowserItemNotFound
)
660 // sorry, data browser is full:
661 return errDataBrowserItemNotAdded
;
665 OSStatus
wxMacDataBrowserTableViewControl::GetItemCount(DataBrowserItemID container
, Boolean recurse
, DataBrowserItemState state
, ItemCount
* numItems
) const
667 return GetDataBrowserItemCount(m_controlRef
,container
,recurse
,state
,numItems
);
670 OSStatus
wxMacDataBrowserTableViewControl::GetItemID( DataBrowserTableViewRowIndex row
, DataBrowserItemID
* item
) const
672 return GetDataBrowserTableViewItemID(m_controlRef
,row
,item
);
675 OSStatus
wxMacDataBrowserTableViewControl::GetItems(DataBrowserItemID container
, Boolean recurse
, DataBrowserItemState state
, Handle items
) const
677 return GetDataBrowserItems(m_controlRef
,container
,recurse
,state
,items
);
680 OSStatus
wxMacDataBrowserTableViewControl::GetItemRow(DataBrowserItemID item
, DataBrowserTableViewRowIndex
* row
) const
682 return GetDataBrowserTableViewItemRow(m_controlRef
,item
,row
);
685 OSStatus
wxMacDataBrowserTableViewControl::GetItemState(DataBrowserItemID item
, DataBrowserItemState
* state
) const
687 return ::GetDataBrowserItemState(m_controlRef
,item
,state
);
690 OSStatus
wxMacDataBrowserTableViewControl::IsUsedItemID(DataBrowserItemID itemID
) const
692 // as the Mac interface does not provide a function that checks if the property id is in use or not a function is chosen that should not
693 // lead to a large overhead for the call but returns an error code if the property id does not exist, here we use the function that returns
694 // the column position for the property id:
695 DataBrowserTableViewColumnIndex index
;
697 return ::GetDataBrowserTableViewItemRow(m_controlRef
,itemID
,&index
);
700 OSStatus
wxMacDataBrowserTableViewControl::RemoveItems(DataBrowserItemID container
, UInt32 numItems
, DataBrowserItemID
const* items
, DataBrowserPropertyID preSortProperty
)
702 return ::RemoveDataBrowserItems(m_controlRef
,container
,numItems
,items
,preSortProperty
);
705 OSStatus
wxMacDataBrowserTableViewControl::RevealItem(DataBrowserItemID item
, DataBrowserPropertyID propertyID
, DataBrowserRevealOptions options
) const
707 return ::RevealDataBrowserItem(m_controlRef
,item
,propertyID
,options
);
710 OSStatus
wxMacDataBrowserTableViewControl::UpdateItems(DataBrowserItemID container
, UInt32 numItems
, DataBrowserItemID
const* items
, DataBrowserPropertyID preSortProperty
,
711 DataBrowserPropertyID propertyID
) const
713 return UpdateDataBrowserItems(m_controlRef
,container
,numItems
,items
,preSortProperty
,propertyID
);
719 size_t wxMacDataBrowserTableViewControl::GetSelectedItemIDs(wxArrayDataBrowserItemID
& itemIDs
) const
721 DataBrowserItemID
* itemIDPtr
;
722 Handle
handle(::NewHandle(0));
727 wxCHECK_MSG(GetItems(kDataBrowserNoItem
,true,kDataBrowserItemIsSelected
,handle
) == noErr
,0,_("Could not get selected items."));
728 noOfItems
= static_cast<size_t>(::GetHandleSize(handle
)/sizeof(DataBrowserItemID
));
730 itemIDs
.Alloc(noOfItems
);
732 itemIDPtr
= (DataBrowserItemID
*) (*handle
);
733 for (size_t i
=0; i
<noOfItems
; ++i
)
735 itemIDs
.Add(*itemIDPtr
);
739 DisposeHandle(handle
);
743 OSStatus
wxMacDataBrowserTableViewControl::GetSelectionAnchor(DataBrowserItemID
* first
, DataBrowserItemID
* last
) const
745 return ::GetDataBrowserSelectionAnchor(m_controlRef
,first
,last
);
748 OSStatus
wxMacDataBrowserTableViewControl::GetSelectionFlags(DataBrowserSelectionFlags
* flags
) const
750 return ::GetDataBrowserSelectionFlags(m_controlRef
,flags
);
753 bool wxMacDataBrowserTableViewControl::IsItemSelected(DataBrowserItemID item
) const
755 return ::IsDataBrowserItemSelected(m_controlRef
,item
);
758 OSStatus
wxMacDataBrowserTableViewControl::SetSelectionFlags(DataBrowserSelectionFlags flags
)
760 return ::SetDataBrowserSelectionFlags(m_controlRef
,flags
);
763 OSStatus
wxMacDataBrowserTableViewControl::SetSelectedItems(UInt32 numItems
, DataBrowserItemID
const* items
, DataBrowserSetOption operation
)
765 return ::SetDataBrowserSelectedItems(m_controlRef
, numItems
, items
, operation
);
768 OSStatus
wxMacDataBrowserTableViewControl::GetSortOrder(DataBrowserSortOrder
* order
) const
770 return ::GetDataBrowserSortOrder(m_controlRef
,order
);
773 OSStatus
wxMacDataBrowserTableViewControl::GetSortProperty(DataBrowserPropertyID
* propertyID
) const
775 return ::GetDataBrowserSortProperty(m_controlRef
,propertyID
);
778 OSStatus
wxMacDataBrowserTableViewControl::Resort(DataBrowserItemID container
, Boolean sortChildren
)
780 return ::SortDataBrowserContainer(m_controlRef
,container
,sortChildren
);
783 OSStatus
wxMacDataBrowserTableViewControl::SetSortOrder(DataBrowserSortOrder order
)
785 return ::SetDataBrowserSortOrder(m_controlRef
,order
);
788 OSStatus
wxMacDataBrowserTableViewControl::SetSortProperty(DataBrowserPropertyID propertyID
)
790 return ::SetDataBrowserSortProperty(m_controlRef
,propertyID
);
794 // container handling
796 OSStatus
wxMacDataBrowserTableViewControl::CloseContainer(DataBrowserItemID containerID
)
798 return ::CloseDataBrowserContainer(m_controlRef
,containerID
);
801 OSStatus
wxMacDataBrowserTableViewControl::OpenContainer(DataBrowserItemID containerID
)
803 return ::OpenDataBrowserContainer(m_controlRef
,containerID
);
806 IMPLEMENT_ABSTRACT_CLASS(wxMacDataBrowserTableViewControl
,wxMacControl
)
808 // ============================================================================
809 // wxMacDataBrowserListViewControl
810 // ============================================================================
815 OSStatus
wxMacDataBrowserListViewControl::AddColumn(DataBrowserListViewColumnDesc
*columnDesc
, DataBrowserTableViewColumnIndex position
)
817 return AddDataBrowserListViewColumn(m_controlRef
,columnDesc
,position
);
820 // ============================================================================
821 // wxMacDataViewDataBrowserListViewControl
822 // ============================================================================
825 // constructors / destructor
827 wxMacDataViewDataBrowserListViewControl::wxMacDataViewDataBrowserListViewControl(wxWindow
* peer
, wxPoint
const& pos
, wxSize
const& size
, long style
)
828 :wxMacDataBrowserListViewControl(peer
,pos
,size
,style
)
830 if ((style
& wxBORDER_NONE
) != 0)
831 SetData(kControlNoPart
,kControlDataBrowserIncludesFrameAndFocusTag
,(Boolean
) false);
832 (void) EnableAutomaticDragTracking();
833 (void) SetHiliteStyle(kDataBrowserTableViewFillHilite
);
837 // column related methods (inherited from wxDataViewWidgetImpl)
839 bool wxMacDataViewDataBrowserListViewControl::ClearColumns()
844 wxCHECK_MSG(GetColumnCount(&noOfColumns
) == noErr
,false,_("Could not determine number of columns."));
845 for (UInt32 i
=0; i
<noOfColumns
; ++i
)
846 wxCHECK_MSG(RemoveColumnByIndex(0) == noErr
,false,_("Could not remove column."));
850 bool wxMacDataViewDataBrowserListViewControl::DeleteColumn(wxDataViewColumn
* columnPtr
)
852 return (RemoveColumnByProperty(columnPtr
->GetNativeData()->GetPropertyID()) == noErr
);
855 void wxMacDataViewDataBrowserListViewControl::DoSetExpanderColumn(wxDataViewColumn
const* columnPtr
)
857 SetDisclosureColumn(columnPtr
->GetNativeData()->GetPropertyID(),false); // second parameter explicitly passed to ensure that arrow is centered
860 wxDataViewColumn
* wxMacDataViewDataBrowserListViewControl::GetColumn(unsigned int pos
) const
862 DataBrowserPropertyID propertyID
;
865 if (GetPropertyID(pos
,&propertyID
) == noErr
)
866 return GetColumnPtr(propertyID
);
871 int wxMacDataViewDataBrowserListViewControl::GetColumnPosition(wxDataViewColumn
const* columnPtr
) const
873 if (columnPtr
!= NULL
)
875 DataBrowserTableViewColumnIndex Position
;
877 wxCHECK_MSG(GetColumnIndex(columnPtr
->GetNativeData()->GetPropertyID(),&Position
) == noErr
,wxNOT_FOUND
,_("Could not determine column's position"));
878 return static_cast<int>(Position
);
884 bool wxMacDataViewDataBrowserListViewControl::InsertColumn(unsigned int pos
, wxDataViewColumn
* columnPtr
)
886 DataBrowserListViewColumnDesc columnDescription
;
888 DataBrowserPropertyID newPropertyID
;
892 wxCFStringRef
title(columnPtr
->GetTitle(),m_font
.IsOk() ? dynamic_cast<wxDataViewCtrl
*>(GetWXPeer())->GetFont().GetEncoding() : wxLocale::GetSystemEncoding());
895 // try to get new ID for the column:
896 wxCHECK_MSG(GetFreePropertyID(&newPropertyID
) == noErr
,false,_("Cannot create new column's ID. Probably max. number of columns reached."));
898 columnPtr
->GetNativeData()->SetPropertyID(newPropertyID
);
899 // create a column description, add column to the native control and do some final layout adjustments:
900 wxCHECK_MSG(::InitializeColumnDescription(columnDescription
,columnPtr
,title
), false,_("Column description could not be initialized."));
901 wxCHECK_MSG(AddColumn(&columnDescription
,pos
) == noErr
, false,_("Column could not be added."));
902 wxCHECK_MSG(SetColumnWidth(newPropertyID
,columnPtr
->GetWidth()) == noErr
,false,_("Column width could not be set."));
903 wxCHECK_MSG(GetColumnCount(&noOfColumns
) == noErr
, false,_("Number of columns could not be determined."));
904 if (noOfColumns
== 1)
906 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(GetWXPeer()));
908 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
,false,_("wxWidget's control not initialized."));
909 dataViewCtrlPtr
->AddChildren(wxDataViewItem());
913 return Update(columnPtr
);
917 // item related methods (inherited from wxDataViewWidgetImpl)
919 bool wxMacDataViewDataBrowserListViewControl::Add(wxDataViewItem
const& parent
, wxDataViewItem
const& item
)
921 DataBrowserItemID
itemID(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
924 return (( parent
.IsOk() && AddItem(reinterpret_cast<DataBrowserItemID
>(parent
.GetID()),&itemID
) == noErr
) ||
925 (!(parent
.IsOk()) && AddItem(kDataBrowserNoItem
,&itemID
) == noErr
));
928 bool wxMacDataViewDataBrowserListViewControl::Add(wxDataViewItem
const& parent
, wxDataViewItemArray
const& items
)
932 DataBrowserItemID
* itemIDs
;
937 // convert all valid data view items to data browser items:
938 itemIDs
= ::CreateDataBrowserItemIDArray(noOfEntries
,items
);
939 // insert all valid items into control:
940 noFailureFlag
= ((noOfEntries
== 0) ||
941 !(parent
.IsOk()) && (AddItems(kDataBrowserNoItem
,noOfEntries
,itemIDs
,kDataBrowserItemNoProperty
) == noErr
) ||
942 parent
.IsOk() && (AddItems(reinterpret_cast<DataBrowserItemID
>(parent
.GetID()),noOfEntries
,itemIDs
,kDataBrowserItemNoProperty
) == noErr
));
943 // give allocated array space free again:
946 return noFailureFlag
;
949 void wxMacDataViewDataBrowserListViewControl::Collapse(wxDataViewItem
const& item
)
951 CloseContainer(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
954 void wxMacDataViewDataBrowserListViewControl::EnsureVisible(wxDataViewItem
const& item
, const wxDataViewColumn
* columnPtr
)
956 DataBrowserPropertyID propertyID
;
959 if (columnPtr
!= NULL
)
960 propertyID
= columnPtr
->GetNativeData()->GetPropertyID();
962 propertyID
= kDataBrowserNoItem
;
963 RevealItem(reinterpret_cast<DataBrowserItemID
>(item
.GetID()),propertyID
,kDataBrowserRevealOnly
);
966 void wxMacDataViewDataBrowserListViewControl::Expand(wxDataViewItem
const& item
)
968 OpenContainer(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
971 unsigned int wxMacDataViewDataBrowserListViewControl::GetCount() const
976 wxCHECK_MSG(GetItemCount(&noOfItems
) == noErr
,0,_("Could not determine number of items"));
980 wxRect
wxMacDataViewDataBrowserListViewControl::GetRectangle(wxDataViewItem
const& item
, wxDataViewColumn
const* columnPtr
)
985 if (GetPartBounds(reinterpret_cast<DataBrowserItemID
>(item
.GetID()),columnPtr
->GetNativeData()->GetPropertyID(),kDataBrowserPropertyContentPart
,&MacRectangle
) == noErr
)
989 ::wxMacNativeToRect(&MacRectangle
,&rectangle
);
996 bool wxMacDataViewDataBrowserListViewControl::IsExpanded(wxDataViewItem
const& item
) const
998 DataBrowserItemState state
= 0;
1000 if (GetItemState(reinterpret_cast<DataBrowserItemID
>(item
.GetID()),&state
) != noErr
)
1003 return ((state
& kDataBrowserContainerIsOpen
) != 0);
1006 bool wxMacDataViewDataBrowserListViewControl::Reload()
1010 wxDataViewItemArray dataViewChildren
;
1013 noFailureFlag
= (RemoveItems() == noErr
);
1014 SetScrollPosition(0,0); // even after having removed all items the scrollbars may remain at their old position -> reset them
1015 GetDataViewCtrl()->GetModel()->GetChildren(wxDataViewItem(),dataViewChildren
);
1016 GetDataViewCtrl()->GetModel()->ItemsAdded(wxDataViewItem(),dataViewChildren
);
1018 return noFailureFlag
;
1021 bool wxMacDataViewDataBrowserListViewControl::Remove(wxDataViewItem
const& parent
, wxDataViewItem
const& item
)
1023 DataBrowserItemID
itemID(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
1026 return (RemoveItem(reinterpret_cast<DataBrowserItemID
>(parent
.GetID()),&itemID
) == noErr
);
1029 bool wxMacDataViewDataBrowserListViewControl::Remove(wxDataViewItem
const& parent
, wxDataViewItemArray
const& items
)
1033 DataBrowserItemID
* itemIDs
;
1038 // convert all valid data view items to data browser items:
1039 itemIDs
= ::CreateDataBrowserItemIDArray(noOfEntries
,items
);
1040 // insert all valid items into control:
1041 noFailureFlag
= ((noOfEntries
== 0) ||
1042 !(parent
.IsOk()) && (RemoveItems(kDataBrowserNoItem
,noOfEntries
,itemIDs
,kDataBrowserItemNoProperty
) == noErr
) ||
1043 parent
.IsOk() && (RemoveItems(reinterpret_cast<DataBrowserItemID
>(parent
.GetID()),noOfEntries
,itemIDs
,kDataBrowserItemNoProperty
) == noErr
));
1044 // give allocated array space free again:
1047 return noFailureFlag
;
1050 bool wxMacDataViewDataBrowserListViewControl::Update(wxDataViewColumn
const* columnPtr
)
1052 return (UpdateItems(kDataBrowserNoItem
,0,NULL
,kDataBrowserItemNoProperty
,columnPtr
->GetNativeData()->GetPropertyID()) == noErr
);
1055 bool wxMacDataViewDataBrowserListViewControl::Update(wxDataViewItem
const& parent
, wxDataViewItem
const& item
)
1057 DataBrowserItemID
itemID(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
1061 return (UpdateItem(reinterpret_cast<DataBrowserItemID
>(parent
.GetID()),&itemID
) == noErr
);
1063 return (UpdateItem(kDataBrowserNoItem
,&itemID
) == noErr
);
1066 bool wxMacDataViewDataBrowserListViewControl::Update(wxDataViewItem
const& parent
, wxDataViewItemArray
const& items
)
1070 DataBrowserItemID
* itemIDs
;
1075 // convert all valid data view items to data browser items:
1076 itemIDs
= ::CreateDataBrowserItemIDArray(noOfEntries
,items
);
1078 noFailureFlag
= (UpdateItems(reinterpret_cast<DataBrowserItemID
>(parent
.GetID()),noOfEntries
,itemIDs
,kDataBrowserItemNoProperty
,kDataBrowserItemNoProperty
) == noErr
);
1080 noFailureFlag
= (UpdateItems(kDataBrowserNoItem
,noOfEntries
,itemIDs
,kDataBrowserItemNoProperty
,kDataBrowserItemNoProperty
) == noErr
);
1081 // release allocated array space:
1084 return noFailureFlag
;
1088 // model related methods
1090 bool wxMacDataViewDataBrowserListViewControl::AssociateModel(wxDataViewModel
* WXUNUSED(model
))
1096 // selection related methods (inherited from wxDataViewWidgetImpl)
1098 wxDataViewItem
wxMacDataViewDataBrowserListViewControl::GetCurrentItem() const
1100 wxFAIL_MSG( "unimplemented for Carbon" );
1102 return wxDataViewItem();
1105 void wxMacDataViewDataBrowserListViewControl::SetCurrentItem(const wxDataViewItem
& WXUNUSED(item
))
1107 wxFAIL_MSG( "unimplemented for Carbon" );
1110 int wxMacDataViewDataBrowserListViewControl::GetSelectedItemsCount() const
1112 Handle
handle(::NewHandle(0));
1114 if ( GetItems(kDataBrowserNoItem
,true,kDataBrowserItemIsSelected
,handle
) != noErr
)
1116 wxFAIL_MSG( "failed to get selected items" );
1120 size_t noOfItems
= static_cast<size_t>(::GetHandleSize(handle
)/sizeof(DataBrowserItemID
));
1122 DisposeHandle(handle
);
1127 int wxMacDataViewDataBrowserListViewControl::GetSelections(wxDataViewItemArray
& sel
) const
1129 size_t noOfSelectedItems
;
1131 wxArrayDataBrowserItemID itemIDs
;
1134 noOfSelectedItems
= GetSelectedItemIDs(itemIDs
);
1136 sel
.SetCount(noOfSelectedItems
);
1137 for (size_t i
=0; i
<noOfSelectedItems
; ++i
)
1138 sel
[i
] = wxDataViewItem(reinterpret_cast<void*>(itemIDs
[i
]));
1139 return static_cast<int>(noOfSelectedItems
);
1142 bool wxMacDataViewDataBrowserListViewControl::IsSelected(wxDataViewItem
const& item
) const
1144 return IsItemSelected(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
1147 void wxMacDataViewDataBrowserListViewControl::Select(wxDataViewItem
const& item
)
1149 DataBrowserItemID
itemID(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
1152 SetSelectedItems(1,&itemID
,kDataBrowserItemsAdd
);
1155 void wxMacDataViewDataBrowserListViewControl::SelectAll()
1157 DataBrowserItemID
* itemIDPtr
;
1159 Handle
handle(::NewHandle(0));
1164 wxCHECK_RET(GetItems(kDataBrowserNoItem
,true,kDataBrowserItemAnyState
,handle
) == noErr
,_("Could not get items."));
1165 noOfItems
= static_cast<size_t>(::GetHandleSize(handle
)/sizeof(DataBrowserItemID
));
1167 itemIDPtr
= (DataBrowserItemID
*) (*handle
);
1168 SetSelectedItems(noOfItems
,itemIDPtr
,kDataBrowserItemsAssign
);
1170 ::DisposeHandle(handle
);
1173 void wxMacDataViewDataBrowserListViewControl::Unselect(wxDataViewItem
const& item
)
1175 DataBrowserItemID
itemID(reinterpret_cast<DataBrowserItemID
>(item
.GetID()));
1178 SetSelectedItems(1,&itemID
,kDataBrowserItemsRemove
);
1181 void wxMacDataViewDataBrowserListViewControl::UnselectAll()
1183 DataBrowserItemID
* itemIDPtr
;
1185 Handle
handle(::NewHandle(0));
1190 wxCHECK_RET(GetItems(kDataBrowserNoItem
,true,kDataBrowserItemAnyState
,handle
) == noErr
,_("Could not get items."));
1191 noOfItems
= static_cast<size_t>(::GetHandleSize(handle
)/sizeof(DataBrowserItemID
));
1193 itemIDPtr
= (DataBrowserItemID
*) (*handle
);
1194 SetSelectedItems(noOfItems
,itemIDPtr
,kDataBrowserItemsRemove
);
1196 ::DisposeHandle(handle
);
1200 // sorting related methods
1202 wxDataViewColumn
* wxMacDataViewDataBrowserListViewControl::GetSortingColumn() const
1204 DataBrowserPropertyID propertyID
;
1207 if (GetSortProperty(&propertyID
) == noErr
)
1208 return GetColumnPtr(propertyID
);
1213 void wxMacDataViewDataBrowserListViewControl::Resort()
1215 (void) wxMacDataBrowserListViewControl::Resort();
1219 // other methods (inherited from wxDataViewWidgetImpl)
1222 wxMacDataViewDataBrowserListViewControl::HitTest(const wxPoint
& WXUNUSED(point
),
1223 wxDataViewItem
& item
,
1224 wxDataViewColumn
*& columnPtr
) const
1226 // not yet implemented:
1227 item
= wxDataViewItem();
1231 void wxMacDataViewDataBrowserListViewControl::DoSetIndent(int indent
)
1233 SetIndent(static_cast<float>(indent
));
1236 void wxMacDataViewDataBrowserListViewControl::SetRowHeight(wxDataViewItem
const& item
, unsigned int height
)
1238 SetItemRowHeight(reinterpret_cast<DataBrowserItemID
>(item
.GetID()),static_cast<UInt16
>(height
));
1241 void wxMacDataViewDataBrowserListViewControl::OnSize()
1246 GetColumnCount(&noOfColumns
);
1247 if (noOfColumns
<= 1) // no horizontal scroll bar and the only column expands to the width of the whole control
1249 SetHasScrollBars(false,true);
1252 else // otherwise keep the current column size and have scrollbars in both directions
1253 SetHasScrollBars(true,true);
1256 void wxMacDataViewDataBrowserListViewControl::StartEditor( const wxDataViewItem
& item
, unsigned int column
)
1262 // callback functions (inherited from wxMacDataBrowserTableViewControl)
1264 Boolean
wxMacDataViewDataBrowserListViewControl::DataBrowserCompareProc(DataBrowserItemID itemOneID
, DataBrowserItemID itemTwoID
, DataBrowserPropertyID sortProperty
)
1266 DataBrowserSortOrder sortOrder
;
1268 DataBrowserTableViewColumnIndex modelColumnIndex
;
1270 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(GetWXPeer()));
1273 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
, false,_("Pointer to data view control not set correctly."));
1274 wxCHECK_MSG(dataViewCtrlPtr
->GetModel() != NULL
,false,_("Pointer to model not set correctly."));
1275 if (sortProperty
>= kMinPropertyID
)
1277 // variable definition and initialization:
1278 wxDataViewColumn
* ColumnPtr(GetColumnPtr(sortProperty
));
1280 wxCHECK_MSG(ColumnPtr
!= NULL
,false,_("Could not determine column index."));
1281 modelColumnIndex
= ColumnPtr
->GetModelColumn();
1284 modelColumnIndex
= 0;
1285 GetSortOrder(&sortOrder
);
1286 return static_cast<Boolean
>(dataViewCtrlPtr
->GetModel()->Compare(wxDataViewItem(reinterpret_cast<void*>(itemOneID
)),wxDataViewItem(reinterpret_cast<void*>(itemTwoID
)),
1287 modelColumnIndex
,sortOrder
!= kDataBrowserOrderDecreasing
) < 0);
1290 void wxMacDataViewDataBrowserListViewControl::DataBrowserGetContextualMenuProc(MenuRef
* menu
, UInt32
* helpType
, CFStringRef
* helpItemString
, AEDesc
* WXUNUSED(selection
))
1291 // In this method we do not supply a contextual menu handler at all but only send a wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU.
1293 wxArrayDataBrowserItemID itemIDs
;
1295 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(GetWXPeer()));
1298 wxCHECK_RET(dataViewCtrlPtr
!= NULL
,_("wxWidget control pointer is not a data view pointer"));
1299 // initialize parameters so that no context menu will be displayed automatically by the native data browser:
1301 *helpType
= kCMHelpItemNoHelp
;
1302 *helpItemString
= NULL
;
1303 // create information for a context menu event:
1304 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU
,dataViewCtrlPtr
->GetId());
1306 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
1307 dataViewEvent
.SetModel(dataViewCtrlPtr
->GetModel());
1308 // get the item information;
1309 // theoretically more than one ID can be returned but the event can only handle one item, therefore all item related data is using the data of the first item in the array:
1310 if (GetSelectedItemIDs(itemIDs
) > 0)
1311 dataViewEvent
.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemIDs
[0])));
1312 // finally send the equivalent wxWidget event:
1313 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
1316 OSStatus
wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc(DataBrowserItemID itemID
, DataBrowserPropertyID propertyID
, DataBrowserItemDataRef itemData
, Boolean getValue
)
1320 // variable definitions:
1321 wxDataViewCtrl
* dataViewCtrlPtr
;
1323 dataViewCtrlPtr
= dynamic_cast<wxDataViewCtrl
*>(GetWXPeer());
1324 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
,errDataBrowserNotConfigured
,_("Pointer to data view control not set correctly."));
1325 if (dataViewCtrlPtr
->IsDeleting())
1326 return noErr
; // if a delete process is running the data of editable fields cannot be saved because the associated model variable may already have been deleted
1329 // variable definitions:
1330 OSStatus errorStatus
;
1331 wxDataViewColumn
* dataViewColumnPtr
;
1333 wxCHECK_MSG(dataViewCtrlPtr
->GetModel() != NULL
,errDataBrowserNotConfigured
,_("Pointer to model not set correctly."));
1334 dataViewColumnPtr
= GetColumnPtr(propertyID
);
1335 wxCHECK_MSG((dataViewColumnPtr
!= NULL
) && (dataViewColumnPtr
->GetRenderer() != NULL
),errDataBrowserNotConfigured
,_("There is no column or renderer for the specified column index."));
1337 wxDataViewItem
dvItem(reinterpret_cast<void*>(itemID
));
1338 unsigned int col
= dataViewColumnPtr
->GetModelColumn();
1340 switch (dataViewColumnPtr
->GetRenderer()->GetNativeData()->GetPropertyType())
1342 case kDataBrowserCheckboxType
:
1344 // variable definition:
1345 ThemeButtonValue buttonValue
;
1347 errorStatus
= ::GetDataBrowserItemDataButtonValue(itemData
,&buttonValue
);
1348 if (errorStatus
== noErr
)
1350 if (buttonValue
== kThemeButtonOn
)
1352 // variable definition and initialization:
1353 wxVariant
modifiedData(true);
1355 if (dataViewCtrlPtr
->GetModel()->ChangeValue(modifiedData
, dvItem
, col
))
1358 return errDataBrowserInvalidPropertyData
;
1360 else if (buttonValue
== kThemeButtonOff
)
1362 // variable definition and initialization:
1363 wxVariant
modifiedData(false);
1365 if (dataViewCtrlPtr
->GetModel()->ChangeValue(modifiedData
, dvItem
, col
))
1368 return errDataBrowserInvalidPropertyData
;
1371 return errDataBrowserInvalidPropertyData
;
1376 case kDataBrowserTextType
:
1378 // variable definitions:
1379 CFStringRef stringReference
;
1381 errorStatus
= ::GetDataBrowserItemDataText(itemData
,&stringReference
);
1382 if (errorStatus
== noErr
)
1384 // variable definitions and initializations:
1385 #if wxCHECK_VERSION(2,9,0)
1386 wxCFStringRef
modifiedString(stringReference
);
1388 wxMacCFStringHolder
modifiedString(stringReference
);
1390 wxVariant
modifiedData(modifiedString
.AsString());
1392 if (dataViewCtrlPtr
->GetModel()->ChangeValue(modifiedData
, dvItem
, col
))
1395 return errDataBrowserInvalidPropertyData
;
1401 return errDataBrowserPropertyNotSupported
;
1407 if (propertyID
>= kMinPropertyID
) // in case data columns set the data
1409 // variable definitions:
1411 wxDataViewColumn
* dataViewColumnPtr
;
1412 wxDataViewCtrl
* dataViewCtrlPtr
;
1414 dataViewCtrlPtr
= dynamic_cast<wxDataViewCtrl
*>(GetWXPeer());
1415 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
,errDataBrowserNotConfigured
,_("Pointer to data view control not set correctly."));
1416 wxCHECK_MSG(dataViewCtrlPtr
->GetModel() != NULL
,errDataBrowserNotConfigured
,_("Pointer to model not set correctly."));
1417 dataViewColumnPtr
= GetColumnPtr(propertyID
);
1418 wxCHECK_MSG(dataViewColumnPtr
!= NULL
,errDataBrowserNotConfigured
,_("No column for the specified column position existing."));
1419 wxCHECK_MSG(dataViewColumnPtr
->GetRenderer() != NULL
,errDataBrowserNotConfigured
,_("No renderer specified for column."));
1420 dataViewCtrlPtr
->GetModel()->GetValue(variant
,wxDataViewItem(reinterpret_cast<void*>(itemID
)),dataViewColumnPtr
->GetModelColumn());
1421 if (!(variant
.IsNull()))
1423 dataViewColumnPtr
->GetRenderer()->GetNativeData()->SetItemDataRef(itemData
);
1424 dataViewColumnPtr
->GetRenderer()->SetValue(variant
);
1425 wxCHECK_MSG(dataViewColumnPtr
->GetRenderer()->MacRender(),errDataBrowserNotConfigured
,_("Rendering failed."));
1429 else // react on special system requests
1433 case kDataBrowserContainerIsClosableProperty
:
1435 // variable definitions:
1436 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(GetWXPeer()));
1438 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
,errDataBrowserNotConfigured
,_("Pointer to data view control not set correctly."));
1439 // initialize wxWidget event:
1440 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING
,dataViewCtrlPtr
->GetId()); // variable definition
1442 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
1443 dataViewEvent
.SetItem (wxDataViewItem(reinterpret_cast<void*>(itemID
)));
1444 dataViewEvent
.SetModel (dataViewCtrlPtr
->GetModel());
1445 // finally send the equivalent wxWidget event:
1446 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
1447 // opening the container is allowed if not vetoed:
1448 return ::SetDataBrowserItemDataBooleanValue(itemData
,dataViewEvent
.IsAllowed());
1450 case kDataBrowserContainerIsOpenableProperty
:
1452 // variable definitions:
1453 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(GetWXPeer()));
1455 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
,errDataBrowserNotConfigured
,_("Pointer to data view control not set correctly."));
1456 // initialize wxWidget event:
1457 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING
,dataViewCtrlPtr
->GetId()); // variable definition
1459 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
1460 dataViewEvent
.SetItem (wxDataViewItem(reinterpret_cast<void*>(itemID
)));
1461 dataViewEvent
.SetModel (dataViewCtrlPtr
->GetModel());
1462 // finally send the equivalent wxWidget event:
1463 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
1464 // opening the container is allowed if not vetoed:
1465 return ::SetDataBrowserItemDataBooleanValue(itemData
,dataViewEvent
.IsAllowed());
1467 case kDataBrowserItemIsContainerProperty
:
1469 // variable definition:
1470 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(GetWXPeer()));
1472 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
,errDataBrowserNotConfigured
,_("Pointer to data view control not set correctly."));
1473 wxCHECK_MSG(dataViewCtrlPtr
->GetModel() != NULL
,errDataBrowserNotConfigured
,_("Pointer to model not set correctly."));
1474 return ::SetDataBrowserItemDataBooleanValue(itemData
,dataViewCtrlPtr
->GetModel()->IsContainer(wxDataViewItem(reinterpret_cast<void*>(itemID
))));
1476 case kDataBrowserItemIsEditableProperty
:
1477 return ::SetDataBrowserItemDataBooleanValue(itemData
,true);
1481 return errDataBrowserPropertyNotSupported
;
1484 void wxMacDataViewDataBrowserListViewControl::DataBrowserItemNotificationProc(DataBrowserItemID itemID
, DataBrowserItemNotification message
, DataBrowserItemDataRef itemData
)
1486 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(GetWXPeer()));
1489 // check if the data view control pointer still exists because this call back function can still be called when the control has already been deleted:
1490 if (dataViewCtrlPtr
!= NULL
)
1493 case kDataBrowserContainerClosed
:
1494 dataViewCtrlPtr
->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
1496 // initialize wxWidget event:
1497 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED
,dataViewCtrlPtr
->GetId()); // variable definition
1499 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
1500 dataViewEvent
.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID
)));
1501 // finally send the equivalent wxWidget event:
1502 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
1505 case kDataBrowserContainerOpened
:
1506 dataViewCtrlPtr
->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
1508 // initialize wxWidget event:
1509 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED
,dataViewCtrlPtr
->GetId()); // variable definition
1511 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
1512 dataViewEvent
.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID
)));
1513 // finally send the equivalent wxWidget event:
1514 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
1515 // add children to the expanded container:
1516 dataViewCtrlPtr
->AddChildren(wxDataViewItem(reinterpret_cast<void*>(itemID
)));
1519 case kDataBrowserEditStarted
:
1520 dataViewCtrlPtr
->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
1522 // initialize wxWidget event:
1523 DataBrowserPropertyID propertyID
;
1524 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED
,dataViewCtrlPtr
->GetId()); // variable definition
1526 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
1527 dataViewEvent
.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID
)));
1528 if (GetPropertyID(itemData
,&propertyID
) == noErr
)
1530 // variable definition and initialization:
1531 DataBrowserTableViewColumnIndex columnIndex
;
1533 wxCHECK_RET(GetColumnIndex(propertyID
,&columnIndex
),_("Column index not found."));
1534 dataViewEvent
.SetColumn(columnIndex
);
1535 dataViewEvent
.SetDataViewColumn(GetColumnPtr(propertyID
));
1537 // finally send the equivalent wxWidget event:
1538 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
1541 case kDataBrowserEditStopped
:
1543 // initialize wxWidget event:
1544 DataBrowserPropertyID propertyID
;
1545 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE
,dataViewCtrlPtr
->GetId()); // variable definition
1547 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
1548 dataViewEvent
.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID
)));
1549 if (GetPropertyID(itemData
,&propertyID
) == noErr
)
1551 // variable definition and initialization:
1552 DataBrowserTableViewColumnIndex columnIndex
;
1554 wxCHECK_RET(GetColumnIndex(propertyID
,&columnIndex
),_("Column index not found."));
1555 dataViewEvent
.SetColumn(columnIndex
);
1556 dataViewEvent
.SetDataViewColumn(GetColumnPtr(propertyID
));
1558 // finally send the equivalent wxWidget event:
1559 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
1562 case kDataBrowserItemAdded
:
1563 dataViewCtrlPtr
->FinishCustomItemEditing();
1565 case kDataBrowserItemDeselected
:
1566 dataViewCtrlPtr
->FinishCustomItemEditing();
1568 case kDataBrowserItemDoubleClicked
:
1570 // initialize wxWidget event:
1571 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED
,dataViewCtrlPtr
->GetId()); // variable definition
1573 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
1574 dataViewEvent
.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID
)));
1575 // finally send the equivalent wxWidget event:
1576 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
1579 case kDataBrowserItemRemoved
:
1580 dataViewCtrlPtr
->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
1582 case kDataBrowserItemSelected
:
1583 break; // not implemented by wxWidgets; see kDataBrowserSelectionSetChanged
1584 case kDataBrowserSelectionSetChanged
:
1586 // initialize wxWidget event:
1587 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED
,dataViewCtrlPtr
->GetId()); // variable definition
1589 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
1590 dataViewEvent
.SetModel (dataViewCtrlPtr
->GetModel());
1591 // finally send the equivalent wxWidget event:
1592 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
1595 case kDataBrowserTargetChanged
: // no idea if this notification is ever sent
1597 case kDataBrowserUserStateChanged
:
1599 // finish custom item editing if necessary:
1600 dataViewCtrlPtr
->FinishCustomItemEditing();
1601 // update column widths:
1602 for (size_t i
=0; i
<dataViewCtrlPtr
->GetColumnCount(); ++i
)
1604 // constant definition for abbreviational purposes:
1605 wxDataViewColumn
* const columnPtr
= dataViewCtrlPtr
->GetColumnPtr(i
);
1606 // variable definition:
1609 wxCHECK_RET(GetColumnWidth(columnPtr
->GetNativeData()->GetPropertyID(),&columnWidth
) == noErr
,_("Column width could not be determined"));
1610 columnPtr
->SetWidthVariable(columnWidth
);
1612 // update sorting orders:
1613 DataBrowserPropertyID propertyID
; // variable definition
1615 if ((GetSortProperty(&propertyID
) == noErr
) && (propertyID
>= kMinPropertyID
))
1617 DataBrowserSortOrder sortOrder
;
1618 DataBrowserTableViewColumnIndex columnIndex
;
1620 if ((GetSortOrder(&sortOrder
) == noErr
) && (GetColumnIndex(propertyID
,&columnIndex
) == noErr
))
1622 // variable definition and initialization:
1623 wxDataViewColumn
* columnPtr
;
1624 columnPtr
= dataViewCtrlPtr
->GetColumn(columnIndex
);
1625 // check if the sort order has changed:
1626 if ( columnPtr
->IsSortOrderAscending() && (sortOrder
== kDataBrowserOrderDecreasing
) ||
1627 !(columnPtr
->IsSortOrderAscending()) && (sortOrder
== kDataBrowserOrderIncreasing
))
1629 columnPtr
->SetSortOrder(!(columnPtr
->IsSortOrderAscending()));
1630 // initialize wxWidget event:
1631 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED
,dataViewCtrlPtr
->GetId()); // variable defintion
1633 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
1634 dataViewEvent
.SetColumn(columnIndex
);
1635 dataViewEvent
.SetDataViewColumn(columnPtr
);
1636 // finally send the equivalent wxWidget event:
1637 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
1647 wxMacDataViewDataBrowserListViewControl::DataBrowserDrawItemProc(DataBrowserItemID itemID
,
1648 DataBrowserPropertyID propertyID
,
1649 DataBrowserItemState state
,
1650 Rect
const* rectangle
,
1651 SInt16
WXUNUSED(bitDepth
),
1652 Boolean
WXUNUSED(colorDevice
))
1654 DataBrowserTableViewColumnIndex columnIndex
;
1656 wxDataViewColumn
* dataViewColumnPtr
;
1658 wxDataViewCtrl
* dataViewCtrlPtr
;
1660 wxDataViewCustomRenderer
* dataViewCustomRendererPtr
;
1662 wxVariant dataToRender
;
1664 dataViewCtrlPtr
= dynamic_cast<wxDataViewCtrl
*>(GetWXPeer());
1665 wxCHECK_RET(dataViewCtrlPtr
!= NULL
, _("Pointer to data view control not set correctly."));
1666 wxCHECK_RET(dataViewCtrlPtr
->GetModel() != NULL
, _("Pointer to model not set correctly."));
1667 wxCHECK_RET(GetColumnIndex(propertyID
,&columnIndex
) == noErr
,_("Could not determine column index."));
1668 dataViewColumnPtr
= GetColumnPtr(propertyID
);
1669 wxCHECK_RET(dataViewColumnPtr
!= NULL
,_("No column for the specified column existing."));
1670 dataViewCustomRendererPtr
= dynamic_cast<wxDataViewCustomRenderer
*>(dataViewColumnPtr
->GetRenderer());
1671 wxCHECK_RET(dataViewCustomRendererPtr
!= NULL
,_("No renderer or invalid renderer type specified for custom data column."));
1672 dataViewCtrlPtr
->GetModel()->GetValue(dataToRender
,wxDataViewItem(reinterpret_cast<void*>(itemID
)),dataViewColumnPtr
->GetModelColumn());
1673 dataViewCustomRendererPtr
->SetValue(dataToRender
);
1675 wxDataViewItem
dataItem( reinterpret_cast<void*>(itemID
) );
1676 dataViewCtrlPtr
->GetModel()->GetValue(dataToRender
,dataItem
,dataViewColumnPtr
->GetModelColumn());
1677 dataViewCustomRendererPtr
->SetValue(dataToRender
);
1679 // try to determine the content's size (drawable part):
1681 RgnHandle
rgn(NewRgn());
1682 UInt16 headerHeight
;
1684 if (GetControlRegion(m_controlRef
,kControlContentMetaPart
,rgn
) == noErr
)
1685 GetRegionBounds(rgn
,&content
);
1687 GetControlBounds(m_controlRef
, &content
);
1689 // space for the header
1690 GetHeaderButtonHeight(&headerHeight
);
1691 content
.top
+= headerHeight
;
1692 // extra space for the frame (todo: do not how to determine the space automatically from the control)
1696 content
.bottom
-= 3;
1697 // extra space for the scrollbars:
1698 content
.bottom
-= wxSystemSettings::GetMetric(wxSYS_HSCROLL_Y
);
1699 content
.right
-= wxSystemSettings::GetMetric(wxSYS_VSCROLL_X
);
1701 wxDC
*dc
= dataViewCustomRendererPtr
->GetDC();
1703 int active_border_fudge
= 0;
1704 if (dataViewCtrlPtr
->HasFocus() && !dataViewCtrlPtr
->HasFlag( wxBORDER_NONE
))
1705 active_border_fudge
= 1;
1707 active_border_fudge
= -2;
1709 wxRect
cellrect( static_cast<int>(rectangle
->left
+ active_border_fudge
),
1710 static_cast<int>(rectangle
->top
+ active_border_fudge
),
1711 static_cast<int>(1+rectangle
->right
-rectangle
->left
),
1712 static_cast<int>(rectangle
->bottom
-rectangle
->top
) );
1714 bool is_active
= IsControlActive( m_controlRef
);
1715 if (state
== kDataBrowserItemIsSelected
)
1717 wxColour
col( wxMacCreateCGColorFromHITheme( (is_active
) ?
1718 kThemeBrushAlternatePrimaryHighlightColor
1719 : kThemeBrushSecondaryHighlightColor
) );
1721 wxRect rect
= cellrect
;
1723 GetDataBrowserItemPartBounds( m_controlRef
, itemID
, propertyID
,
1724 kDataBrowserPropertyEnclosingPart
, &itemrect
);
1725 rect
.x
= itemrect
.left
-2;
1726 rect
.width
= itemrect
.right
-itemrect
.left
+3;
1728 wxDCPenChanger
setPen(*dc
, *wxTRANSPARENT_PEN
);
1729 wxDCBrushChanger
setBrush(*dc
, col
);
1730 dc
->DrawRectangle(rect
);
1733 wxDataViewModel
*model
= dataViewCtrlPtr
->GetModel();
1734 if ((columnIndex
== 0) || !model
->IsContainer(dataItem
) || model
->HasContainerColumns(dataItem
))
1736 // make sure that 'Render' can draw only in the allowed area:
1737 dc
->SetClippingRegion(content
.left
,content
.top
,content
.right
-content
.left
+1,content
.bottom
-content
.top
+1);
1738 (void) (dataViewCustomRendererPtr
->WXCallRender( cellrect
, dc
,
1739 ((state
== kDataBrowserItemIsSelected
) ? wxDATAVIEW_CELL_SELECTED
: 0)));
1740 dc
->DestroyClippingRegion(); // probably not necessary
1743 dataViewCustomRendererPtr
->SetDC(NULL
);
1747 wxMacDataViewDataBrowserListViewControl::DataBrowserEditItemProc(
1748 DataBrowserItemID
WXUNUSED(itemID
),
1749 DataBrowserPropertyID
WXUNUSED(propertyID
),
1750 CFStringRef
WXUNUSED(theString
),
1751 Rect
* WXUNUSED(maxEditTextRect
),
1752 Boolean
* WXUNUSED(shrinkToFit
))
1757 Boolean
wxMacDataViewDataBrowserListViewControl::DataBrowserHitTestProc(DataBrowserItemID
WXUNUSED(itemID
), DataBrowserPropertyID
WXUNUSED(property
), Rect
const* WXUNUSED(theRect
), Rect
const* WXUNUSED(mouseRect
))
1762 DataBrowserTrackingResult
wxMacDataViewDataBrowserListViewControl::DataBrowserTrackingProc(DataBrowserItemID itemID
, DataBrowserPropertyID propertyID
, Rect
const* theRect
, Point
WXUNUSED(startPt
), EventModifiers
WXUNUSED(modifiers
))
1764 wxDataViewColumn
* dataViewColumnPtr
;
1766 wxDataViewCtrl
* dataViewCtrlPtr
;
1768 wxDataViewCustomRenderer
* dataViewCustomRendererPtr
;
1770 wxDataViewItem dataViewCustomRendererItem
;
1773 dataViewCtrlPtr
= dynamic_cast<wxDataViewCtrl
*>(GetWXPeer());
1774 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
, false,_("Pointer to data view control not set correctly."));
1775 wxCHECK_MSG(dataViewCtrlPtr
->GetModel() != NULL
,false,_("Pointer to model not set correctly."));
1776 dataViewCustomRendererItem
= wxDataViewItem(reinterpret_cast<void*>(itemID
));
1777 wxCHECK_MSG(dataViewCustomRendererItem
.IsOk(),kDataBrowserNothingHit
,_("Invalid data view item"));
1778 dataViewColumnPtr
= GetColumnPtr(propertyID
);
1779 wxCHECK_MSG(dataViewColumnPtr
!= NULL
,kDataBrowserNothingHit
,_("No column existing."));
1780 dataViewCustomRendererPtr
= dynamic_cast<wxDataViewCustomRenderer
*>(dataViewColumnPtr
->GetRenderer());
1781 wxCHECK_MSG(dataViewCustomRendererPtr
!= NULL
,kDataBrowserNothingHit
,_("No renderer or invalid renderer type specified for custom data column."));
1782 // if the currently edited item is identical to the to be edited nothing is done (this hit should only be handled in the control itself):
1783 if (dataViewCtrlPtr
->GetCustomRendererItem() == dataViewCustomRendererItem
)
1784 return kDataBrowserContentHit
;
1785 // an(other) item is going to be edited and therefore the current editing - if existing - has to be finished:
1786 if (dataViewCtrlPtr
->GetCustomRendererPtr() != NULL
)
1788 dataViewCtrlPtr
->GetCustomRendererPtr()->FinishEditing();
1789 dataViewCtrlPtr
->SetCustomRendererItem(wxDataViewItem());
1790 dataViewCtrlPtr
->SetCustomRendererPtr (NULL
);
1792 // check if renderer has got a valid editor control for editing; if this is the case start editing of the new item:
1793 if (dataViewCustomRendererPtr
->HasEditorCtrl())
1795 // variable definition:
1798 ::wxMacNativeToRect(theRect
,&wxRectangle
);
1799 dataViewCustomRendererPtr
->StartEditing(dataViewCustomRendererItem
,wxRectangle
);
1800 dataViewCtrlPtr
->SetCustomRendererItem(dataViewCustomRendererItem
);
1801 dataViewCtrlPtr
->SetCustomRendererPtr (dataViewCustomRendererPtr
);
1803 return kDataBrowserContentHit
;
1806 Boolean
wxMacDataViewDataBrowserListViewControl::DataBrowserAcceptDragProc(DragReference dragRef
, DataBrowserItemID itemID
)
1810 UInt16 noOfDraggedItems
;
1812 wxDataViewCtrl
* dataViewCtrlPtr
;
1815 dataViewCtrlPtr
= dynamic_cast<wxDataViewCtrl
*>(GetWXPeer());
1816 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
, false,_("Pointer to data view control not set correctly."));
1817 wxCHECK_MSG(dataViewCtrlPtr
->GetModel() != NULL
,false,_("Pointer to model not set correctly."));
1819 // send a drag possible event for each available and item und proceed with it unless the event is vetoed:
1820 ::CountDragItems(dragRef
,&noOfDraggedItems
);
1821 for (UInt16 indexDraggedItem
=1; indexDraggedItem
<=noOfDraggedItems
; ++indexDraggedItem
)
1823 // collect native information:
1824 ItemReference itemRef
;
1825 wxDataObjectComposite
* dataObjects
;
1826 wxMemoryBuffer buffer
;
1828 ::GetDragItemReferenceNumber(dragRef
,indexDraggedItem
,&itemRef
); // the index begins with 1!
1829 dataObjects
= GetDnDDataObjects(dragRef
,itemRef
);
1830 // create wxWidget's event:
1831 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_DROP_POSSIBLE
,dataViewCtrlPtr
->GetId());
1833 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
1835 // this is the item that receives the event (can be an invalid item ID, this is
1836 // especially useful if the dataview does not contain any items)
1837 dataViewEvent
.SetItem( wxDataViewItem(reinterpret_cast<void*>(itemID
)) );
1839 dataViewEvent
.SetModel(dataViewCtrlPtr
->GetModel());
1840 dataViewEvent
.SetDataObject(dataObjects
);
1841 dataViewEvent
.SetDataFormat(GetDnDDataFormat(dataObjects
));
1842 if (dataViewEvent
.GetDataFormat().GetType() != wxDF_INVALID
)
1844 dataViewEvent
.SetDataSize(dataObjects
->GetDataSize(dataViewEvent
.GetDataFormat().GetType()));
1845 dataObjects
->GetDataHere(dataViewEvent
.GetDataFormat().GetType(),buffer
.GetWriteBuf(dataViewEvent
.GetDataSize()));
1846 buffer
.UngetWriteBuf(dataViewEvent
.GetDataSize());
1847 dataViewEvent
.SetDataBuffer(buffer
.GetData());
1851 acceptDrag
= dataViewCtrlPtr
->HandleWindowEvent(dataViewEvent
) && dataViewEvent
.IsAllowed();
1859 Boolean
wxMacDataViewDataBrowserListViewControl::DataBrowserAddDragItemProc(DragReference dragRef
, DataBrowserItemID itemID
, ItemReference
* itemRef
)
1861 Boolean addDragItem
;
1863 wxDataViewCtrl
* dataViewCtrlPtr
;
1865 wxDataViewItem dataViewItem
;
1868 dataViewCtrlPtr
= dynamic_cast<wxDataViewCtrl
*>(GetWXPeer());
1869 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
, false,_("Pointer to data view control not set correctly."));
1870 wxCHECK_MSG(dataViewCtrlPtr
->GetModel() != NULL
,false,_("Pointer to model not set correctly."));
1871 dataViewItem
= wxDataViewItem(reinterpret_cast<void*>(itemID
));
1872 wxCHECK_MSG(dataViewItem
.IsOk(),false,_("Invalid data view item"));
1874 // send a begin drag event and proceed with dragging unless the event is vetoed:
1875 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_BEGIN_DRAG
,dataViewCtrlPtr
->GetId());
1877 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
1878 dataViewEvent
.SetItem(dataViewItem
);
1879 dataViewEvent
.SetModel(dataViewCtrlPtr
->GetModel());
1880 // the dataview event object is also initialized with a default set of data; as it is a set of data and the user should be able to easily complete
1881 // the object a wxDataObjectComposite object is used;
1882 // currently, the composite object only contains a TAB concatenated string of all data:
1883 wxDataObjectComposite
* dataObject(new wxDataObjectComposite());
1885 dataObject
->Add(new wxTextDataObject(::ConcatenateDataViewItemValues(dataViewCtrlPtr
,dataViewItem
)));
1886 dataViewEvent
.SetDataObject(dataObject
);
1887 // check if event has not been vetoed:
1888 addDragItem
= dataViewCtrlPtr
->HandleWindowEvent(dataViewEvent
) && dataViewEvent
.IsAllowed();
1891 // for the internal drag & drop functions create two flavors:
1892 // - the data browser's item id;
1893 // - the data contained the dataview event object (if available).
1894 // Definition: a flavor is the type dependent representation of identical data.
1895 // Example: a number can be represented by its value and by its value converted to a string. In this case the flavor
1896 // of the number's internal representation is typeSInt32 while its string representation has got the flavor 'TEXT'.
1897 // Item id is one of the flavors:
1898 wxCHECK_MSG(::AddDragItemFlavor(dragRef
,*itemRef
,typeUInt32
,&itemID
,sizeof(itemID
),0) == noErr
,false,_("Unable to handle native drag&drop data"));
1899 // if the dataview event object contains data it is used for additional flavors; all natively known flavors are supported:
1900 if (dataViewEvent
.GetDataObject() != NULL
)
1902 // constant definition for abbreviational purposes:
1903 size_t const noOfFormats
= dataViewEvent
.GetDataObject()->GetFormatCount();
1905 if (noOfFormats
> 0)
1907 // variable definition:
1908 wxDataFormat
* dataFormats
;
1910 dataFormats
= new wxDataFormat
[noOfFormats
];
1911 dataViewEvent
.GetDataObject()->GetAllFormats(dataFormats
,wxDataObject::Get
);
1912 for (size_t i
=0; i
<noOfFormats
; ++i
)
1913 switch (dataFormats
[i
].GetType())
1916 wxFAIL_MSG(_("Data object has invalid data format"));
1920 // constant definition for abbreviational purposes:
1921 size_t const dataSize
= dataViewEvent
.GetDataObject()->GetDataSize(wxDF_TEXT
);
1922 // variable definition and initialization:
1923 wxMemoryBuffer
dataObject(dataSize
);
1925 dataViewEvent
.GetDataObject()->GetDataHere(wxDF_TEXT
,dataObject
.GetWriteBuf(dataSize
));
1926 dataObject
.UngetWriteBuf(dataSize
);
1927 if (::AddDragItemFlavor(dragRef
,*itemRef
,'TEXT',dataObject
.GetData(),dataSize
,0) != noErr
)
1928 wxFAIL_MSG(_("Adding flavor TEXT failed"));
1931 case wxDF_UNICODETEXT
:
1933 // constant definition for abbreviational purposes:
1934 size_t const dataSize
= dataViewEvent
.GetDataObject()->GetDataSize(wxDF_TEXT
);
1935 // as there is no direct access to the data copy it to a memory buffer:
1936 wxMemoryBuffer
dataObject(dataSize
);
1938 dataViewEvent
.GetDataObject()->GetDataHere(wxDF_TEXT
,dataObject
.GetWriteBuf(dataSize
));
1939 dataObject
.UngetWriteBuf(dataSize
);
1940 // if the data is stored in unicode format the internal representation is utf-8 (not mentioned in the documentation but in the source code);
1941 // DnD uses fixed utf-16 representation -> use the OSX functions for a conversion:
1942 CFDataRef
osxData (::CFDataCreateWithBytesNoCopy(kCFAllocatorDefault
,reinterpret_cast<UInt8
*>(dataObject
.GetData()),dataSize
,kCFAllocatorNull
));
1943 CFStringRef
osxString(::CFStringCreateFromExternalRepresentation(kCFAllocatorDefault
,osxData
,kCFStringEncodingUTF8
));
1945 // the osxString contains now the data and therefore the previously occupied memory can be released and re-used:
1946 ::CFRelease(osxData
);
1947 osxData
= ::CFStringCreateExternalRepresentation(kCFAllocatorDefault
,osxString
,kCFStringEncodingUTF16
,32);
1948 if (::AddDragItemFlavor(dragRef
,*itemRef
,'utxt',::CFDataGetBytePtr(osxData
),::CFDataGetLength(osxData
),0) != noErr
)
1949 wxFAIL_MSG(_("Adding flavor utxt failed"));
1951 ::CFRelease(osxData
);
1952 ::CFRelease(osxString
);
1966 case wxDF_ENHMETAFILE
:
1971 break; // not (yet) supported data formats
1973 wxFAIL_MSG(_("Unknown data format"));
1975 delete[] dataFormats
;
1979 // clean-up and return result:
1984 Boolean
wxMacDataViewDataBrowserListViewControl::DataBrowserReceiveDragProc(DragReference dragRef
, DataBrowserItemID itemID
)
1986 UInt16 noOfDraggedItems
;
1988 wxDataViewCtrl
* dataViewCtrlPtr
;
1991 dataViewCtrlPtr
= dynamic_cast<wxDataViewCtrl
*>(GetWXPeer());
1992 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
, false,_("Pointer to data view control not set correctly."));
1993 wxCHECK_MSG(dataViewCtrlPtr
->GetModel() != NULL
,false,_("Pointer to model not set correctly."));
1995 // send a drag possible event for each available and item und proceed with it unless the event is vetoed:
1996 ::CountDragItems(dragRef
,&noOfDraggedItems
);
1997 for (UInt16 indexDraggedItem
=1; indexDraggedItem
<=noOfDraggedItems
; ++indexDraggedItem
)
2000 ItemReference itemRef
;
2001 wxDataObjectComposite
* dataObjects
;
2002 wxMemoryBuffer buffer
;
2004 // collect native information:
2005 ::GetDragItemReferenceNumber(dragRef
,indexDraggedItem
,&itemRef
); // the index begins with 1!
2006 dataObjects
= GetDnDDataObjects(dragRef
,itemRef
);
2007 // create wxWidget's event:
2008 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_DROP
,dataViewCtrlPtr
->GetId());
2010 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
2012 // this is the item that receives the event (can be an invalid item ID, this is
2013 // especially useful if the dataview does not contain any items)
2014 dataViewEvent
.SetItem( wxDataViewItem(reinterpret_cast<void*>(itemID
)) );
2016 dataViewEvent
.SetModel(dataViewCtrlPtr
->GetModel());
2017 dataViewEvent
.SetDataObject(dataObjects
);
2018 dataViewEvent
.SetDataFormat(GetDnDDataFormat(dataObjects
));
2019 if (dataViewEvent
.GetDataFormat().GetType() != wxDF_INVALID
)
2021 dataViewEvent
.SetDataSize(dataObjects
->GetDataSize(dataViewEvent
.GetDataFormat().GetType()));
2022 dataObjects
->GetDataHere(dataViewEvent
.GetDataFormat().GetType(),buffer
.GetWriteBuf(dataViewEvent
.GetDataSize()));
2023 buffer
.UngetWriteBuf(dataViewEvent
.GetDataSize());
2024 dataViewEvent
.SetDataBuffer(buffer
.GetData());
2028 receiveDrag
= dataViewCtrlPtr
->HandleWindowEvent(dataViewEvent
) && dataViewEvent
.IsAllowed();
2037 // drag & drop helper methods
2039 wxDataFormat
wxMacDataViewDataBrowserListViewControl::GetDnDDataFormat(wxDataObjectComposite
* dataObjects
)
2041 wxDataFormat resultFormat
;
2044 if (dataObjects
!= NULL
)
2046 bool compatible(true);
2048 size_t const noOfFormats
= dataObjects
->GetFormatCount();
2051 wxDataFormat
* formats
;
2053 // get all formats and check afterwards if the formats are compatible; if they are compatible the preferred format is returned otherwise
2054 // wxDF_INVALID is returned;
2055 // currently compatible types (ordered by priority are):
2056 // - wxDF_UNICODETEXT - wxDF_TEXT
2057 formats
= new wxDataFormat
[noOfFormats
];
2058 dataObjects
->GetAllFormats(formats
);
2060 while ((indexFormat
< noOfFormats
) && compatible
)
2062 switch (resultFormat
.GetType())
2065 resultFormat
.SetType(formats
[indexFormat
].GetType()); // first format (should only be reached if indexFormat == 0
2068 if (formats
[indexFormat
].GetType() == wxDF_UNICODETEXT
)
2069 resultFormat
.SetType(wxDF_UNICODETEXT
);
2070 else // incompatible
2072 resultFormat
.SetType(wxDF_INVALID
);
2076 case wxDF_UNICODETEXT
:
2077 if (formats
[indexFormat
].GetType() != wxDF_TEXT
)
2079 resultFormat
.SetType(wxDF_INVALID
);
2084 resultFormat
.SetType(wxDF_INVALID
); // not (yet) supported format
2093 resultFormat
= wxDF_INVALID
;
2094 return resultFormat
;
2097 wxDataObjectComposite
* wxMacDataViewDataBrowserListViewControl::GetDnDDataObjects(DragReference dragRef
, ItemReference itemRef
) const
2101 wxDataObjectComposite
* dataObject
;
2104 ::CountDragItemFlavors(dragRef
,itemRef
,&noOfFlavors
);
2105 if (noOfFlavors
> 0)
2107 // as the native drag data can be separated into TEXT and UTXT a pointer to a wxTextDataObject is used to track the existence of 'TEXT' and 'utxt' flavors:
2108 wxTextDataObject
* textDataObject(NULL
);
2110 dataObject
= new wxDataObjectComposite();
2111 for (UInt16 indexFlavor
=1; indexFlavor
<=noOfFlavors
; ++indexFlavor
)
2113 // variable definition:
2114 FlavorType flavorDataObject
;
2116 if (::GetFlavorType(dragRef
,itemRef
,indexFlavor
,&flavorDataObject
) == noErr
) // GetFlavorType uses a 1 based index!
2117 switch (flavorDataObject
)
2120 if (textDataObject
== NULL
) // otherwise a 'utxt' flavor has already been found that gets priority compared to the 'TEXT' flavor
2122 // variable definitions:
2123 Size nativeDataSize
;
2124 wxMemoryBuffer nativeData
;
2126 if ((::GetFlavorDataSize(dragRef
,itemRef
,'TEXT',&nativeDataSize
) == noErr
) &&
2127 (::GetFlavorData(dragRef
,itemRef
,'TEXT',nativeData
.GetWriteBuf(nativeDataSize
),&nativeDataSize
,0) == noErr
))
2129 nativeData
.UngetWriteBuf(nativeDataSize
);
2130 textDataObject
= new wxTextDataObject();
2131 if (textDataObject
->SetData(nativeData
.GetDataLen(),nativeData
.GetData()))
2132 dataObject
->Add(textDataObject
);
2135 wxDELETE(textDataObject
);
2142 // variable definition:
2143 Size nativeDataSize
;
2145 if (::GetFlavorDataSize(dragRef
,itemRef
,'utxt',&nativeDataSize
) == noErr
)
2147 CFMutableDataRef draggedData
;
2149 draggedData
= ::CFDataCreateMutable(kCFAllocatorDefault
,nativeDataSize
);
2150 ::CFDataSetLength(draggedData
,nativeDataSize
);
2151 if (::GetFlavorData(dragRef
,itemRef
,'utxt',::CFDataGetMutableBytePtr(draggedData
),&nativeDataSize
,0) == noErr
)
2153 // convert internally used UTF-16 representation to a UTF-8 representation:
2155 CFStringRef osxString
;
2157 osxString
= ::CFStringCreateFromExternalRepresentation(kCFAllocatorDefault
,draggedData
,kCFStringEncodingUTF16
); // BOM character is handled by this function automatically
2158 osxData
= ::CFStringCreateExternalRepresentation(kCFAllocatorDefault
,osxString
,kCFStringEncodingUTF8
,32);
2159 if (textDataObject
== NULL
)
2161 textDataObject
= new wxTextDataObject();
2162 if (textDataObject
->SetData(::CFDataGetLength(osxData
),::CFDataGetBytePtr(osxData
)))
2163 dataObject
->Add(textDataObject
);
2166 wxDELETE(textDataObject
);
2169 else // overwrite data because the 'utxt' flavor has priority over the 'TEXT' flavor
2170 (void) textDataObject
->SetData(::CFDataGetLength(osxData
),::CFDataGetBytePtr(osxData
));
2172 ::CFRelease(osxData
);
2173 ::CFRelease(osxString
);
2176 ::CFRelease(draggedData
);
2191 wxDataViewColumn
* wxMacDataViewDataBrowserListViewControl::GetColumnPtr(DataBrowserPropertyID propertyID
) const
2193 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(GetWXPeer()));
2195 if (dataViewCtrlPtr
!= NULL
)
2197 size_t const noOfColumns
= dataViewCtrlPtr
->GetColumnCount();
2199 for (size_t i
=0; i
<noOfColumns
; ++i
)
2200 if (dataViewCtrlPtr
->GetColumnPtr(i
)->GetNativeData()->GetPropertyID() == propertyID
)
2201 return dataViewCtrlPtr
->GetColumnPtr(i
);
2206 // ---------------------------------------------------------
2207 // wxDataViewRenderer
2208 // ---------------------------------------------------------
2209 wxDataViewRenderer::wxDataViewRenderer(wxString
const& varianttype
, wxDataViewCellMode mode
, int align
)
2210 :wxDataViewRendererBase(varianttype
,mode
,align
), m_alignment(align
), m_mode(mode
), m_NativeDataPtr(NULL
)
2214 wxDataViewRenderer::~wxDataViewRenderer()
2216 delete m_NativeDataPtr
;
2219 void wxDataViewRenderer::SetAlignment(int align
)
2221 m_alignment
= align
;
2227 // get the browser control or NULL if anything went wrong (it's not supposed to
2228 // so we assert if it did)
2229 wxMacDataViewDataBrowserListViewControl
*
2230 GetBrowserFromCol(wxDataViewColumn
*col
)
2232 wxCHECK_MSG( col
, NULL
, "should have a valid column" );
2234 wxDataViewCtrl
* const dvc
= col
->GetOwner();
2235 wxCHECK_MSG( dvc
, NULL
, "column must be associated with the control" );
2237 return static_cast<wxMacDataViewDataBrowserListViewControl
*>(dvc
->GetPeer());
2240 } // anonymous namespace
2242 void wxDataViewRenderer::SetMode(wxDataViewCellMode mode
)
2244 wxDataViewColumn
* const col
= GetOwner();
2245 wxMacDataViewDataBrowserListViewControl
* const
2246 browser
= GetBrowserFromCol(col
);
2247 wxCHECK_RET( browser
, "must be fully initialized" );
2249 const DataBrowserPropertyID colID
= col
->GetNativeData()->GetPropertyID();
2251 DataBrowserPropertyFlags flags
;
2252 verify_noerr( browser
->GetPropertyFlags(colID
, &flags
) );
2254 if ( (mode
== wxDATAVIEW_CELL_EDITABLE
) ||
2255 (mode
== wxDATAVIEW_CELL_ACTIVATABLE
) )
2256 flags
|= kDataBrowserPropertyIsEditable
;
2258 flags
&= ~kDataBrowserPropertyIsEditable
;
2260 verify_noerr( browser
->SetPropertyFlags(colID
, flags
) );
2263 void wxDataViewRenderer::EnableEllipsize(wxEllipsizeMode mode
)
2265 wxDataViewColumn
* const col
= GetOwner();
2267 wxMacDataViewDataBrowserListViewControl
* const
2268 browser
= GetBrowserFromCol(col
);
2269 wxCHECK_RET( browser
, "must be fully initialized" );
2271 const DataBrowserPropertyID colID
= col
->GetNativeData()->GetPropertyID();
2273 DataBrowserPropertyFlags flags
;
2274 browser
->GetPropertyFlags(colID
, &flags
);
2276 flags
&= ~(kDataBrowserDoNotTruncateText
|
2277 kDataBrowserTruncateTextAtStart
|
2278 kDataBrowserTruncateTextMiddle
|
2279 kDataBrowserTruncateTextAtEnd
);
2284 case wxELLIPSIZE_NONE
:
2285 flagToSet
= kDataBrowserDoNotTruncateText
;
2288 case wxELLIPSIZE_START
:
2289 flagToSet
= kDataBrowserTruncateTextAtStart
;
2292 case wxELLIPSIZE_MIDDLE
:
2293 flagToSet
= kDataBrowserTruncateTextMiddle
;
2296 case wxELLIPSIZE_END
:
2297 flagToSet
= kDataBrowserTruncateTextAtEnd
;
2301 wxCHECK_RET( flagToSet
, "unknown wxEllipsizeMode value" );
2304 verify_noerr( browser
->SetPropertyFlags(colID
, flags
) );
2307 wxEllipsizeMode
wxDataViewRenderer::GetEllipsizeMode() const
2309 wxDataViewColumn
* const col
= GetOwner();
2311 wxMacDataViewDataBrowserListViewControl
* const
2312 browser
= GetBrowserFromCol(col
);
2313 wxCHECK_MSG( browser
, wxELLIPSIZE_NONE
, "must be fully initialized" );
2315 const DataBrowserPropertyID colID
= col
->GetNativeData()->GetPropertyID();
2317 DataBrowserPropertyFlags flags
;
2318 browser
->GetPropertyFlags(colID
, &flags
);
2320 if ( flags
& kDataBrowserDoNotTruncateText
)
2321 return wxELLIPSIZE_NONE
;
2322 if ( flags
& kDataBrowserTruncateTextAtStart
)
2323 return wxELLIPSIZE_START
;
2324 if ( flags
& kDataBrowserTruncateTextAtEnd
)
2325 return wxELLIPSIZE_END
;
2327 // kDataBrowserTruncateTextMiddle == 0 so there is no need to test for it
2328 return wxELLIPSIZE_MIDDLE
;
2331 void wxDataViewRenderer::SetNativeData(wxDataViewRendererNativeData
* newNativeDataPtr
)
2333 delete m_NativeDataPtr
;
2334 m_NativeDataPtr
= newNativeDataPtr
;
2337 IMPLEMENT_ABSTRACT_CLASS(wxDataViewRenderer
,wxDataViewRendererBase
)
2339 // ---------------------------------------------------------
2340 // wxDataViewCustomRenderer
2341 // ---------------------------------------------------------
2342 wxDataViewCustomRenderer::wxDataViewCustomRenderer(wxString
const& varianttype
, wxDataViewCellMode mode
, int align
)
2343 :wxDataViewCustomRendererBase(varianttype
,mode
,align
),
2344 m_editorCtrlPtr(NULL
),
2347 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserCustomType
));
2350 bool wxDataViewCustomRenderer::MacRender()
2355 IMPLEMENT_ABSTRACT_CLASS(wxDataViewCustomRenderer
, wxDataViewRenderer
)
2357 // ---------------------------------------------------------
2358 // wxDataViewTextRenderer
2359 // ---------------------------------------------------------
2360 wxDataViewTextRenderer::wxDataViewTextRenderer(wxString
const& varianttype
, wxDataViewCellMode mode
, int align
)
2361 :wxDataViewRenderer(varianttype
,mode
,align
)
2363 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserTextType
));
2366 bool wxDataViewTextRenderer::MacRender()
2368 wxCHECK_MSG(GetValue().GetType() == GetVariantType(),false,wxString(_("Text renderer cannot render value; value type: ")) << GetValue().GetType());
2370 wxCFStringRef
cfString(GetValue().GetString(),(GetView()->GetFont().IsOk() ? GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
2371 return (::SetDataBrowserItemDataText(GetNativeData()->GetItemDataRef(),cfString
) == noErr
);
2374 IMPLEMENT_CLASS(wxDataViewTextRenderer
,wxDataViewRenderer
)
2376 // ---------------------------------------------------------
2377 // wxDataViewBitmapRenderer
2378 // ---------------------------------------------------------
2379 wxDataViewBitmapRenderer::wxDataViewBitmapRenderer(wxString
const& varianttype
, wxDataViewCellMode mode
, int align
)
2380 :wxDataViewRenderer(varianttype
,mode
,align
)
2382 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserIconType
));
2385 bool wxDataViewBitmapRenderer::MacRender()
2386 // This method returns 'true' if
2387 // - the passed bitmap is valid and it could be assigned to the native data browser;
2388 // - the passed bitmap is invalid (or is not initialized); this case simulates a non-existing bitmap.
2389 // In all other cases the method returns 'false'.
2391 wxCHECK_MSG(GetValue().GetType() == GetVariantType(),false,wxString(_("Bitmap renderer cannot render value; value type: ")) << GetValue().GetType());
2395 bitmap
<< GetValue();
2396 return (!(bitmap
.IsOk()) || (::SetDataBrowserItemDataIcon(GetNativeData()->GetItemDataRef(),bitmap
.GetIconRef()) == noErr
));
2399 IMPLEMENT_CLASS(wxDataViewBitmapRenderer
,wxDataViewRenderer
)
2401 // ---------------------------------------------------------
2402 // wxDataViewIconTextRenderer
2403 // ---------------------------------------------------------
2404 wxDataViewIconTextRenderer::wxDataViewIconTextRenderer(
2405 const wxString
& varianttype
,
2406 wxDataViewCellMode mode
,
2407 int WXUNUSED(align
))
2408 :wxDataViewRenderer(varianttype
,mode
)
2410 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserIconAndTextType
));
2413 bool wxDataViewIconTextRenderer::MacRender()
2415 wxCHECK_MSG(GetValue().GetType() == GetVariantType(),false,wxString(_("Icon & text renderer cannot render value; value type: ")) << GetValue().GetType());
2417 wxDataViewIconText iconText
;
2419 iconText
<< GetValue();
2421 wxCFStringRef
cfString(iconText
.GetText(),(GetView()->GetFont().IsOk() ? GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
2423 if (iconText
.GetIcon().IsOk())
2424 if (::SetDataBrowserItemDataIcon(GetNativeData()->GetItemDataRef(),MAC_WXHICON(iconText
.GetIcon().GetHICON())) != noErr
)
2426 return (::SetDataBrowserItemDataText(GetNativeData()->GetItemDataRef(),cfString
) == noErr
);
2429 IMPLEMENT_ABSTRACT_CLASS(wxDataViewIconTextRenderer
,wxDataViewRenderer
)
2432 // ---------------------------------------------------------
2433 // wxDataViewToggleRenderer
2434 // ---------------------------------------------------------
2435 wxDataViewToggleRenderer::wxDataViewToggleRenderer(
2436 const wxString
& varianttype
,
2437 wxDataViewCellMode mode
,
2438 int WXUNUSED(align
))
2439 :wxDataViewRenderer(varianttype
,mode
)
2441 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserCheckboxType
));
2444 bool wxDataViewToggleRenderer::MacRender()
2446 wxCHECK_MSG(GetValue().GetType() == GetVariantType(),false,wxString(_("Toggle renderer cannot render value; value type: ")) << GetValue().GetType());
2447 return (::SetDataBrowserItemDataButtonValue(GetNativeData()->GetItemDataRef(),GetValue().GetBool()) == noErr
);
2450 IMPLEMENT_ABSTRACT_CLASS(wxDataViewToggleRenderer
,wxDataViewRenderer
)
2452 // ---------------------------------------------------------
2453 // wxDataViewProgressRenderer
2454 // ---------------------------------------------------------
2455 wxDataViewProgressRenderer::wxDataViewProgressRenderer(
2456 const wxString
& WXUNUSED(label
),
2457 wxString
const& varianttype
,
2458 wxDataViewCellMode mode
,
2460 :wxDataViewRenderer(varianttype
,mode
,align
)
2462 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserProgressBarType
));
2465 bool wxDataViewProgressRenderer::MacRender()
2467 wxCHECK_MSG(GetValue().GetType() == GetVariantType(),false,wxString(_("Progress renderer cannot render value type; value type: ")) << GetValue().GetType());
2468 return ((::SetDataBrowserItemDataMinimum(GetNativeData()->GetItemDataRef(), 0) == noErr
) &&
2469 (::SetDataBrowserItemDataMaximum(GetNativeData()->GetItemDataRef(),100) == noErr
) &&
2470 (::SetDataBrowserItemDataValue (GetNativeData()->GetItemDataRef(),GetValue().GetLong()) == noErr
));
2473 IMPLEMENT_ABSTRACT_CLASS(wxDataViewProgressRenderer
,wxDataViewRenderer
)
2475 // ---------------------------------------------------------
2476 // wxDataViewDateRenderer
2477 // ---------------------------------------------------------
2478 wxDataViewDateRenderer::wxDataViewDateRenderer(wxString
const& varianttype
, wxDataViewCellMode mode
, int align
)
2479 :wxDataViewRenderer(varianttype
,mode
,align
)
2481 SetNativeData(new wxDataViewRendererNativeData(kDataBrowserDateTimeType
));
2484 bool wxDataViewDateRenderer::MacRender()
2486 wxCHECK_MSG(GetValue().GetType() == GetVariantType(),false,wxString(_("Date renderer cannot render value; value type: ")) << GetValue().GetType());
2487 return (::SetDataBrowserItemDataDateTime(GetNativeData()->GetItemDataRef(),GetValue().GetDateTime().Subtract(wxDateTime(1,wxDateTime::Jan
,1904)).GetSeconds().GetLo()) == noErr
);
2490 IMPLEMENT_ABSTRACT_CLASS(wxDataViewDateRenderer
,wxDataViewRenderer
)
2492 // ---------------------------------------------------------
2494 // ---------------------------------------------------------
2495 wxDataViewColumn::wxDataViewColumn(const wxString
& title
, wxDataViewRenderer
* renderer
, unsigned int model_column
, int width
, wxAlignment align
, int flags
)
2496 :wxDataViewColumnBase(renderer
, model_column
), m_NativeDataPtr(new wxDataViewColumnNativeData()), m_title(title
)
2498 InitCommon(width
, align
, flags
);
2499 if ((renderer
!= NULL
) && !renderer
->IsCustomRenderer() &&
2500 (renderer
->GetAlignment() == wxDVR_DEFAULT_ALIGNMENT
))
2501 renderer
->SetAlignment(align
);
2504 wxDataViewColumn::wxDataViewColumn(const wxBitmap
& bitmap
, wxDataViewRenderer
* renderer
, unsigned int model_column
, int width
, wxAlignment align
, int flags
)
2505 :wxDataViewColumnBase(bitmap
, renderer
, model_column
), m_NativeDataPtr(new wxDataViewColumnNativeData())
2507 InitCommon(width
, align
, flags
);
2508 if ((renderer
!= NULL
) && !renderer
->IsCustomRenderer() &&
2509 (renderer
->GetAlignment() == wxDVR_DEFAULT_ALIGNMENT
))
2510 renderer
->SetAlignment(align
);
2513 wxDataViewColumn::~wxDataViewColumn()
2515 delete m_NativeDataPtr
;
2518 int wxDataViewColumn::GetWidth() const
2520 // FIXME: This returns the last programmatically set width and will not work if
2521 // the user changes the column's width by dragging it with the mouse.
2525 bool wxDataViewColumn::IsSortKey() const
2527 wxDataViewCtrl
* const dataViewCtrlPtr(GetOwner());
2528 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(
2529 dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(
2530 dataViewCtrlPtr
->GetPeer()));
2532 DataBrowserPropertyID propertyID
;
2533 return (macDataViewListCtrlPtr
->GetSortProperty(&propertyID
) == noErr
) &&
2534 (propertyID
== GetNativeData()->GetPropertyID());
2537 void wxDataViewColumn::SetAlignment(wxAlignment align
)
2539 wxDataViewCtrl
* dataViewCtrlPtr(GetOwner());
2542 m_alignment
= align
;
2543 if (dataViewCtrlPtr
!= NULL
)
2545 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
2547 if (macDataViewListCtrlPtr
!= NULL
)
2549 DataBrowserListViewHeaderDesc headerDescription
;
2551 wxCHECK_RET(macDataViewListCtrlPtr
->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
) == noErr
,_("Could not get header description."));
2554 case wxALIGN_CENTER
:
2555 case wxALIGN_CENTER_HORIZONTAL
:
2556 headerDescription
.btnFontStyle
.just
= teCenter
;
2559 headerDescription
.btnFontStyle
.just
= teFlushLeft
;
2562 headerDescription
.btnFontStyle
.just
= teFlushRight
;
2565 headerDescription
.btnFontStyle
.just
= teFlushDefault
;
2567 wxCHECK_RET(macDataViewListCtrlPtr
->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
) == noErr
,_("Could not set alignment."));
2572 void wxDataViewColumn::SetBitmap(wxBitmap
const& bitmap
)
2574 wxDataViewCtrl
* dataViewCtrlPtr(GetOwner());
2577 wxDataViewColumnBase::SetBitmap(bitmap
);
2578 if (dataViewCtrlPtr
!= NULL
)
2580 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
2582 if (macDataViewListCtrlPtr
!= NULL
)
2584 DataBrowserListViewHeaderDesc headerDescription
;
2586 wxCHECK_RET(macDataViewListCtrlPtr
->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
) == noErr
,_("Could not get header description."));
2587 if (GetBitmap().IsOk())
2588 headerDescription
.btnContentInfo
.u
.iconRef
= GetBitmap().GetIconRef();
2590 headerDescription
.btnContentInfo
.u
.iconRef
= NULL
;
2591 wxCHECK_RET(macDataViewListCtrlPtr
->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
) == noErr
,_("Could not set icon."));
2596 void wxDataViewColumn::SetMaxWidth(int maxWidth
)
2598 wxDataViewCtrl
* dataViewCtrlPtr(GetOwner());
2601 m_maxWidth
= maxWidth
;
2602 if (dataViewCtrlPtr
!= NULL
)
2604 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
2606 if (macDataViewListCtrlPtr
!= NULL
)
2608 DataBrowserListViewHeaderDesc headerDescription
;
2610 wxCHECK_RET(macDataViewListCtrlPtr
->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
) == noErr
,_("Could not get header description."));
2611 headerDescription
.maximumWidth
= static_cast<UInt16
>(maxWidth
);
2612 wxCHECK_RET(macDataViewListCtrlPtr
->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
) == noErr
,_("Could not set maximum width."));
2617 void wxDataViewColumn::SetMinWidth(int minWidth
)
2619 wxDataViewCtrl
* dataViewCtrlPtr(GetOwner());
2622 m_minWidth
= minWidth
;
2623 if (dataViewCtrlPtr
!= NULL
)
2625 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
2627 if (macDataViewListCtrlPtr
!= NULL
)
2629 DataBrowserListViewHeaderDesc headerDescription
;
2631 wxCHECK_RET(macDataViewListCtrlPtr
->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
) == noErr
,_("Could not get header description."));
2632 headerDescription
.minimumWidth
= static_cast<UInt16
>(minWidth
);
2633 wxCHECK_RET(macDataViewListCtrlPtr
->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
) == noErr
,_("Could not set minimum width."));
2638 void wxDataViewColumn::SetReorderable(bool reorderable
)
2640 // first set the internal flag of the column:
2642 m_flags
|= wxDATAVIEW_COL_REORDERABLE
;
2644 m_flags
&= ~wxDATAVIEW_COL_REORDERABLE
;
2645 // if the column is associated with a control change also immediately the flags of the control:
2646 wxDataViewCtrl
* dataViewCtrlPtr(GetOwner());
2648 if (dataViewCtrlPtr
!= NULL
)
2650 DataBrowserPropertyFlags flags
;
2651 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
2653 wxCHECK_RET(macDataViewListCtrlPtr
!= NULL
, _("Valid pointer to native data view control does not exist"));
2654 wxCHECK_RET(macDataViewListCtrlPtr
->GetPropertyFlags(GetNativeData()->GetPropertyID(),&flags
) == noErr
,_("Could not get property flags."));
2656 flags
|= kDataBrowserListViewMovableColumn
;
2658 flags
&= ~kDataBrowserListViewMovableColumn
;
2659 wxCHECK_RET(macDataViewListCtrlPtr
->SetPropertyFlags(GetNativeData()->GetPropertyID(),flags
) == noErr
,_("Could not set property flags."));
2663 void wxDataViewColumn::SetResizeable(bool resizable
)
2665 // first set the internal flag of the column:
2667 m_flags
|= wxDATAVIEW_COL_RESIZABLE
;
2669 m_flags
&= ~wxDATAVIEW_COL_RESIZABLE
;
2670 // if the column is associated with a control change also immediately the flags of the control:
2671 wxDataViewCtrl
* dataViewCtrlPtr(GetOwner());
2673 if (dataViewCtrlPtr
!= NULL
)
2675 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
2677 if (macDataViewListCtrlPtr
!= NULL
)
2679 DataBrowserListViewHeaderDesc headerDescription
;
2681 verify_noerr(macDataViewListCtrlPtr
->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
));
2684 if (GetMinWidth() >= GetMaxWidth())
2689 headerDescription
.minimumWidth
= m_minWidth
;
2690 headerDescription
.maximumWidth
= m_maxWidth
;
2694 headerDescription
.minimumWidth
= m_width
;
2695 headerDescription
.maximumWidth
= m_width
;
2697 verify_noerr(macDataViewListCtrlPtr
->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
));
2698 macDataViewListCtrlPtr
->SetSortProperty(GetNativeData()->GetPropertyID());
2703 void wxDataViewColumn::SetSortable(bool sortable
)
2705 // first set the internal flag of the column:
2707 m_flags
|= wxDATAVIEW_COL_SORTABLE
;
2709 m_flags
&= ~wxDATAVIEW_COL_SORTABLE
;
2710 // if the column is associated with a control change also immediately the flags of the control:
2711 wxDataViewCtrl
* dataViewCtrlPtr(GetOwner());
2713 if (dataViewCtrlPtr
!= NULL
)
2715 DataBrowserPropertyFlags flags
;
2716 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
2718 wxCHECK_RET(macDataViewListCtrlPtr
!= NULL
, _("Valid pointer to native data view control does not exist"));
2719 wxCHECK_RET(macDataViewListCtrlPtr
->GetPropertyFlags(GetNativeData()->GetPropertyID(),&flags
) == noErr
,_("Could not get property flags."));
2721 flags
|= kDataBrowserListViewSortableColumn
;
2723 flags
&= ~kDataBrowserListViewSortableColumn
;
2724 wxCHECK_RET(macDataViewListCtrlPtr
->SetPropertyFlags(GetNativeData()->GetPropertyID(),flags
) == noErr
,_("Could not set property flags."));
2728 void wxDataViewColumn::SetSortOrder(bool ascending
)
2730 wxDataViewCtrl
* dataViewCtrlPtr(GetOwner());
2733 m_ascending
= ascending
;
2734 if (dataViewCtrlPtr
!= NULL
)
2736 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
2738 if (macDataViewListCtrlPtr
!= NULL
)
2740 DataBrowserListViewHeaderDesc headerDescription
;
2742 verify_noerr(macDataViewListCtrlPtr
->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
));
2744 headerDescription
.initialOrder
= kDataBrowserOrderIncreasing
;
2746 headerDescription
.initialOrder
= kDataBrowserOrderDecreasing
;
2747 verify_noerr(macDataViewListCtrlPtr
->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
));
2748 macDataViewListCtrlPtr
->SetSortProperty(GetNativeData()->GetPropertyID());
2753 void wxDataViewColumn::SetTitle(wxString
const& title
)
2755 wxDataViewCtrl
* dataViewCtrlPtr(GetOwner());
2759 if (dataViewCtrlPtr
!= NULL
)
2761 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
2763 if (macDataViewListCtrlPtr
!= NULL
)
2765 DataBrowserListViewHeaderDesc headerDescription
;
2766 wxCFStringRef
cfTitle(title
,(dataViewCtrlPtr
->GetFont().IsOk() ? dataViewCtrlPtr
->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
2768 wxCHECK_RET(macDataViewListCtrlPtr
->GetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
) == noErr
,_("Could not get header description."));
2769 headerDescription
.titleString
= cfTitle
;
2770 wxCHECK_RET(macDataViewListCtrlPtr
->SetHeaderDesc(GetNativeData()->GetPropertyID(),&headerDescription
) == noErr
,_("Could not set header description."));
2775 void wxDataViewColumn::SetWidth(int width
)
2777 wxDataViewCtrl
* dataViewCtrlPtr(GetOwner());
2781 case wxCOL_WIDTH_AUTOSIZE
:
2782 // not implemented, fall through
2783 case wxCOL_WIDTH_DEFAULT
:
2784 width
= wxDVC_DEFAULT_WIDTH
;
2790 if ((width
>= m_minWidth
) && (width
<= m_maxWidth
))
2793 if (dataViewCtrlPtr
!= NULL
)
2795 wxMacDataViewDataBrowserListViewControlPointer
macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(dataViewCtrlPtr
->GetPeer()));
2797 if (macDataViewListCtrlPtr
!= NULL
)
2798 wxCHECK_RET(macDataViewListCtrlPtr
->SetColumnWidth(GetNativeData()->GetPropertyID(),static_cast<UInt16
>(width
)) == noErr
,_("Could not set column width."));
2803 void wxDataViewColumn::SetHidden(bool WXUNUSED(hidden
))
2808 bool wxDataViewColumn::IsHidden() const
2814 void wxDataViewColumn::SetNativeData(wxDataViewColumnNativeData
* newNativeDataPtr
)
2816 delete m_NativeDataPtr
;
2817 m_NativeDataPtr
= newNativeDataPtr
;
2820 #endif // wxUSE_DATAVIEWCTRL && !wxUSE_GENERICDATAVIEWCTRL