]> git.lyx.org Git - features.git/commitdiff
Re-implement math markers logic.
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Fri, 6 Jan 2017 08:52:10 +0000 (09:52 +0100)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Wed, 11 Jan 2017 16:35:34 +0000 (17:35 +0100)
The goal of this patch is to be able to properly remove the space
needed for markers in the case of insets that are inside macros and do
not need these markers. This was attempted at 9a9a6a8, but did not
work reliably.

To this end, the following simplifications are made:

* instead of drawing its own markers, each inset has a virtual method
  marker() which prescribes either NO_MARKER, MARKER (normal bottom
  marker) or MARKER2 (top and bottom marker). All explicit calls to
  (draw|metrics)Markers(|2) are removed.

* the space necessary for the markers is now counted in the
  before/above margins in the row structure. Therefore painting will
  not happen at (x + 1, y), but just (x,y).

* the methods drawDecoration are removed.

* the helper methods InsetMath::(draw|metrics)Markers(|2) are removed
  and replaced by a new function drawMarkers in MathRow.cpp.

Now the marker type is kept in the MathRow::Element object (and set to
NO_MARKER in not editable context) and the marker is accounted for in
MathRow::(metrics|draw).

Moreover, the extra pixel for the marker is taken on the before/After
space if possible. The marker will only require extra space when
before/after is 0.

See comment 168 of #8883 to understand what issues are fixed.

39 files changed:
src/insets/Inset.h
src/mathed/InsetMath.cpp
src/mathed/InsetMath.h
src/mathed/InsetMathBoldSymbol.cpp
src/mathed/InsetMathBox.cpp
src/mathed/InsetMathBox.h
src/mathed/InsetMathBrace.cpp
src/mathed/InsetMathCancel.cpp
src/mathed/InsetMathCancelto.cpp
src/mathed/InsetMathClass.cpp
src/mathed/InsetMathColor.cpp
src/mathed/InsetMathComment.cpp
src/mathed/InsetMathDecoration.cpp
src/mathed/InsetMathEnsureMath.cpp
src/mathed/InsetMathEnv.cpp
src/mathed/InsetMathFont.cpp
src/mathed/InsetMathFontOld.cpp
src/mathed/InsetMathFrac.cpp
src/mathed/InsetMathFrac.h
src/mathed/InsetMathGrid.cpp
src/mathed/InsetMathGrid.h
src/mathed/InsetMathHull.cpp
src/mathed/InsetMathLefteqn.cpp
src/mathed/InsetMathNest.h
src/mathed/InsetMathOverset.cpp
src/mathed/InsetMathPhantom.cpp
src/mathed/InsetMathRoot.cpp
src/mathed/InsetMathScript.cpp
src/mathed/InsetMathSideset.cpp
src/mathed/InsetMathSize.cpp
src/mathed/InsetMathSqrt.cpp
src/mathed/InsetMathStackrel.cpp
src/mathed/InsetMathUnderset.cpp
src/mathed/InsetMathXArrow.cpp
src/mathed/MathMacro.cpp
src/mathed/MathMacro.h
src/mathed/MathMacroTemplate.cpp
src/mathed/MathRow.cpp
src/mathed/MathRow.h

index 0922b4a3f485081e88570bd9d27316ec9eec4800..0783ec1ffbb0c1dea4d130b1a39358d072e9036f 100644 (file)
@@ -198,17 +198,19 @@ public:
        ///
        virtual bool showInsetDialog(BufferView *) const;
 
-       /// draw inset decoration if necessary.
-       /// This can use \c drawMarkers() for example.
-       virtual void drawDecoration(PainterInfo &, int, int) const {}
-       /// draw four angular markers
-       void drawMarkers(PainterInfo & pi, int x, int y) const;
+       // The possible marker types for insets
+       enum marker_type { NO_MARKER, MARKER2, MARKER };
        /// draw two angular markers
+       void drawMarkers(PainterInfo & pi, int x, int y) const;
+       /// draw four angular markers
        void drawMarkers2(PainterInfo & pi, int x, int y) const;
        /// add space for markers
        void metricsMarkers(Dimension & dim, int framesize = 1) const;
        /// add space for markers
        void metricsMarkers2(Dimension & dim, int framesize = 1) const;
+       /// draw inset decoration if necessary.
+       /// This can use \c drawMarkers() for example.
+       virtual void drawDecoration(PainterInfo &, int, int) const {}
 
        /// last metrics computed for the inset
        Dimension const dimension(BufferView const &) const;
index 093dcda4d08366a867d7f19581eedb97c8af2d7f..e3b46b9e5caa484c9613e27ff992af3d85d8d036 100644 (file)
@@ -58,44 +58,21 @@ MathClass InsetMath::mathClass() const
 }
 
 
+InsetMath::marker_type InsetMath::marker() const
+{
+       return nargs() > 0 ? MARKER : NO_MARKER;
+}
+
+
 bool InsetMath::addToMathRow(MathRow & mrow, MetricsInfo & mi) const
 {
        MathRow::Element e(mi, MathRow::INSET, mathClass());
        e.inset = this;
+       e.marker = mi.base.macro_nesting ? NO_MARKER : marker();
        mrow.push_back(e);
        return true;
 }
 
-void InsetMath::metricsMarkers(MetricsInfo & mi, Dimension & dim,
-                           int framesize) const
-{
-       if (!mi.base.macro_nesting)
-               Inset::metricsMarkers(dim, framesize);
-}
-
-
-void InsetMath::metricsMarkers2(MetricsInfo & mi, Dimension & dim,
-                            int framesize) const
-{
-       if (!mi.base.macro_nesting)
-               Inset::metricsMarkers2(dim, framesize);
-}
-
-
-void InsetMath::drawMarkers(PainterInfo & pi, int x, int y) const
-{
-       if (!pi.base.macro_nesting)
-               Inset::drawMarkers(pi, x, y);
-}
-
-
-void InsetMath::drawMarkers2(PainterInfo & pi, int x, int y) const
-{
-       if (!pi.base.macro_nesting)
-               Inset::drawMarkers2(pi, x, y);
-}
-
-
 
 void InsetMath::dump() const
 {
index e8c893bda5d9e8046859792cd3fe9e510a0b98ec..68cd59793ec9e0014fe1d33dbe68def1e6f73821 100644 (file)
@@ -114,6 +114,9 @@ public:
        /// this is overridden by specific insets
        virtual mode_type currentMode() const { return MATH_MODE; }
 
+       /// this is overridden by insets with specific edit marker type
+       virtual marker_type marker() const;
+
        /// the ascent of the inset above the baseline
        /// compute the size of the object for text based drawing
        virtual void metricsT(TextMetricsInfo const & mi, Dimension & dim) const;
@@ -169,15 +172,6 @@ public:
        /// Add this inset to a math row. Return true if contents got added
        virtual bool addToMathRow(MathRow &, MetricsInfo & mi) const;
 
-       /// draw four angular markers
-       void drawMarkers(PainterInfo & pi, int x, int y) const;
-       /// draw two angular markers
-       void drawMarkers2(PainterInfo & pi, int x, int y) const;
-       /// add space for markers
-       void metricsMarkers(MetricsInfo & mi, Dimension & dim, int framesize = 1) const;
-       /// add space for markers
-       void metricsMarkers2(MetricsInfo & mi, Dimension & dim, int framesize = 1) const;
-
        /// identifies things that can get scripts
        virtual bool isScriptable() const { return false; }
        /// will this get written as a single block in {..}
index d8205198843e821056080a0670a12f0097bf8038..62f8098fa1c1ecf0ed8d8ff6c83cdb8295a6f234 100644 (file)
@@ -53,7 +53,6 @@ void InsetMathBoldSymbol::metrics(MetricsInfo & mi, Dimension & dim) const
        Changer dummy = mi.base.changeEnsureMath();
        //Changer dummy = mi.base.changeFontSet("mathbf");
        cell(0).metrics(mi, dim);
-       metricsMarkers(mi, dim);
        ++dim.wid;  // for 'double stroke'
 }
 
