]> git.lyx.org Git - lyx.git/blobdiff - src/lyxfont.h
* GuiView.C (updateTab): do not update early if current tab has
[lyx.git] / src / lyxfont.h
index ad1a4a17f0eba7aa59e5fc2c1a8bf9b3f2404408..0cfaaf24c5d94dbbcd5427f2a5b60f698dce5032 100644 (file)
@@ -1,42 +1,31 @@
 // -*- C++ -*-
-/* This file is part of
- * ======================================================
- * 
- *           LyX, The Document Processor
- *      
- *           Copyright 1995 Matthias Ettrich
- *           Copyright 1995-2000 The LyX Team.   
+/**
+ * \file src/lyxfont.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
  *
- * ====================================================== */
+ * \author Lars Gullik Bjønnes
+ * \author Jean-Marc Lasgouttes
+ * \author Angus Leeming
+ * \author Dekel Tsur
+ *
+ * Full author contact details are available in file CREDITS.
+ */
 
 #ifndef LYXFONT_H
 #define LYXFONT_H
 
-#ifdef __GNUG__
-#pragma interface
-#endif
-
-#include <iosfwd>
-
-#include "LString.h"
-#include "language.h"
 #include "LColor.h"
+#include "support/docstream.h"
 
-// It might happen that locale.h defines ON and OFF. This is not good
-// for us, since we use these names below. But of course this is due
-// to some old compilers. Than is broken when it comes to C++ scoping.
-#include "gettext.h" // so that we are sure tht it won't be included
-// later. 
-#ifdef ON
-#undef ON
-#endif
 
-#ifdef OFF
-#undef OFF
-#endif
+namespace lyx {
+
 
 class LyXLex;
 class BufferParams;
+class Language;
+
 
 ///
 class LyXFont {
@@ -57,9 +46,29 @@ public:
                ///
                SYMBOL_FAMILY,
                ///
+               CMR_FAMILY,
+               ///
+               CMSY_FAMILY,
+               ///
+               CMM_FAMILY,
+               ///
+               CMEX_FAMILY,
+               ///
+               MSA_FAMILY,
+               ///
+               MSB_FAMILY,
+               ///
+               EUFRAK_FAMILY,
+               ///
+               WASY_FAMILY,
+               ///
+               ESINT_FAMILY,
+               ///
                INHERIT_FAMILY,
                ///
-               IGNORE_FAMILY
+               IGNORE_FAMILY,
+               ///
+               NUM_FAMILIES = INHERIT_FAMILY
        };
 
        ///
@@ -121,7 +130,7 @@ public:
                ///
                IGNORE_SIZE
        };
+
        /// Used for emph, underbar, noun and latex toggles
        enum FONT_MISC_STATE {
                ///
@@ -152,12 +161,31 @@ public:
                ALL_SANE
        };
 
+       struct FontBits {
+               ///
+               FONT_FAMILY family;
+               ///
+               FONT_SERIES series;
+               ///
+               FONT_SHAPE shape;
+               ///
+               FONT_SIZE size;
+               /** We store the LColor::color value as an int to get LColor.h out
+                *  of the header file.
+                */
+               int color;
+               ///
+               FONT_MISC_STATE emph;
+               ///
+               FONT_MISC_STATE underbar;
+               ///
+               FONT_MISC_STATE noun;
+               ///
+               FONT_MISC_STATE number;
+       };
        ///
        LyXFont();
 
-       // LyXFont x(LyXFont ...) and LyXFont x = LyXFont ...
-       LyXFont(LyXFont const & x);
        /// Shortcut initialization
        explicit
        LyXFont(LyXFont::FONT_INIT1);
@@ -174,103 +202,70 @@ public:
        /// Shortcut initialization
        LyXFont(LyXFont::FONT_INIT3, Language const * l);
 
-       /// LyXFont x, y; x = y;
-       LyXFont & operator=(LyXFont const & x);
        /// Decreases font size by one
        LyXFont & decSize();
        /// Increases font size by one
        LyXFont & incSize();
        ///
