winhelp: Added ability to locate information within a page (and to store it inside WNDPAGE).
This commit is contained in:
parent
61cc510623
commit
a4480365d7
|
@ -96,21 +96,12 @@ static HLPFILE_PAGE *HLPFILE_PageByNumber(HLPFILE* hlpfile, UINT wNum)
|
||||||
return page;
|
return page;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME:
|
|
||||||
* this finds the page containing the offset. The offset can either
|
|
||||||
* refer to the top of the page (offset == page->offset), or
|
|
||||||
* to some paragraph inside the page...
|
|
||||||
* As of today, we only return the page... we should also return
|
|
||||||
* a paragraph, and then, while opening a new page, compute the
|
|
||||||
* y-offset of the paragraph to be shown and scroll the window
|
|
||||||
* accordingly
|
|
||||||
*/
|
|
||||||
/******************************************************************
|
/******************************************************************
|
||||||
* HLPFILE_PageByOffset
|
* HLPFILE_PageByOffset
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
HLPFILE_PAGE *HLPFILE_PageByOffset(HLPFILE* hlpfile, LONG offset)
|
HLPFILE_PAGE *HLPFILE_PageByOffset(HLPFILE* hlpfile, LONG offset, ULONG* relative)
|
||||||
{
|
{
|
||||||
HLPFILE_PAGE* page;
|
HLPFILE_PAGE* page;
|
||||||
HLPFILE_PAGE* found;
|
HLPFILE_PAGE* found;
|
||||||
|
@ -125,7 +116,10 @@ HLPFILE_PAGE *HLPFILE_PageByOffset(HLPFILE* hlpfile, LONG offset)
|
||||||
for (found = NULL, page = hlpfile->first_page; page; page = page->next)
|
for (found = NULL, page = hlpfile->first_page; page; page = page->next)
|
||||||
{
|
{
|
||||||
if (page->offset <= offset && (!found || found->offset < page->offset))
|
if (page->offset <= offset && (!found || found->offset < page->offset))
|
||||||
|
{
|
||||||
|
*relative = offset - page->offset;
|
||||||
found = page;
|
found = page;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!found)
|
if (!found)
|
||||||
WINE_ERR("Page of offset %u not found in file %s\n",
|
WINE_ERR("Page of offset %u not found in file %s\n",
|
||||||
|
@ -156,7 +150,7 @@ static int comp_PageByHash(void *p, const void *key,
|
||||||
*
|
*
|
||||||
* HLPFILE_HlpFilePageByHash
|
* HLPFILE_HlpFilePageByHash
|
||||||
*/
|
*/
|
||||||
HLPFILE_PAGE *HLPFILE_PageByHash(HLPFILE* hlpfile, LONG lHash)
|
HLPFILE_PAGE *HLPFILE_PageByHash(HLPFILE* hlpfile, LONG lHash, ULONG* relative)
|
||||||
{
|
{
|
||||||
BYTE *ptr;
|
BYTE *ptr;
|
||||||
|
|
||||||
|
@ -166,7 +160,10 @@ HLPFILE_PAGE *HLPFILE_PageByHash(HLPFILE* hlpfile, LONG lHash)
|
||||||
|
|
||||||
/* For win 3.0 files hash values are really page numbers */
|
/* For win 3.0 files hash values are really page numbers */
|
||||||
if (hlpfile->version <= 16)
|
if (hlpfile->version <= 16)
|
||||||
|
{
|
||||||
|
*relative = 0;
|
||||||
return HLPFILE_PageByNumber(hlpfile, lHash);
|
return HLPFILE_PageByNumber(hlpfile, lHash);
|
||||||
|
}
|
||||||
|
|
||||||
ptr = HLPFILE_BPTreeSearch(hlpfile->Context, LongToPtr(lHash), comp_PageByHash);
|
ptr = HLPFILE_BPTreeSearch(hlpfile->Context, LongToPtr(lHash), comp_PageByHash);
|
||||||
if (!ptr)
|
if (!ptr)
|
||||||
|
@ -175,14 +172,14 @@ HLPFILE_PAGE *HLPFILE_PageByHash(HLPFILE* hlpfile, LONG lHash)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return HLPFILE_PageByOffset(hlpfile, GET_UINT(ptr, 4));
|
return HLPFILE_PageByOffset(hlpfile, GET_UINT(ptr, 4), relative);
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
*
|
*
|
||||||
* HLPFILE_PageByMap
|
* HLPFILE_PageByMap
|
||||||
*/
|
*/
|
||||||
HLPFILE_PAGE *HLPFILE_PageByMap(HLPFILE* hlpfile, LONG lMap)
|
HLPFILE_PAGE *HLPFILE_PageByMap(HLPFILE* hlpfile, LONG lMap, ULONG* relative)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
|
@ -193,7 +190,7 @@ HLPFILE_PAGE *HLPFILE_PageByMap(HLPFILE* hlpfile, LONG lMap)
|
||||||
for (i = 0; i < hlpfile->wMapLen; i++)
|
for (i = 0; i < hlpfile->wMapLen; i++)
|
||||||
{
|
{
|
||||||
if (hlpfile->Map[i].lMap == lMap)
|
if (hlpfile->Map[i].lMap == lMap)
|
||||||
return HLPFILE_PageByOffset(hlpfile, hlpfile->Map[i].offset);
|
return HLPFILE_PageByOffset(hlpfile, hlpfile->Map[i].offset, relative);
|
||||||
}
|
}
|
||||||
|
|
||||||
WINE_ERR("Page of Map %x not found in file %s\n", lMap, hlpfile->lpszPath);
|
WINE_ERR("Page of Map %x not found in file %s\n", lMap, hlpfile->lpszPath);
|
||||||
|
@ -204,14 +201,18 @@ HLPFILE_PAGE *HLPFILE_PageByMap(HLPFILE* hlpfile, LONG lMap)
|
||||||
*
|
*
|
||||||
* HLPFILE_Contents
|
* HLPFILE_Contents
|
||||||
*/
|
*/
|
||||||
HLPFILE_PAGE* HLPFILE_Contents(HLPFILE *hlpfile)
|
HLPFILE_PAGE* HLPFILE_Contents(HLPFILE *hlpfile, ULONG* relative)
|
||||||
{
|
{
|
||||||
HLPFILE_PAGE* page = NULL;
|
HLPFILE_PAGE* page = NULL;
|
||||||
|
|
||||||
if (!hlpfile) return NULL;
|
if (!hlpfile) return NULL;
|
||||||
|
|
||||||
page = HLPFILE_PageByOffset(hlpfile, hlpfile->contents_start);
|
page = HLPFILE_PageByOffset(hlpfile, hlpfile->contents_start, relative);
|
||||||
if (!page) page = hlpfile->first_page;
|
if (!page)
|
||||||
|
{
|
||||||
|
page = hlpfile->first_page;
|
||||||
|
*relative = 0;
|
||||||
|
}
|
||||||
return page;
|
return page;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -188,10 +188,10 @@ typedef int (*HLPFILE_BPTreeCompare)(void *p, const void *key,
|
||||||
typedef void (*HLPFILE_BPTreeCallback)(void *p, void **next, void *cookie);
|
typedef void (*HLPFILE_BPTreeCallback)(void *p, void **next, void *cookie);
|
||||||
|
|
||||||
HLPFILE* HLPFILE_ReadHlpFile(LPCSTR lpszPath);
|
HLPFILE* HLPFILE_ReadHlpFile(LPCSTR lpszPath);
|
||||||
HLPFILE_PAGE* HLPFILE_Contents(HLPFILE* hlpfile);
|
HLPFILE_PAGE* HLPFILE_Contents(HLPFILE* hlpfile, ULONG* relative);
|
||||||
HLPFILE_PAGE* HLPFILE_PageByHash(HLPFILE* hlpfile, LONG lHash);
|
HLPFILE_PAGE* HLPFILE_PageByHash(HLPFILE* hlpfile, LONG lHash, ULONG* relative);
|
||||||
HLPFILE_PAGE* HLPFILE_PageByMap(HLPFILE* hlpfile, LONG lMap);
|
HLPFILE_PAGE* HLPFILE_PageByMap(HLPFILE* hlpfile, LONG lMap, ULONG* relative);
|
||||||
HLPFILE_PAGE* HLPFILE_PageByOffset(HLPFILE* hlpfile, LONG offset);
|
HLPFILE_PAGE* HLPFILE_PageByOffset(HLPFILE* hlpfile, LONG offset, ULONG* relative);
|
||||||
LONG HLPFILE_Hash(LPCSTR lpszContext);
|
LONG HLPFILE_Hash(LPCSTR lpszContext);
|
||||||
void HLPFILE_FreeLink(HLPFILE_LINK* link);
|
void HLPFILE_FreeLink(HLPFILE_LINK* link);
|
||||||
void HLPFILE_FreeHlpFile(HLPFILE*);
|
void HLPFILE_FreeHlpFile(HLPFILE*);
|
||||||
|
|
|
@ -246,15 +246,16 @@ void CALLBACK MACRO_BookmarkMore(void)
|
||||||
void CALLBACK MACRO_BrowseButtons(void)
|
void CALLBACK MACRO_BrowseButtons(void)
|
||||||
{
|
{
|
||||||
HLPFILE_PAGE* page = Globals.active_win->page;
|
HLPFILE_PAGE* page = Globals.active_win->page;
|
||||||
|
ULONG relative;
|
||||||
|
|
||||||
WINE_TRACE("()\n");
|
WINE_TRACE("()\n");
|
||||||
|
|
||||||
MACRO_CreateButton("BTN_PREV", "&<<", "Prev()");
|
MACRO_CreateButton("BTN_PREV", "&<<", "Prev()");
|
||||||
MACRO_CreateButton("BTN_NEXT", "&>>", "Next()");
|
MACRO_CreateButton("BTN_NEXT", "&>>", "Next()");
|
||||||
|
|
||||||
if (!HLPFILE_PageByOffset(page->file, page->browse_bwd))
|
if (!HLPFILE_PageByOffset(page->file, page->browse_bwd, &relative))
|
||||||
MACRO_DisableButton("BTN_PREV");
|
MACRO_DisableButton("BTN_PREV");
|
||||||
if (!HLPFILE_PageByOffset(page->file, page->browse_fwd))
|
if (!HLPFILE_PageByOffset(page->file, page->browse_fwd, &relative))
|
||||||
MACRO_DisableButton("BTN_NEXT");
|
MACRO_DisableButton("BTN_NEXT");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -718,7 +719,7 @@ void CALLBACK MACRO_Next(void)
|
||||||
|
|
||||||
WINE_TRACE("()\n");
|
WINE_TRACE("()\n");
|
||||||
wp.page = Globals.active_win->page;
|
wp.page = Globals.active_win->page;
|
||||||
wp.page = HLPFILE_PageByOffset(wp.page->file, wp.page->browse_fwd);
|
wp.page = HLPFILE_PageByOffset(wp.page->file, wp.page->browse_fwd, &wp.relative);
|
||||||
if (wp.page)
|
if (wp.page)
|
||||||
{
|
{
|
||||||
wp.page->file->wRefCount++;
|
wp.page->file->wRefCount++;
|
||||||
|
@ -758,7 +759,7 @@ void CALLBACK MACRO_Prev(void)
|
||||||
|
|
||||||
WINE_TRACE("()\n");
|
WINE_TRACE("()\n");
|
||||||
wp.page = Globals.active_win->page;
|
wp.page = Globals.active_win->page;
|
||||||
wp.page = HLPFILE_PageByOffset(wp.page->file, wp.page->browse_bwd);
|
wp.page = HLPFILE_PageByOffset(wp.page->file, wp.page->browse_bwd, &wp.relative);
|
||||||
if (wp.page)
|
if (wp.page)
|
||||||
{
|
{
|
||||||
wp.page->file->wRefCount++;
|
wp.page->file->wRefCount++;
|
||||||
|
|
|
@ -53,7 +53,7 @@ static void WINHELP_InitFonts(HWND hWnd);
|
||||||
static void WINHELP_DeleteLines(WINHELP_WINDOW*);
|
static void WINHELP_DeleteLines(WINHELP_WINDOW*);
|
||||||
static void WINHELP_DeleteWindow(WINHELP_WINDOW*);
|
static void WINHELP_DeleteWindow(WINHELP_WINDOW*);
|
||||||
static void WINHELP_DeleteButtons(WINHELP_WINDOW*);
|
static void WINHELP_DeleteButtons(WINHELP_WINDOW*);
|
||||||
static void WINHELP_SetupText(HWND hWnd);
|
static void WINHELP_SetupText(HWND hWnd, ULONG relative);
|
||||||
static WINHELP_LINE_PART* WINHELP_IsOverLink(WINHELP_WINDOW*, WPARAM, LPARAM);
|
static WINHELP_LINE_PART* WINHELP_IsOverLink(WINHELP_WINDOW*, WPARAM, LPARAM);
|
||||||
|
|
||||||
WINHELP_GLOBALS Globals = {3, NULL, NULL, TRUE, NULL, NULL, NULL, NULL, {{{NULL,NULL}},0}};
|
WINHELP_GLOBALS Globals = {3, NULL, NULL, TRUE, NULL, NULL, NULL, NULL, {{{NULL,NULL}},0}};
|
||||||
|
@ -560,7 +560,8 @@ BOOL WINHELP_CreateHelpWindow(WINHELP_WNDPAGE* wpage, int nCmdShow, BOOL remembe
|
||||||
|
|
||||||
win->page = wpage->page;
|
win->page = wpage->page;
|
||||||
win->info = wpage->wininfo;
|
win->info = wpage->wininfo;
|
||||||
WINHELP_SetupText(GetDlgItem(win->hMainWnd, CTL_ID_TEXT));
|
WINHELP_SetupText(GetDlgItem(win->hMainWnd, CTL_ID_TEXT), wpage->relative);
|
||||||
|
|
||||||
InvalidateRect(win->hMainWnd, NULL, TRUE);
|
InvalidateRect(win->hMainWnd, NULL, TRUE);
|
||||||
if (win->hHistoryWnd) InvalidateRect(win->hHistoryWnd, NULL, TRUE);
|
if (win->hHistoryWnd) InvalidateRect(win->hHistoryWnd, NULL, TRUE);
|
||||||
break;
|
break;
|
||||||
|
@ -669,8 +670,8 @@ BOOL WINHELP_CreateHelpWindowByHash(HLPFILE* hlpfile, LONG lHash,
|
||||||
|
|
||||||
wpage.page = NULL;
|
wpage.page = NULL;
|
||||||
if (hlpfile)
|
if (hlpfile)
|
||||||
wpage.page = lHash ? HLPFILE_PageByHash(hlpfile, lHash) :
|
wpage.page = lHash ? HLPFILE_PageByHash(hlpfile, lHash, &wpage.relative) :
|
||||||
HLPFILE_Contents(hlpfile);
|
HLPFILE_Contents(hlpfile, &wpage.relative);
|
||||||
if (wpage.page) wpage.page->file->wRefCount++;
|
if (wpage.page) wpage.page->file->wRefCount++;
|
||||||
wpage.wininfo = wi;
|
wpage.wininfo = wi;
|
||||||
return WINHELP_CreateHelpWindow(&wpage, nCmdShow, TRUE);
|
return WINHELP_CreateHelpWindow(&wpage, nCmdShow, TRUE);
|
||||||
|
@ -685,7 +686,7 @@ BOOL WINHELP_CreateHelpWindowByMap(HLPFILE* hlpfile, LONG lMap,
|
||||||
{
|
{
|
||||||
WINHELP_WNDPAGE wpage;
|
WINHELP_WNDPAGE wpage;
|
||||||
|
|
||||||
wpage.page = HLPFILE_PageByMap(hlpfile, lMap);
|
wpage.page = HLPFILE_PageByMap(hlpfile, lMap, &wpage.relative);
|
||||||
if (wpage.page) wpage.page->file->wRefCount++;
|
if (wpage.page) wpage.page->file->wRefCount++;
|
||||||
wpage.wininfo = wi;
|
wpage.wininfo = wi;
|
||||||
return WINHELP_CreateHelpWindow(&wpage, nCmdShow, TRUE);
|
return WINHELP_CreateHelpWindow(&wpage, nCmdShow, TRUE);
|
||||||
|
@ -700,7 +701,7 @@ BOOL WINHELP_CreateHelpWindowByOffset(HLPFILE* hlpfile, LONG lOffset,
|
||||||
{
|
{
|
||||||
WINHELP_WNDPAGE wpage;
|
WINHELP_WNDPAGE wpage;
|
||||||
|
|
||||||
wpage.page = HLPFILE_PageByOffset(hlpfile, lOffset);
|
wpage.page = HLPFILE_PageByOffset(hlpfile, lOffset, &wpage.relative);
|
||||||
if (wpage.page) wpage.page->file->wRefCount++;
|
if (wpage.page) wpage.page->file->wRefCount++;
|
||||||
wpage.wininfo = wi;
|
wpage.wininfo = wi;
|
||||||
return WINHELP_CreateHelpWindow(&wpage, nCmdShow, TRUE);
|
return WINHELP_CreateHelpWindow(&wpage, nCmdShow, TRUE);
|
||||||
|
@ -1022,7 +1023,7 @@ static LRESULT CALLBACK WINHELP_TextWndProc(HWND hWnd, UINT msg, WPARAM wParam,
|
||||||
case WM_WINDOWPOSCHANGED:
|
case WM_WINDOWPOSCHANGED:
|
||||||
winpos = (WINDOWPOS*) lParam;
|
winpos = (WINDOWPOS*) lParam;
|
||||||
|
|
||||||
if (!(winpos->flags & SWP_NOSIZE)) WINHELP_SetupText(hWnd);
|
if (!(winpos->flags & SWP_NOSIZE)) WINHELP_SetupText(hWnd, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_MOUSEWHEEL:
|
case WM_MOUSEWHEEL:
|
||||||
|
@ -1359,7 +1360,7 @@ static LRESULT CALLBACK WINHELP_ShadowWndProc(HWND hWnd, UINT msg, WPARAM wParam
|
||||||
*
|
*
|
||||||
* SetupText
|
* SetupText
|
||||||
*/
|
*/
|
||||||
static void WINHELP_SetupText(HWND hWnd)
|
static void WINHELP_SetupText(HWND hWnd, ULONG relative)
|
||||||
{
|
{
|
||||||
HDC hDc = GetDC(hWnd);
|
HDC hDc = GetDC(hWnd);
|
||||||
RECT rect;
|
RECT rect;
|
||||||
|
|
|
@ -95,6 +95,7 @@ typedef struct
|
||||||
{
|
{
|
||||||
HLPFILE_PAGE* page;
|
HLPFILE_PAGE* page;
|
||||||
HLPFILE_WINDOWINFO* wininfo;
|
HLPFILE_WINDOWINFO* wininfo;
|
||||||
|
ULONG relative;
|
||||||
} WINHELP_WNDPAGE;
|
} WINHELP_WNDPAGE;
|
||||||
|
|
||||||
typedef struct tagPageSet
|
typedef struct tagPageSet
|
||||||
|
|
Loading…
Reference in New Issue