1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/mac/carbon/databrow.cpp
3 // Purpose: Classes and functions for the Carbon data browser
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #include "wx/wxprec.h"
14 #ifndef wxUSE_GENERICDATAVIEWCTRL
18 #include "wx/toplevel.h"
20 #include "wx/settings.h"
24 #include "wx/dataview.h"
25 #include "wx/mac/carbon/databrow.h"
26 #include "wx/mac/private.h"
27 #include "wx/mac/uma.h"
31 // ============================================================================
32 // Variables used globally in databrow.cpp
33 // ============================================================================
34 DataBrowserGetContextualMenuUPP gDataBrowserTableViewGetContextualMenuUPP
= NULL
;
35 DataBrowserItemCompareUPP gDataBrowserTableViewItemCompareUPP
= NULL
;
36 DataBrowserItemDataUPP gDataBrowserTableViewItemDataUPP
= NULL
;
37 DataBrowserItemNotificationUPP gDataBrowserTableViewItemNotificationUPP
= NULL
;
39 DataBrowserDrawItemUPP gDataBrowserTableViewDrawItemUPP
= NULL
;
40 DataBrowserEditItemUPP gDataBrowserTableViewEditItemUPP
= NULL
;
41 DataBrowserHitTestUPP gDataBrowserTableViewHitTestUPP
= NULL
;
42 DataBrowserTrackingUPP gDataBrowserTableViewTrackingUPP
= NULL
;
44 // ============================================================================
45 // wxMacDataBrowserTableViewControl
46 // ============================================================================
48 pascal Boolean
wxMacDataBrowserTableViewControl::DataBrowserCompareProc(ControlRef browser
, DataBrowserItemID itemOneID
, DataBrowserItemID itemTwoID
, DataBrowserPropertyID sortProperty
)
50 wxMacDataBrowserTableViewControl
* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
53 if (ControlPtr
!= NULL
)
54 return ControlPtr
->DataBrowserCompareProc(itemOneID
,itemTwoID
,sortProperty
);
56 return errDataBrowserPropertyNotSupported
;
57 } /* wxMacDataBrowserTableViewControl::DataBrowserCompareProc(ControlRef, DataBrowserItemID, DataBrowserItemID, DataBrowserPropertyID) */
59 pascal void wxMacDataBrowserTableViewControl::DataBrowserGetContextualMenuProc(ControlRef browser
, MenuRef
* menu
, UInt32
* helpType
, CFStringRef
* helpItemString
, AEDesc
* selection
)
61 wxMacDataBrowserTableViewControl
* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
64 if (ControlPtr
!= NULL
)
65 ControlPtr
->DataBrowserGetContextualMenuProc(menu
,helpType
,helpItemString
,selection
);
66 } /* wxMacDataBrowserTableViewControl::DataBrowserGetContextualMenuProc(ControlRef, MenuRef*, UInt32*, CFStringRef*, AEDesc*) */
68 pascal OSStatus
wxMacDataBrowserTableViewControl::DataBrowserGetSetItemDataProc(ControlRef browser
, DataBrowserItemID itemID
, DataBrowserPropertyID propertyID
, DataBrowserItemDataRef itemData
, Boolean getValue
)
70 wxMacDataBrowserTableViewControl
* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
73 if (ControlPtr
!= NULL
)
74 return ControlPtr
->DataBrowserGetSetItemDataProc(itemID
,propertyID
,itemData
,getValue
);
76 return errDataBrowserPropertyNotSupported
;
77 } /* wxMacDataBrowserTableViewControl::DataBrowserGetSetItemDataProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemDataRef, Boolean) */
79 pascal void wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc(ControlRef browser
, DataBrowserItemID itemID
, DataBrowserItemNotification message
, DataBrowserItemDataRef itemData
)
81 wxMacDataBrowserTableViewControl
* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
84 if (ControlPtr
!= NULL
)
85 ControlPtr
->DataBrowserItemNotificationProc(itemID
,message
,itemData
);
86 } /* wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc(ControlRef, DataBrowserItemID, DataBrowserItemNotification, DataBrowserItemDataRef) */
88 pascal void wxMacDataBrowserTableViewControl::DataBrowserDrawItemProc(ControlRef browser
, DataBrowserItemID itemID
, DataBrowserPropertyID propertyID
, DataBrowserItemState state
, Rect
const* rectangle
, SInt16 bitDepth
, Boolean colorDevice
)
90 wxMacDataBrowserTableViewControl
* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
93 if (ControlPtr
!= NULL
)
94 ControlPtr
->DataBrowserDrawItemProc(itemID
,propertyID
,state
,rectangle
,bitDepth
,colorDevice
);
95 } /* wxMacDataBrowserTableViewControl::DataBrowserDrawItemProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemState, Rect const*, SInt16, Boolean) */
97 pascal Boolean
wxMacDataBrowserTableViewControl::DataBrowserEditItemProc(ControlRef browser
, DataBrowserItemID itemID
, DataBrowserPropertyID propertyID
, CFStringRef theString
, Rect
* maxEditTextRect
, Boolean
* shrinkToFit
)
99 wxMacDataBrowserTableViewControl
* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
102 return ((ControlPtr
!= NULL
) && ControlPtr
->DataBrowserEditItemProc(itemID
,propertyID
,theString
,maxEditTextRect
,shrinkToFit
));
103 } /* wxMacDataBrowserTableViewControl::DataBrowserEditItemProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, CFStringRef, Rect*, Boolean*) */
105 pascal Boolean
wxMacDataBrowserTableViewControl::DataBrowserHitTestProc(ControlRef browser
, DataBrowserItemID itemID
, DataBrowserPropertyID propertyID
, Rect
const* theRect
, Rect
const* mouseRect
)
107 wxMacDataBrowserTableViewControl
* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
110 return ((ControlPtr
!= NULL
) && ControlPtr
->DataBrowserHitTestProc(itemID
,propertyID
,theRect
,mouseRect
));
111 } /* wxMacDataBrowserTableViewControl::DataBrowserHitTestProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, Rect const*, Rect const*) */
113 pascal DataBrowserTrackingResult
wxMacDataBrowserTableViewControl::DataBrowserTrackingProc(ControlRef browser
, DataBrowserItemID itemID
, DataBrowserPropertyID propertyID
, Rect
const* theRect
, Point startPt
, EventModifiers modifiers
)
115 wxMacDataBrowserTableViewControl
* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl
*>(wxMacControl::GetReferenceFromNativeControl(browser
)));
118 if (ControlPtr
!= NULL
)
119 return ControlPtr
->DataBrowserTrackingProc(itemID
,propertyID
,theRect
,startPt
,modifiers
);
121 return kDataBrowserNothingHit
;
122 } /* wxMacDataBrowserTableViewControl::DataBrowserTrackingProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, Rect const*, Point, EventModifiers) */
124 wxMacDataBrowserTableViewControl::wxMacDataBrowserTableViewControl(wxWindow
* peer
, wxPoint
const& pos
, wxSize
const& size
, long style
)
127 Rect bounds
= wxMacGetBoundsForControl(peer
,pos
,size
);
128 OSStatus err
= ::CreateDataBrowserControl(MAC_WXHWND(peer
->MacGetTopLevelWindowRef()),&bounds
,kDataBrowserListView
,&(this->m_controlRef
));
131 SetReferenceInNativeControl();
133 // setup standard callbacks:
134 if (gDataBrowserTableViewGetContextualMenuUPP
== NULL
) gDataBrowserTableViewGetContextualMenuUPP
= NewDataBrowserGetContextualMenuUPP(wxMacDataBrowserTableViewControl::DataBrowserGetContextualMenuProc
);
135 if (gDataBrowserTableViewItemCompareUPP
== NULL
) gDataBrowserTableViewItemCompareUPP
= NewDataBrowserItemCompareUPP (wxMacDataBrowserTableViewControl::DataBrowserCompareProc
);
136 if (gDataBrowserTableViewItemDataUPP
== NULL
) gDataBrowserTableViewItemDataUPP
= NewDataBrowserItemDataUPP (wxMacDataBrowserTableViewControl::DataBrowserGetSetItemDataProc
);
137 if (gDataBrowserTableViewItemNotificationUPP
== NULL
)
139 gDataBrowserTableViewItemNotificationUPP
=
140 #if TARGET_API_MAC_OSX
141 (DataBrowserItemNotificationUPP
) NewDataBrowserItemNotificationWithItemUPP(wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc
);
143 NewDataBrowserItemNotificationUPP(wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc
);
146 DataBrowserCallbacks callbacks
; // variable definition
148 InitializeDataBrowserCallbacks(&callbacks
,kDataBrowserLatestCallbacks
);
149 callbacks
.u
.v1
.getContextualMenuCallback
= gDataBrowserTableViewGetContextualMenuUPP
;
150 callbacks
.u
.v1
.itemDataCallback
= gDataBrowserTableViewItemDataUPP
;
151 callbacks
.u
.v1
.itemCompareCallback
= gDataBrowserTableViewItemCompareUPP
;
152 callbacks
.u
.v1
.itemNotificationCallback
= gDataBrowserTableViewItemNotificationUPP
;
153 this->SetCallbacks(&callbacks
);
155 // setup callbacks for customized items:
156 if (gDataBrowserTableViewDrawItemUPP
== NULL
) gDataBrowserTableViewDrawItemUPP
= NewDataBrowserDrawItemUPP(wxMacDataBrowserTableViewControl::DataBrowserDrawItemProc
);
157 if (gDataBrowserTableViewEditItemUPP
== NULL
) gDataBrowserTableViewEditItemUPP
= NewDataBrowserEditItemUPP(wxMacDataBrowserTableViewControl::DataBrowserEditItemProc
);
158 if (gDataBrowserTableViewHitTestUPP
== NULL
) gDataBrowserTableViewHitTestUPP
= NewDataBrowserHitTestUPP (wxMacDataBrowserTableViewControl::DataBrowserHitTestProc
);
159 if (gDataBrowserTableViewTrackingUPP
== NULL
) gDataBrowserTableViewTrackingUPP
= NewDataBrowserTrackingUPP(wxMacDataBrowserTableViewControl::DataBrowserTrackingProc
);
161 DataBrowserCustomCallbacks customCallbacks
; // variable definition
163 InitializeDataBrowserCustomCallbacks(&customCallbacks
,kDataBrowserLatestCallbacks
);
164 customCallbacks
.u
.v1
.drawItemCallback
= gDataBrowserTableViewDrawItemUPP
;
165 customCallbacks
.u
.v1
.editTextCallback
= gDataBrowserTableViewEditItemUPP
;
166 customCallbacks
.u
.v1
.hitTestCallback
= gDataBrowserTableViewHitTestUPP
;
167 customCallbacks
.u
.v1
.trackingCallback
= gDataBrowserTableViewTrackingUPP
;
168 this->SetCustomCallbacks(&customCallbacks
);
171 this->EnableCellSizeModification();
173 DataBrowserSelectionFlags flags
; // variable definition
175 if (this->GetSelectionFlags(&flags
) == noErr
) // get default settings
177 if ((style
& wxDV_MULTIPLE
) != 0)
178 flags
&= ~kDataBrowserSelectOnlyOne
;
180 flags
|= kDataBrowserSelectOnlyOne
;
181 (void) this->SetSelectionFlags(flags
);
184 OptionBits attributes
; // variable definition
186 if (this->GetAttributes(&attributes
) == noErr
) // get default settings
188 if ((style
& wxDV_VERT_RULES
) != 0)
189 attributes
|= kDataBrowserAttributeListViewDrawColumnDividers
;
191 attributes
&= ~kDataBrowserAttributeListViewDrawColumnDividers
;
192 if ((style
& wxDV_ROW_LINES
) != 0)
193 attributes
|= kDataBrowserAttributeListViewAlternatingRowColors
;
195 attributes
&= ~kDataBrowserAttributeListViewAlternatingRowColors
;
196 (void) this->SetAttributes(attributes
);
199 if ((style
& wxDV_NO_HEADER
) != 0)
200 this->SetHeaderButtonHeight(0);
201 } /* wxMacDataBrowserTableViewControl::wxMacDataBrowserTableViewControl(wxWindow*, wxPoint const&, wxSize const&, long) */
206 OSStatus
wxMacDataBrowserTableViewControl::SetCallbacks(DataBrowserCallbacks
const* callbacks
)
208 return ::SetDataBrowserCallbacks(this->m_controlRef
,callbacks
);
209 } /* wxMacDataBrowserTableViewControl::SetCallbacks(DataBrowserCallbacks const*) */
211 OSStatus
wxMacDataBrowserTableViewControl::SetCustomCallbacks(DataBrowserCustomCallbacks
const* customCallbacks
)
213 return ::SetDataBrowserCustomCallbacks(this->m_controlRef
,customCallbacks
);
214 } /* xMacDataBrowserTableViewControl::SetCustomCallbacks(DataBrowserCustomCallbacks const*) */
219 OSStatus
wxMacDataBrowserTableViewControl::GetHeaderDesc(DataBrowserPropertyID propertyID
, DataBrowserListViewHeaderDesc
* desc
) const
221 desc
->version
= kDataBrowserListViewLatestHeaderDesc
; // if this statement is missing the next call will fail (NOT DOCUMENTED!!)
222 return ::GetDataBrowserListViewHeaderDesc(this->m_controlRef
,propertyID
,desc
);
225 OSStatus
wxMacDataBrowserTableViewControl::SetHeaderDesc(DataBrowserPropertyID propertyID
, DataBrowserListViewHeaderDesc
* desc
)
227 return ::SetDataBrowserListViewHeaderDesc(this->m_controlRef
,propertyID
,desc
);
233 OSStatus
wxMacDataBrowserTableViewControl::AutoSizeColumns()
235 return AutoSizeDataBrowserListViewColumns(this->m_controlRef
);
238 OSStatus
wxMacDataBrowserTableViewControl::EnableCellSizeModification(bool enableHeight
, bool enableWidth
)
240 return ::SetDataBrowserTableViewGeometry(this->GetControlRef(),enableWidth
,enableHeight
);
241 } /* wxMacDataBrowserTableViewControl::EnableCellSizeModification(bool, bool) */
243 OSStatus
wxMacDataBrowserTableViewControl::GetAttributes(OptionBits
* attributes
)
245 return ::DataBrowserGetAttributes(this->GetControlRef(),attributes
);
246 } /* wxMacDataBrowserTableViewControl::GetAttributes(OptionBits*) */
248 OSStatus
wxMacDataBrowserTableViewControl::GetColumnWidth(DataBrowserPropertyID propertyID
, UInt16
* width
) const
250 return ::GetDataBrowserTableViewNamedColumnWidth(this->m_controlRef
,propertyID
,width
);
253 OSStatus
wxMacDataBrowserTableViewControl::GetDefaultColumnWidth( UInt16
*width
) const
255 return GetDataBrowserTableViewColumnWidth(this->m_controlRef
, width
);
258 OSStatus
wxMacDataBrowserTableViewControl::GetDefaultRowHeight(UInt16
* height
) const
260 return ::GetDataBrowserTableViewRowHeight(this->m_controlRef
,height
);
263 OSStatus
wxMacDataBrowserTableViewControl::GetHeaderButtonHeight(UInt16
*height
)
265 return ::GetDataBrowserListViewHeaderBtnHeight(this->m_controlRef
,height
);
268 OSStatus
wxMacDataBrowserTableViewControl::GetPartBounds(DataBrowserItemID item
, DataBrowserPropertyID propertyID
, DataBrowserPropertyPart part
, Rect
* bounds
)
270 return ::GetDataBrowserItemPartBounds(this->m_controlRef
,item
,propertyID
,part
,bounds
);
271 } /* wxMacDataBrowserTableViewControl::GetPartBounds(DataBrowserItemID, DataBrowswerPropertyID, DataBrowserPropertyPart, Rect*) */
273 OSStatus
wxMacDataBrowserTableViewControl::GetRowHeight(DataBrowserItemID item
, UInt16
* height
) const
275 return ::GetDataBrowserTableViewItemRowHeight(this->m_controlRef
,item
,height
);
276 } /* wxMacDataBrowserTableViewControl::GetRowHeight(DataBrowserItemID, UInt16*) const */
278 OSStatus
wxMacDataBrowserTableViewControl::GetScrollPosition( UInt32
*top
, UInt32
*left
) const
280 return GetDataBrowserScrollPosition(this->m_controlRef
, top
, left
);
283 OSStatus
wxMacDataBrowserTableViewControl::SetAttributes(OptionBits attributes
)
285 return ::DataBrowserChangeAttributes(this->GetControlRef(),attributes
,~attributes
);
286 } /* wxMacDataBrowserTableViewControl::SetAttributes(OptionBits) */
288 OSStatus
wxMacDataBrowserTableViewControl::SetColumnWidth(DataBrowserPropertyID propertyID
, UInt16 width
)
290 return ::SetDataBrowserTableViewNamedColumnWidth(this->m_controlRef
,propertyID
,width
);
293 OSStatus
wxMacDataBrowserTableViewControl::SetDefaultColumnWidth(UInt16 width
)
295 return ::SetDataBrowserTableViewColumnWidth(this->m_controlRef
,width
);
298 OSStatus
wxMacDataBrowserTableViewControl::SetDefaultRowHeight(UInt16 height
)
300 return ::SetDataBrowserTableViewRowHeight(this->m_controlRef
,height
);
303 OSStatus
wxMacDataBrowserTableViewControl::SetHasScrollBars(bool horiz
, bool vert
)
305 return ::SetDataBrowserHasScrollBars(this->m_controlRef
,horiz
,vert
);
306 } /* wxMacDataBrowserTableViewControl::SetHasScrollBars(bool, bool) */
308 OSStatus
wxMacDataBrowserTableViewControl::SetHeaderButtonHeight(UInt16 height
)
310 return ::SetDataBrowserListViewHeaderBtnHeight(this->m_controlRef
,height
);
311 } /* wxMacDataBrowserTableViewControl::SetHeaderButtonHeight(UInt16) */
313 OSStatus
wxMacDataBrowserTableViewControl::SetHiliteStyle(DataBrowserTableViewHiliteStyle hiliteStyle
)
315 return ::SetDataBrowserTableViewHiliteStyle(this->m_controlRef
,hiliteStyle
);
316 } /*wxMacDataBrowserTableViewControl::SetHiliteStyle(DataBrowserTableViewHiliteStyle) */
318 OSStatus
wxMacDataBrowserTableViewControl::SetIndent(float Indent
)
320 return ::DataBrowserSetMetric(this->m_controlRef
,kDataBrowserMetricDisclosureColumnPerDepthGap
,true,Indent
);
321 } /* wxMacDataBrowserTableViewControl::SetIndent(float* Indent) */
323 OSStatus
wxMacDataBrowserTableViewControl::SetRowHeight(DataBrowserItemID item
, UInt16 height
)
325 return ::SetDataBrowserTableViewItemRowHeight(this->m_controlRef
,item
,height
);
328 OSStatus
wxMacDataBrowserTableViewControl::SetScrollPosition(UInt32 top
, UInt32 left
)
330 return ::SetDataBrowserScrollPosition(this->m_controlRef
,top
,left
);
336 OSStatus
wxMacDataBrowserTableViewControl::GetColumnCount(UInt32
* numColumns
) const
338 return ::GetDataBrowserTableViewColumnCount(this->m_controlRef
,numColumns
);
341 OSStatus
wxMacDataBrowserTableViewControl::GetColumnIndex(DataBrowserPropertyID propertyID
, DataBrowserTableViewColumnIndex
* index
) const
343 return ::GetDataBrowserTableViewColumnPosition(this->m_controlRef
,propertyID
,index
);
344 } /* wxMacDataBrowserTableViewControl::GetColumnIndex(DataBrowserPropertyID, DataBrowserTableViewColumnIndex*) const */
346 OSStatus
wxMacDataBrowserTableViewControl::GetFreePropertyID(DataBrowserPropertyID
* propertyID
) const
348 for (*propertyID
=kMinPropertyID
; *propertyID
<std::numeric_limits
<DataBrowserPropertyID
>::max(); ++(*propertyID
))
349 if (this->IsUsedPropertyID(*propertyID
) == errDataBrowserPropertyNotFound
)
351 return errDataBrowserPropertyNotSupported
;
352 } /* wxMacDataBrowserTableViewControl::GetFreePropertyID(DataBrowserPropertyID*) const */
354 OSStatus
wxMacDataBrowserTableViewControl::GetPropertyFlags(DataBrowserPropertyID propertyID
, DataBrowserPropertyFlags
*flags
) const
356 return ::GetDataBrowserPropertyFlags(this->m_controlRef
,propertyID
,flags
);
359 OSStatus
wxMacDataBrowserTableViewControl::GetPropertyID(DataBrowserItemDataRef itemData
, DataBrowserPropertyID
* propertyID
)
361 return ::GetDataBrowserItemDataProperty(itemData
,propertyID
);
362 } /* wxMacDataBrowserTableViewControl::GetPropertyID(DataBrowserItemDataRef, DataBrowserPropertyID*) */
364 OSStatus
wxMacDataBrowserTableViewControl::GetPropertyID(DataBrowserTableViewColumnIndex index
, DataBrowserTableViewColumnID
* propertyID
)
366 return ::GetDataBrowserTableViewColumnProperty(this->m_controlRef
,index
,propertyID
);
367 } /* wxMacDataBrowserTableViewControl::GetPropertyID(DataBrowserTableViewColumnIndex, DataBrowserTableViewColumnID*) */
369 OSStatus
wxMacDataBrowserTableViewControl::IsUsedPropertyID(DataBrowserPropertyID propertyID
) const
371 // 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
372 // 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
373 // the column position for the property id:
374 DataBrowserTableViewColumnIndex index
;
376 return ::GetDataBrowserTableViewColumnPosition(this->m_controlRef
,propertyID
,&index
);
377 } /* wxMacDataBrowserTableViewControl::IsUsedPropertyId(DataBrowserPropertyID) const */
379 OSStatus
wxMacDataBrowserTableViewControl::RemoveColumnByProperty(DataBrowserTableViewColumnID propertyID
)
381 return ::RemoveDataBrowserTableViewColumn(this->m_controlRef
,propertyID
);
382 } /* wxMacDataBrowserTableViewControl::RemoveColumnByProperty(DataBrowserTableViewColumnID) */
384 OSStatus
wxMacDataBrowserTableViewControl::RemoveColumnByIndex(DataBrowserTableViewColumnIndex index
)
386 DataBrowserTableViewColumnID propertyID
;
389 this->GetPropertyID(index
,&propertyID
);
390 return ::RemoveDataBrowserTableViewColumn(this->m_controlRef
,propertyID
);
391 } /* wxMacDataBrowserTableViewControl::RemoveColumnByIndex(DataBrowserTableViewColumnIndex) */
393 OSStatus
wxMacDataBrowserTableViewControl::SetColumnIndex(DataBrowserPropertyID propertyID
, DataBrowserTableViewColumnIndex index
)
395 return ::SetDataBrowserTableViewColumnPosition(this->m_controlRef
,propertyID
,index
);
396 } /* wxMacDataBrowserTableViewControl::SetColumnIndex(DataBrowserPropertyID, DataBrowserTableViewColumnIndex) */
398 OSStatus
wxMacDataBrowserTableViewControl::SetDisclosureColumn(DataBrowserPropertyID propertyID
, Boolean expandableRows
)
400 return ::SetDataBrowserListViewDisclosureColumn(this->m_controlRef
,propertyID
,expandableRows
);
403 OSStatus
wxMacDataBrowserTableViewControl::SetPropertyFlags(DataBrowserPropertyID propertyID
, DataBrowserPropertyFlags flags
)
405 return ::SetDataBrowserPropertyFlags(this->m_controlRef
,propertyID
,flags
);
406 } /* wxMacDataBrowserTableViewControl::SetPropertyFlags(DataBrowserPropertyID, DataBrowserPropertyFlags) */
411 OSStatus
wxMacDataBrowserTableViewControl::AddItems(DataBrowserItemID container
, UInt32 numItems
, DataBrowserItemID
const* items
, DataBrowserPropertyID preSortProperty
)
413 return ::AddDataBrowserItems(this->m_controlRef
,container
,numItems
,items
,preSortProperty
);
414 } /* wxMacDataBrowserTableViewControl::AddItems(DataBrowserItemID, UInt32, DataBrowserItemID const*, DataBrowserPropertyID) */
416 OSStatus
wxMacDataBrowserTableViewControl::GetFreeItemID(DataBrowserItemID
* id
) const
423 status
= this->GetItemCount(&NoOfItems
);
424 wxCHECK_MSG(status
== noErr
,status
,_("Could not retrieve number of items"));
432 // 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
433 // as the number of items; therefore, start from the number of items to look for a new ID:
434 for (*id
=NoOfItems
; *id
<std::numeric_limits
<DataBrowserItemID
>::max(); ++(*id
))
435 if (this->IsUsedItemID(*id
) == errDataBrowserItemNotFound
)
437 // as the first approach was not successful, try from the beginning:
438 for (*id
=0; *id
<NoOfItems
; ++(*id
))
439 if (this->IsUsedItemID(*id
) == errDataBrowserItemNotFound
)
441 // sorry, data browser is full:
442 return errDataBrowserItemNotAdded
;
444 } /* wxMacDataBrowserTableViewControl::GetFreeItemID(DataBrowserItemID*) const */
446 OSStatus
wxMacDataBrowserTableViewControl::GetItemCount(DataBrowserItemID container
, Boolean recurse
, DataBrowserItemState state
, ItemCount
* numItems
) const
448 return GetDataBrowserItemCount(this->m_controlRef
,container
,recurse
,state
,numItems
);
449 } /* wxMacDataBrowserTableViewControl::GetItemCount(DataBrowserItemID, Boolean, DataBrowserItemState, ItemCount*) const */
451 OSStatus
wxMacDataBrowserTableViewControl::GetItemID( DataBrowserTableViewRowIndex row
, DataBrowserItemID
* item
) const
453 return GetDataBrowserTableViewItemID(this->m_controlRef
,row
,item
);
456 OSStatus
wxMacDataBrowserTableViewControl::GetItems(DataBrowserItemID container
, Boolean recurse
, DataBrowserItemState state
, Handle items
) const
458 return GetDataBrowserItems(this->m_controlRef
,container
,recurse
,state
,items
);
459 } /* wxMacDataBrowserTableViewControl::GetItems(DataBrowserItemID, Boolean, DataBrowserItemState, Handle) const */
461 OSStatus
wxMacDataBrowserTableViewControl::GetItemRow(DataBrowserItemID item
, DataBrowserTableViewRowIndex
* row
) const
463 return GetDataBrowserTableViewItemRow(this->m_controlRef
,item
,row
);
466 OSStatus
wxMacDataBrowserTableViewControl::IsUsedItemID(DataBrowserItemID itemID
) const
468 // 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
469 // 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
470 // the column position for the property id:
471 DataBrowserTableViewColumnIndex index
;
473 return ::GetDataBrowserTableViewItemRow(this->m_controlRef
,itemID
,&index
);
474 } /* wxMacDataBrowserTableViewControl::IsUsedItemID(DataBrowserItemID) const */
476 OSStatus
wxMacDataBrowserTableViewControl::RemoveItems(DataBrowserItemID container
, UInt32 numItems
, DataBrowserItemID
const* items
, DataBrowserPropertyID preSortProperty
)
478 return ::RemoveDataBrowserItems(this->m_controlRef
,container
,numItems
,items
,preSortProperty
);
481 OSStatus
wxMacDataBrowserTableViewControl::RevealItem(DataBrowserItemID item
, DataBrowserPropertyID propertyID
, DataBrowserRevealOptions options
) const
483 return ::RevealDataBrowserItem(this->m_controlRef
,item
,propertyID
,options
);
484 } /* wxMacDataBrowserTableViewControl::RevealItem(DataBrowserItemID item, DataBrowserPropertyID propertyID, DataBrowserRevealOptions options) const */
486 OSStatus
wxMacDataBrowserTableViewControl::UpdateItems(DataBrowserItemID container
, UInt32 numItems
, DataBrowserItemID
const* items
, DataBrowserPropertyID preSortProperty
,
487 DataBrowserPropertyID propertyID
) const
489 return UpdateDataBrowserItems(this->m_controlRef
,container
,numItems
,items
,preSortProperty
,propertyID
);
495 size_t wxMacDataBrowserTableViewControl::GetSelectedItemIDs(wxArrayDataBrowserItemID
& itemIDs
) const
497 DataBrowserItemID
* itemIDPtr
;
498 Handle
handle(::NewHandle(0));
503 wxCHECK_MSG(this->GetItems(kDataBrowserNoItem
,true,kDataBrowserItemIsSelected
,handle
) == noErr
,0,_("Could not get selected items."));
504 NoOfItems
= static_cast<size_t>(::GetHandleSize(handle
)/sizeof(DataBrowserItemID
));
506 itemIDs
.Alloc(NoOfItems
);
508 itemIDPtr
= (DataBrowserItemID
*) (*handle
);
509 for (size_t i
=0; i
<NoOfItems
; ++i
)
511 itemIDs
.Add(*itemIDPtr
);
515 DisposeHandle(handle
);
517 } /* wxMacDataBrowserTableViewControl::GetSelectedItemIDs(wxArrayDataBrowserItemID&) const*/
519 OSStatus
wxMacDataBrowserTableViewControl::GetSelectionAnchor(DataBrowserItemID
* first
, DataBrowserItemID
* last
) const
521 return ::GetDataBrowserSelectionAnchor(this->m_controlRef
,first
,last
);
522 } /* wxMacDataBrowserTableViewControl::GetSelectionAnchor(DataBrowserItemID*, DataBrowserItemID*) const */
524 OSStatus
wxMacDataBrowserTableViewControl::GetSelectionFlags(DataBrowserSelectionFlags
* flags
) const
526 return ::GetDataBrowserSelectionFlags(this->m_controlRef
,flags
);
527 } /* wxMacDataBrowserTableViewControl::GetSelectionFlags(DataBrowserSelectionFlags*) const */
529 bool wxMacDataBrowserTableViewControl::IsItemSelected(DataBrowserItemID item
) const
531 return ::IsDataBrowserItemSelected(this->m_controlRef
,item
);
532 } /* wxMacDataBrowserTableViewControl::IsItemSelected(DataBrowserItemID) const */
534 OSStatus
wxMacDataBrowserTableViewControl::SetSelectionFlags(DataBrowserSelectionFlags flags
)
536 return ::SetDataBrowserSelectionFlags(this->m_controlRef
,flags
);
537 } /* wxMacDataBrowserTableViewControl::SetSelectionFlags(DataBrowserSelectionFlags) */
539 OSStatus
wxMacDataBrowserTableViewControl::SetSelectedItems(UInt32 numItems
, DataBrowserItemID
const* items
, DataBrowserSetOption operation
)
541 return ::SetDataBrowserSelectedItems(this->m_controlRef
, numItems
, items
, operation
);
542 } /* wxMacDataBrowserTableViewControl::SetSelectedItems(UInt32, DataBrowserItemID const*, DataBrowserSetOption) */
544 OSStatus
wxMacDataBrowserTableViewControl::GetSortOrder(DataBrowserSortOrder
* order
) const
546 return ::GetDataBrowserSortOrder(this->m_controlRef
,order
);
549 OSStatus
wxMacDataBrowserTableViewControl::GetSortProperty(DataBrowserPropertyID
* propertyID
) const
551 return ::GetDataBrowserSortProperty(this->m_controlRef
,propertyID
);
554 OSStatus
wxMacDataBrowserTableViewControl::Resort(DataBrowserItemID container
, Boolean sortChildren
)
556 return ::SortDataBrowserContainer(this->m_controlRef
,container
,sortChildren
);
557 } /* wxMacDataBrowserTableViewControl::Resort(DataBrowserItemID, Boolean) */
559 OSStatus
wxMacDataBrowserTableViewControl::SetSortOrder(DataBrowserSortOrder order
)
561 return ::SetDataBrowserSortOrder(this->m_controlRef
,order
);
564 OSStatus
wxMacDataBrowserTableViewControl::SetSortProperty(DataBrowserPropertyID propertyID
)
566 return ::SetDataBrowserSortProperty(this->m_controlRef
,propertyID
);
570 // container handling
572 OSStatus
wxMacDataBrowserTableViewControl::CloseContainer(DataBrowserItemID containerID
)
574 return ::CloseDataBrowserContainer(this->m_controlRef
,containerID
);
575 } /* wxMacDataBrowserTableViewControl::CloseContainer(DataBrowserItemID) */
577 OSStatus
wxMacDataBrowserTableViewControl::OpenContainer(DataBrowserItemID containerID
)
579 return ::OpenDataBrowserContainer(this->m_controlRef
,containerID
);
580 } /* wxMacDataBrowserTableViewControl::OpenContainer(DataBrowserItemID) */
582 IMPLEMENT_ABSTRACT_CLASS(wxMacDataBrowserTableViewControl
,wxMacControl
)
584 // ============================================================================
585 // wxMacDataBrowserListViewControl
586 // ============================================================================
591 OSStatus
wxMacDataBrowserListViewControl::AddColumn(DataBrowserListViewColumnDesc
*columnDesc
, DataBrowserTableViewColumnIndex position
)
593 return AddDataBrowserListViewColumn(this->m_controlRef
,columnDesc
,position
);
594 } /* wxMacDataBrowserListViewControl::AddColumn(DataBrowserListViewColumnDesc*, DataBrowserTableViewColumnIndex) */
596 // ============================================================================
597 // wxMacDataViewDataBrowserListViewControl
598 // ============================================================================
601 // constructors / destructor
603 wxMacDataViewDataBrowserListViewControl::wxMacDataViewDataBrowserListViewControl(wxWindow
* peer
, wxPoint
const& pos
, wxSize
const& size
, long style
)
604 :wxMacDataBrowserListViewControl(peer
,pos
,size
,style
)
606 } /* wxMacDataViewDataBrowserListViewControl::wxMacDataViewDataBrowserListViewControl(wxWindow* , const wxPoint&, const wxSize&, long) */
609 // callback functions (inherited from wxMacDataBrowserTableViewControl)
611 Boolean
wxMacDataViewDataBrowserListViewControl::DataBrowserCompareProc(DataBrowserItemID itemOneID
, DataBrowserItemID itemTwoID
, DataBrowserPropertyID sortProperty
)
613 DataBrowserSortOrder sortOrder
;
615 DataBrowserTableViewColumnIndex modelColumnIndex
;
617 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(this->GetPeer()));
620 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
, false,_("Pointer to data view control not set correctly."));
621 wxCHECK_MSG(dataViewCtrlPtr
->GetModel() != NULL
,false,_("Pointer to model not set correctly."));
622 if (sortProperty
>= kMinPropertyID
)
624 // variable definition and initialization:
625 wxDataViewColumn
* ColumnPtr(dataViewCtrlPtr
->GetColumnPtr(sortProperty
));
627 wxCHECK_MSG(ColumnPtr
!= NULL
,false,_("Could not determine column index."));
628 modelColumnIndex
= ColumnPtr
->GetModelColumn();
631 modelColumnIndex
= 0;
632 this->GetSortOrder(&sortOrder
);
633 return static_cast<Boolean
>(dataViewCtrlPtr
->GetModel()->Compare(wxDataViewItem(reinterpret_cast<void*>(itemOneID
)),wxDataViewItem(reinterpret_cast<void*>(itemTwoID
)),
634 modelColumnIndex
,sortOrder
!= kDataBrowserOrderDecreasing
) < 0);
635 } /* wxMacDataViewDataBrowserListViewControl::DataBrowserCompareProc(DataBrowserItemID, DataBrowserItemID, DataBrowserPropertyID) */
637 void wxMacDataViewDataBrowserListViewControl::DataBrowserGetContextualMenuProc(MenuRef
* menu
, UInt32
* helpType
, CFStringRef
* helpItemString
, AEDesc
* WXUNUSED(selection
))
638 // In this method we do not supply a contextual menu handler at all but only send a wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU.
640 wxArrayDataBrowserItemID itemIDs
;
642 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(this->GetPeer()));
645 wxCHECK_RET(dataViewCtrlPtr
!= NULL
,_("wxWidget control pointer is not a data view pointer"));
646 // initialize parameters so that no context menu will be displayed automatically by the native data browser:
648 *helpType
= kCMHelpItemNoHelp
;
649 *helpItemString
= NULL
;
650 // create information for a context menu event:
651 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU
,dataViewCtrlPtr
->GetId());
653 dataViewEvent
.SetModel(dataViewCtrlPtr
->GetModel());
654 // get the item information;
655 // 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:
656 if (this->GetSelectedItemIDs(itemIDs
) > 0)
657 dataViewEvent
.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemIDs
[0])));
658 // finally send the equivalent wxWidget event:
659 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
660 } /* wxMacDataViewDataBrowserListViewControl::DataBrowserGetContextualMenuProc(MenuRef*, UInt32*, CFStringRef*, AEDesc*) */
662 OSStatus
wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc(DataBrowserItemID itemID
, DataBrowserPropertyID propertyID
, DataBrowserItemDataRef itemData
, Boolean getValue
)
666 // variable definitions:
667 wxDataViewCtrl
* dataViewCtrlPtr
;
669 dataViewCtrlPtr
= dynamic_cast<wxDataViewCtrl
*>(this->GetPeer());
670 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
,errDataBrowserNotConfigured
,_("Pointer to data view control not set correctly."));
671 if (dataViewCtrlPtr
->IsDeleting())
672 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
675 // variable definitions:
676 OSStatus errorStatus
;
677 wxDataViewColumn
* dataViewColumnPtr
;
679 wxCHECK_MSG(dataViewCtrlPtr
->GetModel() != NULL
,errDataBrowserNotConfigured
,_("Pointer to model not set correctly."));
680 dataViewColumnPtr
= dataViewCtrlPtr
->GetColumnPtr(propertyID
);
681 wxCHECK_MSG((dataViewColumnPtr
!= NULL
) && (dataViewColumnPtr
->GetRenderer() != NULL
),errDataBrowserNotConfigured
,_("There is no column or renderer for the specified column index."));
682 switch (dataViewColumnPtr
->GetRenderer()->GetPropertyType())
684 case kDataBrowserCheckboxType
:
686 // variable definition:
687 ThemeButtonValue buttonValue
;
689 errorStatus
= ::GetDataBrowserItemDataButtonValue(itemData
,&buttonValue
);
690 if (errorStatus
== noErr
)
692 if (buttonValue
== kThemeButtonOn
)
694 // variable definition and initialization:
695 wxVariant
modifiedData(true);
697 return (dataViewCtrlPtr
->GetModel()->SetValue(modifiedData
,wxDataViewItem(reinterpret_cast<void*>(itemID
)),dataViewColumnPtr
->GetModelColumn()) ? OSStatus(noErr
) : OSStatus(errDataBrowserNotConfigured
));
699 else if (buttonValue
== kThemeButtonOff
)
701 // variable definition and initialization:
702 wxVariant
modifiedData(false);
704 return (dataViewCtrlPtr
->GetModel()->SetValue(modifiedData
,wxDataViewItem(reinterpret_cast<void*>(itemID
)),dataViewColumnPtr
->GetModelColumn()) ? OSStatus(noErr
) : OSStatus(errDataBrowserNotConfigured
));
707 return errDataBrowserInvalidPropertyData
;
712 case kDataBrowserTextType
:
714 // variable definitions:
715 CFStringRef stringReference
;
717 errorStatus
= ::GetDataBrowserItemDataText(itemData
,&stringReference
);
718 if (errorStatus
== noErr
)
720 // variable definitions and initializations:
721 #if wxCHECK_VERSION(2,9,0)
722 wxCFStringRef
modifiedString(stringReference
);
724 wxMacCFStringHolder
modifiedString(stringReference
);
726 wxVariant
modifiedData(modifiedString
.AsString());
728 if (dataViewCtrlPtr
->GetModel()->SetValue(modifiedData
,wxDataViewItem(reinterpret_cast<void*>(itemID
)),dataViewColumnPtr
->GetModelColumn()))
731 return errDataBrowserNotConfigured
;
737 return errDataBrowserPropertyNotSupported
;
743 if (propertyID
>= kMinPropertyID
) // in case data columns set the data
745 // variable definitions:
747 wxDataViewColumn
* dataViewColumnPtr
;
748 wxDataViewCtrl
* dataViewCtrlPtr
;
750 dataViewCtrlPtr
= dynamic_cast<wxDataViewCtrl
*>(this->GetPeer());
751 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
,errDataBrowserNotConfigured
,_("Pointer to data view control not set correctly."));
752 wxCHECK_MSG(dataViewCtrlPtr
->GetModel() != NULL
,errDataBrowserNotConfigured
,_("Pointer to model not set correctly."));
753 dataViewColumnPtr
= dataViewCtrlPtr
->GetColumnPtr(propertyID
);
754 wxCHECK_MSG(dataViewColumnPtr
!= NULL
,errDataBrowserNotConfigured
,_("No column for the specified column position existing."));
755 wxCHECK_MSG(dataViewColumnPtr
->GetRenderer() != NULL
,errDataBrowserNotConfigured
,_("No renderer specified for column."));
756 dataViewCtrlPtr
->GetModel()->GetValue(variant
,wxDataViewItem(reinterpret_cast<void*>(itemID
)),dataViewColumnPtr
->GetModelColumn());
757 if (!(variant
.IsNull()))
759 dataViewColumnPtr
->GetRenderer()->SetDataReference(itemData
);
760 dataViewColumnPtr
->GetRenderer()->SetValue(variant
);
761 wxCHECK_MSG(dataViewColumnPtr
->GetRenderer()->Render(),errDataBrowserNotConfigured
,_("Rendering failed."));
765 else // react on special system requests
769 case kDataBrowserContainerIsClosableProperty
:
771 // variable definitions:
772 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(this->GetPeer()));
774 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
,errDataBrowserNotConfigured
,_("Pointer to data view control not set correctly."));
775 // initialize wxWidget event:
776 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING
,dataViewCtrlPtr
->GetId()); // variable definition
778 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
779 dataViewEvent
.SetItem (wxDataViewItem(reinterpret_cast<void*>(itemID
)));
780 dataViewEvent
.SetModel (dataViewCtrlPtr
->GetModel());
781 // finally send the equivalent wxWidget event:
782 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
783 // opening the container is allowed if not vetoed:
784 return ::SetDataBrowserItemDataBooleanValue(itemData
,dataViewEvent
.IsAllowed());
786 case kDataBrowserContainerIsOpenableProperty
:
788 // variable definitions:
789 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(this->GetPeer()));
791 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
,errDataBrowserNotConfigured
,_("Pointer to data view control not set correctly."));
792 // initialize wxWidget event:
793 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING
,dataViewCtrlPtr
->GetId()); // variable definition
795 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
796 dataViewEvent
.SetItem (wxDataViewItem(reinterpret_cast<void*>(itemID
)));
797 dataViewEvent
.SetModel (dataViewCtrlPtr
->GetModel());
798 // finally send the equivalent wxWidget event:
799 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
800 // opening the container is allowed if not vetoed:
801 return ::SetDataBrowserItemDataBooleanValue(itemData
,dataViewEvent
.IsAllowed());
803 case kDataBrowserItemIsContainerProperty
:
805 // variable definition:
806 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(this->GetPeer()));
808 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
,errDataBrowserNotConfigured
,_("Pointer to data view control not set correctly."));
809 wxCHECK_MSG(dataViewCtrlPtr
->GetModel() != NULL
,errDataBrowserNotConfigured
,_("Pointer to model not set correctly."));
810 return ::SetDataBrowserItemDataBooleanValue(itemData
,dataViewCtrlPtr
->GetModel()->IsContainer(wxDataViewItem(reinterpret_cast<void*>(itemID
))));
812 case kDataBrowserItemIsEditableProperty
:
813 return ::SetDataBrowserItemDataBooleanValue(itemData
,true);
817 return errDataBrowserPropertyNotSupported
;
818 } /* wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc(DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemDataRef, Boolean) */
820 void wxMacDataViewDataBrowserListViewControl::DataBrowserItemNotificationProc(DataBrowserItemID itemID
, DataBrowserItemNotification message
, DataBrowserItemDataRef itemData
)
822 wxDataViewCtrl
* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl
*>(this->GetPeer()));
825 // 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:
826 if (dataViewCtrlPtr
!= NULL
)
829 case kDataBrowserContainerClosed
:
830 dataViewCtrlPtr
->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
832 // initialize wxWidget event:
833 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED
,dataViewCtrlPtr
->GetId()); // variable definition
835 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
836 dataViewEvent
.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID
)));
837 // finally send the equivalent wxWidget event:
838 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
841 case kDataBrowserContainerOpened
:
842 dataViewCtrlPtr
->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
844 // initialize wxWidget event:
845 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED
,dataViewCtrlPtr
->GetId()); // variable definition
847 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
848 dataViewEvent
.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID
)));
849 // finally send the equivalent wxWidget event:
850 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
851 // add children to the expanded container:
852 dataViewCtrlPtr
->AddChildrenLevel(wxDataViewItem(reinterpret_cast<void*>(itemID
)));
855 case kDataBrowserEditStarted
:
856 dataViewCtrlPtr
->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
858 // initialize wxWidget event:
859 DataBrowserPropertyID propertyID
;
860 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED
,dataViewCtrlPtr
->GetId()); // variable definition
862 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
863 dataViewEvent
.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID
)));
864 if (this->GetPropertyID(itemData
,&propertyID
) == noErr
)
866 // variable definition and initialization:
867 DataBrowserTableViewColumnIndex columnIndex
;
869 wxCHECK_RET(this->GetColumnIndex(propertyID
,&columnIndex
),_("Column index not found."));
870 dataViewEvent
.SetColumn(columnIndex
);
871 dataViewEvent
.SetDataViewColumn(dataViewCtrlPtr
->GetColumnPtr(propertyID
));
873 // finally send the equivalent wxWidget event:
874 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
877 case kDataBrowserEditStopped
:
879 // initialize wxWidget event:
880 DataBrowserPropertyID propertyID
;
881 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE
,dataViewCtrlPtr
->GetId()); // variable definition
883 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
884 dataViewEvent
.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID
)));
885 if (this->GetPropertyID(itemData
,&propertyID
) == noErr
)
887 // variable definition and initialization:
888 DataBrowserTableViewColumnIndex columnIndex
;
890 wxCHECK_RET(this->GetColumnIndex(propertyID
,&columnIndex
),_("Column index not found."));
891 dataViewEvent
.SetColumn(columnIndex
);
892 dataViewEvent
.SetDataViewColumn(dataViewCtrlPtr
->GetColumnPtr(propertyID
));
894 // finally send the equivalent wxWidget event:
895 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
898 case kDataBrowserItemAdded
:
899 dataViewCtrlPtr
->FinishCustomItemEditing();
901 case kDataBrowserItemDeselected
:
902 dataViewCtrlPtr
->FinishCustomItemEditing();
904 case kDataBrowserItemDoubleClicked
:
906 // initialize wxWidget event:
907 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED
,dataViewCtrlPtr
->GetId()); // variable definition
909 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
910 dataViewEvent
.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID
)));
911 // finally send the equivalent wxWidget event:
912 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
915 case kDataBrowserItemRemoved
:
916 dataViewCtrlPtr
->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
918 case kDataBrowserItemSelected
:
919 break; // not implemented by wxWidgets; see kDataBrowserSelectionSetChanged
920 case kDataBrowserSelectionSetChanged
:
922 // initialize wxWidget event:
923 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED
,dataViewCtrlPtr
->GetId()); // variable definition
925 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
926 dataViewEvent
.SetModel (dataViewCtrlPtr
->GetModel());
927 // finally send the equivalent wxWidget event:
928 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
931 case kDataBrowserTargetChanged
: // no idea if this notification is ever sent
933 case kDataBrowserUserStateChanged
:
935 // finish custom item editing if necessary:
936 dataViewCtrlPtr
->FinishCustomItemEditing();
937 // update column widths:
938 for (size_t i
=0; i
<dataViewCtrlPtr
->GetColumnCount(); ++i
)
940 // constant definition for abbreviational purposes:
941 wxDataViewColumn
* const columnPtr
= dataViewCtrlPtr
->GetColumn(i
);
942 // variable definition:
945 wxCHECK_RET(this->GetColumnWidth(columnPtr
->GetPropertyID(),&columnWidth
) == noErr
,_("Column width could not be determined"));
946 columnPtr
->SetWidthVariable(columnWidth
);
948 // update sorting orders:
949 DataBrowserPropertyID propertyID
; // variable definition
951 if ((this->GetSortProperty(&propertyID
) == noErr
) && (propertyID
>= kMinPropertyID
))
953 DataBrowserSortOrder sortOrder
;
954 DataBrowserTableViewColumnIndex columnIndex
;
956 if ((this->GetSortOrder(&sortOrder
) == noErr
) && (this->GetColumnIndex(propertyID
,&columnIndex
) == noErr
))
958 // variable definition and initialization:
959 wxDataViewColumn
* columnPtr
;
960 columnPtr
= dataViewCtrlPtr
->GetColumn(columnIndex
);
961 // check if the sort order has changed:
962 if ( columnPtr
->IsSortOrderAscending() && (sortOrder
== kDataBrowserOrderDecreasing
) ||
963 !(columnPtr
->IsSortOrderAscending()) && (sortOrder
== kDataBrowserOrderIncreasing
))
965 columnPtr
->SetSortOrder(!(columnPtr
->IsSortOrderAscending()));
966 // initialize wxWidget event:
967 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED
,dataViewCtrlPtr
->GetId()); // variable defintion
969 dataViewEvent
.SetEventObject(dataViewCtrlPtr
);
970 dataViewEvent
.SetColumn(columnIndex
);
971 dataViewEvent
.SetDataViewColumn(columnPtr
);
972 // finally send the equivalent wxWidget event:
973 dataViewCtrlPtr
->GetEventHandler()->ProcessEvent(dataViewEvent
);
980 } /* wxMacDataViewDataBrowserListViewControl::DataBrowserItemNotificationProc(DataBrowserItemID, DataBrowserItemNotification, DataBrowserItemDataRef) */
982 void wxMacDataViewDataBrowserListViewControl::DataBrowserDrawItemProc(DataBrowserItemID itemID
, DataBrowserPropertyID propertyID
, DataBrowserItemState state
, Rect
const* rectangle
, SInt16 bitDepth
, Boolean colorDevice
)
984 wxDataViewColumn
* dataViewColumnPtr
;
986 wxDataViewCtrl
* dataViewCtrlPtr
;
988 wxDataViewCustomRenderer
* dataViewCustomRendererPtr
;
990 wxVariant dataToRender
;
993 dataViewCtrlPtr
= dynamic_cast<wxDataViewCtrl
*>(this->GetPeer());
994 wxCHECK_RET(dataViewCtrlPtr
!= NULL
, _("Pointer to data view control not set correctly."));
995 wxCHECK_RET(dataViewCtrlPtr
->GetModel() != NULL
,_("Pointer to model not set correctly."));
996 dataViewColumnPtr
= dataViewCtrlPtr
->GetColumnPtr(propertyID
);
997 wxCHECK_RET(dataViewColumnPtr
!= NULL
,_("No column for the specified column index existing."));
998 dataViewCustomRendererPtr
= dynamic_cast<wxDataViewCustomRenderer
*>(dataViewColumnPtr
->GetRenderer());
999 wxCHECK_RET(dataViewCustomRendererPtr
!= NULL
,_("No renderer or invalid renderer type specified for custom data column."));
1000 dataViewCtrlPtr
->GetModel()->GetValue(dataToRender
,wxDataViewItem(reinterpret_cast<void*>(itemID
)),dataViewColumnPtr
->GetModelColumn());
1001 dataViewCustomRendererPtr
->SetValue(dataToRender
);
1003 // try to determine the content's size (drawable part):
1005 RgnHandle
rgn(NewRgn());
1006 UInt16 headerHeight
;
1008 if (this->GetRegion(kControlContentMetaPart
,rgn
) == noErr
)
1009 GetRegionBounds(rgn
,&content
);
1011 this->GetRect(&content
);
1013 // space for the header
1014 this->GetHeaderButtonHeight(&headerHeight
);
1015 content
.top
+= headerHeight
;
1016 // extra space for the frame (todo: do not how to determine the space automatically from the control)
1020 content
.bottom
-= 3;
1021 // extra space for the scrollbars:
1022 content
.bottom
-= wxSystemSettings::GetMetric(wxSYS_HSCROLL_Y
);
1023 content
.right
-= wxSystemSettings::GetMetric(wxSYS_VSCROLL_X
);
1025 // make sure that 'Render' can draw only in the allowed area:
1026 dataViewCustomRendererPtr
->GetDC()->SetClippingRegion(content
.left
,content
.top
,content
.right
-content
.left
+1,content
.bottom
-content
.top
+1);
1027 (void) (dataViewCustomRendererPtr
->Render(wxRect(static_cast<int>(rectangle
->left
),static_cast<int>(rectangle
->top
),
1028 static_cast<int>(1+rectangle
->right
-rectangle
->left
),static_cast<int>(1+rectangle
->bottom
-rectangle
->top
)),
1029 dataViewCustomRendererPtr
->GetDC(),((state
== kDataBrowserItemIsSelected
) ? wxDATAVIEW_CELL_SELECTED
: 0)));
1030 dataViewCustomRendererPtr
->GetDC()->DestroyClippingRegion(); // probably not necessary
1031 } /* wxMacDataViewDataBrowserListViewControl::DataBrowserDrawItemProc(DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemState, Rect const*, SInt16, Boolean) */
1033 Boolean
wxMacDataViewDataBrowserListViewControl::DataBrowserEditItemProc(DataBrowserItemID itemID
, DataBrowserPropertyID propertyID
, CFStringRef theString
, Rect
* maxEditTextRect
, Boolean
* shrinkToFit
)
1036 } /* wxMacDataViewDataBrowserListViewControl::DataBrowserEditItemProc(DataBrowserItemID, DataBrowserPropertyID, CFStringRef, Rect*, Boolean*) */
1038 Boolean
wxMacDataViewDataBrowserListViewControl::DataBrowserHitTestProc(DataBrowserItemID
WXUNUSED(itemID
), DataBrowserPropertyID
WXUNUSED(property
), Rect
const* WXUNUSED(theRect
), Rect
const* WXUNUSED(mouseRect
))
1041 } /* wxMacDataViewDataBrowserListViewControl::DataBrowserHitTestProc(DataBrowserItemID, DataBrowserPropertyID, Rect const*, Rect const*) */
1043 DataBrowserTrackingResult
wxMacDataViewDataBrowserListViewControl::DataBrowserTrackingProc(DataBrowserItemID itemID
, DataBrowserPropertyID propertyID
, Rect
const* theRect
, Point
WXUNUSED(startPt
), EventModifiers
WXUNUSED(modifiers
))
1045 wxDataViewColumn
* dataViewColumnPtr
;
1047 wxDataViewCtrl
* dataViewCtrlPtr
;
1049 wxDataViewCustomRenderer
* dataViewCustomRendererPtr
;
1051 wxDataViewItem dataViewCustomRendererItem
;
1054 dataViewCustomRendererItem
= reinterpret_cast<void*>(itemID
);
1055 wxCHECK_MSG(dataViewCustomRendererItem
.IsOk(),kDataBrowserNothingHit
,_("Invalid data view item"));
1056 dataViewCtrlPtr
= dynamic_cast<wxDataViewCtrl
*>(this->GetPeer());
1057 wxCHECK_MSG(dataViewCtrlPtr
!= NULL
,kDataBrowserNothingHit
,_("Pointer to data view control not set correctly."));
1058 dataViewColumnPtr
= dataViewCtrlPtr
->GetColumnPtr(propertyID
);
1059 wxCHECK_MSG(dataViewColumnPtr
!= NULL
,kDataBrowserNothingHit
,_("No column existing."));
1060 dataViewCustomRendererPtr
= dynamic_cast<wxDataViewCustomRenderer
*>(dataViewColumnPtr
->GetRenderer());
1061 wxCHECK_MSG(dataViewCustomRendererPtr
!= NULL
,kDataBrowserNothingHit
,_("No renderer or invalid renderer type specified for custom data column."));
1062 // 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):
1063 if (dataViewCtrlPtr
->GetCustomRendererItem() == dataViewCustomRendererItem
)
1064 return kDataBrowserContentHit
;
1065 // an(other) item is going to be edited and therefore the current editing - if existing - has to be finished:
1066 if (dataViewCtrlPtr
->GetCustomRendererPtr() != NULL
)
1068 dataViewCtrlPtr
->GetCustomRendererPtr()->FinishEditing();
1069 dataViewCtrlPtr
->SetCustomRendererItem(wxDataViewItem());
1070 dataViewCtrlPtr
->SetCustomRendererPtr (NULL
);
1072 // check if renderer has got a valid editor control for editing; if this is the case start editing of the new item:
1073 if (dataViewCustomRendererPtr
->HasEditorCtrl())
1075 // variable definition:
1078 ::wxMacNativeToRect(theRect
,&wxRectangle
);
1079 dataViewCustomRendererPtr
->StartEditing(dataViewCustomRendererItem
,wxRectangle
);
1080 dataViewCtrlPtr
->SetCustomRendererItem(dataViewCustomRendererItem
);
1081 dataViewCtrlPtr
->SetCustomRendererPtr (dataViewCustomRendererPtr
);
1083 return kDataBrowserContentHit
;
1084 } /* wxMacDataViewDataBrowserListViewControl::DataBrowserTrackingProc(DataBrowserItemID, DataBrowserPropertyID, Rect const*, Point, EventModifiers) */
1086 #endif // wxUSE_GENERICDATAVIEWCTRL