]> git.lyx.org Git - lyx.git/blobdiff - src/FontInfo.cpp
Fix some group boxes.
[lyx.git] / src / FontInfo.cpp
index 9edf97e52e9e7ee56e63d9e7da738a502bec1595..a813c9c111f19c3610dfd9515f0b734e410a5825 100644 (file)
 #include "ColorSet.h"
 #include "FontInfo.h"
 #include "Lexer.h"
+#include "LyXRC.h"
 
+#include "support/convert.h"
 #include "support/debug.h"
 #include "support/docstring.h"
 #include "support/lstrings.h"
 #include "support/RefChanger.h"
 
+#include <algorithm>
 #include <ostream>
 #include <sstream>
 
@@ -59,6 +62,7 @@ FontInfo const sane_font(
        MEDIUM_SERIES,
        UP_SHAPE,
        FONT_SIZE_NORMAL,
+       LM_ST_TEXT,
        Color_none,
        Color_background,
        FONT_OFF,
@@ -67,6 +71,8 @@ FontInfo const sane_font(
        FONT_OFF,
        FONT_OFF,
        FONT_OFF,
+       FONT_OFF,
+       FONT_OFF,
        FONT_OFF);
 
 FontInfo const inherit_font(
@@ -74,6 +80,7 @@ FontInfo const inherit_font(
        INHERIT_SERIES,
        INHERIT_SHAPE,
        FONT_SIZE_INHERIT,
+       LM_ST_INHERIT,
        Color_inherit,
        Color_inherit,
        FONT_INHERIT,
@@ -82,13 +89,16 @@ FontInfo const inherit_font(
        FONT_INHERIT,
        FONT_INHERIT,
        FONT_INHERIT,
-       FONT_OFF);
+       FONT_INHERIT,
+       FONT_OFF,
+       FONT_INHERIT);
 
 FontInfo const ignore_font(
        IGNORE_FAMILY,
        IGNORE_SERIES,
        IGNORE_SHAPE,
        FONT_SIZE_IGNORE,
+       LM_ST_IGNORE,
        Color_ignore,
        Color_ignore,
        FONT_IGNORE,
@@ -97,6 +107,8 @@ FontInfo const ignore_font(
        FONT_IGNORE,
        FONT_IGNORE,
        FONT_IGNORE,
+       FONT_IGNORE,
+       FONT_IGNORE,
        FONT_IGNORE);
 
 
@@ -168,6 +180,31 @@ FontInfo & FontInfo::incSize()
 }
 
 
+double FontInfo::realSize() const
+{
+       double d = convert<double>(lyxrc.font_sizes[size()]);
+       // The following is according to the average of the values in the
+       // definitions of \defaultscriptratio and \defaultscriptscriptratio in LaTeX
+       // font packages. No attempt is made to implement the actual values from
+       // \DefineMathSizes.
+       switch (style()) {
+       case LM_ST_DISPLAY:
+       case LM_ST_TEXT:
+       case LM_ST_INHERIT:
+       case LM_ST_IGNORE:
+               break;
+       case LM_ST_SCRIPT:
+               d *= .73;
+               break;
+       case LM_ST_SCRIPTSCRIPT:
+               d *= .55;
+               break;
+       }
+       // Never go below the smallest size
+       return max(d, convert<double>(lyxrc.font_sizes[FONT_SIZE_TINY]));
+}
+
+
 /// Reduce font to fall back to template where possible
 void FontInfo::reduce(FontInfo const & tmplt)
 {
@@ -179,12 +216,16 @@ void FontInfo::reduce(FontInfo const & tmplt)
                shape_ = INHERIT_SHAPE;
        if (size_ == tmplt.size_)
                size_ = FONT_SIZE_INHERIT;
+       if (style_ == tmplt.style_)
+               style_ = LM_ST_INHERIT;
        if (emph_ == tmplt.emph_)
                emph_ = FONT_INHERIT;
        if (underbar_ == tmplt.underbar_)
                underbar_ = FONT_INHERIT;
        if (strikeout_ == tmplt.strikeout_)
                strikeout_ = FONT_INHERIT;
+       if (xout_ == tmplt.xout_)
+               xout_ = FONT_INHERIT;
        if (uuline_ == tmplt.uuline_)
                uuline_ = FONT_INHERIT;
        if (uwave_ == tmplt.uwave_)
@@ -195,6 +236,8 @@ void FontInfo::reduce(FontInfo const & tmplt)
                color_ = Color_inherit;
        if (background_ == tmplt.background_)
                background_ = Color_inherit;
+       if (nospellcheck_ == tmplt.nospellcheck_)
+               nospellcheck_ = FONT_INHERIT;
 }
 
 
@@ -218,6 +261,9 @@ FontInfo & FontInfo::realize(FontInfo const & tmplt)
        if (size_ == FONT_SIZE_INHERIT)
                size_ = tmplt.size_;
 
+       if (style_ == LM_ST_INHERIT)
+               style_ = tmplt.style_;
+
        if (emph_ == FONT_INHERIT)
                emph_ = tmplt.emph_;
 
@@ -227,6 +273,9 @@ FontInfo & FontInfo::realize(FontInfo const & tmplt)
        if (strikeout_ == FONT_INHERIT)
                strikeout_ = tmplt.strikeout_;
 
+       if (xout_ == FONT_INHERIT)
+               xout_ = tmplt.xout_;
+
        if (uuline_ == FONT_INHERIT)
                uuline_ = tmplt.uuline_;
 
@@ -242,27 +291,36 @@ FontInfo & FontInfo::realize(FontInfo const & tmplt)
        if (background_ == Color_inherit)
                background_ = tmplt.background_;
 
+       if (nospellcheck_ == FONT_INHERIT)
+               nospellcheck_ = tmplt.nospellcheck_;
+
        return *this;
 }
 
 
-Changer FontInfo::changeColor(ColorCode const color, bool cond)
+Changer FontInfo::changeColor(ColorCode const color)
+{
+       return make_change(color_, color);
+}
+
+
+Changer FontInfo::changeShape(FontShape const shape)
 {
-       return make_change(color_, color, cond);
+       return make_change(shape_, shape);
 }
 
 
-Changer FontInfo::changeShape(FontShape const shape, bool cond)
+Changer FontInfo::changeStyle(MathStyle const new_style)
 {
-       return make_change(shape_, shape, cond);
+       return make_change(style_, new_style);
 }
 
 
-Changer FontInfo::change(FontInfo font, bool realiz, bool cond)
+Changer FontInfo::change(FontInfo font, bool realiz)
 {
        if (realiz)
                font.realize(*this);
-       return make_change(*this, font, cond);
+       return make_change(*this, font);
 }
 
 
@@ -327,13 +385,19 @@ void FontInfo::update(FontInfo const & newfont, bool toggleall)
                        size_ = newfont.size_;
        }
 
