2001-08-02 23:43:49 +04:00
|
|
|
//
|
2005-02-25 00:55:12 +03:00
|
|
|
// "$Id$"
|
2001-08-02 23:43:49 +04:00
|
|
|
//
|
2001-10-29 06:44:33 +03:00
|
|
|
// Help Viewer widget definitions.
|
2001-08-02 23:43:49 +04:00
|
|
|
//
|
2009-01-01 19:11:32 +03:00
|
|
|
// Copyright 1997-2009 by Easy Software Products.
|
|
|
|
// Image support by Matthias Melcher, Copyright 2000-2009.
|
2001-08-02 23:43:49 +04:00
|
|
|
//
|
|
|
|
// 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.
|
|
|
|
//
|
2005-04-16 04:13:17 +04:00
|
|
|
// Please report all bugs and problems on the following page:
|
|
|
|
//
|
|
|
|
// http://www.fltk.org/str.php
|
2001-08-02 23:43:49 +04:00
|
|
|
//
|
|
|
|
|
2008-10-15 17:46:06 +04:00
|
|
|
/* \file
|
2008-09-16 11:26:22 +04:00
|
|
|
Fl_Help_View widget . */
|
|
|
|
|
2001-11-24 05:46:19 +03:00
|
|
|
#ifndef Fl_Help_View_H
|
|
|
|
# define Fl_Help_View_H
|
2001-08-02 23:43:49 +04:00
|
|
|
|
|
|
|
//
|
|
|
|
// Include necessary header files...
|
|
|
|
//
|
|
|
|
|
|
|
|
# include <stdio.h>
|
2001-11-24 05:46:19 +03:00
|
|
|
# include "Fl.H"
|
|
|
|
# include "Fl_Group.H"
|
|
|
|
# include "Fl_Scrollbar.H"
|
|
|
|
# include "fl_draw.H"
|
|
|
|
# include "Fl_Shared_Image.H"
|
2001-08-02 23:43:49 +04:00
|
|
|
|
|
|
|
|
|
|
|
//
|
2001-09-29 18:38:59 +04:00
|
|
|
// Fl_Help_Func type - link callback function for files...
|
2001-08-02 23:43:49 +04:00
|
|
|
//
|
|
|
|
|
|
|
|
|
2001-10-27 07:29:25 +04:00
|
|
|
typedef const char *(Fl_Help_Func)(Fl_Widget *, const char *);
|
2001-08-02 23:43:49 +04:00
|
|
|
|
|
|
|
|
|
|
|
//
|
2001-09-29 18:38:59 +04:00
|
|
|
// Fl_Help_Block structure...
|
2001-08-02 23:43:49 +04:00
|
|
|
//
|
|
|
|
|
2001-09-29 18:38:59 +04:00
|
|
|
struct Fl_Help_Block
|
2001-08-02 23:43:49 +04:00
|
|
|
{
|
|
|
|
const char *start, // Start of text
|
|
|
|
*end; // End of text
|
2001-12-19 21:15:34 +03:00
|
|
|
uchar border; // Draw border?
|
2002-03-05 14:26:41 +03:00
|
|
|
Fl_Color bgcolor; // Background color
|
2001-08-02 23:43:49 +04:00
|
|
|
int x, // Indentation/starting X coordinate
|
|
|
|
y, // Starting Y coordinate
|
|
|
|
w, // Width
|
|
|
|
h; // Height
|
|
|
|
int line[32]; // Left starting position for each line
|
|
|
|
};
|
|
|
|
|
|
|
|
//
|
2001-09-29 18:38:59 +04:00
|
|
|
// Fl_Help_Link structure...
|
2001-08-02 23:43:49 +04:00
|
|
|
//
|
2009-03-16 00:16:34 +03:00
|
|
|
/** Definition of a link for the html viewer. */
|
2001-09-29 18:38:59 +04:00
|
|
|
struct Fl_Help_Link
|
2001-08-02 23:43:49 +04:00
|
|
|
{
|
2008-09-18 23:09:34 +04:00
|
|
|
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
|
2001-08-02 23:43:49 +04:00
|
|
|
};
|
|
|
|
|
2009-01-14 20:59:49 +03:00
|
|
|
/*
|
|
|
|
* Fl_Help_View font stack opaque implementation
|
|
|
|
*/
|
|
|
|
|
2009-04-07 21:33:22 +04:00
|
|
|
/** Fl_Help_View font stack element definition. */
|
2009-01-14 20:59:49 +03:00
|
|
|
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
|
|
|
|
};
|
|
|
|
|
2009-04-07 21:33:22 +04:00
|
|
|
/** Fl_Help_View font stack definition. */
|
2009-01-14 20:59:49 +03:00
|
|
|
const size_t MAX_FL_HELP_FS_ELTS = 100;
|
|
|
|
|
|
|
|
struct Fl_Help_Font_Stack {
|
2009-04-07 21:33:22 +04:00
|
|
|
/** font stack construction, initialize attributes. */
|
2009-01-14 20:59:49 +03:00
|
|
|
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);
|
|
|
|
}
|
2009-04-07 21:33:22 +04:00
|
|
|
/** Gets the top (current) element on the stack. */
|
2009-01-14 20:59:49 +03:00
|
|
|
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) {
|
2009-04-03 11:31:51 +04:00
|
|
|
if (nfonts_ > 0) nfonts_ --;
|
2009-01-14 20:59:49 +03:00
|
|
|
top(f, s, c);
|
|
|
|
fl_font(f, s); fl_color(c);
|
|
|
|
}
|
2009-04-07 21:33:22 +04:00
|
|
|
/** 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
|
2009-01-14 20:59:49 +03:00
|
|
|
|
|
|
|
protected:
|
|
|
|
size_t nfonts_; ///< current number of fonts in stack
|
2009-03-16 00:28:50 +03:00
|
|
|
Fl_Help_Font_Style elts_[100]; ///< font elements
|
2009-01-14 20:59:49 +03:00
|
|
|
};
|
|
|
|
|
2009-03-16 00:16:34 +03:00
|
|
|
/** Fl_Help_Target structure */
|
|
|
|
|
2001-09-29 18:38:59 +04:00
|
|
|
struct Fl_Help_Target
|
2001-08-02 23:43:49 +04:00
|
|
|
{
|
2008-09-18 23:09:34 +04:00
|
|
|
char name[32]; ///< Target name
|
|
|
|
int y; ///< Y offset of target
|
2001-08-02 23:43:49 +04:00
|
|
|
};
|
|
|
|
|
2008-09-15 00:00:03 +04:00
|
|
|
/**
|
|
|
|
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.
|
|
|
|
*/
|
2009-04-07 21:33:22 +04:00
|
|
|
class FL_EXPORT Fl_Help_View : public Fl_Group // Help viewer widget
|
2001-08-02 23:43:49 +04:00
|
|
|
{
|
2008-09-18 23:09:34 +04:00
|
|
|
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
|
2009-01-14 20:59:49 +03:00
|
|
|
Fl_Help_Font_Stack fstack_; ///< font stack management
|
2008-09-18 23:09:34 +04:00
|
|
|
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_[1024]; ///< Directory for current file
|
|
|
|
char filename_[1024]; ///< Current filename
|
|
|
|
int topline_, ///< Top line in document
|
|
|
|
leftline_, ///< Lefthand position
|
|
|
|
size_, ///< Total document length
|
2009-04-03 02:02:19 +04:00
|
|
|
hsize_, ///< Maximum document width
|
|
|
|
scrollbar_size_; ///< Size for both scrollbars
|
2008-09-18 23:09:34 +04:00
|
|
|
Fl_Scrollbar scrollbar_, ///< Vertical scrollbar for document
|
|
|
|
hscrollbar_; ///< Horizontal scrollbar
|
2001-08-02 23:43:49 +04:00
|
|
|
|
2006-06-18 19:53:26 +04:00
|
|
|
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;
|
|
|
|
|
2009-01-14 20:59:49 +03:00
|
|
|
|
|
|
|
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);}
|
|
|
|
|
2001-09-29 18:38:59 +04:00
|
|
|
Fl_Help_Block *add_block(const char *s, int xx, int yy, int ww, int hh, uchar border = 0);
|
2001-08-02 23:43:49 +04:00
|
|
|
void add_link(const char *n, int xx, int yy, int ww, int hh);
|
|
|
|
void add_target(const char *n, int yy);
|
2001-09-29 18:38:59 +04:00
|
|
|
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);
|
2001-08-02 23:43:49 +04:00
|
|
|
void draw();
|
|
|
|
void format();
|
2001-09-10 07:09:43 +04:00
|
|
|
void format_table(int *table_width, int *columns, const char *table);
|
2007-12-15 19:08:23 +03:00
|
|
|
void free_data();
|
2001-08-02 23:43:49 +04:00
|
|
|
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);
|
2001-11-24 05:46:19 +03:00
|
|
|
Fl_Shared_Image *get_image(const char *name, int W, int H);
|
2001-11-24 07:12:56 +03:00
|
|
|
int get_length(const char *l);
|
2001-08-02 23:43:49 +04:00
|
|
|
int handle(int);
|
|
|
|
|
2006-06-16 23:45:13 +04:00
|
|
|
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:
|
2001-08-02 23:43:49 +04:00
|
|
|
|
2001-09-29 18:38:59 +04:00
|
|
|
Fl_Help_View(int xx, int yy, int ww, int hh, const char *l = 0);
|
|
|
|
~Fl_Help_View();
|
2009-04-07 21:33:22 +04:00
|
|
|
/** Returns the current directory for the text in the buffer. */
|
2001-08-02 23:43:49 +04:00
|
|
|
const char *directory() const { if (directory_[0]) return (directory_);
|
|
|
|
else return ((const char *)0); }
|
2009-04-07 21:33:22 +04:00
|
|
|
/** Returns the current filename for the text in the buffer. */
|
2001-08-02 23:43:49 +04:00
|
|
|
const char *filename() const { if (filename_[0]) return (filename_);
|
|
|
|
else return ((const char *)0); }
|
2003-05-21 20:12:14 +04:00
|
|
|
int find(const char *s, int p = 0);
|
2008-09-15 00:00:03 +04:00
|
|
|
/**
|
|
|
|
This method assigns a callback function to use when a link is
|
2009-03-16 00:28:50 +03:00
|
|
|
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:
|
2008-09-15 00:00:03 +04:00
|
|
|
|
2008-09-15 23:21:20 +04:00
|
|
|
\code
|
2008-09-15 00:00:03 +04:00
|
|
|
const char *fn(Fl_Widget *w, const char *uri);
|
2008-09-15 23:21:20 +04:00
|
|
|
\endcode
|
2008-09-15 00:00:03 +04:00
|
|
|
|
2009-03-16 00:28:50 +03:00
|
|
|
The link function can be used to retrieve remote or virtual
|
2008-09-15 00:00:03 +04:00
|
|
|
documents, returning a temporary file that contains the actual
|
|
|
|
data. If the link function returns NULL, the value of
|
2009-03-16 00:28:50 +03:00
|
|
|
the Fl_Help_View widget will remain unchanged.
|
2008-09-15 00:00:03 +04:00
|
|
|
|
2009-03-16 00:28:50 +03:00
|
|
|
If the link callback cannot handle the URI scheme, it should
|
2008-09-15 00:00:03 +04:00
|
|
|
return the uri value unchanged or set the value() of the widget
|
|
|
|
before returning NULL.
|
|
|
|
*/
|
2001-09-29 18:38:59 +04:00
|
|
|
void link(Fl_Help_Func *fn) { link_ = fn; }
|
2001-08-02 23:43:49 +04:00
|
|
|
int load(const char *f);
|
|
|
|
void resize(int,int,int,int);
|
2009-04-07 21:33:22 +04:00
|
|
|
/** Gets the size of the help view. */
|
2001-08-02 23:43:49 +04:00
|
|
|
int size() const { return (size_); }
|
2003-06-15 08:47:28 +04:00
|
|
|
void size(int W, int H) { Fl_Widget::size(W, H); }
|
2008-09-15 00:00:03 +04:00
|
|
|
/** Sets the default text color. */
|
2001-08-02 23:43:49 +04:00
|
|
|
void textcolor(Fl_Color c) { if (textcolor_ == defcolor_) textcolor_ = c; defcolor_ = c; }
|
2009-03-16 00:28:50 +03:00
|
|
|
/** Returns the current default text color. */
|
2001-08-02 23:43:49 +04:00
|
|
|
Fl_Color textcolor() const { return (defcolor_); }
|
2008-09-15 00:00:03 +04:00
|
|
|
/** Sets the default text font. */
|
2008-04-23 23:09:28 +04:00
|
|
|
void textfont(Fl_Font f) { textfont_ = f; format(); }
|
2008-09-15 00:00:03 +04:00
|
|
|
/** Returns the current default text font. */
|
2008-04-23 23:09:28 +04:00
|
|
|
Fl_Font textfont() const { return (textfont_); }
|
2008-09-15 00:00:03 +04:00
|
|
|
/** Sets the default text size. */
|
2008-08-16 01:11:21 +04:00
|
|
|
void textsize(Fl_Fontsize s) { textsize_ = s; format(); }
|
2008-09-15 00:00:03 +04:00
|
|
|
/** Gets the default text size. */
|
2008-08-16 01:11:21 +04:00
|
|
|
Fl_Fontsize textsize() const { return (textsize_); }
|
2008-09-15 00:00:03 +04:00
|
|
|
/** Returns the current document title, or NULL if there is no title. */
|
2001-08-02 23:43:49 +04:00
|
|
|
const char *title() { return (title_); }
|
|
|
|
void topline(const char *n);
|
|
|
|
void topline(int);
|
2009-04-07 21:33:22 +04:00
|
|
|
/** Returns the current top line in pixels. */
|
2001-08-02 23:43:49 +04:00
|
|
|
int topline() const { return (topline_); }
|
2001-11-24 07:12:56 +03:00
|
|
|
void leftline(int);
|
2009-04-07 21:33:22 +04:00
|
|
|
/** Gets the left position in pixels. */
|
2001-11-24 07:12:56 +03:00
|
|
|
int leftline() const { return (leftline_); }
|
2009-04-07 21:33:22 +04:00
|
|
|
void value(const char *val);
|
2008-09-15 00:00:03 +04:00
|
|
|
/** Returns the current buffer contents. */
|
2001-08-02 23:43:49 +04:00
|
|
|
const char *value() const { return (value_); }
|
2006-06-16 23:45:13 +04:00
|
|
|
void clear_selection();
|
|
|
|
void select_all();
|
2009-04-03 02:02:19 +04:00
|
|
|
/**
|
|
|
|
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.
|
|
|
|
|
2009-04-07 21:33:22 +04:00
|
|
|
\returns Scrollbar size in pixels, or 0 if the global Fl::scrollbar_size() is being used.
|
2009-04-03 02:02:19 +04:00
|
|
|
\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;
|
|
|
|
}
|
2001-08-02 23:43:49 +04:00
|
|
|
};
|
|
|
|
|
2001-11-24 05:46:19 +03:00
|
|
|
#endif // !Fl_Help_View_H
|
2001-08-02 23:43:49 +04:00
|
|
|
|
|
|
|
//
|
2005-02-25 00:55:12 +03:00
|
|
|
// End of "$Id$".
|
2001-08-02 23:43:49 +04:00
|
|
|
//
|