+
+ // constructor
+
+ MyMusicModel()
+ {
+ m_root = new MyMusicModelNode( NULL, "My Music" );
+ m_pop = new MyMusicModelNode( m_root, "Pop music" );
+ m_root->Append( m_pop );
+ m_pop->Append( new MyMusicModelNode( m_pop,
+ "You are not alone", "Michael Jackson", "1995" ) );
+ m_pop->Append( new MyMusicModelNode( m_pop,
+ "Take a bow", "Madonna", "1994" ) );
+ m_classical = new MyMusicModelNode( m_root, "Classical music" );
+ m_root->Append( m_classical );
+ m_classical->Append( new MyMusicModelNode( m_classical,
+ "Ninth symphony", "Ludwig van Beethoven", "1824" ) );
+ m_classical->Append( new MyMusicModelNode( m_classical,
+ "German Requiem", "Johannes Brahms", "1868" ) );
+ m_classicalMusicIsKnownToControl = false;
+ }
+
+ // helper methods to change the model
+
+ void AddToClassical( const wxString &title, const wxString &artist, const wxString &year )
+ {
+ // add to data
+ MyMusicModelNode *child_node =
+ new MyMusicModelNode( m_classical, title, artist, year );
+
+ m_classical->Append( child_node );
+
+ if (m_classicalMusicIsKnownToControl)
+ {
+ // notify control
+ wxDataViewItem child( (void*) child_node );
+ wxDataViewItem parent( (void*) m_classical );
+ ItemAdded( parent, child );
+ }
+ }
+
+ void Delete( const wxDataViewItem &item )
+ {
+ MyMusicModelNode *node = (MyMusicModelNode*) item.GetID();
+ wxDataViewItem parent( node->GetParent() );
+
+ // notify control
+ ItemDeleted( parent, item );
+ //We must delete the node after we call ItemDeleted
+ //The reason is that:
+ //When we use wxSortedArray, the array find a node through binary search for speed.
+ //And when the array is searching for some node, it call the model's compare function.
+ //The compare function need the node to be compared. So we should delete the node later, here.
+ node->GetParent()->GetChildren().Remove( node );
+ delete node;
+ }
+
+ // override sorting to always sort branches ascendingly
+
+ int Compare( const wxDataViewItem &item1, const wxDataViewItem &item2,
+ unsigned int column, bool ascending )
+ {
+ if (IsContainer(item1) && IsContainer(item2))
+ {
+ wxVariant value1,value2;
+ GetValue( value1, item1, 0 );
+ GetValue( value2, item2, 0 );
+
+ wxString str1 = value1.GetString();
+ wxString str2 = value2.GetString();
+ int res = str1.Cmp( str2 );
+ if (res) return res;
+
+ // items must be different
+ unsigned long litem1 = (unsigned long) item1.GetID();
+ unsigned long litem2 = (unsigned long) item2.GetID();
+
+ return litem1-litem2;
+ }
+
+ return wxDataViewModel::Compare( item1, item2, column, ascending );
+ }
+
+ // implementation of base class virtuals to define model