]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/mac/carbon/databrow.cpp
I still think that's needed ...
[wxWidgets.git] / src / mac / carbon / databrow.cpp
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: src/mac/carbon/databrow.cpp
3// Purpose: Classes and functions for the Carbon data browser
4// Author:
5// Modified by:
6// Created: 2007-05-18
7// RCS-ID: $Id$
8// Copyright: (c)
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#include "wx/wxprec.h"
13
14#if wxUSE_DATAVIEWCTRL
15#ifndef wxUSE_GENERICDATAVIEWCTRL
16
17#ifndef WX_PRECOMP
18 #include "wx/app.h"
19 #include "wx/toplevel.h"
20 #include "wx/font.h"
21 #include "wx/settings.h"
22 #include "wx/utils.h"
23#endif
24
25#include "wx/dataview.h"
26#include "wx/mac/carbon/databrow.h"
27#include "wx/mac/private.h"
28#include "wx/mac/uma.h"
29
30#include <limits>
31
32// ============================================================================
33// Variables used globally in databrow.cpp
34// ============================================================================
35DataBrowserGetContextualMenuUPP gDataBrowserTableViewGetContextualMenuUPP = NULL;
36DataBrowserItemCompareUPP gDataBrowserTableViewItemCompareUPP = NULL;
37DataBrowserItemDataUPP gDataBrowserTableViewItemDataUPP = NULL;
38DataBrowserItemNotificationUPP gDataBrowserTableViewItemNotificationUPP = NULL;
39
40DataBrowserDrawItemUPP gDataBrowserTableViewDrawItemUPP = NULL;
41DataBrowserEditItemUPP gDataBrowserTableViewEditItemUPP = NULL;
42DataBrowserHitTestUPP gDataBrowserTableViewHitTestUPP = NULL;
43DataBrowserTrackingUPP gDataBrowserTableViewTrackingUPP = NULL;
44
45// ============================================================================
46// wxMacDataBrowserTableViewControl
47// ============================================================================
48
49pascal Boolean wxMacDataBrowserTableViewControl::DataBrowserCompareProc(ControlRef browser, DataBrowserItemID itemOneID, DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty)
50{
51 wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
52
53
54 if (ControlPtr != NULL)
55 return ControlPtr->DataBrowserCompareProc(itemOneID,itemTwoID,sortProperty);
56 else
57 return errDataBrowserPropertyNotSupported;
58} /* wxMacDataBrowserTableViewControl::DataBrowserCompareProc(ControlRef, DataBrowserItemID, DataBrowserItemID, DataBrowserPropertyID) */
59
60pascal void wxMacDataBrowserTableViewControl::DataBrowserGetContextualMenuProc(ControlRef browser, MenuRef* menu, UInt32* helpType, CFStringRef* helpItemString, AEDesc* selection)
61{
62 wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
63
64
65 if (ControlPtr != NULL)
66 ControlPtr->DataBrowserGetContextualMenuProc(menu,helpType,helpItemString,selection);
67} /* wxMacDataBrowserTableViewControl::DataBrowserGetContextualMenuProc(ControlRef, MenuRef*, UInt32*, CFStringRef*, AEDesc*) */
68
69pascal OSStatus wxMacDataBrowserTableViewControl::DataBrowserGetSetItemDataProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemDataRef itemData, Boolean getValue)
70{
71 wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
72
73
74 if (ControlPtr != NULL)
75 return ControlPtr->DataBrowserGetSetItemDataProc(itemID,propertyID,itemData,getValue);
76 else
77 return errDataBrowserPropertyNotSupported;
78} /* wxMacDataBrowserTableViewControl::DataBrowserGetSetItemDataProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemDataRef, Boolean) */
79
80pascal void wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef itemData)
81{
82 wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
83
84
85 if (ControlPtr != NULL)
86 ControlPtr->DataBrowserItemNotificationProc(itemID,message,itemData);
87} /* wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc(ControlRef, DataBrowserItemID, DataBrowserItemNotification, DataBrowserItemDataRef) */
88
89pascal void wxMacDataBrowserTableViewControl::DataBrowserDrawItemProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemState state, Rect const* rectangle, SInt16 bitDepth, Boolean colorDevice)
90{
91 wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
92
93
94 if (ControlPtr != NULL)
95 ControlPtr->DataBrowserDrawItemProc(itemID,propertyID,state,rectangle,bitDepth,colorDevice);
96} /* wxMacDataBrowserTableViewControl::DataBrowserDrawItemProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemState, Rect const*, SInt16, Boolean) */
97
98pascal Boolean wxMacDataBrowserTableViewControl::DataBrowserEditItemProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, CFStringRef theString, Rect* maxEditTextRect, Boolean* shrinkToFit)
99{
100 wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
101
102
103 return ((ControlPtr != NULL) && ControlPtr->DataBrowserEditItemProc(itemID,propertyID,theString,maxEditTextRect,shrinkToFit));
104} /* wxMacDataBrowserTableViewControl::DataBrowserEditItemProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, CFStringRef, Rect*, Boolean*) */
105
106pascal Boolean wxMacDataBrowserTableViewControl::DataBrowserHitTestProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Rect const* mouseRect)
107{
108 wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
109
110
111 return ((ControlPtr != NULL) && ControlPtr->DataBrowserHitTestProc(itemID,propertyID,theRect,mouseRect));
112} /* wxMacDataBrowserTableViewControl::DataBrowserHitTestProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, Rect const*, Rect const*) */
113
114pascal DataBrowserTrackingResult wxMacDataBrowserTableViewControl::DataBrowserTrackingProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Point startPt, EventModifiers modifiers)
115{
116 wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
117
118
119 if (ControlPtr != NULL)
120 return ControlPtr->DataBrowserTrackingProc(itemID,propertyID,theRect,startPt,modifiers);
121 else
122 return kDataBrowserNothingHit;
123} /* wxMacDataBrowserTableViewControl::DataBrowserTrackingProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, Rect const*, Point, EventModifiers) */
124
125wxMacDataBrowserTableViewControl::wxMacDataBrowserTableViewControl(wxWindow* peer, wxPoint const& pos, wxSize const& size, long style)
126 :wxMacControl(peer)
127{
128 Rect bounds = wxMacGetBoundsForControl(peer,pos,size);
129 OSStatus err = ::CreateDataBrowserControl(MAC_WXHWND(peer->MacGetTopLevelWindowRef()),&bounds,kDataBrowserListView,&(this->m_controlRef));
130
131
132 SetReferenceInNativeControl();
133 verify_noerr(err);
134 // setup standard callbacks:
135 if (gDataBrowserTableViewGetContextualMenuUPP == NULL) gDataBrowserTableViewGetContextualMenuUPP = NewDataBrowserGetContextualMenuUPP(wxMacDataBrowserTableViewControl::DataBrowserGetContextualMenuProc);
136 if (gDataBrowserTableViewItemCompareUPP == NULL) gDataBrowserTableViewItemCompareUPP = NewDataBrowserItemCompareUPP (wxMacDataBrowserTableViewControl::DataBrowserCompareProc);
137 if (gDataBrowserTableViewItemDataUPP == NULL) gDataBrowserTableViewItemDataUPP = NewDataBrowserItemDataUPP (wxMacDataBrowserTableViewControl::DataBrowserGetSetItemDataProc);
138 if (gDataBrowserTableViewItemNotificationUPP == NULL)
139 {
140 gDataBrowserTableViewItemNotificationUPP =
141#if TARGET_API_MAC_OSX
142 (DataBrowserItemNotificationUPP) NewDataBrowserItemNotificationWithItemUPP(wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc);
143#else
144 NewDataBrowserItemNotificationUPP(wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc);
145#endif
146 }
147 DataBrowserCallbacks callbacks; // variable definition
148
149 InitializeDataBrowserCallbacks(&callbacks,kDataBrowserLatestCallbacks);
150 callbacks.u.v1.getContextualMenuCallback = gDataBrowserTableViewGetContextualMenuUPP;
151 callbacks.u.v1.itemDataCallback = gDataBrowserTableViewItemDataUPP;
152 callbacks.u.v1.itemCompareCallback = gDataBrowserTableViewItemCompareUPP;
153 callbacks.u.v1.itemNotificationCallback = gDataBrowserTableViewItemNotificationUPP;
154 this->SetCallbacks(&callbacks);
155
156 // setup callbacks for customized items:
157 if (gDataBrowserTableViewDrawItemUPP == NULL) gDataBrowserTableViewDrawItemUPP = NewDataBrowserDrawItemUPP(wxMacDataBrowserTableViewControl::DataBrowserDrawItemProc);
158 if (gDataBrowserTableViewEditItemUPP == NULL) gDataBrowserTableViewEditItemUPP = NewDataBrowserEditItemUPP(wxMacDataBrowserTableViewControl::DataBrowserEditItemProc);
159 if (gDataBrowserTableViewHitTestUPP == NULL) gDataBrowserTableViewHitTestUPP = NewDataBrowserHitTestUPP (wxMacDataBrowserTableViewControl::DataBrowserHitTestProc);
160 if (gDataBrowserTableViewTrackingUPP == NULL) gDataBrowserTableViewTrackingUPP = NewDataBrowserTrackingUPP(wxMacDataBrowserTableViewControl::DataBrowserTrackingProc);
161
162 DataBrowserCustomCallbacks customCallbacks; // variable definition
163
164 InitializeDataBrowserCustomCallbacks(&customCallbacks,kDataBrowserLatestCallbacks);
165 customCallbacks.u.v1.drawItemCallback = gDataBrowserTableViewDrawItemUPP;
166 customCallbacks.u.v1.editTextCallback = gDataBrowserTableViewEditItemUPP;
167 customCallbacks.u.v1.hitTestCallback = gDataBrowserTableViewHitTestUPP;
168 customCallbacks.u.v1.trackingCallback = gDataBrowserTableViewTrackingUPP;
169 this->SetCustomCallbacks(&customCallbacks);
170
171 // style setting:
172 this->EnableCellSizeModification();
173
174 DataBrowserSelectionFlags flags; // variable definition
175
176 if (this->GetSelectionFlags(&flags) == noErr) // get default settings
177 {
178 if ((style & wxDV_MULTIPLE) != 0)
179 flags &= ~kDataBrowserSelectOnlyOne;
180 else
181 flags |= kDataBrowserSelectOnlyOne;
182 (void) this->SetSelectionFlags(flags);
183 } /* if */
184
185 OptionBits attributes; // variable definition
186
187 if (this->GetAttributes(&attributes) == noErr) // get default settings
188 {
189 if ((style & wxDV_VERT_RULES) != 0)
190 attributes |= kDataBrowserAttributeListViewDrawColumnDividers;
191 else
192 attributes &= ~kDataBrowserAttributeListViewDrawColumnDividers;
193 if ((style & wxDV_ROW_LINES) != 0)
194 attributes |= kDataBrowserAttributeListViewAlternatingRowColors;
195 else
196 attributes &= ~kDataBrowserAttributeListViewAlternatingRowColors;
197 (void) this->SetAttributes(attributes);
198 } /* if */
199
200 if ((style & wxDV_NO_HEADER) != 0)
201 this->SetHeaderButtonHeight(0);
202} /* wxMacDataBrowserTableViewControl::wxMacDataBrowserTableViewControl(wxWindow*, wxPoint const&, wxSize const&, long) */
203
204//
205// callback handling
206//
207OSStatus wxMacDataBrowserTableViewControl::SetCallbacks(DataBrowserCallbacks const* callbacks)
208{
209 return ::SetDataBrowserCallbacks(this->m_controlRef,callbacks);
210} /* wxMacDataBrowserTableViewControl::SetCallbacks(DataBrowserCallbacks const*) */
211
212OSStatus wxMacDataBrowserTableViewControl::SetCustomCallbacks(DataBrowserCustomCallbacks const* customCallbacks)
213{
214 return ::SetDataBrowserCustomCallbacks(this->m_controlRef,customCallbacks);
215} /* xMacDataBrowserTableViewControl::SetCustomCallbacks(DataBrowserCustomCallbacks const*) */
216
217//
218// header handling
219//
220OSStatus wxMacDataBrowserTableViewControl::GetHeaderDesc(DataBrowserPropertyID propertyID, DataBrowserListViewHeaderDesc* desc) const
221{
222 desc->version = kDataBrowserListViewLatestHeaderDesc; // if this statement is missing the next call will fail (NOT DOCUMENTED!!)
223 return ::GetDataBrowserListViewHeaderDesc(this->m_controlRef,propertyID,desc);
224}
225
226OSStatus wxMacDataBrowserTableViewControl::SetHeaderDesc(DataBrowserPropertyID propertyID, DataBrowserListViewHeaderDesc* desc)
227{
228 return ::SetDataBrowserListViewHeaderDesc(this->m_controlRef,propertyID,desc);
229}
230
231//
232// layout handling
233//
234OSStatus wxMacDataBrowserTableViewControl::AutoSizeColumns()
235{
236 return AutoSizeDataBrowserListViewColumns(this->m_controlRef);
237}
238
239OSStatus wxMacDataBrowserTableViewControl::EnableCellSizeModification(bool enableHeight, bool enableWidth)
240{
241 return ::SetDataBrowserTableViewGeometry(this->GetControlRef(),enableWidth,enableHeight);
242} /* wxMacDataBrowserTableViewControl::EnableCellSizeModification(bool, bool) */
243
244OSStatus wxMacDataBrowserTableViewControl::GetAttributes(OptionBits* attributes)
245{
246 return ::DataBrowserGetAttributes(this->GetControlRef(),attributes);
247} /* wxMacDataBrowserTableViewControl::GetAttributes(OptionBits*) */
248
249OSStatus wxMacDataBrowserTableViewControl::GetColumnWidth(DataBrowserPropertyID propertyID, UInt16* width) const
250{
251 return ::GetDataBrowserTableViewNamedColumnWidth(this->m_controlRef,propertyID,width);
252}
253
254OSStatus wxMacDataBrowserTableViewControl::GetDefaultColumnWidth( UInt16 *width ) const
255{
256 return GetDataBrowserTableViewColumnWidth(this->m_controlRef, width );
257}
258
259OSStatus wxMacDataBrowserTableViewControl::GetDefaultRowHeight(UInt16* height) const
260{
261 return ::GetDataBrowserTableViewRowHeight(this->m_controlRef,height);
262}
263
264OSStatus wxMacDataBrowserTableViewControl::GetHeaderButtonHeight(UInt16 *height)
265{
266 return ::GetDataBrowserListViewHeaderBtnHeight(this->m_controlRef,height);
267}
268
269OSStatus wxMacDataBrowserTableViewControl::GetPartBounds(DataBrowserItemID item, DataBrowserPropertyID propertyID, DataBrowserPropertyPart part, Rect* bounds)
270{
271 return ::GetDataBrowserItemPartBounds(this->m_controlRef,item,propertyID,part,bounds);
272} /* wxMacDataBrowserTableViewControl::GetPartBounds(DataBrowserItemID, DataBrowswerPropertyID, DataBrowserPropertyPart, Rect*) */
273
274OSStatus wxMacDataBrowserTableViewControl::GetRowHeight(DataBrowserItemID item, UInt16* height) const
275{
276 return ::GetDataBrowserTableViewItemRowHeight(this->m_controlRef,item,height);
277} /* wxMacDataBrowserTableViewControl::GetRowHeight(DataBrowserItemID, UInt16*) const */
278
279OSStatus wxMacDataBrowserTableViewControl::GetScrollPosition( UInt32 *top , UInt32 *left ) const
280{
281 return GetDataBrowserScrollPosition(this->m_controlRef, top , left );
282}
283
284OSStatus wxMacDataBrowserTableViewControl::SetAttributes(OptionBits attributes)
285{
286 return ::DataBrowserChangeAttributes(this->GetControlRef(),attributes,~attributes);
287} /* wxMacDataBrowserTableViewControl::SetAttributes(OptionBits) */
288
289OSStatus wxMacDataBrowserTableViewControl::SetColumnWidth(DataBrowserPropertyID propertyID, UInt16 width)
290{
291 return ::SetDataBrowserTableViewNamedColumnWidth(this->m_controlRef,propertyID,width);
292}
293
294OSStatus wxMacDataBrowserTableViewControl::SetDefaultColumnWidth(UInt16 width)
295{
296 return ::SetDataBrowserTableViewColumnWidth(this->m_controlRef,width);
297}
298
299OSStatus wxMacDataBrowserTableViewControl::SetDefaultRowHeight(UInt16 height)
300{
301 return ::SetDataBrowserTableViewRowHeight(this->m_controlRef,height);
302}
303
304OSStatus wxMacDataBrowserTableViewControl::SetHasScrollBars(bool horiz, bool vert)
305{
306 return ::SetDataBrowserHasScrollBars(this->m_controlRef,horiz,vert);
307} /* wxMacDataBrowserTableViewControl::SetHasScrollBars(bool, bool) */
308
309OSStatus wxMacDataBrowserTableViewControl::SetHeaderButtonHeight(UInt16 height)
310{
311 return ::SetDataBrowserListViewHeaderBtnHeight(this->m_controlRef,height);
312} /* wxMacDataBrowserTableViewControl::SetHeaderButtonHeight(UInt16) */
313
314OSStatus wxMacDataBrowserTableViewControl::SetHiliteStyle(DataBrowserTableViewHiliteStyle hiliteStyle)
315{
316 return ::SetDataBrowserTableViewHiliteStyle(this->m_controlRef,hiliteStyle);
317} /*wxMacDataBrowserTableViewControl::SetHiliteStyle(DataBrowserTableViewHiliteStyle) */
318
319OSStatus wxMacDataBrowserTableViewControl::SetIndent(float Indent)
320{
321 return ::DataBrowserSetMetric(this->m_controlRef,kDataBrowserMetricDisclosureColumnPerDepthGap,true,Indent);
322} /* wxMacDataBrowserTableViewControl::SetIndent(float* Indent) */
323
324OSStatus wxMacDataBrowserTableViewControl::SetRowHeight(DataBrowserItemID item, UInt16 height)
325{
326 return ::SetDataBrowserTableViewItemRowHeight(this->m_controlRef,item,height);
327}
328
329OSStatus wxMacDataBrowserTableViewControl::SetScrollPosition(UInt32 top, UInt32 left)
330{
331 return ::SetDataBrowserScrollPosition(this->m_controlRef,top,left);
332}
333
334//
335// column handling
336//
337OSStatus wxMacDataBrowserTableViewControl::GetColumnCount(UInt32* numColumns) const
338{
339 return ::GetDataBrowserTableViewColumnCount(this->m_controlRef,numColumns);
340}
341
342OSStatus wxMacDataBrowserTableViewControl::GetColumnIndex(DataBrowserPropertyID propertyID, DataBrowserTableViewColumnIndex* index) const
343{
344 return ::GetDataBrowserTableViewColumnPosition(this->m_controlRef,propertyID,index);
345} /* wxMacDataBrowserTableViewControl::GetColumnIndex(DataBrowserPropertyID, DataBrowserTableViewColumnIndex*) const */
346
347OSStatus wxMacDataBrowserTableViewControl::GetFreePropertyID(DataBrowserPropertyID* propertyID) const
348{
349 for (*propertyID=kMinPropertyID; *propertyID<std::numeric_limits<DataBrowserPropertyID>::max(); ++(*propertyID))
350 if (this->IsUsedPropertyID(*propertyID) == errDataBrowserPropertyNotFound)
351 return noErr;
352 return errDataBrowserPropertyNotSupported;
353} /* wxMacDataBrowserTableViewControl::GetFreePropertyID(DataBrowserPropertyID*) const */
354
355OSStatus wxMacDataBrowserTableViewControl::GetPropertyFlags(DataBrowserPropertyID propertyID, DataBrowserPropertyFlags *flags) const
356{
357 return ::GetDataBrowserPropertyFlags(this->m_controlRef,propertyID,flags);
358}
359
360OSStatus wxMacDataBrowserTableViewControl::GetPropertyID(DataBrowserItemDataRef itemData, DataBrowserPropertyID* propertyID)
361{
362 return ::GetDataBrowserItemDataProperty(itemData,propertyID);
363} /* wxMacDataBrowserTableViewControl::GetPropertyID(DataBrowserItemDataRef, DataBrowserPropertyID*) */
364
365OSStatus wxMacDataBrowserTableViewControl::GetPropertyID(DataBrowserTableViewColumnIndex index, DataBrowserTableViewColumnID* propertyID)
366{
367 return ::GetDataBrowserTableViewColumnProperty(this->m_controlRef,index,propertyID);
368} /* wxMacDataBrowserTableViewControl::GetPropertyID(DataBrowserTableViewColumnIndex, DataBrowserTableViewColumnID*) */
369
370OSStatus wxMacDataBrowserTableViewControl::IsUsedPropertyID(DataBrowserPropertyID propertyID) const
371{
372 // 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
373 // 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
374 // the column position for the property id:
375 DataBrowserTableViewColumnIndex index;
376
377 return ::GetDataBrowserTableViewColumnPosition(this->m_controlRef,propertyID,&index);
378} /* wxMacDataBrowserTableViewControl::IsUsedPropertyId(DataBrowserPropertyID) const */
379
380OSStatus wxMacDataBrowserTableViewControl::RemoveColumnByProperty(DataBrowserTableViewColumnID propertyID)
381{
382 return ::RemoveDataBrowserTableViewColumn(this->m_controlRef,propertyID);
383} /* wxMacDataBrowserTableViewControl::RemoveColumnByProperty(DataBrowserTableViewColumnID) */
384
385OSStatus wxMacDataBrowserTableViewControl::RemoveColumnByIndex(DataBrowserTableViewColumnIndex index)
386{
387 DataBrowserTableViewColumnID propertyID;
388
389
390 this->GetPropertyID(index,&propertyID);
391 return ::RemoveDataBrowserTableViewColumn(this->m_controlRef,propertyID);
392} /* wxMacDataBrowserTableViewControl::RemoveColumnByIndex(DataBrowserTableViewColumnIndex) */
393
394OSStatus wxMacDataBrowserTableViewControl::SetColumnIndex(DataBrowserPropertyID propertyID, DataBrowserTableViewColumnIndex index)
395{
396 return ::SetDataBrowserTableViewColumnPosition(this->m_controlRef,propertyID,index);
397} /* wxMacDataBrowserTableViewControl::SetColumnIndex(DataBrowserPropertyID, DataBrowserTableViewColumnIndex) */
398
399OSStatus wxMacDataBrowserTableViewControl::SetDisclosureColumn(DataBrowserPropertyID propertyID, Boolean expandableRows)
400{
401 return ::SetDataBrowserListViewDisclosureColumn(this->m_controlRef,propertyID,expandableRows);
402}
403
404OSStatus wxMacDataBrowserTableViewControl::SetPropertyFlags(DataBrowserPropertyID propertyID, DataBrowserPropertyFlags flags)
405{
406 return ::SetDataBrowserPropertyFlags(this->m_controlRef,propertyID,flags);
407} /* wxMacDataBrowserTableViewControl::SetPropertyFlags(DataBrowserPropertyID, DataBrowserPropertyFlags) */
408
409//
410// item handling
411//
412OSStatus wxMacDataBrowserTableViewControl::AddItems(DataBrowserItemID container, UInt32 numItems, DataBrowserItemID const* items, DataBrowserPropertyID preSortProperty)
413{
414 return ::AddDataBrowserItems(this->m_controlRef,container,numItems,items,preSortProperty);
415} /* wxMacDataBrowserTableViewControl::AddItems(DataBrowserItemID, UInt32, DataBrowserItemID const*, DataBrowserPropertyID) */
416
417OSStatus wxMacDataBrowserTableViewControl::GetFreeItemID(DataBrowserItemID* id) const
418{
419 ItemCount NoOfItems;
420
421 OSStatus status;
422
423
424 status = this->GetItemCount(&NoOfItems);
425 wxCHECK_MSG(status == noErr,status,_("Could not retrieve number of items"));
426 if (NoOfItems == 0)
427 {
428 *id = 1;
429 return noErr;
430 } /* if */
431 else
432 {
433 // 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
434 // as the number of items; therefore, start from the number of items to look for a new ID:
435 for (*id=NoOfItems; *id<std::numeric_limits<DataBrowserItemID>::max(); ++(*id))
436 if (this->IsUsedItemID(*id) == errDataBrowserItemNotFound)
437 return noErr;
438 // as the first approach was not successful, try from the beginning:
439 for (*id=0; *id<NoOfItems; ++(*id))
440 if (this->IsUsedItemID(*id) == errDataBrowserItemNotFound)
441 return noErr;
442 // sorry, data browser is full:
443 return errDataBrowserItemNotAdded;
444 } /* if */
445} /* wxMacDataBrowserTableViewControl::GetFreeItemID(DataBrowserItemID*) const */
446
447OSStatus wxMacDataBrowserTableViewControl::GetItemCount(DataBrowserItemID container, Boolean recurse, DataBrowserItemState state, ItemCount* numItems) const
448{
449 return GetDataBrowserItemCount(this->m_controlRef,container,recurse,state,numItems);
450} /* wxMacDataBrowserTableViewControl::GetItemCount(DataBrowserItemID, Boolean, DataBrowserItemState, ItemCount*) const */
451
452OSStatus wxMacDataBrowserTableViewControl::GetItemID( DataBrowserTableViewRowIndex row, DataBrowserItemID * item ) const
453{
454 return GetDataBrowserTableViewItemID(this->m_controlRef,row,item);
455}
456
457OSStatus wxMacDataBrowserTableViewControl::GetItems(DataBrowserItemID container, Boolean recurse, DataBrowserItemState state, Handle items) const
458{
459 return GetDataBrowserItems(this->m_controlRef,container,recurse,state,items);
460} /* wxMacDataBrowserTableViewControl::GetItems(DataBrowserItemID, Boolean, DataBrowserItemState, Handle) const */
461
462OSStatus wxMacDataBrowserTableViewControl::GetItemRow(DataBrowserItemID item, DataBrowserTableViewRowIndex* row) const
463{
464 return GetDataBrowserTableViewItemRow(this->m_controlRef,item,row);
465}
466
467OSStatus wxMacDataBrowserTableViewControl::IsUsedItemID(DataBrowserItemID itemID) const
468{
469 // 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
470 // 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
471 // the column position for the property id:
472 DataBrowserTableViewColumnIndex index;
473
474 return ::GetDataBrowserTableViewItemRow(this->m_controlRef,itemID,&index);
475} /* wxMacDataBrowserTableViewControl::IsUsedItemID(DataBrowserItemID) const */
476
477OSStatus wxMacDataBrowserTableViewControl::RemoveItems(DataBrowserItemID container, UInt32 numItems, DataBrowserItemID const* items, DataBrowserPropertyID preSortProperty)
478{
479 return ::RemoveDataBrowserItems(this->m_controlRef,container,numItems,items,preSortProperty);
480}
481
482OSStatus wxMacDataBrowserTableViewControl::RevealItem(DataBrowserItemID item, DataBrowserPropertyID propertyID, DataBrowserRevealOptions options) const
483{
484 return ::RevealDataBrowserItem(this->m_controlRef,item,propertyID,options);
485} /* wxMacDataBrowserTableViewControl::RevealItem(DataBrowserItemID item, DataBrowserPropertyID propertyID, DataBrowserRevealOptions options) const */
486
487OSStatus wxMacDataBrowserTableViewControl::UpdateItems(DataBrowserItemID container, UInt32 numItems, DataBrowserItemID const* items, DataBrowserPropertyID preSortProperty,
488 DataBrowserPropertyID propertyID) const
489{
490 return UpdateDataBrowserItems(this->m_controlRef,container,numItems,items,preSortProperty,propertyID);
491}
492
493//
494// item selection
495//
496size_t wxMacDataBrowserTableViewControl::GetSelectedItemIDs(wxArrayDataBrowserItemID& itemIDs) const
497{
498 DataBrowserItemID* itemIDPtr;
499 Handle handle(::NewHandle(0));
500
501 size_t NoOfItems;
502
503
504 wxCHECK_MSG(this->GetItems(kDataBrowserNoItem,true,kDataBrowserItemIsSelected,handle) == noErr,0,_("Could not get selected items."));
505 NoOfItems = static_cast<size_t>(::GetHandleSize(handle)/sizeof(DataBrowserItemID));
506 itemIDs.Empty();
507 itemIDs.Alloc(NoOfItems);
508 HLock(handle);
509 itemIDPtr = (DataBrowserItemID*) (*handle);
510 for (size_t i=0; i<NoOfItems; ++i)
511 {
512 itemIDs.Add(*itemIDPtr);
513 ++itemIDPtr;
514 } /* for */
515 HUnlock(handle);
516 DisposeHandle(handle);
517 return NoOfItems;
518} /* wxMacDataBrowserTableViewControl::GetSelectedItemIDs(wxArrayDataBrowserItemID&) const*/
519
520OSStatus wxMacDataBrowserTableViewControl::GetSelectionAnchor(DataBrowserItemID* first, DataBrowserItemID* last) const
521{
522 return ::GetDataBrowserSelectionAnchor(this->m_controlRef,first,last);
523} /* wxMacDataBrowserTableViewControl::GetSelectionAnchor(DataBrowserItemID*, DataBrowserItemID*) const */
524
525OSStatus wxMacDataBrowserTableViewControl::GetSelectionFlags(DataBrowserSelectionFlags* flags) const
526{
527 return ::GetDataBrowserSelectionFlags(this->m_controlRef,flags);
528} /* wxMacDataBrowserTableViewControl::GetSelectionFlags(DataBrowserSelectionFlags*) const */
529
530bool wxMacDataBrowserTableViewControl::IsItemSelected(DataBrowserItemID item) const
531{
532 return ::IsDataBrowserItemSelected(this->m_controlRef,item);
533} /* wxMacDataBrowserTableViewControl::IsItemSelected(DataBrowserItemID) const */
534
535OSStatus wxMacDataBrowserTableViewControl::SetSelectionFlags(DataBrowserSelectionFlags flags)
536{
537 return ::SetDataBrowserSelectionFlags(this->m_controlRef,flags);
538} /* wxMacDataBrowserTableViewControl::SetSelectionFlags(DataBrowserSelectionFlags) */
539
540OSStatus wxMacDataBrowserTableViewControl::SetSelectedItems(UInt32 numItems, DataBrowserItemID const* items, DataBrowserSetOption operation)
541{
542 return ::SetDataBrowserSelectedItems(this->m_controlRef, numItems, items, operation );
543} /* wxMacDataBrowserTableViewControl::SetSelectedItems(UInt32, DataBrowserItemID const*, DataBrowserSetOption) */
544
545OSStatus wxMacDataBrowserTableViewControl::GetSortOrder(DataBrowserSortOrder* order) const
546{
547 return ::GetDataBrowserSortOrder(this->m_controlRef,order);
548}
549
550OSStatus wxMacDataBrowserTableViewControl::GetSortProperty(DataBrowserPropertyID* propertyID) const
551{
552 return ::GetDataBrowserSortProperty(this->m_controlRef,propertyID);
553}
554
555OSStatus wxMacDataBrowserTableViewControl::Resort(DataBrowserItemID container, Boolean sortChildren)
556{
557 return ::SortDataBrowserContainer(this->m_controlRef,container,sortChildren);
558} /* wxMacDataBrowserTableViewControl::Resort(DataBrowserItemID, Boolean) */
559
560OSStatus wxMacDataBrowserTableViewControl::SetSortOrder(DataBrowserSortOrder order)
561{
562 return ::SetDataBrowserSortOrder(this->m_controlRef,order);
563}
564
565OSStatus wxMacDataBrowserTableViewControl::SetSortProperty(DataBrowserPropertyID propertyID)
566{
567 return ::SetDataBrowserSortProperty(this->m_controlRef,propertyID);
568}
569
570//
571// container handling
572//
573OSStatus wxMacDataBrowserTableViewControl::CloseContainer(DataBrowserItemID containerID)
574{
575 return ::CloseDataBrowserContainer(this->m_controlRef,containerID);
576} /* wxMacDataBrowserTableViewControl::CloseContainer(DataBrowserItemID) */
577
578OSStatus wxMacDataBrowserTableViewControl::OpenContainer(DataBrowserItemID containerID)
579{
580 return ::OpenDataBrowserContainer(this->m_controlRef,containerID);
581} /* wxMacDataBrowserTableViewControl::OpenContainer(DataBrowserItemID) */
582
583IMPLEMENT_ABSTRACT_CLASS(wxMacDataBrowserTableViewControl,wxMacControl)
584
585// ============================================================================
586// wxMacDataBrowserListViewControl
587// ============================================================================
588#pragma mark -
589//
590// column handling
591//
592OSStatus wxMacDataBrowserListViewControl::AddColumn(DataBrowserListViewColumnDesc *columnDesc, DataBrowserTableViewColumnIndex position)
593{
594 return AddDataBrowserListViewColumn(this->m_controlRef,columnDesc,position);
595} /* wxMacDataBrowserListViewControl::AddColumn(DataBrowserListViewColumnDesc*, DataBrowserTableViewColumnIndex) */
596
597// ============================================================================
598// wxMacDataViewDataBrowserListViewControl
599// ============================================================================
600#pragma mark -
601//
602// constructors / destructor
603//
604wxMacDataViewDataBrowserListViewControl::wxMacDataViewDataBrowserListViewControl(wxWindow* peer, wxPoint const& pos, wxSize const& size, long style)
605 :wxMacDataBrowserListViewControl(peer,pos,size,style)
606{
607} /* wxMacDataViewDataBrowserListViewControl::wxMacDataViewDataBrowserListViewControl(wxWindow* , const wxPoint&, const wxSize&, long) */
608
609//
610// callback functions (inherited from wxMacDataBrowserTableViewControl)
611//
612Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserCompareProc(DataBrowserItemID itemOneID, DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty)
613{
614 DataBrowserSortOrder sortOrder;
615
616 DataBrowserTableViewColumnIndex modelColumnIndex;
617
618 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetPeer()));
619
620
621 wxCHECK_MSG(dataViewCtrlPtr != NULL, false,_("Pointer to data view control not set correctly."));
622 wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,false,_("Pointer to model not set correctly."));
623 if (sortProperty >= kMinPropertyID)
624 {
625 // variable definition and initialization:
626 wxDataViewColumn* ColumnPtr(dataViewCtrlPtr->GetColumnPtr(sortProperty));
627
628 wxCHECK_MSG(ColumnPtr != NULL,false,_("Could not determine column index."));
629 modelColumnIndex = ColumnPtr->GetModelColumn();
630 } /* if */
631 else
632 modelColumnIndex = 0;
633 this->GetSortOrder(&sortOrder);
634 return static_cast<Boolean>(dataViewCtrlPtr->GetModel()->Compare(wxDataViewItem(reinterpret_cast<void*>(itemOneID)),wxDataViewItem(reinterpret_cast<void*>(itemTwoID)),
635 modelColumnIndex,sortOrder != kDataBrowserOrderDecreasing) < 0);
636} /* wxMacDataViewDataBrowserListViewControl::DataBrowserCompareProc(DataBrowserItemID, DataBrowserItemID, DataBrowserPropertyID) */
637
638void wxMacDataViewDataBrowserListViewControl::DataBrowserGetContextualMenuProc(MenuRef* menu, UInt32* helpType, CFStringRef* helpItemString, AEDesc* WXUNUSED(selection))
639 // In this method we do not supply a contextual menu handler at all but only send a wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU.
640{
641 wxArrayDataBrowserItemID itemIDs;
642
643 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetPeer()));
644
645
646 wxCHECK_RET(dataViewCtrlPtr != NULL,_("wxWidget control pointer is not a data view pointer"));
647 // initialize parameters so that no context menu will be displayed automatically by the native data browser:
648 *menu = NULL;
649 *helpType = kCMHelpItemNoHelp;
650 *helpItemString = NULL;
651 // create information for a context menu event:
652 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU,dataViewCtrlPtr->GetId());
653
654 dataViewEvent.SetModel(dataViewCtrlPtr->GetModel());
655 // get the item information;
656 // 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:
657 if (this->GetSelectedItemIDs(itemIDs) > 0)
658 dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemIDs[0])));
659 // finally send the equivalent wxWidget event:
660 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
661} /* wxMacDataViewDataBrowserListViewControl::DataBrowserGetContextualMenuProc(MenuRef*, UInt32*, CFStringRef*, AEDesc*) */
662
663OSStatus wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemDataRef itemData, Boolean getValue)
664{
665 if (getValue)
666 {
667 // variable definitions:
668 wxDataViewCtrl* dataViewCtrlPtr;
669
670 dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetPeer());
671 wxCHECK_MSG(dataViewCtrlPtr != NULL,errDataBrowserNotConfigured,_("Pointer to data view control not set correctly."));
672 if (dataViewCtrlPtr->IsDeleting())
673 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
674 else
675 {
676 // variable definitions:
677 OSStatus errorStatus;
678 wxDataViewColumn* dataViewColumnPtr;
679
680 wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,errDataBrowserNotConfigured,_("Pointer to model not set correctly."));
681 dataViewColumnPtr = dataViewCtrlPtr->GetColumnPtr(propertyID);
682 wxCHECK_MSG((dataViewColumnPtr != NULL) && (dataViewColumnPtr->GetRenderer() != NULL),errDataBrowserNotConfigured,_("There is no column or renderer for the specified column index."));
683 switch (dataViewColumnPtr->GetRenderer()->GetPropertyType())
684 {
685 case kDataBrowserCheckboxType:
686 {
687 // variable definition:
688 ThemeButtonValue buttonValue;
689
690 errorStatus = ::GetDataBrowserItemDataButtonValue(itemData,&buttonValue);
691 if (errorStatus == noErr)
692 {
693 if (buttonValue == kThemeButtonOn)
694 {
695 // variable definition and initialization:
696 wxVariant modifiedData(true);
697
698 return (dataViewCtrlPtr->GetModel()->SetValue(modifiedData,wxDataViewItem(reinterpret_cast<void*>(itemID)),dataViewColumnPtr->GetModelColumn()) ? OSStatus(noErr) : OSStatus(errDataBrowserNotConfigured));
699 } /* if */
700 else if (buttonValue == kThemeButtonOff)
701 {
702 // variable definition and initialization:
703 wxVariant modifiedData(false);
704
705 return (dataViewCtrlPtr->GetModel()->SetValue(modifiedData,wxDataViewItem(reinterpret_cast<void*>(itemID)),dataViewColumnPtr->GetModelColumn()) ? OSStatus(noErr) : OSStatus(errDataBrowserNotConfigured));
706 } /* if */
707 else
708 return errDataBrowserInvalidPropertyData;
709 } /* if */
710 else
711 return errorStatus;
712 } /* block */
713 case kDataBrowserTextType:
714 {
715 // variable definitions:
716 CFStringRef stringReference;
717
718 errorStatus = ::GetDataBrowserItemDataText(itemData,&stringReference);
719 if (errorStatus == noErr)
720 {
721 // variable definitions and initializations:
722#if wxCHECK_VERSION(2,9,0)
723 wxCFStringRef modifiedString(stringReference);
724#else
725 wxMacCFStringHolder modifiedString(stringReference);
726#endif
727 wxVariant modifiedData(modifiedString.AsString());
728
729 if (dataViewCtrlPtr->GetModel()->SetValue(modifiedData,wxDataViewItem(reinterpret_cast<void*>(itemID)),dataViewColumnPtr->GetModelColumn()))
730 return noErr;
731 else
732 return errDataBrowserNotConfigured;
733 } /* if */
734 else
735 return errorStatus;
736 } /* block */
737 default:
738 return errDataBrowserPropertyNotSupported;
739 } /* switch */
740 } /* if */
741 } /* if */
742 else
743 {
744 if (propertyID >= kMinPropertyID) // in case data columns set the data
745 {
746 // variable definitions:
747 wxVariant variant;
748 wxDataViewColumn* dataViewColumnPtr;
749 wxDataViewCtrl* dataViewCtrlPtr;
750
751 dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetPeer());
752 wxCHECK_MSG(dataViewCtrlPtr != NULL,errDataBrowserNotConfigured,_("Pointer to data view control not set correctly."));
753 wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,errDataBrowserNotConfigured,_("Pointer to model not set correctly."));
754 dataViewColumnPtr = dataViewCtrlPtr->GetColumnPtr(propertyID);
755 wxCHECK_MSG(dataViewColumnPtr != NULL,errDataBrowserNotConfigured,_("No column for the specified column position existing."));
756 wxCHECK_MSG(dataViewColumnPtr->GetRenderer() != NULL,errDataBrowserNotConfigured,_("No renderer specified for column."));
757 dataViewCtrlPtr->GetModel()->GetValue(variant,wxDataViewItem(reinterpret_cast<void*>(itemID)),dataViewColumnPtr->GetModelColumn());
758 if (!(variant.IsNull()))
759 {
760 dataViewColumnPtr->GetRenderer()->SetDataReference(itemData);
761 dataViewColumnPtr->GetRenderer()->SetValue(variant);
762 wxCHECK_MSG(dataViewColumnPtr->GetRenderer()->Render(),errDataBrowserNotConfigured,_("Rendering failed."));
763 } /* if */
764 return noErr;
765 } /* if */
766 else // react on special system requests
767 {
768 switch (propertyID)
769 {
770 case kDataBrowserContainerIsClosableProperty:
771 {
772 // variable definitions:
773 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetPeer()));
774
775 wxCHECK_MSG(dataViewCtrlPtr != NULL,errDataBrowserNotConfigured,_("Pointer to data view control not set correctly."));
776 // initialize wxWidget event:
777 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING,dataViewCtrlPtr->GetId()); // variable definition
778
779 dataViewEvent.SetEventObject(dataViewCtrlPtr);
780 dataViewEvent.SetItem (wxDataViewItem(reinterpret_cast<void*>(itemID)));
781 dataViewEvent.SetModel (dataViewCtrlPtr->GetModel());
782 // finally send the equivalent wxWidget event:
783 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
784 // opening the container is allowed if not vetoed:
785 return ::SetDataBrowserItemDataBooleanValue(itemData,dataViewEvent.IsAllowed());
786 } /* block */
787 case kDataBrowserContainerIsOpenableProperty:
788 {
789 // variable definitions:
790 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetPeer()));
791
792 wxCHECK_MSG(dataViewCtrlPtr != NULL,errDataBrowserNotConfigured,_("Pointer to data view control not set correctly."));
793 // initialize wxWidget event:
794 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING,dataViewCtrlPtr->GetId()); // variable definition
795
796 dataViewEvent.SetEventObject(dataViewCtrlPtr);
797 dataViewEvent.SetItem (wxDataViewItem(reinterpret_cast<void*>(itemID)));
798 dataViewEvent.SetModel (dataViewCtrlPtr->GetModel());
799 // finally send the equivalent wxWidget event:
800 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
801 // opening the container is allowed if not vetoed:
802 return ::SetDataBrowserItemDataBooleanValue(itemData,dataViewEvent.IsAllowed());
803 } /* block */
804 case kDataBrowserItemIsContainerProperty:
805 {
806 // variable definition:
807 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetPeer()));
808
809 wxCHECK_MSG(dataViewCtrlPtr != NULL,errDataBrowserNotConfigured,_("Pointer to data view control not set correctly."));
810 wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,errDataBrowserNotConfigured,_("Pointer to model not set correctly."));
811 return ::SetDataBrowserItemDataBooleanValue(itemData,dataViewCtrlPtr->GetModel()->IsContainer(wxDataViewItem(reinterpret_cast<void*>(itemID))));
812 } /* block */
813 case kDataBrowserItemIsEditableProperty:
814 return ::SetDataBrowserItemDataBooleanValue(itemData,true);
815 } /* switch */
816 } /* if */
817 } /* if */
818 return errDataBrowserPropertyNotSupported;
819} /* wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc(DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemDataRef, Boolean) */
820
821void wxMacDataViewDataBrowserListViewControl::DataBrowserItemNotificationProc(DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef itemData)
822{
823 wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetPeer()));
824
825
826 // 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:
827 if (dataViewCtrlPtr != NULL)
828 switch (message)
829 {
830 case kDataBrowserContainerClosed:
831 dataViewCtrlPtr->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
832 {
833 // initialize wxWidget event:
834 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED,dataViewCtrlPtr->GetId()); // variable definition
835
836 dataViewEvent.SetEventObject(dataViewCtrlPtr);
837 dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
838 // finally send the equivalent wxWidget event:
839 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
840 } /* block */
841 break;
842 case kDataBrowserContainerOpened:
843 dataViewCtrlPtr->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
844 {
845 // initialize wxWidget event:
846 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED,dataViewCtrlPtr->GetId()); // variable definition
847
848 dataViewEvent.SetEventObject(dataViewCtrlPtr);
849 dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
850 // finally send the equivalent wxWidget event:
851 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
852 // add children to the expanded container:
853 dataViewCtrlPtr->AddChildrenLevel(wxDataViewItem(reinterpret_cast<void*>(itemID)));
854 } /* block */
855 break;
856 case kDataBrowserEditStarted:
857 dataViewCtrlPtr->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
858 {
859 // initialize wxWidget event:
860 DataBrowserPropertyID propertyID;
861 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED,dataViewCtrlPtr->GetId()); // variable definition
862
863 dataViewEvent.SetEventObject(dataViewCtrlPtr);
864 dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
865 if (this->GetPropertyID(itemData,&propertyID) == noErr)
866 {
867 // variable definition and initialization:
868 DataBrowserTableViewColumnIndex columnIndex;
869
870 wxCHECK_RET(this->GetColumnIndex(propertyID,&columnIndex),_("Column index not found."));
871 dataViewEvent.SetColumn(columnIndex);
872 dataViewEvent.SetDataViewColumn(dataViewCtrlPtr->GetColumnPtr(propertyID));
873 } /* if */
874 // finally send the equivalent wxWidget event:
875 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
876 } /* block */
877 break;
878 case kDataBrowserEditStopped:
879 {
880 // initialize wxWidget event:
881 DataBrowserPropertyID propertyID;
882 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE,dataViewCtrlPtr->GetId()); // variable definition
883
884 dataViewEvent.SetEventObject(dataViewCtrlPtr);
885 dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
886 if (this->GetPropertyID(itemData,&propertyID) == noErr)
887 {
888 // variable definition and initialization:
889 DataBrowserTableViewColumnIndex columnIndex;
890
891 wxCHECK_RET(this->GetColumnIndex(propertyID,&columnIndex),_("Column index not found."));
892 dataViewEvent.SetColumn(columnIndex);
893 dataViewEvent.SetDataViewColumn(dataViewCtrlPtr->GetColumnPtr(propertyID));
894 } /* if */
895 // finally send the equivalent wxWidget event:
896 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
897 } /* block */
898 break;
899 case kDataBrowserItemAdded:
900 dataViewCtrlPtr->FinishCustomItemEditing();
901 break;
902 case kDataBrowserItemDeselected:
903 dataViewCtrlPtr->FinishCustomItemEditing();
904 break;
905 case kDataBrowserItemDoubleClicked:
906 {
907 // initialize wxWidget event:
908 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED,dataViewCtrlPtr->GetId()); // variable definition
909
910 dataViewEvent.SetEventObject(dataViewCtrlPtr);
911 dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
912 // finally send the equivalent wxWidget event:
913 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
914 } /* block */
915 break;
916 case kDataBrowserItemRemoved:
917 dataViewCtrlPtr->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
918 break;
919 case kDataBrowserItemSelected:
920 break; // not implemented by wxWidgets; see kDataBrowserSelectionSetChanged
921 case kDataBrowserSelectionSetChanged:
922 {
923 // initialize wxWidget event:
924 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED,dataViewCtrlPtr->GetId()); // variable definition
925
926 dataViewEvent.SetEventObject(dataViewCtrlPtr);
927 dataViewEvent.SetModel (dataViewCtrlPtr->GetModel());
928 // finally send the equivalent wxWidget event:
929 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
930 } /* block */
931 break;
932 case kDataBrowserTargetChanged: // no idea if this notification is ever sent
933 break;
934 case kDataBrowserUserStateChanged:
935 {
936 // finish custom item editing if necessary:
937 dataViewCtrlPtr->FinishCustomItemEditing();
938 // update column widths:
939 for (size_t i=0; i<dataViewCtrlPtr->GetColumnCount(); ++i)
940 {
941 // constant definition for abbreviational purposes:
942 wxDataViewColumn* const columnPtr = dataViewCtrlPtr->GetColumn(i);
943 // variable definition:
944 UInt16 columnWidth;
945
946 wxCHECK_RET(this->GetColumnWidth(columnPtr->GetPropertyID(),&columnWidth) == noErr,_("Column width could not be determined"));
947 columnPtr->SetWidthVariable(columnWidth);
948 } /* for */
949 // update sorting orders:
950 DataBrowserPropertyID propertyID; // variable definition
951
952 if ((this->GetSortProperty(&propertyID) == noErr) && (propertyID >= kMinPropertyID))
953 {
954 DataBrowserSortOrder sortOrder;
955 DataBrowserTableViewColumnIndex columnIndex;
956
957 if ((this->GetSortOrder(&sortOrder) == noErr) && (this->GetColumnIndex(propertyID,&columnIndex) == noErr))
958 {
959 // variable definition and initialization:
960 wxDataViewColumn* columnPtr;
961 columnPtr = dataViewCtrlPtr->GetColumn(columnIndex);
962 // check if the sort order has changed:
963 if ( columnPtr->IsSortOrderAscending() && (sortOrder == kDataBrowserOrderDecreasing) ||
964 !(columnPtr->IsSortOrderAscending()) && (sortOrder == kDataBrowserOrderIncreasing))
965 {
966 columnPtr->SetSortOrder(!(columnPtr->IsSortOrderAscending()));
967 // initialize wxWidget event:
968 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED,dataViewCtrlPtr->GetId()); // variable defintion
969
970 dataViewEvent.SetEventObject(dataViewCtrlPtr);
971 dataViewEvent.SetColumn(columnIndex);
972 dataViewEvent.SetDataViewColumn(columnPtr);
973 // finally send the equivalent wxWidget event:
974 dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
975 } /* if */
976 } /* if */
977 } /* if */
978 } /* block */
979 break;
980 } /* switch */
981} /* wxMacDataViewDataBrowserListViewControl::DataBrowserItemNotificationProc(DataBrowserItemID, DataBrowserItemNotification, DataBrowserItemDataRef) */
982
983void wxMacDataViewDataBrowserListViewControl::DataBrowserDrawItemProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemState state, Rect const* rectangle, SInt16 bitDepth, Boolean colorDevice)
984{
985 wxDataViewColumn* dataViewColumnPtr;
986
987 wxDataViewCtrl* dataViewCtrlPtr;
988
989 wxDataViewCustomRenderer* dataViewCustomRendererPtr;
990
991 wxVariant dataToRender;
992
993
994 dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetPeer());
995 wxCHECK_RET(dataViewCtrlPtr != NULL, _("Pointer to data view control not set correctly."));
996 wxCHECK_RET(dataViewCtrlPtr->GetModel() != NULL,_("Pointer to model not set correctly."));
997 dataViewColumnPtr = dataViewCtrlPtr->GetColumnPtr(propertyID);
998 wxCHECK_RET(dataViewColumnPtr != NULL,_("No column for the specified column index existing."));
999 dataViewCustomRendererPtr = dynamic_cast<wxDataViewCustomRenderer*>(dataViewColumnPtr->GetRenderer());
1000 wxCHECK_RET(dataViewCustomRendererPtr != NULL,_("No renderer or invalid renderer type specified for custom data column."));
1001 dataViewCtrlPtr->GetModel()->GetValue(dataToRender,wxDataViewItem(reinterpret_cast<void*>(itemID)),dataViewColumnPtr->GetModelColumn());
1002 dataViewCustomRendererPtr->SetValue(dataToRender);
1003
1004 // try to determine the content's size (drawable part):
1005 Rect content;
1006 RgnHandle rgn(NewRgn());
1007 UInt16 headerHeight;
1008
1009 if (this->GetRegion(kControlContentMetaPart,rgn) == noErr)
1010 GetRegionBounds(rgn,&content);
1011 else
1012 this->GetRect(&content);
1013 ::DisposeRgn(rgn);
1014 // space for the header
1015 this->GetHeaderButtonHeight(&headerHeight);
1016 content.top += headerHeight;
1017 // extra space for the frame (todo: do not how to determine the space automatically from the control)
1018 content.top += 5;
1019 content.left += 5;
1020 content.right -= 3;
1021 content.bottom -= 3;
1022 // extra space for the scrollbars:
1023 content.bottom -= wxSystemSettings::GetMetric(wxSYS_HSCROLL_Y);
1024 content.right -= wxSystemSettings::GetMetric(wxSYS_VSCROLL_X);
1025
1026 // make sure that 'Render' can draw only in the allowed area:
1027 dataViewCustomRendererPtr->GetDC()->SetClippingRegion(content.left,content.top,content.right-content.left+1,content.bottom-content.top+1);
1028 (void) (dataViewCustomRendererPtr->Render(wxRect(static_cast<int>(rectangle->left),static_cast<int>(rectangle->top),
1029 static_cast<int>(1+rectangle->right-rectangle->left),static_cast<int>(1+rectangle->bottom-rectangle->top)),
1030 dataViewCustomRendererPtr->GetDC(),((state == kDataBrowserItemIsSelected) ? wxDATAVIEW_CELL_SELECTED : 0)));
1031 dataViewCustomRendererPtr->GetDC()->DestroyClippingRegion(); // probably not necessary
1032 // avoid stale information about the DC carried over
1033 dataViewCustomRendererPtr->SetDC( NULL );
1034} /* wxMacDataViewDataBrowserListViewControl::DataBrowserDrawItemProc(DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemState, Rect const*, SInt16, Boolean) */
1035
1036Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserEditItemProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, CFStringRef theString, Rect* maxEditTextRect, Boolean* shrinkToFit)
1037{
1038 return false;
1039} /* wxMacDataViewDataBrowserListViewControl::DataBrowserEditItemProc(DataBrowserItemID, DataBrowserPropertyID, CFStringRef, Rect*, Boolean*) */
1040
1041Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserHitTestProc(DataBrowserItemID WXUNUSED(itemID), DataBrowserPropertyID WXUNUSED(property), Rect const* WXUNUSED(theRect), Rect const* WXUNUSED(mouseRect))
1042{
1043 return true;
1044} /* wxMacDataViewDataBrowserListViewControl::DataBrowserHitTestProc(DataBrowserItemID, DataBrowserPropertyID, Rect const*, Rect const*) */
1045
1046DataBrowserTrackingResult wxMacDataViewDataBrowserListViewControl::DataBrowserTrackingProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Point WXUNUSED(startPt), EventModifiers WXUNUSED(modifiers))
1047{
1048 wxDataViewColumn* dataViewColumnPtr;
1049
1050 wxDataViewCtrl* dataViewCtrlPtr;
1051
1052 wxDataViewCustomRenderer* dataViewCustomRendererPtr;
1053
1054 wxDataViewItem dataViewCustomRendererItem;
1055
1056
1057 dataViewCustomRendererItem = reinterpret_cast<void*>(itemID);
1058 wxCHECK_MSG(dataViewCustomRendererItem.IsOk(),kDataBrowserNothingHit,_("Invalid data view item"));
1059 dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetPeer());
1060 wxCHECK_MSG(dataViewCtrlPtr != NULL,kDataBrowserNothingHit,_("Pointer to data view control not set correctly."));
1061 dataViewColumnPtr = dataViewCtrlPtr->GetColumnPtr(propertyID);
1062 wxCHECK_MSG(dataViewColumnPtr != NULL,kDataBrowserNothingHit,_("No column existing."));
1063 dataViewCustomRendererPtr = dynamic_cast<wxDataViewCustomRenderer*>(dataViewColumnPtr->GetRenderer());
1064 wxCHECK_MSG(dataViewCustomRendererPtr != NULL,kDataBrowserNothingHit,_("No renderer or invalid renderer type specified for custom data column."));
1065 // 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):
1066 if (dataViewCtrlPtr->GetCustomRendererItem() == dataViewCustomRendererItem)
1067 return kDataBrowserContentHit;
1068 // an(other) item is going to be edited and therefore the current editing - if existing - has to be finished:
1069 if (dataViewCtrlPtr->GetCustomRendererPtr() != NULL)
1070 {
1071 dataViewCtrlPtr->GetCustomRendererPtr()->FinishEditing();
1072 dataViewCtrlPtr->SetCustomRendererItem(wxDataViewItem());
1073 dataViewCtrlPtr->SetCustomRendererPtr (NULL);
1074 } /* if */
1075 // check if renderer has got a valid editor control for editing; if this is the case start editing of the new item:
1076 if (dataViewCustomRendererPtr->HasEditorCtrl())
1077 {
1078 // variable definition:
1079 wxRect wxRectangle;
1080
1081 ::wxMacNativeToRect(theRect,&wxRectangle);
1082 dataViewCustomRendererPtr->StartEditing(dataViewCustomRendererItem,wxRectangle);
1083 dataViewCtrlPtr->SetCustomRendererItem(dataViewCustomRendererItem);
1084 dataViewCtrlPtr->SetCustomRendererPtr (dataViewCustomRendererPtr);
1085 } /* if */
1086 return kDataBrowserContentHit;
1087} /* wxMacDataViewDataBrowserListViewControl::DataBrowserTrackingProc(DataBrowserItemID, DataBrowserPropertyID, Rect const*, Point, EventModifiers) */
1088
1089#endif // wxUSE_GENERICDATAVIEWCTRL
1090#endif // wxUSE_DATAVIEWCTRL