////////////////////////////////////////////////////////////////////////////// //类: CActionSortItem //主要功能: // //程序编写: 2006-12-07 ///////////////////////////////////////////////////////////////////////////// #include "StdAfx.h" #include ".\actionsortitem.h" #include "SigmaDoc.h" #include "SigmaView.h" #include "Visitor.h" NAction::CActionSortItem::CActionSortItem() : CActionItem(nullptr, 0) { } CActionSortItem::CActionSortItem(CSigmaDoc * ppDoc, UINT actionType, const CPositionList& list, int nModeSel) : CActionItem(ppDoc, actionType) , m_nModeSel(nModeSel) { if(!list.IsEmpty()) { POSITION pos,pt; pt=list.GetHeadPosition(); while(pt) { pos=list.GetNext(pt); m_eleList.AddTail(pos); } long num=(long)list.GetCount(); m_oldPos.resize(num); switch(nModeSel) { case 0://最上显示 Movetofront(m_eleList); break; case 1://最下显示 Movetoback(m_eleList); break; case 2://上移一层 Moveforward(m_eleList); break; case 3://下移一层 Moveback(m_eleList); break; } GetDoc()->Modified(); GetDoc()->InvalidateSelection(m_eleList); } } CActionSortItem::~CActionSortItem(void) { } void NAction::CActionSortItem::Movetofront(CPositionList& list)//最上显示 { int i=0; POSITION p,pos; p=list.GetHeadPosition(); while(p) { pos=list.GetAt(p); m_oldPos[i]=GetDoc()->GetDraw()->GetElementIndex(pos); pos=GetDoc()->GetDraw()->MoveToFront(pos); if(pos) list.SetAt(p,pos); list.GetNext(p); i++; } } void NAction::CActionSortItem::Movetoback(CPositionList& list)//最下显示 { int i=(int)list.GetCount(); POSITION p,pos; p=list.GetTailPosition(); while(p) { i--; pos=list.GetAt(p); m_oldPos[i]=GetDoc()->GetDraw()->GetElementIndex(pos); pos=GetDoc()->GetDraw()->MoveToBack(pos); if(pos) list.SetAt(p,pos); list.GetPrev(p); } } void NAction::CActionSortItem::Moveforward(CPositionList& list)//上移一层 { int i=(int)list.GetCount(); POSITION p,pos; p=list.GetTailPosition(); while(p) { i--; pos=list.GetAt(p); m_oldPos[i]=GetDoc()->GetDraw()->GetElementIndex(pos); pos=GetDoc()->GetDraw()->MoveForward(pos); if(pos) list.SetAt(p,pos); list.GetPrev(p); } } void NAction::CActionSortItem::Moveback(CPositionList& list)//下移一层 { int i=0; POSITION p,pos; p=list.GetHeadPosition(); while(p) { pos=list.GetAt(p); m_oldPos[i]=GetDoc()->GetDraw()->GetElementIndex(pos); pos=GetDoc()->GetDraw()->MoveBackward(pos); if(pos) list.SetAt(p,pos); list.GetNext(p); i++; } } void CActionSortItem::Undo(void) { CActionItem::Undo(); int i; COne *pOne; POSITION p,pos; switch(m_nModeSel) { case 0://最上显示 case 3://下移一层 i=(int)m_eleList.GetCount(); p=m_eleList.GetTailPosition(); while(p) { i--; pos=m_eleList.GetAt(p); pOne=GetDoc()->GetDraw()->RemoveAtNoClear(pos); pos=GetDoc()->GetDraw()->FindIndex(m_oldPos[i]); if(pos==NULL) pos=GetDoc()->GetDraw()->AddTailOne(pOne); else pos=GetDoc()->GetDraw()->InsertElementBefore(pos,pOne); m_eleList.SetAt(p, pos); m_eleList.GetPrev(p); } break; case 1://最下显示 case 2://上移一层 i=0; p=m_eleList.GetHeadPosition(); while(p) { pos=m_eleList.GetAt(p); pOne=GetDoc()->GetDraw()->RemoveAtNoClear(pos); pos=GetDoc()->GetDraw()->FindIndex(m_oldPos[i]); if(pos==NULL) pos=GetDoc()->GetDraw()->AddTailOne(pOne); else pos=GetDoc()->GetDraw()->InsertElementBefore(pos,pOne); m_eleList.SetAt(p, pos); m_eleList.GetNext(p); i++; } break; } GetDoc()->InvalidateSelection(m_eleList); //GetDoc()->SetSelection(m_eleList); } void CActionSortItem::Redo(void) { CActionItem::Redo(); switch(m_nModeSel) { case 0://最上显示 Movetofront(m_eleList); break; case 1://最下显示 Movetoback(m_eleList); break; case 2://上移一层 Moveforward(m_eleList); break; case 3://下移一层 Moveback(m_eleList); break; } GetDoc()->InvalidateSelection(m_eleList); } void NAction::CActionSortItem::accept(CActionVisitor& visitor) { visitor.visit(*this); } void NAction::CActionSortItem::GetElementList(CPositionList& list) { POSITION pos,pt; pt=m_eleList.GetHeadPosition(); while(pt) { pos=m_eleList.GetNext(pt); list.AddTail(pos); } }