Files
envi-code/SourceCode/Code2026/tg_shs/shs_annotate/FindAndReplaceDlg.cpp
T
2026-09-28 15:28:50 +08:00

2329 lines
58 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// FindAndReplaceDlg.cpp : implementation file
//
#include "stdafx.h"
#include "WGroupCtrl.h"
#include "WGroupDlg.h"
#include "FindAndReplaceDlg.h"
#include "actrans.h"
#include <fstream>
#include <acutil.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static CFindAndReplaceDlg *pDlg = NULL;
// Zyu delete on 101019,代码封装到CFARInsert类中
//int GetAttribNum(AcDbBlockReference &entInsert)
//{
// int num=0;
// AcDbObjectIterator *pIter=entInsert.attributeIterator();
// for(pIter->start(); !pIter->done(); pIter->step()) {
// num++;
// }
// delete pIter;
// return num;
//}
//
//BOOL GetAttribText(AcDbBlockReference &entInsert, int idx, TDbText &text, AcDbObjectId &idObjRet)
//{
// AcDbObjectIterator *pIter=entInsert.attributeIterator();
// int num=0;
// BOOL bRet=FALSE;
// for(pIter->start(); !pIter->done(); pIter->step()) {
// if(num==idx) {
// AcDbObjectId idObj=pIter->objectId();
// OPENOBJ_BEGIN(idObj, AcDb::kForRead, AcDbAttribute, pAttr);
// if(pAttr && !pAttr->isInvisible()) {
// if(text.ConvertFrom(pAttr)) {
// idObjRet=idObj;
// bRet=TRUE;
// }
// }
// OPENOBJ_END();
// break;
// }
// num++;
// }
// delete pIter;
// return bRet;
//}
// Zyu add on 100927,查找对象文本的几个函数
// Begin
//// 搜索上华对象内的文字
//TTextPosition FindInTDbEnt(AcDbEntity *pEnt, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange)
//{
// TDbEntity *pText = TDbEntity::cast(pEnt);
// return pText->FindSubText(sSubText, posStart, pRange);
//}
//
//TTextPosition FindInInsert(AcDbEntity *pEnt, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange)
//{
// TTextPosition posFind;
// XPushMemVar<BOOL> vTemp(g_bTextStyleEx, FALSE);
// AcDbBlockReference *pInsert=AcDbBlockReference::cast(pEnt);
// int nLen=GetAttribNum(*pInsert);
// //int nCode=RTNONE;
// TTextPosition posNext=posStart;
// for(int i=posStart.m_nCookies; i<nLen; i++)
// {
// TDbText dimText;
// TTextPosition posRet;
// posNext.m_nCookies=i;
// AcDbObjectId idObj;
// if(GetAttribText(*pInsert, i, dimText, idObj))
// {
// posRet=dimText.FindSubText(sSubText, posNext, pRange);
// }
// if(!posRet)
// {
// posNext.m_nTextPos=0;
// }
// else
// {
// posStart=posNext;
// if(!posStart && posStart.m_nCookies<(unsigned int)(nLen-1))
// {
// posStart.m_nCookies++;
// posStart.m_nTextPos=0;
// }
// posRet.m_nCookies=i;
// posFind = posRet;
// break;
// }
// }
// return posFind;
//}
//
//TTextPosition FindInText(AcDbEntity *pEnt, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange)
//{
// TTextPosition posFind;
// XPushMemVar<BOOL> vTemp(g_bTextStyleEx, FALSE);
// TDbText text;
// AcDbText *pText = AcDbText::cast(pEnt);
// if(text.ConvertFrom(pText))
// {
// posFind = text.FindSubText(sSubText, posStart, pRange);
// }
// return posFind;
//}
//
//TTextPosition FindInMText(AcDbEntity *pEnt, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange)
//{
// TTextPosition posFind;
// XPushMemVar<BOOL> vTemp(g_bTextStyleEx, FALSE);
// AcDbVoidPtrArray arEnts;
// if (Acad::eOk == pEnt->explode(arEnts))
// {
// for (int i = posStart.m_nCookies; i < arEnts.length(); i++)
// {
// posFind = FindInText((AcDbEntity*)arEnts.at(i), sSubText, posStart, pRange);
// if (!!posFind)
// {
// break;
// }
// else
// {
// posStart.m_nTextPos = -1;
// }
// }
// ReleaseEntSet(arEnts);
// }
// return posFind;
//}
//
//TTextPosition FindInDimension(AcDbEntity *pEnt, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange)
//{
// TTextPosition posFind;
// AcDbDimension *pDim = AcDbDimension::cast(pEnt);
// if (NULL != pDim)
// {
// AcDbVoidPtrArray arEnts;
// if (Acad::eOk == pDim->explode(arEnts))
// {
// for(int i = 0; i < arEnts.length(); i++)
// {
// AcDbEntity *pEntity = (AcDbEntity*)arEnts.at(i);
// AcDbMText *pText = AcDbMText::cast(pEntity);
// if (NULL != pText)
// {
// posFind = FindInMText(pText, sSubText, posStart, pRange);
// }
// }
// ReleaseEntSet(arEnts);
// }
// }
// return posFind;
//}
//// End
// Zyu delete on 101019,代码移植到CFARUtil类中
/*
TTextPosition FindEntText(Entity ent, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange)
{
TTextPosition posFind;
if(!sSubText || !sSubText[0])
return posFind;
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt);
if(pEnt->isKindOf(TDbEntity::desc())) {
TDbEntity *pText=TDbEntity::cast(pEnt);
posFind=pText->FindSubText(sSubText, posStart, pRange);
} else if(pEnt->isKindOf(AcDbText::desc())) {
XPushMemVar<BOOL> vTemp(g_bTextStyleEx, FALSE);
TDbText text;
AcDbText *pText=AcDbText::cast(pEnt);
if(text.ConvertFrom(pText)) {
posFind = text.FindSubText(sSubText, posStart, pRange);
}
} else if(pEnt->isA()==AcDbBlockReference::desc()) {
XPushMemVar<BOOL> vTemp(g_bTextStyleEx, FALSE);
AcDbBlockReference *pInsert=AcDbBlockReference::cast(pEnt);
int nLen=GetAttribNum(*pInsert);
//int nCode=RTNONE;
TTextPosition posNext=posStart;
for(int i=posStart.m_nCookies; i<nLen; i++) {
TDbText dimText;
TTextPosition posRet;
posNext.m_nCookies=i;
AcDbObjectId idObj;
if(GetAttribText(*pInsert, i, dimText, idObj)) {
posRet=dimText.FindSubText(sSubText, posNext, pRange);
}
if(!posRet) {
posNext.m_nTextPos=0;
} else {
posStart=posNext;
if(!posStart && posStart.m_nCookies<(unsigned int)(nLen-1)) {
posStart.m_nCookies++;
posStart.m_nTextPos=0;
}
posRet.m_nCookies=i;
posFind = posRet;
break;
}
}
}
OPENOBJ_END();
return posFind;
}
// 返回下次查找的位置
TTextPosition ReplaceEntText(Entity ent, TTextPosition posFind, const TCHAR *szRepText)
{
TTextPosition posStart;
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt);
if(pEnt->isKindOf(TDbEntity::desc())) {
TDbEntity *pText=TDbEntity::cast(pEnt);
if(pText->upgradeOpen()==Acad::eOk) {
posStart = pText->ReplaceSubText(posFind, szRepText);
pText->downgradeOpen();
} else {
adsout << _T("\n无法修改文字对象!");
}
} else if(pEnt->isKindOf(AcDbText::desc())) {
XPushMemVar<BOOL> vTemp(g_bTextStyleEx, FALSE);
TDbText text;
AcDbText *pText=AcDbText::cast(pEnt);
if(text.ConvertFrom(pText)) {
posStart = text.ReplaceSubText(posFind, szRepText);
if(pText->upgradeOpen()==Acad::eOk) {
pText->setTextString((const TCHAR *)text.GetText());
pText->downgradeOpen();
} else {
adsout << _T("\n无法修改文字对象!");
}
}
} else if(pEnt->isA()==AcDbBlockReference::desc()) {
XPushMemVar<BOOL> vTemp(g_bTextStyleEx, FALSE);
AcDbBlockReference *pInsert=AcDbBlockReference::cast(pEnt);
int numAttrib=GetAttribNum(*pInsert);;
posStart.m_nBufLen=_tcslen(szRepText);
posStart.m_nCookies=posFind.m_nCookies;
if(!posFind || posFind.m_nCookies>=(unsigned int)numAttrib) {
;
} else {
TDbText dimText;
TTextPosition posRet;
AcDbObjectId idObj;
if(GetAttribText(*pInsert, posFind.m_nCookies, dimText, idObj)) {
posRet=dimText.ReplaceSubText(posFind, szRepText);
OPENOBJ_BEGIN(idObj, AcDb::kForWrite, AcDbAttribute, pText);
if(pText) {
pText->setTextString(dimText.GetText());
}
OPENOBJ_END();
}
if(!posRet) {
if(posRet.m_nCookies<(unsigned int)(numAttrib-1)) {
posRet.m_nCookies=posFind.m_nCookies+1;
posRet.m_nTextPos=0;
}
}
posStart=posRet;
}
}
OPENOBJ_END();
return posStart;
}
*/
//////////////////////////////////////////////////////////////////////////
// Zyu add on 100925,关联XML和表格的类
CTextTypeFileReader::CTextTypeFileReader()
{
::CoInitialize(NULL);
m_pLstCtrl = NULL;
m_sFilePath = _T("");
m_pDoc = NULL;
}
CTextTypeFileReader::~CTextTypeFileReader()
{
::CoUninitialize();
m_pLstCtrl = NULL;
m_pDoc = NULL;
}
// 设置xml文件位置
void CTextTypeFileReader::SetFilePath(LPCTSTR pszFilePath)
{
m_sFilePath = pszFilePath;
}
// 设置xml文件关联的列表控件
void CTextTypeFileReader::SetListCtrl(CListCtrl *pCmbCtrl)
{
m_pLstCtrl = pCmbCtrl;
}
// 初始化
bool CTextTypeFileReader::Init()
{
HRESULT hr = m_pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60));
return SUCCEEDED(hr);
}
// 保存列表控件内容到xml文件
bool CTextTypeFileReader::SaveToXML()
{
if (NULL == m_pDoc || NULL == m_pLstCtrl)
{
return false;
}
// 读取文件
if(m_pDoc->load((LPCTSTR)m_sFilePath) != VARIANT_TRUE)
{
return false;
}
// 得到settings一级
MSXML2::IXMLDOMElementPtr pRoot = m_pDoc->GetdocumentElement();
if (NULL == pRoot)
{
return false;
}
MSXML2::IXMLDOMNodeListPtr pNodeList = pRoot->GetchildNodes();
if (NULL == pNodeList)
{
return false;
}
pNodeList->reset();
for (int i = 0; i < pNodeList->Getlength(); i++)
{
// 得到content一级
MSXML2::IXMLDOMNodePtr pNode = pNodeList->nextNode();
if (NULL != pNode)
{
CString sName;
BOOL bSelected = false;
// 得到content里的属性
MSXML2::IXMLDOMNamedNodeMapPtr pNodeMap = pNode->Getattributes();
if (NULL != pNodeMap)
{
MSXML2::IXMLDOMNodePtr pNameAttr = pNodeMap->getNamedItem(_bstr_t(_T("name")));
if (NULL != pNameAttr)
{
_variant_t var = pNameAttr->GetnodeValue();
sName = (LPCTSTR)_bstr_t(var.bstrVal);
MSXML2::IXMLDOMNodePtr pSeletedAttr = pNodeMap->getNamedItem(_bstr_t(_T("selected")));
// 如果名称相同,更新content中的selected值
if (NULL != pSeletedAttr && sName == m_pLstCtrl->GetItemText(i, 0))
{
pSeletedAttr->PutnodeValue((_variant_t)(m_pLstCtrl->GetCheck(i) != FALSE));
}
}
}
}
}
m_pDoc->save((LPCTSTR)m_sFilePath);
return true;
}
// 读取xml文件内容到列表
bool CTextTypeFileReader::LoadToCmbCtrl()
{
if (NULL == m_pDoc || NULL == m_pLstCtrl)
{
return false;
}
// 在表格中添加两列
m_pLstCtrl->InsertColumn(0, _T(""), LVCFMT_CENTER, 150);
m_pLstCtrl->InsertColumn(0, _T(""), LVCFMT_CENTER, 150);
// 读取文件
m_pDoc->async = VARIANT_FALSE;
m_pDoc->validateOnParse = VARIANT_FALSE;
if(m_pDoc->load((LPCTSTR)m_sFilePath) != VARIANT_TRUE)
{
return false;
}
// 得到settings一级
MSXML2::IXMLDOMElementPtr pRoot = m_pDoc->GetdocumentElement();
if (NULL == pRoot)
{
return false;
}
// 得到content一级
MSXML2::IXMLDOMNodeListPtr pNodeList = pRoot->GetchildNodes();
if (NULL == pNodeList)
{
return false;
}
pNodeList->reset();
// 遍历每一个content,获得name,selected,DXF码
for (int i = 0; i < pNodeList->Getlength(); i++)
{
MSXML2::IXMLDOMNodePtr pNode = pNodeList->nextNode();
if (NULL != pNode)
{
CString sName;
BOOL bSelected = false;
MSXML2::IXMLDOMNamedNodeMapPtr pNodeMap = pNode->Getattributes();
if (NULL != pNodeMap)
{
MSXML2::IXMLDOMNodePtr pNameAttr = pNodeMap->getNamedItem(_bstr_t(_T("name")));
if (NULL != pNameAttr)
{
_variant_t var = pNameAttr->GetnodeValue();
sName = (LPCTSTR)_bstr_t(var.bstrVal);
}
MSXML2::IXMLDOMNodePtr pSeletedAttr = pNodeMap->getNamedItem(_bstr_t(_T("selected")));
if (NULL != pSeletedAttr)
{
_variant_t var = pSeletedAttr->GetnodeValue();
bSelected = _tcscmp((LPCTSTR)var.bstrVal, _T("0"));
}
}
MSXML2::IXMLDOMNodeListPtr pNodeLst = pNode->GetchildNodes();
CString sDXFCode;
if (NULL != pNodeLst)
{
for (int j = 0; j < pNodeLst->Getlength(); j++)
{
MSXML2::IXMLDOMNodePtr pNodeDxf = pNodeLst->nextNode();
if (NULL != pNodeDxf)
{
_bstr_t var = pNodeDxf->Gettext();
sDXFCode += (LPCTSTR)var;
}
}
}
// 信息添加到表格
int iPos = m_pLstCtrl->GetItemCount();
m_pLstCtrl->InsertItem(iPos, sName);
m_pLstCtrl->SetItemText(iPos, 1, sDXFCode);
m_pLstCtrl->SetCheck(iPos, bSelected);
}
}
return true;
}
//////////////////////////////////////////////////////////////////////////
// CSymDefDlg 对话框
// Zyu add on 100925,通配符定义对话框
IMPLEMENT_DYNAMIC(CSymDefDlg, CDialog)
CSymDefDlg::CSymDefDlg(CWnd* pParent /*=NULL*/)
: CModelessDialog(CSymDefDlg::IDD, pParent)
{
}
CSymDefDlg::~CSymDefDlg()
{
}
BOOL CSymDefDlg::OnInitDialog()
{
// 填入表格的内容
CListCtrl *pLstCtrl = (CListCtrl*)GetDlgItem(IDC_LST_DEFINE);
pLstCtrl->SetExtendedStyle(pLstCtrl->GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
if (NULL != pLstCtrl)
{
pLstCtrl->InsertColumn(0, _T("字符"), LVCFMT_LEFT, 100);
pLstCtrl->InsertColumn(1, _T("定义"), LVCFMT_LEFT, 400);
pLstCtrl->InsertItem(0, _T("#(井号)"));
pLstCtrl->SetItemText(0, 1, _T("匹配任意数字字符"));
pLstCtrl->InsertItem(1, _T("@(At)"));
pLstCtrl->SetItemText(1, 1, _T("匹配任意字母字符"));
pLstCtrl->InsertItem(2, _T(".(句号)"));
pLstCtrl->SetItemText(2, 1, _T("匹配任意非字母数字字符"));
pLstCtrl->InsertItem(3, _T("*(星号)"));
pLstCtrl->SetItemText(3, 1, _T("匹配任意字符串,可以在搜索字符串的任意位置使用"));
pLstCtrl->InsertItem(4, _T("?(问号)"));
pLstCtrl->SetItemText(4, 1, _T("匹配任意单个字符,例如,?BC匹配ABC、3BC等等"));
pLstCtrl->InsertItem(5, _T("~(波浪号)"));
pLstCtrl->SetItemText(5, 1, _T("匹配不包含自身的任意字符串,例如~*AB*匹配所以有不包含AB的字符串"));
pLstCtrl->InsertItem(6, _T("[]"));
pLstCtrl->SetItemText(6, 1, _T("匹配括号中包含的任意一个字符,例如,[AB]C匹配AC和BC"));
pLstCtrl->InsertItem(7, _T("[~]"));
pLstCtrl->SetItemText(7, 1, _T("匹配括号中未包含的任意字符,例如,[~AB]C匹配XC而不匹配AC"));
pLstCtrl->InsertItem(8, _T("[-]"));
pLstCtrl->SetItemText(8, 1, _T("指定单个字符的范围,例如,[A-G]C匹配AC、BC等,直到GC,但不匹配HC"));
pLstCtrl->InsertItem(9, _T("'(单引号)"));
pLstCtrl->SetItemText(9, 1, _T("逐字读取其后的字符;例如,'~AB匹配~AB"));
}
return CDialog::OnInitDialog();
}
BEGIN_MESSAGE_MAP(CSymDefDlg, CModelessDialog)
END_MESSAGE_MAP()
//////////////////////////////////////////////////////////////////////////
// Zyu add on 100917,设置选项
BOOL CFindAndReplaceDlg::m_bFind = true;
BOOL CFindAndReplaceDlg::m_bReplace = true;
BOOL CFindAndReplaceDlg::m_bPrefix = true;
BOOL CFindAndReplaceDlg::m_bSuffix = false;
BOOL CFindAndReplaceDlg::m_bIncrement = true;
BOOL CFindAndReplaceDlg::m_bAutoZoom = true;
BOOL CFindAndReplaceDlg::m_bCaseSencitive = true;
BOOL CFindAndReplaceDlg::m_bWordMatch = false;
BOOL CFindAndReplaceDlg::m_bWordMatchOld = false;
BOOL CFindAndReplaceDlg::m_bWildcards = false;
BOOL CFindAndReplaceDlg::m_bWildcardsOld = false;
BOOL CFindAndReplaceDlg::m_bSearchXref = false;
BOOL CFindAndReplaceDlg::m_bSearchBlock = true;
BOOL CFindAndReplaceDlg::m_bNoHidden = true;
BOOL CFindAndReplaceDlg::m_bWidthSensitive = false;
BOOL CFindAndReplaceDlg::m_bGrpSetStatus = false;
int CFindAndReplaceDlg::m_iReplaceType = 0;
CFindAndReplaceDlg::CFindAndReplaceDlg(CWnd* pParent /*=NULL*/)
: WGroupDlg(CFindAndReplaceDlg::IDD, pParent), m_ssText(SS_FREE), m_ssTextAll(SS_FREE)
,m_dwPosFind(0)
,m_dwPosReplace(0)
,m_bBlkAttrib(0)
,m_strDefaultFilter(_T(""))
{
//{{AFX_DATA_INIT(CFindAndReplaceDlg)
m_sFindText = _T("");
m_sReplaceText =_T("");
m_iFindRange = -1;
// Zyu delete on 100916,删除无用数据
//m_bAttdef = FALSE;
//}}AFX_DATA_INIT
m_nTextNum = 0;
m_nTextNumAll = 0;
m_sOldFindText = _T("");
m_bIsFindEnd = FALSE;
m_crPrompt = RGB(0,0,0);
}
void CFindAndReplaceDlg::DoDataExchange(CDataExchange* pDX)
{
WGroupDlg::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFindAndReplaceDlg)
DDX_Control(pDX, IDC_COMBO_FINDTEXTS, m_comboFindText);
DDX_Control(pDX, IDC_COMBO_REPLACETEXT, m_comboReplaceText);
DDX_Control(pDX, IDC_CMB_PREFIX, m_cmbPrefix);
DDX_Control(pDX, IDC_CMB_SUFFIX, m_cmbSuffix);
DDX_Control(pDX, IDC_CMB_INCREMENT, m_cmbIncrement);
DDX_CBString(pDX, IDC_COMBO_FINDTEXTS, m_sFindText);
DDX_CBString(pDX, IDC_COMBO_REPLACETEXT, m_sReplaceText);
DDX_CBString(pDX, IDC_CMB_PREFIX, m_sPrefixText);
DDX_CBString(pDX, IDC_CMB_SUFFIX, m_sSuffixText);
DDX_CBString(pDX, IDC_CMB_INCREMENT, m_sIncrementText);
DDX_CBIndex(pDX, IDC_COMBO_FINDRANGE, m_iFindRange);
// Zyu delete on 100916,删除无用控件
//DDX_Check(pDX, IDC_CHECK_ATTDEF, m_bAttdef);
DDX_Check(pDX, IDC_CHK_SEARCH, m_bFind);
DDX_Check(pDX, IDC_CHK_REPLACE, m_bReplace);
DDX_Check(pDX, IDC_CHK_PREFIX, m_bPrefix);
DDX_Check(pDX, IDC_CHK_SUFFIX, m_bSuffix);
DDX_Check(pDX, IDC_CHK_INCREMENT, m_bIncrement);
DDX_Check(pDX, IDC_CHK_AUTOZOOM, m_bAutoZoom);
DDX_Check(pDX, IDC_CHK_CASESENSITIVE, m_bCaseSencitive);
DDX_Check(pDX, IDC_CHK_WORDMATCH, m_bWordMatch);
DDX_Check(pDX, IDC_CHK_WILDCARDS, m_bWildcards);
DDX_Check(pDX, IDC_CHK_SEARCHXREF, m_bSearchXref);
DDX_Check(pDX, IDC_CHK_SEARCHBLOCK, m_bSearchBlock);
DDX_Check(pDX, IDC_CHK_NOHIDDEN, m_bNoHidden);
DDX_Check(pDX, IDC_CHK_WIDTHSENSITIVE, m_bWidthSensitive);
DDX_Control(pDX, IDC_STC_SET, m_grpSet);
DDX_GroupStatus(pDX,IDC_STC_SET, m_bGrpSetStatus);
DDX_Control(pDX, IDC_LST_TYPE, m_lstStyle);
//}}AFX_DATA_MAP
DDX_Radio(pDX, IDC_RAD_REPLACE, m_iReplaceType);
}
BEGIN_MESSAGE_MAP(CFindAndReplaceDlg, WGroupDlg)
//{{AFX_MSG_MAP(CFindAndReplaceDlg)
ON_BN_CLICKED(IDC_BUTTON_FIND, OnButtonFind)
ON_BN_CLICKED(IDC_BUTTON_REPLACE, OnButtonReplace)
ON_BN_CLICKED(IDC_BUTTON_REPLACEALL, OnButtonReplaceall)
ON_BN_CLICKED(IDC_BUTTON_SELECT, OnButtonSelect)
ON_CBN_SELCHANGE(IDC_COMBO_FINDRANGE, OnSelchangeComboFindrange)
ON_CBN_EDITCHANGE(IDC_COMBO_FINDTEXTS, OnCbnEditchangeComboFindtexts)
ON_CBN_KILLFOCUS(IDC_COMBO_REPLACETEXT, OnCbnKillfocusComboReplacetext)
ON_CBN_KILLFOCUS(IDC_CMB_PREFIX, OnCbnKillfocusCmbPrefix)
ON_CBN_KILLFOCUS(IDC_CMB_SUFFIX, OnCbnKillfocusCmbSuffix)
ON_CBN_KILLFOCUS(IDC_CMB_INCREMENT, OnCbnKillfocusCmbIncrement)
ON_CBN_KILLFOCUS(IDC_COMBO_FINDTEXTS, OnCbnKillfocusComboFindtexts)
ON_CBN_SELCHANGE(IDC_COMBO_FINDTEXTS, OnCbnSelchangeComboFindtexts)
ON_WM_DESTROY()
ON_WM_CTLCOLOR()
ON_BN_CLICKED(IDC_RAD_REPLACE, OnBnClickedRadReplace)
ON_BN_CLICKED(IDC_RAD_INFIX, OnBnClickedRadInfix)
ON_BN_CLICKED(IDC_RAD_INCREMENT, OnBnClickedRadIncrement)
ON_BN_CLICKED(IDC_CHK_SEARCH, OnBnClickedChkSearch)
ON_BN_CLICKED(IDC_CHK_REPLACE, OnBnClickedChkReplace)
ON_BN_CLICKED(IDC_CHK_PREFIX, OnBnClickedChkPrefixOrSuffix)
ON_BN_CLICKED(IDC_CHK_SUFFIX, OnBnClickedChkPrefixOrSuffix)
ON_BN_CLICKED(IDC_CHK_INCREMENT, OnBnClickedChkIncrement)
ON_BN_CLICKED(IDC_CHK_WORDMATCH, OnBnClickedChkWordmatch)
ON_BN_CLICKED(IDC_CHK_WILDCARDS, OnBnClickedChkWildcards)
ON_BN_CLICKED(IDC_CHK_SEARCHXREF, OnBnClickedChkSearchxref)
ON_BN_CLICKED(IDC_CHK_CASESENSITIVE, OnBnClickedChkCasesensitive)
ON_BN_CLICKED(IDC_CHK_NOHIDDEN, OnBnClickedChkNohidden)
ON_BN_CLICKED(IDC_CHK_WIDTHSENSITIVE, OnBnClickedChkWidthsensitive)
ON_BN_CLICKED(IDC_CHK_SEARCHBLOCK, OnBnClickedChkSearchblock)
ON_BN_CLICKED(IDC_BTN_FIND, OnBnClickedBtnFind)
ON_BN_CLICKED(IDC_BTN_REPLACE, OnBnClickedBtnReplace)
ON_BN_CLICKED(IDC_BTN_MARKALL, OnBnClickedBtnMarkall)
ON_BN_CLICKED(IDC_BTN_UNMARKALL, OnBnClickedBtnUnmarkall)
ON_BN_CLICKED(IDC_BTN_WILDCARDS, OnBnClickedBtnWildcards)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LST_TYPE, OnLvnItemchangedLstType)
ON_WM_CLOSE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//查找字符串
void CFindAndReplaceDlg::OnButtonFind()
{
UpdateData( TRUE );
// Zyu modify on 101028,新需求允许不给出查找内容
//if (m_sFindText.IsEmpty())
//{
// AfxMessageBox(_T("查找不能为空!"));
// GetDlgItem(IDC_COMBO_FINDTEXTS)->SetFocus();
// return;
//}
// Zyu add on 101013,设置查找选项
SetFindOption();
// Zyu modify on 100919,使用新的函数,在控件失去焦点时插入字符串
//InsertFindText();
//InsertReplaceText(); //add by xlc on 090630 解决了查找时替换字符串改变的问题
//查找字符串
if (!FindText())
{
return;
}
CString str;
// Zyu add on 101029,提示文字变为黑色
m_crPrompt = RGB(0, 0, 0);
str.Format(_T("已找到%d个"),m_nFindCount);
GetDlgItem(IDC_EDIT_RESULT)->SetWindowText(str);
//判断是否完成对整个图形或者当前选择图形的查找
if ( m_nTextNum >= m_nTextNumAll)
{
m_bIsFindEnd = TRUE;
CString str;
// Zyu modify on 101216,查找完毕后,弹出对话框提示
//str.Format(_T("共找到%d个\r\n查找完毕"),m_nFindCount);
//GetDlgItem(IDC_EDIT_RESULT)->SetWindowText(str);
str.Format(_T(" 搜索完毕! \n\n 共找到%d个\n\n 共替换%d个"), m_nFindCount, m_nCount);
ResetFind();
MessageBox(str, _T("查找替换"));
//m_nFindCount =0;
//m_nCount++;
//AfxMessageBox(_T("查找完毕!"));
}
}
//逐个替换字符串
void CFindAndReplaceDlg::OnButtonReplace()
{
UpdateData( TRUE );
// Zyu modify on 101028,新需求允许不给出查找内容
//if (m_sFindText.IsEmpty())
//{
// AfxMessageBox(_T("查找不能为空!"));
// GetDlgItem(IDC_COMBO_FINDTEXTS)->SetFocus();
// return;
//}
CString sFindText; // 搜索的字符串
CString sReplaceText; // 替换的字符串
GetFindText(sFindText);
if (!GetReplaceText(sReplaceText))
{
return;
}
else
{
SetDlgItemText(IDC_EDIT_RESULT, _T(""));
m_crPrompt = RGB(0, 0, 0);
}
// Zyu modify on 100919,使用新的函数,在控件失去焦点时插入字符串
//InsertFindText();
//InsertReplaceText();
//判断查找的字符串是否变换,若变,则使找按钮不能被选择
//if ( m_sOldFindText != m_sFindText )
if ( m_sOldFindText != sFindText )
{
// Zyu modify on 101029,使用新的函数
//CWnd* pWnd = GetDlgItem(IDC_BUTTON_REPLACE);
//pWnd->EnableWindow( FALSE );
EnableReplace();
return;
}
//m_sOldFindText = m_sFindText;
m_sOldFindText = sFindText;
if ( m_nTextNum > m_nTextNumAll)
{
AfxMessageBox( _T("查找完毕!") );
return;
}
long nTextNum = m_nTextNum;
nTextNum = m_nTextNum;
Entity ent = m_ssText[nTextNum];
int nLen = m_ssText.Length();
ASSERT(nLen != 0);
acDocManager->lockDocument(curDoc(),AcAp::kWrite,NULL,NULL,true);
// Zyu modify on 101019,使用新的替换函数
//m_posStart=ReplaceEntText(ent, m_posFind, m_sReplaceText);
m_posStart = m_farUtil.ReplaceEntText(ent, m_posFind, sReplaceText);
acDocManager->unlockDocument(curDoc());
//static int nCount =0;
// Zyu add on 101029,提示文字变为黑色
m_crPrompt = RGB(0, 0, 0);
if (m_posStart.m_nBufLen>0)
{
m_nCount++;
CString str;
str.Format(_T("已替换%d个"),m_nCount);
GetDlgItem(IDC_EDIT_RESULT)->SetWindowText(str);
SHads_command(RTSTR, _T("REGEN"), RTNONE);
}
if(!m_posStart)
m_nTextNum++;
//刷新
// acedRedraw(NULL,1);
TPickEntSet ssTemp; // add by lgh.改变刷新方式,只刷新本实体的显示
ssTemp += ent;
UpdateGraphic(ssTemp);
actrTransactionManager->flushGraphics();
acedUpdateDisplay();
// 设置查找选项
SetFindOption();
FindText();//查找字符串
if ( m_nTextNum >= m_nTextNumAll)
{
m_bIsFindEnd = TRUE;
// Zyu add on 101215,“全部替换”按钮也变灰
CString str;
str.Format(_T(" 搜索完毕! \n\n 共找到%d个\n\n 共替换%d个"), m_nFindCount, m_nCount);
ResetFind();
MessageBox(str, _T("查找替换"));
return;
}
}
//替换所有与查找字符串相匹配的字符串
void CFindAndReplaceDlg::OnButtonReplaceall()
{
UpdateData( TRUE );
// 设置查找选项
SetFindOption();
// Zyu modify on 100919,使用新的函数,在控件失去焦点时插入字符串
//InsertFindText();
//InsertReplaceText();
// Zyu modify on 101028,新需求允许不给出查找内容
//if (m_sFindText.IsEmpty())
//{
// AfxMessageBox(_T("查找不能为空!"));
// GetDlgItem(IDC_COMBO_FINDTEXTS)->SetFocus();
// return;
//}
CString sFindText; // 搜索的字符串
CString sReplaceText; // 替换的字符串
GetFindText(sFindText);
//if ( m_sOldFindText != m_sFindText )
if ( m_sOldFindText != sFindText )
{
m_bIsFindEnd = FALSE;
m_nTextNum = 0;
}
// sg modify 110818,从循环中拿出来,主要是解决执行撤销操作的时候,希望一次性全部撤销的情况
acDocManager->lockDocument(curDoc(),AcAp::kWrite,NULL,NULL,true);
BOOL bFind = FALSE;
// Zyu delete on 101104,替换数量包括单个替换的实体
//int nCount = 0;
//modify by xlc on 070810
// for( long i = m_nTextNum; i < m_nTextNumAll; i++) {
// Zyu modify on 101216,全部替换从当前位置开始
//for( long i = 0; i < m_nTextNumAll; i++) {
for( long i = m_nTextNum; i < m_nTextNumAll; i++) {
Entity ent=m_ssText[i];
//TTextPosition pos;
while(1) {
TTextRange range;
// Zyu modify on 101019,使用新的搜索函数
//TTextPosition posFind = FindEntText(ent, m_sFindText, pos, &range);
if (!m_posFind)
{
m_posFind = m_farUtil.FindEntText(ent, sFindText, m_posStart, &range);
if(!m_posFind)
break;
m_nFindCount++;
}
// Zyu add on 101028,得到要替换的字符串
if (!GetReplaceText(sReplaceText))
{
break;
}
bFind=TRUE;
// Zyu modify on 101019,使用新的替换函数
//pos = ReplaceEntText(ent, posFind, m_sReplaceText);
// sg delete 110818,删除了2句话,移到了循环外
//acDocManager->lockDocument(curDoc(),AcAp::kWrite,NULL,NULL,true);
m_posStart = m_farUtil.ReplaceEntText(ent, m_posFind, sReplaceText);
//acDocManager->unlockDocument(curDoc());
if (m_posStart.m_nBufLen>0)
{
// Zyu modify on 101104,替换数量包括单个替换的实体
//nCount++;
m_nCount++;
m_posFind = TTextPosition();
}
if(!m_posStart)
break;
}
m_posStart = TTextPosition();
m_posFind = TTextPosition();
}
// sg modify 110818,从循环中拿出来,主要是解决执行撤销操作的时候,希望一次性全部撤销的情况
acDocManager->unlockDocument(curDoc());
//刷新
actrTransactionManager->flushGraphics();
acedUpdateDisplay();
acedRedraw(NULL,1);
SHads_command(RTSTR, _T("REGEN"), RTNONE);
if (bFind == FALSE)
{
CString prompt = _T("没有\"") + m_sFindText + _T("\"!");
//AfxMessageBox(prompt);
}
else
{
m_sOldFindText = m_sFindText;
//AfxMessageBox(_T("替换完毕!"));
}
// Zyu add on 101029,提示文字变为黑色
m_crPrompt = RGB(0, 0, 0);
// Zyu modify on 101104,不需再提示
//CString strRes;
//strRes.Format(_T("共替换了%d个!"),nCount);
// Zyu modify on 101216,全部替换完毕后,弹出对话框提示
CString str;
str.Format(_T(" 搜索完毕! \n\n 共找到%d个\n\n 共替换%d个"), m_nFindCount, m_nCount);
ResetFind();
MessageBox(str, _T("查找替换"));
}
//选取对象“选择对象”按钮后,重新构造字符串选择集
void CFindAndReplaceDlg::OnButtonSelect()
{
// Zyu modify on 101101,简化代码
/*
UpdateData(TRUE);
HideDialog(TRUE);
const TCHAR *szPrompt[2]={_T("请选择需要查找和替换的字符串的范围:"), _T("移除物体")};
RBList TextList(RTDXF0, _T("TCH_*,TEXT,INSERT"), NULL);
m_ssText.Free();
if(m_ssText.Get(_T(":$"), szPrompt, NULL, TextList) == RTNORM)
{
m_nTextNum = 0;
m_nTextNumAll = m_ssText.Length();
m_iFindRange = 0;
m_posFind=TTextPosition();
m_posStart=TTextPosition();
}
else {
m_nTextNum = 0;
m_nTextNumAll = 0;
m_iFindRange = 0;
m_posFind=TTextPosition();
m_posStart=TTextPosition();
}
HideDialog(FALSE);
UpdateData(FALSE);
*/
UpdateData(TRUE);
// 隐藏对话框
HideDialog(TRUE);
// 搜索范围修改为用户选择
m_iFindRange = 2;
UpdateData(FALSE);
ResetFind();
// 用户选择
const TCHAR *szPrompt[2]={_T("请选择需要查找和替换的字符串的范围:"), _T("移除物体")};
RBList TextList(RTDXF0, GetFilterString(), NULL);
m_ssTextAll.Free();
m_ssText.Free();
m_ssTextAll.Get(_T(":$"), szPrompt, NULL, TRBList());
m_ssText += m_ssTextAll;
m_ssText.BaseFilter(TextList);
m_nTextNumAll = m_ssText.Length();
// 显示对话框
HideDialog(FALSE);
}
BOOL CFindAndReplaceDlg::OnInitDialog()
{
WGroupDlg::OnInitDialog();
m_nCount =0;
m_nFindCount=0;
m_sOldFindText = m_sFindText;
// Zyu modify on 101215,采用新函数
//CWnd* pWnd = GetDlgItem(IDC_BUTTON_FIND);
//pWnd->SetWindowText(_T("查找"));
//pWnd = GetDlgItem(IDC_BUTTON_REPLACE);
//pWnd->EnableWindow(FALSE);
// Zyu add on 100925,从XML文件中读取文字样式
CString sFilePath = g_sAppPath; //获得Sys目录的路径
#ifdef _WIN64
sFilePath = sFilePath.Left(sFilePath.GetLength() - 10) + _T("\\sys\\TFindRepFilter.xml");
#else
sFilePath = sFilePath.Left(sFilePath.GetLength() - 7) + _T("\\sys\\TFindRepFilter.xml");
#endif
m_lstStyle.SetExtendedStyle(m_lstStyle.GetExtendedStyle() | LVS_EX_CHECKBOXES);
m_xmlReader.SetFilePath(sFilePath);
m_xmlReader.SetListCtrl(&m_lstStyle);
if (m_xmlReader.Init())
{
m_xmlReader.LoadToCmbCtrl();
}
else
{
m_strDefaultFilter = _T("TCH_*,INSERT,TEXT,MTEXT");
}
//构造字符串的选择集,如果当前图形已经选择了实体,则对当前选择
//的图形选择集,否则对整个图形构造
//RBList TextList(RTDXF0, _T("TCH_*,TEXT,INSERT"), NULL);
m_ssText.Free();
m_ssTextAll.Free();
/*
if ( m_ssText.Get(_T("I"), NULL, NULL, TextList) == RTNORM )
{
m_nTextNumAll = m_ssText.Length();
}*/
if(g_ssPickFirst.Length())
m_ssTextAll += g_ssPickFirst;
m_ssText += m_ssTextAll;
RBList TextList(RTDXF0, GetFilterString(), NULL);
m_ssText.BaseFilter(TextList);
m_nTextNumAll=m_ssText.Length();
//判断当前是否有被选中的字符串
if ( m_nTextNumAll != 0 ) {
// Zyu modify on 100926,调整组合框内容和顺序
//m_iFindRange = 0;
m_iFindRange = 2;
} else {
// Zyu modify on 101101,拾取实体
//m_ssText.Free();
//if( m_ssText.Get(_T("X"), NULL, NULL, TextList ) == RTNORM) {
// m_nTextNumAll = m_ssText.Length();
//}
m_iFindRange = 0;
UpdateData(FALSE);
PickEntities();
}
//加载“选择对象”按钮的位图
CBitmap bitmap;
bitmap.LoadBitmap(IDB_SELECTOBJECT);
CButton *pButton = (CButton *)GetDlgItem(IDC_BUTTON_SELECT);
// Zyu add on 100919,加载按钮位图
CButton *pBtnFind = (CButton *)GetDlgItem(IDC_BTN_FIND);
CButton *pBtnReplace = (CButton *)GetDlgItem(IDC_BTN_REPLACE);
pBtnFind->SetBitmap((HBITMAP)bitmap);
pBtnReplace->SetBitmap((HBITMAP)bitmap);
pButton->SetBitmap((HBITMAP)bitmap);
bitmap.Detach();
// Zyu modify on 100919,添加部分控件的提示
CButton *pBtnAutoZoom = (CButton *)GetDlgItem(IDC_CHK_AUTOZOOM);
//if (!m_wndToolTip.Create(pButton))
if (!m_wndToolTip.Create(pButton)
&& !m_wndToolTip.Create(pBtnFind)
&& !m_wndToolTip.Create(pBtnReplace)
&& !m_wndToolTip.Create(pBtnAutoZoom))
{
return FALSE;
}
m_wndToolTip.AddTool(pButton, _T("选取对象"));
m_wndToolTip.AddTool(pBtnFind, _T("屏幕取词"));
m_wndToolTip.AddTool(pBtnReplace, _T("屏幕取词"));
m_wndToolTip.AddTool(pBtnAutoZoom, _T("勾选此项后,对于当前查找到的文字内容,程序自动放大到屏幕中心位置显示。"));
m_wndToolTip.SetMaxTipWidth(230);
// Zyu modify on 100919,使用统一的读写文件函数
//初始化“查找"和“替换”字符串
//LoadFindText();
//LoadReplaceText();
LoadText((LPTSTR)_T("findtext.his"), m_comboFindText, m_sFindText);
LoadText((LPTSTR)_T("replacetext.his"), m_comboReplaceText, m_sReplaceText);
LoadText((LPTSTR)_T("prefixtext.his"), m_cmbPrefix, m_sPrefixText);
LoadText((LPTSTR)_T("suffixtext.his"), m_cmbSuffix, m_sSuffixText);
LoadText((LPTSTR)_T("incrementtext.his"), m_cmbIncrement, m_sIncrementText);
UpdateData(FALSE);
// Zyu add on 100919,更新控件状态
EnableCtrls();
SetCtrlsVisible();
// HideDialog(FALSE);
return TRUE;
}
//选择了查找范围后,重新构造字符串的选择集
void CFindAndReplaceDlg::OnSelchangeComboFindrange()
{
UpdateData(TRUE);
// Zyu add on 101101,重新选择实体
ResetFind();
if (m_iFindRange == 0)
{
#if ADS<17
OnButtonSelect();
#endif
}
/*
else
{
if(m_iFindRange == 1)
{
RBList TextList(RTDXF0, _T("TCH_*,TEXT,INSERT"), NULL);
m_ssText.Free();
if(m_ssText.Get(_T("X"), NULL, NULL, TextList ) == RTNORM)
{
m_nTextNumAll = m_ssText.Length();
m_nTextNum=0;
m_posFind=TTextPosition();
m_posStart=TTextPosition();
}
}
}
*/
}
void CFindAndReplaceDlg::OnCbnEditchangeComboFindtexts()
{
ResetFind();
}
void CFindAndReplaceDlg::OnCbnKillfocusComboFindtexts()
{
UpdateData(TRUE);
CWnd* pWnd = GetDlgItem(IDC_BUTTON_REPLACE);
//modify by xlc on 070810
/*if ( m_sOldFindText == m_sFindText )
{
pWnd->EnableWindow( TRUE );
}
else
{
m_bIsFindEnd = FALSE;
pWnd->EnableWindow( FALSE );
}*/
if ( m_sOldFindText != m_sFindText )
{
m_bIsFindEnd = FALSE;
pWnd->EnableWindow( FALSE );
m_nTextNum = 0;
m_nTextNumAll = m_ssText.Length();
m_posFind=TTextPosition();
m_posStart=TTextPosition();
//modify by xlc on 090720 修改查找内容后计数置0
m_nFindCount=0;
}
InsertText(m_sFindText, m_comboFindText);
}
void CFindAndReplaceDlg::OnCbnKillfocusComboReplacetext()
{
UpdateData(TRUE);
InsertText(m_sReplaceText, m_comboReplaceText);
}
void CFindAndReplaceDlg::OnCbnKillfocusCmbPrefix()
{
UpdateData(TRUE);
InsertText(m_sPrefixText, m_cmbPrefix);
}
void CFindAndReplaceDlg::OnCbnKillfocusCmbSuffix()
{
UpdateData(TRUE);
InsertText(m_sSuffixText, m_cmbSuffix);
}
void CFindAndReplaceDlg::OnCbnKillfocusCmbIncrement()
{
UpdateData(TRUE);
InsertText(m_sIncrementText, m_cmbIncrement);
}
void CFindAndReplaceDlg::OnCbnSelchangeComboFindtexts()
{
ResetFind();
}
void CFindAndReplaceDlg::OnBnClickedRadReplace()
{
SetCtrlsVisible();
EnableCtrls();
m_bWildcards = m_bWildcardsOld;
m_bWordMatch = m_bWordMatchOld;
UpdateData(FALSE);
}
void CFindAndReplaceDlg::OnBnClickedRadInfix()
{
SetCtrlsVisible();
EnableCtrls();
m_bWildcards = m_bWildcardsOld;
m_bWordMatch = m_bWordMatchOld;
UpdateData(FALSE);
}
void CFindAndReplaceDlg::OnBnClickedRadIncrement()
{
SetCtrlsVisible();
EnableCtrls();
}
void CFindAndReplaceDlg::OnBnClickedChkCasesensitive()
{
ResetFind();
}
void CFindAndReplaceDlg::OnBnClickedChkWordmatch()
{
UpdateData(TRUE);
// 全字匹配与通配符不能同时选中
if (m_bWordMatch)
{
m_bWildcards = false;
}
UpdateData(FALSE);
m_bWordMatchOld = m_bWordMatch;
ResetFind();
}
void CFindAndReplaceDlg::OnBnClickedChkWildcards()
{
UpdateData(TRUE);
// 全字匹配与通配符不能同时选中
if (m_bWildcards)
{
m_bWordMatch = false;
}
UpdateData(FALSE);
m_bWildcardsOld = m_bWildcards;
ResetFind();
}
void CFindAndReplaceDlg::OnBnClickedBtnFind()
{
UpdateData(TRUE);
CString sText;
// 拾取文字
if (PickText(sText))
{
// 按光标位置替换
int iStart = LOWORD(m_dwPosFind);
int iEnd = HIWORD(m_dwPosFind);
m_sFindText.Delete(iStart, iEnd - iStart);
m_sFindText.Insert(iStart, sText);
InsertText(m_sFindText, m_comboFindText);
UpdateData(FALSE);
}
ResetFind();
}
void CFindAndReplaceDlg::OnBnClickedBtnReplace()
{
UpdateData(TRUE);
CString sText;
// 拾取文字
if (PickText(sText))
{
// 按光标位置替换
int iStart = LOWORD(m_dwPosReplace);
int iEnd = HIWORD(m_dwPosReplace);
m_sReplaceText.Delete(iStart, iEnd - iStart);
m_sReplaceText.Insert(iStart, sText);
InsertText(m_sReplaceText, m_comboReplaceText);
UpdateData(FALSE);
}
}
void CFindAndReplaceDlg::OnBnClickedBtnMarkall()
{
int iLen = m_lstStyle.GetItemCount();
// 勾选所有列表中的项目
for (int i = 0; i < iLen; i++)
{
m_lstStyle.SetCheck(i, TRUE);
}
ResetFind();
}
void CFindAndReplaceDlg::OnBnClickedBtnUnmarkall()
{
int iLen = m_lstStyle.GetItemCount();
// 取消勾选所有列表中的项目
for (int i = 0; i < iLen; i++)
{
m_lstStyle.SetCheck(i, FALSE);
}
ResetFind();
}
void CFindAndReplaceDlg::OnBnClickedBtnWildcards()
{
// 显示通配符定义对话框
CSymDefDlg dlg;
dlg.DoModal();
}
void CFindAndReplaceDlg::OnBnClickedChkIncrement()
{
UpdateData(TRUE);
if (m_bIncrement)
{
m_bWordMatchOld = m_bWordMatch;
m_bWildcardsOld = m_bWildcards;
}
else
{
m_bWordMatch = m_bWordMatchOld;
m_bWildcards = m_bWildcardsOld;
UpdateData(FALSE);
}
EnableCtrls();
}
void CFindAndReplaceDlg::OnBnClickedChkReplace()
{
EnableCtrls();
}
void CFindAndReplaceDlg::OnBnClickedChkPrefixOrSuffix()
{
EnableCtrls();
}
void CFindAndReplaceDlg::OnBnClickedChkSearch()
{
EnableCtrls();
ResetFind();
}
void CFindAndReplaceDlg::OnLvnItemchangedLstType(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
BOOL bPrevState = (BOOL)(((pNMLV->uOldState & LVIS_STATEIMAGEMASK) >> 12) - 1);
BOOL bChecked = (BOOL)(((pNMLV->uNewState & LVIS_STATEIMAGEMASK) >> 12) - 1);
if (bPrevState != bChecked)
{
ResetFind();
}
*pResult = 0;
}
HBRUSH CFindAndReplaceDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = WGroupDlg::OnCtlColor(pDC, pWnd, nCtlColor);
// 设置提示编辑框的文字颜色
if (pWnd->GetDlgCtrlID() == IDC_EDIT_RESULT)
{
pDC->SetTextColor(m_crPrompt);
}
return hbr;
}
void CFindAndReplaceDlg::OnBnClickedChkSearchxref()
{
ResetFind();
}
void CFindAndReplaceDlg::OnBnClickedChkSearchblock()
{
ResetFind();
}
void CFindAndReplaceDlg::OnBnClickedChkNohidden()
{
ResetFind();
}
void CFindAndReplaceDlg::OnBnClickedChkWidthsensitive()
{
ResetFind();
}
//隐藏或者显示对话框(查找替换对话框)
void CFindAndReplaceDlg::HideDialog(BOOL bFlag)
{
if (bFlag) {
// GetParent()->EnableWindow(TRUE);
GetParent()->SetFocus();
GetParent()->SetActiveWindow();
ShowWindow(SW_HIDE);
// GetParent()->RedrawWindow();
}
else {
// GetParent()->EnableWindow(FALSE);
// EnableWindow(TRUE);
SetActiveWindow();
ShowWindow(SW_SHOW);
// Zyu add on 101214,解决提示控件不起作用的问题
// GetParent()->EnableWindow(TRUE);
}
// if (bFlag) {
// GetParent()->EnableWindow(TRUE);
// GetParent()->SetFocus();
// GetParent()->SetActiveWindow();
// ShowWindow(SW_HIDE);
// GetParent()->RedrawWindow();
// }
// else {
// GetParent()->EnableWindow(FALSE);
// EnableWindow(TRUE);
// SetActiveWindow();
// ShowWindow(SW_SHOW);
// // Zyu add on 101214,解决提示控件不起作用的问题
// GetParent()->EnableWindow(TRUE);
// }
}
bool CFindAndReplaceDlg::FindText()
{
// UpdateData(TRUE);
// Zyu add on 101028,被搜索的字符串
CString sFindText;
if (!GetFindText(sFindText))
{
return false;
}
// 判断查找字符串组合框中的字符串是否变换,若变换
// 则重新开始从所构造的选择集中查找和替换
//if (m_sOldFindText != m_sFindText)
if (m_sOldFindText != sFindText)
{
// Zyu modify on 101028,使用统一的搜索还原函数
//m_bIsFindEnd = FALSE;
//m_nTextNum = 0;
ResetFind();
}
// 选择此按钮后,重新设置它上面的文本
CWnd* pWnd = GetDlgItem(IDC_BUTTON_FIND);
pWnd->SetWindowText(_T("查找下一个"));
//m_sOldFindText = m_sFindText;
m_sOldFindText = sFindText;
acedRedraw(NULL,1);
// 下面是对字符串的查找,坐标的判断,若所查找的字符串
// 不可见,则使其能可见,若被对话框挡住,则移动对话框
// 使字符串能对用户可见
BOOL bFind = FALSE;
while (m_nTextNum < m_nTextNumAll)
{
int n__len = m_ssText.Length();
ASSERT(n__len > 0);
Entity ent = m_ssText[m_nTextNum];
XScreenDc dc(1,1);
dc.m_nFlag |= IMG_WCS2UCS;
XPoint ptMin, ptMax;
TTextRange range;
// Zyu modify on 101019,使用新的替换函数
//m_posFind = FindEntText(ent, m_sFindText, m_posStart, &range);
m_posFind = m_farUtil.FindEntText(ent, sFindText, m_posStart, &range);
//if (m_posFind.m_nBufLen>0)
//{
// m_nFindCount++;
//}
if (!m_posFind)
{
m_nTextNum++;
m_posStart.m_nTextPos = 0;
m_posStart.m_nCookies = 0; // sg add 090115
}
else
{
bFind = TRUE;
// Zyu add on 101101,切换到实体所在空间
TCString sSpaceName;
TCString sSpaceNameEnt;
TGGetVar(_T("CTAB"), &sSpaceName);
if (ent.GetData(410, sSpaceNameEnt) == RTNORM)
{
if (sSpaceNameEnt != sSpaceName)
{
TGSetVar(_T("CTAB"), sSpaceNameEnt);
}
}
if (range.GetExtend(ptMin, ptMax))
{
// Zyu modify on 101101,自动缩放
// 确保找到的位置范围可见
//AssureInCurrentView(ptMin, ptMax);
if (m_bAutoZoom)
{
// 方向矢量
AcGeVector3d vDir;
vDir = ptMax - ptMin;
// 比例因子
double dFactor = (vDir.x > vDir.y) ? vDir.x / vDir.y : vDir.y / vDir.x;
dFactor = (dFactor > 10) ? 10 : dFactor;
// 调整zoom的范围
AcGePoint3d ptMaxTemp = ptMax + vDir * 10 / dFactor;
AcGePoint3d ptMinTemp = ptMin - vDir * 10 / dFactor;
ArxZoom(ptMinTemp, ptMaxTemp);
}
else
{
// 确保找到的位置范围可见
AssureInCurrentView(ptMin, ptMax);
}
for (int n=0; n<range.m_lstRanges.Length(); n++)
{
dc << (*range.m_lstRanges[n]);
}
}
m_nFindCount++;
}
if (bFind == TRUE) // 确保找到的字符不被挡住
{
CPoint cptMin, cptMax;
int cvport;
VERIFY(xg_getvar(_T("CVPORT"), &cvport)==RTNORM);
acedCoordFromWorldToPixel(cvport, ptMin, cptMin);
acedCoordFromWorldToPixel(cvport, ptMax, cptMax);
CRect dwgViewRect, dlgRect;
CWnd* pDwgViewWnd = acedGetAcadDwgView();
pDwgViewWnd->GetWindowRect(dwgViewRect);
int ptx, pty;
ptx = dwgViewRect.left;
pty = dwgViewRect.top;
cptMin.x += ptx;
cptMin.y += pty;
cptMax.x += ptx;
cptMax.y += pty;
this->GetWindowRect(dlgRect);
CRect newRect = dlgRect;
// 若字符串被挡住,则移动对话框
BOOL bMove = FALSE;
int width, height;
width = GetSystemMetrics(SM_CXSCREEN);
height = GetSystemMetrics(SM_CYSCREEN);
while (newRect.PtInRect(cptMin)!=0 || newRect.PtInRect(cptMax)!=0)
{
bMove = FALSE;
newRect.OffsetRect(0, 5);
if (newRect.bottom >= height)
{
newRect = dlgRect;
while (newRect.PtInRect(cptMin)!=0 || newRect.PtInRect(cptMax)!=0)
{
bMove = FALSE;
newRect.OffsetRect(0, -5);
if (newRect.top <= 0)
{
break;
}
bMove = TRUE;
}
break;
}
bMove = TRUE;
}
if (bMove == TRUE)
{
this->MoveWindow(newRect);
}
break;
}
}
// 刷新
actrTransactionManager->flushGraphics();
acedUpdateDisplay();
pWnd = GetDlgItem(IDC_BUTTON_REPLACE);
if (bFind == TRUE)
{
// Zyu modify on 101215,采用新的函数
//pWnd->EnableWindow(TRUE);
EnableReplace();
}
else
{
pWnd->EnableWindow(FALSE);
// Zyu add on 101215,“全部替换”按钮也变灰
GetDlgItem(IDC_BUTTON_REPLACEALL)->EnableWindow(FALSE);
// Zyu delete on 101216,此处不重置
//m_nCount =0;
}
return true;
}
// Zyu modify on 100919,统一成读写文件的函数
// Begin
//初始化用作查找的字符串
//void CFindAndReplaceDlg::LoadFindText()
//{
// TCHAR strTmpPath[100] = _T("");
// GetTempPath(100, strTmpPath);
// _tcscat(strTmpPath, _T("findtext.his"));
//
///* m_lstFindText.RemoveAll();
// std::ifstream in(strTmpPath);
// if (!(!in))
// {
// TCHAR line[256];
// in.getline(line, 255);
// if(!(!in))
// {
// m_lstFindText.AddTail(strnew(line));
// while(!(!in))
// {
// in.getline(line, 255);
// if(!in)
// {
// break;
// }
// m_lstFindText.AddTail(strnew(line));
// for(int i = (m_lstFindText.GetCount() - 2); i >= 0; i--)
// {
// POSITION site = m_lstFindText.FindIndex(i);
// if (m_lstFindText.GetAt(site) == m_lstFindText.GetTail())
// {
// m_lstFindText.RemoveTail();
// break;
// }
// }
// }
// }
// }
// CComboBox* pComboFind = (CComboBox*)GetDlgItem(IDC_COMBO_FINDTEXTS);
// pComboFind->ResetContent();
// for (int i = 0; i < m_lstFindText.GetCount(); i++)
// {
// POSITION site = m_lstFindText.FindIndex(i);
// pComboFind->InsertString(i, m_lstFindText.GetAt(site));
// }
// pComboFind->GetLBText(0, m_sFindText);*/
//
// int nNum=0;
// std::ifstream in(_AS(strTmpPath));
// while(!(!in)) {
// char line[256];
// in.getline(line, 255);
// if(!in) break;
// nNum++;
// if(nNum>MAXTEXTNUM) break;
// m_comboFindText.AddString(TString(line));
// }
// if (m_comboFindText.GetCount()>0) {
// m_comboFindText.GetLBText(0,m_sFindText);
// }
//}
//
////初始化用作替换的字符串
//void CFindAndReplaceDlg::LoadReplaceText()
//{
// TCHAR strTmpPath[100] = _T("");
// GetTempPath(100, strTmpPath);
// _tcscat(strTmpPath, _T("replacetext.his"));
//
// /* m_lstReplaceText.RemoveAll();
// std::ifstream in(strTmpPath);
// if (!(!in))
// {
// TCHAR line[256];
// in.getline(line, 255);
// if(!(!in))
// {
// m_lstReplaceText.AddTail(strnew(line));
// while(!(!in))
// {
// TCHAR line[256];
// in.getline(line, 255);
// if(!in)
// {
// break;
// }
// m_lstReplaceText.AddTail(strnew(line));
// for(int i = (m_lstReplaceText.GetCount() - 2); i >= 0; i--)
// {
// POSITION site = m_lstReplaceText.FindIndex(i);
// if (m_lstReplaceText.GetAt(site) == m_lstReplaceText.GetTail())
// {
// m_lstReplaceText.RemoveTail();
// break;
// }
// }
// }
// }
// }
// CComboBox* pComboReplace = (CComboBox*)GetDlgItem(IDC_COMBO_REPLACETEXT);
// pComboReplace->ResetContent();
// for (int i =0; i < m_lstReplaceText.GetCount(); i++)
// {
// POSITION site = m_lstReplaceText.FindIndex(i);
// pComboReplace->InsertString(i, m_lstReplaceText.GetAt(site));
// }
// pComboReplace->GetLBText(0, m_sReplaceText);*/
//
// int nNum=0;
// std::ifstream in(_AS(strTmpPath));
// while(!(!in)) {
// char line[256];
// in.getline(line, 255);
// if(!in) break;
// nNum++;
// if(nNum>MAXTEXTNUM) break;
// m_comboReplaceText.AddString(TString(line));
// }
// if (m_comboReplaceText.GetCount()>0) {
// m_comboReplaceText.GetLBText(0,m_sReplaceText);
// }
//}
//
//
////保存用作查找的字符串
//void CFindAndReplaceDlg::SaveFindText()
//{
//// if (m_sFindText.IsEmpty()) return;
// int len = m_comboFindText.GetCount();
// if (len <= 0) return;
//
// TCHAR strTmpPath[256] = _T("");
// GetTempPath(255, strTmpPath);
// _tcscat(strTmpPath, _T("findtext.his"));
//
///* std::ofstream out(strTmpPath);
// out << (const TCHAR*)m_sFindText << _T("\n");
// int len = m_lstFindText.GetCount();
// for( int i=0; i < len && i < MAXTEXTNUM; i++) {
// POSITION site = m_lstFindText.FindIndex(i);
// if (m_lstFindText.GetAt(site) != m_sFindText &&
// m_lstFindText.GetAt(site) != _T("")) {
// out << (const TCHAR*)m_lstFindText.GetAt(site) << _T("\n");
// }
// }*/
//
// std::ofstream out(_AS(strTmpPath));
// for( int i=0; i < len && i < MAXTEXTNUM-1; i++) {
// CString sText = _T("");
// m_comboFindText.GetLBText(i,sText);
// if (!sText.IsEmpty()) {
// out << (const char*)(_AS(sText)) << "\n";
// }
// }
//}
//
////保存用作替换的字符串
//void CFindAndReplaceDlg::SaveReplaceText()
//{
//// if (m_sReplaceText.IsEmpty()) return;
// int len = m_comboReplaceText.GetCount();
// if (len <= 0) return;
//
// TCHAR strTmpPath[256] = _T("");
// GetTempPath(255, strTmpPath);
// _tcscat(strTmpPath, _T("replacetext.his"));
//
///* std::ofstream out(strTmpPath);
// out << (const TCHAR*)m_sReplaceText << _T("\n");
// int len = m_lstReplaceText.GetCount();
// for( int i=0; i < len && i < MAXTEXTNUM; i++) {
// POSITION site = m_lstReplaceText.FindIndex(i);
// if (m_lstReplaceText.GetAt(site) != m_sReplaceText &&
// m_lstReplaceText.GetAt(site) != _T("")) {
// out << (const TCHAR*)m_lstReplaceText.GetAt(site) << _T("\n");
// }
// }*/
//
// std::ofstream out(_AS(strTmpPath));
// for( int i=0; i < len && i < MAXTEXTNUM-1; i++) {
// CString sText = _T("");
// m_comboReplaceText.GetLBText(i,sText);
// if (!sText.IsEmpty()) {
// out << (const char*)_AS(sText) << "\n";
// }
// }
//}
void CFindAndReplaceDlg::LoadText(TCHAR *pFileName, CComboBox &cmbText, CString &sText)
{
TCHAR strTmpPath[100] = _T("");
GetTempPath(100, strTmpPath);
_tcscat(strTmpPath, pFileName);
int nNum=0;
std::ifstream in(_AS(strTmpPath));
while(!(!in))
{
char line[256];
in.getline(line, 255);
if(!in) break;
nNum++;
if(nNum>MAXTEXTNUM) break;
cmbText.AddString(TString(line));
}
if (cmbText.GetCount()>0)
{
cmbText.GetLBText(0, sText);
}
}
void CFindAndReplaceDlg::SaveText(TCHAR *pFileName, CComboBox &cmbText)
{
int len = cmbText.GetCount();
if (len <= 0) return;
TCHAR strTmpPath[256] = _T("");
GetTempPath(255, strTmpPath);
_tcscat(strTmpPath, pFileName);
std::ofstream out(_AS(strTmpPath));
for( int i=0; i < len && i < MAXTEXTNUM-1; i++)
{
CString sText = _T("");
cmbText.GetLBText(i,sText);
if (!sText.IsEmpty())
{
out << (const char*)(_AS(sText)) << "\n";
}
}
}
// 初始化搜索
void CFindAndReplaceDlg::ResetFind()
{
UpdateData(TRUE);
m_bIsFindEnd = FALSE;
m_nTextNum = 0;
m_posFind = TTextPosition();
m_posStart = TTextPosition();
m_farUtil.ResetFind();
m_nCount = 0;
m_nFindCount = 0;
EnableReplace();
PickEntities();
SetDlgItemText(IDC_EDIT_RESULT, _T(""));
SetDlgItemText(IDC_BUTTON_FIND, _T("查找"));
}
// 从图中选取实体
void CFindAndReplaceDlg::PickEntities()
{
UpdateData(TRUE);
m_ssText.Free();
switch (m_iFindRange)
{
// 整个图形
case 0:
{
TRBList TextList(RTDXF0, GetFilterString(), NULL);
m_ssText.Get(_T("X"), NULL, NULL, TextList);
m_nTextNumAll = m_ssText.Length();
}
break;
// 当前空间/布局
case 1:
{
TCString sSpaceName;
TGGetVar(_T("CTAB"), sSpaceName);
TRBList TextList(RTDXF0, GetFilterString(), 410, sSpaceName, NULL);
m_ssText.Get(_T("X"), NULL, NULL, TextList);
m_nTextNumAll = m_ssText.Length();
}
break;
// 当前选择
case 2:
{
m_ssText += m_ssTextAll;
TRBList TextList(RTDXF0, GetFilterString(), NULL);
m_ssText.BaseFilter(TextList);
m_nTextNumAll = m_ssText.Length();
}
break;
default:
{
}
}
}
// 设置查找选项
void CFindAndReplaceDlg::SetFindOption()
{
UpdateData(TRUE);
DWORD dwMask = g_FindParser.GetFindOption();
dwMask = m_bIncrement && (m_iReplaceType == 2) ? (dwMask | FP_INCREMENT) : (dwMask & ~FP_INCREMENT);
dwMask = m_bCaseSencitive ? (dwMask | FP_MATCH_CASE) : (dwMask & ~FP_MATCH_CASE);
dwMask = m_bWordMatch ? (dwMask | FP_WHOLE_WORD) : (dwMask & ~FP_WHOLE_WORD);
dwMask = m_bWildcards ? (dwMask | FP_WILDCARD) : (dwMask & ~FP_WILDCARD);
dwMask = m_bWidthSensitive ?(dwMask | FP_WORD_WIDTH) : (dwMask & ~FP_WORD_WIDTH);
g_FindParser.SetFindOption(dwMask);
// 设置对块的搜索方式
m_farUtil.SetFindOption(m_bBlkAttrib, m_bSearchBlock, m_bSearchXref, m_bNoHidden);
}
// 控制替换按钮是否可用
void CFindAndReplaceDlg::EnableReplace()
{
UpdateData(TRUE);
bool bEnable = false;
switch (m_iReplaceType)
{
case 0:
bEnable = !!m_bReplace;
break;
case 1:
bEnable = m_bPrefix || m_bSuffix;
break;
case 2:
bEnable = !!m_bIncrement;
break;
}
GetDlgItem(IDC_BUTTON_REPLACEALL)->EnableWindow(bEnable);
bEnable = bEnable && (m_nFindCount != 0) && !m_bIsFindEnd;
GetDlgItem(IDC_BUTTON_REPLACE)->EnableWindow(bEnable);
}
// 设置控件是否显示
void CFindAndReplaceDlg::SetCtrlsVisible()
{
UpdateData(TRUE);
int iCmdShow = (m_iReplaceType == 0) ? SW_SHOW : SW_HIDE;
GetDlgItem(IDC_CHK_REPLACE)->ShowWindow(iCmdShow);
GetDlgItem(IDC_COMBO_REPLACETEXT)->ShowWindow(iCmdShow);
GetDlgItem(IDC_BTN_REPLACE)->ShowWindow(iCmdShow);
iCmdShow = (m_iReplaceType == 1) ? SW_SHOW : SW_HIDE;
GetDlgItem(IDC_CHK_PREFIX)->ShowWindow(iCmdShow);
GetDlgItem(IDC_CMB_PREFIX)->ShowWindow(iCmdShow);
GetDlgItem(IDC_CHK_SUFFIX)->ShowWindow(iCmdShow);
GetDlgItem(IDC_CMB_SUFFIX)->ShowWindow(iCmdShow);
iCmdShow = (m_iReplaceType == 2) ? SW_SHOW : SW_HIDE;
GetDlgItem(IDC_CHK_INCREMENT)->ShowWindow(iCmdShow);
GetDlgItem(IDC_CMB_INCREMENT)->ShowWindow(iCmdShow);
}
// 更新控件
void CFindAndReplaceDlg::EnableCtrls()
{
UpdateData(TRUE);
GetDlgItem(IDC_COMBO_FINDTEXTS)->EnableWindow(m_bFind);
GetDlgItem(IDC_BTN_FIND)->EnableWindow(m_bFind);
GetDlgItem(IDC_COMBO_REPLACETEXT)->EnableWindow(m_bReplace);
GetDlgItem(IDC_BTN_REPLACE)->EnableWindow(m_bReplace);
GetDlgItem(IDC_CMB_PREFIX)->EnableWindow(m_bPrefix);
GetDlgItem(IDC_CMB_SUFFIX)->EnableWindow(m_bSuffix);
GetDlgItem(IDC_CHK_INCREMENT)->EnableWindow(m_bFind);
GetDlgItem(IDC_CMB_INCREMENT)->EnableWindow(m_bFind && m_bIncrement);
GetDlgItem(IDC_CHK_CASESENSITIVE)->EnableWindow(m_bFind);
GetDlgItem(IDC_CHK_WORDMATCH)->EnableWindow(m_bFind);
GetDlgItem(IDC_CHK_WILDCARDS)->EnableWindow(m_bFind);
GetDlgItem(IDC_BTN_WILDCARDS)->EnableWindow(m_bFind);
GetDlgItem(IDC_CHK_SEARCHXREF)->EnableWindow(m_bFind);
GetDlgItem(IDC_CHK_SEARCHBLOCK)->EnableWindow(m_bFind);
GetDlgItem(IDC_CHK_NOHIDDEN)->EnableWindow(m_bFind);
GetDlgItem(IDC_CHK_WIDTHSENSITIVE)->EnableWindow(m_bFind);
if (m_bIncrement && GetDlgItem(IDC_CHK_INCREMENT)->IsWindowEnabled() && m_iReplaceType == 2)
{
SetDlgItemText(IDC_CHK_SEARCH, _T("起始编号:"));
GetDlgItem(IDC_CHK_WORDMATCH)->EnableWindow(false);
((CButton*)GetDlgItem(IDC_CHK_WORDMATCH))->SetCheck(BST_CHECKED);
GetDlgItem(IDC_CHK_WILDCARDS)->EnableWindow(false);
((CButton*)GetDlgItem(IDC_CHK_WILDCARDS))->SetCheck(BST_UNCHECKED);
GetDlgItem(IDC_BTN_WILDCARDS)->EnableWindow(false);
}
else
{
SetDlgItemText(IDC_CHK_SEARCH, _T("查找内容:"));
}
EnableReplace();
}
bool CFindAndReplaceDlg::PickText(CString &sText)
{
HideDialog(TRUE);
Entity ent;
RBList mask(RTDXF0,_T("TCH_*,TEXT"),NULL);
XPoint pt;
if(SelectEntity(_T("\n屏幕拾取文字内容:"),ent,pt,mask) != RTNORM)
{
HideDialog(FALSE);
return false;
}
PickSet ss(SS_FREE);
ss+=ent;
TSubText* pSubText = HitTestOnText(ss,Ucs2Wcs(pt));
if(pSubText!=NULL)
{
sText = pSubText->GetText();
delete pSubText;
UpdateData(FALSE);
}
HideDialog(FALSE);
return true;
}
// 获得过滤字符串
CString CFindAndReplaceDlg::GetFilterString()
{
if (!m_strDefaultFilter.IsEmpty())
return m_strDefaultFilter;
UpdateData(TRUE);
CString sFilter;
// 查找外部参照
if (m_bSearchXref)
{
sFilter += _T("INSERT,");
}
// 查找块
if (m_bSearchBlock)
{
sFilter += _T("INSERT,AEC_BLOCK_INSERT,");
}
// 查找xml文件中的设置
for (int i = 0; i < m_lstStyle.GetItemCount(); i++)
{
if (m_lstStyle.GetItemText(i, 0) == _T("块属性值"))
{
m_bBlkAttrib = m_lstStyle.GetCheck(i);
}
if (m_lstStyle.GetCheck(i))
{
sFilter += m_lstStyle.GetItemText(i, 1);
}
}
return sFilter;
}
// 获得搜索字符串
bool CFindAndReplaceDlg::GetFindText(CString &sFind)
{
UpdateData(TRUE);
// 如果“查找内容”文本框可用,不允许输入为空
if (((CButton*)GetDlgItem(IDC_CHK_SEARCH))->GetCheck())
{
if (m_sFindText.IsEmpty())
{
// 以红色进行提示
m_crPrompt = RGB(255, 0, 0);
SetDlgItemText(IDC_EDIT_RESULT, _T("查找内容不能为空!"));
return false;
}
else
{
sFind = m_sFindText;
}
}
return true;
}
// 获得替换字符串
bool CFindAndReplaceDlg::GetReplaceText(CString &sReplace)
{
UpdateData(TRUE);
switch (m_iReplaceType)
{
case 0:
{
// 如果“替换为”文本框可用,直接使用用户输入的文字
if (m_bReplace)
sReplace = m_sReplaceText;
else
return false;
}
break;
case 1:
{
// 如果进行增量替换,使用搜索到的文本加前/后缀
if (m_bPrefix || m_bSuffix)
{
// 前后缀为空时不进行操作
if (m_sSuffixText.IsEmpty()
&& m_sPrefixText.IsEmpty())
{
return false;
}
// 程序默认始终在字串的起始端和末尾端添加前后缀
sReplace = g_FindParser.GetDestString();
if (m_bPrefix)
{
sReplace = m_sPrefixText + sReplace;
}
if (m_bSuffix)
{
sReplace += m_sSuffixText;
}
m_posFind.m_nTextPos = 0;
m_posFind.m_nBufLen = g_FindParser.GetDestString().GetLength();
}
else
return false;
}
break;
case 2:
{
// 如果进行增量替换,使用搜索到的文本加增量
if (m_bIncrement)
{
// 增量输入不是数字,停止操作
if (!IsNumber(m_sIncrementText))
{
m_crPrompt = RGB(255, 0, 0);
SetDlgItemText(IDC_EDIT_RESULT, _T("请输入数字增量!"));
return false;
}
CString sSymble;
CString sNumber;
g_FindParser.DivideString(g_FindParser.GetResult(), sSymble, sNumber);
CString sSum;
sSum.Format(_T("%f"), _tstof(sNumber) + _tstof(m_sIncrementText));
int iMaxAccu = max(GetAccuracy(sNumber), GetAccuracy(m_sIncrementText));
int iAccu = GetAccuracy(sSum);
if (iMaxAccu < iAccu)
{
sSum = sSum.Mid(0, sSum.GetLength() + iMaxAccu - iAccu);
}
sReplace = sSymble + sSum;
}
else
return false;
}
break;
default:
return false;
}
return true;
}
bool CFindAndReplaceDlg::IsNumber(LPCTSTR pszNumber, bool bDot, bool bNeg) const
{
CString sInput(pszNumber);
short nLength = sInput.GetLength();
if (0 >= nLength)
{
return false;
}
if (sInput.GetAt(0) == _T('.'))
{
return false;
}
TCHAR chTemp;
bool bExistDot = false;
for (short i = 0; i < nLength; i++)
{
chTemp = sInput.GetAt(i);
if (chTemp < _T('0') || chTemp > _T('9'))
{
if (bDot && _T('.') == chTemp && !bExistDot)
{
bExistDot = true;
}
else if (!(bNeg && 0 == i && _T('-') == chTemp))
{
return false;
}
}
}
return true;
}
// 获得一个数字字符串的小数点位数
int CFindAndReplaceDlg::GetAccuracy(const CString& sNumber) const
{
int iPos = sNumber.ReverseFind(_T('.'));
if (iPos < 0)
{
return 0;
}
else
{
return sNumber.GetLength() - iPos;
}
}
// End
BOOL CFindAndReplaceDlg::PreTranslateMessage(MSG* pMsg)
{
m_wndToolTip.RelayEvent(pMsg);
// Zyu add on 101101,保存在查找/替换组合框文本高亮选中的位置
if (pMsg->message == WM_LBUTTONUP
|| pMsg->message == WM_KEYUP)
{
CWnd* pWnd = this->GetFocus();
if (NULL != pWnd)
{
int iId = pWnd->GetDlgCtrlID();
if (iId == IDC_COMBO_FINDTEXTS
|| iId == IDC_COMBO_REPLACETEXT)
{
m_dwPosFind = m_comboFindText.GetEditSel();
m_dwPosReplace = m_comboReplaceText.GetEditSel();
}
}
}
return WGroupDlg::PreTranslateMessage(pMsg);
}
void CFindAndReplaceDlg::OnDestroy()
{
m_wndToolTip.DestroyWindow();
WGroupDlg::OnDestroy();
delete this;
pDlg = NULL;
}
// Zyu modify on 100919,统一成向组合框中插入文本的函数
// Begin
/*
void CFindAndReplaceDlg::InsertFindText()
{
if (m_sFindText.IsEmpty()) return;
int nPos = m_comboFindText.FindString(-1,m_sFindText);
int nCount = m_comboFindText.GetCount();
if (nPos==CB_ERR) {
if (nCount >= MAXTEXTNUM) {
m_comboFindText.DeleteString(MAXTEXTNUM-1);
}
m_comboFindText.InsertString(0,m_sFindText);
}
else {
if (nPos>=0 && nPos<nCount) {
m_comboFindText.DeleteString(nPos);
m_comboFindText.InsertString(0,m_sFindText);
m_comboFindText.GetLBText(0,m_sFindText);
UpdateData(FALSE);
}
}
}
void CFindAndReplaceDlg::InsertReplaceText()
{
if (m_sReplaceText.IsEmpty()) return;
int nPos = m_comboReplaceText.FindString(-1,m_sReplaceText);
int nCount = m_comboReplaceText.GetCount();
if (nPos==CB_ERR) {
if (nCount >= MAXTEXTNUM) {
m_comboReplaceText.DeleteString(MAXTEXTNUM-1);
}
m_comboReplaceText.InsertString(0,m_sReplaceText);
}
else {
if (nPos>=0 && nPos<nCount) {
m_comboReplaceText.DeleteString(nPos);
m_comboReplaceText.InsertString(0,m_sReplaceText);
m_comboReplaceText.GetLBText(0,m_sReplaceText);
UpdateData(FALSE);
}
}
}
*/
void CFindAndReplaceDlg::InsertText(CString &sText, CComboBox &cmbText)
{
if (sText.IsEmpty()) return;
int nPos = cmbText.FindStringExact(-1,sText);
int nCount = cmbText.GetCount();
if (nPos==CB_ERR)
{
if (nCount >= MAXTEXTNUM)
{
cmbText.DeleteString(MAXTEXTNUM-1);
}
cmbText.InsertString(0, sText);
}
else
{
if (nPos>=0 && nPos<nCount)
{
cmbText.DeleteString(nPos);
cmbText.InsertString(0,sText);
cmbText.GetLBText(0,sText);
UpdateData(FALSE);
}
}
}
void CFindAndReplaceDlg::OnCancel()
{
UpdateData(TRUE);
// Zyu modify on 100919,使用统一的读写文件函数
//SaveFindText();
//SaveReplaceText();
SaveText((LPTSTR)_T("findtext.his"), m_comboFindText);
SaveText((LPTSTR)_T("replacetext.his"), m_comboReplaceText);
SaveText((LPTSTR)_T("prefixtext.his"), m_cmbPrefix);
SaveText((LPTSTR)_T("suffixtext.his"), m_cmbSuffix);
SaveText((LPTSTR)_T("incrementtext.his"), m_cmbIncrement);
// Zyu add on 100925,保存文字类型的选择状态
m_xmlReader.SaveToXML();
CDialog::OnCancel();
DestroyWindow();
}
void CFindAndReplaceDlg::OnClose()
{
WGroupDlg::OnClose();
DestroyWindow();
}
//命令函数(查找和替换字符串)
void FindAndReplace()
{
CTemporaryResourceOverride vTemp;
CFindAndReplaceDlg dlg;
if (pDlg == NULL)
{
pDlg = new CFindAndReplaceDlg;
pDlg->Create(CFindAndReplaceDlg::IDD, acedGetAcadFrame());
}
pDlg->ShowWindow(SW_SHOW);
// dlg.DoModal();
// acedRedraw(NULL,1);
}