#include "BufferParams.h"
#include "buffer_funcs.h"
#include "Cursor.h"
+#include "CutAndPaste.h"
+#include "ErrorList.h"
#include "Paragraph.h"
#include "ParagraphList.h"
#include "Text.h"
#include "mathed/MathData.h"
#include "insets/Inset.h"
+#include "insets/InsetText.h"
#include "support/debug.h"
#include "support/gettext.h"
#include <algorithm>
#include <deque>
+#include <set>
using namespace std;
using namespace lyx::support;
// This is a params undo element
delete otherstack.top().bparams;
otherstack.top().bparams = new BufferParams(buffer_.params());
+ DocumentClassConstPtr olddc = buffer_.params().documentClassPtr();
buffer_.params() = *undo.bparams;
+ // The error list is not supposed to be helpful here.
+ ErrorList el;
+ cap::switchBetweenClasses(olddc, buffer_.params().documentClassPtr(),
+ static_cast<InsetText &>(buffer_.inset()), el);
+ LATTEST(el.empty());
} else if (dit.inMathed()) {
// We stored the full cell here as there is not much to be
// gained by storing just 'a few' paragraphs (most if not
for (; pit != end; ++pit)
pit->setInsetOwner(dit.realInset());
plist.insert(first, undo.pars->begin(), undo.pars->end());
+
+ // set the buffers for insets we created
+ ParagraphList::iterator fpit = plist.begin();
+ advance(fpit, undo.from);
+ ParagraphList::iterator fend = fpit;
+ advance(fend, undo.pars->size());
+ for (; fpit != fend; ++fpit)
+ fpit->setInsetBuffers(buffer_);
+
delete undo.pars;
undo.pars = 0;
}
const size_t gid = stack.top().group_id;
while (!stack.empty() && stack.top().group_id == gid)
doTextUndoOrRedo(cur, stack, otherstack);
-
- // Adapt the new material to current buffer.
- buffer_.setBuffersForInsets(); // FIXME This shouldn't be here.
return true;
}
/// UndoGroupHelper class stuff
+class UndoGroupHelper::Impl {
+ friend class UndoGroupHelper;
+ set<Buffer *> buffers_;
+};
+
+
+UndoGroupHelper::UndoGroupHelper(Buffer * buf) : d(new UndoGroupHelper::Impl)
+{
+ resetBuffer(buf);
+}
+
+
+UndoGroupHelper::~UndoGroupHelper()
+{
+ for (Buffer * buf : d->buffers_)
+ buf->undo().endUndoGroup();
+ delete d;
+}
+
void UndoGroupHelper::resetBuffer(Buffer * buf)
{
- if (buf == buffer_)
- return;
- if (buffer_)
- buffer_->undo().endUndoGroup();
- buffer_ = buf;
- if (buffer_)
- buffer_->undo().beginUndoGroup();
+ if (buf && d->buffers_.count(buf) == 0) {
+ d->buffers_.insert(buf);
+ buf->undo().beginUndoGroup();
+ }
}