///////////////////////////////////////////////////////////////////////////// // Name: No names yet. // Purpose: Contrib. demo // Author: Aleksandras Gluchovas // Modified by: // Created: 23/11/98 // RCS-ID: $Id$ // Copyright: 1998 (c) Aleksandras Gluchovas // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ #pragma implementation "wxinifo.cpp" #pragma interface "wxinifo.cpp" #endif // 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 #include "wx/hash.h" #include "wxinfo.h" inline static void expand_item( wxTreeCtrl* pTree, wxTreeItemId& itemId ) { pTree->Expand( itemId ); } void wxCreateClassInfoTree( wxTreeCtrl* pTree, wxTreeItemId parentBranchId, long classImageNo ) { expand_item( pTree, parentBranchId ); wxHashTable hash; wxList lst; // collect all classes into list { wxClassInfo* pCur = wxClassInfo::GetFirst(); wxClassInfo::InitializeClasses(); while( pCur ) { lst.Append( (wxObject*)pCur ); pCur = pCur->GetNext(); } } wxClassInfo::InitializeClasses(); // reflect class-hierarchy into the tree nodes int nHanged; do { nHanged = 0; wxNode* pCur = lst.First(); // repeat passes through class list, untill all of // the class items are "hanged" onto their parent-items in the tree while( pCur ) { wxClassInfo& info = *((wxClassInfo*)pCur->Data()); if ( info.GetBaseClass1() == NULL ) { // parentless classes are put into the root branch wxTreeItemId* pId = new wxTreeItemId(); *pId = pTree->AppendItem( parentBranchId, info.GetClassName(), classImageNo ); expand_item( pTree, *pId ); // "remember" it hash.Put( long(&info), (wxObject*)pId ); // class is "hanged", remove it from the list wxNode* pTmp = pCur; pCur = pCur->Next(); delete pTmp; ++nHanged; } else { wxTreeItemId* pParentId = (wxTreeItemId*)hash.Get( (long)info.GetBaseClass1() ); if ( pParentId != NULL ) { wxTreeItemId* pId = new wxTreeItemId(); *pId = pTree->AppendItem( *pParentId, info.GetClassName(), classImageNo ); expand_item( pTree, *pId ); hash.Put( long(&info), (wxObject*)pId ); wxNode* pTmp = pCur; pCur = pCur->Next(); // class is "hanged", remove it from the list delete pTmp; ++nHanged; } else { // otherwise there's a parent, but it's not in the tree yet... // hope to "hang" it in the subsequent passes pCur = pCur->Next(); } } } } while( nHanged != 0 ); } void wxCreateSerializerInfoTree( wxTreeCtrl* pTree, wxTreeItemId parentBranchId, long classImageNo ) { expand_item( pTree, parentBranchId ); wxSerializerInfo::InitializeSerializers(); // FOR NOW:: no hierarchy - one branch wxSerializerInfo* pCur = wxSerializerInfo::first; while( pCur ) { wxString fullName = pCur->className + wxString( "Serializer" ); pTree->AppendItem( parentBranchId, fullName, classImageNo ); pCur = pCur->next; } }