-       FONT_FAMILY family() const;
+       FONT_FAMILY family() const { return bits.family; }
        ///
-       FONT_SERIES series() const;
+       FONT_SERIES series() const { return bits.series; }
        ///
-       FONT_SHAPE shape() const;
+       FONT_SHAPE shape() const { return bits.shape; }
        ///
-       FONT_SIZE size() const;
+       FONT_SIZE size() const { return bits.size; }
        ///
-       FONT_MISC_STATE emph() const;
+       FONT_MISC_STATE emph() const { return bits.emph; }
        ///
-       FONT_MISC_STATE underbar() const;
+       FONT_MISC_STATE underbar() const { return bits.underbar; }
        ///
-       FONT_MISC_STATE noun() const;
-
+       FONT_MISC_STATE noun() const { return bits.noun; }
        ///
-       FONT_MISC_STATE latex() const;
-
+       FONT_MISC_STATE number() const { return bits.number; }
        ///
-       FONT_MISC_STATE number() const;
-
+       LColor_color color() const;
        ///
-       LColor::color color() const;
-
-       ///
-       Language const * language() const;
-
+       Language const * language() const { return lang; }
        ///
        bool isRightToLeft() const;
-
        ///
        bool isVisibleRightToLeft() const;
-       
-       ///
-       LyXFont & setFamily(LyXFont::FONT_FAMILY f);
-       ///
-       LyXFont & setSeries(LyXFont::FONT_SERIES s);
-       ///
-       LyXFont & setShape(LyXFont::FONT_SHAPE s);
-       ///
-       LyXFont & setSize(LyXFont::FONT_SIZE s);
-       ///
-       LyXFont & setEmph(LyXFont::FONT_MISC_STATE e);
-       ///
-       LyXFont & setUnderbar(LyXFont::FONT_MISC_STATE u);
        ///
-       LyXFont & setNoun(LyXFont::FONT_MISC_STATE n);
-       ///
-       LyXFont & setLatex(LyXFont::FONT_MISC_STATE l);
-       ///
-       LyXFont & setNumber(LyXFont::FONT_MISC_STATE n);
+       bool isSymbolFont() const;
+
        ///
-       LyXFont & setColor(LColor::color c);
-       ///
-       LyXFont & setLanguage(Language const * l);
+       void setFamily(LyXFont::FONT_FAMILY f);
+       void setSeries(LyXFont::FONT_SERIES s);
+       void setShape(LyXFont::FONT_SHAPE s);
+       void setSize(LyXFont::FONT_SIZE s);
+       void setEmph(LyXFont::FONT_MISC_STATE e);
+       void setUnderbar(LyXFont::FONT_MISC_STATE u);
+       void setNoun(LyXFont::FONT_MISC_STATE n);
+       void setNumber(LyXFont::FONT_MISC_STATE n);
+       void setColor(LColor_color c);
+       void setLanguage(Language const * l);
 
        /// Set family after LyX text format
-       LyXFont & setLyXFamily(string const &);
+       LyXFont & setLyXFamily(std::string const &);
+
        /// Set series after LyX text format
-       LyXFont & setLyXSeries(string const &);
+       LyXFont & setLyXSeries(std::string const &);
+
        /// Set shape after LyX text format
-       LyXFont & setLyXShape(string const &);
+       LyXFont & setLyXShape(std::string const &);
+
        /// Set size after LyX text format
-       LyXFont & setLyXSize(string const &);
+       LyXFont & setLyXSize(std::string const &);
+
        /// Returns misc flag after LyX text format
-       LyXFont::FONT_MISC_STATE setLyXMisc(string const &);
+       LyXFont::FONT_MISC_STATE setLyXMisc(std::string const &);
 
        /// Sets color after LyX text format
-       LyXFont & setLyXColor(string const &);
+       LyXFont & setLyXColor(std::string const &);
 
