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;
			}
	}
}