📄 resultsdlg.cpp
字号:
!CHK_FLAG(cfg_ShowBadFiles, SF_GRID))
{
// not showing bad files in the grid
continue;
}
if (fi.m_iContext < m_iContext)
{
// this will prevent us from counting the same file twice
fi.m_iContext = m_iContext;
if (fi.m_stat == CFileInfo::full)
{
total += fi.m_iTotalLines;
com += fi.m_iLinesWithComments;
code += fi.m_iLinesWithCode;
blank += fi.m_iBlankLines;
mixed += CalculateMixedLines(fi.m_iTotalLines,
fi.m_iLinesWithCode, fi.m_iLinesWithComments,
fi.m_iBlankLines);
}
++files;
AddRow(fi);
}
}
delete pFile;
}
CFileInfo fiTotal;
fiTotal.m_sFileName = TOTAL_STR;
fiTotal.m_iBlankLines = blank;
fiTotal.m_iLinesWithCode = code;
fiTotal.m_iLinesWithComments = com;
fiTotal.m_iTotalLines = total;
fiTotal.m_stat = CFileInfo::full;
int nRowTotal = AddRow(fiTotal);
if( -1 != nRowTotal )
{
//mark the line with the summary info
m_ListCtrl.SetItemData(nRowTotal, DWORD(-1));
}
CString msg, s;
s.Format("%d", files);
AfxFormatString1(msg, IDS_FILECOUNT, s);
SetWindowText(msg);
if (!cfg_bProcessBlanks)
{
blank = -1;
}
if (!cfg_bProcessComments)
{
com = mixed = -1;
}
SetPair(IDC_LINESC, IDC_LINESP, total, total);
SetPair(IDC_CODEC, IDC_CODEP, code, total);
SetPair(IDC_NETLINESC, IDC_NETLINESP, total - blank, total);
SetPair(IDC_BLANKC, IDC_BLANKP, blank, total);
SetPair(IDC_COMMENTSC, IDC_COMMENTSP, com, total);
SetPair(IDC_MIXEDC, IDC_MIXEDP, mixed, total);
m_ListCtrl.SortCombinedColumns(true);
m_ListCtrl.SetRedraw(TRUE);
m_ListCtrl.RedrawWindow();
}
void CResultsDlg::AddFilter(const char *pszFilter, int data)
{
int i = m_Filter.AddString(pszFilter);
m_Filter.SetItemData(i, data);
}
int CResultsDlg::AddRow(const CFileInfo& fi)
{
int nRes = -1;
LV_ITEM lvi;
lvi.mask = LVIF_TEXT | LVIF_PARAM;
lvi.iItem = m_ListCtrl.GetItemCount();
lvi.lParam = (LPARAM)&fi;
lvi.iSubItem = 0;
lvi.pszText = (LPTSTR)(LPCTSTR)fi.m_sFileName;
nRes = m_ListCtrl.InsertItem(&lvi);
int iSubItem = 0;
m_ListCtrl.SetItemText(lvi.iItem, ++iSubItem, fi.m_sFileExt);
m_ListCtrl.SetItemText(lvi.iItem, ++iSubItem, fi.m_sFilePath);
m_ListCtrl.SetItemText(lvi.iItem, ++iSubItem, fi.GetTotalLinesStr());
m_ListCtrl.SetItemText(lvi.iItem, ++iSubItem, fi.GetLinesWithCodeStr());
m_ListCtrl.SetItemText(lvi.iItem, ++iSubItem, fi.GetLinesWithCommentsStr());
m_ListCtrl.SetItemText(lvi.iItem, ++iSubItem, fi.GetMixedLinesStr());
m_ListCtrl.SetItemText(lvi.iItem, ++iSubItem, fi.GetBlankLinesStr());
return nRes;
}
void CResultsDlg::SetNum(int id, int num, TCHAR suffix)
{
CString cStr = NumberWithCommas(num);
if (suffix)
cStr += suffix;
GetDlgItem(id)->SetWindowText(cStr);
}
void CResultsDlg::SetPair(int idc, int idp, int count, int tot)
{
if (count < 0)
{
GetDlgItem(idc)->SetWindowText(m_sNA);
GetDlgItem(idp)->SetWindowText(m_sNA);
return;
}
SetNum(idc, count);
if (tot)
SetNum(idp, (count * 100) / tot, '%');
else
SetNum(idp, 0, '%');
}
static const TCHAR *FILTERS =
_T("Comma Separated Values (*.csv)|*.csv|")
_T("XML Data (*.xml)|*.xml|")
_T("|");
const int NUM_FILTERS = 2;
void CResultsDlg::OnExport()
{
if (cfg_iDefaultExportType <= 0 || cfg_iDefaultExportType > NUM_FILTERS)
{
cfg_iDefaultExportType = 1;
}
CFileDialog dlg(FALSE, "", NULL,
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, FILTERS);
dlg.m_ofn.nFilterIndex = cfg_iDefaultExportType;
if (dlg.DoModal() == IDOK && !dlg.GetPathName().IsEmpty())
{
CWaitCursor wc;
cfg_iDefaultExportType = dlg.m_ofn.nFilterIndex;
bool bSuccess = false;
ProjectList projects;
ProjectListFromFilter(m_iFilterIndex, projects);
if (dlg.m_ofn.nFilterIndex <= 1)
{
bSuccess = ExportAsCSV(dlg.GetPathName(), projects);
}
else
{
bSuccess = ExportAsXML(dlg.GetPathName(), projects,
m_pWI->GetWorkspaceName());
}
wc.Restore();
if (bSuccess)
{
AfxMessageBox(IDS_MSG_GOODEXPORT, MB_OK | MB_ICONINFORMATION);
}
}
}
void CResultsDlg::OnOptions()
{
COptionsSheet dlg;
if (dlg.DoModal() == IDOK)
{
::ResetStats();
int iCurrFilter = m_iFilterIndex;
m_iFilterIndex = -1;
SetFilter(iCurrFilter);
}
}
void CResultsDlg::OnAbout()
{
CAboutDialog dlg;
dlg.DoModal();
}
// this code is based on CFrameWnd::OnInitMenuPopup
void CResultsDlg::OnInitMenuPopup(CMenu* pMenu, UINT nIndex, BOOL bSysMenu)
{
if (bSysMenu)
return; // don't support system menu
ASSERT(pMenu != NULL);
// check the enabled state of various menu items
CCmdUI state;
state.m_pMenu = pMenu;
ASSERT(state.m_pOther == NULL);
ASSERT(state.m_pParentMenu == NULL);
// determine if menu is popup in top-level menu and set m_pOther to
// it if so (m_pParentMenu == NULL indicates that it is secondary popup)
HMENU hParentMenu;
if (AfxGetThreadState()->m_hTrackingMenu == pMenu->m_hMenu)
state.m_pParentMenu = pMenu; // parent == child for tracking popup
else if ((hParentMenu = ::GetMenu(m_hWnd)) != NULL)
{
CWnd* pParent = GetTopLevelParent();
// child windows don't have menus -- need to go to the top!
if (pParent != NULL &&
(hParentMenu = ::GetMenu(pParent->m_hWnd)) != NULL)
{
int nIndexMax = ::GetMenuItemCount(hParentMenu);
for (int nIndex = 0; nIndex < nIndexMax; nIndex++)
{
if (::GetSubMenu(hParentMenu, nIndex) == pMenu->m_hMenu)
{
// when popup is found, m_pParentMenu is containing menu
state.m_pParentMenu = CMenu::FromHandle(hParentMenu);
break;
}
}
}
}
state.m_nIndexMax = pMenu->GetMenuItemCount();
for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax;
state.m_nIndex++)
{
state.m_nID = pMenu->GetMenuItemID(state.m_nIndex);
if (state.m_nID == 0)
continue; // menu separator or invalid cmd - ignore it
ASSERT(state.m_pOther == NULL);
ASSERT(state.m_pMenu != NULL);
if (state.m_nID == (UINT)-1)
{
// possibly a popup menu, route to first item of that popup
state.m_pSubMenu = pMenu->GetSubMenu(state.m_nIndex);
if (state.m_pSubMenu == NULL ||
(state.m_nID = state.m_pSubMenu->GetMenuItemID(0)) == 0 ||
state.m_nID == (UINT)-1)
{
continue; // first item of popup can't be routed to
}
state.DoUpdate(this, FALSE); // popups are never auto disabled
}
else
{
// normal menu item
// Auto enable/disable if frame window has 'm_bAutoMenuEnable'
// set and command is _not_ a system command.
state.m_pSubMenu = NULL;
state.DoUpdate(this, state.m_nID < 0xF000);
}
// adjust for menu deletions and additions
UINT nCount = pMenu->GetMenuItemCount();
if (nCount < state.m_nIndexMax)
{
state.m_nIndex -= (state.m_nIndexMax - nCount);
while (state.m_nIndex < nCount &&
pMenu->GetMenuItemID(state.m_nIndex) == state.m_nID)
{
state.m_nIndex++;
}
}
state.m_nIndexMax = nCount;
}
}
void CResultsDlg::OnUpdateStatisticsFilterProjects(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_bHasProject);
pCmdUI->SetCheck(m_Filter.GetItemData(m_Filter.GetCurSel()) ==
(DWORD)(pCmdUI->m_nID));
}
void CResultsDlg::ProjectListFromFilter(int iFilterIndex, ProjectList& projects)
{
iFilterIndex = m_Filter.GetItemData(iFilterIndex) - ID_STATISTICS_FILTER1;
if (iFilterIndex < m_nWorkspaceFilters)
{
const int cFilters =
m_pWI->GetWorkspaceFilterProjectCount(iFilterIndex);
for (int i = 0; i < cFilters; ++i)
{
IWorkspaceProject *pPrj =
m_pWI->GetWorkspaceFilterProject(iFilterIndex, i);
ASSERT(pPrj);
if (pPrj)
{
projects.AddTail(pPrj);
}
}
}
else
{
const int iPrj = iFilterIndex - m_nWorkspaceFilters;
ASSERT(m_pWI->GetProjectCount() > iPrj);
IWorkspaceProject *pPrj = m_pWI->GetProject(iPrj);
if (pPrj)
{
projects.AddTail(pPrj);
}
}
}
void CResultsDlg::SetFilter(int iIndex)
{
ASSERT(iIndex >= 0 && iIndex < m_Filter.GetCount());
if (iIndex == m_iFilterIndex && m_ListCtrl.GetItemCount() > 0)
{
return;
}
CWnd *pFocusedWnd = GetFocus();
m_Filter.SetCurSel(iIndex);
// update the stats based on the new filter
if (m_bHasProject)
{
ProjectList projects;
ProjectListFromFilter(iIndex, projects);
if (::UpdateStats(m_pWI, projects))
{
m_iFilterIndex = iIndex;
RefreshStats();
m_Filter.GetWindowText(cfg_sLastFilter);
}
}
if (m_iFilterIndex >= 0)
{
// this is necessary if user cancels the file scan:
m_Filter.SetCurSel(m_iFilterIndex); // reset to old index
}
if (pFocusedWnd)
{
pFocusedWnd->SetFocus();
}
}
void CResultsDlg::OnStatisticsFilterProjects(UINT iCmd)
{
// combo box is sorted - find actual index for this command
for (int i = 0; i < m_Filter.GetCount(); ++i)
{
if (m_Filter.GetItemData(i) == (DWORD)iCmd)
{
SetFilter(i);
return;
}
}
}
void CResultsDlg::OnSelchangeFilter()
{
int iCmd = m_Filter.GetItemData(m_Filter.GetCurSel());
PostMessage(WM_COMMAND, iCmd, 0);
}
void CResultsDlg::OnDownloads()
{
CHyperLink::GotoURL("http://www.wndtabs.com/downloads/", SW_SHOW);
}
void CResultsDlg::OnHomepage()
{
CHyperLink::GotoURL("http://www.wndtabs.com/plc/", SW_SHOW);
}
void CResultsDlg::OnFileSummary()
{
ProjectList projects;
ProjectListFromFilter(m_iFilterIndex, projects);
CFileSummaryDlg dlg(projects);
dlg.DoModal();
}
void CResultsDlg::OnUpdateStatsCommand(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_bHasProject);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -