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

📄 resultsdlg.cpp

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