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