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

5422 lines
133 KiB
C++

// InsTextDlg.cpp : implementation file
//
#include "stdafx.h"
#include "InsTextDlg.h"
#include "xtext.h"
#include "TgAs.h"
#define IDC_TEMP 1000
#define IDR_NEW 1001
#define IDR_INS 1002
#define IDR_DEL 1003
#define IDR_MOD 1004
#define VK_N 0x4e
const TCHAR *c_szLate = {_T("最近使用的词")};
const TCHAR *c_szAll = {_T("全部词汇")};
const TCHAR *c_szName = _T("name");
const TCHAR *c_szCatalog = _T("目录");
const TCHAR *c_szLemma = _T("词条");
const TCHAR *c_szTDWord = _T("上华词库");
static CString m_szType = c_szLate;
static CString m_szName = _T("");
static CXMLNodeInfo g_xmlListLastInfo;
static CXMLNodeInfo g_xmlTreeLastInfo;
static BOOL g_bSort = FALSE;
////////////////////////////////
#define ID_INS_DRAWING 1
#define ID_DEL_DRAWING 2
#define ID_OPEN_DRAWING 3
#define ID_ADD_DRAWING 4
#define ID_NEW_COLLECT 5
#define ID_DEL_COLLECT 6
#define ID_REN_COLLECT 7
#define ID_EXPAND_COLLECT 8
#define ID_COLLAPSE_COLLECT 9
#define ID_ADD_CHILD_COLLECT 10
#define ID_ADD_CHILD_LEMMA 11
#define ID_EXPAND_WORKS 12
#define ID_COLLAPSE_WORKS 13
#define IDC_PROJECT_COMBO 14
#define ID_CUR_PROJECT 15
#define ID_NEW_PROJECT 16
#define ID_OPEN_PROJECT 17
#define ID_SET_PROJECT 18
#define ID_RECENT_PROJECT 19
#define ID_IMPORT_FLOOR 20
#define ID_EXPORT_FLOOR 21
#define ID_SAVE_PROJECT 22
#define ID_RECENT1 23
#define ID_RECENT2 24
#define ID_RECENT3 25
#define ID_RECENT4 26
#define ID_RECENT5 27
#define ID_RECENT6 28
#define ID_RECENT7 29
#define ID_RECENT8 30
#define RECENT_MAX_NUM 8
// add by xly On 101213 设置文字对象的图层切换属性
extern TARCH_IMPEXP BOOL g_bTextDefaultLayer;
Adesk::Boolean acedPostCommand(const TCHAR * );
////////////////////////////////////////////////////
// CEditForListBox
CEditForListBox::CEditForListBox()
{
m_pItemData = NULL;
}
CEditForListBox::~CEditForListBox()
{
}
void CEditForListBox::PostNcDestroy()
{
delete this;
}
BOOL CEditForListBox::PreTranslateMessage(MSG *pMsg)
{
BOOL bRet=CEdit::PreTranslateMessage(pMsg);
if(pMsg->message == WM_KEYDOWN)
{
if(pMsg->wParam == VK_RETURN)
{
GetParent()->SetFocus();
return TRUE;
}
}
return bRet;
}
BEGIN_MESSAGE_MAP(CEditForListBox, CEdit)
ON_WM_KILLFOCUS()
END_MESSAGE_MAP()
void CEditForListBox::OnKillFocus(CWnd* pNewWnd)
{
CEdit::OnKillFocus(pNewWnd);
CString szOld, szNew;
GetWindowText(szNew);
CExtendListBox *pListBox = (CExtendListBox *)GetParent();
int iCurSel = pListBox->GetCurSel();
pListBox->GetText(iCurSel, szOld);
void *dataPtr = pListBox->GetItemDataPtr(iCurSel);
int iRet = pListBox->FindStringExact(-1, szNew);
if(iRet == LB_ERR)//新名称未用
{
if(szNew==_T(""))//不发生变化
MessageBox(_T("名称不能为空!"));
else if(UString(szNew).Length()>25)
MessageBox(_T("名称最长为25个字符!"));
else
{
int iPos;
if(m_pItemData!=NULL)
{
iPos = m_pItemData->lstNames.FindData(CNameString(szOld));
CString& szNameString=m_pItemData->lstNames(iPos);
szNameString=szNew;
}
pListBox->DeleteString(iCurSel);
pListBox->InsertString(iCurSel, szNew);
pListBox->SetItemDataPtr(iCurSel, dataPtr);
iCurSel = pListBox->FindStringExact(-1, szNew);
if(iCurSel>=0&&iCurSel<pListBox->GetCount())
pListBox->SetCurSel(iCurSel);
}
}
else//新名称被占用
{
if(iRet!=iCurSel)//不发生变化
MessageBox(CString(_T("<"))+szNew+_T(">项已经存在!"));;
}
DestroyWindow();
}
void CEditForListBox::SetExtentData(CListBoxItemData *&pItemData)
{
m_pItemData = pItemData;
}
//////////////////////////////////////////////////////////////////
// CExtendListBox
IMPLEMENT_DYNAMIC(CExtendListBox, CDragListBox)
CExtendListBox::CExtendListBox(int iFlag)
{
m_iFlag = iFlag;
m_bModified = TRUE;
m_pItemData = NULL;
}
CExtendListBox::~CExtendListBox()
{
}
CString CExtendListBox::CreateNewName()
{
CString sName=_T("新名称");
long count=1;
for(long i=0;i<GetCount();i++)
{
CString temp;
GetText(i,temp);
if(temp.Find(sName)>=0)
{
sName.Format(_T("新名称%d"),count++);
i=-1;
}
}
return sName;
}
BEGIN_MESSAGE_MAP(CExtendListBox, CDragListBox)
ON_WM_KEYDOWN()
ON_WM_RBUTTONDOWN()
ON_WM_LBUTTONDOWN()
ON_COMMAND_RANGE(IDR_NEW, IDR_MOD, OnMenuCommand)
END_MESSAGE_MAP()
void CExtendListBox::OnLButtonDown(UINT nFlags,CPoint point)
{
CDragListBox::OnLButtonDown(nFlags,point);
}
// CExtendListBox 消息处理程序
void CExtendListBox::OnRButtonDown(UINT nFlags, CPoint point)
{
if(point.x<1||point.y<=1)
return;
SetFocus();
CDragListBox::OnRButtonDown(nFlags, point);
if(!m_bModified)
return;
BOOL bOutSide;
int iHit = ItemFromPoint(point, bOutSide);
if(!bOutSide)
SetCurSel(iHit);
int iCurSel = GetCurSel();
CMenu popup;
popup.CreatePopupMenu();
if(m_iFlag == 0)
{
popup.AppendMenu(MF_STRING, IDR_NEW, _T("新建类别(N)"));
CString szText;
GetText(iCurSel, szText);
if(iHit != -1 && _tcscmp(szText, c_szAll) != 0 && _tcscmp(szText, c_szLate) != 0)
{
popup.AppendMenu(MF_STRING, IDR_INS, _T("插入类别(Ins)"));
popup.AppendMenu(MF_STRING, IDR_DEL, _T("删除类别(Del)"));
popup.AppendMenu(MF_STRING, IDR_MOD, _T("重命名(F2)"));
}
}
else
{
popup.AppendMenu(MF_STRING, IDR_NEW, _T("新建行(N)"));
if(iCurSel != -1)
{
popup.AppendMenu(MF_STRING, IDR_INS, _T("插入行(Ins)"));
popup.AppendMenu(MF_STRING, IDR_DEL, _T("删除行(Del)"));
popup.AppendMenu(MF_STRING, IDR_MOD, _T("重命名(F2)"));
}
}
ClientToScreen(&point);
popup.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
}
void CExtendListBox::OnMenuCommand(UINT id)
{
switch(id)
{
case IDR_INS:
DoInsertItem();
break;
case IDR_NEW:
DoAppendItem();
break;
case IDR_DEL:
DoDeleteItem();
break;
case IDR_MOD:
DoModifyItem();
break;
}
}
void CExtendListBox::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CDragListBox::OnKeyDown(nChar, nRepCnt, nFlags);
if(!m_bModified)
return;
BOOL bPop = FALSE;
int iCurSel = GetCurSel();
if(iCurSel == -1)
bPop = TRUE;
else
{
if(m_iFlag == 0)
{
CString szText;
GetText(iCurSel, szText);
if(_tcscmp(szText, c_szAll) == 0 || _tcscmp(szText, c_szLate) == 0)
bPop = TRUE;
}
}
if(bPop)
{
if(nChar == VK_N)
DoAppendItem();
}
else
{
if(nChar == VK_DELETE)
DoDeleteItem();
else if(nChar == VK_INSERT)
DoInsertItem();
else if(nChar == VK_N)
DoAppendItem();
else if(nChar == VK_F2)
DoModifyItem();
}
}
void CExtendListBox::CreateEdit()
{
int iCurSel = GetCurSel();
CRect rect;
GetItemRect(iCurSel, rect);
rect.bottom += 2;
rect.top -= 2;
int iStyle = WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL | ES_WANTRETURN;
CTemporaryResourceOverride vTmp;
CEditForListBox *pEdit = new CEditForListBox;
if(!pEdit->Create(iStyle, rect, this, IDC_TEMP))
return;
CString szOld;
GetText(iCurSel, szOld);
pEdit->SetFont(GetFont());
pEdit->SetWindowText(szOld);
pEdit->SetFocus();
pEdit->SetSel(0, -1);
if(m_iFlag != 0)
pEdit->SetExtentData(m_pItemData);
}
void CExtendListBox::DoDeleteItem()
{
int iCurSel = GetCurSel();
if(m_iFlag == 0)
{
if(MessageBox(_T("这将删除该类别下所有文字,是否删除?"), _T("提示"), MB_OKCANCEL|MB_ICONQUESTION) != IDOK)
return;
CListBoxItemData *pItemData = (CListBoxItemData *)GetItemDataPtr(iCurSel);
if(pItemData==0)
delete pItemData;
}
else
{
if(m_pItemData != NULL)
{
CString szText;
GetText(iCurSel, szText);
m_pItemData->lstNames.FindDataAndDel(CNameString(szText));
}
}
DeleteString(iCurSel);
int iCount = GetCount();
if(iCurSel >= iCount)
iCurSel = iCount - 1;
SetCurSel(iCurSel);
}
void CExtendListBox::DoInsertItem()
{
int iCurSel = GetCurSel();
CString sNewName= CreateNewName();
if(m_iFlag == 0)
{
InsertString(iCurSel,sNewName);
CListBoxItemData *pItemData = new CListBoxItemData;
SetItemDataPtr(iCurSel, pItemData);
}
else
{
if(m_pItemData!= NULL)
{
CString szText;
GetText(iCurSel, szText);
int iPos = m_pItemData->lstNames.FindData(CNameString(szText));
m_pItemData->lstNames.Insert(iPos, new CNameString(sNewName));
InsertString(iCurSel, sNewName);
}
}
int iCount = GetCount();
if(iCurSel >= iCount)
iCurSel = iCount - 1;
SetCurSel(iCurSel);
CreateEdit();
}
void CExtendListBox::DoAppendItem()
{
int iCurSel = GetCount();
CString sNewName= CreateNewName();
InsertString(iCurSel,sNewName);
if(m_iFlag == 0)
{
CListBoxItemData *pItemData = new CListBoxItemData;
SetItemDataPtr(iCurSel, pItemData);
}
else
{
if(m_pItemData!=NULL)
m_pItemData->lstNames.Insert(iCurSel, new CNameString(sNewName));
}
SetCurSel(iCurSel);
CreateEdit();
}
void CExtendListBox::DoModifyItem()
{
CreateEdit();
}
void CExtendListBox::SetModify(BOOL bModified)
{
m_bModified = bModified;
}
BOOL CExtendListBox::GetModify()
{
return m_bModified;
}
void CExtendListBox::SetExtendData(CListBoxItemData *&pItemData)
{
if(m_iFlag != 0)
m_pItemData = pItemData;
}
int CExtendListBox::SetCurSel(int nSelect)
{
int nRet = CDragListBox::SetCurSel(nSelect);
if(m_iFlag == 0)
((CInsTextDlg*)GetParent())->OnLbnSelchangeDragType();
else
((CInsTextDlg*)GetParent())->OnLbnSelchangeName();
return nRet;
}
void CExtendListBox::PreSubclassWindow()
{
if(m_iFlag!=2)
CDragListBox::PreSubclassWindow();
else
CListBox::PreSubclassWindow();
}
BOOL CExtendListBox::OnChildNotify(UINT nMessage, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
if(m_iFlag != 2 && m_bModified)
return CDragListBox::OnChildNotify(nMessage, wParam, lParam, pResult);
else
return CListBox::OnChildNotify(nMessage, wParam, lParam, pResult);
}
//add by whl
CNameString* CExtendListBox::FindNameString(CString szName)
{
if(m_pItemData==NULL)
return NULL;
long iPos=m_pItemData->lstNames.FindData(CNameString(szName));
return iPos==NOT_FOUND?NULL:m_pItemData->lstNames[iPos];
}
void CExtendListBox::Dropped(int nSrcIndex,CPoint pt)
{
CDragListBox::Dropped(nSrcIndex,pt);
if(nSrcIndex!=-1&&m_pItemData!=NULL)
{
int nDestIndex = ItemFromPt(pt);
if (nDestIndex != -1)
m_pItemData->lstNames.Move(nSrcIndex,nDestIndex);
}
}
///////////////////////////////////////////////////////////////////
// CInsTextDlg 对话框
IMPLEMENT_DYNAMIC(CInsTextDlg, CModelessDialog)
CInsTextDlg::CInsTextDlg(CWnd* pParent /*=NULL*/)
: CModelessDialog(CInsTextDlg::IDD, pParent)
, m_dragNames(1)
, m_sortNames(2),m_bSingleLineText(FALSE)
{
m_bEditChanged = FALSE;
}
CInsTextDlg::CInsTextDlg(UINT IDD, CWnd* pParent /*=NULL*/)
: CModelessDialog(IDD, pParent)
, m_dragNames(1)
, m_sortNames(2),m_bSingleLineText(FALSE)
{
m_bEditChanged = FALSE;
}
CInsTextDlg::~CInsTextDlg()
{
//对话框销毁时对文档进行保存关闭
if (m_pXMlDoc)
{
m_pXMlDoc->Save();
delete m_pXMlDoc;
}
}
void CInsTextDlg::DoDataExchange(CDataExchange* pDX)
{
CModelessDialog::DoDataExchange(pDX);
// DDX_Control(pDX, IDC_DRAG_TYPE, m_dragTypes);
DDX_Control(pDX, IDC_DRAG_NAME, m_dragNames);
DDX_Control(pDX, IDC_SORT_NAME, m_sortNames);
DDX_Control(pDX, IDC_EDIT_SEARCH, m_editSearch);
DDX_Control(pDX, IDC_ADDTOLIB, m_buttonAdd);
DDX_Control(pDX,IDC_INPUTTOLIB,m_buttonInput);
DDX_Control(pDX, IDC_TREE, m_treeNames);
}
BEGIN_MESSAGE_MAP(CInsTextDlg, CModelessDialog)
// ON_LBN_SELCHANGE(IDC_DRAG_TYPE, OnLbnSelchangeDragType)
ON_LBN_SELCHANGE(IDC_DRAG_NAME, OnLbnSelchangeName)
ON_LBN_SELCHANGE(IDC_SORT_NAME, OnLbnSelchangeName)
ON_EN_CHANGE(IDC_EDIT_SEARCH, OnEnChangeEditSearch)
ON_LBN_DBLCLK(IDC_DRAG_NAME, OnLbnDblclkListName)
ON_LBN_DBLCLK(IDC_SORT_NAME, OnLbnDblclkListName)
ON_COMMAND_RANGE(ID_BUTTON_A, ID_BUTTON_Z, OnSelectLetter)
ON_BN_CLICKED(IDC_ADDTOLIB, OnBnClickedAddtolib)
ON_BN_CLICKED(IDC_INPUTTOLIB, OnBnClickedInputtolib)
ON_WM_DESTROY()
ON_WM_CLOSE()
ON_WM_SIZE()
ON_WM_NCHITTEST()
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE, OnTvnSelchangedTree)
ON_MESSAGE(TARCH_TEXTLIB_MSG_NEW,OnNewLine)
ON_MESSAGE(TARCH_TEXTLIB_MSG_INSERT,OnInSertLine)
ON_MESSAGE(TARCH_TEXTLIB_MSG_RENAME,OnReNameLine)
ON_MESSAGE(TARCH_TEXTLIB_MSG_DELETE,OnDeleteLine)
ON_BN_CLICKED(IDC_BTN_INLIB, OnBnClickedBtnInlib)
END_MESSAGE_MAP()
#if ADS<17
UINT CInsTextDlg::OnNcHitTest(CPoint point)
#else
LRESULT CInsTextDlg::OnNcHitTest(CPoint point)
#endif
{
// Zyu modify on 100726,去掉编译警告
//UINT id = CModelessDialog::OnNcHitTest(point);
UINT id = (UINT)CModelessDialog::OnNcHitTest(point);
if(id==HTLEFT||id==HTRIGHT)
return HTCLIENT;
if(id==HTTOPLEFT||id==HTTOPRIGHT)
return HTTOP;
else if(id==HTBOTTOMLEFT||id==HTBOTTOMRIGHT)
return HTBOTTOM;
else
return id;
}
void CInsTextDlg::OnClose()
{
CModelessDialog::OnClose();
}
void CInsTextDlg::DoDeleteItem()
{
CArchTextLibListBox &listBox = m_bSort ? m_sortNames : m_dragNames;
int iCurSel = listBox.GetCurSel();
if (iCurSel<0)
{
return;
}
CXMLNodeInfo *pData = (CXMLNodeInfo*)(listBox.GetItemData(iCurSel));
if (pData)
{
if (pData->m_strNodeXPath!=_T(""))
{
if (m_pXMlDoc)
{
CXMLDOMNodePtr pXMLDOMNodePtr = m_pXMlDoc->SelectSingleNode(pData->m_strNodeXPath);
pXMLDOMNodePtr->DeleteNode();
}
}
}
listBox.DeleteStringEx(iCurSel);
iCurSel = iCurSel -1;
if (iCurSel<0)
{
iCurSel = 0;
}
listBox.SetCurSel(iCurSel);
}
void CInsTextDlg::OnBnClickedInputtolib()
{
m_editSearch.GetWindowText(m_szName);
if(m_szName == _T(""))
{
return;
}
CString strName;
if(m_szName.Find(_T("\n"))>=0||m_szName.Find(_T("\r"))>=0)// 多行文字
{
if (m_szName.Find(_T("\n"))>=0)
{
strName = m_szName.Mid(0,m_szName.Find(_T("\n")));
if (strName.GetLength()>20)
{
strName = strName.Mid(0,20);
}
}
else
{
if (m_szName.Find(_T("\r"))>=0)
{
strName = m_szName.Mid(0,m_szName.Find(_T("\n")));
if (strName.GetLength()>20)
{
strName = strName.Mid(0,20);
}
}
}
}
else
{
if (m_szName.GetLength()>20)
{
strName = m_szName.Mid(0,20);
}
else
{
strName = m_szName;
}
}
CArchTextLibListBox &listBox = m_bSort ? m_sortNames : m_dragNames;
int iCurSel = listBox.GetCurSel();
if (iCurSel>0||iCurSel==0)
{
CXMLNodeInfo *pData = (CXMLNodeInfo*)(listBox.GetItemData(iCurSel));
CString szName;
int nCount = 1;
if (pData&&pData->m_strNodeXPath!=_T(""))
{
if (m_pXMlDoc)
{
CXMLDOMNodePtr pXMLDOMNodePtr = m_pXMlDoc->SelectSingleNode(pData->m_strNodeXPath);
CXMLDOMNodePtr pFather = pXMLDOMNodePtr->GetParentNode();
if (!m_szName.CompareNoCase(pData->m_strNodeValue))
{
if (pData->m_strNodeValue.GetLength()>20)
{
szName = pData->m_strNodeValue.Mid(0,20);
}
else
{
szName = pData->m_strNodeValue;
}
}
else
{
if (pData->m_strNodeValue.GetLength()>20)
{
szName = pData->m_strNodeAttributeValue.Mid(0,20);
}
else
{
szName = pData->m_strNodeAttributeValue;
}
}
if (!strName.CompareNoCase(szName))
{
while (1)
{
BOOL bFlag = FALSE;
szName.Format(_T("(%d)"), nCount);
szName = strName+szName;
if (pFather->HasChildNodes())
{
CString strNodeName = pFather->GetNodeName();
CXMLDOMNodesPtr pXMLDOMNodeList = pFather->GetChildrenNodes(strNodeName);
int nNum = pXMLDOMNodeList->GetCount();
int i = 0;
for (i = 0;i < nNum;i++)
{
CXMLDOMNodePtr pTem = pXMLDOMNodeList->GetItem(i);
CString strAttriName = pTem->GetAttributeName();
CString strAttriValue = pTem->GetAttributeValue(strAttriName);
if (szName == strAttriValue)
{
bFlag = TRUE;
nCount++;
break;
}
}
}
if (!bFlag)
{
break;
}
}
}
else
{
szName = strName;
}
CXMLNodeInfo TempInfo;
TempInfo.m_bLeafNode = TRUE;
TempInfo.m_strNodeName = c_szLemma/*_T("词条")*/;
TempInfo.m_strNodeAttributeName =c_szName/* _T("name")*/;
TempInfo.m_strNodeAttributeValue = szName;
TempInfo.m_strNodeValue = m_szName;
CXMLDOMNodePtr pInsert = pFather->AppendNode(TempInfo.m_strNodeName,_T(""),TempInfo.m_strNodeAttributeName,
TempInfo.m_strNodeAttributeValue);
pInsert->SetNodeValue(m_szName);
CXMLDOMNodePtr PClone(new CXMLDOMNode(NULL ));
CXMLDOMNodePtr PTemptr(new CXMLDOMNode(NULL ));
pInsert->CloneNode(PClone);
pXMLDOMNodePtr->InsertAfter(PClone,PTemptr);
pInsert->DeleteNode();
m_pXMlDoc->GetCurNodeXPath(PTemptr,TempInfo.m_strNodeXPath);
listBox.InsertStringEx(iCurSel,&TempInfo);
int iCount = listBox.GetCount();
if(iCurSel >= iCount)
iCurSel = iCount - 1;
listBox.SetCurSel(iCurSel);
listBox.CreateEdit();
}
}
}
else
{
if (m_pXMlDoc)
{
CXMLNodeInfo xmlDocInfo;
CXMLDOMNodePtr pInsert(new CXMLDOMNode(NULL));
HTREEITEM hItem = m_treeNames.GetSelectedItem();
if (hItem!=NULL)
{
CXMLNodeInfo *pData = (CXMLNodeInfo*)m_treeNames.GetItemData(hItem);
if (pData&&pData->m_strNodeXPath!=_T(""))
{
CXMLDOMNodePtr pXMLDOMNodePtr = m_pXMlDoc->SelectSingleNode(pData->m_strNodeXPath);
xmlDocInfo.m_strNodeName = c_szLemma/*_T("词条")*/;
xmlDocInfo.m_strNodeAttributeName = c_szName/*_T("name")*/;
xmlDocInfo.m_strNodeAttributeValue = strName;
xmlDocInfo.m_bLeafNode = TRUE;
xmlDocInfo.m_strNodeValue = m_szName;
pInsert=pXMLDOMNodePtr->AppendNode(xmlDocInfo.m_strNodeName,_T(""),xmlDocInfo.m_strNodeAttributeName
,xmlDocInfo.m_strNodeAttributeValue);
pInsert->SetNodeValue(m_szName);
m_pXMlDoc->GetCurNodeXPath(pInsert,xmlDocInfo.m_strNodeXPath);
//listBox.InsertStringEx(iCurSel,&xmlDocInfo);
listBox.AddStringEx(xmlDocInfo.m_strNodeAttributeValue,&xmlDocInfo);
int iCount = listBox.GetCount();
iCurSel = iCount - 1;
listBox.SetCurSel(iCurSel);
listBox.CreateEdit();
}
}
}
}
}
void CInsTextDlg::DoInsertItem()
{
CArchTextLibListBox &listBox = m_bSort ? m_sortNames : m_dragNames;
int iCurSel = listBox.GetCurSel();
if (iCurSel>0||iCurSel==0)
{
CXMLNodeInfo *pData = (CXMLNodeInfo*)(listBox.GetItemData(iCurSel));
CString szName;
int nCount = 1;
if (pData&&pData->m_strNodeXPath!=_T(""))
{
if (m_pXMlDoc)
{
CXMLDOMNodePtr pXMLDOMNodePtr = m_pXMlDoc->SelectSingleNode(pData->m_strNodeXPath);
CXMLDOMNodePtr pFather = pXMLDOMNodePtr->GetParentNode();
while (1)
{
BOOL bFlag = FALSE;
szName.Format(_T("新建词条(%d)"), nCount);
if (pFather->HasChildNodes())
{
CString strNodeName = pFather->GetNodeName();
CXMLDOMNodesPtr pXMLDOMNodeList = pFather->GetChildrenNodes(strNodeName);
int nNum = pXMLDOMNodeList->GetCount();
int i = 0;
for (i = 0;i < nNum;i++)
{
CXMLDOMNodePtr pTem = pXMLDOMNodeList->GetItem(i);
CString strAttriName = pTem->GetAttributeName();
CString strAttriValue = pTem->GetAttributeValue(strAttriName);
if (szName == strAttriValue)
{
bFlag = TRUE;
nCount++;
break;
}
}
}
if (!bFlag)
{
break;
}
}
CXMLNodeInfo TempInfo;
TempInfo.m_bLeafNode = TRUE;
TempInfo.m_strNodeName = c_szLemma/*_T("词条")*/;
TempInfo.m_strNodeAttributeName =c_szName/* _T("name")*/;
TempInfo.m_strNodeAttributeValue = szName;
CXMLDOMNodePtr pInsert = pFather->AppendNode(TempInfo.m_strNodeName,_T(""),TempInfo.m_strNodeAttributeName,
TempInfo.m_strNodeAttributeValue);
CXMLDOMNodePtr PClone(new CXMLDOMNode(NULL ));
CXMLDOMNodePtr PTemptr(new CXMLDOMNode(NULL ));
pInsert->CloneNode(PClone);
pXMLDOMNodePtr->InsertAfter(PClone,PTemptr);
pInsert->DeleteNode();
m_pXMlDoc->GetCurNodeXPath(PTemptr,TempInfo.m_strNodeXPath);
listBox.InsertStringEx(iCurSel,&TempInfo);
int iCount = listBox.GetCount();
if(iCurSel >= iCount)
iCurSel = iCount - 1;
listBox.SetCurSel(iCurSel);
listBox.CreateEdit();
}
}
}
else
{
if (m_pXMlDoc)
{
CXMLNodeInfo xmlDocInfo;
CXMLDOMNodePtr pInsert(new CXMLDOMNode(NULL));
HTREEITEM hItem = m_treeNames.GetSelectedItem();
if (hItem!=NULL)
{
CString szName;
int nCount = 1;
CXMLNodeInfo *pData = (CXMLNodeInfo*)m_treeNames.GetItemData(hItem);
if (pData&&pData->m_strNodeXPath!=_T(""))
{
CXMLDOMNodePtr pXMLDOMNodePtr = m_pXMlDoc->SelectSingleNode(pData->m_strNodeXPath);
while (1)
{
BOOL bFlag = FALSE;
szName.Format(_T("新建词条(%d)"), nCount);
if (pXMLDOMNodePtr->HasChildNodes())
{
CString strNodeName = pXMLDOMNodePtr->GetNodeName();
CXMLDOMNodesPtr pXMLDOMNodeList = pXMLDOMNodePtr->GetChildrenNodes(strNodeName);
int nNum = pXMLDOMNodeList->GetCount();
int i = 0;
for (i = 0;i < nNum;i++)
{
CXMLDOMNodePtr pTem = pXMLDOMNodeList->GetItem(i);
CString strAttriName = pTem->GetAttributeName();
CString strAttriValue = pTem->GetAttributeValue(strAttriName);
if (szName == strAttriValue)
{
bFlag = TRUE;
nCount++;
break;
}
}
}
if (!bFlag)
{
break;
}
}
xmlDocInfo.m_strNodeName = c_szLemma/*_T("词条")*/;
xmlDocInfo.m_strNodeAttributeName = c_szName/*_T("name")*/;
xmlDocInfo.m_strNodeAttributeValue = szName;
xmlDocInfo.m_bLeafNode = TRUE;
pInsert=pXMLDOMNodePtr->AppendNode(xmlDocInfo.m_strNodeName,_T(""),xmlDocInfo.m_strNodeAttributeName
,xmlDocInfo.m_strNodeAttributeValue);
m_pXMlDoc->GetCurNodeXPath(pInsert,xmlDocInfo.m_strNodeXPath);
//listBox.InsertStringEx(iCurSel,&xmlDocInfo);
listBox.AddStringEx(xmlDocInfo.m_strNodeAttributeValue,&xmlDocInfo);
int iCount = listBox.GetCount();
iCurSel = iCount - 1;
listBox.SetCurSel(iCurSel);
listBox.CreateEdit();
}
}
}
}
}
void CInsTextDlg::DoAppendItem()
{
DoInsertItem();
}
void CInsTextDlg::DoModifyItem()
{
if (m_bSort)
{
m_sortNames.CreateEdit();
}
else
{
m_dragNames.CreateEdit();
}
}
CString CInsTextDlg::DelStrReturn(const CString &strText)
{
CString strTem = strText;
int nPos = strTem.Find(_T('\n'),0);
while (nPos>-1)
{
strTem.Delete(nPos);
nPos = strTem.Find(_T('\n'),0);
}
nPos = strTem.Find(_T('\r'),0);
while (nPos>-1)
{
strTem.Delete(nPos);
nPos = strTem.Find(_T('\r'),0);
}
return strTem;
}
CString CInsTextDlg::SetStrReturn(const CString &strText)
{
CString strTem = strText;
int nLen = strTem.GetLength();
int nNum = 0;
int i=0;
for (i=0;i<nLen;i++)
{
TCHAR ch = strTem.GetAt(i);
if (ch == 31)
{
strTem.Delete(i);
i--;
nNum ++;
}
else
{
break;
}
}
if (nNum>0)
{
int i = 0;
for (;i<nNum;i++)
{
strTem.Insert(0,32);
}
}
int nR = 0;
if (strTem.Find(_T('\r'),nR)!=-1)
{
return strTem;
}
int nPos = -1;
nPos = strTem.FindOneOf(_T("\n"));
while (nPos!=-1)
{
strTem.Insert(nPos,_T('\r'));
int nPos1 = nPos+2;
nPos = strTem.Find(_T('\n'),nPos1);
}
int nLen1 = strTem.GetLength();
return strTem;
}
//是否有子节点
BOOL CInsTextDlg::IsHasChildNodes(const MSXML2::IXMLDOMNodePtr &pIXMLDOMNodePtr)
{
ASSERT( NULL != pIXMLDOMNodePtr);
if( NULL == pIXMLDOMNodePtr )
{
return FALSE;
}
MSXML2::IXMLDOMNodePtr pXMLDOMNode = NULL;
MSXML2::DOMNodeType NodeType;
MSXML2::IXMLDOMNodeListPtr pXMLDOMNodeList = NULL;
BOOL bHasChildNodes = FALSE;
HRESULT hr;
try
{
hr = pIXMLDOMNodePtr->get_childNodes( &pXMLDOMNodeList );
ASSERT( SUCCEEDED(hr) );
if( FAILED( hr ) )
{
pXMLDOMNodeList = NULL;
return FALSE;
}
for( int i = 0; i < pXMLDOMNodeList->length; i++ )
{
pXMLDOMNode = pXMLDOMNodeList->item[i];
hr = pXMLDOMNode->get_nodeType( &NodeType );
ASSERT( SUCCEEDED( hr ) );
if( NULL != pXMLDOMNode )
{
pXMLDOMNode.Release();
pXMLDOMNode = NULL;
}
if( NodeType == MSXML2::NODE_ELEMENT )
{
bHasChildNodes = TRUE;
break;
}
}
}
catch ( ... )
{
if( NULL != pXMLDOMNode )
{
pXMLDOMNode.Release();
pXMLDOMNode = NULL;
}
if( NULL != pXMLDOMNodeList )
{
pXMLDOMNodeList.Release();
pXMLDOMNodeList = NULL;
}
ASSERT( false );
return FALSE;
}
if( NULL != pXMLDOMNode )
{
pXMLDOMNode.Release();
pXMLDOMNode = NULL;
}
if( NULL != pXMLDOMNodeList )
{
pXMLDOMNodeList.Release();
pXMLDOMNodeList = NULL;
}
return bHasChildNodes;
}
//得到xml节点值(仅对叶子节点)
/*CString CInsTextDlg::GetXMLNodeValue(const MSXML2::IXMLDOMNodePtr &pIXMLDOMNodePtr)
{
assert( NULL != pIXMLDOMNodePtr );
if( NULL == pIXMLDOMNodePtr )
{
return _T("");
}
if (IsHasChildNodes(pIXMLDOMNodePtr))
{
return _T("");
}
BSTR bstr = NULL;
HRESULT hr ;
try
{
hr = pIXMLDOMNodePtr->get_text( &bstr );
assert( SUCCEEDED(hr) );
if( FAILED ( hr ) )
{
return _T("");
}
}
catch( ... )
{
if( NULL != bstr )
{
SysFreeString( bstr );
bstr = NULL;
}
assert( false );
return _T("");
}
TCHAR szGetValue[4096];
memset( szGetValue, 0, sizeof( szGetValue ) );
_tcscpy( szGetValue, ( TCHAR* )_bstr_t( bstr, true ) );
CString strNodeValue;
strNodeValue = szGetValue;
if( NULL != bstr )
{
SysFreeString( bstr );
bstr = NULL;
}
return strNodeValue;
}*/
//得到xml节点属性值
CString CInsTextDlg::GetXMLNodeAttributeValue(const MSXML2::IXMLDOMNodePtr &pIXMLDOMNodePtr,const CString strNodeAttriName)
{
ASSERT( NULL != pIXMLDOMNodePtr );
if( NULL == pIXMLDOMNodePtr )
{
return _T("");
}
MSXML2::IXMLDOMNamedNodeMapPtr pIXMLDOMNamedNodeMap = NULL;
MSXML2::IXMLDOMNodePtr pIXMLDOMNode = NULL;
VARIANT varTextValue;
HRESULT hr;
try
{
hr = pIXMLDOMNodePtr->get_attributes( &pIXMLDOMNamedNodeMap );
ASSERT( SUCCEEDED(hr) );
if( FAILED( hr ) )
{
return _T("");
}
pIXMLDOMNode = pIXMLDOMNamedNodeMap->getNamedItem( _bstr_t(strNodeAttriName));
hr = pIXMLDOMNode->get_nodeValue( &varTextValue );
ASSERT( SUCCEEDED( hr ) );
if( FAILED( hr ) )
{
return _T("");
}
}
catch ( ... )
{
if( NULL != pIXMLDOMNode )
{
pIXMLDOMNode.Release();
pIXMLDOMNode = NULL;
}
if( NULL != pIXMLDOMNamedNodeMap )
{
pIXMLDOMNamedNodeMap.Release();
pIXMLDOMNamedNodeMap = NULL;
}
ASSERT( false );
return _T("");
}
TCHAR szGetAttributeValue[MAX_PATH];
memset( szGetAttributeValue, 0, sizeof( szGetAttributeValue ) );
_tcscpy( szGetAttributeValue, ( TCHAR* )(_bstr_t)varTextValue );
CString strAttributeValue;
strAttributeValue = szGetAttributeValue;
if( NULL != pIXMLDOMNode )
{
pIXMLDOMNode.Release();
pIXMLDOMNode = NULL;
}
if( NULL != pIXMLDOMNamedNodeMap )
{
pIXMLDOMNamedNodeMap.Release();
pIXMLDOMNamedNodeMap = NULL;
}
return strAttributeValue;
}
CString CInsTextDlg::GetXMLNodeName(const MSXML2::IXMLDOMNodePtr &pIXMLDOMNodePtr)
{
BSTR bstr = NULL;
pIXMLDOMNodePtr->get_nodeName( &bstr );
TCHAR szGetName[MAX_PATH];
memset( szGetName, 0, sizeof( szGetName ) );
_tcscpy( szGetName, (TCHAR*)(_bstr_t)( bstr ) );
CString strNodeName = szGetName;
return strNodeName;
}
//得到xml节点属性名字
/*CString CInsTextDlg::GetXMLNodeAttributeName(const MSXML2::IXMLDOMNodePtr &pIXMLDOMNodePtr)
{
int nIndex =0;
assert( NULL != pIXMLDOMNodePtr );
if( NULL == pIXMLDOMNodePtr )
{
return _T("");
}
TCHAR szGetAttrName[MAX_PATH];
memset( szGetAttrName, 0, sizeof( szGetAttrName ) );
MSXML2::IXMLDOMNamedNodeMapPtr pXMLDOMNamedNodeMap = NULL;
MSXML2::IXMLDOMAttributePtr pXMLDOMAttribute = NULL;
try
{
pXMLDOMNamedNodeMap = pIXMLDOMNodePtr->Getattributes();
assert( NULL != pXMLDOMNamedNodeMap );
if( NULL == pXMLDOMNamedNodeMap ){ return _T(""); }
assert( nIndex < pXMLDOMNamedNodeMap->length );
if( nIndex >= pXMLDOMNamedNodeMap->length ){ return _T(""); }
pXMLDOMAttribute = pXMLDOMNamedNodeMap->item[ nIndex ];
ASSERT( NULL != pXMLDOMAttribute );
}
catch ( ... )
{
if( NULL != pXMLDOMNamedNodeMap )
{
pXMLDOMNamedNodeMap.Release();
pXMLDOMNamedNodeMap = NULL;
}
if( NULL != pXMLDOMAttribute )
{
pXMLDOMAttribute.Release();
pXMLDOMAttribute = NULL;
}
assert( false );
return _T("");
}
_tcscpy( szGetAttrName, ( TCHAR * )( _bstr_t )pXMLDOMAttribute->Getname() );
if( NULL != pXMLDOMNamedNodeMap )
{
pXMLDOMNamedNodeMap.Release();
pXMLDOMNamedNodeMap = NULL;
}
if( NULL != pXMLDOMAttribute )
{
pXMLDOMAttribute.Release();
pXMLDOMAttribute = NULL;
}
CString strAttriname = szGetAttrName;
return strAttriname;
}*/
void CInsTextDlg::BreadGetXmlNodesValve(CArchTextLibListBox &listBox,const CXMLDOMNodePtr &pXmlNode)
{
MSXML2::DOMNodeType NodeType;
MSXML2::IXMLDOMNodePtr pXMLDOMNodePtr = pXmlNode->GetNodePtr();
std::deque<MSXML2::IXMLDOMNodePtr> quene;
quene.push_back(pXMLDOMNodePtr);
BOOL bFirst = TRUE;
BOOL bDelete = FALSE;
while(quene.size()!=0)
{
MSXML2::IXMLDOMNodePtr pCurXMLDOMNodePtr = quene.front();
quene.pop_front();
MSXML2::IXMLDOMNodeListPtr pXMLDOMNodeList = NULL;
pCurXMLDOMNodePtr->get_childNodes( &pXMLDOMNodeList);
if(pXMLDOMNodeList->Getlength()==0)
{
CString strNodeName = GetXMLNodeName(pCurXMLDOMNodePtr);
if (strNodeName == c_szLemma)
{
CXMLNodeInfo nodeInfo;
CXMLDOMNode *pTem = new CXMLDOMNode(pCurXMLDOMNodePtr);
CXMLDOMNodePtr pTemPtr(pTem);
nodeInfo = GetNodeInfoEx(pTemPtr,m_pXMlDoc);
listBox.AddStringEx(nodeInfo.m_strNodeAttributeValue,&nodeInfo);
}
continue;
}
for(long i=0;i<pXMLDOMNodeList->Getlength();i++)
{
MSXML2::IXMLDOMNodePtr pXMLDOMNode = pXMLDOMNodeList->Getitem(i);
int n = pXMLDOMNodeList->Getlength();
pXMLDOMNode->get_nodeType( &NodeType );
if(NodeType!=MSXML2::NODE_ELEMENT)
{
CString strNodeName = GetXMLNodeName(pCurXMLDOMNodePtr);
if (strNodeName == c_szLemma)
{
CXMLNodeInfo nodeInfo;
CXMLDOMNode *pTem = new CXMLDOMNode(pCurXMLDOMNodePtr);
CXMLDOMNodePtr pTemPtr(pTem);
nodeInfo = GetNodeInfoEx(pTemPtr,m_pXMlDoc);
listBox.AddStringEx(nodeInfo.m_strNodeAttributeValue,&nodeInfo);
}
}
else
quene.push_back(pXMLDOMNode);
}
}
}
/*void CInsTextDlg::DeepGetXmlNodesValve(CArchTextLibListBox &listBox,const CXMLDOMNodePtr &pXmlNode)
{
// root item node
MSXML2::IXMLDOMNodePtr pXMLDOMNodePtr = pXmlNode->GetNodePtr();
if(IsHasChildNodes(pXMLDOMNodePtr))
{
MSXML2::IXMLDOMNodeListPtr pXMLDOMNodeList = NULL;
pXMLDOMNodePtr->get_childNodes(&pXMLDOMNodeList);
AnalyseXmlTree(pXMLDOMNodeList,listBox);
if (pXMLDOMNodeList!=NULL)
{
pXMLDOMNodeList.Release();
pXMLDOMNodeList = NULL;
}
}
else // get current node info & insert into list
{
CString strNodeName = GetXMLNodeName(pXMLDOMNodePtr);
int nUm = 0;
if (strNodeName == c_szLemma)
{
//TCHAR szURL[MAX_PATH];
CXMLNodeInfo nodeInfo;
CXMLDOMNode *pTem = new CXMLDOMNode(pXMLDOMNodePtr);
CXMLDOMNodePtr pTemPtr(pTem);
nodeInfo = GetNodeInfoEx(pTemPtr,m_pXMlDoc);
listBox.AddStringEx(nodeInfo.m_strNodeAttributeValue,&nodeInfo);
}
}
}*/
/*void CInsTextDlg::AnalyseXmlTree(const MSXML2::IXMLDOMNodeListPtr& pXMLDOMNodeList, CArchTextLibListBox &listBox)
{
int nLen = pXMLDOMNodeList->Getlength();
for (int i = 0; i < nLen; i++)
{
MSXML2::IXMLDOMNodePtr pXMLDOMNode = pXMLDOMNodeList->Getitem(i);
CString strAttriName = GetXMLNodeAttributeName(pXMLDOMNode);
CString strAttriValue = GetXMLNodeAttributeValue(pXMLDOMNode,strAttriName);
CString strLast = c_szLate;
if (strAttriValue == strLast) continue;
if(IsHasChildNodes(pXMLDOMNode))
{
// 去掉pXMLDOMNodeList当前分析节点
MSXML2::IXMLDOMNodeListPtr pXMLDOMNodeTemList = NULL;
pXMLDOMNode->get_childNodes(&pXMLDOMNodeTemList);
if (pXMLDOMNode!=NULL)
{
pXMLDOMNode.Release();
pXMLDOMNode = NULL;
}
AnalyseXmlTree(pXMLDOMNodeTemList,listBox);
if (pXMLDOMNodeTemList!=NULL)
{
pXMLDOMNodeTemList.Release();
pXMLDOMNodeTemList = NULL;
}
}
else // insert into list
{
InsertIntoLst(pXMLDOMNode,listBox);
if (pXMLDOMNode!=NULL)
{
pXMLDOMNode.Release();
pXMLDOMNode = NULL;
}
}
}
}*/
/*void CInsTextDlg::InsertIntoLst(const MSXML2::IXMLDOMNodePtr &pXmlNode,CArchTextLibListBox &listBox)
{
CXMLNodeInfo nodeInfo;
CXMLDOMNode *pTem = new CXMLDOMNode(pXmlNode);
CXMLDOMNodePtr pTemPtr(pTem);
nodeInfo = GetNodeInfoEx(pTemPtr,m_pXMlDoc);
listBox.AddStringEx(nodeInfo.m_strNodeAttributeValue,&nodeInfo);
}*/
void CInsTextDlg::BreadthXmlNodeToTreeNode(const CXMLDOMNodePtr &pXmlNode)
{
MSXML2::IXMLDOMNodePtr pXMLDOMNodePtr = pXmlNode->GetNodePtr();
std::deque<MSXML2::IXMLDOMNodePtr> quene;
std::deque<HTREEITEM> Treequeue;
quene.push_back(pXMLDOMNodePtr);
HTREEITEM hParent;
BOOL bFirst = TRUE;
BOOL bDelete = FALSE;
while(quene.size()!=0)
{
MSXML2::IXMLDOMNodePtr pCurXMLDOMNodePtr = quene.front();
quene.pop_front();
HTREEITEM hPar;// = Treequeue.front();
if (Treequeue.size()!=0)
{
hPar = Treequeue.front();
Treequeue.pop_front();
}
//Treequeue.pop_front();
//VARIANT_BOOL vrb = pCurXMLDOMNodePtr->hasChildNodes();
if (IsHasChildNodes(pCurXMLDOMNodePtr)/*vrb == VARIANT_TRUE*/)
{
if (bFirst)
{
CXMLNodeInfo Noedata;
Noedata = GetNodeInfoEx(pXmlNode,m_pXMlDoc);
//Noedata.m_strNodeAttributeValue = c_szTDWord;
hParent = m_treeNames.InsertItemEx(&Noedata,TVI_ROOT,TVI_LAST);
m_hLastItem = hParent;
hPar = hParent;
//Treequeue.push_back(hParent);
bFirst = FALSE;
}
else
{
bDelete = TRUE;
}
MSXML2::IXMLDOMNodeListPtr pXMLDOMNodeList = NULL;
pCurXMLDOMNodePtr->get_childNodes( &pXMLDOMNodeList);
int i = 0;
for (i=0;i<pXMLDOMNodeList->Getlength();i++)
{
MSXML2::IXMLDOMNodePtr pXMLDOMNode = pXMLDOMNodeList->Getitem(i);
CString strNodeName;
strNodeName = GetXMLNodeName(pXMLDOMNode);
if (strNodeName == c_szCatalog)
{
quene.push_back(pXMLDOMNode);
CXMLNodeInfo xmlInfo;
xmlInfo.m_strNodeName = c_szCatalog;
xmlInfo.m_strNodeAttributeName = c_szName;
CString strXPath,strAttriValue;
strAttriValue = GetXMLNodeAttributeValue(pXMLDOMNode,c_szName);
xmlInfo.m_strNodeAttributeValue = strAttriValue;
CXMLNodeInfo *pData = (CXMLNodeInfo*)(m_treeNames.GetItemData(hPar));
if (pData)
{
strXPath = pData->m_strNodeXPath;
}
strXPath += _T("/")+xmlInfo.m_strNodeName+_T("[@")
+xmlInfo.m_strNodeAttributeName+_T("=")+_T("'")+strAttriValue+_T("']");
xmlInfo.m_strNodeXPath = strXPath;
HTREEITEM hItem = m_treeNames.InsertItemEx(&xmlInfo,hPar,TVI_LAST);
if (g_xmlTreeLastInfo.m_strNodeAttributeValue == xmlInfo.m_strNodeAttributeValue)
{
m_hLastItem = hItem;
}
Treequeue.push_back(hItem);
}
}
if (pXMLDOMNodeList!=NULL)
{
pXMLDOMNodeList.Release();
pXMLDOMNodeList = NULL;
}
}
if (bDelete)
{
if (pCurXMLDOMNodePtr !=NULL)
{
pCurXMLDOMNodePtr.Release();
pCurXMLDOMNodePtr = NULL;
}
}
}
}
LRESULT CInsTextDlg::OnNewLine(WPARAM w,LPARAM l)
{
DoAppendItem();
return 0;
}
LRESULT CInsTextDlg::OnInSertLine(WPARAM w,LPARAM l)
{
DoInsertItem();
return 0;
}
LRESULT CInsTextDlg::OnReNameLine(WPARAM w,LPARAM l)
{
DoModifyItem();
return 0;
}
LRESULT CInsTextDlg::OnDeleteLine(WPARAM w,LPARAM l)
{
DoDeleteItem();
return 0;
}
void CInsTextDlg::OnSize(UINT nType,int cx,int cy)
{
CModelessDialog::OnSize(nType,cx,cy);
if(!IsShowNormal())
return;
HWND hwnd;
CEdit *pEdit = (CEdit*)GetDlgItem(IDC_EDIT_SEARCH);
if (pEdit)
{
hwnd = pEdit->GetSafeHwnd();
if (hwnd)
{
pEdit->SetMargins(0,cx-30);
CRect rect,rect1;
pEdit->GetWindowRect(rect);
ScreenToClient(rect);
rect.SetRect(rect.TopLeft(),CPoint(rect.right,cy-10));
pEdit->MoveWindow(rect);
}
}
}
// CInsTextDlg 消息处理程序
BOOL CInsTextDlg::OnInitDialog()
{
CModelessDialog::OnInitDialog();
m_pXMlDoc = new CXMLDOMFile;
TCHAR *strParth = new TCHAR[MAX_PATH] ;
if(!FindFile(_T("dict.xml"), strParth))
{
delete []strParth;
}
if (m_pXMlDoc->IsFileExist(strParth))
{
if (!m_pXMlDoc->Open(strParth))
{
// Zyu modify on 100726,支持64位
#ifndef _WIN64
MessageBox(_T("打开XML文档失败!请安装MSXML4.0SP2组件"));
#else
MessageBox(_T("打开XML文档失败!请安装MSXML6.0组件"));
#endif
return FALSE;
}
}
else
{
MessageBox(_T("文件不存在"));
return FALSE;
}
m_treeNames.SetXMLDoc(m_pXMlDoc);
m_dragNames.SetXMLDoc(m_pXMlDoc);
m_sortNames.SetXMLDoc(m_pXMlDoc);
delete []strParth;
InitToolBar();
InitList();
UpdateButton();
m_bSort = FALSE;
//m_bEdit = TRUE;
SetEditText(m_szName);
return TRUE;
}
void CInsTextDlg::OnTvnSelchangedTree(NMHDR *pNMHDR, LRESULT *pResult)
{
//MessageBox(_T("A"));
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
HTREEITEM hItem = m_treeNames.GetSelectedItem();
HTREEITEM hRoot = m_treeNames.GetRootItem();
if (hRoot == hItem)
{
m_szType = c_szAll;
m_bEdit = FALSE;
}
if (hItem == NULL)
{
hItem = hRoot;
}
CXMLNodeInfo *pNodeInfo = (CXMLNodeInfo*)(m_treeNames.GetItemData(hItem));
if (pNodeInfo->m_strNodeName==_T(""))
{
return;
}
g_xmlTreeLastInfo = *pNodeInfo;
if (pNodeInfo)
{
m_szType = pNodeInfo->m_strNodeAttributeValue;
SetNamesModify();
ChangeListBox(FALSE);
}
CString strLate = c_szLate;
if (pNodeInfo->m_strNodeAttributeValue == strLate)
{
m_bEdit = FALSE;
}
else
{
m_bEdit = TRUE;
}
//}
int n = m_dragNames.GetCount();
if (n != 0)
{
if(m_dragNames.SelectString(-1, m_szName) == LB_ERR)
m_dragNames.SetCurSel(-1);
}
UpdateButton();
*pResult = 0;
}
void CInsTextDlg::InitToolBar()
{
CTemporaryResourceOverride vTmp;
m_toolBar.Create(this);
m_toolBar.LoadToolBar(IDR_TOOLBAR_LETTER);
m_toolBar.ShowWindow(SW_SHOW);
m_toolBar.SetBarStyle(CBRS_ALIGN_TOP | CBRS_TOOLTIPS | CBRS_FLYBY);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
}
void CInsTextDlg::OnBnClickedBtnInlib()
{
//OnBnClickedAddtolib();
OnBnClickedInputtolib();
}
void CInsTextDlg::DeleteTree()
{
m_treeNames.DeleteAllItemData();
m_treeNames.DeleteAllItems();
}
void CInsTextDlg::InitTree()
{
CXMLDOMNodePtr pRootNode,pGuardNode;
pRootNode = m_pXMlDoc->GetRoot();
BreadthXmlNodeToTreeNode(pRootNode);
HTREEITEM hParent = m_treeNames.GetRootItem();
HTREEITEM hChild = m_treeNames.GetChildItem(hParent);
m_treeNames.SelectItem(hChild);
m_treeNames.Expand(hParent, TVE_EXPAND);
m_szType = c_szLate;
m_bEdit = FALSE;
UpdateData(FALSE);
}
void CInsTextDlg::InitList()
{
CXMLDOMNodePtr pRootNode,pGuardNode;
pRootNode = m_pXMlDoc->GetRoot();
HICON hIcon[4];
m_imageList.Create(16,16,ILC_COLOR8,1,1);
m_imageList.SetBkColor(RGB(255,255,255));
hIcon[0]=AfxGetApp()->LoadIcon(IDI_WORDLIBCLOSE);
hIcon[1]=AfxGetApp()->LoadIcon(IDI_WORDLIBOPEN);
hIcon[2]=AfxGetApp()->LoadIcon(IDI_BOOKCLOSE);
hIcon[3]=AfxGetApp()->LoadIcon(IDI_BOOKOPEN);
int i=0;
for(i=0;i<4;i++)
{
m_imageList.Add (hIcon[i]);
}
m_treeNames.SetImageList(&m_imageList,TVSIL_NORMAL);
pGuardNode = m_pXMlDoc->GetRoot();
BreadthXmlNodeToTreeNode(pGuardNode);
HTREEITEM hParent = m_treeNames.GetRootItem();
HTREEITEM hChild = m_treeNames.GetChildItem(hParent);
CString strType,strPath;
if (m_hLastItem == hParent)
{
m_treeNames.SelectItem(hChild);
CXMLNodeInfo*pData = (CXMLNodeInfo*)m_treeNames.GetItemData(hChild);
if (pData)
{
strType = pData->m_strNodeAttributeValue;
strPath = pData->m_strNodeXPath;
}
m_treeNames.Expand(hParent, TVE_EXPAND);
}
else
{
m_treeNames.SelectItem(m_hLastItem);
CXMLNodeInfo*pData = (CXMLNodeInfo*)m_treeNames.GetItemData(m_hLastItem);
if (pData)
{
strType = pData->m_strNodeAttributeValue;
strPath = pData->m_strNodeXPath;
}
m_treeNames.Expand(hParent, TVE_EXPAND);
}
CArchTextLibListBox &listBox = m_bSort ? m_sortNames : m_dragNames;
int nNum = listBox.GetCount();
//int i=0;
for (i=0;i<nNum;i++)
{
CXMLNodeInfo*pData = (CXMLNodeInfo*)listBox.GetItemData(i);
if (pData)
{
if (pData->m_strNodeValue == m_szName)
{
listBox.SetCurSel(i);
break;
}
}
}
m_szType = strType;
m_bEdit = FALSE;
//m_editSearch.EnableWindow(m_bEdit);
}
void CInsTextDlg::SetNamesModify()
{
if(_tcscmp(m_szType, c_szAll) == 0 || _tcscmp(m_szType, c_szLate) == 0)
{
m_dragNames.SetModify(FALSE);
m_sortNames.SetModify(FALSE);
}
else
{
m_dragNames.SetModify(TRUE);
m_sortNames.SetModify(TRUE);
}
}
void CInsTextDlg::AddNamesByType(CArchTextLibListBox &listBox)
{
listBox.ReSetContentEx();
HTREEITEM hRoot = m_treeNames.GetRootItem();
HTREEITEM hItem = m_treeNames.GetSelectedItem();
if (hItem == hRoot)
{
CXMLDOMNodePtr pXMLDOMNodePtr = m_pXMlDoc->GetRoot();
//GetXmlNodesValue(listBox,pXMLDOMNodePtr,TRUE,FALSE);
//clock()
BreadGetXmlNodesValve(listBox,pXMLDOMNodePtr);
//DeepGetXmlNodesValve(listBox,pXMLDOMNodePtr);
//Test(pXMLDOMNodePtr,listBox);
listBox.SetModify(FALSE);
}
else
{
CXMLNodeInfo *pData = (CXMLNodeInfo*)(m_treeNames.GetItemData(hItem));
if (pData)
{
BOOL bEdit = TRUE;
/*CString str = pData->m_strNodeAttributeValue;
if (str == c_szLate)
{
bEdit = FALSE;
}*/
CXMLDOMNodePtr pXMLDOMNodePtr = m_pXMlDoc->SelectSingleNode(pData->m_strNodeXPath);
//GetXmlNodesValue(listBox,pXMLDOMNodePtr,FALSE,FALSE);
BreadGetXmlNodesValve(listBox,pXMLDOMNodePtr);
//DeepGetXmlNodesValve(listBox,pXMLDOMNodePtr);
//Test(pXMLDOMNodePtr,listBox);
listBox.SetModify(bEdit);
}
}
if (listBox.GetCount()!=0)
{
if (g_xmlListLastInfo.m_strNodeAttributeValue !="")
{
}
else
{
if(m_szName != _T(""))
{
if(listBox.SelectString(-1, m_szName) == LB_ERR)
listBox.SetCurSel(-1);
}
/*listBox.GetText(0, m_szName);
listBox.SelectString(-1, m_szName);*/
}
}
}
void CInsTextDlg::ChangeListBox(BOOL bIsSort)
{
m_bSort = bIsSort;
HTREEITEM hItem = m_treeNames.GetSelectedItem();
CXMLNodeInfo *pData = (CXMLNodeInfo*)(m_treeNames.GetItemData(hItem));
if (pData)
{
CXMLDOMNodePtr pXMLDOMNodePtr = m_pXMlDoc->SelectSingleNode(pData->m_strNodeXPath);
if(bIsSort)
{
m_dragNames.ShowWindow(SW_HIDE);
m_sortNames.ShowWindow(SW_SHOW);
AddNamesByType(m_sortNames);
}
else
{
m_sortNames.ShowWindow(SW_HIDE);
m_dragNames.ShowWindow(SW_SHOW);
AddNamesByType(m_dragNames);
}
}
g_bSort = bIsSort;
}
void CInsTextDlg::SetPreText(CString &szText)
{
if(szText != _T(""))
m_szName = szText;
}
void CInsTextDlg::SetEditText(CString &szText)
{
if(szText != _T(""))
{
CString strTem = SetStrReturn(szText);
m_editSearch.SetWindowText(strTem);
m_szName=strTem;//add by whl on 051229
}
}
CString CInsTextDlg::GetEditText()
{
if (!m_bSingleLineText)
{
//CArtchTextLibEdit *pWnd = (CArtchTextLibEdit*)GetDlgItem(IDC_EDIT_SEARCH);
//m_szName = pWnd->GetDlgItemText()
return m_szName;
}
else
{
return DelStrReturn(m_szName);
}
}
void CInsTextDlg::OnLbnSelchangeDragType()
{
/*int iCurType = m_dragTypes.GetCurSel();
m_dragTypes.GetText(iCurType, m_szType);
SetNamesModify();
ChangeListBox(FALSE);
UpdateButton();*/
}
//遗留问题:在全部词汇目录中有同名项时只能显示第一个
void CInsTextDlg::OnLbnSelchangeName()
{
int kk=0;
//if(!m_bEdit)
//return;
if (m_bSort)
{
int nCur = m_sortNames.GetCurSel();
if (nCur == -1)
{
return;
}
//HTREEITEM hFather = m_treeNames.GetSelectedItem();
//CXMLNodeInfo *pFatherData = (CXMLNodeInfo*)(m_treeNames.GetItemData(hFather));
//CXMLDOMNodesPtr pFather = m_pXMlDoc->SelectSingleNode(pFatherData->m_strNodeXPath);
CXMLNodeInfo *pData = (CXMLNodeInfo*)(m_sortNames.GetItemData(nCur));
if (pData->m_strNodeXPath==_T(""))
{
return;
}
CXMLNodeInfo data;
CXMLDOMNodePtr pNodePter = m_pXMlDoc->SelectSingleNode(pData->m_strNodeXPath);
data =GetNodeInfo(pNodePter,m_pXMlDoc);
//*pData = data;
pData->m_strNodeAttributeValue = data.m_strNodeAttributeValue;
pData->m_strNodeValue = data.m_strNodeValue;
g_xmlListLastInfo = *pData;
if (pData)
{
if (pData->m_strNodeValue!=_T(""))
{
SetEditText(pData->m_strNodeValue);
}
else
{
SetEditText(pData->m_strNodeAttributeValue);
}
}
}
else
{
int nCur = m_dragNames.GetCurSel();
if (nCur == -1)
{
return;
}
CXMLNodeInfo *pData = (CXMLNodeInfo*)(m_dragNames.GetItemData(nCur));
CXMLNodeInfo data;
if (pData->m_strNodeXPath==_T(""))
{
return;
}
CXMLDOMNodePtr pNodePter = m_pXMlDoc->SelectSingleNode(pData->m_strNodeXPath);
data =GetNodeInfo(pNodePter,m_pXMlDoc);
pData->m_strNodeAttributeValue = data.m_strNodeAttributeValue;
pData->m_strNodeValue = data.m_strNodeValue;
g_xmlListLastInfo = *pData;
if (pData)
{
CString str = pData->m_strNodeValue;
int n = -1;
n = str.FindOneOf(_T("\n"));
if (pData->m_strNodeValue!=_T(""))
{
SetEditText(pData->m_strNodeValue);
}
else
{
SetEditText(pData->m_strNodeAttributeValue);
}
}
}
if (m_bSort!=FALSE)
{
m_bEdit = FALSE;
SetEditText(m_szName);
m_bEdit = TRUE;
}
else
{
SetEditText(m_szName);
}
}
void CInsTextDlg::OnEnChangeEditSearch()
{
//if(!m_bEdit)
// return;
m_editSearch.GetWindowText(m_szName);
m_bEditChanged = TRUE;
CString strOld;
if(!m_bSort)
{
int nIndex = m_dragNames.GetCurSel();
if (nIndex>-1)
{
m_dragNames.GetText(nIndex,strOld);
ChangeListBox(TRUE);
}
}
else
{
int nIndex = m_sortNames.GetCurSel();
if (nIndex>-1)
{
m_sortNames.GetText(nIndex,strOld);
}
}
m_bEdit = FALSE;
if(m_bSort)
{
if(m_sortNames.SelectString(-1, strOld) == LB_ERR)
m_sortNames.SetCurSel(-1);
}
else
{
if(m_dragNames.SelectString(-1, strOld) == LB_ERR)
m_dragNames.SetCurSel(-1);
}
m_bEdit = TRUE;
}
CNameString* CInsTextDlg::CreateNameString()
{
if(m_szName==_T(""))
return NULL;
CNameString* pString=NULL;
UString temp(m_szName);
if(temp.Length()<=25)
pString=new CNameString(m_szName);
else
{
pString=new CNameString(TString(temp.Left(25)));
pString->m_sContent=m_szName;
}
return pString;
}
void CInsTextDlg::OnBnClickedAddtolib()
{
m_editSearch.GetWindowText(m_szName);
//m_szName = _T('\t\t')+m_szName;
if(m_szName == _T(""))
{
return;
}
CString strName;
if (m_szName.GetLength()>20)
{
strName = m_szName.Mid(0,20);
}
else
{
strName = m_szName;
}
if (m_bSort)
{
int nIndex = m_sortNames.GetCurSel();
if (nIndex> -1)
{
CXMLNodeInfo *pData = (CXMLNodeInfo*)(m_sortNames.GetItemData(nIndex));
if (pData&&pData->m_strNodeXPath!=_T(""))
{
CXMLDOMNodePtr pXMLDOMNodePtr = m_pXMlDoc->SelectSingleNode(pData->m_strNodeXPath);
pXMLDOMNodePtr->SetNodeValue(m_szName);
}
}
else
{
CXMLNodeInfo xmlDocInfo;
CXMLDOMNodePtr pInsert(new CXMLDOMNode(NULL));
HTREEITEM hItem = m_treeNames.GetSelectedItem();
CXMLNodeInfo *pData = (CXMLNodeInfo*)m_treeNames.GetItemData(hItem);
if (pData&&pData->m_strNodeXPath!=_T(""))
{
CXMLDOMNodePtr pXMLDOMNodePtr = m_pXMlDoc->SelectSingleNode(pData->m_strNodeXPath);
xmlDocInfo.m_strNodeName = c_szLemma/*_T("词条")*/;
xmlDocInfo.m_strNodeAttributeName = c_szName/*_T("name")*/;
xmlDocInfo.m_strNodeAttributeValue = strName;
xmlDocInfo.m_bLeafNode = TRUE;
pInsert=pXMLDOMNodePtr->AppendNode(xmlDocInfo.m_strNodeName,_T(""),xmlDocInfo.m_strNodeAttributeName
,xmlDocInfo.m_strNodeAttributeValue);
m_pXMlDoc->GetCurNodeXPath(pInsert,xmlDocInfo.m_strNodeXPath);
m_sortNames.AddStringEx(xmlDocInfo.m_strNodeAttributeValue,&xmlDocInfo);
if (m_sortNames.SelectString(-1,xmlDocInfo.m_strNodeAttributeValue)== LB_ERR)
{
m_sortNames.SetCurSel(-1);
}
}
}
}
else
{
int nIndex = m_dragNames.GetCurSel();
if (nIndex>-1)
{
CString strAttri;
m_dragNames.GetText(nIndex,strAttri);
CXMLNodeInfo *pData = (CXMLNodeInfo*)(m_dragNames.GetItemData(nIndex));
if (pData&&pData->m_strNodeXPath!=_T(""))
{
CXMLDOMNodePtr pXMLDOMNodePtr = m_pXMlDoc->SelectSingleNode(pData->m_strNodeXPath);
pXMLDOMNodePtr->SetNodeValue(m_szName);
}
}
else
{
CXMLNodeInfo xmlDocInfo;
CXMLDOMNodePtr pInsert(new CXMLDOMNode(NULL));
HTREEITEM hItem = m_treeNames.GetSelectedItem();
CXMLNodeInfo *pData = (CXMLNodeInfo*)m_treeNames.GetItemData(hItem);
if (pData&&pData->m_strNodeXPath!=_T(""))
{
CXMLDOMNodePtr pXMLDOMNodePtr = m_pXMlDoc->SelectSingleNode(pData->m_strNodeXPath);
xmlDocInfo.m_strNodeName = c_szLemma/*_T("词条")*/;
xmlDocInfo.m_strNodeAttributeName = c_szName/*_T("name")*/;
xmlDocInfo.m_strNodeAttributeValue = strName;
xmlDocInfo.m_bLeafNode = TRUE;
pInsert=pXMLDOMNodePtr->AppendNode(xmlDocInfo.m_strNodeName,_T(""),xmlDocInfo.m_strNodeAttributeName
,xmlDocInfo.m_strNodeAttributeValue);
m_pXMlDoc->GetCurNodeXPath(pInsert,xmlDocInfo.m_strNodeXPath);
m_dragNames.AddStringEx(xmlDocInfo.m_strNodeAttributeValue,&xmlDocInfo);
if (m_dragNames.SelectString(-1,xmlDocInfo.m_strNodeAttributeValue)== LB_ERR)
{
m_sortNames.SetCurSel(-1);
}
}
}
}
//m_pXMlDoc->Save();
}
void CInsTextDlg::OnSelectLetter(UINT nID)
{
int i = 0;
if(!m_bSort)
ChangeListBox(TRUE);
const TCHAR *szHead[] = {_T("吖"), _T("八"), _T("擦"), _T("达"), _T("鹅")
, _T("发"), _T("旮"), _T("妎"), _T("丌"), _T("咔")
, _T("垃"), _T("嘸"), _T("拿"), _T("噢"), _T("趴")
, _T("七"), _T("亽"), _T("仨"), _T("他"), _T("屲")
, _T("夕"), _T("丫"), _T("帀")};
int iPick;
switch(nID)
{
case ID_BUTTON_A:
iPick = 0;
break;
case ID_BUTTON_B:
iPick = 1;
break;
case ID_BUTTON_C:
iPick = 2;
break;
case ID_BUTTON_D:
iPick = 3;
break;
case ID_BUTTON_E:
iPick = 4;
break;
case ID_BUTTON_F:
iPick = 5;
break;
case ID_BUTTON_G:
iPick = 6;
break;
case ID_BUTTON_H:
iPick = 7;
break;
case ID_BUTTON_J:
iPick = 8;
break;
case ID_BUTTON_K:
iPick = 9;
break;
case ID_BUTTON_L:
iPick = 10;
break;
case ID_BUTTON_M:
iPick = 11;
break;
case ID_BUTTON_N:
iPick = 12;
break;
case ID_BUTTON_O:
iPick = 13;
break;
case ID_BUTTON_P:
iPick = 14;
break;
case ID_BUTTON_Q:
iPick = 15;
break;
case ID_BUTTON_R:
iPick = 16;
break;
case ID_BUTTON_S:
iPick = 17;
break;
case ID_BUTTON_T:
iPick = 18;
break;
case ID_BUTTON_W:
iPick = 19;
break;
case ID_BUTTON_X:
iPick = 20;
break;
case ID_BUTTON_Y:
iPick = 21;
break;
case ID_BUTTON_Z:
iPick = 22;
break;
default:
iPick = 0;
break;
}
CString szText;
int iCount = m_dragNames.GetCount();
if(iPick < 22)
{
for(int i=0; i<iCount; i++)
{
m_sortNames.GetText(i, szText);
if(szText.CollateNoCase(szHead[iPick]) >= 0
&& szText.CollateNoCase(szHead[iPick+1]) <= 0)
{
m_sortNames.SetCurSel(i);
return;
}
}
}
else
{
for(int i=0; i<iCount; i++)
{
m_sortNames.GetText(i, szText);
if(szText.CollateNoCase(szHead[iPick]) >= 0)
{
m_sortNames.SetCurSel(i);
return;
}
}
}
}
void CInsTextDlg::OnLbnDblclkListName()
{
AddToLast();
CInsTextDlg::OnOK();
}
void CInsTextDlg::OnDestroy()
{
DeleteTree();
m_dragNames.ReSetContentEx();
m_sortNames.ReSetContentEx();
CModelessDialog::OnDestroy();
}
void CInsTextDlg::AddToLast()
{
HTREEITEM hItem = m_treeNames.GetRootItem();
HTREEITEM hChild = m_treeNames.GetChildItem(hItem);
CString strText;
BOOL bFind = FALSE;
while(hChild)
{
strText = m_treeNames.GetItemText(hChild);
if (strText == c_szLate)
{
bFind = TRUE;
break;
}
hChild = m_treeNames.GetNextSiblingItem(hChild);
}
if (bFind)
{
CXMLNodeInfo*pData = (CXMLNodeInfo*)(m_treeNames.GetItemData(hChild));
if (pData)
{
CXMLDOMNodePtr pXMLDOMNodePtr = m_pXMlDoc->SelectSingleNode(pData->m_strNodeXPath);
int nIndex = m_dragNames.GetCurSel();
int nCount = m_dragNames.GetCount();
if (nCount<=0)
{
return;
}
if (nIndex == -1)
{
nIndex =0;
}
CXMLNodeInfo *pData1 = (CXMLNodeInfo*)(m_dragNames.GetItemData(nIndex));
if (pData1)
{
if (!pXMLDOMNodePtr->IsChildNodeExist(pData1->m_strNodeName,pData1->m_strNodeAttributeName,
pData1->m_strNodeAttributeValue
))
{
CXMLDOMNodePtr pTemNodeptr = pXMLDOMNodePtr->AppendNode(pData1->m_strNodeName,pData1->m_strNodeValue,pData1->m_strNodeAttributeName,
pData1->m_strNodeAttributeValue);
if (pTemNodeptr.get()!=NULL)
{
CXMLDOMNodePtr pCloneNode( new CXMLDOMNode(NULL));
if (pTemNodeptr->CloneNode(pCloneNode))
{
CXMLDOMNodePtr pFirstBrotherNode = pXMLDOMNodePtr->GetFirstChildNode();
if (pFirstBrotherNode.get()!=NULL)
{
pFirstBrotherNode->InsertBefore(pCloneNode);
pTemNodeptr->DeleteNode();
}
}
}
//m_pXMlDoc->Save();
}
}
}
}
}
void CInsTextDlg::UpdateButton()
{
if(_tcscmp(m_szType, c_szLate) == 0)
{
m_buttonAdd.EnableWindow(FALSE);
m_buttonFile.EnableWindow(FALSE);
m_buttonInput.EnableWindow(FALSE);
}
else
{
m_buttonAdd.EnableWindow(TRUE);
m_buttonFile.EnableWindow(TRUE);
m_buttonInput.EnableWindow(TRUE);
}
}
void CInsTextDlg::GetXmlNodesValue(CArchTextLibListBox &listBox,const CXMLDOMNodePtr &pXmlNode,BOOL bAll,BOOL bSort)
{
CXMLDOMNodesPtr pXMLNodeList = pXmlNode->GetChildrenNodes(pXmlNode->GetNodeName());
int count = pXMLNodeList->GetCount();
CString strNodeName = pXmlNode->GetNodeName();
if(count==0&&strNodeName == c_szLemma)
{
CXMLNodeInfo xmlNodeInfo = GetNodeInfoEx(pXmlNode,m_pXMlDoc);
HTREEITEM hParent = m_treeNames.GetSelectedItem();
CXMLNodeInfo *pData = (CXMLNodeInfo*)(m_treeNames.GetItemData(hParent));
if (pData)
{
listBox.AddStringEx(xmlNodeInfo.m_strNodeAttributeValue,&xmlNodeInfo);
}
return;
}
int i=0;
for(i=0; i<count; i++)
{
CXMLDOMNodePtr pChildNode = pXMLNodeList->GetItem(i);
if (bAll)
{
CString strAttriName = pChildNode->GetAttributeName();
CString strAttriValve;
//if (pChildNode->IsAttributeExist(strAttriName))
//{
strAttriValve = pChildNode->GetAttributeValue(strAttriName);
//}
if (strAttriValve == c_szLate)
{
continue;
}
}
if (i==15)
{
int k = 19;
}
GetXmlNodesValue(listBox,pChildNode,bAll,bSort);//递归子节点
}
}
//------------------------------------------------------
// 递归将一个节点下所有子节点加入到树
//------------------------------------------------------
void CInsTextDlg::XmlNodeToTreeNode(HTREEITEM hParentItem, const CXMLDOMNodePtr &pXmlNode)
{
CXMLDOMNodesPtr pXMLNodeList = pXmlNode->GetChildrenNodes(pXmlNode->GetNodeName());
int count = pXMLNodeList->GetCount();
if(count==0)
{
return;
}
int i=0;
for(i=0; i<count; i++)
{
CXMLDOMNodePtr pChildNode = pXMLNodeList->GetItem(i);
HTREEITEM hSubItem;
CString strName,strNodeName;
strNodeName = pChildNode->GetNodeName();
strName = pChildNode->GetAttributeName();
if (strNodeName == c_szLemma)
{
continue;
}
CString str = pChildNode->GetAttributeValue(strName);
CXMLNodeInfo nodeInfo = GetNodeInfo(pChildNode,m_pXMlDoc);
CXMLNodeInfo*pData = (CXMLNodeInfo*)(m_treeNames.GetItemData(hParentItem));
if (pData)
{
nodeInfo.m_strNodeXPath = pData->m_strNodeXPath+_T("/")+strNodeName+_T("[@")
+strName+_T("=")+_T("'")+str+_T("']");
hSubItem = m_treeNames.InsertItemEx(&nodeInfo,hParentItem,TVI_LAST);
XmlNodeToTreeNode(hSubItem,pChildNode);//递归子节点
}
}
}
BOOL CInsTextDlg::ReadStoreData()
{
//XString fullFile;
// if(!FindFile(_T("dict.dbf"), fullFile))
//{
// MessageBox(_T("对不起,没有发现dict.dbf文件!"));
// return FALSE;
//}
// CodeBase db;
// XDbfTable *pTable = db.Open(fullFile);
//if(!pTable)
//{
// MessageBox(_T("打开dict.dbf文件出错!"));
// return FALSE;
//}
//m_dragTypes.ResetContent();
//CString szType, szName ,szContent0,szContent1,szContent2,szContent3;
//CListBoxItemData *pItemData = NULL;
//pTable->MoveFirst();
//while(!pTable->IsEOF())
//{
// GET_FIELD(pTable, _T("type"), szType);
// GET_FIELD(pTable, _T("name"), szName);
// //add by whl
// GET_FIELD(pTable, _T("content0"),szContent0);
// GET_FIELD(pTable, _T("content1"),szContent1);
// GET_FIELD(pTable, _T("content2"),szContent2);
// GET_FIELD(pTable, _T("content3"),szContent3);
// int iRet = m_dragTypes.FindStringExact(-1, szType);
// if(iRet != LB_ERR)
// pItemData = (CListBoxItemData *)m_dragTypes.GetItemDataPtr(iRet);
// else
// {
// int iType = m_dragTypes.AddString(szType);
// pItemData = new CListBoxItemData;
// m_dragTypes.SetItemDataPtr(iType, pItemData);
// }
// if(szName == _T(""))
// pTable->Delete();
// else
// {
// if(pItemData > NULL)
// {
// long oldLen=pItemData->lstNames.GetLength();
// pItemData->lstNames.FindDataOrAddTail(CNameString(szName));
//
// //add by whl
// if(pItemData->lstNames.GetLength()>oldLen)//确实新建了条目
// {
// CNameString*pString=pItemData->lstNames.GetCurData();//最后一个
// pString->m_sContent=szContent0+szContent1+szContent2+szContent3;
// }
// }
// }
// pTable->MoveNext();
//}
return TRUE;
}
BOOL CInsTextDlg::WriteStoreData()
{
//XString fullFile;
// if(!FindFile(_T("dict.dbf"), fullFile))
//{
// MessageBox(_T("对不起,没有发现dict.dbf文件!"));
// return FALSE;
//}
// CodeBase db;
//XDbfTable *pTable = db.Open(fullFile);
//if(!pTable)
//{
// MessageBox(_T("打开dict.dbf文件出错!"));
// return FALSE;
//}
//CString szType;
//pTable->MoveFirst();
//for(long i=0; i<m_dragTypes.GetCount(); i++)
//{
// m_dragTypes.GetText(i, szType);
// if(_tcscmp(szType, c_szAll) == 0)
// continue;
// CListBoxItemData *pItemData = (CListBoxItemData *)m_dragTypes.GetItemDataPtr(i);
// if(pItemData <= NULL)
// continue;
// for(pItemData->lstNames.MoveToFirst(); !pItemData->lstNames.IsOut(); pItemData->lstNames.MoveToNext())
// {
// CString szName,szContent0,szContent1,szContent2,szContent3;
// pItemData->lstNames.GetCurData()->Split(szName,szContent0,szContent1,szContent2,szContent3);
// if(!pTable->IsEOF())
// {
// SET_FIELD(pTable, _T("type"), (const TCHAR*)szType);
// SET_FIELD(pTable, _T("name"), (const TCHAR*)szName);
// //add by whl
// SET_FIELD(pTable, _T("content0"),(const TCHAR*)szContent0);
// SET_FIELD(pTable, _T("content1"),(const TCHAR*)szContent1);
// SET_FIELD(pTable, _T("content2"),(const TCHAR*)szContent2);
// SET_FIELD(pTable, _T("content3"),(const TCHAR*)szContent3);
// }
// else
// {
// pTable->AppendBegin();
// SET_FIELD(pTable, _T("type"), (const TCHAR*)szType);
// SET_FIELD(pTable, _T("name"), (const TCHAR*)szName);
// //add by whl
// SET_FIELD(pTable, _T("content0"),(const TCHAR*)szContent0);
// SET_FIELD(pTable, _T("content1"),(const TCHAR*)szContent1);
// SET_FIELD(pTable, _T("content2"),(const TCHAR*)szContent2);
// SET_FIELD(pTable, _T("content3"),(const TCHAR*)szContent3);
// pTable->AppendEnd();
// }
// pTable->MoveNext();
// }
//}
//while(!pTable->IsEOF())
//{
// pTable->Delete();
// pTable->MoveNext();
//}
//pTable->Pack();
return TRUE;
}
///////////////////////////////////////////////////////////////////
// CArchTextLibDlg 对话框
double g_nDimHeight = 3.5, g_nScaleDim = 0.8;
CString g_csDimStyle = _T("STANDARD");
// add by xly on 101014 初始化静态数据
CString CArchTextLibDlg::m_csTextStyle = g_csDimStyle;
// add by xly on 101222 初始化字高的静态变量
CString CArchTextLibDlg::m_csHeight = _T("3.5");
IMPLEMENT_DYNAMIC(CArchTextLibDlg, CInsTextDlg)
CArchTextLibDlg::CArchTextLibDlg(CWnd* pParent /*=NULL*/)
: CInsTextDlg(CArchTextLibDlg::IDD, pParent)
{
m_iAlign = 6;
// delete by xly on 101222 修改为静态变量
//m_csHeight = _T("");
// delete by xly on 101014 记录文字样式
//m_csTextStyle = g_csDimStyle;
m_iRunMode = 0;
}
CArchTextLibDlg::~CArchTextLibDlg()
{
}
void CArchTextLibDlg::DoDataExchange(CDataExchange* pDX)
{
CInsTextDlg::DoDataExchange(pDX);
DDX_CBIndex(pDX, IDC_COMBO_ALIGN, m_iAlign);
DDX_CBString(pDX, IDC_COMBO_TEXTHEIGHT, m_csHeight);
DDX_CBString(pDX, IDC_COMBO_TEXTSTYLE, m_csTextStyle);
DDX_Control(pDX, IDC_COMBO_TEXTSTYLE, m_comboStyle);
DDX_Control(pDX, IDC_BUTTON_FILE, m_buttonFile);
}
BEGIN_MESSAGE_MAP(CArchTextLibDlg, CInsTextDlg)
ON_LBN_DBLCLK(IDC_DRAG_NAME, OnLbnDblclkDragName)
ON_BN_CLICKED(IDC_BUTTON_FILE, OnBnClickedButtonFile)
ON_BN_CLICKED(IDC_EXPORT, OnExport)
ON_BN_CLICKED(IDC_BUTTON_REPLACE, OnButtonReplace)
ON_BN_CLICKED(IDC_BUTTON_PICK, OnButtonPick)
ON_WM_CLOSE()
ON_WM_TIMER()
// ON_BN_CLICKED(IDC_ADDTOLIB, &CArchTextLibDlg::OnBnClickedAddtolib)
END_MESSAGE_MAP()
// add by xly 0n 101015 获得图中所有文字样式
void LoadTextStyle(XStringList &lstStyle)
{
AcDbDatabase *pCurDwg=acdbCurDwg();
AcDbTextStyleTable* pTT;
VERIFY(pCurDwg->getSymbolTable(pTT, AcDb::kForRead)==Acad::eOk);
AcDbTextStyleTableIterator* pIter = NULL;
VERIFY(pTT->newIterator(pIter)==Acad::eOk);
pTT->close();
for (pIter->start(); !pIter->done(); pIter->step())
{
AcDbTextStyleTableRecord* pTTR;
if (pIter->getRecord(pTTR, AcDb::kForRead) != Acad::eOk)
continue;
const TCHAR* pName = NULL;
if (pTTR->getName(pName) == Acad::eOk && pName != NULL)
{
if(lstStyle.Index(pName) < 0 ) // 如果没有重复
lstStyle.Append(tstrnew(pName)); // 读字体风格
}
pTTR->close();
}
delete pIter;
}
// CArchTextLibDlg 消息处理程序
BOOL CArchTextLibDlg::OnInitDialog()
{
CInsTextDlg::OnInitDialog();
// delete by xly on 101222 修改为静态变量
// 字高
//m_csHeight.Format(_T("%.1f"), g_nDimHeight);
((CComboBox*)GetDlgItem(IDC_COMBO_TEXTHEIGHT))->SelectString(-1, m_csHeight);
// modify by xly 0n 101015 获得图中所有文字样式,文字样式不用全部大写
// 字体样式
/*XSymbolList lstStyle(_T("STYLE"));
for (int i =0; i<lstStyle.Length(); i++)
m_comboStyle.AddString(lstStyle[i]);*/
XStringList lstStyle;
LoadTextStyle(lstStyle);
// add by xly on 110310保存文字样式到图纸中
m_csTextStyle = DocGetTgSingleTextStyle();
// add by xly on 110106 如果使用新创建的文字样式,图纸切换时产生bug
bool bIsHas(false);// 标记文字样式中,是否有当前样式
for (int m =0; m < lstStyle.Length(); m++)
{
m_comboStyle.AddString(lstStyle[m]);
// 标记文字样式中有当前样式
if (lstStyle[m] == m_csTextStyle)
{
bIsHas = true;
}
}
// 没有当前样式,设置默认样式Stantard
if (!bIsHas)
{
TCHAR sStyle[256]=_T("");
xg_getvar(_T("TEXTSTYLE"), sStyle);
m_csTextStyle = sStyle;
}
// add by xly on 110429 文字样式不存在
if (m_csTextStyle.IsEmpty())
{
TCHAR sStyle[256]=_T("");
xg_getvar(_T("TEXTSTYLE"), sStyle);
m_csTextStyle = sStyle;
}
m_comboStyle.SelectString(-1, m_csTextStyle);
// add by xly on 110311 保存文字样式到图纸中,更新空间显示
m_comboStyle.SetCurSel(m_comboStyle.FindStringExact(0, m_csTextStyle));
//SetTimer(1, 200, NULL);removed by whl
return TRUE;
}
void CArchTextLibDlg::OnLbnDblclkDragName()
{
return;
}
// Zyu modify on 100726,支持64位
//void CArchTextLibDlg::OnTimer(UINT nIDEvent)
void CArchTextLibDlg::OnTimer(UINT_PTR nIDEvent)
{
CPoint point;
GetCursorPos(&point);
CRect rect;
GetWindowRect(&rect);
if(rect.PtInRect(point))
{
if(!m_bInDialog)
{
this->SetFocus();
m_bInDialog = TRUE;
}
}
else
{
if(m_bInDialog)
{
acedGetAcadDwgView()->SetFocus();
m_bInDialog = FALSE;
}
}
CInsTextDlg::OnTimer(nIDEvent);
}
void CArchTextLibDlg::OnExport()
{
SetFileApisToOEM();
CFileDialog dlg(FALSE, _T("xml"), _T("词库"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT
, _T("xml文档(*.xml)|*.xml|文本文挡(*.txt)|*.txt||"));
if(dlg.DoModal() != IDOK)
return;
CStdioFile file;
if(!file.Open(dlg.GetFileName(), CFile::modeCreate|CFile::modeWrite))
{
MessageBox(CString(_T("打开"))+dlg.GetFileName()+_T("失败!"));
return;
}
CString strTem = dlg.GetFileName();
int i=0;
for (i=0;i<strTem.GetLength();i++)
{
TCHAR ch = strTem.GetAt(i);
if (ch == '.')
{
break;
}
}
strTem.Delete(0,i+1);
if (m_pXMlDoc==NULL)
{
return;
}
HTREEITEM hItem = m_treeNames.GetSelectedItem();
HTREEITEM hRoot = m_treeNames.GetRootItem();
CXMLNodeInfo *pData = (CXMLNodeInfo*)(m_treeNames.GetItemData(hItem));
if (!strTem.CompareNoCase(_T("txt")))
{
if (hRoot == hItem)
{
CXMLDOMNodePtr pXMLDOMNodePtr = m_pXMlDoc->GetRoot();
ExportTxt(file,pXMLDOMNodePtr);
}
else
{
if (pData)
{
CXMLDOMNodePtr pXMLDOMNodePtr = m_pXMlDoc->SelectSingleNode(pData->m_strNodeXPath);
ExportTxt(file,pXMLDOMNodePtr);
}
}
file.Close();
}
else
{
file.Close();
CString strVersion = m_pXMlDoc->GetVersion();
CString ss = dlg.GetPathName();
if (BuildDynamicXMLwithProcessingInstruction(ss))
{
int i =0;
}
}
}
BOOL CArchTextLibDlg::BuildDynamicXMLwithProcessingInstruction(CString&strPath)
{
int nLen = strPath.GetLength();
TCHAR *szPath = new TCHAR[nLen+1];
assert( NULL!= szPath );
if( NULL == szPath )
{
return FALSE;
}
_tcscpy( szPath,strPath.GetBuffer(nLen));
BOOL bResult = FALSE;
strPath.ReleaseBuffer();
MSXML2::IXMLDOMDocument2Ptr pXMLDOMDocument=NULL;
MSXML2::IXMLDOMProcessingInstructionPtr pIXMLDOMProcessingInstruction=NULL;
MSXML2::IXMLDOMNodePtr pIXMLDOMNode = NULL;
HRESULT hr ;
// BSTR bstrValue ;
try
{
/*hr=CoCreateInstance(CLSID_DOMDocument26, NULL,CLSCTX_ALL ,
IID_IXMLDOMDocument2, (LPVOID*)(&pXMLDOMDocument));*/
// Zyu modify on 100727,支持64位
hr =pXMLDOMDocument.CreateInstance( __uuidof( MSXML2::DOMDocument60 ) );
SUCCEEDED(hr) ? 0 : throw hr;
if(pXMLDOMDocument)
{
pIXMLDOMProcessingInstruction = pXMLDOMDocument->createProcessingInstruction(_T("xml"),
_T("version='1.0' encoding='utf-8'"));
if(pIXMLDOMProcessingInstruction)
{
_variant_t vNullVal;
vNullVal.vt = VT_NULL;
pXMLDOMDocument->insertBefore(pIXMLDOMProcessingInstruction,vNullVal);
_variant_t varNodeType((short)MSXML2::NODE_ELEMENT);
HTREEITEM hParent = m_treeNames.GetRootItem();
CXMLNodeInfo *pParentData = (CXMLNodeInfo*)(m_treeNames.GetItemData(hParent));
pIXMLDOMNode=pXMLDOMDocument->createNode(varNodeType,c_szTDWord,_T(""));
if (pParentData->m_strNodeName!=_T(""))
{
if (pIXMLDOMNode)
{
MSXML2::IXMLDOMElementPtr pXMLDOMElement = NULL;
pXMLDOMElement = static_cast< MSXML2::IXMLDOMElementPtr >(pIXMLDOMNode);
if (pXMLDOMElement)
{
if (pParentData->m_strNodeAttributeName!=_T("")
&&pParentData->m_strNodeAttributeValue!=_T(""))
{
pXMLDOMElement->setAttribute( _bstr_t(pParentData->m_strNodeAttributeName), _variant_t((TCHAR*)(pParentData->m_strNodeAttributeValue.GetBuffer(0))));
}
}
}
}
if (pIXMLDOMNode!=NULL)
{
pXMLDOMDocument->appendChild(pIXMLDOMNode);
pIXMLDOMNode->appendChild(pXMLDOMDocument->createTextNode("\n"));
}
if(SUCCEEDED(hr))
{
bResult=TRUE;
}
if (pIXMLDOMNode)
{
HTREEITEM hItem = m_treeNames.GetSelectedItem();
HTREEITEM hRoot = m_treeNames.GetRootItem();
if (hItem == hRoot)
{
CXMLDOMNodePtr pXMLDOMNodePtr = m_pXMlDoc->GetRoot();
CString strNodeName = pXMLDOMNodePtr->GetNodeName();
CXMLDOMNodesPtr pNodes = pXMLDOMNodePtr->GetChildrenNodes(strNodeName);
int nCount = pNodes->GetCount();
int i =0;
for (;i<nCount;i++)
{
VARIANT_BOOL vb = VARIANT_TRUE;
MSXML2::IXMLDOMNodePtr pTemIXMLDOMNodePtr = NULL;
CXMLDOMNodePtr pTemXMLDOMNodePtr = pNodes->GetItem(i);
pTemIXMLDOMNodePtr = pTemXMLDOMNodePtr->GetNodePtr();
MSXML2::IXMLDOMNodePtr pChild = NULL;
pChild = pTemIXMLDOMNodePtr->cloneNode(vb);
pIXMLDOMNode->appendChild(pChild);
if (pChild!=NULL)
{
pChild.Release();
}
}
}
else
{
CXMLNodeInfo *pData = (CXMLNodeInfo*)(m_treeNames.GetItemData(hItem));
if (pData)
{
CString strXPath = pData->m_strNodeXPath;
HTREEITEM hFather = m_treeNames.GetParentItem(hItem);;
//if (hItem==hRoot)
//{
// hFather = hRoot;
//}
XMLNodeInfoArray aryNodeInfo;
while(hFather !=hRoot)
{
CXMLNodeInfo *pParentData = (CXMLNodeInfo*)(m_treeNames.GetItemData(hFather));
CXMLNodeInfo InfoTem(*pParentData);
if (InfoTem.m_strNodeName!=c_szTDWord)
{
aryNodeInfo.AddTail(InfoTem);
}
hFather = m_treeNames.GetParentItem(hFather);
}
aryNodeInfo.Reverse();
int nNum = aryNodeInfo.GetLength();
MSXML2::IXMLDOMNodePtr pTemFatherIXMLDOMNodePtr = pIXMLDOMNode;
int i=0;
for (;i<nNum;i++)
{
VARIANT_BOOL vb = VARIANT_FALSE;
CXMLNodeInfo InfoTem = aryNodeInfo.GetAt(i);
CXMLDOMNodePtr pXMLDOMNodePtr = m_pXMlDoc->SelectSingleNode(InfoTem.m_strNodeXPath);
MSXML2::IXMLDOMNodePtr pTemIXMLDOMNodePtr = NULL;
MSXML2::IXMLDOMNodePtr pClone = NULL;
pTemIXMLDOMNodePtr = pXMLDOMNodePtr->GetNodePtr();
pClone = pTemIXMLDOMNodePtr->cloneNode(vb);
pTemFatherIXMLDOMNodePtr = pTemFatherIXMLDOMNodePtr->appendChild(pClone);
if (pClone!=NULL)
{
pClone.Release();
}
}
CXMLDOMNodePtr pXMLDOMNodePtr = m_pXMlDoc->SelectSingleNode(pData->m_strNodeXPath);
MSXML2::IXMLDOMNodePtr pTemIXMLDOMNodePtr = NULL;
pTemIXMLDOMNodePtr = pXMLDOMNodePtr->GetNodePtr();
VARIANT_BOOL vb = VARIANT_TRUE;
MSXML2::IXMLDOMNodePtr pClone = NULL;
pClone = pTemIXMLDOMNodePtr->cloneNode(vb);
pTemFatherIXMLDOMNodePtr->appendChild(pClone);
if (pClone!=NULL)
{
pClone.Release();
}
if (pTemFatherIXMLDOMNodePtr != pIXMLDOMNode)
{
if (pTemFatherIXMLDOMNodePtr!=NULL)
{
pTemFatherIXMLDOMNodePtr.Release();
}
}
}
}
//xsl样式单
CString strMyStyle = _T("<?xml version=\"1.0\"?>\n<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">\n<xsl:output method = \"xml\" omit-xml-declaration = \"yes\" indent = \"yes\"/>\n<xsl:template match=\"/ | @* | node()\">\n<xsl:copy>\n<xsl:apply-templates select=\"@* | node()\"/>\n</xsl:copy>\n</xsl:template>\n</xsl:stylesheet>");
IXMLDOMDocument2Ptr pStyle=NULL;
// Zyu modify on 100727,支持64位
hr = pStyle.CreateInstance(__uuidof( MSXML2::DOMDocument60 ));
CString strStyle(strMyStyle);
pStyle->loadXML(strStyle.AllocSysString());
CString strTest((BSTR)(pXMLDOMDocument->xml));
IXMLDOMDocument2Ptr pNew=NULL;
// Zyu modify on 100727,支持64位
hr = pNew.CreateInstance(__uuidof(MSXML2::DOMDocument60));
pNew->loadXML(pXMLDOMDocument->transformNode(pStyle));
CString strNew((BSTR)(pNew->xml));
strNew=CString("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")+strNew;
pNew.Release();
// Zyu modify on 100727,支持64位
pNew.CreateInstance(__uuidof(MSXML2::DOMDocument60));
pNew->loadXML(strNew.AllocSysString());
if( NULL != pXMLDOMDocument )
{
pXMLDOMDocument.Release();
}
pXMLDOMDocument = NULL;
hr = pNew->save(_variant_t((TCHAR*)szPath));
SUCCEEDED(hr) ? 0 : throw hr;
pIXMLDOMNode.Release();
pNew.Release();
pNew = NULL;
}
if (pIXMLDOMProcessingInstruction)
{
pIXMLDOMProcessingInstruction.Release();
}
}
if (pXMLDOMDocument!=NULL)
{
pXMLDOMDocument.Release();
}
}
}
catch(...)
{
if (pIXMLDOMNode)
{
pIXMLDOMNode.Release();
}
if (pIXMLDOMProcessingInstruction)
{
pIXMLDOMProcessingInstruction.Release();
}
if (pXMLDOMDocument)
{
pXMLDOMDocument.Release();
}
}
return bResult;
}
void CArchTextLibDlg::ExportTxt(CStdioFile &file,const CXMLDOMNodePtr &pXmlNode)
{
CXMLDOMNodesPtr pXMLNodeList = pXmlNode->GetChildrenNodes(pXmlNode->GetNodeName());
int count = pXMLNodeList->GetCount();
CString strNodeName = pXmlNode->GetNodeName();
if(count==0&&strNodeName == c_szLemma)
{
CXMLNodeInfo xmlNodeInfo = GetNodeInfoEx(pXmlNode,m_pXMlDoc);
xmlNodeInfo.m_strNodeValue.TrimLeft();
xmlNodeInfo.m_strNodeValue.TrimRight();
if (xmlNodeInfo.m_strNodeValue==_T(""))
{
file.WriteString(xmlNodeInfo.m_strNodeAttributeValue);
}
else
{
file.WriteString(xmlNodeInfo.m_strNodeValue);
}
file.WriteString(_T("\n"));
return;
}
int i=0;
for(i=0; i<count; i++)
{
CXMLDOMNodePtr pChildNode = pXMLNodeList->GetItem(i);
CString strAttriName = pChildNode->GetAttributeName();
CString strAttriValve = pChildNode->GetAttributeValue(strAttriName);
if (strAttriValve == c_szLate)
{
continue;
}
// HTREEITEM hSubItem;
ExportTxt(file,pChildNode);//递归子节点
}
}
void CArchTextLibDlg::ReadTxt(HTREEITEM hItem,const CString &strPath,CXMLDOMNodePtr&pXMLDOMNodePtr)
{
CStdioFile file;
if(!file.Open(strPath, CFile::modeRead))
{
MessageBox(CString(_T("打开"))+strPath+_T("失败!"));
return;
}
while(file.ReadString(m_szName))
{
CNameString *pString=CreateNameString();
if(pString==NULL)
continue;
if (m_bSort)
{
if(m_sortNames.FindStringExact(-1,*pString)>=0)
{
MessageBox(CString(_T("<"))+*pString+_T(">项已经存在!"));
delete pString;
continue;
}
}
else
{
if(m_dragNames.FindStringExact(-1,*pString)>=0)
{
MessageBox(CString(_T("<"))+*pString+_T(">项已经存在!"));
delete pString;
continue;
}
}
CXMLNodeInfo xmlInfo;
xmlInfo.m_bLeafNode = TRUE;
xmlInfo.m_strNodeName = c_szLemma;
xmlInfo.m_strNodeValue = m_szName;
xmlInfo.m_strNodeAttributeName = c_szName;
xmlInfo.m_strNodeAttributeValue = *pString;
CXMLDOMNodePtr pTem =pXMLDOMNodePtr->AppendNode(xmlInfo.m_strNodeName,xmlInfo.m_strNodeValue,
xmlInfo.m_strNodeAttributeName,xmlInfo.m_strNodeAttributeValue);
m_pXMlDoc->GetCurNodeXPath(pTem,xmlInfo.m_strNodeXPath);
//m_pXMlDoc->Save();
m_dragNames.AddStringEx(*pString,&xmlInfo);
}
file.Close();
}
void CArchTextLibDlg::ReadXml(HTREEITEM hItem,const CString &strPath,CXMLDOMNodePtr&pXMLDOMNodePtr)
{
int nLen = strPath.GetLength();
const TCHAR* strFileName = strPath;
MSXML2::IXMLDOMDocument2Ptr pXMLDOMDocument=NULL;
HRESULT hr ;
// BSTR bstrValue ;
// Zyu modify on 100727,支持64位
hr =pXMLDOMDocument.CreateInstance( __uuidof( MSXML2::DOMDocument60 ) );
SUCCEEDED(hr) ? 0 : throw hr;
pXMLDOMDocument->async = VARIANT_TRUE;
if (pXMLDOMDocument->load(strFileName) == VARIANT_TRUE)
{
MSXML2::IXMLDOMElementPtr pRoot =NULL;
pXMLDOMDocument->get_documentElement(&pRoot);
CXMLDOMNodePtr pRootNode( new CXMLDOMNode( pRoot ) );
CString strNodeName = pRootNode->GetNodeName();
CXMLDOMNodesPtr pNodesList=pRootNode->GetChildrenNodes(strNodeName);
int nCount = pNodesList->GetCount();
if (strNodeName == _T("上华词库"))
{
int i=0;
while(pNodesList->GetCount()>0)//for (i=0;i<pNodesList->GetCount();i++)
{
CXMLDOMNodePtr pTemNode = pNodesList->GetItem(0);
//i--;
if (pTemNode->GetNodePtr() !=NULL)
{
CString strNodeName = pTemNode->GetNodeName();
CString strAttriName = pTemNode->GetAttributeName();
CString strAttriValue = pTemNode->GetAttributeValue(strAttriName);
CXMLDOMNodePtr pRetNode( new CXMLDOMNode( NULL ) );
BOOL bDelete = TRUE;
if (pXMLDOMNodePtr->IsChildNodeExist(strNodeName,strAttriName,strAttriValue,pRetNode))
{
CString str = _T("发现相同目录\"")+strAttriValue+_T("\",是否用新目录内容替换?");
if (MessageBox(str,NULL,MB_OKCANCEL) ==IDOK )
{
pRetNode->InsertBefore(pTemNode);
pRetNode->DeleteNode();
}
}
else
{
pXMLDOMNodePtr->AppendNode(pTemNode);
bDelete = FALSE;
}
}
}
}
else
{
MessageBox(_T("请选择词库文件!"));
}
if (pRoot!=NULL)
{
pRoot.Release();
pRoot = NULL;
}
}
if (pXMLDOMDocument!=NULL)
{
pXMLDOMDocument.Release();
pXMLDOMDocument = NULL;
}
return;
}
void CArchTextLibDlg::ReadDbf(HTREEITEM hItem,const CString &strPath,CXMLDOMNodePtr&pXMLDOMNodePtr)
{
CodeBase db;
XString fullFile;
//if(!FindFile(_T("dict.dbf"), fullFile))
//{
// MessageBox(_T("对不起,没有发现dict.dbf文件!"));
// return ;
//}
CString strFileName = strPath;
strFileName.MakeReverse();
int nPos = strFileName.Find(_T("\\"),0);
strFileName = strFileName.Mid(0,nPos);
strFileName.MakeReverse();
nPos = strFileName.Find(_T("."),0);
strFileName = strFileName.Mid(0,nPos);
if (strFileName.CompareNoCase(_T("dict")))
{
MessageBox(_T("此文件不是词库文件!"));
return;
}
XDbfTable *pTable = db.Open(strPath);
if(!pTable)
{
MessageBox(_T("打开dict.dbf文件出错!"));
return;
}
CString szType, szName ,szContent0,szContent1,szContent2,szContent3;
TARCHWORDLIBDBFMAP wordlibmap;
pTable->MoveFirst();
while(!pTable->IsEOF())
{
GET_FIELD(pTable, _T("type"), szType);
GET_FIELD(pTable, _T("name"), szName);
//add by whl
GET_FIELD(pTable, _T("content0"),szContent0);
GET_FIELD(pTable, _T("content1"),szContent1);
GET_FIELD(pTable, _T("content2"),szContent2);
GET_FIELD(pTable, _T("content3"),szContent3);
CString strValue = szContent0+szContent1+szContent2+szContent3;
int n0 = 0;
szContent0.Find('\r',n0);
int n1 = 0;
szContent1.Find('\r',n1);
TARCHWORDLIBDBFMAP::iterator iter;
iter = wordlibmap.find(szType);
WordLibDbfInfo dbInfo;
dbInfo.m_strAttrivalue = szName;
dbInfo.m_strvalue = strValue;
if (iter!=wordlibmap.end())
{
wordlibmap[szType].AddTail(dbInfo);
}
else
{
DBFArray ary;
ary.AddTail(dbInfo);
wordlibmap.insert(TARCHWORDLIBDBFMAP::value_type(szType,ary));
}
pTable->MoveNext();
}
CXMLDOMNodePtr pRoot = m_pXMlDoc->GetRoot();
CString strName = pRoot->GetNodeName();
CXMLDOMNodesPtr pList = pRoot->GetChildrenNodes(strName);
int nCount = pList->GetCount();
int i =0;
BOOL bHas = FALSE;
for (i=0;i<nCount;i++)
{
CXMLDOMNodePtr pChild = pList->GetItem(i);
CString strChildName = pChild->GetAttributeName();
CString strChildValue = pChild->GetAttributeValue(strChildName);
TARCHWORDLIBDBFMAP::iterator iter;
iter = wordlibmap.find(strChildValue);
if (iter!=wordlibmap.end())
{
CString strNodeName = pChild->GetNodeName();
if (pChild->HasChildNodes())
{
DBFArray aryDbf = iter->second;
int k =0,nLen =0;
nLen = aryDbf.GetLength();
for (k=0;k<nLen;k++)
{
WordLibDbfInfo dbfInfo = aryDbf.GetAt(k);
if (!pChild->IsChildNodeExist(c_szLemma,c_szName,dbfInfo.m_strAttrivalue))
{
pChild->AppendNode(c_szLemma,dbfInfo.m_strvalue,c_szName,
dbfInfo.m_strAttrivalue);
}
}
}
else
{
DBFArray aryDbf = iter->second;
int k =0,nLen =0;
nLen = aryDbf.GetLength();
for (k=0;k<nLen;k++)
{
WordLibDbfInfo dbfInfo = aryDbf.GetAt(k);
pChild->AppendNode(c_szLemma,dbfInfo.m_strvalue,c_szName,
dbfInfo.m_strAttrivalue);
}
}
wordlibmap.erase(iter);
}
}
TARCHWORDLIBDBFMAP::iterator iter = wordlibmap.begin();
for (;iter!=wordlibmap.end();iter++)
{
DBFArray aryDbf = iter->second;
CXMLDOMNodePtr pChild = pRoot->AppendNode(c_szCatalog,_T(""),c_szName,iter->first);
int k =0,nLen =0;
nLen = aryDbf.GetLength();
for (k=0;k<nLen;k++)
{
WordLibDbfInfo dbfInfo = aryDbf.GetAt(k);
pChild->AppendNode(c_szLemma,dbfInfo.m_strvalue,c_szName,
dbfInfo.m_strAttrivalue);
}
}
//m_pXMlDoc->Save();
}
void CArchTextLibDlg::OnBnClickedButtonFile()
{
CFileDialog dlg(TRUE, _T("xml"), _T("*.xml"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT
, _T("xml文档(*.xml)|*.xml|dbf文档(*.dbf)|*.dbf|文本文挡(*.txt)|*.txt||"));
if(dlg.DoModal() != IDOK)
return;
CString strPath = dlg.GetPathName();
CString strTem = dlg.GetFileName();
int i=0;
for (i=0;i<strTem.GetLength();i++)
{
TCHAR ch = strTem.GetAt(i);
if (ch == '.')
{
break;
}
}
strTem.Delete(0,i+1);
HTREEITEM hItem = m_treeNames.GetSelectedItem();
HTREEITEM hRoot = m_treeNames.GetRootItem();
if (hRoot==hItem)
{
if (m_pXMlDoc!=NULL)
{
CXMLDOMNodePtr pXMLDOMNodePtr = m_pXMlDoc->GetRoot();
if (!strTem.CompareNoCase(_T("txt")))
{
ReadTxt(hItem,strPath,pXMLDOMNodePtr);
}
else if (!strTem.CompareNoCase(_T("xml")))
{
ReadXml(hItem,strPath,pXMLDOMNodePtr);
}
else
{
ReadDbf(hItem,strPath,pXMLDOMNodePtr);
}
}
}
else
{
if (m_pXMlDoc!=NULL)
{
CXMLNodeInfo *pData = (CXMLNodeInfo*)(m_treeNames.GetItemData(hItem));
CXMLDOMNodePtr pXMLDOMNodePtr = m_pXMlDoc->SelectSingleNode(pData->m_strNodeXPath);
if (!strTem.CompareNoCase(_T("txt")))
{
ReadTxt(hItem,strPath,pXMLDOMNodePtr);
}
else if (!strTem.CompareNoCase(_T("xml")))
{
ReadXml(hItem,strPath,pXMLDOMNodePtr);
}
else
{
ReadDbf(hItem,strPath,pXMLDOMNodePtr);
}
}
}
DeleteTree();
InitTree();
}
void CArchTextLibDlg::OnButtonReplace()
{
m_iRunMode = 1;
acedGetAcadDwgView()->SetFocus();
PostCommand(_T("` "), false);
}
void CArchTextLibDlg::OnButtonPick()
{
m_iRunMode = 2;
acedGetAcadDwgView()->SetFocus();
PostCommand(_T("` "), false);
}
void CArchTextLibDlg::OnClose()
{
CInsTextDlg::OnClose();
acedPostCommand(_T("\33\33"));
}
void CArchTextLibDlg::SetTextStyle(const TCHAR* szStyle)
{
CString csStyle = szStyle;
int len = m_comboStyle.GetCount();
for(int i=0;i<len;i++){
CString csTmp;
m_comboStyle.GetLBText(i, csTmp);
if(csTmp == csStyle){
m_csTextStyle = szStyle;
m_comboStyle.SetCurSel(i);
return;
}
}
}
//*******************************************************************************
// TTextEdJig
//*******************************************************************************
XExplodeDraw::TextAlignment TTextEdJig::m_AlignList[] = { XExplodeDraw::kTopLeft, XExplodeDraw::kTopCenter ,
XExplodeDraw::kTopRight, XExplodeDraw::kMiddleLeft ,
XExplodeDraw::kMiddleCenter, XExplodeDraw::kMiddleRight ,
XExplodeDraw::kBottomLeft, XExplodeDraw::kBottomCenter ,
XExplodeDraw::kBottomRight,};
TTextEdJig::TTextEdJig(BOOL bIsTg, XPoint pt, double nHeight, const TCHAR*szText, AcDbObjectId idStyle, double nRotation)
{
m_pDlg = NULL;
m_pText = NULL;
m_pAcadText = NULL;
m_bIsTgText = bIsTg;
if(m_bIsTgText){
m_pText = new TDbText();
m_pText->SetStyleId(idStyle);
m_pText->SetRotation(nRotation);
m_pText->SetHeight(nHeight);
m_pText->SetText(szText);
m_pText->SetLocation(pt);
}
else{
m_pAcadText = new AcDbText();
m_pAcadText->setRotation(nRotation);
m_pAcadText->setHeight(nHeight);
m_pAcadText->setTextString(szText);
m_pAcadText->setTextStyle(idStyle);
m_pAcadText->setPosition(pt);
m_pAcadText->setAlignmentPoint(pt);
}
}
TTextEdJig::TTextEdJig(CArchTextLibDlg *dlg, XPoint pt)
{
m_pDlg = dlg;
m_pAcadText = NULL;
dlg->UpdateData(TRUE);
AcDbObjectId idTextStyle = GetTextStyleId(dlg->m_csTextStyle);
m_pText = new TDbText();
m_pText->SetStyleId(idTextStyle);
m_pText->SetHeight(_tstof(dlg->m_csHeight));
m_pText->SetText(dlg->GetEditText());
m_pText->SetLocation(pt);
m_pText->SetAlignment(m_AlignList[dlg->m_iAlign]);
}
TTextEdJig::~TTextEdJig()
{
if(m_pText)
delete m_pText;
if(m_pAcadText)
delete m_pAcadText;
}
AcEdJig::DragStatus
TTextEdJig::GetPoint(XPoint &pt)
{
if(!m_ptRef)
return acquirePoint(pt);
else
return acquirePoint(pt, m_ptRef);
}
int TTextEdJig::DoIt(int *keyIndex)
{
int nRet = TSymbEdJig::DoIt(keyIndex);
return nRet;
}
// 更新实体数据
Adesk::Boolean TTextEdJig::update()
{
Adesk::Boolean bRet=Adesk::kTrue;
if(m_pDlg){
m_pDlg->UpdateData(TRUE);
AcDbObjectId idTextStyle = GetTextStyleId(m_pDlg->m_csTextStyle);
m_pText->SetStyleId(idTextStyle);
m_pText->SetHeight(_tstof(m_pDlg->m_csHeight));
m_pText->SetText(m_pDlg->GetEditText());
m_pText->SetLocation(m_ptResult);
m_pText->SetRotation(Ucs2Wcs(0.0));//支持UCS
CString sTemp(m_pDlg->GetEditText());
if(sTemp.Find(_T("\n"))>=0||sTemp.Find(_T("\r"))>=0)//多行文字
m_pText->SetAlignment(XExplodeDraw::kTopLeft);
else
m_pText->SetAlignment(m_AlignList[m_pDlg->m_iAlign]);
}
else{
if(m_pText)
m_pText->SetLocation(m_ptResult);
if(m_pAcadText){
m_pAcadText->setAlignmentPoint(m_ptResult);
XPoint ptInsert = m_ptResult;
ptInsert.TransformBy(m_AcadTextMat);
m_pAcadText->setPosition(ptInsert);
}
}
return bRet;
}
AcDbEntity* TTextEdJig::entity() const
{
if(m_pDlg){
return (AcDbEntity *)m_pText;
}
else{
if(m_bIsTgText)
return (AcDbEntity *)m_pText;
else
return (AcDbEntity *)m_pAcadText;
}
return NULL;
}
void TTextEdJig::SetAlign(AcDb::TextVertMode vertMode, AcDb::TextHorzMode horzMode, AcGeMatrix3d mat)
{
if(m_pAcadText){
m_pAcadText->setVerticalMode(vertMode);
m_pAcadText->setHorizontalMode(horzMode);
m_AcadTextMat = mat;
}
}
void TTextEdJig::SetAlign(XExplodeDraw::TextAlignment Align)
{
if(m_pText)
m_pText->SetAlignment(Align);
}
void TTextEdJig::SetWHScale(double nWHScale)
{
if(m_pAcadText)
m_pAcadText->setWidthFactor(nWHScale);
}
//////////////////////////////////////////////////////////////////////
//*******************************************************************************
// TMTextEdJig
//*******************************************************************************
XExplodeDraw::TextAlignment TMTextEdJig::m_AlignList[] = { XExplodeDraw::kTopLeft, XExplodeDraw::kTopCenter ,
XExplodeDraw::kTopRight, XExplodeDraw::kMiddleLeft ,
XExplodeDraw::kMiddleCenter, XExplodeDraw::kMiddleRight ,
XExplodeDraw::kBottomLeft, XExplodeDraw::kBottomCenter ,
XExplodeDraw::kBottomRight,};
TMTextEdJig::TMTextEdJig(BOOL bIsTg, XPoint pt, double nHeight, const TCHAR*szText, AcDbObjectId idStyle, double nRotation)
{
m_pDlg = NULL;
m_pMText = NULL;
m_pAcadMText = NULL;
m_bIsTgText = bIsTg;
m_bSet = FALSE;
m_dWidth = 0;
CString str = szText;
m_strLast = szText;
if(m_bIsTgText)
{
m_pMText = new TDbMText();
m_pMText->SetStyleId(idStyle);
m_pMText->SetRotation(nRotation);
m_pMText->SetHeight(nHeight);
m_pMText->SetText(szText);
m_pMText->SetLocation(pt);
if (str.Find(_T("\n"))>=0||str.Find(_T("\r"))>=0)
{
m_pMText->SetLineSpace(1);
XPoint ptMin,ptMax;
if(m_pMText->GetExtents2d(ptMin,ptMax)==Acad::eOk)
{
ptMin = Wcs2Ucs(ptMin);
ptMax = Wcs2Ucs(ptMax);
double width=ptMax.x-ptMin.x+100;
m_pMText->SetPageWidth(width,FALSE);
}
}
}
else
{
m_pAcadMText = new AcDbMText();
m_pAcadMText->setRotation(nRotation);
m_pAcadMText->setTextHeight(nHeight);
m_pAcadMText->setContents(szText);
m_pAcadMText->setTextStyle(idStyle);
m_pAcadMText->setLocation(pt);
}
}
TMTextEdJig::TMTextEdJig(CArchTextLibDlg *dlg, XPoint pt)
{
m_bSet = FALSE;
m_pDlg = dlg;
m_dWidth = 0;
CString str = dlg->GetEditText();
m_strLast = str;
dlg->UpdateData(TRUE);
AcDbObjectId idTextStyle = GetTextStyleId(dlg->m_csTextStyle);
m_pAcadMText = NULL;
m_pMText = new TDbMText();
m_pMText->SetStyleId(idTextStyle);
m_pMText->SetHeight(_tstof(dlg->m_csHeight));
str.TrimLeft();
str.TrimRight();
m_pMText->SetText(str);
m_pMText->SetLocation(pt);
if (str.Find(_T("\n"))>=0||str.Find(_T("\r"))>=0)
{
m_pMText->SetAlignment(XExplodeDraw::kLeft/*m_AlignList[dlg->m_iAlign]*/);
m_pMText->SetLineSpace(1);
m_pMText->SetPageWidth(0,FALSE);
XPoint ptMin,ptMax;
//ptMin = m_pMText->GetExtents();
if(m_pMText->GetExtents2d(ptMin,ptMax)==Acad::eOk)
{
ptMin = Wcs2Ucs(ptMin);
ptMax = Wcs2Ucs(ptMax);
double width=ptMax.x-ptMin.x+Wcs2Ucs(100);
//width = Ucs2Wcs(width);
m_pMText->SetPageWidth(width,FALSE);
}
}
else
{
m_pMText->SetAlignment(m_AlignList[dlg->m_iAlign]);
}
}
TMTextEdJig::~TMTextEdJig()
{
if(m_pMText)
delete m_pMText;
if(m_pAcadMText)
delete m_pAcadMText;
}
AcEdJig::DragStatus TMTextEdJig::GetPoint(XPoint &pt)
{
AcEdJig::DragStatus st;
if(!m_ptRef)
{
st = acquirePoint(pt);
}
else
{
st = acquirePoint(pt, m_ptRef);
}
return st;
}
int TMTextEdJig::DoIt(int *keyIndex)
{
//AfxTrace(_T("\nDoit1"));
//ads_printf(_T("\nDoit1"));
int nRet = TSymbEdJig::DoIt(keyIndex);
//ads_printf(_T("\nDoit2"));
//AfxTrace(_T("\nDoit2"));
return nRet;
}
// 更新实体数据
Adesk::Boolean TMTextEdJig::update()
{
// Sleep(20);
Adesk::Boolean bRet=Adesk::kTrue;
if(m_pDlg)
{
m_pDlg->UpdateData(TRUE);
CString str = m_pDlg->GetEditText();
AcDbObjectId idTextStyle = GetTextStyleId(m_pDlg->m_csTextStyle);
if (m_pMText)
{
m_pMText->SetStyleId(idTextStyle);
m_pMText->SetHeight((_tstof(m_pDlg->m_csHeight)));
m_pMText->SetText(m_pDlg->GetEditText());
m_pMText->SetLocation(m_ptResult);
m_pMText->SetRotation(Ucs2Wcs(0.0));//支持UCS
if (str.Find(_T("\n"))>=0||str.Find(_T("\r"))>=0)
{
m_pMText->SetLineSpace(1);
m_pMText->SetAlignment(XExplodeDraw::kLeft);
m_pMText->SetPageWidth(0,FALSE);//必须加 否则出错
XPoint ptMin,ptMax,ptTem;
//double dlen = Wcs2Ucs(100);
XPoint pt,ptucs;
pt.x = 100;
pt.y=0;
ptucs = Wcs2Ucs(pt);
if (m_pMText->GetExtents2d(ptMin, ptMax)==Acad::eOk)
{
//ptMin = Wcs2Ucs(ptMin);
//ptMax = Wcs2Ucs(ptMax);
if (m_strLast == m_pDlg->GetEditText())
{
if (!m_bSet)
{
m_dWidth = ptMax.x-ptMin.x+ptucs.x;
m_bSet = TRUE;
}
}
else
{
m_dWidth = ptMax.x-ptMin.x+ptucs.x;
m_bSet = TRUE;
m_strLast = m_pDlg->GetEditText();
}
m_pMText->SetPageWidth(m_dWidth,FALSE);
}
}
m_pMText->SetAlignment(m_AlignList[m_pDlg->m_iAlign]);
}
}
else
{
if(m_pMText)
{
m_pMText->SetLocation(m_ptResult);
m_pMText->SetLineSpace(1);
m_pMText->SetAlignment(XExplodeDraw::kLeft);
XPoint ptMin,ptMax;
if(m_pMText->GetExtents2d(ptMin,ptMax)==Acad::eOk)
{
double width=ptMax.x-ptMin.x+100;
m_pMText->SetPageWidth(width,FALSE);
}
}
if(m_pAcadMText)
{
XPoint ptInsert = m_ptResult;
ptInsert.TransformBy(m_AcadTextMat);
m_pAcadMText->setLocation(ptInsert);
}
}
return bRet;
}
AcDbEntity* TMTextEdJig::entity() const
{
if(m_pDlg)
{
if (m_pMText)
{
return (AcDbEntity *)m_pMText;
}
else
{
return NULL;
}
}
else
{
if(m_bIsTgText)
{
if (m_pMText)
{
return (AcDbEntity *)m_pMText;
}
else
{
return NULL;
}
}
else
{
if (m_pAcadMText)
{
return (AcDbEntity *)m_pAcadMText;
}
else
{
return NULL;
}
}
}
return NULL;
}
void TMTextEdJig::SetAlign(AcDb::TextVertMode vertMode, AcDb::TextHorzMode horzMode, AcGeMatrix3d mat)
{
if(m_pAcadMText)
{
m_AcadTextMat = mat;
}
}
void TMTextEdJig::SetAlign(XExplodeDraw::TextAlignment Align)
{
if(m_pMText)
m_pMText->SetAlignment(XExplodeDraw::kLeft);
}
void TMTextEdJig::SetWHScale(double nWHScale)
{
}
///////////////////////////////////////////////////
void WordLib()
{
XString fullFile;
if(!FindFile(_T("dict.xml"), fullFile))
{
ads_printf(_T("对不起,没有发现dict.xml文件!"));
return;
}
CString strPath = fullFile.cs();
CXMLDOMFile *pXMLDoc = new CXMLDOMFile;
if (pXMLDoc->IsFileExist(strPath))
{
if (!pXMLDoc->Open(strPath))
{
delete pXMLDoc;
pXMLDoc = NULL;
// Zyu modify on 100726,支持64位
#ifndef _WIN64
ads_printf(_T("打开XML文档失败!请安装MSXML4.0SP2组件"));
#else
ads_printf(_T("打开XML文档失败!请安装MSXML6.0组件"));
#endif
return;
}
}
delete pXMLDoc;
pXMLDoc = NULL;
CArchTextLibDlg dlg(acedGetAcadFrame());
{
CTemporaryResourceOverride vTemp;
dlg.Create(dlg.IDD, acedGetAcadFrame());
}
dlg.ShowWindow(SW_SHOW);
acedGetAcadDwgView()->SetFocus();
XPoint ptText;
int nOsMode=0;
xg_getvar(_T("OSMODE"), &nOsMode);
nOsMode &= ~0x4000;
nOsMode |= OS_INT|OS_NEA;
XPushVar<int> vOsMode(_T("OSMODE"), nOsMode);
XPoint ptOld;
XExplodeDraw::TextAlignment
AlignList[] = { XExplodeDraw::kTopLeft, XExplodeDraw::kTopCenter ,
XExplodeDraw::kTopRight, XExplodeDraw::kMiddleLeft ,
XExplodeDraw::kMiddleCenter, XExplodeDraw::kMiddleRight ,
XExplodeDraw::kBottomLeft, XExplodeDraw::kBottomCenter ,
XExplodeDraw::kBottomRight,};
while(1)
{
HWND hwnd = dlg.GetSafeHwnd();
if(!dlg.IsWindowVisible())
{//在替换或选取的时候关闭对话框
break;
}
XPoint ptIns;
xg_getvar(_T("VIEWCTR"), ptIns);
ptIns = Ucs2Wcs(ptIns);
dlg.UpdateData(TRUE);
if(dlg.m_iRunMode == 1)
{//替换文字
// if (dlg.GetEditText() == _T(""))
// {
// //字符串为空时候 回到初始状态
// acedGetAcadDwgView()->SetFocus();
// int nOsMode=0;
// xg_getvar(_T("OSMODE"), &nOsMode);
// nOsMode &= ~0x4000;
// nOsMode |= OS_INT|OS_NEA;
// XPushVar<int> vOsMode(_T("OSMODE"), nOsMode);;
// continue;
// }
Entity entSel;
int ret;
INITGET_BEG(0, _T("`"));
ret = acedEntSel(_T("\n请选择要替换的文字图元<文字插入>:"), entSel, XPoint());
//ads_printf(_T("\n插入1"));
INITGET_END();
if(ret == RTCAN)
break;
else if(ret == RTKWORD)
continue;
else if(ret == RTNORM)
{
//ads_printf(_T("\n插入2"));
if(!entSel.Is(_T("TEXT"))&&!entSel.Is(_T("ATS_TEXT"))&&
!entSel.Is(_T("MTEXT"))&&!entSel.Is(_T("ATS_MTEXT")))
{
acutPrintf(_T("\n已滤除1个。"));
continue;
}
AcDbEntity *pent = NULL;
AcDbObjectId id;
Acad::ErrorStatus es;
es = acdbGetObjectId(id,entSel);
if (es == Acad::eOk&&dlg.GetEditText()!=_T(""))
{
es = acdbOpenAcDbEntity(pent,id,AcDb::kForWrite);
if (es == Acad::eOk)
{
if (pent->isKindOf(TDbText::desc()))
{
TDbText *pText = TDbText::cast(pent);
if (pText)
{
pText->SetText(dlg.GetEditText());
}
}
if (pent->isKindOf(TDbMText::desc()))
{
TDbMText *pText = TDbMText::cast(pent);
if (pText)
{
pText->SetText(dlg.GetEditText());
}
}
if (pent->isKindOf(AcDbText::desc()))
{
AcDbText *pText = AcDbText::cast(pent);
if (pText)
{
pText->setTextString(dlg.GetEditText());
}
}
if (pent->isKindOf(AcDbMText::desc()))
{
AcDbMText *pText = AcDbMText::cast(pent);
if (pText)
{
pText->setContents(dlg.GetEditText());
}
}
pent->close();
}
}
//ads_printf(_T("\n插入3"));
//entSel.SetData(1, dlg.GetEditText());
//entSel.Modify();
//ads_printf(_T("\n插入4"));
}
else
{
dlg.m_iRunMode = 0;
continue;
}
}
else if(dlg.m_iRunMode == 2)
{//拾取文字
Entity entSel;
int ret;
INITGET_BEG(0, _T("`"));
ret = acedEntSel(_T("\n请选择要拾取的文字图元<文字插入>:"), entSel, XPoint());
INITGET_END();
if(ret == RTCAN)
break;
else if(ret == RTKWORD)
continue;
else if(ret == RTNORM)
{
if(!entSel.Is(_T("TEXT"))&&!entSel.Is(_T("ATS_TEXT"))&&
!entSel.Is(_T("MTEXT"))&&!entSel.Is(_T("ATS_MTEXT")))
{
acutPrintf(_T("\n已滤除1个。"));
continue;
}
}
else
{
dlg.m_iRunMode = 0;
continue;
}
XText text(entSel);
ptOld = text.m_ptInsert;
dlg.m_csHeight.Format(_T("%.1f"), text.m_nHeight);
CString csStyle = (const TCHAR*)GetSymbolName(text.m_idStyle);
dlg.SetEditText(text.m_csText);
dlg.m_iRunMode = 0;
dlg.SetTextStyle(csStyle);
}
else
{
CString str = dlg.GetEditText();
// if (dlg.GetEditText() == _T(""))
// {
// acedGetAcadDwgView()->SetFocus();
// int nOsMode=0;
// xg_getvar(_T("OSMODE"), &nOsMode);
// nOsMode &= ~0x4000;
// nOsMode |= OS_INT|OS_NEA;
// XPushVar<int> vOsMode(_T("OSMODE"), nOsMode);;
// continue;;
// }
TMTextEdJig jig(&dlg, ptIns);
jig.SetKeyword(_T("`"));
jig.SetPrompt(_T("\n请指定文字的插入点<退出>:"));
int nKeyIdx;
if(!!ptOld)
jig.m_ptRef = ptOld;
int ret = jig.DoIt(&nKeyIdx);
if(ret == RTKWORD){
if(nKeyIdx == 0)
continue;
}
else if(ret != RTNORM){
dlg.DestroyWindow();
return;
}
ptIns = jig.GetPickPoint();
ptOld = ptIns;
double nTextHeight2 = _tstof(dlg.m_csHeight)*DocGetPScale();
if (dlg.GetEditText()!=_T(""))
{
// modify by xly on 101213l 支持图层切换,获得数据库中的当前的图层名
//XText text(dlg.GetEditText(), ptIns, nTextHeight2, g_nScaleDim, dlg.m_csTextStyle, LAY_TEXT);
XString csLayerMode;
xg_getvar(_T("CLAYER"), &csLayerMode);
if(g_bTextDefaultLayer)
{
csLayerMode = LAY_TEXT;
}
XText text(dlg.GetEditText(), ptIns, nTextHeight2, g_nScaleDim, dlg.m_csTextStyle, (CString)csLayerMode);
text.SetRotate(Ucs2Wcs(0.0));//支持UCS
//text.SetLayoutRotation(Ucs2Wcs(0.0));
text.TgDraw(AlignList[dlg.m_iAlign]);
}
}
dlg.AddToLast();
// add by xly on 110310 保存文字样式到图纸中
DocSetTgSingleTextStyle(dlg.m_csTextStyle);
}
dlg.DestroyWindow();
return;
}
bool GetWordFromLib(CWnd*pParent,CString &res)
{
CTemporaryResourceOverride vTemp;
CInsTextDlg dlg(pParent);
dlg.SetSingleText();
dlg.SetPreText(res);
if(dlg.DoModal()!=IDOK||dlg.GetEditText()==_T(""))
return false;
res=dlg.GetEditText();
return true;
}
/////////////////////////////////////////////////
///////////////////////////////////////
////////////////////////////////////////////////////
// CArtchTextLibEdit
CArtchTextLibEdit::CArtchTextLibEdit()
{
m_pItemData = NULL;
m_pXMLDoc = NULL;
}
CArtchTextLibEdit::CArtchTextLibEdit(CXMLDOMFile* pXMLDoc)
{
m_pXMLDoc = pXMLDoc;
}
CArtchTextLibEdit::~CArtchTextLibEdit()
{
}
void CArtchTextLibEdit::PostNcDestroy()
{
delete this;
}
BOOL CArtchTextLibEdit::PreTranslateMessage(MSG *pMsg)
{
BOOL bRet=CEdit::PreTranslateMessage(pMsg);
if(pMsg->message == WM_KEYDOWN)
{
if(pMsg->wParam == VK_RETURN)
{
GetParent()->SetFocus();
return TRUE;
}
}
return bRet;
}
BEGIN_MESSAGE_MAP(CArtchTextLibEdit, CEdit)
ON_WM_KILLFOCUS()
//ON_WM_CHAR()
ON_NOTIFY_REFLECT(EN_CHANGE, OnEnChange)
END_MESSAGE_MAP()
//CRichEditCtrl
void CArtchTextLibEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
static CString str;
TCHAR ch = nChar;
str +=ch;
CString szOld, szNew;
szNew = str;
//GetWindowText(szNew);
CArchTextLibListBox *pListBox = (CArchTextLibListBox*)GetParent();
int iCurSel = pListBox->GetCurSel();
pListBox->GetText(iCurSel, szOld);
//void *dataPtr = pListBox->GetItemDataPtr(iCurSel);
CXMLNodeInfo *pData = (CXMLNodeInfo*)(pListBox->GetItemData(iCurSel));
int iRet = pListBox->FindStringExact(-1, szNew);
if (iRet == LB_ERR)
{
if(szNew==_T(""))//不发生变化
MessageBox(_T("名称不能为空!"));
else if(UString(szNew).Length()>25)
MessageBox(_T("名称最长为25个字符!"));
else
{
CXMLNodeInfo xmlData(*pData);
xmlData.m_strNodeAttributeValue = szNew;
CXMLDOMNodePtr pXMLDOMNodePtr = m_pXMLDoc->SelectSingleNode(pData->m_strNodeXPath);
pXMLDOMNodePtr->SetAttributeValue(pData->m_strNodeAttributeName,szNew);
m_pXMLDoc->GetCurNodeXPath(pXMLDOMNodePtr,xmlData.m_strNodeXPath);
//m_pXMLDoc->Save();
pListBox->DeleteStringEx(iCurSel);
pListBox->InsertStringEx(iCurSel,&xmlData);
}
}
else
{
if(iRet!=iCurSel)//不发生变化
MessageBox(CString(_T("<"))+szNew+_T(">项已经存在!"));
}
}
void CArtchTextLibEdit::OnEnChange(NMHDR* p, LRESULT* l)
{
CString szOld, szNew;
GetWindowText(szNew);
CArchTextLibListBox *pListBox = (CArchTextLibListBox*)GetParent();
int iCurSel = pListBox->GetCurSel();
pListBox->GetText(iCurSel, szOld);
//void *dataPtr = pListBox->GetItemDataPtr(iCurSel);
CXMLNodeInfo *pData = (CXMLNodeInfo*)(pListBox->GetItemData(iCurSel));
int iRet = pListBox->FindStringExact(-1, szNew);
if (iRet == LB_ERR)
{
if(szNew==_T(""))//不发生变化
MessageBox(_T("名称不能为空!"));
else if(UString(szNew).Length()>25)
MessageBox(_T("名称最长为25个字符!"));
else
{
CXMLNodeInfo xmlData(*pData);
xmlData.m_strNodeAttributeValue = szNew;
CXMLDOMNodePtr pXMLDOMNodePtr = m_pXMLDoc->SelectSingleNode(pData->m_strNodeXPath);
pXMLDOMNodePtr->SetAttributeValue(pData->m_strNodeAttributeName,szNew);
m_pXMLDoc->GetCurNodeXPath(pXMLDOMNodePtr,xmlData.m_strNodeXPath);
//m_pXMLDoc->Save();
pListBox->DeleteStringEx(iCurSel);
pListBox->InsertStringEx(iCurSel,&xmlData);
}
}
else
{
if(iRet!=iCurSel)//不发生变化
MessageBox(CString(_T("<"))+szNew+_T(">项已经存在!"));
}
}
void CArtchTextLibEdit::SetXMLDoc(CXMLDOMFile*pXMLDoc)
{
m_pXMLDoc = pXMLDoc;
}
void CArtchTextLibEdit::OnKillFocus(CWnd* pNewWnd)
{
CEdit::OnKillFocus(pNewWnd);
CString szOld, szNew;
GetWindowText(szNew);
CArchTextLibListBox *pListBox = (CArchTextLibListBox*)GetParent();
int iCurSel = pListBox->GetCurSel();
pListBox->GetText(iCurSel, szOld);
//void *dataPtr = pListBox->GetItemDataPtr(iCurSel);
CXMLNodeInfo *pData = (CXMLNodeInfo*)(pListBox->GetItemData(iCurSel));
int iRet = pListBox->FindStringExact(-1, szNew);
if (iRet == LB_ERR)
{
if(szNew==_T(""))//不发生变化
MessageBox(_T("名称不能为空!"));
else if(UString(szNew).Length()>25)
MessageBox(_T("名称最长为25个字符!"));
else
{
CXMLNodeInfo xmlData(*pData);
xmlData.m_strNodeAttributeValue = szNew;
CXMLDOMNodePtr pXMLDOMNodePtr = m_pXMLDoc->SelectSingleNode(pData->m_strNodeXPath);
pXMLDOMNodePtr->SetAttributeValue(pData->m_strNodeAttributeName,szNew);
CString strPath;
m_pXMLDoc->GetCurNodeXPath(pXMLDOMNodePtr,strPath);
xmlData.m_strNodeXPath = strPath;
//m_pXMLDoc->Save();
pListBox->DeleteStringEx(iCurSel);
pListBox->InsertStringEx(iCurSel,&xmlData);
}
}
else
{
if(iRet!=iCurSel)//不发生变化
MessageBox(CString(_T("<"))+szNew+_T(">项已经存在!"));
}
//if(iRet == LB_ERR)//新名称未用
//{
// if(szNew==_T(""))//不发生变化
// MessageBox(_T("名称不能为空!"));
// else if(UString(szNew).Length()>25)
// MessageBox(_T("名称最长为25个字符!"));
// else
// {
// int iPos;
// if(m_pItemData!=NULL)
// {
// iPos = m_pItemData->lstNames.FindData(CNameString(szOld));
// CString& szNameString=m_pItemData->lstNames(iPos);
// szNameString=szNew;
// }
// pListBox->DeleteString(iCurSel);
// pListBox->InsertString(iCurSel, szNew);
// pListBox->SetItemDataPtr(iCurSel, dataPtr);
// iCurSel = pListBox->FindStringExact(-1, szNew);
// if(iCurSel>=0&&iCurSel<pListBox->GetCount())
// pListBox->SetCurSel(iCurSel);
// }
//}
//else//新名称被占用
//{
// if(iRet!=iCurSel)//不发生变化
// MessageBox(CString(_T("<"))+szNew+_T(">项已经存在!"));;
//}
DestroyWindow();
}
void CArtchTextLibEdit::SetExtentData(CXMLNodeInfo *&pItemData)
{
m_pItemData = pItemData;
}
//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
// CExtendListBox
IMPLEMENT_DYNAMIC(CArchTextLibListBox, CDragListBox)
CArchTextLibListBox::CArchTextLibListBox(int iFlag)
{
m_iFlag = iFlag;
m_bModified = TRUE;
// m_pItemData = NULL;
}
CArchTextLibListBox::~CArchTextLibListBox()
{
ReSetContentEx();
}
CString CArchTextLibListBox::CreateNewName()
{
CString sName=_T("新名称");
long count=1;
for(long i=0;i<GetCount();i++)
{
CString temp;
GetText(i,temp);
if(temp.Find(sName)>=0)
{
sName.Format(_T("新名称%d"),count++);
i=-1;
}
}
return sName;
}
BEGIN_MESSAGE_MAP(CArchTextLibListBox, CDragListBox)
ON_WM_KEYDOWN()
ON_WM_RBUTTONDOWN()
ON_WM_LBUTTONDOWN()
ON_COMMAND_RANGE(IDR_NEW, IDR_MOD, OnMenuCommand)
END_MESSAGE_MAP()
void CArchTextLibListBox::OnLButtonDown(UINT nFlags,CPoint point)
{
// BOOL bOutSide;
// int iHit = ItemFromPoint(point, bOutSide);
// if(!bOutSide)
// SetCurSel(iHit);
// int iCurSel = GetCurSel();
CDragListBox::OnLButtonDown(nFlags,point);
}
// CExtendListBox 消息处理程序
void CArchTextLibListBox::OnRButtonDown(UINT nFlags, CPoint point)
{
if(point.x<1||point.y<=1)
return;
SetFocus();
CDragListBox::OnRButtonDown(nFlags, point);
if(!m_bModified)
return;
BOOL bOutSide;
int iHit = ItemFromPoint(point, bOutSide);
if(!bOutSide)
SetCurSel(iHit);
int iCurSel = GetCurSel();
CMenu popup;
popup.CreatePopupMenu();
popup.AppendMenu(MF_STRING, IDR_NEW, _T("新建行(N)"));
if(iCurSel != -1)
{
popup.AppendMenu(MF_STRING, IDR_INS, _T("插入行(Ins)"));
popup.AppendMenu(MF_STRING, IDR_DEL, _T("删除行(Del)"));
popup.AppendMenu(MF_STRING, IDR_MOD, _T("重命名(F2)"));
}
ClientToScreen(&point);
popup.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
}
void CArchTextLibListBox::OnMenuCommand(UINT id)
{
switch(id)
{
case IDR_INS:
DoInsertItem();
break;
case IDR_NEW:
DoAppendItem();
break;
case IDR_DEL:
DoDeleteItem();
break;
case IDR_MOD:
DoModifyItem();
break;
}
}
void CArchTextLibListBox::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CDragListBox::OnKeyDown(nChar, nRepCnt, nFlags);
if(!m_bModified)
return;
BOOL bPop = FALSE;
int iCurSel = GetCurSel();
if(iCurSel == -1)
bPop = TRUE;
else
{
if(m_iFlag == 0)
{
CString szText;
GetText(iCurSel, szText);
if(_tcscmp(szText, c_szAll) == 0 || _tcscmp(szText, c_szLate) == 0)
bPop = TRUE;
}
}
if(bPop)
{
if(nChar == VK_N)
DoAppendItem();
}
else
{
if(nChar == VK_DELETE)
DoDeleteItem();
else if(nChar == VK_INSERT)
DoInsertItem();
else if(nChar == VK_N)
DoAppendItem();
else if(nChar == VK_F2)
DoModifyItem();
}
}
void CArchTextLibListBox::CreateEdit()
{
int iCurSel = GetCurSel();
CRect rect;
GetItemRect(iCurSel, rect);
rect.bottom += 2;
rect.top -= 2;
int iStyle = WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL | ES_WANTRETURN;
CTemporaryResourceOverride vTmp;
CArtchTextLibEdit *pEdit = new CArtchTextLibEdit(m_pXMLDoc);
if(!pEdit->Create(iStyle, rect, this, IDC_TEMP))
return;
CString szOld;
GetText(iCurSel, szOld);
pEdit->SetFont(GetFont());
pEdit->SetWindowText(szOld);
pEdit->SetFocus();
pEdit->SetSel(0, -1);
}
void CArchTextLibListBox::DoDeleteItem()
{
GetParent()->SendMessage(TARCH_TEXTLIB_MSG_DELETE);
}
void CArchTextLibListBox::DoInsertItem()
{
GetParent()->SendMessage(TARCH_TEXTLIB_MSG_INSERT);
}
void CArchTextLibListBox::DoAppendItem()
{
GetParent()->SendMessage(TARCH_TEXTLIB_MSG_NEW,0,0);
}
void CArchTextLibListBox::DoModifyItem()
{
CreateEdit();
GetParent()->SendMessage(TARCH_TEXTLIB_MSG_RENAME);
}
void CArchTextLibListBox::SetModify(BOOL bModified)
{
m_bModified = bModified;
}
BOOL CArchTextLibListBox::GetModify()
{
return m_bModified;
}
void CArchTextLibListBox::SetExtendData(CListBoxItemData *&pItemData)
{
}
int CArchTextLibListBox::SetCurSel(int nSelect)
{
int nRet = CDragListBox::SetCurSel(nSelect);
((CInsTextDlg*)GetParent())->OnLbnSelchangeName();
return nRet;
}
void CArchTextLibListBox::SetXMLDoc(CXMLDOMFile*pXMLDoc)
{
m_pXMLDoc = pXMLDoc;
}
void CArchTextLibListBox::PreSubclassWindow()
{
if(m_iFlag!=2)
CDragListBox::PreSubclassWindow();
else
CListBox::PreSubclassWindow();
}
BOOL CArchTextLibListBox::OnChildNotify(UINT nMessage, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
if(m_iFlag != 2 && m_bModified)
return CDragListBox::OnChildNotify(nMessage, wParam, lParam, pResult);
else
return CListBox::OnChildNotify(nMessage, wParam, lParam, pResult);
}
int CArchTextLibListBox::AddStringEx(LPCTSTR lpszItem,CXMLNodeInfo *pData)
{
int nIndex = 0;
nIndex = AddString(lpszItem);
CXMLNodeInfo *pNewData = new CXMLNodeInfo(*pData);
// Zyu modify on 100726,支持64位
//SetItemData(nIndex,(DWORD)pNewData);
SetItemData(nIndex,(DWORD_PTR)pNewData);
return nIndex;
}
int CArchTextLibListBox::InsertStringEx(int nIndex,CXMLNodeInfo *pData)
{
int n = InsertString(nIndex,pData->m_strNodeAttributeValue);
CXMLNodeInfo *pNewData = new CXMLNodeInfo(*pData);
// Zyu modify on 100726,支持64位
//SetItemData(n,(DWORD)pNewData);
SetItemData(n,(DWORD_PTR)pNewData);
return n;
}
int CArchTextLibListBox::DeleteStringEx(UINT nIndex)
{
CXMLNodeInfo *pData = (CXMLNodeInfo*)GetItemData(nIndex);
if (pData)
{
delete pData;
}
int n = DeleteString(nIndex);
return n;
}
//////////////////////////////////////////
/////////////词库树类////////////////////
CArchTextLibTreeCtrl::CArchTextLibTreeCtrl()
{
m_bEdit = FALSE;
m_bDragging = FALSE;
m_bRub = FALSE;
m_pXMLDoc = NULL;
}
CArchTextLibTreeCtrl::CArchTextLibTreeCtrl(CXMLDOMFile*pXMLDoc)
{
m_bEdit = FALSE;
m_bDragging = FALSE;
m_bRub = FALSE;
m_pXMLDoc = pXMLDoc;
}
BEGIN_MESSAGE_MAP(CArchTextLibTreeCtrl, CTreeCtrl)
ON_COMMAND_RANGE(ID_INS_DRAWING, ID_COLLAPSE_WORKS, OnMenuCommand)
ON_WM_RBUTTONDOWN()
ON_NOTIFY_REFLECT(TVN_ENDLABELEDIT, OnTvnEndlabeledit)
ON_NOTIFY_REFLECT(TVN_BEGINLABELEDIT, OnTvnBeginlabeledit)
ON_NOTIFY_REFLECT(TVN_BEGINDRAG, OnTvnBegindrag)
ON_WM_TIMER()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_DESTROY()
END_MESSAGE_MAP()
void CArchTextLibTreeCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
m_dwDragStart = GetTickCount();
CTreeCtrl::OnLButtonDown(nFlags, point);
}
void CArchTextLibTreeCtrl::XmlNodeToTreeNode(HTREEITEM hParentItem, const CXMLDOMNodePtr &pXmlNode)
{
CXMLDOMNodesPtr pXMLNodeList = pXmlNode->GetChildrenNodes(pXmlNode->GetNodeName());
int count = pXMLNodeList->GetCount();
if(count==0)
{
return;
}
int i=0;
for(i=0; i<count; i++)
{
CXMLDOMNodePtr pChildNode = pXMLNodeList->GetItem(i);
HTREEITEM hSubItem;
CString strName,strNodeName;
strNodeName = pChildNode->GetNodeName();
strName = pChildNode->GetAttributeName();
if (strNodeName == c_szLemma)
{
continue;
}
CString str;
//if (pChildNode->IsAttributeExist(strName))
//{
str= pChildNode->GetAttributeValue(strName);
//}
CXMLNodeInfo nodeInfo = GetNodeInfo(pChildNode,m_pXMLDoc);
CXMLNodeInfo*pData = (CXMLNodeInfo*)(GetItemData(hParentItem));
if (pData)
{
nodeInfo.m_strNodeXPath = pData->m_strNodeXPath+_T("/")+strNodeName+_T("[@")
+strName+_T("=")+_T("'")+str+_T("']");
hSubItem = InsertItemEx(&nodeInfo,hParentItem,TVI_LAST);
XmlNodeToTreeNode(hSubItem,pChildNode);//递归子节点
}
//hSubItem = InsertItemEx(&nodeInfo,hParentItem,TVI_LAST);
//XmlNodeToTreeNode(hSubItem,pChildNode);//递归子节点
}
}
void CArchTextLibTreeCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
CTreeCtrl::OnLButtonUp(nFlags, point);
if( m_bDragging )
{
if(m_bRub)
{
m_bRub = FALSE;
DrawTempLine(m_ptSta, m_ptEnd);
}
m_bDragging = FALSE;
CImageList::DragLeave( this );
CImageList::EndDrag();
ReleaseCapture();
delete m_pDragImage;
SelectDropTarget( NULL );
if( m_hItemDragS == m_hItemDragD || m_hItemDragD == NULL)
{
KillTimer( m_nScrollTimerID );
Invalidate();
return;
}
CXMLNodeInfo *pData = (CXMLNodeInfo *)GetItemData(m_hItemDragD);
if(pData == NULL)
{
KillTimer( m_nScrollTimerID );
Invalidate();
return;
}
HTREEITEM pParent=GetParentItem(m_hItemDragD);
if(GetParentItem(m_hItemDragS) != pParent)
{
CString szText = GetItemText(m_hItemDragS);
HTREEITEM hChild = GetChildItem(pParent);
while( hChild != NULL )
{
if(GetItemText(hChild) == szText)
{
KillTimer(m_nScrollTimerID);
Invalidate();
return;
}
hChild =GetNextSiblingItem(hChild);
}
}
Expand( m_hItemDragD,TVE_EXPAND );
HTREEITEM htiParent = m_hItemDragD;
while( (htiParent = GetParentItem(htiParent)) != NULL )
{
if( htiParent == m_hItemDragS )
{
KillTimer( m_nScrollTimerID );
Invalidate();
return;
}
}
HTREEITEM htiNew;
if(m_nShowFlag == -1)
{
HTREEITEM hPre = GetPrevSiblingItem(m_hItemDragD);
if(hPre != NULL)
{
htiNew = CopyItem(m_hItemDragS, GetParentItem(m_hItemDragD),hPre);
}
else
{
htiNew = CopyItem(m_hItemDragS, GetParentItem(m_hItemDragD),TVI_FIRST);
}
}
else if(m_nShowFlag == 0)
{
htiNew = CopyItem(m_hItemDragS,m_hItemDragD,TVI_LAST);
}
else if(m_nShowFlag == 1)
{
htiNew = CopyItem(m_hItemDragS,GetParentItem(m_hItemDragD),m_hItemDragD);
}
if (htiNew!=NULL)
{
DeleteItemEx( m_hItemDragS );
SelectItem( htiNew );
}
KillTimer( m_nScrollTimerID );
}
}
void CArchTextLibTreeCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
HTREEITEM hItem;
UINT flags;
if( m_nHoverTimerID )
{
KillTimer( m_nHoverTimerID );
m_nHoverTimerID = 0;
}
m_nHoverTimerID = SetTimer( 1,800,NULL );
m_HoverPoint = point;
if( m_bDragging )
{
CPoint pt = point;
CImageList::DragMove( pt );
if( (hItem = HitTest(point,&flags)) != NULL && hItem != TVI_ROOT)
{
CImageList::DragShowNolock( false );
m_nShowFlag = GetShowFlag( hItem, pt );
if(m_nShowFlag != -2)
m_hItemDragD = hItem;
CImageList::DragShowNolock( true );
}
CRect rect;
GetClientRect( &rect );
if( point.x < rect.left + 20 )
m_hItemDragD = NULL;
}
CTreeCtrl::OnMouseMove(nFlags, point);
}
int CArchTextLibTreeCtrl::GetShowFlag( HTREEITEM hItem, CPoint pt )
{
if(m_bRub)
{
m_bRub = FALSE;
DrawTempLine(m_ptSta, m_ptEnd);
}
int nFlag = -2;
CXMLNodeInfo *pData = (CXMLNodeInfo *)GetItemData(hItem);
if(pData == NULL)
return nFlag;
CRect rect, rDc;
GetItemRect(hItem, &rect, FALSE);
GetItemRect(hItem, &rDc, TRUE);
long lDis = rect.bottom - rect.top;
CRect rUp(rect), rMid(rect), rDown(rect);
rUp.bottom = rUp.top + lDis / 4;
rDown.top = rDown.bottom - lDis / 4;
rMid.top = rMid.top + lDis / 4;
rMid.bottom = rMid.bottom - lDis / 4;
if(rUp.PtInRect(pt))
{
nFlag = -1;
SelectDropTarget( NULL );
SelectItem(m_hItemDragS);
m_ptSta = CPoint(rDc.left, rDc.top);
m_ptEnd = CPoint(rect.right - 5, rDc.top);
DrawTempLine(m_ptSta, m_ptEnd);
m_bRub = TRUE;
}
else if(rDown.PtInRect(pt))
{
nFlag = 1;
SelectDropTarget( NULL );
SelectItem(m_hItemDragS);
m_ptSta = CPoint(rDc.left, rDc.bottom);
m_ptEnd = CPoint(rect.right - 5, rDc.bottom);
DrawTempLine(m_ptSta, m_ptEnd);
m_bRub = TRUE;
}
else if(rMid.PtInRect(pt))
{
nFlag = 0;
SelectDropTarget( hItem );
}
return nFlag;
}
void CArchTextLibTreeCtrl::DrawTempLine(CPoint ptSta, CPoint ptEnd)
{
CClientDC dc(this);
CPen pen(PS_SOLID, 2, RGB(125,125,125)),*pOldPen;
pOldPen = dc.SelectObject(&pen);
dc.SetROP2(R2_XORPEN);
dc.MoveTo(ptSta);
dc.LineTo(ptSta.x-2, ptSta.y+2);
dc.MoveTo(ptSta);
dc.LineTo(ptSta.x-2, ptSta.y-2);
dc.MoveTo(ptSta.x-2, ptSta.y);
dc.LineTo(ptEnd.x+2, ptEnd.y);
dc.MoveTo(ptEnd);
dc.LineTo(ptEnd.x+2, ptEnd.y+2);
dc.MoveTo(ptEnd);
dc.LineTo(ptEnd.x+2, ptEnd.y-2);
dc.MoveTo(ptEnd);
dc.SelectObject(pOldPen);
}
// Zyu modify on 100726,支持64位
//void CArchTextLibTreeCtrl::OnTimer(UINT nIDEvent)
void CArchTextLibTreeCtrl::OnTimer(UINT_PTR nIDEvent)
{
if( nIDEvent == m_nHoverTimerID )
{
KillTimer( m_nHoverTimerID );
m_nHoverTimerID = 0;
HTREEITEM trItem = 0;
UINT uFlag = 0;
trItem = HitTest( m_HoverPoint,&uFlag );
if( trItem && m_bDragging )
{
SelectItem( trItem );
Expand( trItem,TVE_EXPAND );
}
}
else if( nIDEvent == m_nScrollTimerID )
{
m_TimerTicks++;
CPoint pt;
GetCursorPos( &pt );
CRect rect;
GetClientRect( &rect );
ClientToScreen( &rect );
HTREEITEM hItem = GetFirstVisibleItem();
if( pt.y < rect.top +10 )
{
int slowscroll = 6 - (rect.top + 10 - pt.y )/20;
if( 0 == (m_TimerTicks % ((slowscroll > 0) ? slowscroll : 1)) )
{
CImageList::DragShowNolock ( false );
SendMessage( WM_VSCROLL,SB_LINEUP );
SelectDropTarget( hItem );
m_hItemDragD = hItem;
CImageList::DragShowNolock ( true );
}
}
else if( pt.y > rect.bottom - 10 )
{
int slowscroll = 6 - (pt.y - rect.bottom + 10)/20;
if( 0 == (m_TimerTicks % ((slowscroll > 0) ? slowscroll : 1)) )
{
CImageList::DragShowNolock ( false );
SendMessage( WM_VSCROLL,SB_LINEDOWN );
int nCount = GetVisibleCount();
for( int i=0 ; i<nCount-1 ; i++ )
hItem = GetNextVisibleItem( hItem );
if( hItem )
SelectDropTarget( hItem );
m_hItemDragD = hItem;
CImageList::DragShowNolock ( true );
}
}
}
else
CTreeCtrl::OnTimer(nIDEvent);
}
void CArchTextLibTreeCtrl::OnTvnBegindrag(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
if( (GetTickCount() - m_dwDragStart) < 60 )
return;
m_hItemDragS = pNMTreeView->itemNew.hItem;
m_hItemDragD = NULL;
CXMLNodeInfo *pData = (CXMLNodeInfo*)GetItemData(m_hItemDragS);
if(pData == NULL)
return;
m_pDragImage = CreateDragImage( m_hItemDragS );
if( !m_pDragImage )
return;
m_bDragging = true;
m_pDragImage->BeginDrag ( 0,CPoint(8,8) );
CPoint pt = pNMTreeView->ptDrag;
ClientToScreen( &pt );
m_pDragImage->DragEnter ( this,pt );
SetCapture();
m_nScrollTimerID = SetTimer( 2,40,NULL );
*pResult = 0;
}
void CArchTextLibTreeCtrl::OnMenuCommand(UINT id)
{
switch(id)
{
case ID_ADD_CHILD_LEMMA:
DoAddLemma();
break;
case ID_ADD_CHILD_COLLECT:
DoAddChildCollect();
break;
case ID_REN_COLLECT:
DoReNameNode();
break;
case ID_DEL_COLLECT:
DoDeLeteItem();
break;
case ID_EXPAND_COLLECT:
DoExpandCollect();
break;
case ID_COLLAPSE_COLLECT:
DoCollapseCollect();
break;
case ID_EXPAND_WORKS:
DoExpandWorks();
break;
case ID_COLLAPSE_WORKS:
DoCollapseWorks();
break;
default:
break;
}
}
void CArchTextLibTreeCtrl::ExpandAll()
{
HTREEITEM hOldItem = GetSelectedItem();
HTREEITEM hItem = GetRootItem();
SelectItem(hItem);
SendMessage(WM_KEYDOWN, VK_MULTIPLY);
EnsureVisible(hItem);
SelectItem(hOldItem);
}
void CArchTextLibTreeCtrl::CollapseAll()
{
HTREEITEM hItem = GetRootItem();
SelectItem(hItem);
SendMessage(WM_KEYDOWN, VK_SUBTRACT);
EnsureVisible(hItem);
SelectItem(hItem);
}
BOOL CArchTextLibTreeCtrl::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
// Zyu modify on 100726,支持64位
//int nVk = pMsg->wParam;
UINT_PTR nVk = pMsg->wParam;
if(nVk == VK_DELETE&&pMsg->hwnd==GetSafeHwnd())
{
HTREEITEM hItem = GetSelectedItem();
if(hItem == NULL)
return CTreeCtrl::PreTranslateMessage(pMsg);
CXMLNodeInfo *pData = (CXMLNodeInfo *)GetItemData(hItem);
if(pData == NULL)
return CTreeCtrl::PreTranslateMessage(pMsg);
DoDeLeteItem();
return TRUE;
}
else if(nVk == VK_F2)
{
HTREEITEM hItem = GetSelectedItem();
if(hItem == NULL)
return CTreeCtrl::PreTranslateMessage(pMsg);
CXMLNodeInfo *pData = (CXMLNodeInfo *)GetItemData(hItem);
if(pData == NULL)
return CTreeCtrl::PreTranslateMessage(pMsg);
DoReNameNode();
return TRUE;
}
}
return CTreeCtrl::PreTranslateMessage(pMsg);
}
void CArchTextLibTreeCtrl::OnTvnBeginlabeledit(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR);
if(m_bEdit)
{
m_bEdit = FALSE;
*pResult = 0;
}
else
*pResult = 1;
}
void CArchTextLibTreeCtrl::OnTvnEndlabeledit(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR);
HTREEITEM hItem = pTVDispInfo->item.hItem;
Expand(hItem, TVE_COLLAPSE);
CXMLNodeInfo *pData = (CXMLNodeInfo*)GetItemData(hItem);
if(pData == NULL || pData->m_strNodeXPath==_T(""))
{
*pResult = 0;
return;
}
CString szName = pTVDispInfo->item.pszText;
if (m_pXMLDoc)
{
CXMLDOMNodePtr pXMLDOMNodePtr = m_pXMLDoc->SelectSingleNode(pData->m_strNodeXPath);
CXMLDOMNodePtr pParent = pXMLDOMNodePtr->GetParentNode();
CString strNodeName = pParent->GetNodeName();
CXMLDOMNodesPtr pXMLDOMNodesList = pParent->GetChildrenNodes(strNodeName);
int nNum = pXMLDOMNodesList->GetCount();
int i =0;
for (i = 0;i <nNum;i++)
{
CXMLDOMNodePtr pTem = pXMLDOMNodesList->GetItem(i);
CString strAttriName = pTem->GetAttributeName();
CString strAttriValue;
//if (pTem->IsAttributeExist(strAttriName))
//{
strAttriValue = pTem->GetAttributeValue(strAttriName);
//}
if (strAttriValue == szName)
{
*pResult = 0;
return;
}
}
if(szName != _T(""))
{
CString strAttName;
if (pXMLDOMNodePtr->GetAttributeNum()>0)
{
strAttName = pXMLDOMNodePtr->GetAttributeName();
if (strAttName==_T(""))
{
strAttName = _T("name");
}
}
else
{
strAttName = _T("name");
}
pXMLDOMNodePtr->SetAttributeValue(strAttName,szName);
CString strXPath;
m_pXMLDoc->GetCurNodeXPath(pXMLDOMNodePtr,strXPath);
//m_pXMLDoc->Save();
pData->m_strNodeAttributeValue = szName;
pData->m_strNodeXPath = strXPath;
DeleteChildItemEx(hItem);//因为父节点的名字改变导致子节点的路径名字不对删掉重新生成
XmlNodeToTreeNode(hItem,pXMLDOMNodePtr);
}
}
HTREEITEM hParent = GetParentItem(hItem);
if (hParent!=NULL)
{
SelectItem(hParent);
}
SelectItem(hItem);
*pResult = 1;
}
void CArchTextLibTreeCtrl::DoDeLeteItem()
{
HTREEITEM hParent = GetSelectedItem();
HTREEITEM hRoot = GetRootItem();
if (hParent == NULL|| hParent == TVI_ROOT||hParent == hRoot)
{
return;
}
CXMLNodeInfo *pData = (CXMLNodeInfo*)GetItemData(hParent);
if (pData->m_strNodeAttributeValue == c_szTDWord||pData->m_strNodeAttributeValue == c_szLate)
{
return;
}
if(pData == NULL || (pData->m_strNodeAttributeName==_T("")&&pData->m_strNodeName==_T("")))
return;
CString strXPath = pData->m_strNodeXPath;
if (m_pXMLDoc)
{
CXMLDOMNodePtr pXMLDOMNodePtr = m_pXMLDoc->SelectSingleNode(strXPath);
pXMLDOMNodePtr->DeleteNode();
//m_pXMLDoc->Save();
}
DeleteItemEx(hParent);
}
void CArchTextLibTreeCtrl::DoReNameNode()
{
m_bEdit = TRUE;
HTREEITEM hItem = GetSelectedItem();
CEdit *pEdit = EditLabel(hItem);
}
void CArchTextLibTreeCtrl::DoAddLemma()
{
HTREEITEM hParent = GetSelectedItem();
if(hParent == NULL || hParent == TVI_ROOT)
return;
CXMLNodeInfo *pData = (CXMLNodeInfo*)GetItemData(hParent);
if(pData == NULL || (pData->m_strNodeAttributeName==_T("")&&pData->m_strNodeName==_T("")))
return;
CString szName;
//CXMLDOMFile xmlDoc;
int nCount = 1;
if (m_pXMLDoc)
{
CXMLDOMNodePtr pXMLDOMNodePtr = m_pXMLDoc->SelectSingleNode(pData->m_strNodeXPath);
while (1)
{
BOOL bFlag = FALSE;
szName.Format(_T("新建词条(%d)"), nCount);
if (pXMLDOMNodePtr->HasChildNodes())
{
CString strNodeName = pXMLDOMNodePtr->GetNodeName();
CXMLDOMNodesPtr pXMLDOMNodeList = pXMLDOMNodePtr->GetChildrenNodes(strNodeName);
int nNum = pXMLDOMNodeList->GetCount();
int i = 0;
for (i = 0;i < nNum;i++)
{
CXMLDOMNodePtr pTem = pXMLDOMNodeList->GetItem(i);
CString strAttriName = pTem->GetAttributeName();
CString strAttriValue = pTem->GetAttributeValue(strAttriName);
if (szName == strAttriValue)
{
bFlag = TRUE;
nCount++;
break;
}
}
}
if (!bFlag)
{
break;
}
}
CXMLNodeInfo *pNodeInfo = new CXMLNodeInfo;
pNodeInfo->m_strNodeName = c_szLemma;
pNodeInfo->m_strNodeAttributeName = c_szName;
pNodeInfo->m_bLeafNode = TRUE;
pNodeInfo->m_strNodeAttributeValue = szName;
pNodeInfo->m_strNodeValue = szName;
pXMLDOMNodePtr->AppendNode(pNodeInfo->m_strNodeName,pNodeInfo->m_strNodeValue,
pNodeInfo->m_strNodeAttributeName,pNodeInfo->m_strNodeAttributeValue);
//m_pXMLDoc->Save();
}
HTREEITEM Hes = GetParentItem(hParent);
SelectItem(Hes);
Expand(hParent, TVE_EXPAND);
SelectItem(hParent);
}
void CArchTextLibTreeCtrl::DoCollapseCollect()
{
HTREEITEM hItem = GetSelectedItem();
Expand(hItem, TVE_COLLAPSE);
}
void CArchTextLibTreeCtrl::DoExpandCollect()
{
HTREEITEM hItem = GetSelectedItem();
Expand(hItem, TVE_EXPAND);
}
void CArchTextLibTreeCtrl::DoExpandWorks()
{
ExpandAll();
}
void CArchTextLibTreeCtrl::DoCollapseWorks()
{
CollapseAll();
}
void CArchTextLibTreeCtrl::DoAddChildCollect()
{
HTREEITEM hParent = GetSelectedItem();
if(hParent == NULL || hParent == TVI_ROOT)
return;
CXMLNodeInfo *pData = (CXMLNodeInfo*)GetItemData(hParent);
if(pData == NULL || (pData->m_strNodeAttributeName==_T("")&&pData->m_strNodeName==_T("")))
return;
CString szName;
// CXMLDOMFile xmlDoc;
BOOL bFlag = FALSE;
int nCount = 1;
if (m_pXMLDoc)
{
while(1)
{
BOOL bFlag = FALSE;
szName.Format(_T("新建目录(%d)"), nCount);
if(ItemHasChildren(hParent))
{
HTREEITEM hChild = GetChildItem(hParent);
while(hChild != NULL)
{
CString szItem = GetItemText(hChild);
if(szItem == szName)
{
bFlag = TRUE;
nCount++;
break;
}
hChild = GetNextSiblingItem(hChild);
}
}
if(!bFlag)
break;
}
CXMLNodeInfo *pNodeInfo = new CXMLNodeInfo;
pNodeInfo->m_strNodeName = c_szCatalog;
pNodeInfo->m_strNodeAttributeName = c_szName;
pNodeInfo->m_bLeafNode = FALSE;
pNodeInfo->m_strNodeAttributeValue = szName;
pNodeInfo->m_strNodeXPath = pData->m_strNodeXPath + _T("/")+pNodeInfo->m_strNodeName+_T("[@")
+pNodeInfo->m_strNodeAttributeName+_T("=")+_T("'")+pNodeInfo->m_strNodeAttributeValue+_T("']");
HTREEITEM hRes = InsertItemEx(pNodeInfo, hParent);
CXMLDOMNodePtr pXMLDOMNodePtr = m_pXMLDoc->SelectSingleNode(pData->m_strNodeXPath);
pXMLDOMNodePtr->AppendNode(pNodeInfo->m_strNodeName,TEXT(""),
pNodeInfo->m_strNodeAttributeName,
pNodeInfo->m_strNodeAttributeValue);
//m_pXMLDoc->Save();
//记住一定要在selectitem之前往xml里写文档 因为调用select函数 会引发selchange消息函数
//导致在另外一个函数中打开xml 此时会出错
Expand(hParent, TVE_EXPAND);
SelectItem(hRes);
DoReNameNode();
}
}
HTREEITEM CArchTextLibTreeCtrl::InsertItemEx(CXMLNodeInfo *pNodeInfo, HTREEITEM hParent, HTREEITEM hInsertAfter)
{
CString strName;
if (pNodeInfo->m_strNodeAttributeName==_T("")
&&pNodeInfo->m_strNodeAttributeValue==_T("")
&&pNodeInfo->m_strNodeName==_T("")
&&pNodeInfo->m_strNodeValue==_T(""))
{
return NULL;
}
if (pNodeInfo->m_strNodeAttributeValue!=_T(""))
{
strName = pNodeInfo->m_strNodeAttributeValue;
}
else
{
if (pNodeInfo->m_strNodeName!=_T(""))
{
strName =pNodeInfo->m_strNodeName;
}
}
int nImage = 0,nSelectImage = 0;
if (hParent == TVI_ROOT)
{
nImage =0;
nSelectImage = 1;
}
else
{
CString strLate = c_szLate;
nImage = 2;
nSelectImage = 3;
}
HTREEITEM hItem = InsertItem(strName,nImage,1,hParent,hInsertAfter);
CXMLNodeInfo *pNodeData = new CXMLNodeInfo(*pNodeInfo);
// Zyu modify on 100726,支持64位
//SetItemData(hItem,(DWORD)pNodeData);
SetItemData(hItem,(DWORD_PTR)pNodeData);
return hItem;
}
void CArchTextLibTreeCtrl::DeleteItemEx(HTREEITEM hItem)
{
if (hItem==NULL||hItem ==TVI_ROOT)
{
return;
}
HTREEITEM hChild = GetChildItem(hItem);
while(hChild != NULL)
{
HTREEITEM hTem = GetNextSiblingItem(hChild);
DeleteItemEx(hChild);
hChild = hTem;
}
CXMLNodeInfo *pNodeData = (CXMLNodeInfo*)GetItemData(hItem);
if (pNodeData!=NULL)
{
delete pNodeData;
}
DeleteItem(hItem);
}
void CArchTextLibTreeCtrl::DeleteChildItemEx(HTREEITEM hItem)
{
if (hItem==NULL||hItem ==TVI_ROOT)
{
return;
}
HTREEITEM hChild = GetChildItem(hItem);
while(hChild != NULL)
{
HTREEITEM hTem = GetNextSiblingItem(hChild);
DeleteItemEx(hChild);
hChild = hTem;
}
}
void CArchTextLibTreeCtrl::DeleteAllItemData(HTREEITEM hItem)
{
hItem = GetChildItem(hItem);
while(hItem != NULL)
{
CXMLNodeInfo *pData = (CXMLNodeInfo*)GetItemData(hItem);
delete pData;
DeleteAllItemData(hItem);
hItem = GetNextSiblingItem(hItem);
}
}
HTREEITEM CArchTextLibTreeCtrl::CopyItem(HTREEITEM hItem, HTREEITEM htiNewParent, HTREEITEM htiAfter)
{
if(hItem == NULL || htiNewParent == NULL)
return NULL;
if (m_pXMLDoc)
{
CXMLNodeInfo *pData = (CXMLNodeInfo *)GetItemData(hItem);
if(pData == NULL)
{
return NULL;
}
CXMLDOMNodePtr pOldXMLDOMNodePtr = m_pXMLDoc->SelectSingleNode(pData->m_strNodeXPath);
CXMLDOMNodePtr pCloneXMLDOMNodePtr(new CXMLDOMNode(NULL));
pOldXMLDOMNodePtr->CloneNode(pCloneXMLDOMNodePtr);
CXMLNodeInfo *pParentData = (CXMLNodeInfo *)GetItemData(htiNewParent);
CXMLNodeInfo *pPreData = NULL;
HTREEITEM htest = TVI_ROOT;
HTREEITEM hfirst = TVI_FIRST;
if (htiAfter!=TVI_LAST&&htiAfter!=TVI_FIRST)
{
pPreData=(CXMLNodeInfo*)GetItemData(htiAfter);
}
CXMLDOMNodePtr pTemPtr(new CXMLDOMNode(NULL));
if (pPreData!=NULL)
{
if (pPreData->m_strNodeXPath!=_T(""))
{
CXMLDOMNodePtr pInSert = m_pXMLDoc->SelectSingleNode(pPreData->m_strNodeXPath);
if(pInSert.get()->GetNodePtr()!=NULL)
pInSert->InsertAfter(pCloneXMLDOMNodePtr,pTemPtr);
}
else
{
if(pParentData != NULL)
{
CXMLDOMNodePtr pInSert = m_pXMLDoc->SelectSingleNode(pParentData->m_strNodeXPath);
if(pInSert.get()->GetNodePtr()!=NULL)
pInSert->AppendNode(pCloneXMLDOMNodePtr,pTemPtr);
}
}
}
else
{
if(pParentData != NULL)
{
CXMLDOMNodePtr pInSert = m_pXMLDoc->SelectSingleNode(pParentData->m_strNodeXPath);
if(pInSert.get()->GetNodePtr()!=NULL)
pInSert->AppendNode(pCloneXMLDOMNodePtr,pTemPtr);
}
}
CString strXpath;
if (pTemPtr.get()->GetNodePtr()==NULL)
{
return NULL;
}
pOldXMLDOMNodePtr->DeleteNode();
m_pXMLDoc->GetCurNodeXPath(pTemPtr,strXpath);
pData->m_strNodeXPath = strXpath;
hItem = InsertItemEx((CXMLNodeInfo *)pData,htiNewParent,htiAfter);
//m_pXMLDoc->Save();//切忌 此函数一定放在domfile指针操作 最后
XmlNodeToTreeNode(hItem, pTemPtr);
}
return hItem;
}
void CArchTextLibTreeCtrl::OnRButtonDown(UINT nFlags, CPoint point)
{
HTREEITEM hItem = HitTest(point);
if(hItem != NULL)
{
SetFocus();
SelectItem(hItem);
}
CMenu popup;
popup.CreatePopupMenu();
if(hItem == NULL)
{
popup.AppendMenu(MF_STRING, ID_EXPAND_WORKS, _T("全部展开"));
popup.AppendMenu(MF_STRING, ID_COLLAPSE_WORKS, _T("全部收拢"));
}
else
{
CXMLNodeInfo *pData = (CXMLNodeInfo *)GetItemData(hItem);
if(pData == NULL)
return;
CString strType;
if (pData->m_strNodeAttributeValue!=_T(""))
{
strType = pData->m_strNodeAttributeValue;
}
else
{
strType = pData->m_strNodeName;
}
//if(strType != _T("最近使用的词")||strType != _T("上华词库"))
//{
if(ItemHasChildren(hItem) && (GetItemState(hItem, TVIS_EXPANDED) & TVIS_EXPANDED) == TVIS_EXPANDED)
{
popup.AppendMenu(MF_STRING, ID_COLLAPSE_COLLECT, _T("收拢"));
}
else
{
popup.AppendMenu(MF_STRING, ID_EXPAND_COLLECT, _T("展开"));
if(!ItemHasChildren(hItem))
popup.EnableMenuItem(ID_EXPAND_COLLECT, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
}
popup.AppendMenu(MF_STRING, ID_ADD_CHILD_COLLECT, _T("添加子目录"));
HTREEITEM hRoot = GetRootItem();
popup.AppendMenu(MF_STRING,ID_ADD_CHILD_LEMMA,_T("添加新词条"));
if (hRoot==hItem)
{
popup.EnableMenuItem(ID_ADD_CHILD_LEMMA, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
}
if (hRoot==hItem|| pData->m_strNodeAttributeValue ==c_szLate)
{
popup.AppendMenu(MF_STRING,ID_DEL_COLLECT,_T("删除目录"));
popup.EnableMenuItem(ID_DEL_COLLECT, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
}
else
{
popup.AppendMenu(MF_STRING,ID_DEL_COLLECT,_T("删除目录"));
}
// popup.AppendMenu(MF_STRING,ID_REN_COLLECT,_T("重命名"));
popup.AppendMenu(MF_STRING,ID_REN_COLLECT,_T("重命名"));
//if (hRoot==hItem)
//{
// popup.EnableMenuItem(ID_REN_COLLECT, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
//}
//}
}
ClientToScreen(&point);
popup.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
}
void CArchTextLibTreeCtrl::SetXMLDoc(CXMLDOMFile*pXMLDoc)
{
m_pXMLDoc = pXMLDoc;
}
/////////////////////////////////////////////
CXMLNodeInfo GetNodeInfo(const CXMLDOMNodePtr& pXmlNode,CXMLDOMFile *pXMLDoc)
{
CXMLNodeInfo TemInfo;
CXMLDOMNodePtr pRoot = pXMLDoc->GetRoot();
if (!pXmlNode->HasChildNodes())
{
if (*pXmlNode.get()!=*pRoot.get())
{
TemInfo.m_bLeafNode = TRUE;
TemInfo.m_strNodeName = pXmlNode->GetNodeName();
TemInfo.m_strNodeValue = pXmlNode->GetNodeValue();
TemInfo.m_strNodeAttributeName = pXmlNode->GetAttributeName();
TemInfo.m_strNodeAttributeValue = pXmlNode->GetAttributeValue(TemInfo.m_strNodeAttributeName);
}
else
{
TemInfo.m_bLeafNode = FALSE;
TemInfo.m_strNodeName = c_szAll;
}
}
else
{
if (*pXmlNode.get()!=*pRoot.get())
{
TemInfo.m_bLeafNode = FALSE;
TemInfo.m_strNodeName = pXmlNode->GetNodeName();
TemInfo.m_strNodeAttributeName = pXmlNode->GetAttributeName();
TemInfo.m_strNodeAttributeValue = pXmlNode->GetAttributeValue(TemInfo.m_strNodeAttributeName);
}
else
{
TemInfo.m_bLeafNode = FALSE;
TemInfo.m_strNodeName = c_szAll;
}
}
//CString strTem;
//pXMLDoc->GetCurNodeXPath(pXmlNode,strTem);
//TemInfo.m_strNodeXPath = strTem;
return TemInfo;
}
CXMLNodeInfo GetNodeInfoEx(const CXMLDOMNodePtr& pXmlNode,CXMLDOMFile *pXMLDoc)
{
CXMLNodeInfo TemInfo;
CXMLDOMNodePtr pRoot = pXMLDoc->GetRoot();
if (!pXmlNode->HasChildNodes())
{
if (*pXmlNode.get()!=*pRoot.get())
{
TemInfo.m_bLeafNode = TRUE;
TemInfo.m_strNodeName = pXmlNode->GetNodeName();
TemInfo.m_strNodeValue = pXmlNode->GetNodeValue();
TemInfo.m_strNodeAttributeName = pXmlNode->GetAttributeName();
TemInfo.m_strNodeAttributeValue = pXmlNode->GetAttributeValue(TemInfo.m_strNodeAttributeName);
}
else
{
TemInfo.m_bLeafNode = FALSE;
TemInfo.m_strNodeName = c_szAll;
}
}
else
{
//if (*pXmlNode.get()!=*pRoot.get())
//{
TemInfo.m_bLeafNode = FALSE;
TemInfo.m_strNodeName = pXmlNode->GetNodeName();
if (*pXmlNode.get()==*pRoot.get())
{
CString str = pXmlNode->GetAttributeName();;
if (str!=_T(""))
{
TemInfo.m_strNodeAttributeName = pXmlNode->GetAttributeName();
TemInfo.m_strNodeAttributeValue = pXmlNode->GetAttributeValue(TemInfo.m_strNodeAttributeName);
}
}
else
{
TemInfo.m_strNodeAttributeName = pXmlNode->GetAttributeName();
TemInfo.m_strNodeAttributeValue = pXmlNode->GetAttributeValue(TemInfo.m_strNodeAttributeName);
}
}
CString strTem;
pXMLDoc->GetCurNodeXPath(pXmlNode,strTem);
TemInfo.m_strNodeXPath = strTem;
return TemInfo;
}
BOOL OPenXmlDoc(CXMLDOMFile&xmlDoc)
{
TCHAR *strParth = new TCHAR[MAX_PATH] ;
if(!FindFile(_T("dict.xml"), strParth))
{
delete []strParth;
return FALSE;
}
if (xmlDoc.IsFileExist(strParth))
{
if (xmlDoc.Open(strParth))
{
delete []strParth;
return TRUE;
}
else
{
delete []strParth;
return FALSE;
}
}
delete []strParth;
return FALSE;
}
/////////////////////////////////////////////
void CChineseCode::UTF_8ToUnicode(wchar_t* pOut,char *pText)
{
char* uchar = (char *)pOut;
uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F);
uchar[0] = ((pText[1] & 0x03) << 6) + (pText[2] & 0x3F);
return;
}
void CChineseCode::UnicodeToUTF_8(char* pOut,wchar_t* pText)
{
// 注意 WCHAR高低字的顺序,低字节在前,高字节在后
char* pchar = (char *)pText;
pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));
pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6);
pOut[2] = (0x80 | (pchar[0] & 0x3F));
return;
}
void CChineseCode::UnicodeToGB2312(char* pOut,wchar_t uData)
{
WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(wchar_t),NULL,NULL);
return;
}
void CChineseCode::Gb2312ToUnicode(wchar_t* pOut,char *gbBuffer)
{
::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1);
return ;
}
void CChineseCode::GB2312ToUTF_8(CString& pOut,char *pText, int pLen)
{
char buf[4];
int nLength = pLen* 3;
char* rst = new char[nLength];
memset(buf,0,4);
memset(rst,0,nLength);
int i = 0;
int j = 0;
while(i < pLen)
{
//如果是英文直接复制就可以
if( *(pText + i) >= 0)
{
rst[j++] = pText[i++];
}
else
{
wchar_t pbuffer;
Gb2312ToUnicode(&pbuffer,pText+i);
UnicodeToUTF_8(buf,&pbuffer);
unsigned short int tmp = 0;
tmp = rst[j] = buf[0];
tmp = rst[j+1] = buf[1];
tmp = rst[j+2] = buf[2];
j += 3;
i += 2;
}
}
rst[j] = '\0';
//返回结果
pOut = rst;
delete []rst;
return;
}
void CChineseCode::UTF_8ToGB2312(CString &pOut, char *pText, int pLen)
{
char * newBuf = new char[pLen];
char Ctemp[4];
memset(Ctemp,0,4);
int i =0;
int j = 0;
while(i < pLen)
{
if(pText[i] > 0)
{
newBuf[j++] = pText[i++];
}
else
{
WCHAR Wtemp;
UTF_8ToUnicode(&Wtemp,pText + i);
UnicodeToGB2312(Ctemp,Wtemp);
newBuf[j] = Ctemp[0];
newBuf[j + 1] = Ctemp[1];
i += 3;
j += 2;
}
}
newBuf[j] = '\0';
pOut = newBuf;
delete []newBuf;
return;
}