git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60552 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			495 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
	
	
			
		
		
	
	
			495 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
	
	
| /////////////////////////////////////////////////////////////////////////////
 | |
| // Name:        wx/osx/carbon/dataview.h
 | |
| // Purpose:     wxDataViewCtrl native implementation header for carbon
 | |
| // Author:
 | |
| // Id:          $Id: dataview.h 57374 2009-01-27
 | |
| // Copyright:   (c) 2009
 | |
| // Licence:     wxWindows licence
 | |
| /////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| #ifndef _WX_DATAVIEWCTRL_COCOOA_H_
 | |
| #define _WX_DATAVIEWCTRL_COCOOA_H_
 | |
| 
 | |
| #include "wx/defs.h"
 | |
| 
 | |
| #if wxUSE_GUI
 | |
| 
 | |
| #ifdef __OBJC__
 | |
|   #import <Cocoa/Cocoa.h>
 | |
| #endif
 | |
| 
 | |
| #include "wx/osx/core/dataview.h"
 | |
| #include "wx/osx/private.h"
 | |
| 
 | |
| // Forward declaration
 | |
| class wxCocoaDataViewControl;
 | |
| 
 | |
| // ============================================================================
 | |
| // wxPointerObject
 | |
| // ============================================================================
 | |
| //
 | |
| // This is a helper class to store a pointer in an object. This object just
 | |
| // stores the pointer but does not take any ownership.
 | |
| // To pointer objects are equal if the containing pointers are equal. This
 | |
| // means also that the hash value of a pointer object depends only on the
 | |
| // stored pointer.
 | |
| //
 | |
| @interface wxPointerObject : NSObject
 | |
| {
 | |
|   void* pointer;
 | |
| }
 | |
| 
 | |
|  //
 | |
|  // object initialization
 | |
|  //
 | |
|   -(id) initWithPointer:(void*)initPointer;
 | |
| 
 | |
|  //
 | |
|  // access to pointer
 | |
|  //
 | |
|   -(void*) pointer;
 | |
|   -(void)  setPointer:(void*)newPointer;
 | |
| 
 | |
| @end
 | |
| 
 | |
| // ============================================================================
 | |
| // wxSortDescriptorObject
 | |
| // ============================================================================
 | |
| //
 | |
| // This is a helper class to use native sorting facilities.
 | |
| //
 | |
| @interface wxSortDescriptorObject : NSSortDescriptor<NSCopying>
 | |
| {
 | |
|   wxDataViewColumn* columnPtr; // pointer to the sorting column
 | |
| 
 | |
|   wxDataViewModel* modelPtr; // pointer to model
 | |
| }
 | |
| 
 | |
|  //
 | |
|  // initialization
 | |
|  //
 | |
|   -(id) initWithModelPtr:(wxDataViewModel*)initModelPtr sortingColumnPtr:(wxDataViewColumn*)initColumnPtr ascending:(BOOL)sortAscending;
 | |
| 
 | |
|  //
 | |
|  // access to variables
 | |
|  //
 | |
|   -(wxDataViewColumn*) columnPtr;
 | |
|   -(wxDataViewModel*) modelPtr;
 | |
| 
 | |
|   -(void) setColumnPtr:(wxDataViewColumn*)newColumnPtr;
 | |
|   -(void) setModelPtr:(wxDataViewModel*)newModelPtr;
 | |
| 
 | |
| @end
 | |
| 
 | |
| // ============================================================================
 | |
| // wxDataViewColumnNativeData
 | |
| // ============================================================================
 | |
| class wxDataViewColumnNativeData
 | |
| {
 | |
| public:
 | |
| //
 | |
| // constructors / destructor
 | |
| //
 | |
|   wxDataViewColumnNativeData(void) : m_NativeColumnPtr(NULL)
 | |
|   {
 | |
|   }
 | |
|   wxDataViewColumnNativeData(NSTableColumn* initNativeColumnPtr) : m_NativeColumnPtr(initNativeColumnPtr)
 | |
|   {
 | |
|   }
 | |
| 
 | |
| //
 | |
| // data access methods
 | |
| //
 | |
|   NSTableColumn* GetNativeColumnPtr(void) const
 | |
|   {
 | |
|     return this->m_NativeColumnPtr;
 | |
|   }
 | |
|   
 | |
|   void SetNativeColumnPtr(NSTableColumn* newNativeColumnPtr)
 | |
|   {
 | |
|     this->m_NativeColumnPtr = newNativeColumnPtr;
 | |
|   }
 | |
| 
 | |
| protected:
 | |
| private:
 | |
| //
 | |
| // variables
 | |
| //
 | |
|   NSTableColumn* m_NativeColumnPtr; // this class does not take over ownership of the pointer nor retains it
 | |
| };
 | |
