#include "wxsheaders.h"
#include "wxswinundobuffer.h"
#include "resources/wxswindowres.h"
#include "resources/wxswindowresdataobject.h"
#include "widget.h"
#include "wxswidgetfactory.h"
wxsWinUndoBuffer::wxsWinUndoBuffer(wxsWindowRes* _Resource,int _MaxEnteries):
Resource(_Resource),
CurrentPos(0),
SavedPos(-1),
MaxEnteries(_MaxEnteries)
{
}
wxsWinUndoBuffer::~wxsWinUndoBuffer()
{
Clear();
}
void wxsWinUndoBuffer::Clear()
{
for ( EnteriesI i = Enteries.begin(); i!=Enteries.end(); ++i )
{
delete *i;
}
Enteries.clear();
}
void wxsWinUndoBuffer::StoreChange()
{
// Removing all undo points after current one
int Size = GetCount();
while ( --Size > CurrentPos )
{
delete Enteries[Size];
Enteries.erase(Enteries.begin() + Size);
}
// Removing all outdated undos
if ( MaxEnteries > 0 )
{
Size = GetCount();
while ( Size-- > MaxEnteries-1 )
{
delete Enteries[0];
Enteries.erase(Enteries.begin());
SavedPos--;
}
}
// Adding new undo
wxsWindowResDataObject Object;
Object.AddWidget(Resource->GetRootWidget());
UndoEntry* NewEntry = new UndoEntry;
NewEntry->XmlData = Object.GetXmlData();
NewEntry->XmlData.Shrink();
// TODO (SpOoN#1#): Add selection
Enteries.push_back(NewEntry);
CurrentPos = Enteries.size()-1;
}
wxsWidget *wxsWinUndoBuffer::Undo()
{
if ( CurrentPos == 0 ) return NULL;
CurrentPos--;
return BuildResourceFromEntry(Enteries[CurrentPos]);
}
wxsWidget *wxsWinUndoBuffer::Redo()
{
if ( CurrentPos >= GetCount() - 1 ) return NULL;
CurrentPos++;
return BuildResourceFromEntry(Enteries[CurrentPos]);
}
wxsWidget* wxsWinUndoBuffer::BuildResourceFromEntry(UndoEntry* Entry)
{
wxsWindowResDataObject Object;
if ( !Object.SetXmlData(Entry->XmlData) ) return NULL;
return Object.BuildWidget(Resource);
}
syntax highlighted by Code2HTML, v. 0.9.1