]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/InsetMathHull.cpp
rename LFUNs math-nonumber and math-number to what they really do,
[lyx.git] / src / mathed / InsetMathHull.cpp
index a4ff0eaada2f61b1ca13e307a891c1b9df2edcc1..c1b99349de8fc43fba7788b129fff325f8305b89 100644 (file)
 #include "MathSupport.h"
 #include "InsetMathRef.h"
 
-#include "bufferview_funcs.h"
-#include "Text.h"
-
 #include "Buffer.h"
 #include "BufferParams.h"
 #include "BufferView.h"
 #include "CutAndPaste.h"
 #include "FuncStatus.h"
-#include "Color.h"
 #include "LaTeXFeatures.h"
 #include "Cursor.h"
-#include "debug.h"
+#include "support/debug.h"
 #include "DispatchResult.h"
 #include "FuncRequest.h"
-#include "gettext.h"
+#include "support/gettext.h"
 #include "LyXRC.h"
 #include "OutputParams.h"
 #include "sgml.h"
+#include "Text.h"
 #include "TextPainter.h"
-#include "Undo.h"
 
 #include "insets/RenderPreview.h"
 #include "insets/InsetLabel.h"
 
 #include "frontends/Painter.h"
 
-#include "support/lyxlib.h"
 #include "support/lstrings.h"
 
-#include <boost/bind.hpp>
-
 #include <sstream>
 
