Files
envi-code/SourceCode/Code2026/shsTK/DockPane.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

320 lines
8.9 KiB
C++

#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);
}