Click here to Skip to main content
15,885,366 members
Articles / Desktop Programming / MFC

SmartReplace AddIn [VC 6.0]

Rate me:
Please Sign up or sign in to vote.
4.62/5 (16 votes)
23 Aug 20033 min read 68.5K   2K   32  
Yet another replace dialog
//***************************************************************************
//*
//*	File:			DialogSmartReplace.cpp
//*	Description:	Smart replace dialog
//*
//***************************************************************************

//
//--------------------------------------------------------------- PRECOMPILED
//

#include "stdafx.h"

//
//--------------------------------------------------- DECLARATION DEPENDENCIES
//

#include "SmartReplace.h"

//
//--------------------------------------------------------------- DECLARATION
//

#include "DialogSmartReplace.h"

//
//--------------------------------------------------- DEFINITION DEPENDENCIES
//

#include "StringEx.h"
#include "DialogOptions.h"
#include "DialogFilters.h"
#include "FolderDialog.h"

//
//-------------------------------------------------------------- PREPROCESSOR
//

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

//
//---------------------------------------------------------------- DEFINITION
//

#ifndef	MIN
#define MIN( a, b ) ( (a) < (b) ? (a) : (b) )
#endif

#ifndef	MAX
#define MAX( a, b ) ( (a) > (b) ? (a) : (b) )
#endif

static long g_GetRefCount( IUnknown* a_pIUnknown )
{
	if ( NULL == a_pIUnknown )
	{
		return 0l;
	}

			a_pIUnknown->AddRef	();
	return	a_pIUnknown->Release();
};

//
//---------------------------------------------------------------------------------------------------
//

const char* CDialogSmartReplace::ms_ppszRegExpFind[ CDialogSmartReplace::ERegExpFind_Count ][ CDialogSmartReplace::ERegExpEmulation_Count ] =
{
//	DevStd			VC2				Brief											Epsilon										Custom
	"."			,	"."			,	"?"											,	"."										,	"."				// any char
,	"[]"		,	"[]"		,	"[]"										,	"[]"									,	"[]"			// in range
,	"[^]"		,	"[^]"		,	"[~]"										,	"[^]"									,	"[^]"			// not in range
,	"^"			,	"^"			,	"%"											,	"^"										,	"^"				// begin of line
,	"$"			,	"$"			,	"$"											,	"$"										,	"$"				// end of line
,	"\\(\\)"	,	"\\(\\)"	,	"{}"										,	"()"									,	"\\(\\)"		// tagged expression
,	"\\~"		,	"\\~"		,	"~"											,	"~"										,	"\\~"			// not
,	"\\!"		,	"\\!"		,	"|"											,	"|"										,	"\\!"			// or
,	"*"			,	"*"			,	"@"											,	"*"										,	"*"				// 0 or more
,	"+"			,	"+"			,	"+"											,	"+"										,	"+"				// 1 or more
,	"\\{\\}"	,	"\\{\\}"	,	"{}"										,	"()"									,	"\\{\\}"		// group
,	"\\:b+"		,	"\\:b+"		,	"[ \x09]+"									,	"[ <tab>]+"								,	"\\:b+"			// whitespace
,	"\\:a"		,	"\\:a"		,	"[a-zA-Z0-9]"								,	"[a-zA-Z0-9]"							,	"\\:a"			// alpha numeric character
,	"\\:c"		,	"\\:c"		,	"[a-zA-Z]"									,	"[a-zA-Z]"								,	"\\:c"			// alpha character
,	"\\:d"		,	"\\:d"		,	"[0-9]"										,	"[0-9]"									,	"\\:d"			// decimal digit
,	"\\:h"		,	"\\:h"		,	"[0-9a-fA-F]+"								,	"[0-9a-fA-F]+"							,	"\\:h"			// hex number
,	"\\:n"		,	"\\:n"		,	"{[0-9]+.[0-9]@}|{[0-9]@.[0-9]+}|{[0-9]+}"	,	"([0-9]+.[0-9]*|[0-9]*.[0-9]+|[0-9]+)"	,	"\\:n"			// decimal number
,	"\\:z"		,	"\\:z"		,	"[0-9]+"									,	"[0-9]+"								,	"\\:z"			// integer
,	"\\:i"		,	"\\:i"		,	"[a-zA-Z_$][a-zA-Z0-9_$]@"					,	"[a-zA-Z_$][a-zA-Z0-9_$]*"				,	"\\:i"			// c++ identifier
,	"\\:w"		,	"\\:w"		,	"[a-zA-Z]+"									,	"[a-zA-Z]+"								,	"\\:w"			// alphabetic string (word)
,	"\\:q"		,	"\\:q"		,	"\"[~\"]@\""								,	"\"[~\"]*\""							,	"\\:q"			// quoted alphabetic string (word)
};

const char* CDialogSmartReplace::ms_ppszRegExpReplace[ CDialogSmartReplace::ERegExpReplace_Count ][ CDialogSmartReplace::ERegExpEmulation_Count ] =
{
//	DevStd			VC2				Brief											Epsilon										Custom
	"\\0"		,	"\\0"		,	"\\0"										,	"\\0"									,	"\\0"			// text
,	"\\1"		,	"\\1"		,	"\\1"										,	"\\1"									,	"\\1"			// tagged expression 1
,	"\\2"		,	"\\2"		,	"\\2"										,	"\\2"									,	"\\2"			// tagged expression 2
,	"\\3"		,	"\\3"		,	"\\3"										,	"\\3"									,	"\\3"			// tagged expression 3
,	"\\4"		,	"\\4"		,	"\\4"										,	"\\4"									,	"\\4"			// tagged expression 4
,	"\\5"		,	"\\5"		,	"\\5"										,	"\\5"									,	"\\5"			// tagged expression 5
,	"\\6"		,	"\\6"		,	"\\6"										,	"\\6"									,	"\\6"			// tagged expression 6
,	"\\7"		,	"\\7"		,	"\\7"										,	"\\7"									,	"\\7"			// tagged expression 7
,	"\\8"		,	"\\8"		,	"\\8"										,	"\\8"									,	"\\8"			// tagged expression 8
,	"\\9"		,	"\\9"		,	"\\9"										,	"\\9"									,	"\\9"			// tagged expression 9
};

//
//---------------------------------------------------------------------------------------------------
//*************************************     CON/DESTRUCTION     *************************************
//---------------------------------------------------------------------------------------------------
//

//***************************************************************************************************
//**																					  Constructor
//***************************************************************************************************
//**	@DOC		CONSTRUCTION
//**	@MFUNC		Default constructor
//**	@PARM		[in]	 Pointer to application's interface
//**	@PARM		[in|opt] Pointer to the parent window
//**	@END
//***************************************************************************************************
//inline
CDialogSmartReplace::CDialogSmartReplace( IApplication* a_pIApplication, CWnd* pParent /*=NULL*/ )
: CDialog( CDialogSmartReplace::IDD, pParent )
{
	//{{AFX_DATA_INIT(CDialogSmartReplace)
	m_bAllCases						= FALSE;
	m_bMatchCase					= FALSE;
	m_bRegularExpression			= FALSE;
	m_bWholeWord					= FALSE;
	m_strFindWhat					= _T("");
	m_strReplaceWith				= _T("");
	m_iReplaceWhereEx				= EReplaceWhereEx_AllOpen;
	m_iReplaceWhere					= EReplaceWhere_File;
	m_strDirectory					= _T("");
	m_strExtensions					= _T("");
	m_bRecurse						= FALSE;
	//}}AFX_DATA_INIT

	this->m_pIApplication			= a_pIApplication					;
	this->m_enuFindStringMode		= EFindStringMode_KeepIfNoSelection	;
	this->m_enuConfirmReplacement	= EConfirm_Never					;
	this->m_enuSaveAndClose			= ESaveAndClose_Never				;
	this->m_bAskForExtendedOnly		= FALSE								;
	this->m_bFileFinished			= FALSE								;
	this->m_lRegExpEmulation		= dsDevStudio						;
}

//
//---------------------------------------------------------------------------------------------------
//***************************************     PERSISTENCE     ***************************************
//---------------------------------------------------------------------------------------------------
//

//***************************************************************************************************
//**																					  LoadProfile 
//***************************************************************************************************
//**	@DOC		PERSISTENCE
//**	@MFUNC		Loads the dialog's settings from the registry
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::LoadProfile( void )
{
	//
	//	GET APPLICATION
	//
	CWinApp* pApp = ::AfxGetApp();

	//
	//	LOAD SECTION NAME
	//
	CString strSection; 
			strSection.LoadString( IDS_PROFILE_SECTION );

	//
	//	READ MEMBERS
	//
	this->m_bAllCases				= static_cast< BOOL					> (	pApp->GetProfileInt		( strSection, _T( "AllCases"			), FALSE								) );
	this->m_bMatchCase				= static_cast< BOOL					> (	pApp->GetProfileInt		( strSection, _T( "MatchCase"			), FALSE								) );
	this->m_bRegularExpression		= static_cast< BOOL					> (	pApp->GetProfileInt		( strSection, _T( "RegularExpression"	), FALSE								) );
	this->m_bWholeWord				= static_cast< BOOL					> (	pApp->GetProfileInt		( strSection, _T( "WholeWord"			), FALSE								) );
	this->m_bAskForExtendedOnly		= static_cast< BOOL					> (	pApp->GetProfileInt		( strSection, _T( "AskForExtendedOnly"	), FALSE								) );
	this->m_bRecurse				= static_cast< BOOL					> (	pApp->GetProfileInt		( strSection, _T( "RecurseDirectory"	), TRUE									) );
	this->m_enuFindStringMode		= static_cast< EFindStringMode		> (	pApp->GetProfileInt		( strSection, _T( "FindStringMode"		), EFindStringMode_KeepIfNoSelection	) );
	this->m_enuConfirmReplacement	= static_cast< EConfirmReplacement	> (	pApp->GetProfileInt		( strSection, _T( "ConfirmReplace"		), EConfirm_Never						) ); 
	this->m_enuSaveAndClose			= static_cast< ESaveAndClose		> (	pApp->GetProfileInt		( strSection, _T( "SaveAndClose"		), ESaveAndClose_Never					) ); 
	this->m_iReplaceWhere			=										pApp->GetProfileInt		( strSection, _T( "ReplaceWhere"		), EReplaceWhere_File					);
	this->m_iReplaceWhereEx			=										pApp->GetProfileInt		( strSection, _T( "ReplaceWhereEx"		), EReplaceWhereEx_AllOpen				);
//	this->m_strFindWhat				=										pApp->GetProfileString	( strSection, _T( "FindWhat"			) );
//	this->m_strReplaceWith			=										pApp->GetProfileString	( strSection, _T( "ReplaceWith"			) );
							
	//
	//	UPDATE CONTROLS FROM MEMBERS
	//
	this->UpdateData( EUpdateData_ToControls );

	//
	//	LOAD FILTERS
	//
	this->LoadFilters();

	//
	//	LOAD HISTORY
	//
	this->LoadHistory();

	//
	//	UPDATE CONTROLS [enable/disable controls]
	//
	this->UpdateControls();

	//
	//	SET ADVANCED MODE
	//
	this->UpdateAdvanced		(											pApp->GetProfileString	( strSection, _T( "Advanced"			) ) );
}

//***************************************************************************************************
//**																					  LoadHistory 
//***************************************************************************************************
//**	@DOC		PERSISTENCE
//**	@MFUNC		Loads the dialog's settings from the registry
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::LoadHistory( void )
{
	//
	//	GET APPLICATION
	//
	CWinApp* pApp = ::AfxGetApp();

	//
	//	LOAD SECTION NAME
	//
	CString strSection; 
			strSection.LoadString( IDS_PROFILE_SECTION );

	//
	//	SETUP VARS
	//
	CString strKey		;
	CString strValue	;
	int		iEntry		= 0;
	int		iEntries	= 0;
		
	//
	//	READ FIND STRING HISTORY
	//
	iEntries = pApp->GetProfileInt( strSection, _T( "FindWhat.Count" ), 0 );

	for ( iEntry = 0; iEntry < iEntries; iEntry++ )
	{
		strKey.Format( "FindWhat.%d", iEntry );	

		strValue = pApp->GetProfileString( strSection, strKey ); 

		this->m_ctrlComboFindWhat.AddString( /*iEntry,*/ strValue );
	}

	//
	//	READ REPLACE STRING HISTORY
	//
	iEntries = pApp->GetProfileInt( strSection, _T( "ReplaceWith.Count" ), 0 );

	for ( iEntry = 0; iEntry < iEntries; iEntry++ )
	{
		//
		//	READ ENTRY
		//
		strKey.Format( "ReplaceWith.%d", iEntry );	
		strValue = pApp->GetProfileString( strSection, strKey ); 
		this->m_ctrlComboReplaceWith.AddString( /*iEntry,*/ strValue );	
	}

	//
	//	READ DIRECTORY STRING HISTORY
	//
	iEntries = pApp->GetProfileInt( strSection, _T( "Directory.Count" ), 0 );

	for ( iEntry = 0; iEntry < iEntries; iEntry++ )
	{
		//
		//	READ ENTRY
		//
		strKey.Format( "Directory.%d", iEntry );	
		strValue = pApp->GetProfileString( strSection, strKey ); 
		this->m_ctrlComboDirectory.AddString( /*iEntry,*/ strValue );	
	}

	//
	//	SELECT FIRST ENTRIES
	//
	this->m_ctrlComboFindWhat	.SetCurSel( 0 );
	this->m_ctrlComboReplaceWith.SetCurSel( 0 );
	this->m_ctrlComboExtensions	.SetCurSel( 0 );
	this->m_ctrlComboDirectory	.SetCurSel( 0 );

	//
	//	UPDATE MEMBERS FROM CONTROLS
	//
	this->UpdateData( EUpdateData_FromControls );
}

//***************************************************************************************************
//**																					  LoadFilters 
//***************************************************************************************************
//**	@DOC		PERSISTENCE
//**	@MFUNC		Loads the dialog's settings from the registry
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::LoadFilters( void )
{
	//
	//	CLEAR ARRAYS
	//
	this->m_arrFolders	.RemoveAll();
	this->m_arrFileMasks.RemoveAll();

	//
	//	GET APPLICATION
	//
	CWinApp* pApp = ::AfxGetApp();

	//
	//	LOAD SECTION NAME
	//
	CString strSection; 
			strSection.LoadString( IDS_PROFILE_SECTION );

	//
	//	SETUP VARS
	//
	CString		strKey		;
	CString		strValue	;
	CFolder		folder		;
	CFileMask	mask		;
	int			iEntry		= 0;
	int			iEntries	= 0;
		
	//
	//	READ FOLDERS
	//
	iEntries = pApp->GetProfileInt( strSection, _T( "Folder.Count" ), 0 );

	for ( iEntry = 0; iEntry < iEntries; iEntry++ )
	{
		strKey.Format( "Folder.%d.Path"		, iEntry );	folder.m_strPath	=						pApp->GetProfileString( strSection, strKey ); 
		strKey.Format( "Folder.%d.Enabled"	, iEntry );	folder.m_bEnabled	= static_cast< BOOL > (	pApp->GetProfileInt	( strSection, strKey , FALSE ) ); 
		strKey.Format( "Folder.%d.Recurse"	, iEntry );	folder.m_bRecurse	= static_cast< BOOL > (	pApp->GetProfileInt	( strSection, strKey , FALSE ) ); 

		this->m_arrFolders.Add( folder );
	}

	//
	//	READ FILE MASKS
	//
	iEntries = pApp->GetProfileInt( strSection, _T( "FileMask.Count" ), 0 );

	for ( iEntry = 0; iEntry < iEntries; iEntry++ )
	{
		strKey.Format( "FileMask.%d.Mask"		, iEntry );	mask.m_strMask	=						pApp->GetProfileString	( strSection, strKey ); 
		strKey.Format( "FileMask.%d.Enabled"	, iEntry );	mask.m_bEnabled	= static_cast< BOOL > (	pApp->GetProfileInt		( strSection, strKey , FALSE ) ); 

		this->m_arrFileMasks.Add( mask );
	}
}

//***************************************************************************************************
//**																					 WriteProfile 
//***************************************************************************************************
//**	@DOC		PERSISTENCE
//**	@MFUNC		Saves the dialog's settings to the registry
//**	@RDESC		<t TRUE> if successful, <t FALSE> otherwise.
//**	@END
//***************************************************************************************************
//inline
BOOL CDialogSmartReplace::WriteProfile( void ) const
{
	//
	//	GET NON-CONST POINTER TO SELF
	//
	CDialogSmartReplace* pThis = const_cast< CDialogSmartReplace* > (this);

	//
	//	UPDATE MEMBERS FROM CONTROLS
	//
	pThis->UpdateData( EUpdateData_FromControls );

	//
	//	GET ADDITIONAL STATES
	//
	CString strCaption; this->m_ctrlBtnAdvanced.GetWindowText( strCaption );

	//
	//	GET APPLICATION
	//
	CWinApp* pApp = ::AfxGetApp();

	//
	//	LOAD SECTION NAME
	//
	CString strSection; 
			strSection.LoadString( IDS_PROFILE_SECTION );

	//
	//	WRITE MEMBERS
	//
	pApp->WriteProfileInt	( strSection, _T( "AllCases"			), this->m_bAllCases				);
	pApp->WriteProfileInt	( strSection, _T( "MatchCase"			), this->m_bMatchCase				);
	pApp->WriteProfileInt	( strSection, _T( "RegularExpression"	), this->m_bRegularExpression		);
	pApp->WriteProfileInt	( strSection, _T( "WholeWord"			), this->m_bWholeWord				);
	pApp->WriteProfileInt	( strSection, _T( "AskForExtendedOnly"	), this->m_bAskForExtendedOnly 		);
	pApp->WriteProfileInt	( strSection, _T( "RecurseDirectory"	), this->m_bRecurse			 		);
	pApp->WriteProfileInt	( strSection, _T( "ReplaceWhere"		), this->m_iReplaceWhere			);
	pApp->WriteProfileInt	( strSection, _T( "ReplaceWhereEx"		), this->m_iReplaceWhereEx			);
	pApp->WriteProfileInt	( strSection, _T( "FindStringMode"		), this->m_enuFindStringMode		);
	pApp->WriteProfileInt	( strSection, _T( "ConfirmReplace"		), this->m_enuConfirmReplacement	);
	pApp->WriteProfileInt	( strSection, _T( "SaveAndClose"		), this->m_enuSaveAndClose			);
//	pApp->WriteProfileString( strSection, _T( "FindWhat"			), this->m_strFindWhat				);
//	pApp->WriteProfileString( strSection, _T( "ReplaceWith"			), this->m_strReplaceWith			);
	pApp->WriteProfileString( strSection, _T( "Advanced"			), strCaption						);

	//
	//	WRITE FILTERS
	//
	this->WriteFilters();

	//
	//	WRITE HISTORY
	//
	return this->WriteHistory();
}

//***************************************************************************************************
//**																					 WriteHistory 
//***************************************************************************************************
//**	@DOC		PERSISTENCE
//**	@MFUNC		Saves the dialog's settings to the registry
//**	@RDESC		<t TRUE> if successful, <t FALSE> otherwise.
//**	@END
//***************************************************************************************************
//inline
BOOL CDialogSmartReplace::WriteHistory( void ) const
{
	//
	//	GET APPLICATION
	//
	CWinApp* pApp = ::AfxGetApp();

	//
	//	LOAD SECTION NAME
	//
	CString strSection; 
			strSection.LoadString( IDS_PROFILE_SECTION );

	//
	//	SETUP VARS
	//
	CString strKey		;
	CString strValue	;
	int		iEntry		= 0;
	int		iEntries	= 0;
		
	//
	//	WRITE FIND STRING HISTORY
	//
	iEntries = MIN( this->m_ctrlComboFindWhat.GetCount(), EHistroySize_Persistent_Max );

	pApp->WriteProfileInt( strSection, _T( "FindWhat.Count"	), iEntries	);

	for ( iEntry = 0; iEntry < iEntries; iEntry++ )
	{
		this->m_ctrlComboFindWhat.GetLBText( iEntry, strValue );

		strKey.Format( "FindWhat.%d", iEntry );	

		pApp->WriteProfileString( strSection, strKey, strValue );
	}

	//
	//	WRITE REPLACE STRING HISTORY
	//
	iEntries = MIN( this->m_ctrlComboReplaceWith.GetCount(), EHistroySize_Persistent_Max );

	pApp->WriteProfileInt( strSection, _T( "ReplaceWith.Count" ), iEntries );

	for ( iEntry = 0; iEntry < iEntries; iEntry++ )
	{
		this->m_ctrlComboReplaceWith.GetLBText( iEntry, strValue );	
		
		strKey.Format( "ReplaceWith.%d", iEntry );	
		
		pApp->WriteProfileString( strSection, strKey, strValue );
	}

	//
	//	WRITE DIRECTORY STRING HISTORY
	//
	iEntries = MIN( this->m_ctrlComboDirectory.GetCount(), EHistroySize_Persistent_Max );

	pApp->WriteProfileInt( strSection, _T( "Directory.Count" ), iEntries );

	for ( iEntry = 0; iEntry < iEntries; iEntry++ )
	{
		this->m_ctrlComboDirectory.GetLBText( iEntry, strValue );	
		
		strKey.Format( "Directory.%d", iEntry );	
		
		pApp->WriteProfileString( strSection, strKey, strValue );
	}

	//
	//	RETURN SUCCESS
	//
	return TRUE;
}

//***************************************************************************************************
//**																					 WriteFilters 
//***************************************************************************************************
//**	@DOC		PERSISTENCE
//**	@MFUNC		Saves the dialog's settings to the registry
//**	@RDESC		<t TRUE> if successful, <t FALSE> otherwise.
//**	@END
//***************************************************************************************************
//inline
BOOL CDialogSmartReplace::WriteFilters( void ) const
{
	//
	//	GET APPLICATION
	//
	CWinApp* pApp = ::AfxGetApp();

	//
	//	LOAD SECTION NAME
	//
	CString strSection; 
			strSection.LoadString( IDS_PROFILE_SECTION );

	//
	//	SETUP VARS
	//
	CString strKey		;
	CString strValue	;
	int		iEntry		= 0;
	int		iEntries	= 0;
		
	//
	//	WRITE FOLDERS
	//
	iEntries = this->m_arrFolders.GetSize();

	pApp->WriteProfileInt( strSection, _T( "Folder.Count" ), iEntries );

	for ( iEntry = 0; iEntry < iEntries; iEntry++ )
	{
		strKey.Format( "Folder.%d.Path"		, iEntry ); pApp->WriteProfileString( strSection, strKey, this->m_arrFolders[ iEntry ].m_strPath  );
		strKey.Format( "Folder.%d.Enabled"	, iEntry ); pApp->WriteProfileInt	( strSection, strKey, this->m_arrFolders[ iEntry ].m_bEnabled );
		strKey.Format( "Folder.%d.Recurse"	, iEntry ); pApp->WriteProfileInt	( strSection, strKey, this->m_arrFolders[ iEntry ].m_bRecurse );
	}

	//
	//	WRITE FILE FILTERS
	//
	iEntries = this->m_arrFileMasks.GetSize();

	pApp->WriteProfileInt( strSection, _T( "FileMask.Count" ), iEntries );

	for ( iEntry = 0; iEntry < iEntries; iEntry++ )
	{
		strKey.Format( "FileMask.%d.Mask"	, iEntry ); pApp->WriteProfileString( strSection, strKey, this->m_arrFileMasks[ iEntry ].m_strMask  );
		strKey.Format( "FileMask.%d.Enabled", iEntry ); pApp->WriteProfileInt	( strSection, strKey, this->m_arrFileMasks[ iEntry ].m_bEnabled );
	}

	//
	//	RETURN SUCCESS
	//
	return TRUE;
}

//
//---------------------------------------------------------------------------------------------------
//*****************************************     HELPERS     *****************************************
//---------------------------------------------------------------------------------------------------
//

