]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/dataview/dataview.cpp
Move wxMBConv_cf out of strconv.cpp and into strconv_cf.(cpp|h) by forking the files...
[wxWidgets.git] / samples / dataview / dataview.cpp
index 22538962f95f7270ca67582fd6cfbfb413d5b9c3..9a80b8196a7dbdfcff89b2db92112d3e69e6ae2a 100644 (file)
@@ -1,8 +1,8 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        dataview.cpp
-// Purpose:     DataVewCtrl  wxWidgets sample
+// Purpose:     wxDataViewCtrl wxWidgets sample
 // Author:      Robert Roebling
-// Modified by:
+// Modified by: Francesco Montorsi
 // Created:     06/01/06
 // RCS-ID:      $Id$
 // Copyright:   (c) Robert Roebling
 #endif
 
 #ifndef WX_PRECOMP
-#include "wx/wx.h"
+    #include "wx/wx.h"
 #endif
 
+#include "wx/datetime.h"
+#include "wx/splitter.h"
+#include "wx/aboutdlg.h"
+#include "wx/choicdlg.h"
+#include "wx/numdlg.h"
+#include "wx/dataview.h"
+#include "wx/spinctrl.h"
+
 #ifndef __WXMSW__
-#include "mondrian.xpm"
+    #include "../sample.xpm"
 #endif
 
-// -------------------- wxDataViewControl -------------------- 
-
-// wxDataViewStore
+#include "null.xpm"
 
-class wxDataViewStore
-{
-public:
-    wxDataViewStore() { }
-    virtual ~wxDataViewStore() { }
-    
-protected:
-    DECLARE_NO_COPY_CLASS(wxDataViewStore)
-};
 
+#define DEFAULT_ALIGN                   wxALIGN_LEFT
+#define DATAVIEW_DEFAULT_STYLE          (wxDV_MULTIPLE|wxDV_HORIZ_RULES|wxDV_VERT_RULES)
 
-// wxDataViewListStoreBase
 
-class wxDataViewListStoreBase: public wxDataViewStore
-{
-public:
-    wxDataViewListStoreBase() { }
 
-    virtual bool AppendRow() = 0;
-    
-protected:
-    DECLARE_NO_COPY_CLASS(wxDataViewListStoreBase)
-};
-
-
-// wxDataViewCtrlBase
+// -------------------------------------
+// MyMusicModel
+// -------------------------------------
 
