hlpfile.h 6.76 KB
Newer Older
Alexandre Julliard's avatar
Alexandre Julliard committed
1 2 3
/*
 * Help Viewer
 *
4
 * Copyright    1996 Ulrich Schmid
5
 *              2002, 2008 Eric Pouech
6
 *              2007 Kirill K. Smirnov
7 8 9 10 11 12 13 14 15 16 17 18 19
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
20
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
Alexandre Julliard's avatar
Alexandre Julliard committed
21 22 23 24
 */

struct tagHelpFile;

25 26 27 28 29 30 31 32 33
typedef struct 
{
    char        type[10];
    char        name[9];
    char        caption[51];
    POINT       origin;
    SIZE        size;
    int         style;
    DWORD       win_style;
34
    COLORREF    sr_color;       /* color for scrollable region */
35 36 37
    COLORREF    nsr_color;      /* color for non scrollable region */
} HLPFILE_WINDOWINFO;

38
typedef struct tagHlpFileLink
Alexandre Julliard's avatar
Alexandre Julliard committed
39
{
40
    enum {hlp_link_link, hlp_link_popup, hlp_link_macro} cookie;
41 42
    LPCSTR      string;         /* name of the file to for the link (NULL if same file) */
    LONG        hash;           /* topic index */
43
    unsigned    bClrChange : 1; /* true if the link is green & underlined */
44
    unsigned    bHotSpot : 1;   /* true if the link is an hotspot (actually HLPFILE_HOTSPOTLINK) */
45
    unsigned    window;         /* window number for displaying the link (-1 is current) */
46 47 48
    DWORD       cpMin;
    DWORD       cpMax;
    struct tagHlpFileLink* next;
Alexandre Julliard's avatar
Alexandre Julliard committed
49 50
} HLPFILE_LINK;

51 52 53 54 55 56 57 58 59
typedef struct tagHlpFileHotSpotLink
{
    HLPFILE_LINK link;
    unsigned    x;
    unsigned    y;
    unsigned    width;
    unsigned    height;
} HLPFILE_HOTSPOTLINK;

60 61 62 63 64 65
typedef struct tagHlpFileMacro
{
    LPCSTR                      lpszMacro;
    struct tagHlpFileMacro*     next;
} HLPFILE_MACRO;

Alexandre Julliard's avatar
Alexandre Julliard committed
66 67
typedef struct tagHlpFilePage
{
68
    LPSTR                       lpszTitle;
69
    HLPFILE_MACRO*              first_macro;
70

71 72
    HLPFILE_LINK*               first_link;

73 74
    unsigned                    wNumber;
    unsigned                    offset;
75
    DWORD                       reference;
76 77
    struct tagHlpFilePage*      next;
    struct tagHlpFilePage*      prev;
78 79 80 81

    DWORD                       browse_bwd;
    DWORD                       browse_fwd;

82
    struct tagHlpFileFile*      file;
Alexandre Julliard's avatar
Alexandre Julliard committed
83 84
} HLPFILE_PAGE;

85 86 87 88 89 90
typedef struct
{
    LONG                        lMap;
    unsigned long               offset;
} HLPFILE_MAP;

91
typedef struct
Alexandre Julliard's avatar
Alexandre Julliard committed
92
{
93 94 95 96
    LOGFONT                     LogFont;
    HFONT                       hFont;
    COLORREF                    color;
} HLPFILE_FONT;
Alexandre Julliard's avatar
Alexandre Julliard committed
97