//***************************************************************************************************
//**																				  GetTextDocument
//***************************************************************************************************
//**	@DOC		HELPERS
//**	@MFUNC		Determines the current text document's interface
//**	@RDESC		A smart pointer to the text document interface
//**	@END
//***************************************************************************************************
//inline
CITextDocument CDialogSmartReplace::GetTextDocument( void )
{
	//
	//	GET ACTIVE DOCUMENT
	//
	CComPtr< IDispatch > pIDispDocument ;

	VERIFY_OK( this->m_pIApplication->get_ActiveDocument( &pIDispDocument ) );

	if ( pIDispDocument.IsEqualObject( NULL ) )
	{
		return NULL;
	}

	//
	//	QUERY TEXT DOCUMENT INTERFACE
	//
	CComQIPtr< ITextDocument, &IID_ITextDocument > pITextDocument( pIDispDocument );

	//
	//	RETURN SMART POINTER
	//
	return pITextDocument;
}

//***************************************************************************************************
//**																				 GetTextSelection
//***************************************************************************************************
//**	@DOC		HELPERS
//**	@MFUNC		Determines the current text selection's interface
//**	@RDESC		A smart pointer to the text selection interface
//**	@END
//***************************************************************************************************
//inline
CITextSelection CDialogSmartReplace::GetTextSelection( void )
{
	//
	//	DELEGATE
	//
	return this->GetTextDocument().GetTextSelection();
}

//***************************************************************************************************
//**																					 GetFindFlags
//***************************************************************************************************
//**	@DOC		HELPERS
//**	@MFUNC		Determines the find flags for the current settings
//**	@RDESC		The find flags
//**	@END
//***************************************************************************************************
//inline
DWORD CDialogSmartReplace::GetFindFlags( void ) const
{
	//
	//	CONCATENATE FLAGS
	//
	return	(									dsMatchForward 
		|	( this->m_bMatchCase			?	dsMatchCase			: 0					)
		|	( this->m_bWholeWord 			?	dsMatchWord   		: 0					)
		|	( this->m_bRegularExpression	?	dsMatchRegExp		: dsMatchNoRegExp	) 
	//	|	( this->m_bRegularExpression	?	dsMatchRegExpCur	: dsMatchNoRegExp	)				// use current RegExp settings
			);
}

//***************************************************************************************************
//**																				  AskSaveAndClose
//***************************************************************************************************
//**	@DOC		HELPERS
//**	@MFUNC		Asks permission to save and close the current document's window
//**	@RDESC		<t TRUE> if permission is granted, <t FALSE> otherwise.
//**	@END
//***************************************************************************************************
//inline
BOOL CDialogSmartReplace::AskSaveAndClose( void )
{
	//
	//	PRE-SET ABORT FLAG
	//
	this->m_bAborted = FALSE;

	//
	//	CHECK USER OVERRIDE
	//
	if ( ESaveAndClose_Always == this->m_enuSaveAndClose )
	{
		return TRUE;
	}

	if ( ESaveAndClose_Never == this->m_enuSaveAndClose )
	{
		return FALSE;
	}

	//
	//	ASK PERMISSION
	//
	return IDYES == this->MessageBox( _T( "Do you want to save and close this document?" ), _T( "SmartReplace" ), MB_YESNO | MB_ICONQUESTION );
}

//***************************************************************************************************
//**																					AskPermission
//***************************************************************************************************
//**	@DOC		HELPERS
//**	@MFUNC		Asks permission to replace the specified item
//**				replace string using current members' settings 
//**	@PARM		[in] The item to ask permission for
//**	@PARM		[in] The item's name
//**	@PARM		[out] A flag indicating whether the users wishes to abort the replace operation
//**	@RDESC		<t TRUE> if permission is granted, <t FALSE> otherwise.
//**	@END
//***************************************************************************************************
//inline
BOOL CDialogSmartReplace::AskPermission( EReplaceItem a_enuItem, const CString& a_strName )
{
	//
	//	PRE-SET ABORT FLAG
	//
	this->m_bAborted = FALSE;

	//
	//	QUICK CHECK
	//
	if ( FALSE == this->m_bAskPermission )
	{
		return TRUE;
	}

	if ( EConfirm_Never == this->m_enuConfirmReplacement ) 
	{
		return TRUE;
	}

	//
	//	CHECK ITEM TYPE
	//
	BOOL	bAsk		= FALSE;
	CString strMessage	;

	switch ( a_enuItem )
	{
										//
										//	INSTANCE
										//
		case EReplaceItem_Instance	:	if ( this->m_enuConfirmReplacement == EConfirm_EachInstance ) 
										{
											strMessage	= "Do you want to replace this instance?";
											bAsk		= TRUE;
										}
										break;

										//
										//	FILE
										//
		case EReplaceItem_File		:	if ( this->m_enuConfirmReplacement == EConfirm_EachFile ) 
										{
											strMessage	= "Do you want to replace all instances in file '" + a_strName + "' ?";
											bAsk		= TRUE;
										}
										break;

										//
										//	PROJECT
										//
		case EReplaceItem_Project	:	if ( this->m_enuConfirmReplacement == EConfirm_EachProject ) 
										{
											strMessage	= "Do you want to replace all instances in project '" + a_strName + "' ?";
											bAsk		= TRUE;
										}
										break;
	}

	//
	//	CHECK NECCESSITY
	//
	if ( FALSE == bAsk )
	{
		return TRUE;
	}

	//
	//	DISPLAY DIALOG
	//
	UINT idAnswer = this->MessageBox( strMessage, _T( "SmartReplace" ), MB_YESNOCANCEL | MB_ICONQUESTION );

	//
	//	CHECK RESULT
	//
	if ( IDYES != idAnswer )
	{
		if ( IDCANCEL == idAnswer )
		{
			this->m_bAborted = TRUE;
		}

		return FALSE;
	}

	//
	//	PERMISSION GRANTED
	//
	return TRUE;
}

//***************************************************************************************************
//**																						  AddText
//***************************************************************************************************
//**	@DOC		HELPERS
//**	@MFUNC		Adds the specified text to the specified combo box
//**	@PARM		[in] The combo box
//**	@PARM		[in] The text to add
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::AddText( CComboBox& a_ctrlCombo, const CString& a_strText )
{
	CString strText;
			
	a_ctrlCombo.GetWindowText( strText );
	a_ctrlCombo.SetWindowText( strText + a_strText );
}

//
//---------------------------------------------------------------------------------------------------
//*****************************************     UPDATE     ******************************************
//---------------------------------------------------------------------------------------------------
//

//***************************************************************************************************
//**																				   UpdateControls
//***************************************************************************************************
//**	@DOC		UPDATE
//**	@MFUNC		Updates control's enabled/disabled states according to member vars
//**	@DEVNOTE	The method does _not_ update the member vars prior to modifying the controls.
//**				That's within the caller's responsibility
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::UpdateControls( void )
{
	//
	//	DETERMINE RELEVANT MODES
	//
	BOOL bSelection	= ( EReplaceWhere_Selection			== this->m_iReplaceWhere	);
	BOOL bContinue	= ( EReplaceWhere_File				== this->m_iReplaceWhere	);
	BOOL bExtended	= ( EReplaceWhere_Extended			== this->m_iReplaceWhere	);
	BOOL bDirectory	= ( EReplaceWhereEx_AllInDirectory	== this->m_iReplaceWhereEx	);
	BOOL bFilters	= ( EReplaceWhereEx_AllInFilters	== this->m_iReplaceWhereEx	);

		 bDirectory &= bExtended;
		 bFilters   &= bExtended;

	//
	//	SET DEFAULT CONTROL
	//
	this->SetDefID	( bExtended ? IDC_ADVANCED : IDC_CONTINUE );

	//
	//	ENABLE/DISABLE CONTROLS
	//
	this->GetDlgItem( IDC_CONTINUE						)->EnableWindow(			bContinue			);		// cannot continue in either selection or extended replace modes
	this->GetDlgItem( IDC_REPLACE						)->EnableWindow(			bContinue			);		// cannot continue in either selection or extended replace modes
	this->GetDlgItem( IDC_CHECK_ALL_CASES				)->EnableWindow(	this->m_bMatchCase			);		// only enable when case sensitivity is enabled
	this->GetDlgItem( IDC_COMBO_REPLACE_WHERE			)->EnableWindow(			bExtended			);		// only enable when "extended" is selected
	this->GetDlgItem( IDC_COMBO_EXTENSIONS				)->EnableWindow(			bDirectory			);		// only enable when "in directories" is selected
	this->GetDlgItem( IDC_COMBO_DIRECTORY				)->EnableWindow(			bDirectory			);		// only enable when "in directories" is selected
	this->GetDlgItem( IDC_BROWSE_DIRECTORY				)->EnableWindow(			bDirectory			);		// only enable when "in directories" is selected
	this->GetDlgItem( IDC_CHECK_RECURSE					)->EnableWindow(			bDirectory			);		// only enable when "in directories" is selected
	this->GetDlgItem( IDC_FILTERS						)->EnableWindow(			bFilters			);		// only enable when "in filters" is selected

	this->GetDlgItem( IDC_CONTEXT_MENU_REG_EXP_FIND		)->EnableWindow(	this->m_bRegularExpression	);		// only enable when "regular expression" is selected
	this->GetDlgItem( IDC_CONTEXT_MENU_REG_EXP_REPLACE	)->EnableWindow(	this->m_bRegularExpression	);		// only enable when "regular expression" is selected

	//
	//	DISABLE NON-FUNCTIONALS
	//
	this->GetDlgItem( IDC_CHECK_WHOLE_WORDS				)->EnableWindow( FALSE ==	bSelection			);		// not yet implemented
	this->GetDlgItem( IDC_CHECK_REGULAR_EXPRESSION		)->EnableWindow( FALSE ==	bSelection			);		// not yet implemented
}

//***************************************************************************************************
//**																			   UpdateFindStringEx
//***************************************************************************************************
//**	@DOC		UPDATE
//**	@MFUNC		Updates the find string based on the current mode an the current selected text
//**	@COMM		Calls <mf UpdateFindString>. Then, if the find string still is empty, tries
//**				to reactivate a find string from the history
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::UpdateFindStringEx( void )
{
	//
	//	UPDATE THE FIND STRING
	//
	this->UpdateFindString();

	//
	//	IF EMPTY
	//
	if ( TRUE == this->m_strFindWhat.IsEmpty() )
	{
		//
		//	USE LATEST HISTORY ENTRY
		//
		if ( this->m_ctrlComboFindWhat.GetCount() > 0 )
		{
			this->m_ctrlComboFindWhat.SetCurSel( 0 );
			this->m_ctrlComboFindWhat.GetLBText( 0, this->m_strFindWhat );
		}
	}
}

//***************************************************************************************************
//**																				 UpdateFindString
//***************************************************************************************************
//**	@DOC		UPDATE
//**	@MFUNC		Updates the find string based on the current mode an the current selected text
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::UpdateFindString( void )
{
	//
	//	CURRENT SELECTION DOES NOT MATCH
	//
	this->m_bSelectionMatches = FALSE;

	//
	//	CHECK NECCESSITY
	//
	if ( EFindStringMode_Keep == this->m_enuFindStringMode )
	{
		return;
	}

	//
	//	GET TEXT 
	//
	CString	strText = this->GetTextSelection().GetText();	

	//
	//	We cannot implement the complex behaviour of the standard replace-dialog here
	//	because the ITextSelection interface does not offer all the neccessary methods.
	//	DevStudio uses the line underneath the cursor as search string. 
	//	The line is stripped left and right and tested for emptiness.
	//	If empty, the topmost history item is used.
	//	The ITextSelection however does not allow to determine the line beneath the
	//	cursor without cancelling the current selection.
	//	
	//	So, we implement a "close to usual" strategy.
	//	If there is more than one line selected, we simply disregard the selected text.
	//
	int			iPos		= strText.Find( '\n' );

	if ( iPos >= 0 )							// at least one line
	{
		if ( strText.GetLength() >= iPos + 1 )	// there is more text after the first line
		{
			strText = "";						// disregard the text
		}
	}

	strText.TrimRight( "\r\n" );				// strip off terminators to the right

	//
	//	CHECK FOR EMPTY
	//
/*	if ( strText.IsEmpty() )
	{
		//
		//	CHECK MODE
		//
		switch ( this->m_enuFindStringMode )
		{
			case EFindStringMode_KeepIfNoSelection:	return;
		}

		//
		//	SELECT CURRENT LINE
		//
	//	VERIFY_OK( pITextSelection->SelectLine	() );			// we're only interested in one line
	//	VERIFY_OK( pITextSelection->get_Text	( &bszText ) );
	//	VERIFY_OK( pITextSelection->Cancel		() );

	//	strText = bszText;
	//	strText.TrimRight( "\r\n" );
	}
*/

	//
	//	CURRENT SELECTION MATCHES IF FIND STRING IS NOT EMPTY
	//
	this->m_bSelectionMatches = strText.IsEmpty() ? FALSE : TRUE;

	//
	//	SET TEXT
	//
	this->m_strFindWhat = strText;

	//
	//	UPDATE CONTROLS FROM MEMBERS
	//
	this->UpdateData( EUpdateData_ToControls );
}

