X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCutAndPaste.cpp;h=fdf609e6f5bd5502ec3406998bc1dcfc934ab1fe;hb=42eb8a373a35da02c45c0d225d37f5d677ddfc2d;hp=7e980ddd6ab62aeb4f824e332263807e9b09b699;hpb=ffc4554815531a9039c027cdc9ade143c048ce86;p=lyx.git diff --git a/src/CutAndPaste.cpp b/src/CutAndPaste.cpp index 7e980ddd6a..fdf609e6f5 100644 --- a/src/CutAndPaste.cpp +++ b/src/CutAndPaste.cpp @@ -22,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" @@ -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(); @@ -225,7 +209,7 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist, // check for duplicates InsetCommand & lab = static_cast(*it); docstring const oldname = lab.getParam("name"); - lab.update(oldname, false); + lab.updateCommand(oldname, false); docstring const newname = lab.getParam("name"); if (oldname != newname) { // adapt the references @@ -240,6 +224,25 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist, break; } + 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 } @@ -405,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()) @@ -415,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) { @@ -430,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()) @@ -444,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, @@ -913,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())