Add wxDataViewCtrl implementation for OSX/Cocoa (closes #10617: wxDataView for wxOSX...
[wxWidgets.git] / include / wx / osx / carbon / dataview.h
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: wx/osx/carbon/dataview.h
3 // Purpose: wxDataViewCtrl native implementation header for carbon
4 // Author:
5 // Id: $Id: dataview.h 57374 2009-01-27
6 // Copyright: (c) 2009
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
9
10 #ifndef _WX_DATAVIEWCTRL_CARBON_H_
11 #define _WX_DATAVIEWCTRL_CARBON_H_
12
13 #include "wx/defs.h"
14
15 #if wxUSE_GUI
16
17 #include <carbon/carbon.h>
18
19 #include "wx/osx/core/dataview.h"
20 #include "wx/osx/private.h"
21
22 // ============================================================================
23 // wxDataViewColumnNativeData
24 // ============================================================================
25 class wxDataViewColumnNativeData
26 {
27 public:
28 //
29 // constructors / destructor
30 //
31 wxDataViewColumnNativeData(void)
32 {
33 }
34 wxDataViewColumnNativeData(DataBrowserPropertyID initPropertyID)
35 :m_PropertyID(initPropertyID)
36 {
37 }
38
39 //
40 // data access methods
41 //
42 DataBrowserPropertyID GetPropertyID(void) const
43 {
44 return this->m_PropertyID;
45 }
46
47 void SetPropertyID(DataBrowserPropertyID newPropertyID)
48 {
49 this->m_PropertyID = newPropertyID;
50 }
51
52 protected:
53 private:
54 //
55 // variables
56 //
57 DataBrowserPropertyID m_PropertyID; // each column is identified by its unique property ID (NOT by the column's index)
58 };
59
60 // ============================================================================
61 // wxDataViewRendererNativeData
62 // ============================================================================
63 class wxDataViewRendererNativeData
64 {
65 public:
66 //
67 // constructors / destructor
68 //
69 wxDataViewRendererNativeData(void)
70 {
71 }
72 wxDataViewRendererNativeData(DataBrowserPropertyType initPropertyType, DataBrowserItemDataRef initItemDataRef=NULL)
73 :m_ItemDataRef(initItemDataRef), m_PropertyType(initPropertyType)
74 {
75 }
76
77 //
78 // data access methods
79 //
80 DataBrowserItemDataRef GetItemDataRef(void) const
81 {
82 return this->m_ItemDataRef;
83 }
84 DataBrowserPropertyType GetPropertyType(void) const
85 {
86 return this->m_PropertyType;
87 }
88
89 void SetItemDataRef(DataBrowserItemDataRef newItemDataRef)
90 {
91 this->m_ItemDataRef = newItemDataRef;
92 }
93 void SetPropertyType(DataBrowserPropertyType newPropertyType)
94 {
95 this->m_PropertyType = newPropertyType;
96 }
97
98 protected:
99 private:
100 //
101 // variables
102 //
103 DataBrowserItemDataRef m_ItemDataRef;
104
105 DataBrowserPropertyType m_PropertyType;
106 };
107
108 // ============================================================================
109 // wxMacDataBrowserTableViewControl
110 // ============================================================================
111 //
112 // This is a wrapper class for the Mac OS X data browser environment.
113 // It covers all data brower functionality for the native browser's list
114 // and column style.
115 //
116
117 // data browser's property IDs have a reserved ID range from 0 - 1023
118 // therefore, the first usable property ID is 'kMinPropertyID'
119 DataBrowserPropertyID const kMinPropertyID = 1024;
120
121 // array of data browser item IDs
122 WX_DEFINE_ARRAY_SIZE_T(size_t,wxArrayDataBrowserItemID);
123
124 class wxMacDataBrowserTableViewControl : public wxMacControl
125 {
126 public:
127 //
128 // constructors / destructor
129 //
130 wxMacDataBrowserTableViewControl(wxWindow* peer, const wxPoint& pos, const wxSize& size, long style);
131 wxMacDataBrowserTableViewControl(void)
132 {
133 }
134
135 //
136 // callback handling
137 //
138 OSStatus SetCallbacks (DataBrowserCallbacks const* callbacks);
139 OSStatus SetCustomCallbacks(DataBrowserCustomCallbacks const* customCallbacks);
140
141 //
142 // DnD handling
143 //
144 OSStatus EnableAutomaticDragTracking(bool enable=true);
145
146 //
147 // header handling
148 //
149 OSStatus GetHeaderDesc(DataBrowserPropertyID property, DataBrowserListViewHeaderDesc* desc) const;
150
151 OSStatus SetHeaderDesc(DataBrowserPropertyID property, DataBrowserListViewHeaderDesc* desc);
152
153 //
154 // layout handling
155 //
156 OSStatus AutoSizeColumns();
157
158 OSStatus EnableCellSizeModification(bool enableHeight=true, bool enableWidth=true); // enables or disables the column width and row height modification (default: false)
159
160 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
161 OSStatus GetAttributes (OptionBits* attributes);
162 #endif
163 OSStatus GetColumnWidth (DataBrowserPropertyID column, UInt16 *width ) const; // returns the column width in pixels
164 OSStatus GetDefaultColumnWidth(UInt16 *width ) const; // returns the default column width in pixels
165 OSStatus GetDefaultRowHeight (UInt16 * height ) const;
166 OSStatus GetHeaderButtonHeight(UInt16 *height );
167 OSStatus GetPartBounds (DataBrowserItemID item, DataBrowserPropertyID property, DataBrowserPropertyPart part, Rect* bounds);
168 OSStatus GetRowHeight (DataBrowserItemID item , UInt16 *height) const;
169 OSStatus GetScrollPosition (UInt32* top, UInt32 *left) const;
170
171 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
172 OSStatus SetAttributes (OptionBits attributes);
173 #endif
174 OSStatus SetColumnWidth(DataBrowserPropertyID column, UInt16 width); // sets the column width in pixels
175 OSStatus SetDefaultColumnWidth( UInt16 width );
176 OSStatus SetDefaultRowHeight( UInt16 height );
177 OSStatus SetHasScrollBars( bool horiz, bool vert );
178 OSStatus SetHeaderButtonHeight( UInt16 height );
179 OSStatus SetHiliteStyle(DataBrowserTableViewHiliteStyle hiliteStyle);
180 OSStatus SetIndent(float Indent);
181 OSStatus SetItemRowHeight( DataBrowserItemID item , UInt16 height);
182 OSStatus SetScrollPosition( UInt32 top , UInt32 left );
183
184 //
185 // column handling
186 //
187 OSStatus GetColumnCount (UInt32* numColumns) const;
188 OSStatus GetColumnIndex (DataBrowserPropertyID propertyID, DataBrowserTableViewColumnIndex* index) const; // returns for the passed property the corresponding column index
189 OSStatus GetFreePropertyID(DataBrowserPropertyID* propertyID) const; // this method returns a property id that is valid and currently not used; if it cannot be found 'errDataBrowerPropertyNotSupported' is returned
190 OSStatus GetPropertyFlags (DataBrowserPropertyID propertyID, DataBrowserPropertyFlags *flags ) const;
191 OSStatus GetPropertyID (DataBrowserItemDataRef itemData, DataBrowserPropertyID* propertyID) const; // returns for the passed item data reference the corresponding property ID
192 OSStatus GetPropertyID (DataBrowserTableViewColumnIndex index, DataBrowserPropertyID* propertyID) const; // returns for the passed column index the corresponding property ID
193
194 OSStatus IsUsedPropertyID(DataBrowserPropertyID propertyID) const; // checks if passed property id is used by the control; no error is returned if the id exists
195
196 OSStatus RemoveColumnByProperty(DataBrowserTableViewColumnID propertyID);
197 OSStatus RemoveColumnByIndex (DataBrowserTableViewColumnIndex index);
198
199 OSStatus SetColumnIndex (DataBrowserPropertyID propertyID, DataBrowserTableViewColumnIndex index);
200 OSStatus SetDisclosureColumn(DataBrowserPropertyID propertyID, Boolean expandableRows=false);
201 OSStatus SetPropertyFlags (DataBrowserPropertyID propertyID, DataBrowserPropertyFlags flags);
202
203 //
204 // item handling
205 //
206 OSStatus AddItem(DataBrowserItemID container, DataBrowserItemID const* itemID) // adds a single item
207 {
208 return this->AddItems(container,1,itemID,kDataBrowserItemNoProperty);
209 }
210 OSStatus AddItems(DataBrowserItemID container, UInt32 numItems, DataBrowserItemID const* items, DataBrowserPropertyID preSortProperty); // adds items to the data browser
211
212 OSStatus GetFreeItemID(DataBrowserItemID* id) const; // this method returns an item id that is valid and currently not used; if it cannot be found 'errDataBrowserItemNotAdded' is returned
213 OSStatus GetItemCount (ItemCount* numItems) const
214 {
215 return this->GetItemCount(kDataBrowserNoItem,true,kDataBrowserItemAnyState,numItems);
216 }
217 OSStatus GetItemCount (DataBrowserItemID container, Boolean recurse, DataBrowserItemState state, ItemCount* numItems) const;
218 OSStatus GetItemID (DataBrowserTableViewRowIndex row, DataBrowserItemID* item) const;
219 OSStatus GetItems (DataBrowserItemID container, Boolean recurse, DataBrowserItemState state, Handle items) const;
220 OSStatus GetItemRow (DataBrowserItemID item, DataBrowserTableViewRowIndex* row) const;
221 OSStatus GetItemState (DataBrowserItemID item, DataBrowserItemState* state) const;
222
223 OSStatus IsUsedItemID(DataBrowserItemID itemID) const; // checks if the passed id is in use
224
225 OSStatus RevealItem(DataBrowserItemID item, DataBrowserPropertyID propertyID, DataBrowserRevealOptions options) const;
226
227 OSStatus RemoveItem(DataBrowserItemID container, DataBrowserItemID const* itemID) // removes a single item
228 {
229 return this->RemoveItems(container,1,itemID,kDataBrowserItemNoProperty);
230 }
231 OSStatus RemoveItems(void) // removes all items
232 {
233 return this->RemoveItems(kDataBrowserNoItem,0,NULL,kDataBrowserItemNoProperty);
234 }
235 OSStatus RemoveItems(DataBrowserItemID container, UInt32 numItems, DataBrowserItemID const* items, DataBrowserPropertyID preSortProperty);
236
237 OSStatus UpdateItem(DataBrowserItemID container, DataBrowserItemID const* item) // updates all columns of the passed item
238 {
239 return this->UpdateItems(container,1,item,kDataBrowserItemNoProperty,kDataBrowserItemNoProperty);
240 }
241 OSStatus UpdateItems(void) // updates all items
242 {
243 return this->UpdateItems(kDataBrowserNoItem,0,NULL,kDataBrowserItemNoProperty,kDataBrowserItemNoProperty);
244 }
245 OSStatus UpdateItems(DataBrowserItemID container, UInt32 numItems, DataBrowserItemID const* items, DataBrowserPropertyID preSortProperty, DataBrowserPropertyID propertyID) const;
246
247 //
248 // item selection
249 //
250 size_t GetSelectedItemIDs(wxArrayDataBrowserItemID& itemIDs) const; // returns the number of selected item and the item IDs in the array
251 OSStatus GetSelectionAnchor(DataBrowserItemID *first, DataBrowserItemID *last) const;
252 OSStatus GetSelectionFlags (DataBrowserSelectionFlags* flags) const;
253
254 bool IsItemSelected(DataBrowserItemID item) const;
255
256 OSStatus SetSelectionFlags(DataBrowserSelectionFlags flags);
257 OSStatus SetSelectedItems (UInt32 numItems, DataBrowserItemID const* itemIDs, DataBrowserSetOption operation);
258
259 //
260 // item sorting
261 //
262 OSStatus GetSortOrder (DataBrowserSortOrder* order) const;
263 OSStatus GetSortProperty(DataBrowserPropertyID* propertyID) const;
264
265 OSStatus Resort(DataBrowserItemID container=kDataBrowserNoItem, Boolean sortChildren=true);
266
267 OSStatus SetSortOrder (DataBrowserSortOrder order);
268 OSStatus SetSortProperty(DataBrowserPropertyID propertyID);
269
270 //
271 // container handling
272 //
273 OSStatus CloseContainer(DataBrowserItemID containerID);
274
275 OSStatus OpenContainer(DataBrowserItemID containerID);
276
277 protected :
278 //
279 // standard callback functions
280 //
281 static pascal Boolean DataBrowserCompareProc (ControlRef browser, DataBrowserItemID itemOneID, DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty);
282 static pascal void DataBrowserGetContextualMenuProc(ControlRef browser, MenuRef* menu, UInt32* helpType, CFStringRef* helpItemString, AEDesc* selection);
283 static pascal OSStatus DataBrowserGetSetItemDataProc (ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID property, DataBrowserItemDataRef itemData, Boolean getValue);
284 static pascal void DataBrowserItemNotificationProc (ControlRef browser, DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef itemData);
285
286 virtual Boolean DataBrowserCompareProc (DataBrowserItemID itemOneID, DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty) = 0;
287 virtual void DataBrowserGetContextualMenuProc(MenuRef* menu, UInt32* helpType, CFStringRef* helpItemString, AEDesc* selection) = 0;
288 virtual OSStatus DataBrowserGetSetItemDataProc (DataBrowserItemID itemID, DataBrowserPropertyID property, DataBrowserItemDataRef itemData, Boolean getValue) = 0;
289 virtual void DataBrowserItemNotificationProc (DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef itemData) = 0;
290
291 //
292 // callback functions for customized types
293 //
294 static pascal void DataBrowserDrawItemProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemState state, Rect const* rectangle, SInt16 bitDepth, Boolean colorDevice);
295 static pascal Boolean DataBrowserEditItemProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, CFStringRef theString, Rect* maxEditTextRect, Boolean* shrinkToFit);
296 static pascal Boolean DataBrowserHitTestProc (ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Rect const* mouseRect);
297 static pascal DataBrowserTrackingResult DataBrowserTrackingProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Point startPt, EventModifiers modifiers);
298
299 virtual void DataBrowserDrawItemProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemState state, Rect const* rectangle, SInt16 bitDepth, Boolean colorDevice) = 0;
300 virtual Boolean DataBrowserEditItemProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, CFStringRef theString, Rect* maxEditTextRect, Boolean* shrinkToFit) = 0;
301 virtual Boolean DataBrowserHitTestProc (DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Rect const* mouseRect) = 0;
302 virtual DataBrowserTrackingResult DataBrowserTrackingProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Point startPt, EventModifiers modifiers) = 0;
303
304 //
305 // callback functions for drag & drop
306 ///
307 static pascal Boolean DataBrowserAcceptDragProc (ControlRef browser, DragReference dragRef, DataBrowserItemID itemID);
308 static pascal Boolean DataBrowserAddDragItemProc(ControlRef browser, DragReference dragRef, DataBrowserItemID itemID, ItemReference* itemRef);
309 static pascal Boolean DataBrowserReceiveDragProc(ControlRef browser, DragReference dragRef, DataBrowserItemID itemID);
310
311 virtual Boolean DataBrowserAcceptDragProc (DragReference dragRef, DataBrowserItemID itemID) = 0;
312 virtual Boolean DataBrowserAddDragItemProc(DragReference dragRef, DataBrowserItemID itemID, ItemReference* itemRef) = 0;
313 virtual Boolean DataBrowserReceiveDragProc(DragReference dragRef, DataBrowserItemID itemID) = 0;
314
315 private:
316 //
317 // wxWidget internal stuff
318 //
319 DECLARE_ABSTRACT_CLASS(wxMacDataBrowserTableViewControl)
320 };
321
322 // ============================================================================
323 // wxMacDataBrowserListViewControl
324 // ============================================================================
325 //
326 // This class is a wrapper for the native browser's list view style. It expands
327 // the inherited functionality of the table view control class.
328 // The term list view is in this case Mac OS X specific and is not related
329 // to any wxWidget naming conventions.
330 //
331 class wxMacDataBrowserListViewControl : public wxMacDataBrowserTableViewControl
332 {
333 public:
334 //
335 // constructors / destructor
336 //
337 wxMacDataBrowserListViewControl(wxWindow* peer, wxPoint const& pos, wxSize const& size, long style) : wxMacDataBrowserTableViewControl(peer,pos,size,style)
338 {
339 }
340
341 //
342 // column handling
343 //
344 OSStatus AddColumn(DataBrowserListViewColumnDesc *columnDesc, DataBrowserTableViewColumnIndex position);
345
346 protected:
347 private:
348 };
349
350
351 // ============================================================================
352 // wxMacDataViewDataBrowserListViewControl
353 // ============================================================================
354 //
355 // This is the internal interface class between wxDataViewCtrl (wxWidget) and
356 // the native data browser (Mac OS X carbon).
357 //
358 class wxMacDataViewDataBrowserListViewControl : public wxMacDataBrowserListViewControl, public wxDataViewWidgetImpl
359 {
360 public:
361 //
362 // constructors / destructor
363 //
364 wxMacDataViewDataBrowserListViewControl(wxWindow* peer, wxPoint const& pos, wxSize const& size, long style);
365
366 //
367 // column related methods (inherited from wxDataViewWidgetImpl)
368 //
369 virtual bool ClearColumns (void);
370 virtual bool DeleteColumn (wxDataViewColumn* columnPtr);
371 virtual void DoSetExpanderColumn(wxDataViewColumn const* columnPtr);
372 virtual wxDataViewColumn* GetColumn (unsigned int pos) const;
373 virtual int GetColumnPosition (wxDataViewColumn const* columnPtr) const;
374 virtual bool InsertColumn (unsigned int pos, wxDataViewColumn* columnPtr);
375
376 //
377 // item related methods (inherited from wxDataViewWidgetImpl)
378 //
379 virtual bool Add (wxDataViewItem const& parent, wxDataViewItem const& item);
380 virtual bool Add (wxDataViewItem const& parent, wxDataViewItemArray const& items);
381 virtual void Collapse (wxDataViewItem const& item);
382 virtual void EnsureVisible(wxDataViewItem const& item, wxDataViewColumn const* columnPtr);
383 virtual void Expand (wxDataViewItem const& item);
384 virtual unsigned int GetCount (void) const;
385 virtual wxRect GetRectangle (wxDataViewItem const& item, wxDataViewColumn const* columnPtr);
386 virtual bool IsExpanded (wxDataViewItem const& item) const;
387 virtual bool Reload (void);
388 virtual bool Remove (wxDataViewItem const& parent, wxDataViewItem const& item);
389 virtual bool Remove (wxDataViewItem const& parent, wxDataViewItemArray const& item);
390 virtual bool Update (wxDataViewColumn const* columnPtr);
391 virtual bool Update (wxDataViewItem const& parent, wxDataViewItem const& item);
392 virtual bool Update (wxDataViewItem const& parent, wxDataViewItemArray const& items);
393
394 //
395 // model related methods
396 //
397 virtual bool AssociateModel(wxDataViewModel* model);
398
399 //
400 // selection related methods (inherited from wxDataViewWidgetImpl)
401 //
402 virtual int GetSelections(wxDataViewItemArray& sel) const;
403 virtual bool IsSelected (wxDataViewItem const& item) const;
404 virtual void Select (wxDataViewItem const& item);
405 virtual void SelectAll (void);
406 virtual void Unselect (wxDataViewItem const& item);
407 virtual void UnselectAll (void);
408
409 //
410 // sorting related methods
411 //
412 virtual wxDataViewColumn* GetSortingColumn (void) const;
413 virtual void Resort (void);
414
415 //
416 // other methods (inherited from wxDataViewWidgetImpl)
417 //
418 virtual void DoSetIndent (int indent);
419 virtual void HitTest (wxPoint const& point, wxDataViewItem& item, wxDataViewColumn*& columnPtr) const;
420 virtual void SetRowHeight(wxDataViewItem const& item, unsigned int height);
421 virtual void OnSize (void);
422
423 //
424 // other methods
425 //
426 wxDataViewCtrl* GetDataViewCtrl(void) const
427 {
428 return dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer());
429 }
430
431 protected:
432 //
433 // standard callback functions (inherited from wxMacDataBrowserTableViewControl)
434 //
435 virtual Boolean DataBrowserCompareProc (DataBrowserItemID itemOneID, DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty);
436 virtual void DataBrowserItemNotificationProc (DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef itemData);
437 virtual void DataBrowserGetContextualMenuProc(MenuRef* menu, UInt32* helpType, CFStringRef* helpItemString, AEDesc* selection);
438 virtual OSStatus DataBrowserGetSetItemDataProc (DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemDataRef itemData, Boolean getValue);
439
440 //
441 // callback functions for customized types (inherited from wxMacDataBrowserTableViewControl)
442 //
443 virtual void DataBrowserDrawItemProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemState state, Rect const* rectangle, SInt16 bitDepth, Boolean colorDevice);
444 virtual Boolean DataBrowserEditItemProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, CFStringRef theString, Rect* maxEditTextRect, Boolean* shrinkToFit);
445 virtual Boolean DataBrowserHitTestProc (DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Rect const* mouseRect);
446 virtual DataBrowserTrackingResult DataBrowserTrackingProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Point startPt, EventModifiers modifiers);
447
448 //
449 // callback functions for drag & drop (inherited from wxMacDataBrowserTableViewControl)
450 //
451 virtual Boolean DataBrowserAcceptDragProc (DragReference dragRef, DataBrowserItemID itemID);
452 virtual Boolean DataBrowserAddDragItemProc(DragReference dragRef, DataBrowserItemID itemID, ItemReference* itemRef);
453 virtual Boolean DataBrowserReceiveDragProc(DragReference dragRef, DataBrowserItemID itemID);
454
455 //
456 // drag & drop helper methods
457 //
458 wxDataFormat GetDnDDataFormat(wxDataObjectComposite* dataObjects);
459 wxDataObjectComposite* GetDnDDataObjects(DragReference dragRef, ItemReference itemRef) const; // create the data objects from the native dragged object
460
461 //
462 // other methods
463 //
464 wxDataViewColumn* GetColumnPtr(DataBrowserPropertyID propertyID) const; // returns for the passed property the corresponding pointer to a column; NULL is returned if not found
465
466 private:
467 };
468
469 typedef wxMacDataViewDataBrowserListViewControl* wxMacDataViewDataBrowserListViewControlPointer;
470
471 #endif // WX_GUI
472 #endif // _WX_MACCARBONDATAVIEWCTRL_H_