//***************************************************************************************************
//**																				   UpdateAdvanced
//***************************************************************************************************
//**	@DOC		UPDATE
//**	@MFUNC		Shows/hides advanced options' controls
//**	@PARM		[in] The caption of the button to go to
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::UpdateAdvanced( const CString& a_strCaptionTo )
{
	//
	//	GET CURRENT CAPTION
	//
	CString strCaption; this->m_ctrlBtnAdvanced.GetWindowText( strCaption );

	//
	//	COMPRE CAPTIONS
	//
	if ( a_strCaptionTo == strCaption )
	{
		return;
	}

	//
	//	TOGGLE MODE
	//
	this->OnAdvanced();
}

//***************************************************************************************************
//**																				  UpdateHistories
//***************************************************************************************************
//**	@DOC		UPDATE
//**	@MFUNC		Updates the combo boxes' histories
//**	@COMM		The user is responsible for calling <mf UpdateData>.
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::UpdateHistories( void )
{
	this->UpdateHistoryFind		();
	this->UpdateHistoryReplace	();
	this->UpdateHistoryDirectory();
}

//***************************************************************************************************
//**																				UpdateHistoryFind
//***************************************************************************************************
//**	@DOC		UPDATE
//**	@MFUNC		Updates the find string combo box' history
//**	@COMM		The user is responsible for calling <mf UpdateData>.
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::UpdateHistoryFind( void )
{
	//
	//	DO NOT INSERT EMPTY STRINGS
	//
	if ( TRUE == this->m_strFindWhat.IsEmpty() )
	{
		return;
	}

	//
	//	DO NOT DUPLICATE	[ sadly, CComboBox::FindStringExact ignores the case, so we have to search ourselves ]
	//
	CString strText	;
	int		iItem	= 0;
	BOOL	bFound	= FALSE;

	for ( iItem = 0; iItem < this->m_ctrlComboFindWhat.GetCount(); iItem++ )
	{
		//
		//	GET TEXT
		//
		this->m_ctrlComboFindWhat.GetLBText( iItem, strText );

		//
		//	SKIP MISMATCHES
		//
		if ( 0 != strText.Compare( this->m_strFindWhat ) )
		{
			continue;
		}

		//
		//	MATCH
		//
		bFound = TRUE;

		break;
	}

	//
	//	CHECK RESULT
	//
	if ( TRUE == bFound )
	{
		//
		//	REMOVE DUPLICATE
		//
		this->m_ctrlComboFindWhat.DeleteString( iItem );
	}

	//
	//	PLACE FIND STRING ON TOP
	//
	this->m_ctrlComboFindWhat.InsertString( 0, this->m_strFindWhat );

	//
	//	RE-SELECT THE ITEM
	//
	this->m_ctrlComboFindWhat.SetCurSel( 0 );
}

//***************************************************************************************************
//**																			 UpdateHistoryReplace
//***************************************************************************************************
//**	@DOC		UPDATE
//**	@MFUNC		Updates the replace string combo box' history
//**	@COMM		The user is responsible for calling <mf UpdateData>.
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::UpdateHistoryReplace( void )
{
	//
	//	DO NOT INSERT EMPTY STRINGS
	//
	if ( TRUE == this->m_strReplaceWith.IsEmpty() )
	{
		return;
	}

	//
	//	DO NOT DUPLICATE	[ sadly, CComboBox::FindStringExact ignores the case, so we have to search ourselves ]
	//
	CString strText	;
	int		iItem	= 0;
	BOOL	bFound	= FALSE;

	for ( iItem = 0; iItem < this->m_ctrlComboReplaceWith.GetCount(); iItem++ )
	{
		//
		//	GET TEXT
		//
		this->m_ctrlComboReplaceWith.GetLBText( iItem, strText );

		//
		//	SKIP MISMATCHES
		//
		if ( 0 != strText.Compare( this->m_strReplaceWith ) )
		{
			continue;
		}

		//
		//	MATCH
		//
		bFound = TRUE;

		break;
	}

	//
	//	CHECK RESULT
	//
	if ( TRUE == bFound )
	{
		//
		//	REMOVE DUPLICATE
		//
		this->m_ctrlComboReplaceWith.DeleteString( iItem );
	}

	//
	//	INSERT REPLACE STRING ON TOP
	//
	this->m_ctrlComboReplaceWith.InsertString( 0, this->m_strReplaceWith );

	//
	//	RE-SELECT THE ITEM
	//
	this->m_ctrlComboReplaceWith.SetCurSel( 0 );
}

//***************************************************************************************************
//**																		   UpdateHistoryDirectory
//***************************************************************************************************
//**	@DOC		UPDATE
//**	@MFUNC		Updates the directory string combo box' history
//**	@COMM		The user is responsible for calling <mf UpdateData>.
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::UpdateHistoryDirectory( void )
{
	//
	//	DO NOT INSERT EMPTY STRINGS
	//
	if ( TRUE == this->m_strDirectory.IsEmpty() )
	{
		return;
	}

	//
	//	DO NOT DUPLICATE	[ sadly, CComboBox::FindStringExact ignores the case, so we have to search ourselves ]
	//
	CString strText	;
	int		iItem	= 0;
	BOOL	bFound	= FALSE;

	for ( iItem = 0; iItem < this->m_ctrlComboDirectory.GetCount(); iItem++ )
	{
		//
		//	GET TEXT
		//
		this->m_ctrlComboDirectory.GetLBText( iItem, strText );

		//
		//	SKIP MISMATCHES
		//
		if ( 0 != strText.Compare( this->m_strDirectory ) )
		{
			continue;
		}

		//
		//	MATCH
		//
		bFound = TRUE;

		break;
	}

	//
	//	CHECK RESULT
	//
	if ( TRUE == bFound )
	{
		//
		//	REMOVE DUPLICATE
		//
		this->m_ctrlComboDirectory.DeleteString( iItem );
	}

	//
	//	INSERT DIRECTORY STRING ON TOP
	//
	this->m_ctrlComboDirectory.InsertString( 0, this->m_strDirectory );

	//
	//	RE-SELECT THE ITEM
	//
	this->m_ctrlComboDirectory.SetCurSel( 0 );
}

//
//---------------------------------------------------------------------------------------------------
//*****************************************     REPLACE     *****************************************
//---------------------------------------------------------------------------------------------------
//

//***************************************************************************************************
//**																						 FindText
//***************************************************************************************************
//**	@DOC		REPLACE
//**	@MFUNC		Finds the next matching text
//**	@RDESC		<t TRUE> if a match has been found, <t FALSE> otherwise.
//**	@END
//***************************************************************************************************
//inline
BOOL CDialogSmartReplace::FindText( void )
{
	return this->FindTextEx( this->m_strFindWhat, this->GetFindFlags(), this->m_bAllCases );
}

//***************************************************************************************************
//**																					  ReplaceNext
//***************************************************************************************************
//**	@DOC		REPLACE
//**	@MFUNC		Replaces the current matching text
//**	@RDESC		<t TRUE> if a replacement has been made, <t FALSE> otherwise.
//**	@END
//***************************************************************************************************
//inline
BOOL CDialogSmartReplace::ReplaceNext( void )
{
	//
	//	DELEGATE
	//
	return this->ReplaceStepEx( this->m_strFindWhat, this->m_strReplaceWith, this->GetFindFlags(), this->m_bAllCases );
}

//***************************************************************************************************
//**																					   ReplaceAll
//***************************************************************************************************
//**	@DOC		REPLACE
//**	@MFUNC		Replaces all occurances of the find string with the replace string using 
//**				current members' settings.
//**	@RDESC		The number of replacements made
//**	@END
//***************************************************************************************************
//inline
int CDialogSmartReplace::ReplaceAll( void )
{
	//
	//	CLEAR FOUND MATCHES
	//
	this->ResetMatches();

	//
	//	CHECK AVAILABILITY
	//
	if ( FALSE == this->GetTextSelection().IsValid() )
	{
		return 0;
	}

	//
	//	REPLACE ALL
	//
	int iReplaced = 0;

	while ( TRUE == this->ReplaceNext() )	
	{
		//
		//	INCREASE COUNT
		//
		++iReplaced;	

		//
		//	CHECK FOR ABORTION
		//
		if ( TRUE == this->m_bAborted )
		{
			return iReplaced;
		}

		//
		//	CHECK FOR FILE FINISHED
		//
		if ( TRUE == this->m_bFileFinished )
		{
			return iReplaced;
		}
	}

	//
	//	RETURN NUMBER OF REPLACEMENTS
	//
	return iReplaced;
}

//***************************************************************************************************
//**																			  ReplaceAllSelection
//***************************************************************************************************
//**	@DOC		REPLACE
//**	@MFUNC		Replaces all occurances of the find string in the current selection with the 
//**				replace string using current members' settings 
//**	@RDESC		The number of replacements made
//**	@END
//***************************************************************************************************
//inline
int CDialogSmartReplace::ReplaceAllSelection( void )
{
	//
	//	GET TEXT SELECTION
	//
	CITextSelection pITextSelection = this->GetTextSelection();

	if ( FALSE == pITextSelection.IsValid() )
	{
		return 0;
	}

	//
	//	GET TEXT
	//
	CStringEx	strText		= pITextSelection.GetText();
	int			iReplaced	= 0;

	//
	//	REPLACE IN TEXT
	//
	DWORD dwFlags	= this->m_bWholeWord 	? CStringEx::EMatchFlag_Word		: 0
					| this->m_bMatchCase	? CStringEx::EMatchFlag_Case		: 0
					| this->m_bAllCases		? CStringEx::EMatchFlag_AllCases	: 0;

	iReplaced = strText.ReplaceEx( this->m_strFindWhat, this->m_strReplaceWith, dwFlags );

	//
	//	SET TEXT
	//
	pITextSelection.SetText( strText );

	//
	//	RETURN COUNT
	//
	return iReplaced;
}

//***************************************************************************************************
//**																				   ReplaceAllOpen
//***************************************************************************************************
//**	@DOC		REPLACE
//**	@MFUNC		Replaces all occurances of the find string in all open text files with the 
//**				replace string using current members' settings 
//**	@RDESC		The number of replacements made
//**	@END
//***************************************************************************************************
//inline
int CDialogSmartReplace::ReplaceAllOpen( void )
{
	//
	//	ITERATE TEXT WINDOWS
	//
	int		iReplaced	= 0;
	long	lWindows	= this->m_pIApplication.GetWindows().GetCount();

	for ( long lWindow = 1; lWindow <= lWindows; lWindow++ ) // indices are 1-based (VB-style?)
	{
		//
		//	GET TEXT WINDOW
		//
		CITextWindow pITextWindow = this->m_pIApplication.GetWindows().GetItem( lWindow );

		if ( FALSE == pITextWindow.IsValid() )
		{
			continue;	// not a text window
		}

		//
		//	ACTIVATE THE WINDOW
		//
		pITextWindow->put_Active( VARIANT_TRUE );

		//
		//	ASK PERMISSION
		//
		if ( FALSE == this->AskPermission( EReplaceItem_File, pITextWindow.GetTextDocument().GetGenericDocument().GetFullName() ) )
		{
			if ( TRUE == this->m_bAborted )
			{
				break;
			}
			else
			{
				continue;
			}
		}

		//
		//	YEP, REPLACE HERE
		//
		iReplaced += this->ReplaceAll();

		//
		//	RE-CHECK ABORT FLAG
		//
		if ( TRUE == this->m_bAborted )
		{
			break;
		}
	}

	//
	//	RETURN REPLACEMENT COUNT
	//
	return iReplaced;
}

//***************************************************************************************************
//**																				ReplaceAllProject
//***************************************************************************************************
//**	@DOC		REPLACE
//**	@MFUNC		Replaces all occurances of the find string in all project text files with the 
//**				replace string using current members' settings 
//**	@RDESC		The number of replacements made
//**	@END
//***************************************************************************************************
//inline
int CDialogSmartReplace::ReplaceAllProject( void )
{
	//
	//	DELEGATE
	//
	return this->ReplaceAllProject( this->m_pIApplication.GetActiveProject() );
}

