Eric Pouech : winhelp: Added ability to locate information within a page ( and to store it inside WNDPAGE).

Alexandre Julliard julliard at winehq.org
Wed Apr 23 07:59:32 CDT 2008


Module: wine
Branch: master
Commit: a4480365d7a5892990214a230a8c7147599e4274
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a4480365d7a5892990214a230a8c7147599e4274

Author: Eric Pouech <eric.pouech at orange.fr>
Date:   Tue Apr 22 22:00:56 2008 +0200

winhelp: Added ability to locate information within a page (and to store it inside WNDPAGE).

---

 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 92a22df..30c678d 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 bb9ea75..60362d0 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}};
@@ -560,7 +560,8 @@ BOOL WINHELP_CreateHelpWindow(WINHELP_WNDPAGE* wpage, int nCmdShow, BOOL remembe
 
                 win->page = wpage->page;
                 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);
                 if (win->hHistoryWnd) InvalidateRect(win->hHistoryWnd, NULL, TRUE);
                 break;
@@ -669,8 +670,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);
@@ -685,7 +686,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);
@@ -700,7 +701,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);
@@ -1022,7 +1023,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:
@@ -1359,7 +1360,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-cvs mailing list