DragonNest/Third/XTToolkitPro/Samples/Utilities/Grep/SearchOptions.cpp
2024-12-19 09:48:26 +08:00

416 lines
11 KiB
C++

// SearchOptions.cpp : implementation file
//
// This file is a part of the XTREME TOOLKIT PRO MFC class library.
// (c)1998-2008 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Grep.h"
#include "SearchOptions.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
void CSearchBrowseButton::Initialize(CComboBox* pParentWnd, DWORD dwBStyle, UINT nMenu, int nSubMenuIndx)
{
m_nMenu = nMenu;
m_nSubMenuIndx = nSubMenuIndx;
m_dwBStyle = dwBStyle;
m_pComboBox = pParentWnd;
}
void CSearchBrowseButton::OnClicked()
{
static BOOL m_bExecute = FALSE;
if (m_bExecute)
return;
m_bExecute = TRUE;
if (m_dwBStyle == BES_XT_CHOOSEDIR)
{
CString strPath;
m_pComboBox->GetWindowText(strPath);
// Instantiate a browse for folder dialog object
CXTBrowseDialog browseDlg;
browseDlg.SetOwner(GetParent()->GetSafeHwnd());
browseDlg.SetSelPath((TCHAR*)(LPCTSTR)strPath);
if( browseDlg.DoModal() == IDOK ) {
m_pComboBox->SetWindowText( browseDlg.GetSelPath() );
m_pComboBox->GetParent()->SendMessage(WM_COMMAND,
(WPARAM)MAKELONG(::GetDlgCtrlID(m_pComboBox->GetSafeHwnd()), CBN_EDITCHANGE),
(LPARAM)m_pComboBox->GetSafeHwnd());
}
m_bExecute = FALSE;
return;
}
SetState(TRUE);
CRect rect;
GetWindowRect(&rect);
// loading a user resource.
CMenu menu;
menu.LoadMenu(m_nMenu);
CMenu* pPopup = menu.GetSubMenu(m_nSubMenuIndx);
ASSERT(pPopup != NULL);
CWnd* pWndPopupOwner = this;
while (pWndPopupOwner->GetStyle() & WS_CHILD)
pWndPopupOwner = pWndPopupOwner->GetParent();
int nCmd = XTFuncContextMenu(pPopup, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL |TPM_RETURNCMD,
rect.right, rect.top, pWndPopupOwner, 0 );
if (nCmd > 0)
{
CString str;
str.LoadString(nCmd);
CString strPrev;
m_pComboBox->GetWindowText(strPrev);
m_pComboBox->SetWindowText(strPrev + str);
m_pComboBox->GetParent()->SendMessage(WM_COMMAND,
(WPARAM)MAKELONG(::GetDlgCtrlID(m_pComboBox->GetSafeHwnd()), CBN_EDITCHANGE),
(LPARAM)m_pComboBox->GetSafeHwnd());
}
// Return the button state to normal.
SetState(FALSE);
m_bExecute = FALSE;
};
/////////////////////////////////////////////////////////////////////////////
// CSearchOptionsView
IMPLEMENT_DYNCREATE(CSearchOptionsView, CXTResizeFormView)
CSearchOptions::CSearchOptions()
{
m_bIncludeSubFolders = TRUE;
m_bRegularExpressions = TRUE;
m_bMatchCase = FALSE;
m_bMatchWholeWords = FALSE;
m_bFindInHiddenFiles = FALSE;
m_strFind = _T("");
m_strReplace = _T("");
m_strPath = _T("");
m_strFileTypes = _T("*.*");
pRegExp = 0;
}
void ExchangeList(CXTPPropExchange* pPX, LPCTSTR pszPropName, CStringList& lst)
{
CXTPPropExchangeSection secItems(pPX->GetSection(pszPropName));
CString str, strSection;
if (pPX->IsStoring())
{
DWORD dwCount = (DWORD)lst.GetCount();
secItems->WriteCount(dwCount);
POSITION pos = lst.GetHeadPosition();
int i = 0;
while (pos)
{
str = lst.GetNext(pos);
strSection.Format(_T("Item%i"), i++);
PX_String(&secItems, strSection, str, _T(""));
}
}
else
{
DWORD nNewCount = secItems->ReadCount();
for (DWORD i = 0; i < nNewCount; i++)
{
strSection.Format(_T("Item%i"), i);
PX_String(&secItems, strSection, str, _T(""));
lst.AddTail(str);
}
}
}
void CSearchOptions::DoPropExchange(CXTPPropExchange* pPX)
{
pPX->ExchangeSchema();
PX_Bool(pPX, _T("MatchCase"), m_bMatchCase, FALSE);
PX_Bool(pPX, _T("MatchWholeWords"), m_bMatchWholeWords, FALSE);
PX_Bool(pPX, _T("RegularExpressions"), m_bRegularExpressions, TRUE);
PX_Bool(pPX, _T("IncludeSubFolders"), m_bIncludeSubFolders, TRUE);
PX_Bool(pPX, _T("FindInHiddenFiles"), m_bFindInHiddenFiles, TRUE);
PX_String(pPX, _T("FindString"), m_strFind, _T(""));
PX_String(pPX, _T("ReplaceString"), m_strReplace, _T(""));
PX_String(pPX, _T("Path"), m_strPath, _T(""));
PX_String(pPX, _T("FileTypes"), m_strFileTypes, _T("*.*"));
ExchangeList(pPX, _T("FileTypesHistory"),m_lstFileTypesHistory);
ExchangeList(pPX, _T("ReplaceHistory"),m_lstReplaceHistory);
ExchangeList(pPX, _T("FindHistory"),m_lstFindHistory);
ExchangeList(pPX, _T("PathHistory"),m_lstPathHistory);
}
CSearchOptions* GetSearchOptions()
{
static CSearchOptions options;
return &options;
}
CSearchOptionsView::CSearchOptionsView()
: CXTResizeFormView(CSearchOptionsView::IDD)
{
//{{AFX_DATA_INIT(CSearchOptionsView)
//}}AFX_DATA_INIT
m_bSearchMode = FALSE;
m_bInitialized = FALSE;
}
CSearchOptionsView::~CSearchOptionsView()
{
}
void CSearchOptionsView::DoDataExchange(CDataExchange* pDX)
{
CXTResizeFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSearchOptionsView)
DDX_Control(pDX, IDC_COMBO_REPLACE, m_cmbReplace);
DDX_Control(pDX, IDC_COMBO_PATH, m_cmbPath);
DDX_Control(pDX, IDC_COMBO_FIND, m_cmbFind);
DDX_Control(pDX, IDC_COMBO_TYPE, m_cmbFileTypes);
DDX_Control(pDX, IDC_BUTTON_REPLACE_EXPAND, m_btnReplaceExpand);
DDX_Control(pDX, IDC_BUTTON_FIND_EXPAND, m_btnFindExpand);
DDX_Control(pDX, IDC_BUTTON_PATH_EXPAND, m_btnPathExpand);
DDX_Control(pDX, IDC_GROUP_FINDOPTIONS, m_wndGroupFindOptions);
//}}AFX_DATA_MAP
DDX_CBString(pDX, IDC_COMBO_FIND, GetSearchOptions()->m_strFind);
DDX_CBString(pDX, IDC_COMBO_REPLACE, GetSearchOptions()->m_strReplace);
DDX_CBString(pDX, IDC_COMBO_PATH, GetSearchOptions()->m_strPath);
DDX_Check(pDX, IDC_CHECK_INCLUDE_SUBFOLDERS, GetSearchOptions()->m_bIncludeSubFolders);
DDX_Check(pDX, IDC_CHECK_REGULAR, GetSearchOptions()->m_bRegularExpressions);
DDX_Check(pDX, IDC_CHECK_MATCH_CASE, GetSearchOptions()->m_bMatchCase);
DDX_Check(pDX, IDC_CHECK_HIDDEN, GetSearchOptions()->m_bFindInHiddenFiles);
DDX_Check(pDX, IDC_CHECK_MATCH_WHOLE_WORDS, GetSearchOptions()->m_bMatchWholeWords);
DDX_CBString(pDX, IDC_COMBO_TYPE, GetSearchOptions()->m_strFileTypes);
}
BEGIN_MESSAGE_MAP(CSearchOptionsView, CXTResizeFormView)
//{{AFX_MSG_MAP(CSearchOptionsView)
ON_BN_CLICKED(IDC_BUTTON_FINDALL, OnButtonFindAll)
ON_BN_CLICKED(IDC_BUTTON_REPLACEALL, OnButtonReplaceAll)
ON_CBN_EDITCHANGE(IDC_COMBO_FIND, UpdateOptions)
ON_CBN_EDITCHANGE(IDC_COMBO_PATH, UpdateOptions)
ON_CBN_EDITCHANGE(IDC_COMBO_REPLACE, UpdateOptions)
ON_BN_CLICKED(IDC_CHECK_REGULAR, UpdateOptions)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSearchOptionsView diagnostics
#ifdef _DEBUG
void CSearchOptionsView::AssertValid() const
{
CXTResizeFormView::AssertValid();
}
void CSearchOptionsView::Dump(CDumpContext& dc) const
{
CXTResizeFormView::Dump(dc);
}
#endif //_DEBUG
void RestoryCombo(CComboBox& cmb, CStringList& lstHistory, LPCTSTR lpszDefault = 0)
{
if (lstHistory.GetCount() > 0)
{
POSITION pos = lstHistory.GetHeadPosition();
while (pos)
{
cmb.AddString(lstHistory.GetNext(pos));
}
}
else if (lpszDefault)
{
cmb.AddString(lpszDefault);
lstHistory.AddTail(lpszDefault);
}
}
/////////////////////////////////////////////////////////////////////////////
// CSearchOptionsView message handlers
void CSearchOptionsView::OnInitialUpdate()
{
CXTResizeFormView::OnInitialUpdate();
SetScaleToFitSize(CSize(90, 1));
if (m_bInitialized)
return;
SetResize(IDC_STATIC_FIND, SZ_TOP_LEFT, SZ_TOP_RIGHT);
SetResize(IDC_COMBO_FIND, SZ_TOP_LEFT, SZ_TOP_RIGHT);
SetResize(IDC_BUTTON_FIND_EXPAND, SZ_TOP_RIGHT, SZ_TOP_RIGHT);
SetResize(IDC_STATIC_REPLACE, SZ_TOP_LEFT, SZ_TOP_RIGHT);
SetResize(IDC_COMBO_REPLACE, SZ_TOP_LEFT, SZ_TOP_RIGHT);
SetResize(IDC_BUTTON_REPLACE_EXPAND, SZ_TOP_RIGHT, SZ_TOP_RIGHT);
SetResize(IDC_STATIC_PATH, SZ_TOP_LEFT, SZ_TOP_RIGHT);
SetResize(IDC_COMBO_PATH, SZ_TOP_LEFT, SZ_TOP_RIGHT);
SetResize(IDC_BUTTON_PATH_EXPAND, SZ_TOP_RIGHT, SZ_TOP_RIGHT);
SetResize(IDC_COMBO_TYPE, SZ_TOP_LEFT, SZ_TOP_RIGHT);
SetResize(IDC_GROUP_FINDOPTIONS, SZ_TOP_LEFT, SZ_TOP_RIGHT);
SetResize(IDC_BUTTON_FINDALL, SZ_TOP_RIGHT, SZ_TOP_RIGHT);
SetResize(IDC_BUTTON_REPLACEALL, SZ_TOP_RIGHT, SZ_TOP_RIGHT);
SetResize(IDC_CHECK_INCLUDE_SUBFOLDERS, SZ_TOP_LEFT, SZ_TOP_RIGHT);
SetResize(IDC_CHECK_MATCH_CASE, SZ_TOP_LEFT, SZ_TOP_RIGHT);
SetResize(IDC_CHECK_MATCH_WHOLE_WORDS, SZ_TOP_LEFT, SZ_TOP_RIGHT);
SetResize(IDC_CHECK_HIDDEN, SZ_TOP_LEFT, SZ_TOP_RIGHT);
SetResize(IDC_CHECK_REGULAR, SZ_TOP_LEFT, SZ_TOP_RIGHT);
SetResize(IDC_STATIC_LOOK, SZ_TOP_LEFT, SZ_TOP_RIGHT);
m_bInitialized = TRUE;
m_btnFindExpand.SetBrowseStyle(BES_XT_POPUPMENU);
m_btnFindExpand.Initialize(&m_cmbFind, BES_XT_POPUPMENU, IDR_SEARCH_POPUP, 0);
m_btnReplaceExpand.SetBrowseStyle(BES_XT_POPUPMENU);
m_btnReplaceExpand.Initialize(&m_cmbReplace, BES_XT_POPUPMENU, IDR_SEARCH_POPUP, 1);
m_btnPathExpand.Initialize(&m_cmbPath, BES_XT_CHOOSEDIR);
UpdateOptions();
IRegExpPtr regExp;
HRESULT hr = regExp.CreateInstance(__uuidof(RegExp));
if (FAILED(hr))
{
GetDlgItem(IDC_CHECK_REGULAR)->EnableWindow(FALSE);
GetSearchOptions()->m_bRegularExpressions = FALSE;
UpdateData(FALSE);
}
RestoryCombo(m_cmbFileTypes, GetSearchOptions()->m_lstFileTypesHistory, _T("*.cpp;*.h"));
RestoryCombo(m_cmbFind, GetSearchOptions()->m_lstFindHistory);
RestoryCombo(m_cmbReplace, GetSearchOptions()->m_lstReplaceHistory);
RestoryCombo(m_cmbPath, GetSearchOptions()->m_lstPathHistory);
}
BOOL CSearchOptionsView::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style |= WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
return CXTResizeFormView::PreCreateWindow(cs);
}
void CSearchOptionsView::OnButtonFindAll()
{
UpdateData();
if (m_bSearchMode)
{
((CMainFrame*)AfxGetMainWnd())->OnCancelFind();
}
else
{
((CMainFrame*)AfxGetMainWnd())->OnFindAll();
}
}
BOOL CSearchOptionsView::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN || pMsg->message == WM_SYSKEYDOWN)
{
if ((::GetFocus() == m_hWnd) || (::GetParent(::GetFocus()) == m_hWnd) || (::GetParent(::GetParent(::GetFocus())) == m_hWnd))
{
if (IsDialogMessage(pMsg))
return TRUE;
}
}
return CXTResizeFormView::PreTranslateMessage(pMsg);
}
void CSearchOptionsView::UpdateOptions()
{
UpdateData();
CSearchOptions* pOptions = GetSearchOptions();
GetDlgItem(IDC_BUTTON_FINDALL)->EnableWindow(!pOptions->m_strFind.IsEmpty() && !pOptions->m_strPath.IsEmpty());
GetDlgItem(IDC_BUTTON_REPLACEALL)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_FIND_EXPAND)->EnableWindow(pOptions->m_bRegularExpressions);
GetDlgItem(IDC_BUTTON_REPLACE_EXPAND)->EnableWindow(pOptions->m_bRegularExpressions);
}
void CSearchOptionsView::SetSearchMode(BOOL bSearchMode)
{
CWnd* pWnd = GetWindow(GW_CHILD);
while (pWnd)
{
pWnd->EnableWindow(!bSearchMode);
pWnd = pWnd->GetWindow(GW_HWNDNEXT);
}
GetDlgItem(IDC_BUTTON_FINDALL)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON_FINDALL)->SetWindowText(bSearchMode ? _T("Cancel") : _T("&Find All"));
if (!bSearchMode)
{
UpdateOptions();
}
RedrawWindow(0, 0, RDW_ALLCHILDREN|RDW_INVALIDATE|RDW_UPDATENOW);
m_bSearchMode = bSearchMode;
}
void CSearchOptionsView::OnButtonReplaceAll()
{
((CMainFrame*)AfxGetMainWnd())->OnReplaceAll();
}