@@ -62,9 +61,8 @@ void InsetMathBoldSymbol::draw(PainterInfo & pi, int x, int y) const
 {
        Changer dummy = pi.base.changeEnsureMath();
        //Changer dummy = pi.base.changeFontSet("mathbf");
+       cell(0).draw(pi, x, y);
        cell(0).draw(pi, x + 1, y);
-       cell(0).draw(pi, x + 2, y);
-       drawMarkers(pi, x, y);
 }
 
 
index aff3fb6c634847b94e20b86f315c50985547b381..4c832f0dc5f9c01ba474a2739bad822fb5dc4c62 100644 (file)
@@ -83,7 +83,6 @@ void InsetMathBox::metrics(MetricsInfo & mi, Dimension & dim) const
 {
        Changer dummy = mi.base.changeFontSet("textnormal");
        cell(0).metrics(mi, dim);
-       metricsMarkers(mi, dim);
 }
 
 
@@ -91,12 +90,11 @@ void InsetMathBox::draw(PainterInfo & pi, int x, int y) const
 {
        Changer dummy = pi.base.changeFontSet("textnormal");
        cell(0).draw(pi, x, y);
-       drawMarkers(pi, x, y);
 }
 
 
 void InsetMathBox::infoize(odocstream & os) const
-{      
+{
        os << bformat(_("Box: %1$s"), name_);
 }
 
@@ -135,7 +133,10 @@ void InsetMathFBox::metrics(MetricsInfo & mi, Dimension & dim) const
 {
        Changer dummy = mi.base.changeFontSet("textnormal");
        cell(0).metrics(mi, dim);
-       metricsMarkers2(mi, dim, 3); // 1 pixel space, 1 frame, 1 space
+       // 1 pixel space, 1 frame, 1 space
+       dim.wid += 2 * 3;
+       dim.asc += 3;
+       dim.des += 3;
 }
 
 
@@ -219,23 +220,23 @@ InsetMathMakebox::InsetMathMakebox(Buffer * buf, bool framebox)
 void InsetMathMakebox::metrics(MetricsInfo & mi, Dimension & dim) const
 {
        Changer dummy = mi.base.changeFontSet("textnormal");
-       
+
        Dimension wdim;
        static docstring bracket = from_ascii("[");
        metricsStrRedBlack(mi, wdim, bracket);
        int w = wdim.wid;
-       
+
        Dimension dim0;
        Dimension dim1;
        Dimension dim2;
        cell(0).metrics(mi, dim0);
        cell(1).metrics(mi, dim1);
        cell(2).metrics(mi, dim2);
-       
+
        dim.wid = w + dim0.wid + w + w + dim1.wid + w + 2 + dim2.wid;
-       dim.asc = std::max(std::max(wdim.asc, dim0.asc), std::max(dim1.asc, dim2.asc)); 
+       dim.asc = std::max(std::max(wdim.asc, dim0.asc), std::max(dim1.asc, dim2.asc));
        dim.des = std::max(std::max(wdim.des, dim0.des), std::max(dim1.des, dim2.des));
-       
+
        if (framebox_) {
                dim.wid += 4;
                dim.asc += 3;
@@ -244,26 +245,22 @@ void InsetMathMakebox::metrics(MetricsInfo & mi, Dimension & dim) const
                dim.asc += 1;
                dim.des += 1;
        }
-       
-       metricsMarkers(mi, dim);
 }
 
 
 void InsetMathMakebox::draw(PainterInfo & pi, int x, int y) const
 {
-       drawMarkers(pi, x, y);
-       
        Changer dummy = pi.base.changeFontSet("textnormal");
        BufferView const & bv = *pi.base.bv;
        int w = mathed_char_width(pi.base.font, '[');
-       
+
        if (framebox_) {
                Dimension const dim = dimension(*pi.base.bv);
                pi.pain.rectangle(x + 1, y - dim.ascent() + 1,
                                  dim.width() - 2, dim.height() - 2, Color_foreground);
                x += 2;
        }
-       
+
        drawStrBlack(pi, x, y, from_ascii("["));
        x += w;
        cell(0).draw(pi, x, y);
@@ -359,7 +356,10 @@ InsetMathBoxed::InsetMathBoxed(Buffer * buf)
 void InsetMathBoxed::metrics(MetricsInfo & mi, Dimension & dim) const
 {
        cell(0).metrics(mi, dim);
-       metricsMarkers2(mi, dim, 3); // 1 pixel space, 1 frame, 1 space
+       // 1 pixel space, 1 frame, 1 space
+       dim.wid += 2 * 3;
+       dim.asc += 3;
+       dim.des += 3;
 }
 
 
index 2f6ba483d9794bb18a44e3cb712c57eb1982a84b..e898a35920165125b3820795c23a05e19ae85e20 100644 (file)
@@ -58,6 +58,8 @@ public:
        ///
        mode_type currentMode() const { return TEXT_MODE; }
        ///
+       marker_type marker() const { return NO_MARKER; }
+       ///
        void metrics(MetricsInfo & mi, Dimension & dim) const;
        ///
        void draw(PainterInfo & pi, int x, int y) const;
@@ -116,6 +118,8 @@ public:
        ///
        InsetMathBoxed(Buffer * buf);
        ///
+       marker_type marker() const { return NO_MARKER; }
+       ///
        void validate(LaTeXFeatures & features) const;
        ///
        void metrics(MetricsInfo & mi, Dimension & dim) const;
index 6870fa609dd5c212d54a6ddafed114871de8ee0f..3a452c03862a94f8763a218421994a1953324657 100644 (file)
@@ -55,7 +55,6 @@ void InsetMathBrace::metrics(MetricsInfo & mi, Dimension & dim) const
        dim.asc = max(dim0.asc, t.asc);
        dim.des = max(dim0.des, t.des);
        dim.wid = dim0.width() + 2 * t.wid;
-       metricsMarkers(mi, dim);
 }
 
 
@@ -70,7 +69,6 @@ void InsetMathBrace::draw(PainterInfo & pi, int x, int y) const
        cell(0).draw(pi, x + t.wid, y);
        Dimension const & dim0 = cell(0).dimension(*pi.base.bv);
        pi.pain.text(x + t.wid + dim0.width(), y, '}', font);
-       drawMarkers(pi, x, y);
 }
 
 
