|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
//<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();
|
|
|
|
|
|
}
|