//***************************************************************************************************
//**																			  ReplaceAllWorkspace
//***************************************************************************************************
//**	@DOC		REPLACE
//**	@MFUNC		Replaces all occurances of the find string in all workspace text files with the 
//**				replace string using current members' settings 
//**	@RDESC		The number of replacements made
//**	@END
//***************************************************************************************************
//inline
int CDialogSmartReplace::ReplaceAllWorkspace( void )
{
	//
	//	REPLACE IN ALL PROJECTS
	//
	CIProjects	pIProjects	= this->m_pIApplication.GetProjects();
	long		lProjects	= pIProjects.GetCount();
	int			iReplaced	= 0;

	for ( long lProject = 0; lProject < lProjects; lProject++ )
	{
		//
		//	ASK PERMISSION
		//
		if ( FALSE == this->AskPermission( EReplaceItem_Project, pIProjects[ lProject ].GetName() ) )
		{
			if ( TRUE == this->m_bAborted )
			{
				break;
			}
			else
			{
				continue;
			}
		}

		//
		//	REPLACE IN THIS PROJECT
		//
		iReplaced += this->ReplaceAllProject( pIProjects[ lProject ] );

		//
		//	RE-CHECK ABORT FLAG
		//
		if ( TRUE == this->m_bAborted )
		{
			break;
		}
	}

	//
	//	RETURN COUNT
	//
	return iReplaced;
}

//***************************************************************************************************
//**																			  ReplaceAllDirectory
//***************************************************************************************************
//**	@DOC		REPLACE
//**	@MFUNC		Replaces all occurances of the find string in all text files in specified
//**				directory and file filter
//**	@RDESC		The number of replacements made
//**	@END
//***************************************************************************************************
//inline
int CDialogSmartReplace::ReplaceAllDirectory( void )
{
	//
	//	DELEGATE
	//
	return this->ReplaceAllDirectoryEx( this->m_strDirectory, this->m_strExtensions, this->m_bRecurse );
}

//***************************************************************************************************
//**																				ReplaceAllFilters
//***************************************************************************************************
//**	@DOC		REPLACE
//**	@MFUNC		Replaces all occurances of the find string in all text files matching filters 
//**				with the replace string using current members' settings 
//**	@RDESC		The number of replacements made
//**	@END
//***************************************************************************************************
//inline
int CDialogSmartReplace::ReplaceAllFilters( void )
{
	//
	//	SETUP RESULT
	//
	int iReplaced = 0;

	//
	//	ENUMERATE FOLDERS
	//
	for ( int iFolder = 0; iFolder < this->m_arrFolders.GetSize(); iFolder++ )
	{
		//
		//	GET FOLDER
		//
		const CFolder& folder = this->m_arrFolders[ iFolder ];

		if ( FALSE == folder.m_bEnabled )
		{
			continue;
		}

		//
		//	ENUMERATE FILE MASKS
		//
		for ( int iFileMask = 0; iFileMask < this->m_arrFileMasks.GetSize(); iFileMask++ )
		{
			//
			//	GET FILE MASK
			//
			const CFileMask& mask = this->m_arrFileMasks[ iFileMask ];

			if ( FALSE == mask.m_bEnabled )
			{
				continue;
			}

			//
			//	REPLACE IN THIS PAIR
			//
			iReplaced += this->ReplaceAllDirectoryEx( folder.m_strPath, mask.m_strMask, folder.m_bRecurse );

			//
			//	CHECK FOR ABORTION
			//
			if ( this->m_bAborted )
			{
				return iReplaced;
			}
		}
	}

	//
	//	RETURN RESULT
	//
	return iReplaced;
}

//***************************************************************************************************
//**																						 FindText   
//***************************************************************************************************
//**	@DOC		REPLACE
//**	@MFUNC		Finds (and marks) the next occurance of the specified text
//**	@PARM		[in] The text to find
//**	@PARM		[in] The options (a combination of <t DsTextSearchOptions> flags)
//**	@RDESC		<t TRUE> if successful, <t FALSE> otherwise.
//**	@END
//***************************************************************************************************
//inline
BOOL CDialogSmartReplace::FindText( const CString& a_strFind, DWORD a_dwFlags ) 
{
	//
	//	FIND THE TEXT
	//
	this->m_bSelectionMatches = this->GetTextSelection().FindText( a_strFind, a_dwFlags );

	//
	//	GET POSITION
	//
	CSelectionPos pos;

	pos.m_lLine		=	this->GetTextSelection().GetCurrentLine	 ();
	pos.m_lColumn	=	this->GetTextSelection().GetCurrentColumn();
	
	//
	//	CHECK IF THIS POSITION HAS ALREADY BEEN FOUND
	//
	this->m_bFileFinished = FALSE;

	for ( int iPos = 0; iPos < this->m_arrFoundMatches.GetSize(); iPos++ )
	{
		if ( pos == this->m_arrFoundMatches[ iPos ] )
		{
			//
			//	FINISHED THIS FILE
			//
			this->m_bFileFinished = TRUE;

			return this->m_bSelectionMatches;
		}
	}

	//
	//	ADD TO MATCH POSITIONS
	//
	this->m_arrFoundMatches.Add( pos );

	//
	//	RETURN RESULT
	//
	return this->m_bSelectionMatches;
}

//***************************************************************************************************
//**																					   FindTextEx
//***************************************************************************************************
//**	@DOC		REPLACE
//**	@MFUNC		Finds (and marks) the next occurance of the specified text
//**	@PARM		[in] The text to find
//**	@PARM		[in] The options (a combination of <t DsTextSearchOptions> flags)
//**	@PARM		[in] A falg indicatin whether to check for all cases
//**	@RDESC		<t TRUE> if successful, <t FALSE> otherwise.
//**	@END
//***************************************************************************************************
//inline
BOOL CDialogSmartReplace::FindTextEx( const CString& a_strFind, DWORD a_dwFlags, BOOL a_bAllCases ) 
{
	//
	//	DO AS-IS FIND STEP
	//
	this->m_enuCase = ECase_AsIs;

	CString strFind( a_strFind );

	if ( TRUE == this->FindText( strFind, a_dwFlags ) )
	{
		//
		//	CHECK FOR END
		//
		if ( FALSE == this->m_bFileFinished )		// there may be more matches for the same case in this file
		{
			return TRUE;							
		}

		//
		//	NO MORE OCCURANCES OF THIS CASE IN THE FILE
		//
		if ( FALSE == a_bAllCases )					// this file is through and we do not have to check more cases
		{
			return TRUE;
		}

		//
		//	RESET FILE END FLAG
		//
		this->m_bFileFinished = FALSE;
	}
	else
	{
		//
		//	NO MATCH FOUND
		//
		if ( FALSE == a_bAllCases )					// no more cases to handle
		{
			return FALSE;
		}
	}

	//
	//	DO LOWER CASE FIND STEP
	//
	this->m_enuCase = ECase_Lower;

	strFind.MakeLower();

	if ( strFind != a_strFind )
	{
		if ( TRUE == this->FindText( strFind, a_dwFlags ) )
		{
			//
			//	CHECK FOR END
			//
			if ( FALSE == this->m_bFileFinished )		// there may be more matches for the same case in this file
			{
				return TRUE;							
			}

			//
			//	NO MORE OCCURANCES OF THIS CASE IN THE FILE
			//
			this->m_bFileFinished = FALSE;
		}
	}

	//
	//	DO UPPER CASE FIND STEP
	//
	this->m_enuCase = ECase_Upper;

	strFind.MakeUpper();

	if ( strFind != a_strFind )
	{
		if ( TRUE == this->FindText( strFind, a_dwFlags ) )
		{
			return TRUE;
		}
	}

	//
	//	RESTORE CASE
	//
	this->m_enuCase = ECase_AsIs;

	//
	//	NO MATCH
	//
	return FALSE;
}

//***************************************************************************************************
//**																					  ReplaceStep
//***************************************************************************************************
//**	@DOC		EXTENSIONS
//**	@MFUNC		Performs one replace step. See comment for more details.
//**	@PARM		[in] The text to find
//**	@PARM		[in] The text to replace with
//**	@PARM		[in] The options (a combination of <t DsTextSearchOptions> flags)
//**	@RDESC		<t FALSE> if there are no more occurances or the search string, <t TRUE> otherwise.
//**	@END
//***************************************************************************************************
//inline
BOOL CDialogSmartReplace::ReplaceStep( const CString& a_strFind, const CString& a_strReplace, DWORD a_dwFlags ) 
{
	//
	//	DELEGATE
	//
	return this->ReplaceStepEx( a_strFind, a_strReplace, a_dwFlags, FALSE );
}

//***************************************************************************************************
//**																					  ReplaceStep
//***************************************************************************************************
//**	@DOC		EXTENSIONS
//**	@MFUNC		Performs one replace step. See comment for more details.
//**	@PARM		[in] The text to find
//**	@PARM		[in] The text to replace with
//**	@PARM		[in] The options (a combination of <t DsTextSearchOptions> flags)
//**	@PARM		[in] A flag indicating whether to replace all cases when using case matching.
//**				<nl> For instance: If the search string is "Test" and th replace string is "Temp"
//**									then "Test" will be replaced with "Temp", 
//**										 "test" will be replaced with "temp"
//**									and  "TEST" will be replaced with "TEST"
//**									but  "tEst" will not be replaced.
//**	@RDESC		<t FALSE> if there are no more occurances or the search string, <t TRUE> otherwise.
//**	@END
//***************************************************************************************************
//inline
BOOL CDialogSmartReplace::ReplaceStepEx( const CString& a_strFind, const CString& a_strReplace, DWORD a_dwFlags, BOOL a_bAllCases ) 
{
	//
	//	GET TEXT SELECTION
	//
	CITextSelection pITextSelection = this->GetTextSelection();

	if ( FALSE == pITextSelection.IsValid() )
	{
		return FALSE;
	}

	//
	//	CHECK SELECTION FOR MATCH
	//
	if ( TRUE == this->m_bSelectionMatches )
	{
		//
		//	ASK PERMISSION
		//
		if ( TRUE == this->AskPermission( EReplaceItem_Instance, "" ) )
		{
			//
			//	SETUP REPLACE TEXT
			//
			CString strReplace( a_strReplace );

			//
			//	CHECK CASE
			//
			switch ( this->m_enuCase )
			{
				case ECase_Lower:	strReplace.MakeLower();	break;
				case ECase_Upper:	strReplace.MakeUpper();	break;
			}

			//
			//	REPLACE TEXT
			//
			pITextSelection.SetText( strReplace );
		}

		//
		//	CHECK FOR ABORT
		//
		if ( TRUE == this->m_bAborted )
		{
			return FALSE;
		}
	}

	//
	//	FIND NEXT OCCURANCE
	//
	return this->FindTextEx( a_strFind, a_dwFlags, a_bAllCases );
}