index e0c86114a8ed71f9b680cdc1c5e68dfa9c38ef49..098f2a8af9f6a5ac81bb9ee4d3aaf2f5b306d761 100644 (file)
@@ -39,7 +39,6 @@ void InsetMathCancel::metrics(MetricsInfo & mi, Dimension & dim) const
 {
        Changer dummy = mi.base.changeEnsureMath();
        cell(0).metrics(mi, dim);
-       metricsMarkers(mi, dim);
 }
 
 
@@ -48,7 +47,7 @@ void InsetMathCancel::draw(PainterInfo & pi, int x, int y) const
        Changer dummy = pi.base.changeEnsureMath();
        // We first draw the text and then an arrow
        ColorCode const origcol = pi.base.font.color();
-       cell(0).draw(pi, x + 1, y);
+       cell(0).draw(pi, x, y);
        Dimension const dim = dimension(*pi.base.bv);
        int const t = pi.base.solidLineThickness();
 
@@ -75,8 +74,6 @@ void InsetMathCancel::draw(PainterInfo & pi, int x, int y) const
                pi.pain.line(x2, y1, x1, y2, origcol, pi.pain.line_solid, t);
                pi.pain.line(x2, y2, x1, y1, origcol, pi.pain.line_solid, t);
        }
-
-       drawMarkers(pi, x, y);
 }
 
 
index 283a97157d7d9c66033523fae6778d8032d7e026..f3ead3cd3a6dd2bea6d75cc46ff7ddfe7fa1e135 100644 (file)
@@ -48,7 +48,6 @@ void InsetMathCancelto::metrics(MetricsInfo & mi, Dimension & dim) const
        dim.asc = max(dim0.ascent() + 2, dim0.ascent() + dim1.ascent()) + 2 + 8;
        dim.des = max(dim0.descent() - 2, dim1.descent()) + 2;
        dim.wid = dim0.width() + dim1.width() + 10;
-       metricsMarkers(mi, dim);
 }
 
 
@@ -59,11 +58,11 @@ void InsetMathCancelto::draw(PainterInfo & pi, int x, int y) const
 
        // We first draw the text and then an arrow
        Dimension const & dim0 = cell(0).dimension(*pi.base.bv);
-       cell(0).draw(pi, x + 1, y);
-       cell(1).draw(pi, x + dim0.wid + 2 + 8, y - dim0.asc - 8);
-               
+       cell(0).draw(pi, x, y);
+       cell(1).draw(pi, x + dim0.wid + 1 + 8, y - dim0.asc - 8);
+
        //Dimension const dim = dimension(*pi.base.bv);
-       
+
        // y3____ ___
        //          /|
        // y2_     / |
@@ -86,8 +85,6 @@ void InsetMathCancelto::draw(PainterInfo & pi, int x, int y) const
        // the arrow bars
        pi.pain.line(x3, y3, x2 + 2, y3, origcol);
        pi.pain.line(x3, y3, x3 - 2, y2 - 2, origcol);
-
-       drawMarkers(pi, x, y);
 }
 
 
index 0237f250d054ff192383758ef9b3af585b6b97f3..2327cbe76d4e364276e2b2e2ee535bbaa6a66fef 100644 (file)
@@ -31,14 +31,12 @@ Inset * InsetMathClass::clone() const
 void InsetMathClass::metrics(MetricsInfo & mi, Dimension & dim) const
 {
        cell(0).metrics(mi, dim);
-       metricsMarkers(mi, dim);
 }
 
 
 void InsetMathClass::draw(PainterInfo & pi, int x, int y) const
 {
-       cell(0).draw(pi, x + 1, y);
-       drawMarkers(pi, x, y);
+       cell(0).draw(pi, x, y);
 }
 
 
index ea4f4ef6e29793c84a8d62be1a906f6523dc7111..6cb996013b13d10682c788733f0edba5d66ad9f7 100644 (file)
@@ -49,7 +49,6 @@ Inset * InsetMathColor::clone() const
 void InsetMathColor::metrics(MetricsInfo & mi, Dimension & dim) const
 {
        cell(0).metrics(mi, dim);
-       metricsMarkers(mi, dim);
 }
 
 
@@ -57,9 +56,8 @@ void InsetMathColor::draw(PainterInfo & pi, int x, int y) const
 {
        ColorCode origcol = pi.base.font.color();
        pi.base.font.setColor(lcolor.getFromLaTeXName(to_utf8(color_)));
-       cell(0).draw(pi, x + 1, y);
+       cell(0).draw(pi, x, y);
        pi.base.font.setColor(origcol);
-       drawMarkers(pi, x, y);
 }
 
 
index b8c157b2c2cff3e46d70f3b30399419af781eca4..ea502d1aa2ef1fd7a7ab504c3799f5dc49cc489e 100644 (file)
@@ -50,14 +50,12 @@ Inset * InsetMathComment::clone() const
 void InsetMathComment::metrics(MetricsInfo & mi, Dimension & dim) const
 {
        cell(0).metrics(mi, dim);
-       metricsMarkers(mi, dim);
 }
 
 
 void InsetMathComment::draw(PainterInfo & pi, int x, int y) const
 {
-       cell(0).draw(pi, x + 1, y);
-       drawMarkers(pi, x, y);
+       cell(0).draw(pi, x, y);
 }
 
 
index e4cb25a1c3cf35cd52ad9cc71ba659dc587e4c34..47792498915e4737d09c02d77a391e2d57703417 100644 (file)
@@ -119,8 +119,6 @@ void InsetMathDecoration::metrics(MetricsInfo & mi, Dimension & dim) const
                dy_ = dim.des + 1;
                dim.des += dh_ + 2;
        }
-
-       metricsMarkers(mi, dim);
 }
 
 
@@ -128,14 +126,13 @@ void InsetMathDecoration::draw(PainterInfo & pi, int x, int y) const
 {
        Changer dummy = pi.base.changeEnsureMath(currentMode());
 
-       cell(0).draw(pi, x + 1, y);
+       cell(0).draw(pi, x, y);
        Dimension const & dim0 = cell(0).dimension(*pi.base.bv);
        if (wide())
                mathed_draw_deco(pi, x + 1, y + dy_, dim0.wid, dh_, key_->name);
        else
                mathed_draw_deco(pi, x + 1 + (dim0.wid - dw_) / 2,
                        y + dy_, dw_, dh_, key_->name);
-       drawMarkers(pi, x, y);
 }
 
 
index 1897781aa6707a64c4152e49323b1e0c26f089ea..8bd685c5a0c6181290d2261da91b7634439f5d81 100644 (file)
@@ -40,7 +40,6 @@ void InsetMathEnsureMath::metrics(MetricsInfo & mi, Dimension & dim) const
 {
        Changer dummy = mi.base.changeEnsureMath();
        cell(0).metrics(mi, dim);
-       metricsMarkers(mi, dim);
 }
 
 
