Commit 75792878 authored by Eric Pouech's avatar Eric Pouech Committed by Alexandre Julliard

Bring winhelp back to life, with mainly support for Win95 help files.

parent 21ec1d2a
/* /*
* Help Viewer * Help Viewer
* *
* Copyright 1996 Ulrich Schmid * Copyright 1996 Ulrich Schmid
* 2002 Eric Pouech
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
...@@ -22,74 +23,89 @@ struct tagHelpFile; ...@@ -22,74 +23,89 @@ struct tagHelpFile;
typedef struct typedef struct
{ {
LPCSTR lpszPath; LPCSTR lpszPath;
LONG lHash; LONG lHash;
BOOL bPopup; BOOL bPopup;
HGLOBAL hSelf;
} HLPFILE_LINK; } HLPFILE_LINK;
enum para_type {para_normal_text, para_debug_text, para_image};
typedef struct tagHlpFileParagraph typedef struct tagHlpFileParagraph
{ {
LPSTR lpszText; enum para_type cookie;
UINT bDebug; union
UINT wFont; {
UINT wIndent; struct
UINT wHSpace; {
UINT wVSpace; LPSTR lpszText;
unsigned wFont;
HLPFILE_LINK *link; unsigned wIndent;
unsigned wHSpace;
struct tagHlpFileParagraph *next; unsigned wVSpace;
} text;
HGLOBAL hSelf; struct
{
HBITMAP hBitmap;
unsigned pos; /* 0: center, 1: left, 2: right */
} image;
} u;
HLPFILE_LINK* link;
struct tagHlpFileParagraph* next;
} HLPFILE_PARAGRAPH; } HLPFILE_PARAGRAPH;
typedef struct tagHlpFilePage typedef struct tagHlpFilePage
{ {
LPSTR lpszTitle; LPSTR lpszTitle;
HLPFILE_PARAGRAPH *first_paragraph; HLPFILE_PARAGRAPH* first_paragraph;
UINT wNumber; unsigned wNumber;
unsigned offset;
struct tagHlpFilePage *next; struct tagHlpFilePage* next;
struct tagHlpFileFile *file; struct tagHlpFilePage* prev;
struct tagHlpFileFile* file;
HGLOBAL hSelf;
} HLPFILE_PAGE; } HLPFILE_PAGE;
typedef struct typedef struct
{ {
LONG lHash; LONG lHash;
UINT wPage; unsigned long offset;
} HLPFILE_CONTEXT; } HLPFILE_CONTEXT;
typedef struct tagHlpFileMacro typedef struct tagHlpFileMacro
{ {
LPCSTR lpszMacro; LPCSTR lpszMacro;
struct tagHlpFileMacro* next;
HGLOBAL hSelf;
struct tagHlpFileMacro *next;
} HLPFILE_MACRO; } HLPFILE_MACRO;
typedef struct tagHlpFileFile typedef struct
{ {
LPSTR lpszPath; LOGFONT LogFont;
LPSTR lpszTitle; HFONT hFont;
HLPFILE_PAGE *first_page; COLORREF color;
HLPFILE_MACRO *first_macro; } HLPFILE_FONT;
UINT wContextLen;
HLPFILE_CONTEXT *Context;
struct tagHlpFileFile *prev;
struct tagHlpFileFile *next;
UINT wRefCount; typedef struct tagHlpFileFile
{
HGLOBAL hTitle; LPSTR lpszPath;
HGLOBAL hContext; LPSTR lpszTitle;
HGLOBAL hSelf; HLPFILE_PAGE* first_page;
HLPFILE_MACRO* first_macro;
unsigned wContextLen;
HLPFILE_CONTEXT* Context;
struct tagHlpFileFile* prev;
struct tagHlpFileFile* next;
unsigned wRefCount;
unsigned short version;
unsigned short flags;
unsigned hasPhrases; /* Phrases or PhrIndex/PhrImage */
unsigned numFonts;
HLPFILE_FONT* fonts;
} HLPFILE; } HLPFILE;
HLPFILE *HLPFILE_ReadHlpFile(LPCSTR lpszPath); HLPFILE *HLPFILE_ReadHlpFile(LPCSTR lpszPath);
...@@ -98,7 +114,3 @@ HLPFILE_PAGE *HLPFILE_PageByHash(LPCSTR lpszPath, LONG wNum); ...@@ -98,7 +114,3 @@ HLPFILE_PAGE *HLPFILE_PageByHash(LPCSTR lpszPath, LONG wNum);
LONG HLPFILE_Hash(LPCSTR lpszContext); LONG HLPFILE_Hash(LPCSTR lpszContext);
VOID HLPFILE_FreeHlpFilePage(HLPFILE_PAGE*); VOID HLPFILE_FreeHlpFilePage(HLPFILE_PAGE*);
VOID HLPFILE_FreeHlpFile(HLPFILE*); VOID HLPFILE_FreeHlpFile(HLPFILE*);
/* Local Variables: */
/* c-file-style: "GNU" */
/* End: */
...@@ -97,83 +97,83 @@ macrosep: ';' | ...@@ -97,83 +97,83 @@ macrosep: ';' |
':' ; ':' ;
macro: /* Empty */ | macro: /* Empty */ |
IF_THEN '(' bool_macro ',' {if (! $3) skip++;} IF_THEN '(' bool_macro ',' {if (!$3) skip++;}
macrostring ')' {if (! $3) skip--;} | macrostring ')' {if (!$3) skip--;} |
IF_THEN_ELSE '(' bool_macro ',' {if (! $3) skip++;} IF_THEN_ELSE '(' bool_macro ',' {if (!$3) skip++;}
macrostring ',' {if (! $3) skip--; else skip++;} macrostring ',' {if (!$3) skip--; else skip++;}
macrostring ')' {if ( $3) skip--;} | macrostring ')' {if ( $3) skip--;} |
VOID_FUNCTION_VOID VOID_FUNCTION_VOID
'(' ')' '(' ')'
{if (! skip) (*$1)();} | {if (!skip) (*$1)();} |
VOID_FUNCTION_STRING VOID_FUNCTION_STRING
'(' tSTRING ')' '(' tSTRING ')'
{if (! skip) (*$1)($3);} | {if (!skip) (*$1)($3);} |
VOID_FUNCTION_2STRING VOID_FUNCTION_2STRING
'(' tSTRING ',' tSTRING ')' '(' tSTRING ',' tSTRING ')'
{if (! skip) (*$1)($3, $5);} | {if (!skip) (*$1)($3, $5);} |
VOID_FUNCTION_2STRING_UINT VOID_FUNCTION_2STRING_UINT
'(' tSTRING ',' tSTRING ',' INTEGER ')' '(' tSTRING ',' tSTRING ',' INTEGER ')'
{if (! skip) (*$1)($3, $5, $7);} | {if (!skip) (*$1)($3, $5, $7);} |
VOID_FUNCTION_2STRING_UINT_STRING VOID_FUNCTION_2STRING_UINT_STRING
'(' tSTRING ',' tSTRING ',' INTEGER ',' tSTRING ')' '(' tSTRING ',' tSTRING ',' INTEGER ',' tSTRING ')'
{if (! skip) (*$1)($3, $5, $7, $9);} | {if (!skip) (*$1)($3, $5, $7, $9);} |
VOID_FUNCTION_2STRING_2UINT_2STRING VOID_FUNCTION_2STRING_2UINT_2STRING
'(' tSTRING ',' tSTRING ',' INTEGER ',' INTEGER ',' tSTRING ',' tSTRING ')' '(' tSTRING ',' tSTRING ',' INTEGER ',' INTEGER ',' tSTRING ',' tSTRING ')'
{if (! skip) (*$1)($3, $5, $7, $9, $11, $13);} | {if (!skip) (*$1)($3, $5, $7, $9, $11, $13);} |
VOID_FUNCTION_2STRING_WPARAM_LPARAM_STRING VOID_FUNCTION_2STRING_WPARAM_LPARAM_STRING
'(' tSTRING ',' tSTRING ',' INTEGER ',' INTEGER ',' tSTRING ')' '(' tSTRING ',' tSTRING ',' INTEGER ',' INTEGER ',' tSTRING ')'
{if (! skip) (*$1)($3, $5, $7, $9, $11);} | {if (!skip) (*$1)($3, $5, $7, $9, $11);} |
VOID_FUNCTION_3STRING VOID_FUNCTION_3STRING
'(' tSTRING ',' tSTRING ',' tSTRING ')' '(' tSTRING ',' tSTRING ',' tSTRING ')'
{if (! skip) (*$1)($3, $5, $7);} | {if (!skip) (*$1)($3, $5, $7);} |
VOID_FUNCTION_3STRING_2UINT VOID_FUNCTION_3STRING_2UINT
'(' tSTRING ',' tSTRING ',' tSTRING ',' INTEGER ',' INTEGER ')' '(' tSTRING ',' tSTRING ',' tSTRING ',' INTEGER ',' INTEGER ')'
{if (! skip) (*$1)($3, $5, $7, $9, $11);} | {if (!skip) (*$1)($3, $5, $7, $9, $11);} |
VOID_FUNCTION_4STRING VOID_FUNCTION_4STRING
'(' tSTRING ',' tSTRING ',' tSTRING ',' tSTRING ')' '(' tSTRING ',' tSTRING ',' tSTRING ',' tSTRING ')'
{if (! skip) (*$1)($3, $5, $7, $9);} | {if (!skip) (*$1)($3, $5, $7, $9);} |
VOID_FUNCTION_4STRING_UINT VOID_FUNCTION_4STRING_UINT
'(' tSTRING ',' tSTRING ',' tSTRING ',' tSTRING ',' INTEGER')' '(' tSTRING ',' tSTRING ',' tSTRING ',' tSTRING ',' INTEGER')'
{if (! skip) (*$1)($3, $5, $7, $9, $11);} | {if (!skip) (*$1)($3, $5, $7, $9, $11);} |
VOID_FUNCTION_4STRING_2UINT VOID_FUNCTION_4STRING_2UINT
'(' tSTRING ',' tSTRING ',' tSTRING ',' tSTRING ',' INTEGER ',' INTEGER')' '(' tSTRING ',' tSTRING ',' tSTRING ',' tSTRING ',' INTEGER ',' INTEGER')'
{if (! skip) (*$1)($3, $5, $7, $9, $11, $13);} | {if (!skip) (*$1)($3, $5, $7, $9, $11, $13);} |
VOID_FUNCTION_STRING_UINT VOID_FUNCTION_STRING_UINT
'(' tSTRING ',' INTEGER ')' '(' tSTRING ',' INTEGER ')'
{if (! skip) (*$1)($3, $5);} | {if (!skip) (*$1)($3, $5);} |
VOID_FUNCTION_STRING_UINT_STRING VOID_FUNCTION_STRING_UINT_STRING
'(' tSTRING ',' INTEGER ',' tSTRING ')' '(' tSTRING ',' INTEGER ',' tSTRING ')'
{if (! skip) (*$1)($3, $5, $7);} | {if (!skip) (*$1)($3, $5, $7);} |
VOID_FUNCTION_STRING_UINT_2STRING VOID_FUNCTION_STRING_UINT_2STRING
'(' tSTRING ',' INTEGER ',' tSTRING ',' tSTRING ')' '(' tSTRING ',' INTEGER ',' tSTRING ',' tSTRING ')'
{if (! skip) (*$1)($3, $5, $7, $9);} | {if (!skip) (*$1)($3, $5, $7, $9);} |
VOID_FUNCTION_STRING_WPARAM_LPARAM VOID_FUNCTION_STRING_WPARAM_LPARAM
'(' tSTRING ',' INTEGER ',' INTEGER ')' '(' tSTRING ',' INTEGER ',' INTEGER ')'
{if (! skip) (*$1)($3, $5, $7);} | {if (!skip) (*$1)($3, $5, $7);} |
VOID_FUNCTION_UINT VOID_FUNCTION_UINT
'(' INTEGER ')' '(' INTEGER ')'
{if (! skip) (*$1)($3);} | {if (!skip) (*$1)($3);} |
VOID_FUNCTION_2UINT VOID_FUNCTION_2UINT
'(' INTEGER ',' INTEGER ')' '(' INTEGER ',' INTEGER ')'
{if (! skip) (*$1)($3, $5);} | {if (!skip) (*$1)($3, $5);} |
VOID_FUNCTION_2UINT_STRING VOID_FUNCTION_2UINT_STRING
'(' INTEGER ',' INTEGER ',' tSTRING ')' '(' INTEGER ',' INTEGER ',' tSTRING ')'
{if (! skip) (*$1)($3, $5, $7);} | {if (!skip) (*$1)($3, $5, $7);} |
VOID_FUNCTION_3UINT VOID_FUNCTION_3UINT
'(' INTEGER ',' INTEGER ',' INTEGER ')' '(' INTEGER ',' INTEGER ',' INTEGER ')'
{if (! skip) (*$1)($3, $5, $7);} | {if (!skip) (*$1)($3, $5, $7);} |
VOID_FUNCTION_2INT_3UINT_STRING VOID_FUNCTION_2INT_3UINT_STRING
'(' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ',' tSTRING ')' '(' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ',' tSTRING ')'
{if (! skip) (*$1)($3, $5, $7, $9, $11, $13);} | {if (!skip) (*$1)($3, $5, $7, $9, $11, $13);} |
VOID_FUNCTION_FILE_WIN VOID_FUNCTION_FILE_WIN
'(' file_win ')' '(' file_win ')'
{if (! skip) (*$1)(filename, windowname);} | {if (!skip) (*$1)(filename, windowname);} |
VOID_FUNCTION_FILE_WIN_STRING VOID_FUNCTION_FILE_WIN_STRING
'(' file_win ',' tSTRING ')' '(' file_win ',' tSTRING ')'
{if (! skip) (*$1)(filename, windowname, $5);} | {if (!skip) (*$1)(filename, windowname, $5);} |
VOID_FUNCTION_FILE_WIN_UINT VOID_FUNCTION_FILE_WIN_UINT
'(' file_win ',' INTEGER ')' '(' file_win ',' INTEGER ')'
{if (! skip) (*$1)(filename, windowname, $5);} ; {if (!skip) (*$1)(filename, windowname, $5);} ;
file_win: tSTRING file_win: tSTRING
{ {
......
/* /*
* Help Viewer * Help Viewer
* *
* Copyright 1996 Ulrich Schmid * Copyright 1996 Ulrich Schmid
* Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr>
* 2002 Eric Pouech
*
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either * License as published by the Free Software Foundation; either
...@@ -19,16 +20,16 @@ ...@@ -19,16 +20,16 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#define MAX_LANGUAGE_NUMBER 255 #define MAX_LANGUAGE_NUMBER 255
#define MAX_PATHNAME_LEN 1024 #define MAX_PATHNAME_LEN 1024
#define MAX_STRING_LEN 255 #define MAX_STRING_LEN 255
#define INTERNAL_BORDER_WIDTH 5 #define INTERNAL_BORDER_WIDTH 5
#define POPUP_YDISTANCE 20 #define POPUP_YDISTANCE 20
#define SHADOW_DX 20 #define SHADOW_DX 10
#define SHADOW_DY 20 #define SHADOW_DY 10
#define BUTTON_CX 6 #define BUTTON_CX 6
#define BUTTON_CY 6 #define BUTTON_CY 6
#ifndef RC_INVOKED #ifndef RC_INVOKED
...@@ -38,82 +39,92 @@ ...@@ -38,82 +39,92 @@
typedef struct tagHelpLinePart typedef struct tagHelpLinePart
{ {
RECT rect; RECT rect;
LPCSTR lpsText; enum {hlp_line_part_text, hlp_line_part_image} cookie;
UINT wTextLen; union
HFONT hFont; {
COLORREF color; struct
{
struct LPCSTR lpsText;
{ HFONT hFont;
LPCSTR lpszPath; COLORREF color;
LONG lHash; WORD wTextLen;
BOOL bPopup; WORD wUnderline; /* 0 None, 1 simple, 2 double, 3 dotted */
} link; } text;
struct
HGLOBAL hSelf; {
struct tagHelpLinePart *next; HBITMAP hBitmap;
} image;
} u;
struct
{
LPCSTR lpszPath;
LONG lHash;
BOOL bPopup;
} link;
struct tagHelpLinePart *next;
} WINHELP_LINE_PART; } WINHELP_LINE_PART;
typedef struct tagHelpLine typedef struct tagHelpLine
{ {
RECT rect; RECT rect;
WINHELP_LINE_PART first_part; WINHELP_LINE_PART first_part;
struct tagHelpLine *next; struct tagHelpLine* next;
} WINHELP_LINE; } WINHELP_LINE;
typedef struct tagHelpButton typedef struct tagHelpButton
{ {
HWND hWnd; HWND hWnd;
LPCSTR lpszID; LPCSTR lpszID;
LPCSTR lpszName; LPCSTR lpszName;
LPCSTR lpszMacro; LPCSTR lpszMacro;
WPARAM wParam; WPARAM wParam;
RECT rect; RECT rect;
HGLOBAL hSelf; struct tagHelpButton*next;
struct tagHelpButton *next;
} WINHELP_BUTTON; } WINHELP_BUTTON;
typedef struct tagWinHelp typedef struct tagWinHelp
{ {
LPCSTR lpszName; LPCSTR lpszName;
WINHELP_BUTTON *first_button; WINHELP_BUTTON* first_button;
HLPFILE_PAGE *page; HLPFILE_PAGE* page;
WINHELP_LINE *first_line; WINHELP_LINE* first_line;
HWND hMainWnd; HWND hMainWnd;
HWND hButtonBoxWnd; HWND hButtonBoxWnd;
HWND hTextWnd; HWND hTextWnd;
HWND hShadowWnd; HWND hShadowWnd;
HFONT (*fonts)[2]; HFONT* fonts;
UINT fonts_len; UINT fonts_len;
HCURSOR hArrowCur; HCURSOR hArrowCur;
HCURSOR hHandCur; HCURSOR hHandCur;
HGLOBAL hSelf; struct tagWinHelp* next;
struct tagWinHelp *next;
} WINHELP_WINDOW; } WINHELP_WINDOW;
typedef struct typedef struct
{ {
UINT wVersion; UINT wVersion;
HANDLE hInstance; HANDLE hInstance;
HWND hPopupWnd; HWND hPopupWnd;
UINT wStringTableOffset; UINT wStringTableOffset;
WINHELP_WINDOW *active_win; WINHELP_WINDOW* active_win;
WINHELP_WINDOW *win_list; WINHELP_WINDOW* win_list;
} WINHELP_GLOBALS; } WINHELP_GLOBALS;
extern WINHELP_GLOBALS Globals; extern WINHELP_GLOBALS Globals;
VOID WINHELP_CreateHelpWindow(LPCSTR, LONG, LPCSTR, BOOL, HWND, LPPOINT, INT); BOOL WINHELP_CreateHelpWindowByHash(LPCSTR, LONG, LPCSTR, BOOL, HWND, LPPOINT, INT);
BOOL WINHELP_CreateHelpWindowByPage(HLPFILE_PAGE*, LPCSTR, BOOL, HWND, LPPOINT, INT);
INT WINHELP_MessageBoxIDS(UINT, UINT, WORD); INT WINHELP_MessageBoxIDS(UINT, UINT, WORD);
INT WINHELP_MessageBoxIDS_s(UINT, LPCSTR, UINT, WORD); INT WINHELP_MessageBoxIDS_s(UINT, LPCSTR, UINT, WORD);
...@@ -128,7 +139,3 @@ extern CHAR STRING_DIALOG_TEST[]; ...@@ -128,7 +139,3 @@ extern CHAR STRING_DIALOG_TEST[];
/* Buttons */ /* Buttons */
#define WH_FIRST_BUTTON 500 #define WH_FIRST_BUTTON 500
/* Local Variables: */
/* c-file-style: "GNU" */
/* End: */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment