Click here to Skip to main content
15,885,216 members
Articles / Programming Languages / C++

Project Line Counter Add-In v2.10 for VS.NET and VC6

Rate me:
Please Sign up or sign in to vote.
4.92/5 (38 votes)
29 Jun 2003 447.8K   5.3K   142  
Get statistics about your source code with a click of a button
/***************************************************************************/
/* 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.                                   */
/***************************************************************************/

// Options.cpp : implementation file
//

#include "stdafx.h"
#include "LineCount.h"
#include "Options.h"
#include "Config.h"
#include "InsertExtDlg.h"
#include "InsertFileDlg.h"
#include "Help\HelpIDs.h"
#include "Utils.h"
#include "ParserManager.h"
#include "WorkspaceInfo.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// COptionsSheet

IMPLEMENT_DYNAMIC(COptionsSheet, CHHPropSheet)

COptionsSheet::COptionsSheet(CWnd* pParentWnd, UINT iSelectPage)
	: CHHPropSheet("Options", pParentWnd, iSelectPage)
{
    AddPage(&m_FilesPage);
    AddPage(&m_ExtPage);
    AddPage(&m_StatsPage);
    AddPage(&m_OptionsPage);
}

COptionsSheet::~COptionsSheet()
{
}


BEGIN_MESSAGE_MAP(COptionsSheet, CHHPropSheet)
	//{{AFX_MSG_MAP(COptionsSheet)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COptionsSheet message handlers



/////////////////////////////////////////////////////////////////////////////
// CPageWithList class

IMPLEMENT_DYNCREATE(CPageWithList, CAutoPropPage)

CPageWithList::CPageWithList(CListBox& managedList, int iDelButton, 
    int iInsButton, UINT nIDTemplate, bool bAllowImplicit /*= true*/, 
    int iHelpID /*= -1*/, UINT nIDCaption /*= 0*/) : 
    CAutoPropPage(nIDTemplate, bAllowImplicit, iHelpID, nIDCaption),
    m_pManagedList(&managedList), m_iDelButton(iDelButton), 
    m_iInsButton(iInsButton)
{
}

void CPageWithList::InitPageWithList()
{
    m_pUndoWnd = GetDlgItem(IDC_UNDO);
    SetLastUndo(none, "");
    SetModified(FALSE);
}

void CPageWithList::DeleteString(CString str)
{
    m_pManagedList->DeleteString(m_pManagedList->FindStringExact(0, str));
    OnUpdateList();
    SetLastUndo(del, str);
	SetModified();
}

void CPageWithList::InsertString(CString str)
{
    m_pManagedList->SetCurSel(m_pManagedList->AddString(str));
    OnUpdateList();
    SetLastUndo(ins, str);
    HandlerImpl_OnSelChange();
	SetModified();
}

void CPageWithList::SetLastUndo(undo_ops op, CString val)
{
    m_LastUndoOp = op;
    m_sLastUndoVal = val;
    m_pUndoWnd->SetWindowText("Und&o");
    m_pUndoWnd->EnableWindow(m_LastUndoOp != none);
}

void CPageWithList::HandlerImpl_OnSelChange() 
{
    BOOL bEnable = (m_pManagedList->GetCurSel() != LB_ERR);
    GetDlgItem(m_iDelButton)->EnableWindow(bEnable);
}

void CPageWithList::HandlerImpl_OnUndo() 
{
    switch (m_LastUndoOp)
    {
        case del:
            InsertString(m_sLastUndoVal);
            m_LastUndoOp = ins;
            break;

        case ins:
            DeleteString(m_sLastUndoVal);
            m_LastUndoOp = del;
            break;

        default:
            return;
    }

    m_pUndoWnd->SetWindowText("Red&o");
}

void CPageWithList::HandlerImpl_OnDelete() 
{
    CString sToDel;
    int iCurSel = m_pManagedList->GetCurSel();

    if (iCurSel < 0)
        return;

    m_pManagedList->GetText(iCurSel, sToDel);
    DeleteString(sToDel);

    if (iCurSel > m_pManagedList->GetCount()) iCurSel--;
    if (iCurSel >= 0)
        m_pManagedList->SetCurSel(iCurSel);

    HandlerImpl_OnSelChange();
    OnUpdateList();
}

