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

📄 vsstreectrl.cpp

📁 自动化编译工具代码
💻 CPP
字号:
// VSSTreeCtrl.cpp : implementation file
//

#include "stdafx.h"
#include "vssreporter.h"
#include "VSSTreeCtrl.h"

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

/////////////////////////////////////////////////////////////////////////////
// CVSSTreeCtrl

CVSSTreeCtrl::CVSSTreeCtrl() 
{
	m_vssdb = NULL;
}

CVSSTreeCtrl::~CVSSTreeCtrl()
{
}


BEGIN_MESSAGE_MAP(CVSSTreeCtrl, CTreeCtrl)
	//{{AFX_MSG_MAP(CVSSTreeCtrl)
	ON_NOTIFY_REFLECT(TVN_ITEMEXPANDING, OnItemexpanding)
	ON_WM_DESTROY()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CVSSTreeCtrl message handlers

void CVSSTreeCtrl::PreSubclassWindow() 
{
	CTreeCtrl::PreSubclassWindow();
}

BOOL CVSSTreeCtrl::OpenDatabase(LPCTSTR szDatabasePath, LPCTSTR szUser, LPCTSTR szPassword)
{
	CWaitCursor cursor;
	COleVariant var1;
	IVSSItemPtr	vssi, vssi2p;
	IVSSItemsPtr	vssis;
	
	try
	{
		if (m_vssdb)
		{
			m_vssdb.Release(); 
			m_vssdb = NULL;
		}

		HRESULT hr = m_vssdb.CreateInstance(L"SourceSafe");
		ASSERT(SUCCEEDED(hr));
		m_vssdb->Open(szDatabasePath, szUser, szPassword);
	}
	catch (...)
	{
		return FALSE;
	}

	vssi = m_vssdb->GetVSSItem( "$/", 0 );

	if (vssi == NULL)
		return FALSE;

	vssis = vssi->GetItems( FALSE );

	DeleteAllItems();
	HTREEITEM hItem = InsertItem( "$", 0, 1 );
	SetItemData(hItem, 1); // == project
//	SelectItem(hItem);

	// make sure '+' sign is showing
	TV_ITEM tvItem;
	ZeroMemory(&tvItem, sizeof(tvItem));
	tvItem.mask = TVIF_HANDLE;
	tvItem.hItem = hItem;
	VERIFY(GetItem(&tvItem));
	tvItem.mask |= TVIF_CHILDREN; 
	tvItem.cChildren = 1;
	SetItem(&tvItem);

	Expand(hItem, TVE_EXPAND);
	UpdateWindow();

	return TRUE;
}

void CVSSTreeCtrl::RecurseSubProj( HTREEITEM htItem, CString buf, int nLevelsToGo )
{
	CWaitCursor cursor;
	int			x;				// Counter to run thru project
	COleVariant var1;			// special overloaded variant used to talk to OLE
	COleVariant varBuf(buf);	// special overloaded variant used to talk to OLE
	IVSSItemPtr	vssi, vssi2p;	// A vss item
	IVSSItemsPtr	vssis;		// A vss collection
	HTREEITEM	hItem;
	BOOL bAnySubProjects = FALSE;

	if (!nLevelsToGo)
		return;

	vssi = m_vssdb->GetVSSItem( varBuf.bstrVal, 0 );	// Get the Item passed to us.

	if( vssi->GetType() == 0l ) // See if the thing we got was a project
	{
		hItem = InsertItem( vssi->GetName(), 0, 1, htItem, TVI_LAST );
		SetItemData(hItem, 1);

		// make sure '+' sign is showing
		TV_ITEM tvItem;
		ZeroMemory(&tvItem, sizeof(tvItem));
		tvItem.mask = TVIF_HANDLE;
		tvItem.hItem = hItem;
		VERIFY(GetItem(&tvItem));
		tvItem.mask |= TVIF_CHILDREN; 
		tvItem.cChildren = 1;
		SetItem(&tvItem);

		vssis = vssi->GetItems( FALSE );
		for( x = 0; x < vssis->GetCount(); x++)
		{
			var1 = (long)(x + 1);
			vssi2p = vssis->GetItem( var1 ); 
			RecurseSubProj( hItem, CString((LPCTSTR)vssi2p->GetSpec()), nLevelsToGo - 1 ); 
		}
	}
}

void CVSSTreeCtrl::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here

	if (pNMTreeView->action != TVE_EXPAND)
		return;

	HTREEITEM htItem = pNMTreeView->itemNew.hItem;

	// if its a project item then rebuild item
	if (GetItemData(htItem))
	{
		HTREEITEM htiChild = GetChildItem(htItem);

		while (htiChild)
		{
			HTREEITEM htiOld = htiChild;
			htiChild = GetNextItem(htiChild, TVGN_NEXT);
			DeleteItem(htiOld);
		}

		// build a full path to the item
		CString sItem = GetFullPath(htItem);

		IVSSItemPtr	vssi, vssi2p;
		IVSSItemsPtr	vssis;
		int			x;				// Counter to run thru project
		COleVariant var1;			// special overloaded variant used to talk to OLE
		COleVariant varBuf(CString(sItem + "/"));	// special overloaded variant used to talk to OLE
		BOOL bHasSubProjects = FALSE;

		vssi = m_vssdb->GetVSSItem(varBuf.bstrVal, 0 );
		vssis = vssi->GetItems( FALSE );

		for( x = 0; x < vssis->GetCount(); x++)
		{
			var1 = (long)(x + 1);
			vssi2p = vssis->GetItem( var1 ); 

			if( vssi2p->GetType() == 0l ) // See if the thing we got was a project
			{
				CString sItem = CString((LPCTSTR)vssi2p->GetSpec());
				RecurseSubProj( htItem, sItem, 1); 
				bHasSubProjects = TRUE;
			}
		}

		if (!bHasSubProjects)
		{
			// make sure '+' sign is removed
			TV_ITEM tvItem;
			ZeroMemory(&tvItem, sizeof(tvItem));
			tvItem.mask = TVIF_HANDLE;
			tvItem.hItem = htItem;
			VERIFY(GetItem(&tvItem));
			tvItem.mask |= TVIF_CHILDREN; 
			tvItem.cChildren = 0;
			SetItem(&tvItem);
		}
	}

	*pResult = 0;
}

CString CVSSTreeCtrl::GetFullPath(HTREEITEM htItem)
{
	if (!htItem)
		return "";

	// build a full path to the item
	CString sItem = GetItemText(htItem);
	HTREEITEM htiParent = GetParentItem(htItem);
	
	while (htiParent)
	{
		CString sTemp = sItem;
		sItem.Format("%s/%s", GetItemText(htiParent), sItem);
		
		htiParent = GetParentItem(htiParent);
	}

	// the root is a special case
	if (sItem == "$")
		sItem += '/';

	return sItem;
}

CString CVSSTreeCtrl::GetSelectedProject()
{
	HTREEITEM htItem = GetSelectedItem();

	if (htItem)
		return GetFullPath(htItem);

	// else
	return "";
}

void CVSSTreeCtrl::OnDestroy() 
{
	CTreeCtrl::OnDestroy();
	
	if (m_vssdb)
	{
		m_vssdb.Release();
		m_vssdb = NULL;
	}
}

⌨️ 快捷键说明

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