#if !defined(AFX_INSTEXTDLG_H__FA6B9462_8FCD_432C_9C0E_3663CF9EC4F1__INCLUDED_) #define AFX_INSTEXTDLG_H__FA6B9462_8FCD_432C_9C0E_3663CF9EC4F1__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // InsTextDlg.h : header file #include "resource.h" #include "afxwin.h" #include "afxcmn.h" #include #include #include "XMLDomNode.h" #include "XMLDomNodes.h" #include "XMLDomFile.h" #include "EdJigEx.h" ////////////////////// #define TARCH_TEXTLIB_MSG_NEW WM_USER+100 #define TARCH_TEXTLIB_MSG_INSERT WM_USER+101 #define TARCH_TEXTLIB_MSG_RENAME WM_USER+102 #define TARCH_TEXTLIB_MSG_DELETE WM_USER+103 /////////////////////////////////////// //命名字符串 class CNameString:public CString { public: CString m_sContent;//详细内容 public: CNameString(const TCHAR*s=NULL):CString(s){}//ok void Split(CString &szName,CString &szContent0,CString& szContent1,CString&szContent2,CString&szContent3) { szName=*this; UString swContent(m_sContent),swContent0,swContent1,swContent2,swContent3; if(swContent.Length()<=125) swContent0=swContent; else { swContent0=swContent.Left(125); if(swContent.Length()<=250) swContent1=swContent.Right(swContent.Length()-125); else { swContent1=swContent.Mid(125,249); if(swContent.Length()<=375) swContent2=swContent.Right(swContent.Length()-250); else { swContent2=swContent.Mid(250,374); swContent3=swContent.Right(swContent.Length()-375); } } } /*if(swContent.GetLength()<=125) swContent0=swContent; else { swContent0=swContent.Left(125); if(swContent.GetLength()<=250) swContent1=swContent.Right(swContent.GetLength()-125); else { swContent1=swContent.Mid(125,125); if(swContent.GetLength()<=375) swContent2=swContent.Right(swContent.GetLength()-250); else { swContent2=swContent.Mid(250,125); swContent3=swContent.Right(swContent.GetLength()-375); } } }*/ USES_CONVERSION; szContent0=W2A(swContent0); szContent1=W2A(swContent1); szContent2=W2A(swContent2); szContent3=W2A(swContent3); } CString GetContent()const{return m_sContent==""?*this:m_sContent;}//ok }; // CListBoxItemData class CListBoxItemData { public: PDList lstNames; bool m_bAutoDel;//全部目录是指针引用,不自动删除 public: CListBoxItemData(bool bAD=true):m_bAutoDel(bAD){}//ok virtual ~CListBoxItemData(){Clear();} void Clear() { if(m_bAutoDel) lstNames.Clear(); else { DualList temp; temp.Conbine(lstNames); } } }; ////////////////////////////////////////////////// // CEditForListBox class CEditForListBox : public CEdit { public: CListBoxItemData *m_pItemData; public: CEditForListBox(); virtual ~CEditForListBox(); virtual void PostNcDestroy(); virtual BOOL PreTranslateMessage(MSG *pMsg); void SetExtentData(CListBoxItemData *&pItemData); afx_msg void OnKillFocus(CWnd* pNewWnd); DECLARE_MESSAGE_MAP() }; /////////////////////////////////////// // CExtendListBox class CExtendListBox : public CDragListBox { DECLARE_DYNAMIC(CExtendListBox) public: CExtendListBox(int iFlag = 0); virtual ~CExtendListBox(); public: CListBoxItemData* GetBoxData(){return m_pItemData;}//ok virtual void PreSubclassWindow(); virtual void Dropped(int nSrcIndex,CPoint pt); void DoDeleteItem(); void DoInsertItem(); void DoAppendItem(); void DoModifyItem(); BOOL GetModify(); void SetModify(BOOL bModified = TRUE); void SetExtendData(CListBoxItemData *&pItemData); int SetCurSel(int nSelect); CNameString* FindNameString(CString szName); CNameString* CreateNameString(); void CreateEdit(); CString CreateNewName(); protected: int m_iFlag; BOOL m_bModified; CListBoxItemData *m_pItemData; afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); afx_msg void OnRButtonDown(UINT nFlags, CPoint point); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnMenuCommand(UINT id); virtual BOOL OnChildNotify(UINT, WPARAM, LPARAM, LRESULT*); DECLARE_MESSAGE_MAP() }; ////////////////////////////////////////////////////////////// //得到一个xml文档中节点的各种数据 CXMLNodeInfo GetNodeInfo(const CXMLDOMNodePtr &pXmlNode,CXMLDOMFile *pXMLDoc); CXMLNodeInfo GetNodeInfoEx(const CXMLDOMNodePtr &pXmlNode,CXMLDOMFile *pXMLDoc); //打开xml文档 BOOL OPenXmlDoc(CXMLDOMFile&xmlDoc); ////////////////////////////////////////////////////////////// /////////////////////////////////////// //用于 新词库 的edit控件 主要是改了存储的数据 class CArtchTextLibEdit : public CEdit { public: CXMLNodeInfo *m_pItemData;// 一个叶子节点的数据 public: CArtchTextLibEdit(); CArtchTextLibEdit(CXMLDOMFile* pXMLDoc); virtual ~CArtchTextLibEdit(); virtual void PostNcDestroy(); virtual BOOL PreTranslateMessage(MSG *pMsg); void SetExtentData(CXMLNodeInfo *&pItemData); afx_msg void OnKillFocus(CWnd* pNewWnd); afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags); afx_msg void OnEnChange(NMHDR* p, LRESULT* l); DECLARE_MESSAGE_MAP() void SetXMLDoc(CXMLDOMFile*pXMLDoc);//设置xml指针 CXMLDOMFile* m_pXMLDoc;//xml文档指针 全部指向 dlg定义的那个 }; /////////////////////新词库listBox///////////////////////////// ///////////////主要更改了每行存储的扩展数据/////////////// class CArchTextLibListBox : public CDragListBox { DECLARE_DYNAMIC(CArchTextLibListBox) public: CArchTextLibListBox(int iFlag = 0); virtual ~CArchTextLibListBox(); public: virtual void PreSubclassWindow(); // virtual void Dropped(int nSrcIndex,CPoint pt); void DoDeleteItem();//删除当前条目 void DoInsertItem();//插入新条目 void DoAppendItem();//添加新条目 void DoModifyItem();//修改当前条目 BOOL GetModify();//得到该控件是否可修改 void SetModify(BOOL bModified = TRUE);//设置该控件是否可修改 void SetExtendData(CListBoxItemData *&pItemData);//此函数已弃用 int SetCurSel(int nSelect);//设置当前选项 void SetXMLDoc(CXMLDOMFile*pXMLDoc);//设置xml文档指针 void CreateEdit();//创建新编辑框 CString CreateNewName();//创建词条 int AddStringEx(LPCTSTR lpszItem,CXMLNodeInfo *pData);//添加新条目 有扩展数据 int DeleteStringEx(UINT nIndex);//删除条目及扩展数据 int InsertStringEx(int nIndex,CXMLNodeInfo *pData);//插入条目及扩展数据 void ReSetContentEx()//删除所有条目及扩展数据 { for(long i=0;iGetCount();i++) { CXMLNodeInfo *pData = (CXMLNodeInfo*)GetItemData(i); if (pData) { delete pData; } } ResetContent(); } protected: int m_iFlag; BOOL m_bModified;//是否循序修改 CXMLDOMFile* m_pXMLDoc;//xml文档指针 afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);//快捷键 afx_msg void OnRButtonDown(UINT nFlags, CPoint point);//右键菜单 afx_msg void OnLButtonDown(UINT nFlags, CPoint point);//左键拖拽 afx_msg void OnMenuCommand(UINT id);//菜单命令 virtual BOOL OnChildNotify(UINT, WPARAM, LPARAM, LRESULT*); DECLARE_MESSAGE_MAP() }; /////////////////////////////////////////////////////////////////////// ///////词库tree class CArchTextLibTreeCtrl : public CTreeCtrl { public: CArchTextLibTreeCtrl(); CArchTextLibTreeCtrl(CXMLDOMFile*pXMLDoc); //插入新节点及扩展数据 HTREEITEM InsertItemEx(CXMLNodeInfo *pNodeInfo, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST); //删除新节点及扩展数据 void DeleteItemEx(HTREEITEM hItem); //删除指定节点的子节点及其扩展数据 void DeleteChildItemEx(HTREEITEM hItem); virtual BOOL PreTranslateMessage(MSG* pMsg); //展开所有节点 void ExpandAll(); //收拢所有节点 void CollapseAll(); //设置xml文档指针 void SetXMLDoc(CXMLDOMFile*pXMLDoc); //删除所有节点扩展数据 void DeleteAllItemData(HTREEITEM hItem = TVI_ROOT); protected: //复制节点 HTREEITEM CopyItem(HTREEITEM hItem, HTREEITEM htiNewParent, HTREEITEM htiAfter); afx_msg void OnRButtonDown(UINT nFlags, CPoint point);//右键菜单 afx_msg void OnDestroy(){DeleteAllItemData();CTreeCtrl::OnDestroy();}//ok afx_msg void OnMenuCommand(UINT id);//菜单命令 afx_msg void OnTvnEndlabeledit(NMHDR *pNMHDR, LRESULT *pResult);//节点名字修改 afx_msg void OnTvnBeginlabeledit(NMHDR *pNMHDR, LRESULT *pResult);//节点名字修改 afx_msg void OnTvnBegindrag(NMHDR *pNMHDR, LRESULT *pResult);//拖拽节点 // Zyu modify on 100726,支持64位 //afx_msg void OnTimer(UINT nIDEvent);//定时器 afx_msg void OnTimer(UINT_PTR nIDEvent);//定时器 afx_msg void OnMouseMove(UINT nFlags, CPoint point);//鼠标移动 afx_msg void OnLButtonDown(UINT nFlags, CPoint point);//拖拽节点起始 afx_msg void OnLButtonUp(UINT nFlags, CPoint point);//拖拽节点终止 DECLARE_MESSAGE_MAP() void DoAddChildCollect();//添加子节点 void DoDeLeteItem();//删除节点 void DoAddLemma();// 添加条目 void DoReNameNode();//重命名 void DoCollapseCollect();//收拢节点 void DoExpandCollect();//展开节点 void DoExpandWorks();//展开整个词库 void DoCollapseWorks();//收缩整个词库 int GetShowFlag( HTREEITEM hItem, CPoint pt ); void DrawTempLine(CPoint ptSta, CPoint ptEnd); //根据节点成tree void XmlNodeToTreeNode(HTREEITEM hParentItem,const CXMLDOMNodePtr &pXmlNode); private: BOOL m_bEdit;//条目是否可以编辑 UINT m_TimerTicks; // Zyu modify on 100726,支持64位 //UINT m_nScrollTimerID; UINT_PTR m_nScrollTimerID; CPoint m_HoverPoint; // Zyu modify on 100726,支持64位 //UINT m_nHoverTimerID; UINT_PTR m_nHoverTimerID; DWORD m_dwDragStart; BOOL m_bDragging; CImageList* m_pDragImage; HTREEITEM m_hItemDragS; HTREEITEM m_hItemDragD; int m_nShowFlag; CPoint m_ptSta; CPoint m_ptEnd; BOOL m_bRub; CXMLDOMFile* m_pXMLDoc;//xml文档指针 }; ////////////////////////////////////////////////////////////// // CInsTextDlg 对话框 class CInsTextDlg : public CModelessDialog { DECLARE_DYNAMIC(CInsTextDlg) public: CInsTextDlg(CWnd* pParent = NULL); // 标准构造函数 CInsTextDlg(UINT IDD, CWnd* pParent = NULL); virtual ~CInsTextDlg(); // 对话框数据 enum { IDD = IDD_ARCHTEXT }; CArchTextLibTreeCtrl m_treeNames;//词库的类型树 CImageList m_imageList;//树的图片 CArchTextLibListBox m_dragNames;//未经排序的对应树中节点下数据的检索名 CArchTextLibListBox m_sortNames;//经排序的对应树中节点下数据的检索名 CToolBar m_toolBar;//工具条 CButton m_buttonAdd;//文件入库按钮 CButton m_buttonInput;//文件添加 CButton m_buttonFile;//导入文件按钮 CEdit m_editSearch;//文本框 BOOL m_bEditChanged;//文本框内容是否发生变化 //////////////////// //把显示文字设为单行 void SetSingleText(BOOL bSingle = TRUE){m_bSingleLineText = bSingle;} BOOL IsSingleText(){return m_bSingleLineText;}//文字是否单行显示 CNameString* CreateNameString();//创建一个字条 void AddToLast();//添加到最近使用框中 void SetPreText(CString &szText); void SetEditText(CString& szText); CString GetEditText(); virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 virtual BOOL OnInitDialog();//初始化对话框 afx_msg void OnLbnSelchangeName();//list选项更改时消息函数 afx_msg void OnEnChangeEditSearch();//编辑框更改消息函数 afx_msg void OnLbnDblclkListName();//双击list消息函数 afx_msg void OnSelectLetter(UINT nID);//工具条选择字母消息函数 afx_msg void OnBnClickedAddtolib();//入库按钮消息函数 afx_msg void OnBnClickedInputtolib(); afx_msg void OnBnClickedBtnInlib(); afx_msg void OnLbnSelchangeDragType();//此函数已失效 afx_msg void OnDestroy(); afx_msg void OnClose(); afx_msg void OnSize(UINT nType,int cx,int cy); afx_msg void OnTvnSelchangedTree(NMHDR *pNMHDR, LRESULT *pResult);//树更改消息函数 afx_msg LRESULT OnNewLine(WPARAM w,LPARAM l);//创建新list项自消息函数 afx_msg LRESULT OnInSertLine(WPARAM w,LPARAM l);//插入新list项自消息函数 afx_msg LRESULT OnReNameLine(WPARAM w,LPARAM l);//重命名list项自消息函数 afx_msg LRESULT OnDeleteLine(WPARAM w,LPARAM l);//删除list项自消息函数 #if ADS<17 afx_msg UINT OnNcHitTest(CPoint point); #else afx_msg LRESULT OnNcHitTest(CPoint point); #endif protected: CXMLDOMFile* m_pXMlDoc;//文档指针 在该对话框构造时打开 析构时关闭 BOOL m_bSort;//是否排序 BOOL m_bEdit;//是否可以编辑文本 HTREEITEM m_hLastItem;//最近点击的tree节点 void InitToolBar();//初始化工具条 void InitList();//初始化列表 void DeleteTree();//删除树 void InitTree();//初始化树 void SetNamesModify();////设置显示的列表框 void AddNamesByType(CArchTextLibListBox &listBox);//向列表框中添加数据 void ChangeListBox(BOOL bIsSort);////设置显示的列表框 void UpdateButton();//更新显示的按钮 BOOL ReadStoreData();//此函数已失效 BOOL WriteStoreData();//此函数已失效 //深度遍历tree void GetXmlNodesValue(CArchTextLibListBox &listBox,const CXMLDOMNodePtr &pXmlNode,BOOL bAll,BOOL bSort); void XmlNodeToTreeNode(HTREEITEM hParentItem,const CXMLDOMNodePtr &pXmlNode); void DoDeleteItem();//删除列表条目 void DoInsertItem();//插入列表条目 void DoAppendItem();//添加列表条目 void DoModifyItem();//修改列表条目 //广度遍历tree形成界面tree void BreadthXmlNodeToTreeNode(const CXMLDOMNodePtr &pXmlNode); //广度遍历tree形成界面listbox void BreadGetXmlNodesValve(CArchTextLibListBox &listBox,const CXMLDOMNodePtr &pXmlNode); //深度遍历形成界面listbox // void DeepGetXmlNodesValve(CArchTextLibListBox &listBox,const CXMLDOMNodePtr &pXmlNode); // void AnalyseXmlTree(const MSXML2::IXMLDOMNodeListPtr& pXMLDOMNodeList, CArchTextLibListBox &listBox); // void InsertIntoLst(const MSXML2::IXMLDOMNodePtr &pXmlNode,CArchTextLibListBox &listBox); //得到xml节点tag名字 CString GetXMLNodeName(const MSXML2::IXMLDOMNodePtr &pIXMLDOMNodePtr); //得到xml节点属性名字 // CString GetXMLNodeAttributeName(const MSXML2::IXMLDOMNodePtr &pIXMLDOMNodePtr); //得到xml节点属性值 CString GetXMLNodeAttributeValue(const MSXML2::IXMLDOMNodePtr &pIXMLDOMNodePtr,const CString strNodeAttriName); //得到xml节点值(仅对叶子节点) // CString GetXMLNodeValue(const MSXML2::IXMLDOMNodePtr &pIXMLDOMNodePtr); //是否有子节点 BOOL IsHasChildNodes(const MSXML2::IXMLDOMNodePtr &pIXMLDOMNodePtr); //非递归深度遍历xmltree形成listbox // void Test(const CXMLDOMNodePtr &pXmlNode,CArchTextLibListBox &listBox); //设置字符串在界面回车(即加\n\r) CString SetStrReturn(const CString &strText); //删除字符串在界面回车(即加\n\r) CString DelStrReturn(const CString &strText); DECLARE_MESSAGE_MAP() private: BOOL m_bSingleLineText;//是否为单行文字 }; //////////////////////////////////////////////////////////////////////// ////////////抽象出来的dbf格式文档数据//////////////////// class WordLibDbfInfo { public: WordLibDbfInfo() { m_strAttrivalue = _T(""); m_strvalue = _T(""); } WordLibDbfInfo(const WordLibDbfInfo&data) { m_strvalue = data.m_strvalue; m_strAttrivalue = data.m_strAttrivalue; } WordLibDbfInfo&operator=(const WordLibDbfInfo&data) { m_strvalue = data.m_strvalue; m_strAttrivalue = data.m_strAttrivalue; return *this; } public: CString m_strAttrivalue;//dbf文档中的 type 或 name项 CString m_strvalue;//每行中的所有content }; //存储dbf信息的数组 typedef Array DBFArray; //根据dbf文档中的type项做键值 形成的 map typedef std::map TARCHWORDLIBDBFMAP; //存储xml文档节点信息的数组 typedef Array XMLNodeInfoArray; // CArchTextLibDlg 对话框 class CArchTextLibDlg : public CInsTextDlg { DECLARE_DYNAMIC(CArchTextLibDlg) public: CArchTextLibDlg(CWnd* pParent = NULL); // 标准构造函数 virtual ~CArchTextLibDlg(); // 对话框数据 enum { IDD = IDD_ARCHTEXTLIB }; CComboBox m_comboStyle; int m_iAlign; // modify by xly on 101222 支持记录字高 //CString m_csHeight; static CString m_csHeight; // modify by xly on 101014 支持记录文字样式 //CString m_csTextStyle; static CString m_csTextStyle; int m_iRunMode; void SetTextStyle(const TCHAR* szStyle); protected: BOOL m_bInDialog; virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 virtual BOOL OnInitDialog(); afx_msg void OnLbnDblclkDragName(); afx_msg void OnBnClickedButtonFile();//导入数据按钮消息函数 afx_msg void OnExport();//导出数据 afx_msg void OnButtonReplace();//替换按钮消息函数 afx_msg void OnButtonPick();//提取cad图中数据函数 afx_msg void OnClose(); // Zyu modify on 100726,支持64位 //afx_msg void OnTimer(UINT nIDEvent); afx_msg void OnTimer(UINT_PTR nIDEvent); DECLARE_MESSAGE_MAP() //读取txt数据 void ReadTxt(HTREEITEM hItem,const CString &strPath,CXMLDOMNodePtr&pXMLDOMNodePtr); //读取xml数据 void ReadXml(HTREEITEM hItem,const CString &strPath,CXMLDOMNodePtr&pXMLDOMNodePtr); //读取dbf数据 void ReadDbf(HTREEITEM hItem,const CString &strPath,CXMLDOMNodePtr&pXMLDOMNodePtr); //把xml中指定节点下的词条数据导出txt void ExportTxt(CStdioFile &file,const CXMLDOMNodePtr &pXmlNode); //创建新的xml并把原xml文档指定节点下的所有数据导入新建的xml中 BOOL BuildDynamicXMLwithProcessingInstruction(CString&strPath); public: }; //////////////////////////////////////////////////// // TTextEdJig class TTextEdJig : public TSymbEdJig { protected: TDbText *m_pText; AcDbText *m_pAcadText; static XExplodeDraw::TextAlignment m_AlignList[]; public: TTextEdJig(CArchTextLibDlg *dlg, XPoint pt); TTextEdJig(BOOL bIsTg, XPoint pt, double nHeight, const TCHAR*szText, AcDbObjectId idStyle, double nRotation); ~TTextEdJig(); virtual int DoIt(int *pKeyIndex=NULL); DragStatus GetPoint(XPoint &pt); CArchTextLibDlg *m_pDlg; BOOL m_bIsTgText; XPoint m_ptRef; AcGeMatrix3d m_AcadTextMat; AcDbObjectId m_idStyle; void SetWHScale(double nWHScale); void SetAlign(AcDb::TextVertMode vertMode, AcDb::TextHorzMode horzMode, AcGeMatrix3d mat); void SetAlign(XExplodeDraw::TextAlignment Align); protected: virtual Adesk::Boolean update(); virtual AcDbEntity* entity() const; }; /////////////////////////////////////////////////////////////////// //TMTextJig class TMTextEdJig : public TSymbEdJig{ public: TMTextEdJig(CArchTextLibDlg *dlg, XPoint pt); TMTextEdJig(BOOL bIsTg, XPoint pt, double nHeight, const TCHAR*szText, AcDbObjectId idStyle, double nRotation); ~TMTextEdJig(); virtual int DoIt(int *pKeyIndex=NULL); DragStatus GetPoint(XPoint &pt); CArchTextLibDlg *m_pDlg; BOOL m_bIsTgText; BOOL m_bSet; XPoint m_ptRef; AcGeMatrix3d m_AcadTextMat; AcDbObjectId m_idStyle; double m_dWidth; CString m_strLast;//上一次的 jig中显示的文字 void SetWHScale(double nWHScale); void SetAlign(AcDb::TextVertMode vertMode, AcDb::TextHorzMode horzMode, AcGeMatrix3d mat); void SetAlign(XExplodeDraw::TextAlignment Align); // Acad::ErrorStatus GetExtents2d(TDbEntity*pent,XPoint &ptLow, XPoint &ptUp); // double GetMTextPageWidth(); protected: virtual Adesk::Boolean update(); virtual AcDbEntity* entity() const; protected: TDbMText *m_pMText; AcDbMText *m_pAcadMText; // TDbText *m_pText; // AcDbText *m_pAcadText; // BOOL m_bMText; static XExplodeDraw::TextAlignment m_AlignList[]; private: }; bool GetSpecialChar(CWnd*pParent,CString &res); bool GetWordFromLib(CWnd*pParent,CString &res); //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. /////////////////////////////////////////// class CChineseCode { public: static void UTF_8ToUnicode(wchar_t* pOut,char *pText); // 把UTF-8转换成Unicode static void UnicodeToUTF_8(char* pOut,wchar_t* pText); //Unicode 转换成UTF-8 static void UnicodeToGB2312(char* pOut,wchar_t uData); // 把Unicode 转换成 GB2312 static void Gb2312ToUnicode(wchar_t* pOut,char *gbBuffer);// GB2312 转换成 Unicode static void GB2312ToUTF_8(CString& pOut,char *pText, int pLen);//GB2312 转为 UTF-8 static void UTF_8ToGB2312(CString &pOut, char *pText, int pLen);//UTF-8 转为 GB2312 }; #endif // !defined(AFX_INSTEXTDLG_H__FA6B9462_8FCD_432C_9C0E_3663CF9EC4F1__INCLUDED_)