]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/InsetMathHull.cpp
Specify that we are in math mode. This avoids unnecessary \ensuremath
[lyx.git] / src / mathed / InsetMathHull.cpp
index a025ab235336b5b089ea3903bfb2fbe6f99b914e..99d59b00b08a291bc29c97358345562387feaf75 100644 (file)
@@ -35,6 +35,7 @@
 #include "Cursor.h"
 #include "DispatchResult.h"
 #include "FuncRequest.h"
+#include "Language.h"
 #include "LyXRC.h"
 #include "OutputParams.h"
 #include "ParIterator.h"
@@ -51,6 +52,7 @@
 
 #include "frontends/Painter.h"
 
+#include "support/lassert.h"
 #include "support/debug.h"
 #include "support/gettext.h"
 #include "support/lstrings.h"
@@ -144,8 +146,8 @@ docstring hullName(HullType type)
 static InsetLabel * dummy_pointer = 0;
 
 InsetMathHull::InsetMathHull()
-       : InsetMathGrid(1, 1), type_(hullNone), nonum_(1, false), label_(1, dummy_pointer),
-         preview_(new RenderPreview(this))
+       : InsetMathGrid(1, 1), type_(hullNone), nonum_(1, false),
+         label_(1, dummy_pointer), preview_(new RenderPreview(this))
 {
        //lyxerr << "sizeof InsetMath: " << sizeof(InsetMath) << endl;
        //lyxerr << "sizeof MetricsInfo: " << sizeof(MetricsInfo) << endl;
@@ -157,15 +159,15 @@ InsetMathHull::InsetMathHull()
 
 
 InsetMathHull::InsetMathHull(HullType type)
-       : InsetMathGrid(getCols(type), 1), type_(type), nonum_(1, false), label_(1, dummy_pointer),
-         preview_(new RenderPreview(this))
+       : InsetMathGrid(getCols(type), 1), type_(type), nonum_(1, false),
+         label_(1, dummy_pointer), preview_(new RenderPreview(this))
 {
        initMath();
        setDefaults();
 }
 
 
-InsetMathHull::InsetMathHull(InsetMathHull const & other)
+InsetMathHull::InsetMathHull(InsetMathHull const & other) : InsetMathGrid()
 {
        operator=(other);
 }
@@ -235,7 +237,7 @@ void InsetMathHull::updateLabels(ParIterator const & it)
 }
 
 
-void InsetMathHull::addToToc(ParConstIterator const & pit) const
+void InsetMathHull::addToToc(DocIterator const & pit)
 {
        if (!buffer_) {
                //FIXME: buffer_ should be set at creation for this inset! Problem is
@@ -244,10 +246,6 @@ void InsetMathHull::addToToc(ParConstIterator const & pit) const
                return;
        }
 
-       // FIXME: it would be way better to directly use InsetLabel instead of this
-       // label list. But it should be possible to copy&paste the code in
-       // InsetLabel::addToToc() anyway.
-
        Toc & toc = buffer().tocBackend().toc("equation");
 
        for (row_type row = 0; row != nrows(); ++row) {
@@ -423,7 +421,7 @@ void InsetMathHull::metricsT(TextMetricsInfo const & mi, Dimension & dim) const
                InsetMathGrid::metricsT(mi, dim);
        } else {
                odocstringstream os;
-               WriteStream wi(os, false, true);
+               WriteStream wi(os, false, true, false);
                write(wi);
                dim.wid = os.str().size();
                dim.asc = 1;
@@ -438,7 +436,7 @@ void InsetMathHull::drawT(TextPainter & pain, int x, int y) const
                InsetMathGrid::drawT(pain, x, y);
        } else {
                odocstringstream os;
-               WriteStream wi(os, false, true);
+               WriteStream wi(os, false, true, false);
                write(wi);
                pain.draw(x, y, os.str().c_str());
        }
@@ -448,7 +446,12 @@ void InsetMathHull::drawT(TextPainter & pain, int x, int y) const
 static docstring latexString(InsetMathHull const & inset)
 {
        odocstringstream ls;
-       WriteStream wi(ls, false, false);
+       // This has to be static, because a preview snippet containing math
+       // in text mode (such as $\text{$\phi$}$) gets processed twice. The
+       // first time as a whole, and the second time only the inner math.
+       // In this last case inset.buffer() would be invalid.
+       static Encoding const * encoding = inset.buffer().language()->encoding();
+       WriteStream wi(ls, false, true, false, encoding);
        inset.write(wi);
        return ls.str();
 }
@@ -478,7 +481,7 @@ bool InsetMathHull::notifyCursorLeaves(Cursor const & /*old*/, Cursor & cur)
 
 docstring InsetMathHull::label(row_type row) const
 {
-       BOOST_ASSERT(row < nrows());
+       LASSERT(row < nrows(), /**/);
        if (InsetLabel * il = label_[row])
                return il->screenLabel();
        return docstring();
@@ -492,6 +495,9 @@ void InsetMathHull::label(row_type row, docstring const & label)
                if (label.empty()) {
                        delete label_[row];
                        label_[row] = dummy_pointer;
+                       // We need an update of the Buffer reference cache.
+                       // This is achieved by updateLabels().
+                       lyx::updateLabels(buffer());
                } else
                        label_[row]->updateCommand(label);
                return;
@@ -510,6 +516,9 @@ void InsetMathHull::numbered(row_type row, bool num)
        if (nonum_[row] && label_[row]) {
                delete label_[row];
                label_[row] = 0;
+               // We need an update of the Buffer reference cache.
+               // This is achieved by updateLabels().
+               lyx::updateLabels(buffer());
        }
 }
 
@@ -559,7 +568,6 @@ void InsetMathHull::validate(LaTeXFeatures & features) const
        if (ams())
                features.require("amsmath");
 
-
        // Validation is necessary only if not using AMS math.
        // To be safe, we will always run mathedvalidate.
        //if (features.amsstyle)
@@ -683,15 +691,19 @@ void InsetMathHull::addRow(row_type row)
                return;
 
        bool numbered = numberedType();
+       docstring lab;
        if (type_ == hullMultline) {
-               if (row + 1 == nrows())
+               if (row + 1 == nrows())  {
                        nonum_[row] = true;
-               else
+                       lab = label(row);
+               } else
                        numbered = false;
        }
 
        nonum_.insert(nonum_.begin() + row + 1, !numbered);
        label_.insert(label_.begin() + row + 1, dummy_pointer);
+       if (!lab.empty())
+               label(row + 1, lab);
        InsetMathGrid::addRow(row);
 }
 
