]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/InsetMathHull.cpp
Rename LM_TC_* to FONT_STYLE_*
[lyx.git] / src / mathed / InsetMathHull.cpp
index 38cdd26427ee63c5b34adcfbb5c7cdbabd7e4088..92574c8d2a0eac7e3b79c91236f7b94f54fd330f 100644 (file)
@@ -35,8 +35,8 @@
 #include "LaTeXFeatures.h"
 #include "LyXRC.h"
 #include "MacroTable.h"
-#include "MathMacro.h"
-#include "MathMacroTemplate.h"
+#include "InsetMathMacro.h"
+#include "InsetMathMacroTemplate.h"
 #include "MetricsInfo.h"
 #include "output_xhtml.h"
 #include "Paragraph.h"
@@ -126,14 +126,14 @@ namespace {
                if (os.strikeoutMath()) {
                        if (os.ulemCmd() == WriteStream::UNDERLINE)
                                os << "\\raisebox{-\\belowdisplayshortskip}{"
-                                     "\\lyxmathsout{\\parbox[b]{\\columnwidth}{";
+                                     "\\lyxmathsout{\\parbox[b]{\\linewidth}{";
                        else
-                               os << "\\lyxmathsout{\\parbox{\\columnwidth}{";
+                               os << "\\lyxmathsout{\\parbox{\\linewidth}{";
                } else if (os.ulemCmd() == WriteStream::UNDERLINE)
                        os << "\\raisebox{-\\belowdisplayshortskip}{"
-                             "\\parbox[b]{\\columnwidth}{";
+                             "\\parbox[b]{\\linewidth}{";
                else if (os.ulemCmd() == WriteStream::STRIKEOUT)
-                       os << "\\parbox{\\columnwidth}{";
+                       os << "\\parbox{\\linewidth}{";
        }
 
 
@@ -151,7 +151,7 @@ namespace {
        }
 
 
-} // end anon namespace
+} // namespace
 
 
 HullType hullType(docstring const & s)
@@ -198,7 +198,7 @@ docstring hullName(HullType type)
 static InsetLabel * dummy_pointer = 0;
 
 InsetMathHull::InsetMathHull(Buffer * buf)
-       : InsetMathGrid(buf, 1, 1), type_(hullNone), numbered_(1, NUMBER),
+       : InsetMathGrid(buf, 1, 1), type_(hullNone), numbered_(1, NONUMBER),
          numbers_(1, empty_docstring()), label_(1, dummy_pointer),
          preview_(new RenderPreview(this))
 {
@@ -280,7 +280,7 @@ void InsetMathHull::setBuffer(Buffer & buffer)
 namespace {
        const char * counters_to_save[] = {"section", "chapter"};
        unsigned int const numcnts = sizeof(counters_to_save)/sizeof(char *);
-}
+} // namespace
 
 
 void InsetMathHull::updateBuffer(ParIterator const & it, UpdateType utype)
@@ -316,8 +316,12 @@ void InsetMathHull::updateBuffer(ParIterator const & it, UpdateType utype)
                                counter_map[eqstr] = cnts.value(eqstr);
                        for (size_t i = 0; i != label_.size(); ++i) {
                                if (numbered(i)) {
-                                       cnts.step(eqstr, utype);
-                                       numbers_[i] = cnts.theCounter(eqstr, lang);
+                                       Paragraph const & par = it.paragraph();
+                                       if (!par.isDeleted(it.pos())) {
+                                               cnts.step(eqstr, utype);
+                                               numbers_[i] = cnts.theCounter(eqstr, lang);
+                                       } else
+                                               numbers_[i] = from_ascii("#");
                                } else
                                        numbers_[i] = empty_docstring();
                        }
@@ -419,22 +423,6 @@ InsetMath::mode_type InsetMathHull::currentMode() const
 }
 
 
-bool InsetMathHull::idxFirst(Cursor & cur) const
-{
-       cur.idx() = 0;
-       cur.pos() = 0;
-       return true;
-}
-
-
-bool InsetMathHull::idxLast(Cursor & cur) const
-{
-       cur.idx() = nargs() - 1;
-       cur.pos() = cur.lastpos();
-       return true;
-}
-
-
 // FIXME: InsetMathGrid should be changed to let the real column alignment be
 // given by a virtual method like displayColAlign, because the values produced
 // by defaultColAlign can be invalidated by lfuns such as add-column. For the
