*
* LyX, The Document Processor
*
- * Copyright 1995 Matthias Ettrich
+ * Copyright 1995 Matthias Ettrich
+ * Copyright 1995-2000 The LyX Team.
*
* ====================================================== */
#pragma interface
#endif
-#define USE_PAINTER 1
-
#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
#undef OFF
#endif
-class LyXLex;
-#define NEW_BITS 1
+class LyXLex;
///
class LyXFont {
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 {
///
IGNORE
};
-#ifndef USE_PAINTER
- ///
- enum FONT_COLOR {
- ///
- NONE,
- ///
- BLACK,
- ///
- WHITE,
- ///
- RED,
- ///
- GREEN,
- ///
- BLUE,
- ///
- CYAN,
- ///
- MAGENTA,
- ///
- YELLOW,
- ///
- MATH,
- ///
- INSET,
- ///
- INHERIT_COLOR,
- ///
- IGNORE_COLOR
- };
-#endif
-
/// Trick to overload constructor and make it megafast
enum FONT_INIT1 {
///
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();
///
FONT_MISC_STATE latex() const;
-#ifdef USE_PAINTER
///
LColor::color color() const;
-#else
- ///
- FONT_COLOR color() const;
-#endif
///
- FONT_DIRECTION direction() const;
+ Language const * language() const;
+
+ ///
+ bool isRightToLeft() const;
///
- LyXDirection getFontDirection() const;
+ bool isVisibleRightToLeft() const;
///
LyXFont & setFamily(LyXFont::FONT_FAMILY f);
LyXFont & setNoun(LyXFont::FONT_MISC_STATE n);
///
LyXFont & setLatex(LyXFont::FONT_MISC_STATE l);
-#ifdef USE_PAINTER
///
LyXFont & setColor(LColor::color c);
-#else
- ///
- LyXFont & setColor(LyXFont::FONT_COLOR c);
-#endif
///
- LyXFont & setDirection(LyXFont::FONT_DIRECTION d);
+ LyXFont & setLanguage(Language const * l);
/// Set family after LyX text format
LyXFont & setLyXFamily(string const &);
* 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 */
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;
///
int drawString(string const &, Pixmap pm, int baseline, int x) const;
-#ifdef USE_PAINTER
///
LColor::color realColor() const;
-#endif
///
XID getFontID() const {
return getXFontstruct()->fid;
}
-#ifndef USE_PAINTER
- ///
- GC getGC() const;
-#endif
///
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 {
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);
FONT_SERIES series;
FONT_SHAPE shape;
FONT_SIZE size;
-#ifdef USE_PAINTER
LColor::color color;
-#else
- FONT_COLOR color;
-#endif
FONT_MISC_STATE emph;
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;
/// 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
-#ifdef USE_PAINTER
- | ui32(LColor::none) << Col_Pos
-#else
- | ui32(NONE) << Col_Pos
-#endif
- | 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
-#ifdef USE_PAINTER
- | ui32(LColor::inherit) << Col_Pos
-#else
- | ui32(INHERIT_COLOR) << Col_Pos
-#endif
- | 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
-#ifdef USE_PAINTER
- | ui32(LColor::ignore) << Col_Pos
-#else
- | ui32(IGNORE_COLOR) << Col_Pos
-#endif
- | 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);
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(LyXFont::FONT_INIT2, Language const * l)
+{
+ bits = ignore;
+ lang = l;
}
-inline LyXFont & LyXFont::operator=(LyXFont const & x)
+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
{
}
-#ifdef USE_PAINTER
inline
LColor::color LyXFont::color() const
{
return bits.color;
}
-#else
+
+
inline
-LyXFont::FONT_COLOR LyXFont::color() const
+Language const * LyXFont::language() const
{
- return bits.color;
+ return lang;
}
-#endif
inline
-LyXFont::FONT_DIRECTION LyXFont::direction() const
+bool LyXFont::isRightToLeft() const
{
- return bits.direction;
+ return lang->RightToLeft;
}
+
+inline
+bool LyXFont::isVisibleRightToLeft() const
+{
+ return (lang->RightToLeft && latex() != ON);
+}
+
+
inline
LyXFont & LyXFont::setFamily(LyXFont::FONT_FAMILY f)
{
}
-#ifdef USE_PAINTER
inline
LyXFont & LyXFont::setColor(LColor::color c)
{
bits.color = c;
return *this;
}
-#else
-inline
-LyXFont & LyXFont::setColor(LyXFont::FONT_COLOR c)
-{
- bits.color = c;
- return *this;
-}
-#endif
-
-inline
-LyXFont & LyXFont::setDirection(LyXFont::FONT_DIRECTION d)
-{
- bits.direction = d;
- 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);
-}
-
-
-#ifdef USE_PAINTER
-inline LColor::color LyXFont::color() const
-{
- return LColor::color((bits >> Col_Pos) & Col_Mask);
-}
-#else
-inline LyXFont::FONT_COLOR LyXFont::color() const
-{
- return FONT_COLOR((bits >> Col_Pos) & Col_Mask);
-}
-#endif
-
-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;
-}
-
-
-#ifdef USE_PAINTER
-inline LyXFont & LyXFont::setColor(LColor::color c)
-{
- bits &= ~(Col_Mask << Col_Pos);
- bits |= ui32(c) << Col_Pos;
- return *this;
-}
-#else
-inline LyXFont & LyXFont::setColor(LyXFont::FONT_COLOR c)
-{
- bits &= ~(Col_Mask << Col_Pos);
- bits |= ui32(c) << Col_Pos;
- return *this;
-}
-#endif
-
-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;
}
-#endif
#endif