1 ///////////////////////////////////////////////////////////////////////////// 2 // Name: wx/dataview.h 3 // Purpose: wxDataViewCtrl base classes 4 // Author: Robert Roebling 5 // Modified by: 6 // Created: 08.01.06 7 // RCS-ID: $Id: dataview.h 66925 2011-02-16 23:19:32Z JS $ 8 // Copyright: (c) Robert Roebling 9 // Licence: wxWindows licence 10 ///////////////////////////////////////////////////////////////////////////// 11 12 #ifndef _WX_DATAVIEW_H_BASE_ 13 #define _WX_DATAVIEW_H_BASE_ 14 15 #include "wx/defs.h" 16 17 #if wxUSE_DATAVIEWCTRL 18 19 #include "wx/control.h" 20 #include "wx/textctrl.h" 21 #include "wx/bitmap.h" 22 #include "wx/variant.h" 23 24 25 #if defined(__WXGTK20__) 26 // for testing 27 // #define wxUSE_GENERICDATAVIEWCTRL 1 28 #elif defined(__WXMAC__) 29 #define wxUSE_GENERICDATAVIEWCTRL 1 30 #else 31 #define wxUSE_GENERICDATAVIEWCTRL 1 32 #endif 33 34 // ---------------------------------------------------------------------------- 35 // wxDataViewCtrl flags 36 // ---------------------------------------------------------------------------- 37 38 // ---------------------------------------------------------------------------- 39 // wxDataViewCtrl globals 40 // ---------------------------------------------------------------------------- 41 42 class WXDLLIMPEXP_FWD_ADV wxDataViewModel; 43 class WXDLLIMPEXP_FWD_ADV wxDataViewListModel; 44 class WXDLLIMPEXP_FWD_ADV wxDataViewCtrl; 45 class WXDLLIMPEXP_FWD_ADV wxDataViewColumn; 46 class WXDLLIMPEXP_FWD_ADV wxDataViewRenderer; 47 48 extern WXDLLIMPEXP_DATA_ADV(const wxChar) wxDataViewCtrlNameStr[]; 49 50 // --------------------------------------------------------- 51 // wxDataViewModel 52 // --------------------------------------------------------- 53 54 class WXDLLIMPEXP_ADV wxDataViewModel: public wxObject 55 { 56 public: wxDataViewModel()57 wxDataViewModel() { } ~wxDataViewModel()58 virtual ~wxDataViewModel() { } 59 60 protected: 61 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewModel) 62 }; 63 64 // --------------------------------------------------------- 65 // wxDataViewListModelNotifier 66 // --------------------------------------------------------- 67 68 69 class WXDLLIMPEXP_ADV wxDataViewListModelNotifier: public wxObject 70 { 71 public: wxDataViewListModelNotifier()72 wxDataViewListModelNotifier() { } ~wxDataViewListModelNotifier()73 virtual ~wxDataViewListModelNotifier() { } 74 75 virtual bool RowAppended() = 0; 76 virtual bool RowPrepended() = 0; 77 virtual bool RowInserted( unsigned int before ) = 0; 78 virtual bool RowDeleted( unsigned int row ) = 0; 79 virtual bool RowChanged( unsigned int row ) = 0; 80 virtual bool ValueChanged( unsigned int col, unsigned int row ) = 0; 81 virtual bool RowsReordered( unsigned int *new_order ) = 0; 82 virtual bool Cleared() = 0; 83 SetOwner(wxDataViewListModel * owner)84 void SetOwner( wxDataViewListModel *owner ) { m_owner = owner; } GetOwner()85 wxDataViewListModel *GetOwner() { return m_owner; } 86 87 private: 88 wxDataViewListModel *m_owner; 89 }; 90 91 // --------------------------------------------------------- 92 // wxDataViewListModel 93 // --------------------------------------------------------- 94 95 class WXDLLIMPEXP_ADV wxDataViewViewingColumn: public wxObject 96 { 97 public: wxDataViewViewingColumn(wxDataViewColumn * view_column,unsigned int model_column)98 wxDataViewViewingColumn( wxDataViewColumn *view_column, unsigned int model_column ) 99 { 100 m_viewColumn = view_column; 101 m_modelColumn = model_column; 102 } 103 104 wxDataViewColumn *m_viewColumn; 105 unsigned int m_modelColumn; 106 }; 107 108 class WXDLLIMPEXP_ADV wxDataViewListModel: public wxDataViewModel 109 { 110 public: 111 wxDataViewListModel(); 112 virtual ~wxDataViewListModel(); 113 114 virtual unsigned int GetNumberOfRows() = 0; 115 virtual unsigned int GetNumberOfCols() = 0; 116 // return type as reported by wxVariant 117 virtual wxString GetColType( unsigned int col ) = 0; 118 // get value into a wxVariant 119 virtual void GetValue( wxVariant &variant, unsigned int col, unsigned int row ) = 0; 120 // set value, call ValueChanged() afterwards! 121 virtual bool SetValue( wxVariant &variant, unsigned int col, unsigned int row ) = 0; 122 123 #if wxABI_VERSION >= 20812 124 // Notes: 125 // - In wx 2.9 GetValue/SetValue are removed, replaced with GetValueByRow and SetValueByRow 126 // - GetValueByRow/SetValueByRow has (row,col) parameters, GetValue/SetValue is vice versa, (col,row) 127 128 // virtual in wx 2.9 GetValueByRow(wxVariant & variant,unsigned row,unsigned col)129 void GetValueByRow(wxVariant& variant, unsigned row, unsigned col) const 130 { 131 const_cast<wxDataViewListModel*>(this)->GetValue(variant, col, row); 132 } 133 134 // virtual in wx 2.9 SetValueByRow(const wxVariant & variant,unsigned row,unsigned col)135 bool SetValueByRow(const wxVariant& variant, unsigned row, unsigned col) 136 { 137 return SetValue((wxVariant&)variant, col, row); 138 } 139 #endif // wx >= 2.8.12 140 141 // delegated notifiers 142 virtual bool RowAppended(); 143 virtual bool RowPrepended(); 144 virtual bool RowInserted( unsigned int before ); 145 virtual bool RowDeleted( unsigned int row ); 146 virtual bool RowChanged( unsigned int row ); 147 virtual bool ValueChanged( unsigned int col, unsigned int row ); 148 virtual bool RowsReordered( unsigned int *new_order ); 149 virtual bool Cleared(); 150 151 // Used internally 152 void AddViewingColumn( wxDataViewColumn *view_column, unsigned int model_column ); 153 void RemoveViewingColumn( wxDataViewColumn *column ); 154 155 void AddNotifier( wxDataViewListModelNotifier *notifier ); 156 void RemoveNotifier( wxDataViewListModelNotifier *notifier ); 157 158 wxList m_notifiers; 159 wxList m_viewingColumns; 160 161 protected: 162 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewListModel) 163 }; 164 165 // --------------------------------------------------------- 166 // wxDataViewSortedListModel 167 // --------------------------------------------------------- 168 169 typedef int (wxCALLBACK *wxDataViewListModelCompare) 170 (unsigned int row1, unsigned int row2, unsigned int col, wxDataViewListModel* model ); 171 172 WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_SIZE_T(unsigned int, wxDataViewSortedIndexArray, WXDLLIMPEXP_ADV); 173 174 class WXDLLIMPEXP_ADV wxDataViewSortedListModel: public wxDataViewListModel 175 { 176 public: 177 wxDataViewSortedListModel( wxDataViewListModel *child ); 178 virtual ~wxDataViewSortedListModel(); 179 SetAscending(bool ascending)180 void SetAscending( bool ascending ) { m_ascending = ascending; } GetAscending()181 bool GetAscending() { return m_ascending; } 182 183 virtual unsigned int GetNumberOfRows(); 184 virtual unsigned int GetNumberOfCols(); 185 // return type as reported by wxVariant 186 virtual wxString GetColType( unsigned int col ); 187 // get value into a wxVariant 188 virtual void GetValue( wxVariant &variant, unsigned int col, unsigned int row ); 189 // set value, call ValueChanged() afterwards! 190 virtual bool SetValue( wxVariant &variant, unsigned int col, unsigned int row ); 191 192 // called from user 193 virtual bool RowAppended(); 194 virtual bool RowPrepended(); 195 virtual bool RowInserted( unsigned int before ); 196 virtual bool RowDeleted( unsigned int row ); 197 virtual bool RowChanged( unsigned int row ); 198 virtual bool ValueChanged( unsigned int col, unsigned int row ); 199 virtual bool RowsReordered( unsigned int *new_order ); 200 virtual bool Cleared(); 201 202 // called if child's notifiers are called 203 bool ChildRowAppended(); 204 bool ChildRowPrepended(); 205 bool ChildRowInserted( unsigned int before ); 206 bool ChildRowDeleted( unsigned int row ); 207 bool ChildRowChanged( unsigned int row ); 208 bool ChildValueChanged( unsigned int col, unsigned int row ); 209 bool ChildRowsReordered( unsigned int *new_order ); 210 bool ChildCleared(); 211 212 virtual void Resort(); 213 214 private: 215 bool m_ascending; 216 wxDataViewListModel *m_child; 217 wxDataViewSortedIndexArray m_array; 218 wxDataViewListModelNotifier *m_notifierOnChild; 219 220 void InitStatics(); // BAD 221 222 protected: 223 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewSortedListModel) 224 }; 225 226 // --------------------------------------------------------- 227 // wxDataViewRendererBase 228 // --------------------------------------------------------- 229 230 enum wxDataViewCellMode 231 { 232 wxDATAVIEW_CELL_INERT, 233 wxDATAVIEW_CELL_ACTIVATABLE, 234 wxDATAVIEW_CELL_EDITABLE 235 }; 236 237 enum wxDataViewCellRenderState 238 { 239 wxDATAVIEW_CELL_SELECTED = 1, 240 wxDATAVIEW_CELL_PRELIT = 2, 241 wxDATAVIEW_CELL_INSENSITIVE = 4, 242 wxDATAVIEW_CELL_FOCUSED = 8 243 }; 244 245 class WXDLLIMPEXP_ADV wxDataViewRendererBase: public wxObject 246 { 247 public: 248 wxDataViewRendererBase( const wxString &varianttype, wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT ); 249 SetValue(const wxVariant & WXUNUSED (value))250 virtual bool SetValue( const wxVariant& WXUNUSED(value) ) { return true; } GetValue(wxVariant & WXUNUSED (value))251 virtual bool GetValue( wxVariant& WXUNUSED(value) ) { return true; } Validate(wxVariant & WXUNUSED (value))252 virtual bool Validate( wxVariant& WXUNUSED(value) ) { return true; } 253 GetVariantType()254 wxString GetVariantType() { return m_variantType; } GetMode()255 wxDataViewCellMode GetMode() { return m_mode; } 256 SetOwner(wxDataViewColumn * owner)257 void SetOwner( wxDataViewColumn *owner ) { m_owner = owner; } GetOwner()258 wxDataViewColumn* GetOwner() { return m_owner; } 259 260 protected: 261 wxDataViewCellMode m_mode; 262 wxString m_variantType; 263 wxDataViewColumn *m_owner; 264 265 protected: 266 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewRendererBase) 267 }; 268 269 // --------------------------------------------------------- 270 // wxDataViewColumnBase 271 // --------------------------------------------------------- 272 273 enum wxDataViewColumnFlags 274 { 275 wxDATAVIEW_COL_RESIZABLE = 1, 276 wxDATAVIEW_COL_SORTABLE = 2, 277 wxDATAVIEW_COL_HIDDEN = 4 278 }; 279 280 class WXDLLIMPEXP_ADV wxDataViewColumnBase: public wxObject 281 { 282 public: 283 wxDataViewColumnBase( const wxString &title, wxDataViewRenderer *renderer, unsigned int model_column, 284 int width = 80, int flags = wxDATAVIEW_COL_RESIZABLE ); 285 wxDataViewColumnBase( const wxBitmap &bitmap, wxDataViewRenderer *renderer, unsigned int model_column, 286 int width = 80, int flags = wxDATAVIEW_COL_RESIZABLE ); 287 virtual ~wxDataViewColumnBase(); 288 289 virtual void SetTitle( const wxString &title ); 290 virtual wxString GetTitle(); 291 292 virtual void SetBitmap( const wxBitmap &bitmap ); 293 virtual const wxBitmap &GetBitmap(); 294 295 virtual void SetAlignment( wxAlignment align ) = 0; 296 297 virtual void SetSortable( bool sortable ) = 0; 298 virtual bool GetSortable() = 0; 299 virtual void SetSortOrder( bool ascending ) = 0; 300 virtual bool IsSortOrderAscending() = 0; 301 GetRenderer()302 wxDataViewRenderer* GetRenderer() { return m_renderer; } 303 GetModelColumn()304 unsigned int GetModelColumn() { return m_model_column; } 305 SetOwner(wxDataViewCtrl * owner)306 virtual void SetOwner( wxDataViewCtrl *owner ) { m_owner = owner; } GetOwner()307 wxDataViewCtrl *GetOwner() { return m_owner; } 308 309 virtual int GetWidth() = 0; 310 311 private: 312 wxDataViewCtrl *m_ctrl; 313 wxDataViewRenderer *m_renderer; 314 int m_model_column; 315 int m_flags; 316 wxString m_title; 317 wxBitmap m_bitmap; 318 wxDataViewCtrl *m_owner; 319 320 protected: 321 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewColumnBase) 322 }; 323 324 // --------------------------------------------------------- 325 // wxDataViewCtrlBase 326 // --------------------------------------------------------- 327 328 #define wxDV_SINGLE 0x0000 // for convenience 329 #define wxDV_MULTIPLE 0x0020 // can select multiple items 330 331 class WXDLLIMPEXP_ADV wxDataViewCtrlBase: public wxControl 332 { 333 public: 334 wxDataViewCtrlBase(); 335 virtual ~wxDataViewCtrlBase(); 336 337 virtual bool AssociateModel( wxDataViewListModel *model ); 338 wxDataViewListModel* GetModel(); 339 340 // short cuts 341 bool AppendTextColumn( const wxString &label, unsigned int model_column, 342 wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1 ); 343 bool AppendToggleColumn( const wxString &label, unsigned int model_column, 344 wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = 30 ); 345 bool AppendProgressColumn( const wxString &label, unsigned int model_column, 346 wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = 80 ); 347 bool AppendDateColumn( const wxString &label, unsigned int model_column, 348 wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE, int width = -1 ); 349 bool AppendBitmapColumn( const wxString &label, unsigned int model_column, 350 wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1 ); 351 bool AppendTextColumn( const wxBitmap &label, unsigned int model_column, 352 wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1 ); 353 bool AppendToggleColumn( const wxBitmap &label, unsigned int model_column, 354 wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = 30 ); 355 bool AppendProgressColumn( const wxBitmap &label, unsigned int model_column, 356 wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = 80 ); 357 bool AppendDateColumn( const wxBitmap &label, unsigned int model_column, 358 wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE, int width = -1 ); 359 bool AppendBitmapColumn( const wxBitmap &label, unsigned int model_column, 360 wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1 ); 361 362 virtual bool AppendColumn( wxDataViewColumn *col ); 363 virtual unsigned int GetNumberOfColumns(); 364 virtual bool DeleteColumn( unsigned int pos ); 365 virtual bool ClearColumns(); 366 virtual wxDataViewColumn* GetColumn( unsigned int pos ); 367 368 virtual void SetSelection( int row ) = 0; // -1 for unselect ClearSelection()369 inline void ClearSelection() { SetSelection( -1 ); } 370 virtual void Unselect( unsigned int row ) = 0; 371 virtual void SetSelectionRange( unsigned int from, unsigned int to ) = 0; 372 virtual void SetSelections( const wxArrayInt& aSelections) = 0; 373 374 virtual bool IsSelected( unsigned int row ) const = 0; 375 virtual int GetSelection() const = 0; 376 virtual int GetSelections(wxArrayInt& aSelections) const = 0; 377 378 private: 379 wxDataViewListModel *m_model; 380 wxList m_cols; 381 382 protected: 383 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewCtrlBase) 384 }; 385 386 387 // ---------------------------------------------------------------------------- 388 // wxDataViewEvent - the event class for the wxDataViewCtrl notifications 389 // ---------------------------------------------------------------------------- 390 391 class WXDLLIMPEXP_ADV wxDataViewEvent : public wxNotifyEvent 392 { 393 public: 394 wxDataViewEvent(wxEventType commandType = wxEVT_NULL, int winid = 0) wxNotifyEvent(commandType,winid)395 : wxNotifyEvent(commandType, winid), 396 m_col(-1), 397 m_row(-1), 398 m_model(NULL), 399 m_value(wxNullVariant), 400 m_editCancelled(false), 401 m_column(NULL) 402 { } 403 wxDataViewEvent(const wxDataViewEvent & event)404 wxDataViewEvent(const wxDataViewEvent& event) 405 : wxNotifyEvent(event), 406 m_col(event.m_col), 407 m_row(event.m_col), 408 m_model(event.m_model), 409 m_value(event.m_value), 410 m_editCancelled(event.m_editCancelled), 411 m_column(event.m_column) 412 { } 413 GetColumn()414 int GetColumn() const { return m_col; } SetColumn(int col)415 void SetColumn( int col ) { m_col = col; } GetRow()416 int GetRow() const { return m_row; } SetRow(int row)417 void SetRow( int row ) { m_row = row; } GetModel()418 wxDataViewModel* GetModel() const { return m_model; } SetModel(wxDataViewModel * model)419 void SetModel( wxDataViewModel *model ) { m_model = model; } GetValue()420 const wxVariant &GetValue() const { return m_value; } SetValue(const wxVariant & value)421 void SetValue( const wxVariant &value ) { m_value = value; } 422 423 // for wxEVT_DATAVIEW_COLUMN_HEADER_CLICKED only SetDataViewColumn(wxDataViewColumn * col)424 void SetDataViewColumn( wxDataViewColumn *col ) { m_column = col; } GetDataViewColumn()425 wxDataViewColumn *GetDataViewColumn() { return m_column; } 426 427 // was label editing canceled? (for wxEVT_COMMAND_DATVIEW_END_LABEL_EDIT only) IsEditCancelled()428 bool IsEditCancelled() const { return m_editCancelled; } SetEditCanceled(bool editCancelled)429 void SetEditCanceled(bool editCancelled) { m_editCancelled = editCancelled; } 430 Clone()431 virtual wxEvent *Clone() const { return new wxDataViewEvent(*this); } 432 433 protected: 434 int m_col; 435 int m_row; 436 wxDataViewModel *m_model; 437 wxVariant m_value; 438 bool m_editCancelled; 439 wxDataViewColumn *m_column; 440 441 private: 442 DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxDataViewEvent) 443 }; 444 445 BEGIN_DECLARE_EVENT_TYPES() 446 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_ROW_SELECTED, -1) 447 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_ROW_ACTIVATED, -1) 448 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK, -1) 449 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK, -1) 450 END_DECLARE_EVENT_TYPES() 451 452 typedef void (wxEvtHandler::*wxDataViewEventFunction)(wxDataViewEvent&); 453 454 #define wxDataViewEventHandler(func) \ 455 (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxDataViewEventFunction, &func) 456 457 #define wx__DECLARE_DATAVIEWEVT(evt, id, fn) \ 458 wx__DECLARE_EVT1(wxEVT_COMMAND_DATAVIEW_ ## evt, id, wxDataViewEventHandler(fn)) 459 460 #define EVT_DATAVIEW_ROW_SELECTED(id, fn) wx__DECLARE_DATAVIEWEVT(ROW_SELECTED, id, fn) 461 #define EVT_DATAVIEW_ROW_ACTIVATED(id, fn) wx__DECLARE_DATAVIEWEVT(ROW_ACTIVATED, id, fn) 462 #define EVT_DATAVIEW_COLUMN_HEADER_CLICK(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_HEADER_CLICK, id, fn) 463 #define EVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICKED(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_HEADER_RIGHT_CLICK, id, fn) 464 465 466 #if defined(wxUSE_GENERICDATAVIEWCTRL) 467 #include "wx/generic/dataview.h" 468 #elif defined(__WXGTK20__) 469 #include "wx/gtk/dataview.h" 470 #elif defined(__WXMAC__) 471 // TODO 472 // #include "wx/mac/dataview.h" 473 #else 474 #include "wx/generic/dataview.h" 475 #endif 476 477 #endif // wxUSE_DATAVIEWCTRL 478 479 #endif 480 // _WX_DATAVIEW_H_BASE_ 481