///////////////////////////////////////////////////////////////////////////// // Name: dataview.cpp // Purpose: DataVewCtrl wxWidgets sample // Author: Robert Roebling // Modified by: // Created: 06/01/06 // RCS-ID: $Id$ // Copyright: (c) Robert Roebling // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include "wx/wx.h" #endif #ifndef __WXMSW__ #include "mondrian.xpm" #endif // -------------------- wxDataViewControl -------------------- // wxDataViewStore class wxDataViewStore { public: wxDataViewStore() { } virtual ~wxDataViewStore() { } protected: DECLARE_NO_COPY_CLASS(wxDataViewStore) }; // wxDataViewListStoreBase class wxDataViewListStoreBase: public wxDataViewStore { public: wxDataViewListStoreBase() { } virtual bool AppendRow() = 0; protected: DECLARE_NO_COPY_CLASS(wxDataViewListStoreBase) }; // wxDataViewCtrlBase class wxDataViewCtrlBase: public wxControl { public: wxDataViewCtrlBase(); // Define public API here virtual bool AppendStringColumn( const wxString &label, int index ) = 0; virtual bool AssociateStore( wxDataViewStore *store ); wxDataViewStore* GetStore(); private: wxDataViewStore *m_store; protected: DECLARE_NO_COPY_CLASS(wxDataViewCtrlBase) }; // -------------------- GTK2 header -------------------- #ifdef __WXGTK20__ #include "wx/gtk/private.h" class wxDataViewListStore: public wxDataViewListStoreBase { public: wxDataViewListStore(); // interface virtual bool AppendRow(); // implementation GtkListStore* GetGtkListStore() { return m_store; } private: GtkListStore *m_store; protected: DECLARE_NO_COPY_CLASS(wxDataViewListStore) }; class 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, int index ); virtual bool AssociateStore( wxDataViewStore *store ); private: DECLARE_DYNAMIC_CLASS(wxDataViewCtrl) DECLARE_NO_COPY_CLASS(wxDataViewCtrl) }; #endif // -------------------- wxDataViewControl -------------------- wxDataViewCtrlBase::wxDataViewCtrlBase() { m_store = NULL; } bool wxDataViewCtrlBase::AssociateStore( wxDataViewStore *store ) { m_store = store; return true; } wxDataViewStore* wxDataViewCtrlBase::GetStore() { return m_store; } IMPLEMENT_DYNAMIC_CLASS(wxDataViewCtrl,wxControl) // -------------------- GTK2 implementaion -------------------- #ifdef __WXGTK20__ // wxDataViewListStore wxDataViewListStore::wxDataViewListStore() { m_store = gtk_list_store_new( 3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING ); } bool wxDataViewListStore::AppendRow() { GtkTreeIter iter; gtk_list_store_append( m_store, &iter ); return true; } // wxDataViewCtrl 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, int index ) { 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::AssociateStore( wxDataViewStore *store ) { wxDataViewCtrlBase::AssociateStore( store ); // 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 // -------------------- wxDataViewControl -------------------- class MyApp: public wxApp { public: bool OnInit(void); }; class MyFrame: public wxFrame { public: MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h); public: void OnQuit(wxCommandEvent& event); void OnAbout(wxCommandEvent& event); private: wxDataViewCtrl* dataview; }; // ID for the menu commands #define DYNAMIC_QUIT wxID_EXIT #define DYNAMIC_ABOUT wxID_ABOUT // Create a new application object IMPLEMENT_APP (MyApp) // `Main program' equivalent, creating windows and returning main app frame bool MyApp::OnInit(void) { // Create the main frame window MyFrame *frame = new MyFrame(NULL, _T("Dynamic wxWidgets App"), 50, 50, 450, 340); // Show the frame frame->Show(true); SetTopWindow(frame); return true; } // ------------------------------------- // MyFrame // ------------------------------------- // My frame constructor MyFrame::MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h): wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h)) { // Give it an icon #ifdef __WXMSW__ SetIcon(wxIcon(_T("mondrian"))); #else SetIcon(wxIcon(mondrian_xpm)); #endif // Make a menubar wxMenu *file_menu = new wxMenu; file_menu->Append(DYNAMIC_ABOUT, _T("&About")); file_menu->Append(DYNAMIC_QUIT, _T("E&xit")); wxMenuBar *menu_bar = new wxMenuBar; menu_bar->Append(file_menu, _T("&File")); SetMenuBar(menu_bar); // You used to have to do some casting for param 4, but now there are type-safe handlers Connect( DYNAMIC_QUIT, wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MyFrame::OnQuit) ); Connect( DYNAMIC_ABOUT, wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MyFrame::OnAbout) ); CreateStatusBar(); dataview = new wxDataViewCtrl( this, -1 ); dataview->AppendStringColumn( wxT("first"), 0 ); dataview->AppendStringColumn( wxT("second"), 1 ); dataview->AppendStringColumn( wxT("third"), 2 ); wxDataViewListStore *store = new wxDataViewListStore; store->AppendRow(); store->AppendRow(); store->AppendRow(); store->AppendRow(); dataview->AssociateStore( store ); } void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event) ) { Close(true); } void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) ) { wxMessageDialog dialog(this, _T("This demonstrates the dataview control handling"), _T("About DataView"), wxOK); dialog.ShowModal(); }