// 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(); }