2025-11-27 16:46:48 +09:00

193 lines
4.4 KiB
C++

// FindDialog.cpp : implementation file
//
#include "stdafx.h"
#include "RegExpression.h"
#include "FindDialog.h"
#include "MainFrm.h"
#include "OXRegExpression.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CFindDialog dialog
CFindDialog::CFindDialog(CWnd* pParent /*=NULL*/)
: CDialog(CFindDialog::IDD, pParent)
{
//{{AFX_DATA_INIT(CFindDialog)
m_bFocus = FALSE;
//}}AFX_DATA_INIT
m_cmbHistory.SetAutoPersistent(AfxGetAppName());
}
void CFindDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFindDialog)
DDX_Control(pDX, IDC_LIST_RESULT, m_lstResult);
DDX_Control(pDX, IDC_COMBO_HISTORY, m_cmbHistory);
DDX_Check(pDX, IDC_CHECK_FOCUS, m_bFocus);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CFindDialog, CDialog)
//{{AFX_MSG_MAP(CFindDialog)
ON_WM_CLOSE()
ON_BN_CLICKED(ID_FIND_BUTTON, OnFindButton)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_RESULT, OnItemchangedListResult)
ON_NOTIFY(NM_CLICK, IDC_LIST_RESULT, OnClickListResult)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_KICKIDLE, OnKickIdle)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFindDialog message handlers
BOOL CFindDialog::OnInitDialog()
{
CDialog::OnInitDialog();
ModifyStyleEx(0,WS_EX_TOPMOST);
ASSERT(::IsWindow(m_lstResult.m_hWnd));
RECT rct;
m_lstResult.GetClientRect(&rct);
m_lstResult.InsertColumn(0,_T("Found"),LVCFMT_LEFT,
rct.right-rct.left-80);
m_lstResult.InsertColumn(1,_T("Start"),LVCFMT_LEFT,
40);
m_lstResult.InsertColumn(2,_T("Length"),LVCFMT_LEFT,
40);
m_lstResult.SetExtendedStyle(m_lstResult.GetExtendedStyle()
| LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
m_reg.m_pParent=this;
m_cmbHistory.RestoreContents(AfxGetAppName());
if (!m_cmbHistory.GetCount())
{
m_cmbHistory.AddNewItem(_T("(re).*\\0s+ion"));
m_cmbHistory.AddNewItem(_T("^C.{0,}s{2}"));
m_cmbHistory.AddNewItem(_T("al\\b"));
m_cmbHistory.SetWindowText(_T("(re).*\\0s+ion"));
}
m_cmbHistory.SetFocus();
CMainFrame* pFrame;
pFrame=(CMainFrame*) AfxGetMainWnd();
ASSERT(pFrame);
m_pView=(CEditView*) pFrame->GetActiveView();
ASSERT(m_pView);
return FALSE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CFindDialog::OnOK()
{
UpdateData(TRUE);
if (m_cmbHistory.GetWindowTextLength())
m_cmbHistory.AddNewItem();
CDialog::OnOK();
}
LRESULT CFindDialog::OnKickIdle(WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
UNUSED(wParam);
ASSERT(wParam == MSGF_DIALOGBOX);
BOOL bContinueIdle = TRUE;
// Update the edit list
m_cmbHistory.OnIdle();
return bContinueIdle;
}
void CFindDialog::OnClose()
{
CDialog::OnClose();
}
void CFindDialog::OnFindButton()
{
TCHAR szBuffer[_MAX_PATH];
m_nStartSearch=0;
SetWindowText(_T("0 items found"));
CString sText;
m_lstResult.DeleteAllItems();
m_pView->GetWindowText(sText);
if (sText.IsEmpty())
return;
CString sRule;
m_cmbHistory.GetWindowText(sRule);
if (!m_reg.LoadRule(sRule))
{
CString sError;
m_reg.TranslateError(m_reg.GetError(),sError);
AfxMessageBox(sError);
return;
}
int nEnd;
m_pView->GetEditCtrl().GetSel(m_nStartSearch, nEnd);
sText=sText.Right(sText.GetLength()-m_nStartSearch);
m_reg.Match(sText);
if (!m_lstResult.GetItemCount() && m_nStartSearch)
wsprintf(szBuffer, _T("%d items found - start search from the begining"),m_lstResult.GetItemCount());
else
wsprintf(szBuffer, _T("%d items found"),m_lstResult.GetItemCount());
SetWindowText(szBuffer);
UpdateData(TRUE);
if (m_bFocus)
m_pView->SetFocus();
}
void CFindDialog::OnItemchangedListResult(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
if (pNMListView->uNewState & LVIS_FOCUSED)
{
int nStart, nLength;
CString sText=m_lstResult.GetItemText(pNMListView->iItem,1);
nStart=_ttoi((LPCTSTR) sText);
sText=m_lstResult.GetItemText(pNMListView->iItem,2);
nLength=_ttoi((LPCTSTR) sText);
m_pView->GetEditCtrl().SetSel(nStart, nStart+nLength);
UpdateData(TRUE);
if (m_bFocus)
m_pView->SetFocus();
}
*pResult = 0;
}
void CFindDialog::OnClickListResult(NMHDR* pNMHDR, LRESULT* pResult)
{
UNREFERENCED_PARAMETER(pNMHDR);
UpdateData(TRUE);
if (m_bFocus)
m_pView->SetFocus();
*pResult = 0;
}