[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