int CPageWithList::HandlerImpl_OnVKeyToItem(UINT nKey, CListBox* pListBox, UINT nIndex) 
{
    if (pListBox == m_pManagedList)
    {
	    switch (nKey)
        {
            case VK_DELETE:
            {
                if (m_pManagedList->GetCurSel() != LB_ERR)
                {
                    GetParent()->SendMessage(WM_COMMAND, m_iDelButton, NULL);
                }
                break;
            }

            case VK_INSERT:
            {
                GetParent()->SendMessage(WM_COMMAND, m_iInsButton, NULL);
                break;
            }
        }
    }
	
    return CAutoPropPage::OnVKeyToItem(nKey, pListBox, nIndex);
}



/////////////////////////////////////////////////////////////////////////////
// CFilesPage property page

IMPLEMENT_DYNCREATE(CFilesPage, CPageWithList)

CFilesPage::CFilesPage() : CPageWithList(m_FileList, IDC_DELETEFILE,
    IDC_INSERTFILE, CFilesPage::IDD)
{
	//{{AFX_DATA_INIT(CFilesPage)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT

    m_iHelpID = IDH_OPT_FILES;

	strpair strs[] = 
    {
        { &m_sFileList,   &cfg_sFileIgnoreList }
    };
	
    InitAutoStrs(countof(strs), strs);
}

CFilesPage::~CFilesPage()
{
}

void CFilesPage::DoDataExchange(CDataExchange* pDX)
{
	CPageWithList::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CFilesPage)
	DDX_Control(pDX, IDC_FILE_LIST, m_FileList);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CFilesPage, CPageWithList)
	//{{AFX_MSG_MAP(CFilesPage)
	ON_BN_CLICKED(IDC_INSERTFILE, OnInsertfile)
	ON_BN_CLICKED(IDC_DELETEFILE, OnDeletefile)
	ON_BN_CLICKED(IDC_UNDO, OnUndo)
	ON_BN_CLICKED(IDC_CLEARALLFILES, OnClearallfiles)
	ON_LBN_SELCHANGE(IDC_FILE_LIST, OnSelchangeFileList)
	ON_LBN_SELCANCEL(IDC_FILE_LIST, OnSelchangeFileList)
	ON_WM_VKEYTOITEM()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFilesPage message handlers

BOOL CFilesPage::OnInitDialog() 
{
	CPageWithList::OnInitDialog();

    InitPageWithList();
    FillFileList();

    return TRUE;
}

void CFilesPage::OnInsertfile() 
{
    CInsertFileDlg dlg;
    
    if (dlg.DoModal() == IDOK)
    {
        InsertString(dlg.m_sFile);
    }
}

void CFilesPage::OnDeletefile() 
{
    HandlerImpl_OnDelete();
}

void CFilesPage::OnUndo() 
{
    HandlerImpl_OnUndo();
}

void CFilesPage::OnClearallfiles() 
{
    m_sFileList = "";
    FillFileList();
    SetLastUndo(none, "");
}

void CFilesPage::OnSelchangeFileList() 
{
    HandlerImpl_OnSelChange();
}

int CFilesPage::OnVKeyToItem(UINT nKey, CListBox* pListBox, UINT nIndex) 
{
    return HandlerImpl_OnVKeyToItem(nKey, pListBox, nIndex);
}

void CFilesPage::OnUpdateList()
{
    m_sFileList.Empty();

    const int items = m_FileList.GetCount();
    CString cStr;
    for (int i = 0; i < items; ++i)
    {
         if (!m_sFileList.IsEmpty())
         {
             m_sFileList += LIST_DELIMITER;
         }
         m_FileList.GetText(i, cStr);
         m_sFileList += cStr;
    }
}

void CFilesPage::FillFileList()
{
    CStringList strList;
    m_FileList.ResetContent();
    String2StringList(m_sFileList, LIST_DELIMITER, strList);
    POSITION p = strList.GetHeadPosition();
    while (p)
    {
        m_FileList.AddString(strList.GetNext(p));
    }

    OnUpdateList();
    OnSelchangeFileList();
    SetModified();
}


/////////////////////////////////////////////////////////////////////////////
// CExtensionsPage property page

IMPLEMENT_DYNCREATE(CExtensionsPage, CAutoPropPage)

CExtensionsPage::CExtensionsPage() : CAutoPropPage(CExtensionsPage::IDD, true)
{
	//{{AFX_DATA_INIT(CExtensionsPage)
	//}}AFX_DATA_INIT

    m_iHelpID = IDH_OPT_EXT;

    CParserManager::Get().GetState(m_OldPMState);
}

CExtensionsPage::~CExtensionsPage()
{
}