-class wxDataViewCtrlBase: public wxControl
+/*
+Implement this data model
+            Title               Artist               Year
+-------------------------------------------------------------
+1: My Music:
+    2:  Pop music
+        3:  You are not alone   Michael Jackson      1995
+        4:  Take a bow          Madonna              1994
+    5:  Classical music
+        6:  Ninth Symphony      Ludwig v. Beethoven  1824
+        7:  German Requiem      Johannes Brahms      1868
+*/
+
+
+class MyMusicModel: public wxDataViewModel
 {
 public:
-    wxDataViewCtrlBase();
-
-    // Define public API here
+    MyMusicModel() {}
     
-    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__
+    virtual unsigned int GetColumnCount() const
+    {
+        return 3;
+    }
 
-#include "wx/gtk/private.h"
+    virtual wxString GetColumnType( unsigned int col ) const
+    {
+        return "string";
+    }
 
-class wxDataViewListStore: public wxDataViewListStoreBase
-{
-public:
-    wxDataViewListStore();
-    
-    // interface
-    virtual bool AppendRow();
-    
-    // implementation
-    GtkListStore* GetGtkListStore() { return m_store; }
-    
-private:
-    GtkListStore  *m_store;
+    virtual void GetValue( wxVariant &variant, 
+                           const wxDataViewItem &item, unsigned int col ) const
+    {
+        variant = wxString("");
+        int ID = item.GetID();
+        switch (ID)
+        {
+            case 1: if (col == 0) variant = wxString("My Music"); break;
+            case 2: if (col == 0) variant = wxString("Pop music"); break;
+            case 5: if (col == 0) variant = wxString("Classical music"); break;
+            case 3:
+            {
+                switch (col)
+                {
+                    case 0: variant = wxString("You are not alone"); break;
+                    case 1: variant = wxString("Michael Jackson"); break;
+                    case 2: variant = wxString("1995");
+                }
+            }
+            break;
+            case 4:
+            {
+                switch (col)
+                {
+                    case 0: variant = wxString("Take a bow"); break;
+                    case 1: variant = wxString("Madonna"); break;
+                    case 2: variant = wxString("1994");
+                }
+            }
+            break;
+            case 6:
+            {
+                switch (col)
+                {
+                    case 0: variant = wxString("Ninth symphony"); break;
+                    case 1: variant = wxString("Ludwig v. Beethoven"); break;
+                    case 2: variant = wxString("1824");
+                }
+            }
+            break;
+            case 7:
+            {
+                switch (col)
+                {
+                    case 0: variant = wxString("German requiem"); break;
+                    case 1: variant = wxString("Johannes Brahms"); break;
+                    case 2: variant = wxString("1868");
+                }
+            }
+            break;
+        }
+            
+    }
 
-protected:
-    DECLARE_NO_COPY_CLASS(wxDataViewListStore)
-};
+    virtual bool SetValue( const wxVariant &variant, 
+                           const wxDataViewItem &item, unsigned int col )
+    {
+        // readonly
+        return true;
+    }
 
-class wxDataViewCtrl: public wxDataViewCtrlBase
-{
-public:
-    wxDataViewCtrl() 
+    virtual bool HasChildren( const wxDataViewItem &item ) const
     {
-        Init();
+        int ID = item.GetID();
+        return ((ID == 1) || (ID == 2) || (ID == 5));
     }
     
-    wxDataViewCtrl( wxWindow *parent, wxWindowID id,
-           const wxPoint& pos = wxDefaultPosition,
-           const wxSize& size = wxDefaultSize, long style = 0,
-           const wxValidator& validator = wxDefaultValidator )
+    virtual int GetChildCount( const wxDataViewItem &item ) const
     {
-        Create(parent, id, pos, size, style, validator );
+        int ID = item.GetID();
+        switch (ID)
+        {
+            case 1: return 2;
+            case 2: return 2;
+            case 5: return 2;
+        }
+        return 0;
     }
-
-    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 ))
+    virtual wxDataViewItem GetParent( const wxDataViewItem &child ) const
     {
-        wxFAIL_MSG( wxT("wxDataViewCtrl creation failed") );
-        return FALSE;
+        int ID = child.GetID();
+        switch (ID)
+        {
+            case 2:
+            case 5: return wxDataViewItem( 1 );
+            case 3:
+            case 4: return wxDataViewItem( 2 );
+            case 6:
+            case 7: return wxDataViewItem( 5 );
+        }
+        
+        return wxDataViewItem(0);
     }
+    virtual wxDataViewItem GetFirstChild( const wxDataViewItem &parent ) const
+    {
+        int ID = parent.GetID();
+        switch (ID)
+        {
+            case 1: return wxDataViewItem( 2 );
+            case 2: return wxDataViewItem( 3 );
+            case 5: return wxDataViewItem( 6 );
+        }
+        
+        return wxDataViewItem(0);
+    }
+    virtual wxDataViewItem GetNextSibling( const wxDataViewItem &item ) const
+    {
+        int ID = item.GetID();
+        switch (ID)
+        {
+            case 2: return wxDataViewItem( 5 );
+            case 3: return wxDataViewItem( 4 );
+            case 6: return wxDataViewItem( 7 );
+        }
+        
+        return wxDataViewItem(0);
+    }
+    virtual wxDataViewItem GetNthChild(  const wxDataViewItem &parent, unsigned int n ) const
+    {
+        if (!parent.IsOk())
+        {
+            // root node
+            if (n == 0)
+                return wxDataViewItem( 1 );
+                
+            return wxDataViewItem( 0 );
+        }
     
-    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()) );
+        int ID = parent.GetID();
+        switch (ID)
+        {
+            case 1:
+            {
+                if (n == 0) return wxDataViewItem( 2 );
+                else if (n == 1) return wxDataViewItem( 5 );
+            }
+            break;
+            case 2: 
+            {
+                if (n == 0) return wxDataViewItem( 3 );
+                else if (n == 1) return wxDataViewItem( 4 );
+            }
+            break;
+            case 5:
+            {
+                if (n == 0) return wxDataViewItem( 6 );
+                else if (n == 1) return wxDataViewItem( 7 );
+            }
+            break;
+        }
     
-    return true;
-}
-
-#endif
+        return wxDataViewItem(0);
+    }
+};
 
-// -------------------- wxDataViewControl -------------------- 
+// -------------------------------------
+// MyApp
+// -------------------------------------
 
 class MyApp: public wxApp
 {
 public:
     bool OnInit(void);
+    int OnExit();
 };
 
-class MyFrame: public wxFrame
+// -------------------------------------
+// MyFrame
+// -------------------------------------
+
+class MyFrame : public wxFrame
 {
 public:
     MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h);
@@ -257,77 +251,86 @@ public:
 public:
     void OnQuit(wxCommandEvent& event);
     void OnAbout(wxCommandEvent& event);
-    
+
+private:
+    wxDataViewCtrl* m_dataview;
+
 private:
-    wxDataViewCtrl* dataview;
+    DECLARE_EVENT_TABLE()
 };
 
-// ID for the menu commands
-#define DYNAMIC_QUIT   wxID_EXIT
-#define DYNAMIC_ABOUT  wxID_ABOUT
+// -------------------------------------
+// MyApp
+// -------------------------------------
 
-// Create a new application object
-IMPLEMENT_APP  (MyApp)
+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);
+    if ( !wxApp::OnInit() )
+        return false;
 
-    // Show the frame
+    // build the first frame
+    MyFrame *frame = 
+        new MyFrame(NULL, wxT("wxDataViewCtrl feature test"), 10, 10, 800, 340);
     frame->Show(true);
 
     SetTopWindow(frame);
-
     return true;
 }
 
+int MyApp::OnExit()
+{
+    return 0;
+}
+
+
 // -------------------------------------
 // MyFrame
 // -------------------------------------
 
-// My frame constructor
+enum
+{
+    // file menu
+    ID_ABOUT = wxID_ABOUT,
+    ID_EXIT = wxID_EXIT,
+};
+
+BEGIN_EVENT_TABLE(MyFrame, wxFrame)
+    EVT_MENU( ID_ABOUT, MyFrame::OnAbout )
+    EVT_MENU( ID_EXIT, MyFrame::OnQuit )
+END_EVENT_TABLE()
+
 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
+    SetIcon(wxICON(sample));
+
+    // build the menus:
 
-    // Make a menubar
     wxMenu *file_menu = new wxMenu;
+    file_menu->Append(ID_ABOUT, "&About");
+    file_menu->AppendSeparator();
+    file_menu->Append(ID_EXIT, "E&xit");
 
-    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"));
+    menu_bar->Append(file_menu, "&File");
+
     SetMenuBar(menu_bar);
+    CreateStatusBar();
 
-    // 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) );
+    m_dataview = new wxDataViewCtrl( this, wxID_ANY, wxDefaultPosition,
+                                     wxDefaultSize );
 
-    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 );
+    wxObjectDataPtr<MyMusicModel> model(new MyMusicModel);
+    m_dataview->AssociateModel( model.get() );
+
+    m_dataview->AppendTextColumn( "Title", 0, wxDATAVIEW_CELL_INERT, 200, 
+                                     DEFAULT_ALIGN );
+    m_dataview->AppendTextColumn( "Artist", 1, wxDATAVIEW_CELL_INERT, 200,
+                                     DEFAULT_ALIGN );
+    m_dataview->AppendTextColumn( "Year", 2, wxDATAVIEW_CELL_INERT, 50,
+                                     DEFAULT_ALIGN );
 }
 
 void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event) )
@@ -337,10 +340,11 @@ void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event) )
 
 void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
 {
-    wxMessageDialog dialog(this, _T("This demonstrates the dataview control handling"),
-        _T("About DataView"), wxOK);
+    wxAboutDialogInfo info;
+    info.SetName(_("DataView sample"));
+    info.SetDescription(_("This sample demonstrates the dataview control handling"));
+    info.SetCopyright(_T("(C) 2007 Robert Roebling"));
 
-    dialog.ShowModal();
+    wxAboutBox(info);
 }
 
-