]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/dataview/mymodels.h
fixes potential crash under gatekeeper
[wxWidgets.git] / samples / dataview / mymodels.h
index 2591c86e71b400b0744dafea497ab65220d7bb98..996bd3ec6e5936b2a75ade1259182c5bf4ce02a3 100644 (file)
-/////////////////////////////////////////////////////////////////////////////\r
-// Name:        mymodels.h\r
-// Purpose:     wxDataViewCtrl wxWidgets sample\r
-// Author:      Robert Roebling\r
-// Modified by: Francesco Montorsi, Bo Yang\r
-// Created:     06/01/06\r
-// RCS-ID:      $Id$\r
-// Copyright:   (c) Robert Roebling\r
-// Licence:     wxWindows license\r
-/////////////////////////////////////////////////////////////////////////////\r
-\r
-\r
-// ----------------------------------------------------------------------------\r
-// MyMusicTreeModel\r
-// ----------------------------------------------------------------------------\r
-\r
-/*\r
-Implement this data model\r
-            Title               Artist               Year        Judgement\r
---------------------------------------------------------------------------\r
-1: My Music:\r
-    2:  Pop music\r
-        3:  You are not alone   Michael Jackson      1995        good\r
-        4:  Take a bow          Madonna              1994        good\r
-    5:  Classical music\r
-        6:  Ninth Symphony      Ludwig v. Beethoven  1824        good\r
-        7:  German Requiem      Johannes Brahms      1868        good\r
-*/\r
-\r
-class MyMusicTreeModelNode;\r
-WX_DEFINE_ARRAY_PTR( MyMusicTreeModelNode*, MyMusicTreeModelNodes );\r
-\r
-class MyMusicTreeModelNode\r
-{\r
-public:\r
-    MyMusicTreeModelNode( MyMusicTreeModelNode* parent,\r
-                      const wxString &title, const wxString &artist, int year )\r
-    {\r
-        m_parent = parent;\r
-        m_title = title;\r
-        m_artist = artist;\r
-        m_year = year;\r
-        m_quality = "good";\r
-        m_isContainer = false;\r
-    }\r
-\r
-    MyMusicTreeModelNode( MyMusicTreeModelNode* parent,\r
-                      const wxString &branch )\r
-    {\r
-        m_parent = parent;\r
-        m_title = branch;\r
-        m_year = -1;\r
-        m_isContainer = true;\r
-    }\r
-\r
-    ~MyMusicTreeModelNode()\r
-    {\r
-        size_t count = m_children.GetCount();\r
-        size_t i;\r
-        for (i = 0; i < count; i++)\r
-        {\r
-            MyMusicTreeModelNode *child = m_children[i];\r
-            delete child;\r
-        }\r
-    }\r
-\r
-    bool IsContainer()                                        { return m_isContainer; }\r
-\r
-    MyMusicTreeModelNode* GetParent()                         { return m_parent; }\r
-    MyMusicTreeModelNodes &GetChildren()                      { return m_children; }\r
-    MyMusicTreeModelNode* GetNthChild( unsigned int n )       { return m_children.Item( n ); }\r
-    void Insert( MyMusicTreeModelNode* child, unsigned int n) { m_children.Insert( child, n); }\r
-    void Append( MyMusicTreeModelNode* child )                { m_children.Add( child ); }\r
-    unsigned int GetChildCount()                              { return m_children.GetCount(); }\r
-\r
-public:\r
-    wxString            m_title;\r
-    wxString            m_artist;\r
-    int                 m_year;\r
-    wxString            m_quality;\r
-\r
-private:\r
-    MyMusicTreeModelNode   *m_parent;\r
-    MyMusicTreeModelNodes   m_children;\r
-    bool                    m_isContainer;\r
-};\r
-\r
-class MyMusicTreeModel: public wxDataViewModel\r
-{\r
-public:\r
-    MyMusicTreeModel();\r
-    ~MyMusicTreeModel()\r
-    {\r
-        delete m_root;\r
-    }\r
-\r
-    // helper method for wxLog\r
-\r
-    wxString GetTitle( const wxDataViewItem &item ) const;\r
-    int GetYear( const wxDataViewItem &item ) const;\r
-\r
-    // helper methods to change the model\r
-\r
-    void AddToClassical( const wxString &title, const wxString &artist, int year );\r
-    void Delete( const wxDataViewItem &item );\r
-\r
-    // override sorting to always sort branches ascendingly\r
-\r
-    int Compare( const wxDataViewItem &item1, const wxDataViewItem &item2,\r
-                 unsigned int column, bool ascending );\r
-\r
-    // implementation of base class virtuals to define model\r
-\r
-    virtual unsigned int GetColumnCount() const\r
-    {\r
-        return 6;\r
-    }\r
-\r
-    virtual wxString GetColumnType( unsigned int col ) const\r
-    {\r
-        if (col == 2)\r
-            return wxT("long");\r
-\r
-        return wxT("string");\r
-    }\r
-\r
-    virtual void GetValue( wxVariant &variant,\r
-                           const wxDataViewItem &item, unsigned int col ) const;\r
-    virtual bool SetValue( const wxVariant &variant,\r
-                           const wxDataViewItem &item, unsigned int col );\r
-\r
-    virtual wxDataViewItem GetParent( const wxDataViewItem &item ) const;\r
-    virtual bool IsContainer( const wxDataViewItem &item ) const;\r
-    virtual unsigned int GetChildren( const wxDataViewItem &parent, \r
-                                      wxDataViewItemArray &array ) const;\r
-\r
-    wxDataViewItem GetNinthItem() const\r
-    {\r
-       return wxDataViewItem( m_ninth );\r
-    }\r
-\r
-private:\r
-    MyMusicTreeModelNode*   m_root;\r
-    MyMusicTreeModelNode*   m_pop;\r
-    MyMusicTreeModelNode*   m_classical;\r
-    MyMusicTreeModelNode*   m_ninth;\r
-    bool                    m_classicalMusicIsKnownToControl;\r
-};\r
-\r
-\r
-// ----------------------------------------------------------------------------\r
-// MyListModel\r
-// ----------------------------------------------------------------------------\r
-\r
-class MyListModel: public wxDataViewVirtualListModel\r
-{\r
-public:\r
-    MyListModel();\r
-\r
-    // helper methods to change the model\r
-\r
-    void Prepend( const wxString &text );\r
-    void DeleteItem( const wxDataViewItem &item );\r
-    void DeleteItems( const wxDataViewItemArray &items );\r
-    void AddMany();\r
-\r
-\r
-    // implementation of base class virtuals to define model\r
-\r
-    virtual unsigned int GetColumnCount() const\r
-    {\r
-        return 3;\r
-    }\r
-\r
-    virtual wxString GetColumnType( unsigned int col ) const\r
-    {\r
-        if (col == 1)\r
-            return wxT("wxDataViewIconText");\r
-\r
-        return wxT("string");\r
-    }\r
-\r
-    virtual unsigned int GetRowCount()\r
-    {\r
-        return m_array.GetCount();\r
-    }\r
-\r
-    virtual void GetValueByRow( wxVariant &variant,\r
-                                unsigned int row, unsigned int col ) const;\r
-    virtual bool GetAttrByRow( unsigned int row, unsigned int col, wxDataViewItemAttr &attr );\r
-    virtual bool SetValueByRow( const wxVariant &variant,\r
-                                unsigned int row, unsigned int col );\r
-\r
-private:\r
-    wxArrayString    m_array;\r
-    wxIcon           m_icon;\r
-    int              m_virtualItems;\r
-};\r
-\r
+/////////////////////////////////////////////////////////////////////////////
+// Name:        mymodels.h
+// Purpose:     wxDataViewCtrl wxWidgets sample
+// Author:      Robert Roebling
+// Modified by: Francesco Montorsi, Bo Yang
+// Created:     06/01/06
+// RCS-ID:      $Id$
+// Copyright:   (c) Robert Roebling
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+
+// ----------------------------------------------------------------------------
+// MyMusicTreeModelNode: a node inside MyMusicTreeModel
+// ----------------------------------------------------------------------------
+
+class MyMusicTreeModelNode;
+WX_DEFINE_ARRAY_PTR( MyMusicTreeModelNode*, MyMusicTreeModelNodePtrArray );
+
+class MyMusicTreeModelNode
+{
+public:
+    MyMusicTreeModelNode( MyMusicTreeModelNode* parent,
+                          const wxString &title, const wxString &artist,
+                          unsigned int year )
+    {
+        m_parent = parent;
+
+        m_title = title;
+        m_artist = artist;
+        m_year = year;
+        m_quality = "good";
+
+        m_container = false;
+    }
+
+    MyMusicTreeModelNode( MyMusicTreeModelNode* parent,
+                          const wxString &branch )
+    {
+        m_parent = parent;
+
+        m_title = branch;
+        m_year = -1;
+
+        m_container = true;
+    }
+
+    ~MyMusicTreeModelNode()
+    {
+        // free all our children nodes
+        size_t count = m_children.GetCount();
+        for (size_t i = 0; i < count; i++)
+        {
+            MyMusicTreeModelNode *child = m_children[i];
+            delete child;
+        }
+    }
+
+    bool IsContainer() const
+        { return m_container; }
+
+    MyMusicTreeModelNode* GetParent()
+        { return m_parent; }
+    MyMusicTreeModelNodePtrArray& GetChildren()
+        { return m_children; }
+    MyMusicTreeModelNode* GetNthChild( unsigned int n )
+        { return m_children.Item( n ); }
+    void Insert( MyMusicTreeModelNode* child, unsigned int n)
+        { m_children.Insert( child, n); }
+    void Append( MyMusicTreeModelNode* child )
+        { m_children.Add( child ); }
+    unsigned int GetChildCount() const
+        { return m_children.GetCount(); }
+
+public:     // public to avoid getters/setters
+    wxString                m_title;
+    wxString                m_artist;
+    int                     m_year;
+    wxString                m_quality;
+
+    // TODO/FIXME:
+    // the GTK version of wxDVC (in particular wxDataViewCtrlInternal::ItemAdded)
+    // needs to know in advance if a node is or _will be_ a container.
+    // Thus implementing:
+    //   bool IsContainer() const
+    //    { return m_children.GetCount()>0; }
+    // doesn't work with wxGTK when MyMusicTreeModel::AddToClassical is called
+    // AND the classical node was removed (a new node temporary without children
+    // would be added to the control)
+    bool m_container;
+
+private:
+    MyMusicTreeModelNode          *m_parent;
+    MyMusicTreeModelNodePtrArray   m_children;
+};
+
+
+// ----------------------------------------------------------------------------
+// MyMusicTreeModel
+// ----------------------------------------------------------------------------
+
+/*
+Implement this data model
+            Title               Artist               Year        Judgement
+--------------------------------------------------------------------------
+1: My Music:
+    2:  Pop music
+        3:  You are not alone   Michael Jackson      1995        good
+        4:  Take a bow          Madonna              1994        good
+    5:  Classical music
+        6:  Ninth Symphony      Ludwig v. Beethoven  1824        good
+        7:  German Requiem      Johannes Brahms      1868        good
+*/
+
+class MyMusicTreeModel: public wxDataViewModel
+{
+public:
+    MyMusicTreeModel();
+    ~MyMusicTreeModel()
+    {
+        delete m_root;
+    }
+
+    // helper method for wxLog
+
+    wxString GetTitle( const wxDataViewItem &item ) const;
+    wxString GetArtist( const wxDataViewItem &item ) const;
+    int GetYear( const wxDataViewItem &item ) const;
+
+    // helper methods to change the model
+
+    void AddToClassical( const wxString &title, const wxString &artist,
+                         unsigned int year );
+    void Delete( const wxDataViewItem &item );
+
+    wxDataViewItem GetNinthItem() const
+    {
+       return wxDataViewItem( m_ninth );
+    }
+
+    // override sorting to always sort branches ascendingly
+
+    int Compare( const wxDataViewItem &item1, const wxDataViewItem &item2,
+                 unsigned int column, bool ascending ) const;
+
+    // implementation of base class virtuals to define model
+
+    virtual unsigned int GetColumnCount() const
+    {
+        return 6;
+    }
+
+    virtual wxString GetColumnType( unsigned int col ) const
+    {
+        if (col == 2)
+            return wxT("long");
+
+        return wxT("string");
+    }
+
+    virtual void GetValue( wxVariant &variant,
+                           const wxDataViewItem &item, unsigned int col ) const;
+    virtual bool SetValue( const wxVariant &variant,
+                           const wxDataViewItem &item, unsigned int col );
+
+    virtual bool IsEnabled( const wxDataViewItem &item,
+                            unsigned int col ) const;
+
+    virtual wxDataViewItem GetParent( const wxDataViewItem &item ) const;
+    virtual bool IsContainer( const wxDataViewItem &item ) const;
+    virtual unsigned int GetChildren( const wxDataViewItem &parent,
+                                      wxDataViewItemArray &array ) const;
+
+private:
+    MyMusicTreeModelNode*   m_root;
+
+    // pointers to some "special" nodes of the tree:
+    MyMusicTreeModelNode*   m_pop;
+    MyMusicTreeModelNode*   m_classical;
+    MyMusicTreeModelNode*   m_ninth;
+
+    // ??
+    bool                    m_classicalMusicIsKnownToControl;
+};
+
+
+// ----------------------------------------------------------------------------
+// MyListModel
+// ----------------------------------------------------------------------------
+
+class MyListModel: public wxDataViewVirtualListModel
+{
+public:
+    enum
+    {
+        Col_EditableText,
+        Col_IconText,
+        Col_TextWithAttr,
+        Col_Custom,
+        Col_Max
+    };
+
+    MyListModel();
+
+    // helper methods to change the model
+
+    void Prepend( const wxString &text );
+    void DeleteItem( const wxDataViewItem &item );
+    void DeleteItems( const wxDataViewItemArray &items );
+    void AddMany();
+
+
+    // implementation of base class virtuals to define model
+
+    virtual unsigned int GetColumnCount() const
+    {
+        return Col_Max;
+    }
+
+    virtual wxString GetColumnType( unsigned int col ) const
+    {
+        if (col == Col_IconText)
+            return wxT("wxDataViewIconText");
+
+        return wxT("string");
+    }
+
+    virtual void GetValueByRow( wxVariant &variant,
+                                unsigned int row, unsigned int col ) const;
+    virtual bool GetAttrByRow( unsigned int row, unsigned int col,
+                               wxDataViewItemAttr &attr ) const;
+    virtual bool SetValueByRow( const wxVariant &variant,
+                                unsigned int row, unsigned int col );
+
+private:
+    wxArrayString    m_textColValues;
+    wxArrayString    m_iconColValues;
+    wxIcon           m_icon[2];
+};
+
+// ----------------------------------------------------------------------------
+// MyListStoreDerivedModel
+// ----------------------------------------------------------------------------
+
+class MyListStoreDerivedModel : public wxDataViewListStore
+{
+public:
+    virtual bool IsEnabledByRow(unsigned int row, unsigned int col) const;
+};