+       if (newfont.style_ != LM_ST_IGNORE) {
+                       style_ = newfont.style_;
+       }
+
        setEmph(setMisc(newfont.emph_, emph_));
        setUnderbar(setMisc(newfont.underbar_, underbar_));
        setStrikeout(setMisc(newfont.strikeout_, strikeout_));
+       setXout(setMisc(newfont.xout_, xout_));
        setUuline(setMisc(newfont.uuline_, uuline_));
        setUwave(setMisc(newfont.uwave_, uwave_));
        setNoun(setMisc(newfont.noun_, noun_));
        setNumber(setMisc(newfont.number_, number_));
+       setNoSpellcheck(setMisc(newfont.nospellcheck_, nospellcheck_));
 
        if (newfont.color_ == color_ && toggleall)
                setColor(Color_inherit); // toggle 'back'
@@ -351,11 +415,12 @@ bool FontInfo::resolved() const
 {
        return (family_ != INHERIT_FAMILY && series_ != INHERIT_SERIES
                && shape_ != INHERIT_SHAPE && size_ != FONT_SIZE_INHERIT
+               && style_ != LM_ST_INHERIT
                && emph_ != FONT_INHERIT && underbar_ != FONT_INHERIT
                && uuline_ != FONT_INHERIT && uwave_ != FONT_INHERIT
-               && strikeout_ != FONT_INHERIT && noun_ != FONT_INHERIT
-               && color_ != Color_inherit
-               && background_ != Color_inherit);
+               && strikeout_ != FONT_INHERIT && xout_ != FONT_INHERIT
+               && noun_ != FONT_INHERIT && color_ != Color_inherit
+               && background_ != Color_inherit && nospellcheck_ != FONT_INHERIT);
 }
 
 
