]> git.lyx.org Git - lyx.git/blobdiff - src/lyxfont.h
Added html export for LinuxDoc and DocBook. LinuxDoc import now available in file...
[lyx.git] / src / lyxfont.h
index 37102fc18686a0b44f0f77fb15756708a1cb804b..13a0f703a522721bb534b6393f0ff8b193adaa85 100644 (file)
@@ -19,7 +19,7 @@
 #include FORMS_H_LOCATION
 #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
@@ -35,9 +35,8 @@
 #undef OFF
 #endif
 
-class LyXLex;
 
-#define NEW_BITS 1
+class LyXLex;
 
 ///
 class LyXFont {
@@ -123,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 {
                ///
@@ -178,9 +164,15 @@ public:
        LyXFont(LyXFont::FONT_INIT2);
        /// Shortcut initialization
        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();
@@ -216,10 +208,13 @@ public:
        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);
@@ -240,7 +235,7 @@ public:
        ///
        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 &);
@@ -276,7 +271,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 */
@@ -299,16 +296,16 @@ public:
            to this font. Returns number of chars written. Base is the
            font state active now.
        */
-       int latexWriteStartChanges(string &, LyXFont const & base,
+       int latexWriteStartChanges(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(ostream &, LyXFont const & base,
                                 LyXFont const & next) const;
+
        /// Build GUI description of font state
        string stateText() const;
 
@@ -359,20 +356,21 @@ public:
        ///
        friend inline
        bool operator==(LyXFont const & font1, LyXFont const & font2) {
-               return font1.bits == font2.bits;
+               return font1.bits == font2.bits &&
+                       font1.lang == font2.lang;
        }
 
        ///
        friend inline
        bool operator!=(LyXFont const & font1, LyXFont const & font2) {
-               return font1.bits != font2.bits;
+               return font1.bits != font2.bits ||
+                       font1.lang != font2.lang;
        }
 
        /// compares two fonts, ignoring the setting of the Latex part.
        bool equalExceptLatex(LyXFont const &) const;
 
 private:
-#ifdef NEW_BITS
        ///
        struct FontBits {
                bool operator==(FontBits const & fb1) const {
@@ -384,8 +382,7 @@ private:
                                fb1.emph == emph &&
                                fb1.underbar == underbar &&
                                fb1.noun == noun &&
-                               fb1.latex == latex &&
-                               fb1.direction == direction;
+                               fb1.latex == latex;
                }
                bool operator!=(FontBits const & fb1) const {
                        return !(fb1 == *this);
@@ -400,91 +397,11 @@ private:
                FONT_MISC_STATE underbar;
                FONT_MISC_STATE noun;
                FONT_MISC_STATE latex;
-               FONT_DIRECTION direction;
        };
-#else
-       /// This have to be at least 32 bits, but 64 or more does not hurt
-       typedef unsigned int ui32;
-#endif
 
-       /** 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
-
-           Bit 76543210 76543210 76543210 76543210
-                                                --- Fam_Pos
-                                             --    Ser_Pos
-                                          ---      Sha_Pos
-                                     ----          Siz_Pos
-                                 ----              Col_Pos
-                             ---                   Emp_Pos
-                          ---                      Und_Pos
-                      - --                         Nou_Pos
-                   ---                             Lat_Pos
-               ----                                Dir_Pos
-               
-           Some might think this is a dirty representation, but it gives
-           us at least 25% speed-up, so why not? (Asger)
-
-           First of all it is a maintence nightmare...and now that we need
-           to enlarge the Color bits with 2 (from 4 to 6), we have a problem
-           since a 32 bit entity is not large enough... (Lgb)
-       */
-
-#ifdef NEW_BITS
        FontBits bits;
-#else
-       ui32 bits;
+       Language const * lang;
        
-       ///
-       enum FONT_POSITION {
-               ///
-               Fam_Pos =  0,
-               ///
-               Ser_Pos =  3,
-               ///
-               Sha_Pos =  5,
-               ///
-               Siz_Pos =  8,
-               ///
-               Col_Pos = 12,
-               ///
-               Emp_Pos = 16,
-               ///
-               Und_Pos = 19,
-               ///
-               Nou_Pos = 22,
-               ///
-               Lat_Pos = 25,
-               ///
-               Dir_Pos = 28
-       };
-
-       ///
-       enum FONT_MASK {
-               ///
-               Fam_Mask = 0x07,
-               ///
-               Ser_Mask = 0x03,
-               ///
-               Sha_Mask = 0x07,
-               ///
-               Siz_Mask = 0x0f,
-               ///
-               Col_Mask = 0x0f,
-               ///
-               Dir_Mask = 0x07,
-               ///
-               Misc_Mask = 0x07
-       };
-#endif
-
-       
-#ifdef NEW_BITS
        /// Sane font
        static FontBits sane;
        
@@ -494,43 +411,6 @@ private:
        /// All ignore font
        static FontBits ignore;
 
-#else
-       /// 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(LColor::none) << Col_Pos
-               | ui32(OFF) << Emp_Pos
-               | ui32(OFF) << Und_Pos
-               | ui32(OFF) << Nou_Pos
-               | ui32(OFF) << Lat_Pos
-               | ui32(LTR_DIR) << Dir_Pos};
-       
-       /// 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(LColor::inherit) << Col_Pos
-                     | ui32(INHERIT) << Emp_Pos
-                     | ui32(INHERIT) << Und_Pos
-                     | ui32(INHERIT) << Nou_Pos
-                     | ui32(INHERIT) << Lat_Pos
-                     | ui32(INHERIT_DIR) << Dir_Pos};
-       /// 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(LColor::ignore) << Col_Pos
-                     | ui32(IGNORE) << Emp_Pos
-                     | ui32(IGNORE) << Und_Pos
-                     | ui32(IGNORE) << Nou_Pos
-                     | ui32(IGNORE) << Lat_Pos
-                     | ui32(IGNORE_DIR) << Dir_Pos};
-#endif
        /// Updates a misc setting according to request
        LyXFont::FONT_MISC_STATE setMisc(LyXFont::FONT_MISC_STATE newfont,
                                         LyXFont::FONT_MISC_STATE org);
@@ -544,48 +424,76 @@ private:
 
 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)
+inline
+LyXFont::LyXFont(LyXFont::FONT_INIT1)
 {
        bits = inherit;
+       lang = default_language;
 }
 
 
-inline LyXFont::LyXFont(LyXFont::FONT_INIT2)
+inline
+LyXFont::LyXFont(LyXFont::FONT_INIT2)
 {
        bits = ignore;
+       lang = ignore_language;
 }
 
 
-inline LyXFont::LyXFont(LyXFont::FONT_INIT3)
+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::operator=(LyXFont const & x) 
+inline
+LyXFont::LyXFont(LyXFont::FONT_INIT2, Language const * l)
+{
+       bits = ignore;
+       lang = l;
+}
+
+
+inline
+LyXFont::LyXFont(LyXFont::FONT_INIT3, Language const * l)
+{
+       bits = sane;
+       lang = l;
+}
+
+inline
+LyXFont & LyXFont::operator=(LyXFont const & x) 
 {
        bits = x.bits;
+       lang = x.lang;
        return *this;
 }
 
 
-#ifdef NEW_BITS
-// You don't have to understand the stuff below :-)
-// It works, and it's bloody fast. (Asger)
-// And impossible to work with. (Lgb)
-
 inline
 LyXFont::FONT_FAMILY LyXFont::family() const 
 {
@@ -650,11 +558,26 @@ LColor::color LyXFont::color() const
 
 
 inline
-LyXFont::FONT_DIRECTION LyXFont::direction() const 
+Language const * LyXFont::language() const 
 {
-       return bits.direction;
+       return lang;
 }
 
+
+inline
+bool LyXFont::isRightToLeft() const 
+{
+       return lang->RightToLeft;
+}
+
+
+inline
+bool LyXFont::isVisibleRightToLeft() const 
+{
+       return (lang->RightToLeft && latex() != ON);
+}
+
+
 inline
 LyXFont & LyXFont::setFamily(LyXFont::FONT_FAMILY f)
 {
@@ -727,152 +650,10 @@ LyXFont & LyXFont::setColor(LColor::color c)
 
 
 inline
-LyXFont & LyXFont::setDirection(LyXFont::FONT_DIRECTION d)
+LyXFont & LyXFont::setLanguage(Language const * l)
 {
-       bits.direction = d;
+       lang = l;
        return *this;
 }
-#else
-// You don't have to understand the stuff below :-)
-// It works, and it's bloody fast. (Asger)
-// And impossible to work with. (Lgb)
-
-inline LyXFont::FONT_FAMILY LyXFont::family() const 
-{
-       return LyXFont::FONT_FAMILY((bits >> Fam_Pos) & Fam_Mask);
-}
-
-
-inline LyXFont::FONT_SERIES LyXFont::series() const
-{
-       return LyXFont::FONT_SERIES((bits >> Ser_Pos) & Ser_Mask);
-}
-
-
-inline LyXFont::FONT_SHAPE LyXFont::shape() const
-{
-       return LyXFont::FONT_SHAPE((bits >> Sha_Pos) & Sha_Mask);
-}
-
-
-inline LyXFont::FONT_SIZE LyXFont::size() const
-{
-       return LyXFont::FONT_SIZE((bits >> Siz_Pos) & Siz_Mask);
-}
-
-
-inline LyXFont::FONT_MISC_STATE LyXFont::emph() const
-{
-       return LyXFont::FONT_MISC_STATE((bits >> Emp_Pos) & Misc_Mask);
-}
-
-
-inline LyXFont::FONT_MISC_STATE LyXFont::underbar() const
-{
-       return LyXFont::FONT_MISC_STATE((bits >> Und_Pos) & Misc_Mask);
-}
-
-
-inline LyXFont::FONT_MISC_STATE LyXFont::noun() const
-{
-       return LyXFont::FONT_MISC_STATE((bits >> Nou_Pos) & Misc_Mask);
-}
-
-
-inline LyXFont::FONT_MISC_STATE LyXFont::latex() const 
-{
-       return LyXFont::FONT_MISC_STATE((bits >> Lat_Pos) & Misc_Mask);
-}
-
-
-inline LColor::color LyXFont::color() const 
-{
-       return LColor::color((bits >> Col_Pos) & Col_Mask);
-}
-
-
-inline LyXFont::FONT_DIRECTION LyXFont::direction() const 
-{
-       return LyXFont::FONT_DIRECTION((bits >> Dir_Pos) & Dir_Mask);
-}
-
-inline LyXFont & LyXFont::setFamily(LyXFont::FONT_FAMILY f)
-{
-       bits &= ~(Fam_Mask << Fam_Pos);
-       bits |= ui32(f) << Fam_Pos;
-       return *this;
-}
-
-
-inline LyXFont & LyXFont::setSeries(LyXFont::FONT_SERIES s)
-{
-       bits &= ~(Ser_Mask << Ser_Pos);
-       bits |= ui32(s) << Ser_Pos;
-       return *this;
-}
-
-
-inline LyXFont & LyXFont::setShape(LyXFont::FONT_SHAPE s)
-{
-       bits &= ~(Sha_Mask << Sha_Pos);
-       bits |= ui32(s) << Sha_Pos;
-       return *this;
-}
-
-
-inline LyXFont & LyXFont::setSize(LyXFont::FONT_SIZE s)
-{
-       bits &= ~(Siz_Mask << Siz_Pos);
-       bits |= ui32(s) << Siz_Pos;
-       return *this;
-}
-
-
-inline LyXFont & LyXFont::setEmph(LyXFont::FONT_MISC_STATE e)
-{
-       bits &= ~(Misc_Mask << Emp_Pos);
-       bits |= ui32(e) << Emp_Pos;
-       return *this;
-}
-
-
-inline LyXFont & LyXFont::setUnderbar(LyXFont::FONT_MISC_STATE u)
-{
-       bits &= ~(Misc_Mask << Und_Pos);
-       bits |= ui32(u) << Und_Pos;
-       return *this;
-}
-
-
-inline LyXFont & LyXFont::setNoun(LyXFont::FONT_MISC_STATE n)
-{
-       bits &= ~(Misc_Mask << Nou_Pos);
-       bits |= ui32(n) << Nou_Pos;
-       return *this;
-}
-
-inline LyXFont & LyXFont::setLatex(LyXFont::FONT_MISC_STATE l)
-{
-       bits &= ~(Misc_Mask << Lat_Pos);
-       bits |= ui32(l) << Lat_Pos;
-       return *this;
-}
-
-
-inline LyXFont & LyXFont::setColor(LColor::color c)
-{
-       bits &= ~(Col_Mask << Col_Pos);
-       bits |= ui32(c) << Col_Pos;
-       return *this;
-}
-
-
-inline LyXFont & LyXFont::setDirection(LyXFont::FONT_DIRECTION d)
-{
-       bits &= ~(Dir_Mask << Dir_Pos);
-       bits |= ui32(d) << Dir_Pos;
-       return *this;
-}
-#endif
 
 #endif