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

📄 resultsdlg.cpp

📁 一个统计文件大小和程序信息的插件程序(vc或vc.net下使用)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                !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 + -