You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kev/Drawer/Module/GeoSigmaDraw/ActionDeleteItem.cpp

194 lines
4.3 KiB
C++

1 month ago
//////////////////////////////////////////////////////////////////////////////
//<2F>ļ<EFBFBD> ActionDeleteItem.cpp
//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>:
//
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д: 2006-12-07
/////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include ".\actiondeleteitem.h"
#include "SigmaDoc.h"
#include "SigmaView.h"
#include "Visitor.h"
#include "Util.h"
CActionDeleteItem::CActionDeleteItem(CSigmaDoc * ppDoc, UINT actionType)
: CActionItem(ppDoc, actionType)
, m_bDeleted(false)
, m_bPerformOperation(FALSE)
{
}
NAction::CActionDeleteItem::CActionDeleteItem()
: CActionItem(nullptr, 0)
{
}
CActionDeleteItem::CActionDeleteItem(CSigmaDoc * ppDoc, UINT actionType, const CPositionList& list)
: CActionItem(ppDoc, actionType)
, m_bDeleted(false)
, m_bPerformOperation(FALSE)
{
long num=(long)list.GetCount();
if(num>0)
{
POSITION pt;
POSITION pos = list.GetHeadPosition();
std::vector<POSITION> positions;
positions.reserve(list.GetSize());
while (pos != NULL)
{
pt = list.GetNext(pos);
COne *pOne=GetDoc()->GetDraw()->GetAt(pt);
value.AddTail(pOne);
positions.push_back(pt);
}
GetDoc()->GetDraw()->GetElementIndexs(positions, m_pos);
}
}
CActionDeleteItem::~CActionDeleteItem(void)
{
Clear();
}
void NAction::CActionDeleteItem::Clear(void)
{
//Delete all objects in the m_list
if(m_bDeleted)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
CActionItem::Clear(value);
}
}
void NAction::CActionDeleteItem::accept(CActionVisitor& visitor)
{
visitor.visit(*this);
}
void CActionDeleteItem::Finish(void)
{
if(!m_bPerformOperation)
RemoveOperation();
CActionItem::Finish();
}
void CActionDeleteItem::RemoveOperation()
{
GetDoc()->ClearSelection();
m_bDeleted=true;
if(value.IsEmpty()) return;
// ע<>⣺pOne->GetRange <20><><EFBFBD><EFBFBD><EFBFBD>ҷ<EFBFBD><D2B7>ţ<EFBFBD><C5A3><EFBFBD> AfxGetGlobalMark()->BackupMark() <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> threadlocal <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>浱ǰ<E6B5B1><C7B0><EFBFBD>ű<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ܿ<EFBFBD><DCBF><EFBFBD><EFBFBD>Ѿ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ķ<EFBFBD><C4B7>ű<EFBFBD><C5B1>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD>ٻ<EFBFBD>ԭ
auto* pMark = &(GetDoc()->GetDraw()->mark);
AfxGetGlobalMark()->BackupMark();
AfxGetGlobalMark()->SetMark(pMark);
FinalAction finalAction([]() { AfxGetGlobalMark()->RestoreMark(); });
COne* pOne;
int n=0;
CRect8 range(1e100,-1e100,-1e100,1e100);
std::vector<COne*> pOnes;
pOnes.reserve(value.GetCount());
POSITION pos = value.GetTailPosition();
while (pos != NULL)
{
pOne = (COne*)value.GetPrev(pos);
pOne->GetRange(range);
pOnes.push_back(pOne);
}
RemoveAtNoClear(pOnes);
Invalidate(range);
//GetDoc()->Modified();
}
void CActionDeleteItem::AddOperation()
{
//add back all the objects according its position in the CDrawDoc::m_objects.
m_bDeleted=false;
if (value.IsEmpty())
{
return;
}
size_t posSize = m_pos.size();
size_t valueSize = value.GetCount();
ASSERT(posSize == valueSize);
// <20><><EFBFBD><EFBFBD><EFBFBD>±<EFBFBD><C2B1>ͱ<EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD> COne* ӳ<><D3B3><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::vector<std::pair<int, COne*>> cache;
cache.reserve(posSize);
{
int index = 0;
POSITION pos = value.GetHeadPosition();
while (pos != nullptr)
{
COne* pOne = reinterpret_cast<COne*>(value.GetNext(pos));
cache.emplace_back(m_pos[index++], pOne);
}
std::sort(cache.begin(), cache.end(), [](auto& pair1, auto& pair2)
{
return pair1.first < pair2.first;
});
}
{
// <20><><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><C5BB><EFBFBD>65<36><35><EFBFBD><EFBFBD>ɢ<EFBFBD><C9A2><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ܹ<EFBFBD><DCB9><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳ɼ<CCB3><C9BC><EFBFBD><EFBFBD><EFBFBD>
// ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFA3AC><EFBFBD><EFBFBD><EFBFBD>ȱ<EFBFBD><C8B1><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>е<EFBFBD>ͼԪ<CDBC><D4AA>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD>ǰ<EFBFBD>±꣬<C2B1><EAA3AC><EFBFBD>ж<EFBFBD> cache <20>е<EFBFBD><D0B5>±<EFBFBD><C2B1>͵<EFBFBD>ǰ<EFBFBD>±<EFBFBD><C2B1>Ƿ<EFBFBD><C7B7><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
// <20><><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD> cache Ԫ<>ذ<EFBFBD><D8B0>±<EFBFBD><C2B1><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF>ֻ<EFBFBD>ú<EFBFBD> cache <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>бȽϣ<C8BD><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ز<EFBFBD><D8B2><EFBFBD><EBB5BD>ԭͼ<D4AD><CDBC><EFBFBD>У<EFBFBD>
// <20>Ͱѵ<CDB0><D1B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>һ<EFBFBD>¾<EFBFBD><C2BE>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˴<EFBFBD><CBB4><EFBFBD>ѭ<EFBFBD><D1AD>
CPtrList* pValues = GetDoc()->GetDraw()->GetValueList();
int index = 0;
auto cacheIt = cache.begin();
POSITION pos = pValues->GetHeadPosition();
while (pos != nullptr)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD><EFBFBD><EFBFBD>
if (cacheIt == cache.end())
{
break;
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD>ȷ<EFBFBD><C8B7>λ<EFBFBD><CEBB>
if (index == cacheIt->first)
{
pos = GetDoc()->GetDraw()->InsertElementBefore(pos, cacheIt->second); // <20><><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>Ҫ<EFBFBD><D2AA> pos <20><><EFBFBD><EFBFBD>
cacheIt++;
}
pValues->GetNext(pos);
index++;
}
// <20><><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD>ͼԪ<CDBC><D4AA>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>ĩβ<C4A9><CEB2><EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD><C3B0>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD>ȥ
while (cacheIt != cache.end())
{
GetDoc()->GetDraw()->AddTailOne(cacheIt->second);
cacheIt++;
}
}
}
void CActionDeleteItem::Undo()
{
CActionItem::Undo();
AddOperation();
}
void CActionDeleteItem::Redo()
{
CActionItem::Redo();
RemoveOperation();
}