X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCutAndPaste.C;h=36c863428ff1f183dce6c9092f39c18c789aea12;hb=c544107e324090c6eafb4c56749da2624b9b1122;hp=c2c4c04b37bd1e41d9ec5891b9431f013c5cd6b8;hpb=d605c30d8cfdba7ab14c111b0cbe4b9d4fdbacc4;p=lyx.git diff --git a/src/CutAndPaste.C b/src/CutAndPaste.C index c2c4c04b37..36c863428f 100644 --- a/src/CutAndPaste.C +++ b/src/CutAndPaste.C @@ -2,8 +2,9 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * - * \author Jurgen Vigna + * \author Juergen Vigna * \author Lars Gullik Bjønnes + * \author Alfredo Braunstein * * Full author contact details are available in file CREDITS */ @@ -24,8 +25,8 @@ #include "gettext.h" #include "paragraph_funcs.h" #include "debug.h" - -#include "insets/inseterror.h" +#include "insets/insetinclude.h" +#include "insets/insettabular.h" #include "support/LAssert.h" #include "support/lstrings.h" @@ -35,50 +36,66 @@ using std::endl; using std::pair; using std::make_pair; using std::for_each; +using std::vector; +using namespace lyx::support; using lyx::pos_type; using lyx::textclass_type; -extern BufferView * current_view; - -// Jürgen, note that this means that you cannot currently have a list -// of selections cut/copied. So IMHO later we should have a -// list/vector/deque that we could store -// struct selection_item { -// ParagraphList copy_pars; -// LyXTextClassList::size_type textclass; -// }; -// in and some method of choosing beween them (based on the first few chars -// in the selection probably.) This would be a nice feature and quite -// easy to implement. (Lgb) -// -// Sure but I just cleaned up this code for now with the same functionality -// as before. I also want to add a XClipboard function so that we can copy -// text from LyX to some other X-application in the form of ASCII or in the -// form of LaTeX (or Docbook depending on the document-class!). Think how nice -// it could be to select a math-inset do a "Copy to X-Clipboard as LaTeX" and -// then do a middle mouse button click in the application you want and have -// the whole formula there in LaTeX-Code. (Jug) + +typedef limited_stack > CutStack; namespace { -limited_stack > cuts(10); +CutStack cuts(10); } // namespace anon -PitPosPair CutAndPaste::cutSelection(ParagraphList & pars, + +std::vector +CutAndPaste::availableSelections(Buffer const & buffer) +{ + vector selList; + + CutStack::const_iterator cit = cuts.begin(); + CutStack::const_iterator end = cuts.end(); + for (; cit != end; ++cit) { + // we do not use cit-> here because gcc 2.9x does not + // like it (JMarc) + ParagraphList const & pars = (*cit).first; + string asciiSel; + ParagraphList::const_iterator pit = pars.begin(); + ParagraphList::const_iterator pend = pars.end(); + for (; pit != pend; ++pit) { + asciiSel += pit->asString(&buffer, false); + if (asciiSel.size() > 25) { + asciiSel.replace(22, string::npos, "..."); + break; + } + } + + selList.push_back(asciiSel); + } + + return selList; +} + + +PitPosPair CutAndPaste::cutSelection(BufferParams const & params, + ParagraphList & pars, ParagraphList::iterator startpit, ParagraphList::iterator endpit, int startpos, int endpos, textclass_type tc, bool doclear) { copySelection(startpit, endpit, startpos, endpos, tc); - return eraseSelection(pars, startpit, endpit, startpos, + return eraseSelection(params, pars, startpit, endpit, startpos, endpos, doclear); } -PitPosPair CutAndPaste::eraseSelection(ParagraphList & pars, +PitPosPair CutAndPaste::eraseSelection(BufferParams const & params, + ParagraphList & pars, ParagraphList::iterator startpit, ParagraphList::iterator endpit, int startpos, int endpos, bool doclear) @@ -138,10 +155,7 @@ PitPosPair CutAndPaste::eraseSelection(ParagraphList & pars, if (all_erased && (startpit->hasSameLayout(*boost::next(startpit)) || boost::next(startpit)->empty())) { -#warning current_view used here. -// should we pass buffer or buffer->params around? - Buffer * buffer = current_view->buffer(); - mergeParagraph(buffer->params, pars, startpit); + mergeParagraph(params, pars, startpit); // this because endpar gets deleted here! endpit = startpit; endpos = startpos; @@ -167,11 +181,9 @@ bool CutAndPaste::copySelection(ParagraphList::iterator startpit, ParagraphList::iterator endpit, int start, int end, textclass_type tc) { - lyx::Assert(&*startpit); - lyx::Assert(&*endpit); - lyx::Assert(0 <= start && start <= startpit->size()); - lyx::Assert(0 <= end && end <= endpit->size()); - lyx::Assert(startpit != endpit || start <= end); + Assert(0 <= start && start <= startpit->size()); + Assert(0 <= end && end <= endpit->size()); + Assert(startpit != endpit || start <= end); ParagraphList paragraphs; @@ -196,16 +208,19 @@ bool CutAndPaste::copySelection(ParagraphList::iterator startpit, pair -CutAndPaste::pasteSelection(ParagraphList & pars, +CutAndPaste::pasteSelection(Buffer const & buffer, + ParagraphList & pars, ParagraphList::iterator pit, int pos, textclass_type tc, ErrorList & errorlist) { - return pasteSelection(pars, pit, pos, tc, 0, errorlist); + return pasteSelection(buffer, pars, pit, pos, tc, 0, errorlist); } + pair -CutAndPaste::pasteSelection(ParagraphList & pars, +CutAndPaste::pasteSelection(Buffer const & buffer, + ParagraphList & pars, ParagraphList::iterator pit, int pos, textclass_type tc, size_t cut_index, ErrorList & errorlist) @@ -213,7 +228,7 @@ CutAndPaste::pasteSelection(ParagraphList & pars, if (!checkPastePossible()) return make_pair(PitPosPair(pit, pos), pit); - lyx::Assert (pos <= pit->size()); + Assert (pos <= pit->size()); // Make a copy of the CaP paragraphs. ParagraphList simple_cut_clone = cuts[cut_index].first; @@ -258,7 +273,7 @@ CutAndPaste::pasteSelection(ParagraphList & pars, tmpbuf->erase(i--); } } else { - LyXFont f1 = tmpbuf->getFont(current_view->buffer()->params, i, outerFont(pit, pars)); + LyXFont f1 = tmpbuf->getFont(buffer.params, i, outerFont(pit, pars)); LyXFont f2 = f1; if (!pit->checkInsertChar(f1)) { tmpbuf->erase(i--); @@ -273,12 +288,44 @@ CutAndPaste::pasteSelection(ParagraphList & pars, // the cursor paragraph. simple_cut_clone.begin()->makeSameLayout(*pit); + // Prepare the paragraphs and insets for insertion + // A couple of insets store buffer references so need + // updating + ParIterator fpit(simple_cut_clone.begin(), simple_cut_clone); + ParIterator fend(simple_cut_clone.end(), simple_cut_clone); + + for (; fpit != fend; ++fpit) { + InsetList::iterator lit = fpit->insetlist.begin(); + InsetList::iterator eit = fpit->insetlist.end(); + + for (; lit != eit; ++lit) { + switch (lit->inset->lyxCode()) { + case InsetOld::INCLUDE_CODE: { + InsetInclude * ii = static_cast(lit->inset); + InsetInclude::Params ip = ii->params(); + ip.masterFilename_ = buffer.fileName(); + ii->set(ip); + break; + } + + case InsetOld::TABULAR_CODE: { + InsetTabular * it = static_cast(lit->inset); + it->buffer(const_cast(&buffer)); + break; + } + + default: + break; // nothing + } + } + } + bool paste_the_end = false; // Open the paragraph for inserting the buf // if necessary. if (pit->size() > pos || boost::next(pit) == pars.end()) { - breakParagraphConservative(current_view->buffer()->params, + breakParagraphConservative(buffer.params, pars, pit, pos); paste_the_end = true; } @@ -296,7 +343,7 @@ CutAndPaste::pasteSelection(ParagraphList & pars, if (boost::next(pit) == last_paste) last_paste = pit; - mergeParagraph(current_view->buffer()->params, pars, pit); + mergeParagraph(buffer.params, pars, pit); // Store the new cursor position. pit = last_paste; @@ -307,15 +354,15 @@ CutAndPaste::pasteSelection(ParagraphList & pars, if (boost::next(last_paste) != pars.end() && paste_the_end) { if (boost::next(last_paste)->hasSameLayout(*last_paste)) { - mergeParagraph(current_view->buffer()->params, pars, + mergeParagraph(buffer.params, pars, last_paste); } else if (boost::next(last_paste)->empty()) { boost::next(last_paste)->makeSameLayout(*last_paste); - mergeParagraph(current_view->buffer()->params, pars, + mergeParagraph(buffer.params, pars, last_paste); } else if (last_paste->empty()) { last_paste->makeSameLayout(*boost::next(last_paste)); - mergeParagraph(current_view->buffer()->params, pars, + mergeParagraph(buffer.params, pars, last_paste); } else boost::next(last_paste)->stripLeadingSpaces(); @@ -336,7 +383,7 @@ int CutAndPaste::SwitchLayoutsBetweenClasses(textclass_type c1, ParagraphList & pars, ErrorList & errorlist) { - lyx::Assert(!pars.empty()); + Assert(!pars.empty()); int ret = 0; if (c1 == c2) @@ -346,25 +393,24 @@ int CutAndPaste::SwitchLayoutsBetweenClasses(textclass_type c1, LyXTextClass const & tclass2 = textclasslist[c2]; ParIterator end = ParIterator(pars.end(), pars); for (ParIterator it = ParIterator(pars.begin(), pars); it != end; ++it) { - Paragraph * par = &*(*it); - string const name = par->layout()->name(); + string const name = it->layout()->name(); bool hasLayout = tclass2.hasLayout(name); if (hasLayout) - par->layout(tclass2[name]); + it->layout(tclass2[name]); else - par->layout(tclass2.defaultLayout()); + it->layout(tclass2.defaultLayout()); if (!hasLayout && name != tclass1.defaultLayoutName()) { ++ret; string 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, par->layout()->name(), tclass1.name(), tclass2.name()); + name, it->layout()->name(), tclass1.name(), tclass2.name()); // To warn the user that something had to be done. errorlist.push_back(ErrorItem("Changed Layout", s, - par->id(), 0, - par->size())); + it->id(), 0, + it->size())); } } return ret;