wxDataViewItem ProjectViewModel::GetParent( const wxDataViewItem& item ) const { if ( !item.IsOk() ) { return wxDataViewItem( 0 ); } ProjectViewModelNode *node = static_cast< ProjectViewModelNode* >( item.GetID() ); if ( !node || node == m_RootNode.Ptr() || !node->GetParent() || node->GetParent() == m_RootNode.Ptr() ) { return wxDataViewItem( 0 ); } return wxDataViewItem( (void*) node->GetParent() ); }
void ProjectViewModel::RemoveItem( const wxDataViewItem& item ) { ProjectViewModelNode *node = static_cast< ProjectViewModelNode* >( item.GetID() ); if ( !node ) { return; } // remove all of childNode's children while( node->GetChildren().size() > 0 ) { RemoveItem( wxDataViewItem( (void*)( *node->GetChildren().begin() ) ) ); } // remove it from the multimap for ( MM_ProjectViewModelNodesByPath::iterator lower = m_MM_ProjectViewModelNodesByPath.lower_bound( node->GetPath() ), upper = m_MM_ProjectViewModelNodesByPath.upper_bound( node->GetPath() ); lower != upper && lower != m_MM_ProjectViewModelNodesByPath.end(); ++lower ) { if ( lower->second == node ) { m_MM_ProjectViewModelNodesByPath.erase( lower ); break; } } if ( node == m_RootNode ) { return; } // Remove from the parent's childern // this should free the node if there are no more references to it ProjectViewModelNode *parentNode = node->GetParent(); if ( parentNode ) { parentNode->GetChildren().erase( node ); } if ( parentNode == m_RootNode.Ptr() ) { parentNode = NULL; } ItemDeleted( wxDataViewItem( (void*) parentNode ), item ); }