⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cooltreectrl.cpp

📁 一个源代码管理工具,支持悬浮框拖曳,后台数据库管理,代码高亮显示灯功能
💻 CPP
字号:
// CoolTreeCtrl.cpp : implementation file
//

#include "stdafx.h"
#include "CodeManager.h"
#include "CoolTreeCtrl.h"
#include "MainFrm.h"
#include "CodeManagerDoc.h"
#include "CodeManagerView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CCoolTreeCtrl

CCoolTreeCtrl::CCoolTreeCtrl()
{
	InitImageList();
}

CCoolTreeCtrl::~CCoolTreeCtrl()
{
}


BEGIN_MESSAGE_MAP(CCoolTreeCtrl, CTreeCtrl)
	//{{AFX_MSG_MAP(CCoolTreeCtrl)
	ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
	ON_NOTIFY_REFLECT(TVN_ITEMEXPANDED, OnItemexpanded)
	ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
	ON_WM_CONTEXTMENU()
	ON_COMMAND(ID_NEWTITLE, OnNewtitle)
	ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
	ON_COMMAND(ID_EDITTITLE, OnEdittitle)
	ON_NOTIFY_REFLECT(TVN_ENDLABELEDIT, OnEndlabeledit)
	ON_COMMAND(ID_NEWCHILDTITLE, OnNewchildtitle)
	ON_NOTIFY_REFLECT(TVN_SELCHANGING, OnSelchanging)
	ON_COMMAND(ID_DELETETITLE, OnDeletetitle)
	ON_COMMAND(ID_FILE_FILEIMPORT, OnFileFileimport)
	ON_COMMAND(ID_FILE_DIRIMPORT, OnFileDirimport)
	ON_WM_LBUTTONDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCoolTreeCtrl message handlers

void CCoolTreeCtrl::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
//	MessageBox("double click");
	*pResult = 0;
}

void CCoolTreeCtrl::OnItemexpanded(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here
	TVITEM item = pNMTreeView->itemNew;
	if(item.hItem == GetRootItem())
		return;
    HTREEITEM hChild = GetChildItem(item.hItem);

	while(hChild)
	{
		if(!ItemHasChildren(hChild))
		{
			CMainFrame* pFrame = (CMainFrame*)AfxGetApp()->GetMainWnd();
			pFrame->AddSubDir(hChild);
		}
		hChild = GetNextItem(hChild,TVGN_NEXT);
	}

	*pResult = 0;
}


void CCoolTreeCtrl::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
//	MessageBox("asdfdfhfj");
	SendMessage(WM_CONTEXTMENU, (WPARAM) m_hWnd, GetMessagePos());
	*pResult = 0;
}

void CCoolTreeCtrl::OnContextMenu(CWnd* pWnd, CPoint point) 
{
	// TODO: Add your message handler code here
	CPoint tp = point;
	if (point.x == -1 && point.y == -1)
		tp = (CPoint) GetMessagePos();

	ScreenToClient(&tp);

	UINT uFlags;
	HTREEITEM htItem;

	htItem = HitTest(tp, &uFlags);

	if( htItem == NULL )
		return;
	SelectItem(htItem);


//	CString str = GetItemText(htItem);

	CMenu menuPopup;
	menuPopup.LoadMenu(IDR_RIGHTMENU);
//	menuPopup.TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this);

	CMenu* pPopup = menuPopup.GetSubMenu(0);

	pPopup->TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this);
	/*if(menuPopup.CreatePopupMenu())
	{
	//	menuPopup.LoadMenu(IDR_RIGHTMENU);
		menuPopup.AppendMenu(MF_STRING, ID_NEWTITLE, "新增标题(&A)");
		menuPopup.AppendMenu(MF_STRING, ID_NEWCHILDTITLE, "新增子标题(&S)");
		menuPopup.AppendMenu(MF_STRING, ID_EDITTITLE, "编辑当前标题(&A)");
		menuPopup.AppendMenu(MF_STRING, ID_DELETETITLE, "删除当前标题(&A)");
		menuPopup.AppendMenu(MF_SEPARATOR);
		menuPopup.AppendMenu(MF_STRING, ID_EXPORT, "导出...");
		menuPopup.TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this);
	}*/
}


void CCoolTreeCtrl::OnNewtitle() 
{
	// TODO: Add your command handler code here
//	MessageBox("new title");
	HTREEITEM hs, hp, hc;
	hs = GetSelectedItem();
	hp = GetParentItem(hs);

/*	TVINSERTSTRUCT tvInsert;
	tvInsert.hParent = hp;
	tvInsert.hInsertAfter = TVI_LAST;
	tvInsert.item.mask = TVIF_TEXT;
	tvInsert.item.pszText = _T("");

	InsertItem(&tvInsert);*/
	CString str = GetItemText(hp), str1 = GetItemText(hs);
	hCurrentItem = InsertItem("", hp);

	SetItemImage(hCurrentItem, 6, 6);

/*	ASSERT(m_hInsertItem!=NULL);*/
	m_dbType = 1;
	EditLabel(hCurrentItem);

}