//***************************************************************************************************
//**																				   ReplaceAllFile
//***************************************************************************************************
//**	@DOC		REPLACE
//**	@MFUNC		Replaces all occurances of the find string in all specified file with the 
//**				replace string using current members' settings 
//**	@PARM		[in] The file to replace in
//**	@PARM		[in] A flag indicating whether to forcedly open the file in text mode
//**	@RDESC		The number of replacements made
//**	@END
//***************************************************************************************************
//inline
int CDialogSmartReplace::ReplaceAllFile( const CString& a_strFile, BOOL a_bText /*= FALSE*/ )
{
	//
	//	SETUP VARS
	//
	CIDocuments	pIDocuments		= this->m_pIApplication.GetDocuments();	if ( FALSE == pIDocuments.IsValid() ) { return 0; }
	int			iReplaced		= 0;

	//
	//	TRY TO FIND AN ALREADY OPEN DOCUMENT OF THAT FILE
	//
	CIGenericDocument	pIGenericDocument	= pIDocuments.FindByFullName( a_strFile );
	BOOL				bOpenAlready		= pIGenericDocument.IsValid();

	//
	//	OPEN THE FILE AS A GENERIC DOCUMENT
	//
	pIGenericDocument = pIDocuments.Open( a_strFile, a_bText ? "Text" : "Auto", FALSE );	

	if ( FALSE == pIGenericDocument.IsValid() )
	{
		return 0;
	}

	//
	//	CHECK WHETER IT IS A TEXT DOCUMENT
	//
	CITextDocument pITextDocument = pIGenericDocument;		

	if ( FALSE == pITextDocument.IsValid() )
	{
		//
		//	NO TEXT DOCUMENT - CLOSE IT
		//
		pIGenericDocument.Close( FALSE );

		//
		//	AND SKIP IT
		//
		return 0;
	}

	//
	//	ASK PERMISSION
	//
	if ( FALSE == this->AskPermission( EReplaceItem_File, a_strFile ) )
	{
		//
		//	Closing the document is too dangerous: when closing it with bSave = FALSE, the method 
		//	simply fails due to no apparent reason (maybe has something to do with the doc's ref-count). 
		//	On the other hand, we cannot simply save the document because when it has already been opened
		//	and edit by the user his modifications would be lost ...
		//
		//	A reasonable solution consist in scanning the open windows before opening the document. If
		//	there is a window for the document already then, at this point, leave it open:
		//

		//
		//	DO NOT CLOSE DOCUMENTS THAT WERE OPEN 
		//
		if ( FALSE == bOpenAlready )
		{
			//
			//	CLOSE NOT NEEDED DOCUMENT
			//
			pITextDocument	= CITextDocument( NULL );		
			pIGenericDocument.Close( TRUE );			// we just opened it - it's safe to save it ...
		}
		
		//
		//	EXIT WITH RESULT
		//
		return iReplaced;
	}

	//
	//	REPLACE IN THIS DOCUMENT
	//
	iReplaced += this->ReplaceAll();

	//
	//	CHECK FOR ABORTION
	//
	if ( TRUE == this->m_bAborted )
	{
		return iReplaced;
	}

	//
	//	SAVE AND CLOSE THE DOCUMENT
	//
	if ( TRUE == this->AskSaveAndClose() ) 
	{
		pITextDocument	 = CITextDocument( NULL );			
		pIGenericDocument.Close( TRUE );
	}

	//
	//	RETURN NUMBER OF REPLACEMENTS
	//
	return iReplaced;
}

//***************************************************************************************************
//**																				ReplaceAllProject
//***************************************************************************************************
//**	@DOC		REPLACE
//**	@MFUNC		Replaces all occurances of the find string in all project text files with the 
//**				replace string using current members' settings 
//**	@PARM		[in] The project to replace in
//**	@RDESC		The number of replacements made
//**	@END
//***************************************************************************************************
//inline
int CDialogSmartReplace::ReplaceAllProject( CIGenericProject a_pIProject )
{
	//
	//	CHECK VALIDITY
	//
	if ( FALSE == a_pIProject.IsValid() )
	{
		return 0;
	}

	//
	//	SETUP VARS
	//
	CIDocuments	pIDocuments = this->m_pIApplication.GetDocuments	();	if ( FALSE == pIDocuments	.IsValid() )	{	return 0;	}
	int			iReplaced	= 0;

	//
	//	GET FILES IN ACTIVE PROJECT
	//
	CArray< CString, CString& > arrPaths;

	a_pIProject.GetSourceFilePaths( arrPaths );

	//
	//	ENUMERATE FILES
	//
	for ( int iFile = 0; iFile < arrPaths.GetSize(); iFile++ )
	{
		//
		//	REPLACE IN FILE
		//
		this->ReplaceAllFile( arrPaths[ iFile ] );

		//
		//	CHECK ABORT FLAG
		//
		if ( TRUE == this->m_bAborted )
		{
			break;
		}
	}

	//
	//	RETURN COUNT
	//
	return iReplaced;
}

//***************************************************************************************************
//**																			  ReplaceAllDirectory
//***************************************************************************************************
//**	@DOC		REPLACE
//**	@MFUNC		Replaces all occurances of the find string in all specified directory
//**	@PARM		[in] The directory to replace in
//**	@PARM		[in] The file filter
//**	@PARM		[in] A flag indicating whether to recurse sub-directories
//**	@RDESC		The number of replacements made
//**	@END
//***************************************************************************************************
//inline
int CDialogSmartReplace::ReplaceAllDirectory( const CString& a_strDirectory, const CString& a_strFilter, BOOL a_bRecurse )
{
	//
	//	SETUP RESULT
	//
	int iReplaced = 0;

	//
	//	FIX PATH
	//
	CString strDirectory( a_strDirectory );

	if (	( strDirectory.Right( 1 ) != '\\' ) 
		 && ( strDirectory.Right( 1 ) != '/'  )  )
	{
		strDirectory += "/";
	}

	//
	//	FIND FILES
	//
	CFileFind	finder		;
	BOOL		bContinue	= finder.FindFile( strDirectory + a_strFilter );

	while ( TRUE == bContinue )
	{
		//
		//	CHECK ABORT FLAG
		//
		if ( TRUE == this->m_bAborted )
		{
			return iReplaced;
		}

		//
		//	FIND NEXT FILE
		//
		bContinue = finder.FindNextFile();

		//
		//	CHECK FOR DOTS
		//
		if ( TRUE == finder.IsDots() )
		{
			continue;
		}

		//
		//	CHECK FOR DIRECTORY
		//
		if ( TRUE == finder.IsDirectory() )
		{
			//
			//	CHECK RECURSE FLAG
			//
			if ( TRUE == a_bRecurse )
			{
				//
				//	ONLY RECURSE WHEN ENUMERATING ALL FILES
				//
				if ( "*.*" == a_strFilter )
				{
					//
					//	RECURSE
					//
					iReplaced += this->ReplaceAllDirectory( finder.GetFilePath(), a_strFilter, a_bRecurse );
				}
				else
				{
					continue;
				}
			}
			else
			{
				//
				//	SKIP DIRECTORIES
				//
				continue;
			}
		}

		//
		//	REPLACE IN THIS FILE
		//
		iReplaced += this->ReplaceAllFile( finder.GetFilePath(), TRUE );	// force open as text file
	}

	//
	//	CHECK FILTER
	//
	if ( "*.*" != a_strFilter )
	{
		//
		//	CHECK FOR RECURSION
		//
		if ( TRUE == a_bRecurse )
		{
			//
			//	ENUMERATE DIRECTORIES MANUALLY
			//
			CFileFind	finder		;
			BOOL		bContinue	= finder.FindFile( strDirectory + "*.*" );

			while ( TRUE == bContinue )
			{
				//
				//	CHECK ABORT FLAG
				//
				if ( TRUE == this->m_bAborted )
				{
					return iReplaced;
				}
			
				//
				//	FIND NEXT FILE
				//
				bContinue = finder.FindNextFile();

				//
				//	CHECK FOR DOTS
				//
				if ( TRUE == finder.IsDots() )
				{
					continue;
				}

				//
				//	CHECK FOR DIRECTORY
				//
				if ( TRUE == finder.IsDirectory() )
				{
					//
					//	RECURSE INTO THIS DIRECTORY
					//
					iReplaced += this->ReplaceAllDirectory( finder.GetFilePath(), a_strFilter, a_bRecurse );
				}
			}
		}
	}

	//
	//	RETURN COUNT
	//
	return iReplaced;
}

//***************************************************************************************************
//**																			ReplaceAllDirectoryEx
//***************************************************************************************************
//**	@DOC		REPLACE
//**	@MFUNC		Replaces all occurances of the find string in all specified directory
//**	@PARM		[in] The directory to replace in
//**	@PARM		[in] The file filters
//**	@PARM		[in] A flag indicating whether to recurse sub-directories
//**	@RDESC		The number of replacements made
//**	@END
//***************************************************************************************************
//inline
int CDialogSmartReplace::ReplaceAllDirectoryEx( const CString& a_strDirectory, const CString& a_strExtensions, BOOL a_bRecurse )
{
	//
	//	SETUP RESULT
	//
	int iReplaced = 0;

	//
	//	COLLECT FILTERS
	//
	CArray< CString, CString& > arrFilters;

	CString strLeft		= "";
	CString strRight	= a_strExtensions;
	int		iPos		= a_strExtensions.Find( ';' );

	while ( iPos >= 0 )
	{
		strLeft		= strRight.Left( iPos );
		strRight	= strRight.Right( strRight.GetLength() - iPos - 1 );

		iPos		= strRight.Find( ';' );

		strLeft.TrimLeft ();
		strLeft.TrimRight();

		arrFilters.Add( strLeft );
	}

	if ( FALSE == strRight.IsEmpty() )
	{
		strRight.TrimRight();
		strRight.TrimRight();

		arrFilters.Add( strRight );
	}

	//
	//	ENUMERATE FILTERS
	//
	for ( int iFilter = 0; iFilter < arrFilters.GetSize(); iFilter++ )
	{
		//
		//	DELEGATE 
		//
		iReplaced += this->ReplaceAllDirectory( a_strDirectory, arrFilters[ iFilter ], a_bRecurse );
	}

	//
	//	RETURN COUNT
	//
	return iReplaced;
}

//***************************************************************************************************
//**																					 ResetMatches
//***************************************************************************************************
//**	@DOC		REPLACE
//**	@MFUNC		Resets matches for the current file
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::ResetMatches( void )
{
	this->m_arrFoundMatches		.RemoveAll();
	this->m_bFileFinished		= FALSE;
	this->m_bSelectionMatches	= FALSE;
}

//
//---------------------------------------------------------------------------------------------------
//****************************************     VIRTUALS     *****************************************
//---------------------------------------------------------------------------------------------------
//

//***************************************************************************************************
//**																				   DoDataExchange
//***************************************************************************************************
//**	@DOC		VIRTUALS
//**	@MFUNC		Exchanges data between the dialog's members and its controls
//**	@PARM		[in/out] Pointer to data exchange context
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange( pDX );

	//{{AFX_DATA_MAP(CDialogSmartReplace)
	DDX_Control	( pDX, IDC_COMBO_EXTENSIONS			, m_ctrlComboExtensions		);
	DDX_Control	( pDX, IDC_COMBO_DIRECTORY			, m_ctrlComboDirectory		);
	DDX_Control	( pDX, IDC_COMBO_REPLACE_WITH		, m_ctrlComboReplaceWith	);
	DDX_Control	( pDX, IDC_COMBO_FIND_WHAT			, m_ctrlComboFindWhat		);
	DDX_Control	( pDX, IDC_ADVANCED					, m_ctrlBtnAdvanced			);
	DDX_Check	( pDX, IDC_CHECK_ALL_CASES			, m_bAllCases				);
	DDX_Check	( pDX, IDC_CHECK_MATCH_CASE			, m_bMatchCase				);
	DDX_Check	( pDX, IDC_CHECK_REGULAR_EXPRESSION	, m_bRegularExpression		);
	DDX_Check	( pDX, IDC_CHECK_WHOLE_WORDS		, m_bWholeWord				);
	DDX_CBString( pDX, IDC_COMBO_FIND_WHAT			, m_strFindWhat				);
	DDX_CBString( pDX, IDC_COMBO_REPLACE_WITH		, m_strReplaceWith			);
	DDX_CBIndex	( pDX, IDC_COMBO_REPLACE_WHERE		, m_iReplaceWhereEx			);
	DDX_Radio	( pDX, IDC_RADIO_SELECTION			, m_iReplaceWhere			);
	DDX_CBString( pDX, IDC_COMBO_DIRECTORY			, m_strDirectory			);
	DDX_CBString( pDX, IDC_COMBO_EXTENSIONS			, m_strExtensions			);
	DDX_Check	( pDX, IDC_CHECK_RECURSE			, m_bRecurse				);
	//}}AFX_DATA_MAP
}

//***************************************************************************************************
//**																				 OnSearchComplete
//***************************************************************************************************
//**	@DOC		VIRTUALS
//**	@MFUNC		Called when the search completed and no more matches can be found
//**	@PARM		[in] A flag indicating whether to display a message box stating that there are
//**						no more occurances of the search string
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnSearchComplete( BOOL a_bMessageBox /*= TRUE*/ ) 
{
	//
	//	CANCEL SELECTION
	//
//	this->GetTextSelection().Cancel();

	//
	//	CHECK FOR MESSAGE BOX
	//
	if ( FALSE == a_bMessageBox )
	{
		return;
	}

	//
	//	CHECK FOR ABORTION
	//
	if ( TRUE == this->m_bAborted )
	{
		return;
	}

	//
	//	DISPLAY MESSAGE BOX
	//
	CString strText; 
			strText.Format( "Completed search for '%s'.", this->m_strFindWhat );

	this->MessageBox( strText, _T( "SmartReplace" ), MB_ICONEXCLAMATION );

	//
	//	RESET MATCHES
	//
	this->ResetMatches();
}