-#if 0
-       /// Sets size after GUI name
-       LyXFont & setGUISize(string const &);
-#endif
-       
        /// Returns size of font in LaTeX text notation
-       string const latexSize() const;
+       std::string const latexSize() const;
+
        /** Updates font settings according to request.
            If an attribute is IGNORE, the attribute is left as it is.
            When toggleall = true, all properties that matches the font in use
@@ -280,23 +275,22 @@ public:
            a INHERIT_FAMILY was asked for.  This is necessary for the
            toggle-user-defined-style button on the toolbar.
        */
-       void update(LyXFont const & newfont, 
+       void update(LyXFont const & newfont,
                    Language const * default_lang,
                    bool toggleall = false);
+
        /** Reduce font to fall back to template where possible.
            Equal fields are reduced to INHERIT */
        void reduce(LyXFont const & tmplt);
+
        /// Realize font from a template (INHERIT are realized)
        LyXFont & realize(LyXFont const & tmplt);
-
        /// Is a given font fully resolved?
        bool resolved() const;
+
        /// Read a font specification from LyXLex. Used for layout files.
        LyXFont & lyxRead(LyXLex &);
+
        /// Writes the changes from this font to orgfont in .lyx format in file
        void lyxWriteChanges(LyXFont const & orgfont, std::ostream &) const;
 
@@ -305,357 +299,124 @@ public:
            to this font. Returns number of chars written. Base is the
            font state active now.
        */
-       int latexWriteStartChanges(std::ostream &, LyXFont const & base,
-                                  LyXFont const & prev) const;
+       int latexWriteStartChanges(odocstream &, LyXFont const & base,
+                                  LyXFont const & prev,
+                                  BufferParams const &) const;
 
-       /** Writes tha tail of the LaTeX needed to chagne to this font.
+       /** Writes the tail of the LaTeX needed to change to this font.
            Returns number of chars written. Base is the font state we want
            to achieve.
        */
-       int latexWriteEndChanges(std::ostream &, LyXFont const & base,
-                                LyXFont const & next) const;
+       int latexWriteEndChanges(odocstream &, LyXFont const & base,
+                                LyXFont const & next,
+                                BufferParams const &) const;
+
 
        /// Build GUI description of font state
-       string const stateText(BufferParams * params) const;
+       docstring const stateText(BufferParams * params) const;
 
        ///
-       LColor::color realColor() const;
+       LColor_color realColor() const;
 
        ///
        friend
        bool operator==(LyXFont const & font1, LyXFont const & font2);
-
        ///
-       friend 
-       bool operator!=(LyXFont const & font1, LyXFont const & font2);
-
-       /// compares two fonts, ignoring the setting of the Latex part.
-       bool equalExceptLatex(LyXFont const &) const;
+       friend
+       std::ostream & operator<<(std::ostream & os, LyXFont const & font);
 
        /// Converts logical attributes to concrete shape attribute
-       LyXFont::FONT_SHAPE realShape() const;
+       // Try hard to inline this as it shows up with 4.6 % in the profiler.
+       LyXFont::FONT_SHAPE realShape() const {
+               if (bits.noun == ON)
+                       return SMALLCAPS_SHAPE;
+               if (bits.emph == ON)
+                       return (bits.shape == UP_SHAPE) ? ITALIC_SHAPE : UP_SHAPE;
+               return bits.shape;
+       }
+
+
+       /** Compaq cxx 6.5 requires that the definition be public so that
+           it can compile operator==()
+        */
 private:
-       ///
-       struct FontBits {
-               ///
-               bool operator==(FontBits const & fb1) const;
-               ///
-               bool operator!=(FontBits const & fb1) const;
-               ///
-               FONT_FAMILY family;
-               ///
-               FONT_SERIES series;
-               ///
-               FONT_SHAPE shape;
-               ///
-               FONT_SIZE size;
-               ///
-               LColor::color color;
-               ///
-               FONT_MISC_STATE emph;
-               ///
-               FONT_MISC_STATE underbar;
-               ///
-               FONT_MISC_STATE noun;
-               ///
-               FONT_MISC_STATE latex;
-       };
        ///
        FontBits bits;
        ///
        Language const * lang;
-       ///
-       FONT_MISC_STATE number_;
-       
        /// Sane font
        static FontBits sane;
-       
        /// All inherit font
        static FontBits inherit;
        /// All ignore font
        static FontBits ignore;
-
        /// Updates a misc setting according to request
        LyXFont::FONT_MISC_STATE setMisc(LyXFont::FONT_MISC_STATE newfont,
                                         LyXFont::FONT_MISC_STATE org);
 };
 
