]> 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 ccfe7e54669e563c7a0c4451d59dbdc3cac6cf17..0cfaaf24c5d94dbbcd5427f2a5b60f698dce5032 100644 (file)
@@ -1,33 +1,32 @@
 // -*- C++ -*-
-/* This file is part of
- * ======================================================
- * 
- *           LyX, The Document Processor
- *      
- *           Copyright 1995 Matthias Ettrich
- *           Copyright 1995-2001 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 "LColor.h"
+#include "support/docstream.h"
 
-#include <iosfwd>
 
-#include "LString.h"
-#include "LColor.h"
-#include "language.h"
+namespace lyx {
+
 
 class LyXLex;
 class BufferParams;
+class Language;
 
 
-#define NO_LATEX 1
-
 ///
 class LyXFont {
 public:
@@ -47,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
        };
 
        ///
@@ -111,7 +130,7 @@ public:
                ///
                IGNORE_SIZE
        };
+
        /// Used for emph, underbar, noun and latex toggles
        enum FONT_MISC_STATE {
                ///
@@ -142,6 +161,28 @@ 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();
 
@@ -163,96 +204,68 @@ public:
 
        /// 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;
-
-#ifndef NO_LATEX
+       FONT_MISC_STATE noun() const { return bits.noun; }
        ///
-       FONT_MISC_STATE latex() const;
-#endif
+       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);
-#ifndef NO_LATEX
        ///
-       LyXFont & setLatex(LyXFont::FONT_MISC_STATE l);
-#endif
-       ///
-       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 &);
 
        /// 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
@@ -262,164 +275,138 @@ 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, bool toggleall = false);
+       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, Language const * language);
 
+       /// 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, Language const * doclang,
-                            std::ostream &) const;
+       void lyxWriteChanges(LyXFont const & orgfont, std::ostream &) const;
 
        /** Writes the head of the LaTeX needed to change to this font.
            Writes to string, the head of the LaTeX needed to change
            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);
-
-       /// 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;
-#ifndef NO_LATEX
-               ///
-               FONT_MISC_STATE latex;
-#endif
-               ///
-               FONT_MISC_STATE number;
-       };
-
        ///
        FontBits bits;
-       
        ///
        Language const * lang;
-       
        /// 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);
 };
 
 
-inline
-LyXFont::FONT_SHAPE LyXFont::shape() const
-{
-       return bits.shape;
-}
-
-
-inline
-LyXFont::LyXFont()
-       : bits(sane), lang(default_language)
-{}
-
+/** \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::FONT_FAMILY LyXFont::family() const 
-{
-       return bits.family;
-}
 
 
 inline
-LyXFont::FONT_SERIES LyXFont::series() const
+bool LyXFont::isSymbolFont() const
 {
-       return bits.series;
+       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::FONT_SIZE LyXFont::size() const
-{
-       return bits.size;
-}
-
-
-inline
-LyXFont::FONT_MISC_STATE LyXFont::emph() const
-{
-       return bits.emph;
-}
-
+bool operator==(LyXFont::FontBits const & lhs, LyXFont::FontBits const & rhs);
 
 inline
-LyXFont::FONT_MISC_STATE LyXFont::noun() const
+bool operator!=(LyXFont::FontBits const & lhs, LyXFont::FontBits const & rhs)
 {
-       return bits.noun;
+       return !(lhs == rhs);
 }
 
-
-///
-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;
+       return font1.bits == font2.bits && font1.lang == font2.lang;
 }
 
 ///
@@ -428,4 +415,8 @@ bool operator!=(LyXFont const & font1, LyXFont const & font2)
 {
        return !(font1 == font2);
 }
+
+
+} // namespace lyx
+
 #endif