@@ -442,7 +430,7 @@ bool InsetMathHull::idxLast(Cursor & cur) const
 // alignment is not implemented in the LyXHTML output.
 char InsetMathHull::defaultColAlign(col_type col)
 {
-       return colAlign(type_, col);
+       return colAlign(type_, col, buffer().params());
 }
 
 
@@ -464,7 +452,7 @@ char InsetMathHull::displayColAlign(idx_type idx) const
        case hullXAlignAt:
        case hullXXAlignAt:
        case hullFlAlign:
-               return colAlign(type_, col(idx));
+               return colAlign(type_, col(idx), buffer().params());
        default:
                break;
        }
@@ -525,63 +513,66 @@ bool InsetMathHull::previewState(const BufferView *const bv) const
 
 
 namespace {
-static const int ERROR_FRAME_WIDTH = 2;
+const int ERROR_FRAME_WIDTH = 2;
+
+bool previewTooSmall(MetricsBase const & mb, Dimension const & dim)
+{
+       // Value was hardcoded to 10 pixels
+       int const minval = mb.bv->zoomedPixels(10);
+       return dim.width() <= minval && dim.height() <= minval;
 }
+}
+
 
 void InsetMathHull::metrics(MetricsInfo & mi, Dimension & dim) const
 {
+       // true value in LaTeX is 12pt plus 3pt minus 9pt
+       // FIXME: even better would be to handle the short skip case.
+       int const display_margin = display() ? mi.base.inPixels(Length(12, Length::PT)) : 0;
+
        if (previewState(mi.base.bv)) {
                preview_->metrics(mi, dim);
-               if (previewTooSmall(dim)) {
+               if (previewTooSmall(mi.base, dim)) {
                        // preview image is too small
                        dim.wid += 2 * ERROR_FRAME_WIDTH;
                        dim.asc += 2 * ERROR_FRAME_WIDTH;
                } else {
-                       // insert a one pixel gap in front of the formula
-                       dim.wid += 1;
-                       if (display())
-                               dim.des += displayMargin();
+                       // insert a gap in front of the formula
+                       // value was hardcoded to 1 pixel
+                       dim.wid += mi.base.bv->zoomedPixels(1) ;
+                       if (display()) {
+                               dim.asc += display_margin;
+                               dim.des += display_margin;
+                       }
                }
                return;
        }
 
        Changer dummy1 = mi.base.changeFontSet(standardFont());
-       Changer dummy2 = mi.base.font.changeStyle(display() ? LM_ST_DISPLAY
-                                                           : LM_ST_TEXT);
+       Changer dummy2 = mi.base.font.changeStyle(display() ? FONT_STYLE_DISPLAY
+                                                           : FONT_STYLE_TEXT);
 
        // let the cells adjust themselves
        InsetMathGrid::metrics(mi, dim);
 
        if (display()) {
-               dim.asc += displayMargin();
-               dim.des += displayMargin();
+               dim.asc += display_margin;
+               dim.des += display_margin;
        }
 
        if (numberedType()) {
-               Changer dummy = mi.base.changeFontSet("mathbf");
+               Changer dummy = mi.base.changeFontSet("mathrm");
                int l = 0;
                for (row_type row = 0; row < nrows(); ++row)
                        l = max(l, mathed_string_width(mi.base.font, nicelabel(row)));
 
                if (l)
-                       dim.wid += 30 + l;
+                       // Value was hardcoded to 30 pixels
+                       dim.wid += mi.base.bv->zoomedPixels(30) + l;
        }
 
        // reserve some space for marker.
        dim.wid += 2;
-
-       // make it at least as high as the current font
-       int asc = 0;
-       int des = 0;
-       math_font_max_dim(mi.base.font, asc, des);
-       dim.asc = max(dim.asc, asc);
-       dim.des = max(dim.des, des);
-}
-
-
-bool InsetMathHull::previewTooSmall(Dimension const & dim) const
-{
-       return dim.width() <= 10 && dim.height() <= 10;
 }
 
 
@@ -590,7 +581,7 @@ ColorCode InsetMathHull::backgroundColor(PainterInfo const & pi) const
        BufferView const * const bv = pi.base.bv;
        if (previewState(bv)) {
                Dimension const dim = dimension(*pi.base.bv);
-               if (previewTooSmall(dim))
+               if (previewTooSmall(pi.base, dim))
                        return Color_error;
                return graphics::PreviewLoader::backgroundColor();
        }
@@ -598,10 +589,29 @@ ColorCode InsetMathHull::backgroundColor(PainterInfo const & pi) const
 }
 
 