-///
-std::ostream & operator<<(std::ostream &, LyXFont::FONT_MISC_STATE);
-
-///
-inline
-bool operator==(LyXFont const & font1, LyXFont const & font2) {
-       return font1.bits == font2.bits &&
-               font1.lang == font2.lang &&
-               font1.number_ == font2.number_;
-}
-
-///
-inline
-bool operator!=(LyXFont const & font1, LyXFont const & font2) {
-       return !(font1 == font2);
-}
-
-
-inline
-LyXFont::LyXFont()
-{
-       bits = sane;
-       lang = default_language;
-       number_ = OFF;
-}
-
-
-inline
-LyXFont::LyXFont(LyXFont const & x)
-{
-       bits = x.bits;
-       lang = x.lang;
-       number_ = x.number_;
-}
-
-
-inline
-LyXFont::LyXFont(LyXFont::FONT_INIT1)
-{
-       bits = inherit;
-       lang = default_language;
-       number_ = OFF;
-}
-
-
-inline
-LyXFont::LyXFont(LyXFont::FONT_INIT2)
-{
-       bits = ignore;
-       lang = ignore_language;
-       number_ = IGNORE;
-}
-
-
-inline
-LyXFont::LyXFont(LyXFont::FONT_INIT3)
-{
-       bits = sane;
-       lang = default_language;
-       number_ = OFF;
-}
-
-
-inline
-LyXFont::LyXFont(LyXFont::FONT_INIT1, Language const * l)
-{
-       bits = inherit;
-       lang = l;
-       number_ = OFF;
-}
-
-
-inline
-LyXFont::LyXFont(LyXFont::FONT_INIT2, Language const * l)
-{
-       bits = ignore;
-       lang = l;
-       number_ = IGNORE;
-}
-
-
-inline
-LyXFont::LyXFont(LyXFont::FONT_INIT3, Language const * l)
-{
-       bits = sane;
-       lang = l;
-       number_ = OFF;
-}
-
-
-inline
-LyXFont & LyXFont::operator=(LyXFont const & x) 
-{
-       bits = x.bits;
-       lang = x.lang;
-       number_ = x.number_;
-       return *this;
-}
-
-
-inline
-LyXFont::FONT_FAMILY LyXFont::family() const 
-{
-       return bits.family;
-}
-
-
-inline
-LyXFont::FONT_SERIES LyXFont::series() const
-{
-       return bits.series;
-}
-
-
-inline
-LyXFont::FONT_SHAPE LyXFont::shape() const
-{
-       return bits.shape;
-}
-
-
-inline
-LyXFont::FONT_SIZE LyXFont::size() const
-{
-       return bits.size;
-}
-
-
-inline
-LyXFont::FONT_MISC_STATE LyXFont::emph() const
-{
-       return bits.emph;
-}
-
-
-inline
-LyXFont::FONT_MISC_STATE LyXFont::underbar() const
-{
-       return bits.underbar;
-}
-
-
-inline
-LyXFont::FONT_MISC_STATE LyXFont::noun() const
-{
-       return bits.noun;
-}
-
-
-inline
-LyXFont::FONT_MISC_STATE LyXFont::latex() const 
-{
-       return bits.latex;
-}
-
-
-inline
-LColor::color LyXFont::color() const 
-{
-       return bits.color;
-}
-
-
-inline
-Language const * LyXFont::language() const 
-{
-       return lang;
-}
-
-
-inline
-LyXFont::FONT_MISC_STATE LyXFont::number() const 
-{
-       return number_;
-}
-
-
-inline
-bool LyXFont::isRightToLeft() const 
-{
-       return lang->RightToLeft();
-}
-
-
-inline
-bool LyXFont::isVisibleRightToLeft() const 
-{
-       return (lang->RightToLeft() && latex() != ON && number() != ON);
-}
-
-
-inline
-LyXFont & LyXFont::setFamily(LyXFont::FONT_FAMILY f)
-{
-       bits.family = f;
-       return *this;
-}
-
-
-inline
-LyXFont & LyXFont::setSeries(LyXFont::FONT_SERIES s)
-{
-       bits.series = s;
-       return *this;
-}
-
-
-inline
-LyXFont & LyXFont::setShape(LyXFont::FONT_SHAPE s)
-{
-       bits.shape = s;
-       return *this;
-}
 
