📄 vsstreectrl.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 + -