BOOL CCoolTreeCtrl::OnAmbientProperty(COleControlSite* pSite, DISPID dispid, VARIANT* pvar) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	return CTreeCtrl::OnAmbientProperty(pSite, dispid, pvar);
}

void CCoolTreeCtrl::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;

	CMainFrame *pFrame = (CMainFrame *)AfxGetApp()->GetMainWnd();
	CCodeManagerView *EditView;
	HTREEITEM hs = GetSelectedItem();
//	SetItemImage(hs,1,true );

	CString strvalue = "select * from CodeTable where CodeID = ", strdata;
	long lvalue = GetItemData(hs);
	strdata.Format("%ld", lvalue);
	strvalue = strvalue + "" + strdata +"";

	pFrame->m_DbObject.GetValue(strvalue);

	_variant_t vcount;
	vcount = pFrame->m_DbObject.m_pRecordset->GetCollect("IsDir");

	long bl = (long)vcount;

/*	CString str;
	str = (LPCTSTR)(_bstr_t)vcount;
	MessageBox(str);*/

//	pFrame->m_DbObject.m_pRecordset->
//	if(!bl)
	{
		try
		{
			long nSize = pFrame->m_DbObject.m_pRecordset->GetFields()->GetItem("CodeData")->ActualSize;
			if(nSize > 0)
			{
				_variant_t	varBLOB;
				varBLOB = pFrame->m_DbObject.m_pRecordset->GetFields()->GetItem("CodeData")->GetChunk(nSize);
				if(varBLOB.vt == (VT_ARRAY | VT_UI1))
				{
					if(BYTE *pBuffer = new BYTE [nSize+1])		///重新申请必要的存储空间
					{	
						char *pBuf = NULL;
						SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
						memcpy(pBuffer,pBuf,nSize);				///复制数据到缓冲区m_pBMPBuffer
						SafeArrayUnaccessData (varBLOB.parray);
					//	int nSize = lDataSize;

						CString str;
						str.Format("%s", pBuf);
						//strcpy(str,pBuffer);
						EditView = (CCodeManagerView *)pFrame->GetActiveView();
						EditView->LoadText(str);
						EditView->SelectLanguage(_CPP);

						 delete [] pBuffer;
						 pBuf=0;
						 
					}
				}
			}
			else
			{
				CString str;
				EditView = (CCodeManagerView *)pFrame->GetActiveView();
				EditView->LoadText(str);
			//	EditView->SelectLanguage(_CPP);
			}

		}
		catch (_com_error e) {
		}
	}
		
	*pResult = 0;
}

void CCoolTreeCtrl::OnEdittitle() 
{
	// TODO: Add your command handler code here
	hCurrentItem = GetSelectedItem();
	m_dbType = 0;
	EditLabel(hCurrentItem);
}

void CCoolTreeCtrl::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult) 
{
	TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
	// TODO: Add your control notification handler code here

	CString strName;
	GetEditControl()->GetWindowText(strName);
//	HTREEITEM hs = GetSelectedItem();
	SetItemText(hCurrentItem, strName);
	if(!ItemHasChildren(hCurrentItem))
		SetMyItemImage(hCurrentItem, strName);
	/*数据库更新代码*/
	CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->GetMainWnd();

	if(m_dbType == 0)//编辑当前标题
	{
		CString strvalue = "select * from CodeTable where CodeID = ", strdata;
		long lvalue = GetItemData(hCurrentItem);
		strdata.Format("%ld", lvalue);
		strvalue = strvalue + "" + strdata +"";

		pFrame->m_DbObject.GetValue(strvalue);
		CString dbstr = "CodeName";
		pFrame->m_DbObject.UpdataRecord(&dbstr, &strName, 1);
	}
	else if(m_dbType == 1 || m_dbType ==2)//新增标题
	{
		HTREEITEM hp = GetParentItem(hCurrentItem);
		CString strParent;
		if(hp != NULL)
		{
			long lvalue = GetItemData(hp);
			strParent.Format("%ld", lvalue);
		}
		pFrame->m_DbObject.AddRecord();
		pFrame->m_DbObject.SetData("CodeName", strName);
		pFrame->m_DbObject.SetData("CollectTime", "2005-7-29");
		if(hp != NULL)
			pFrame->m_DbObject.SetData("ParentID", strParent);
		pFrame->m_DbObject.Update();
		_variant_t vtemp;
		vtemp = pFrame->m_DbObject.m_pRecordset->GetCollect("CodeID");
		SetItemData(hCurrentItem, long(vtemp));

		if(m_dbType == 2)
		{
			SetItemImage(hp, 0, 0);
			CString strvalue = "select * from CodeTable where CodeID = ", strdata;
			long lvalue = GetItemData(hp);
			strdata.Format("%ld", lvalue);
			strvalue = strvalue + "" + strdata +"";

			pFrame->m_DbObject.GetValue(strvalue);
			pFrame->m_DbObject.SetData("IsDir", "1");
			pFrame->m_DbObject.Update();
		}
	}
/*	else if(m_dbType == 2)//新增子标题
	{
		HTREEITEM hp = GetParentItem(hCurrentItem);
		long lvalue = GetItemData(hp);
		CString strParent;
		strParent.Format("%ld", lvalue);
		pFrame->m_DbObject.AddRecord();
		pFrame->m_DbObject.SetData("CodeName", strName);
		pFrame->m_DbObject.SetData("CollectTime", "2005-7-29");
		pFrame->m_DbObject.SetData("ParentID", strParent);
		pFrame->m_DbObject.Updata();
	}*/
	*pResult = 0;
}