//
//---------------------------------------------------------------------------------------------------
//****************************************     MESSAGES     *****************************************
//---------------------------------------------------------------------------------------------------
//

BEGIN_MESSAGE_MAP( CDialogSmartReplace, CDialog )
	//{{AFX_MSG_MAP(CDialogSmartReplace)
	ON_WM_CLOSE		()
	ON_BN_CLICKED	( IDC_CONTINUE						, OnContinue						)
	ON_BN_CLICKED	( IDC_REPLACE						, OnReplace							)
	ON_BN_CLICKED	( IDC_REPLACE_ALL					, OnReplaceAll						)
	ON_BN_CLICKED	( IDC_ADVANCED						, OnAdvanced						)
	ON_BN_CLICKED	( IDC_CHECK_MATCH_CASE				, OnCheckMatchCase					)
	ON_BN_CLICKED	( IDC_CHECK_REGULAR_EXPRESSION		, OnCheckRegularExpression			)
	ON_CBN_SELENDOK	( IDC_COMBO_REPLACE_WHERE			, OnSelEndOkComboReplaceWhere		)
	ON_BN_CLICKED	( IDC_RADIO_SELECTION				, OnRadioSelection					)
	ON_BN_CLICKED	( IDC_RADIO_FILE					, OnRadioFile						)
	ON_BN_CLICKED	( IDC_RADIO_EXTENDED				, OnRadioExtended					)
	ON_BN_CLICKED	( IDC_OPTIONS						, OnOptions							)
	ON_BN_CLICKED	( IDC_DEBUG							, OnDebug							)
	ON_BN_CLICKED	( IDC_FILTERS						, OnFilters							)
	ON_BN_CLICKED	( IDC_BROWSE_DIRECTORY				, OnBrowseDirectory					)
	ON_BN_CLICKED	( IDC_CONTEXT_MENU_REG_EXP_FIND		, OnContextMenuRegExpFind			)
	ON_BN_CLICKED	( IDC_CONTEXT_MENU_REG_EXP_REPLACE	, OnContextMenuRegExpReplace		)
																							
	ON_COMMAND		( ID_OPTIONS_QUOTEDSTRING			, OnCommandQuotedString				)
	ON_COMMAND		( ID_OPTIONS_ANYCHARACTER			, OnCommandAnyChar					)
	ON_COMMAND		( ID_OPTIONS_CHARACTERINRANGE		, OnCommandInRange					)
	ON_COMMAND		( ID_OPTIONS_CHARACTERNOTINRANGE	, OnCommandNotInRange				)
	ON_COMMAND		( ID_OPTIONS_BEGINNINGOFLINE		, OnCommandBeginOfLine				)
	ON_COMMAND		( ID_OPTIONS_ENDOFLINE				, OnCommandEndOfLine				)
	ON_COMMAND		( ID_OPTIONS_TAGGEDEXPRESSION		, OnCommandTaggedExp				)
	ON_COMMAND		( ID_OPTIONS_NOT					, OnCommandNot						)
	ON_COMMAND		( ID_OPTIONS_OR						, OnCommandOr						)
	ON_COMMAND		( ID_OPTIONS_0ORMOREMATCHES			, OnCommand0OrMore					)
	ON_COMMAND		( ID_OPTIONS_1ORMOREMATCHES			, OnCommand1OrMore					)
	ON_COMMAND		( ID_OPTIONS_GROUP					, OnCommandGroup					)
	ON_COMMAND		( ID_OPTIONS_WHITESPACE				, OnCommandWhitespace				)
	ON_COMMAND		( ID_OPTIONS_ALPHANUMERICCHARACTER	, OnCommandAlphaNumericCharacter	)
	ON_COMMAND		( ID_OPTIONS_ALPHABETICCHARACTER	, OnCommandAlphaCharacter			)
	ON_COMMAND		( ID_OPTIONS_DECIMALDIGIT			, OnCommandDecDigit					)
	ON_COMMAND		( ID_OPTIONS_HEXADECIMALNUMBER		, OnCommandHexNumber				)
	ON_COMMAND		( ID_OPTIONS_NUMBER					, OnCommandNumber					)
	ON_COMMAND		( ID_OPTIONS_INTEGER				, OnCommandInteger					)
	ON_COMMAND		( ID_OPTIONS_CCIDENTIFIER			, OnCommandCIdentifier				)
	ON_COMMAND		( ID_OPTIONS_ALPHABETICSTRING		, OnCommandAlphabeticString			)
	ON_COMMAND		( ID_OPTIONS2_FINDWHATTEXT			, OnCommandFindWhatText				)
	ON_COMMAND		( ID_OPTIONS2_TAGGEDEXPRESSION1		, OnCommandTaggedExpression1		)
	ON_COMMAND		( ID_OPTIONS2_TAGGEDEXPRESSION2		, OnCommandTaggedExpression2		)
	ON_COMMAND		( ID_OPTIONS2_TAGGEDEXPRESSION3		, OnCommandTaggedExpression3		)
	ON_COMMAND		( ID_OPTIONS2_TAGGEDEXPRESSION4		, OnCommandTaggedExpression4		)
	ON_COMMAND		( ID_OPTIONS2_TAGGEDEXPRESSION5		, OnCommandTaggedExpression5		)
	ON_COMMAND		( ID_OPTIONS2_TAGGEDEXPRESSION6		, OnCommandTaggedExpression6		)
	ON_COMMAND		( ID_OPTIONS2_TAGGEDEXPRESSION7		, OnCommandTaggedExpression7		)
	ON_COMMAND		( ID_OPTIONS2_TAGGEDEXPRESSION8		, OnCommandTaggedExpression8		)
	ON_COMMAND		( ID_OPTIONS2_TAGGEDEXPRESSION9		, OnCommandTaggedExpression9		)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

//***************************************************************************************************
//**																					 OnInitDialog
//***************************************************************************************************
//**	@DOC		MESSAGES
//**	@MFUNC		Called to initialize the dialog
//**	@END
//***************************************************************************************************
//inline
BOOL CDialogSmartReplace::OnInitDialog() 
{
	//
	//	CALL BASE CLASS' IMPLEMENTATION
	//
	CDialog::OnInitDialog();

	//
	//	SETUP CONTROLS
	//
	this->m_ctrlBtnAdvanced	.SetWindowText( _T( "<< Si&mple" ) );

#ifdef NDEBUG
	this->GetDlgItem( IDC_DEBUG )->EnableWindow	( FALSE		);
	this->GetDlgItem( IDC_DEBUG )->ShowWindow	( SW_HIDE	);
#endif

	//
	//	LOAD PROFILE
	//
	this->LoadProfile();

	//
	//	UPDATE FIND STRING
	//
	this->UpdateFindStringEx();

	//
	//	SET THE FOCUS TO THE "Find What" COMBO BOX
	//
	this->GetDlgItem( IDC_COMBO_FIND_WHAT )->SetFocus();

	//
	//	RESET ABORT FLAG
	//
	this->m_bAborted = FALSE;

	//
	//	DO NOT MODIFY FOCUS
	//
	return FALSE;  
}

//***************************************************************************************************
//**																						  OnClose
//***************************************************************************************************
//**	@DOC		MESSAGES
//**	@MFUNC		Called when the window is about to close
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnClose() 
{
	//
	//	UPDATE MEMBERS FROM CONTROLS
	//
	this->UpdateData( EUpdateData_FromControls );

	//
	//	WRITE PROFILE
	//
	this->WriteProfile();

	//
	//	CALL BASE CLASS' IMPLEMENTATION
	//
	CDialog::OnClose();
}

//***************************************************************************************************
//**																					   OnContinue
//***************************************************************************************************
//**	@DOC		MESSAGES
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnContinue() 
{
	//
	//	RESET ABORT FLAG
	//
	this->m_bAborted = FALSE;

	//
	//	UPDATE MEMBERS FROM CONTROLS	
	//
	this->UpdateData( EUpdateData_FromControls );

	//
	//	UPDATE HISTORIES
	//
	this->UpdateHistories();

	//
	//	CHECK AVAILABILITY
	//
	if ( FALSE == this->GetTextSelection().IsValid() )
	{
		return;
	}

	//
	//	FIND TEXT
	//
	if ( FALSE == this->FindText() )
	{
		this->OnSearchComplete();
	}

	//
	//	CHECK FOR FINISH
	//
	if ( TRUE == this->m_bFileFinished )
	{
		this->OnSearchComplete();
	}
}

//***************************************************************************************************
//**																						OnReplace
//***************************************************************************************************
//**	@DOC		MESSAGES
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnReplace() 
{
	//
	//	RESET ABORT FLAG
	//
	this->m_bAborted = FALSE;

	//
	//	SET ASK PERMISISON FLAG
	//
	this->m_bAskPermission = this->m_bAskForExtendedOnly;

	//
	//	UPDATE MEMBERS FROM CONTROLS	
	//
	this->UpdateData( EUpdateData_FromControls );

	//
	//	UPDATE HISTORIES
	//
	this->UpdateHistories();

	//
	//	CHECK FOR MATCH
	//
	if ( FALSE == this->GetTextSelection().IsValid() )
	{
		return;
	}

	//
	//	REPLACE NEXT
	//
	if ( FALSE == this->ReplaceNext() )
	{
		this->OnSearchComplete();
	}
}

//***************************************************************************************************
//**																					 OnReplaceAll
//***************************************************************************************************
//**	@DOC		MESSAGES
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnReplaceAll() 
{
	//
	//	RESET ABORT FLAG
	//
	this->m_bAborted = FALSE;

	//
	//	UPDATE MEMBERS FROM CONTROLS	
	//
	this->UpdateData( EUpdateData_FromControls );

	//
	//	UPDATE HISTORIES
	//
	this->UpdateHistories();

	//
	//	REPLACE ALL
	//
	int iReplaced = 0;

	switch ( this->m_iReplaceWhere )
	{
										//
										//	CURRENT SELECTION
										//
		case EReplaceWhere_Selection:	this->m_bAskPermission = (FALSE == this->m_bAskForExtendedOnly) ? TRUE : FALSE;

										iReplaced = this->ReplaceAllSelection();	
										
										break;

										//
										//	CURRENT FILE
										//
		case EReplaceWhere_File		:	this->m_bAskPermission = (FALSE == this->m_bAskForExtendedOnly) ? TRUE : FALSE;

										iReplaced = this->ReplaceAll();	

										break;
					
										//
										//	EXTENDED
										//
		case EReplaceWhere_Extended	:	this->m_bAskPermission = TRUE;

										switch ( this->m_iReplaceWhereEx )
										{
																					//
																					//	ALL OPEN FILES
																					//
											case EReplaceWhereEx_AllOpen		:	iReplaced = this->ReplaceAllOpen		();	break;
																															
																					//										
																					//	ALL FILES IN PROJECT				
																					//										
											case EReplaceWhereEx_AllInProject	:	iReplaced = this->ReplaceAllProject		();	break;
																				
																					//
																					//	ALL FILES IN WORKSPACE
																					//
											case EReplaceWhereEx_AllInWorkspace	:	iReplaced = this->ReplaceAllWorkspace	();	break;

																					//
																					//	ALL FILES IN DIRECTORY
																					//
											case EReplaceWhereEx_AllInDirectory	:	iReplaced = this->ReplaceAllDirectory	();	break;

																					//
																					//	ALL FILES IN FILTER SETTINGS
																					//
											case EReplaceWhereEx_AllInFilters	:	iReplaced = this->ReplaceAllFilters		();	break;
										}
										break;
	}

	//
	//	DELGATE
	//
	this->OnSearchComplete( iReplaced <= 0 );
}

//***************************************************************************************************
//**																						 OnCancel
//***************************************************************************************************
//**	@DOC		MESSAGES
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCancel() 
{
	//
	//	CALL BASE CLASS' IMPLEMENTATION
	//
	CDialog::OnCancel();
}

