📄 resultsdlg.cpp
字号:
/***************************************************************************/
/* NOTE: */
/* This document is copyright (c) by Oz Solomonovich, and is bound by the */
/* MIT open source license (www.opensource.org/licenses/mit-license.html). */
/* See License.txt for more information. */
/***************************************************************************/
// ResultsDlg.cpp : implementation file
//
#include "stdafx.h"
#include "LineCount.h"
#include "ResultsDlg.h"
#include "Config.h"
#include "Export.h"
#include "FileSummaryDlg.h"
#include "Options.h"
#include "AboutDialog.h"
#include "PrjStats.h"
#include "WorkspaceInfo.h"
#include "Help\HelpIDs.h"
#include "Utils.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define TOTAL_STR _T("*** TOTAL ***")
struct ColumnInfo
{
LPCTSTR name;
SORT_TYPE sortType;
SORT_STATE sortState;
int lengthExtension;
int fmt;
};
static ColumnInfo columns[] =
{
{ _T("File Name"), TYPE_TEXT, DESCENDING, 40 },
{ _T("Extension"), TYPE_TEXT, DESCENDING, 10 },
{ _T("Path"), TYPE_TEXT, DESCENDING, 20 },
{ _T("Lines"), TYPE_NUMERIC, DESCENDING, 15 },
{ _T("Code"), TYPE_NUMERIC, DESCENDING, 5 },
{ _T("Comments"), TYPE_NUMERIC, DESCENDING, 5 },
{ _T("Mixed"), TYPE_NUMERIC, DESCENDING, 15 },
{ _T("Blank"), TYPE_NUMERIC, DESCENDING, 15 }
};
/////////////////////////////////////////////////////////////////////////////
// CResultsDlg dialog
CResultsDlg::CResultsDlg(IWorkspaceInfo *pWI,
CWnd* pParent /*=NULL*/) : CResizableDialog(CResultsDlg::IDD, pParent),
m_pWI(pWI)
{
m_iHelpID = IDH_DLG_MAIN;
//{{AFX_DATA_INIT(CResultsDlg)
//}}AFX_DATA_INIT
}
void CResultsDlg::DoDataExchange(CDataExchange* pDX)
{
CResizableDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CResultsDlg)
DDX_Control(pDX, IDC_FILTER, m_Filter);
DDX_Control(pDX, IDC_RESULTLIST, m_ListCtrl);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CResultsDlg, CResizableDialog)
//{{AFX_MSG_MAP(CResultsDlg)
ON_COMMAND(IDC_EXPORT, OnExport)
ON_COMMAND(IDC_OPTIONS, OnOptions)
ON_COMMAND(IDC_ABOUT, OnAbout)
ON_UPDATE_COMMAND_UI(IDC_FILESUMMARY, OnUpdateStatsCommand)
ON_UPDATE_COMMAND_UI(IDC_EXPORT, OnUpdateStatsCommand)
ON_CBN_SELCHANGE(IDC_FILTER, OnSelchangeFilter)
ON_COMMAND(IDC_DOWNLOADS, OnDownloads)
ON_COMMAND(IDC_HOMEPAGE, OnHomepage)
ON_COMMAND(IDC_FILESUMMARY, OnFileSummary)
//}}AFX_MSG_MAP
ON_COMMAND_RANGE(ID_STATISTICS_FILTER1, ID_STATISTICS_FILTER99, OnStatisticsFilterProjects)
ON_UPDATE_COMMAND_UI_RANGE(ID_STATISTICS_FILTER1, ID_STATISTICS_FILTER99, OnUpdateStatisticsFilterProjects)
ON_WM_INITMENUPOPUP()
END_MESSAGE_MAP()
BEGIN_HELP_IDS(CResultsDlg)
IDC_MENU_SEP, 0,
IDC_NOPROJ_TEXT, 0,
IDC_NOPROJ_NOTE, 0,
IDC_NOPROJ_FRAME, 0,
IDC_TXT_TOTAL, 0,
IDC_TXT_C, 0,
IDC_TXT_P, 0,
IDC_TXT_FILTER, IDC_FILTER,
IDC_TIP_ICON, 0,
IDC_TIP_TEXT, 0,
IDC_LINESC, IDC_LINEST,
IDC_LINESP, IDC_LINEST,
IDC_CODEC, IDC_CODET,
IDC_CODEP, IDC_CODET,
IDC_COMMENTSC, IDC_COMMENTST,
IDC_COMMENTSP, IDC_COMMENTST,
IDC_MIXEDC, IDC_MIXEDT,
IDC_MIXEDP, IDC_MIXEDT,
IDC_BLANKC, IDC_BLANKT,
IDC_BLANKP, IDC_BLANKT,
IDC_NETLINESC, IDC_NETLINEST,
IDC_NETLINESP, IDC_NETLINEST
END_HELP_IDS()
/////////////////////////////////////////////////////////////////////////////
// CResultsDlg message handlers
BOOL CResultsDlg::OnInitDialog()
{
CResizableDialog::OnInitDialog();
SetIcon(AfxGetApp()->LoadIcon(IDI_TITLE), FALSE);
int i;
LVCOLUMN lvc;
m_ListCtrl.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0, (LPARAM)
LVS_EX_GRIDLINES | LVS_EX_HEADERDRAGDROP | LVS_EX_FULLROWSELECT |
m_ListCtrl.SendMessage(LVM_GETEXTENDEDLISTVIEWSTYLE));
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
for(i = 0; i < countof(columns); i++)
{
lvc.iSubItem = i;
lvc.pszText = (char *)columns[i].name;
lvc.cx = m_ListCtrl.GetStringWidth(lvc.pszText) +
columns[i].lengthExtension + 15;
if (lvc.cx < 40) lvc.cx = 40;
lvc.fmt = columns[i].fmt;
m_ListCtrl.InsertColumn(i, columns[i].sortType, columns[i].sortState,
&lvc);
}
m_ListCtrl.SortColumn( 2, false );
m_ListCtrl.SortColumn( 1, true );
m_ListCtrl.SortColumn( 0, true );
m_ListCtrl.SetUniqueName( "ResultsListCtrl" );
m_ListCtrl.LoadColumnWidths();
m_ListCtrl.LoadColumnOrder();
m_ListCtrl.LoadColumnSort();
//resizable dlg
AddAnchor(IDC_MENU_SEP, TOP_LEFT, TOP_RIGHT);
AddAnchor(IDC_RESULTLIST, TOP_LEFT, BOTTOM_RIGHT);
AddAnchor(IDC_NOPROJ_FRAME, TOP_LEFT, BOTTOM_RIGHT);
AddAnchor(IDC_NOPROJ_TEXT, TOP_LEFT, BOTTOM_RIGHT);
AddAnchor(IDC_NOPROJ_NOTE, BOTTOM_LEFT, BOTTOM_RIGHT);
AddAnchor(IDC_TXT_TOTAL, BOTTOM_LEFT);
AddAnchor(IDC_TXT_P, BOTTOM_LEFT);
AddAnchor(IDC_TXT_C, BOTTOM_LEFT);
AddAnchor(IDC_LINEST, BOTTOM_LEFT);
AddAnchor(IDC_LINESC, BOTTOM_LEFT);
AddAnchor(IDC_LINESP, BOTTOM_LEFT);
AddAnchor(IDC_CODET, BOTTOM_LEFT);
AddAnchor(IDC_CODEC, BOTTOM_LEFT);
AddAnchor(IDC_CODEP, BOTTOM_LEFT);
AddAnchor(IDC_COMMENTST, BOTTOM_LEFT);
AddAnchor(IDC_COMMENTSC, BOTTOM_LEFT);
AddAnchor(IDC_COMMENTSP, BOTTOM_LEFT);
AddAnchor(IDC_MIXEDT, BOTTOM_LEFT);
AddAnchor(IDC_MIXEDC, BOTTOM_LEFT);
AddAnchor(IDC_MIXEDP, BOTTOM_LEFT);
AddAnchor(IDC_BLANKT, BOTTOM_LEFT);
AddAnchor(IDC_BLANKC, BOTTOM_LEFT);
AddAnchor(IDC_BLANKP, BOTTOM_LEFT);
AddAnchor(IDC_NETLINEST, BOTTOM_LEFT);
AddAnchor(IDC_NETLINESC, BOTTOM_LEFT);
AddAnchor(IDC_NETLINESP, BOTTOM_LEFT);
AddAnchor(IDC_NETLINEST, BOTTOM_LEFT);
AddAnchor(IDC_NETLINESC, BOTTOM_LEFT);
AddAnchor(IDC_NETLINESP, BOTTOM_LEFT);
AddAnchor(IDC_TXT_FILTER, BOTTOM_LEFT);
AddAnchor(IDC_FILTER, BOTTOM_LEFT);
AddAnchor(IDC_TIP_ICON, BOTTOM_LEFT);
AddAnchor(IDC_TIP_TEXT, BOTTOM_LEFT);
AddAnchor(IDOK, BOTTOM_RIGHT);
EnableSaveRestore("ResultsDlg");
InitStats();
return TRUE;
}
bool FindMenuItem(CMenu *pMenu, UINT nIDToFind, CMenu *& pOutMenu, int& iOutIndex)
{
for (UINT i = 0; i < pMenu->GetMenuItemCount(); ++i)
{
UINT nID = pMenu->GetMenuItemID(i);
if (nID == nIDToFind)
{
pOutMenu = pMenu;
iOutIndex = i;
return true;
}
if (nID == (unsigned)-1)
{
// submenu
if (FindMenuItem(pMenu->GetSubMenu(i), nIDToFind, pOutMenu, iOutIndex))
{
return true;
}
}
}
pOutMenu = NULL;
iOutIndex = -1;
return false;
}
void CResultsDlg::InitStats()
{
ASSERT(m_pWI != NULL);
::ResetStats();
int i;
m_iContext = 0;
CMenu *pMenuStatsFilter;
VERIFY(FindMenuItem(GetMenu(), ID_STATISTICS_FILTER1,
pMenuStatsFilter, i));
// delete all items except for first one (leave it temporarily so
// sub menu is never empty)
while (pMenuStatsFilter->GetMenuItemCount() > 1)
{
pMenuStatsFilter->DeleteMenu(
pMenuStatsFilter->GetMenuItemCount() - 1, MF_BYPOSITION);
}
m_nWorkspaceFilters = m_pWI->GetWorkspaceFilterCount();
ASSERT(m_nWorkspaceFilters > 0);
for (i = 0; i < m_nWorkspaceFilters; ++i)
{
CString cStr;
cStr = m_pWI->GetWorkspaceFilterName(i);
cStr.Insert(0, '<');
cStr += '>';
AddFilter(cStr, ID_STATISTICS_FILTER1 + i);
pMenuStatsFilter->AppendMenu(MF_STRING,
ID_STATISTICS_FILTER1 + i, cStr);
}
pMenuStatsFilter->DeleteMenu(0, MF_BYPOSITION);
m_pWI->Refresh();
const int cProjects = m_pWI->GetProjectCount();
if (cProjects == 0)
{
m_Filter.EnableWindow(FALSE);
m_ListCtrl.ShowWindow(SW_HIDE);
m_bHasProject = false;
// this note only regards the Workspace Whiz! Interface & VC6
if (RUNNING_IN_DOT_NET())
{
GetDlgItem(IDC_NOPROJ_NOTE)->ShowWindow(SW_HIDE);
}
}
else
{
GetDlgItem(IDC_NOPROJ_FRAME)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_NOPROJ_TEXT)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_NOPROJ_NOTE)->ShowWindow(SW_HIDE);
pMenuStatsFilter->AppendMenu(MF_SEPARATOR, 0, (LPCTSTR)0);
for (i = 0; i < cProjects; ++i)
{
IWorkspaceProject *pPrj = m_pWI->GetProject(i);
CString prjName = pPrj->GetName();
delete pPrj;
int p = prjName.ReverseFind('\\');
if (p > 0) prjName = prjName.Mid(p + 1);
CString strTemp = prjName;
strTemp.MakeLower();
if (strTemp.Find(".dsw") < 0) // don't add .dsw files
{
int id = ID_STATISTICS_FILTER1 + i + m_nWorkspaceFilters;
AddFilter(prjName, id);
pMenuStatsFilter->AppendMenu(MF_STRING, id, prjName);
}
}
m_bHasProject = true;
}
UpdateDialogControls(this, TRUE);
RedrawWindow();
// select last filter, or default
int iFilter = 0;
CString s;
for (i = 0; i < m_Filter.GetCount(); ++i)
{
m_Filter.GetLBText(i, s);
if (s.CompareNoCase(cfg_sLastFilter) == 0)
{
iFilter = i;
break;
}
else
{
if ((int)(m_Filter.GetItemData(i) - ID_STATISTICS_FILTER1) ==
cfg_iDefaultFilter)
{
iFilter = i;
}
}
}
if (iFilter > m_Filter.GetCount())
{
iFilter = 0;
}
SetFilter(iFilter);
}
void CResultsDlg::RefreshStats()
{
if (!m_bHasProject) return;
int files, total, code, mixed, com, blank;
files = total = code = mixed = com = blank = 0;
m_ListCtrl.SetRedraw(FALSE);
m_ListCtrl.DeleteAllItems();
++m_iContext;
// read the N/A string
if (m_sNA.IsEmpty())
{
GetDlgItem(IDC_BLANKC)->GetWindowText(m_sNA);
}
ProjectList projects;
ProjectListFromFilter(m_iFilterIndex, projects);
POSITION p = projects.GetHeadPosition();
while (p)
{
IWorkspaceProject *pPrj = projects.GetNext(p);
const int cFiles = pPrj->GetFileCount();
IProjectFile *pFile = NULL;
for (int f = 0; f < cFiles; ++f)
{
delete pFile;
pFile = pPrj->GetFile(f);
CFileInfo& fi = ::GetStats(pFile->GetPath());
if (fi.m_stat == CFileInfo::filtered &&
!CHK_FLAG(cfg_ShowFiltered, SF_GRID))
{
// not showing filtered files in the grid
continue;
}
if (fi.m_stat != CFileInfo::full &&
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -