1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxDataViewCtrl generic implementation
4 // Author: Robert Roebling
6 // Copyright: (c) 1998 Robert Roebling
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
10 // For compilers that support precompilation, includes "wx.h".
11 #include "wx/wxprec.h"
15 #if wxUSE_DATAVIEWCTRL
17 #include "wx/dataview.h"
19 #ifdef wxUSE_GENERICDATAVIEWCTRL
21 #include "wx/stockitem.h"
22 #include "wx/dcclient.h"
23 #include "wx/calctrl.h"
24 #include "wx/popupwin.h"
27 #include "wx/renderer.h"
30 #include <windows.h> // for DLGC_WANTARROWS
31 #include "wx/msw/winundef.h"
34 //-----------------------------------------------------------------------------
36 //-----------------------------------------------------------------------------
40 //-----------------------------------------------------------------------------
41 // wxDataViewHeaderWindow
42 //-----------------------------------------------------------------------------
44 class wxDataViewHeaderWindow
: public wxWindow
47 wxDataViewHeaderWindow( wxDataViewCtrl
*parent
,
49 const wxPoint
&pos
= wxDefaultPosition
,
50 const wxSize
&size
= wxDefaultSize
,
51 const wxString
&name
= wxT("wxdataviewctrlheaderwindow") );
52 ~wxDataViewHeaderWindow();
54 void SetOwner( wxDataViewCtrl
* owner
) { m_owner
= owner
; }
55 wxDataViewCtrl
*GetOwner() { return m_owner
; }
57 void OnPaint( wxPaintEvent
&event
);
58 void OnMouse( wxMouseEvent
&event
);
59 void OnSetFocus( wxFocusEvent
&event
);
62 wxDataViewCtrl
*m_owner
;
63 wxCursor
*m_resizeCursor
;
66 DECLARE_DYNAMIC_CLASS(wxDataViewHeaderWindow
)
70 //-----------------------------------------------------------------------------
71 // wxDataViewMainWindow
72 //-----------------------------------------------------------------------------
74 class wxDataViewMainWindow
: public wxWindow
77 wxDataViewMainWindow( wxDataViewCtrl
*parent
,
79 const wxPoint
&pos
= wxDefaultPosition
,
80 const wxSize
&size
= wxDefaultSize
,
81 const wxString
&name
= wxT("wxdataviewctrlmainwindow") );
82 ~wxDataViewMainWindow();
84 // notifications from wxDataViewListModel
87 bool RowInserted( size_t before
);
88 bool RowDeleted( size_t row
);
89 bool RowChanged( size_t row
);
90 bool ValueChanged( size_t col
, size_t row
);
91 bool RowsReordered( size_t *new_order
);
94 void SetOwner( wxDataViewCtrl
* owner
) { m_owner
= owner
; }
95 wxDataViewCtrl
*GetOwner() { return m_owner
; }
97 void OnPaint( wxPaintEvent
&event
);
98 void OnMouse( wxMouseEvent
&event
);
99 void OnSetFocus( wxFocusEvent
&event
);
101 void UpdateDisplay();
102 void RecalculateDisplay();
103 void OnInternalIdle();
105 void ScrollWindow( int dx
, int dy
, const wxRect
*rect
);
107 wxDataViewCtrl
*m_owner
;
112 DECLARE_DYNAMIC_CLASS(wxDataViewMainWindow
)
113 DECLARE_EVENT_TABLE()
116 // ---------------------------------------------------------
117 // wxGenericDataViewListModelNotifier
118 // ---------------------------------------------------------
120 class wxGenericDataViewListModelNotifier
: public wxDataViewListModelNotifier
123 wxGenericDataViewListModelNotifier( wxDataViewMainWindow
*mainWindow
)
124 { m_mainWindow
= mainWindow
; }
126 virtual bool RowAppended()
127 { return m_mainWindow
->RowAppended(); }
128 virtual bool RowPrepended()
129 { return m_mainWindow
->RowPrepended(); }
130 virtual bool RowInserted( size_t before
)
131 { return m_mainWindow
->RowInserted( before
); }
132 virtual bool RowDeleted( size_t row
)
133 { return m_mainWindow
->RowDeleted( row
); }
134 virtual bool RowChanged( size_t row
)
135 { return m_mainWindow
->RowChanged( row
); }
136 virtual bool ValueChanged( size_t col
, size_t row
)
137 { return m_mainWindow
->ValueChanged( col
, row
); }
138 virtual bool RowsReordered( size_t *new_order
)
139 { return m_mainWindow
->RowsReordered( new_order
); }
140 virtual bool Cleared()
141 { return m_mainWindow
->Cleared(); }
143 wxDataViewMainWindow
*m_mainWindow
;
146 // ---------------------------------------------------------
148 // ---------------------------------------------------------
150 IMPLEMENT_ABSTRACT_CLASS(wxDataViewCell
, wxDataViewCellBase
)
152 wxDataViewCell::wxDataViewCell( const wxString
&varianttype
, wxDataViewCellMode mode
) :
153 wxDataViewCellBase( varianttype
, mode
)
158 wxDataViewCell::~wxDataViewCell()
164 wxDC
*wxDataViewCell::GetDC()
168 if (GetOwner() == NULL
)
170 if (GetOwner()->GetOwner() == NULL
)
172 m_dc
= new wxClientDC( GetOwner()->GetOwner() );
178 // ---------------------------------------------------------
179 // wxDataViewCustomCell
180 // ---------------------------------------------------------
182 IMPLEMENT_ABSTRACT_CLASS(wxDataViewCustomCell
, wxDataViewCell
)
184 wxDataViewCustomCell::wxDataViewCustomCell( const wxString
&varianttype
,
185 wxDataViewCellMode mode
) :
186 wxDataViewCell( varianttype
, mode
)
190 // ---------------------------------------------------------
191 // wxDataViewTextCell
192 // ---------------------------------------------------------
194 IMPLEMENT_ABSTRACT_CLASS(wxDataViewTextCell
, wxDataViewCustomCell
)
196 wxDataViewTextCell::wxDataViewTextCell( const wxString
&varianttype
, wxDataViewCellMode mode
) :
197 wxDataViewCustomCell( varianttype
, mode
)
201 bool wxDataViewTextCell::SetValue( const wxVariant
&value
)
203 m_text
= value
.GetString();
208 bool wxDataViewTextCell::GetValue( wxVariant
&value
)
213 bool wxDataViewTextCell::Render( wxRect cell
, wxDC
*dc
, int state
)
215 dc
->DrawText( m_text
, cell
.x
, cell
.y
);
220 wxSize
wxDataViewTextCell::GetSize()
222 return wxSize(80,20);
225 // ---------------------------------------------------------
226 // wxDataViewToggleCell
227 // ---------------------------------------------------------
229 IMPLEMENT_ABSTRACT_CLASS(wxDataViewToggleCell
, wxDataViewCustomCell
)
231 wxDataViewToggleCell::wxDataViewToggleCell( const wxString
&varianttype
,
232 wxDataViewCellMode mode
) :
233 wxDataViewCustomCell( varianttype
, mode
)
238 bool wxDataViewToggleCell::SetValue( const wxVariant
&value
)
240 m_toggle
= value
.GetBool();
245 bool wxDataViewToggleCell::GetValue( wxVariant
&value
)
250 bool wxDataViewToggleCell::Render( wxRect cell
, wxDC
*dc
, int state
)
252 // User wxRenderer here
254 if (GetMode() == wxDATAVIEW_CELL_ACTIVATABLE
)
255 dc
->SetPen( *wxBLACK_PEN
);
257 dc
->SetPen( *wxGREY_PEN
);
258 dc
->SetBrush( *wxTRANSPARENT_BRUSH
);
260 rect
.x
= cell
.x
+ cell
.width
/2 - 10;
262 rect
.y
= cell
.y
+ cell
.height
/2 - 10;
264 dc
->DrawRectangle( rect
);
271 dc
->DrawLine( rect
.x
, rect
.y
, rect
.x
+rect
.width
, rect
.y
+rect
.height
);
272 dc
->DrawLine( rect
.x
+rect
.width
, rect
.y
, rect
.x
, rect
.y
+rect
.height
);
278 bool wxDataViewToggleCell::Activate( wxRect cell
, wxDataViewListModel
*model
, size_t col
, size_t row
)
280 bool value
= !m_toggle
;
281 wxVariant variant
= value
;
282 model
->SetValue( variant
, col
, row
);
283 model
->ValueChanged( col
, row
);
287 wxSize
wxDataViewToggleCell::GetSize()
289 return wxSize(20,20);
292 // ---------------------------------------------------------
293 // wxDataViewProgressCell
294 // ---------------------------------------------------------
296 IMPLEMENT_ABSTRACT_CLASS(wxDataViewProgressCell
, wxDataViewCustomCell
)
298 wxDataViewProgressCell::wxDataViewProgressCell( const wxString
&label
,
299 const wxString
&varianttype
, wxDataViewCellMode mode
) :
300 wxDataViewCustomCell( varianttype
, mode
)
306 wxDataViewProgressCell::~wxDataViewProgressCell()
310 bool wxDataViewProgressCell::SetValue( const wxVariant
&value
)
312 m_value
= (long) value
;
314 if (m_value
< 0) m_value
= 0;
315 if (m_value
> 100) m_value
= 100;
320 bool wxDataViewProgressCell::Render( wxRect cell
, wxDC
*dc
, int state
)
322 double pct
= (double)m_value
/ 100.0;
324 bar
.width
= (int)(cell
.width
* pct
);
325 dc
->SetPen( *wxTRANSPARENT_PEN
);
326 dc
->SetBrush( *wxBLUE_BRUSH
);
327 dc
->DrawRectangle( bar
);
329 dc
->SetBrush( *wxTRANSPARENT_BRUSH
);
330 dc
->SetPen( *wxBLACK_PEN
);
331 dc
->DrawRectangle( cell
);
336 wxSize
wxDataViewProgressCell::GetSize()
338 return wxSize(40,12);
341 // ---------------------------------------------------------
342 // wxDataViewDateCell
343 // ---------------------------------------------------------
345 class wxDataViewDateCellPopupTransient
: public wxPopupTransientWindow
348 wxDataViewDateCellPopupTransient( wxWindow
* parent
, wxDateTime
*value
,
349 wxDataViewListModel
*model
, size_t col
, size_t row
) :
350 wxPopupTransientWindow( parent
, wxBORDER_SIMPLE
)
355 m_cal
= new wxCalendarCtrl( this, -1, *value
);
356 wxBoxSizer
*sizer
= new wxBoxSizer( wxHORIZONTAL
);
357 sizer
->Add( m_cal
, 1, wxGROW
);
362 virtual void OnDismiss()
366 void OnCalendar( wxCalendarEvent
&event
);
368 wxCalendarCtrl
*m_cal
;
369 wxDataViewListModel
*m_model
;
374 DECLARE_EVENT_TABLE()
377 BEGIN_EVENT_TABLE(wxDataViewDateCellPopupTransient
,wxPopupTransientWindow
)
378 EVT_CALENDAR( -1, wxDataViewDateCellPopupTransient::OnCalendar
)
381 void wxDataViewDateCellPopupTransient::OnCalendar( wxCalendarEvent
&event
)
383 wxDateTime date
= event
.GetDate();
384 wxVariant value
= date
;
385 m_model
->SetValue( value
, m_col
, m_row
);
386 m_model
->ValueChanged( m_col
, m_row
);
390 IMPLEMENT_ABSTRACT_CLASS(wxDataViewDateCell
, wxDataViewCustomCell
)
392 wxDataViewDateCell::wxDataViewDateCell( const wxString
&varianttype
,
393 wxDataViewCellMode mode
) :
394 wxDataViewCustomCell( varianttype
, mode
)
398 bool wxDataViewDateCell::SetValue( const wxVariant
&value
)
400 m_date
= value
.GetDateTime();
405 bool wxDataViewDateCell::Render( wxRect cell
, wxDC
*dc
, int state
)
407 dc
->SetFont( GetOwner()->GetOwner()->GetFont() );
408 wxString tmp
= m_date
.FormatDate();
409 dc
->DrawText( tmp
, cell
.x
, cell
.y
);
414 wxSize
wxDataViewDateCell::GetSize()
416 wxDataViewCtrl
* view
= GetOwner()->GetOwner();
417 wxString tmp
= m_date
.FormatDate();
419 view
->GetTextExtent( tmp
, &x
, &y
, &d
);
420 return wxSize(x
,y
+d
);
423 bool wxDataViewDateCell::Activate( wxRect cell
, wxDataViewListModel
*model
, size_t col
, size_t row
)
426 model
->GetValue( variant
, col
, row
);
427 wxDateTime value
= variant
.GetDateTime();
429 wxDataViewDateCellPopupTransient
*popup
= new wxDataViewDateCellPopupTransient(
430 GetOwner()->GetOwner()->GetParent(), &value
, model
, col
, row
);
431 wxPoint pos
= wxGetMousePosition();
434 popup
->Popup( popup
->m_cal
);
439 // ---------------------------------------------------------
441 // ---------------------------------------------------------
443 IMPLEMENT_ABSTRACT_CLASS(wxDataViewColumn
, wxDataViewColumnBase
)
445 wxDataViewColumn::wxDataViewColumn( const wxString
&title
, wxDataViewCell
*cell
,
446 size_t model_column
, int flags
) :
447 wxDataViewColumnBase( title
, cell
, model_column
, flags
)
452 wxDataViewColumn::~wxDataViewColumn()
456 void wxDataViewColumn::SetTitle( const wxString
&title
)
458 wxDataViewColumnBase::SetTitle( title
);
462 //-----------------------------------------------------------------------------
463 // wxDataViewHeaderWindow
464 //-----------------------------------------------------------------------------
466 IMPLEMENT_ABSTRACT_CLASS(wxDataViewHeaderWindow
, wxWindow
)
468 BEGIN_EVENT_TABLE(wxDataViewHeaderWindow
,wxWindow
)
469 EVT_PAINT (wxDataViewHeaderWindow::OnPaint
)
470 EVT_MOUSE_EVENTS (wxDataViewHeaderWindow::OnMouse
)
471 EVT_SET_FOCUS (wxDataViewHeaderWindow::OnSetFocus
)
474 wxDataViewHeaderWindow::wxDataViewHeaderWindow( wxDataViewCtrl
*parent
, wxWindowID id
,
475 const wxPoint
&pos
, const wxSize
&size
, const wxString
&name
) :
476 wxWindow( parent
, id
, pos
, size
, 0, name
)
480 m_resizeCursor
= new wxCursor( wxCURSOR_SIZEWE
);
482 wxVisualAttributes attr
= wxPanel::GetClassDefaultAttributes();
483 SetOwnForegroundColour( attr
.colFg
);
484 SetOwnBackgroundColour( attr
.colBg
);
486 SetOwnFont( attr
.font
);
489 wxDataViewHeaderWindow::~wxDataViewHeaderWindow()
491 delete m_resizeCursor
;
494 void wxDataViewHeaderWindow::OnPaint( wxPaintEvent
&event
)
497 GetClientSize( &w
, &h
);
499 wxPaintDC
dc( this );
502 m_owner
->GetScrollPixelsPerUnit( &xpix
, NULL
);
505 m_owner
->GetViewStart( &x
, NULL
);
507 // account for the horz scrollbar offset
508 dc
.SetDeviceOrigin( -x
* xpix
, 0 );
510 dc
.SetFont( GetFont() );
512 size_t cols
= GetOwner()->GetNumberOfColumns();
515 for (i
= 0; i
< cols
; i
++)
517 wxDataViewColumn
*col
= GetOwner()->GetColumn( i
);
518 int width
= col
->GetWidth();
520 // the width of the rect to draw: make it smaller to fit entirely
521 // inside the column rect
530 wxRendererNative::Get().DrawHeaderButton
534 wxRect(xpos
, 0, cw
, ch
),
535 m_parent
->IsEnabled() ? 0
536 : (int)wxCONTROL_DISABLED
539 dc
.DrawText( col
->GetTitle(), xpos
+3, 3 );
545 void wxDataViewHeaderWindow::OnMouse( wxMouseEvent
&event
)
549 void wxDataViewHeaderWindow::OnSetFocus( wxFocusEvent
&event
)
554 //-----------------------------------------------------------------------------
555 // wxDataViewMainWindow
556 //-----------------------------------------------------------------------------
558 IMPLEMENT_ABSTRACT_CLASS(wxDataViewMainWindow
, wxWindow
)
560 BEGIN_EVENT_TABLE(wxDataViewMainWindow
,wxWindow
)
561 EVT_PAINT (wxDataViewMainWindow::OnPaint
)
562 EVT_MOUSE_EVENTS (wxDataViewMainWindow::OnMouse
)
563 EVT_SET_FOCUS (wxDataViewMainWindow::OnSetFocus
)
566 wxDataViewMainWindow::wxDataViewMainWindow( wxDataViewCtrl
*parent
, wxWindowID id
,
567 const wxPoint
&pos
, const wxSize
&size
, const wxString
&name
) :
568 wxWindow( parent
, id
, pos
, size
, 0, name
)
572 // We need to calculate this smartly..
578 wxDataViewMainWindow::~wxDataViewMainWindow()
582 bool wxDataViewMainWindow::RowAppended()
587 bool wxDataViewMainWindow::RowPrepended()
592 bool wxDataViewMainWindow::RowInserted( size_t before
)
597 bool wxDataViewMainWindow::RowDeleted( size_t row
)
602 bool wxDataViewMainWindow::RowChanged( size_t row
)
607 bool wxDataViewMainWindow::ValueChanged( size_t col
, size_t row
)
609 wxRect
rect( 0, row
*m_lineHeight
, 10000, m_lineHeight
);
610 m_owner
->CalcScrolledPosition( rect
.x
, rect
.y
, &rect
.x
, &rect
.y
);
611 Refresh( true, &rect
);
616 bool wxDataViewMainWindow::RowsReordered( size_t *new_order
)
621 bool wxDataViewMainWindow::Cleared()
626 void wxDataViewMainWindow::UpdateDisplay()
631 void wxDataViewMainWindow::OnInternalIdle()
633 wxWindow::OnInternalIdle();
637 RecalculateDisplay();
642 void wxDataViewMainWindow::RecalculateDisplay()
644 wxDataViewListModel
*model
= GetOwner()->GetModel();
652 size_t cols
= GetOwner()->GetNumberOfColumns();
654 for (i
= 0; i
< cols
; i
++)
656 wxDataViewColumn
*col
= GetOwner()->GetColumn( i
);
657 width
+= col
->GetWidth();
660 int height
= model
->GetNumberOfRows() * m_lineHeight
;
662 SetVirtualSize( width
, height
);
663 GetOwner()->SetScrollRate( 10, m_lineHeight
);
668 void wxDataViewMainWindow::ScrollWindow( int dx
, int dy
, const wxRect
*rect
)
670 wxWindow::ScrollWindow( dx
, dy
, rect
);
671 GetOwner()->m_headerArea
->ScrollWindow( dx
, 0 );
674 void wxDataViewMainWindow::OnPaint( wxPaintEvent
&event
)
676 wxPaintDC
dc( this );
678 GetOwner()->PrepareDC( dc
);
680 dc
.SetFont( GetFont() );
682 wxRect update
= GetUpdateRegion().GetBox();
683 m_owner
->CalcUnscrolledPosition( update
.x
, update
.y
, &update
.x
, &update
.y
);
685 wxDataViewListModel
*model
= GetOwner()->GetModel();
687 size_t item_start
= update
.y
/ m_lineHeight
;
688 size_t item_count
= (update
.height
/ m_lineHeight
) + 1;
692 cell_rect
.height
= m_lineHeight
;
693 size_t cols
= GetOwner()->GetNumberOfColumns();
695 for (i
= 0; i
< cols
; i
++)
697 wxDataViewColumn
*col
= GetOwner()->GetColumn( i
);
698 wxDataViewCell
*cell
= col
->GetCell();
699 cell_rect
.width
= col
->GetWidth();
702 for (item
= item_start
; item
<= item_start
+item_count
; item
++)
704 cell_rect
.y
= item
*m_lineHeight
;
706 model
->GetValue( value
, col
->GetModelColumn(), item
);
707 cell
->SetValue( value
);
708 wxSize size
= cell
->GetSize();
709 // cannot be bigger than allocated space
710 size
.x
= wxMin( size
.x
, cell_rect
.width
);
711 size
.y
= wxMin( size
.y
, cell_rect
.height
);
712 // TODO: check for left/right/centre alignment here
715 item_rect
.x
= cell_rect
.x
+ (cell_rect
.width
/ 2) - (size
.x
/ 2);
716 item_rect
.y
= cell_rect
.y
+ (cell_rect
.height
/ 2) - (size
.y
/ 2);
718 item_rect
.width
= size
.x
;
719 item_rect
.height
= size
.y
;
720 cell
->Render( item_rect
, &dc
, 0 );
723 cell_rect
.x
+= cell_rect
.width
;
727 void wxDataViewMainWindow::OnMouse( wxMouseEvent
&event
)
729 int x
= event
.GetX();
730 int y
= event
.GetY();
731 m_owner
->CalcUnscrolledPosition( x
, y
, &x
, &y
);
733 wxDataViewColumn
*col
= NULL
;
736 size_t cols
= GetOwner()->GetNumberOfColumns();
738 for (i
= 0; i
< cols
; i
++)
740 wxDataViewColumn
*c
= GetOwner()->GetColumn( i
);
741 if (x
< xpos
+ c
->GetWidth())
746 xpos
+= c
->GetWidth();
750 wxDataViewCell
*cell
= col
->GetCell();
752 size_t row
= y
/ m_lineHeight
;
754 wxDataViewListModel
*model
= GetOwner()->GetModel();
756 if (event
.LeftDClick())
758 if (cell
->GetMode() == wxDATAVIEW_CELL_ACTIVATABLE
)
761 model
->GetValue( value
, col
->GetModelColumn(), row
);
762 cell
->SetValue( value
);
763 wxRect
cell_rect( xpos
, row
* m_lineHeight
, col
->GetWidth(), m_lineHeight
);
764 cell
->Activate( cell_rect
, model
, col
->GetModelColumn(), row
);
773 void wxDataViewMainWindow::OnSetFocus( wxFocusEvent
&event
)
778 //-----------------------------------------------------------------------------
780 //-----------------------------------------------------------------------------
782 IMPLEMENT_DYNAMIC_CLASS(wxDataViewCtrl
, wxDataViewCtrlBase
)
784 BEGIN_EVENT_TABLE(wxDataViewCtrl
, wxDataViewCtrlBase
)
785 EVT_SIZE(wxDataViewCtrl::OnSize
)
788 wxDataViewCtrl::~wxDataViewCtrl()
791 GetModel()->RemoveNotifier( m_notifier
);
794 void wxDataViewCtrl::Init()
799 bool wxDataViewCtrl::Create(wxWindow
*parent
, wxWindowID id
,
800 const wxPoint
& pos
, const wxSize
& size
,
801 long style
, const wxValidator
& validator
)
803 if (!wxControl::Create( parent
, id
, pos
, size
, style
| wxScrolledWindowStyle
|wxSUNKEN_BORDER
, validator
))
809 MacSetClipChildren( true ) ;
812 m_clientArea
= new wxDataViewMainWindow( this, -1 );
813 m_headerArea
= new wxDataViewHeaderWindow( this, -1, wxDefaultPosition
, wxSize(-1,25) );
815 SetTargetWindow( m_clientArea
);
817 wxBoxSizer
*sizer
= new wxBoxSizer( wxVERTICAL
);
818 sizer
->Add( m_headerArea
, 0, wxGROW
);
819 sizer
->Add( m_clientArea
, 1, wxGROW
);
826 WXLRESULT
wxDataViewCtrl::MSWWindowProc(WXUINT nMsg
,
830 WXLRESULT rc
= wxDataViewCtrlBase::MSWWindowProc(nMsg
, wParam
, lParam
);
833 // we need to process arrows ourselves for scrolling
834 if ( nMsg
== WM_GETDLGCODE
)
836 rc
|= DLGC_WANTARROWS
;
844 void wxDataViewCtrl::OnSize( wxSizeEvent
&event
)
846 // We need to override OnSize so that our scrolled
847 // window a) does call Layout() to use sizers for
848 // positioning the controls but b) does not query
849 // the sizer for their size and use that for setting
850 // the scrollable area as set that ourselves by
851 // calling SetScrollbar() further down.
858 bool wxDataViewCtrl::AssociateModel( wxDataViewListModel
*model
)
860 if (!wxDataViewCtrlBase::AssociateModel( model
))
863 m_notifier
= new wxGenericDataViewListModelNotifier( m_clientArea
);
865 model
->AddNotifier( m_notifier
);
867 m_clientArea
->UpdateDisplay();
872 bool wxDataViewCtrl::AppendColumn( wxDataViewColumn
*col
)
874 if (!wxDataViewCtrlBase::AppendColumn(col
))
877 m_clientArea
->UpdateDisplay();
883 // !wxUSE_GENERICDATAVIEWCTRL
886 // wxUSE_DATAVIEWCTRL