From 239eaa415414c5d978072af89772b12e74309e1d Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Tue, 21 Feb 2006 17:35:19 +0000 Subject: [PATCH] wxDataViewCtrl WIP. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@37655 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/dataview.h | 98 +++++++++++++++++++++++++- include/wx/gtk/dataview.h | 64 +++++++++++++++++ src/common/datavcmn.cpp | 145 ++++++++++++++++++++++++++++++++++++++ src/gtk/dataview.cpp | 127 +++++++++++++++++++++------------ 4 files changed, 386 insertions(+), 48 deletions(-) create mode 100644 include/wx/gtk/dataview.h create mode 100644 src/common/datavcmn.cpp diff --git a/include/wx/dataview.h b/include/wx/dataview.h index 863f032620..c964799de7 100644 --- a/include/wx/dataview.h +++ b/include/wx/dataview.h @@ -16,17 +16,109 @@ #if wxUSE_DATAVIEWCTRL +#include "wx/control.h" +#include "wx/textctrl.h" +#include "wx/bitmap.h" + // ---------------------------------------------------------------------------- // wxDataViewCtrl flags // ---------------------------------------------------------------------------- -#include "wx/control.h" -#include "wx/textctrl.h" -#include "wx/bitmap.h" +// ---------------------------------------------------------------------------- +// wxDataViewCtrl globals +// ---------------------------------------------------------------------------- extern WXDLLEXPORT_DATA(const wxChar) wxDataViewCtrlNameStr[]; +// --------------------------------------------------------- +// wxDataViewModel +// --------------------------------------------------------- + +class wxDataViewModel: public wxObject +{ +public: + wxDataViewModel() { } + virtual ~wxDataViewModel() { } + +protected: + DECLARE_NO_COPY_CLASS(wxDataViewModel) +}; + +// --------------------------------------------------------- +// wxDataViewListModelNotifier +// --------------------------------------------------------- + +class wxDataViewListModelNotifier +{ +public: + wxDataViewListModelNotifier() { } + virtual ~wxDataViewListModelNotifier() { } + + virtual bool RowAppended() = 0; + virtual bool RowPrepended() = 0; + virtual bool RowInserted( size_t before ) = 0; + virtual bool RowDeleted( size_t row ) = 0; + virtual bool RowChanged( size_t row ) = 0; + virtual bool ValueChanged( size_t row, size_t col ) = 0; + virtual bool Cleared() = 0; +} + +// --------------------------------------------------------- +// wxDataViewListModel +// --------------------------------------------------------- + +class wxDataViewListModel: public wxDataViewModel +{ +public: + wxDataViewListModel(); + virtual ~wxDataViewListModel(); + + virtual size_t GetNumberOfRows() = 0; + virtual size_t GetNumberOfCols() = 0; + // as reported by wxVariant + virtual wxString GetColType( size_t col ) = 0; + virtual wxVariant GetValue( size_t col, size_t row ) = 0; + + // delegated notifiers + bool RowAppended(); + bool RowPrepended(); + bool RowInserted( size_t before ); + bool RowDeleted( size_t row ); + bool RowChanged( size_t row ); + bool ValueChanged( size_t row, size_t col ); + bool Cleared(); + + void SetNotifier( wxDataViewListModelNotifier *notifier ); + wxDataViewListModelNotifier* GetNotifier(); + +private: + wxDataViewListModelNotifier *m_notifier; + +protected: + DECLARE_NO_COPY_CLASS(wxDataViewListModel) +}; + +// --------------------------------------------------------- +// wxDataViewCtrlBase +// --------------------------------------------------------- + +class wxDataViewCtrlBase: public wxControl +{ +public: + wxDataViewCtrlBase(); + ~wxDataViewCtrlBase(); + + virtual bool AppendStringColumn( const wxString &label ) = 0; + + virtual bool AssociateModel( wxDataViewModel *model ); + wxDataViewModel* GetModel(); + +private: + wxDataViewModel *m_model; +protected: + DECLARE_NO_COPY_CLASS(wxDataViewCtrlBase) +}; diff --git a/include/wx/gtk/dataview.h b/include/wx/gtk/dataview.h new file mode 100644 index 0000000000..a9dc8f2d2a --- /dev/null +++ b/include/wx/gtk/dataview.h @@ -0,0 +1,64 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/dataview.h +// Purpose: wxDataViewCtrl GTK+2 implementation header +// Author: Robert Roebling +// Id: $Id$ +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __GTKDATAVIEWCTRLH__ +#define __GTKDATAVIEWCTRLH__ + +#include "wx/defs.h" +#include "wx/object.h" +#include "wx/list.h" +#include "wx/control.h" + +// --------------------------------------------------------- +// classes +// --------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDataViewCtrl; + +// --------------------------------------------------------- +// wxDataViewCtrl +// --------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDataViewCtrl: public wxDataViewCtrlBase +{ +public: + wxDataViewCtrl() + { + Init(); + } + + wxDataViewCtrl( wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxValidator& validator = wxDefaultValidator ) + { + Create(parent, id, pos, size, style, validator ); + } + + virtual ~wxDataViewCtrl(); + + void Init(); + + bool Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxValidator& validator = wxDefaultValidator ); + + virtual bool AppendStringColumn( const wxString &label ); + + virtual bool AssociateModel( wxDataViewStore *model ); + + +private: + DECLARE_DYNAMIC_CLASS(wxDataViewCtrl) + DECLARE_NO_COPY_CLASS(wxDataViewCtrl) +}; + + +#endif // __GTKDATAVIEWCTRLH__ diff --git a/src/common/datavcmn.cpp b/src/common/datavcmn.cpp new file mode 100644 index 0000000000..2d01d75aa5 --- /dev/null +++ b/src/common/datavcmn.cpp @@ -0,0 +1,145 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/datavcmn.cpp +// Purpose: wxDataViewCtrl base classes and common parts +// Author: Robert Roebling +// Created: 2006/02/20 +// RCS-ID: $Id$ +// Copyright: (c) 2006, Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/dataview.h" +#include "wx/log.h" +#include "wx/image.h" + +// --------------------------------------------------------- +// wxDataViewModel +// --------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxDataViewModel, wxObject) + +// --------------------------------------------------------- +// wxDataViewListModel +// --------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxDataViewListModel, wxDataViewModel) + +wxDataViewListModel::wxDataViewListModel() +{ + m_notifier = NULL; +} + +wxDataViewListModel::~wxDataViewListModel() +{ + if (m_notifier) + delete m_notifier; +} + +bool wxDataViewListModel::RowAppended() +{ + if (m_notifier) + return m_notifier->RowAppended(); + + return false; +} + +bool wxDataViewListModel::RowPrepended() +{ + if (m_notifier) + return m_notifier->RowPrepended(); + + return false; +} + +bool wxDataViewListModel::RowInserted( size_t before ) +{ + if (m_notifier) + return m_notifier->RowInserted( before ); + + return false; +} + +bool wxDataViewListModel::RowDeleted( size_t row ) +{ + if (m_notifier) + return m_notifier->RowDeleted( row ); + + return false; +} + +bool wxDataViewListModel::RowChanged( size_t row ) +{ + if (m_notifier) + return m_notifier->RowChanged( row ); + + return false; +} + +bool wxDataViewListModel::ValueChanged( size_t row, size_t col ) +{ + if (m_notifier) + return m_notifier->RowAppended(); + + return false; +} + +bool wxDataViewListModel::Cleared() +{ + if (m_notifier) + return m_notifier->Cleared(); + + return false; +} + +void wxDataViewListModel::SetNotifier( wxDataViewListModelNotifier *notifier ) +{ + if (m_notifier) + delete m_notifier; + + m_notifier = notifier; +} + +wxDataViewListModelNotifier* wxDataViewListModel::GetNotifier() +{ + return m_notifier; +} + +// --------------------------------------------------------- +// wxDataViewCtrlBase +// --------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxDataViewCtrlBase, wxControl) + +wxDataViewCtrlBase::wxDataViewCtrlBase() +{ + m_model = NULL; +} + +wxDataViewCtrlBase::~wxDataViewCtrlBase() +{ + if (m_model) + delete m_model; +} + +bool wxDataViewCtrlBase::AssociateModel( wxDataViewModel *model ) +{ + if (m_model) + delete m_model; + + m_model = model; + + return true; +} + +wxDataViewModel* wxDataViewCtrlBase::GetModel() +{ + return m_model; +} + diff --git a/src/gtk/dataview.cpp b/src/gtk/dataview.cpp index 95eb91465b..8dc3eccca7 100644 --- a/src/gtk/dataview.cpp +++ b/src/gtk/dataview.cpp @@ -196,7 +196,7 @@ wxgtk_list_store_finalize (GObject *object) GtkWxListStore *list_store = GTK_LIST_STORE (object); /* we need to sort out, which class deletes what */ - delete model; + /* delete model; */ /* must chain up */ (* parent_class->finalize) (object); @@ -230,7 +230,7 @@ wxgtk_list_store_get_n_columns (GtkTreeModel *tree_model) GtkWxListStore *list_store = (GtkWxListStore *) tree_model; g_return_val_if_fail (GTK_IS_WX_LIST_STORE (tree_model), 0); - return list_store->model->GetColumns(); + return list_store->model->GetNumberOfCols(); } static GType @@ -240,9 +240,10 @@ wxgtk_list_store_get_column_type (GtkTreeModel *tree_model, GtkWxListStore *list_store = (GtkWxListStore *) tree_model; g_return_val_if_fail (GTK_IS_WX_LIST_STORE (tree_model), G_TYPE_INVALID); - GType gtype = G_TYPE_INVALID; + GType gtype = G_TYPE_STRING; + #if 0 - list_store->model->GetColumnType( index ); + wxString wxtype = list_store->model->GetColType( index ); // convert wxtype to GType gtype = .. #endif @@ -259,20 +260,14 @@ wxgtk_list_store_get_iter (GtkTreeModel *tree_model, g_return_val_if_fail (GTK_IS_WX_LIST_STORE (tree_model), FALSE); g_return_val_if_fail (gtk_tree_path_get_depth (path) > 0, FALSE); -#if 0 - i = gtk_tree_path_get_indices (path)[0]; - - if (i >= list_store->length) - return FALSE; + i = gtk_tree_path_get_indices (path)[0]; - list = g_slist_nth (G_SLIST (list_store->root), i); - - /* If this fails, list_store->length has gotten mangled. */ - g_assert (list); + if (i >= list_store->model->GetCount()) + return FALSE; - iter->stamp = list_store->stamp; - iter->user_data = list; -#endif + iter->stamp = list_store->stamp; + // user_data is just the index + iter->user_data = (gpointer) i; return TRUE; } @@ -284,35 +279,13 @@ wxgtk_list_store_get_path (GtkTreeModel *tree_model, GtkWxListStore *list_store = (GtkListStore *) tree_model; g_return_val_if_fail (GTK_IS_WX_LIST_STORE (tree_model), NULL); -#if 0 - g_return_val_if_fail (iter->stamp == GTK_WX_LIST_STORE (tree_model)->stamp, NULL); + g_return_val_if_fail (iter->stamp == GTK_WX_LIST_STORE (tree_model)->stamp, NULL); - GtkTreePath *retval; - GSList *list; - gint i = 0; - - if (G_SLIST (iter->user_data) == G_SLIST (GTK_LIST_STORE (tree_model)->tail)) - { - retval = gtk_tree_path_new (); - gtk_tree_path_append_index (retval, GTK_LIST_STORE (tree_model)->length - 1); - return retval; - } - - for (list = G_SLIST (GTK_LIST_STORE (tree_model)->root); list; list = list->next) - { - if (list == G_SLIST (iter->user_data)) - break; - i++; - } - if (list == NULL) - return NULL; - - retval = gtk_tree_path_new (); - gtk_tree_path_append_index (retval, i); - return retval; -#endif - - return NULL; + GtkTreePath *retval = gtk_tree_path_new (); + // user_data is just the index + int i = (int) item->user_data; + gtk_tree_path_append_index (retval, i); + return retval; } static void @@ -323,6 +296,9 @@ wxgtk_list_store_get_value (GtkTreeModel *tree_model, { GtkWxListStore *list_store = (GtkListStore *) tree_model; g_return_if_fail (GTK_IS_WX_LIST_STORE (tree_model) ); + + g_value_init( value, G_TYPE_STRING ); + g_value_set_string( value, "Hello" ); #if 0 GtkTreeDataList *list; @@ -445,7 +421,68 @@ wxgtk_list_store_iter_parent (GtkTreeModel *tree_model, // wxDataViewCtrl //----------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxDataViewCtrl,wxControl) +IMPLEMENT_DYNAMIC_CLASS(wxDataViewCtrl, wxDataViewCtrlBase) + +wxDataViewCtrl::~wxDataViewCtrl() +{ +} + +void wxDataViewCtrl::Init() +{ +} + +bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos, const wxSize& size, + long style, const wxValidator& validator ) +{ + Init(); + + m_needParent = TRUE; + m_acceptsFocus = TRUE; + + if (!PreCreation( parent, pos, size ) || + !CreateBase( parent, id, pos, size, style, validator )) + { + wxFAIL_MSG( wxT("wxDataViewCtrl creation failed") ); + return FALSE; + } + + m_widget = gtk_tree_view_new(); + + m_parent->DoAddChild( this ); + + PostCreation(size); + + return true; +} + +bool wxDataViewCtrl::AppendStringColumn( const wxString &label ) +{ + GtkCellRenderer *renderer + = gtk_cell_renderer_text_new(); + + GtkTreeViewColumn *column + = gtk_tree_view_column_new_with_attributes( wxGTK_CONV(label), renderer, "text", index, NULL ); + + gtk_tree_view_append_column( GTK_TREE_VIEW(m_widget), column ); + + return true; +} + +bool wxDataViewCtrl::AssociateModel( wxDataViewStore *model ) +{ + if (!wxDataViewCtrlBase::AssociateModel( model )) + return false; + + // Right now we only have the GTK+ port's + // list store variant, so cast to that... + + wxDataViewListStore *liststore = (wxDataViewListStore*) store; + + gtk_tree_view_set_model( GTK_TREE_VIEW(m_widget), GTK_TREE_MODEL(liststore->GetGtkListStore()) ); + + return true; +} #endif // wxUSE_DATAVIEWCTRL -- 2.45.2