]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetSpace.cpp
Allow row-breaking after some insets
[lyx.git] / src / insets / InsetSpace.cpp
index b8cab16fd0ed3f963082aec36bd211c738a30c53..799568eadd0ca0165d4df6c50b423541c591e59b 100644 (file)
@@ -27,6 +27,7 @@
 #include "MetricsInfo.h"
 #include "OutputParams.h"
 #include "output_xhtml.h"
+#include "texstream.h"
 
 #include "support/debug.h"
 #include "support/docstream.h"
@@ -192,6 +193,41 @@ bool InsetSpace::getStatus(Cursor & cur, FuncRequest const & cmd,
 }
 
 
+Inset::RowFlags InsetSpace::rowFlags() const
+{
+       switch (params_.kind) {
+               case InsetSpaceParams::PROTECTED:
+               case InsetSpaceParams::CUSTOM_PROTECTED:
+               case InsetSpaceParams::HFILL_PROTECTED:
+               case InsetSpaceParams::THIN:
+               case InsetSpaceParams::NEGTHIN:
+               case InsetSpaceParams::MEDIUM:
+               case InsetSpaceParams::NEGMEDIUM:
+               case InsetSpaceParams::THICK:
+               case InsetSpaceParams::NEGTHICK:
+               case InsetSpaceParams::ENSPACE:
+               case InsetSpaceParams::VISIBLE:
+                       // no break after these
+                       return Inline;
+               case InsetSpaceParams::NORMAL:
+               case InsetSpaceParams::QUAD:
+               case InsetSpaceParams::QQUAD:
+               case InsetSpaceParams::ENSKIP:
+               case InsetSpaceParams::CUSTOM:
+               case InsetSpaceParams::HFILL:
+               case InsetSpaceParams::DOTFILL:
+               case InsetSpaceParams::HRULEFILL:
+               case InsetSpaceParams::LEFTARROWFILL:
+               case InsetSpaceParams::RIGHTARROWFILL:
+               case InsetSpaceParams::UPBRACEFILL:
+               case InsetSpaceParams::DOWNBRACEFILL:
+                       // these allow line breaking
+                       break;
+       }
+       return CanBreakAfter;
+}
+
+
 namespace {
 int const arrow_size = 8;
 }
@@ -200,9 +236,10 @@ int const arrow_size = 8;
 void InsetSpace::metrics(MetricsInfo & mi, Dimension & dim) const
 {
        if (isHfill()) {
-               // The metrics for this kinds are calculated externally in
-               // \c TextMetrics::computeRowMetrics. Those are dummy value:
-               dim = Dimension(10, 10, 10);
+               // The width for hfills is calculated externally in
+               // TextMetrics::setRowAlignment. The value of 5 is the
+               // minimal value when the hfill is not active.
+               dim = Dimension(5, 10, 10);
                return;
        }
 
@@ -241,8 +278,7 @@ void InsetSpace::metrics(MetricsInfo & mi, Dimension & dim) const
                        break;
                case InsetSpaceParams::CUSTOM:
                case InsetSpaceParams::CUSTOM_PROTECTED: {
-                       int const w =
-                               params_.length.len().inPixels(mi.base);
+                       int const w = mi.base.inPixels(params_.length.len());
                        int const minw = (w < 0) ? 3 * arrow_size : 4;
                        dim.wid = max(minw, abs(w));
                        break;
@@ -258,8 +294,6 @@ void InsetSpace::metrics(MetricsInfo & mi, Dimension & dim) const
                        // shut up compiler
                        break;
        }
-       // Cache the inset dimension.
-       setDimCache(mi, dim);
 }
 
 
@@ -353,28 +387,31 @@ void InsetSpace::draw(PainterInfo & pi, int x, int y) const
        }
 
        int const w = dim.wid;
-       int const h = theFontMetrics(pi.base.font).ascent('x');
+       int const h = theFontMetrics(pi.base.font).xHeight();
        int xp[4], yp[4];
 
-       xp[0] = x;
+       xp[0] = x + 1;
        yp[0] = y - max(h / 4, 1);
        if (params_.kind == InsetSpaceParams::NORMAL ||
            params_.kind == InsetSpaceParams::PROTECTED ||
            params_.kind == InsetSpaceParams::VISIBLE) {
-               xp[1] = x;     yp[1] = y;
-               xp[2] = x + w; yp[2] = y;
+               xp[1] = x + 1;     yp[1] = y;
+               xp[2] = x + w - 2; yp[2] = y;
        } else {
-               xp[1] = x;     yp[1] = y + max(h / 4, 1);
-               xp[2] = x + w; yp[2] = y + max(h / 4, 1);
+               xp[1] = x + 1;     yp[1] = y + max(h / 4, 1);
+               xp[2] = x + w - 2; yp[2] = y + max(h / 4, 1);
        }
-       xp[3] = x + w;
+       xp[3] = x + w - 2;
        yp[3] = y - max(h / 4, 1);
 
        Color col = Color_special;
        if (params_.kind == InsetSpaceParams::PROTECTED ||
            params_.kind == InsetSpaceParams::ENSPACE ||
+           params_.kind == InsetSpaceParams::THIN ||
            params_.kind == InsetSpaceParams::NEGTHIN ||
+           params_.kind == InsetSpaceParams::MEDIUM ||
            params_.kind == InsetSpaceParams::NEGMEDIUM ||
+           params_.kind == InsetSpaceParams::THICK ||
            params_.kind == InsetSpaceParams::NEGTHICK ||
            params_.kind == InsetSpaceParams::CUSTOM_PROTECTED)
                col = Color_latex;
@@ -763,7 +800,7 @@ int InsetSpace::docbook(odocstream & os, OutputParams const &) const
 }
 
 
-docstring InsetSpace::xhtml(XHTMLStream & xs, OutputParams const &) const
+docstring InsetSpace::xhtml(XMLStream & xs, OutputParams const &) const
 {
        string output;
        switch (params_.kind) {
@@ -823,7 +860,7 @@ docstring InsetSpace::xhtml(XHTMLStream & xs, OutputParams const &) const
                break;
        }
        // don't escape the entities!
-       xs << XHTMLStream::ESCAPE_NONE << from_ascii(output);
+       xs << XMLStream::ESCAPE_NONE << from_ascii(output);
        return docstring();
 }
 
@@ -831,7 +868,7 @@ docstring InsetSpace::xhtml(XHTMLStream & xs, OutputParams const &) const
 void InsetSpace::validate(LaTeXFeatures & features) const
 {
        if (params_.kind == InsetSpaceParams::NEGMEDIUM ||
-           params_.kind == InsetSpaceParams::NEGTHICK) 
+           params_.kind == InsetSpaceParams::NEGTHICK)
                features.require("amsmath");
 }