void CExtensionsPage::DoDataExchange(CDataExchange* pDX)
{
	CAutoPropPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CExtensionsPage)
	DDX_Control(pDX, IDC_EXT_LIST, m_ExtList);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CExtensionsPage, CAutoPropPage)
	//{{AFX_MSG_MAP(CExtensionsPage)
	ON_BN_CLICKED(IDC_RESET, OnResetList)
	ON_WM_VKEYTOITEM()
	ON_BN_CLICKED(IDC_INSERTEXT, OnInsertext)
	ON_BN_CLICKED(IDC_DELETEEXT, OnDeleteext)
	ON_BN_CLICKED(IDC_UNDO, OnUndo)
	ON_NOTIFY(LVN_ITEMCHANGED, IDC_EXT_LIST, OnItemchangedExtList)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CExtensionsPage message handlers

BOOL CExtensionsPage::OnInitDialog() 
{
	CAutoPropPage::OnInitDialog();

    m_ExtList.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
    m_ExtList.InsertColumn(0, "Extension", LVCFMT_LEFT, 100);
    m_ExtList.InsertColumn(1, "Parser",    LVCFMT_LEFT, 200);
	
    m_pUndoWnd = GetDlgItem(IDC_UNDO);
    m_pUndoWnd->EnableWindow(FALSE);

    FillExtList();

    m_ExtList.SetColumnWidth(1, LVSCW_AUTOSIZE);

    OnSelChange();

	return TRUE;
}

void CExtensionsPage::OnCancel()
{
    CAutoPropPage::OnCancel();
    CParserManager::Get().SetState(m_OldPMState);
}

void CExtensionsPage::OnSelChange() 
{
    const bool bHasSelected = m_ExtList.GetFirstSelectedItemPosition() != NULL;

    GetDlgItem(IDC_DELETEEXT)->EnableWindow(bHasSelected);
}

void CExtensionsPage::OnItemchangedExtList(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

    OnSelChange();
	
	*pResult = 0;
}

void CExtensionsPage::OnResetList() 
{
    MarkUndo();
    CParserManager::Get().ResetPairs();
    FillExtList();
    SetModified(TRUE);
}

void CExtensionsPage::MarkUndo()
{
    CParserManager::Get().GetState(m_LastUndoVal);
    m_pUndoWnd->SetWindowText("Und&o");
    m_pUndoWnd->EnableWindow(TRUE);
}

void CExtensionsPage::OnInsertext() 
{
    CInsertExtDlg dlg;
    
    if (dlg.DoModal() == IDOK)
    {
        MarkUndo();
        CParserManager::parser_fileext_pair tmp;
        tmp.sExt = dlg.m_Ext;
        tmp.pParser = dlg.m_pParser;
        CParserManager::Get().AddPair(tmp);
        FillExtList();
    }
}

void CExtensionsPage::OnDeleteext() 
{
    MarkUndo();
    int ndx = -1;
    for (;;)
    {
        ndx = m_ExtList.GetNextItem(ndx, LVNI_SELECTED);
        if (ndx < 0) break;
        CParserManager::Get().RemovePair(m_ExtList.GetItemText(ndx, 0));
    }
    FillExtList();
}

void CExtensionsPage::OnUndo() 
{
    undo_t tmpState;
    CParserManager::Get().GetState(tmpState);
    CParserManager::Get().SetState(m_LastUndoVal);
    m_LastUndoVal = tmpState;
    FillExtList();
    m_pUndoWnd->SetWindowText("Red&o");
}

int CExtensionsPage::OnVKeyToItem(UINT nKey, CListBox* pListBox, UINT nIndex) 
{
//    return HandlerImpl_OnVKeyToItem(nKey, pListBox, nIndex);
    return 0;
}

void CExtensionsPage::InsertPair(CParserManager::parser_fileext_pair& pair)
{
    int ndx = m_ExtList.InsertItem(0, pair.sExt);
    m_ExtList.SetItemData(ndx, (DWORD)pair.pParser);
    m_ExtList.SetItem(ndx, 1, LVIF_TEXT, 
        CString(MAKEINTRESOURCE(pair.pParser->GetParserNameResourceID())), 
        0, 0, 0, 0);
}


void CExtensionsPage::FillExtList()
{
    CParserManager::PairArray arr;
    CParserManager::Get().GetPairs(arr);

    m_ExtList.DeleteAllItems();

    for (int i = 0; i < arr.GetSize(); ++i)
    {
        InsertPair(arr[i]);
    }

    OnSelChange();
    SetModified();
}



/////////////////////////////////////////////////////////////////////////////
// CStatsPage property page

IMPLEMENT_DYNCREATE(CStatsPage, CAutoPropPage)