98 99
typedef struct tagHlpFileFile
{
100 101
    BYTE*                       file_buffer;
    UINT                        file_buffer_size;
102 103
    LPSTR                       lpszPath;
    LPSTR                       lpszTitle;
Eric Pouech's avatar
Eric Pouech committed
104
    LPSTR                       lpszCopyright;
105
    HLPFILE_PAGE*               first_page;
106
    HLPFILE_PAGE*               last_page;
107
    HLPFILE_MACRO*              first_macro;
108
    BYTE*                       Context;
109 110
    BYTE*                       kwbtree;
    BYTE*                       kwdata;
111 112
    unsigned                    wMapLen;
    HLPFILE_MAP*                Map;
113 114
    unsigned                    wTOMapLen;
    unsigned*                   TOMap;
Eric Pouech's avatar
Eric Pouech committed
115 116
    unsigned long               contents_start;

117 118 119 120 121 122 123
    struct tagHlpFileFile*      prev;
    struct tagHlpFileFile*      next;

    unsigned                    wRefCount;

    unsigned short              version;
    unsigned short              flags;
124
    unsigned short              charset;
125 126 127
    unsigned short              tbsize;     /* topic block size */
    unsigned short              dsize;      /* decompress size */
    unsigned short              compressed;
128 129
    unsigned                    hasPhrases;   /* file has |Phrases */
    unsigned                    hasPhrases40; /* file has |PhrIndex/|PhrImage */
130 131 132 133 134 135 136
    UINT                        num_phrases;
    unsigned*                   phrases_offsets;
    char*                       phrases_buffer;

    BYTE**                      topic_map;
    BYTE*                       topic_end;
    UINT                        topic_maplen;
137

Eric Pouech's avatar
Eric Pouech committed
138 139 140
    unsigned                    numBmps;
    HBITMAP*                    bmps;

141 142
    unsigned                    numFonts;
    HLPFILE_FONT*               fonts;
143 144 145

    unsigned                    numWindows;
    HLPFILE_WINDOWINFO*         windows;
146
    HICON                       hIcon;
147

148 149 150
    BOOL                        has_popup_color;
    COLORREF                    popup_color;

151
    LPSTR                       help_on_file;
Alexandre Julliard's avatar
Alexandre Julliard committed
152 153
} HLPFILE;

154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
/*
 * Compare function type for HLPFILE_BPTreeSearch function.
 *
 * PARAMS
 *     p       [I] pointer to testing block (key + data)
 *     key     [I] pointer to key value to look for
 *     leaf    [I] whether this function called for index of leaf page
 *     next    [O] pointer to pointer to next block
 */
typedef int (*HLPFILE_BPTreeCompare)(void *p, const void *key,
                                     int leaf, void **next);

/*
 * Callback function type for HLPFILE_BPTreeEnum function.
 *
 * PARAMS
 *     p       [I]  pointer to data block
 *     next    [O]  pointer to pointer to next block
 *     cookie  [IO] cookie data
 */
typedef void (*HLPFILE_BPTreeCallback)(void *p, void **next, void *cookie);

176
HLPFILE*      HLPFILE_ReadHlpFile(LPCSTR lpszPath);
177 178 179
HLPFILE_PAGE* HLPFILE_PageByHash(HLPFILE* hlpfile, LONG lHash, ULONG* relative);
HLPFILE_PAGE* HLPFILE_PageByMap(HLPFILE* hlpfile, LONG lMap, ULONG* relative);
HLPFILE_PAGE* HLPFILE_PageByOffset(HLPFILE* hlpfile, LONG offset, ULONG* relative);
Alexandre Julliard's avatar
Alexandre Julliard committed
180
LONG          HLPFILE_Hash(LPCSTR lpszContext);
181
void          HLPFILE_FreeHlpFile(HLPFILE*);
182

183
void  HLPFILE_BPTreeEnum(BYTE*, HLPFILE_BPTreeCallback cb, void *cookie);
184

185 186 187 188 189 190 191
struct RtfData {
    BOOL        in_text;
    char*       data;           /* RTF stream start */
    char*       ptr;            /* current position in stream */
    unsigned    allocated;      /* overall allocated size */
    unsigned    char_pos;       /* current char position (in richedit) */
    char*       where;          /* pointer to feed back richedit */
192
    unsigned    font_scale;     /* how to scale fonts */
193 194
    HLPFILE_LINK*first_link;
    HLPFILE_LINK*current_link;
195
    BOOL        force_color;
196 197
    unsigned    relative;       /* offset within page to lookup for */
    unsigned    char_pos_rel;   /* char_pos correspondinf to relative */
198 199
};

200 201
BOOL          HLPFILE_BrowsePage(HLPFILE_PAGE*, struct RtfData* rd,
                                 unsigned font_scale, unsigned relative);