// SlbManDlg.cpp : implementation file // #include "stdafx.h" #include "SlbManDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //extern TARCH_IMPEXP int DragInsertBlock1(const TCHAR *szBlock, int nFlag, const AcGeScale3d &scales); extern TARCH_IMPEXP int g_nRunMode; const int g_nMaxRecentSlb = 6; UINT MenuID = 8000; ///////////////////////////////////////////////////////////////////////////// // CSlbManDlg dialog int ShowSlbMgr() { CSlbManDlg dlg(acedGetAcadFrame()); INT_PTR nRet; { CTemporaryResourceOverride vTmp; nRet=dlg.DoModal(); } if(nRet==IDOK) dlg.DragInsert(); return RTNORM; } IMPLEMENT_DYNAMIC(CSlbManDlg, CTKImageDlg) CSlbManDlg::CSlbManDlg(CWnd* pParent /*=NULL*/) : CTKImageDlg(CSlbManDlg::IDD, pParent) { //{{AFX_DATA_INIT(CSlbManDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_hOldItem = 0; m_bIsEndOpen = TRUE; m_bCellIsDragging = FALSE; } void CSlbManDlg::DoDataExchange(CDataExchange* pDX) { CTKImageDlg::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSlbManDlg) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CSlbManDlg, CTKImageDlg) //{{AFX_MSG_MAP(CSlbManDlg) ON_NOTIFY(LVN_ITEMCHANGED, IDC_TK_LIST, OnItemchangedTkList) ON_WM_LBUTTONDOWN() ON_COMMAND(ID_BLK_LAYOUT, OnBlkLayout) ON_NOTIFY(TBN_DROPDOWN, IDR_SLBMAN, OnToolbarDropDown) ON_COMMAND(ID_BLK_OPENLIB, OnBlkOpenlib) ON_WM_CONTEXTMENU() ON_COMMAND(ID_BLK_RENAME, OnBlkRename) ON_NOTIFY(LVN_ENDLABELEDIT, IDC_TK_LIST, OnEndlabeleditTkList) ON_NOTIFY(LVN_BEGINLABELEDIT, IDC_TK_LIST, OnBeginlabeleditTkList) ON_COMMAND(ID_BLK_DEL, OnBlkDel) ON_COMMAND(ID_BLK_COPY, OnBlkCopy) ON_COMMAND(ID_BLK_EXPLODE, OnBlkExplode) ON_COMMAND(ID_BLK_SORT, OnBlkSort) ON_COMMAND(ID_BLK_UPGRADE, OnBlkUpgrade) ON_COMMAND(ID_BLK_NEWLIB, OnBlkNewlib) ON_NOTIFY(TVN_SELCHANGED, IDC_TK_TREE, OnSelchangedTkTree) ON_NOTIFY(NM_CLICK, IDC_TK_TREE, OnClickTkTree) ON_COMMAND(ID_BLK_DELKIND, OnBlkDelkind) ON_NOTIFY(NM_RCLICK, IDC_TK_TREE, OnRclickTkTree) ON_WM_MOUSEMOVE() ON_COMMAND(IDOK, OnOK) ON_WM_LBUTTONUP() ON_WM_CLOSE() //}}AFX_MSG_MAP ON_COMMAND_EX(MenuID, OnSelectRecentBlb) ON_COMMAND_EX(MenuID + 1, OnSelectRecentBlb) ON_COMMAND_EX(MenuID + 2, OnSelectRecentBlb) ON_COMMAND_EX(MenuID + 3, OnSelectRecentBlb) ON_COMMAND_EX(MenuID + 4, OnSelectRecentBlb) ON_COMMAND_EX(MenuID + 5, OnSelectRecentBlb) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CSlbManDlg message handlers void CSlbManDlg::OnClose() { SaveStatus(); CTKImageDlg::OnClose(); } BOOL CSlbManDlg::OnInitDialog() { CTKImageDlg::OnInitDialog(); SetWindowText(_T("上华幻灯库管理")); //add by xlc on 080828 m_menu.LoadMenu(IDR_MENU_SLB); SetMenu(&m_menu); InitToolBar(); LoadStatus(); ReadFile(); { CTemporaryResourceOverride vTmp; m_imageTree.Create( IDB_TREE, 14, 1, RGB(255,255,255) ); m_treeCtrl.SetImageList( &m_imageTree, TVSIL_NORMAL ); m_imageList.Create( IDB_LIST, 14, 1, RGB(255,255,255) ); m_listCtrl.SetImageList( &m_imageList, LVSIL_SMALL); } SetupTreeView(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } BOOL SelectSlb(XString& m_xsFileName, BOOL bIsOpen, CWnd *pDlgWnd) { CString csFileName=(const TCHAR *)m_xsFileName; CFileDialog dlg(TRUE,_T("*.slb"),csFileName,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("幻灯库(*.slb) |*.SLB||"), pDlgWnd); TCHAR strDlgTitle[] = _T("选择幻灯库文件"); dlg.m_ofn.lpstrTitle = strDlgTitle; if(dlg.DoModal()!=IDOK) return FALSE; TCHAR szShortPath[256]=_T(""); _tcscpy(szShortPath, dlg.GetPathName()); m_xsFileName=szShortPath; if(!FindFile(m_xsFileName) && bIsOpen) { AfxMessageBox(_T("请正确输入幻灯库文件名!")); return FALSE; } if(FindFile(m_xsFileName) && !bIsOpen){ AfxMessageBox(_T("已存在同名幻灯库文件!")); return FALSE; } return TRUE; } BOOL CSlbManDlg::ReadFile() { if(m_xsFileName == _T("")) return FALSE; m_lstSlb.Reset(); XSlideLib lib(m_xsFileName, _ios::in|_ios::binary); TCHAR szDrive[_MAX_DRIVE]=_T(""), szDir[_MAX_DIR]=_T(""), szFile[_MAX_FNAME]=_T(""), szExt[_MAX_EXT]=_T(""); _tsplitpath(m_xsFileName, szDrive, szDir, szFile, szExt); m_xsFilePath=(const TCHAR *)XString(_T("%s%s"), szDrive, szDir); m_csSlbName = szFile; lib.GetAll(m_lstSlb); InitVSBar(); if(m_bSort) m_lstSlb.QuickSort(_tcscmp); return TRUE; } void CSlbManDlg::ResetStateText() { CString csMsg, csRecord; if(m_lstSlb.Length() ==0 ) return; csRecord = m_lstSlb[m_nIndex]; csMsg.Format(_T("名称:%s 页号:%d/%d 总数: %d"), (const TCHAR *)csRecord, CurPage() + 1, TotalPages(), GetTotalRecords()); SetStateText(csMsg); } void CSlbManDlg::SetupTreeView() { m_bIsDelTree = TRUE; m_treeCtrl.DeleteAllItems(); m_bIsDelTree = FALSE; int lenTree = m_lstKindNames.Length(); HTREEITEM hTemp=NULL, hFilter=NULL; // ZJQ modify here for(int i=0; iFill(RGB(192,192,192)); pImg->PaintSlide(NULL); } else { pImg->PaintSlide(xsFile); } } int CSlbManDlg::GetTotalRecords() //取得当前链表的节点个数 { return m_lstSlb.Length(); } void CSlbManDlg::OnItemchangedTkList(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; int nSel = m_listCtrl.GetNextItem(-1, LVNI_SELECTED); if(nSel < 0) return; SelectIndex(nSel); m_listCtrl.SetHotItem(nSel); *pResult = 0; ResetStateText(); } void CSlbManDlg::OnLButtonDown(UINT nFlags, CPoint point) { if(IsPointOnImage(point) && (!m_bBiginEdit)) SelectPageIndex(GetPageIndex(point)); else { CTKImageDlg::OnLButtonDown(nFlags, point); return; } m_bCellIsDragging = TRUE; m_dragTarget = NULL; SetCapture(); ResetStateText(); CTKImageDlg::OnLButtonDown(nFlags, point); } void CSlbManDlg::OnLButtonUp(UINT nFlags, CPoint point) { if(m_bCellIsDragging == TRUE){ HTREEITEM hOldSelItem; hOldSelItem = m_treeCtrl.GetSelectedItem(); if((m_dragTarget != NULL) && (m_dragTarget != hOldSelItem)){ if(!IsValid(m_nIndex)) { m_bCellIsDragging = FALSE; ReleaseCapture(); m_treeCtrl.SelectDropTarget(NULL); return; } XString xsSlbName; xsSlbName = m_treeCtrl.GetItemText(m_dragTarget); XSlideLib lib(m_xsFileName);// 拷贝源 XSlideLib lib2(xsSlbName); // 拷贝目标 XStringList lstSlb; lstSlb.Reset(); lib2.GetAll(lstSlb); XString xsSldName = m_lstSlb[m_nIndex]; int ret = lstSlb.Index(xsSldName, 0); if(ret >= 0) { // 库中有此项,同名! XString xsAlert(256); xsAlert << xsSldName << _T(" 已存在,是否覆盖?") ; if(MessageBox(xsAlert, _T("警告"), MB_OKCANCEL|MB_ICONQUESTION) != IDOK) { lib2.Close(); lib.Close(); m_bCellIsDragging = FALSE; ReleaseCapture(); m_treeCtrl.SelectDropTarget(NULL); return; } } TCHAR dwgPrefix[256]=_T(""); GetTempPath(255, dwgPrefix); if(dwgPrefix[_tcslen(dwgPrefix)-1]!=_T('\\')) _tcscat(dwgPrefix, _T("\\")); _tcscat(dwgPrefix, _T("SRTEMP\\")); MakeDir(dwgPrefix); _tcscat(dwgPrefix, xsSldName); _tcscat(dwgPrefix, _T(".sld")); lstSlb.Reset(); lib.GetAll(lstSlb); int nIndex = -1; nIndex = lstSlb.Index(xsSldName, FALSE); if(m_bSort) lib.Copy(nIndex, dwgPrefix); else lib.Copy(m_nIndex, dwgPrefix); lstSlb.Reset(); lib.GetAll(lstSlb); lib2.Append(dwgPrefix); lib.Close(); lib2.Close(); _tremove(dwgPrefix); m_dragTarget = NULL; SetStateText(_T("已成功复制幻灯片!")); } m_bCellIsDragging = FALSE; ReleaseCapture(); m_treeCtrl.SelectDropTarget(NULL); } CTKImageDlg::OnLButtonUp(nFlags, point); } void CSlbManDlg::OnMouseMove(UINT nFlags, CPoint point) { if(!(nFlags & MK_LBUTTON) ) { CTKImageDlg::OnMouseMove(nFlags, point); return; } if(!m_bCellIsDragging) { CTKImageDlg::OnMouseMove(nFlags, point); return; } CPoint pntScreen(point); ClientToScreen(&pntScreen); CRect rcTree; m_treeCtrl.GetWindowRect(rcTree); CWinApp* pApp = AfxGetApp(); if( rcTree.PtInRect( pntScreen ) == TRUE ){ // 鼠标落在TREE中换光标 { CTemporaryResourceOverride vTemp; HICON hIcon = pApp->LoadCursor(IDC_CUR_CELLCOPY); SetCursor(hIcon); } CPoint ptTree( point ); MapWindowPoints( &m_treeCtrl, &ptTree, 1 ); UINT uHitTest = TVHT_ONITEM; m_dragTarget = m_treeCtrl.HitTest(ptTree, &uHitTest); if(m_dragTarget != NULL) m_treeCtrl.SelectDropTarget(m_dragTarget); } else { { CTemporaryResourceOverride vTemp; HICON hIcon = ::LoadCursor( NULL,IDC_NO ); SetCursor(hIcon); } } CTKImageDlg::OnMouseMove(nFlags, point);} void CSlbManDlg::InitToolBar() { CTemporaryResourceOverride vTmp; int ButtonID[]={ ID_BLK_NEWLIB, ID_BLK_OPENLIB, 0, ID_BLK_UPGRADE, ID_BLK_COPY, ID_BLK_DELKIND,ID_BLK_DEL, 0, ID_BLK_LAYOUT,ID_BLK_PAGEUP, ID_BLK_PAGEDOWN, ID_BLK_SORT, 0, IDOK,}; m_ToolBar.InitToolBar(ButtonID, 14, IDR_SLBMAN, this); m_ToolBar.SetStyle(ID_BLK_SORT, TBSTYLE_CHECK); m_ToolBar.SetStyle(ID_BLK_OPENLIB, TBSTYLE_DROPDOWN); m_ToolBar.SetStyle(ID_BLK_LAYOUT, TBSTYLE_DROPDOWN); } void CSlbManDlg::OnToolbarDropDown(NMHDR* pnmtb0, LRESULT *plr) { NMTOOLBAR* pnmtb= (NMTOOLBAR *)pnmtb0; if(pnmtb->iItem == ID_BLK_LAYOUT) OnBlkLayout(); else if(pnmtb->iItem == ID_BLK_OPENLIB) { CWnd *pWnd = &m_ToolBar; CRect rc; pWnd->SendMessage(TB_GETRECT, pnmtb->iItem, (LPARAM)&rc); pWnd->ClientToScreen(&rc); CMenu popupMenu; { if(m_pPopupMenu) { m_pPopupMenu->DestroyMenu(); m_pPopupMenu->CreatePopupMenu(); } else { m_pPopupMenu=new CMenu; m_pPopupMenu->CreatePopupMenu(); } int len, i; len = m_lstBlbNames.Length(); for(i=0; i< len; i++) // 将最近使用过的库加入菜单 m_pPopupMenu->AppendMenu(MF_STRING, MenuID + i, m_lstBlbNames[i]); } m_pPopupMenu->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL, rc.left, rc.bottom, this, &rc); } } void CSlbManDlg::OnBlkLayout() { CWnd *pWnd = &m_ToolBar; CMenu menu; CMenu* pPopup, *pPopupLayout; CMenu popupMenu; CRect rc; pWnd->SendMessage(TB_GETRECT, ID_BLK_LAYOUT, (LPARAM)&rc); pWnd->ClientToScreen(&rc); { CTemporaryResourceOverride vTemp;//加载菜单 menu.LoadMenu(IDR_MENU_IMAGELAYOUT); } pPopup = menu.GetSubMenu(0); pPopupLayout = pPopup->GetSubMenu(8); pPopupLayout->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL, rc.left, rc.bottom, this, &rc); } //读状态 void CSlbManDlg::LoadStatus() { CRegProperty regProp(GetRegLocation(), _T("SLBMAN")); regProp.SetTopRootKey(HKEY_CURRENT_USER); int nRow=3, nColumn=2; if(regProp.GetValue(_T("PageRow"), nRow) && regProp.GetValue(_T("PageColmn"), nColumn)) { ASSERT(nRow>0 && nColumn>0); } CString csCurslb; regProp.GetValue(_T("The cur slb"), csCurslb); m_xsFileName = (const TCHAR *)csCurslb; m_lstKindNames.Reset(); m_lstBlbNames.Reset(); for(int i=0; i= g_nMaxRecentSlb) m_lstBlbNames.Remove(0); m_lstBlbNames.Append(tstrnew(m_xsFileName)); nLen=m_lstBlbNames.Length(); for(i=0; i= g_nMaxRecentSlb) { AfxMessageBox(_T("对不起,您最多只能打开6个幻灯库。")); return; } if(!SelectSlb(m_xsFileName, TRUE, this)) return; for(int i=0; i= g_nMaxRecentSlb) m_lstBlbNames.Remove(0); m_lstKindNames.Append(tstrnew(m_xsFileName)); m_bIsEndOpen = FALSE; SetupTreeView(); SaveStatus(); SetupImage(TRUE); SelectIndex(0); } //选最近库 BOOL CSlbManDlg::OnSelectRecentBlb(UINT nID) { int nLen = m_lstBlbNames.Length(); int nIndex=nID - MenuID; ASSERT(nIndex < nLen); XString xsName; xsName = m_lstBlbNames[nIndex]; if(_tcsicmp(xsName, m_xsFileName)!=0) { nLen = m_lstKindNames.Length(); for(int i=0; i0 ? 0:-1; SetupTreeView(); SetupImage(TRUE); SelectIndex(m_nIndex); } return TRUE; } void CSlbManDlg::OnContextMenu(CWnd* pWnd, CPoint point) { CMenu menu; { CTemporaryResourceOverride vTemp;//加载菜单 menu.LoadMenu(IDR_MENU_SLBMAN); } if(IsInRect(IDC_PIC_IMAGE, point)) { CMenu *pSubMenu = menu.GetSubMenu(0); if(pSubMenu) pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this, NULL); } if(IsInRect(IDC_TK_LIST, point)) { CMenu *pSubMenu = menu.GetSubMenu(0); if(pSubMenu) pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this, NULL); } if(IsInRect(IDC_TK_TREE, point)) { CMenu Menu; Menu.LoadMenu(IDR_MENU_TREE_SLBMAN); CMenu *pSubMenu = Menu.GetSubMenu(0); if(pSubMenu) pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this, NULL); } } void CSlbManDlg::OnBlkRename() { m_listCtrl.SetFocus(); ASSERT(m_nIndex>=0); m_listCtrl.EditLabel(m_nIndex); } void CSlbManDlg::OnEndlabeleditTkList(NMHDR* pNMHDR, LRESULT* pResult) { LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR; if((pDispInfo->item.pszText != NULL)&&(pDispInfo->item.iItem != -1)) { XSlideLib lib(m_xsFileName); XString xsNewName; xsNewName= pDispInfo->item.pszText; int ret = m_lstSlb.Index(xsNewName, 0); if(ret >= 0) { // 链表中有此项,同名! lib.Close(); AfxMessageBox(_T("对不起,不能重名!")); m_bBiginEdit = FALSE; *pResult = 0; return; } if(!lib.Rename(pDispInfo->item.iItem, pDispInfo->item.pszText)) { m_bBiginEdit = FALSE; AfxMessageBox(_T("对不起,系统更名失败!")); *pResult = 0; return; } lib.Close(); ReadFile(); SetupList(); SelectIndex(m_nIndex); } m_bBiginEdit = FALSE; *pResult = 0; } void CSlbManDlg::OnBeginlabeleditTkList(NMHDR* pNMHDR, LRESULT* pResult) { LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR; m_bBiginEdit = TRUE; *pResult = 0; } void CSlbManDlg::OnBlkDel() { XSlideLib lib(m_xsFileName); if(MessageBox(_T("注意:此幻灯片删除将无法恢复!您是否真的删除?"),_T("警告"),MB_OKCANCEL|MB_ICONQUESTION) != IDOK) return; lib.Remove(m_nIndex); lib.Close(); ReadFile(); SetupList(); SetupImage(TRUE); if(m_nIndex != 0 && m_nIndex != (m_lstSlb.Length() - 1)) m_nIndex--; // 当前图块不是首尾时,将其值减1 ASSERT(m_nIndex>=0); SelectIndex(m_nIndex); } int DragInsertBlock(const TCHAR *szBlock, int nFlag, const AcGeScale3d &scales); //作为图形动态拖动的插入图中 int CSlbManDlg::DragInsert() { int nRet=RTERROR; if(IsValid(m_nIndex)) { XString sFile(256); sFile << (const TCHAR *)m_xsFilePath << (const TCHAR *)m_csSlbName << _T("(") << (const TCHAR *)m_lstSlb[m_nIndex] << _T(")"); XImageBufList m_slide; if(m_slide.FromSlide(sFile)==RTNORM) { AcDbBlockTableRecord *pRec=new AcDbBlockTableRecord(); pRec->setName(_T("*U")); AddBlock(pRec, Adesk::kFalse); const TCHAR *pszName=NULL; pRec->getName(pszName); XString sBlkName; sBlkName=pszName; XPoint ptLow, ptUp; m_slide.GetExtend(ptLow, ptUp); ads_matrix mat; XPoint ptOrg; ptLow.GetMoveMatrix(ptOrg, mat); m_slide.Transform(mat); for(int i=0; iappendAcDbEntity(pLine)==Acad::eOk) pLine->close(); else delete pLine; } for(i=0; iappendAcDbEntity(pHatch)==Acad::eOk) pHatch->close(); else delete pHatch; } } pRec->close(); int nInsFlag=IBF_MINSERT|IBF_ROT90|IBF_MIRLR|IBF_MIRUD|IBF_ALIGN |IBF_FRAME|IBF_ROTATE|IBF_BASEPT|IBF_RESEL; if(!g_nRunMode) { nInsFlag |= IBF_TINSERT; nRet=DragInsertBlock(sBlkName, nInsFlag, AcGeScale3d(1,1,1)); } else { nRet=DragInsertBlock1(sBlkName, nInsFlag, AcGeScale3d(1,1,1)); } } } return nRet; } BOOL SelectSld(XString& m_xsFileName, CWnd *pDlgWnd) { CString csFileName = (const TCHAR *)m_xsFileName; csFileName = csFileName + _T(".sld"); CFileDialog dlg(TRUE,_T("*.sld"),csFileName,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("Slide(*.sld) |*.SLD||"), pDlgWnd); TCHAR strDlgTitle[] = _T("选择幻灯片文件"); dlg.m_ofn.lpstrTitle = strDlgTitle; if(dlg.DoModal()!=IDOK) return FALSE; TCHAR szShortPath[256]=_T(""); _tcscpy(szShortPath, (const TCHAR *)dlg.GetPathName()); m_xsFileName=szShortPath; if(FindFile(m_xsFileName)) { XString xsMsg(256); xsMsg << m_xsFileName << _T("已存在, 要覆盖它吗?"); if(AfxMessageBox(xsMsg,MB_OKCANCEL|MB_ICONQUESTION) != IDOK) return FALSE; } return TRUE; } void CSlbManDlg::OnBlkCopy() { if(!IsValid(m_nIndex)) return; XString xsSldName = m_lstSlb[m_nIndex]; if(!SelectSld(xsSldName, this)) return; XSlideLib lib(m_xsFileName); lib.Copy(m_nIndex, xsSldName); lib.Close(); } void CSlbManDlg::OnBlkExplode() { extern BOOL GetFolderDia(XString &sFolder, CWnd *pParent, const TCHAR *pszTitle); XString sFolder; if(!GetFolderDia(sFolder, this, _T("选择释放幻灯文件的目录"))) return; XPathParser parser(m_xsFileName); for(int i=0; i= 0) { // 链表中有此项,同名! XString xsAlert(256); xsAlert << csIndex << _T(" 已存在,是否覆盖?") ; if(MessageBox(xsAlert, _T("警告"), MB_OKCANCEL|MB_ICONQUESTION) != IDOK) continue; } lib.Append(csIndex); } ReadFile(); SetupList(); SetupImage(TRUE); } void CSlbManDlg::OnBlkNewlib() { SetStateText(_T("新建一幻灯库文件")); if(!SelectSlb(m_xsFileName, FALSE, this)) return; int nLen = m_lstKindNames.Length(); for(int i=0; i= g_nMaxRecentSlb) m_lstBlbNames.Remove(0); m_lstKindNames.Append(tstrnew(m_xsFileName)); m_bIsEndOpen = FALSE; SetupTreeView(); SetupImage(TRUE); }