1684 lines
47 KiB
C++
1684 lines
47 KiB
C++
// TKTreeCtrl.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
|
|
|
|
#include "TKTreeCtrl.h"
|
|
#include "BlkManReplaceOption.h"
|
|
#include "Progresswnd.h"
|
|
#include "XFilePathName.h"
|
|
#include "tkwfile.h"
|
|
|
|
#include "NewDbfAccessTools.h"
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
extern void SplitStr(const TCHAR *szInput, XStringList& lstKind);
|
|
extern const XString ConnectStr(XStringList& lstKind, int index, XString xsNew);
|
|
extern CString GetFileNameByAllName(const TCHAR* szAllFileName);
|
|
extern CString GetPathNameByAllName(const TCHAR* szAllFileName);
|
|
int GetNextDrawing(const TCHAR *tkName, TCHAR *dwg);
|
|
BOOL IsKindInKind(const TCHAR* szKind, const TCHAR* szFilterKind, CString &csNewType)
|
|
{
|
|
CString csKind, csFilterKind;
|
|
csKind = szKind;
|
|
csFilterKind = szFilterKind;
|
|
|
|
BOOL bRet = TRUE;
|
|
XStringList lstKind, lstFilterKind;
|
|
SplitStr(csKind, lstKind);
|
|
SplitStr(csFilterKind, lstFilterKind);
|
|
if(lstKind.Length() < lstFilterKind.Length())
|
|
return FALSE;
|
|
CString csHeadType;
|
|
for(int i=0; i<lstFilterKind.Length(); i++)
|
|
{// 此循环为了判断当前记录符不符和修改条件 即:两个链表前面部分完全一致
|
|
CString cs1,cs2;
|
|
cs1 = (const TCHAR *)lstKind[i]; // lstKind链表 :当前记录 -> sKind
|
|
cs2 = (const TCHAR *)lstFilterKind[i];
|
|
if(cs1 != cs2) {
|
|
bRet = FALSE;
|
|
break;
|
|
}
|
|
else if(i != (lstFilterKind.Length() - 1)){
|
|
csHeadType += cs1;
|
|
csHeadType += _T("\\");
|
|
}
|
|
}
|
|
if(bRet)
|
|
csNewType = csKind.Right(csKind.GetLength() - csHeadType.GetLength());
|
|
|
|
return bRet;
|
|
}
|
|
|
|
//取得所有的组的名称,即过滤的名称
|
|
void GetTKFilterList(const TCHAR* szTKName, XStringList &lstKindName)
|
|
{
|
|
CString csTKName = szTKName;
|
|
lstKindName.Reset();
|
|
CString sKind; //类别
|
|
CodeBase db;
|
|
db.read_only = 1;
|
|
XDbfTable *pTable = db.Open(csTKName);
|
|
if(!pTable) return;
|
|
for(pTable->MoveFirst(); !pTable->IsEOF(); pTable->MoveNext()) {
|
|
GET_FIELD(pTable, _T("kind"), sKind);
|
|
if(lstKindName.Index(sKind, 0) < 0 ) // 如果没有重复
|
|
lstKindName.Append(tstrnew(sKind));
|
|
}
|
|
lstKindName.QuickSort(_tcscmp);
|
|
}
|
|
|
|
void GetTKWFilterList(const TCHAR* szTKWName, XStringList &lstKindName)
|
|
{
|
|
CString csTKWName = szTKWName;
|
|
XStringList lstTKFiles;
|
|
CString csDes, csVer;
|
|
CTkwFile tkw(csTKWName);
|
|
tkw.GetTKList(lstTKFiles);
|
|
|
|
lstKindName.Reset();
|
|
CString sKind; //类别
|
|
for(int i=0;i<lstTKFiles.Length();i++){
|
|
CodeBase db;
|
|
db.read_only = 1;
|
|
XDbfTable *pTable = db.Open(lstTKFiles[i]);
|
|
if(!pTable) return;
|
|
for(pTable->MoveFirst(); !pTable->IsEOF(); pTable->MoveNext()) {
|
|
GET_FIELD(pTable, _T("kind"), sKind);
|
|
if(lstKindName.Index(sKind, 0) < 0 ) // 如果没有重复
|
|
lstKindName.Append(tstrnew(sKind));
|
|
}
|
|
}
|
|
lstKindName.QuickSort(_tcscmp);
|
|
}
|
|
//GEOAPI BOOL GetBlcCtrlPoint(AcDbObjectId id, XPoint &ptMax);
|
|
BOOL DoReplaceBlock(int nControlFlag, Entity &ent, AcDbObjectId &idBlock)
|
|
{
|
|
BOOL bRet=FALSE;
|
|
XDbObject obj(ent, AcDb::kForWrite);
|
|
if(!obj)
|
|
return bRet;
|
|
AcDbBlockReference *pBlk = AcDbBlockReference::cast(obj.m_pObject);
|
|
TDbMultiViewInsert *pMv = TDbMultiViewInsert::cast(obj.m_pObject);
|
|
if(pBlk) {
|
|
if((nControlFlag&LO_FIXDIMENSION_R)) {
|
|
XPoint ptInsert, ptCen, ptCenOld;
|
|
double nRot, nSizeX, nSizeY, nSizeZ, nSizeX1, nSizeY1;
|
|
if(GetBlockRefSizeInfo(pBlk, ptInsert, &nRot,ptCenOld, &nSizeX, &nSizeY,&nSizeZ)!=RTNORM)
|
|
return bRet;
|
|
pBlk->setBlockTableRecord(idBlock);
|
|
if(GetBlockRefSizeInfo(pBlk, ptInsert, &nRot,ptCen, &nSizeX1, &nSizeY1,&nSizeZ)!=RTNORM)
|
|
return bRet;
|
|
AcGeScale3d scale=pBlk->scaleFactors();
|
|
scale[0] *= nSizeX/nSizeX1;
|
|
scale[1] *= nSizeY/nSizeY1;
|
|
pBlk->setScaleFactors(scale);
|
|
|
|
// 重新取中心
|
|
XPoint ptCenNew;
|
|
if(GetBlockRefSizeInfo(pBlk, ptInsert, &nRot,ptCenNew, &nSizeX1, &nSizeY1,&nSizeZ)!=RTNORM)
|
|
return bRet;
|
|
ptInsert += ptCenOld-ptCenNew;
|
|
pBlk->setPosition(ptInsert); //改变基点保证位置重合
|
|
bRet=TRUE;
|
|
}
|
|
else if(nControlFlag&LO_FIX_POINT)//add by whl,通过右上角控制点对齐来替换图块,插入点不变
|
|
{
|
|
XPoint ptMax0,ptMax1;
|
|
GetBlcCtrlPoint(pBlk->blockTableRecord(),ptMax0);
|
|
GetBlcCtrlPoint(idBlock,ptMax1);
|
|
double sx=ptMax1.x/ptMax0.x;
|
|
double sy=ptMax1.y/ptMax0.y;
|
|
AcGeScale3d scale=pBlk->scaleFactors();
|
|
scale[0] /= sx;
|
|
scale[1] /= sy;
|
|
pBlk->setScaleFactors(scale);
|
|
|
|
pBlk->setBlockTableRecord(idBlock);
|
|
bRet=true;
|
|
}
|
|
else{
|
|
AcGeScale3d scale=pBlk->scaleFactors();
|
|
pBlk->setBlockTableRecord(idBlock);
|
|
pBlk->setScaleFactors(scale);
|
|
bRet=TRUE;
|
|
}
|
|
} else if(pMv) {
|
|
// extern TARCH_IMPEXP AcDbObjectId GetBlock2dFromBlock3d(AcDbObjectId idBlock);
|
|
AcDbObjectId idBlock2d=GetBlock2dFromBlock3d(idBlock);
|
|
if(idBlock2d.isValid()) { //多视图块只允许用多视图块来替换
|
|
if((nControlFlag&LO_FIXDIMENSION_R)) {
|
|
XPoint ptInsert, ptCen, ptCenOld;
|
|
double nRot, nSizeX, nSizeY, nSizeZ, nSizeX1, nSizeY1;
|
|
AcDbBlockReference *pTempBlk=pMv->NewBlock(TRUE);
|
|
if(GetBlockRefSizeInfo(pTempBlk, ptInsert, &nRot,ptCenOld, &nSizeX, &nSizeY,&nSizeZ)!=RTNORM) {
|
|
delete pTempBlk;
|
|
return bRet;
|
|
}
|
|
pTempBlk->setBlockTableRecord(idBlock);
|
|
pMv->SetBlockId(TRUE, idBlock);
|
|
pMv->SetBlockId(FALSE, idBlock2d);
|
|
|
|
int nRetCode=GetBlockRefSizeInfo(pTempBlk, ptInsert, &nRot,ptCen, &nSizeX1, &nSizeY1,&nSizeZ);
|
|
if(nRetCode!=RTNORM) {
|
|
delete pTempBlk;
|
|
return bRet;
|
|
}
|
|
AcGeScale3d scale=pMv->GetScaleFactors();
|
|
scale[0] *= nSizeX/nSizeX1;
|
|
scale[1] *= nSizeY/nSizeY1;
|
|
pMv->SetScaleFactors(scale);
|
|
pTempBlk->setScaleFactors(scale);
|
|
|
|
// 重新取中心
|
|
XPoint ptCenNew;
|
|
nRetCode = GetBlockRefSizeInfo(pTempBlk, ptInsert, &nRot,ptCenNew, &nSizeX1, &nSizeY1,&nSizeZ);
|
|
delete pTempBlk;
|
|
if(nRetCode!=RTNORM)
|
|
return bRet;
|
|
ptInsert += ptCenOld-ptCenNew;
|
|
pMv->SetLocation(ptInsert); //改变基点保证位置重合
|
|
bRet=TRUE;
|
|
} else {
|
|
//AcGeScale3d scale=pMv->scaleFactors();
|
|
pMv->SetBlockId(TRUE, idBlock);
|
|
pMv->SetBlockId(FALSE, idBlock2d);
|
|
//pBlk->setScaleFactors(scale);
|
|
bRet=TRUE;
|
|
}
|
|
}
|
|
}
|
|
return bRet;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CTKTreeCtrl
|
|
|
|
CTKTreeCtrl::CTKTreeCtrl()
|
|
{
|
|
m_bNeedMenu = TRUE;
|
|
m_csTKWFile = _T("");
|
|
m_csCurKind = _T("");
|
|
m_bMerge = FALSE;
|
|
m_bLock = FALSE;
|
|
m_bCellIsDragging = FALSE;
|
|
m_bNodeIsDragging = FALSE;
|
|
m_dragItem = NULL;
|
|
m_dragTarget = NULL;
|
|
m_bIsJpgShow = FALSE;
|
|
m_bCopyAndDel = FALSE;
|
|
}
|
|
|
|
CTKTreeCtrl::~CTKTreeCtrl()
|
|
{
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CTKTreeCtrl, CTreeCtrl)
|
|
//{{AFX_MSG_MAP(CTKTreeCtrl)
|
|
ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
|
|
ON_NOTIFY_REFLECT(TVN_BEGINLABELEDIT, OnBeginlabeledit)
|
|
ON_NOTIFY_REFLECT(TVN_ENDLABELEDIT, OnEndlabeledit)
|
|
ON_WM_LBUTTONUP()
|
|
ON_WM_MOUSEMOVE()
|
|
ON_NOTIFY_REFLECT(TVN_BEGINDRAG, OnBegindrag)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
void CTKTreeCtrl::SetDataSource(const TCHAR* szTKWFile)
|
|
{
|
|
CString csTKWFile = szTKWFile;
|
|
XString fullFile;
|
|
if(!FindFile(csTKWFile, fullFile))
|
|
{//目录已经不存在
|
|
AfxMessageBox(_T("TKW文件不存在"));
|
|
return;
|
|
}
|
|
m_csTKWFile = csTKWFile;
|
|
CTkwFile tkw(m_csTKWFile);
|
|
tkw.GetTKList(m_lstTKFiles);
|
|
m_csVersion = tkw.m_csVersion;
|
|
m_csDescrption = tkw.m_csDescription;
|
|
m_bIsJpgShow = tkw.m_bIsJpg;
|
|
|
|
SetupTreeData();
|
|
Expand(GetRootItem(), TVE_EXPAND);
|
|
}
|
|
|
|
//初始化TREEVIEW时调用: insert节点 时看它是否已存在
|
|
HTREEITEM CTKTreeCtrl::FindTreeNode(HTREEITEM hItem, const TCHAR* szNode)
|
|
{
|
|
CString csNode = szNode;
|
|
HTREEITEM htree;
|
|
CString csCurText;
|
|
|
|
htree = GetChildItem(hItem);
|
|
csCurText = GetItemText(htree);
|
|
if(csCurText == csNode) return htree;
|
|
|
|
while( htree=GetNextSiblingItem(htree))
|
|
{
|
|
csCurText = GetItemText(htree);
|
|
if(csCurText == csNode) return htree;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void CTKTreeCtrl::GetNodeAllPath(HTREEITEM htree, CString &csTKName, CString &csAllType)
|
|
{
|
|
//add by cwk on 060912
|
|
if (htree == NULL)
|
|
return;
|
|
CString csCur, csNodeName;
|
|
csCur = GetItemText(htree);
|
|
csNodeName = csCur;
|
|
HTREEITEM hTmp = NULL;
|
|
HTREEITEM hRoot = GetRootItem();
|
|
hTmp = GetParentItem(htree);
|
|
if(hTmp == hRoot){
|
|
DWORD_PTR dwAllTk = GetItemData(htree);
|
|
CString csAllTk;
|
|
if(dwAllTk){
|
|
TCHAR szAlltk[1024];
|
|
_tcscpy(szAlltk, (const TCHAR*)dwAllTk);
|
|
csAllTk = szAlltk;
|
|
}
|
|
for(int i=0;i<m_lstTKFiles.Length();i++){
|
|
if(csAllTk == m_lstTKFiles[i]){
|
|
csTKName = m_lstTKFiles[i];
|
|
csAllType = _T("");
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
while(hTmp && hTmp != hRoot) { // 得到该节点的全路径
|
|
csCur = GetItemText(hTmp);
|
|
if(GetParentItem(hTmp) == hRoot){
|
|
DWORD_PTR dwAllTk = GetItemData(hTmp);
|
|
if(dwAllTk){
|
|
TCHAR szAlltk[1024];
|
|
_tcscpy(szAlltk, (const TCHAR*)dwAllTk);
|
|
csCur = szAlltk;
|
|
}
|
|
}
|
|
for(int i=0;i<m_lstTKFiles.Length();i++){
|
|
if(csCur == m_lstTKFiles[i] && GetParentItem(hTmp) == hRoot){
|
|
csTKName = m_lstTKFiles[i];
|
|
csAllType = csNodeName;
|
|
return;
|
|
}
|
|
}
|
|
csNodeName = csCur + _T("\\") + csNodeName;
|
|
hTmp = GetParentItem(hTmp);
|
|
}
|
|
if(m_bMerge){
|
|
csAllType = csNodeName;
|
|
}
|
|
}
|
|
|
|
void CTKTreeCtrl::GetNodeAllPath(HTREEITEM htree, CString &csAllType)
|
|
{
|
|
//add by cwk on 060912
|
|
if (htree == NULL)
|
|
return;
|
|
CString csCur, csNodeName;
|
|
csCur = GetItemText(htree);
|
|
csNodeName = csCur;
|
|
HTREEITEM hTmp = NULL;
|
|
HTREEITEM hRoot = GetRootItem();
|
|
if(hRoot == htree){
|
|
csAllType = _T("");
|
|
return;
|
|
}
|
|
hTmp = GetParentItem(htree);
|
|
while(hTmp && hTmp != hRoot) { // 得到该节点的全路径
|
|
csCur = GetItemText(hTmp);
|
|
csNodeName = csCur + _T("\\") + csNodeName;
|
|
hTmp = GetParentItem(hTmp);
|
|
}
|
|
csAllType = csNodeName;
|
|
}
|
|
|
|
void CTKTreeCtrl::SetupTreeData()
|
|
{
|
|
HTREEITEM hCul=NULL, hTemp=NULL, hRoot=NULL, hFilter=NULL;
|
|
|
|
DeleteAllItems();
|
|
HTREEITEM hHead = InsertItem(GetFileNameByAllName(m_csTKWFile), 3, 3);
|
|
|
|
if(!m_bMerge){
|
|
//*********************************** 不归类 ************************************************
|
|
for(int i=0;i<m_lstTKFiles.Length();i++){
|
|
HTREEITEM hTKNode = InsertItem(GetFileNameByAllName(m_lstTKFiles[i]), 0, 0, hHead);
|
|
SetItemData(hTKNode, (DWORD_PTR)m_lstTKFiles[i]);
|
|
hRoot = hTKNode;
|
|
if(_tcsicmp(m_csLastTK, m_lstTKFiles[i]) == 0 && m_csCurKind == _T("*"))
|
|
hFilter = hTKNode;
|
|
XStringList lstKindName;
|
|
GetTKFilterList(m_lstTKFiles[i], lstKindName);
|
|
for(int j=0;j<lstKindName.Length();j++){
|
|
XStringList lstKind;
|
|
CString csKindName = lstKindName[j];
|
|
if(csKindName.IsEmpty())
|
|
continue;
|
|
SplitStr(csKindName, lstKind);
|
|
CString csNode, csAllNode;
|
|
int kindlen = lstKind.Length();
|
|
if(kindlen == 1) { // 一级目录
|
|
HTREEITEM hTemp = InsertItem(lstKindName[j], 1, 2, hTKNode);
|
|
if(csKindName == m_csCurKind && _tcsicmp(m_csLastTK, m_lstTKFiles[i]) == 0)
|
|
hFilter = hTemp; // !!! 记住默认树节点句柄
|
|
}
|
|
else // 多级目录
|
|
for(int m=0; m< kindlen; m++)
|
|
{
|
|
csNode = lstKind[m];
|
|
csAllNode = csAllNode + csNode + _T("\\"); // 记住该树节点全路径(注意:最后一次多加一个“\\”)
|
|
hCul = FindTreeNode(hRoot, csNode);
|
|
if(!hCul) {
|
|
hRoot = InsertItem(csNode, 1, 2, hRoot);
|
|
//if(csKindName == m_csCurKind || csAllNode == (m_csCurKind + _T("\\"))) // 比较时也多加一个“\\”
|
|
if((csKindName == m_csCurKind || csAllNode == (m_csCurKind + _T("\\"))) && _tcsicmp(m_csLastTK, m_lstTKFiles[i]) == 0) // 比较时也多加一个“\\”
|
|
hFilter = hRoot; // !!! 记住默认树节点句柄
|
|
}
|
|
else //已存在此节点
|
|
hRoot = hCul;
|
|
}
|
|
hRoot = hTKNode;
|
|
}
|
|
}
|
|
} //不归类 结束
|
|
else{
|
|
//*********************************** 归类 ************************************************
|
|
XStringList lstKindName;
|
|
GetTKWFilterList(m_csTKWFile, lstKindName);
|
|
hRoot = hHead;
|
|
for(int j=0;j<lstKindName.Length();j++){
|
|
XStringList lstKind;
|
|
CString csKindName = lstKindName[j];
|
|
if(csKindName.IsEmpty())
|
|
continue;
|
|
SplitStr(csKindName, lstKind);
|
|
CString csNode, csAllNode;
|
|
int kindlen = lstKind.Length();
|
|
if(kindlen == 1) { // 一级目录
|
|
HTREEITEM hTemp = InsertItem(lstKindName[j], 1, 2, hHead);
|
|
if(csKindName == m_csCurKind)
|
|
hFilter = hTemp; // !!! 记住默认树节点句柄
|
|
}
|
|
else // 多级目录
|
|
for(int m=0; m< kindlen; m++)
|
|
{
|
|
csNode = lstKind[m];
|
|
csAllNode = csAllNode + csNode + _T("\\"); // 记住该树节点全路径(注意:最后一次多加一个“\\”)
|
|
hCul = FindTreeNode(hRoot, csNode);
|
|
if(!hCul) {
|
|
hRoot = InsertItem(csNode, 1, 2, hRoot);
|
|
if(csKindName == m_csCurKind || csAllNode == (m_csCurKind + _T("\\"))) // 比较时也多加一个“\\”
|
|
hFilter = hRoot; // !!! 记住默认树节点句柄
|
|
}
|
|
else //已存在此节点
|
|
hRoot = hCul;
|
|
}
|
|
hRoot = hHead;
|
|
}
|
|
|
|
}//归类 结束
|
|
SelectItem(hFilter);
|
|
}
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CTKTreeCtrl message handlers
|
|
|
|
|
|
|
|
void CTKTreeCtrl::OnRclick(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
POINT pt, ptClient;;
|
|
TV_HITTESTINFO tvhti;
|
|
::GetCursorPos((LPPOINT)&pt);
|
|
ptClient = pt;
|
|
ScreenToClient(&ptClient);
|
|
MapWindowPoints(this, &ptClient, 1);
|
|
tvhti.pt = ptClient;
|
|
HitTest(&tvhti);
|
|
if(tvhti.hItem) {
|
|
SelectItem(tvhti.hItem);
|
|
}
|
|
HTREEITEM hCur = GetSelectedItem();
|
|
if(!hCur || m_bMerge){
|
|
*pResult = 0;
|
|
return;
|
|
}
|
|
|
|
CMenu Menu;
|
|
Menu.LoadMenu(IDR_MENU_TREE);
|
|
CMenu *pSubMenu = NULL;
|
|
if(hCur == GetRootItem()) //根结点 TKW结点
|
|
pSubMenu = Menu.GetSubMenu(1);
|
|
else if(GetParentItem(hCur) == GetRootItem()){// TK结点
|
|
pSubMenu = Menu.GetSubMenu(2);
|
|
if(!m_bNeedMenu){
|
|
pSubMenu->DeleteMenu(2, MF_BYPOSITION); //删除“批量入库”“新图入库”
|
|
pSubMenu->DeleteMenu(2, MF_BYPOSITION);
|
|
pSubMenu->DeleteMenu(2, MF_BYPOSITION);
|
|
}
|
|
}
|
|
else{ // TK类别结点
|
|
pSubMenu = Menu.GetSubMenu(3);
|
|
if(!m_bNeedMenu){
|
|
pSubMenu->DeleteMenu(3, MF_BYPOSITION); //删除“批量入库”“新图入库”
|
|
pSubMenu->DeleteMenu(3, MF_BYPOSITION);
|
|
pSubMenu->DeleteMenu(3, MF_BYPOSITION);
|
|
}
|
|
}
|
|
|
|
if(pSubMenu)
|
|
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
|
|
pt.x, pt.y, GetParent(), NULL);
|
|
|
|
SetFocus();
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CTKTreeCtrl::OnBeginlabeledit(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
|
|
m_bLock = TRUE;
|
|
*pResult = 0;
|
|
}
|
|
|
|
void CTKTreeCtrl::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
if(m_bMerge)
|
|
return;
|
|
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
|
|
CEdit* pEdit = GetEditControl();
|
|
CString csNew, csOld;
|
|
pEdit->GetWindowText(csNew);
|
|
HTREEITEM htree;
|
|
htree = GetSelectedItem();
|
|
CString csCurTKName, csCurType;
|
|
GetNodeAllPath(htree, csCurTKName, csOld);
|
|
if(csNew == _T("")) {
|
|
*pResult = FALSE;
|
|
m_bLock = TRUE;
|
|
SetFocus();
|
|
EditLabel(htree); //继续改名
|
|
return;
|
|
}
|
|
if(csNew == csOld || csOld == _T("")) {
|
|
m_bLock = FALSE;
|
|
*pResult = 0;
|
|
return;
|
|
} // 如果没有变化,则退出
|
|
if(csNew.Find(_T('\\')) != -1){
|
|
m_bLock = FALSE;
|
|
AfxMessageBox(_T("节点名称中不可包括字符'\\'!"));
|
|
*pResult = FALSE;
|
|
return ;
|
|
}
|
|
|
|
XStringList lstKind, lstFilter;
|
|
CString csKind, csFilter;
|
|
csFilter = csOld;
|
|
CString sKind; //类别
|
|
CodeBase db;
|
|
XDbfTable *pTable = db.Open(csCurTKName);
|
|
if(!pTable) {
|
|
AfxMessageBox(XString(_T("%s文件只读或损坏!"), (const TCHAR *)csCurTKName));
|
|
m_bLock = FALSE;
|
|
return;
|
|
}
|
|
SplitStr((const TCHAR*)csFilter, lstFilter);
|
|
|
|
for(pTable->MoveFirst(); !pTable->IsEOF(); pTable->MoveNext()) {
|
|
BOOL flag = TRUE;
|
|
GET_FIELD(pTable, _T("kind"), sKind);
|
|
csKind = (const TCHAR *)sKind; // ZJQ modify here
|
|
SplitStr((const TCHAR*)csKind, lstKind);
|
|
if(lstKind.Length() < lstFilter.Length())
|
|
continue;
|
|
for(int i=0; i<lstFilter.Length(); i++) {
|
|
// 此循环为了判断当前记录符不符和修改条件 即:两个链表前面部分完全一致
|
|
CString str1,str2;
|
|
str1 = lstKind[i]; // lstKind 链表 :当前记录 -> sKind
|
|
str2 = lstFilter[i]; // lstFilter链表 :当前树接点
|
|
if(str1 != str2) {
|
|
flag = FALSE;
|
|
break;
|
|
}
|
|
}
|
|
if(flag) {
|
|
sKind = ConnectStr(lstKind,lstFilter.Length()-1, (const TCHAR*)csNew);
|
|
SET_FIELD(pTable, _T("kind"), (LPCTSTR)sKind);
|
|
}
|
|
|
|
}
|
|
SetItemText(htree, csNew);
|
|
m_bLock = FALSE;
|
|
*pResult = 0;
|
|
return ;
|
|
}
|
|
|
|
|
|
|
|
void CTKTreeCtrl::OnLButtonUp(UINT nFlags, CPoint point)
|
|
{
|
|
if(m_bNodeIsDragging == TRUE){ // 类别拖动
|
|
CImageList::DragLeave(this);
|
|
CImageList::EndDrag();
|
|
ReleaseCapture();
|
|
SelectDropTarget(NULL);
|
|
HTREEITEM hOldSelItem = GetSelectedItem();
|
|
HTREEITEM hParent = GetParentItem(m_dragTarget);
|
|
m_bNodeIsDragging = FALSE;
|
|
|
|
if((m_dragTarget != NULL) && (m_dragTarget != hOldSelItem)
|
|
&& (GetParentItem(m_dragItem) != m_dragTarget) && (m_dragTarget != GetRootItem()))
|
|
{
|
|
BOOL bIsChild = FALSE;
|
|
HTREEITEM hItem = hParent;
|
|
while(hItem != NULL){
|
|
if(hItem == m_dragItem){
|
|
bIsChild = TRUE;
|
|
MessageBox(_T("对不起,不能将父类别移动至其子类别下!"));
|
|
break;
|
|
}
|
|
hItem = GetParentItem(hItem);
|
|
}
|
|
if(!bIsChild){
|
|
CString csTKName, csType, csOldTKName, csOldType;
|
|
GetNodeAllPath(m_dragTarget, csTKName, csType);
|
|
GetNodeAllPath(hOldSelItem, csOldTKName, csOldType);
|
|
if(csTKName == csOldTKName)
|
|
MoveNodeInThisTK(csTKName, csType, csOldType);
|
|
else{
|
|
if(m_bIsJpgShow)
|
|
CopyJpgNodeInOtherTK(csTKName, csOldTKName, csType, csOldType);
|
|
else
|
|
CopyNodeInOtherTK(csTKName, csOldTKName, csType, csOldType);
|
|
}
|
|
|
|
if(csType == _T(""))
|
|
m_csCurKind = GetItemText(hOldSelItem); //移动至根
|
|
else{
|
|
m_csCurKind = _T("\\") + GetItemText(hOldSelItem);
|
|
m_csCurKind = csType + m_csCurKind;
|
|
}
|
|
SetDataSource(m_csTKWFile);
|
|
Expand(GetSelectedItem(), TVE_EXPAND);
|
|
}
|
|
|
|
|
|
}
|
|
Invalidate();
|
|
UpdateWindow();// 刷新
|
|
m_dragTarget=NULL;
|
|
}
|
|
CTreeCtrl::OnLButtonUp(nFlags, point);
|
|
}
|
|
|
|
BOOL CTKTreeCtrl::DoDragBlk(XStringList &lstBlk)
|
|
{
|
|
BOOL bRet = TRUE;
|
|
HTREEITEM hOldSelItem;
|
|
HTREEITEM hParent = GetParentItem(m_dragTarget);
|
|
hOldSelItem = GetSelectedItem();
|
|
if((m_dragTarget != NULL) && (m_dragTarget != hOldSelItem)
|
|
&& (GetParentItem(m_dragItem) != m_dragTarget) && (m_dragTarget != GetRootItem()))
|
|
{
|
|
CString csTKName, csType, csOldTKName, csOldType;
|
|
GetNodeAllPath(m_dragTarget, csTKName, csType);
|
|
GetNodeAllPath(hOldSelItem, csOldTKName, csOldType);
|
|
if(csTKName == csOldTKName){
|
|
bRet = MoveBlkInThisTK(csTKName, csType, csOldType, lstBlk);
|
|
m_bCopyAndDel = TRUE;
|
|
}
|
|
else{
|
|
if(m_bIsJpgShow)
|
|
bRet = CopyJpgBlkInOtherTK(csTKName, csOldTKName, csType, csOldType, lstBlk);
|
|
else
|
|
bRet = CopyBlkInOtherTK(csTKName, csOldTKName, csType, csOldType, lstBlk);
|
|
// SelectItem(m_dragTarget); //TK间拷贝图块(更改当前树结点),TK内移动图块(不更改当前树结点)
|
|
}
|
|
}
|
|
else
|
|
return FALSE;
|
|
return bRet;
|
|
}
|
|
|
|
BOOL CTKTreeCtrl::MoveBlkInThisTK(const TCHAR* szTKRes, const TCHAR* szType, const TCHAR* szOldType, XStringList &lstBlk)
|
|
{
|
|
CString csTKRes, csType, csOldType;
|
|
csTKRes = szTKRes;
|
|
csType = szType;
|
|
csOldType = szOldType;
|
|
|
|
CodeBase db;
|
|
XDbfTable *pTable = db.Open(csTKRes);
|
|
if(!pTable) {
|
|
AfxMessageBox(_T("TK文件只读或损坏!"));
|
|
return FALSE;
|
|
}
|
|
for(pTable->MoveFirst(); !pTable->IsEOF(); pTable->MoveNext()) {
|
|
CString sKind, sItem, sDrawing;
|
|
GET_FIELD(pTable, _T("kind"), sKind);
|
|
GET_FIELD(pTable, _T("item"), sItem);
|
|
GET_FIELD(pTable, _T("Drawing"), sDrawing);
|
|
for(int i=0;i<lstBlk.Length();i++){
|
|
if(_tcscmp(sDrawing, lstBlk[i]) == 0 && _tcscmp(sKind, csOldType) == 0 ){
|
|
long pos = pTable->GetPosition();
|
|
pTable->Delete();
|
|
pTable->AppendBegin();
|
|
SET_FIELD(pTable, _T("kind"), (const TCHAR*)csType);
|
|
SET_FIELD(pTable, _T("item"), (LPCTSTR)sItem);
|
|
SET_FIELD(pTable, _T("Drawing"), (LPCTSTR)sDrawing);
|
|
pTable->AppendEnd();
|
|
pTable->MoveTo(pos);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CTKTreeCtrl::CopyBlkInOtherTK(const TCHAR* szTKTarget, const TCHAR* szTKRes, const TCHAR* szTarType, const TCHAR* szResType, XStringList &lstBlk)
|
|
{
|
|
CString csTKTarget, csTKRes, csTarType, csResType;
|
|
csTKTarget = szTKTarget;
|
|
csTKRes = szTKRes;
|
|
csTarType = szTarType;
|
|
csResType = szResType;
|
|
|
|
|
|
SHORT nStateShift = GetKeyState(VK_SHIFT);
|
|
BOOL bShift = (nStateShift&256)!=0;
|
|
m_bCopyAndDel = bShift;
|
|
//打开SLB, DWB文件
|
|
CString csResDwbFile, csResSlbFile, csTargetDwb, csTargetSlb;
|
|
csResDwbFile = GetPathNameByAllName(csTKRes) + GetFileNameByAllName(csTKRes) + _T(".DWB");
|
|
csResSlbFile = GetPathNameByAllName(csTKRes) + GetFileNameByAllName(csTKRes) + _T(".SLB");
|
|
csTargetDwb = GetPathNameByAllName(csTKTarget) + GetFileNameByAllName(csTKTarget) + _T(".DWB");
|
|
csTargetSlb = GetPathNameByAllName(csTKTarget) + GetFileNameByAllName(csTKTarget) + _T(".SLB");
|
|
XSlideLib SlbLibTarget(csTargetSlb);// 拷贝目标
|
|
XSlideLib SlbLibRes(csResSlbFile, _ios::in | _ios::binary); // 拷贝源
|
|
if(!SlbLibTarget) {
|
|
AfxMessageBox(_T("目标SLB文件打不开!"));
|
|
return FALSE;
|
|
}
|
|
if(!SlbLibRes) {
|
|
AfxMessageBox(_T("源SLB文件打不开!"));
|
|
return FALSE;
|
|
}
|
|
XDrawingLib DwbLibTarget(csTargetDwb);
|
|
XDrawingLib DwbLibRes(csResDwbFile, _ios::in | _ios::binary);
|
|
if(!DwbLibTarget) {
|
|
AfxMessageBox(_T("目标DWB文件打不开!"));
|
|
return FALSE;
|
|
}
|
|
if(!DwbLibRes) {
|
|
AfxMessageBox(_T("源DWB文件打不开!"));
|
|
return FALSE;
|
|
}
|
|
|
|
{ // db
|
|
CodeBase db;
|
|
XDbfTable *pTableRes = db.Open(csTKRes);
|
|
if(!pTableRes) {
|
|
AfxMessageBox(_T("源TK文件只读或损坏!"));
|
|
return FALSE;
|
|
}
|
|
XDbfTable *pTableTarget = db.Open(csTKTarget);
|
|
if(!pTableTarget) {
|
|
AfxMessageBox(_T("目标TK文件只读或损坏!"));
|
|
return FALSE;
|
|
}
|
|
TCHAR dwgPrefix[1024]=_T("");
|
|
TCHAR sldPrefix[1024]=_T("");
|
|
TCHAR tempPrefix[1024]=_T("");
|
|
GetTempPath(255, tempPrefix);
|
|
XStringList lstSlbLib,lstDwbLib;
|
|
lstSlbLib.Reset();
|
|
lstDwbLib.Reset();
|
|
SlbLibRes.GetAll(lstSlbLib);
|
|
DwbLibRes.GetAll(lstDwbLib);
|
|
|
|
int nNum = lstBlk.Length();
|
|
acedSetStatusBarProgressMeter(XString(_T("拷贝%d个图块"), nNum), 0, nNum);
|
|
int idx = 0;
|
|
for(pTableRes->MoveFirst(); !pTableRes->IsEOF(); pTableRes->MoveNext()) {
|
|
CString xsKind, xsDrawing, xsItem;
|
|
GET_FIELD(pTableRes, _T("kind"), xsKind);
|
|
GET_FIELD(pTableRes, _T("item"), xsItem);
|
|
GET_FIELD(pTableRes, _T("Drawing"), xsDrawing);
|
|
CString csNewKind;
|
|
if(xsDrawing == _T(""))
|
|
continue;
|
|
BOOL bFlag = FALSE;
|
|
for(int i=0;i<lstBlk.Length();i++){
|
|
if(_tcscmp(xsDrawing, lstBlk[i]) == 0){
|
|
bFlag = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
if(!bFlag)
|
|
continue;
|
|
|
|
//modified by whl 070511
|
|
//XString xsResStr;
|
|
TCHAR xsResStr[1024]=_T("00000001");
|
|
|
|
idx++;
|
|
acedSetStatusBarProgressMeterPos(idx);
|
|
if(GetNextDrawing(csTKTarget, xsResStr)!=RTNORM) {//modified by cwk on 061207
|
|
AfxMessageBox(_T("Dwb文件中无法添加该图块!"));
|
|
return FALSE;
|
|
}
|
|
_tcscpy(sldPrefix, tempPrefix);
|
|
_tcscpy(dwgPrefix, tempPrefix);
|
|
_tcscat(sldPrefix, xsDrawing);
|
|
_tcscat(sldPrefix, _T(".sld"));
|
|
int index = -1;
|
|
index = lstSlbLib.Index(xsDrawing, FALSE);
|
|
if(index > -1){
|
|
SlbLibRes.Copy(index, sldPrefix);
|
|
SlbLibTarget.Append(sldPrefix, xsResStr);
|
|
_tremove(sldPrefix);
|
|
} else {
|
|
AfxMessageBox(_T("Slb文件中无法找到该幻灯!"));
|
|
continue;
|
|
}
|
|
_tcscat(dwgPrefix, xsDrawing);
|
|
_tcscat(dwgPrefix, _T(".dwg"));
|
|
index = -1;
|
|
index = lstDwbLib.Index(xsDrawing, FALSE);
|
|
if(index > -1){
|
|
DwbLibRes.Copy(index, dwgPrefix);
|
|
DwbLibTarget.Append(dwgPrefix, xsResStr);
|
|
_tremove(dwgPrefix);
|
|
} else {
|
|
AfxMessageBox(_T("Dwb文件中无法找到该图块!"));
|
|
continue;
|
|
}
|
|
|
|
pTableTarget->AppendBegin();
|
|
SET_FIELD(pTableTarget, _T("kind"), (const TCHAR*)csTarType);
|
|
SET_FIELD(pTableTarget, _T("Item"), (LPCTSTR)xsItem);
|
|
SET_FIELD(pTableTarget, _T("Drawing"), (LPCTSTR)xsResStr);
|
|
pTableTarget->AppendEnd();
|
|
|
|
}
|
|
|
|
} // end db
|
|
if(bShift){
|
|
for(int i=0;i<lstBlk.Length();i++){
|
|
SlbLibRes.Remove(lstBlk[i]); // SR ADD
|
|
DwbLibRes.Remove(lstBlk[i]); // SR ADD
|
|
/*
|
|
DbfAccess db(csTKRes, FLAG_DELETE, 1, 0);
|
|
db.keyFieldName[0] = strdup("drawing");
|
|
db.keyinfo[0]=strdup(_AS(lstBlk[i]));
|
|
if(DBFFUN(db))
|
|
break;
|
|
*/
|
|
NewDbfTool::DeleteRecordByTKStruct(csTKRes, _T("drawing"), lstBlk[i]);
|
|
}
|
|
}
|
|
acedRestoreStatusBar();
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL CTKTreeCtrl::CopyJpgBlkInOtherTK(const TCHAR* szTKTarget, const TCHAR* szTKRes, const TCHAR* szTarType, const TCHAR* szResType, XStringList &lstBlk)
|
|
{
|
|
CString csTKTarget, csTKRes, csTarType, csResType;
|
|
csTKTarget = szTKTarget;
|
|
csTKRes = szTKRes;
|
|
csTarType = szTarType;
|
|
csResType = szResType;
|
|
|
|
//打开JPB, DWB文件
|
|
SHORT nStateShift = GetKeyState(VK_SHIFT);
|
|
BOOL bShift = (nStateShift&256)!=0;
|
|
m_bCopyAndDel = bShift;
|
|
|
|
CString csResDwb2dFile, csResDwb3dFile, csResJpbFile, csTarget2dDwb, csTarget3dDwb, csTargetJpb;
|
|
csResDwb2dFile = GetPathNameByAllName(csTKRes) + GetFileNameByAllName(csTKRes) + _T("_2d.DWB");
|
|
csResDwb3dFile = GetPathNameByAllName(csTKRes) + GetFileNameByAllName(csTKRes) + _T("_3d.DWB");
|
|
csResJpbFile = GetPathNameByAllName(csTKRes) + GetFileNameByAllName(csTKRes) + _T(".JPB");
|
|
|
|
csTarget2dDwb = GetPathNameByAllName(csTKTarget) + GetFileNameByAllName(csTKTarget) + _T("_2d.DWB");
|
|
csTarget3dDwb = GetPathNameByAllName(csTKTarget) + GetFileNameByAllName(csTKTarget) + _T("_3d.DWB");
|
|
csTargetJpb = GetPathNameByAllName(csTKTarget) + GetFileNameByAllName(csTKTarget) + _T(".JPB");
|
|
|
|
XJpegLib JpbLibTarget(csTargetJpb); // 拷贝目标
|
|
XJpegLib JpbLibRes(csResJpbFile, _ios::in | _ios::binary); // 拷贝源
|
|
if(!JpbLibTarget) {
|
|
AfxMessageBox(_T("目标Jpb文件打不开!"));
|
|
return FALSE;
|
|
}
|
|
if(!JpbLibRes) {
|
|
AfxMessageBox(_T("源Jpb文件打不开!"));
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
XDrawingLib DwbLibTarget2d(csTarget2dDwb);
|
|
XDrawingLib DwbLibRes2d(csResDwb2dFile, _ios::in | _ios::binary);
|
|
if(!DwbLibTarget2d) {
|
|
AfxMessageBox(_T("目标2dDWB文件打不开!"));
|
|
return FALSE;
|
|
}
|
|
if(!DwbLibRes2d) {
|
|
AfxMessageBox(_T("源2dDWB文件打不开!"));
|
|
return FALSE;
|
|
}
|
|
|
|
XDrawingLib DwbLibTarget3d(csTarget3dDwb);
|
|
XDrawingLib DwbLibRes3d(csResDwb3dFile, _ios::in | _ios::binary);
|
|
if(!DwbLibTarget3d) {
|
|
AfxMessageBox(_T("目标3dDWB文件打不开!"));
|
|
return FALSE;
|
|
}
|
|
if(!DwbLibRes3d) {
|
|
AfxMessageBox(_T("源3dDWB文件打不开!"));
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
|
|
CodeBase db;
|
|
XDbfTable *pTableRes = db.Open(csTKRes);
|
|
if(!pTableRes) {
|
|
AfxMessageBox(_T("源TK文件只读或损坏!"));
|
|
return FALSE;
|
|
}
|
|
XDbfTable *pTableTarget = db.Open(csTKTarget);
|
|
if(!pTableTarget) {
|
|
AfxMessageBox(_T("目标TK文件只读或损坏!"));
|
|
return FALSE;
|
|
}
|
|
TCHAR dwg2dPrefix[256]=_T("");
|
|
TCHAR dwg3dPrefix[256]=_T("");
|
|
TCHAR jpgPrefix[256]=_T("");
|
|
TCHAR tempPrefix[256]=_T("");
|
|
GetTempPath(255, tempPrefix);
|
|
|
|
XStringList lstJpbLib, lst2dDwbLib, lst3dDwbLib;
|
|
lstJpbLib.Reset();
|
|
lst2dDwbLib.Reset();
|
|
lst3dDwbLib.Reset();
|
|
JpbLibRes.GetAll(lstJpbLib);
|
|
DwbLibRes2d.GetAll(lst2dDwbLib);
|
|
DwbLibRes3d.GetAll(lst3dDwbLib);
|
|
|
|
|
|
|
|
int nNum = lstBlk.Length();
|
|
acedSetStatusBarProgressMeter(XString(_T("拷贝%d个图块"), nNum), 0, nNum);
|
|
int idx = 0;
|
|
for(pTableRes->MoveFirst(); !pTableRes->IsEOF(); pTableRes->MoveNext()) {
|
|
CString xsKind, xsDrawing, xsItem;
|
|
GET_FIELD(pTableRes, _T("kind"), xsKind);
|
|
GET_FIELD(pTableRes, _T("item"), xsItem);
|
|
GET_FIELD(pTableRes, _T("Drawing"), xsDrawing);
|
|
CString csNewKind;
|
|
if(xsDrawing == _T(""))
|
|
continue;
|
|
BOOL bFlag = FALSE;
|
|
for(int i=0;i<lstBlk.Length();i++){
|
|
if(_tcscmp(xsDrawing, lstBlk[i]) == 0){
|
|
bFlag = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
if(!bFlag)
|
|
continue;
|
|
|
|
//modified by whl 070511
|
|
//XString xsResStr;
|
|
TCHAR xsResStr[1024]=_T("00000001");
|
|
|
|
idx++;
|
|
acedSetStatusBarProgressMeterPos(idx);
|
|
if(GetNextDrawing(csTKTarget, xsResStr)!=RTNORM) //modified by cwk on 061207
|
|
{
|
|
AfxMessageBox(_T("Dwb文件中无法添加该图块!"));
|
|
return FALSE;
|
|
}
|
|
_tcscpy(jpgPrefix, tempPrefix);
|
|
_tcscpy(dwg2dPrefix, tempPrefix);
|
|
_tcscpy(dwg3dPrefix, tempPrefix);
|
|
_tcscat(jpgPrefix, xsDrawing);
|
|
_tcscat(jpgPrefix, _T(".jpg"));
|
|
int indexJpb(-1), index2d(-1), index3d(-1);
|
|
indexJpb = lstJpbLib.Index(xsDrawing, FALSE);
|
|
|
|
if(indexJpb > -1){
|
|
JpbLibRes.Copy(indexJpb, jpgPrefix);
|
|
JpbLibTarget.Append(jpgPrefix, xsResStr);
|
|
_tremove(jpgPrefix);
|
|
} else {
|
|
AfxMessageBox(_T("Jpb文件中无法找到该图片!"));
|
|
continue;
|
|
}
|
|
|
|
_tcscat(dwg2dPrefix, xsDrawing);
|
|
_tcscat(dwg2dPrefix, _T("_2d.dwg"));
|
|
|
|
index2d = lst2dDwbLib.Index(xsDrawing, FALSE);
|
|
|
|
if(index2d > -1){
|
|
DwbLibRes2d.Copy(index2d, dwg2dPrefix);
|
|
DwbLibTarget2d.Append(dwg2dPrefix, xsResStr);
|
|
_tremove(dwg2dPrefix);
|
|
} else {
|
|
AfxMessageBox(_T("2dDwb文件中无法找到该图块!"));
|
|
continue;
|
|
}
|
|
|
|
_tcscat(dwg3dPrefix, xsDrawing);
|
|
_tcscat(dwg3dPrefix, _T("_3d.dwg"));
|
|
|
|
index3d = lst3dDwbLib.Index(xsDrawing, FALSE);
|
|
|
|
if(index3d > -1){
|
|
DwbLibRes3d.Copy(index3d, dwg3dPrefix);
|
|
DwbLibTarget3d.Append(dwg3dPrefix, xsResStr);
|
|
_tremove(dwg3dPrefix);
|
|
} else {
|
|
AfxMessageBox(_T("3dDwb文件中无法找到该图块!"));
|
|
continue;
|
|
}
|
|
|
|
pTableTarget->AppendBegin();
|
|
SET_FIELD(pTableTarget, _T("kind"), (const TCHAR*)csTarType);
|
|
SET_FIELD(pTableTarget, _T("Item"), (LPCTSTR)xsItem);
|
|
SET_FIELD(pTableTarget, _T("Drawing"), (LPCTSTR)xsResStr);
|
|
pTableTarget->AppendEnd();
|
|
|
|
}
|
|
if(bShift){
|
|
for(int i=0;i<lstBlk.Length();i++){
|
|
|
|
JpbLibRes.Remove(lstBlk[i]); // SR ADD
|
|
DwbLibRes2d.Remove(lstBlk[i]); // SR ADD
|
|
DwbLibRes3d.Remove(lstBlk[i]); // SR ADD
|
|
/*
|
|
DbfAccess db(csTKRes, FLAG_DELETE, 1, 0);
|
|
db.keyFieldName[0] = strdup("drawing");
|
|
db.keyinfo[0]=strdup(_AS(lstBlk[i]));
|
|
if(DBFFUN(db))
|
|
break;
|
|
*/
|
|
NewDbfTool::DeleteRecordByTKStruct(csTKRes, _T("drawing"), lstBlk[i]);
|
|
}
|
|
}
|
|
|
|
acedRestoreStatusBar();
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
|
|
void CTKTreeCtrl::OnMouseMove(UINT nFlags, CPoint point)
|
|
{
|
|
if(!(nFlags & MK_LBUTTON) ) {
|
|
CTreeCtrl::OnMouseMove(nFlags, point);
|
|
return;
|
|
}
|
|
if(!m_bCellIsDragging && !m_bNodeIsDragging) {
|
|
CTreeCtrl::OnMouseMove(nFlags, point);
|
|
return;
|
|
}
|
|
HICON hIcon;
|
|
CTemporaryResourceOverride vTemp;
|
|
CWinApp* pApp = AfxGetApp();
|
|
hIcon = pApp->LoadCursor(IDC_CUR_CELLMOVE);
|
|
SetCursor(hIcon);
|
|
|
|
if(m_bNodeIsDragging){
|
|
CPoint ptTree(point);
|
|
MapWindowPoints(this, &ptTree, 1);
|
|
CImageList::DragMove(ptTree);
|
|
UINT uHitTest = TVHT_ONITEM;
|
|
m_dragTarget = HitTest(ptTree, &uHitTest);
|
|
if(m_dragTarget != NULL)
|
|
SelectDropTarget(m_dragTarget);
|
|
}
|
|
|
|
CTreeCtrl::OnMouseMove(nFlags, point);
|
|
}
|
|
|
|
void CTKTreeCtrl::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
|
|
if(m_bMerge)
|
|
return;
|
|
m_dragItem = pNMTreeView->itemNew.hItem;
|
|
if(GetParentItem( m_dragItem ) != NULL ) {
|
|
CImageList* pDragImage;
|
|
pDragImage = CreateDragImage( m_dragItem );
|
|
SelectItem( m_dragItem );
|
|
pDragImage->BeginDrag( 0, CPoint(0,0) );
|
|
pDragImage->DragEnter( this, pNMTreeView->ptDrag );
|
|
SetCapture();
|
|
m_bNodeIsDragging = TRUE;
|
|
delete pDragImage; //必须
|
|
}
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
BOOL CTKTreeCtrl::MoveNodeInThisTK(const TCHAR* szTKName, const TCHAR* szDragTarget, const TCHAR* szResType)
|
|
{
|
|
CString csTKName, csDragTarget, csResType;
|
|
csTKName = szTKName;
|
|
csDragTarget = szDragTarget;
|
|
csResType = szResType;
|
|
|
|
CString xsKind;
|
|
CString csNewKind;
|
|
CodeBase db;
|
|
XDbfTable *pTable = db.Open(csTKName);
|
|
if(!pTable) {
|
|
AfxMessageBox(_T("TK文件只读或损坏!"));
|
|
return FALSE;
|
|
}
|
|
for(pTable->MoveFirst();!pTable->IsEOF();pTable->MoveNext()){
|
|
BOOL flag = TRUE;
|
|
GET_FIELD(pTable, _T("kind"), xsKind);
|
|
if(IsKindInKind((const TCHAR*)xsKind, csResType, csNewKind)){ //确认此图块属于删除类别下
|
|
if(csDragTarget != _T("")){
|
|
if(csNewKind != _T(""))
|
|
csNewKind = _T("\\") + csNewKind;
|
|
csNewKind = csDragTarget + csNewKind;
|
|
}
|
|
SET_FIELD(pTable, _T("kind"), (const TCHAR*)csNewKind);
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CTKTreeCtrl::CopyNodeInOtherTK(const TCHAR* szTKTarget, const TCHAR* szTKRes, const TCHAR* szDragTarget, const TCHAR* szResType)
|
|
{
|
|
CString csTKTarget, csTKRes, csDragTarget, csResType;
|
|
csTKTarget = szTKTarget;
|
|
csTKRes = szTKRes;
|
|
csDragTarget = szDragTarget;
|
|
csResType = szResType;
|
|
|
|
int nNum = GetKindBlkCount(csTKRes, csResType);
|
|
if(nNum < 1) return FALSE;
|
|
SHORT nStateShift = GetKeyState(VK_SHIFT);
|
|
BOOL bShift = (nStateShift&256)!=0;
|
|
m_bCopyAndDel = bShift;
|
|
|
|
|
|
|
|
//打开SLB, DWB文件
|
|
CString csResDwbFile, csResSlbFile, csTargetDwb, csTargetSlb;
|
|
csResDwbFile = GetPathNameByAllName(csTKRes) + GetFileNameByAllName(csTKRes) + _T(".DWB");
|
|
csResSlbFile = GetPathNameByAllName(csTKRes) + GetFileNameByAllName(csTKRes) + _T(".SLB");
|
|
csTargetDwb = GetPathNameByAllName(csTKTarget) + GetFileNameByAllName(csTKTarget) + _T(".DWB");
|
|
csTargetSlb = GetPathNameByAllName(csTKTarget) + GetFileNameByAllName(csTKTarget) + _T(".SLB");
|
|
XSlideLib SlbLibTarget(csTargetSlb);// 拷贝目标
|
|
XSlideLib SlbLibRes(csResSlbFile, _ios::in | _ios::binary); // 拷贝源
|
|
if(!SlbLibTarget) {
|
|
AfxMessageBox(_T("目标SLB文件打不开!"));
|
|
return FALSE;
|
|
}
|
|
if(!SlbLibRes) {
|
|
AfxMessageBox(_T("源SLB文件打不开!"));
|
|
return FALSE;
|
|
}
|
|
XDrawingLib DwbLibTarget(csTargetDwb);
|
|
XDrawingLib DwbLibRes(csResDwbFile, _ios::in | _ios::binary);
|
|
if(!DwbLibTarget) {
|
|
AfxMessageBox(_T("目标DWB文件打不开!"));
|
|
return FALSE;
|
|
}
|
|
if(!DwbLibRes) {
|
|
AfxMessageBox(_T("源DWB文件打不开!"));
|
|
return FALSE;
|
|
}
|
|
CodeBase db;
|
|
XDbfTable *pTableRes = db.Open(csTKRes);
|
|
if(!pTableRes) {
|
|
AfxMessageBox(_T("源TK文件只读或损坏!"));
|
|
return FALSE;
|
|
}
|
|
XDbfTable *pTableTarget = db.Open(csTKTarget);
|
|
if(!pTableTarget) {
|
|
AfxMessageBox(_T("目标TK文件只读或损坏!"));
|
|
return FALSE;
|
|
}
|
|
TCHAR dwgPrefix[256]=_T("");
|
|
TCHAR sldPrefix[256]=_T("");
|
|
TCHAR tempPrefix[256]=_T("");
|
|
GetTempPath(255, tempPrefix);
|
|
XStringList lstSlbLib,lstDwbLib;
|
|
lstSlbLib.Reset();
|
|
lstDwbLib.Reset();
|
|
SlbLibRes.GetAll(lstSlbLib);
|
|
DwbLibRes.GetAll(lstDwbLib);
|
|
acedSetStatusBarProgressMeter(XString(_T("拷贝%d个图块"), nNum), 0, nNum);
|
|
int idx = 0;
|
|
XStringList lstDelBlk;
|
|
|
|
for(pTableRes->MoveFirst(); !pTableRes->IsEOF(); pTableRes->MoveNext()) {
|
|
CString xsKind, xsDrawing, xsItem;
|
|
GET_FIELD(pTableRes, _T("kind"), xsKind);
|
|
GET_FIELD(pTableRes, _T("item"), xsItem);
|
|
GET_FIELD(pTableRes, _T("Drawing"), xsDrawing);
|
|
CString csNewKind;
|
|
if(IsKindInKind((const TCHAR*)xsKind, csResType, csNewKind)){ //确认此图块属于删除类别下
|
|
idx++;
|
|
acedSetStatusBarProgressMeterPos(idx);
|
|
|
|
if(csDragTarget != _T("")){
|
|
if(csNewKind != _T(""))
|
|
csNewKind = _T("\\") + csNewKind;
|
|
csNewKind = csDragTarget + csNewKind;
|
|
}
|
|
|
|
//modified by whl 070511
|
|
//XString xsResStr;
|
|
TCHAR xsResStr[1024]=_T("00000001");
|
|
|
|
if(xsDrawing != _T("")){ //否则是类别记录
|
|
if(GetNextDrawing(szTKTarget, xsResStr)!=RTNORM) {//modified by cwk on 061204
|
|
AfxMessageBox(_T("Dwb文件中无法添加该图块!"));
|
|
return FALSE;
|
|
}
|
|
_tcscpy(sldPrefix, tempPrefix);
|
|
_tcscpy(dwgPrefix, tempPrefix);
|
|
_tcscat(sldPrefix, xsDrawing);
|
|
_tcscat(sldPrefix, _T(".sld"));
|
|
int index = -1;
|
|
index = lstSlbLib.Index(xsDrawing, FALSE);
|
|
|
|
lstDelBlk.Append(tstrnew(xsDrawing));
|
|
if(index > -1){
|
|
SlbLibRes.Copy(index, sldPrefix);
|
|
SlbLibTarget.Append(sldPrefix, xsResStr);
|
|
_tremove(sldPrefix);
|
|
} else {
|
|
AfxMessageBox(_T("Slb文件中无法找到该幻灯!"));
|
|
continue;
|
|
}
|
|
_tcscat(dwgPrefix, xsDrawing);
|
|
_tcscat(dwgPrefix, _T(".dwg"));
|
|
index = -1;
|
|
index = lstDwbLib.Index(xsDrawing, FALSE);
|
|
if(index > -1){
|
|
DwbLibRes.Copy(index, dwgPrefix);
|
|
DwbLibTarget.Append(dwgPrefix, xsResStr);
|
|
_tremove(dwgPrefix);
|
|
} else {
|
|
AfxMessageBox(_T("Dwb文件中无法找到该图块!"));
|
|
continue;
|
|
}
|
|
}
|
|
else if(bShift){//类别
|
|
pTableRes->Delete();
|
|
}
|
|
pTableTarget->AppendBegin();
|
|
SET_FIELD(pTableTarget, _T("kind"), (const TCHAR*)csNewKind);
|
|
SET_FIELD(pTableTarget, _T("Item"), (LPCTSTR)xsItem);
|
|
SET_FIELD(pTableTarget, _T("Drawing"), (LPCTSTR)xsResStr);
|
|
pTableTarget->AppendEnd();
|
|
}
|
|
}
|
|
|
|
if(bShift){
|
|
for(int i=0;i<lstDelBlk.Length();i++){
|
|
SlbLibRes.Remove(lstDelBlk[i]); // SR ADD
|
|
DwbLibRes.Remove(lstDelBlk[i]); // SR ADD
|
|
/*
|
|
DbfAccess db(csTKRes, FLAG_DELETE, 1, 0);
|
|
db.keyFieldName[0] = strdup("drawing");
|
|
db.keyinfo[0]=strdup(_AS(lstDelBlk[i]));
|
|
if(DBFFUN(db))
|
|
break;
|
|
*/
|
|
NewDbfTool::DeleteRecordByTKStruct(csTKRes, _T("drawing"), lstDelBlk[i]);
|
|
}
|
|
}
|
|
|
|
|
|
acedRestoreStatusBar();
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CTKTreeCtrl::CopyJpgNodeInOtherTK(const TCHAR* szTKTarget, const TCHAR* szTKRes, const TCHAR* szDragTarget, const TCHAR* szResType)
|
|
{
|
|
CString csTKTarget, csTKRes, csDragTarget, csResType;
|
|
csTKTarget = szTKTarget;
|
|
csTKRes = szTKRes;
|
|
csDragTarget = szDragTarget;
|
|
csResType = szResType;
|
|
|
|
|
|
int nNum = GetKindBlkCount(csTKRes, csResType);
|
|
if(nNum < 1) return FALSE;
|
|
SHORT nStateShift = GetKeyState(VK_SHIFT);
|
|
BOOL bShift = (nStateShift&256)!=0;
|
|
m_bCopyAndDel = bShift;
|
|
//打开JPB, DWB文件
|
|
CString csResDwbFile2d, csResDwbFile3d, csResJpbFile, csTargetDwb2d, csTargetDwb3d, csTargetJpb;
|
|
csResDwbFile2d = GetPathNameByAllName(csTKRes) + GetFileNameByAllName(csTKRes) + _T("_2d.DWB");
|
|
csResDwbFile3d = GetPathNameByAllName(csTKRes) + GetFileNameByAllName(csTKRes) + _T("_3d.DWB");
|
|
csResJpbFile = GetPathNameByAllName(csTKRes) + GetFileNameByAllName(csTKRes) + _T(".JPB");
|
|
csTargetDwb2d = GetPathNameByAllName(csTKTarget) + GetFileNameByAllName(csTKTarget) + _T("_2d.DWB");
|
|
csTargetDwb3d = GetPathNameByAllName(csTKTarget) + GetFileNameByAllName(csTKTarget) + _T("_3d.DWB");
|
|
csTargetJpb = GetPathNameByAllName(csTKTarget) + GetFileNameByAllName(csTKTarget) + _T(".JPB");
|
|
XJpegLib JpbLibTarget(csTargetJpb); // 拷贝目标
|
|
XJpegLib JpbLibRes(csResJpbFile, _ios::in | _ios::binary); // 拷贝源
|
|
if(!JpbLibTarget) {
|
|
AfxMessageBox(_T("目标JPB文件打不开!"));
|
|
return FALSE;
|
|
}
|
|
if(!JpbLibRes) {
|
|
AfxMessageBox(_T("源JPB文件打不开!"));
|
|
return FALSE;
|
|
}
|
|
|
|
XDrawingLib DwbLibTarget2d(csTargetDwb2d);
|
|
XDrawingLib DwbLibRes2d(csResDwbFile2d, _ios::in | _ios::binary);
|
|
if(!DwbLibTarget2d) {
|
|
AfxMessageBox(_T("目标2dDWB文件打不开!"));
|
|
return FALSE;
|
|
}
|
|
if(!DwbLibRes2d) {
|
|
AfxMessageBox(_T("源2dDWB文件打不开!"));
|
|
return FALSE;
|
|
}
|
|
|
|
XDrawingLib DwbLibTarget3d(csTargetDwb3d);
|
|
XDrawingLib DwbLibRes3d(csResDwbFile3d, _ios::in | _ios::binary);
|
|
if(!DwbLibTarget3d) {
|
|
AfxMessageBox(_T("目标3dDWB文件打不开!"));
|
|
return FALSE;
|
|
}
|
|
if(!DwbLibRes3d) {
|
|
AfxMessageBox(_T("源3dDWB文件打不开!"));
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
CodeBase db;
|
|
XDbfTable *pTableRes = db.Open(csTKRes);
|
|
if(!pTableRes) {
|
|
AfxMessageBox(_T("源TK文件只读或损坏!"));
|
|
return FALSE;
|
|
}
|
|
XDbfTable *pTableTarget = db.Open(csTKTarget);
|
|
if(!pTableTarget) {
|
|
AfxMessageBox(_T("目标TK文件只读或损坏!"));
|
|
return FALSE;
|
|
}
|
|
TCHAR dwgPrefix2d[256]=_T("");
|
|
TCHAR dwgPrefix3d[256]=_T("");
|
|
TCHAR jpgPrefix[256]=_T("");
|
|
TCHAR tempPrefix[256]=_T("");
|
|
|
|
GetTempPath(255, tempPrefix);
|
|
XStringList lstJpbLib, lstDwbLib2d, lstDwbLib3d;
|
|
lstJpbLib.Reset();
|
|
lstDwbLib2d.Reset();
|
|
lstDwbLib3d.Reset();
|
|
JpbLibRes.GetAll(lstJpbLib);
|
|
DwbLibRes2d.GetAll(lstDwbLib2d);
|
|
DwbLibRes3d.GetAll(lstDwbLib3d);
|
|
|
|
acedSetStatusBarProgressMeter(XString(_T("拷贝%d个图块"), nNum), 0, nNum);
|
|
int idx = 0;
|
|
XStringList lstDelBlk;
|
|
for(pTableRes->MoveFirst(); !pTableRes->IsEOF(); pTableRes->MoveNext()) {
|
|
|
|
CString xsKind, xsDrawing, xsItem;
|
|
GET_FIELD(pTableRes, _T("kind"), xsKind);
|
|
GET_FIELD(pTableRes, _T("item"), xsItem);
|
|
GET_FIELD(pTableRes, _T("Drawing"), xsDrawing);
|
|
CString csNewKind;
|
|
if(IsKindInKind((const TCHAR*)xsKind, csResType, csNewKind)){ //确认此图块属于删除类别下
|
|
idx++;
|
|
acedSetStatusBarProgressMeterPos(idx);
|
|
if(csDragTarget != _T("")){
|
|
if(csNewKind != _T(""))
|
|
csNewKind = _T("\\") + csNewKind;
|
|
csNewKind = csDragTarget + csNewKind;
|
|
}
|
|
XString xsResStr = _T("");
|
|
if(xsDrawing != _T("")){ //否则是类别记录
|
|
if(GetNextDrawing(szTKTarget, xsResStr)!=RTNORM) {//modified by cwk on 061204
|
|
AfxMessageBox(_T("Dwb文件中无法添加该图块!"));
|
|
return FALSE;
|
|
}
|
|
_tcscpy(jpgPrefix, tempPrefix);
|
|
_tcscpy(dwgPrefix2d, tempPrefix);
|
|
_tcscpy(dwgPrefix3d, tempPrefix);
|
|
_tcscat(jpgPrefix, xsDrawing);
|
|
_tcscat(jpgPrefix, _T(".Jpg"));
|
|
int index = -1;
|
|
lstDelBlk.Append(tstrnew(xsDrawing));
|
|
index = lstJpbLib.Index(xsDrawing, FALSE);
|
|
if(index > -1){
|
|
JpbLibRes.Copy(index, jpgPrefix);
|
|
JpbLibTarget.Append(jpgPrefix, xsResStr);
|
|
_tremove(jpgPrefix);
|
|
} else {
|
|
AfxMessageBox(_T("JPB文件中无法找到该幻灯!"));
|
|
continue;
|
|
}
|
|
_tcscat(dwgPrefix2d, xsDrawing);
|
|
_tcscat(dwgPrefix2d, _T("_2d.dwg"));
|
|
index = -1;
|
|
index = lstDwbLib2d.Index(xsDrawing, FALSE);
|
|
if(index > -1){
|
|
DwbLibRes2d.Copy(index, dwgPrefix2d);
|
|
DwbLibTarget2d.Append(dwgPrefix2d, xsResStr);
|
|
_tremove(dwgPrefix2d);
|
|
} else {
|
|
AfxMessageBox(_T("2dDwb文件中无法找到该图块!"));
|
|
continue;
|
|
}
|
|
|
|
_tcscat(dwgPrefix3d, xsDrawing);
|
|
_tcscat(dwgPrefix3d, _T("_3d.dwg"));
|
|
index = -1;
|
|
index = lstDwbLib3d.Index(xsDrawing, FALSE);
|
|
if(index > -1){
|
|
DwbLibRes3d.Copy(index, dwgPrefix3d);
|
|
DwbLibTarget3d.Append(dwgPrefix3d, xsResStr);
|
|
_tremove(dwgPrefix3d);
|
|
} else {
|
|
AfxMessageBox(_T("Dwb文件中无法找到该图块!"));
|
|
continue;
|
|
}
|
|
|
|
|
|
|
|
}
|
|
else if(bShift){//类别
|
|
pTableRes->Delete();
|
|
}
|
|
pTableTarget->AppendBegin();
|
|
SET_FIELD(pTableTarget, _T("kind"), (const TCHAR*)csNewKind);
|
|
SET_FIELD(pTableTarget, _T("Item"), (LPCTSTR)xsItem);
|
|
SET_FIELD(pTableTarget, _T("Drawing"), (LPCTSTR)xsResStr);
|
|
pTableTarget->AppendEnd();
|
|
}
|
|
}
|
|
if(bShift){
|
|
for(int i=0;i<lstDelBlk.Length();i++){
|
|
JpbLibRes.Remove(lstDelBlk[i]); // SR ADD
|
|
DwbLibRes2d.Remove(lstDelBlk[i]); // SR ADD
|
|
DwbLibRes3d.Remove(lstDelBlk[i]); // SR ADD
|
|
/*
|
|
DbfAccess db(csTKRes, FLAG_DELETE, 1, 0);
|
|
db.keyFieldName[0] = strdup("drawing");
|
|
db.keyinfo[0]=strdup(_AS(lstDelBlk[i]));
|
|
if(DBFFUN(db))
|
|
break;
|
|
*/
|
|
NewDbfTool::DeleteRecordByTKStruct(csTKRes, _T("drawing"), lstDelBlk[i]);
|
|
}
|
|
}
|
|
|
|
acedRestoreStatusBar();
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CTKTreeCtrl::DoDelKind(const TCHAR* szTKName, const TCHAR* szFilter)
|
|
{
|
|
CString csTKName, csFilter;
|
|
csTKName = szTKName;
|
|
csFilter = szFilter;
|
|
|
|
int nNum = GetKindBlkCount(csTKName, csFilter);
|
|
if(nNum < 1) return FALSE;
|
|
|
|
CString xsKind, xsDrawing; //类别
|
|
XStringList lstKind, lstFilter;
|
|
CString csKind;
|
|
int nPos = 0;
|
|
CodeBase db;
|
|
XDbfTable *pTable = db.Open(csTKName);
|
|
if(!pTable) {
|
|
AfxMessageBox(_T("TK文件只读或损坏!"));
|
|
return FALSE;
|
|
}
|
|
CProgressWnd wndProgress(GetParent(), _T("Progress"), TRUE);
|
|
wndProgress.SetRange(0, nNum);
|
|
wndProgress.SetText(_T("正在删除图块...\n")
|
|
_T("按取消键中断此次操作!"));
|
|
|
|
for(pTable->MoveFirst(); !pTable->IsEOF(); pTable->MoveNext()) {
|
|
GET_FIELD(pTable, _T("Drawing"), xsDrawing);
|
|
GET_FIELD(pTable, _T("Kind"), xsKind);
|
|
CString sss;
|
|
if(IsKindInKind((const TCHAR*)xsKind, csFilter, sss)){ //确认此图块属于删除类别下
|
|
pTable->Delete();
|
|
XString xsDwb(256), xsDwb2d(256), xsSlb(256), xsJpb(256);
|
|
if(m_bIsJpgShow){
|
|
xsDwb << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T("_3d.DWB");
|
|
xsDwb2d << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T("_2d.DWB");
|
|
XDrawingLib dwb2d(xsDwb2d);
|
|
if(!(!dwb2d))
|
|
dwb2d.Remove(xsDrawing);
|
|
}
|
|
else
|
|
xsDwb << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T(".DWB");
|
|
|
|
xsSlb << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T(".SLB");
|
|
xsJpb << GetPathNameByAllName(csTKName) << GetFileNameByAllName(csTKName) << _T(".JPB");
|
|
XDrawingLib dwb(xsDwb);
|
|
if(!(!dwb)) dwb.Remove(xsDrawing);
|
|
if(m_bIsJpgShow){
|
|
XJpegLib jpb(xsJpb);
|
|
if(!(!jpb)) jpb.Remove(xsDrawing);
|
|
}
|
|
else{
|
|
XSlideLib slb(xsSlb);
|
|
if(!(!slb)) slb.Remove(xsDrawing);
|
|
}
|
|
|
|
wndProgress.StepIt();
|
|
wndProgress.PeekAndPump();
|
|
if (wndProgress.Cancelled())
|
|
return FALSE;
|
|
if(ads_usrbrk() == 1)
|
|
return FALSE; //用户中断
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
int CTKTreeCtrl::GetKindBlkCount(const TCHAR* szTKName, const TCHAR* szFilter)
|
|
{
|
|
CString csTKName, csFilter;
|
|
csTKName = szTKName;
|
|
csFilter = szFilter;
|
|
|
|
int nNumDel = 0;
|
|
CString xsKind; //类别
|
|
CodeBase db;
|
|
XDbfTable *pTable = db.Open(csTKName);
|
|
if(!pTable) {
|
|
AfxMessageBox(_T("TK文件只读或损坏!"));
|
|
return -1;
|
|
}
|
|
for(pTable->MoveFirst(); !pTable->IsEOF(); pTable->MoveNext()) {
|
|
GET_FIELD(pTable, _T("kind"), xsKind);
|
|
CString sss;
|
|
if(IsKindInKind((const TCHAR*)xsKind, csFilter, sss))
|
|
nNumDel ++;;
|
|
}
|
|
return nNumDel;
|
|
}
|
|
|
|
int CTKTreeCtrl::GetKindAllBlk(const TCHAR* szTKName, const TCHAR* szFilter, DList<TKStruct> &lstBlk)
|
|
{
|
|
CString csTKName, csFilter;
|
|
csTKName = szTKName;
|
|
csFilter = szFilter;
|
|
|
|
int nNumDel = 0;
|
|
lstBlk.Reset();
|
|
CString xsKind, xsItem, xsDrawing; //类别
|
|
XStringList lstKind, lstFilter;
|
|
CString csKind;
|
|
int nPos = 0;
|
|
CodeBase db;
|
|
XDbfTable *pTable = db.Open(csTKName);
|
|
if(!pTable) {
|
|
AfxMessageBox(_T("TK文件只读或损坏!"));
|
|
return 0;
|
|
}
|
|
SplitStr(csFilter, lstFilter);
|
|
for(pTable->MoveFirst(); !pTable->IsEOF(); pTable->MoveNext()) {
|
|
BOOL flag = TRUE;
|
|
GET_FIELD(pTable, _T("kind"), xsKind);
|
|
GET_FIELD(pTable, _T("item"), xsItem);
|
|
GET_FIELD(pTable, _T("Drawing"), xsDrawing);
|
|
csKind = (const TCHAR *)xsKind; // ZJQ add here
|
|
SplitStr(csKind, lstKind);
|
|
if(lstKind.Length() < lstFilter.Length())
|
|
continue;
|
|
CString csHeadType;
|
|
|
|
for(int i=0; i<lstFilter.Length(); i++)
|
|
{// 此循环为了判断当前记录符不符和修改条件 即:两个链表前面部分完全一致
|
|
CString cs1,cs2;
|
|
cs1 = (const TCHAR *)lstKind[i]; // lstKind链表 :当前记录 -> sKind
|
|
cs2 = (const TCHAR *)lstFilter[i]; // lstFilter链表 :当前树接点
|
|
if(cs1 != cs2) {
|
|
flag = FALSE;
|
|
break;
|
|
}
|
|
else if(i != (lstFilter.Length() - 1)){
|
|
csHeadType += cs1;
|
|
csHeadType += _T("\\");
|
|
}
|
|
}
|
|
|
|
if(flag) {
|
|
csKind = csKind.Right(csKind.GetLength() - csHeadType.GetLength());
|
|
lstBlk.Append(new TKStruct(csTKName, csKind, xsItem, xsDrawing));
|
|
nNumDel ++;
|
|
}
|
|
}
|
|
return nNumDel;
|
|
}
|
|
|
|
|
|
BOOL CTKTreeCtrl::DelCurKind()
|
|
{
|
|
HTREEITEM htree(NULL), hParent(NULL);
|
|
htree = GetSelectedItem();
|
|
CString csCurTKName, csCurType;
|
|
GetNodeAllPath(htree, csCurTKName, csCurType);
|
|
if(csCurType == _T("") || htree == GetRootItem())//选中根结点或TK结点
|
|
return FALSE;
|
|
if(MessageBox(_T("注意:该类型所属的所有的图块都将删除!\n\n您是否真的删除此类型?"),_T("警告"),MB_OKCANCEL|MB_ICONQUESTION) != IDOK)
|
|
return FALSE;
|
|
if(DoDelKind(csCurTKName, csCurType)) { // 删除类别
|
|
hParent = GetParentItem(htree); // 用户没有中断
|
|
DeleteItem(htree);
|
|
if(hParent)
|
|
SelectItem(hParent);
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// CGJKTreeCtrl Class
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
CGJKTreeCtrl::CGJKTreeCtrl()
|
|
{
|
|
m_bFlag = FALSE;
|
|
}
|
|
|
|
CGJKTreeCtrl::~CGJKTreeCtrl()
|
|
{
|
|
|
|
}
|
|
BEGIN_MESSAGE_MAP(CGJKTreeCtrl,CTKTreeCtrl)
|
|
//{{AFX_MSG_MAP(CTKTreeCtrl)
|
|
ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
void CGJKTreeCtrl::OnRclick(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
POINT pt, ptClient;;
|
|
TV_HITTESTINFO tvhti;
|
|
::GetCursorPos((LPPOINT)&pt);
|
|
ptClient = pt;
|
|
ScreenToClient(&ptClient);
|
|
MapWindowPoints(this, &ptClient, 1);
|
|
tvhti.pt = ptClient;
|
|
HitTest(&tvhti);
|
|
if(tvhti.hItem)
|
|
{
|
|
SelectItem(tvhti.hItem);
|
|
}
|
|
HTREEITEM hCur = GetSelectedItem();
|
|
if(!hCur || m_bMerge)
|
|
{
|
|
*pResult = 0;
|
|
return;
|
|
}
|
|
|
|
CMenu Menu;
|
|
Menu.LoadMenu(IDR_MENU_TREEGJK);
|
|
CMenu *pSubMenu = NULL;
|
|
if(hCur == GetRootItem())
|
|
return ;
|
|
else if(GetParentItem(hCur) == GetRootItem())
|
|
{
|
|
if (m_bFlag)
|
|
{
|
|
pSubMenu = Menu.GetSubMenu(0);
|
|
}
|
|
else
|
|
{
|
|
pSubMenu = Menu.GetSubMenu(2);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (m_bFlag)
|
|
{
|
|
pSubMenu = Menu.GetSubMenu(1);
|
|
}
|
|
else
|
|
{
|
|
pSubMenu = Menu.GetSubMenu(3);
|
|
}
|
|
}
|
|
if(pSubMenu)
|
|
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
|
|
pt.x, pt.y, GetParent(), NULL);
|
|
SetFocus();
|
|
*pResult = 0;
|
|
}
|