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