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