[PATCH 44/45] [WinHelp]: now allowing to get relative offset of in a page
Eric Pouech
eric.pouech at orange.fr
Sun Mar 23 04:21:58 CDT 2008
- we're only storing the relative offset in WNDPAGE for now
A+
---
programs/winhelp/hlpfile.c | 35 ++++++++++++++++++-----------------
programs/winhelp/hlpfile.h | 8 ++++----
programs/winhelp/macro.c | 4 ++--
programs/winhelp/winhelp.c | 22 +++++++++++-----------
programs/winhelp/winhelp.h | 1 +
5 files changed, 36 insertions(+), 34 deletions(-)
diff --git a/programs/winhelp/hlpfile.c b/programs/winhelp/hlpfile.c
index d2e8434..d5bf229 100644
--- a/programs/winhelp/hlpfile.c
+++ b/programs/winhelp/hlpfile.c
@@ -87,21 +87,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;
@@ -116,7 +107,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",
@@ -147,7 +141,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;
@@ -157,7 +151,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, (void*)lHash, comp_PageByHash);
if (!ptr)
@@ -166,14 +163,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;
@@ -184,7 +181,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);
@@ -195,14 +192,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 668ca28..8dd58a5 100644
--- a/programs/winhelp/hlpfile.h
+++ b/programs/winhelp/hlpfile.h
@@ -149,10 +149,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_FreeHlpFile(HLPFILE*);
unsigned HLPFILE_HalfPointsToTwips(unsigned pts);
diff --git a/programs/winhelp/macro.c b/programs/winhelp/macro.c
index 877d33f..374a054 100644
--- a/programs/winhelp/macro.c
+++ b/programs/winhelp/macro.c
@@ -694,7 +694,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++;
@@ -734,7 +734,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 6918ecf..9c59609 100644
--- a/programs/winhelp/winhelp.c
+++ b/programs/winhelp/winhelp.c
@@ -51,7 +51,7 @@ static BOOL WINHELP_CheckPopup(HWND, UINT, WPARAM, LPARAM, LRESULT*);
static void WINHELP_DeleteWindow(WINHELP_WINDOW*);
static void WINHELP_DeleteButtons(WINHELP_WINDOW* win);
static void WINHELP_DeletePageLinks(WINHELP_WINDOW* win);
-static void WINHELP_FillRichEdit(HWND hText, WINHELP_WINDOW *win);
+static void WINHELP_FillRichEdit(HWND hText, WINHELP_WINDOW *win, ULONG relative);
WINHELP_GLOBALS Globals = {3, NULL, TRUE, NULL, NULL, NULL, NULL, NULL, {{{NULL,NULL}},0}};
@@ -651,7 +651,7 @@ BOOL WINHELP_CreateHelpWindow(WINHELP_WNDPAGE* wpage, int nCmdShow)
RECT rect;
win->font_scale = Globals.active_win->font_scale;
- WINHELP_FillRichEdit(hTextWnd, win);
+ WINHELP_FillRichEdit(hTextWnd, win, wpage->relative);
/* we need the window to be shown for richedit to compute the size */
ShowWindow(win->hMainWnd, nCmdShow);
@@ -679,7 +679,7 @@ BOOL WINHELP_CreateHelpWindow(WINHELP_WNDPAGE* wpage, int nCmdShow)
SetClassLongPtrW(win->hMainWnd, GCL_HICON, icon);
WINHELP_LayoutMainWindow(win);
- WINHELP_FillRichEdit(GetDlgItem(win->hMainWnd, CTL_ID_TEXT), win);
+ WINHELP_FillRichEdit(GetDlgItem(win->hMainWnd, CTL_ID_TEXT), win, wpage->relative);
ShowWindow(win->hMainWnd, nCmdShow);
}
@@ -697,8 +697,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);
@@ -713,7 +713,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);
@@ -728,7 +728,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);
@@ -893,7 +893,7 @@ static LRESULT CALLBACK WINHELP_MainWndProc(HWND hWnd, UINT msg, WPARAM wParam,
if (win->font_scale != 0)
{
win->font_scale = 0;
- WINHELP_FillRichEdit(GetDlgItem(hWnd, CTL_ID_TEXT), win);
+ WINHELP_FillRichEdit(GetDlgItem(hWnd, CTL_ID_TEXT), win, 0);
}
break;
case MNID_CTXT_FONTS_NORMAL:
@@ -901,7 +901,7 @@ static LRESULT CALLBACK WINHELP_MainWndProc(HWND hWnd, UINT msg, WPARAM wParam,
if (win->font_scale != 1)
{
win->font_scale = 1;
- WINHELP_FillRichEdit(GetDlgItem(hWnd, CTL_ID_TEXT), win);
+ WINHELP_FillRichEdit(GetDlgItem(hWnd, CTL_ID_TEXT), win, 0);
}
break;
case MNID_CTXT_FONTS_LARGE:
@@ -909,7 +909,7 @@ static LRESULT CALLBACK WINHELP_MainWndProc(HWND hWnd, UINT msg, WPARAM wParam,
if (win->font_scale != 2)
{
win->font_scale = 2;
- WINHELP_FillRichEdit(GetDlgItem(hWnd, CTL_ID_TEXT), win);
+ WINHELP_FillRichEdit(GetDlgItem(hWnd, CTL_ID_TEXT), win, 0);
}
break;
case MNID_CTXT_HELP_DEFAULT:
@@ -1043,7 +1043,7 @@ static DWORD CALLBACK WINHELP_RtfStreamIn(DWORD_PTR cookie, BYTE* buff,
return 0;
}
-static void WINHELP_FillRichEdit(HWND hTextWnd, WINHELP_WINDOW *win)
+static void WINHELP_FillRichEdit(HWND hTextWnd, WINHELP_WINDOW *win, ULONG relative)
{
SendMessage(hTextWnd, WM_SETREDRAW, FALSE, 0);
SendMessage(hTextWnd, EM_SETBKGNDCOLOR, 0, (LPARAM)win->info->sr_color);
diff --git a/programs/winhelp/winhelp.h b/programs/winhelp/winhelp.h
index 7c60778..6e357f4 100644
--- a/programs/winhelp/winhelp.h
+++ b/programs/winhelp/winhelp.h
@@ -59,6 +59,7 @@ typedef struct
{
HLPFILE_PAGE* page;
HLPFILE_WINDOWINFO* wininfo;
+ ULONG relative; /* relative offset to be displayed when page is opened */
} WINHELP_WNDPAGE;
typedef struct tagPageSet
More information about the wine-patches
mailing list