www.gusucode.com > VC++编写的SQL服务端和客户端源码程序 > VC++编写的SQL服务端和客户端源码程序\code\Server\FileBar.cpp
//Download by http://www.NewXing.com // FileBar.cpp : implementation file ///////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "miniSQL.h" #include "FileBar.h" #include "Resource.h" #include "table.h" //#include "MSLDoc.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif extern CMiniSQLApp theApp; ///////////////////////////////////////////////////////////////////////////// // CFileBar CFileBar::CFileBar() { } CFileBar::~CFileBar() { } #define IDC_TREE_CTRL 1000 BEGIN_MESSAGE_MAP(CFileBar, CControlBar) //{{AFX_MSG_MAP(CFileBar) ON_NOTIFY_REFLECT(TVN_ITEMEXPANDING, OnItemexpanding) ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged) ON_WM_CREATE() ON_WM_WINDOWPOSCHANGED() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CFileBar message handlers int CFileBar::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CControlBar::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here if( !m_TreeCtrl.Create(WS_CHILD | WS_VISIBLE | WS_THICKFRAME | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT, CRect(0,0,0,0), this ,IDC_TREE_CTRL) ) { TRACE0("Failed to create view for CFileBar\n"); return -1; } //////////////////////////////////////////////////////////////// m_TreeCtrl.SetMenuID(IDR_POPUP1, IDR_POPUP2); m_TreeCtrl.ModifyStyleEx(0, WS_EX_CLIENTEDGE | WS_EX_WINDOWEDGE); m_ImageList.Create (IDB_IMAGE_FILE, 16, 1, RGB(0,255,0)); m_TreeCtrl.SetImageList (&m_ImageList, TVSIL_NORMAL); //Construct the trees____ hitem0 = m_TreeCtrl.InsertItem( "MiniSQL关系库", 3, 3 ); m_TreeCtrl.SetItemState( hitem0, TVIS_BOLD, TVIS_BOLD ); PreInsertTree(); m_TreeCtrl.Expand (hitem0, TVE_EXPAND); return 0; } void CFileBar::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos) { CCJControlBar::OnWindowPosChanged(lpwndpos); // TODO: Add your message handler code here if (IsFloating()) { m_TreeCtrl.MoveWindow( 5, 5, lpwndpos->cx-10, lpwndpos->cy-10 ); } else if (IsHorzDocked()) { m_TreeCtrl.MoveWindow( 17, 3, lpwndpos->cx-25, lpwndpos->cy-17 ); } else { m_TreeCtrl.MoveWindow( 3, 17, lpwndpos->cx-17, lpwndpos->cy-30 ); } } BOOL CFileBar::add_item(Item &item) { if( item_list.IsEmpty() ) { item_list.AddHead(item); return TRUE; } int flag=0; POSITION pos = item_list.GetHeadPosition(); for(int i=0; i<item_list.GetCount(); i++) if( item_list.GetNext(pos).name == item.name ) { flag = 1;break; } if(flag) return FALSE; else { item_list.AddTail(item); return TRUE; } } void CFileBar::insert_tree(Item &item, HTREEITEM hitem){ if( add_item(item) ){ int n = item.name.GetLength(); m_TreeCtrl.InsertItem( item.name.Left(n-4), 4, 4, hitem, TVI_LAST ); } } void CFileBar::PreInsertTree() { WIN32_FIND_DATA FileData; HANDLE hFind; Item *temp; CString dir = theApp.dir; //char ch[50]; if( dir.GetLength() ){ hFind = ::FindFirstFile( dir + "\\*.msl", &FileData); if(hFind != INVALID_HANDLE_VALUE){ temp = new Item; temp->path = (CString)dir + '\\' + FileData.cFileName; //AfxMessageBox(temp->path); //::GetFileTitle(temp->path, ch, 50); //temp->name = ch; temp->name = FileData.cFileName; insert_tree(*temp, hitem0); delete temp; temp = NULL; while( ::FindNextFile(hFind, &FileData) ){ temp = new Item; temp->path = (CString)dir + '\\' + FileData.cFileName; //::GetFileTitle(temp->path, ch, 50); //temp->name = ch; temp->name = FileData.cFileName; insert_tree(*temp, hitem0); delete temp; temp = NULL; } } } } void CFileBar::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; // TODO: Add your control notification handler code here *pResult = 0; } void CFileBar::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; // TODO: Add your control notification handler code here *pResult = 0; } void CFileBar::ExpandTree() { m_TreeCtrl.Expand (hitem0, TVE_EXPAND); } void CFileBar::Property() { HTREEITEM hItem = m_TreeCtrl.GetSelectedItem(); POSITION pos = item_list.GetHeadPosition(); Item temp; CString name = m_TreeCtrl.GetItemText(hItem); int n; for( int i = 0; i < item_list.GetCount(); i++){ temp = item_list.GetNext(pos); n = temp.name.GetLength(); if( temp.name.Left(n-4) == name )break; } SHELLEXECUTEINFO sei; ZeroMemory(&sei,sizeof(sei)); sei.cbSize = sizeof(sei); sei.lpFile = temp.path; sei.lpVerb = "properties"; sei.fMask = SEE_MASK_INVOKEIDLIST /*| SEE_MASK_FLAG_NO_UI*/; ShellExecuteEx(&sei); } void CFileBar::ViewDb() { HTREEITEM hItem = m_TreeCtrl.GetSelectedItem(); CString name = m_TreeCtrl.GetItemText( hItem ); POSITION pos = item_list.GetHeadPosition(); Item temp; while( pos ) { temp = item_list.GetNext(pos); if( temp.name.Left( temp.name.GetLength() - 4 ) == name ) break; } CMSLDoc* pDoc; if( pDoc = theApp.IsDocExist( name + ".msl" ) ) pDoc->OnCloseDocument(); theApp.OpenDocumentFile( temp.path ); } void CFileBar::DelFile(const CString &fname) { POSITION pos = item_list.GetHeadPosition(); POSITION old; bool flag = false; while( pos ) { old = pos; Item temp = item_list.GetNext( pos ); if( temp.name.Left( temp.name.GetLength() - 4 ) == fname ) { item_list.RemoveAt( old ); flag = true; break; } } if( !flag ) return ; HTREEITEM hItem; hItem = m_TreeCtrl.GetNextItem( hitem0, TVGN_CHILD ); if( hItem ) { if( m_TreeCtrl.GetItemText( hItem ) == fname ) { m_TreeCtrl.DeleteItem( hItem ); return ; } while( hItem = m_TreeCtrl.GetNextItem( hItem, TVGN_NEXT ) ) if( m_TreeCtrl.GetItemText( hItem ) == fname ) { m_TreeCtrl.DeleteItem( hItem ); return ; } } } void CFileBar::Expanding() { HTREEITEM hItem = m_TreeCtrl.GetSelectedItem(); if( m_TreeCtrl.ItemHasChildren( hItem ) ) return ; CString name = m_TreeCtrl.GetItemText( hItem ); CTable table( (LPCTSTR) name ); for( int i = 0; i < table.attr.attr.num; i++ ) { CString str; str = table.attr.attr.attr[i].name; str += ":"; switch( table.attr.attr.attr[i].type.id ) { case _INT: str += "int"; break; case _LONG: str += "long"; break; case _FLOAT: str += "float"; break; case _DATE: str += "date"; break; case _STRING: CString temp; temp.Format( "char[%d]", table.attr.attr.attr[i].type.size - 2 ); str += temp; break; } m_TreeCtrl.InsertItem( str, 5, 5, hItem, TVI_LAST ); } for( i = 0; i < table.attr.index_num; i++ ) { CString str( _T("index:") ); str += table.attr.index_table[i]; m_TreeCtrl.InsertItem( str, 6, 6, hItem, TVI_LAST ); } m_TreeCtrl.Expand (hItem, TVE_EXPAND); } void CFileBar::InsertIndex( LPCTSTR tname, LPCTSTR iname ) { HTREEITEM hItem; hItem = m_TreeCtrl.GetNextItem( hitem0, TVGN_CHILD ); if( hItem ) { if( m_TreeCtrl.GetItemText( hItem ) == tname ) ; else while( hItem = m_TreeCtrl.GetNextItem( hItem, TVGN_NEXT ) ) if( m_TreeCtrl.GetItemText( hItem ) == tname ) break; } if( m_TreeCtrl.ItemHasChildren( hItem ) ) { CString str( _T("index:") ); str += iname; m_TreeCtrl.InsertItem( str, 6, 6, hItem, TVI_LAST ); } } void CFileBar::DropIndex( LPCTSTR tname, LPCTSTR iname ) { HTREEITEM hItem; hItem = m_TreeCtrl.GetNextItem( hitem0, TVGN_CHILD ); if( hItem ) { if( m_TreeCtrl.GetItemText( hItem ) == tname ) ; else while( hItem = m_TreeCtrl.GetNextItem( hItem, TVGN_NEXT ) ) if( m_TreeCtrl.GetItemText( hItem ) == tname ) break; } CString text( _T("index:") ); text += iname; if( m_TreeCtrl.ItemHasChildren( hItem ) ) { hItem = m_TreeCtrl.GetNextItem( hItem, TVGN_CHILD ); if( m_TreeCtrl.GetItemText( hItem ) == text ) { m_TreeCtrl.DeleteItem( hItem ); return; } while( hItem = m_TreeCtrl.GetNextItem( hItem, TVGN_NEXT ) ) if( m_TreeCtrl.GetItemText( hItem ) == text ) { m_TreeCtrl.DeleteItem( hItem ); return; } } }