| 
 | |
| // ============================================================================
 | |
| // wxDataViewRendererNativeData
 | |
| // ============================================================================
 | |
| class wxDataViewRendererNativeData
 | |
| {
 | |
| public:
 | |
| //
 | |
| // constructors / destructor
 | |
| //
 | |
|   wxDataViewRendererNativeData(void) : m_Object(NULL), m_ColumnCell(NULL)
 | |
|   {
 | |
|   }
 | |
|   wxDataViewRendererNativeData(NSCell* initColumnCell) : m_Object(NULL), m_ColumnCell([initColumnCell retain])
 | |
|   {
 | |
|   }
 | |
|   wxDataViewRendererNativeData(NSCell* initColumnCell, id initObject) : m_Object([initObject retain]), m_ColumnCell([initColumnCell retain])
 | |
|   {
 | |
|   }
 | |
|   ~wxDataViewRendererNativeData(void)
 | |
|   {
 | |
|     [this->m_ColumnCell release];
 | |
|     [this->m_Object     release];
 | |
|   }
 | |
| 
 | |
|  //
 | |
|  // data access methods
 | |
|  //
 | |
|   NSCell* GetColumnCell(void) const
 | |
|   {
 | |
|     return this->m_ColumnCell;
 | |
|   }
 | |
|   NSTableColumn* GetColumnPtr(void) const
 | |
|   {
 | |
|     return this->m_TableColumnPtr;
 | |
|   }
 | |
|   id GetItem(void) const
 | |
|   {
 | |
|     return this->m_Item;
 | |
|   }
 | |
|   NSCell* GetItemCell(void) const
 | |
|   {
 | |
|     return this->m_ItemCell;
 | |
|   }
 | |
|   id GetObject(void) const
 | |
|   {
 | |
|     return this->m_Object;
 | |
|   }
 | |
| 
 | |
|   void SetColumnCell(NSCell* newCell)
 | |
|   {
 | |
|     [newCell retain];
 | |
|     [this->m_ColumnCell release];
 | |
|     this->m_ColumnCell = newCell;
 | |
|   }
 | |
|   void SetColumnPtr(NSTableColumn* newColumnPtr)
 | |
|   {
 | |
|     this->m_TableColumnPtr = newColumnPtr;
 | |
|   }
 | |
|   void SetItem(id newItem)
 | |
|   {
 | |
|     this->m_Item = newItem;
 | |
|   }
 | |
|   void SetItemCell(NSCell* newCell)
 | |
|   {
 | |
|     this->m_ItemCell = newCell;
 | |
|   }
 | |
|   void SetObject(id newObject)
 | |
|   {
 | |
|     [newObject retain];
 | |
|     [this->m_Object release];
 | |
|     this->m_Object = newObject;
 | |
|   }
 | |
| 
 | |
| protected:
 | |
| private:
 | |
| //
 | |
| // variables
 | |
| //
 | |
|   id m_Item;   // item NOT owned by renderer
 | |
|   id m_Object; // object that can be used by renderer for storing special data (owned by renderer)
 | |
| 
 | |
|   NSCell* m_ColumnCell; // column's cell is owned by renderer
 | |
|   NSCell* m_ItemCell;   // item's cell is NOT owned by renderer
 | |
| 
 | |
|   NSTableColumn* m_TableColumnPtr; // column NOT owned by renderer
 | |
| };
 | |
| 
 | |
| // ============================================================================
 | |
| // wxCocoaOutlineDataSource
 | |
| // ============================================================================
 | |
| //
 | |
| // This class implements the data source delegate for the outline view.
 | |
| // As only an informal protocol exists this class inherits from NSObject only.
 | |
| //
 | |
| // As mentioned in the documentation for NSOutlineView the native control does
 | |
| // not own any data. Therefore, it has to be done by the data source.
 | |
| // Unfortunately, wxWidget's data source is a C++ data source but
 | |
| // NSOutlineDataSource requires objects as data. Therefore, the data (or better
 | |
| // the native item objects) have to be stored additionally in the native data
 | |
| // source.
 | |
| // NSOutlineView requires quick access to the item objects and quick linear
 | |
| // access to an item's children. This requires normally a hash type of storage
 | |
| // for the item object itself and an array structure for each item's children.
 | |
