[Racer-svn] SF.net SVN: racer:[95] trunk/libtrack/document
Status: Alpha
Brought to you by:
jlegg
From: <jl...@us...> - 2009-11-28 03:29:52
|
Revision: 95 http://racer.svn.sourceforge.net/racer/?rev=95&view=rev Author: jlegg Date: 2009-11-28 03:29:45 +0000 (Sat, 28 Nov 2009) Log Message: ----------- Add StackableDelta class: base class for DocumentDeltas that want to apply multiple document deltas as one action. Modified Paths: -------------- trunk/libtrack/document/Makefile.am Added Paths: ----------- trunk/libtrack/document/StackableDelta.cpp trunk/libtrack/document/StackableDelta.h Modified: trunk/libtrack/document/Makefile.am =================================================================== --- trunk/libtrack/document/Makefile.am 2009-11-27 15:55:19 UTC (rev 94) +++ trunk/libtrack/document/Makefile.am 2009-11-28 03:29:45 UTC (rev 95) @@ -1,5 +1,5 @@ noinst_LIBRARIES = libdocument.a -libdocument_a_SOURCES = ChangeEdgeSegmentDelta.cpp ChangeEdgeSegmentDelta.h ChangePropertyDelta.h ChangeVertexSegmentDelta.cpp ChangeVertexSegmentDelta.h Document.cpp Document.h DocumentDelta.cpp DocumentDelta.h MoveNodeDelta.cpp MoveNodeDelta.h RotateVertexDelta.h RotateVertexDelta.cpp +libdocument_a_SOURCES = ChangeEdgeSegmentDelta.cpp ChangeEdgeSegmentDelta.h ChangePropertyDelta.h ChangeVertexSegmentDelta.cpp ChangeVertexSegmentDelta.h Document.cpp Document.h DocumentDelta.cpp DocumentDelta.h MoveNodeDelta.cpp MoveNodeDelta.h RotateVertexDelta.h RotateVertexDelta.cpp StackableDelta.cpp StackableDelta.h libdocument_a_CPPFLAGS = $(debug_specific_CFLAGS) $(libtrack_CFLAGS) -I@top_srcdir@ libdocument_a_AR=$(AR) $(ARFLAGS)T Added: trunk/libtrack/document/StackableDelta.cpp =================================================================== --- trunk/libtrack/document/StackableDelta.cpp (rev 0) +++ trunk/libtrack/document/StackableDelta.cpp 2009-11-28 03:29:45 UTC (rev 95) @@ -0,0 +1,40 @@ +/** @file document/StackableDelta.cpp + * @brief Implement the Document::StackableDelta class. + * @author James Legg + */ +/* Copyright © 2009 James Legg. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. +*/ + +#include "StackableDelta.h" + +namespace Document +{ + +StackableDelta::StackableDelta() +{ +} + +StackableDelta::~StackableDelta() +{ +} + +void StackableDelta::unapply(Track::Track & track) +{ + while (!delta_stack.empty()) + { + delta_stack.back()->unapply(track); + delta_stack.pop_back(); + } +} + +void StackableDelta::add_to_stack(boost::shared_ptr<DocumentDelta> delta, Track::Track & track) +{ + delta_stack.push_back(delta); + delta->apply(track); +} + +} // Document namespace Added: trunk/libtrack/document/StackableDelta.h =================================================================== --- trunk/libtrack/document/StackableDelta.h (rev 0) +++ trunk/libtrack/document/StackableDelta.h 2009-11-28 03:29:45 UTC (rev 95) @@ -0,0 +1,58 @@ +/** @file document/StackableDelta.h + * @brief Declare the Document::StackableDelta class. + * @author James Legg + */ +/* Copyright © 2009 James Legg. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. +*/ +#ifndef LIBTRACK_DOCUMENT_STACKABLE_DELTA_H_ +#define LIBTRACK_DOCUMENT_STACKABLE_DELTA_H_ + +#include <vector> + +#include <boost/shared_ptr.hpp> + +#include "DocumentDelta.h" + + +namespace Document +{ + +/** A DocumentDelta that will combine the effects of other DocumentDeltas. + * You can stack document deltas up in the apply() function using + * add_to_stack(delta, track). + */ +class StackableDelta +{ +public: + StackableDelta(); + virtual ~StackableDelta(); + + /** Create a stack of DocumentDeltas. + * Use only add_to_stack() to change the track, so that changes can be + * reversed. + * @param track The track to apply the changes to. + */ + virtual void apply(Track::Track & track) = 0; + /** Undo the stack of DocumentDeltas created in apply(). + */ + void unapply(Track::Track & track); +protected: + /** Apply and record a change. + * This will perform the apply command for the DocumentDelta you pass in, + * and record it so that it can be undone later. + * @param delta shared pointer to the DocumentDelta to apply. + * @param track The Track::Track to apply it to. + */ + void add_to_stack(boost::shared_ptr<DocumentDelta> delta, Track::Track & track); +private: + /// The DocumentDeltas currently ready to be undone, last first. + std::vector<boost::shared_ptr<DocumentDelta> > delta_stack; +}; + +} // Document namespace + +#endif // LIBTRACK_DOCUMENT_STACKABLE_DELTA_H_ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |