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