BEGIN_HELP_IDS(CStatsPage)
    IDC_STATIC_DEFAULT_FILTER,  IDC_DEFAULT_FILTER,
    IDC_STATIC_DEFAULT_FILTER2, IDC_DEFAULT_FILTER

END_HELP_IDS()

CStatsPage::CStatsPage() : CAutoPropPage(CStatsPage::IDD)
{
	//{{AFX_DATA_INIT(CStatsPage)
	m_bCheckComments = FALSE;
	m_bCountBlanks = FALSE;
	m_bIncBad_Export = FALSE;
	m_bIncBad_Grid = FALSE;
	m_bIncFilter_Export = FALSE;
	m_bIncFilter_Grid = FALSE;
	//}}AFX_DATA_INIT
    
    m_iHelpID = IDH_OPT_STATS;

    varpair vars[] = 
    {
        { &m_bCountBlanks,      &cfg_bProcessBlanks   },
        { &m_bCheckComments,    &cfg_bProcessComments },
        { &m_iDefFilter,        &cfg_iDefaultFilter   },
        { &m_sfFiltered,        &cfg_ShowFiltered     },
        { &m_sfBadFiles,        &cfg_ShowBadFiles     }
    };

    InitAutoVars(countof(vars), vars);
}

CStatsPage::~CStatsPage()
{
}

void CStatsPage::DoDataExchange(CDataExchange* pDX)
{
	CAutoPropPage::DoDataExchange(pDX);

    if (!pDX->m_bSaveAndValidate)
    {
        m_bIncBad_Grid      = CHK_FLAG(m_sfBadFiles, SF_GRID);
        m_bIncBad_Export    = CHK_FLAG(m_sfBadFiles, SF_EXPORT);
        m_bIncFilter_Grid   = CHK_FLAG(m_sfFiltered, SF_GRID);
        m_bIncFilter_Export = CHK_FLAG(m_sfFiltered, SF_EXPORT);
    }

	//{{AFX_DATA_MAP(CStatsPage)
	DDX_Control(pDX, IDC_DEFAULT_FILTER, m_DefFilter);
	DDX_Check(pDX, IDC_CHECKCOMMENTS, m_bCheckComments);
	DDX_Check(pDX, IDC_COUNTBLANK, m_bCountBlanks);
	DDX_Check(pDX, IDC_INCBAD_EXPORT, m_bIncBad_Export);
	DDX_Check(pDX, IDC_INCBAD_GRID, m_bIncBad_Grid);
	DDX_Check(pDX, IDC_INCFILTER_EXPORT, m_bIncFilter_Export);
	DDX_Check(pDX, IDC_INCFILTER_GRID, m_bIncFilter_Grid);
	//}}AFX_DATA_MAP

    if (!pDX->m_bSaveAndValidate)
    {
        m_DefFilter.SetCurSel(m_iDefFilter);
    }
    else
    {
        m_iDefFilter = m_DefFilter.GetCurSel();
        if (m_iDefFilter < 0  ||  
            m_iDefFilter > m_DefFilter.GetCount())
        {
            m_iDefFilter = 0;
        }

        m_sfBadFiles = 0;
        if (m_bIncBad_Export) m_sfBadFiles |= SF_EXPORT;
        if (m_bIncBad_Grid)   m_sfBadFiles |= SF_GRID;

        m_sfFiltered = 0;
        if (m_bIncFilter_Export) m_sfFiltered |= SF_EXPORT;
        if (m_bIncFilter_Grid)   m_sfFiltered |= SF_GRID;
    }
}

BEGIN_MESSAGE_MAP(CStatsPage, CAutoPropPage)
	//{{AFX_MSG_MAP(CStatsPage)
	ON_BN_CLICKED(IDC_CHECKCOMMENTS, DoModified)
	ON_BN_CLICKED(IDC_COUNTBLANK, DoModified)
	ON_CBN_SELCHANGE(IDC_DEFAULT_FILTER, DoModified)
	ON_BN_CLICKED(IDC_INCFILTER_GRID, DoModified)
	ON_BN_CLICKED(IDC_INCFILTER_EXPORT, DoIncFilterExport)
	ON_BN_CLICKED(IDC_INCBAD_GRID, DoModified)
	ON_BN_CLICKED(IDC_INCBAD_EXPORT, OnIncBadExport)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CStatsPage message handlers

BOOL CStatsPage::OnInitDialog() 
{
	CAutoPropPage::OnInitDialog();

    PopuplateDefaultFilters(g_pWorkspaceInfo);

	return TRUE;
}