//***************************************************************************************************
//**																					   OnAdvanced
//***************************************************************************************************
//**	@DOC		MESSAGES
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnAdvanced() 
{
	//
	//	UPDATE MEMBERS FROM CONTROLS	
	//
	this->UpdateData( EUpdateData_FromControls );

	//
	//	CHECK STATE
	//
	CString strCaption	;	this->m_ctrlBtnAdvanced.GetWindowText( strCaption );
	BOOL	bOpen		= ( "Ad&vanced>>" == strCaption );

	//
	//	TOGGLE STATE
	//
	this->m_ctrlBtnAdvanced.SetWindowText( bOpen ? _T( "<< Si&mple" ) : _T( "Ad&vanced>>" ) );

	//
	//	RESIZE WINDOW
	//
	CRect rectPos;

	this->GetWindowRect	( rectPos );	rectPos.bottom += (bOpen ? 120 : -120);
	this->MoveWindow	( rectPos.left, rectPos.top, rectPos.Width(), rectPos.Height() );
}

//***************************************************************************************************
//**																						OnOptions
//***************************************************************************************************
//**	@DOC		MESSAGES
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnOptions() 
{
	//
	//	SETUP DIALOG
	//
	CDialogOptions dlgOptions( this );

	//
	//	EXCHANGE DATA TO DIALOG
	//
	dlgOptions.m_bAskForExtendedOnly = this->m_bAskForExtendedOnly	;
	dlgOptions.m_iConfirmReplacement = this->m_enuConfirmReplacement;
	dlgOptions.m_iSaveAndClose		 = this->m_enuSaveAndClose		;

	//
	//	SHOW DIALOG
	//
	if ( IDOK != dlgOptions.DoModal() )
	{
		return;
	}

	//
	//	EXCHANGE DATA FROM DIALOG
	//
	this->m_bAskForExtendedOnly		=										dlgOptions.m_bAskForExtendedOnly	 ;
	this->m_enuConfirmReplacement	= static_cast< EConfirmReplacement	> (	dlgOptions.m_iConfirmReplacement	);
	this->m_enuSaveAndClose			= static_cast< ESaveAndClose		> (	dlgOptions.m_iSaveAndClose			);

	//
	//	WRITE MODIFICATIONS TO PROFILE
	//
	CWinApp* pApp = ::AfxGetApp();

	CString strSection; 
			strSection.LoadString( IDS_PROFILE_SECTION );

	pApp->WriteProfileInt	( strSection, _T( "AskForExtendedOnly"	), this->m_bAskForExtendedOnly 		);
	pApp->WriteProfileInt	( strSection, _T( "ConfirmReplace"		), this->m_enuConfirmReplacement	);
	pApp->WriteProfileInt	( strSection, _T( "SaveAndClose"		), this->m_enuSaveAndClose			);
}

//***************************************************************************************************
//**																						OnFilters
//***************************************************************************************************
//**	@DOC		MESSAGES
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnFilters() 
{
	//
	//	SETUP DIALOG
	//
	CDialogFilters dlgFilters;

	//
	//	SET FILTERS
	//
	dlgFilters.SetFolders	( this->m_arrFolders	);
	dlgFilters.SetFileMasks	( this->m_arrFileMasks	);

	//
	//	DISPLAY DIALOG
	//
	if ( IDOK != dlgFilters.DoModal() )
	{
		return;
	}

	//
	//	STORE FILTERS
	//
	this->m_arrFolders	.RemoveAll();
	this->m_arrFileMasks.RemoveAll();

	dlgFilters.GetFolders	( this->m_arrFolders	);
	dlgFilters.GetFileMasks	( this->m_arrFileMasks	);

	//
	//	WRITE FILTERS
	//
	this->WriteFilters();
}

//***************************************************************************************************
//**																				OnBrowseDirectory
//***************************************************************************************************
//**	@DOC		MESSAGES
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnBrowseDirectory() 
{
	//
	//	UPDATE MEMBERS FROM CONTROLS
	//
	this->UpdateData( EUpdateData_FromControls );

	//
	//	BROWSE FOLDER
	//
	CFolderDialog dlgFolder	( _T( "Select Search Directory" )
							, _T( "Select the place where you want to start your search from the list below:" )
							, this->m_strDirectory 
							);

	if ( IDOK != dlgFolder.DoModal() )
	{
		return;
	}

	//
	//	KEEP FOLDER
	//
	this->m_strDirectory = dlgFolder.GetPath();

	//
	//	UPDATE MEMBERS TO CONTROLS
	//
	this->UpdateData( EUpdateData_ToControls );

	//
	//	UPDATE HISTORY
	//
	this->UpdateHistoryDirectory();
}

//***************************************************************************************************
//**																		  OnContextMenuRegExpFind
//***************************************************************************************************
//**	@DOC		MESSAGES
//**	@MFUNC		Displays the regular expression context menu
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnContextMenuRegExpFind() 
{
	//
	//	LOAD CONTEXT MENU
	//
	CMenu	menuContext;
			menuContext.LoadMenu( IDM_REGEXP );

	//
	//	GET SUB MENU
	//
	CMenu*  pMenu = menuContext.GetSubMenu( EMenuRegExp_Find ); 

	//
	//	GET CURSOR POSITION	
	//
	POINT ptCursor;	::GetCursorPos( &ptCursor );

	//
	//	TRACK POPUP MENU
	//
	pMenu->TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON, ptCursor.x, ptCursor.y, this, NULL );	
}

//***************************************************************************************************
//**																	   OnContextMenuRegExpReplace
//***************************************************************************************************
//**	@DOC		MESSAGES
//**	@MFUNC		Displays the regular expression context menu
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnContextMenuRegExpReplace() 
{
	//
	//	LOAD CONTEXT MENU
	//
	CMenu	menuContext;
			menuContext.LoadMenu( IDM_REGEXP );

	//
	//	GET SUB MENU
	//
	CMenu*  pMenu = menuContext.GetSubMenu( EMenuRegExp_Replace ); 

	//
	//	GET CURSOR POSITION	
	//
	POINT ptCursor;	::GetCursorPos( &ptCursor );

	//
	//	TRACK POPUP MENU
	//
	pMenu->TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON, ptCursor.x, ptCursor.y, this, NULL );	
}

//***************************************************************************************************
//**																						  OnDebug
//***************************************************************************************************
//**	@DOC		MESSAGES
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnDebug() 
{
	#define TRI( Func, Interface  )	{ TRACE3( "[SmartReplace] %-25s: %-40s->m_lRefCount == %d\n", #Func, #Interface, ::g_GetRefCount(  Interface ) ); }
	#define TRC( Func, Interface )	{ TRACE3( "[SmartReplace] %-25s: %-40s->m_lRefCount == %d\n", #Func, #Interface, ::g_GetRefCount( *Interface ) ); }

	//
	//	CHECK REFERENCE COUNTING FOR SAMPLE CASE
	//
	TRC( Init, m_pIApplication );
	{
		CIDocuments pIDocuments = this->m_pIApplication.GetDocuments();	TRC( GetDocuments, m_pIApplication );	TRC( GetDocuments, pIDocuments );
	}

	TRC( Exit, m_pIApplication );

	#undef TRI
	#undef TRC
}

//***************************************************************************************************
//**																				 OnCheckMatchCase
//***************************************************************************************************
//**	@DOC		MESSAGES
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCheckMatchCase() 
{
	//
	//	UPDATE MEMBERS FROM CONTROLS
	//
	this->UpdateData( EUpdateData_FromControls );

	//
	//	UPDATE CONTROLS
	//
	this->UpdateControls();
}

//***************************************************************************************************
//**																		 OnCheckRegularExpression
//***************************************************************************************************
//**	@DOC		MESSAGES
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCheckRegularExpression() 
{
	//
	//	UPDATE MEMBERS FROM CONTROLS
	//
	this->UpdateData( EUpdateData_FromControls );

	//
	//	UPDATE CONTROLS
	//
	this->UpdateControls();
}

//***************************************************************************************************
//**																				 OnRadioSelection
//***************************************************************************************************
//**	@DOC		MESSAGES
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnRadioSelection() 
{
	//
	//	UPDATE MEMBERS FROM CONTROLS
	//
	this->UpdateData( EUpdateData_FromControls );

	//
	//	UPDATE CONTROLS
	//
	this->UpdateControls();
}

//***************************************************************************************************
//**																					  OnRadioFile
//***************************************************************************************************
//**	@DOC		MESSAGES
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnRadioFile() 
{
	//
	//	UPDATE MEMBERS FROM CONTROLS
	//
	this->UpdateData( EUpdateData_FromControls );

	//
	//	UPDATE CONTROLS
	//
	this->UpdateControls();
}

//***************************************************************************************************
//**																				  OnRadioExtended
//***************************************************************************************************
//**	@DOC		MESSAGES
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnRadioExtended() 
{
	//
	//	UPDATE MEMBERS FROM CONTROLS
	//
	this->UpdateData( EUpdateData_FromControls );

	//
	//	UPDATE CONTROLS
	//
	this->UpdateControls();
}

//***************************************************************************************************
//**																	  OnSelEndOkComboReplaceWhere
//***************************************************************************************************
//**	@DOC		MESSAGES
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnSelEndOkComboReplaceWhere() 
{
	//
	//	UPDATE MEMBERS FROM CONTROLS
	//
	this->UpdateData( EUpdateData_FromControls );

	//
	//	UPDATE CONTROLS
	//
	this->UpdateControls();
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandAnyChar()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpFind[ ERegExpFind_AnyChar ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandInRange()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpFind[ ERegExpFind_InRange ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandNotInRange()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpFind[ ERegExpFind_NotInRange ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandBeginOfLine()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpFind[ ERegExpFind_BeginOfLine ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandEndOfLine()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpFind[ ERegExpFind_EndOfLine ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandTaggedExp()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpFind[ ERegExpFind_TaggedExpression ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandNot()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpFind[ ERegExpFind_Not ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandOr()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpFind[ ERegExpFind_Or ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommand0OrMore()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpFind[ ERegExpFind_ZeroOrMore ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommand1OrMore()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpFind[ ERegExpFind_OneOrMore ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandGroup()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpFind[ ERegExpFind_Group ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandWhitespace()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpFind[ ERegExpFind_Whitespace ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandAlphaNumericCharacter()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpFind[ ERegExpFind_AlphaNumericCharacter ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandAlphaCharacter()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpFind[ ERegExpFind_AlphaCharacter ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandDecDigit()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpFind[ ERegExpFind_DecimalDigit ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandHexNumber()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpFind[ ERegExpFind_HexNumber ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandNumber()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpFind[ ERegExpFind_DecimalNumber ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandInteger()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpFind[ ERegExpFind_Integer ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandCIdentifier()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpFind[ ERegExpFind_Identifier ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandAlphabeticString()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpFind[ ERegExpFind_AlphabeticString ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandQuotedString()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpFind[ ERegExpFind_QuotedString ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandFindWhatText()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpReplace[ ERegExpReplace_FindWhatText ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandTaggedExpression1()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpReplace[ ERegExpReplace_TaggedExpression1 ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandTaggedExpression2()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpReplace[ ERegExpReplace_TaggedExpression2 ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandTaggedExpression3()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpReplace[ ERegExpReplace_TaggedExpression3 ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandTaggedExpression4()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpReplace[ ERegExpReplace_TaggedExpression4 ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandTaggedExpression5()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpReplace[ ERegExpReplace_TaggedExpression5 ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandTaggedExpression6()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpReplace[ ERegExpReplace_TaggedExpression6 ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandTaggedExpression7()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpReplace[ ERegExpReplace_TaggedExpression7 ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandTaggedExpression8()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpReplace[ ERegExpReplace_TaggedExpression8 ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

//***************************************************************************************************
//**																	  
//***************************************************************************************************
//**	@DOC		MESSAGES COMMANDS
//**	@MFUNC		
//**	@END
//***************************************************************************************************
//inline
void CDialogSmartReplace::OnCommandTaggedExpression9()
{
	//
	//	GET TEXT
	//
	const char* pszText = this->ms_ppszRegExpReplace[ ERegExpReplace_TaggedExpression9 ][ this->m_lRegExpEmulation ];

	//
	//	ADD TEXT
	//
	this->AddText( this->m_ctrlComboFindWhat, pszText );
}

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
Web Developer
Germany Germany
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions