X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCutAndPaste.cpp;h=fdf609e6f5bd5502ec3406998bc1dcfc934ab1fe;hb=42eb8a373a35da02c45c0d225d37f5d677ddfc2d;hp=975cf789c9f8ca3beee989df09b2a8539ca91598;hpb=d8a6b5bfd0baa02a4ba03f8c9e9c618baf41b03f;p=lyx.git diff --git a/src/CutAndPaste.cpp b/src/CutAndPaste.cpp index 975cf789c9..fdf609e6f5 100644 --- a/src/CutAndPaste.cpp +++ b/src/CutAndPaste.cpp @@ -15,7 +15,6 @@ #include "CutAndPaste.h" -#include "BaseClassList.h" #include "Buffer.h" #include "buffer_funcs.h" #include "BufferParams.h" @@ -23,11 +22,11 @@ #include "Changes.h" #include "Cursor.h" #include "ErrorList.h" +#include "FuncCode.h" #include "FuncRequest.h" #include "InsetIterator.h" #include "InsetList.h" #include "Language.h" -#include "lfuns.h" #include "LyXFunc.h" #include "LyXRC.h" #include "Text.h" @@ -38,6 +37,7 @@ #include "Undo.h" #include "insets/InsetFlex.h" +#include "insets/InsetCommand.h" #include "insets/InsetGraphics.h" #include "insets/InsetGraphicsParams.h" #include "insets/InsetTabular.h" @@ -82,22 +82,6 @@ CutStack selectionBuffer(1); bool dirty_tabular_stack_ = false; -void region(CursorSlice const & i1, CursorSlice const & i2, - Inset::row_type & r1, Inset::row_type & r2, - Inset::col_type & c1, Inset::col_type & c2) -{ - Inset & p = i1.inset(); - c1 = p.col(i1.idx()); - c2 = p.col(i2.idx()); - if (c1 > c2) - swap(c1, c2); - r1 = p.row(i1.idx()); - r2 = p.row(i2.idx()); - if (r1 > r2) - swap(r1, r2); -} - - bool checkPastePossible(int index) { return size_t(index) < theCuts.size() && !theCuts[index].first.empty(); @@ -147,7 +131,7 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist, // 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()) { - LayoutPtr const layout = + Layout const & layout = buffer.params().documentClass().emptyLayout(); ParagraphList::iterator const end = insertion.end(); for (ParagraphList::iterator par = insertion.begin(); @@ -213,14 +197,55 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist, // A couple of insets store buffer references so need updating. insertion.swap(in.paragraphs()); - ParIterator fpit = par_iterator_begin(in); - ParIterator fend = par_iterator_end(in); + InsetIterator const i_end = inset_iterator_end(in); + + for (InsetIterator it = inset_iterator_begin(in); it != i_end; ++it) { + + it->setBuffer(const_cast(buffer)); + + switch (it->lyxCode()) { + + case LABEL_CODE: { + // check for duplicates + InsetCommand & lab = static_cast(*it); + docstring const oldname = lab.getParam("name"); + lab.updateCommand(oldname, false); + docstring const newname = lab.getParam("name"); + if (oldname != newname) { + // adapt the references + for (InsetIterator itt = inset_iterator_begin(in); itt != i_end; ++itt) { + if (itt->lyxCode() == REF_CODE) { + InsetCommand & ref = dynamic_cast(*itt); + if (ref.getParam("reference") == oldname) + ref.setParam("reference", newname); + } + } + } + break; + } - for (; fpit != fend; ++fpit) { - InsetList::const_iterator it = fpit->insetList().begin(); - InsetList::const_iterator et = fpit->insetList().end(); - for (; it != et; ++it) - it->inset->setBuffer(const_cast(buffer)); + case BIBITEM_CODE: { + // check for duplicates + InsetCommand & bib = static_cast(*it); + docstring const oldkey = bib.getParam("key"); + bib.updateCommand(oldkey, false); + docstring const newkey = bib.getParam("key"); + if (oldkey != newkey) { + // adapt the references + for (InsetIterator itt = inset_iterator_begin(in); itt != i_end; ++itt) { + if (itt->lyxCode() == CITE_CODE) { + InsetCommand & ref = dynamic_cast(*itt); + if (ref.getParam("key") == oldkey) + ref.setParam("key", newkey); + } + } + } + break; + } + + default: + break; // nothing + } } insertion.swap(in.paragraphs()); @@ -383,6 +408,22 @@ void copySelectionHelper(Buffer const & buf, ParagraphList & pars, namespace cap { +void region(CursorSlice const & i1, CursorSlice const & i2, + Inset::row_type & r1, Inset::row_type & r2, + Inset::col_type & c1, Inset::col_type & c2) +{ + Inset & p = i1.inset(); + c1 = p.col(i1.idx()); + c2 = p.col(i2.idx()); + if (c1 > c2) + swap(c1, c2); + r1 = p.row(i1.idx()); + r2 = p.row(i2.idx()); + if (r1 > r2) + swap(r1, r2); +} + + docstring grabAndEraseSelection(Cursor & cur) { if (!cur.selection()) @@ -393,6 +434,45 @@ docstring grabAndEraseSelection(Cursor & cur) } +bool reduceSelectionToOneCell(Cursor & cur) +{ + if (!cur.selection() || !cur.inMathed()) + return false; + + CursorSlice i1 = cur.selBegin(); + CursorSlice i2 = cur.selEnd(); + if (!i1.inset().asInsetMath()) + return false; + + // the easy case: do nothing if only one cell is selected + if (i1.idx() == i2.idx()) + return true; + + cur.top().pos() = 0; + cur.resetAnchor(); + cur.top().pos() = cur.top().lastpos(); + + return true; +} + + +bool multipleCellsSelected(Cursor const & cur) +{ + if (!cur.selection() || !cur.inMathed()) + return false; + + CursorSlice i1 = cur.selBegin(); + CursorSlice i2 = cur.selEnd(); + if (!i1.inset().asInsetMath()) + return false; + + if (i1.idx() == i2.idx()) + return false; + + return true; +} + + void switchBetweenClasses(DocumentClass const * const oldone, DocumentClass const * const newone, InsetText & in, ErrorList & errorlist) { @@ -408,7 +488,7 @@ void switchBetweenClasses(DocumentClass const * const oldone, // layouts ParIterator end = par_iterator_end(in); for (ParIterator it = par_iterator_begin(in); it != end; ++it) { - docstring const name = it->layout()->name(); + docstring const name = it->layout().name(); bool hasLayout = newtc.hasLayout(name); if (in.useEmptyLayout()) @@ -422,7 +502,7 @@ void switchBetweenClasses(DocumentClass const * const oldone, 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(), + 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, @@ -891,8 +971,10 @@ docstring grabSelection(Cursor const & cur) if (!cur.selection()) return docstring(); - // FIXME: What is wrong with the following? #if 0 + // grab selection by glueing multiple cells together. This is not what + // we want because selections spanning multiple cells will get "&" and "\\" + // seperators. ostringstream os; for (DocIterator dit = cur.selectionBegin(); dit != cur.selectionEnd(); dit.forwardPos())