[PATCH 15/21] [WinHelp]: added ability to locate information within a page (and to store it inside WNDPAGE)
Eric Pouech
eric.pouech at orange.fr
Mon Apr 21 14:08:16 CDT 2008
A+
---
programs/winhelp/hlpfile.c | 35 ++++++++++++++++++-----------------
programs/winhelp/hlpfile.h | 8 ++++----
programs/winhelp/macro.c | 9 +++++----
programs/winhelp/winhelp.c | 17 +++++++++--------
programs/winhelp/winhelp.h | 1 +
5 files changed, 37 insertions(+), 33 deletions(-)
diff --git a/programs/winhelp/hlpfile.c b/programs/winhelp/hlpfile.c
index f16d3b7..24c4f54 100644
--- a/programs/winhelp/hlpfile.c
+++ b/programs/winhelp/hlpfile.c
@@ -96,21 +96,12 @@ static HLPFILE_PAGE *HLPFILE_PageByNumber(HLPFILE* hlpfile, UINT wNum)
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_PAGE *HLPFILE_PageByOffset(HLPFILE* hlpfile, LONG offset)
+HLPFILE_PAGE *HLPFILE_PageByOffset(HLPFILE* hlpfile, LONG offset, ULONG* relative)
{
HLPFILE_PAGE* page;
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)
{
if (page->offset <= offset && (!found || found->offset < page->offset))
+ {
+ *relative = offset - page->offset;
found = page;
+ }
}
if (!found)
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_PAGE *HLPFILE_PageByHash(HLPFILE* hlpfile, LONG lHash)
+HLPFILE_PAGE *HLPFILE_PageByHash(HLPFILE* hlpfile, LONG lHash, ULONG* relative)
{
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 */
if (hlpfile->version <= 16)
+ {
+ *relative = 0;
return HLPFILE_PageByNumber(hlpfile, lHash);
+ }
ptr = HLPFILE_BPTreeSearch(hlpfile->Context, LongToPtr(lHash), comp_PageByHash);
if (!ptr)
@@ -175,14 +172,14 @@ HLPFILE_PAGE *HLPFILE_PageByHash(HLPFILE* hlpfile, LONG lHash)
return NULL;
}
- return HLPFILE_PageByOffset(hlpfile, GET_UINT(ptr, 4));
+ return HLPFILE_PageByOffset(hlpfile, GET_UINT(ptr, 4), relative);
}
/***********************************************************************
*
* HLPFILE_PageByMap
*/
-HLPFILE_PAGE *HLPFILE_PageByMap(HLPFILE* hlpfile, LONG lMap)
+HLPFILE_PAGE *HLPFILE_PageByMap(HLPFILE* hlpfile, LONG lMap, ULONG* relative)
{
unsigned int i;
@@ -193,7 +190,7 @@ HLPFILE_PAGE *HLPFILE_PageByMap(HLPFILE* hlpfile, LONG lMap)
for (i = 0; i < hlpfile->wMapLen; i++)
{
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);
@@ -204,14 +201,18 @@ HLPFILE_PAGE *HLPFILE_PageByMap(HLPFILE* hlpfile, LONG lMap)
*
* HLPFILE_Contents
*/
-HLPFILE_PAGE* HLPFILE_Contents(HLPFILE *hlpfile)
+HLPFILE_PAGE* HLPFILE_Contents(HLPFILE *hlpfile, ULONG* relative)
{
HLPFILE_PAGE* page = NULL;
if (!hlpfile) return NULL;
- page = HLPFILE_PageByOffset(hlpfile, hlpfile->contents_start);
- if (!page) page = hlpfile->first_page;
+ page = HLPFILE_PageByOffset(hlpfile, hlpfile->contents_start, relative);
+ if (!page)
+ {
+ page = hlpfile->first_page;
+ *relative = 0;
+ }
return page;
}
diff --git a/programs/winhelp/hlpfile.h b/programs/winhelp/hlpfile.h
index 739ad38..548a6e2 100644
--- a/programs/winhelp/hlpfile.h
+++ b/programs/winhelp/hlpfile.h
@@ -188,10 +188,10 @@ typedef int (*HLPFILE_BPTreeCompare)(void *p, const void *key,
typedef void (*HLPFILE_BPTreeCallback)(void *p, void **next, void *cookie);
HLPFILE* HLPFILE_ReadHlpFile(LPCSTR lpszPath);
-HLPFILE_PAGE* HLPFILE_Contents(HLPFILE* hlpfile);
-HLPFILE_PAGE* HLPFILE_PageByHash(HLPFILE* hlpfile, LONG lHash);
-HLPFILE_PAGE* HLPFILE_PageByMap(HLPFILE* hlpfile, LONG lMap);
-HLPFILE_PAGE* HLPFILE_PageByOffset(HLPFILE* hlpfile, LONG offset);
+HLPFILE_PAGE* HLPFILE_Contents(HLPFILE* hlpfile, ULONG* relative);
+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);
LONG HLPFILE_Hash(LPCSTR lpszContext);
void HLPFILE_FreeLink(HLPFILE_LINK* link);
void HLPFILE_FreeHlpFile(HLPFILE*);
diff --git a/programs/winhelp/macro.c b/programs/winhelp/macro.c
index 2c38b01..3681933 100644
--- a/programs/winhelp/macro.c
+++ b/programs/winhelp/macro.c
@@ -246,15 +246,16 @@ void CALLBACK MACRO_BookmarkMore(void)
void CALLBACK MACRO_BrowseButtons(void)
{
HLPFILE_PAGE* page = Globals.active_win->page;
+ ULONG relative;
WINE_TRACE("()\n");
MACRO_CreateButton("BTN_PREV", "&<<", "Prev()");
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");
- if (!HLPFILE_PageByOffset(page->file, page->browse_fwd))
+ if (!HLPFILE_PageByOffset(page->file, page->browse_fwd, &relative))
MACRO_DisableButton("BTN_NEXT");
}
@@ -718,7 +719,7 @@ void CALLBACK MACRO_Next(void)
WINE_TRACE("()\n");
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)
{
wp.page->file->wRefCount++;
@@ -758,7 +759,7 @@ void CALLBACK MACRO_Prev(void)
WINE_TRACE("()\n");
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)
{
wp.page->file->wRefCount++;
diff --git a/programs/winhelp/winhelp.c b/programs/winhelp/winhelp.c
index 31eec2d..7e679d1 100644
--- a/programs/winhelp/winhelp.c
+++ b/programs/winhelp/winhelp.c
@@ -53,7 +53,7 @@ static void WINHELP_InitFonts(HWND hWnd);
static void WINHELP_DeleteLines(WINHELP_WINDOW*);
static void WINHELP_DeleteWindow(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);
WINHELP_GLOBALS Globals = {3, NULL, NULL, TRUE, NULL, NULL, NULL, NULL, {{{NULL,NULL}},0}};
@@ -558,7 +558,8 @@ BOOL WINHELP_CreateHelpWindow(WINHELP_WNDPAGE* wpage, int nCmdShow, BOOL remembe
WINHELP_DeleteBackSet(win);
WINHELP_InitFonts(win->hMainWnd);
- WINHELP_SetupText(GetDlgItem(win->hMainWnd, CTL_ID_TEXT));
+ WINHELP_SetupText(GetDlgItem(win->hMainWnd, CTL_ID_TEXT), wpage->relative);
+
InvalidateRect(win->hMainWnd, NULL, TRUE);
if (win->hHistoryWnd) InvalidateRect(win->hHistoryWnd, NULL, TRUE);
break;
@@ -667,8 +668,8 @@ BOOL WINHELP_CreateHelpWindowByHash(HLPFILE* hlpfile, LONG lHash,
wpage.page = NULL;
if (hlpfile)
- wpage.page = lHash ? HLPFILE_PageByHash(hlpfile, lHash) :
- HLPFILE_Contents(hlpfile);
+ wpage.page = lHash ? HLPFILE_PageByHash(hlpfile, lHash, &wpage.relative) :
+ HLPFILE_Contents(hlpfile, &wpage.relative);
if (wpage.page) wpage.page->file->wRefCount++;
wpage.wininfo = wi;
return WINHELP_CreateHelpWindow(&wpage, nCmdShow, TRUE);
@@ -683,7 +684,7 @@ BOOL WINHELP_CreateHelpWindowByMap(HLPFILE* hlpfile, LONG lMap,
{
WINHELP_WNDPAGE wpage;
- wpage.page = HLPFILE_PageByMap(hlpfile, lMap);
+ wpage.page = HLPFILE_PageByMap(hlpfile, lMap, &wpage.relative);
if (wpage.page) wpage.page->file->wRefCount++;
wpage.wininfo = wi;
return WINHELP_CreateHelpWindow(&wpage, nCmdShow, TRUE);
@@ -698,7 +699,7 @@ BOOL WINHELP_CreateHelpWindowByOffset(HLPFILE* hlpfile, LONG lOffset,
{
WINHELP_WNDPAGE wpage;
- wpage.page = HLPFILE_PageByOffset(hlpfile, lOffset);
+ wpage.page = HLPFILE_PageByOffset(hlpfile, lOffset, &wpage.relative);
if (wpage.page) wpage.page->file->wRefCount++;
wpage.wininfo = wi;
return WINHELP_CreateHelpWindow(&wpage, nCmdShow, TRUE);
@@ -1020,7 +1021,7 @@ static LRESULT CALLBACK WINHELP_TextWndProc(HWND hWnd, UINT msg, WPARAM wParam,
case WM_WINDOWPOSCHANGED:
winpos = (WINDOWPOS*) lParam;
- if (!(winpos->flags & SWP_NOSIZE)) WINHELP_SetupText(hWnd);
+ if (!(winpos->flags & SWP_NOSIZE)) WINHELP_SetupText(hWnd, 0);
break;
case WM_MOUSEWHEEL:
@@ -1357,7 +1358,7 @@ static LRESULT CALLBACK WINHELP_ShadowWndProc(HWND hWnd, UINT msg, WPARAM wParam
*
* SetupText
*/
-static void WINHELP_SetupText(HWND hWnd)
+static void WINHELP_SetupText(HWND hWnd, ULONG relative)
{
HDC hDc = GetDC(hWnd);
RECT rect;
diff --git a/programs/winhelp/winhelp.h b/programs/winhelp/winhelp.h
index af75261..f8ff0c6 100644
--- a/programs/winhelp/winhelp.h
+++ b/programs/winhelp/winhelp.h
@@ -95,6 +95,7 @@ typedef struct
{
HLPFILE_PAGE* page;
HLPFILE_WINDOWINFO* wininfo;
+ ULONG relative;
} WINHELP_WNDPAGE;
typedef struct tagPageSet
More information about the wine-patches
mailing list