@@ -482,12 +547,12 @@ string getSizeCSS(FontSize const & s)
        }
        return "";
 }
-       
-} // namespace anonymous
+
+} // namespace
 
 
 // FIXME This does not yet handle color
-docstring FontInfo::asCSS() const 
+docstring FontInfo::asCSS() const
 {
        string retval;
        string tmp = getFamilyCSS(family_);
@@ -500,7 +565,7 @@ docstring FontInfo::asCSS() const
        tmp = getSizeCSS(size_);
        if (!tmp.empty())
                appendSep(retval, makeCSSTag("font-size", tmp));
-       return from_ascii(retval);      
+       return from_ascii(retval);
 }
 
 
@@ -624,6 +689,8 @@ FontInfo lyxRead(Lexer & lex, FontInfo const & fi)
                                f.setUnderbar(FONT_OFF);
                        } else if (ttok == "no_strikeout") {
                                f.setStrikeout(FONT_OFF);
+                       } else if (ttok == "no_xout") {
+                               f.setXout(FONT_OFF);
                        } else if (ttok == "no_uuline") {
                                f.setUuline(FONT_OFF);
                        } else if (ttok == "no_uwave") {
@@ -638,12 +705,18 @@ FontInfo lyxRead(Lexer & lex, FontInfo const & fi)
                                f.setUnderbar(FONT_ON);
                        } else if (ttok == "strikeout") {
                                f.setStrikeout(FONT_ON);
+                       } else if (ttok == "xout") {
+                               f.setXout(FONT_ON);
                        } else if (ttok == "uuline") {
                                f.setUuline(FONT_ON);
                        } else if (ttok == "uwave") {
                                f.setUwave(FONT_ON);
                        } else if (ttok == "noun") {
                                f.setNoun(FONT_ON);
+                       } else if (ttok == "nospellcheck") {
+                               f.setNoSpellcheck(FONT_ON);
+                       } else if (ttok == "no_nospellcheck") {
+                               f.setNoSpellcheck(FONT_OFF);
                        } else {
                                lex.printError("Illegal misc type");
                        }
@@ -678,6 +751,7 @@ void lyxWrite(ostream & os, FontInfo const & f, string const & start, int level)
        if (f.size() != FONT_SIZE_INHERIT)
                oss << indent << "\tSize " << LyXSizeNames[f.size()]
                    << '\n';
+       //FIXME: shall style be handled here? Probably not.
        if (f.underbar() == FONT_ON)
                oss << indent << "\tMisc Underbar\n";
        else if (f.underbar() == FONT_OFF)
@@ -686,6 +760,10 @@ void lyxWrite(ostream & os, FontInfo const & f, string const & start, int level)
                oss << indent << "\tMisc Strikeout\n";
        else if (f.strikeout() == FONT_OFF)
                oss << indent << "\tMisc No_Strikeout\n";
+       if (f.xout() == FONT_ON)
+               oss << indent << "\tMisc Xout\n";
+       else if (f.xout() == FONT_OFF)
+               oss << indent << "\tMisc No_Xout\n";
        if (f.uuline() == FONT_ON)
                oss << indent << "\tMisc Uuline\n";
        else if (f.uuline() == FONT_OFF)
@@ -702,6 +780,10 @@ void lyxWrite(ostream & os, FontInfo const & f, string const & start, int level)
                oss << indent << "\tMisc Noun\n";
        else if (f.noun() == FONT_OFF)
                oss << indent << "\tMisc No_Noun\n";
+       if (f.nospellcheck() == FONT_ON)
+               oss << indent << "\tMisc NoSpellcheck\n";
+       else if (f.nospellcheck() == FONT_OFF)
+               oss << indent << "\tMisc No_NoSpellcheck\n";
        if (f.color() != Color_inherit && f.color() != Color_none)
                oss << indent << "\tColor " << lcolor.getLyXName(f.color())
                    << '\n';