📄 vssreporterdlg.cpp
字号:
// vssreporterDlg.cpp : implementation file
//
#include "stdafx.h"
#include "vssreporter.h"
#include "vssreporterDlg.h"
//#include "ConfigDiffToolDlg.h"
#include "deferwndmove.h"
#include <atlbase.h>
#include "DlgProject.h"
#include "CommonFunction.h"
using namespace CCommonFunction;
#define COMPILE_MULTIMON_STUBS
#include <multimon.h>
#include <direct.h>
#include <mmsystem.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CVssreporterDlg dialog
//ICO
enum { UNKNOWN = -1, CREATED, MODIFED, LABELLED, DELETED };
//File list
enum { FILENAME, MODDATE };
LPCTSTR COLUMN[] = { "Name", "Date"};
//Config list
enum { PROJECTNAME, VSSPATH, PROJECTFILE, BUILDTYPE, VCVERSION};
LPCTSTR CONFIGCOLUMN[] = { "ProjectName", "VSSPath", "ProjectFile", "BuildType", "VcVersion"};
CVssreporterDlg::CVssreporterDlg(const CString &strConfigFile,
CWnd* pParent)
: CDialog(CVssreporterDlg::IDD, pParent)
, m_sizeOrg(0, 0)
, m_strXMLConfigFile(strConfigFile)
{
//{{AFX_DATA_INIT(CVssreporterDlg)
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_sCurVSSPrjPath.Empty();
m_ilFolders.Create(IDB_FOLDERS, 18, 1, RGB(255, 0, 0));
m_ilResults.Create(IDB_RESULTS, 16, 1, RGB(255, 0, 0));
m_pConfig = new CConfigsType;
*m_pConfig = m_pConfigXML.Load(strConfigFile);
}
CVssreporterDlg::~CVssreporterDlg()
{
delete m_pConfig;
}
void CVssreporterDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CVssreporterDlg)
DDX_Control(pDX, IDC_CONFIGLIST, m_lcConfigs);
DDX_Control(pDX, IDC_FILELIST, m_lcFiles);
DDX_Control(pDX, IDC_VSSTREE, m_tcVSS);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CVssreporterDlg, CDialog)
//{{AFX_MSG_MAP(CVssreporterDlg)
ON_NOTIFY(TVN_SELCHANGED, IDC_VSSTREE, OnSelchangedVsstree)
ON_WM_CLOSE()
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_ADDCONFIG, OnAddconfig)
ON_BN_CLICKED(IDC_DELETECONFIG, OnDeleteconfig)
ON_NOTIFY(HDN_ITEMCLICK, IDC_CONFIGLIST, OnItemclickConfiglist)
ON_NOTIFY(HDN_ITEMCLICK, IDC_FILELIST, OnItemclickFilelist)
ON_WM_CONTEXTMENU()
ON_BN_CLICKED(IDC_EDIT, OnEdit)
//}}AFX_MSG_MAP
ON_WM_SIZE()
ON_WM_GETMINMAXINFO()
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CVssreporterDlg message handlers
BOOL CVssreporterDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
if (!IsVSSRegistered())
{
MessageBox("VSS not registration.", "Error", MB_OK | MB_ICONERROR);
PostMessage(WM_CLOSE);
return FALSE;
}
//Init vsstree
m_tcVSS.SetImageList(&m_ilFolders, TVSIL_NORMAL);
CVSSInfoType vssInfo = m_pConfig->GetVSSInfo();
if (!m_tcVSS.OpenDatabase(CString(vssInfo.GetDataBasePath()),
CString(vssInfo.GetUserName()),
CString(vssInfo.GetPassword())))
{
CString strMsg;
strMsg.Format("Open vss database <%s> error!\nPlease check config xml file is valid?",
CString(vssInfo.GetDataBasePath()));
MessageBox(strMsg, "Error", MB_OK | MB_ICONERROR);
PostMessage(WM_CLOSE);
return FALSE;
}
//Files list
m_lcFiles.SetImageList(&m_ilResults, LVSIL_SMALL);
m_lcFiles.InsertColumn(FILENAME, COLUMN[FILENAME], LVCFMT_LEFT, 100);
m_lcFiles.InsertColumn(MODDATE, COLUMN[MODDATE], LVCFMT_LEFT, 130);
m_lcFiles.SetExtendedStyle(m_lcFiles.GetExtendedStyle() | LVS_EX_FULLROWSELECT);
// ensure vss is registered and if not allow user to navigate to it
m_lcConfigs.SetImageList(&m_ilResults, LVSIL_SMALL);
m_lcConfigs.InsertColumn(PROJECTNAME, CONFIGCOLUMN[PROJECTNAME], LVCFMT_LEFT, 100);
m_lcConfigs.InsertColumn(VSSPATH, CONFIGCOLUMN[VSSPATH], LVCFMT_LEFT, 200);
m_lcConfigs.InsertColumn(PROJECTFILE, CONFIGCOLUMN[PROJECTFILE], LVCFMT_LEFT, 100);
m_lcConfigs.InsertColumn(BUILDTYPE, CONFIGCOLUMN[BUILDTYPE], LVCFMT_LEFT, 100);
m_lcConfigs.InsertColumn(VCVERSION, CONFIGCOLUMN[VCVERSION], LVCFMT_LEFT, 100);
m_lcConfigs.SetExtendedStyle(m_lcConfigs.GetExtendedStyle() | LVS_EX_FULLROWSELECT);
FlashConfigsList();
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// m_lcConfigs
RegLoadSettings();
// position resize icon as close to bottom left as pos
return TRUE; // return TRUE unless you set the focus to a control
}
void CVssreporterDlg::FlashConfigsList()
{
m_lcConfigs.DeleteAllItems();
CTestProjectsType projects = m_pConfig->GetTestProjects();
for (int i = 0; i < projects.GetTestProjectCount(); i++)
{
CTestProjectType project = projects.GetTestProjectAt(i);
int nIndex = m_lcConfigs.InsertItem(m_lcConfigs.GetItemCount() == 0 ? 1 : m_lcConfigs.GetItemCount()
, "", LABELLED);
BOOL bOk = FALSE;
bOk = m_lcConfigs.SetItemText(nIndex, PROJECTNAME , CString(project.GetProjectName()));
bOk = m_lcConfigs.SetItemText(nIndex, VSSPATH , CString(project.GetVSSPath()));
bOk = m_lcConfigs.SetItemText(nIndex, PROJECTFILE , CString(project.GetProjectFile()));
bOk = m_lcConfigs.SetItemText(nIndex, BUILDTYPE , CString(project.GetBuildType()));
bOk = m_lcConfigs.SetItemText(nIndex, VCVERSION , CString(project.GetProjectVersion()));
}
UpdateData(FALSE);
}
void CVssreporterDlg::OnOK()
{
CDialog::OnOK();
RegSaveSettings();
}
void CVssreporterDlg::OnCancel()
{
// do nothing else
}
void CVssreporterDlg::RegSaveSettings()
{
// pos
WINDOWPLACEMENT wp;
GetWindowPlacement(&wp);
AfxGetApp()->WriteProfileInt("Pos", "TopLeft", MAKELPARAM(wp.rcNormalPosition.left, wp.rcNormalPosition.top));
AfxGetApp()->WriteProfileInt("Pos", "BottomRight", MAKELPARAM(wp.rcNormalPosition.right, wp.rcNormalPosition.bottom));
}
void CVssreporterDlg::RegLoadSettings()
{
// pos
WINDOWPLACEMENT wp;
GetWindowPlacement(&wp);
DWORD dwTopLeft = (DWORD)AfxGetApp()->GetProfileInt("Pos", "TopLeft", -1);
DWORD dwBottomRight = (DWORD)AfxGetApp()->GetProfileInt("Pos", "BottomRight", -1);
if (dwTopLeft != -1 && dwBottomRight != -1)
{
CRect rect(LOWORD(dwTopLeft), HIWORD(dwTopLeft), LOWORD(dwBottomRight), HIWORD(dwBottomRight));
// ensure this intersects with the desktop
if (NULL != MonitorFromRect(rect, MONITOR_DEFAULTTONULL))
{
wp.rcNormalPosition = rect;
wp.showCmd = SW_HIDE;
SetWindowPlacement(&wp);
}
}
}
void CVssreporterDlg::OnSelchangedVsstree(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
m_sCurVSSPrjPath = m_tcVSS.GetSelectedProject();
UpdateFileList(m_sCurVSSPrjPath);
*pResult = 0;
}
void CVssreporterDlg::UpdateFileList(const CString &strCurProject)
{
ASSERT(!strCurProject.IsEmpty());
if (strCurProject == "$/")
return;
IVSSItemPtr pItem = m_tcVSS.m_vssdb->GetVSSItem(_bstr_t(strCurProject.AllocSysString()), FALSE);
ASSERT(pItem->GetType() == VSSITEM_PROJECT);
m_lcFiles.DeleteAllItems();
IVSSItemsPtr pItems = pItem->GetItems(FALSE);
for (int i = 1; i <= pItems->GetCount(); i++)
{
IVSSItemPtr pSubItem = pItems->GetItem(CComVariant(i));
ASSERT(pSubItem != NULL);
if (pSubItem->GetType() == VSSITEM_PROJECT)
continue;
CString strSubItemName = pSubItem->GetName().copy();
if (!IsProjectFile(strSubItemName))
continue;
CString strData = GetVSSItemLastTime(pSubItem).Format();
int nIndex = m_lcFiles.InsertItem(m_lcFiles.GetItemCount(), "", CREATED);
m_lcFiles.SetItemText(nIndex, FILENAME, strSubItemName);
m_lcFiles.SetItemText(nIndex, MODDATE, strData);
}
if (m_lcFiles.GetItemCount() > 0)
m_lcFiles.SetItemState(0, LVIS_FOCUSED | LVIS_SELECTED, 0x000F);
}
BOOL CVssreporterDlg::IsProjectFile(const CString &strFileName)
{
const CString strExtName = GetFileExtName(strFileName);
return strExtName == ".sln"
|| strExtName == ".dsw"
|| strExtName == ".dsp"
;
}
COleDateTime CVssreporterDlg::GetVSSItemLastTime(IVSSItemPtr pItem)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -