#include "StdAfx.h" #include ".\actionadditem.h" #include "SigmaDoc.h" #include "SigmaView.h" #include "Visitor.h" NAction::CActionAddItem::CActionAddItem() : CActionItem(nullptr, 0) { } CActionAddItem::CActionAddItem(CSigmaDoc * ppDoc, UINT actionType, const CPositionList& list) : CActionItem(ppDoc, actionType) , m_bAdded(false) { Remember(list); CreatePos(); } CActionAddItem::CActionAddItem(CSigmaDoc * ppDoc, UINT actionType, COne* pOne) : CActionItem(ppDoc, actionType) , m_bAdded(false) , m_pos(NULL) { value.AddTail(pOne); CreatePos(); } CActionAddItem::~CActionAddItem(void) { if (!m_bAdded) Clear(value); //this COne associated with addAction is deleted when the action is deleted. //only if the object is not added in the document; } void CActionAddItem::Finish(void) { PerformOperation(); CActionItem::Finish(); } void NAction::CActionAddItem::accept(CActionVisitor& visitor) { visitor.visit(*this); } // Actually perform the operation, or tell the view to do it. Subclasses // should override to provide custom edit-like operations such as insert // date/time. void CActionAddItem::PerformOperation() { m_bAdded = true; } //Selection of object is not restored in the Undo. Because i don't think it is a state of CDocument, //though it is a state of CView. The real reason behind this is, it is not important //for users to retrieve what have been seleted after doing something. void CActionAddItem::Undo() { CActionItem::Undo(); //delete the new added obj; RemoveOperation(); m_bAdded = false; } void CActionAddItem::Redo() { CActionItem::Redo(); AddOperation(); // this is a one-shot action m_bAdded = true; } void CActionAddItem::AddOperation(void) { //add back all the objects according its position in the CDrawDoc::m_objects. int i=0; COne *pOne; POSITION p,pos=NULL; //CPositionList list; p=value.GetHeadPosition(); while(p) { pOne=(COne *)(value.GetNext(p)); if(!m_pos.empty()) pos=GetDoc()->GetDraw()->FindIndex(m_pos[i]); if(pos==NULL) pos=GetDoc()->GetDraw()->AddTailOne(pOne); else pos=GetDoc()->GetDraw()->InsertElementBefore(pos,pOne); //list.AddTail(pos); i++; } //GetDoc()->InvalidateSelection(list); //GetDoc()->SetSelection(list); } void CActionAddItem::RemoveOperation(void) { GetDoc()->ClearSelection(); COne* pOne; int n=0; CRect8 range(1e100,-1e100,-1e100,1e100); //delete all the regulation fist; POSITION pos = value.GetTailPosition(); while (pos != NULL) { pOne = (COne*)value.GetPrev(pos); pOne->GetRange(range); this->RemoveAt(pOne); } Invalidate(range); } int NAction::CActionAddItem::CreatePos(void) { if(value.IsEmpty()) return 0; m_pos.resize(value.GetCount()); long i=0; COne* pOne; POSITION pos, pt; pos=value.GetHeadPosition(); while(pos) { pOne=(COne*)value.GetNext(pos); pt=GetDoc()->GetDraw()->Find(pOne); m_pos[i++]=GetDoc()->GetDraw()->GetElementIndex(pt); } return (int)value.GetCount(); }