@@ -719,6 +731,14 @@ void InsetMathHull::delRow(row_type row)
 {
        if (nrows() <= 1 || !rowChangeOK())
                return;
+       if (row + 1 == nrows() && type_ == hullMultline) {
+               bool const b = nonum_[row - 1];
+               nonum_[row - 1] = nonum_[row];
+               nonum_[row] = b;
+               swap(label_[row - 1], label_[row]);
+               InsetMathGrid::delRow(row);
+               return;
+       }
        InsetMathGrid::delRow(row);
        // The last dummy row has no number info nor a label.
        // Test nrows() + 1 because we have already erased the row.
@@ -769,7 +789,7 @@ void InsetMathHull::glueall()
 
 void InsetMathHull::splitTo2Cols()
 {
-       BOOST_ASSERT(ncols() == 1);
+       LASSERT(ncols() == 1, /**/);
        InsetMathGrid::addCol(1);
        for (row_type row = 0; row < nrows(); ++row) {
                idx_type const i = 2 * row;
@@ -782,7 +802,7 @@ void InsetMathHull::splitTo2Cols()
 
 void InsetMathHull::splitTo3Cols()
 {
-       BOOST_ASSERT(ncols() < 3);
+       LASSERT(ncols() < 3, /**/);
        if (ncols() < 2)
                splitTo2Cols();
        InsetMathGrid::addCol(2);
@@ -999,6 +1019,7 @@ docstring InsetMathHull::eolString(row_type row, bool emptyline, bool fragile) c
 
 void InsetMathHull::write(WriteStream & os) const
 {
+       ModeSpecifier specifier(os, MATH_MODE);
        header_write(os);
        InsetMathGrid::write(os);
        footer_write(os);
@@ -1027,8 +1048,8 @@ void InsetMathHull::infoize(odocstream & os) const
 
 void InsetMathHull::check() const
 {
-       BOOST_ASSERT(nonum_.size() == nrows());
-       BOOST_ASSERT(label_.size() == nrows());
+       LASSERT(nonum_.size() == nrows(), /**/);
+       LASSERT(label_.size() == nrows(), /**/);
 }
 
 
@@ -1290,28 +1311,30 @@ bool InsetMathHull::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_MATH_MUTATE:
        case LFUN_MATH_DISPLAY:
                // we handle these
-               status.enabled(true);
+               status.setEnabled(true);
                return true;
        case LFUN_MATH_NUMBER_TOGGLE:
                // FIXME: what is the right test, this or the one of
                // LABEL_INSERT?
-               status.enabled(display());
+               status.setEnabled(display());
                status.setOnOff(numberedType());
                return true;
        case LFUN_MATH_NUMBER_LINE_TOGGLE: {
                // FIXME: what is the right test, this or the one of
                // LABEL_INSERT?
-               status.enabled(display());
+               bool const enable = (type_ == hullMultline) ?
+                       (nrows() - 1 == cur.row()) : display();
                row_type const r = (type_ == hullMultline) ? nrows() - 1 : cur.row();
+               status.setEnabled(enable);
                status.setOnOff(numbered(r));
                return true;
        }
        case LFUN_LABEL_INSERT:
-               status.enabled(type_ != hullSimple);
+               status.setEnabled(type_ != hullSimple);
                return true;
        case LFUN_INSET_INSERT:
                if (cmd.getArg(0) == "label") {
-                       status.enabled(type_ != hullSimple);
+                       status.setEnabled(type_ != hullSimple);
                        return true;
                }
                return InsetMathGrid::getStatus(cur, cmd, status);
@@ -1326,7 +1349,7 @@ bool InsetMathHull::getStatus(Cursor & cur, FuncRequest const & cmd,
                        status.message(bformat(
                                from_utf8(N_("Can't change number of rows in '%1$s'")),
                                hullName(type_)));
-                       status.enabled(false);
+                       status.setEnabled(false);
                        return true;
                }
                if (!colChangeOK()
@@ -1336,7 +1359,7 @@ bool InsetMathHull::getStatus(Cursor & cur, FuncRequest const & cmd,
                        status.message(bformat(
                                from_utf8(N_("Can't change number of columns in '%1$s'")),
                                hullName(type_)));
-                       status.enabled(false);
+                       status.setEnabled(false);
                        return true;
                }
                if ((type_ == hullSimple
@@ -1346,20 +1369,20 @@ bool InsetMathHull::getStatus(Cursor & cur, FuncRequest const & cmd,
                        status.message(bformat(
                                from_utf8(N_("Can't add horizontal grid lines in '%1$s'")),
                                hullName(type_)));
-                       status.enabled(false);
+                       status.setEnabled(false);
                        return true;
                }
                if (s == "add-vline-left" || s == "add-vline-right") {
                        status.message(bformat(
                                from_utf8(N_("Can't add vertical grid lines in '%1$s'")),
                                hullName(type_)));
-                       status.enabled(false);
+                       status.setEnabled(false);
                        return true;
                }
                if (s == "valign-top" || s == "valign-middle"
                 || s == "valign-bottom" || s == "align-left"
                 || s == "align-center" || s == "align-right") {
-                       status.enabled(false);
+                       status.setEnabled(false);
                        return true;
                }
                return InsetMathGrid::getStatus(cur, cmd, status);
@@ -1535,7 +1558,7 @@ bool InsetMathHull::searchForward(BufferView * bv, string const & str,
 void InsetMathHull::write(ostream & os) const
 {
        odocstringstream oss;
-       WriteStream wi(oss, false, false);
+       WriteStream wi(oss, false, false, false);
        oss << "Formula ";
        write(wi);
        os << to_utf8(oss.str());
@@ -1550,7 +1573,7 @@ void InsetMathHull::read(Lexer & lex)
 }
 
 
-int InsetMathHull::plaintext(odocstream & os, OutputParams const &) const
+int InsetMathHull::plaintext(odocstream & os, OutputParams const & runparams) const
 {
        if (0 && display()) {
                Dimension dim;
@@ -1564,7 +1587,7 @@ int InsetMathHull::plaintext(odocstream & os, OutputParams const &) const
                return tpain.textheight();
        } else {
                odocstringstream oss;
-               WriteStream wi(oss, false, true);
+               WriteStream wi(oss, false, true, false, runparams.encoding);
                wi << cell(0);
 
                docstring const str = oss.str();
@@ -1596,7 +1619,7 @@ int InsetMathHull::docbook(odocstream & os, OutputParams const & runparams) cons
                // Workaround for db2latex: db2latex always includes equations with
                // \ensuremath{} or \begin{display}\end{display}
                // so we strip LyX' math environment
-               WriteStream wi(ls, false, false);
+               WriteStream wi(ls, false, false, false, runparams.encoding);
                InsetMathGrid::write(wi);
                ms << from_utf8(subst(subst(to_utf8(ls.str()), "&", "&amp;"), "<", "&lt;"));
                ms << ETag("alt");