+void InsetMathHull::drawMarkers(PainterInfo & pi, int x, int y) const
+{
+       ColorCode pen_color = mouseHovered(pi.base.bv) || editing(pi.base.bv)?
+               Color_mathframe : Color_mathcorners;
+       // If the corners have the same color as the background, do not paint them.
+       if (lcolor.getX11Name(Color_mathbg) == lcolor.getX11Name(pen_color))
+               return;
+
+       Inset::drawMarkers(pi, x, y);
+       Dimension const dim = dimension(*pi.base.bv);
+       int const t = x + dim.width() - 1;
+       int const a = y - dim.ascent();
+       pi.pain.line(x, a + 3, x, a, pen_color);
+       pi.pain.line(t, a + 3, t, a, pen_color);
+       pi.pain.line(x, a, x + 3, a, pen_color);
+       pi.pain.line(t - 3, a, t, a, pen_color);
+}
+
+
 void InsetMathHull::drawBackground(PainterInfo & pi, int x, int y) const
 {
        Dimension const dim = dimension(*pi.base.bv);
-       if (previewTooSmall(dim)) {
+       if (previewTooSmall(pi.base, dim)) {
                pi.pain.fillRectangle(x, y - 2 * ERROR_FRAME_WIDTH,
                    dim.wid, dim.asc + dim.des, backgroundColor(pi));
                return;
@@ -625,12 +635,14 @@ void InsetMathHull::draw(PainterInfo & pi, int x, int y) const
                // already.
                Changer dummy = !canPaintChange(*bv) ? make_change(pi.change_, Change())
                        : Changer();
-               if (previewTooSmall(dim)) {
+               if (previewTooSmall(pi.base, dim)) {
                        // we have an extra frame
                        preview_->draw(pi, x + ERROR_FRAME_WIDTH, y);
                } else {
                        // one pixel gap in front
-                       preview_->draw(pi, x + 1, y);
+                       // value was hardcoded to 1 pixel
+                       int const gap = pi.base.bv->zoomedPixels(1) ;
+                       preview_->draw(pi, x + gap, y);
                }
                return;
        }
@@ -641,21 +653,39 @@ void InsetMathHull::draw(PainterInfo & pi, int x, int y) const
        Changer dummy0 = really_change_color ? pi.base.font.changeColor(color)
                : Changer();
        Changer dummy1 = pi.base.changeFontSet(standardFont());
-       Changer dummy2 = pi.base.font.changeStyle(display() ? LM_ST_DISPLAY
-                                                           : LM_ST_TEXT);
+       Changer dummy2 = pi.base.font.changeStyle(display() ? FONT_STYLE_DISPLAY
+                                                           : FONT_STYLE_TEXT);
 
-       InsetMathGrid::draw(pi, x + 1, y);
-       drawMarkers2(pi, x, y);
+       int xmath = x;
+       BufferParams::MathNumber const math_number = buffer().params().getMathNumber();
+       if (numberedType() && math_number == BufferParams::LEFT) {
+               Changer dummy = pi.base.changeFontSet("mathrm");
+               int l = 0;
+               for (row_type row = 0; row < nrows(); ++row)
+                       l = max(l, mathed_string_width(pi.base.font, nicelabel(row)));
+
+               if (l)
+                       // Value was hardcoded to 30 pixels
+                       xmath += pi.base.bv->zoomedPixels(30) + l;
+       }
+
+       InsetMathGrid::draw(pi, xmath + 1, y);
+       drawMarkers(pi, x, y);
 
        if (numberedType()) {
-               int const xx = x + colinfo_.back().offset_ + colinfo_.back().width_ + 20;
+               Changer dummy = pi.base.changeFontSet("mathrm");
                for (row_type row = 0; row < nrows(); ++row) {
                        int const yy = y + rowinfo_[row].offset_;
-                       Changer dummy = pi.base.changeFontSet("mathrm");
                        docstring const nl = nicelabel(row);
-                       pi.draw(xx, yy, nl);
+                       if (math_number == BufferParams::LEFT)
+                               pi.draw(x, yy, nl);
+                       else {
+                               int l = mathed_string_width(pi.base.font, nl);
+                               pi.draw(x + dim.wid - l, yy, nl);
+                       }
                }
        }
+
        // drawing change line
        if (canPaintChange(*bv))
                pi.change_.paintCue(pi, x + 1, y + 1 - dim.asc,
@@ -733,8 +763,8 @@ void InsetMathHull::usedMacros(MathData const & md, DocIterator const & pos,
        MacroNameSet::iterator const end = macros.end();
 
        for (size_t i = 0; i < md.size(); ++i) {
-               MathMacro const * mi = md[i].nucleus()->asMacro();
-               MathMacroTemplate const * mt = md[i].nucleus()->asMacroTemplate();
+               InsetMathMacro const * mi = md[i].nucleus()->asMacro();
+               InsetMathMacroTemplate const * mt = md[i].nucleus()->asMacroTemplate();
                InsetMathScript const * si = md[i].nucleus()->asScriptInset();
                InsetMathFracBase const * fi = md[i].nucleus()->asFracBaseInset();
                InsetMathGrid const * gi = md[i].nucleus()->asGridInset();
@@ -804,11 +834,9 @@ void InsetMathHull::preparePreview(DocIterator const & pos,
        for (idx_type idx = 0; idx < nargs(); ++idx)
                usedMacros(cell(idx), pos, macros, defs);
 
-       MacroNameSet::iterator it = defs.begin();
-       MacroNameSet::iterator end = defs.end();
        docstring macro_preamble;
-       for (; it != end; ++it)
-               macro_preamble.append(*it);
+       for (auto const & defvar : defs)
+               macro_preamble.append(defvar);
 
        // set the font series and size for this snippet
        DocIterator dit = pos.getInnerText();
@@ -823,7 +851,7 @@ void InsetMathHull::preparePreview(DocIterator const & pos,
                endfont += '}';
        }
        if (lsize != "normalsize" && !prefixIs(lsize, "error"))
-               setfont += from_ascii("\\" + lsize + '\n'); 
+               setfont += from_ascii("\\" + lsize + '\n');
 
        docstring setcnt;
        if (forexport && haveNumbers()) {
@@ -993,12 +1021,31 @@ Inset::DisplayType InsetMathHull::display() const
        case hullEquation:
        case hullMultline:
        case hullGather:
-               return AlignCenter;
+               if (buffer().params().is_math_indent)
+                       return AlignLeft;
+               else
+                       return AlignCenter;
        }
        // avoid warning
        return AlignCenter;
 }
 
+
+int InsetMathHull::indent(BufferView const & bv) const
+{
+       // FIXME: set this in the textclass. This value is what the article class uses.
+       static Length default_indent(2.5, Length::EM);
+       if (display() != Inline && buffer().params().is_math_indent) {
+               Length const & len = buffer().params().getMathIndent();
+               if (len.empty())
+                       return bv.inPixels(default_indent);
+               else
+                       return bv.inPixels(len);
+       } else
+               return Inset::indent(bv);
+}
+
+
 bool InsetMathHull::numberedType() const
 {
        switch (type_) {
@@ -1612,7 +1659,8 @@ void InsetMathHull::mutate(HullType newtype)
 
        default:
                // we passed the guard so we should not be here
-               LASSERT("Mutation not implemented, but should have been.", return);
+               LYXERR0("Mutation not implemented, but should have been.");
+               LASSERT(false, return);
                break;
        }// switch
 }
@@ -1674,13 +1722,11 @@ void InsetMathHull::check() const
 
 void InsetMathHull::doExtern(Cursor & cur, FuncRequest & func)
 {
-       docstring dlang;
-       docstring extra;
-       idocstringstream iss(func.argument());
-       iss >> dlang >> extra;
+       //FIXME: sort out whether we want std::string or docstring for those
+       string const lang = func.getArg(0);
+       docstring extra = from_utf8(func.getArg(1));
        if (extra.empty())
                extra = from_ascii("noextra");
-       string const lang = to_ascii(dlang);
 
        // replace selection with result of computation
        if (reduceSelectionToOneCell(cur)) {
@@ -1982,7 +2028,7 @@ bool allowDisplayMath(Cursor const & cur)
        return tmpcur.getStatus(cmd, status) && status.enabled();
 }
 
-}
+} // namespace
 
 
 bool InsetMathHull::getStatus(Cursor & cur, FuncRequest const & cmd,
@@ -2046,11 +2092,10 @@ bool InsetMathHull::getStatus(Cursor & cur, FuncRequest const & cmd,
 
        case LFUN_LABEL_COPY_AS_REFERENCE: {
                bool enabled = false;
-               row_type row;
                if (cmd.argument().empty() && &cur.inset() == this) {
                        // if there is no argument and we're inside math, we retrieve
                        // the row number from the cursor position.
-                       row = (type_ == hullMultline) ? nrows() - 1 : cur.row();
+                       row_type row = (type_ == hullMultline) ? nrows() - 1 : cur.row();
                        enabled = numberedType() && label_[row] && numbered(row);
                } else {
                        // if there is an argument, find the corresponding label, else
@@ -2187,17 +2232,14 @@ void InsetMathHull::handleFont2(Cursor & cur, docstring const & arg)
        font.fromString(to_utf8(arg), b);
        if (font.fontInfo().color() != Color_inherit) {
                MathAtom at = MathAtom(new InsetMathColor(buffer_, true, font.fontInfo().color()));
-               cur.handleNest(at, 0);
+               cur.handleNest(at);
        }
 }
 
 
 void InsetMathHull::edit(Cursor & cur, bool front, EntryDirection entry_from)
 {
-       cur.push(*this);
-       bool enter_front = (entry_from == Inset::ENTRY_DIRECTION_LEFT ||
-               (entry_from == Inset::ENTRY_DIRECTION_IGNORE && front));
-       enter_front ? idxFirst(cur) : idxLast(cur);
+       InsetMathNest::edit(cur, front, entry_from);
        // 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.
@@ -2205,42 +2247,6 @@ void InsetMathHull::edit(Cursor & cur, bool front, EntryDirection entry_from)
 }
 
 
-void InsetMathHull::revealCodes(Cursor & cur) const
-{
-       if (!cur.inMathed())
-               return;
-       odocstringstream os;
-       cur.info(os);
-       cur.message(os.str());
-/*
-       // write something to the minibuffer
-       // translate to latex
-       cur.markInsert(bv);
-       ostringstream os;
-       write(os);
-       string str = os.str();
-       cur.markErase(bv);
-       string::size_type pos = 0;
-       string res;
-       for (string::iterator it = str.begin(); it != str.end(); ++it) {
-               if (*it == '\n')
-                       res += ' ';
-               else if (*it == '\0') {
-                       res += "  -X-  ";
-                       pos = it - str.begin();
-               }
-               else
-                       res += *it;
-       }
-       if (pos > 30)
-               res = res.substr(pos - 30);
-       if (res.size() > 60)
-               res = res.substr(0, 60);
-       cur.message(res);
-*/
-}
-
-
 /////////////////////////////////////////////////////////////////////
 
 
@@ -2317,8 +2323,8 @@ bool InsetMathHull::readQuiet(Lexer & lex)
 int InsetMathHull::plaintext(odocstringstream & os,
         OutputParams const & op, size_t max_length) const
 {
-       // disables ASCII-art for export of equations. See #2275.
-       if (0 && display()) {
+       // Try enabling this now that there is a flag as requested at #2275.
+       if (buffer().isExporting() && display()) {
                Dimension dim;
                TextMetricsInfo mi;
                metricsT(mi, dim);