#include "StdAfx.h" #include "DockPane.h" #include "NewDirDlg.h" #include "direct.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif IMPLEMENT_DYNAMIC(CDockPane, CAdUiDockControlBar) BEGIN_MESSAGE_MAP(CDockPane, CAdUiDockControlBar) //{{AFX_MSG_MAP(CDockPane) ON_WM_CREATE() ON_WM_CONTEXTMENU() ON_COMMAND(ID_DELDIR, OnDeldir) ON_COMMAND(ID_NEWDIR, OnNewdir) ON_COMMAND(ID_DIR_OPEN, OnOpenDir) ON_COMMAND(ID_DIR_UPDATE, OnUpdateDir) ON_COMMAND(ID_NEWFILE, OnNewFile) ON_COMMAND(ID_DELFILE, OnDelFile) //}}AFX_MSG_MAP END_MESSAGE_MAP() static CLSID clsCDockPane = { 0xa20d432c, 0x7025, 0x40e4, {0x99, 0x5f, 0x31, 0xa8, 0x69, 0x44, 0xa7, 0x45 } }; CDockPane::CDockPane(): CAdUiDockControlBar() { } BOOL CDockPane::Create(CWnd *pParent, LPCTSTR lpszTitle) { CString strWndClass; strWndClass = AfxRegisterWndClass(CS_DBLCLKS, LoadCursor(NULL, IDC_ARROW)); CRect rect(0, 0, 410, 400); //850 if (!CAdUiDockControlBar::Create( strWndClass, lpszTitle, WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN, rect, pParent, 0) ) return (FALSE); SetToolID(&clsCDockPane); return (TRUE); } int CDockPane::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CAdUiDockControlBar::OnCreate(lpCreateStruct) == -1) return (-1); //增加 CDockDialog 对话框 if (!m_DockDialog.Create(IDD_DOCKDIALOG, this)) return (-1); // AfxSetResourceHandle (acedGetAcadResourceInstance ()); BaseFuncs::GetPathName(m_sSoftPath); m_sSoftPath += _T("\\tk\\Customer\\图库中心\\"); return (0); } void CDockPane::SizeChanged(CRect *lpRect, BOOL bFloating, int flags) { if (bFloating) m_DockDialog.SetWindowPos(NULL, lpRect->left+4, lpRect->top, lpRect->right-10, lpRect->bottom -4, SWP_SHOWWINDOW); else m_DockDialog.SetWindowPos(NULL, lpRect->left+4, lpRect->top+4, lpRect->right-8, lpRect->bottom -20, SWP_SHOWWINDOW); } void CDockPane::SetSltDwgFile(LPCTSTR sFolder, LPCTSTR sDwg) { m_DockDialog.getTreeCtrl().SetSltDwgFile(sFolder, sDwg); } void CDockPane::OnContextMenu(CWnd *pWnd, CPoint point) { // TODO: Add your message handler code here UINT uFlags; CString sSubPath; HTREEITEM hOldItem; if (acedGetAcadDwgView()!=NULL) acedGetAcadDwgView()->SetFocus(); //很奇怪一定要先让CAD视图获得焦点 (m_DockDialog.getTreeCtrl()).ScreenToClient(&point); HTREEITEM hTreeItem = (m_DockDialog.getTreeCtrl()).HitTest(point, &uFlags); (m_DockDialog.getTreeCtrl()).ClientToScreen(&point); HTREEITEM hParentItem; hOldItem = hTreeItem; TVITEM item; TCHAR szText[1024]; item.hItem = hOldItem; item.mask = TVIF_TEXT | TVIF_HANDLE; item.pszText = szText; item.cchTextMax = 1024; (m_DockDialog.getTreeCtrl()).GetItem(&item); CString strItemText = item.pszText; int nImage; int nSelectedImage; if (hTreeItem!=NULL&&(m_DockDialog.getTreeCtrl()).IsWindowVisible()) { hParentItem = (m_DockDialog.getTreeCtrl()).GetParentItem(hTreeItem); (m_DockDialog.getTreeCtrl()).GetItemImage(hTreeItem, nImage, nSelectedImage); CMenu menu; menu.LoadMenu(IDR_MENU3); if (nImage==0&&nSelectedImage==1) //文件佳 { if (hParentItem==NULL||strItemText==_T("新用户图")) { (menu.GetSubMenu(0))->RemoveMenu(ID_DELDIR, MF_REMOVE|MF_BYCOMMAND); } //(menu.GetSubMenu(0))->RemoveMenu(ID_NEWFILE,MF_REMOVE|MF_BYCOMMAND); (menu.GetSubMenu(0))->RemoveMenu(ID_DELFILE, MF_REMOVE|MF_BYCOMMAND); } else if (nImage==3&&nSelectedImage==4) { (menu.GetSubMenu(0))->RemoveMenu(ID_DIR_OPEN, MF_REMOVE|MF_BYCOMMAND); (menu.GetSubMenu(0))->RemoveMenu(ID_DIR_UPDATE, MF_REMOVE|MF_BYCOMMAND); (menu.GetSubMenu(0))->RemoveMenu(ID_NEWDIR, MF_REMOVE|MF_BYCOMMAND); (menu.GetSubMenu(0))->RemoveMenu(ID_DELDIR, MF_REMOVE|MF_BYCOMMAND); (menu.GetSubMenu(0))->RemoveMenu(ID_NEWFILE, MF_REMOVE|MF_BYCOMMAND); if (strItemText==_T("用户图例")) (menu.GetSubMenu(0))->RemoveMenu(ID_DELFILE, MF_REMOVE|MF_BYCOMMAND); } CString strItemText = (m_DockDialog.getTreeCtrl()).GetItemText(hTreeItem); //if(strItemText=="用户图库") // GetDlgItem(ID_DELDIR)->EnableWindow(FALSE); while (hParentItem!=NULL&&strItemText!=_T("用户图库")) { hTreeItem = hParentItem; sSubPath = strItemText+_T("\\")+sSubPath; hParentItem = (m_DockDialog.getTreeCtrl()).GetParentItem(hTreeItem); strItemText = (m_DockDialog.getTreeCtrl()).GetItemText(hTreeItem); } sSubPath = strItemText+_T("\\")+sSubPath; m_sCurSltPath = m_sSoftPath+sSubPath; if (strItemText!=_T("用户图库")) { (menu.GetSubMenu(0))->RemoveMenu(ID_NEWDIR, MF_REMOVE|MF_BYCOMMAND); (menu.GetSubMenu(0))->RemoveMenu(ID_DELDIR, MF_REMOVE|MF_BYCOMMAND); (menu.GetSubMenu(0))->RemoveMenu(ID_NEWFILE, MF_REMOVE|MF_BYCOMMAND); (menu.GetSubMenu(0))->RemoveMenu(ID_DELFILE, MF_REMOVE|MF_BYCOMMAND); } { BOOL bRet = (m_DockDialog.getTreeCtrl()).SelectItem(hOldItem); m_hTreeItem = hOldItem; menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this); } return; } } void DeleteDirectory(CString strDir) { if (strDir.IsEmpty()) return; CFileFind ff; BOOL bFound = ff.FindFile(strDir+_T("*"), 0); while (bFound) { bFound = ff.FindNextFile(); if (ff.GetFileName()==_T(".")||ff.GetFileName()==_T("..")) continue; // 去掉文件(夹)只读等属性 SetFileAttributes(ff.GetFilePath(), FILE_ATTRIBUTE_NORMAL); if (ff.IsDirectory()) { // 递归删除子文件夹 DeleteDirectory(ff.GetFilePath()); RemoveDirectory(ff.GetFilePath()); } else { // 删除文件 DeleteFile(ff.GetFilePath()); } } ff.Close(); // 然后删除该文件夹 RemoveDirectory(strDir); } void CDockPane::OnDeldir() { // TODO: Add your command handler code here if (AfxMessageBox(_T("确认删除(Y/N)?"), MB_OKCANCEL)!=IDOK) return; m_DockDialog.getPreviewCtrl().ReleaseDb(); DeleteDirectory(m_sCurSltPath); (m_DockDialog.getTreeCtrl()).DeleteItem(m_hTreeItem); } void CDockPane::getAllTreeItem(CStringArray &strTreeItemArr) { HTREEITEM hItem = (m_DockDialog.getTreeCtrl()).GetSelectedItem(); HTREEITEM hChildItem = (m_DockDialog.getTreeCtrl()).GetChildItem(hItem); while (hChildItem) { strTreeItemArr.Add((m_DockDialog.getTreeCtrl()).GetItemText(hChildItem)); hChildItem = (m_DockDialog.getTreeCtrl()).GetNextItem(hChildItem, TVGN_NEXT); } } void CDockPane::OnOpenDir() { ShellExecute(NULL, _T("open"), m_sCurSltPath, NULL, NULL, SW_SHOW); } void CDockPane::OnUpdateDir() { CCoolTreeCtrl &mTreeCtrl = m_DockDialog.getTreeCtrl(); HTREEITEM hParentItem = mTreeCtrl.m_hSelectItem; HTREEITEM hChildItem = mTreeCtrl.GetNextItem(hParentItem, TVGN_CHILD); while (hChildItem) { HTREEITEM hNextItem = mTreeCtrl.GetNextItem(hChildItem, TVGN_NEXT); mTreeCtrl.DeleteItem(hChildItem); hChildItem = hNextItem; } m_DockDialog.ViewIni(hParentItem, m_sCurSltPath); } void CDockPane::OnNewdir() { // TODO: Add your command handler code here CAcModuleResourceOverride res; CStringArray strDwgNameArr; getAllTreeItem(strDwgNameArr); CNewDirDlg dlg; dlg.m_strDwgArray.Append(strDwgNameArr); if (dlg.DoModal()==IDOK) { CString sFolderName = m_sCurSltPath+dlg.m_sFolderName+_T("\\"); TCHAR kw[256]; _tcscpy(kw, sFolderName); // acutPrintf(_T("\n%s"),(char*)kw); // mkdir((char*)kw);//(char*)(LPCTSTR)sFolderName CreateDirectory(kw, NULL); (m_DockDialog.getTreeCtrl()).InsertItem(dlg.m_sFolderName, 0, 1, m_hTreeItem); } } BOOL CDockPane::isChildItem(CString strName) { CString strUp = strName; strUp.MakeUpper(); CString strLower = strName; strLower.MakeLower(); if ((m_DockDialog.getTreeCtrl()).ItemHasChildren(m_hTreeItem)) { HTREEITEM hChildItem = (m_DockDialog.getTreeCtrl()).GetChildItem(m_hTreeItem); while (hChildItem!=NULL) { CString strText = (m_DockDialog.getTreeCtrl()).GetItemText(hChildItem); hChildItem = (m_DockDialog.getTreeCtrl()).GetNextItem(hChildItem, TVGN_NEXT); if (strText==strUp||strText==strLower) return TRUE; } } return FALSE; } void CDockPane::OnNewFile() { CAcModuleResourceOverride res; CNewDirDlg dlg; dlg.m_nType = 1; if (dlg.DoModal()==IDOK) { CString sFileName = dlg.m_sFolderName; if (isChildItem(sFileName)) { AfxMessageBox(_T("该文件已存在")); return; } CString sFilePath = m_sCurSltPath+sFileName+_T(".dwg"); //新建dwg文件 acDocManager->lockDocument(curDoc()); AcDbDatabase *pDb = new AcDbDatabase(TRUE, TRUE); Acad::ErrorStatus es = pDb->saveAs(sFilePath); delete pDb; acDocManager->unlockDocument(curDoc()); if (es==Acad::eOk) (m_DockDialog.getTreeCtrl()).InsertItem(sFileName, 3, 4, m_hTreeItem); } } void CDockPane::OnDelFile() { CString sFilePath = m_sCurSltPath; sFilePath.TrimRight(_T('\\')); sFilePath += _T(".dwg"); CFile file; if (AfxMessageBox(_T("确认删除(Y/N)?"), MB_OKCANCEL)!=IDOK) return; m_DockDialog.getPreviewCtrl().ReleaseDb(); // m_DockDialog.getPreviewCtrl().erasePreview(); //modify by hrp 2010 4-10 if (!DeleteFile(sFilePath)) AfxMessageBox(_T("删除失败")); (m_DockDialog.getTreeCtrl()).DeleteItem(m_hTreeItem); }