Module: wine Branch: master Commit: a4480365d7a5892990214a230a8c7147599e4274 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a4480365d7a5892990214a230a...
Author: Eric Pouech eric.pouech@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