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/ActionModifiedItem.cpp

182 lines
4.1 KiB
C++

1 month ago
//////////////////////////////////////////////////////////////////////////////
//<2F>ļ<EFBFBD> ActionModifiedItem.cpp
//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>:
//
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д: 2006-12-07
/////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include ".\actionmodifieditem.h"
#include "SigmaDoc.h"
#include "SigmaView.h"
#include "Visitor.h"
CActionModifiedItem::CActionModifiedItem(CSigmaDoc * ppDoc, UINT actionType)
: CActionItem(ppDoc, actionType)
{
}
NAction::CActionModifiedItem::CActionModifiedItem()
:CActionItem(nullptr, 0)
{
}
CActionModifiedItem::CActionModifiedItem(CSigmaDoc * ppDoc, UINT actionType, const CPositionList& list)
: CActionItem(ppDoc, actionType)
{
BackupOldItem(list);
}
CActionModifiedItem::~CActionModifiedItem(void)
{
}
int CActionModifiedItem::GetCount()
{
return (int)m_entries.size();
}
void CActionModifiedItem::Undo()
{
CActionItem::Undo();
PerformOperation(&ModifiedEntry::pOldOne);
}
void CActionModifiedItem::Redo()
{
CActionItem::Redo();
PerformOperation(&ModifiedEntry::pNewOne);
}
void NAction::CActionModifiedItem::accept(CActionVisitor& visitor)
{
visitor.visit(*this);
}
void CActionModifiedItem::PerformOperation(std::unique_ptr<COne> ModifiedEntry::* member)
{
GetDoc()->ClearSelection();
for (const ModifiedEntry& entry : m_entries)
{
// <20>õ<EFBFBD> CXy <20>е<EFBFBD> COne ָ<><EFBFBD><EBA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ undo redo <20><>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
COne* pOne = GetDoc()->GetDraw()->GetOneById(entry.id);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> member <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Աָ<D4B1><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ pOldOne <20><><EFBFBD><EFBFBD> pNewOne<6E><65>undo ʱ<><CAB1><EFBFBD><EFBFBD> pOldOne<6E><65>redo ʱ<><CAB1><EFBFBD><EFBFBD> pNewOne
const std::unique_ptr<COne>& pActionOne = entry.*member;
if (pOne != nullptr && pActionOne != nullptr)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD>ݵ<EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CloneOneAndInvalidate(pOne, pActionOne.get());
}
}
}
void CActionModifiedItem::AfterRedoUndo(COne* pDestOne)
{
}
void NAction::CActionModifiedItem::BackupOldOne(COne* pOne)
{
if (pOne != nullptr)
{
ModifiedEntry entry;
entry.id = pOne->GetId();
entry.pOldOne = std::make_unique<COne>();
CloneOne(entry.pOldOne.get(), pOne);
m_entries.push_back(std::move(entry));
}
}
void NAction::CActionModifiedItem::CloneOneAndInvalidate(COne* pOne, const COne* pActionOne)
{
CloneOne(pOne, const_cast<COne*>(pActionOne));
CRect8 range(1e100, -1e100, -1e100, 1e100);
pOne->GetRange(range);
Invalidate(range);
}
bool CActionModifiedItem::BackupOldItem(POSITION pos, COne* pOne)
{
if (pos == nullptr || pOne == nullptr)
{
return false;
}
BackupOldOne(pOne);
return true;
}
void CActionModifiedItem::CloneOne(COne* pDestOne, COne* pSourceOne)
{
*pDestOne = *pSourceOne;
}
void CActionModifiedItem::BackupOldItem(const CPositionList& list)
{
for (POSITION pos = list.GetHeadPosition(); pos != nullptr; list.GetNext(pos))
{
POSITION pt = list.GetAt(pos);
COne* pOne = GetDoc()->GetDraw()->GetAt(pt);
BackupOldOne(pOne);
}
}
void NAction::CActionModifiedItem::BackupNewItem()
{
for (ModifiedEntry& entry : m_entries)
{
COne* pNewOne = GetDoc()->GetDraw()->GetOneById(entry.id);
if (pNewOne != nullptr)
{
entry.pNewOne = std::make_unique<COne>();
CloneOne(entry.pNewOne.get(), pNewOne);
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
CActionModifiedMesh::CActionModifiedMesh(CSigmaDoc * ppDoc, UINT actionType)
: CActionModifiedItem(ppDoc, actionType)
{
}
NAction::CActionModifiedMesh::CActionModifiedMesh()
{
}
CActionModifiedMesh::CActionModifiedMesh(CSigmaDoc * ppDoc, UINT actionType, const CPositionList& list)
: CActionModifiedItem(ppDoc, actionType, list)
{
}
CActionModifiedMesh::~CActionModifiedMesh(void)
{
}
void NAction::CActionModifiedMesh::accept(CActionVisitor& visitor)
{
visitor.visit(*this);
}
void CActionModifiedMesh::CloneOne(COne* pDestOne, COne* pSourceOne)
{
pDestOne->CloneOtherParameter(*pSourceOne);
ASSERT(pSourceOne->GetType() == DOUBLEFOX_MESH);
if(pDestOne->value == NULL)
pDestOne->value=new CMesh();
((CMesh*)pDestOne->value)->CloneOtherParamter(*(CMesh*)pSourceOne->value);
}
void CActionModifiedMesh::AfterRedoUndo(COne* pDestOne)
{
//ˢ<><CBA2><EFBFBD><EFBFBD>ʾ
((CMesh*)pDestOne->value)->GetBitmap();
}