Module: wine Branch: master Commit: d72cfb73424ffbb21cd72c4e56e3336e7048419c URL: http://source.winehq.org/git/wine.git/?a=commit;h=d72cfb73424ffbb21cd72c4e56...
Author: Kirill K. Smirnov lich@math.spbu.ru Date: Thu Dec 13 00:56:18 2007 +0300
winhelp: Display keywords index dialog box.
---
programs/winhelp/En.rc | 10 +++ programs/winhelp/Ru.rc | 10 +++ programs/winhelp/macro.c | 2 +- programs/winhelp/rsrc.rc | 1 + programs/winhelp/winhelp.c | 146 ++++++++++++++++++++++++++++++++++++++++ programs/winhelp/winhelp.h | 2 + programs/winhelp/winhelp_res.h | 3 + 7 files changed, 173 insertions(+), 1 deletions(-)
diff --git a/programs/winhelp/En.rc b/programs/winhelp/En.rc index 8c4bac2..464b185 100644 --- a/programs/winhelp/En.rc +++ b/programs/winhelp/En.rc @@ -50,6 +50,16 @@ MAIN_MENU MENU LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT } }
+IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 8, "MS Shell Dlg" +CAPTION "Index" +{ + LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER + PUSHBUTTON "&OK", IDOK, 40, 170, 50, 12 + PUSHBUTTON "&Cancel", IDCANCEL, 120, 170, 50, 12 +} + /* Strings */ STRINGTABLE DISCARDABLE LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT { diff --git a/programs/winhelp/Ru.rc b/programs/winhelp/Ru.rc index c07a743..4767d06 100644 --- a/programs/winhelp/Ru.rc +++ b/programs/winhelp/Ru.rc @@ -49,6 +49,16 @@ MAIN_MENU MENU LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT } }
+IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 8, "MS Shell Dlg" +CAPTION "���������" +{ + LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER + PUSHBUTTON "&OK", IDOK, 40, 170, 50, 12 + PUSHBUTTON "&������", IDCANCEL, 120, 170, 50, 12 +} + /* Strings */ STRINGTABLE DISCARDABLE LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT { diff --git a/programs/winhelp/macro.c b/programs/winhelp/macro.c index c658bf6..68863bf 100644 --- a/programs/winhelp/macro.c +++ b/programs/winhelp/macro.c @@ -523,7 +523,7 @@ void CALLBACK MACRO_Find(void)
void CALLBACK MACRO_Finder(void) { - WINE_FIXME("()\n"); + WINHELP_CreateIndexWindow(); }
void CALLBACK MACRO_FloatingMenu(void) diff --git a/programs/winhelp/rsrc.rc b/programs/winhelp/rsrc.rc index 3670d48..8109916 100644 --- a/programs/winhelp/rsrc.rc +++ b/programs/winhelp/rsrc.rc @@ -20,6 +20,7 @@ */
#include <windef.h> +#include <winuser.h>
#include "winhelp.h" #include "winhelp_res.h" diff --git a/programs/winhelp/winhelp.c b/programs/winhelp/winhelp.c index 83c6517..f769153 100644 --- a/programs/winhelp/winhelp.c +++ b/programs/winhelp/winhelp.c @@ -672,6 +672,20 @@ BOOL WINHELP_CreateHelpWindowByMap(HLPFILE* hlpfile, LONG lMap,
/*********************************************************************** * + * WINHELP_CreateHelpWindowByOffset + */ +BOOL WINHELP_CreateHelpWindowByOffset(HLPFILE* hlpfile, LONG lOffset, + HLPFILE_WINDOWINFO* wi, int nCmdShow) +{ + HLPFILE_PAGE* page = NULL; + + page = HLPFILE_PageByOffset(hlpfile, lOffset); + if (page) page->file->wRefCount++; + return WINHELP_CreateHelpWindow(page, wi, nCmdShow); +} + +/*********************************************************************** + * * WINHELP_MainWndProc */ static LRESULT CALLBACK WINHELP_MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) @@ -1933,3 +1947,135 @@ WINHELP_LINE_PART* WINHELP_IsOverLink(WINHELP_WINDOW* win, WPARAM wParam, LPARAM
return NULL; } + +/************************************************************************** + * cb_KWBTree + * + * HLPFILE_BPTreeCallback enumeration function for '|KWBTREE' internal file. + * + */ +static void cb_KWBTree(void *p, void **next, void *cookie) +{ + HWND hListWnd = (HWND)cookie; + + WINE_TRACE("Adding '%s' to search list\n", (char *)p); + SendMessage(hListWnd, LB_INSERTSTRING, -1, (LPARAM)p); + *next = (char*)p + strlen((char*)p) + 7; +} + +/************************************************************************** + * comp_KWBTREE + * + * HLPFILE_BPTreeCompare function for '|KWBTREE' internal file. + * + */ +static int comp_KWBTree(void *p, const void *key, + int leaf, void** next) +{ + WINE_TRACE("comparing key '%s' with '%s'\n", (char *)p, (char *)key); + *next = (char*)p+strlen(p)+1+(leaf?6:2); + /* unlike directory, index is case insensitive */ + return lstrcmpi(p, key); +} + +/************************************************************************** + * WINHELP_IndexDlgProc + * + * Index dialog callback function. + * + */ +INT_PTR CALLBACK WINHELP_SearchDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + static HLPFILE *file; + int sel; + ULONG offset = 1; + + switch (msg) + { + case WM_INITDIALOG: + file = (HLPFILE *)lParam; + HLPFILE_BPTreeEnum(file->kwbtree, cb_KWBTree, + GetDlgItem(hWnd, IDC_INDEXLIST)); + return TRUE; + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDOK: + sel = SendDlgItemMessage(hWnd, IDC_INDEXLIST, LB_GETCURSEL, 0, 0); + if (sel != LB_ERR) + { + char buf[500]; /* enough */ + BYTE *p; + int count; + + SendDlgItemMessage(hWnd, IDC_INDEXLIST, LB_GETTEXT, + sel, (LPARAM)buf); + p = HLPFILE_BPTreeSearch(file->kwbtree, buf, comp_KWBTree); + if (p == NULL) + { + /* + * TODO: + * This may happen if help file uses other locale than + * system. We should honour charset provided in help file + * and use UNICODE, but for now current implementation is + * acceptable (almost all help files use ANSI). + */ + WINE_FIXME("item '%s' not found, locale mismatch???\n", buf); + return TRUE; + } + count = *(short*)((char *)p + strlen((char *)p) + 1); + if (count > 1) + { + MessageBox(hWnd, "count > 1 not supported yet", "Error", MB_OK | MB_ICONSTOP); + return TRUE; + } + offset = *(ULONG*)((char *)p + strlen((char *)p) + 3); + offset = *(long*)(file->kwdata + offset + 9); + if (offset == 0xFFFFFFFF) + { + MessageBox(hWnd, "macro keywords not supported yet", "Error", MB_OK | MB_ICONSTOP); + return TRUE; + } + } + /* Fall through */ + case IDCANCEL: + EndDialog(hWnd, offset); + return TRUE; + default: + break; + } + default: + break; + } + return FALSE; +} + +/************************************************************************** + * WINHELP_CreateIndexWindow + * + * Displays a dialog with keywords of current help file. + * + */ +BOOL WINHELP_CreateIndexWindow(void) +{ + int ret; + HLPFILE *hlpfile; + + if (Globals.active_win && Globals.active_win->page && Globals.active_win->page->file) + hlpfile = Globals.active_win->page->file; + else + return FALSE; + + if (hlpfile->kwbtree == NULL) + { + WINE_TRACE("No index provided\n"); + return FALSE; + } + + ret = DialogBoxParam(Globals.hInstance, MAKEINTRESOURCE(IDD_INDEX), + Globals.active_win->hMainWnd, WINHELP_SearchDlgProc, + (LPARAM)hlpfile); + if (ret > 1) + WINHELP_CreateHelpWindowByOffset(hlpfile, ret, Globals.active_win->info, SW_NORMAL); + return TRUE; +} diff --git a/programs/winhelp/winhelp.h b/programs/winhelp/winhelp.h index 24eb10f..abe68ea 100644 --- a/programs/winhelp/winhelp.h +++ b/programs/winhelp/winhelp.h @@ -172,8 +172,10 @@ extern FARPROC Callbacks[];
BOOL WINHELP_CreateHelpWindowByHash(HLPFILE*, LONG, HLPFILE_WINDOWINFO*, int); BOOL WINHELP_CreateHelpWindowByMap(HLPFILE*, LONG, HLPFILE_WINDOWINFO*, int); +BOOL WINHELP_CreateHelpWindowByOffset(HLPFILE*, LONG, HLPFILE_WINDOWINFO*, int); BOOL WINHELP_CreateHelpWindow(HLPFILE_PAGE*, HLPFILE_WINDOWINFO*, int); BOOL WINHELP_GetOpenFileName(LPSTR, int); +BOOL WINHELP_CreateIndexWindow(void); INT WINHELP_MessageBoxIDS(UINT, UINT, WORD); INT WINHELP_MessageBoxIDS_s(UINT, LPCSTR, UINT, WORD); HLPFILE* WINHELP_LookupHelpFile(LPCSTR lpszFile); diff --git a/programs/winhelp/winhelp_res.h b/programs/winhelp/winhelp_res.h index a6e46f1..14ec13f 100644 --- a/programs/winhelp/winhelp_res.h +++ b/programs/winhelp/winhelp_res.h @@ -30,3 +30,6 @@ #define STID_HELP_FILES_HLP 0x12C #define STID_DIALOG_TEST 0x12D #define STID_FILE_NOT_FOUND_s 0x12E + +#define IDD_INDEX 0x150 +#define IDC_INDEXLIST 0x151