| // This means that basically two times the whole structure of wxWidget's model
 | |
| // class has to be stored.
 | |
| // This implementation is using a compromise: all items that are in use by the
 | |
| // control are stored in a set (from there they can be easily retrieved) and
 | |
| // owned by the set. Furthermore, children of the last parent are stored
 | |
| // in a linear list.
 | |
| //
 | |
| @interface wxCocoaOutlineDataSource : NSObject
 | |
| {
 | |
|   NSArray* sortDescriptors; // descriptors specifying the sorting (currently the array only holds one object only)
 | |
| 
 | |
|   NSMutableArray* children; // buffered children
 | |
| 
 | |
|   NSMutableSet* items; // stores all items that are in use by the control
 | |
|   
 | |
|   wxCocoaDataViewControl* implementation;
 | |
|   
 | |
|   wxDataViewModel* model;
 | |
|   
 | |
|   wxPointerObject* currentParentItem; // parent of the buffered children; the object is owned
 | |
| }
 | |
| 
 | |
|  //
 | |
|  // methods of informal protocol:
 | |
|  //
 | |
|   -(BOOL)            outlineView:(NSOutlineView*)outlineView acceptDrop:(id<NSDraggingInfo>)info item:(id)item childIndex:(NSInteger)index;
 | |
|   -(id)              outlineView:(NSOutlineView*)outlineView child:(NSInteger)index ofItem:(id)item;
 | |
|   -(id)              outlineView:(NSOutlineView*)outlineView objectValueForTableColumn:(NSTableColumn*)tableColumn byItem:(id)item;
 | |
|   -(BOOL)            outlineView:(NSOutlineView*)outlineView isItemExpandable:(id)item;
 | |
|   -(NSInteger)       outlineView:(NSOutlineView*)outlineView numberOfChildrenOfItem:(id)item;
 | |
|   -(NSDragOperation) outlineView:(NSOutlineView*)outlineView validateDrop:(id<NSDraggingInfo>)info proposedItem:(id)item proposedChildIndex:(NSInteger)index;
 | |
|   -(BOOL)            outlineView:(NSOutlineView*)outlineView writeItems:(NSArray*)items toPasteboard:(NSPasteboard*)pasteboard;
 | |
| 
 | |
|  //
 | |
|  // buffer for items handling
 | |
|  //
 | |
|   -(void)             addToBuffer:(wxPointerObject*)item;
 | |
|   -(void)             clearBuffer;
 | |
|   -(wxPointerObject*) getDataViewItemFromBuffer:(wxDataViewItem const&)item;  // returns the item in the buffer that has got the same pointer as "item",
 | |
|   -(wxPointerObject*) getItemFromBuffer:(wxPointerObject*)item;               // if such an item does not exist nil is returned
 | |
|   -(BOOL)             isInBuffer:(wxPointerObject*)item;
 | |
|   -(void)             removeFromBuffer:(wxPointerObject*)item;
 | |
| 
 | |
|  //
 | |
|  // buffered children handling
 | |
|  //
 | |
|   -(void)             appendChild:(wxPointerObject*)item;
 | |
|   -(void)             clearChildren;
 | |
|   -(wxPointerObject*) getChild:(NSUInteger)index;
 | |
|   -(NSUInteger)       getChildCount;
 | |
|   -(void)             removeChild:(NSUInteger)index;
 | |
| 
 | |
|  //
 | |
|  // buffer handling
 | |
|  //
 | |
|   -(void) clearBuffers;
 | |
| 
 | |
|  //
 | |
|  // sorting
 | |
|  //
 | |
|   -(NSArray*) sortDescriptors;
 | |
|   -(void)     setSortDescriptors:(NSArray*)newSortDescriptors;
 | |
| 
 | |
|  //
 | |
|  // access to wxWidget's variables
 | |
|  //
 | |
|   -(wxPointerObject*)        currentParentItem;
 | |
|   -(wxCocoaDataViewControl*) implementation;
 | |
|   -(wxDataViewModel*)        model;
 | |
|   -(void)                    setCurrentParentItem:(wxPointerObject*)newCurrentParentItem;
 | |
|   -(void)                    setImplementation:(wxCocoaDataViewControl*)newImplementation;
 | |
|   -(void)                    setModel:(wxDataViewModel*)newModel;
 | |
| 
 | |
|  //
 | |
|  // other methods
 | |
|  //
 | |
|   -(void) bufferItem:(wxPointerObject*)parentItem withChildren:(wxDataViewItemArray*)dataViewChildrenPtr;
 | |