void CCoolTreeCtrl::OnNewchildtitle() 
{
	// TODO: Add your command handler code here
	HTREEITEM hp;
	hp = GetSelectedItem();
	hCurrentItem = InsertItem("", hp);
	SetItemImage(hCurrentItem, 6, 6);
	Expand(hp, TVE_EXPAND);
	m_dbType = 2;
	EditLabel(hCurrentItem);
}

void CCoolTreeCtrl::OnSelchanging(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here
	CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->GetMainWnd();
	if(m_IsDbType)
	{
		CCodeManagerView *EditView = (CCodeManagerView *)pFrame->GetActiveView();
		CRichEditCtrl &edit = EditView->GetRichEditCtrl();
		if(edit.GetModify())
		{
			if(MessageBox("文件已修改!是否保存修改?", "保存", MB_ICONQUESTION|MB_YESNO) == IDYES)
			{
				CString strText;
				edit.GetWindowText(strText);
				BYTE *pBuf = (BYTE*)strText.GetBuffer(strText.GetLength());
				CString strvalue = "select * from CodeTable where CodeID = ", strdata;
				long lvalue = GetItemData(GetSelectedItem());
				strdata.Format("%ld", lvalue);
				strvalue = strvalue + "" + strdata +"";

				pFrame->m_DbObject.GetValue(strvalue);

				pFrame->m_DbObject.SetDataChunk(pBuf);
				pFrame->m_DbObject.Update();
				strText.ReleaseBuffer();
			}
			edit.SetModify(FALSE);
		}
	}
	*pResult = 0;
}

void CCoolTreeCtrl::OnDeletetitle() 
{
	// TODO: Add your command handler code here

	if(MessageBox("此操作将会删除该项下所有文件,是否继续?", "删除", MB_ICONQUESTION|MB_YESNO) == IDYES)
	{
		HTREEITEM hs = GetSelectedItem();
		Expand(hs, TVE_EXPAND);
		DeleteChildItem(hs);//删除其下所有子节点		
		DeleteDbItem(hs);//删除其数据库中的记录;

		//如果父其下已无子节点,则改变父节点为文件
		HTREEITEM hp = GetParentItem(hs);
		DeleteItem(hs);
		if((hp != NULL) && (!ItemHasChildren(hp)))
		{
			CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->GetMainWnd();
			CString strvalue = "select * from CodeTable where CodeID = ", strdata;
			long lvalue = GetItemData(hp);
			strdata.Format("%ld", lvalue);
			strvalue = strvalue + "" + strdata +"";

			pFrame->m_DbObject.GetValue(strvalue);

			long ldir = (long)pFrame->m_DbObject.m_pRecordset->GetCollect("IsDir");
			if(ldir)
			{
				pFrame->m_DbObject.SetData("IsDir", "0");
				pFrame->m_DbObject.Update();

				CString itemStr = GetItemText(hp);
				SetMyItemImage(hp, itemStr);
			}
		}

		MessageBox("成功删除记录!","源码利器");
	}

	
}

