Files
envi-code/SourceCode/Code2026/tg_shs/shs_blklib/SlbManDlg.cpp
T
2026-09-28 15:28:50 +08:00

995 lines
25 KiB
C++

// 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; i<lenTree; i++) {
CString str = (const TCHAR *)m_lstKindNames[i];
hTemp = m_treeCtrl.InsertItem(m_lstKindNames[i], 0, 1);
if(str == m_xsFileName)
hFilter = hTemp; // !!! 记住默认树节点句柄
}
m_bIsEndOpen = TRUE;
// ASSERT(hFilter); // ZJQ modify here
if(hFilter) {
m_treeCtrl.SelectItem(hFilter);
}
}
void CSlbManDlg::OnClickTkTree(NMHDR* pNMHDR, LRESULT* pResult)
{
*pResult = 0;
}
void CSlbManDlg::OnRclickTkTree(NMHDR* pNMHDR, LRESULT* pResult)
{
POINT pt;
TV_HITTESTINFO tvhti;
::GetCursorPos((LPPOINT)&pt);
ScreenToClient(&pt);
MapWindowPoints(&m_treeCtrl, &pt, 1);
tvhti.pt = pt;
m_treeCtrl.HitTest(&tvhti);
if(tvhti.hItem) {
m_nIndex = 0;
m_treeCtrl.SelectItem(tvhti.hItem);
}
*pResult = 0;
}
void CSlbManDlg::OnSelchangedTkTree(NMHDR* pNMHDR, LRESULT* pResult)
{
if(m_bIsDelTree) return;
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
if(!m_bIsEndOpen) return;
HTREEITEM myhtree;
myhtree = m_treeCtrl.GetSelectedItem();
m_treeCtrl.SetItemState(myhtree, TVIS_BOLD, TVIS_BOLD);
CString csCurSlb;
csCurSlb = m_treeCtrl.GetItemText(myhtree);
m_xsFileName = (const TCHAR *)csCurSlb;
ReadFile();
SetupList();
InitVSBar();
SetupImage(TRUE);
if(m_hOldItem) {
m_treeCtrl.SetItemState(m_hOldItem, 0, TVIS_BOLD); // 让上一个节点字型恢复
if((m_lstSlb.Length() != 0) && !IsValid(m_nIndex)) // 保证根目录选中时不执行
{
ASSERT(IsValid(m_nIndex));
SelectIndex(m_nIndex);
SetListHighLight();
m_listCtrl.SetHotItem(m_nIndex);
}
}
if(IsValid(m_nIndex))
SelectIndex(m_nIndex);
// ASSERT(IsValid(m_nIndex));
m_hOldItem = myhtree;
ResetStateText();
*pResult = 0;
}
void CSlbManDlg::SetupList()
{
m_listCtrl.DeleteAllItems();
int len = m_lstSlb.Length();
for(int i=0; i<len ; i++)
{
m_listCtrl.InsertItem(i, m_lstSlb[i]);
}
SelectIndex(0);
SetListHighLight();
}
// 设置nIndex个图像/幻灯
void CSlbManDlg::SetupNthImage(int nIndex, CImageDC *pImg)
{
BOOL bValid = IsValid(nIndex);
XString xsFile(256);
if (bValid) {
xsFile << (const TCHAR *)m_xsFilePath << (const TCHAR *)m_csSlbName << _T("(") << (const TCHAR *)m_lstSlb[nIndex]
<< _T(")");
}
if(!bValid) {
//pImg->Fill(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; i++) {
XString sKey(256), sKey2(256);
CString csValue, csValue2;
sKey << _T("The recent slb") << (i + 1);
sKey2 << _T("The used slb") << (i + 1);
regProp.GetValue(sKey, csValue);
regProp.GetValue(sKey2, csValue2);
if(!csValue.IsEmpty() && FindFile(csValue))
m_lstBlbNames.Append(tstrnew(csValue));
if(!csValue2.IsEmpty() && FindFile(csValue2))
m_lstKindNames.Append(tstrnew(csValue2));
}
SetPageSize(nRow, nColumn);
return;
}
// ONLY USED IN HKEY_CURRENT_USER
BOOL DelKey(LPCTSTR pszRoot, LPCTSTR pszKey)
{
LONG lRet;
HKEY m_hKey;
lRet=RegOpenKeyEx(HKEY_CURRENT_USER, pszRoot, 0L,KEY_ALL_ACCESS,&m_hKey);
if(lRet!=ERROR_SUCCESS)
return FALSE;
lRet = RegDeleteValue(m_hKey, pszKey);
RegCloseKey(m_hKey); // ZJQ add here
if(lRet!=ERROR_SUCCESS)
return FALSE;
return TRUE;
}
//存储状态
void CSlbManDlg::SaveStatus()
{
XString xsRoot;
_tcscat(xsRoot, GetRegLocation());
_tcscat(xsRoot, _T("\\SLBMAN"));
for(int i=0;i<g_nMaxRecentSlb;i++)
{
XString sKey(256);
sKey << _T("The used slb") << (i + 1);
DelKey(xsRoot, sKey);
}
CRegProperty regProp(GetRegLocation(), _T("SLBMAN"));
regProp.SetTopRootKey(HKEY_CURRENT_USER);
regProp.SetValue(_T("PageRow"), m_nPageRow);
regProp.SetValue(_T("PageColmn"), m_nPageColumn);
int nLen = m_lstBlbNames.Length();
for(i=0; i<nLen; i++) {
if(m_xsFileName==(LPCTSTR)m_lstBlbNames[i]) {
m_lstBlbNames.Remove(i);
nLen--;
break;
}
}
if(nLen >= g_nMaxRecentSlb) m_lstBlbNames.Remove(0);
m_lstBlbNames.Append(tstrnew(m_xsFileName));
nLen=m_lstBlbNames.Length();
for(i=0; i<nLen; i++) {
if(i<g_nMaxRecentSlb) {
XString sKey(256), sValue(256);
sKey << _T("The recent slb") << (i + 1); //The recent slb
sValue << m_lstBlbNames[i];
regProp.SetValue(sKey, sValue);
}
else break;
}
nLen = m_lstKindNames.Length();
for(i=0; i<nLen; i++) {
if(i < g_nMaxRecentSlb) {
XString sKey(256), sValue(256);
sKey << _T("The used slb") << (i + 1); //The used slb
sValue << m_lstKindNames[i];
regProp.SetValue(sKey, sValue);
}
else break;
}
regProp.SetValue(_T("The cur slb"),(const TCHAR*)m_xsFileName);//The cur slb
return;
}
void CSlbManDlg::OnOK()
{
SaveStatus();
CTKImageDlg::OnOK();
}
void CSlbManDlg::OnBlkDelkind()
{
int nLen = m_lstKindNames.Length();
for(int i=0; i<nLen; i++) {
if(m_xsFileName==(LPCTSTR)m_lstKindNames[i]) {
m_lstKindNames.Remove(i);
nLen--;
break;
}
}
if(m_lstKindNames.Length() == 0 ) {
m_xsFileName = _T("");
m_lstSlb.Reset();
SetupList();
}
else
m_xsFileName = (const TCHAR *)m_lstKindNames[0];
m_bIsEndOpen = FALSE;
SetupTreeView();
SetupImage(TRUE);
SelectIndex(0);
}
void CSlbManDlg::OnBlkOpenlib()
{
int nLen = m_lstKindNames.Length();
if(nLen >= g_nMaxRecentSlb) {
AfxMessageBox(_T("对不起,您最多只能打开6个幻灯库。"));
return;
}
if(!SelectSlb(m_xsFileName, TRUE, this)) return;
for(int i=0; i<nLen; i++) {
if(m_xsFileName==(LPCTSTR)m_lstKindNames[i]) {
m_lstKindNames.Remove(i);
nLen--;
break;
}
}
if(nLen >= 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; i<nLen; i++) {
if(_tcsicmp(xsName, m_lstKindNames[i])==0) {
m_lstKindNames.Remove(i);
nLen--;
break;
}
}
m_lstKindNames.Append(tstrnew(xsName));
m_xsFileName = (const TCHAR *)xsName;
m_nIndex= m_lstSlb.Length()>0 ? 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; i<m_slide.Length(); i++) {
XLine &ln=*m_slide[i];
AcDbLine *pLine=new AcDbLine(ln.GetStartPoint(), ln.GetEndPoint());
if(pRec->appendAcDbEntity(pLine)==Acad::eOk)
pLine->close();
else
delete pLine;
}
for(i=0; i<m_slide.m_lstSolid.Length(); i++) {
XColorSolid &solid=*m_slide.m_lstSolid[i];
XPoly2D poly2d;
solid.AsPoly2D(poly2d);
//poly2d.flag = 1;
poly2d.SetFlag(1);
AcDbHatch *pHatch = NewHatchFromPoly2D(poly2d);
if(pHatch) {
if(pRec->appendAcDbEntity(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<m_lstSlb.Length(); i++) {
XString xsSldName;
TCHAR *pItem = m_lstSlb[i];
xsSldName << sFolder << pItem << _T(".slb");
XSlideLib lib(m_xsFileName);
lib.Copy(i, xsSldName);
}
}
void CSlbManDlg::OnBlkSort()
{
if (m_nIndex<0)
{
return;
}
m_bSort = !m_bSort;
if(m_bSort)
SetStateText(_T("排序!"));
else
SetStateText(_T("取消排序!"));
XString xsDrg;
xsDrg = (const TCHAR *)m_lstSlb[m_nIndex];
ReadFile();
SetupList();
for(int i=0; i < m_lstSlb.Length(); i++) {
XString xstemp = m_lstSlb[i];
if(xstemp == xsDrg) {
m_nIndex = i; // 找出本图新的位置
break;
}
}
InitVSBar();
SetupImage(TRUE);
SetListHighLight();
}
extern TCHAR g_szDirName[]; //申请自己的16K缓冲区
void CSlbManDlg::OnBlkUpgrade()
{
SetStateText(_T("批量入库"));
XSlideLib lib(m_xsFileName);
const TCHAR *pszFilter = _T("Slide(*.sld) |*.SLD||");
CFileDialog dlg(TRUE, _T("*.sld"), NULL, OFN_ALLOWMULTISELECT|OFN_HIDEREADONLY, pszFilter, this);
TCHAR strDlgTitle[] = _T("选择需入库的DWG文件");
TCHAR strFileName[4056] = _T(""); //申请自己的16K缓冲区
int maxChar = 4055;
dlg.m_ofn.lpstrFile = strFileName;
dlg.m_ofn.nMaxFile = maxChar;
dlg.m_ofn.lpstrTitle = strDlgTitle;
dlg.m_ofn.lpstrInitialDir = g_szDirName;
if(dlg.DoModal() != IDOK) return;
_tcscpy(g_szDirName, dlg.GetPathName());
POSITION pos = dlg.GetStartPosition();
while(pos!=NULL)
{
CString csIndex;
csIndex = dlg.GetNextPathName(pos);
TCHAR szDrive[_MAX_DRIVE]=_T(""), szDir[_MAX_DIR]=_T(""), szFile[_MAX_FNAME]=_T(""), szExt[_MAX_EXT]=_T("");
_tsplitpath(csIndex, szDrive, szDir, szFile, szExt);
int ret = m_lstSlb.Index(szFile, 0);
if(ret >= 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<nLen; i++) {
if(m_xsFileName==(LPCTSTR)m_lstKindNames[i]) {
m_lstKindNames.Remove(i);
nLen--;
break;
}
}
if(nLen >= g_nMaxRecentSlb) m_lstBlbNames.Remove(0);
m_lstKindNames.Append(tstrnew(m_xsFileName));
m_bIsEndOpen = FALSE;
SetupTreeView();
SetupImage(TRUE);
}