+/** \c LyXFont_size is a wrapper for LyXFont::FONT_SIZE.
+ *  It can be forward-declared and passed as a function argument without
+ *  having to expose lyxfont.h.
+ */
+class LyXFont_size {
+public:
+       ///
+       LyXFont_size(LyXFont::FONT_SIZE val) : val_(val) {}
+       ///
+       operator LyXFont::FONT_SIZE() const { return val_; }
+private:
+       ///
+       LyXFont::FONT_SIZE val_;
+};
 
-inline
-LyXFont & LyXFont::setSize(LyXFont::FONT_SIZE s)
-{
-       bits.size = s;
-       return *this;
-}
 
 
 inline
-LyXFont & LyXFont::setEmph(LyXFont::FONT_MISC_STATE e)
+bool LyXFont::isSymbolFont() const
 {
-       bits.emph = e;
-       return *this;
+       switch (family()) {
+       case LyXFont::SYMBOL_FAMILY:
+       case LyXFont::CMSY_FAMILY:
+       case LyXFont::CMM_FAMILY:
+       case LyXFont::CMEX_FAMILY:
+       case LyXFont::MSA_FAMILY:
+       case LyXFont::MSB_FAMILY:
+       case LyXFont::WASY_FAMILY:
+       case LyXFont::ESINT_FAMILY:
+               return true;
+       default:
+               return false;
+       }
 }
 
+///
+std::ostream & operator<<(std::ostream &, LyXFont::FONT_MISC_STATE);
 
-inline
-LyXFont & LyXFont::setUnderbar(LyXFont::FONT_MISC_STATE u)
-{
-       bits.underbar = u;
-       return *this;
-}
-
-
-inline
-LyXFont & LyXFont::setNoun(LyXFont::FONT_MISC_STATE n)
-{
-       bits.noun = n;
-       return *this;
-}
+bool operator==(LyXFont::FontBits const & lhs, LyXFont::FontBits const & rhs);
 
 inline
-LyXFont & LyXFont::setLatex(LyXFont::FONT_MISC_STATE l)
+bool operator!=(LyXFont::FontBits const & lhs, LyXFont::FontBits const & rhs)
 {
-       bits.latex = l;
-       return *this;
+       return !(lhs == rhs);
 }
 
-
+///
 inline
-LyXFont & LyXFont::setColor(LColor::color c)
+bool operator==(LyXFont const & font1, LyXFont const & font2)
 {
-       bits.color = c;
-       return *this;
+       return font1.bits == font2.bits && font1.lang == font2.lang;
 }
 
-
+///
 inline
-LyXFont & LyXFont::setLanguage(Language const * l)
+bool operator!=(LyXFont const & font1, LyXFont const & font2)
 {
-       lang = l;
-       return *this;
+       return !(font1 == font2);
 }
 
 
-inline
-LyXFont & LyXFont::setNumber(LyXFont::FONT_MISC_STATE n)
-{
-       number_ = n;
-       return *this;
-}
+} // namespace lyx
 
 #endif