]> git.lyx.org Git - lyx.git/blobdiff - src/CutAndPaste.cpp
Cosmetics.
[lyx.git] / src / CutAndPaste.cpp
index 7e980ddd6ab62aeb4f824e332263807e9b09b699..fdf609e6f5bd5502ec3406998bc1dcfc934ab1fe 100644 (file)
 #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<InsetCommand &>(*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<InsetCommand &>(*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<InsetCommand &>(*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())