2009-05-08 13:07:50 -04:00
/////////////////////////////////////////////////////////////////////////////
// Name: wx/osx/dataview.h
// Purpose: wxDataViewCtrl native implementation header for OSX
// Author:
// Id: $Id$
// Copyright: (c) 2009
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
# ifndef _WX_DATAVIEWCTRL_OSX_H_
# define _WX_DATAVIEWCTRL_OSX_H_
2008-06-11 12:30:48 -04:00
# ifdef __WXMAC_CLASSIC__
# error "Native wxDataViewCtrl for classic environment not defined. Please use generic control."
# endif
2009-05-08 13:07:50 -04:00
// --------------------------------------------------------
// Class declarations to mask native types
// --------------------------------------------------------
class wxDataViewColumnNativeData ; // class storing environment dependent data for the native implementation
class wxDataViewWidgetImpl ; // class used as a common interface for carbon and cocoa implementation
// ---------------------------------------------------------
// wxDataViewColumn
// ---------------------------------------------------------
class WXDLLIMPEXP_ADV wxDataViewColumn : public wxDataViewColumnBase
{
public :
// constructors / destructor
wxDataViewColumn ( const wxString & title ,
wxDataViewRenderer * renderer ,
unsigned int model_column ,
int width = wxDVC_DEFAULT_WIDTH ,
wxAlignment align = wxALIGN_CENTER ,
int flags = wxDATAVIEW_COL_RESIZABLE ) ;
wxDataViewColumn ( const wxBitmap & bitmap ,
wxDataViewRenderer * renderer ,
unsigned int model_column ,
int width = wxDVC_DEFAULT_WIDTH ,
wxAlignment align = wxALIGN_CENTER ,
int flags = wxDATAVIEW_COL_RESIZABLE ) ;
2009-10-12 09:59:32 -04:00
virtual ~ wxDataViewColumn ( ) ;
2009-05-08 13:07:50 -04:00
// implement wxHeaderColumnBase pure virtual methods
virtual wxAlignment GetAlignment ( ) const { return m_alignment ; }
virtual int GetFlags ( ) const { return m_flags ; }
virtual int GetMaxWidth ( ) const { return m_maxWidth ; }
virtual int GetMinWidth ( ) const { return m_minWidth ; }
virtual wxString GetTitle ( ) const { return m_title ; }
2009-10-31 11:57:51 -04:00
virtual int GetWidth ( ) const ;
2009-05-08 13:07:50 -04:00
virtual bool IsSortOrderAscending ( ) const { return m_ascending ; }
virtual bool IsSortKey ( ) const ;
2010-06-10 08:43:09 -04:00
virtual bool IsHidden ( ) const ;
2009-05-08 13:07:50 -04:00
virtual void SetAlignment ( wxAlignment align ) ;
virtual void SetBitmap ( wxBitmap const & bitmap ) ;
virtual void SetFlags ( int flags ) { SetIndividualFlags ( flags ) ; }
2010-06-10 08:43:09 -04:00
virtual void SetHidden ( bool hidden ) ;
2009-05-08 13:07:50 -04:00
virtual void SetMaxWidth ( int maxWidth ) ;
virtual void SetMinWidth ( int minWidth ) ;
virtual void SetReorderable ( bool reorderable ) ;
2011-04-03 16:31:32 -04:00
virtual void SetResizeable ( bool resizable ) ;
2009-05-08 13:07:50 -04:00
virtual void SetSortable ( bool sortable ) ;
virtual void SetSortOrder ( bool ascending ) ;
virtual void SetTitle ( wxString const & title ) ;
virtual void SetWidth ( int width ) ;
// implementation only
2009-10-12 09:59:32 -04:00
wxDataViewColumnNativeData * GetNativeData ( ) const
2009-05-08 13:07:50 -04:00
{
2009-10-12 09:59:32 -04:00
return m_NativeDataPtr ;
2009-05-08 13:07:50 -04:00
}
2009-08-21 06:41:26 -04:00
2009-05-08 13:07:50 -04:00
void SetNativeData ( wxDataViewColumnNativeData * newNativeDataPtr ) ; // class takes ownership of pointer
2009-10-31 11:57:51 -04:00
int GetWidthVariable ( ) const
{
return m_width ;
}
2009-05-08 13:07:50 -04:00
void SetWidthVariable ( int NewWidth )
{
m_width = NewWidth ;
}
2009-06-15 14:35:24 -04:00
void SetSortOrderVariable ( bool NewOrder )
{
m_ascending = NewOrder ;
}
2009-05-08 13:07:50 -04:00
private :
// common part of all ctors
void InitCommon ( int width , wxAlignment align , int flags )
{
m_ascending = true ;
m_flags = flags & ~ wxDATAVIEW_COL_HIDDEN ; // TODO
m_maxWidth = 30000 ;
m_minWidth = 0 ;
m_alignment = align ;
2011-01-07 13:26:58 -05:00
SetWidth ( width ) ;
2009-05-08 13:07:50 -04:00
}
bool m_ascending ; // sorting order
int m_flags ; // flags for the column
int m_maxWidth ; // maximum width for the column
int m_minWidth ; // minimum width for the column
int m_width ; // column width
wxAlignment m_alignment ; // column header alignment
wxDataViewColumnNativeData * m_NativeDataPtr ; // storing environment dependent data for the native implementation
wxString m_title ; // column title
} ;
//
// type definitions related to wxDataViewColumn
//
WX_DEFINE_ARRAY ( wxDataViewColumn * , wxDataViewColumnPtrArrayType ) ;
// ---------------------------------------------------------
// wxDataViewCtrl
// ---------------------------------------------------------
class WXDLLIMPEXP_ADV wxDataViewCtrl : public wxDataViewCtrlBase
{
public :
// Constructors / destructor:
wxDataViewCtrl ( )
{
2009-10-12 09:59:32 -04:00
Init ( ) ;
2009-05-08 13:07:50 -04:00
}
2010-08-08 07:37:57 -04:00
wxDataViewCtrl ( wxWindow * parent ,
wxWindowID winid ,
const wxPoint & pos = wxDefaultPosition ,
const wxSize & size = wxDefaultSize ,
long style = 0 ,
const wxValidator & validator = wxDefaultValidator ,
const wxString & name = wxDataViewCtrlNameStr )
2009-05-08 13:07:50 -04:00
{
2009-10-12 09:59:32 -04:00
Init ( ) ;
2010-08-08 07:37:57 -04:00
Create ( parent , winid , pos , size , style , validator , name ) ;
2009-05-08 13:07:50 -04:00
}
~ wxDataViewCtrl ( ) ;
2010-08-08 07:37:57 -04:00
bool Create ( wxWindow * parent ,
wxWindowID winid ,
const wxPoint & pos = wxDefaultPosition ,
const wxSize & size = wxDefaultSize ,
long style = 0 ,
const wxValidator & validator = wxDefaultValidator ,
const wxString & name = wxDataViewCtrlNameStr ) ;
2009-05-08 13:07:50 -04:00
virtual wxControl * GetMainWindow ( ) // not used for the native implementation
{
return this ;
}
// inherited methods from wxDataViewCtrlBase:
virtual bool AssociateModel ( wxDataViewModel * model ) ;
virtual bool AppendColumn ( wxDataViewColumn * columnPtr ) ;
2009-10-12 09:59:32 -04:00
virtual bool ClearColumns ( ) ;
2009-05-08 13:07:50 -04:00
virtual bool DeleteColumn ( wxDataViewColumn * columnPtr ) ;
virtual wxDataViewColumn * GetColumn ( unsigned int pos ) const ;
2009-10-12 09:59:32 -04:00
virtual unsigned int GetColumnCount ( ) const ;
2009-05-08 13:07:50 -04:00
virtual int GetColumnPosition ( const wxDataViewColumn * columnPtr ) const ;
2009-10-12 09:59:32 -04:00
virtual wxDataViewColumn * GetSortingColumn ( ) const ;
2009-05-08 13:07:50 -04:00
virtual bool InsertColumn ( unsigned int pos , wxDataViewColumn * col ) ;
virtual bool PrependColumn ( wxDataViewColumn * columnPtr ) ;
virtual void Collapse ( const wxDataViewItem & item ) ;
virtual void EnsureVisible ( const wxDataViewItem & item , const wxDataViewColumn * columnPtr = NULL ) ;
virtual void Expand ( const wxDataViewItem & item ) ;
virtual bool IsExpanded ( const wxDataViewItem & item ) const ;
virtual unsigned int GetCount ( ) const ;
virtual wxRect GetItemRect ( const wxDataViewItem & item , const wxDataViewColumn * columnPtr ) const ;
2011-08-22 08:41:19 -04:00
virtual int GetSelectedItemsCount ( ) const ;
2009-05-08 13:07:50 -04:00
virtual int GetSelections ( wxDataViewItemArray & sel ) const ;
virtual void HitTest ( const wxPoint & point , wxDataViewItem & item , wxDataViewColumn * & columnPtr ) const ;
virtual bool IsSelected ( const wxDataViewItem & item ) const ;
virtual void SelectAll ( ) ;
virtual void Select ( const wxDataViewItem & item ) ;
virtual void SetSelections ( const wxDataViewItemArray & sel ) ;
virtual void Unselect ( const wxDataViewItem & item ) ;
virtual void UnselectAll ( ) ;
//
// implementation
//
// returns a pointer to the native implementation
2009-10-12 09:59:32 -04:00
wxDataViewWidgetImpl * GetDataViewPeer ( ) const ;
2009-05-08 13:07:50 -04:00
// adds all children of the passed parent to the control; if 'parentItem' is invalid the root(s) is/are added:
void AddChildren ( wxDataViewItem const & parentItem ) ;
// finishes editing of custom items; if no custom item is currently edited the method does nothing
2009-10-12 09:59:32 -04:00
void FinishCustomItemEditing ( ) ;
2011-05-31 15:36:47 -04:00
virtual void StartEditor ( const wxDataViewItem & item , unsigned int column ) ;
2009-05-08 13:07:50 -04:00
// returns the n-th pointer to a column;
// this method is different from GetColumn(unsigned int pos) because here 'n' is not a position in the control but the n-th
// position in the internal list/array of column pointers
wxDataViewColumn * GetColumnPtr ( size_t n ) const
{
2009-10-12 09:59:32 -04:00
return m_ColumnPtrs [ n ] ;
2009-05-08 13:07:50 -04:00
}
// returns the current being rendered item of the customized renderer (this item is only valid during editing)
wxDataViewItem const & GetCustomRendererItem ( ) const
{
2009-10-12 09:59:32 -04:00
return m_CustomRendererItem ;
2009-05-08 13:07:50 -04:00
}
// returns a pointer to a customized renderer (this pointer is only valid during editing)
wxDataViewCustomRenderer * GetCustomRendererPtr ( ) const
{
2009-10-12 09:59:32 -04:00
return m_CustomRendererPtr ;
2009-05-08 13:07:50 -04:00
}
// checks if currently a delete process is running
bool IsDeleting ( ) const
{
2009-10-12 09:59:32 -04:00
return m_Deleting ;
2009-05-08 13:07:50 -04:00
}
// with CG, we need to get the context from an kEventControlDraw event
// unfortunately, the DataBrowser callbacks don't provide the context
// and we need it, so we need to set/remove it before and after draw
// events so we can access it in the callbacks.
void MacSetDrawingContext ( void * context )
{
2009-10-12 09:59:32 -04:00
m_cgContext = context ;
2009-05-08 13:07:50 -04:00
}
void * MacGetDrawingContext ( ) const
{
2009-10-12 09:59:32 -04:00
return m_cgContext ;
2009-05-08 13:07:50 -04:00
}
// sets the currently being edited item of the custom renderer
void SetCustomRendererItem ( wxDataViewItem const & NewItem )
{
2009-10-12 09:59:32 -04:00
m_CustomRendererItem = NewItem ;
2009-05-08 13:07:50 -04:00
}
// sets the custom renderer
void SetCustomRendererPtr ( wxDataViewCustomRenderer * NewCustomRendererPtr )
{
2009-10-12 09:59:32 -04:00
m_CustomRendererPtr = NewCustomRendererPtr ;
2009-05-08 13:07:50 -04:00
}
// sets the flag indicating a deletion process:
void SetDeleting ( bool deleting )
{
2009-10-12 09:59:32 -04:00
m_Deleting = deleting ;
2009-05-08 13:07:50 -04:00
}
virtual wxVisualAttributes GetDefaultAttributes ( ) const
{
return GetClassDefaultAttributes ( GetWindowVariant ( ) ) ;
}
static wxVisualAttributes
GetClassDefaultAttributes ( wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL ) ;
protected :
// inherited methods from wxDataViewCtrlBase
virtual void DoSetExpanderColumn ( ) ;
virtual void DoSetIndent ( ) ;
2009-05-11 08:53:19 -04:00
virtual wxSize DoGetBestSize ( ) const ;
2009-05-08 13:07:50 -04:00
// event handling
void OnSize ( wxSizeEvent & event ) ;
2009-05-11 08:53:19 -04:00
void OnMouse ( wxMouseEvent & event ) ;
2009-05-08 13:07:50 -04:00
private :
// initializing of local variables:
void Init ( ) ;
2010-08-10 08:53:03 -04:00
virtual wxDataViewItem DoGetCurrentItem ( ) const ;
virtual void DoSetCurrentItem ( const wxDataViewItem & item ) ;
2009-05-08 13:07:50 -04:00
//
// variables
//
bool m_Deleting ; // flag indicating if a delete process is running; this flag is necessary because the notifier indicating an item deletion in the model may be called
// after the actual deletion of the item; then, native callback functions/delegates may try to update data of variables that are already deleted;
// if this flag is set all native variable update requests will be ignored
void * m_cgContext ; // pointer to core graphics context
wxDataViewCustomRenderer * m_CustomRendererPtr ; // pointer to a valid custom renderer while editing; this class does NOT own the pointer
wxDataViewItem m_CustomRendererItem ; // currently edited item by the customrenderer; it is invalid while not editing a custom item
wxDataViewColumnPtrArrayType m_ColumnPtrs ; // all column pointers are stored in an array
// wxWidget internal stuff:
DECLARE_DYNAMIC_CLASS ( wxDataViewCtrl )
DECLARE_NO_COPY_CLASS ( wxDataViewCtrl )
DECLARE_EVENT_TABLE ( )
} ;
# endif // _WX_DATAVIEWCTRL_OSX_H_