]> git.lyx.org Git - lyx.git/blobdiff - src/Cursor.cpp
Kornel's gcc compile fix.
[lyx.git] / src / Cursor.cpp
index 85607b218239ebba459bacee72d5e2bee3d09397..9b6c82dcd852028e956cdc8ec76fbad55a406bac 100644 (file)
@@ -28,7 +28,6 @@
 #include "Language.h"
 #include "LyXFunc.h" // only for setMessage()
 #include "LyXRC.h"
-#include "paragraph_funcs.h"
 #include "Paragraph.h"
 #include "ParIterator.h"
 #include "Row.h"
@@ -246,16 +245,6 @@ bool bruteFind3(Cursor & cur, int x, int y, bool up)
        return true;
 }
 
-docstring parbreak(Paragraph const & par)
-{
-       odocstringstream os;
-       os << '\n';
-       // only add blank line if we're not in an ERT or Listings inset
-       if (par.ownerCode() != ERT_CODE && par.ownerCode() != LISTINGS_CODE)
-               os << '\n';
-       return os.str();
-}
-
 } // namespace anon
 
 
@@ -297,6 +286,8 @@ void Cursor::dispatch(FuncRequest const & cmd0)
        fixIfBroken();
        FuncRequest cmd = cmd0;
        Cursor safe = *this;
+
+       buffer()->undo().beginUndoGroup();
        
        // store some values to be used inside of the handlers
        beforeDispatchCursor_ = *this;
@@ -338,6 +329,7 @@ void Cursor::dispatch(FuncRequest const & cmd0)
                // are possible which would change it
                beforeDispatchCursor_ = safe.beforeDispatchCursor_;
        }
+       buffer()->undo().endUndoGroup();
 }
 
 
@@ -405,7 +397,10 @@ int Cursor::currentMode()
        LASSERT(!empty(), /**/);
        for (int i = depth() - 1; i >= 0; --i) {
                int res = operator[](i).inset().currentMode();
-               if (res != Inset::UNDECIDED_MODE)
+               bool locked_mode = operator[](i).inset().lockedMode();
+               // Also return UNDECIDED_MODE when the mode is locked,
+               // as in this case it is treated the same as TEXT_MODE
+               if (res != Inset::UNDECIDED_MODE || locked_mode)
                        return res;
        }
        return Inset::TEXT_MODE;
@@ -1587,7 +1582,7 @@ void Cursor::normalize()
                        << pos() << ' ' << lastpos() <<  " in idx: " << idx()
                       << " in atom: '";
                odocstringstream os;
-               WriteStream wi(os, false, true, false);
+               WriteStream wi(os, false, true, WriteStream::wsDefault);
                inset().asInsetMath()->write(wi);
                lyxerr << to_utf8(os.str()) << endl;
                pos() = lastpos();
@@ -1922,56 +1917,63 @@ void Cursor::errorMessage(docstring const & msg) const
 }
 
 
+static docstring parbreak(InsetCode code)
+{
+       odocstringstream os;
+       os << '\n';
+       // only add blank line if we're not in an ERT or Listings inset
+       if (code != ERT_CODE && code != LISTINGS_CODE)
+               os << '\n';
+       return os.str();
+}
+
+
 docstring Cursor::selectionAsString(bool with_label) const
 {
        if (!selection())
                return docstring();
 
+       if (inMathed())
+               return cap::grabSelection(*this);
+
        int const label = with_label
                ? AS_STR_LABEL | AS_STR_INSETS : AS_STR_INSETS;
 
-       if (inTexted()) {
-               idx_type const startidx = selBegin().idx();
-               idx_type const endidx = selEnd().idx();
-               if (startidx != endidx) {
-                       // multicell selection
-                       InsetTabular * table = inset().asInsetTabular();
-                       LASSERT(table, return docstring());
-                       return table->asString(startidx, endidx);
-               }
-               
-               ParagraphList const & pars = text()->paragraphs();
-
-               pit_type const startpit = selBegin().pit();
-               pit_type const endpit = selEnd().pit();
-               size_t const startpos = selBegin().pos();
-               size_t const endpos = selEnd().pos();
-
-               if (startpit == endpit)
-                       return pars[startpit].asString(startpos, endpos, label);
-
-               // First paragraph in selection
-               docstring result = pars[startpit].
-                       asString(startpos, pars[startpit].size(), label)
-                                + parbreak(pars[startpit]);
-
-               // The paragraphs in between (if any)
-               for (pit_type pit = startpit + 1; pit != endpit; ++pit) {
-                       Paragraph const & par = pars[pit];
-                       result += par.asString(0, par.size(), label)
-                                 + parbreak(pars[pit]);
-               }
+       idx_type const startidx = selBegin().idx();
+       idx_type const endidx = selEnd().idx();
+       if (startidx != endidx) {
+               // multicell selection
+               InsetTabular * table = inset().asInsetTabular();
+               LASSERT(table, return docstring());
+               return table->asString(startidx, endidx);
+       }
+
+       ParagraphList const & pars = text()->paragraphs();
+
+       pit_type const startpit = selBegin().pit();
+       pit_type const endpit = selEnd().pit();
+       size_t const startpos = selBegin().pos();
+       size_t const endpos = selEnd().pos();
+
+       if (startpit == endpit)
+               return pars[startpit].asString(startpos, endpos, label);
 
-               // Last paragraph in selection
-               result += pars[endpit].asString(0, endpos, label);
+       // First paragraph in selection
+       docstring result = pars[startpit].
+               asString(startpos, pars[startpit].size(), label)
+               + parbreak(inset().lyxCode());
 
-               return result;
+       // The paragraphs in between (if any)
+       for (pit_type pit = startpit + 1; pit != endpit; ++pit) {
+               Paragraph const & par = pars[pit];
+               result += par.asString(0, par.size(), label)
+                       + parbreak(inset().lyxCode());
        }
 
-       if (inMathed())
-               return cap::grabSelection(*this);
+       // Last paragraph in selection
+       result += pars[endpit].asString(0, endpos, label);
 
-       return docstring();
+       return result;
 }
 
 
@@ -2003,7 +2005,7 @@ Encoding const * Cursor::getEncoding() const
        CursorSlice const & sl = innerTextSlice();
        Text const & text = *sl.text();
        Font font = text.getPar(sl.pit()).getFont(
-               bv().buffer().params(), sl.pos(), outerFont(sl.pit(), text.paragraphs()));
+               bv().buffer().params(), sl.pos(), text.outerFont(sl.pit()));
        return font.language()->encoding();
 }
 
@@ -2060,7 +2062,7 @@ Font Cursor::getFont() const
        
        // get font at the position
        Font font = par.getFont(buffer()->params(), pos,
-               outerFont(sl.pit(), text.paragraphs()));
+               text.outerFont(sl.pit()));
 
        return font;
 }