]> git.lyx.org Git - lyx.git/blobdiff - src/lyxfont.h
Angus insetindex patch + protect patch from Dekel
[lyx.git] / src / lyxfont.h
index a3cbfc4e25524565b803a5fe43c7b387746264f2..62e5da13f22ad8c3c589acdfa23533cc17cd60f0 100644 (file)
@@ -4,7 +4,8 @@
  * 
  *           LyX, The Document Processor
  *      
- *         Copyright 1995 Matthias Ettrich
+ *           Copyright 1995 Matthias Ettrich
+ *           Copyright 1995-2000 The LyX Team.   
  *
  * ====================================================== */
 
 #pragma interface
 #endif
 
-#include FORMS_H_LOCATION
+#include <iosfwd>
+
 #include "LString.h"
-#include "debug.h"
-#include "direction.h"
+#include "language.h"
+#include "LColor.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
@@ -34,6 +36,7 @@
 #endif
 
 class LyXLex;
+class BufferParams;
 
 ///
 class LyXFont {
@@ -119,19 +122,6 @@ public:
                IGNORE_SIZE
        };
  
-       enum FONT_DIRECTION {
-               ///
-               LTR_DIR,
-               ///
-               RTL_DIR,
-               ///
-               TOGGLE_DIR,
-               ///
-               INHERIT_DIR,
-               ///
-               IGNORE_DIR
-       };
-
        /// Used for emph, underbar, noun and latex toggles
        enum FONT_MISC_STATE {
                ///
@@ -145,36 +135,6 @@ public:
                ///
                IGNORE
        };
