427 lines
10 KiB
C++
427 lines
10 KiB
C++
// CFileChangerDemoDlg.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "FileChanger.h"
|
|
#include "FileChangerDemoDlg.h"
|
|
|
|
#include "UTSampleAbout.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CFileChangerDemoDlg dialog
|
|
|
|
CFileChangerDemoDlg::CFileChangerDemoDlg(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CFileChangerDemoDlg::IDD, pParent)
|
|
{
|
|
//{{AFX_DATA_INIT(CFileChangerDemoDlg)
|
|
m_bAll = TRUE;
|
|
m_sFileIn = _T("");
|
|
m_sFileOut = _T("");
|
|
m_sFindText = _T("");
|
|
m_bMatchCase = FALSE;
|
|
m_bOverwrite = FALSE;
|
|
m_sReplaceText = _T("");
|
|
m_bUseCFile = FALSE;
|
|
m_bWholeWord = FALSE;
|
|
m_nTextBinary = 0;
|
|
m_bMessage = TRUE;
|
|
//}}AFX_DATA_INIT
|
|
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
|
|
}
|
|
|
|
void CFileChangerDemoDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CFileChangerDemoDlg)
|
|
DDX_Control(pDX, IDC_OVERWRITE, m_ctlOverwrite);
|
|
DDX_Control(pDX, IDC_WHOLEWORD, m_ctlWholeWord);
|
|
DDX_Control(pDX, IDC_FILEOUT, m_ctlFileOut);
|
|
DDX_Control(pDX, IDC_BROWSEOUT, m_ctlBrowseOut);
|
|
DDX_Control(pDX, IDC_MATCHCASE, m_ctlMatchCase);
|
|
DDX_Check(pDX, IDC_ALL, m_bAll);
|
|
DDX_Text(pDX, IDC_FILEIN, m_sFileIn);
|
|
DDX_Text(pDX, IDC_FILEOUT, m_sFileOut);
|
|
DDX_Text(pDX, IDC_FINDTEXT, m_sFindText);
|
|
DDX_Check(pDX, IDC_MATCHCASE, m_bMatchCase);
|
|
DDX_Check(pDX, IDC_OVERWRITE, m_bOverwrite);
|
|
DDX_Text(pDX, IDC_REPLACETEXT, m_sReplaceText);
|
|
DDX_Check(pDX, IDC_USECFILE, m_bUseCFile);
|
|
DDX_Check(pDX, IDC_WHOLEWORD, m_bWholeWord);
|
|
DDX_Radio(pDX, IDC_TEXT, m_nTextBinary);
|
|
DDX_Check(pDX, IDC_MESSAGE, m_bMessage);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CFileChangerDemoDlg, CDialog)
|
|
//{{AFX_MSG_MAP(CFileChangerDemoDlg)
|
|
ON_WM_SYSCOMMAND()
|
|
ON_WM_PAINT()
|
|
ON_WM_QUERYDRAGICON()
|
|
ON_BN_CLICKED(IDC_TEXT, OnSelectTextBinary)
|
|
ON_BN_CLICKED(IDC_FIND, OnFind)
|
|
ON_BN_CLICKED(IDC_REPLACE, OnReplace)
|
|
ON_BN_CLICKED(IDC_OVERWRITE, OnSelectOverwrite)
|
|
ON_BN_CLICKED(IDC_BROWSEIN, OnBrowseIn)
|
|
ON_BN_CLICKED(IDC_BROWSEOUT, OnBrowseOut)
|
|
ON_BN_CLICKED(IDC_USECFILE, OnUsecfile)
|
|
ON_BN_CLICKED(IDC_BINARY, OnSelectTextBinary)
|
|
ON_EN_KILLFOCUS(IDC_FINDTEXT, OnSelectTextBinary)
|
|
ON_EN_KILLFOCUS(IDC_REPLACETEXT, OnSelectTextBinary)
|
|
ON_BN_CLICKED(IDC_MESSAGE, OnMessage)
|
|
ON_MESSAGE(WM_OX_FILE_MATCH_FOUND, OnFileMatchFound)
|
|
ON_MESSAGE(WM_OX_FILE_PRE_REPLACE, OnFilePreReplace)
|
|
ON_MESSAGE(WM_OX_FILE_POST_REPLACE, OnFilePostReplace)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CFileChangerDemoDlg message handlers
|
|
|
|
BOOL CFileChangerDemoDlg::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
// Add "About..." menu item to system menu.
|
|
|
|
// IDM_ABOUTBOX must be in the system command range.
|
|
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
|
|
ASSERT(IDM_ABOUTBOX < 0xF000);
|
|
|
|
CMenu* pSysMenu = GetSystemMenu(FALSE);
|
|
if (pSysMenu != NULL)
|
|
{
|
|
CString strAboutMenu;
|
|
strAboutMenu.LoadString(IDS_ABOUTBOX);
|
|
if (!strAboutMenu.IsEmpty())
|
|
{
|
|
pSysMenu->AppendMenu(MF_SEPARATOR);
|
|
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
|
|
}
|
|
}
|
|
|
|
SetIcon(m_hIcon, TRUE); // Set big icon
|
|
SetIcon(m_hIcon, FALSE); // Set small icon
|
|
|
|
// TODO: Add extra initialization here
|
|
m_fc.SetNotificationWnd(this);
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
}
|
|
|
|
void CFileChangerDemoDlg::OnSysCommand(UINT nID, LPARAM lParam)
|
|
{
|
|
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
|
|
{
|
|
CUTSampleAboutDlg aboutDlg(IDR_MAINFRAME,ID_DESCRIPTION_FILE);
|
|
aboutDlg.DoModal();
|
|
}
|
|
else
|
|
{
|
|
CDialog::OnSysCommand(nID, lParam);
|
|
}
|
|
}
|
|
|
|
// If you add a minimize button to your dialog, you will need the code below
|
|
// to draw the icon. For MFC applications using the document/view model,
|
|
// this is automatically done for you by the framework.
|
|
|
|
void CFileChangerDemoDlg::OnPaint()
|
|
{
|
|
if (IsIconic())
|
|
{
|
|
CPaintDC dc(this); // device context for painting
|
|
|
|
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
|
|
|
|
// Center icon in client rectangle
|
|
int cxIcon = GetSystemMetrics(SM_CXICON);
|
|
int cyIcon = GetSystemMetrics(SM_CYICON);
|
|
CRect rect;
|
|
GetClientRect(&rect);
|
|
int x = (rect.Width() - cxIcon + 1) / 2;
|
|
int y = (rect.Height() - cyIcon + 1) / 2;
|
|
|
|
// Draw the icon
|
|
dc.DrawIcon(x, y, m_hIcon);
|
|
}
|
|
else
|
|
{
|
|
CDialog::OnPaint();
|
|
}
|
|
}
|
|
|
|
HCURSOR CFileChangerDemoDlg::OnQueryDragIcon()
|
|
{
|
|
return (HCURSOR) m_hIcon;
|
|
}
|
|
|
|
void CFileChangerDemoDlg::OnSelectTextBinary()
|
|
{
|
|
UpdateData();
|
|
m_ctlMatchCase.EnableWindow(m_nTextBinary == 0);
|
|
m_ctlWholeWord.EnableWindow(m_nTextBinary == 0);
|
|
if (m_nTextBinary == 1)
|
|
{
|
|
toBinary(m_sFindText);
|
|
toBinary(m_sReplaceText);
|
|
UpdateData(FALSE);
|
|
}
|
|
}
|
|
|
|
void CFileChangerDemoDlg::OnSelectOverwrite()
|
|
{
|
|
UpdateData();
|
|
m_ctlFileOut.EnableWindow(!m_bOverwrite);
|
|
m_ctlBrowseOut.EnableWindow(!m_bOverwrite);
|
|
}
|
|
|
|
void CFileChangerDemoDlg::OnUsecfile()
|
|
{
|
|
UpdateData();
|
|
m_ctlOverwrite.EnableWindow(!m_bUseCFile);
|
|
if (m_bUseCFile)
|
|
{
|
|
m_bOverwrite = FALSE;
|
|
UpdateData(FALSE);
|
|
OnSelectOverwrite();
|
|
}
|
|
}
|
|
|
|
void CFileChangerDemoDlg::OnBrowseIn()
|
|
{
|
|
OnBrowse(m_sFileIn);
|
|
}
|
|
|
|
void CFileChangerDemoDlg::OnBrowseOut()
|
|
{
|
|
OnBrowse(m_sFileOut);
|
|
}
|
|
|
|
void CFileChangerDemoDlg::OnBrowse(CString& sEditBoxText)
|
|
{
|
|
UpdateData();
|
|
CFileDialog dlg(TRUE, NULL, sEditBoxText, OFN_HIDEREADONLY,
|
|
_T("All Files (*.*)|*.*|Text Files (*.txt)|*.txt|HTML Files (*.html; *.htm)|*.html; *.htm||"), this);
|
|
if (dlg.DoModal() == IDOK)
|
|
{
|
|
sEditBoxText = dlg.GetPathName();
|
|
UpdateData(FALSE);
|
|
}
|
|
}
|
|
|
|
void CFileChangerDemoDlg::OnMessage()
|
|
{
|
|
UpdateData();
|
|
}
|
|
|
|
// Demo Codes ---------------------------------------------
|
|
|
|
void CFileChangerDemoDlg::OnFind()
|
|
{
|
|
UINT nResult = 0;
|
|
CFile fIn;
|
|
|
|
UpdateData();
|
|
try
|
|
{
|
|
if (m_bUseCFile)
|
|
{
|
|
fIn.Open(m_sFileIn, CFile::modeRead);
|
|
m_fc.UseFiles(&fIn);
|
|
}
|
|
else
|
|
{
|
|
m_fc.UseFiles(m_sFileIn);
|
|
}
|
|
|
|
if (m_nTextBinary == 0)
|
|
{
|
|
nResult = m_fc.Search(m_sFindText, m_bAll, m_bMatchCase, m_bWholeWord);
|
|
}
|
|
else
|
|
{
|
|
CByteArray binary;
|
|
toBinary(m_sFindText, &binary);
|
|
UpdateData(FALSE); // to display formatted m_sFindText
|
|
nResult = m_fc.Search(binary, m_bAll);
|
|
}
|
|
}
|
|
catch(CException* e)
|
|
{
|
|
fIn.Abort();
|
|
e->ReportError();
|
|
e->Delete();
|
|
}
|
|
|
|
CString sMsg; sMsg.Format(_T("Function return: %d"), nResult);
|
|
AfxMessageBox(sMsg, MB_ICONINFORMATION);
|
|
}
|
|
|
|
void CFileChangerDemoDlg::OnReplace()
|
|
{
|
|
UINT nResult = 0;
|
|
CFile fIn, fOut;
|
|
|
|
UpdateData();
|
|
try
|
|
{
|
|
if (m_bUseCFile)
|
|
{
|
|
fIn.Open(m_sFileIn, CFile::modeRead);
|
|
fOut.Open(m_sFileOut, CFile::modeReadWrite | CFile::modeCreate);
|
|
m_fc.UseFiles(&fIn, &fOut);
|
|
}
|
|
else
|
|
{
|
|
if (m_bOverwrite)
|
|
m_fc.UseFiles(m_sFileIn);
|
|
else
|
|
m_fc.UseFiles(m_sFileIn, m_sFileOut);
|
|
}
|
|
|
|
if (m_nTextBinary == 0)
|
|
{
|
|
nResult = m_fc.Replace(m_sFindText, m_sReplaceText,
|
|
m_bAll, m_bMatchCase, m_bWholeWord);
|
|
}
|
|
else
|
|
{
|
|
CByteArray binary, replaceBinary;
|
|
toBinary(m_sFindText, &binary);
|
|
toBinary(m_sReplaceText, &replaceBinary);
|
|
UpdateData(FALSE);
|
|
nResult = m_fc.Replace(binary, replaceBinary, m_bAll);
|
|
}
|
|
}
|
|
catch(CException* e)
|
|
{
|
|
fIn.Abort();
|
|
fOut.Abort();
|
|
e->ReportError();
|
|
e->Delete();
|
|
}
|
|
|
|
CString sMsg; sMsg.Format(_T("Function return: %d"), nResult);
|
|
AfxMessageBox(sMsg, MB_ICONINFORMATION);
|
|
}
|
|
|
|
void CFileChangerDemoDlg::toBinary(CString& sText, CByteArray* binary /* = NULL */, BOOL bFormat /* = TRUE */)
|
|
{
|
|
TCHAR ch; CString sByte, sFormatted; int n = 0, i, nLen;
|
|
|
|
nLen = sText.GetLength();
|
|
for (i = 0; i < nLen; i++)
|
|
{
|
|
ch = sText[i];
|
|
if (_istxdigit(ch)) { sByte += ch; n++;}
|
|
if (n == 2 || (n > 0 && (ch == _T(' ') || i == nLen - 1)))
|
|
{
|
|
sByte.MakeUpper();
|
|
if (n == 1) sFormatted += _T('0');
|
|
sFormatted += sByte + _T(' ');
|
|
n = 0; sByte.Empty();
|
|
}
|
|
}
|
|
|
|
if (binary)
|
|
{
|
|
nLen = sFormatted.GetLength();
|
|
if (binary->GetSize()) binary->RemoveAll();
|
|
binary->SetSize(nLen / 3);
|
|
for (i = 0, n = 0; n < nLen; i++, n+=3)
|
|
binary->SetAt(i, (BYTE)(xch2int(sFormatted[n]) * 0x10 +
|
|
xch2int(sFormatted[n+1])));
|
|
}
|
|
|
|
if (bFormat)
|
|
sText = sFormatted;
|
|
}
|
|
|
|
int CFileChangerDemoDlg::xch2int(TCHAR ch)
|
|
{
|
|
switch (ch)
|
|
{
|
|
case _T('0'): return 0;
|
|
case _T('1'): return 1;
|
|
case _T('2'): return 2;
|
|
case _T('3'): return 3;
|
|
case _T('4'): return 4;
|
|
case _T('5'): return 5;
|
|
case _T('6'): return 6;
|
|
case _T('7'): return 7;
|
|
case _T('8'): return 8;
|
|
case _T('9'): return 9;
|
|
case _T('a'): case _T('A'): return 10;
|
|
case _T('b'): case _T('B'): return 11;
|
|
case _T('c'): case _T('C'): return 12;
|
|
case _T('d'): case _T('D'): return 13;
|
|
case _T('e'): case _T('E'): return 14;
|
|
case _T('f'): case _T('F'): return 15;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
// CMyFileChanger : derived from COXFileChanger -----------
|
|
|
|
LRESULT CFileChangerDemoDlg::OnFileMatchFound(WPARAM wParam, LPARAM /* lParam */)
|
|
{
|
|
COXFileChanger::COXFileChangerData* pFileChangerData = (COXFileChanger::COXFileChangerData*)wParam;
|
|
ASSERT(AfxIsValidAddress(pFileChangerData, sizeof(COXFileChanger::COXFileChangerData)));
|
|
|
|
if (m_bMessage)
|
|
{
|
|
CString sMsg;
|
|
sMsg.Format(_T("%s [%d]\r\n\r\nCount?"), pFileChangerData->m_pFile->GetFileName(),
|
|
pFileChangerData->m_nPos);
|
|
|
|
switch(AfxMessageBox(sMsg, MB_YESNOCANCEL | MB_ICONQUESTION))
|
|
{
|
|
case IDCANCEL: pFileChangerData->m_bContinue = FALSE;
|
|
case IDNO: return FALSE;
|
|
}
|
|
}
|
|
return (LRESULT)TRUE;
|
|
}
|
|
|
|
LRESULT CFileChangerDemoDlg::OnFilePreReplace(WPARAM wParam, LPARAM /* lParam */)
|
|
{
|
|
COXFileChanger::COXFileChangerData* pFileChangerData = (COXFileChanger::COXFileChangerData*)wParam;
|
|
ASSERT(AfxIsValidAddress(pFileChangerData, sizeof(COXFileChanger::COXFileChangerData)));
|
|
|
|
if (m_bMessage)
|
|
{
|
|
CString sMsg;
|
|
sMsg.Format(_T("%s [%d]\r\n\r\nReplace?"), pFileChangerData->m_pFile->GetFileName(),
|
|
pFileChangerData->m_nPos);
|
|
|
|
switch(AfxMessageBox(sMsg, MB_YESNOCANCEL | MB_ICONQUESTION))
|
|
{
|
|
case IDCANCEL: pFileChangerData->m_bContinue = FALSE;
|
|
case IDNO: return FALSE;
|
|
}
|
|
}
|
|
return (LRESULT)TRUE;
|
|
}
|
|
|
|
LRESULT CFileChangerDemoDlg::OnFilePostReplace(WPARAM wParam, LPARAM /* lParam */)
|
|
{
|
|
COXFileChanger::COXFileChangerData* pFileChangerData = (COXFileChanger::COXFileChangerData*)wParam;
|
|
ASSERT(AfxIsValidAddress(pFileChangerData, sizeof(COXFileChanger::COXFileChangerData)));
|
|
|
|
if (m_bMessage)
|
|
{
|
|
CString sMsg;
|
|
sMsg.Format(_T("%s [%d]"), pFileChangerData->m_pFile->GetFileName(), pFileChangerData->m_nPos);
|
|
AfxMessageBox(sMsg, MB_ICONINFORMATION);
|
|
}
|
|
|
|
// ... Return value is not used
|
|
return (LRESULT)0;
|
|
}
|