dataview.h 56 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356
  1. /////////////////////////////////////////////////////////////////////////////
  2. // Name: wx/dataview.h
  3. // Purpose: wxDataViewCtrl base classes
  4. // Author: Robert Roebling
  5. // Modified by: Bo Yang
  6. // Created: 08.01.06
  7. // Copyright: (c) Robert Roebling
  8. // Licence: wxWindows licence
  9. /////////////////////////////////////////////////////////////////////////////
  10. #ifndef _WX_DATAVIEW_H_BASE_
  11. #define _WX_DATAVIEW_H_BASE_
  12. #include "wx/defs.h"
  13. #if wxUSE_DATAVIEWCTRL
  14. #include "wx/textctrl.h"
  15. #include "wx/headercol.h"
  16. #include "wx/variant.h"
  17. #include "wx/dnd.h" // For wxDragResult declaration only.
  18. #include "wx/dynarray.h"
  19. #include "wx/icon.h"
  20. #include "wx/itemid.h"
  21. #include "wx/weakref.h"
  22. #include "wx/vector.h"
  23. #include "wx/dataobj.h"
  24. #include "wx/withimages.h"
  25. class WXDLLIMPEXP_FWD_CORE wxImageList;
  26. #if !(defined(__WXGTK20__) || defined(__WXOSX__)) || defined(__WXUNIVERSAL__)
  27. // #if !(defined(__WXOSX__)) || defined(__WXUNIVERSAL__)
  28. #define wxHAS_GENERIC_DATAVIEWCTRL
  29. #endif
  30. #ifdef wxHAS_GENERIC_DATAVIEWCTRL
  31. // this symbol doesn't follow the convention for wxUSE_XXX symbols which
  32. // are normally always defined as either 0 or 1, so its use is deprecated
  33. // and it only exists for backwards compatibility, don't use it any more
  34. // and use wxHAS_GENERIC_DATAVIEWCTRL instead
  35. #define wxUSE_GENERICDATAVIEWCTRL
  36. #endif
  37. // ----------------------------------------------------------------------------
  38. // wxDataViewCtrl globals
  39. // ----------------------------------------------------------------------------
  40. class WXDLLIMPEXP_FWD_ADV wxDataViewModel;
  41. class WXDLLIMPEXP_FWD_ADV wxDataViewCtrl;
  42. class WXDLLIMPEXP_FWD_ADV wxDataViewColumn;
  43. class WXDLLIMPEXP_FWD_ADV wxDataViewRenderer;
  44. class WXDLLIMPEXP_FWD_ADV wxDataViewModelNotifier;
  45. extern WXDLLIMPEXP_DATA_ADV(const char) wxDataViewCtrlNameStr[];
  46. // ----------------------------------------------------------------------------
  47. // wxDataViewCtrl flags
  48. // ----------------------------------------------------------------------------
  49. // size of a wxDataViewRenderer without contents:
  50. #define wxDVC_DEFAULT_RENDERER_SIZE 20
  51. // the default width of new (text) columns:
  52. #define wxDVC_DEFAULT_WIDTH 80
  53. // the default width of new toggle columns:
  54. #define wxDVC_TOGGLE_DEFAULT_WIDTH 30
  55. // the default minimal width of the columns:
  56. #define wxDVC_DEFAULT_MINWIDTH 30
  57. // The default alignment of wxDataViewRenderers is to take
  58. // the alignment from the column it owns.
  59. #define wxDVR_DEFAULT_ALIGNMENT -1
  60. // ---------------------------------------------------------
  61. // wxDataViewItem
  62. // ---------------------------------------------------------
  63. // Make it a class and not a typedef to allow forward declaring it.
  64. class wxDataViewItem : public wxItemId<void*>
  65. {
  66. public:
  67. wxDataViewItem() : wxItemId<void*>() { }
  68. wxEXPLICIT wxDataViewItem(void* pItem) : wxItemId<void*>(pItem) { }
  69. };
  70. WX_DEFINE_ARRAY(wxDataViewItem, wxDataViewItemArray);
  71. // ---------------------------------------------------------
  72. // wxDataViewModelNotifier
  73. // ---------------------------------------------------------
  74. class WXDLLIMPEXP_ADV wxDataViewModelNotifier
  75. {
  76. public:
  77. wxDataViewModelNotifier() { m_owner = NULL; }
  78. virtual ~wxDataViewModelNotifier() { m_owner = NULL; }
  79. virtual bool ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item ) = 0;
  80. virtual bool ItemDeleted( const wxDataViewItem &parent, const wxDataViewItem &item ) = 0;
  81. virtual bool ItemChanged( const wxDataViewItem &item ) = 0;
  82. virtual bool ItemsAdded( const wxDataViewItem &parent, const wxDataViewItemArray &items );
  83. virtual bool ItemsDeleted( const wxDataViewItem &parent, const wxDataViewItemArray &items );
  84. virtual bool ItemsChanged( const wxDataViewItemArray &items );
  85. virtual bool ValueChanged( const wxDataViewItem &item, unsigned int col ) = 0;
  86. virtual bool Cleared() = 0;
  87. // some platforms, such as GTK+, may need a two step procedure for ::Reset()
  88. virtual bool BeforeReset() { return true; }
  89. virtual bool AfterReset() { return Cleared(); }
  90. virtual void Resort() = 0;
  91. void SetOwner( wxDataViewModel *owner ) { m_owner = owner; }
  92. wxDataViewModel *GetOwner() const { return m_owner; }
  93. private:
  94. wxDataViewModel *m_owner;
  95. };
  96. // ----------------------------------------------------------------------------
  97. // wxDataViewItemAttr: a structure containing the visual attributes of an item
  98. // ----------------------------------------------------------------------------
  99. // TODO: this should be renamed to wxItemAttr or something general like this
  100. class WXDLLIMPEXP_ADV wxDataViewItemAttr
  101. {
  102. public:
  103. // ctors
  104. wxDataViewItemAttr()
  105. {
  106. m_bold = false;
  107. m_italic = false;
  108. }
  109. // setters
  110. void SetColour(const wxColour& colour) { m_colour = colour; }
  111. void SetBold( bool set ) { m_bold = set; }
  112. void SetItalic( bool set ) { m_italic = set; }
  113. void SetBackgroundColour(const wxColour& colour) { m_bgColour = colour; }
  114. // accessors
  115. bool HasColour() const { return m_colour.IsOk(); }
  116. const wxColour& GetColour() const { return m_colour; }
  117. bool HasFont() const { return m_bold || m_italic; }
  118. bool GetBold() const { return m_bold; }
  119. bool GetItalic() const { return m_italic; }
  120. bool HasBackgroundColour() const { return m_bgColour.IsOk(); }
  121. const wxColour& GetBackgroundColour() const { return m_bgColour; }
  122. bool IsDefault() const { return !(HasColour() || HasFont() || HasBackgroundColour()); }
  123. // Return the font based on the given one with this attribute applied to it.
  124. wxFont GetEffectiveFont(const wxFont& font) const;
  125. private:
  126. wxColour m_colour;
  127. bool m_bold;
  128. bool m_italic;
  129. wxColour m_bgColour;
  130. };
  131. // ---------------------------------------------------------
  132. // wxDataViewModel
  133. // ---------------------------------------------------------
  134. WX_DECLARE_LIST_WITH_DECL(wxDataViewModelNotifier, wxDataViewModelNotifiers,
  135. class WXDLLIMPEXP_ADV);
  136. class WXDLLIMPEXP_ADV wxDataViewModel: public wxRefCounter
  137. {
  138. public:
  139. wxDataViewModel();
  140. virtual unsigned int GetColumnCount() const = 0;
  141. // return type as reported by wxVariant
  142. virtual wxString GetColumnType( unsigned int col ) const = 0;
  143. // get value into a wxVariant
  144. virtual void GetValue( wxVariant &variant,
  145. const wxDataViewItem &item, unsigned int col ) const = 0;
  146. // return true if the given item has a value to display in the given
  147. // column: this is always true except for container items which by default
  148. // only show their label in the first column (but see HasContainerColumns())
  149. bool HasValue(const wxDataViewItem& item, unsigned col) const
  150. {
  151. return col == 0 || !IsContainer(item) || HasContainerColumns(item);
  152. }
  153. // usually ValueChanged() should be called after changing the value in the
  154. // model to update the control, ChangeValue() does it on its own while
  155. // SetValue() does not -- so while you will override SetValue(), you should
  156. // be usually calling ChangeValue()
  157. virtual bool SetValue(const wxVariant &variant,
  158. const wxDataViewItem &item,
  159. unsigned int col) = 0;
  160. bool ChangeValue(const wxVariant& variant,
  161. const wxDataViewItem& item,
  162. unsigned int col)
  163. {
  164. return SetValue(variant, item, col) && ValueChanged(item, col);
  165. }
  166. // Get text attribute, return false of default attributes should be used
  167. virtual bool GetAttr(const wxDataViewItem &WXUNUSED(item),
  168. unsigned int WXUNUSED(col),
  169. wxDataViewItemAttr &WXUNUSED(attr)) const
  170. {
  171. return false;
  172. }
  173. // Override this if you want to disable specific items
  174. virtual bool IsEnabled(const wxDataViewItem &WXUNUSED(item),
  175. unsigned int WXUNUSED(col)) const
  176. {
  177. return true;
  178. }
  179. // define hierarchy
  180. virtual wxDataViewItem GetParent( const wxDataViewItem &item ) const = 0;
  181. virtual bool IsContainer( const wxDataViewItem &item ) const = 0;
  182. // Is the container just a header or an item with all columns
  183. virtual bool HasContainerColumns(const wxDataViewItem& WXUNUSED(item)) const
  184. { return false; }
  185. virtual unsigned int GetChildren( const wxDataViewItem &item, wxDataViewItemArray &children ) const = 0;
  186. // delegated notifiers
  187. bool ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item );
  188. bool ItemsAdded( const wxDataViewItem &parent, const wxDataViewItemArray &items );
  189. bool ItemDeleted( const wxDataViewItem &parent, const wxDataViewItem &item );
  190. bool ItemsDeleted( const wxDataViewItem &parent, const wxDataViewItemArray &items );
  191. bool ItemChanged( const wxDataViewItem &item );
  192. bool ItemsChanged( const wxDataViewItemArray &items );
  193. bool ValueChanged( const wxDataViewItem &item, unsigned int col );
  194. bool Cleared();
  195. // some platforms, such as GTK+, may need a two step procedure for ::Reset()
  196. bool BeforeReset();
  197. bool AfterReset();
  198. // delegated action
  199. virtual void Resort();
  200. void AddNotifier( wxDataViewModelNotifier *notifier );
  201. void RemoveNotifier( wxDataViewModelNotifier *notifier );
  202. // default compare function
  203. virtual int Compare( const wxDataViewItem &item1, const wxDataViewItem &item2,
  204. unsigned int column, bool ascending ) const;
  205. virtual bool HasDefaultCompare() const { return false; }
  206. // internal
  207. virtual bool IsListModel() const { return false; }
  208. virtual bool IsVirtualListModel() const { return false; }
  209. protected:
  210. // the user should not delete this class directly: he should use DecRef() instead!
  211. virtual ~wxDataViewModel() { }
  212. wxDataViewModelNotifiers m_notifiers;
  213. };
  214. // ----------------------------------------------------------------------------
  215. // wxDataViewListModel: a model of a list, i.e. flat data structure without any
  216. // branches/containers, used as base class by wxDataViewIndexListModel and
  217. // wxDataViewVirtualListModel
  218. // ----------------------------------------------------------------------------
  219. class WXDLLIMPEXP_ADV wxDataViewListModel : public wxDataViewModel
  220. {
  221. public:
  222. // derived classes should override these methods instead of
  223. // {Get,Set}Value() and GetAttr() inherited from the base class
  224. virtual void GetValueByRow(wxVariant &variant,
  225. unsigned row, unsigned col) const = 0;
  226. virtual bool SetValueByRow(const wxVariant &variant,
  227. unsigned row, unsigned col) = 0;
  228. virtual bool
  229. GetAttrByRow(unsigned WXUNUSED(row), unsigned WXUNUSED(col),
  230. wxDataViewItemAttr &WXUNUSED(attr)) const
  231. {
  232. return false;
  233. }
  234. virtual bool IsEnabledByRow(unsigned int WXUNUSED(row),
  235. unsigned int WXUNUSED(col)) const
  236. {
  237. return true;
  238. }
  239. // helper methods provided by list models only
  240. virtual unsigned GetRow( const wxDataViewItem &item ) const = 0;
  241. // returns the number of rows
  242. virtual unsigned int GetCount() const = 0;
  243. // implement some base class pure virtual directly
  244. virtual wxDataViewItem
  245. GetParent( const wxDataViewItem & WXUNUSED(item) ) const
  246. {
  247. // items never have valid parent in this model
  248. return wxDataViewItem();
  249. }
  250. virtual bool IsContainer( const wxDataViewItem &item ) const
  251. {
  252. // only the invisible (and invalid) root item has children
  253. return !item.IsOk();
  254. }
  255. // and implement some others by forwarding them to our own ones
  256. virtual void GetValue( wxVariant &variant,
  257. const wxDataViewItem &item, unsigned int col ) const
  258. {
  259. GetValueByRow(variant, GetRow(item), col);
  260. }
  261. virtual bool SetValue( const wxVariant &variant,
  262. const wxDataViewItem &item, unsigned int col )
  263. {
  264. return SetValueByRow( variant, GetRow(item), col );
  265. }
  266. virtual bool GetAttr(const wxDataViewItem &item, unsigned int col,
  267. wxDataViewItemAttr &attr) const
  268. {
  269. return GetAttrByRow( GetRow(item), col, attr );
  270. }
  271. virtual bool IsEnabled(const wxDataViewItem &item, unsigned int col) const
  272. {
  273. return IsEnabledByRow( GetRow(item), col );
  274. }
  275. virtual bool IsListModel() const { return true; }
  276. };
  277. // ---------------------------------------------------------
  278. // wxDataViewIndexListModel
  279. // ---------------------------------------------------------
  280. class WXDLLIMPEXP_ADV wxDataViewIndexListModel: public wxDataViewListModel
  281. {
  282. public:
  283. wxDataViewIndexListModel( unsigned int initial_size = 0 );
  284. void RowPrepended();
  285. void RowInserted( unsigned int before );
  286. void RowAppended();
  287. void RowDeleted( unsigned int row );
  288. void RowsDeleted( const wxArrayInt &rows );
  289. void RowChanged( unsigned int row );
  290. void RowValueChanged( unsigned int row, unsigned int col );
  291. void Reset( unsigned int new_size );
  292. // convert to/from row/wxDataViewItem
  293. virtual unsigned GetRow( const wxDataViewItem &item ) const;
  294. wxDataViewItem GetItem( unsigned int row ) const;
  295. // implement base methods
  296. virtual unsigned int GetChildren( const wxDataViewItem &item, wxDataViewItemArray &children ) const;
  297. unsigned int GetCount() const { return m_hash.GetCount(); }
  298. private:
  299. wxDataViewItemArray m_hash;
  300. unsigned int m_nextFreeID;
  301. bool m_ordered;
  302. };
  303. // ---------------------------------------------------------
  304. // wxDataViewVirtualListModel
  305. // ---------------------------------------------------------
  306. #ifdef __WXMAC__
  307. // better than nothing
  308. typedef wxDataViewIndexListModel wxDataViewVirtualListModel;
  309. #else
  310. class WXDLLIMPEXP_ADV wxDataViewVirtualListModel: public wxDataViewListModel
  311. {
  312. public:
  313. wxDataViewVirtualListModel( unsigned int initial_size = 0 );
  314. void RowPrepended();
  315. void RowInserted( unsigned int before );
  316. void RowAppended();
  317. void RowDeleted( unsigned int row );
  318. void RowsDeleted( const wxArrayInt &rows );
  319. void RowChanged( unsigned int row );
  320. void RowValueChanged( unsigned int row, unsigned int col );
  321. void Reset( unsigned int new_size );
  322. // convert to/from row/wxDataViewItem
  323. virtual unsigned GetRow( const wxDataViewItem &item ) const;
  324. wxDataViewItem GetItem( unsigned int row ) const;
  325. // compare based on index
  326. virtual int Compare( const wxDataViewItem &item1, const wxDataViewItem &item2,
  327. unsigned int column, bool ascending ) const;
  328. virtual bool HasDefaultCompare() const;
  329. // implement base methods
  330. virtual unsigned int GetChildren( const wxDataViewItem &item, wxDataViewItemArray &children ) const;
  331. unsigned int GetCount() const { return m_size; }
  332. // internal
  333. virtual bool IsVirtualListModel() const { return true; }
  334. private:
  335. unsigned int m_size;
  336. };
  337. #endif
  338. // ----------------------------------------------------------------------------
  339. // wxDataViewRenderer and related classes
  340. // ----------------------------------------------------------------------------
  341. #include "wx/dvrenderers.h"
  342. // ---------------------------------------------------------
  343. // wxDataViewColumnBase
  344. // ---------------------------------------------------------
  345. // for compatibility only, do not use
  346. enum wxDataViewColumnFlags
  347. {
  348. wxDATAVIEW_COL_RESIZABLE = wxCOL_RESIZABLE,
  349. wxDATAVIEW_COL_SORTABLE = wxCOL_SORTABLE,
  350. wxDATAVIEW_COL_REORDERABLE = wxCOL_REORDERABLE,
  351. wxDATAVIEW_COL_HIDDEN = wxCOL_HIDDEN
  352. };
  353. class WXDLLIMPEXP_ADV wxDataViewColumnBase : public wxSettableHeaderColumn
  354. {
  355. public:
  356. // ctor for the text columns: takes ownership of renderer
  357. wxDataViewColumnBase(wxDataViewRenderer *renderer,
  358. unsigned int model_column)
  359. {
  360. Init(renderer, model_column);
  361. }
  362. // ctor for the bitmap columns
  363. wxDataViewColumnBase(const wxBitmap& bitmap,
  364. wxDataViewRenderer *renderer,
  365. unsigned int model_column)
  366. : m_bitmap(bitmap)
  367. {
  368. Init(renderer, model_column);
  369. }
  370. virtual ~wxDataViewColumnBase();
  371. // setters:
  372. virtual void SetOwner( wxDataViewCtrl *owner )
  373. { m_owner = owner; }
  374. // getters:
  375. unsigned int GetModelColumn() const { return static_cast<unsigned int>(m_model_column); }
  376. wxDataViewCtrl *GetOwner() const { return m_owner; }
  377. wxDataViewRenderer* GetRenderer() const { return m_renderer; }
  378. // implement some of base class pure virtuals (the rest is port-dependent
  379. // and done differently in generic and native versions)
  380. virtual void SetBitmap( const wxBitmap& bitmap ) { m_bitmap = bitmap; }
  381. virtual wxBitmap GetBitmap() const { return m_bitmap; }
  382. protected:
  383. wxDataViewRenderer *m_renderer;
  384. int m_model_column;
  385. wxBitmap m_bitmap;
  386. wxDataViewCtrl *m_owner;
  387. private:
  388. // common part of all ctors
  389. void Init(wxDataViewRenderer *renderer, unsigned int model_column);
  390. };
  391. // ---------------------------------------------------------
  392. // wxDataViewCtrlBase
  393. // ---------------------------------------------------------
  394. #define wxDV_SINGLE 0x0000 // for convenience
  395. #define wxDV_MULTIPLE 0x0001 // can select multiple items
  396. #define wxDV_NO_HEADER 0x0002 // column titles not visible
  397. #define wxDV_HORIZ_RULES 0x0004 // light horizontal rules between rows
  398. #define wxDV_VERT_RULES 0x0008 // light vertical rules between columns
  399. #define wxDV_ROW_LINES 0x0010 // alternating colour in rows
  400. #define wxDV_VARIABLE_LINE_HEIGHT 0x0020 // variable line height
  401. class WXDLLIMPEXP_ADV wxDataViewCtrlBase: public wxControl
  402. {
  403. public:
  404. wxDataViewCtrlBase();
  405. virtual ~wxDataViewCtrlBase();
  406. // model
  407. // -----
  408. virtual bool AssociateModel( wxDataViewModel *model );
  409. wxDataViewModel* GetModel();
  410. const wxDataViewModel* GetModel() const;
  411. // column management
  412. // -----------------
  413. wxDataViewColumn *PrependTextColumn( const wxString &label, unsigned int model_column,
  414. wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1,
  415. wxAlignment align = wxALIGN_NOT,
  416. int flags = wxDATAVIEW_COL_RESIZABLE );
  417. wxDataViewColumn *PrependIconTextColumn( const wxString &label, unsigned int model_column,
  418. wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1,
  419. wxAlignment align = wxALIGN_NOT,
  420. int flags = wxDATAVIEW_COL_RESIZABLE );
  421. wxDataViewColumn *PrependToggleColumn( const wxString &label, unsigned int model_column,
  422. wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = wxDVC_TOGGLE_DEFAULT_WIDTH,
  423. wxAlignment align = wxALIGN_CENTER,
  424. int flags = wxDATAVIEW_COL_RESIZABLE );
  425. wxDataViewColumn *PrependProgressColumn( const wxString &label, unsigned int model_column,
  426. wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = wxDVC_DEFAULT_WIDTH,
  427. wxAlignment align = wxALIGN_CENTER,
  428. int flags = wxDATAVIEW_COL_RESIZABLE );
  429. wxDataViewColumn *PrependDateColumn( const wxString &label, unsigned int model_column,
  430. wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE, int width = -1,
  431. wxAlignment align = wxALIGN_NOT,
  432. int flags = wxDATAVIEW_COL_RESIZABLE );
  433. wxDataViewColumn *PrependBitmapColumn( const wxString &label, unsigned int model_column,
  434. wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1,
  435. wxAlignment align = wxALIGN_CENTER,
  436. int flags = wxDATAVIEW_COL_RESIZABLE );
  437. wxDataViewColumn *PrependTextColumn( const wxBitmap &label, unsigned int model_column,
  438. wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1,
  439. wxAlignment align = wxALIGN_NOT,
  440. int flags = wxDATAVIEW_COL_RESIZABLE );
  441. wxDataViewColumn *PrependIconTextColumn( const wxBitmap &label, unsigned int model_column,
  442. wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1,
  443. wxAlignment align = wxALIGN_NOT,
  444. int flags = wxDATAVIEW_COL_RESIZABLE );
  445. wxDataViewColumn *PrependToggleColumn( const wxBitmap &label, unsigned int model_column,
  446. wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = wxDVC_TOGGLE_DEFAULT_WIDTH,
  447. wxAlignment align = wxALIGN_CENTER,
  448. int flags = wxDATAVIEW_COL_RESIZABLE );
  449. wxDataViewColumn *PrependProgressColumn( const wxBitmap &label, unsigned int model_column,
  450. wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = wxDVC_DEFAULT_WIDTH,
  451. wxAlignment align = wxALIGN_CENTER,
  452. int flags = wxDATAVIEW_COL_RESIZABLE );
  453. wxDataViewColumn *PrependDateColumn( const wxBitmap &label, unsigned int model_column,
  454. wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE, int width = -1,
  455. wxAlignment align = wxALIGN_NOT,
  456. int flags = wxDATAVIEW_COL_RESIZABLE );
  457. wxDataViewColumn *PrependBitmapColumn( const wxBitmap &label, unsigned int model_column,
  458. wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1,
  459. wxAlignment align = wxALIGN_CENTER,
  460. int flags = wxDATAVIEW_COL_RESIZABLE );
  461. wxDataViewColumn *AppendTextColumn( const wxString &label, unsigned int model_column,
  462. wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1,
  463. wxAlignment align = wxALIGN_NOT,
  464. int flags = wxDATAVIEW_COL_RESIZABLE );
  465. wxDataViewColumn *AppendIconTextColumn( const wxString &label, unsigned int model_column,
  466. wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1,
  467. wxAlignment align = wxALIGN_NOT,
  468. int flags = wxDATAVIEW_COL_RESIZABLE );
  469. wxDataViewColumn *AppendToggleColumn( const wxString &label, unsigned int model_column,
  470. wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = wxDVC_TOGGLE_DEFAULT_WIDTH,
  471. wxAlignment align = wxALIGN_CENTER,
  472. int flags = wxDATAVIEW_COL_RESIZABLE );
  473. wxDataViewColumn *AppendProgressColumn( const wxString &label, unsigned int model_column,
  474. wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = wxDVC_DEFAULT_WIDTH,
  475. wxAlignment align = wxALIGN_CENTER,
  476. int flags = wxDATAVIEW_COL_RESIZABLE );
  477. wxDataViewColumn *AppendDateColumn( const wxString &label, unsigned int model_column,
  478. wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE, int width = -1,
  479. wxAlignment align = wxALIGN_NOT,
  480. int flags = wxDATAVIEW_COL_RESIZABLE );
  481. wxDataViewColumn *AppendBitmapColumn( const wxString &label, unsigned int model_column,
  482. wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1,
  483. wxAlignment align = wxALIGN_CENTER,
  484. int flags = wxDATAVIEW_COL_RESIZABLE );
  485. wxDataViewColumn *AppendTextColumn( const wxBitmap &label, unsigned int model_column,
  486. wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1,
  487. wxAlignment align = wxALIGN_NOT,
  488. int flags = wxDATAVIEW_COL_RESIZABLE );
  489. wxDataViewColumn *AppendIconTextColumn( const wxBitmap &label, unsigned int model_column,
  490. wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1,
  491. wxAlignment align = wxALIGN_NOT,
  492. int flags = wxDATAVIEW_COL_RESIZABLE );
  493. wxDataViewColumn *AppendToggleColumn( const wxBitmap &label, unsigned int model_column,
  494. wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = wxDVC_TOGGLE_DEFAULT_WIDTH,
  495. wxAlignment align = wxALIGN_CENTER,
  496. int flags = wxDATAVIEW_COL_RESIZABLE );
  497. wxDataViewColumn *AppendProgressColumn( const wxBitmap &label, unsigned int model_column,
  498. wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = wxDVC_DEFAULT_WIDTH,
  499. wxAlignment align = wxALIGN_CENTER,
  500. int flags = wxDATAVIEW_COL_RESIZABLE );
  501. wxDataViewColumn *AppendDateColumn( const wxBitmap &label, unsigned int model_column,
  502. wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE, int width = -1,
  503. wxAlignment align = wxALIGN_NOT,
  504. int flags = wxDATAVIEW_COL_RESIZABLE );
  505. wxDataViewColumn *AppendBitmapColumn( const wxBitmap &label, unsigned int model_column,
  506. wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1,
  507. wxAlignment align = wxALIGN_CENTER,
  508. int flags = wxDATAVIEW_COL_RESIZABLE );
  509. virtual bool PrependColumn( wxDataViewColumn *col );
  510. virtual bool InsertColumn( unsigned int pos, wxDataViewColumn *col );
  511. virtual bool AppendColumn( wxDataViewColumn *col );
  512. virtual unsigned int GetColumnCount() const = 0;
  513. virtual wxDataViewColumn* GetColumn( unsigned int pos ) const = 0;
  514. virtual int GetColumnPosition( const wxDataViewColumn *column ) const = 0;
  515. virtual bool DeleteColumn( wxDataViewColumn *column ) = 0;
  516. virtual bool ClearColumns() = 0;
  517. void SetExpanderColumn( wxDataViewColumn *col )
  518. { m_expander_column = col ; DoSetExpanderColumn(); }
  519. wxDataViewColumn *GetExpanderColumn() const
  520. { return m_expander_column; }
  521. virtual wxDataViewColumn *GetSortingColumn() const = 0;
  522. // items management
  523. // ----------------
  524. void SetIndent( int indent )
  525. { m_indent = indent ; DoSetIndent(); }
  526. int GetIndent() const
  527. { return m_indent; }
  528. // Current item is the one used by the keyboard navigation, it is the same
  529. // as the (unique) selected item in single selection mode so these
  530. // functions are mostly useful for controls with wxDV_MULTIPLE style.
  531. wxDataViewItem GetCurrentItem() const;
  532. void SetCurrentItem(const wxDataViewItem& item);
  533. // Currently focused column of the current item or NULL if no column has focus
  534. virtual wxDataViewColumn *GetCurrentColumn() const = 0;
  535. // Selection: both GetSelection() and GetSelections() can be used for the
  536. // controls both with and without wxDV_MULTIPLE style. For single selection
  537. // controls GetSelections() is not very useful however. And for multi
  538. // selection controls GetSelection() returns an invalid item if more than
  539. // one item is selected. Use GetSelectedItemsCount() or HasSelection() to
  540. // check if any items are selected at all.
  541. virtual int GetSelectedItemsCount() const = 0;
  542. bool HasSelection() const { return GetSelectedItemsCount() != 0; }
  543. wxDataViewItem GetSelection() const;
  544. virtual int GetSelections( wxDataViewItemArray & sel ) const = 0;
  545. virtual void SetSelections( const wxDataViewItemArray & sel ) = 0;
  546. virtual void Select( const wxDataViewItem & item ) = 0;
  547. virtual void Unselect( const wxDataViewItem & item ) = 0;
  548. virtual bool IsSelected( const wxDataViewItem & item ) const = 0;
  549. virtual void SelectAll() = 0;
  550. virtual void UnselectAll() = 0;
  551. virtual void Expand( const wxDataViewItem & item ) = 0;
  552. virtual void ExpandAncestors( const wxDataViewItem & item );
  553. virtual void Collapse( const wxDataViewItem & item ) = 0;
  554. virtual bool IsExpanded( const wxDataViewItem & item ) const = 0;
  555. virtual void EnsureVisible( const wxDataViewItem & item,
  556. const wxDataViewColumn *column = NULL ) = 0;
  557. virtual void HitTest( const wxPoint & point, wxDataViewItem &item, wxDataViewColumn* &column ) const = 0;
  558. virtual wxRect GetItemRect( const wxDataViewItem & item, const wxDataViewColumn *column = NULL ) const = 0;
  559. virtual bool SetRowHeight( int WXUNUSED(rowHeight) ) { return false; }
  560. virtual void EditItem(const wxDataViewItem& item, const wxDataViewColumn *column) = 0;
  561. // Use EditItem() instead
  562. wxDEPRECATED( void StartEditor(const wxDataViewItem& item, unsigned int column) );
  563. #if wxUSE_DRAG_AND_DROP
  564. virtual bool EnableDragSource(const wxDataFormat& WXUNUSED(format))
  565. { return false; }
  566. virtual bool EnableDropTarget(const wxDataFormat& WXUNUSED(format))
  567. { return false; }
  568. #endif // wxUSE_DRAG_AND_DROP
  569. // define control visual attributes
  570. // --------------------------------
  571. virtual wxVisualAttributes GetDefaultAttributes() const
  572. {
  573. return GetClassDefaultAttributes(GetWindowVariant());
  574. }
  575. static wxVisualAttributes
  576. GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL)
  577. {
  578. return wxControl::GetCompositeControlsDefaultAttributes(variant);
  579. }
  580. protected:
  581. virtual void DoSetExpanderColumn() = 0 ;
  582. virtual void DoSetIndent() = 0;
  583. private:
  584. // Implementation of the public Set/GetCurrentItem() methods which are only
  585. // called in multi selection case (for single selection controls their
  586. // implementation is trivial and is done in the base class itself).
  587. virtual wxDataViewItem DoGetCurrentItem() const = 0;
  588. virtual void DoSetCurrentItem(const wxDataViewItem& item) = 0;
  589. wxDataViewModel *m_model;
  590. wxDataViewColumn *m_expander_column;
  591. int m_indent ;
  592. protected:
  593. DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewCtrlBase)
  594. };
  595. // ----------------------------------------------------------------------------
  596. // wxDataViewEvent - the event class for the wxDataViewCtrl notifications
  597. // ----------------------------------------------------------------------------
  598. class WXDLLIMPEXP_ADV wxDataViewEvent : public wxNotifyEvent
  599. {
  600. public:
  601. wxDataViewEvent(wxEventType commandType = wxEVT_NULL, int winid = 0)
  602. : wxNotifyEvent(commandType, winid),
  603. m_item(0),
  604. m_col(-1),
  605. m_model(NULL),
  606. m_value(wxNullVariant),
  607. m_column(NULL),
  608. m_pos(-1,-1),
  609. m_cacheFrom(0),
  610. m_cacheTo(0),
  611. m_editCancelled(false)
  612. #if wxUSE_DRAG_AND_DROP
  613. , m_dataObject(NULL),
  614. m_dataBuffer(NULL),
  615. m_dataSize(0),
  616. m_dragFlags(0),
  617. m_dropEffect(wxDragNone)
  618. #endif
  619. { }
  620. wxDataViewEvent(const wxDataViewEvent& event)
  621. : wxNotifyEvent(event),
  622. m_item(event.m_item),
  623. m_col(event.m_col),
  624. m_model(event.m_model),
  625. m_value(event.m_value),
  626. m_column(event.m_column),
  627. m_pos(event.m_pos),
  628. m_cacheFrom(event.m_cacheFrom),
  629. m_cacheTo(event.m_cacheTo),
  630. m_editCancelled(event.m_editCancelled)
  631. #if wxUSE_DRAG_AND_DROP
  632. , m_dataObject(event.m_dataObject),
  633. m_dataFormat(event.m_dataFormat),
  634. m_dataBuffer(event.m_dataBuffer),
  635. m_dataSize(event.m_dataSize),
  636. m_dragFlags(event.m_dragFlags),
  637. m_dropEffect(event.m_dropEffect)
  638. #endif
  639. { }
  640. wxDataViewItem GetItem() const { return m_item; }
  641. void SetItem( const wxDataViewItem &item ) { m_item = item; }
  642. int GetColumn() const { return m_col; }
  643. void SetColumn( int col ) { m_col = col; }
  644. wxDataViewModel* GetModel() const { return m_model; }
  645. void SetModel( wxDataViewModel *model ) { m_model = model; }
  646. const wxVariant &GetValue() const { return m_value; }
  647. void SetValue( const wxVariant &value ) { m_value = value; }
  648. // for wxEVT_DATAVIEW_ITEM_EDITING_DONE only
  649. bool IsEditCancelled() const { return m_editCancelled; }
  650. void SetEditCanceled(bool editCancelled) { m_editCancelled = editCancelled; }
  651. // for wxEVT_DATAVIEW_COLUMN_HEADER_CLICKED only
  652. void SetDataViewColumn( wxDataViewColumn *col ) { m_column = col; }
  653. wxDataViewColumn *GetDataViewColumn() const { return m_column; }
  654. // for wxEVT_DATAVIEW_CONTEXT_MENU only
  655. wxPoint GetPosition() const { return m_pos; }
  656. void SetPosition( int x, int y ) { m_pos.x = x; m_pos.y = y; }
  657. // For wxEVT_DATAVIEW_CACHE_HINT
  658. int GetCacheFrom() const { return m_cacheFrom; }
  659. int GetCacheTo() const { return m_cacheTo; }
  660. void SetCache(int from, int to) { m_cacheFrom = from; m_cacheTo = to; }
  661. #if wxUSE_DRAG_AND_DROP
  662. // For drag operations
  663. void SetDataObject( wxDataObject *obj ) { m_dataObject = obj; }
  664. wxDataObject *GetDataObject() const { return m_dataObject; }
  665. // For drop operations
  666. void SetDataFormat( const wxDataFormat &format ) { m_dataFormat = format; }
  667. wxDataFormat GetDataFormat() const { return m_dataFormat; }
  668. void SetDataSize( size_t size ) { m_dataSize = size; }
  669. size_t GetDataSize() const { return m_dataSize; }
  670. void SetDataBuffer( void* buf ) { m_dataBuffer = buf;}
  671. void *GetDataBuffer() const { return m_dataBuffer; }
  672. void SetDragFlags( int flags ) { m_dragFlags = flags; }
  673. int GetDragFlags() const { return m_dragFlags; }
  674. void SetDropEffect( wxDragResult effect ) { m_dropEffect = effect; }
  675. wxDragResult GetDropEffect() const { return m_dropEffect; }
  676. #endif // wxUSE_DRAG_AND_DROP
  677. virtual wxEvent *Clone() const { return new wxDataViewEvent(*this); }
  678. protected:
  679. wxDataViewItem m_item;
  680. int m_col;
  681. wxDataViewModel *m_model;
  682. wxVariant m_value;
  683. wxDataViewColumn *m_column;
  684. wxPoint m_pos;
  685. int m_cacheFrom;
  686. int m_cacheTo;
  687. bool m_editCancelled;
  688. #if wxUSE_DRAG_AND_DROP
  689. wxDataObject *m_dataObject;
  690. wxDataFormat m_dataFormat;
  691. void* m_dataBuffer;
  692. size_t m_dataSize;
  693. int m_dragFlags;
  694. wxDragResult m_dropEffect;
  695. #endif // wxUSE_DRAG_AND_DROP
  696. private:
  697. DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxDataViewEvent)
  698. };
  699. wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_SELECTION_CHANGED, wxDataViewEvent );
  700. wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_ACTIVATED, wxDataViewEvent );
  701. wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_COLLAPSED, wxDataViewEvent );
  702. wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_EXPANDED, wxDataViewEvent );
  703. wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_COLLAPSING, wxDataViewEvent );
  704. wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_EXPANDING, wxDataViewEvent );
  705. wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_START_EDITING, wxDataViewEvent );
  706. wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_EDITING_STARTED, wxDataViewEvent );
  707. wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_EDITING_DONE, wxDataViewEvent );
  708. wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_VALUE_CHANGED, wxDataViewEvent );
  709. wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_CONTEXT_MENU, wxDataViewEvent );
  710. wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_COLUMN_HEADER_CLICK, wxDataViewEvent );
  711. wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK, wxDataViewEvent );
  712. wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_COLUMN_SORTED, wxDataViewEvent );
  713. wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_COLUMN_REORDERED, wxDataViewEvent );
  714. wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_CACHE_HINT, wxDataViewEvent );
  715. wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_BEGIN_DRAG, wxDataViewEvent );
  716. wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_DROP_POSSIBLE, wxDataViewEvent );
  717. wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_DATAVIEW_ITEM_DROP, wxDataViewEvent );
  718. typedef void (wxEvtHandler::*wxDataViewEventFunction)(wxDataViewEvent&);
  719. #define wxDataViewEventHandler(func) \
  720. wxEVENT_HANDLER_CAST(wxDataViewEventFunction, func)
  721. #define wx__DECLARE_DATAVIEWEVT(evt, id, fn) \
  722. wx__DECLARE_EVT1(wxEVT_DATAVIEW_ ## evt, id, wxDataViewEventHandler(fn))
  723. #define EVT_DATAVIEW_SELECTION_CHANGED(id, fn) wx__DECLARE_DATAVIEWEVT(SELECTION_CHANGED, id, fn)
  724. #define EVT_DATAVIEW_ITEM_ACTIVATED(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_ACTIVATED, id, fn)
  725. #define EVT_DATAVIEW_ITEM_COLLAPSING(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_COLLAPSING, id, fn)
  726. #define EVT_DATAVIEW_ITEM_COLLAPSED(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_COLLAPSED, id, fn)
  727. #define EVT_DATAVIEW_ITEM_EXPANDING(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_EXPANDING, id, fn)
  728. #define EVT_DATAVIEW_ITEM_EXPANDED(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_EXPANDED, id, fn)
  729. #define EVT_DATAVIEW_ITEM_START_EDITING(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_START_EDITING, id, fn)
  730. #define EVT_DATAVIEW_ITEM_EDITING_STARTED(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_EDITING_STARTED, id, fn)
  731. #define EVT_DATAVIEW_ITEM_EDITING_DONE(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_EDITING_DONE, id, fn)
  732. #define EVT_DATAVIEW_ITEM_VALUE_CHANGED(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_VALUE_CHANGED, id, fn)
  733. #define EVT_DATAVIEW_ITEM_CONTEXT_MENU(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_CONTEXT_MENU, id, fn)
  734. #define EVT_DATAVIEW_COLUMN_HEADER_CLICK(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_HEADER_CLICK, id, fn)
  735. #define EVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_HEADER_RIGHT_CLICK, id, fn)
  736. #define EVT_DATAVIEW_COLUMN_SORTED(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_SORTED, id, fn)
  737. #define EVT_DATAVIEW_COLUMN_REORDERED(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_REORDERED, id, fn)
  738. #define EVT_DATAVIEW_CACHE_HINT(id, fn) wx__DECLARE_DATAVIEWEVT(CACHE_HINT, id, fn)
  739. #define EVT_DATAVIEW_ITEM_BEGIN_DRAG(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_BEGIN_DRAG, id, fn)
  740. #define EVT_DATAVIEW_ITEM_DROP_POSSIBLE(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_DROP_POSSIBLE, id, fn)
  741. #define EVT_DATAVIEW_ITEM_DROP(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_DROP, id, fn)
  742. // Old and not documented synonym, don't use.
  743. #define EVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICKED(id, fn) EVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK(id, fn)
  744. #ifdef wxHAS_GENERIC_DATAVIEWCTRL
  745. #include "wx/generic/dataview.h"
  746. #elif defined(__WXGTK20__)
  747. #include "wx/gtk/dataview.h"
  748. #elif defined(__WXMAC__)
  749. #include "wx/osx/dataview.h"
  750. #else
  751. #error "unknown native wxDataViewCtrl implementation"
  752. #endif
  753. //-----------------------------------------------------------------------------
  754. // wxDataViewListStore
  755. //-----------------------------------------------------------------------------
  756. class WXDLLIMPEXP_ADV wxDataViewListStoreLine
  757. {
  758. public:
  759. wxDataViewListStoreLine( wxUIntPtr data = 0 )
  760. {
  761. m_data = data;
  762. }
  763. void SetData( wxUIntPtr data )
  764. { m_data = data; }
  765. wxUIntPtr GetData() const
  766. { return m_data; }
  767. wxVector<wxVariant> m_values;
  768. private:
  769. wxUIntPtr m_data;
  770. };
  771. class WXDLLIMPEXP_ADV wxDataViewListStore: public wxDataViewIndexListModel
  772. {
  773. public:
  774. wxDataViewListStore();
  775. ~wxDataViewListStore();
  776. void PrependColumn( const wxString &varianttype );
  777. void InsertColumn( unsigned int pos, const wxString &varianttype );
  778. void AppendColumn( const wxString &varianttype );
  779. void AppendItem( const wxVector<wxVariant> &values, wxUIntPtr data = 0 );
  780. void PrependItem( const wxVector<wxVariant> &values, wxUIntPtr data = 0 );
  781. void InsertItem( unsigned int row, const wxVector<wxVariant> &values, wxUIntPtr data = 0 );
  782. void DeleteItem( unsigned int pos );
  783. void DeleteAllItems();
  784. #if wxABI_VERSION >= 30001
  785. void ClearColumns();
  786. #endif
  787. unsigned int GetItemCount() const;
  788. void SetItemData( const wxDataViewItem& item, wxUIntPtr data );
  789. wxUIntPtr GetItemData( const wxDataViewItem& item ) const;
  790. // override base virtuals
  791. virtual unsigned int GetColumnCount() const;
  792. virtual wxString GetColumnType( unsigned int col ) const;
  793. virtual void GetValueByRow( wxVariant &value,
  794. unsigned int row, unsigned int col ) const;
  795. virtual bool SetValueByRow( const wxVariant &value,
  796. unsigned int row, unsigned int col );
  797. public:
  798. wxVector<wxDataViewListStoreLine*> m_data;
  799. wxArrayString m_cols;
  800. };
  801. //-----------------------------------------------------------------------------
  802. class WXDLLIMPEXP_ADV wxDataViewListCtrl: public wxDataViewCtrl
  803. {
  804. public:
  805. wxDataViewListCtrl();
  806. wxDataViewListCtrl( wxWindow *parent, wxWindowID id,
  807. const wxPoint& pos = wxDefaultPosition,
  808. const wxSize& size = wxDefaultSize, long style = wxDV_ROW_LINES,
  809. const wxValidator& validator = wxDefaultValidator );
  810. ~wxDataViewListCtrl();
  811. bool Create( wxWindow *parent, wxWindowID id,
  812. const wxPoint& pos = wxDefaultPosition,
  813. const wxSize& size = wxDefaultSize, long style = wxDV_ROW_LINES,
  814. const wxValidator& validator = wxDefaultValidator );
  815. wxDataViewListStore *GetStore()
  816. { return (wxDataViewListStore*) GetModel(); }
  817. const wxDataViewListStore *GetStore() const
  818. { return (const wxDataViewListStore*) GetModel(); }
  819. int ItemToRow(const wxDataViewItem &item) const
  820. { return item.IsOk() ? (int)GetStore()->GetRow(item) : wxNOT_FOUND; }
  821. wxDataViewItem RowToItem(int row) const
  822. { return row == wxNOT_FOUND ? wxDataViewItem() : GetStore()->GetItem(row); }
  823. int GetSelectedRow() const
  824. { return ItemToRow(GetSelection()); }
  825. void SelectRow(unsigned row)
  826. { Select(RowToItem(row)); }
  827. void UnselectRow(unsigned row)
  828. { Unselect(RowToItem(row)); }
  829. bool IsRowSelected(unsigned row) const
  830. { return IsSelected(RowToItem(row)); }
  831. bool AppendColumn( wxDataViewColumn *column, const wxString &varianttype );
  832. bool PrependColumn( wxDataViewColumn *column, const wxString &varianttype );
  833. bool InsertColumn( unsigned int pos, wxDataViewColumn *column, const wxString &varianttype );
  834. // overridden from base class
  835. virtual bool PrependColumn( wxDataViewColumn *col );
  836. virtual bool InsertColumn( unsigned int pos, wxDataViewColumn *col );
  837. virtual bool AppendColumn( wxDataViewColumn *col );
  838. #if wxABI_VERSION >= 30001
  839. virtual bool ClearColumns();
  840. #endif
  841. wxDataViewColumn *AppendTextColumn( const wxString &label,
  842. wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT,
  843. int width = -1, wxAlignment align = wxALIGN_LEFT, int flags = wxDATAVIEW_COL_RESIZABLE );
  844. wxDataViewColumn *AppendToggleColumn( const wxString &label,
  845. wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE,
  846. int width = -1, wxAlignment align = wxALIGN_LEFT, int flags = wxDATAVIEW_COL_RESIZABLE );
  847. wxDataViewColumn *AppendProgressColumn( const wxString &label,
  848. wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT,
  849. int width = -1, wxAlignment align = wxALIGN_LEFT, int flags = wxDATAVIEW_COL_RESIZABLE );
  850. wxDataViewColumn *AppendIconTextColumn( const wxString &label,
  851. wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT,
  852. int width = -1, wxAlignment align = wxALIGN_LEFT, int flags = wxDATAVIEW_COL_RESIZABLE );
  853. void AppendItem( const wxVector<wxVariant> &values, wxUIntPtr data = 0 )
  854. { GetStore()->AppendItem( values, data ); }
  855. void PrependItem( const wxVector<wxVariant> &values, wxUIntPtr data = 0 )
  856. { GetStore()->PrependItem( values, data ); }
  857. void InsertItem( unsigned int row, const wxVector<wxVariant> &values, wxUIntPtr data = 0 )
  858. { GetStore()->InsertItem( row, values, data ); }
  859. void DeleteItem( unsigned row )
  860. { GetStore()->DeleteItem( row ); }
  861. void DeleteAllItems()
  862. { GetStore()->DeleteAllItems(); }
  863. void SetValue( const wxVariant &value, unsigned int row, unsigned int col )
  864. { GetStore()->SetValueByRow( value, row, col );
  865. GetStore()->RowValueChanged( row, col); }
  866. void GetValue( wxVariant &value, unsigned int row, unsigned int col )
  867. { GetStore()->GetValueByRow( value, row, col ); }
  868. void SetTextValue( const wxString &value, unsigned int row, unsigned int col )
  869. { GetStore()->SetValueByRow( value, row, col );
  870. GetStore()->RowValueChanged( row, col); }
  871. wxString GetTextValue( unsigned int row, unsigned int col ) const
  872. { wxVariant value; GetStore()->GetValueByRow( value, row, col ); return value.GetString(); }
  873. void SetToggleValue( bool value, unsigned int row, unsigned int col )
  874. { GetStore()->SetValueByRow( value, row, col );
  875. GetStore()->RowValueChanged( row, col); }
  876. bool GetToggleValue( unsigned int row, unsigned int col ) const
  877. { wxVariant value; GetStore()->GetValueByRow( value, row, col ); return value.GetBool(); }
  878. void SetItemData( const wxDataViewItem& item, wxUIntPtr data )
  879. { GetStore()->SetItemData( item, data ); }
  880. wxUIntPtr GetItemData( const wxDataViewItem& item ) const
  881. { return GetStore()->GetItemData( item ); }
  882. int GetItemCount() const
  883. { return GetStore()->GetItemCount(); }
  884. void OnSize( wxSizeEvent &event );
  885. private:
  886. DECLARE_EVENT_TABLE()
  887. DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxDataViewListCtrl)
  888. };
  889. //-----------------------------------------------------------------------------
  890. // wxDataViewTreeStore
  891. //-----------------------------------------------------------------------------
  892. class WXDLLIMPEXP_ADV wxDataViewTreeStoreNode
  893. {
  894. public:
  895. wxDataViewTreeStoreNode( wxDataViewTreeStoreNode *parent,
  896. const wxString &text, const wxIcon &icon = wxNullIcon, wxClientData *data = NULL );
  897. virtual ~wxDataViewTreeStoreNode();
  898. void SetText( const wxString &text )
  899. { m_text = text; }
  900. wxString GetText() const
  901. { return m_text; }
  902. void SetIcon( const wxIcon &icon )
  903. { m_icon = icon; }
  904. const wxIcon &GetIcon() const
  905. { return m_icon; }
  906. void SetData( wxClientData *data )
  907. { if (m_data) delete m_data; m_data = data; }
  908. wxClientData *GetData() const
  909. { return m_data; }
  910. wxDataViewItem GetItem() const
  911. { return wxDataViewItem( (void*) this ); }
  912. virtual bool IsContainer()
  913. { return false; }
  914. wxDataViewTreeStoreNode *GetParent()
  915. { return m_parent; }
  916. private:
  917. wxDataViewTreeStoreNode *m_parent;
  918. wxString m_text;
  919. wxIcon m_icon;
  920. wxClientData *m_data;
  921. };
  922. WX_DECLARE_LIST_WITH_DECL(wxDataViewTreeStoreNode, wxDataViewTreeStoreNodeList,
  923. class WXDLLIMPEXP_ADV);
  924. class WXDLLIMPEXP_ADV wxDataViewTreeStoreContainerNode: public wxDataViewTreeStoreNode
  925. {
  926. public:
  927. wxDataViewTreeStoreContainerNode( wxDataViewTreeStoreNode *parent,
  928. const wxString &text, const wxIcon &icon = wxNullIcon, const wxIcon &expanded = wxNullIcon,
  929. wxClientData *data = NULL );
  930. virtual ~wxDataViewTreeStoreContainerNode();
  931. const wxDataViewTreeStoreNodeList &GetChildren() const
  932. { return m_children; }
  933. wxDataViewTreeStoreNodeList &GetChildren()
  934. { return m_children; }
  935. void SetExpandedIcon( const wxIcon &icon )
  936. { m_iconExpanded = icon; }
  937. const wxIcon &GetExpandedIcon() const
  938. { return m_iconExpanded; }
  939. void SetExpanded( bool expanded = true )
  940. { m_isExpanded = expanded; }
  941. bool IsExpanded() const
  942. { return m_isExpanded; }
  943. virtual bool IsContainer()
  944. { return true; }
  945. private:
  946. wxDataViewTreeStoreNodeList m_children;
  947. wxIcon m_iconExpanded;
  948. bool m_isExpanded;
  949. };
  950. //-----------------------------------------------------------------------------
  951. class WXDLLIMPEXP_ADV wxDataViewTreeStore: public wxDataViewModel
  952. {
  953. public:
  954. wxDataViewTreeStore();
  955. ~wxDataViewTreeStore();
  956. wxDataViewItem AppendItem( const wxDataViewItem& parent,
  957. const wxString &text, const wxIcon &icon = wxNullIcon, wxClientData *data = NULL );
  958. wxDataViewItem PrependItem( const wxDataViewItem& parent,
  959. const wxString &text, const wxIcon &icon = wxNullIcon, wxClientData *data = NULL );
  960. wxDataViewItem InsertItem( const wxDataViewItem& parent, const wxDataViewItem& previous,
  961. const wxString &text, const wxIcon &icon = wxNullIcon, wxClientData *data = NULL );
  962. wxDataViewItem PrependContainer( const wxDataViewItem& parent,
  963. const wxString &text, const wxIcon &icon = wxNullIcon, const wxIcon &expanded = wxNullIcon,
  964. wxClientData *data = NULL );
  965. wxDataViewItem AppendContainer( const wxDataViewItem& parent,
  966. const wxString &text, const wxIcon &icon = wxNullIcon, const wxIcon &expanded = wxNullIcon,
  967. wxClientData *data = NULL );
  968. wxDataViewItem InsertContainer( const wxDataViewItem& parent, const wxDataViewItem& previous,
  969. const wxString &text, const wxIcon &icon = wxNullIcon, const wxIcon &expanded = wxNullIcon,
  970. wxClientData *data = NULL );
  971. wxDataViewItem GetNthChild( const wxDataViewItem& parent, unsigned int pos ) const;
  972. int GetChildCount( const wxDataViewItem& parent ) const;
  973. void SetItemText( const wxDataViewItem& item, const wxString &text );
  974. wxString GetItemText( const wxDataViewItem& item ) const;
  975. void SetItemIcon( const wxDataViewItem& item, const wxIcon &icon );
  976. const wxIcon &GetItemIcon( const wxDataViewItem& item ) const;
  977. void SetItemExpandedIcon( const wxDataViewItem& item, const wxIcon &icon );
  978. const wxIcon &GetItemExpandedIcon( const wxDataViewItem& item ) const;
  979. void SetItemData( const wxDataViewItem& item, wxClientData *data );
  980. wxClientData *GetItemData( const wxDataViewItem& item ) const;
  981. void DeleteItem( const wxDataViewItem& item );
  982. void DeleteChildren( const wxDataViewItem& item );
  983. void DeleteAllItems();
  984. // implement base methods
  985. virtual void GetValue( wxVariant &variant,
  986. const wxDataViewItem &item, unsigned int col ) const;
  987. virtual bool SetValue( const wxVariant &variant,
  988. const wxDataViewItem &item, unsigned int col );
  989. virtual wxDataViewItem GetParent( const wxDataViewItem &item ) const;
  990. virtual bool IsContainer( const wxDataViewItem &item ) const;
  991. virtual unsigned int GetChildren( const wxDataViewItem &item, wxDataViewItemArray &children ) const;
  992. virtual int Compare( const wxDataViewItem &item1, const wxDataViewItem &item2,
  993. unsigned int column, bool ascending ) const;
  994. virtual bool HasDefaultCompare() const
  995. { return true; }
  996. virtual unsigned int GetColumnCount() const
  997. { return 1; }
  998. virtual wxString GetColumnType( unsigned int WXUNUSED(col) ) const
  999. { return wxT("wxDataViewIconText"); }
  1000. wxDataViewTreeStoreNode *FindNode( const wxDataViewItem &item ) const;
  1001. wxDataViewTreeStoreContainerNode *FindContainerNode( const wxDataViewItem &item ) const;
  1002. wxDataViewTreeStoreNode *GetRoot() const { return m_root; }
  1003. public:
  1004. wxDataViewTreeStoreNode *m_root;
  1005. };
  1006. //-----------------------------------------------------------------------------
  1007. class WXDLLIMPEXP_ADV wxDataViewTreeCtrl: public wxDataViewCtrl,
  1008. public wxWithImages
  1009. {
  1010. public:
  1011. wxDataViewTreeCtrl() { }
  1012. wxDataViewTreeCtrl(wxWindow *parent,
  1013. wxWindowID id,
  1014. const wxPoint& pos = wxDefaultPosition,
  1015. const wxSize& size = wxDefaultSize,
  1016. long style = wxDV_NO_HEADER | wxDV_ROW_LINES,
  1017. const wxValidator& validator = wxDefaultValidator)
  1018. {
  1019. Create(parent, id, pos, size, style, validator);
  1020. }
  1021. bool Create(wxWindow *parent,
  1022. wxWindowID id,
  1023. const wxPoint& pos = wxDefaultPosition,
  1024. const wxSize& size = wxDefaultSize,
  1025. long style = wxDV_NO_HEADER | wxDV_ROW_LINES,
  1026. const wxValidator& validator = wxDefaultValidator);
  1027. wxDataViewTreeStore *GetStore()
  1028. { return (wxDataViewTreeStore*) GetModel(); }
  1029. const wxDataViewTreeStore *GetStore() const
  1030. { return (const wxDataViewTreeStore*) GetModel(); }
  1031. bool IsContainer( const wxDataViewItem& item ) const
  1032. { return GetStore()->IsContainer(item); }
  1033. wxDataViewItem AppendItem( const wxDataViewItem& parent,
  1034. const wxString &text, int icon = NO_IMAGE, wxClientData *data = NULL );
  1035. wxDataViewItem PrependItem( const wxDataViewItem& parent,
  1036. const wxString &text, int icon = NO_IMAGE, wxClientData *data = NULL );
  1037. wxDataViewItem InsertItem( const wxDataViewItem& parent, const wxDataViewItem& previous,
  1038. const wxString &text, int icon = NO_IMAGE, wxClientData *data = NULL );
  1039. wxDataViewItem PrependContainer( const wxDataViewItem& parent,
  1040. const wxString &text, int icon = NO_IMAGE, int expanded = NO_IMAGE,
  1041. wxClientData *data = NULL );
  1042. wxDataViewItem AppendContainer( const wxDataViewItem& parent,
  1043. const wxString &text, int icon = NO_IMAGE, int expanded = NO_IMAGE,
  1044. wxClientData *data = NULL );
  1045. wxDataViewItem InsertContainer( const wxDataViewItem& parent, const wxDataViewItem& previous,
  1046. const wxString &text, int icon = NO_IMAGE, int expanded = NO_IMAGE,
  1047. wxClientData *data = NULL );
  1048. wxDataViewItem GetNthChild( const wxDataViewItem& parent, unsigned int pos ) const
  1049. { return GetStore()->GetNthChild(parent, pos); }
  1050. int GetChildCount( const wxDataViewItem& parent ) const
  1051. { return GetStore()->GetChildCount(parent); }
  1052. void SetItemText( const wxDataViewItem& item, const wxString &text );
  1053. wxString GetItemText( const wxDataViewItem& item ) const
  1054. { return GetStore()->GetItemText(item); }
  1055. void SetItemIcon( const wxDataViewItem& item, const wxIcon &icon );
  1056. const wxIcon &GetItemIcon( const wxDataViewItem& item ) const
  1057. { return GetStore()->GetItemIcon(item); }
  1058. void SetItemExpandedIcon( const wxDataViewItem& item, const wxIcon &icon );
  1059. const wxIcon &GetItemExpandedIcon( const wxDataViewItem& item ) const
  1060. { return GetStore()->GetItemExpandedIcon(item); }
  1061. void SetItemData( const wxDataViewItem& item, wxClientData *data )
  1062. { GetStore()->SetItemData(item,data); }
  1063. wxClientData *GetItemData( const wxDataViewItem& item ) const
  1064. { return GetStore()->GetItemData(item); }
  1065. void DeleteItem( const wxDataViewItem& item );
  1066. void DeleteChildren( const wxDataViewItem& item );
  1067. void DeleteAllItems();
  1068. void OnExpanded( wxDataViewEvent &event );
  1069. void OnCollapsed( wxDataViewEvent &event );
  1070. void OnSize( wxSizeEvent &event );
  1071. private:
  1072. DECLARE_EVENT_TABLE()
  1073. DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxDataViewTreeCtrl)
  1074. };
  1075. // old wxEVT_COMMAND_* constants
  1076. #define wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED wxEVT_DATAVIEW_SELECTION_CHANGED
  1077. #define wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED wxEVT_DATAVIEW_ITEM_ACTIVATED
  1078. #define wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED wxEVT_DATAVIEW_ITEM_COLLAPSED
  1079. #define wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED wxEVT_DATAVIEW_ITEM_EXPANDED
  1080. #define wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING wxEVT_DATAVIEW_ITEM_COLLAPSING
  1081. #define wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING wxEVT_DATAVIEW_ITEM_EXPANDING
  1082. #define wxEVT_COMMAND_DATAVIEW_ITEM_START_EDITING wxEVT_DATAVIEW_ITEM_START_EDITING
  1083. #define wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED wxEVT_DATAVIEW_ITEM_EDITING_STARTED
  1084. #define wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE wxEVT_DATAVIEW_ITEM_EDITING_DONE
  1085. #define wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED wxEVT_DATAVIEW_ITEM_VALUE_CHANGED
  1086. #define wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU wxEVT_DATAVIEW_ITEM_CONTEXT_MENU
  1087. #define wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK wxEVT_DATAVIEW_COLUMN_HEADER_CLICK
  1088. #define wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK wxEVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK
  1089. #define wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED wxEVT_DATAVIEW_COLUMN_SORTED
  1090. #define wxEVT_COMMAND_DATAVIEW_COLUMN_REORDERED wxEVT_DATAVIEW_COLUMN_REORDERED
  1091. #define wxEVT_COMMAND_DATAVIEW_CACHE_HINT wxEVT_DATAVIEW_CACHE_HINT
  1092. #define wxEVT_COMMAND_DATAVIEW_ITEM_BEGIN_DRAG wxEVT_DATAVIEW_ITEM_BEGIN_DRAG
  1093. #define wxEVT_COMMAND_DATAVIEW_ITEM_DROP_POSSIBLE wxEVT_DATAVIEW_ITEM_DROP_POSSIBLE
  1094. #define wxEVT_COMMAND_DATAVIEW_ITEM_DROP wxEVT_DATAVIEW_ITEM_DROP
  1095. #endif // wxUSE_DATAVIEWCTRL
  1096. #endif
  1097. // _WX_DATAVIEW_H_BASE_