-       ///
-       enum FONT_COLOR {
-               ///
-               NONE,
-               ///
-               BLACK,
-               ///
-               WHITE,
-               ///
-               RED,
-               ///
-               GREEN,
-               ///
-               BLUE,
-               ///
-               CYAN,
-               ///
-               MAGENTA,
-               ///
-               YELLOW,
-               ///
-               MATH,
-               ///
-               INSET,
-               ///
-               INHERIT_COLOR,
-               ///
-               IGNORE_COLOR
-       };
 
        /// Trick to overload constructor and make it megafast
        enum FONT_INIT1 {
@@ -199,14 +159,23 @@ public:
        LyXFont(LyXFont const & x);
  
        /// Shortcut initialization
+       explicit
        LyXFont(LyXFont::FONT_INIT1);
        /// Shortcut initialization
+       explicit
        LyXFont(LyXFont::FONT_INIT2);
        /// Shortcut initialization
+       explicit
        LyXFont(LyXFont::FONT_INIT3);
+       /// Shortcut initialization
+       LyXFont(LyXFont::FONT_INIT1, Language const * l);
+       /// Shortcut initialization
+       LyXFont(LyXFont::FONT_INIT2, Language const * l);
+       /// Shortcut initialization
+       LyXFont(LyXFont::FONT_INIT3, Language const * l);
 
        /// LyXFont x, y; x = y;
-       LyXFont& operator=(LyXFont const & x);
+       LyXFont & operator=(LyXFont const & x);
  
        /// Decreases font size by one
        LyXFont & decSize();
@@ -237,15 +206,18 @@ public:
 
        ///
        FONT_MISC_STATE latex() const;
+
        ///
-       FONT_COLOR color() const;
+       LColor::color color() const;
 
        ///
-       FONT_DIRECTION direction() const;
+       Language const * language() const;
+
+       ///
+       bool isRightToLeft() const;
 
        ///
-       LyXDirection getFontDirection() const;
+       bool isVisibleRightToLeft() const;
        
        ///
        LyXFont & setFamily(LyXFont::FONT_FAMILY f);
@@ -264,9 +236,9 @@ public:
        ///
        LyXFont & setLatex(LyXFont::FONT_MISC_STATE l);
        ///
-       LyXFont & setColor(LyXFont::FONT_COLOR c);
+       LyXFont & setColor(LColor::color c);
        ///
-       LyXFont & setDirection(LyXFont::FONT_DIRECTION d);
+       LyXFont & setLanguage(Language const * l);
 
        /// Set family after LyX text format
        LyXFont & setLyXFamily(string const &);
@@ -302,7 +274,9 @@ 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 */
@@ -315,362 +289,329 @@ public:
        bool resolved() const;
  
        /// Read a font specification from LyXLex. Used for layout files.
-       LyXFont & lyxRead(LyXLex&);
+       LyXFont & lyxRead(LyXLex &);
  
        /// Writes the changes from this font to orgfont in .lyx format in file
-       void lyxWriteChanges(LyXFont const & orgfont, 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(string &, LyXFont const & base,
+       int latexWriteStartChanges(std::ostream &, LyXFont const & base,
                                   LyXFont const & prev) const;
 
        /** Writes tha tail of the LaTeX needed to chagne to this font.
            Returns number of chars written. Base is the font state we want
            to achieve.
        */
-       int latexWriteEndChanges(string &, LyXFont const & base,
+       int latexWriteEndChanges(std::ostream &, LyXFont const & base,
                                 LyXFont const & next) const;
-       /// Build GUI description of font state
-       string stateText() const;
-
-       ///
-       int maxAscent() const; 
-
-       ///
-       int maxDescent() const;
-
-       ///
-       int ascent(char c) const;
-
-       ///
-       int descent(char c) const;
-
-       ///
-       int width(char c) const;
-
-       ///
-       int lbearing(char c) const;
-
-       ///
-       int rbearing(char c) const;
-       
-       ///
-       int textWidth(char const *s, int n) const;
-
-       ///
-       int stringWidth(string const & s) const;
-
-       ///
-       int signedStringWidth(string const & s) const;
 
-       /// Draws text and returns width of text
-       int drawText(char const*, int n, Pixmap, int baseline, int x) const;
-
-       ///
-       int drawString(string const &, Pixmap pm, int baseline, int x) const;
+       /// Build GUI description of font state
+       string stateText(BufferParams * params) const;
 
        ///
-       GC getGC() const;
+       LColor::color realColor() const;
 
        ///
-       friend inline
+       friend
        bool operator==(LyXFont const & font1, LyXFont const & font2) {
-               return font1.bits == font2.bits;
+               return font1.bits == font2.bits &&
+                       font1.lang == font2.lang;
        }
 
        ///
-       friend inline
+       friend 
        bool operator!=(LyXFont const & font1, LyXFont const & font2) {
-               return font1.bits != font2.bits;
+               return !(font1 == font2);
        }
 
        /// compares two fonts, ignoring the setting of the Latex part.
        bool equalExceptLatex(LyXFont const &) const;
 
+       /// Converts logical attributes to concrete shape attribute
+       LyXFont::FONT_SHAPE realShape() const;
 private:
-       /// This have to be at least 32 bits, but 64 or more does not hurt
-       typedef unsigned int ui32;
-
-       /** Representation: bit table
-           Layout of bit table:
-           11 1111 111 122 222 222 2233
-           Bit 012 34 567 8901 2345 678 901 234 567 8901
-           FFF SS SSS SSSS CCCC EEE UUU NNN LLL
-           aaa ee hhh iiii oooo mmm nnn ooo aaa
-           mmm rr aaa zzzz llll ppp ddd uuu ttt
-
-           Some might think this is a dirty representation, but it gives
-           us at least 25% speed-up, so why not?
-       */
-       ui32 bits;
-
        ///
-       enum FONT_POSITION {
+       struct FontBits {
                ///
-               Fam_Pos =  0,
+               bool operator==(FontBits const & fb1) const;
                ///
-               Ser_Pos =  3,
+               bool operator!=(FontBits const & fb1) const;
                ///
-               Sha_Pos =  5,
+               FONT_FAMILY family;
                ///
-               Siz_Pos =  8,
+               FONT_SERIES series;
                ///
-               Col_Pos = 12,
+               FONT_SHAPE shape;
                ///
-               Emp_Pos = 16,
-               ///
-               Und_Pos = 19,
-               ///
-               Nou_Pos = 22,
-               ///
-               Lat_Pos = 25,
-               ///
-               Dir_Pos = 28
-       };
-
-       ///
-       enum FONT_MASK {
+               FONT_SIZE size;
                ///
-               Fam_Mask = 0x07,
+               LColor::color color;
                ///
-               Ser_Mask = 0x03,
+               FONT_MISC_STATE emph;
                ///
-               Sha_Mask = 0x07,
+               FONT_MISC_STATE underbar;
                ///
-               Siz_Mask = 0x0f,
+               FONT_MISC_STATE noun;
                ///
-               Col_Mask = 0x0f,
-               ///
-               Dir_Mask = 0x07,
-               ///
-               Misc_Mask = 0x07
+               FONT_MISC_STATE latex;
        };
+       ///
+       FontBits bits;
+       ///
+       Language const * lang;
+       
        /// Sane font
-       enum {  sane = ui32(ROMAN_FAMILY) << Fam_Pos
-               | ui32(MEDIUM_SERIES) << Ser_Pos
-               | ui32(UP_SHAPE) << Sha_Pos
-               | ui32(SIZE_NORMAL) << Siz_Pos
-               | ui32(NONE) << Col_Pos
-               | ui32(OFF) << Emp_Pos
-               | ui32(OFF) << Und_Pos
-               | ui32(OFF) << Nou_Pos
-               | ui32(OFF) << Lat_Pos
-               | ui32(LTR_DIR) << Dir_Pos};
+       static FontBits sane;
+       
        /// All inherit font
-       enum{ inherit = ui32(INHERIT_FAMILY) << Fam_Pos
-                     | ui32(INHERIT_SERIES) << Ser_Pos
-                     | ui32(INHERIT_SHAPE) << Sha_Pos
-                     | ui32(INHERIT_SIZE) << Siz_Pos
-                     | ui32(INHERIT_COLOR) << Col_Pos
-                     | ui32(INHERIT) << Emp_Pos
-                     | ui32(INHERIT) << Und_Pos
-                     | ui32(INHERIT) << Nou_Pos
-                     | ui32(INHERIT) << Lat_Pos
-                     | ui32(INHERIT_DIR) << Dir_Pos};
+       static FontBits inherit;
  
        /// All ignore font
-       enum{ ignore = ui32(IGNORE_FAMILY) << Fam_Pos
-                     | ui32(IGNORE_SERIES) << Ser_Pos
-                     | ui32(IGNORE_SHAPE) << Sha_Pos
-                     | ui32(IGNORE_SIZE) << Siz_Pos
-                     | ui32(IGNORE_COLOR) << Col_Pos
-                     | ui32(IGNORE) << Emp_Pos
-                     | ui32(IGNORE) << Und_Pos
-                     | ui32(IGNORE) << Nou_Pos
-                     | ui32(IGNORE) << Lat_Pos
-                     | ui32(IGNORE_DIR) << Dir_Pos};
+       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);
+};
 
-       /// Converts logical attributes to concrete shape attribute
-       LyXFont::FONT_SHAPE realShape() const;
 
-       ///
-       XFontStruct* getXFontstruct() const;
-};
+std::ostream & operator<<(std::ostream &, LyXFont::FONT_MISC_STATE);
 
-ostream & operator<<(ostream &, LyXFont::FONT_MISC_STATE);
 
-inline LyXFont::LyXFont()
+inline
+LyXFont::LyXFont()
 {
        bits = sane;
+       lang = default_language;
 }
 
 
-inline LyXFont::LyXFont(LyXFont const & x)
+inline
+LyXFont::LyXFont(LyXFont const & x)
 {
        bits = x.bits;
+       lang = x.lang;
+}
+
+
+inline
+LyXFont::LyXFont(LyXFont::FONT_INIT1)
+{
+       bits = inherit;
+       lang = default_language;
 }
 
 
-inline LyXFont::LyXFont(LyXFont::FONT_INIT1)
+inline
+LyXFont::LyXFont(LyXFont::FONT_INIT2)
+{
+       bits = ignore;
+       lang = ignore_language;
+}
+
+
+inline
+LyXFont::LyXFont(LyXFont::FONT_INIT3)
+{
+       bits = sane;
+       lang = default_language;
+}
+inline
+LyXFont::LyXFont(LyXFont::FONT_INIT1, Language const * l)
 {
        bits = inherit;
+       lang = l;
 }
 
 
-inline LyXFont::LyXFont(LyXFont::FONT_INIT2)
+inline
+LyXFont::LyXFont(LyXFont::FONT_INIT2, Language const * l)
 {
        bits = ignore;
+       lang = l;
 }
 
 
-inline LyXFont::LyXFont(LyXFont::FONT_INIT3)
+inline
+LyXFont::LyXFont(LyXFont::FONT_INIT3, Language const * l)
 {
        bits = sane;
+       lang = l;
 }
 
 
-inline LyXFont & LyXFont::operator=(LyXFont const & x) 
+inline
+LyXFont & LyXFont::operator=(LyXFont const & x) 
 {
        bits = x.bits;
+       lang = x.lang;
        return *this;
 }
 
 
-// You don't have to understand the stuff below :-)
-// It works, and it's bloody fast. (Asger)
-inline LyXFont::FONT_FAMILY LyXFont::family() const 
+inline
+LyXFont::FONT_FAMILY LyXFont::family() const 
 {
-       return LyXFont::FONT_FAMILY((bits >> Fam_Pos) & Fam_Mask);
+       return bits.family;
 }
 
 
-inline LyXFont::FONT_SERIES LyXFont::series() const
+inline
+LyXFont::FONT_SERIES LyXFont::series() const
 {
-       return LyXFont::FONT_SERIES((bits >> Ser_Pos) & Ser_Mask);
+       return bits.series;
 }
 
 
-inline LyXFont::FONT_SHAPE LyXFont::shape() const
+inline
+LyXFont::FONT_SHAPE LyXFont::shape() const
 {
-       return LyXFont::FONT_SHAPE((bits >> Sha_Pos) & Sha_Mask);
+       return bits.shape;
 }
 
 
-inline LyXFont::FONT_SIZE LyXFont::size() const
+inline
+LyXFont::FONT_SIZE LyXFont::size() const
 {
-       return LyXFont::FONT_SIZE((bits >> Siz_Pos) & Siz_Mask);
+       return bits.size;
 }
 
 
-inline LyXFont::FONT_MISC_STATE LyXFont::emph() const
+inline
+LyXFont::FONT_MISC_STATE LyXFont::emph() const
 {
-       return LyXFont::FONT_MISC_STATE((bits >> Emp_Pos) & Misc_Mask);
+       return bits.emph;
 }
 
 
-inline LyXFont::FONT_MISC_STATE LyXFont::underbar() const
+inline
+LyXFont::FONT_MISC_STATE LyXFont::underbar() const
 {
-       return LyXFont::FONT_MISC_STATE((bits >> Und_Pos) & Misc_Mask);
+       return bits.underbar;
 }
 
 
-inline LyXFont::FONT_MISC_STATE LyXFont::noun() const
+inline
+LyXFont::FONT_MISC_STATE LyXFont::noun() const
 {
-       return LyXFont::FONT_MISC_STATE((bits >> Nou_Pos) & Misc_Mask);
+       return bits.noun;
 }
 
 
-inline LyXFont::FONT_MISC_STATE LyXFont::latex() const 
+inline
+LyXFont::FONT_MISC_STATE LyXFont::latex() const 
 {
-       return LyXFont::FONT_MISC_STATE((bits >> Lat_Pos) & Misc_Mask);
+       return bits.latex;
 }
 
 
-inline LyXFont::FONT_COLOR LyXFont::color() const 
+inline
+LColor::color LyXFont::color() const 
 {
-       return LyXFont::FONT_COLOR((bits >> Col_Pos) & Col_Mask);
+       return bits.color;
 }
 
-inline LyXFont::FONT_DIRECTION LyXFont::direction() const 
+
+inline
+Language const * LyXFont::language() const 
 {
-       return LyXFont::FONT_DIRECTION((bits >> Dir_Pos) & Dir_Mask);
+       return lang;
 }
 
-inline LyXFont & LyXFont::setFamily(LyXFont::FONT_FAMILY f)
+
+inline
+bool LyXFont::isRightToLeft() const 
 {
-       bits &= ~(Fam_Mask << Fam_Pos);
-       bits |= ui32(f) << Fam_Pos;
+       return lang->RightToLeft();
+}
+
+
+inline
+bool LyXFont::isVisibleRightToLeft() const 
+{
+       return (lang->RightToLeft() && latex() != ON);
+}
+
+
+inline
+LyXFont & LyXFont::setFamily(LyXFont::FONT_FAMILY f)
+{
+       bits.family = f;
        return *this;
 }
 
 
-inline LyXFont & LyXFont::setSeries(LyXFont::FONT_SERIES s)
+inline
+LyXFont & LyXFont::setSeries(LyXFont::FONT_SERIES s)
 {
-       bits &= ~(Ser_Mask << Ser_Pos);
-       bits |= ui32(s) << Ser_Pos;
+       bits.series = s;
        return *this;
 }
 
 
-inline LyXFont & LyXFont::setShape(LyXFont::FONT_SHAPE s)
+inline
+LyXFont & LyXFont::setShape(LyXFont::FONT_SHAPE s)
 {
-       bits &= ~(Sha_Mask << Sha_Pos);
-       bits |= ui32(s) << Sha_Pos;
+       bits.shape = s;
        return *this;
 }
 
 
-inline LyXFont & LyXFont::setSize(LyXFont::FONT_SIZE s)
+inline
+LyXFont & LyXFont::setSize(LyXFont::FONT_SIZE s)
 {
-       bits &= ~(Siz_Mask << Siz_Pos);
-       bits |= ui32(s) << Siz_Pos;
+       bits.size = s;
        return *this;
 }
 
 
-inline LyXFont & LyXFont::setEmph(LyXFont::FONT_MISC_STATE e)
+inline
+LyXFont & LyXFont::setEmph(LyXFont::FONT_MISC_STATE e)
 {
-       bits &= ~(Misc_Mask << Emp_Pos);
-       bits |= ui32(e) << Emp_Pos;
+       bits.emph = e;
        return *this;
 }
 
 
-inline LyXFont & LyXFont::setUnderbar(LyXFont::FONT_MISC_STATE u)
+inline
+LyXFont & LyXFont::setUnderbar(LyXFont::FONT_MISC_STATE u)
 {
-       bits &= ~(Misc_Mask << Und_Pos);
-       bits |= ui32(u) << Und_Pos;
+       bits.underbar = u;
        return *this;
 }
 
 
-inline LyXFont & LyXFont::setNoun(LyXFont::FONT_MISC_STATE n)
+inline
+LyXFont & LyXFont::setNoun(LyXFont::FONT_MISC_STATE n)
 {
-       bits &= ~(Misc_Mask << Nou_Pos);
-       bits |= ui32(n) << Nou_Pos;
+       bits.noun = n;
        return *this;
 }
 
-inline LyXFont & LyXFont::setLatex(LyXFont::FONT_MISC_STATE l)
+inline
+LyXFont & LyXFont::setLatex(LyXFont::FONT_MISC_STATE l)
 {
-       bits &= ~(Misc_Mask << Lat_Pos);
-       bits |= ui32(l) << Lat_Pos;
+       bits.latex = l;
        return *this;
 }
 
 
-inline LyXFont & LyXFont::setColor(LyXFont::FONT_COLOR c)
+inline
+LyXFont & LyXFont::setColor(LColor::color c)
 {
-       bits &= ~(Col_Mask << Col_Pos);
-       bits |= ui32(c) << Col_Pos;
+       bits.color = c;
        return *this;
 }
 
-inline LyXFont & LyXFont::setDirection(LyXFont::FONT_DIRECTION d)
+
+inline
+LyXFont & LyXFont::setLanguage(Language const * l)
 {
-       bits &= ~(Dir_Mask << Dir_Pos);
-       bits |= ui32(d) << Dir_Pos;
+       lang = l;
        return *this;
 }