]> git.lyx.org Git - lyx.git/blobdiff - src/CutAndPaste.cpp
Some comments.
[lyx.git] / src / CutAndPaste.cpp
index f661b3462bf43a92d086c31ad2fbe8da91a56d41..a535a8255df284dc37fac236f90111de406bfaf9 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();
@@ -379,9 +363,9 @@ void copySelectionHelper(Buffer const & buf, ParagraphList & pars,
        pit_type startpit, pit_type endpit,
        int start, int end, DocumentClass const * const dc, CutStack & cutstack)
 {
-       BOOST_ASSERT(0 <= start && start <= pars[startpit].size());
-       BOOST_ASSERT(0 <= end && end <= pars[endpit].size());
-       BOOST_ASSERT(startpit != endpit || start <= end);
+       LASSERT(0 <= start && start <= pars[startpit].size(), /**/);
+       LASSERT(0 <= end && end <= pars[endpit].size(), /**/);
+       LASSERT(startpit != endpit || start <= end, /**/);
 
        // Clone the paragraphs within the selection.
        ParagraphList copy_pars(boost::next(pars.begin(), startpit),
@@ -424,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())
@@ -434,12 +434,51 @@ 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)
 {
        errorlist.clear();
 
-       BOOST_ASSERT(!in.paragraphs().empty());
+       LASSERT(!in.paragraphs().empty(), /**/);
        if (oldone == newone)
                return;
        
@@ -449,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())
@@ -463,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,
@@ -545,7 +584,7 @@ void cutSelection(Cursor & cur, bool doclear, bool realcut)
 
        if (cur.inTexted()) {
                Text * text = cur.text();
-               BOOST_ASSERT(text);
+               LASSERT(text, /**/);
 
                saveSelection(cur);
 
@@ -631,7 +670,7 @@ void copySelectionToStack(Cursor & cur, CutStack & cutstack)
 
        if (cur.inTexted()) {
                Text * text = cur.text();
-               BOOST_ASSERT(text);
+               LASSERT(text, /**/);
                // ok we have a selection. This is always between cur.selBegin()
                // and sel_end cursor
 
@@ -741,7 +780,7 @@ void pasteParagraphList(Cursor & cur, ParagraphList const & parlist,
 {
        if (cur.inTexted()) {
                Text * text = cur.text();
-               BOOST_ASSERT(text);
+               LASSERT(text, /**/);
 
                pit_type endpit;
                PitPosPair ppp;
@@ -754,7 +793,7 @@ void pasteParagraphList(Cursor & cur, ParagraphList const & parlist,
        }
 
        // mathed is handled in InsetMathNest/InsetMathGrid
-       BOOST_ASSERT(!cur.inMathed());
+       LASSERT(!cur.inMathed(), /**/);
 }
 
 
@@ -812,7 +851,7 @@ void pasteClipboardText(Cursor & cur, ErrorList & errorList, bool asParagraphs)
 void pasteClipboardGraphics(Cursor & cur, ErrorList & /* errorList */,
                            Clipboard::GraphicsType preferedType)
 {
-       BOOST_ASSERT(theClipboard().hasGraphicsContents(preferedType));
+       LASSERT(theClipboard().hasGraphicsContents(preferedType), /**/);
 
        // get picture from clipboard
        FileName filename = theClipboard().getAsGraphics(cur, preferedType);
@@ -820,9 +859,9 @@ void pasteClipboardGraphics(Cursor & cur, ErrorList & /* errorList */,
                return;
 
        // create inset for graphic
-       InsetGraphics * inset = new InsetGraphics;
+       InsetGraphics * inset = new InsetGraphics(cur.buffer());
        InsetGraphicsParams params;
-       params.filename = EmbeddedFile(filename.absFilename(), cur.buffer().filePath());
+       params.filename = support::DocFileName(filename.absFilename());
        inset->setParams(params);
        cur.recordUndo();
        cur.insert(inset);
@@ -932,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())