From 4d496ecbc48803b41b33e57d331895df5bfc7f56 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Sun, 26 Feb 2006 15:48:42 +0000 Subject: [PATCH] Some restructuring, beginning of wxDataViewDateCell. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@37741 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/dataview.h | 1 + include/wx/gtk/dataview.h | 39 +++++++++++- samples/dataview/dataview.cpp | 35 +++++++++-- src/common/datavcmn.cpp | 5 ++ src/gtk/dataview.cpp | 115 ++++++++++++++++++++++++++++++++-- 5 files changed, 182 insertions(+), 13 deletions(-) diff --git a/include/wx/dataview.h b/include/wx/dataview.h index 15c5a8cf50..5996daccfa 100644 --- a/include/wx/dataview.h +++ b/include/wx/dataview.h @@ -203,6 +203,7 @@ public: virtual bool AppendTextColumn( const wxString &label, size_t model_column ); virtual bool AppendToggleColumn( const wxString &label, size_t model_column ); virtual bool AppendProgressColumn( const wxString &label, size_t model_column ); + virtual bool AppendDateColumn( const wxString &label, size_t model_column ); virtual bool AppendColumn( wxDataViewColumn *col ); virtual size_t GetNumberOfColumns(); virtual bool DeleteColumn( size_t pos ); diff --git a/include/wx/gtk/dataview.h b/include/wx/gtk/dataview.h index 8ab53b9558..47d9a026b5 100644 --- a/include/wx/gtk/dataview.h +++ b/include/wx/gtk/dataview.h @@ -90,7 +90,20 @@ public: virtual bool Render( wxRect cell, wxDC *dc, int state ) = 0; virtual wxSize GetSize() = 0; - virtual bool Activate( wxRect cell ) { return false; }; + + virtual bool Activate( wxRect cell, + wxDataViewListModel *model, size_t col, size_t row ) + { return false; } + + virtual bool LeftClick( wxPoint cursor, wxRect cell, + wxDataViewListModel *model, size_t col, size_t row ) + { return false; } + virtual bool RightClick( wxPoint cursor, wxRect cell, + wxDataViewListModel *model, size_t col, size_t row ) + { return false; } + virtual bool StartDrag( wxPoint cursor, wxRect cell, + wxDataViewListModel *model, size_t col, size_t row ) + { return false; } // Create DC on request virtual wxDC *GetDC(); @@ -127,6 +140,30 @@ protected: DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewProgressCell) }; +// --------------------------------------------------------- +// wxDataViewDateCell +// --------------------------------------------------------- + +class wxDataViewDateCell: public wxDataViewCustomCell +{ +public: + wxDataViewDateCell( const wxString &varianttype = wxT("datetime"), + wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE ); + + bool SetValue( const wxVariant &value ); + + virtual bool Render( wxRect cell, wxDC *dc, int state ); + virtual wxSize GetSize(); + virtual bool Activate( wxRect cell, + wxDataViewListModel *model, size_t col, size_t row ); + +private: + wxDateTime m_date; + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewDateCell) +}; + // --------------------------------------------------------- // wxDataViewColumn // --------------------------------------------------------- diff --git a/samples/dataview/dataview.cpp b/samples/dataview/dataview.cpp index a933415e3b..449f9c1f93 100644 --- a/samples/dataview/dataview.cpp +++ b/samples/dataview/dataview.cpp @@ -30,6 +30,10 @@ // MyTextModel // ------------------------------------- +WX_DECLARE_LIST(wxDateTime,wxArrayDate); +#include +WX_DEFINE_LIST(wxArrayDate); + class MyTextModel: public wxDataViewListModel { public: @@ -44,16 +48,24 @@ public: { m_colours.Add( wxT("red") ); m_colours.Add( wxT("green") ); } for (i = 0; i < 1000; i++) { m_progress.Add( i/10 ); } + for (i = 0; i < 1000; i++) + { + wxDateTime *date = new wxDateTime( wxDateTime::Now() ); + m_dates.Append( date ); + } } virtual size_t GetNumberOfRows() { return 1000; } virtual size_t GetNumberOfCols() - { return 6; } + { return 7; } // as reported by wxVariant virtual wxString GetColType( size_t col ) { + if (col == 6) + return wxT("datetime"); + if (col == 5) return wxT("long"); @@ -65,6 +77,10 @@ public: virtual wxVariant GetValue( size_t col, size_t row ) { + if (col == 6) + { + return (wxDateTime) *m_dates[row]; + } else if (col == 5) { return (long) m_progress[row]; @@ -90,6 +106,10 @@ public: } virtual bool SetValue( wxVariant &value, size_t col, size_t row ) { + if (col == 6) + { + *m_dates[row] = value.GetDateTime(); + } else if (col == 3) { m_bools[row] = (int) value.GetBool(); @@ -105,6 +125,7 @@ public: wxArrayInt m_bools; wxArrayString m_colours; wxArrayInt m_progress; + wxArrayDate m_dates; }; // ------------------------------------- @@ -125,7 +146,7 @@ public: return true; } bool Render( wxRect rect, wxDC *dc, int state ) - { + { dc->SetPen( *wxBLACK_PEN ); if (m_colour == wxT("red")) dc->SetBrush( *wxRED_BRUSH ); @@ -140,9 +161,9 @@ public: { return wxSize(20,8); } - bool Activate( wxRect rect ) + bool Activate( wxRect rect, + wxDataViewListModel *model, size_t col, size_t row ) { - wxPrintf( wxT("activate\n") ); return false; } @@ -249,6 +270,8 @@ MyFrame::MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h): dataview_left->AppendProgressColumn( wxT("progress"), 5 ); + dataview_left->AppendDateColumn( wxT("date"), 6 ); + // Right wxDataViewCtrl using the same model dataview_right = new wxDataViewCtrl( this, -1 ); dataview_right->AssociateModel( model ); @@ -263,9 +286,9 @@ MyFrame::MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h): dataview_right->AppendColumn( column ); wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL ); - sizer->Add( dataview_left, 1, wxGROW ); + sizer->Add( dataview_left, 3, wxGROW ); sizer->Add(10,10); - sizer->Add( dataview_right, 1, wxGROW ); + sizer->Add( dataview_right, 2, wxGROW ); SetSizer( sizer ); } diff --git a/src/common/datavcmn.cpp b/src/common/datavcmn.cpp index 94536600cd..109b136e9a 100644 --- a/src/common/datavcmn.cpp +++ b/src/common/datavcmn.cpp @@ -208,6 +208,11 @@ bool wxDataViewCtrlBase::AppendProgressColumn( const wxString &label, size_t mod return AppendColumn( new wxDataViewColumn( label, new wxDataViewProgressCell(), model_column ) ); } +bool wxDataViewCtrlBase::AppendDateColumn( const wxString &label, size_t model_column ) +{ + return AppendColumn( new wxDataViewColumn( label, new wxDataViewDateCell(), model_column ) ); +} + bool wxDataViewCtrlBase::AppendColumn( wxDataViewColumn *col ) { m_cols.Append( (wxObject*) col ); diff --git a/src/gtk/dataview.cpp b/src/gtk/dataview.cpp index 8ac925600e..f55b65de94 100644 --- a/src/gtk/dataview.cpp +++ b/src/gtk/dataview.cpp @@ -25,6 +25,8 @@ #include #include +#include + //----------------------------------------------------------------------------- // classes //----------------------------------------------------------------------------- @@ -447,6 +449,7 @@ struct _GtkWxCellRenderer /*< private >*/ wxDataViewCustomCell *cell; + guint32 last_click; }; struct _GtkWxCellRendererClass @@ -522,6 +525,7 @@ static void gtk_wx_cell_renderer_init (GtkWxCellRenderer *cell) { cell->cell = NULL; + cell->last_click = 0; } static void @@ -627,7 +631,11 @@ gtk_wx_cell_renderer_render (GtkCellRenderer *renderer, { wxRect renderrect( rect.x, rect.y, rect.width, rect.height ); wxWindowDC* dc = (wxWindowDC*) cell->GetDC(); - dc->m_window = window; + if (dc->m_window == NULL) + { + dc->m_window = window; + dc->SetUpDC(); + } int state = 0; if (flags & GTK_CELL_RENDERER_SELECTED) @@ -670,8 +678,54 @@ gtk_wx_cell_renderer_activate( rect.height -= renderer->ypad * 2; wxRect renderrect( rect.x, rect.y, rect.width, rect.height ); + + wxDataViewListModel *model = cell->GetOwner()->GetOwner()->GetModel(); + + GtkTreePath *treepath = gtk_tree_path_new_from_string( path ); + size_t model_row = (size_t)gtk_tree_path_get_indices (treepath)[0]; + gtk_tree_path_free( treepath ); + + size_t model_col = cell->GetOwner()->GetModelColumn(); + + if (event->type == GDK_BUTTON_PRESS) + { + GdkEventButton *button_event = (GdkEventButton*) event; + wxPoint pt( ((int) button_event->x) - renderrect.x, + ((int) button_event->y) - renderrect.y ); - return cell->Activate( renderrect ); + bool ret = false; + if (button_event->button == 1) + { + if (cell->LeftClick( pt, renderrect, model, model_col, model_row )) + ret = true; + if (button_event->time - wxrenderer->last_click < 400) + if (cell->Activate( renderrect, model, model_col, model_row )) + ret = true; + } + if (button_event->button == 3) + { + if (cell->RightClick( pt, renderrect, model, model_col, model_row )) + ret = true; + } + + wxrenderer->last_click = button_event->time; + + return ret; + } + + if (event->type == GDK_KEY_PRESS) + { + wxPrintf( wxT("key\n") ); + GdkEventKey *key_event = (GdkEventKey*) event; + if ((key_event->keyval == GDK_Return) || + (key_event->keyval == GDK_Linefeed) || + (key_event->keyval == GDK_Execute)) + { + return cell->Activate( renderrect, model, model_col, model_row ); + } + } + + return false; } // --------------------------------------------------------- @@ -963,16 +1017,16 @@ public: GtkWidget *widget = window->m_treeview; // Set later m_window = NULL; - + m_context = window->GtkGetPangoDefaultContext(); m_layout = pango_layout_new( m_context ); m_fontdesc = pango_font_description_copy( widget->style->font_desc ); m_cmap = gtk_widget_get_colormap( widget ? widget : window->m_widget ); - SetUpDC(); - - m_owner = window; + // Set m_window later + // SetUpDC(); + // m_owner = window; } }; @@ -1022,7 +1076,13 @@ wxDataViewCustomCell::~wxDataViewCustomCell() wxDC *wxDataViewCustomCell::GetDC() { if (m_dc == NULL) + { + if (GetOwner() == NULL) + return NULL; + if (GetOwner()->GetOwner() == NULL) + return NULL; m_dc = new wxDataViewCtrlDC( GetOwner()->GetOwner() ); + } return m_dc; } @@ -1108,6 +1168,49 @@ wxSize wxDataViewProgressCell::GetSize() return wxSize(40,12); } +// --------------------------------------------------------- +// wxDataViewDateCell +// --------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxDataViewDateCell, wxDataViewCustomCell) + +wxDataViewDateCell::wxDataViewDateCell( const wxString &varianttype, + wxDataViewCellMode mode ) : + wxDataViewCustomCell( varianttype, mode ) +{ +} + +bool wxDataViewDateCell::SetValue( const wxVariant &value ) +{ + m_date = value.GetDateTime(); + + return true; +} + +bool wxDataViewDateCell::Render( wxRect cell, wxDC *dc, int state ) +{ + dc->SetFont( GetOwner()->GetOwner()->GetFont() ); + wxString tmp = m_date.FormatDate(); + dc->DrawText( tmp, cell.x, cell.y ); + + return true; +} + +wxSize wxDataViewDateCell::GetSize() +{ + wxDataViewCtrl* view = GetOwner()->GetOwner(); + wxString tmp = m_date.FormatDate(); + wxCoord x,y,d; + view->GetTextExtent( tmp, &x, &y, &d ); + return wxSize(x,y+d); +} + +bool wxDataViewDateCell::Activate( wxRect cell, wxDataViewListModel *model, size_t col, size_t row ) +{ + + return true; +} + // --------------------------------------------------------- // wxDataViewColumn // ---------------------------------------------------------