Added support for window information from the .hlp file.
Added support for window numbers in link.
This commit is contained in:
parent
5d0b987151
commit
7d75cfed76
|
@ -227,6 +227,9 @@ HLPFILE *HLPFILE_ReadHlpFile(LPCSTR lpszPath)
|
||||||
hlpfile->numFonts = 0;
|
hlpfile->numFonts = 0;
|
||||||
hlpfile->fonts = NULL;
|
hlpfile->fonts = NULL;
|
||||||
|
|
||||||
|
hlpfile->numWindows = 0;
|
||||||
|
hlpfile->windows = NULL;
|
||||||
|
|
||||||
strcpy(hlpfile->lpszPath, lpszPath);
|
strcpy(hlpfile->lpszPath, lpszPath);
|
||||||
|
|
||||||
first_hlpfile = hlpfile;
|
first_hlpfile = hlpfile;
|
||||||
|
@ -800,21 +803,20 @@ static BOOL HLPFILE_AddParagraph(HLPFILE *hlpfile, BYTE *buf, BYTE *end, unsigne
|
||||||
strcpy((char*)paragraph->link->lpszString, attributes.link.lpszString);
|
strcpy((char*)paragraph->link->lpszString, attributes.link.lpszString);
|
||||||
paragraph->link->lHash = attributes.link.lHash;
|
paragraph->link->lHash = attributes.link.lHash;
|
||||||
paragraph->link->bClrChange = attributes.link.bClrChange;
|
paragraph->link->bClrChange = attributes.link.bClrChange;
|
||||||
|
paragraph->link->window = attributes.link.window;
|
||||||
|
|
||||||
WINE_TRACE("Link[%d] to %s@%08lx\n",
|
WINE_TRACE("Link[%d] to %s@%08lx:%d\n",
|
||||||
paragraph->link->cookie, paragraph->link->lpszString, paragraph->link->lHash);
|
paragraph->link->cookie, paragraph->link->lpszString,
|
||||||
|
paragraph->link->lHash, paragraph->link->window);
|
||||||
}
|
}
|
||||||
#if 0
|
|
||||||
memset(&attributes, 0, sizeof(attributes));
|
|
||||||
#else
|
|
||||||
attributes.hBitmap = 0;
|
attributes.hBitmap = 0;
|
||||||
attributes.link.lpszString = NULL;
|
attributes.link.lpszString = NULL;
|
||||||
attributes.link.bClrChange = FALSE;
|
attributes.link.bClrChange = FALSE;
|
||||||
attributes.link.lHash = 0;
|
attributes.link.lHash = 0;
|
||||||
|
attributes.link.window = -1;
|
||||||
attributes.wVSpace = 0;
|
attributes.wVSpace = 0;
|
||||||
attributes.wHSpace = 0;
|
attributes.wHSpace = 0;
|
||||||
attributes.wIndent = 0;
|
attributes.wIndent = 0;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
/* else: null text, keep on storing attributes */
|
/* else: null text, keep on storing attributes */
|
||||||
text += textsize;
|
text += textsize;
|
||||||
|
@ -969,7 +971,7 @@ static BOOL HLPFILE_AddParagraph(HLPFILE *hlpfile, BYTE *buf, BYTE *end, unsigne
|
||||||
attributes.link.bClrChange = !(*format & 1);
|
attributes.link.bClrChange = !(*format & 1);
|
||||||
|
|
||||||
if (type == 1)
|
if (type == 1)
|
||||||
{WINE_FIXME("Unsupported wnd number %d for link\n", *ptr); ptr++;}
|
attributes.link.window = *ptr++;
|
||||||
if (type == 4 || type == 6)
|
if (type == 4 || type == 6)
|
||||||
{
|
{
|
||||||
attributes.link.lpszString = ptr;
|
attributes.link.lpszString = ptr;
|
||||||
|
@ -978,7 +980,20 @@ static BOOL HLPFILE_AddParagraph(HLPFILE *hlpfile, BYTE *buf, BYTE *end, unsigne
|
||||||
else
|
else
|
||||||
attributes.link.lpszString = hlpfile->lpszPath;
|
attributes.link.lpszString = hlpfile->lpszPath;
|
||||||
if (type == 6)
|
if (type == 6)
|
||||||
WINE_FIXME("Unsupported wnd name '%s' for link\n", ptr);
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < hlpfile->numWindows; i++)
|
||||||
|
{
|
||||||
|
if (!strcmp(ptr, hlpfile->windows[i].name))
|
||||||
|
{
|
||||||
|
attributes.link.window = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (attributes.link.window == -1)
|
||||||
|
WINE_WARN("Couldn't find window info for %s\n", ptr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
format += 3 + GET_USHORT(format, 1);
|
format += 3 + GET_USHORT(format, 1);
|
||||||
break;
|
break;
|
||||||
|
@ -1257,10 +1272,35 @@ static BOOL HLPFILE_SystemCommands(HLPFILE* hlpfile)
|
||||||
|
|
||||||
case 6:
|
case 6:
|
||||||
if (GET_USHORT(ptr, 2) != 90) {WINE_WARN("system6\n");break;}
|
if (GET_USHORT(ptr, 2) != 90) {WINE_WARN("system6\n");break;}
|
||||||
WINE_FIXME("System-Window: flags=%4x type=%s name=%s caption=%s (%d,%d)x(%d,%d)\n",
|
hlpfile->windows = HeapReAlloc(GetProcessHeap(), 0, hlpfile->windows,
|
||||||
GET_USHORT(ptr, 4), ptr + 6, ptr + 16, ptr + 25,
|
sizeof(HLPFILE_WINDOWINFO) * ++hlpfile->numWindows);
|
||||||
GET_SHORT(ptr, 76), GET_USHORT(ptr, 78),
|
if (hlpfile->windows)
|
||||||
GET_SHORT(ptr, 80), GET_USHORT(ptr, 82));
|
{
|
||||||
|
unsigned flags = GET_USHORT(ptr, 4);
|
||||||
|
HLPFILE_WINDOWINFO* wi = &hlpfile->windows[hlpfile->numWindows - 1];
|
||||||
|
|
||||||
|
if (flags & 0x0001) strcpy(wi->type, ptr + 6); else wi->type[0] = '\0';
|
||||||
|
if (flags & 0x0002) strcpy(wi->name, ptr + 16); else wi->name[0] = '\0';
|
||||||
|
if (flags & 0x0004) strcpy(wi->caption, ptr + 25); else strncpy(wi->caption, hlpfile->lpszTitle, sizeof(wi->caption));
|
||||||
|
wi->origin.x = (flags & 0x0008) ? GET_USHORT(ptr, 76) : CW_USEDEFAULT;
|
||||||
|
wi->origin.y = (flags & 0x0010) ? GET_USHORT(ptr, 78) : CW_USEDEFAULT;
|
||||||
|
wi->size.cx = (flags & 0x0020) ? GET_USHORT(ptr, 80) : CW_USEDEFAULT;
|
||||||
|
wi->size.cy = (flags & 0x0040) ? GET_USHORT(ptr, 82) : CW_USEDEFAULT;
|
||||||
|
wi->style = (flags & 0x0080) ? GET_USHORT(ptr, 84) : SW_SHOW;
|
||||||
|
wi->sr_color = (flags & 0x0100) ? GET_UINT(ptr, 86) : 0xFFFFFF;
|
||||||
|
wi->nsr_color = (flags & 0x0200) ? GET_UINT(ptr, 90) : 0xFFFFFF;
|
||||||
|
WINE_FIXME("System-Window: flags=%c%c%c%c%c%c%c%c type=%s name=%s caption=%s (%ld,%ld)x(%ld,%ld)\n",
|
||||||
|
flags & 0x0001 ? 'T' : 't',
|
||||||
|
flags & 0x0002 ? 'N' : 'n',
|
||||||
|
flags & 0x0004 ? 'C' : 'c',
|
||||||
|
flags & 0x0008 ? 'X' : 'x',
|
||||||
|
flags & 0x0010 ? 'Y' : 'y',
|
||||||
|
flags & 0x0020 ? 'W' : 'w',
|
||||||
|
flags & 0x0040 ? 'H' : 'h',
|
||||||
|
flags & 0x0080 ? 'S' : 's',
|
||||||
|
wi->type, wi->name, wi->caption, wi->origin.x, wi->origin.y,
|
||||||
|
wi->size.cx, wi->size.cy);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
WINE_WARN("Unsupported SystemRecord[%d]\n", GET_USHORT(ptr, 0));
|
WINE_WARN("Unsupported SystemRecord[%d]\n", GET_USHORT(ptr, 0));
|
||||||
|
@ -1790,6 +1830,7 @@ void HLPFILE_FreeHlpFile(HLPFILE* hlpfile)
|
||||||
HLPFILE_DeletePage(hlpfile->first_page);
|
HLPFILE_DeletePage(hlpfile->first_page);
|
||||||
HLPFILE_DeleteMacro(hlpfile->first_macro);
|
HLPFILE_DeleteMacro(hlpfile->first_macro);
|
||||||
|
|
||||||
|
if (hlpfile->numWindows) HeapFree(GetProcessHeap(), 0, hlpfile->windows);
|
||||||
if (hlpfile->Context) HeapFree(GetProcessHeap(), 0, hlpfile->Context);
|
if (hlpfile->Context) HeapFree(GetProcessHeap(), 0, hlpfile->Context);
|
||||||
if (hlpfile->lpszTitle) HeapFree(GetProcessHeap(), 0, hlpfile->lpszTitle);
|
if (hlpfile->lpszTitle) HeapFree(GetProcessHeap(), 0, hlpfile->lpszTitle);
|
||||||
if (hlpfile->lpszCopyright) HeapFree(GetProcessHeap(), 0, hlpfile->lpszCopyright);
|
if (hlpfile->lpszCopyright) HeapFree(GetProcessHeap(), 0, hlpfile->lpszCopyright);
|
||||||
|
|
|
@ -21,12 +21,26 @@
|
||||||
|
|
||||||
struct tagHelpFile;
|
struct tagHelpFile;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char type[10];
|
||||||
|
char name[9];
|
||||||
|
char caption[51];
|
||||||
|
POINT origin;
|
||||||
|
SIZE size;
|
||||||
|
int style;
|
||||||
|
DWORD win_style;
|
||||||
|
COLORREF sr_color; /* color for scrollable region */
|
||||||
|
COLORREF nsr_color; /* color for non scrollable region */
|
||||||
|
} HLPFILE_WINDOWINFO;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
enum {hlp_link_none, hlp_link_link, hlp_link_popup, hlp_link_macro} cookie;
|
enum {hlp_link_none, hlp_link_link, hlp_link_popup, hlp_link_macro} cookie;
|
||||||
LPCSTR lpszString;
|
LPCSTR lpszString;
|
||||||
LONG lHash;
|
LONG lHash;
|
||||||
BOOL bClrChange;
|
BOOL bClrChange;
|
||||||
|
unsigned window;
|
||||||
} HLPFILE_LINK;
|
} HLPFILE_LINK;
|
||||||
|
|
||||||
enum para_type {para_normal_text, para_debug_text, para_image};
|
enum para_type {para_normal_text, para_debug_text, para_image};
|
||||||
|
@ -113,6 +127,9 @@ typedef struct tagHlpFileFile
|
||||||
|
|
||||||
unsigned numFonts;
|
unsigned numFonts;
|
||||||
HLPFILE_FONT* fonts;
|
HLPFILE_FONT* fonts;
|
||||||
|
|
||||||
|
unsigned numWindows;
|
||||||
|
HLPFILE_WINDOWINFO* windows;
|
||||||
} HLPFILE;
|
} HLPFILE;
|
||||||
|
|
||||||
HLPFILE *HLPFILE_ReadHlpFile(LPCSTR lpszPath);
|
HLPFILE *HLPFILE_ReadHlpFile(LPCSTR lpszPath);
|
||||||
|
|
|
@ -535,7 +535,12 @@ void MACRO_FileOpen(void)
|
||||||
openfilename.lpTemplateName = 0;
|
openfilename.lpTemplateName = 0;
|
||||||
|
|
||||||
if (GetOpenFileName(&openfilename))
|
if (GetOpenFileName(&openfilename))
|
||||||
WINHELP_CreateHelpWindowByHash(szPath, 0, "main", FALSE, 0, NULL, SW_SHOWNORMAL);
|
{
|
||||||
|
HLPFILE* hlpfile = WINHELP_LookupHelpFile(szPath);
|
||||||
|
|
||||||
|
WINHELP_CreateHelpWindowByHash(hlpfile, 0,
|
||||||
|
WINHELP_GetWindowInfo(hlpfile, "main"), SW_SHOWNORMAL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MACRO_Find(void)
|
void MACRO_Find(void)
|
||||||
|
@ -643,8 +648,13 @@ BOOL MACRO_IsNotMark(LPCSTR str)
|
||||||
|
|
||||||
void MACRO_JumpContents(LPCSTR lpszPath, LPCSTR lpszWindow)
|
void MACRO_JumpContents(LPCSTR lpszPath, LPCSTR lpszWindow)
|
||||||
{
|
{
|
||||||
|
HLPFILE* hlpfile;
|
||||||
|
|
||||||
WINE_TRACE("(\"%s\", \"%s\")\n", lpszPath, lpszWindow);
|
WINE_TRACE("(\"%s\", \"%s\")\n", lpszPath, lpszWindow);
|
||||||
WINHELP_CreateHelpWindowByHash(lpszPath, 0, lpszWindow, FALSE, 0, NULL, SW_NORMAL);
|
hlpfile = WINHELP_LookupHelpFile(lpszPath);
|
||||||
|
WINHELP_CreateHelpWindowByHash(hlpfile, 0,
|
||||||
|
WINHELP_GetWindowInfo(hlpfile, lpszWindow),
|
||||||
|
SW_NORMAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MACRO_JumpContext(LPCSTR lpszPath, LPCSTR lpszWindow, LONG context)
|
void MACRO_JumpContext(LPCSTR lpszPath, LPCSTR lpszWindow, LONG context)
|
||||||
|
@ -654,8 +664,13 @@ void MACRO_JumpContext(LPCSTR lpszPath, LPCSTR lpszWindow, LONG context)
|
||||||
|
|
||||||
void MACRO_JumpHash(LPCSTR lpszPath, LPCSTR lpszWindow, LONG lHash)
|
void MACRO_JumpHash(LPCSTR lpszPath, LPCSTR lpszWindow, LONG lHash)
|
||||||
{
|
{
|
||||||
|
HLPFILE* hlpfile;
|
||||||
|
|
||||||
WINE_TRACE("(\"%s\", \"%s\", %lu)\n", lpszPath, lpszWindow, lHash);
|
WINE_TRACE("(\"%s\", \"%s\", %lu)\n", lpszPath, lpszWindow, lHash);
|
||||||
WINHELP_CreateHelpWindowByHash(lpszPath, lHash, lpszWindow, FALSE, 0, NULL, SW_NORMAL);
|
hlpfile = WINHELP_LookupHelpFile(lpszPath);
|
||||||
|
WINHELP_CreateHelpWindowByHash(hlpfile, lHash,
|
||||||
|
WINHELP_GetWindowInfo(hlpfile, lpszWindow),
|
||||||
|
SW_NORMAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MACRO_JumpHelpOn(void)
|
void MACRO_JumpHelpOn(void)
|
||||||
|
@ -699,9 +714,14 @@ void MACRO_MPrintID(LPCSTR str)
|
||||||
|
|
||||||
void MACRO_Next(void)
|
void MACRO_Next(void)
|
||||||
{
|
{
|
||||||
|
HLPFILE_PAGE* page;
|
||||||
|
|
||||||
WINE_TRACE("()\n");
|
WINE_TRACE("()\n");
|
||||||
if (Globals.active_win->page->next)
|
if ((page = Globals.active_win->page->next) != NULL)
|
||||||
WINHELP_CreateHelpWindowByPage(Globals.active_win->page->next, "main", FALSE, 0, NULL, SW_NORMAL);
|
{
|
||||||
|
page->file->wRefCount++;
|
||||||
|
WINHELP_CreateHelpWindow(page, Globals.active_win->info, SW_NORMAL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MACRO_NoShow(void)
|
void MACRO_NoShow(void)
|
||||||
|
@ -731,9 +751,14 @@ void MACRO_PositionWindow(LONG i1, LONG i2, LONG u1, LONG u2, LONG u3, LPCSTR st
|
||||||
|
|
||||||
void MACRO_Prev(void)
|
void MACRO_Prev(void)
|
||||||
{
|
{
|
||||||
|
HLPFILE_PAGE* page;
|
||||||
|
|
||||||
WINE_TRACE("()\n");
|
WINE_TRACE("()\n");
|
||||||
if (Globals.active_win->page->prev)
|
if ((page = Globals.active_win->page->prev) != NULL)
|
||||||
WINHELP_CreateHelpWindowByPage(Globals.active_win->page->prev, "main", FALSE, 0, NULL, SW_NORMAL);
|
{
|
||||||
|
page->file->wRefCount++;
|
||||||
|
WINHELP_CreateHelpWindow(page, Globals.active_win->info, SW_NORMAL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MACRO_Print(void)
|
void MACRO_Print(void)
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "winbase.h"
|
#include "winbase.h"
|
||||||
|
@ -47,7 +48,102 @@ static WINHELP_LINE_PART* WINHELP_IsOverLink(HWND hWnd, WPARAM wParam, LPARAM lP
|
||||||
|
|
||||||
WINHELP_GLOBALS Globals = {3, 0, 0, 0, 1, 0, 0};
|
WINHELP_GLOBALS Globals = {3, 0, 0, 0, 1, 0, 0};
|
||||||
|
|
||||||
static BOOL MacroTest = FALSE;
|
/***********************************************************************
|
||||||
|
*
|
||||||
|
* WINHELP_LookupHelpFile
|
||||||
|
*/
|
||||||
|
HLPFILE* WINHELP_LookupHelpFile(LPCSTR lpszFile)
|
||||||
|
{
|
||||||
|
HLPFILE* hlpfile;
|
||||||
|
|
||||||
|
hlpfile = HLPFILE_ReadHlpFile(lpszFile);
|
||||||
|
|
||||||
|
/* Add Suffix `.hlp' */
|
||||||
|
if (!hlpfile && lstrcmpi(lpszFile + strlen(lpszFile) - 4, ".hlp") != 0)
|
||||||
|
{
|
||||||
|
char szFile_hlp[MAX_PATHNAME_LEN];
|
||||||
|
|
||||||
|
lstrcpyn(szFile_hlp, lpszFile, sizeof(szFile_hlp) - 4);
|
||||||
|
szFile_hlp[sizeof(szFile_hlp) - 5] = '\0';
|
||||||
|
lstrcat(szFile_hlp, ".hlp");
|
||||||
|
|
||||||
|
hlpfile = HLPFILE_ReadHlpFile(szFile_hlp);
|
||||||
|
}
|
||||||
|
if (!hlpfile)
|
||||||
|
{
|
||||||
|
WINHELP_MessageBoxIDS_s(STID_HLPFILE_ERROR_s, lpszFile, STID_WHERROR, MB_OK);
|
||||||
|
if (Globals.win_list) return NULL;
|
||||||
|
}
|
||||||
|
return hlpfile;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************
|
||||||
|
* WINHELP_GetWindowInfo
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
HLPFILE_WINDOWINFO* WINHELP_GetWindowInfo(HLPFILE* hlpfile, LPCSTR name)
|
||||||
|
{
|
||||||
|
static HLPFILE_WINDOWINFO mwi;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (!name || !name[0])
|
||||||
|
name = Globals.active_win->lpszName;
|
||||||
|
|
||||||
|
for (i = 0; i < hlpfile->numWindows; i++)
|
||||||
|
if (!strcmp(hlpfile->windows[i].name, name))
|
||||||
|
return &hlpfile->windows[i];
|
||||||
|
|
||||||
|
if (strcmp(name, "main") != 0)
|
||||||
|
{
|
||||||
|
WINE_FIXME("Couldn't find window info for %s\n", name);
|
||||||
|
assert(0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (!mwi.name[0])
|
||||||
|
{
|
||||||
|
strcpy(mwi.type, "primary");
|
||||||
|
strcpy(mwi.name, "main");
|
||||||
|
LoadString(Globals.hInstance, STID_WINE_HELP,
|
||||||
|
mwi.caption, sizeof(mwi.caption));
|
||||||
|
/*strcpy(mwi.caption, hlpfile->lpszTitle); */
|
||||||
|
mwi.origin.x = mwi.origin.y = mwi.size.cx = mwi.size.cy = CW_USEDEFAULT;
|
||||||
|
mwi.style = SW_SHOW;
|
||||||
|
mwi.sr_color = mwi.sr_color = 0xFFFFFF;
|
||||||
|
}
|
||||||
|
return &mwi;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************
|
||||||
|
* HLPFILE_GetPopupWindowInfo
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
HLPFILE_WINDOWINFO* WINHELP_GetPopupWindowInfo(HLPFILE* hlpfile, HWND hParentWnd, POINT* mouse)
|
||||||
|
{
|
||||||
|
static HLPFILE_WINDOWINFO wi;
|
||||||
|
|
||||||
|
RECT parent_rect;
|
||||||
|
|
||||||
|
wi.type[0] = wi.name[0] = wi.caption[0] = '\0';
|
||||||
|
|
||||||
|
/* Calculate horizontal size and position of a popup window */
|
||||||
|
GetWindowRect(hParentWnd, &parent_rect);
|
||||||
|
wi.size.cx = (parent_rect.right - parent_rect.left) / 2;
|
||||||
|
wi.size.cy = 10; /* need a non null value, so that border are taken into account while computing */
|
||||||
|
|
||||||
|
wi.origin = *mouse;
|
||||||
|
ClientToScreen(hParentWnd, &wi.origin);
|
||||||
|
wi.origin.x -= wi.size.cx / 2;
|
||||||
|
wi.origin.x = min(wi.origin.x, GetSystemMetrics(SM_CXSCREEN) - wi.size.cx);
|
||||||
|
wi.origin.x = max(wi.origin.x, 0);
|
||||||
|
|
||||||
|
wi.style = SW_SHOW;
|
||||||
|
wi.win_style = WS_POPUPWINDOW;
|
||||||
|
wi.sr_color = wi.sr_color = 0xFFFFFF;
|
||||||
|
|
||||||
|
return &wi;
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
*
|
*
|
||||||
|
@ -57,6 +153,7 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE prev, LPSTR cmdline, int show)
|
||||||
{
|
{
|
||||||
MSG msg;
|
MSG msg;
|
||||||
LONG lHash = 0;
|
LONG lHash = 0;
|
||||||
|
HLPFILE* hlpfile;
|
||||||
|
|
||||||
Globals.hInstance = hInstance;
|
Globals.hInstance = hInstance;
|
||||||
|
|
||||||
|
@ -85,10 +182,6 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE prev, LPSTR cmdline, int show)
|
||||||
Globals.wVersion = option - '0';
|
Globals.wVersion = option - '0';
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 't':
|
|
||||||
MacroTest = TRUE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'x':
|
case 'x':
|
||||||
show = SW_HIDE;
|
show = SW_HIDE;
|
||||||
Globals.isBook = FALSE;
|
Globals.isBook = FALSE;
|
||||||
|
@ -102,7 +195,9 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE prev, LPSTR cmdline, int show)
|
||||||
|
|
||||||
/* Create primary window */
|
/* Create primary window */
|
||||||
WINHELP_RegisterWinClasses();
|
WINHELP_RegisterWinClasses();
|
||||||
WINHELP_CreateHelpWindowByHash(cmdline, lHash, "main", FALSE, NULL, NULL, show);
|
hlpfile = WINHELP_LookupHelpFile(cmdline);
|
||||||
|
WINHELP_CreateHelpWindowByHash(hlpfile, lHash,
|
||||||
|
WINHELP_GetWindowInfo(hlpfile, "main"), show);
|
||||||
|
|
||||||
/* Message loop */
|
/* Message loop */
|
||||||
while (GetMessage(&msg, 0, 0, 0))
|
while (GetMessage(&msg, 0, 0, 0))
|
||||||
|
@ -219,54 +314,25 @@ static LRESULT WINHELP_HandleCommand(HWND hSrcWnd, LPARAM lParam)
|
||||||
*
|
*
|
||||||
* WINHELP_CreateHelpWindow
|
* WINHELP_CreateHelpWindow
|
||||||
*/
|
*/
|
||||||
|
BOOL WINHELP_CreateHelpWindow(HLPFILE_PAGE* page, HLPFILE_WINDOWINFO* wi,
|
||||||
static BOOL WINHELP_CreateHelpWindow(HLPFILE_PAGE* page, LPCSTR lpszWindow,
|
int nCmdShow)
|
||||||
BOOL bPopup, HWND hParentWnd, LPPOINT mouse, INT nCmdShow)
|
|
||||||
{
|
{
|
||||||
CHAR szCaption[MAX_STRING_LEN];
|
|
||||||
SIZE size = {CW_USEDEFAULT, 0/*CW_USEDEFAULT*/};
|
|
||||||
POINT origin = {240, 0};
|
|
||||||
LPSTR ptr;
|
|
||||||
WINHELP_WINDOW *win, *oldwin;
|
WINHELP_WINDOW *win, *oldwin;
|
||||||
HLPFILE_MACRO *macro;
|
|
||||||
HWND hWnd;
|
HWND hWnd;
|
||||||
BOOL bPrimary;
|
BOOL bPrimary;
|
||||||
|
|
||||||
if (bPopup)
|
bPrimary = !lstrcmpi(wi->name, "main");
|
||||||
lpszWindow = NULL;
|
|
||||||
else if (!lpszWindow || !lpszWindow[0])
|
|
||||||
lpszWindow = Globals.active_win->lpszName;
|
|
||||||
bPrimary = lpszWindow && !lstrcmpi(lpszWindow, "main");
|
|
||||||
|
|
||||||
/* Calculate horizontal size and position of a popup window */
|
|
||||||
if (bPopup)
|
|
||||||
{
|
|
||||||
RECT parent_rect;
|
|
||||||
GetWindowRect(hParentWnd, &parent_rect);
|
|
||||||
size.cx = (parent_rect.right - parent_rect.left) / 2;
|
|
||||||
size.cy = 10; /* need a non null value, so that border are taken into account while computing */
|
|
||||||
|
|
||||||
origin = *mouse;
|
|
||||||
ClientToScreen(hParentWnd, &origin);
|
|
||||||
origin.x -= size.cx / 2;
|
|
||||||
origin.x = min(origin.x, GetSystemMetrics(SM_CXSCREEN) - size.cx);
|
|
||||||
origin.x = max(origin.x, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialize WINHELP_WINDOW struct */
|
/* Initialize WINHELP_WINDOW struct */
|
||||||
win = HeapAlloc(GetProcessHeap(), 0,
|
win = HeapAlloc(GetProcessHeap(), 0,
|
||||||
sizeof(WINHELP_WINDOW) + (lpszWindow ? strlen(lpszWindow) + 1 : 0));
|
sizeof(WINHELP_WINDOW) + strlen(wi->name) + 1);
|
||||||
if (!win) return FALSE;
|
if (!win) return FALSE;
|
||||||
|
|
||||||
win->next = Globals.win_list;
|
win->next = Globals.win_list;
|
||||||
Globals.win_list = win;
|
Globals.win_list = win;
|
||||||
if (lpszWindow)
|
|
||||||
{
|
win->lpszName = (char*)win + sizeof(WINHELP_WINDOW);
|
||||||
ptr = (char*)win + sizeof(WINHELP_WINDOW);
|
lstrcpy((char*)win->lpszName, wi->name);
|
||||||
lstrcpy(ptr, (LPSTR) lpszWindow);
|
|
||||||
win->lpszName = ptr;
|
|
||||||
}
|
|
||||||
else win->lpszName = NULL;
|
|
||||||
|
|
||||||
win->page = page;
|
win->page = page;
|
||||||
win->first_button = 0;
|
win->first_button = 0;
|
||||||
|
@ -279,11 +345,11 @@ static BOOL WINHELP_CreateHelpWindow(HLPFILE_PAGE* page, LPCSTR lpszWindow,
|
||||||
win->hArrowCur = LoadCursorA(0, IDC_ARROWA);
|
win->hArrowCur = LoadCursorA(0, IDC_ARROWA);
|
||||||
win->hHandCur = LoadCursorA(0, IDC_HANDA);
|
win->hHandCur = LoadCursorA(0, IDC_HANDA);
|
||||||
|
|
||||||
|
win->info = wi;
|
||||||
|
|
||||||
Globals.active_win = win;
|
Globals.active_win = win;
|
||||||
|
|
||||||
/* Initialize default pushbuttons */
|
/* Initialize default pushbuttons */
|
||||||
if (MacroTest && !bPopup)
|
|
||||||
MACRO_CreateButton("BTN_TEST", "&Test", "MacroTest");
|
|
||||||
if (bPrimary && page)
|
if (bPrimary && page)
|
||||||
{
|
{
|
||||||
CHAR buffer[MAX_STRING_LEN];
|
CHAR buffer[MAX_STRING_LEN];
|
||||||
|
@ -301,14 +367,19 @@ static BOOL WINHELP_CreateHelpWindow(HLPFILE_PAGE* page, LPCSTR lpszWindow,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize file specific pushbuttons */
|
/* Initialize file specific pushbuttons */
|
||||||
if (!bPopup && page)
|
if (!(wi->win_style & WS_POPUP) && page)
|
||||||
|
{
|
||||||
|
HLPFILE_MACRO *macro;
|
||||||
for (macro = page->file->first_macro; macro; macro = macro->next)
|
for (macro = page->file->first_macro; macro; macro = macro->next)
|
||||||
MACRO_ExecuteMacro(macro->lpszMacro);
|
MACRO_ExecuteMacro(macro->lpszMacro);
|
||||||
|
}
|
||||||
|
|
||||||
/* Reuse existing window */
|
/* Reuse existing window */
|
||||||
if (lpszWindow)
|
if (!(wi->win_style & WS_POPUP))
|
||||||
|
{
|
||||||
for (oldwin = win->next; oldwin; oldwin = oldwin->next)
|
for (oldwin = win->next; oldwin; oldwin = oldwin->next)
|
||||||
if (oldwin->lpszName && !lstrcmpi(oldwin->lpszName, lpszWindow))
|
{
|
||||||
|
if (!lstrcmpi(oldwin->lpszName, wi->name))
|
||||||
{
|
{
|
||||||
WINHELP_BUTTON *button;
|
WINHELP_BUTTON *button;
|
||||||
|
|
||||||
|
@ -317,9 +388,9 @@ static BOOL WINHELP_CreateHelpWindow(HLPFILE_PAGE* page, LPCSTR lpszWindow,
|
||||||
win->hTextWnd = oldwin->hTextWnd;
|
win->hTextWnd = oldwin->hTextWnd;
|
||||||
oldwin->hMainWnd = oldwin->hButtonBoxWnd = oldwin->hTextWnd = 0;
|
oldwin->hMainWnd = oldwin->hButtonBoxWnd = oldwin->hTextWnd = 0;
|
||||||
|
|
||||||
SetWindowLong(win->hMainWnd, 0, (LONG) win);
|
SetWindowLong(win->hMainWnd, 0, (LONG)win);
|
||||||
SetWindowLong(win->hButtonBoxWnd, 0, (LONG) win);
|
SetWindowLong(win->hButtonBoxWnd, 0, (LONG)win);
|
||||||
SetWindowLong(win->hTextWnd, 0, (LONG) win);
|
SetWindowLong(win->hTextWnd, 0, (LONG)win);
|
||||||
|
|
||||||
WINHELP_InitFonts(win->hMainWnd);
|
WINHELP_InitFonts(win->hMainWnd);
|
||||||
|
|
||||||
|
@ -340,13 +411,12 @@ static BOOL WINHELP_CreateHelpWindow(HLPFILE_PAGE* page, LPCSTR lpszWindow,
|
||||||
WINHELP_DeleteWindow(oldwin);
|
WINHELP_DeleteWindow(oldwin);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Create main Window */
|
hWnd = CreateWindow((wi->win_style & WS_POPUP) ? TEXT_WIN_CLASS_NAME : MAIN_WIN_CLASS_NAME,
|
||||||
if (!page) LoadString(Globals.hInstance, STID_WINE_HELP, szCaption, sizeof(szCaption));
|
wi->caption, wi->win_style,
|
||||||
hWnd = CreateWindow(bPopup ? TEXT_WIN_CLASS_NAME : MAIN_WIN_CLASS_NAME,
|
wi->origin.x, wi->origin.y, wi->size.cx, wi->size.cy,
|
||||||
page ? page->file->lpszTitle : szCaption,
|
|
||||||
bPopup ? WS_POPUPWINDOW | WS_BORDER : WS_OVERLAPPEDWINDOW,
|
|
||||||
origin.x, origin.y, size.cx, size.cy,
|
|
||||||
0, bPrimary ? LoadMenu(Globals.hInstance, MAKEINTRESOURCE(MAIN_MENU)) : 0,
|
0, bPrimary ? LoadMenu(Globals.hInstance, MAKEINTRESOURCE(MAIN_MENU)) : 0,
|
||||||
Globals.hInstance, win);
|
Globals.hInstance, win);
|
||||||
|
|
||||||
|
@ -356,55 +426,20 @@ static BOOL WINHELP_CreateHelpWindow(HLPFILE_PAGE* page, LPCSTR lpszWindow,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* WINHELP_CreateHelpWindowByPage
|
|
||||||
*/
|
|
||||||
BOOL WINHELP_CreateHelpWindowByPage(HLPFILE_PAGE* page, LPCSTR lpszWindow,
|
|
||||||
BOOL bPopup, HWND hParentWnd, LPPOINT mouse, INT nCmdShow)
|
|
||||||
{
|
|
||||||
if (page) page->file->wRefCount++;
|
|
||||||
return WINHELP_CreateHelpWindow(page, lpszWindow, bPopup, hParentWnd, mouse, nCmdShow);
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
*
|
*
|
||||||
* WINHELP_CreateHelpWindowByHash
|
* WINHELP_CreateHelpWindowByHash
|
||||||
*/
|
*/
|
||||||
BOOL WINHELP_CreateHelpWindowByHash(LPCSTR lpszFile, LONG lHash, LPCSTR lpszWindow,
|
BOOL WINHELP_CreateHelpWindowByHash(HLPFILE* hlpfile, LONG lHash,
|
||||||
BOOL bPopup, HWND hParentWnd, LPPOINT mouse, INT nCmdShow)
|
HLPFILE_WINDOWINFO* wi, int nCmdShow)
|
||||||
{
|
{
|
||||||
HLPFILE_PAGE* page = NULL;
|
HLPFILE_PAGE* page = NULL;
|
||||||
|
|
||||||
/* Read help file */
|
if (hlpfile)
|
||||||
if (lpszFile[0])
|
|
||||||
{
|
|
||||||
HLPFILE* hlpfile;
|
|
||||||
|
|
||||||
hlpfile = HLPFILE_ReadHlpFile(lpszFile);
|
|
||||||
|
|
||||||
/* Add Suffix `.hlp' */
|
|
||||||
if (!hlpfile && lstrcmpi(lpszFile + strlen(lpszFile) - 4, ".hlp") != 0)
|
|
||||||
{
|
|
||||||
CHAR szFile_hlp[MAX_PATHNAME_LEN];
|
|
||||||
|
|
||||||
lstrcpyn(szFile_hlp, lpszFile, sizeof(szFile_hlp) - 4);
|
|
||||||
szFile_hlp[sizeof(szFile_hlp) - 5] = '\0';
|
|
||||||
lstrcat(szFile_hlp, ".hlp");
|
|
||||||
|
|
||||||
hlpfile = HLPFILE_ReadHlpFile(szFile_hlp);
|
|
||||||
}
|
|
||||||
if (!hlpfile)
|
|
||||||
{
|
|
||||||
WINHELP_MessageBoxIDS_s(STID_HLPFILE_ERROR_s, lpszFile, STID_WHERROR, MB_OK);
|
|
||||||
if (Globals.win_list) return FALSE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
page = lHash ? HLPFILE_PageByHash(hlpfile, lHash) :
|
page = lHash ? HLPFILE_PageByHash(hlpfile, lHash) :
|
||||||
HLPFILE_Contents(hlpfile);
|
HLPFILE_Contents(hlpfile);
|
||||||
}
|
if (page) page->file->wRefCount++;
|
||||||
else page = NULL;
|
return WINHELP_CreateHelpWindow(page, wi, nCmdShow);
|
||||||
return WINHELP_CreateHelpWindowByPage(page, lpszWindow, bPopup, hParentWnd, mouse, nCmdShow);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -599,7 +634,7 @@ static LRESULT CALLBACK WINHELP_TextWndProc(HWND hWnd, UINT msg, WPARAM wParam,
|
||||||
win = (WINHELP_WINDOW*) ((LPCREATESTRUCT) lParam)->lpCreateParams;
|
win = (WINHELP_WINDOW*) ((LPCREATESTRUCT) lParam)->lpCreateParams;
|
||||||
SetWindowLong(hWnd, 0, (LONG) win);
|
SetWindowLong(hWnd, 0, (LONG) win);
|
||||||
win->hTextWnd = hWnd;
|
win->hTextWnd = hWnd;
|
||||||
if (!win->lpszName) Globals.hPopupWnd = win->hMainWnd = hWnd;
|
if (win->info->win_style & WS_POPUP) Globals.hPopupWnd = win->hMainWnd = hWnd;
|
||||||
WINHELP_InitFonts(hWnd);
|
WINHELP_InitFonts(hWnd);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -607,7 +642,7 @@ static LRESULT CALLBACK WINHELP_TextWndProc(HWND hWnd, UINT msg, WPARAM wParam,
|
||||||
win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
|
win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
|
||||||
|
|
||||||
/* Calculate vertical size and position of a popup window */
|
/* Calculate vertical size and position of a popup window */
|
||||||
if (!win->lpszName)
|
if (win->info->win_style & WS_POPUP)
|
||||||
{
|
{
|
||||||
POINT origin;
|
POINT origin;
|
||||||
RECT old_window_rect;
|
RECT old_window_rect;
|
||||||
|
@ -773,6 +808,9 @@ static LRESULT CALLBACK WINHELP_TextWndProc(HWND hWnd, UINT msg, WPARAM wParam,
|
||||||
part = WINHELP_IsOverLink(hWnd, wParam, lParam);
|
part = WINHELP_IsOverLink(hWnd, wParam, lParam);
|
||||||
if (part)
|
if (part)
|
||||||
{
|
{
|
||||||
|
HLPFILE* hlpfile;
|
||||||
|
HLPFILE_WINDOWINFO* wi;
|
||||||
|
|
||||||
mouse.x = LOWORD(lParam);
|
mouse.x = LOWORD(lParam);
|
||||||
mouse.y = HIWORD(lParam);
|
mouse.y = HIWORD(lParam);
|
||||||
|
|
||||||
|
@ -781,12 +819,24 @@ static LRESULT CALLBACK WINHELP_TextWndProc(HWND hWnd, UINT msg, WPARAM wParam,
|
||||||
case hlp_link_none:
|
case hlp_link_none:
|
||||||
break;
|
break;
|
||||||
case hlp_link_link:
|
case hlp_link_link:
|
||||||
WINHELP_CreateHelpWindowByHash(part->link.lpszString, part->link.lHash, NULL,
|
hlpfile = WINHELP_LookupHelpFile(part->link.lpszString);
|
||||||
FALSE, hWnd, &mouse, SW_NORMAL);
|
if (part->link.window == -1)
|
||||||
|
wi = win->info;
|
||||||
|
else if (part->link.window < hlpfile->numWindows)
|
||||||
|
wi = &hlpfile->windows[part->link.window];
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WINE_WARN("link to window %d/%d\n", part->link.window, hlpfile->numWindows);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
WINHELP_CreateHelpWindowByHash(hlpfile, part->link.lHash, wi,
|
||||||
|
SW_NORMAL);
|
||||||
break;
|
break;
|
||||||
case hlp_link_popup:
|
case hlp_link_popup:
|
||||||
WINHELP_CreateHelpWindowByHash(part->link.lpszString, part->link.lHash, NULL,
|
hlpfile = WINHELP_LookupHelpFile(part->link.lpszString);
|
||||||
TRUE, hWnd, &mouse, SW_NORMAL);
|
WINHELP_CreateHelpWindowByHash(hlpfile, part->link.lHash,
|
||||||
|
WINHELP_GetPopupWindowInfo(hlpfile, hWnd, &mouse),
|
||||||
|
SW_NORMAL);
|
||||||
break;
|
break;
|
||||||
case hlp_link_macro:
|
case hlp_link_macro:
|
||||||
MACRO_ExecuteMacro(part->link.lpszString);
|
MACRO_ExecuteMacro(part->link.lpszString);
|
||||||
|
@ -932,6 +982,7 @@ static BOOL WINHELP_AppendText(WINHELP_LINE ***linep, WINHELP_LINE_PART ***partp
|
||||||
part->link.cookie = link->cookie;
|
part->link.cookie = link->cookie;
|
||||||
part->link.lHash = link->lHash;
|
part->link.lHash = link->lHash;
|
||||||
part->link.bClrChange = link->bClrChange;
|
part->link.bClrChange = link->bClrChange;
|
||||||
|
part->link.window = link->window;
|
||||||
}
|
}
|
||||||
else part->link.cookie = hlp_link_none;
|
else part->link.cookie = hlp_link_none;
|
||||||
|
|
||||||
|
@ -1009,6 +1060,7 @@ static BOOL WINHELP_AppendBitmap(WINHELP_LINE ***linep, WINHELP_LINE_PART ***par
|
||||||
part->link.cookie = link->cookie;
|
part->link.cookie = link->cookie;
|
||||||
part->link.lHash = link->lHash;
|
part->link.lHash = link->lHash;
|
||||||
part->link.bClrChange = link->bClrChange;
|
part->link.bClrChange = link->bClrChange;
|
||||||
|
part->link.window = link->window;
|
||||||
}
|
}
|
||||||
else part->link.cookie = hlp_link_none;
|
else part->link.cookie = hlp_link_none;
|
||||||
|
|
||||||
|
|
|
@ -102,6 +102,8 @@ typedef struct tagWinHelp
|
||||||
HCURSOR hArrowCur;
|
HCURSOR hArrowCur;
|
||||||
HCURSOR hHandCur;
|
HCURSOR hHandCur;
|
||||||
|
|
||||||
|
HLPFILE_WINDOWINFO* info;
|
||||||
|
|
||||||
struct tagWinHelp* next;
|
struct tagWinHelp* next;
|
||||||
} WINHELP_WINDOW;
|
} WINHELP_WINDOW;
|
||||||
|
|
||||||
|
@ -118,10 +120,12 @@ typedef struct
|
||||||
|
|
||||||
extern WINHELP_GLOBALS Globals;
|
extern WINHELP_GLOBALS Globals;
|
||||||
|
|
||||||
BOOL WINHELP_CreateHelpWindowByHash(LPCSTR, LONG, LPCSTR, BOOL, HWND, LPPOINT, INT);
|
BOOL WINHELP_CreateHelpWindowByHash(HLPFILE*, LONG, HLPFILE_WINDOWINFO*, int);
|
||||||
BOOL WINHELP_CreateHelpWindowByPage(HLPFILE_PAGE*, LPCSTR, BOOL, HWND, LPPOINT, INT);
|
BOOL WINHELP_CreateHelpWindow(HLPFILE_PAGE*, HLPFILE_WINDOWINFO*, 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);
|
||||||
|
HLPFILE* WINHELP_LookupHelpFile(LPCSTR lpszFile);
|
||||||
|
HLPFILE_WINDOWINFO* WINHELP_GetWindowInfo(HLPFILE* hlpfile, LPCSTR name);
|
||||||
|
|
||||||
extern char MAIN_WIN_CLASS_NAME[];
|
extern char MAIN_WIN_CLASS_NAME[];
|
||||||
extern char BUTTON_BOX_WIN_CLASS_NAME[];
|
extern char BUTTON_BOX_WIN_CLASS_NAME[];
|
||||||
|
|
Loading…
Reference in New Issue