// 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&&iCurSelGetCount()) 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=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;i0) { int i = 0; for (;iget_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 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;iGetlength();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 quene; std::deque 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;iGetlength();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(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;im_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= 0 && szText.CollateNoCase(szHead[iPick+1]) <= 0) { m_sortNames.SetCurSel(i); return; } } } else { for(int i=0; i= 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; iGetItem(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; iGetItem(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; ilstNames.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; iSetFocus(); 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;iGetRoot(); 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 (;iGetItem(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 (;iSelectSingleNode(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("\n\n\n\n\n\n\n\n"); 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("\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; iGetItem(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;iGetCount();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;iGetItem(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;kIsChildNodeExist(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;kAppendNode(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;kAppendNode(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;iGetRoot(); 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;iSetStyleId(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 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 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 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&&iCurSelGetCount()) // 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=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; iGetItem(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(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(pNMHDR); if(m_bEdit) { m_bEdit = FALSE; *pResult = 0; } else *pResult = 1; } void CArchTextLibTreeCtrl::OnTvnEndlabeledit(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTVDISPINFO pTVDispInfo = reinterpret_cast(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 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; }