void CStatsPage::PopuplateDefaultFilters(IWorkspaceInfo *pWI)
{
    const int nWorkspaceFilters = pWI->GetWorkspaceFilterCount();
    ASSERT(nWorkspaceFilters > 0);
    for (int i = 0; i < nWorkspaceFilters; ++i)
    {
        CString cStr;
        cStr = pWI->GetWorkspaceFilterName(i);
        cStr.Insert(0, '<');
        cStr += '>';

        const int ndx = m_DefFilter.AddString(cStr);
        m_DefFilter.SetItemData(ndx, i);
    }
    UpdateData(FALSE);
}


void CStatsPage::DoModified() 
{
    SetModified();
}

void CStatsPage::DoIncFilterExport() 
{
    bool bDoModify = true;
	UpdateData();
    if (m_bIncFilter_Export)
    {
        if (AfxMessageBox(IDS_WARN_SPECIAL_FILES_IN_EXPORT, 
            MB_YESNO | MB_ICONWARNING) != IDYES)
        {
            m_sfFiltered &= ~SF_EXPORT;
            UpdateData(FALSE);
            bDoModify = false;
        }
    }
    if (bDoModify) DoModified();
}

void CStatsPage::OnIncBadExport() 
{
    bool bDoModify = true;
	UpdateData();
    if (m_bIncBad_Export)
    {
        if (AfxMessageBox(IDS_WARN_SPECIAL_FILES_IN_EXPORT, 
            MB_YESNO | MB_ICONWARNING) != IDYES)
        {
            m_sfBadFiles &= ~SF_EXPORT;
            UpdateData(FALSE);
            bDoModify = false;
        }
    }
    if (bDoModify) DoModified();
}


/////////////////////////////////////////////////////////////////////////////
// COptionsPage property page

IMPLEMENT_DYNCREATE(COptionsPage, CAutoPropPage)

BEGIN_HELP_IDS(COptionsPage)
    IDC_STYLESHEET,             IDC_XSL_FIXED
END_HELP_IDS()

COptionsPage::COptionsPage() : CAutoPropPage(COptionsPage::IDD)
{
	//{{AFX_DATA_INIT(COptionsPage)
	m_XSLType = -1;
	m_sXSLName = _T("");
	m_PathType = -1;
	//}}AFX_DATA_INIT
    
    m_iHelpID = IDH_OPT_OPT;

    varpair vars[] = 
    {
        { &m_XSLType,           (int *)&cfg_XSLTUsage },
        { &m_PathType,          (int *)&cfg_PathUsage },
    };
    strpair strs[] =
    {
        { &m_sXSLName,          &cfg_sXSLTTemplate    }
    };

    InitAutoVars(countof(vars), vars);
    InitAutoStrs(countof(strs), strs);
}

COptionsPage::~COptionsPage()
{
}

void COptionsPage::DoDataExchange(CDataExchange* pDX)
{
	CAutoPropPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(COptionsPage)
	DDX_Radio(pDX, IDC_XSL_NONE, m_XSLType);
	DDX_Text(pDX, IDC_STYLESHEET, m_sXSLName);
	DDX_Radio(pDX, IDC_PATH_DSW, m_PathType);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(COptionsPage, CAutoPropPage)
	//{{AFX_MSG_MAP(COptionsPage)
	ON_EN_CHANGE(IDC_STYLESHEET, DoModified)
	ON_BN_CLICKED(IDC_XSL_NONE, OnXSLSel)
	ON_BN_CLICKED(IDC_XSL_SAMENAME, OnXSLSel)
	ON_BN_CLICKED(IDC_XSL_FIXED, OnXSLSel)
	ON_BN_CLICKED(IDC_PATH_DSW, OnPathSel)
	ON_BN_CLICKED(IDC_PATH_FILTER, OnPathSel)
	ON_BN_CLICKED(IDC_PATH_FULL, OnPathSel)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COptionsPage message handlers


BOOL COptionsPage::OnInitDialog() 
{
	CAutoPropPage::OnInitDialog();

    OnXSLSel();
    OnPathSel();

	return TRUE;
}

void COptionsPage::DoModified() 
{
    SetModified();
}

void COptionsPage::OnXSLSel() 
{
    UpdateData();
    DoModified();
    GetDlgItem(IDC_STYLESHEET)->EnableWindow(m_XSLType == 2);
}

void COptionsPage::OnPathSel() 
{
    UpdateData();
    DoModified();
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Experion
Canada Canada
You may know Oz from his WndTabs days. Oz has long since left client side development to work on web technologies and to consult in the R&D management field.

Comments and Discussions