diff options
| -rw-r--r-- | FL/Fl_Help_View.H | 75 | ||||
| -rw-r--r-- | src/Fl_Help_View.cxx | 45 |
2 files changed, 80 insertions, 40 deletions
diff --git a/FL/Fl_Help_View.H b/FL/Fl_Help_View.H index a98e40ed0..aff5099c3 100644 --- a/FL/Fl_Help_View.H +++ b/FL/Fl_Help_View.H @@ -84,6 +84,59 @@ struct Fl_Help_Link }; /** Fl_Help_Target structure */ + +/* + * Fl_Help_View font stack opaque implementation + */ + +/** Fl_Help_View font stack element definition */ +struct Fl_Help_Font_Style { + Fl_Font f; ///< Font + Fl_Fontsize s; ///< Font Size + Fl_Color c; ///< Font Color + void get(Fl_Font &afont, Fl_Fontsize &asize, Fl_Color &acolor) {afont=f; asize=s; acolor=c;} ///< Gets current font attributes + void set(Fl_Font afont, Fl_Fontsize asize, Fl_Color acolor) {f=afont; s=asize; c=acolor;} ///< Sets current font attributes + Fl_Help_Font_Style(Fl_Font afont, Fl_Fontsize asize, Fl_Color acolor) {set(afont, asize, acolor);} + Fl_Help_Font_Style(){} // For in table use +}; + +/** Fl_Help_View font stack definition */ +const size_t MAX_FL_HELP_FS_ELTS = 100; + +struct Fl_Help_Font_Stack { + /** font stack construction, initialize attributes.*/ + Fl_Help_Font_Stack() { + nfonts_ = 0; + } + + void init(Fl_Font f, Fl_Fontsize s, Fl_Color c) { + nfonts_ = 0; + elts_[nfonts_].set(f, s, c); + fl_font(f, s); + fl_color(c); + } + /** Gets the top (current) elt on the stack */ + void top(Fl_Font &f, Fl_Fontsize &s, Fl_Color &c) { elts_[nfonts_].get(f, s, c); } + /** Pushes the font style triplet on the stack, also calls fl_font() & fl_color() adequately */ + void push(Fl_Font f, Fl_Fontsize s, Fl_Color c) { + if (nfonts_ < MAX_FL_HELP_FS_ELTS-1) nfonts_ ++; + elts_[nfonts_].set(f, s, c); + fl_font(f, s); fl_color(c); + } + /** Pops from the stack the font style triplet and calls fl_font() & fl_color() adequately */ + void pop(Fl_Font &f, Fl_Fontsize &s, Fl_Color &c) { + top(f, s, c); + fl_font(f, s); fl_color(c); + if (nfonts_ > 0) nfonts_ --; + } + /** Gets the current count of font style elts in the stack */ + size_t count() const {return nfonts_;} /// Gets the current number of fonts in the stack + +protected: + size_t nfonts_; ///< current number of fonts in stack + Fl_Help_Font_Style elts_[100]; ///< font eletments +}; + struct Fl_Help_Target { char name[32]; ///< Target name @@ -107,15 +160,11 @@ class FL_EXPORT Fl_Help_View : public Fl_Group //// Help viewer widget Fl_Font textfont_; ///< Default font for text Fl_Fontsize textsize_; ///< Default font size const char *value_; ///< HTML text value - + Fl_Help_Font_Stack fstack_; ///< font stack management int nblocks_, ///< Number of blocks/paragraphs ablocks_; ///< Allocated blocks Fl_Help_Block *blocks_; ///< Blocks - int nfonts_; ///< Number of fonts in stack - Fl_Font fonts_[100]; ///< Font stack - Fl_Fontsize font_sizes_[100]; ///< Font Size stack - Fl_Help_Func *link_; ///< Link transform function int nlinks_, ///< Number of links @@ -150,6 +199,12 @@ class FL_EXPORT Fl_Help_View : public Fl_Group //// Help viewer widget static Fl_Color hv_selection_color; static Fl_Color hv_selection_text_color; + + void initfont(Fl_Font &f, Fl_Fontsize &s, Fl_Color &c) { f = textfont_; s = textsize_; c = textcolor_; fstack_.init(f, s, c); } + void pushfont(Fl_Font f, Fl_Fontsize s) {fstack_.push(f, s, textcolor_);} + void pushfont(Fl_Font f, Fl_Fontsize s, Fl_Color c) {fstack_.push(f, s, c);} + void popfont(Fl_Font &f, Fl_Fontsize &s, Fl_Color &c) {fstack_.pop(f, s, c);} + Fl_Help_Block *add_block(const char *s, int xx, int yy, int ww, int hh, uchar border = 0); void add_link(const char *n, int xx, int yy, int ww, int hh); void add_target(const char *n, int yy); @@ -166,16 +221,6 @@ class FL_EXPORT Fl_Help_View : public Fl_Group //// Help viewer widget int get_length(const char *l); int handle(int); - void initfont(Fl_Font &f, Fl_Fontsize &s) { nfonts_ = 0; - fl_font(f = fonts_[0] = textfont_, - s = font_sizes_[0] = textsize_); } - void pushfont(Fl_Font f, Fl_Fontsize s) { if (nfonts_ < 99) nfonts_ ++; - fl_font(fonts_[nfonts_] = f, - font_sizes_[nfonts_] = s); } - void popfont(Fl_Font &f, Fl_Fontsize &s) { if (nfonts_ > 0) nfonts_ --; - fl_font(f = fonts_[nfonts_], - s = font_sizes_[nfonts_]); } - void hv_draw(const char *t, int x, int y); char begin_selection(); char extend_selection(); diff --git a/src/Fl_Help_View.cxx b/src/Fl_Help_View.cxx index f38e65820..6dcda0083 100644 --- a/src/Fl_Help_View.cxx +++ b/src/Fl_Help_View.cxx @@ -444,14 +444,14 @@ Fl_Help_View::draw() int xx, yy, ww, hh; // Current positions and sizes int line; // Current line Fl_Font font; - Fl_Fontsize fsize; // Current font and size + Fl_Fontsize fsize; // Current font and size + Fl_Color fcolor; // current font color int head, pre, // Flags for text needspace; // Do we need whitespace? Fl_Boxtype b = box() ? box() : FL_DOWN_BOX; // Box to draw... int underline, // Underline text? xtra_ww; // Extra width for underlined space between words - Fl_Color prev_text_color=FL_RED; // Saved text color before font color modification // Draw the scrollbar(s) and box first... ww = w() ; @@ -504,7 +504,7 @@ Fl_Help_View::draw() needspace = 0; underline = 0; - initfont(font, fsize); + initfont(font, fsize, fcolor); for (ptr = block->start, s = buf; ptr < block->end;) { @@ -720,8 +720,7 @@ Fl_Help_View::draw() else if (strcasecmp(buf, "FONT") == 0) { if (get_attr(attrs, "COLOR", attr, sizeof(attr)) != NULL) { - prev_text_color = textcolor_; - fl_color( (textcolor_ = get_color(attr, textcolor_)) ); + pushfont(font, fsize, (textcolor_ = get_color(attr, textcolor_)) ); } if (get_attr(attrs, "FACE", attr, sizeof(attr)) != NULL) { @@ -748,9 +747,7 @@ Fl_Help_View::draw() } else if (strcasecmp(buf, "/FONT") == 0) { - textcolor_ = prev_text_color; - fl_color(textcolor_); - popfont(font, fsize); + popfont(font, fsize, textcolor_); } else if (strcasecmp(buf, "U") == 0) underline = 1; @@ -825,10 +822,10 @@ Fl_Help_View::draw() strcasecmp(buf, "/TT") == 0 || strcasecmp(buf, "/KBD") == 0 || strcasecmp(buf, "/VAR") == 0) - popfont(font, fsize); + popfont(font, fsize, fcolor); else if (strcasecmp(buf, "/PRE") == 0) { - popfont(font, fsize); + popfont(font, fsize, fcolor); pre = 0; } else if (strcasecmp(buf, "IMG") == 0) @@ -1063,7 +1060,8 @@ void Fl_Help_View::format() { int line; // Current line in block int links; // Links for current line Fl_Font font; - Fl_Fontsize fsize; // Current font and size + Fl_Fontsize fsize; // Current font and size + Fl_Color fcolor; // Current font color unsigned char border; // Draw border? int talign, // Current alignment newalign, // New alignment @@ -1105,7 +1103,7 @@ void Fl_Help_View::format() { return; // Setup for formatting... - initfont(font, fsize); + initfont(font, fsize, fcolor); line = 0; links = 0; @@ -1454,7 +1452,7 @@ void Fl_Help_View::format() { else if (strcasecmp(buf, "/CENTER") == 0) talign = LEFT; - popfont(font, fsize); + popfont(font, fsize, fcolor); //#warning FIXME this isspace & 255 test will probably not work on a utf8 stream... And we use it everywhere! while (isspace((*ptr)&255)) @@ -1604,7 +1602,7 @@ void Fl_Help_View::format() { strcasecmp(buf, "/TH") == 0) && row) { line = do_align(block, line, xx, newalign, links); - popfont(font, fsize); + popfont(font, fsize, fcolor); xx = margins.pop(); talign = LEFT; } @@ -1633,7 +1631,7 @@ void Fl_Help_View::format() { pushfont(font, fsize); } else if (strcasecmp(buf, "/FONT") == 0) - popfont(font, fsize); + popfont(font, fsize, fcolor); else if (strcasecmp(buf, "B") == 0 || strcasecmp(buf, "STRONG") == 0) pushfont(font |= FL_BOLD, fsize); @@ -1655,7 +1653,7 @@ void Fl_Help_View::format() { strcasecmp(buf, "/TT") == 0 || strcasecmp(buf, "/KBD") == 0 || strcasecmp(buf, "/VAR") == 0) - popfont(font, fsize); + popfont(font, fsize, fcolor); else if (strcasecmp(buf, "IMG") == 0) { Fl_Shared_Image *img = 0; @@ -1877,8 +1875,8 @@ Fl_Help_View::format_table(int *table_width, // O - Total table width *start; // Start of element int minwidths[MAX_COLUMNS]; // Minimum widths for each column Fl_Font font; - Fl_Fontsize fsize; // Current font and size - + Fl_Fontsize fsize; // Current font and size + Fl_Color fcolor; // Currrent font color // Clear widths... *table_width = 0; @@ -1893,8 +1891,7 @@ Fl_Help_View::format_table(int *table_width, // O - Total table width max_width = 0; pre = 0; needspace = 0; - font = fonts_[nfonts_]; - fsize = font_sizes_[nfonts_]; + fstack_.top(font, fsize, fcolor); // Scan the table... for (ptr = table, column = -1, width = 0, s = buf, incell = 0; *ptr;) @@ -2014,7 +2011,7 @@ Fl_Help_View::format_table(int *table_width, // O - Total table width width = 0; needspace = 0; - popfont(font, fsize); + popfont(font, fsize, fcolor); } else if (strcasecmp(buf, "TR") == 0 || strcasecmp(buf, "/TR") == 0 || strcasecmp(buf, "/TABLE") == 0) @@ -2104,7 +2101,7 @@ Fl_Help_View::format_table(int *table_width, // O - Total table width strcasecmp(buf, "/TH") == 0) { incell = 0; - popfont(font, fsize); + popfont(font, fsize, fcolor); } else if (strcasecmp(buf, "B") == 0 || strcasecmp(buf, "STRONG") == 0) @@ -2127,7 +2124,7 @@ Fl_Help_View::format_table(int *table_width, // O - Total table width strcasecmp(buf, "/TT") == 0 || strcasecmp(buf, "/KBD") == 0 || strcasecmp(buf, "/VAR") == 0) - popfont(font, fsize); + popfont(font, fsize, fcolor); else if (strcasecmp(buf, "IMG") == 0 && incell) { Fl_Shared_Image *img = 0; @@ -2986,8 +2983,6 @@ Fl_Help_View::Fl_Help_View(int xx, // I - Left position nblocks_ = 0; blocks_ = (Fl_Help_Block *)0; - nfonts_ = 0; - link_ = (Fl_Help_Func *)0; alinks_ = 0; |
