| // |
| // "$Id: Fl_Help_View.H 8306 2011-01-24 17:04:22Z matt $" |
| // |
| // Help Viewer widget definitions. |
| // |
| // Copyright 1997-2010 by Easy Software Products. |
| // Image support by Matthias Melcher, Copyright 2000-2009. |
| // |
| // This library is free software; you can redistribute it and/or |
| // modify it under the terms of the GNU Library General Public |
| // License as published by the Free Software Foundation; either |
| // version 2 of the License, or (at your option) any later version. |
| // |
| // This library is distributed in the hope that it will be useful, |
| // but WITHOUT ANY WARRANTY; without even the implied warranty of |
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| // Library General Public License for more details. |
| // |
| // You should have received a copy of the GNU Library General Public |
| // License along with this library; if not, write to the Free Software |
| // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 |
| // USA. |
| // |
| // Please report all bugs and problems on the following page: |
| // |
| // http://www.fltk.org/str.php |
| // |
| |
| /* \file |
| Fl_Help_View widget . */ |
| |
| #ifndef Fl_Help_View_H |
| # define Fl_Help_View_H |
| |
| // |
| // Include necessary header files... |
| // |
| |
| # include <stdio.h> |
| # include "Fl.H" |
| # include "Fl_Group.H" |
| # include "Fl_Scrollbar.H" |
| # include "fl_draw.H" |
| # include "Fl_Shared_Image.H" |
| # include "filename.H" |
| |
| |
| // |
| // Fl_Help_Func type - link callback function for files... |
| // |
| |
| |
| typedef const char *(Fl_Help_Func)(Fl_Widget *, const char *); |
| |
| |
| // |
| // Fl_Help_Block structure... |
| // |
| |
| struct Fl_Help_Block { |
| const char *start, // Start of text |
| *end; // End of text |
| uchar border; // Draw border? |
| Fl_Color bgcolor; // Background color |
| int x, // Indentation/starting X coordinate |
| y, // Starting Y coordinate |
| w, // Width |
| h; // Height |
| int line[32]; // Left starting position for each line |
| }; |
| |
| // |
| // Fl_Help_Link structure... |
| // |
| /** Definition of a link for the html viewer. */ |
| struct Fl_Help_Link { |
| char filename[192], ///< Reference filename |
| name[32]; ///< Link target (blank if none) |
| int x, ///< X offset of link text |
| y, ///< Y offset of link text |
| w, ///< Width of link text |
| h; ///< Height of link text |
| }; |
| |
| /* |
| * Fl_Help_View font stack opaque implementation |
| */ |
| |
| /** Fl_Help_View font stack element definition. */ |
| struct FL_EXPORT 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_EXPORT 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) element 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) { |
| if (nfonts_ > 0) nfonts_ --; |
| top(f, s, c); |
| fl_font(f, s); fl_color(c); |
| } |
| /** Gets the current count of font style elements 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 elements |
| }; |
| |
| /** Fl_Help_Target structure */ |
| |
| struct Fl_Help_Target { |
| char name[32]; ///< Target name |
| int y; ///< Y offset of target |
| }; |
| |
| /** |
| The Fl_Help_View widget displays HTML text. Most HTML 2.0 |
| elements are supported, as well as a primitive implementation of tables. |
| GIF, JPEG, and PNG images are displayed inline. |
| |
| Supported HTML tags: |
| - A: HREF/NAME |
| - B |
| - BODY: BGCOLOR/TEXT/LINK |
| - BR |
| - CENTER |
| - CODE |
| - DD |
| - DL |
| - DT |
| - EM |
| - FONT: COLOR/SIZE/FACE=(helvetica/arial/sans/times/serif/symbol/courier) |
| - H1/H2/H3/H4/H5/H6 |
| - HEAD |
| - HR |
| - I |
| - IMG: SRC/WIDTH/HEIGHT/ALT |
| - KBD |
| - LI |
| - OL |
| - P |
| - PRE |
| - STRONG |
| - TABLE: TH/TD/TR/BORDER/BGCOLOR/COLSPAN/ALIGN=CENTER|RIGHT|LEFT |
| - TITLE |
| - TT |
| - U |
| - UL |
| - VAR |
| |
| Supported color names: |
| - black,red,green,yellow,blue,magenta,fuchsia,cyan,aqua,white,gray,grey,lime,maroon,navy,olive,purple,silver,teal. |
| |
| Supported urls: |
| - Internal: file: |
| - External: http: ftp: https: ipp: mailto: news: |
| |
| Quoted char names: |
| - Aacute aacute Acirc acirc acute AElig aelig Agrave agrave amp Aring aring Atilde atilde Auml auml |
| - brvbar bull |
| - Ccedil ccedil cedil cent copy curren |
| - deg divide |
| - Eacute eacute Ecirc ecirc Egrave egrave ETH eth Euml euml euro |
| - frac12 frac14 frac34 |
| - gt |
| - Iacute iacute Icirc icirc iexcl Igrave igrave iquest Iuml iuml |
| - laquo lt |
| - macr micro middot |
| - nbsp not Ntilde ntilde |
| - Oacute oacute Ocirc ocirc Ograve ograve ordf ordm Oslash oslash Otilde otilde Ouml ouml |
| - para premil plusmn pound |
| - quot |
| - raquo reg |
| - sect shy sup1 sup2 sup3 szlig |
| - THORN thorn times trade |
| - Uacute uacute Ucirc ucirc Ugrave ugrave uml Uuml uuml |
| - Yacute yacute |
| - yen Yuml yuml |
| |
| */ |
| class FL_EXPORT Fl_Help_View : public Fl_Group { // Help viewer widget |
| |
| enum { RIGHT = -1, CENTER, LEFT }; ///< Alignments |
| |
| char title_[1024]; ///< Title string |
| Fl_Color defcolor_, ///< Default text color |
| bgcolor_, ///< Background color |
| textcolor_, ///< Text color |
| linkcolor_; ///< Link color |
| 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 |
| |
| Fl_Help_Func *link_; ///< Link transform function |
| |
| int nlinks_, ///< Number of links |
| alinks_; ///< Allocated links |
| Fl_Help_Link *links_; ///< Links |
| |
| int ntargets_, ///< Number of targets |
| atargets_; ///< Allocated targets |
| Fl_Help_Target *targets_; ///< Targets |
| |
| char directory_[FL_PATH_MAX];///< Directory for current file |
| char filename_[FL_PATH_MAX]; ///< Current filename |
| int topline_, ///< Top line in document |
| leftline_, ///< Lefthand position |
| size_, ///< Total document length |
| hsize_, ///< Maximum document width |
| scrollbar_size_; ///< Size for both scrollbars |
| Fl_Scrollbar scrollbar_, ///< Vertical scrollbar for document |
| hscrollbar_; ///< Horizontal scrollbar |
| |
| static int selection_first; |
| static int selection_last; |
| static int selection_push_first; |
| static int selection_push_last; |
| static int selection_drag_first; |
| static int selection_drag_last; |
| static int selected; |
| static int draw_mode; |
| static int mouse_x; |
| static int mouse_y; |
| static int current_pos; |
| static Fl_Help_View *current_view; |
| 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); |
| static int compare_targets(const Fl_Help_Target *t0, const Fl_Help_Target *t1); |
| int do_align(Fl_Help_Block *block, int line, int xx, int a, int &l); |
| void draw(); |
| void format(); |
| void format_table(int *table_width, int *columns, const char *table); |
| void free_data(); |
| int get_align(const char *p, int a); |
| const char *get_attr(const char *p, const char *n, char *buf, int bufsize); |
| Fl_Color get_color(const char *n, Fl_Color c); |
| Fl_Shared_Image *get_image(const char *name, int W, int H); |
| int get_length(const char *l); |
| int handle(int); |
| |
| void hv_draw(const char *t, int x, int y); |
| char begin_selection(); |
| char extend_selection(); |
| void end_selection(int c=0); |
| void clear_global_selection(); |
| Fl_Help_Link *find_link(int, int); |
| void follow_link(Fl_Help_Link*); |
| |
| public: |
| |
| Fl_Help_View(int xx, int yy, int ww, int hh, const char *l = 0); |
| ~Fl_Help_View(); |
| /** Returns the current directory for the text in the buffer. */ |
| const char *directory() const { if (directory_[0]) return (directory_); |
| else return ((const char *)0); } |
| /** Returns the current filename for the text in the buffer. */ |
| const char *filename() const { if (filename_[0]) return (filename_); |
| else return ((const char *)0); } |
| int find(const char *s, int p = 0); |
| /** |
| This method assigns a callback function to use when a link is |
| followed or a file is loaded (via Fl_Help_View::load()) that |
| requires a different file or path. |
| |
| The callback function receives a pointer to the Fl_Help_View |
| widget and the URI or full pathname for the file in question. |
| It must return a pathname that can be opened as a local file or NULL: |
| |
| \code |
| const char *fn(Fl_Widget *w, const char *uri); |
| \endcode |
| |
| The link function can be used to retrieve remote or virtual |
| documents, returning a temporary file that contains the actual |
| data. If the link function returns NULL, the value of |
| the Fl_Help_View widget will remain unchanged. |
| |
| If the link callback cannot handle the URI scheme, it should |
| return the uri value unchanged or set the value() of the widget |
| before returning NULL. |
| */ |
| void link(Fl_Help_Func *fn) { link_ = fn; } |
| int load(const char *f); |
| void resize(int,int,int,int); |
| /** Gets the size of the help view. */ |
| int size() const { return (size_); } |
| void size(int W, int H) { Fl_Widget::size(W, H); } |
| /** Sets the default text color. */ |
| void textcolor(Fl_Color c) { if (textcolor_ == defcolor_) textcolor_ = c; defcolor_ = c; } |
| /** Returns the current default text color. */ |
| Fl_Color textcolor() const { return (defcolor_); } |
| /** Sets the default text font. */ |
| void textfont(Fl_Font f) { textfont_ = f; format(); } |
| /** Returns the current default text font. */ |
| Fl_Font textfont() const { return (textfont_); } |
| /** Sets the default text size. */ |
| void textsize(Fl_Fontsize s) { textsize_ = s; format(); } |
| /** Gets the default text size. */ |
| Fl_Fontsize textsize() const { return (textsize_); } |
| /** Returns the current document title, or NULL if there is no title. */ |
| const char *title() { return (title_); } |
| void topline(const char *n); |
| void topline(int); |
| /** Returns the current top line in pixels. */ |
| int topline() const { return (topline_); } |
| void leftline(int); |
| /** Gets the left position in pixels. */ |
| int leftline() const { return (leftline_); } |
| void value(const char *val); |
| /** Returns the current buffer contents. */ |
| const char *value() const { return (value_); } |
| void clear_selection(); |
| void select_all(); |
| /** |
| Gets the current size of the scrollbars' troughs, in pixels. |
| |
| If this value is zero (default), this widget will use the |
| Fl::scrollbar_size() value as the scrollbar's width. |
| |
| \returns Scrollbar size in pixels, or 0 if the global Fl::scrollbar_size() is being used. |
| \see Fl::scrollbar_size(int) |
| */ |
| int scrollbar_size() const { |
| return(scrollbar_size_); |
| } |
| /** |
| Sets the pixel size of the scrollbars' troughs to the \p size, in pixels. |
| |
| Normally you should not need this method, and should use |
| Fl::scrollbar_size(int) instead to manage the size of ALL |
| your widgets' scrollbars. This ensures your application |
| has a consistent UI, is the default behavior, and is normally |
| what you want. |
| |
| Only use THIS method if you really need to override the global |
| scrollbar size. The need for this should be rare. |
| |
| Setting \p size to the special value of 0 causes the widget to |
| track the global Fl::scrollbar_size(), which is the default. |
| |
| \param[in] size Sets the scrollbar size in pixels.\n |
| If 0 (default), scrollbar size tracks the global Fl::scrollbar_size() |
| \see Fl::scrollbar_size() |
| */ |
| void scrollbar_size(int size) { |
| scrollbar_size_ = size; |
| } |
| }; |
| |
| #endif // !Fl_Help_View_H |
| |
| // |
| // End of "$Id: Fl_Help_View.H 8306 2011-01-24 17:04:22Z matt $". |
| // |