#include "Buffer.h"
#include "buffer_funcs.h"
+#include "BufferList.h"
#include "BufferParams.h"
#include "BufferView.h"
#include "Changes.h"
pair<PitPosPair, pit_type>
pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist,
- DocumentClass const * const docclass, ErrorList & errorlist)
+ DocumentClass const * const oldDocClass, ErrorList & errorlist)
{
Buffer const & buffer = cur.buffer();
pit_type pit = cur.pit();
// Make a copy of the CaP paragraphs.
ParagraphList insertion = parlist;
- DocumentClass const * const tc = buffer.params().documentClassPtr();
+ DocumentClass const * const newDocClass =
+ buffer.params().documentClassPtr();
// Now remove all out of the pars which is NOT allowed in the
// new environment and set also another font if that is required.
breakParagraphConservative(
buffer.params(),
insertion, i, j);
+ break;
}
}
}
}
// set the paragraphs to empty layout if necessary
- // note that we are doing this if the empty layout is
- // supposed to be the default, not just if it is forced
- if (cur.inset().useEmptyLayout()) {
- Layout const & layout =
- buffer.params().documentClass().emptyLayout();
+ if (cur.inset().usePlainLayout()) {
+ bool forcePlainLayout = cur.inset().forcePlainLayout();
+ Layout const & emptyLayout = newDocClass->emptyLayout();
+ Layout const & defaultLayout = newDocClass->defaultLayout();
ParagraphList::iterator const end = insertion.end();
- for (ParagraphList::iterator par = insertion.begin();
- par != end; ++par)
- par->setLayout(layout);
+ ParagraphList::iterator par = insertion.begin();
+ for (; par != end; ++par) {
+ Layout const & parLayout = par->layout();
+ if (forcePlainLayout || parLayout == defaultLayout)
+ par->setLayout(emptyLayout);
+ }
+ } else { // check if we need to reset from empty layout
+ Layout const & defaultLayout = newDocClass->defaultLayout();
+ Layout const & emptyLayout = newDocClass->emptyLayout();
+ ParagraphList::iterator const end = insertion.end();
+ ParagraphList::iterator par = insertion.begin();
+ for (; par != end; ++par) {
+ Layout const & parLayout = par->layout();
+ if (parLayout == emptyLayout)
+ par->setLayout(defaultLayout);
+ }
}
// Make sure there is no class difference.
// since we store pointers to insets at some places and we don't
// want to invalidate them.
insertion.swap(in.paragraphs());
- cap::switchBetweenClasses(docclass, tc, in, errorlist);
+ cap::switchBetweenClasses(oldDocClass, newDocClass, in, errorlist);
insertion.swap(in.paragraphs());
ParagraphList::iterator tmpbuf = insertion.begin();
{
// For some strange reason gcc 3.2 and 3.3 do not accept
// Buffer buffer(string(), false);
- Buffer buffer("", false);
- buffer.setUnnamed(true);
- buffer.paragraphs() = paragraphs;
- buffer.params().setDocumentClass(docclass);
+ // This needs to be static to avoid a memory leak. When a Buffer is
+ // constructed, it constructs a BufferParams, which in turn constructs
+ // a DocumentClass, via new, that is never deleted. If we were to go to
+ // some kind of garbage collection there, or a shared_ptr, then this
+ // would not be needed.
+ static Buffer * buffer = theBufferList().newBuffer(
+ FileName::tempName().absFilename() + "_clipboard.internal");
+ buffer->setUnnamed(true);
+ buffer->paragraphs() = paragraphs;
+ buffer->inset().setBuffer(*buffer);
+ buffer->params().setDocumentClass(docclass);
ostringstream lyx;
- if (buffer.write(lyx))
+ if (buffer->write(lyx))
theClipboard().put(lyx.str(), plaintext);
else
theClipboard().put(string(), plaintext);
+ // Save that memory
+ buffer->paragraphs().clear();
}
pit_type startpit, pit_type endpit,
int start, int end, DocumentClass const * const dc, CutStack & cutstack)
{
- BOOST_ASSERT(0 <= start && start <= pars[startpit].size());
- BOOST_ASSERT(0 <= end && end <= pars[endpit].size());
- BOOST_ASSERT(startpit != endpit || start <= end);
+ LASSERT(0 <= start && start <= pars[startpit].size(), /**/);
+ LASSERT(0 <= end && end <= pars[endpit].size(), /**/);
+ LASSERT(startpit != endpit || start <= end, /**/);
// Clone the paragraphs within the selection.
ParagraphList copy_pars(boost::next(pars.begin(), startpit),
{
errorlist.clear();
- BOOST_ASSERT(!in.paragraphs().empty());
+ LASSERT(!in.paragraphs().empty(), /**/);
if (oldone == newone)
return;
ParIterator end = par_iterator_end(in);
for (ParIterator it = par_iterator_begin(in); it != end; ++it) {
docstring const name = it->layout().name();
- bool hasLayout = newtc.hasLayout(name);
- if (in.useEmptyLayout())
+ // the pasted text will keep their own layout name. If this layout does
+ // not exist in the new document, it will behave like a standard layout.
+ newtc.addLayoutIfNeeded(name);
+
+ if (in.usePlainLayout())
it->setLayout(newtc.emptyLayout());
- else if (hasLayout)
- it->setLayout(newtc[name]);
else
- it->setLayout(newtc.defaultLayout());
-
- if (!hasLayout && name != oldtc.defaultLayoutName()) {
- docstring const s = bformat(
- _("Layout had to be changed from\n%1$s to %2$s\n"
- "because of class conversion from\n%3$s to %4$s"),
- name, it->layout().name(),
- from_utf8(oldtc.name()), from_utf8(newtc.name()));
- // To warn the user that something had to be done.
- errorlist.push_back(ErrorItem(_("Changed Layout"), s,
- it->id(), 0,
- it->size()));
- }
+ it->setLayout(newtc[name]);
}
// character styles
ParagraphList::const_iterator pit = pars.begin();
ParagraphList::const_iterator pend = pars.end();
for (; pit != pend; ++pit) {
- asciiSel += pit->asString(false);
+ asciiSel += pit->asString(AS_STR_INSETS);
if (asciiSel.size() > 25) {
asciiSel.replace(22, docstring::npos,
from_ascii("..."));
if (cur.inTexted()) {
Text * text = cur.text();
- BOOST_ASSERT(text);
+ LASSERT(text, /**/);
saveSelection(cur);
cur.selectionAsString(true));
}
+ if (begpit != endpit)
+ cur.updateFlags(Update::Force | Update::FitCursor);
+
boost::tie(endpit, endpos) =
eraseSelectionHelper(bp,
text->paragraphs(),
if (cur.inTexted()) {
Text * text = cur.text();
- BOOST_ASSERT(text);
+ LASSERT(text, /**/);
// ok we have a selection. This is always between cur.selBegin()
// and sel_end cursor
if (cur.selection()
&& cur.selBegin() == cur.bv().cursor().selBegin()
&& cur.selEnd() == cur.bv().cursor().selEnd()) {
- LYXERR(Debug::ACTION, "'" << cur.selectionAsString(true) << "'");
+ LYXERR(Debug::SELECTION, "saveSelection: '" << cur.selectionAsString(true) << "'");
copySelectionToStack(cur, selectionBuffer);
}
}
docstring selection(size_t sel_index)
{
return sel_index < theCuts.size()
- ? theCuts[sel_index].first.back().asString(false)
+ ? theCuts[sel_index].first.back().asString(AS_STR_INSETS)
: docstring();
}
{
if (cur.inTexted()) {
Text * text = cur.text();
- BOOST_ASSERT(text);
+ LASSERT(text, /**/);
pit_type endpit;
PitPosPair ppp;
}
// mathed is handled in InsetMathNest/InsetMathGrid
- BOOST_ASSERT(!cur.inMathed());
+ LASSERT(!cur.inMathed(), /**/);
}
void pasteClipboardGraphics(Cursor & cur, ErrorList & /* errorList */,
Clipboard::GraphicsType preferedType)
{
- BOOST_ASSERT(theClipboard().hasGraphicsContents(preferedType));
+ LASSERT(theClipboard().hasGraphicsContents(preferedType), /**/);
// get picture from clipboard
FileName filename = theClipboard().getAsGraphics(cur, preferedType);
return;
// create inset for graphic
- InsetGraphics * inset = new InsetGraphics;
+ InsetGraphics * inset = new InsetGraphics(cur.buffer());
InsetGraphicsParams params;
- params.filename = EmbeddedFile(filename.absFilename(), cur.buffer().filePath());
+ params.filename = support::DocFileName(filename.absFilename());
inset->setParams(params);
cur.recordUndo();
cur.insert(inset);