@@ -48,7 +47,6 @@ void InsetMathEnsureMath::draw(PainterInfo & pi, int x, int y) const
 {
        Changer dummy = pi.base.changeEnsureMath();
        cell(0).draw(pi, x, y);
-       drawMarkers(pi, x, y);
 }
 
 
index 41263562cde8d37a90a5d99f9bddd7f6152a4861..2eea5ac4185815f979f39c25b9a119b8f048b532 100644 (file)
@@ -42,15 +42,13 @@ void InsetMathEnv::metrics(MetricsInfo & mi, Dimension & dim) const
 {
        Changer dummy = mi.base.changeEnsureMath();
        cell(0).metrics(mi, dim);
-       metricsMarkers(mi, dim);
 }
 
 
 void InsetMathEnv::draw(PainterInfo & pi, int x, int y) const
 {
        Changer dummy = pi.base.changeEnsureMath();
-       cell(0).draw(pi, x + 1, y);
-       drawMarkers(pi, x, y);
+       cell(0).draw(pi, x, y);
 }
 
 
index 05f9e66e73b081b51fa5653343dfa75d8ff3abd9..987612361e788e547b3c7faa36f421ae578a2ccc 100644 (file)
@@ -86,15 +86,13 @@ void InsetMathFont::metrics(MetricsInfo & mi, Dimension & dim) const
 {
        Changer dummy = mi.base.changeFontSet(font());
        cell(0).metrics(mi, dim);
-       metricsMarkers(mi, dim);
 }
 
 
 void InsetMathFont::draw(PainterInfo & pi, int x, int y) const
 {
        Changer dummy = pi.base.changeFontSet(font());
-       cell(0).draw(pi, x + 1, y);
-       drawMarkers(pi, x, y);
+       cell(0).draw(pi, x, y);
 }
 
 
index 11ba283fdf9efc51ed1ff593f82b4441cff257bd..cde388840cd9b755df53199b5575579e4dbfc708 100644 (file)
@@ -62,7 +62,6 @@ void InsetMathFontOld::metrics(MetricsInfo & mi, Dimension & dim) const
        Changer dummy = really_change_font ? mi.base.changeFontSet(fontname)
                : Changer();
        cell(0).metrics(mi, dim);
-       metricsMarkers(mi, dim);
 }
 
 
@@ -79,8 +78,7 @@ void InsetMathFontOld::draw(PainterInfo & pi, int x, int y) const
 
        Changer dummy = really_change_font ? pi.base.changeFontSet(fontname)
                : Changer();
-       cell(0).draw(pi, x + 1, y);
-       drawMarkers(pi, x, y);
+       cell(0).draw(pi, x, y);
 }
 
 
index ada6476c50cd9edce15c256756e2416222699009..465d1facd1321b51c6f944fe228cdf9500ba7232 100644 (file)
@@ -261,7 +261,6 @@ void InsetMathFrac::metrics(MetricsInfo & mi, Dimension & dim) const
                dim.des = max(0, dim1.height() + dy/2 - dy + t);
        }
        } //switch (kind_)
-       metricsMarkers(mi, dim);
 }
 
 
@@ -278,12 +277,12 @@ void InsetMathFrac::draw(PainterInfo & pi, int x, int y) const
                // is there an extra cell holding the value being given a dimension?
                // (this is \unittwo)
                if (nargs() == 2) {
-                       cell(0).draw(pi, x + 1, y);
+                       cell(0).draw(pi, x, y);
                        xx += dim0.wid + 4;
                        unit_cell = 1;
                }
                Changer dummy = pi.base.font.changeShape(UP_SHAPE);
-               cell(unit_cell).draw(pi, xx + 1, y);
+               cell(unit_cell).draw(pi, xx, y);
        }
                break;
 
@@ -295,24 +294,24 @@ void InsetMathFrac::draw(PainterInfo & pi, int x, int y) const
                // is there an extra cell holding the value being given a dimension?
                // (this is \unitfracthree)
                if (kind_ == UNITFRAC && nargs() == 3) {
-                       cell(2).draw(pi, x + 1, y);
+                       cell(2).draw(pi, x, y);
                        xx += cell(2).dimension(*pi.base.bv).wid + 4;
                }
                Changer dummy = (kind_ == UNITFRAC) ? pi.base.font.changeShape(UP_SHAPE)
                        : Changer();
                // nice fraction
                Changer dummy2 = pi.base.changeScript();
-               cell(0).draw(pi, xx + 2, y - dy);
+               cell(0).draw(pi, xx, y - dy);
                // reference LaTeX code from nicefrac.sty:
                //    \mkern-2mu/\mkern-1mu
                if (latexkeys const * slash = slash_symbol()) {
                        int mkern = mathed_mu(pi.base.font, 2.0);
-                       mathedSymbolDraw(pi, xx + 2 + dim0.wid - mkern, y, slash);
+                       mathedSymbolDraw(pi, xx + 1 + dim0.wid - mkern, y, slash);
                        Dimension dimslash;
                        mathedSymbolDim(pi.base, dimslash, slash);
                        xx += dimslash.wid - mathed_mu(pi.base.font, 3.0);
                }
-               cell(1).draw(pi, xx + 2 + dim0.wid, y);
+               cell(1).draw(pi, xx + 1 + dim0.wid, y);
        }
                break;
 
@@ -339,7 +338,7 @@ void InsetMathFrac::draw(PainterInfo & pi, int x, int y) const
                int const m = x + dim.wid / 2;
                int const xx =
                        // align left
-                       (kind_ == CFRACLEFT) ? x + 2 :
+                       (kind_ == CFRACLEFT) ? x + 1 :
                        // align right
                        (kind_ == CFRACRIGHT) ? x + dim.wid - dim0.wid - 2 :
                        // center
@@ -355,11 +354,10 @@ void InsetMathFrac::draw(PainterInfo & pi, int x, int y) const
                cell(1).draw(pi, m - dim1.wid / 2, y + dim1.asc + dy/2 - dy + t);
                // horizontal line
                if (kind_ != ATOP)
-                       pi.pain.line(x + 1, y - dy, x + dim.wid - 2, y - dy,
+                       pi.pain.line(x, y - dy, x + dim.wid - 2, y - dy,
                                     pi.base.font.color(), pi.pain.line_solid, t);
        }
        } //switch (kind_)
-       drawMarkers(pi, x, y);
 }
 
 
@@ -660,7 +658,6 @@ void InsetMathBinom::metrics(MetricsInfo & mi, Dimension & dim) const
        dim.asc = dim0.height() + 1 + dy/2 + dy;
        dim.des = max(0, dim1.height() + 1 + dy/2 - dy);
        dim.wid = max(dim0.wid, dim1.wid) + 2 * dw(dim.height()) + 4;
-       metricsMarkers2(mi, dim);
 }
 
 
@@ -693,7 +690,6 @@ void InsetMathBinom::draw(PainterInfo & pi, int x, int y) const
                dim.height(), bra);
        mathed_draw_deco(pi, x + dim.width() - dw(dim.height()),
                y - dim.ascent(), dw(dim.height()), dim.height(), ket);