+using namespace std;
+using namespace lyx::support;
 
 namespace lyx {
 
 using cap::grabAndEraseSelection;
-using support::bformat;
-using support::subst;
-
-using std::endl;
-using std::max;
-using std::ostream;
-using std::auto_ptr;
-using std::istringstream;
-using std::ostringstream;
-using std::pair;
-using std::swap;
-using std::vector;
-
 
 namespace {
 
@@ -164,7 +146,7 @@ InsetMathHull::InsetMathHull()
        //lyxerr << "sizeof InsetMath: " << sizeof(InsetMath) << endl;
        //lyxerr << "sizeof MetricsInfo: " << sizeof(MetricsInfo) << endl;
        //lyxerr << "sizeof InsetMathChar: " << sizeof(InsetMathChar) << endl;
-       //lyxerr << "sizeof Font: " << sizeof(Font) << endl;
+       //lyxerr << "sizeof FontInfo: " << sizeof(FontInfo) << endl;
        initMath();
        setDefaults();
 }
@@ -190,9 +172,9 @@ InsetMathHull::~InsetMathHull()
 {}
 
 
-auto_ptr<Inset> InsetMathHull::doClone() const
+Inset * InsetMathHull::clone() const
 {
-       return auto_ptr<Inset>(new InsetMathHull(*this));
+       return new InsetMathHull(*this);
 }
 
 
@@ -249,6 +231,8 @@ char InsetMathHull::defaultColAlign(col_type col)
 {
        if (type_ == hullEqnArray)
                return "rcl"[col];
+       if (type_ == hullGather)
+               return 'c';
        if (type_ >= hullAlign)
                return "rl"[col & 1];
        return 'c';
@@ -284,7 +268,7 @@ bool InsetMathHull::previewState(BufferView * bv) const
 }
 
 
-bool InsetMathHull::metrics(MetricsInfo & mi, Dimension & dim) const
+void InsetMathHull::metrics(MetricsInfo & mi, Dimension & dim) const
 {
        if (previewState(mi.base.bv)) {
                preview_->metrics(mi, dim);
@@ -292,10 +276,9 @@ bool InsetMathHull::metrics(MetricsInfo & mi, Dimension & dim) const
                dim.wid += 1;
                if (display())
                        dim.des += displayMargin();
-               if (dim_ == dim)
-                       return false;
-               dim_ = dim;
-               return true;
+               // Cache the inset dimension. 
+               setDimCache(mi, dim);
+               return;
        }
 
        FontSetChanger dummy1(mi.base, standardFont());
@@ -325,23 +308,22 @@ bool InsetMathHull::metrics(MetricsInfo & mi, Dimension & dim) const
        math_font_max_dim(mi.base.font, asc, des);
        dim.asc = max(dim.asc, asc);
        dim.des = max(dim.des, des);
-
-       if (dim_ == dim)
-               return false;
-       dim_ = dim;
-       return true;
+       // Cache the inset dimension.
+       // FIXME: This will overwrite InsetMathGrid dimension, is that OK?
+       setDimCache(mi, dim);
 }
 
 
 void InsetMathHull::draw(PainterInfo & pi, int x, int y) const
 {
        use_preview_ = previewState(pi.base.bv);
+       Dimension const dim = dimension(*pi.base.bv);
 
        // background of mathed under focus is not painted because
        // selection at the top level of nested inset is difficult to handle.
        if (!editing(pi.base.bv))
-               pi.pain.fillRectangle(x + 1, y - ascent() + 1, width() - 2,
-                               ascent() + descent() - 1, Color::mathbg);
+               pi.pain.fillRectangle(x + 1, y - dim.asc + 1, dim.wid - 2,
+                               dim.asc + dim.des - 1, Color_mathbg);
 
        if (use_preview_) {
                // one pixel gap in front
@@ -715,7 +697,7 @@ void InsetMathHull::splitTo3Cols()
        BOOST_ASSERT(ncols() < 3);
        if (ncols() < 2)
                splitTo2Cols();
-       InsetMathGrid::addCol(1);
+       InsetMathGrid::addCol(2);
        for (row_type row = 0; row < nrows(); ++row) {
                idx_type const i = 3 * row + 1;
                if (cell(i).size()) {
@@ -737,7 +719,7 @@ void InsetMathHull::changeCols(col_type cols)
                else {
                        splitTo3Cols();
                        while (ncols() < cols)
-                               InsetMathGrid::addCol(ncols() - 1);
+                               InsetMathGrid::addCol(ncols());
                }
                return;
        }
@@ -970,7 +952,7 @@ void InsetMathHull::doExtern(Cursor & cur, FuncRequest & func)
        iss >> dlang >> extra;
        if (extra.empty())
                extra = from_ascii("noextra");
-       std::string const lang = to_ascii(dlang);
+       string const lang = to_ascii(dlang);
 
        // FIXME: temporarily disabled
        //if (cur.selection()) {
@@ -1043,8 +1025,8 @@ void InsetMathHull::doDispatch(Cursor & cur, FuncRequest & cmd)
        //lyxerr << "action: " << cmd.action << endl;
        switch (cmd.action) {
 
-       case LFUN_FINISHED_LEFT:
-       case LFUN_FINISHED_RIGHT:
+       case LFUN_FINISHED_BACKWARD:
+       case LFUN_FINISHED_FORWARD:
                //lyxerr << "action: " << cmd.action << endl;
                InsetMathGrid::doDispatch(cur, cmd);
                notifyCursorLeaves(cur);
@@ -1055,46 +1037,44 @@ void InsetMathHull::doDispatch(Cursor & cur, FuncRequest & cmd)
                // just swallow this
                break;
 
-       case LFUN_BREAK_LINE:
+       case LFUN_NEW_LINE:
                // some magic for the common case
                if (type_ == hullSimple || type_ == hullEquation) {
-                       recordUndoInset(cur);
+                       cur.recordUndoInset();
                        bool const align =
                                cur.bv().buffer().params().use_amsmath == BufferParams::package_on;
                        mutate(align ? hullAlign : hullEqnArray);
-                       cur.idx() = 0;
+                       cur.idx() = nrows() * ncols() - 1;
                        cur.pos() = cur.lastpos();
                }
                InsetMathGrid::doDispatch(cur, cmd);
                break;
 
-       case LFUN_MATH_NUMBER:
+       case LFUN_MATH_NUMBER_TOGGLE: {
                //lyxerr << "toggling all numbers" << endl;
-               if (display()) {
-                       recordUndoInset(cur);
-                       bool old = numberedType();
-                       if (type_ == hullMultline)
-                               numbered(nrows() - 1, !old);
-                       else
-                               for (row_type row = 0; row < nrows(); ++row)
-                                       numbered(row, !old);
-
-                       cur.message(old ? _("No number") : _("Number"));
-               }
+               cur.recordUndoInset();
+               bool old = numberedType();
+               if (type_ == hullMultline)
+                       numbered(nrows() - 1, !old);
+               else
+                       for (row_type row = 0; row < nrows(); ++row)
+                               numbered(row, !old);
+               
+               cur.message(old ? _("No number") : _("Number"));
                break;
+       }
 
-       case LFUN_MATH_NONUMBER:
-               if (display()) {
-                       recordUndoInset(cur);
-                       row_type r = (type_ == hullMultline) ? nrows() - 1 : cur.row();
-                       bool old = numbered(r);
-                       cur.message(old ? _("No number") : _("Number"));
-                       numbered(r, !old);
-               }
+       case LFUN_MATH_NUMBER_LINE_TOGGLE: {
+               cur.recordUndoInset();
+               row_type r = (type_ == hullMultline) ? nrows() - 1 : cur.row();
+               bool old = numbered(r);
+               cur.message(old ? _("No number") : _("Number"));
+               numbered(r, !old);
                break;
+       }
 
        case LFUN_LABEL_INSERT: {
-               recordUndoInset(cur);
+               cur.recordUndoInset();
                row_type r = (type_ == hullMultline) ? nrows() - 1 : cur.row();
                docstring old_label = label(r);
                docstring const default_label = from_ascii(
@@ -1102,12 +1082,12 @@ void InsetMathHull::doDispatch(Cursor & cur, FuncRequest & cmd)
                if (old_label.empty())
                        old_label = default_label;
 
-               InsetCommandParams p("label");
+               InsetCommandParams p(LABEL_CODE);
                p["name"] = cmd.argument().empty() ? old_label : cmd.argument();
-               std::string const data = InsetCommandMailer::params2string("label", p);
+               string const data = InsetCommandMailer::params2string("label", p);
 
                if (cmd.argument().empty())
-                       cur.bv().showInsetDialog("label", data, 0);
+                       cur.bv().showDialog("label", data);
                else {
                        FuncRequest fr(LFUN_INSET_INSERT, data);
                        dispatch(cur, fr);
@@ -1117,20 +1097,20 @@ void InsetMathHull::doDispatch(Cursor & cur, FuncRequest & cmd)
 
        case LFUN_INSET_INSERT: {
                //lyxerr << "arg: " << to_utf8(cmd.argument()) << endl;
-               std::string const name = cmd.getArg(0);
+               string const name = cmd.getArg(0);
                if (name == "label") {
-                       InsetCommandParams p("label");
+                       InsetCommandParams p(LABEL_CODE);
                        InsetCommandMailer::string2params(name, to_utf8(cmd.argument()), p);
                        docstring str = p["name"];
-                       recordUndoInset(cur);
+                       cur.recordUndoInset();
                        row_type const r = (type_ == hullMultline) ? nrows() - 1 : cur.row();
-                       str = support::trim(str);
+                       str = trim(str);
                        if (!str.empty())
                                numbered(r, true);
                        docstring old = label(r);
                        if (str != old) {
                                cur.bv().buffer().changeRefsIfUnique(old, str,
-                                                       Inset::REF_CODE);
+                                                       REF_CODE);
                                label(r, str);
                        }
                        break;
@@ -1140,12 +1120,12 @@ void InsetMathHull::doDispatch(Cursor & cur, FuncRequest & cmd)
        }
 
        case LFUN_MATH_EXTERN:
-               recordUndoInset(cur);
+               cur.recordUndoInset();
                doExtern(cur, cmd);
                break;
 
        case LFUN_MATH_MUTATE: {
-               recordUndoInset(cur);
+               cur.recordUndoInset();
                row_type row = cur.row();
                col_type col = cur.col();
                mutate(hullType(cmd.argument()));
@@ -1161,7 +1141,7 @@ void InsetMathHull::doDispatch(Cursor & cur, FuncRequest & cmd)
        }
 
        case LFUN_MATH_DISPLAY: {
-               recordUndoInset(cur);
+               cur.recordUndoInset();
                mutate(type_ == hullSimple ? hullEquation : hullSimple);
                cur.idx() = 0;
                cur.pos() = cur.lastpos();
@@ -1180,21 +1160,31 @@ bool InsetMathHull::getStatus(Cursor & cur, FuncRequest const & cmd,
                FuncStatus & status) const
 {
        switch (cmd.action) {
-       case LFUN_FINISHED_LEFT:
-       case LFUN_FINISHED_RIGHT:
+       case LFUN_FINISHED_BACKWARD:
+       case LFUN_FINISHED_FORWARD:
        case LFUN_UP:
        case LFUN_DOWN:
-               status.enabled(true);
-               return true;
-       case LFUN_BREAK_LINE:
-       case LFUN_MATH_NUMBER:
-       case LFUN_MATH_NONUMBER:
+       case LFUN_NEW_LINE:
        case LFUN_MATH_EXTERN:
        case LFUN_MATH_MUTATE:
        case LFUN_MATH_DISPLAY:
                // we handle these
                status.enabled(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.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());
+               row_type const r = (type_ == hullMultline) ? nrows() - 1 : cur.row();
+               status.setOnOff(numbered(r));
+               return true;
+       }
        case LFUN_LABEL_INSERT:
                status.enabled(type_ != hullSimple);
                return true;
@@ -1206,7 +1196,7 @@ bool InsetMathHull::getStatus(Cursor & cur, FuncRequest const & cmd,
                return InsetMathGrid::getStatus(cur, cmd, status);
        case LFUN_TABULAR_FEATURE: {
                istringstream is(to_utf8(cmd.argument()));
-               std::string s;
+               string s;
                is >> s;
                if (!rowChangeOK()
                    && (s == "append-row"
@@ -1293,7 +1283,7 @@ void InsetMathHull::handleFont(Cursor & cur, docstring const & arg,
 {
        // this whole function is a hack and won't work for incremental font
        // changes...
-       recordUndo(cur);
+       cur.recordUndo();
        if (cur.inset().asInsetMath()->name() == font)
                cur.handleFont(to_utf8(font));
        else {
@@ -1305,21 +1295,21 @@ void InsetMathHull::handleFont(Cursor & cur, docstring const & arg,
 
 void InsetMathHull::handleFont2(Cursor & cur, docstring const & arg)
 {
-       recordUndo(cur);
+       cur.recordUndo();
        Font font;
        bool b;
-       bv_funcs::string2font(to_utf8(arg), font, b);
-       if (font.color() != Color::inherit) {
-               MathAtom at = MathAtom(new InsetMathColor(true, font.color()));
+       font.fromString(to_utf8(arg), b);
+       if (font.fontInfo().color() != Color_inherit) {
+               MathAtom at = MathAtom(new InsetMathColor(true, font.fontInfo().color()));
                cur.handleNest(at, 0);
        }
 }
 
 
-void InsetMathHull::edit(Cursor & cur, bool left)
+void InsetMathHull::edit(Cursor & cur, bool front)
 {
        cur.push(*this);
-       left ? idxFirst(cur) : idxLast(cur);
+       front ? idxFirst(cur) : idxLast(cur);
        // The inset formula dimension is not necessarily the same as the
        // one of the instant preview image, so we have to indicate to the
        // BufferView that a metrics update is needed.
@@ -1369,7 +1359,7 @@ void InsetMathHull::revealCodes(Cursor & cur) const
 }
 
 
-Inset::Code InsetMathHull::lyxCode() const
+InsetCode InsetMathHull::lyxCode() const
 {
        return MATH_CODE;
 }
@@ -1419,7 +1409,7 @@ bool InsetMathHull::searchForward(BufferView * bv, string const & str,
 #endif
 
 
-void InsetMathHull::write(Buffer const &, std::ostream & os) const
+void InsetMathHull::write(Buffer const &, ostream & os) const
 {
        odocstringstream oss;
        WriteStream wi(oss, false, false);
@@ -1476,28 +1466,29 @@ int InsetMathHull::docbook(Buffer const & buf, odocstream & os,
        docstring bname = name;
        if (!label(0).empty())
                bname += " id='" + sgml::cleanID(buf, runparams, label(0)) + "'";
-       ms << MTag(bname);
+
+       ++ms.tab(); ms.cr(); ms.os() << '<' << bname << '>';
 
        odocstringstream ls;
        if (runparams.flavor == OutputParams::XML) {
-               ms << MTag(from_ascii("alt role='tex' "));
+               ms << MTag("alt role='tex' ");
                // 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);
                InsetMathGrid::write(wi);
                ms << from_utf8(subst(subst(to_utf8(ls.str()), "&", "&amp;"), "<", "&lt;"));
-               ms << ETag(from_ascii("alt"));
-               ms << MTag(from_ascii("math"));
-               ms << ETag(from_ascii("alt"));
-               ms << MTag(from_ascii("math"));
+               ms << ETag("alt");
+               ms << MTag("math");
+               ms << ETag("alt");
+               ms << MTag("math");
                InsetMathGrid::mathmlize(ms);
-               ms << ETag(from_ascii("math"));
+               ms << ETag("math");
        } else {
-               ms << MTag(from_ascii("alt role='tex'"));
+               ms << MTag("alt role='tex'");
                res = latex(buf, ls, runparams);
                ms << from_utf8(subst(subst(to_utf8(ls.str()), "&", "&amp;"), "<", "&lt;"));
-               ms << ETag(from_ascii("alt"));
+               ms << ETag("alt");
        }
 
        ms << from_ascii("<graphic fileref=\"eqn/");
@@ -1511,7 +1502,8 @@ int InsetMathHull::docbook(Buffer const & buf, odocstream & os,
        else
                ms << from_ascii("\">");
 
-       ms << ETag(name);
+       ms.cr(); --ms.tab(); ms.os() << "</" << name << '>';
+
        return ms.line() + res;
 }