| 
 | |
| @end
 | |
| 
 | |
| // ============================================================================
 | |
| // wxCustomCell
 | |
| // ============================================================================
 | |
| //
 | |
| // This is a cell that is used for custom renderers.
 | |
| //
 | |
| @interface wxCustomCell : NSTextFieldCell
 | |
| {
 | |
| }
 | |
| 
 | |
|  //
 | |
|  // other methods
 | |
|  //
 | |
|   -(NSSize) cellSize;
 | |
| 
 | |
| @end
 | |
| 
 | |
| // ============================================================================
 | |
| // wxImageTextCell
 | |
| // ============================================================================
 | |
| //
 | |
| // As the native cocoa environment does not have a cell displaying an icon/
 | |
| // image and text at the same time, it has to be implemented by the user.
 | |
| // This implementation follows the implementation of Chuck Pisula in Apple's
 | |
| // DragNDropOutline sample application.
 | |
| // Although in wxDataViewCtrl icons are used on OSX icons do not exist for
 | |
| // display. Therefore, the cell is also called wxImageTextCell.
 | |
| // Instead of displaying images of any size (which is possible) this cell uses
 | |
| // a fixed size for displaying the image. Larger images are scaled to fit
 | |
| // into their reserved space. Smaller or not existing images use the fixed
 | |
| // reserved size and are scaled if necessary.
 | |
| //
 | |
| @interface wxImageTextCell : NSTextFieldCell
 | |
| {
 | |
| @private
 | |
|   CGFloat xImageShift;    // shift for the image in x-direction from border
 | |
|   CGFloat spaceImageText; // space between image and text ("belongs" to the image)
 | |
|   
 | |
|   NSImage* image; // the image itself
 | |
|   
 | |
|   NSSize imageSize; // largest size of the image; default size is (16, 16)
 | |
|   
 | |
|   NSTextAlignment cellAlignment; // the text alignment is used to align the whole
 | |
|                                  // cell (image and text)
 | |
| }
 | |
| 
 | |
|  //
 | |
|  // alignment
 | |
|  //
 | |
|   -(NSTextAlignment) alignment;
 | |
|   -(void) setAlignment:(NSTextAlignment)newAlignment;
 | |
| 
 | |
|  //
 | |
|  // image access
 | |
|  //
 | |
|   -(NSImage*) image;
 | |
|   -(void) setImage:(NSImage*)newImage;
 | |
| 
 | |
|  //
 | |
|  // size access
 | |
|  //
 | |
|   -(NSSize) imageSize;
 | |
|   -(void) setImageSize:(NSSize) newImageSize;
 | |
| 
 | |
|  //
 | |
|  // other methods
 | |
|  //
 | |
|   -(NSSize) cellSize;
 | |
| 
 | |
| @end
 | |
| 
 | |
| // ============================================================================
 | |
| // wxCocoaOutlineView
 | |
| // ============================================================================
 | |
| @interface wxCocoaOutlineView : NSOutlineView
 | |
| {
 | |
| @private
 | |
|   BOOL isEditingCell; // flag indicating if a cell is currently being edited
 | |
| 
 | |
|   wxCocoaDataViewControl* implementation;
 | |
| }
 | |
| 
 | |
|  //
 | |
|  // access to wxWidget's implementation
 | |
|  //
 | |
|   -(wxCocoaDataViewControl*) implementation;
 | |
|   -(void)                    setImplementation:(wxCocoaDataViewControl*) newImplementation;
 | |
| 
 | |
| @end
 | |
| 
 | |
| // ============================================================================
 | |
| // wxCocoaDataViewControl
 | |
| // ============================================================================
 | |
| //
 | |
| // This is the internal interface class between wxDataViewCtrl (wxWidget) and
 | |
| // the native source view (Mac OS X cocoa).
 | |
| //
 | |
| class wxCocoaDataViewControl : public wxWidgetCocoaImpl, public wxDataViewWidgetImpl
 | |