-       drawMarkers2(pi, x, y);
 }
 
 
index 9d5484487687932368f8bd45dc2be588cd4f47c1..b43180c41639405bae1732f944301da37db0b240 100644 (file)
@@ -125,12 +125,11 @@ public:
        /// Generalized fractions are of inner class (see The TeXbook, p.292)
        MathClass mathClass() const { return MC_INNER; }
        ///
+       marker_type marker() const { return MARKER2; }
+       ///
        void metrics(MetricsInfo & mi, Dimension & dim) const;
        ///
        void draw(PainterInfo &, int x, int y) const;
-       /// draw decorations.
-       void drawDecoration(PainterInfo & pi, int x, int y) const
-       { drawMarkers2(pi, x, y); }
        ///
        bool extraBraces() const;
        ///
index 07a67c75cca90d4ddd4f2f5880b3642c4105781b..67300403907d947f43f1ca71e2b75323bf2192e6 100644 (file)
@@ -588,7 +588,6 @@ void InsetMathGrid::metrics(MetricsInfo & mi, Dimension & dim) const
        }
 */
        dim.wid += leftMargin() + rightMargin();
-       metricsMarkers2(mi, dim);
 }
 
 
@@ -653,8 +652,6 @@ void InsetMathGrid::draw(PainterInfo & pi, int x, int y) const
                        pi.pain.line(xx1, yy, xx2, yy, Color_foreground);
                }
        }
-
-       drawMarkers2(pi, x, y);
 }
 
 
index 4300dc31881d6f580c67823f97b2736e2fde07c2..886d03a8ee3321e33661988bcf20c32862ff9576 100644 (file)
@@ -103,9 +103,6 @@ public:
        void metrics(MetricsInfo & mi, Dimension &) const;
        ///
        void draw(PainterInfo & pi, int x, int y) const;
-       /// draw decorations.
-       void drawDecoration(PainterInfo & pi, int x, int y) const
-       { drawMarkers2(pi, x, y); }
        ///
        void metricsT(TextMetricsInfo const & mi, Dimension & dim) const;
        ///
@@ -248,9 +245,9 @@ protected:
        /// Width of cell, taking combined columns into account
        int cellWidth(idx_type idx) const;
        ///
-       virtual int leftMargin() const { return 1; }
+       virtual int leftMargin() const { return 0; }
        ///
-       virtual int rightMargin() const { return 1; }
+       virtual int rightMargin() const { return 0; }
 
        /// returns proper 'end of line' code for LaTeX
        virtual docstring eolString(row_type row, bool fragile, bool latex,
index 61e02104874241536902cf1441b1e98f0d25d2c7..b326aebb5bf5364c3c256c4d24e34455240dc419 100644 (file)
@@ -567,8 +567,9 @@ void InsetMathHull::metrics(MetricsInfo & mi, Dimension & dim) const
                        dim.wid += 30 + l;
        }
 
-       if (type_ == hullRegexp)
-               dim.wid += 2;
+       // reserve some space for marker.
+       dim.wid += 2;
+
        // make it at least as high as the current font
        int asc = 0;
        int des = 0;
@@ -644,6 +645,7 @@ void InsetMathHull::draw(PainterInfo & pi, int x, int y) const
                                                            : LM_ST_TEXT);
 
        InsetMathGrid::draw(pi, x + 1, y);
+       drawMarkers2(pi, x, y);
 
        if (numberedType()) {
                int const xx = x + colinfo_.back().offset_ + colinfo_.back().width_ + 20;
index 176c7431cf5f53edc6ec079087d5690a5652ed5e..c4aa8b1f4f093c207e416416bf5c7843f0e0aead 100644 (file)
@@ -34,14 +34,12 @@ void InsetMathLefteqn::metrics(MetricsInfo & mi, Dimension & dim) const
        dim.asc += 2;
        dim.des += 2;
        dim.wid = 4;
-       metricsMarkers(mi, dim);
 }
 
 
 void InsetMathLefteqn::draw(PainterInfo & pi, int x, int y) const
 {
-       cell(0).draw(pi, x + 2, y);
-       drawMarkers(pi, x, y);
+       cell(0).draw(pi, x + 1, y);
 }
 
 
index 80f5f6d9d67f3a46f4f78a4f8a0ac20dac607e39..06668c9d2aa33a7cf1302b151f6e19afef86b8d9 100644 (file)
@@ -48,9 +48,6 @@ public:
        void draw(PainterInfo & pi, int x, int y) const;
        /// draw selection background
        void drawSelection(PainterInfo & pi, int x, int y) const;
-       /// draw decorations.
-       void drawDecoration(PainterInfo & pi, int x, int y) const
-       { drawMarkers(pi, x, y); }
        ///
        void updateBuffer(ParIterator const &, UpdateType);
        /// identifies NestInsets
index b903662d944cb156b40740aab379ec230533c40c..cea8840926ae6ef7ccae44dedf55d2668920ebc5 100644 (file)
@@ -40,7 +40,6 @@ void InsetMathOverset::metrics(MetricsInfo & mi, Dimension & dim) const
        dim.wid = max(dim0.width(), dim1.wid) + 4;
        dim.asc = dim1.asc + dim0.height() + 4;
        dim.des = dim1.des;
-       metricsMarkers(mi, dim);
 }
 
 
@@ -55,7 +54,6 @@ void InsetMathOverset::draw(PainterInfo & pi, int x, int y) const
        cell(1).draw(pi, m - dim1.wid / 2, y);
        Changer dummy = pi.base.changeFrac();
        cell(0).draw(pi, m - dim0.width() / 2, yo);
-       drawMarkers(pi, x, y);
 }
 
 
index 1ae8eee07b65b2632a9d42526344717cbdfae704..583e9f0b899ea7773a9db9cba8f645337e662062 100644 (file)
@@ -40,7 +40,6 @@ void InsetMathPhantom::metrics(MetricsInfo & mi, Dimension & dim) const
 {
        Changer dummy = mi.base.changeEnsureMath();
        cell(0).metrics(mi, dim);
-       metricsMarkers(mi, dim);
 }
 
 
@@ -53,7 +52,7 @@ void InsetMathPhantom::draw(PainterInfo & pi, int x, int y) const
        ColorCode const origcol = pi.base.font.color();
        if (visibleContents())
                pi.base.font.setColor(Color_special);
-       cell(0).draw(pi, x + 1, y);
+       cell(0).draw(pi, x, y);
        if (visibleContents())
                pi.base.font.setColor(origcol);
        Dimension const dim = dimension(*pi.base.bv);
@@ -247,8 +246,6 @@ void InsetMathPhantom::draw(PainterInfo & pi, int x, int y) const
                else
                        pi.pain.line(x2, y1, x2, y5, Color_added_space);
        }
-
-       drawMarkers(pi, x, y);
 }
 
 
index 8c4d1fa5ac784b94403c964b20bb729ee0014d74..f8f36d8214a09c49e71d9246ea01d7e37693fe85 100644 (file)
@@ -48,7 +48,6 @@ void InsetMathRoot::metrics(MetricsInfo & mi, Dimension & dim) const
        dim.asc = max(dim0.ascent()  + 5, dim1.ascent())  + 2;
        dim.des = max(dim0.descent() - 5, dim1.descent()) + 2;
        dim.wid = dim0.width() + dim1.width() + 10;
-       metricsMarkers(mi, dim);
 }
 
 
@@ -73,7 +72,6 @@ void InsetMathRoot::draw(PainterInfo & pi, int x, int y) const
        xp[2] = x + w - 2;         yp[2] = y + (d - a)/2 + 2;
        xp[3] = x + w - 5;         yp[3] = y + (d - a)/2 + 4;
        pi.pain.lines(xp, yp, 4, pi.base.font.color());
-       drawMarkers(pi, x, y);
 }
 
 
index a4ffd576b03bea104467d878bba6cfdc7543550a..b5e70fd6313a8eb2600135f16200c01f22ccb2c6 100644 (file)
@@ -337,7 +337,6 @@ void InsetMathScript::metrics(MetricsInfo & mi, Dimension & dim) const
                dim.des = max(nd, des);
        } else
                dim.des = nd;
-       metricsMarkers(mi, dim);
 }
 
 
@@ -357,7 +356,6 @@ void InsetMathScript::draw(PainterInfo & pi, int x, int y) const
                up().draw(pi, x + dx1(bv), y - dy1(bv));
        if (hasDown())
                down().draw(pi, x + dx0(bv), y + dy0(bv));
-       drawMarkers(pi, x, y);
 }
 
 
index 02ac4badd679b57b164924822eb600a6fbfb450b..2638fefdb877f67c236fa65f52729ee8bc66c545 100644 (file)
@@ -222,7 +222,6 @@ void InsetMathSideset::metrics(MetricsInfo & mi, Dimension & dim) const
        int nd = ndes(bv);
        int des = dyb(bv) + max(dimbl.descent(), dimbr.descent());
        dim.des = max(nd, des);
-       metricsMarkers(mi, dim);
 }
 
 
@@ -244,7 +243,6 @@ void InsetMathSideset::draw(PainterInfo & pi, int x, int y) const
                br().draw(pi, x + dxr(bv), y + dyb(bv));
                tr().draw(pi, x + dxr(bv), y - dyt(bv));
        }
-       drawMarkers(pi, x, y);
 }
 
 
index 534010b688d287d4d5326dde6f16736e0a8bb14a..18d0aaf95a9c4ab5167b672b63e821d67e937df0 100644 (file)
@@ -47,7 +47,6 @@ void InsetMathSize::metrics(MetricsInfo & mi, Dimension & dim) const
        Changer dummy2 = mi.base.changeEnsureMath();
        Changer dummy = mi.base.font.changeStyle(style_);
        cell(0).metrics(mi, dim);
-       metricsMarkers(mi, dim);
 }
 
 
@@ -55,8 +54,7 @@ void InsetMathSize::draw(PainterInfo & pi, int x, int y) const
 {
        Changer dummy2 = pi.base.changeEnsureMath();
        Changer dummy = pi.base.font.changeStyle(style_);
-       cell(0).draw(pi, x + 1, y);
-       drawMarkers(pi, x, y);
+       cell(0).draw(pi, x, y);
 }
 
 
index 1f58dce4dbf979f595412bcc9a080f81a3a74260..4505d705671056901cb8faf8fed407edc1d03ada 100644 (file)
@@ -42,26 +42,24 @@ void InsetMathSqrt::metrics(MetricsInfo & mi, Dimension & dim) const
        dim.asc += 4;
        dim.des += 2;
        dim.wid += 12;
-       metricsMarkers(mi, dim);
 }
 
 
 void InsetMathSqrt::draw(PainterInfo & pi, int x, int y) const
 {
        Changer dummy = pi.base.changeEnsureMath();
-       cell(0).draw(pi, x + 10, y);
+       cell(0).draw(pi, x + 9, y);
        Dimension const dim = dimension(*pi.base.bv);
        int const a = dim.ascent();
        int const d = dim.descent();
        int xp[3];
        int yp[3];
        pi.pain.line(x + dim.width(), y - a + 1,
-               x + 8, y - a + 1, pi.base.font.color());
-       xp[0] = x + 8;            yp[0] = y - a + 1;
-       xp[1] = x + 5;            yp[1] = y + d - 1;
+               x + 7, y - a + 1, pi.base.font.color());
+       xp[0] = x + 7;            yp[0] = y - a + 1;
+       xp[1] = x + 4;            yp[1] = y + d - 1;
        xp[2] = x;                yp[2] = y + (d - a)/2;
        pi.pain.lines(xp, yp, 3, pi.base.font.color());
-       drawMarkers(pi, x, y);
 }
 
 
index 4efcfe4443d5bee9538f6f8f9e79beb5e7556a78..dc01ffca90c20c6afa2fbffbe62a567f3cec6e37 100644 (file)
@@ -78,7 +78,6 @@ void InsetMathStackrel::metrics(MetricsInfo & mi, Dimension & dim) const
                dim.asc = dim1.ascent() + dim0.height() + 4;
                dim.des = dim1.descent();
        }
-       metricsMarkers(mi, dim);
 }
 
 
@@ -98,7 +97,6 @@ void InsetMathStackrel::draw(PainterInfo & pi, int x, int y) const
                int y2 = y + dim1.descent() + dim2.ascent() + 1;
                cell(2).draw(pi, m - dim2.width() / 2, y2);
        }
-       drawMarkers(pi, x, y);
 }
 
 
index f31ebae75c8204e12c61dadee7b4b42360a19c7d..b8c5d14625dd81f097ac06196867f49c66b6efe7 100644 (file)
@@ -41,7 +41,6 @@ void InsetMathUnderset::metrics(MetricsInfo & mi, Dimension & dim) const
        dim.wid = max(dim0.width(), dim1.width()) + 4;
        dim.asc = dim1.ascent();
        dim.des = dim1.descent() + dim0.height() + 4;
-       metricsMarkers(mi, dim);
 }
 
 
@@ -56,7 +55,6 @@ void InsetMathUnderset::draw(PainterInfo & pi, int x, int y) const
        cell(1).draw(pi, m - dim1.width() / 2, y);
        Changer dummy = pi.base.changeFrac();
        cell(0).draw(pi, m - dim0.width() / 2, yo);
-       drawMarkers(pi, x, y);
 }
 
 
index d2121d6dfef331cc1ed577e12ffedbab6b16201f..30cce8a8eb14bc4b95f58b085822acd2e6f98b71 100644 (file)
@@ -52,7 +52,6 @@ void InsetMathXArrow::metrics(MetricsInfo & mi, Dimension & dim) const
        dim.wid = max(dim0.width(), dim1.width()) + 10;
        dim.asc = dim0.height() + 10;
        dim.des = dim1.height();
-       metricsMarkers(mi, dim);
 }
 
 
@@ -66,8 +65,7 @@ void InsetMathXArrow::draw(PainterInfo & pi, int x, int y) const
        cell(0).draw(pi, x + dim.width()/2 - dim0.width()/2, y - 10);
        Dimension const & dim1 = cell(1).dimension(*pi.base.bv);
        cell(1).draw(pi, x + dim.width()/2 - dim1.width()/2, y + dim1.height());
-       mathed_draw_deco(pi, x + 1, y - 7, dim.wid - 2, 5, name_);
-       drawMarkers(pi, x, y);
+       mathed_draw_deco(pi, x, y - 7, dim.wid, 5, name_);
 }
 
 
index 8aeb5422dc795101bb8045ca00d2854d5c90dd94..bfa841dbe9ab57d90459e0e16922283ed2be5c8e 100644 (file)
@@ -67,6 +67,8 @@ public:
        ///
        MathMacro const * owner() { return mathMacro_; }
        ///
+       marker_type marker() const { return NO_MARKER; }
+       ///
        InsetCode lyxCode() const { return ARGUMENT_PROXY_CODE; }
        /// The math data to use for display
        MathData const & displayCell(BufferView const * bv) const
@@ -301,15 +303,17 @@ bool MathMacro::addToMathRow(MathRow & mrow, MetricsInfo & mi) const
        // This is the same as what is done in metrics().
        d->editing_[mi.base.bv] = editMode(mi.base.bv);
 
-       /// The macro nesting can change display of insets. Change it locally.
-       Changer chg = make_change(mi.base.macro_nesting, d->nesting_);
-
        if (displayMode() != MathMacro::DISPLAY_NORMAL
            || d->editing_[mi.base.bv])
                return InsetMath::addToMathRow(mrow, mi);
 
+       /// The macro nesting can change display of insets. Change it locally.
+       Changer chg = make_change(mi.base.macro_nesting, d->nesting_);
+
        MathRow::Element e_beg(mi, MathRow::BEG_MACRO);
+       e_beg.inset = this;
        e_beg.macro = this;
+       e_beg.marker = d->nesting_ == 1 ? marker() : NO_MARKER;
        mrow.push_back(e_beg);
 
        d->macro_->lock();
@@ -430,6 +434,27 @@ bool MathMacro::editMetrics(BufferView const * bv) const
 }
 
 
+Inset::marker_type MathMacro::marker() const
+{
+       switch (d->displayMode_) {
+       case DISPLAY_INIT:
+       case DISPLAY_INTERACTIVE_INIT:
+               return NO_MARKER;
+       case DISPLAY_UNFOLDED:
+               return MARKER;
+       default:
+               switch (lyxrc.macro_edit_style) {
+               case LyXRC::MACRO_EDIT_LIST:
+                       return MARKER2;
+               case LyXRC::MACRO_EDIT_INLINE_BOX:
+                       return NO_MARKER;
+               default:
+                       return MARKER;
+               }
+       }
+}
+
+
 void MathMacro::metrics(MetricsInfo & mi, Dimension & dim) const
 {
        /// The macro nesting can change display of insets. Change it locally.
@@ -450,7 +475,6 @@ void MathMacro::metrics(MetricsInfo & mi, Dimension & dim) const
                dim.wid += bsdim.width() + 1;
                dim.asc = max(bsdim.ascent(), dim.ascent());
                dim.des = max(bsdim.descent(), dim.descent());
-               metricsMarkers(mi, dim);
        } else if (lyxrc.macro_edit_style == LyXRC::MACRO_EDIT_LIST
                   && d->editing_[mi.base.bv]) {
                // Macro will be edited in a old-style list mode here:
@@ -490,7 +514,6 @@ void MathMacro::metrics(MetricsInfo & mi, Dimension & dim) const
                dim.asc += 1;
                dim.des += 1;
                dim.wid += 2;
-               metricsMarkers2(mi, dim);
        } else {
                LBUFERR(d->macro_);
 
@@ -641,16 +664,15 @@ void MathMacro::draw(PainterInfo & pi, int x, int y) const
                pi.pain.text(x, y, from_ascii("\\"), pi.base.font);
                x += mathed_string_width(pi.base.font, from_ascii("\\")) + 1;
                cell(0).draw(pi, x, y);
-               drawMarkers(pi, expx, expy);
        } else if (lyxrc.macro_edit_style == LyXRC::MACRO_EDIT_LIST
-                  && d->editing_[pi.base.bv]) {
+                  && d->editing_[pi.base.bv]) {
                // Macro will be edited in a old-style list mode here:
 
                CoordCache const & coords = pi.base.bv->coordCache();
                FontInfo const & labelFont = sane_font;
 
-               // markers and box needs two pixels
-               x += 2;
+               // box needs one pixel
+               x += 1;
 
                // get maximal font height
                Dimension fontDim;
@@ -674,7 +696,7 @@ void MathMacro::draw(PainterInfo & pi, int x, int y) const
                for (idx_type i = 0; i < nargs(); ++i) {
                        // position of label
                        Dimension const & cdim = coords.getArrays().dim(&cell(i));
-                       x = expx + 2;
+                       x = expx + 1;
                        y += max(fontDim.asc, cdim.asc) + 1;
 
                        // draw label
@@ -691,9 +713,8 @@ void MathMacro::draw(PainterInfo & pi, int x, int y) const
                        y += max(fontDim.des, cdim.des);
                }
 
-               pi.pain.rectangle(expx + 1, expy - dim.asc + 1, dim.wid - 3,
+               pi.pain.rectangle(expx, expy - dim.asc + 1, dim.wid - 3,
                                  dim.height() - 2, Color_mathmacroframe);
-               drawMarkers2(pi, expx, expy);
        } else {
                bool drawBox = lyxrc.macro_edit_style == LyXRC::MACRO_EDIT_INLINE_BOX;
 
@@ -725,10 +746,6 @@ void MathMacro::draw(PainterInfo & pi, int x, int y) const
                                                  dim.height(), Color_mathmacroframe);
                } else
                        d->expanded_.draw(pi, expx, expy);
-
-               if (!drawBox)
-                       drawMarkers(pi, x, y);
-
        }
 
        // edit mode changed?
index 6e795237e197d2b50480c9b69d6f0e19cde108f0..c7dca261fadb042ab9ed340bb259e8c1abecd9b2 100644 (file)
@@ -37,6 +37,7 @@ public:
        ///
        virtual MathMacro const * asMacro() const { return this; }
        ///
+       marker_type marker() const;
        /// If the macro is in normal edit mode, dissolve its contents in
        /// the row. Otherwise, just insert the inset.
        bool addToMathRow(MathRow &, MetricsInfo & mi) const;
@@ -44,9 +45,6 @@ public:
        void draw(PainterInfo & pi, int x, int y) const;
        /// draw selection background
        void drawSelection(PainterInfo & pi, int x, int y) const;
-       /// draw decorations.
-       void drawDecoration(PainterInfo & pi, int x, int y) const
-       { drawMarkers2(pi, x, y); }
        ///
        void metrics(MetricsInfo & mi, Dimension & dim) const;
        /// was the macro in edit mode when computing metrics?
