// BrowseView.cpp : implementation file // #include "stdafx.h" #include "viewex.h" #include "bwsview.h" #include "schclss.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define BUFF_SIZE 0xFFFFL //#define BUFF_SIZE 0x1000L ///////////////////////////////////////////////////////////////////////////// // CBrowseView IMPLEMENT_DYNCREATE(CBrowseView, CTreeView) /*********************************************************** Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ CBrowseView::CBrowseView() { BOOL bOK; DWORD dwObjectType; CBitmap* pBitmap; UINT imageID; m_pImageList = new CImageList( ); if( NULL != m_pImageList ) { bOK = m_pImageList->Create( 18, 18, FALSE, 20, 20 ); if( bOK ) { for( dwObjectType = FIRST; dwObjectType < LIMIT ; dwObjectType++) { pBitmap = new CBitmap; imageID = GetBitmapImageId ( dwObjectType ); pBitmap->LoadBitmap( imageID ); m_pImageList->Add( pBitmap, (COLORREF)0L ); pBitmap->DeleteObject( ); delete pBitmap; } } } } /*********************************************************** Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ void CBrowseView::OnInitialUpdate() { HTREEITEM hItem; CMainDoc* pDoc; DWORD dwStyle; BOOL bRez; COleDsObject* pObject; m_bDoNotUpdate = TRUE; pDoc = (CMainDoc*) GetDocument( ); dwStyle = TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS; bRez = GetTreeCtrl( ).ModifyStyle( 0L, dwStyle ); GetTreeCtrl( ).SetImageList( m_pImageList, TVSIL_NORMAL ); GetTreeCtrl( ).DeleteAllItems( ); GetTreeCtrl( ).SetIndent( 20 ); pObject = pDoc->GetCurrentObject( ); hItem = GetTreeCtrl( ).InsertItem( pObject->GetItemName( ) ); GetTreeCtrl( ).SetItemData( hItem, pDoc->GetToken( &pObject ) ); GetTreeCtrl( ).SetItemImage( hItem, pObject->GetType( ), pObject->GetType( ) ); m_bDoNotUpdate = FALSE; CTreeView::OnInitialUpdate( ); } /*********************************************************** Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ CBrowseView::~CBrowseView() { delete m_pImageList; } BEGIN_MESSAGE_MAP(CBrowseView, CTreeView) //{{AFX_MSG_MAP(CBrowseView) ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelChanged) ON_NOTIFY_REFLECT(TVN_ITEMEXPANDED, OnItemExpanded) ON_COMMAND(IDM_ADD, OnAddItem) ON_COMMAND(IDM_DELETE, OnDeleteItem) ON_COMMAND(IDM_MOVEITEM, OnMoveItem) ON_COMMAND(IDM_COPYITEM, OnCopyItem) ON_COMMAND(IDM_REFRESH, OnRefresh) //}}AFX_MSG_MAP END_MESSAGE_MAP() CMainDoc* sgpDoc; int __cdecl QSortCompare( const void* pVal1, const void* pVal2 ) { COleDsObject* pObject1; COleDsObject* pObject2; CString* pString1; CString* pString2; int nDiff; pObject1 = sgpDoc->GetObject( (void*)pVal1 ); pObject2 = sgpDoc->GetObject( (void*)pVal2 ); nDiff = pObject1->GetType( ) - pObject2->GetType( ); if( nDiff ) return nDiff; pString1 = pObject1->PtrGetItemName( ); pString2 = pObject2->PtrGetItemName( ); return pString1->Compare( (LPCTSTR)( pString2->GetBuffer( 128 ) ) ); } /*********************************************************** Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ void CBrowseView::SortChildItemList( DWORD* pChildTokens, DWORD dwCount ) { sgpDoc = (CMainDoc*)GetDocument( ); qsort( (void*)pChildTokens, dwCount, sizeof(DWORD), QSortCompare ); } ///////////////////////////////////////////////////////////////////////////// // CBrowseView diagnostics #ifdef _DEBUG /*********************************************************** Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ void CBrowseView::AssertValid() const { CTreeView::AssertValid(); } /*********************************************************** Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ void CBrowseView::Dump(CDumpContext& dc) const { CTreeView::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CBrowseView message handlers /*********************************************************** Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ void CBrowseView::OnSelChanged(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; // TODO: Add your control notification handler code here HTREEITEM hTreeItem, hChildItem;; CString strItemName; CMainDoc* pDoc; DWORD dwIter; DWORD dwToken; DWORD* pTokens = NULL; DWORD dwNumItems = 0L; *pResult = 0; if( m_bDoNotUpdate ) { return; } hTreeItem = GetTreeCtrl( ).GetSelectedItem( ); hChildItem = TVI_LAST; if( NULL != hTreeItem ) { dwToken = (DWORD)GetTreeCtrl( ).GetItemData( hTreeItem ); pDoc = (CMainDoc*) GetDocument( ); ASSERT( NULL != pDoc ); if( NULL != pDoc ) { HCURSOR oldCursor, newCursor; newCursor = LoadCursor( NULL, IDC_WAIT ); oldCursor = SetCursor( newCursor ); // the item has children support ??? pTokens = (DWORD*) malloc( sizeof(DWORD) * BUFF_SIZE ); if( !GetTreeCtrl( ).ItemHasChildren( hTreeItem ) ) { dwNumItems = pDoc->GetChildItemList( dwToken, pTokens, BUFF_SIZE ); if( dwNumItems ) { // siaply children items SortChildItemList( pTokens, dwNumItems ); for( dwIter = 0; dwIter < dwNumItems ; dwIter++ ) { COleDsObject* pObject; CString* pName; DWORD dwType; TCHAR szName[ 256 ]; pObject = pDoc->GetObject( &pTokens[ dwIter ] ); dwType = pObject->GetType( ); pName = pObject->PtrGetItemName( ); _ultot( dwIter + 1, szName, 10 ); _tcscat( szName, _T(") ") ); _tcscat( szName, pName->GetBuffer( 128 ) ); /*hChildItem = GetTreeCtrl( ).InsertItem( pName->GetBuffer( 128 ), hTreeItem, hChildItem ); */ hChildItem = GetTreeCtrl( ).InsertItem( szName, hTreeItem, hChildItem ); GetTreeCtrl( ).SetItemData( hChildItem, pTokens[ dwIter ] ); GetTreeCtrl( ).SetItemImage( hChildItem, dwType, dwType ); } } } if( NULL != pTokens ) { free((void*)pTokens); } pDoc->SetCurrentItem( dwToken ); SetCursor( oldCursor ); } } } /*********************************************************** Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ void CBrowseView::OnItemExpanded(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; HTREEITEM hItem; // TODO: Add your control notification handler code here hItem = pNMTreeView->itemNew.hItem; if( !( pNMTreeView->itemNew.state & TVIS_EXPANDED ) ) { // this should mean that the item was unexpanded. // We should delete its children. /*hChildItem = GetTreeCtrl( ).GetChildItem( hItem ); while( NULL != hChildItem ) { bRez = GetTreeCtrl( ).DeleteItem( hChildItem ); ASSERT( bRez ); hChildItem = GetTreeCtrl( ).GetChildItem( hItem ); } */ } else { /*dwItemData = GetTreeCtrl( ).GetItemData( hItem ); GetItemPath( hItem, strItemName ); pDoc = (CMainDoc*) GetDocument( ); ASSERT( NULL != pDoc ); if( NULL != pDoc ) { HCURSOR oldCursor, newCursor; newCursor = LoadCursor( NULL, IDC_WAIT ); oldCursor = SetCursor( newCursor ); // the item has children support ??? lpItemsName = (LPWSTR) malloc( 0x40000L ); lpItemsType = (LPDWORD) malloc( 0x20000L ); bRez = pDoc->GetChildItemList( strItemName, dwItemData, lpItemsName, lpItemsType, &dwNumItems, 0x40000L ); if( bRez ) { // siaply children items lpName = lpItemsName; for( nIter = 0; nIter < dwNumItems ; nIter++ ) { hChildItem = GetTreeCtrl( ).InsertItem( lpName, hItem ); GetTreeCtrl( ).SetItemData( hChildItem, lpItemsType[ nIter ] ); lpName = lpName + ( _tcslen( lpName ) + 1 ); } } if( NULL != lpItemsName ) { free( lpItemsName ); } if( NULL != lpItemsType ) { free( lpItemsType ); } //pDoc->SetItemName( strItemName, dwItemData ); SetCursor( oldCursor ); } */ } *pResult = 0; } /*********************************************************** Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ void CBrowseView::OnAddItem() { // TODO: Add your command handler code here CMainDoc* pDoc; COleDsObject* pObject; HRESULT hResult; pDoc = (CMainDoc*) GetDocument( ); pObject = pDoc->GetCurrentObject( ); if( NULL == pObject ) return; if( pObject->AddItemSuported( ) ) { pObject->CreateTheObject( ); hResult = pObject->AddItem( ); pObject->ReleaseIfNotTransient( ); if( FAILED( hResult ) ) { AfxMessageBox( OleDsGetErrorText( hResult ) ); } else { pDoc->DeleteAllItems( ); OnInitialUpdate( ); } } } /*********************************************************** Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ void CBrowseView::OnDeleteItem() { // TODO: Add your command handler code here CMainDoc* pDoc; COleDsObject* pObject; HRESULT hResult; pDoc = (CMainDoc*) GetDocument( ); pObject = pDoc->GetCurrentObject( ); if( NULL == pObject ) return; if( pObject->DeleteItemSuported( ) ) { pObject->CreateTheObject( ); hResult = pObject->DeleteItem( ); pObject->ReleaseIfNotTransient( ); if( FAILED( hResult ) ) { AfxMessageBox( OleDsGetErrorText( hResult ) ); } else { pDoc->DeleteAllItems( ); OnInitialUpdate( ); } } } /*********************************************************** Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ void CBrowseView::OnMoveItem() { // TODO: Add your command handler code here CMainDoc* pDoc; COleDsObject* pObject; HRESULT hResult; pDoc = (CMainDoc*) GetDocument( ); pObject = pDoc->GetCurrentObject( ); if( NULL == pObject ) return; if( pObject->MoveItemSupported( ) ) { hResult = pObject->MoveItem( ); if( FAILED( hResult ) ) { AfxMessageBox( OleDsGetErrorText( hResult ) ); } else { OnRefresh( ); } } } /*********************************************************** Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ void CBrowseView::OnCopyItem() { // TODO: Add your command handler code here CMainDoc* pDoc; COleDsObject* pObject; HRESULT hResult; pDoc = (CMainDoc*) GetDocument( ); pObject = pDoc->GetCurrentObject( ); if( NULL == pObject ) return; if( pObject->CopyItemSupported( ) ) { hResult = pObject->CopyItem( ); if( FAILED( hResult ) ) { AfxMessageBox( OleDsGetErrorText( hResult ) ); } else { OnRefresh( ); } } } /*********************************************************** Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ void CBrowseView::OnRefresh() { // TODO: Add your command handler code here CMainDoc* pDoc; pDoc = (CMainDoc*)GetDocument( ); pDoc->DeleteAllItems( ); OnInitialUpdate( ); } /*********************************************************** Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ void CBrowseView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) { HTREEITEM hTreeItem; // TODO: Add your specialized code here and/or call the base class CTreeView::OnUpdate( pSender, lHint, pHint ); hTreeItem = GetTreeCtrl( ).GetSelectedItem( ); if( NULL == hTreeItem ) { hTreeItem = GetTreeCtrl( ).GetRootItem( ); GetTreeCtrl( ).SelectItem( hTreeItem ); } }