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