]> git.saurik.com Git - wxWidgets.git/blob - include/wx/osx/cocoa/dataview.h
No real changes, just minor cleanup in Cocoa wxDataViewCtrl.
[wxWidgets.git] / include / wx / osx / cocoa / 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_COCOOA_H_
11 #define _WX_DATAVIEWCTRL_COCOOA_H_
12
13 #include "wx/defs.h"
14
15 #if wxUSE_GUI
16
17 #ifdef __OBJC__
18 #import <Cocoa/Cocoa.h>
19 #endif
20
21 #include "wx/osx/core/dataview.h"
22 #include "wx/osx/private.h"
23
24 // Forward declaration
25 class wxCocoaDataViewControl;
26
27 // ============================================================================
28 // wxPointerObject
29 // ============================================================================
30 //
31 // This is a helper class to store a pointer in an object. This object just
32 // stores the pointer but does not take any ownership.
33 // To pointer objects are equal if the containing pointers are equal. This
34 // means also that the hash value of a pointer object depends only on the
35 // stored pointer.
36 //
37 @interface wxPointerObject : NSObject
38 {
39 void* pointer;
40 }
41
42 //
43 // object initialization
44 //
45 -(id) initWithPointer:(void*)initPointer;
46
47 //
48 // access to pointer
49 //
50 -(void*) pointer;
51 -(void) setPointer:(void*)newPointer;
52
53 @end
54
55 // ============================================================================
56 // wxSortDescriptorObject
57 // ============================================================================
58 //
59 // This is a helper class to use native sorting facilities.
60 //
61 @interface wxSortDescriptorObject : NSSortDescriptor<NSCopying>
62 {
63 wxDataViewColumn* columnPtr; // pointer to the sorting column
64
65 wxDataViewModel* modelPtr; // pointer to model
66 }
67
68 //
69 // initialization
70 //
71 -(id) initWithModelPtr:(wxDataViewModel*)initModelPtr sortingColumnPtr:(wxDataViewColumn*)initColumnPtr ascending:(BOOL)sortAscending;
72
73 //
74 // access to variables
75 //
76 -(wxDataViewColumn*) columnPtr;
77 -(wxDataViewModel*) modelPtr;
78
79 -(void) setColumnPtr:(wxDataViewColumn*)newColumnPtr;
80 -(void) setModelPtr:(wxDataViewModel*)newModelPtr;
81
82 @end
83
84 // ============================================================================
85 // wxDataViewColumnNativeData
86 // ============================================================================
87 class wxDataViewColumnNativeData
88 {
89 public:
90 //
91 // constructors / destructor
92 //
93 wxDataViewColumnNativeData(void) : m_NativeColumnPtr(NULL)
94 {
95 }
96 wxDataViewColumnNativeData(NSTableColumn* initNativeColumnPtr) : m_NativeColumnPtr(initNativeColumnPtr)
97 {
98 }
99
100 //
101 // data access methods
102 //
103 NSTableColumn* GetNativeColumnPtr() const
104 {
105 return m_NativeColumnPtr;
106 }
107
108 void SetNativeColumnPtr(NSTableColumn* newNativeColumnPtr)
109 {
110 m_NativeColumnPtr = newNativeColumnPtr;
111 }
112
113 protected:
114 private:
115 //
116 // variables
117 //
118 NSTableColumn* m_NativeColumnPtr; // this class does not take over ownership of the pointer nor retains it
119 };
120
121 // ============================================================================
122 // wxDataViewRendererNativeData
123 // ============================================================================
124 class wxDataViewRendererNativeData
125 {
126 public:
127 //
128 // constructors / destructor
129 //
130 wxDataViewRendererNativeData(void) : m_Object(NULL), m_ColumnCell(NULL)
131 {
132 }
133 wxDataViewRendererNativeData(NSCell* initColumnCell) : m_Object(NULL), m_ColumnCell([initColumnCell retain])
134 {
135 }
136 wxDataViewRendererNativeData(NSCell* initColumnCell, id initObject) : m_Object([initObject retain]), m_ColumnCell([initColumnCell retain])
137 {
138 }
139 ~wxDataViewRendererNativeData()
140 {
141 [m_ColumnCell release];
142 [m_Object release];
143 }
144
145 //
146 // data access methods
147 //
148 NSCell* GetColumnCell() const
149 {
150 return m_ColumnCell;
151 }
152 NSTableColumn* GetColumnPtr() const
153 {
154 return m_TableColumnPtr;
155 }
156 id GetItem() const
157 {
158 return m_Item;
159 }
160 NSCell* GetItemCell() const
161 {
162 return m_ItemCell;
163 }
164 id GetObject() const
165 {
166 return m_Object;
167 }
168
169 void SetColumnCell(NSCell* newCell)
170 {
171 [newCell retain];
172 [m_ColumnCell release];
173 m_ColumnCell = newCell;
174 }
175 void SetColumnPtr(NSTableColumn* newColumnPtr)
176 {
177 m_TableColumnPtr = newColumnPtr;
178 }
179 void SetItem(id newItem)
180 {
181 m_Item = newItem;
182 }
183 void SetItemCell(NSCell* newCell)
184 {
185 m_ItemCell = newCell;
186 }
187 void SetObject(id newObject)
188 {
189 [newObject retain];
190 [m_Object release];
191 m_Object = newObject;
192 }
193
194 protected:
195 private:
196 //
197 // variables
198 //
199 id m_Item; // item NOT owned by renderer
200 id m_Object; // object that can be used by renderer for storing special data (owned by renderer)
201
202 NSCell* m_ColumnCell; // column's cell is owned by renderer
203 NSCell* m_ItemCell; // item's cell is NOT owned by renderer
204
205 NSTableColumn* m_TableColumnPtr; // column NOT owned by renderer
206 };
207
208 // ============================================================================
209 // wxCocoaOutlineDataSource
210 // ============================================================================
211 //
212 // This class implements the data source delegate for the outline view.
213 // As only an informal protocol exists this class inherits from NSObject only.
214 //
215 // As mentioned in the documentation for NSOutlineView the native control does
216 // not own any data. Therefore, it has to be done by the data source.
217 // Unfortunately, wxWidget's data source is a C++ data source but
218 // NSOutlineDataSource requires objects as data. Therefore, the data (or better
219 // the native item objects) have to be stored additionally in the native data
220 // source.
221 // NSOutlineView requires quick access to the item objects and quick linear
222 // access to an item's children. This requires normally a hash type of storage
223 // for the item object itself and an array structure for each item's children.
224 // This means that basically two times the whole structure of wxWidget's model
225 // class has to be stored.
226 // This implementation is using a compromise: all items that are in use by the
227 // control are stored in a set (from there they can be easily retrieved) and
228 // owned by the set. Furthermore, children of the last parent are stored
229 // in a linear list.
230 //
231 @interface wxCocoaOutlineDataSource : NSObject
232 {
233 NSArray* sortDescriptors; // descriptors specifying the sorting (currently the array only holds one object only)
234
235 NSMutableArray* children; // buffered children
236
237 NSMutableSet* items; // stores all items that are in use by the control
238
239 wxCocoaDataViewControl* implementation;
240
241 wxDataViewModel* model;
242
243 wxPointerObject* currentParentItem; // parent of the buffered children; the object is owned
244 }
245
246 //
247 // methods of informal protocol:
248 //
249 -(BOOL) outlineView:(NSOutlineView*)outlineView acceptDrop:(id<NSDraggingInfo>)info item:(id)item childIndex:(NSInteger)index;
250 -(id) outlineView:(NSOutlineView*)outlineView child:(NSInteger)index ofItem:(id)item;
251 -(id) outlineView:(NSOutlineView*)outlineView objectValueForTableColumn:(NSTableColumn*)tableColumn byItem:(id)item;
252 -(BOOL) outlineView:(NSOutlineView*)outlineView isItemExpandable:(id)item;
253 -(NSInteger) outlineView:(NSOutlineView*)outlineView numberOfChildrenOfItem:(id)item;
254 -(NSDragOperation) outlineView:(NSOutlineView*)outlineView validateDrop:(id<NSDraggingInfo>)info proposedItem:(id)item proposedChildIndex:(NSInteger)index;
255 -(BOOL) outlineView:(NSOutlineView*)outlineView writeItems:(NSArray*)items toPasteboard:(NSPasteboard*)pasteboard;
256
257 //
258 // buffer for items handling
259 //
260 -(void) addToBuffer:(wxPointerObject*)item;
261 -(void) clearBuffer;
262 -(wxPointerObject*) getDataViewItemFromBuffer:(wxDataViewItem const&)item; // returns the item in the buffer that has got the same pointer as "item",
263 -(wxPointerObject*) getItemFromBuffer:(wxPointerObject*)item; // if such an item does not exist nil is returned
264 -(BOOL) isInBuffer:(wxPointerObject*)item;
265 -(void) removeFromBuffer:(wxPointerObject*)item;
266
267 //
268 // buffered children handling
269 //
270 -(void) appendChild:(wxPointerObject*)item;
271 -(void) clearChildren;
272 -(wxPointerObject*) getChild:(NSUInteger)index;
273 -(NSUInteger) getChildCount;
274 -(void) removeChild:(NSUInteger)index;
275
276 //
277 // buffer handling
278 //
279 -(void) clearBuffers;
280
281 //
282 // sorting
283 //
284 -(NSArray*) sortDescriptors;
285 -(void) setSortDescriptors:(NSArray*)newSortDescriptors;
286
287 //
288 // access to wxWidget's variables
289 //
290 -(wxPointerObject*) currentParentItem;
291 -(wxCocoaDataViewControl*) implementation;
292 -(wxDataViewModel*) model;
293 -(void) setCurrentParentItem:(wxPointerObject*)newCurrentParentItem;
294 -(void) setImplementation:(wxCocoaDataViewControl*)newImplementation;
295 -(void) setModel:(wxDataViewModel*)newModel;
296
297 //
298 // other methods
299 //
300 -(void) bufferItem:(wxPointerObject*)parentItem withChildren:(wxDataViewItemArray*)dataViewChildrenPtr;
301
302 @end
303
304 // ============================================================================
305 // wxCustomCell
306 // ============================================================================
307 //
308 // This is a cell that is used for custom renderers.
309 //
310 @interface wxCustomCell : NSTextFieldCell
311 {
312 }
313
314 //
315 // other methods
316 //
317 -(NSSize) cellSize;
318
319 @end
320
321 // ============================================================================
322 // wxImageTextCell
323 // ============================================================================
324 //
325 // As the native cocoa environment does not have a cell displaying an icon/
326 // image and text at the same time, it has to be implemented by the user.
327 // This implementation follows the implementation of Chuck Pisula in Apple's
328 // DragNDropOutline sample application.
329 // Although in wxDataViewCtrl icons are used on OSX icons do not exist for
330 // display. Therefore, the cell is also called wxImageTextCell.
331 // Instead of displaying images of any size (which is possible) this cell uses
332 // a fixed size for displaying the image. Larger images are scaled to fit
333 // into their reserved space. Smaller or not existing images use the fixed
334 // reserved size and are scaled if necessary.
335 //
336 @interface wxImageTextCell : NSTextFieldCell
337 {
338 @private
339 CGFloat xImageShift; // shift for the image in x-direction from border
340 CGFloat spaceImageText; // space between image and text ("belongs" to the image)
341
342 NSImage* image; // the image itself
343
344 NSSize imageSize; // largest size of the image; default size is (16, 16)
345
346 NSTextAlignment cellAlignment; // the text alignment is used to align the whole
347 // cell (image and text)
348 }
349
350 //
351 // alignment
352 //
353 -(NSTextAlignment) alignment;
354 -(void) setAlignment:(NSTextAlignment)newAlignment;
355
356 //
357 // image access
358 //
359 -(NSImage*) image;
360 -(void) setImage:(NSImage*)newImage;
361
362 //
363 // size access
364 //
365 -(NSSize) imageSize;
366 -(void) setImageSize:(NSSize) newImageSize;
367
368 //
369 // other methods
370 //
371 -(NSSize) cellSize;
372
373 @end
374
375 // ============================================================================
376 // wxCocoaOutlineView
377 // ============================================================================
378 @interface wxCocoaOutlineView : NSOutlineView
379 {
380 @private
381 BOOL isEditingCell; // flag indicating if a cell is currently being edited
382
383 wxCocoaDataViewControl* implementation;
384 }
385
386 //
387 // access to wxWidget's implementation
388 //
389 -(wxCocoaDataViewControl*) implementation;
390 -(void) setImplementation:(wxCocoaDataViewControl*) newImplementation;
391
392 @end
393
394 // ============================================================================
395 // wxCocoaDataViewControl
396 // ============================================================================
397 //
398 // This is the internal interface class between wxDataViewCtrl (wxWidget) and
399 // the native source view (Mac OS X cocoa).
400 //
401 class wxCocoaDataViewControl : public wxWidgetCocoaImpl, public wxDataViewWidgetImpl
402 {
403 public:
404 //
405 // constructors / destructor
406 //
407 wxCocoaDataViewControl(wxWindow* peer, wxPoint const& pos, wxSize const& size, long style);
408 ~wxCocoaDataViewControl();
409
410 //
411 // column related methods (inherited from wxDataViewWidgetImpl)
412 //
413 virtual bool ClearColumns ();
414 virtual bool DeleteColumn (wxDataViewColumn* columnPtr);
415 virtual void DoSetExpanderColumn(wxDataViewColumn const* columnPtr);
416 virtual wxDataViewColumn* GetColumn (unsigned int pos) const;
417 virtual int GetColumnPosition (wxDataViewColumn const* columnPtr) const;
418 virtual bool InsertColumn (unsigned int pos, wxDataViewColumn* columnPtr);
419
420 //
421 // item related methods (inherited from wxDataViewWidgetImpl)
422 //
423 virtual bool Add (wxDataViewItem const& parent, wxDataViewItem const& item);
424 virtual bool Add (wxDataViewItem const& parent, wxDataViewItemArray const& items);
425 virtual void Collapse (wxDataViewItem const& item);
426 virtual void EnsureVisible(wxDataViewItem const& item, wxDataViewColumn const* columnPtr);
427 virtual void Expand (wxDataViewItem const& item);
428 virtual unsigned int GetCount () const;
429 virtual wxRect GetRectangle (wxDataViewItem const& item, wxDataViewColumn const* columnPtr);
430 virtual bool IsExpanded (wxDataViewItem const& item) const;
431 virtual bool Reload ();
432 virtual bool Remove (wxDataViewItem const& parent, wxDataViewItem const& item);
433 virtual bool Remove (wxDataViewItem const& parent, wxDataViewItemArray const& item);
434 virtual bool Update (wxDataViewColumn const* columnPtr);
435 virtual bool Update (wxDataViewItem const& parent, wxDataViewItem const& item);
436 virtual bool Update (wxDataViewItem const& parent, wxDataViewItemArray const& items);
437
438 //
439 // model related methods
440 //
441 virtual bool AssociateModel(wxDataViewModel* model); // informs the native control that a model is present
442
443 //
444 // selection related methods (inherited from wxDataViewWidgetImpl)
445 //
446 virtual int GetSelections(wxDataViewItemArray& sel) const;
447 virtual bool IsSelected (wxDataViewItem const& item) const;
448 virtual void Select (wxDataViewItem const& item);
449 virtual void SelectAll ();
450 virtual void Unselect (wxDataViewItem const& item);
451 virtual void UnselectAll ();
452
453 //
454 // sorting related methods
455 //
456 virtual wxDataViewColumn* GetSortingColumn () const;
457 virtual void Resort ();
458
459 //
460 // other methods (inherited from wxDataViewWidgetImpl)
461 //
462 virtual void DoSetIndent (int indent);
463 virtual void HitTest (wxPoint const& point, wxDataViewItem& item, wxDataViewColumn*& columnPtr) const;
464 virtual void SetRowHeight(wxDataViewItem const& item, unsigned int height);
465 virtual void OnSize ();
466
467 //
468 // other methods
469 //
470 wxDataViewCtrl* GetDataViewCtrl() const
471 {
472 return dynamic_cast<wxDataViewCtrl*>(GetWXPeer());
473 }
474
475 //
476 // drag & drop helper methods
477 //
478 wxDataFormat GetDnDDataFormat(wxDataObjectComposite* dataObjects);
479 wxDataObjectComposite* GetDnDDataObjects(NSData* dataObject) const; // create the data objects from the native dragged object
480 protected:
481 private:
482 //
483 // variables
484 //
485 wxCocoaOutlineDataSource* m_DataSource;
486
487 wxCocoaOutlineView* m_OutlineView;
488 };
489
490 typedef wxCocoaDataViewControl* wxCocoaDataViewControlPointer;
491
492
493 #endif // wxUSE_GUI
494 #endif // _WX_DATAVIEWCTRL_COCOOA_H_