int CCoolTreeCtrl::DeleteChildItem(HTREEITEM hp)
{
	HTREEITEM hChild = GetChildItem(hp), htemp;
	while(hChild)
	{
		Expand(hChild, TVE_EXPAND);
		int lv = GetItemData(hChild);
		if(ItemHasChildren(hChild))
		{
			DeleteChildItem(hChild);
		//	DeleteItem(hChild);
		}
	//	else
	//		DeleteItem(hChild);
		htemp = hChild;
		hChild = GetNextItem(hChild, TVGN_NEXT);
		DeleteDbItem(htemp);
		DeleteItem(htemp);
	}

/*	HTREEITEM hChild = m_wndTree.GetChildItem(NULL);

	s = m_wndTree.GetItemText(hChild);
	while(hChild)
	{
		AddSubDir(hChild);

		HTREEITEM hhChild = m_wndTree.GetChildItem(hChild);
		while(hhChild)
		{
			AddSubDir(hhChild);
			hhChild = m_wndTree.GetNextItem(hhChild,TVGN_NEXT);
		}
		hChild = m_wndTree.GetNextItem(hChild,TVGN_NEXT);
		s = m_wndTree.GetItemText(hChild);
	}*/
	return 0;
}

int CCoolTreeCtrl::DeleteDbItem(HTREEITEM htree)
{
	CString strvalue = "delete from CodeTable where CodeID = ", strdata;
	long lvalue = GetItemData(htree);
	strdata.Format("%ld", lvalue);
	strvalue = strvalue + "" + strdata +"";

	CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->GetMainWnd();
	pFrame->m_DbObject.DeleteValue(strvalue);
//	MessageBox("该记录已被删除");

//	DeleteItem(htree);

	return 0;
}


void CCoolTreeCtrl::OnFileFileimport() 
{
	// TODO: Add your command handler code here
	CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->GetMainWnd();
//	pFrame->OnFileFileimport();
	pFrame->ImportFile();
//	MessageBox("asdgdfhg");
}

int CCoolTreeCtrl::InitImageList()
{
	m_TreeImage.Create(16,16,ILC_COLOR16, 0, 0);
	HICON hIcon = AfxGetApp()->LoadIcon(IDI_CDIR);
	m_TreeImage.Add(hIcon);
	hIcon = AfxGetApp()->LoadIcon(IDI_SC);
	m_TreeImage.Add(hIcon);
	hIcon = AfxGetApp()->LoadIcon(IDI_SCPP);
	m_TreeImage.Add(hIcon);
	hIcon = AfxGetApp()->LoadIcon(IDI_SDSW);
	m_TreeImage.Add(hIcon);
	hIcon = AfxGetApp()->LoadIcon(IDI_SH);
	m_TreeImage.Add(hIcon);
	hIcon = AfxGetApp()->LoadIcon(IDI_SCR);
	m_TreeImage.Add(hIcon);
	hIcon = AfxGetApp()->LoadIcon(IDI_OTHER);
	m_TreeImage.Add(hIcon);
	return 1;
}

int CCoolTreeCtrl::SetMyItemImage(HTREEITEM htItem, CString strName)
{
	int r = JudgeType(strName);
	if(r == -1 || r > 5)
		SetItemImage(htItem, 6, 6);
	else
	{
		if(r == 4 || r == 5)
			SetItemImage(htItem, 5, 5);
		else
			SetItemImage(htItem, r + 1, r + 1);
	}
	return 0;
}

int CCoolTreeCtrl::JudgeType(CString& CodeName)
{	//用引用参数以加快速度
/*	if(CodeName.GetLength() == 0)
		return -1;
	char *pt = new char[CodeName.GetLength() + 1], *p;
	p = pt;

	int index, i;

	strcpy(p, CodeName);*/

	int index, i;
	char *p = CodeName.GetBuffer(CodeName.GetLength());

	p += CodeName.GetLength() - 1;

	for(index = CodeName.GetLength() - 1; index >=0; index--, p--)
		if(*p == '.')
			break;

	if(index < 0)
	{
	//	delete []pt;
		return -1;
	}

	for(i = 0; i < 8; i++)
	{
		if(FileExp[i] == p)
		{
	//		delete []pt;
			return i;
		}
	}

//	delete []pt;
	return -1;
}

int CCoolTreeCtrl::SetMyImageList()
{
	SetImageList(&m_TreeImage, TVSIL_NORMAL);
	return 0;
}

void CCoolTreeCtrl::OnFileDirimport() 
{
	// TODO: Add your command handler code here
	CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->GetMainWnd();
	pFrame->ImportDir();
}

void CCoolTreeCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->GetMainWnd();
	if(pFrame->m_bdType == TRUE)
		m_IsDbType = TRUE;
	else
		m_IsDbType = FALSE;
	pFrame->m_bdType = TRUE;
	CTreeCtrl::OnLButtonDown(nFlags, point);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -