X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCutAndPaste.cpp;h=901b7d7f4a6abafe0d4bcd587e91c64884f10506;hb=f83a38b3defc997f808539d0dfd618f5ba71e13c;hp=a9b8fc9b30acd6616cd021944d71e7c22e397020;hpb=763ef015ce995b7b46eb029af12ffab3f8810152;p=lyx.git diff --git a/src/CutAndPaste.cpp b/src/CutAndPaste.cpp index a9b8fc9b30..901b7d7f4a 100644 --- a/src/CutAndPaste.cpp +++ b/src/CutAndPaste.cpp @@ -17,6 +17,7 @@ #include "Buffer.h" #include "buffer_funcs.h" +#include "BufferList.h" #include "BufferParams.h" #include "BufferView.h" #include "Changes.h" @@ -95,7 +96,9 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist, Buffer const & buffer = cur.buffer(); pit_type pit = cur.pit(); pos_type pos = cur.pos(); - ParagraphList & pars = cur.text()->paragraphs(); + InsetText * target_inset = cur.inset().asInsetText(); + LASSERT(target_inset, return make_pair(PitPosPair(pit, pos), pit)); + ParagraphList & pars = target_inset->paragraphs(); if (parlist.empty()) return make_pair(PitPosPair(pit, pos), pit); @@ -112,48 +115,50 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist, // Convert newline to paragraph break in ERT inset. // This should not be here! - Inset * inset = pars[pit].inInset(); - if (inset && (inset->lyxCode() == ERT_CODE || - inset->lyxCode() == LISTINGS_CODE)) { + InsetCode const code = target_inset->lyxCode(); + if (code == ERT_CODE || code == LISTINGS_CODE) { for (size_t i = 0; i != insertion.size(); ++i) { for (pos_type j = 0; j != insertion[i].size(); ++j) { if (insertion[i].isNewline(j)) { // do not track deletion of newline insertion[i].eraseChar(j, false); + insertion[i].setInsetOwner(target_inset); breakParagraphConservative( buffer.params(), insertion, i, j); + break; } } } } - // set the paragraphs to empty layout if necessary + // set the paragraphs to plain layout if necessary if (cur.inset().usePlainLayout()) { bool forcePlainLayout = cur.inset().forcePlainLayout(); - Layout const & emptyLayout = newDocClass->emptyLayout(); + Layout const & plainLayout = newDocClass->plainLayout(); Layout const & defaultLayout = newDocClass->defaultLayout(); ParagraphList::iterator const end = insertion.end(); ParagraphList::iterator par = insertion.begin(); for (; par != end; ++par) { Layout const & parLayout = par->layout(); if (forcePlainLayout || parLayout == defaultLayout) - par->setLayout(emptyLayout); + par->setLayout(plainLayout); } - } else { // check if we need to reset from empty layout + } else { // check if we need to reset from plain layout Layout const & defaultLayout = newDocClass->defaultLayout(); - Layout const & emptyLayout = newDocClass->emptyLayout(); + Layout const & plainLayout = newDocClass->plainLayout(); ParagraphList::iterator const end = insertion.end(); ParagraphList::iterator par = insertion.begin(); for (; par != end; ++par) { Layout const & parLayout = par->layout(); - if (parLayout == emptyLayout) + if (parLayout == plainLayout) par->setLayout(defaultLayout); } } + InsetText in(buffer); // Make sure there is no class difference. - InsetText in; + in.paragraphs().clear(); // This works without copying any paragraph data because we have // a specialized swap method for ParagraphList. This is important // since we store pointers to insets at some places and we don't @@ -187,11 +192,11 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist, max_depth = tmpbuf->getMaxDepthAfter(); // Set the inset owner of this paragraph. - tmpbuf->setInsetOwner(pars[pit].inInset()); + tmpbuf->setInsetOwner(target_inset); for (pos_type i = 0; i < tmpbuf->size(); ++i) { // do not track deletion of invalid insets if (Inset * inset = tmpbuf->getInset(i)) - if (!pars[pit].insetAllowed(inset->lyxCode())) + if (!target_inset->insetAllowed(inset->lyxCode())) tmpbuf->eraseChar(i--, false); } @@ -283,6 +288,9 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist, // merge the first par of the insertion with the current par mergeParagraph(buffer.params(), pars, pit); } + //FIXME: We should call setBuffer() on each inserted paragraph. + // instead, we call setBuffer() for the main inset at the beginning + // of updateLabels() pit_type last_paste = pit + insertion.size() - 1; @@ -365,21 +373,23 @@ void putClipboard(ParagraphList const & paragraphs, // 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("", false); - buffer.setUnnamed(true); - buffer.paragraphs() = paragraphs; - buffer.params().setDocumentClass(docclass); + 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(); + buffer->paragraphs().clear(); } -void copySelectionHelper(Buffer const & buf, ParagraphList & pars, +void copySelectionHelper(Buffer const & buf, ParagraphList const & pars, pit_type startpit, pit_type endpit, int start, int end, DocumentClass const * const dc, CutStack & cutstack) { @@ -515,7 +525,7 @@ void switchBetweenClasses(DocumentClass const * const oldone, newtc.addLayoutIfNeeded(name); if (in.usePlainLayout()) - it->setLayout(newtc.emptyLayout()); + it->setLayout(newtc.plainLayout()); else it->setLayout(newtc[name]); } @@ -547,9 +557,11 @@ void switchBetweenClasses(DocumentClass const * const oldone, } -vector availableSelections() +vector availableSelections(Buffer const * buf) { vector selList; + if (!buf) + return selList; CutStack::const_iterator cit = theCuts.begin(); CutStack::const_iterator end = theCuts.end(); @@ -561,7 +573,10 @@ vector availableSelections() ParagraphList::const_iterator pit = pars.begin(); ParagraphList::const_iterator pend = pars.end(); for (; pit != pend; ++pit) { - asciiSel += pit->asString(AS_STR_INSETS); + Paragraph par(*pit, 0, 26); + // adapt paragraph to current buffer. + par.setBuffer(const_cast(*buf)); + asciiSel += par.asString(AS_STR_INSETS); if (asciiSel.size() > 25) { asciiSel.replace(22, docstring::npos, from_ascii("...")); @@ -662,7 +677,7 @@ void cutSelection(Cursor & cur, bool doclear, bool realcut) } -void copySelection(Cursor & cur) +void copySelection(Cursor const & cur) { copySelection(cur, cur.selectionAsString(true)); } @@ -670,7 +685,7 @@ void copySelection(Cursor & cur) namespace { -void copySelectionToStack(Cursor & cur, CutStack & cutstack) +void copySelectionToStack(Cursor const & cur, CutStack & cutstack) { // this doesn't make sense, if there is no selection if (!cur.selection()) @@ -706,8 +721,8 @@ void copySelectionToStack(Cursor & cur, CutStack & cutstack) ParagraphList pars; Paragraph par; BufferParams const & bp = cur.buffer().params(); - // FIXME This should be the empty layout...right? - par.setLayout(bp.documentClass().emptyLayout()); + // FIXME This should be the plain layout...right? + par.setLayout(bp.documentClass().plainLayout()); par.insert(0, grabSelection(cur), Font(), Change(Change::UNCHANGED)); pars.push_back(par); cutstack.push(make_pair(pars, bp.documentClassPtr())); @@ -724,7 +739,7 @@ void copySelectionToStack() } -void copySelection(Cursor & cur, docstring const & plaintext) +void copySelection(Cursor const & cur, docstring const & plaintext) { // In tablemode, because copy and paste actually use special table stack // we do not attempt to get selected paragraphs under cursor. Instead, a @@ -734,7 +749,7 @@ void copySelection(Cursor & cur, docstring const & plaintext) ParagraphList pars; Paragraph par; BufferParams const & bp = cur.buffer().params(); - par.setLayout(bp.documentClass().emptyLayout()); + par.setLayout(bp.documentClass().plainLayout()); par.insert(0, plaintext, Font(), Change(Change::UNCHANGED)); pars.push_back(par); theCuts.push(make_pair(pars, bp.documentClassPtr())); @@ -747,7 +762,7 @@ void copySelection(Cursor & cur, docstring const & plaintext) } -void saveSelection(Cursor & cur) +void saveSelection(Cursor const & cur) { // This function is called, not when a selection is formed, but when // a selection is cleared. Therefore, multiple keyboard selection @@ -755,7 +770,7 @@ void saveSelection(Cursor & cur) 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); } }