index 2c6cbf7a82cdb34a4d2424135e92fcfcc1f52a99..6b61af2af8bd036733439d0a4b9995906e268a77 100644 (file)
@@ -269,14 +269,12 @@ Inset * InsetMathWrapper::clone() const
 void InsetMathWrapper::metrics(MetricsInfo & mi, Dimension & dim) const
 {
        value_->metrics(mi, dim);
-       //metricsMarkers2(mi, dim);
 }
 
 
 void InsetMathWrapper::draw(PainterInfo & pi, int x, int y) const
 {
        value_->draw(pi, x, y);
-       //drawMarkers(pi, x, y);
 }
 
 
index 730d7a4a18a9e8835407f53ad5d6dc71d323961a..cfb41642d476d6506cb30f797fa4d7cf6403c8e1 100644 (file)
@@ -38,7 +38,8 @@ namespace lyx {
 
 MathRow::Element::Element(MetricsInfo const & mi, Type t, MathClass mc)
        : type(t), mclass(mc), before(0), after(0), macro_nesting(mi.base.macro_nesting),
-         inset(0), compl_unique_to(0), macro(0), color(Color_red)
+         marker(InsetMath::NO_MARKER), inset(0), compl_unique_to(0),
+         macro(0), color(Color_red)
 {}
 
 
@@ -64,28 +65,40 @@ MathRow::MathRow(MetricsInfo & mi, MathData const * ar)
        /* Do spacing only in math mode. This test is a bit clumsy,
         * but it is used in other places for guessing the current mode.
         */
-       if (!isMathFont(mi.base.fontname))
-               return;
+       bool const dospacing = isMathFont(mi.base.fontname);
 
        // update classes
-       for (int i = 1 ; i != static_cast<int>(elements_.size()) - 1 ; ++i) {
-               if (elements_[i].mclass == MC_UNKNOWN)
-                       continue;
-               update_class(elements_[i].mclass, elements_[before(i)].mclass,
-                            elements_[after(i)].mclass);
+       if (dospacing) {
+               for (int i = 1 ; i != static_cast<int>(elements_.size()) - 1 ; ++i) {
+                       if (elements_[i].mclass != MC_UNKNOWN)
+                               update_class(elements_[i].mclass, elements_[before(i)].mclass,
+                                                        elements_[after(i)].mclass);
+               }
        }
 
        // set spacing
        // We go to the end to handle spacing at the end of equation
        for (int i = 1 ; i != static_cast<int>(elements_.size()) ; ++i) {
-               if (elements_[i].mclass == MC_UNKNOWN)
+               Element & e = elements_[i];
+
+               if (e.mclass == MC_UNKNOWN)
                        continue;
+
                Element & bef = elements_[before(i)];
-               int spc = class_spacing(bef.mclass, elements_[i].mclass, mi.base);
-               bef.after = spc / 2;
-               // this is better than spc / 2 to avoid rounding problems
-               elements_[i].before = spc - spc / 2;
+               if (dospacing) {
+                       int spc = class_spacing(bef.mclass, e.mclass, mi.base);
+                       bef.after += spc / 2;
+                       // this is better than spc / 2 to avoid rounding problems
+                       e.before += spc - spc / 2;
+               }
+
+               // finally reserve space for markers
+               if (bef.marker != Inset::NO_MARKER)
+                       bef.after = max(bef.after, 1);
+               if (e.marker != Inset::NO_MARKER)
+                       e.before = max(e.before, 1);
        }
+
        // Do not lose spacing allocated to extremities
        if (!elements_.empty()) {
                elements_[after(0)].before += elements_.front().after;
@@ -166,6 +179,18 @@ void MathRow::metrics(MetricsInfo & mi, Dimension & dim) const
                        break;
                }
 
+               // handle vertical space for markers
+               switch(e.marker) {
+               case InsetMath::NO_MARKER:
+                       break;
+               case InsetMath::MARKER:
+                       ++d.des;
+                       break;
+               case InsetMath::MARKER2:
+                       ++d.asc;
+                       ++d.des;
+               }
+
                if (!d.empty()) {
                        dim += d;
                        // Now add the dimension to current macros and arguments.
@@ -185,6 +210,43 @@ void MathRow::metrics(MetricsInfo & mi, Dimension & dim) const
 }
 
 
+namespace {
+
+void drawMarkers(PainterInfo const & pi, MathRow::Element const & e, int const x, int const y)
+{
+       if (e.marker == InsetMath::NO_MARKER)
+               return;
+
+       CoordCache const & coords = pi.base.bv->coordCache();
+       Dimension const dim = coords.getInsets().dim(e.inset);
+
+       // the marker is before/after the inset. Normally some space has been reserved already.
+       int const l = x + e.before - 1;
+       int const r = x + dim.width() - e.after;
+
+       // Duplicated from Inset.cpp and adapted. It is believed that the
+       // Inset version should die eventually
+       ColorCode pen_color = e.inset->mouseHovered(pi.base.bv) || e.inset->editing(pi.base.bv)?
+               Color_mathframe : Color_mathcorners;
+
+       int const d = y + dim.descent();
+       pi.pain.line(l, d - 3, l, d, pen_color);
+       pi.pain.line(r, d - 3, r, d, pen_color);
+       pi.pain.line(l, d, l + 3, d, pen_color);
+       pi.pain.line(r - 3, d, r, d, pen_color);
+
+       if (e.marker == InsetMath::MARKER)
+               return;
+
+       int const a = y - dim.ascent();
+       pi.pain.line(l, a + 3, l, a, pen_color);
+       pi.pain.line(r, a + 3, r, a, pen_color);
+       pi.pain.line(l, a, l + 3, a, pen_color);
+       pi.pain.line(r - 3, a, r, a, pen_color);
+}
+
+}
+
 void MathRow::draw(PainterInfo & pi, int x, int const y) const
 {
        CoordCache & coords = pi.base.bv->coordCache();
@@ -202,11 +264,14 @@ void MathRow::draw(PainterInfo & pi, int x, int const y) const
                        e.inset->draw(pi, x + e.before, y);
                        coords.insets().add(e.inset, x, y);
                        coords.insets().add(e.inset, d);
+                       drawMarkers(pi, e, x, y);
                        x += d.wid;
                        break;
                }
                case BEG_MACRO:
                        coords.insets().add(e.macro, x, y);
+
+                       drawMarkers(pi, e, x, y);
                        break;
                case BEG_ARG:
                        coords.arrays().add(e.ar, x, y);
index 818b690eda162e6054670af386906ad6805b4e93..760ac18eb1cf8cd718ffa8e4076e4158426fbad8 100644 (file)
@@ -12,6 +12,7 @@
 #ifndef MATH_ROW_H
 #define MATH_ROW_H
 
+#include "InsetMath.h"
 #include "MathClass.h"
 
 #include "ColorCode.h"
@@ -69,6 +70,8 @@ public:
                int before, after;
                /// count wether the current mathdata is nested in macro(s)
                int macro_nesting;
+               /// Marker type
+               InsetMath::marker_type marker;
 
                /// When type is INSET
                /// the math inset