| {
 | |
| public:
 | |
|  //
 | |
|  // constructors / destructor
 | |
|  //
 | |
|   wxCocoaDataViewControl(wxWindow* peer, wxPoint const& pos, wxSize const& size, long style);
 | |
|   ~wxCocoaDataViewControl(void);
 | |
| 
 | |
|  //
 | |
|  // column related methods (inherited from wxDataViewWidgetImpl)
 | |
|  //
 | |
|   virtual bool              ClearColumns       (void);
 | |
|   virtual bool              DeleteColumn       (wxDataViewColumn* columnPtr);
 | |
|   virtual void              DoSetExpanderColumn(wxDataViewColumn const* columnPtr);
 | |
|   virtual wxDataViewColumn* GetColumn          (unsigned int pos) const;
 | |
|   virtual int               GetColumnPosition  (wxDataViewColumn const* columnPtr) const;
 | |
|   virtual bool              InsertColumn       (unsigned int pos, wxDataViewColumn* columnPtr);
 | |
| 
 | |
|  //
 | |
|  // item related methods (inherited from wxDataViewWidgetImpl)
 | |
|  //
 | |
|   virtual bool         Add          (wxDataViewItem const& parent, wxDataViewItem const& item);
 | |
|   virtual bool         Add          (wxDataViewItem const& parent, wxDataViewItemArray const& items);
 | |
|   virtual void         Collapse     (wxDataViewItem const& item);
 | |
|   virtual void         EnsureVisible(wxDataViewItem const& item, wxDataViewColumn const* columnPtr);
 | |
|   virtual void         Expand       (wxDataViewItem const& item);
 | |
|   virtual unsigned int GetCount     (void) const;
 | |
|   virtual wxRect       GetRectangle (wxDataViewItem const& item, wxDataViewColumn const* columnPtr);
 | |
|   virtual bool         IsExpanded   (wxDataViewItem const& item) const;
 | |
|   virtual bool         Reload       (void);
 | |
|   virtual bool         Remove       (wxDataViewItem const& parent, wxDataViewItem const& item);
 | |
|   virtual bool         Remove       (wxDataViewItem const& parent, wxDataViewItemArray const& item);
 | |
|   virtual bool         Update       (wxDataViewColumn const* columnPtr);
 | |
|   virtual bool         Update       (wxDataViewItem const& parent, wxDataViewItem const& item);
 | |
|   virtual bool         Update       (wxDataViewItem const& parent, wxDataViewItemArray const& items);
 | |
| 
 | |
|  //
 | |
|  // model related methods
 | |
|  //
 | |
|   virtual bool AssociateModel(wxDataViewModel* model); // informs the native control that a model is present
 | |
| 
 | |
|  //
 | |
|  // selection related methods (inherited from wxDataViewWidgetImpl)
 | |
|  //
 | |
|   virtual int  GetSelections(wxDataViewItemArray& sel)   const;
 | |
|   virtual bool IsSelected   (wxDataViewItem const& item) const;
 | |
|   virtual void Select       (wxDataViewItem const& item);
 | |
|   virtual void SelectAll    (void);
 | |
|   virtual void Unselect     (wxDataViewItem const& item);
 | |
|   virtual void UnselectAll  (void);
 | |
| 
 | |
|  //
 | |
|  // sorting related methods
 | |
|  //
 | |
|   virtual wxDataViewColumn* GetSortingColumn (void) const;
 | |
|   virtual void              Resort           (void);
 | |
| 
 | |
|  //
 | |
|  // other methods (inherited from wxDataViewWidgetImpl)
 | |
|  //
 | |
|   virtual void DoSetIndent (int indent);
 | |
|   virtual void HitTest     (wxPoint const& point, wxDataViewItem& item, wxDataViewColumn*& columnPtr) const;
 | |
|   virtual void SetRowHeight(wxDataViewItem const& item, unsigned int height);
 | |
|   virtual void OnSize      (void);
 | |
| 
 | |
|  //
 | |
|  // other methods
 | |
|  //
 | |
|   wxDataViewCtrl* GetDataViewCtrl(void) const
 | |
|   {
 | |
|     return dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer());
 | |
|   }
 | |
| 
 | |
| //
 | |
| // drag & drop helper methods
 | |
| //
 | |
|   wxDataFormat           GetDnDDataFormat(wxDataObjectComposite* dataObjects);
 | |
|   wxDataObjectComposite* GetDnDDataObjects(NSData* dataObject) const; // create the data objects from the native dragged object
 | |
| protected:
 | |
| private:
 | |
| //
 | |
| // variables
 | |
| //
 | |
|   wxCocoaOutlineDataSource* m_DataSource;
 | |
| 
 | |
|   wxCocoaOutlineView* m_OutlineView;
 | |
| };
 | |
| 
 | |
| typedef wxCocoaDataViewControl* wxCocoaDataViewControlPointer;
 | |
| 
 | |
| 
 | |
| #endif // wxUSE_GUI
 | |
| #endif // _WX_DATAVIEWCTRL_COCOOA_H_
 |