[PATCH 38/45] [WinHelp]: implemented the zoom option thanks the richedit control
Eric Pouech
eric.pouech at orange.fr
Sun Mar 23 04:21:17 CDT 2008
A+
---
programs/winhelp/En.rc | 23 +++++++++++
programs/winhelp/Fr.rc | 23 +++++++++++
programs/winhelp/hlpfile.c | 17 ++++++--
programs/winhelp/hlpfile.h | 3 +
programs/winhelp/winhelp.c | 84 +++++++++++++++++++++++++++++++++++++---
programs/winhelp/winhelp.h | 1
programs/winhelp/winhelp_res.h | 12 ++++++
7 files changed, 152 insertions(+), 11 deletions(-)
diff --git a/programs/winhelp/En.rc b/programs/winhelp/En.rc
index 6dd6213..b265f78 100644
--- a/programs/winhelp/En.rc
+++ b/programs/winhelp/En.rc
@@ -79,3 +79,26 @@ STID_HELP_FILES_HLP, "Help files (*.hlp)"
STID_FILE_NOT_FOUND_s "Cannot find '%s'. Do you want to find this file yourself?"
STID_NO_RICHEDIT "Cannot find a richedit implementation... Aborting"
}
+
+CONTEXT_MENU MENU LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Annotation...", MNID_CTXT_ANNOTATE
+ MENUITEM "Copy", MNID_CTXT_COPY
+ MENUITEM "Print...", MNID_CTXT_PRINT
+ POPUP "Fonts"
+ BEGIN
+ MENUITEM "Small", MNID_CTXT_FONTS_SMALL
+ MENUITEM "Normal", MNID_CTXT_FONTS_NORMAL
+ MENUITEM "Large", MNID_CTXT_FONTS_LARGE
+ END
+ POPUP "Help always visible"
+ BEGIN
+ MENUITEM "Default", MNID_CTXT_HELP_DEFAULT
+ MENUITEM "Visible", MNID_CTXT_HELP_VISIBLE
+ MENUITEM "Non visible", MNID_CTXT_HELP_NONVISIBLE
+ END
+ MENUITEM "Use system colors", MNID_CTXT_SYSTEM_COLORS
+ END
+END
diff --git a/programs/winhelp/Fr.rc b/programs/winhelp/Fr.rc
index 4ce11fe..a2fa042 100644
--- a/programs/winhelp/Fr.rc
+++ b/programs/winhelp/Fr.rc
@@ -71,3 +71,26 @@ STID_HELP_FILES_HLP, "Fichiers d'aide (*.hlp)"
STID_FILE_NOT_FOUND_s "Cannot find '%s'. Do you want to find this file yourself?"
STID_NO_RICHEDIT "La bibliothèque RichEdit n'a pu être localisée... Abandon"
}
+
+CONTEXT_MENU MENU
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Annotation...", MNID_CTXT_ANNOTATE
+ MENUITEM "Copier", MNID_CTXT_COPY
+ MENUITEM "Imprimer la rubrique...", MNID_CTXT_PRINT
+ POPUP "Polices"
+ BEGIN
+ MENUITEM "Petite", MNID_CTXT_FONTS_SMALL
+ MENUITEM "Normale", MNID_CTXT_FONTS_NORMAL
+ MENUITEM "Grande", MNID_CTXT_FONTS_LARGE
+ END
+ POPUP "Aide toujours visible"
+ BEGIN
+ MENUITEM "Par défaut", MNID_CTXT_HELP_DEFAULT
+ MENUITEM "Visible", MNID_CTXT_HELP_VISIBLE
+ MENUITEM "Non visible", MNID_CTXT_HELP_NONVISIBLE
+ END
+ MENUITEM "Utiliser les couleurs système", MNID_CTXT_SYSTEM_COLORS
+ END
+END
diff --git a/programs/winhelp/hlpfile.c b/programs/winhelp/hlpfile.c
index 66f9347..06c061d 100644
--- a/programs/winhelp/hlpfile.c
+++ b/programs/winhelp/hlpfile.c
@@ -1264,10 +1264,18 @@ BOOL HLPFILE_BrowseParagraph(HLPFILE *hlpfile, struct RtfData* rd, BYTE *buf, BY
case 0x80:
{
unsigned font = GET_USHORT(format, 1);
+ unsigned fs;
+
+ switch (rd->font_scale)
+ {
+ case 0: fs = (4 * hlpfile->fonts[font].LogFont.lfHeight - 13) / 5; break;
+ default:
+ case 1: fs = (4 * hlpfile->fonts[font].LogFont.lfHeight - 3) / 5; break;
+ case 2: fs = (4 * hlpfile->fonts[font].LogFont.lfHeight + 17) / 5; break;
+ }
/* FIXME: missing at least colors, also bold attribute looses information */
sprintf(tmp, "\\f%d\\cf%d\\fs%d%s%s%s%s",
- font, font + 2,
- -2 * hlpfile->fonts[font].LogFont.lfHeight,
+ font, font + 2, fs,
hlpfile->fonts[font].LogFont.lfWeight > 400 ? "\\b" : "\\b0",
hlpfile->fonts[font].LogFont.lfItalic ? "\\i" : "\\i0",
hlpfile->fonts[font].LogFont.lfUnderline ? "\\ul" : "\\ul0",
@@ -1461,7 +1469,7 @@ done:
return ret;
}
-BOOL HLPFILE_BrowsePage(HLPFILE_PAGE* page, struct RtfData* rd)
+BOOL HLPFILE_BrowsePage(HLPFILE_PAGE* page, struct RtfData* rd, unsigned font_scale)
{
HLPFILE *hlpfile = page->file;
BYTE *buf, *end;
@@ -1474,6 +1482,7 @@ BOOL HLPFILE_BrowsePage(HLPFILE_PAGE* page, struct RtfData* rd)
rd->char_pos = 0;
rd->first_link = rd->current_link = NULL;
rd->force_color = FALSE;
+ rd->font_scale = font_scale;
if (!HLPFILE_RtfAddControl(rd, "{\\rtf1\\ansi\\ansicpg1252\\deff0")) return FALSE;
/* generate font table */
@@ -1612,7 +1621,7 @@ static BOOL HLPFILE_ReadFont(HLPFILE* hlpfile)
flag = ref[dscr_offset + i * 11 + 0];
family = ref[dscr_offset + i * 11 + 2];
- hlpfile->fonts[i].LogFont.lfHeight = -ref[dscr_offset + i * 11 + 1] / 2 - 3;
+ hlpfile->fonts[i].LogFont.lfHeight = ref[dscr_offset + i * 11 + 1];
hlpfile->fonts[i].LogFont.lfWidth = 0;
hlpfile->fonts[i].LogFont.lfEscapement = 0;
hlpfile->fonts[i].LogFont.lfOrientation = 0;
diff --git a/programs/winhelp/hlpfile.h b/programs/winhelp/hlpfile.h
index 9a737d8..50b9076 100644
--- a/programs/winhelp/hlpfile.h
+++ b/programs/winhelp/hlpfile.h
@@ -170,9 +170,10 @@ struct RtfData {
unsigned allocated; /* overall allocated size */
unsigned char_pos; /* current char position (in richedit) */
char* where; /* pointer to feed back richedit */
+ unsigned font_scale;
HLPFILE_LINK*first_link;
HLPFILE_LINK*current_link;
BOOL force_color;
};
-BOOL HLPFILE_BrowsePage(HLPFILE_PAGE*, struct RtfData* rd);
+BOOL HLPFILE_BrowsePage(HLPFILE_PAGE*, struct RtfData* rd, unsigned font_scale);
diff --git a/programs/winhelp/winhelp.c b/programs/winhelp/winhelp.c
index 78cde45..8335360 100644
--- a/programs/winhelp/winhelp.c
+++ b/programs/winhelp/winhelp.c
@@ -571,6 +571,7 @@ BOOL WINHELP_CreateHelpWindow(WINHELP_WNDPAGE* wpage, int nCmdShow)
win->lpszName = name;
win->hHandCur = LoadCursorW(0, (LPWSTR)IDC_HAND);
win->back.index = 0;
+ win->font_scale = 1;
}
win->page = wpage->page;
@@ -643,6 +644,7 @@ BOOL WINHELP_CreateHelpWindow(WINHELP_WNDPAGE* wpage, int nCmdShow)
DWORD mask = SendMessage(hTextWnd, EM_GETEVENTMASK, 0, 0);
RECT rect;
+ win->font_scale = Globals.active_win->font_scale;
WINHELP_FillRichEdit(hTextWnd, win);
/* we need the window to be shown for richedit to compute the size */
@@ -847,7 +849,6 @@ static LRESULT CALLBACK WINHELP_MainWndProc(HWND hWnd, UINT msg, WPARAM wParam,
break;
case WM_COMMAND:
- win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
switch (wParam)
{
/* Menu FILE */
@@ -869,8 +870,42 @@ static LRESULT CALLBACK WINHELP_MainWndProc(HWND hWnd, UINT msg, WPARAM wParam,
case MNID_HELP_ABOUT: MACRO_About(); break;
case MNID_HELP_WINE: ShellAbout(hWnd, "WINE", "Help", 0); break;
+ /* Context help */
+ case MNID_CTXT_ANNOTATE:MACRO_Annotate(); break;
+ case MNID_CTXT_COPY: MACRO_CopyDialog(); break;
+ case MNID_CTXT_PRINT: MACRO_Print(); break;
+ case MNID_CTXT_FONTS_SMALL:
+ win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
+ if (win->font_scale != 0)
+ {
+ win->font_scale = 0;
+ WINHELP_FillRichEdit(GetDlgItem(hWnd, CTL_ID_TEXT), win);
+ }
+ break;
+ case MNID_CTXT_FONTS_NORMAL:
+ win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
+ if (win->font_scale != 1)
+ {
+ win->font_scale = 1;
+ WINHELP_FillRichEdit(GetDlgItem(hWnd, CTL_ID_TEXT), win);
+ }
+ break;
+ case MNID_CTXT_FONTS_LARGE:
+ win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
+ if (win->font_scale != 2)
+ {
+ win->font_scale = 2;
+ WINHELP_FillRichEdit(GetDlgItem(hWnd, CTL_ID_TEXT), win);
+ }
+ break;
+ case MNID_CTXT_HELP_DEFAULT:
+ case MNID_CTXT_HELP_VISIBLE:
+ case MNID_CTXT_HELP_NONVISIBLE:
+ case MNID_CTXT_SYSTEM_COLORS:
+ /* FIXME: NIY */
default:
/* Buttons */
+ win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
for (button = win->first_button; button; button = button->next)
if (wParam == button->wParam) break;
if (button)
@@ -903,12 +938,50 @@ static LRESULT CALLBACK WINHELP_MainWndProc(HWND hWnd, UINT msg, WPARAM wParam,
{
case EN_MSGFILTER:
msgf = (MSGFILTER*)lParam;
- if (msgf->msg == WM_KEYUP && msgf->wParam == VK_ESCAPE)
- DestroyWindow(hWnd);
- else
+ switch (msgf->msg)
+ {
+ case WM_KEYUP:
+ if (msgf->wParam == VK_ESCAPE) DestroyWindow(hWnd);
+ break;
+ case WM_RBUTTONDOWN:
+ {
+ HMENU hMenu;
+ POINT pt;
+
+ win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
+ hMenu = LoadMenu(Globals.hInstance, (LPSTR)CONTEXT_MENU);
+ switch (win->font_scale)
+ {
+ case 0:
+ CheckMenuItem(hMenu, MNID_CTXT_FONTS_SMALL,
+ MF_BYCOMMAND|MF_CHECKED);
+ break;
+ default:
+ WINE_FIXME("Unsupported %d\n", win->font_scale);
+ case 1:
+ CheckMenuItem(hMenu, MNID_CTXT_FONTS_NORMAL,
+ MF_BYCOMMAND|MF_CHECKED);
+ break;
+ case 2:
+ CheckMenuItem(hMenu, MNID_CTXT_FONTS_LARGE,
+ MF_BYCOMMAND|MF_CHECKED);
+ break;
+ }
+ pt.x = (int)(short)LOWORD(msgf->lParam);
+ pt.y = (int)(short)HIWORD(msgf->lParam);
+ ClientToScreen(hWnd, &pt);
+ TrackPopupMenu(GetSubMenu(hMenu, 0), TPM_LEFTALIGN|TPM_TOPALIGN,
+ pt.x, pt.y, 0, hWnd, NULL);
+ DestroyMenu(hMenu);
+ }
+ break;
+ default:
return WINHELP_HandleTextMouse((WINHELP_WINDOW*)GetWindowLong(hWnd, 0),
(const MSGFILTER*)lParam);
+ break;
+ }
return FALSE;
+
case EN_REQUESTRESIZE:
rc = ((REQRESIZE*)lParam)->rc;
win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
@@ -922,7 +995,6 @@ static LRESULT CALLBACK WINHELP_MainWndProc(HWND hWnd, UINT msg, WPARAM wParam,
}
}
break;
-
case WM_NCDESTROY:
{
BOOL bExit;
@@ -968,7 +1040,7 @@ static void WINHELP_FillRichEdit(HWND hTextWnd, WINHELP_WINDOW *win)
struct RtfData rd;
EDITSTREAM es;
- if (HLPFILE_BrowsePage(win->page, &rd))
+ if (HLPFILE_BrowsePage(win->page, &rd, win->font_scale))
{
rd.where = rd.data;
es.dwCookie = (DWORD_PTR)&rd;
diff --git a/programs/winhelp/winhelp.h b/programs/winhelp/winhelp.h
index ee13d30..7c60778 100644
--- a/programs/winhelp/winhelp.h
+++ b/programs/winhelp/winhelp.h
@@ -87,6 +87,7 @@ typedef struct tagWinHelp
WINHELP_PAGESET back;
+ unsigned font_scale; /* 0 = small, 1 = normal, 2 = large */
struct tagWinHelp* next;
} WINHELP_WINDOW;
diff --git a/programs/winhelp/winhelp_res.h b/programs/winhelp/winhelp_res.h
index 89c3c4c..b170e50 100644
--- a/programs/winhelp/winhelp_res.h
+++ b/programs/winhelp/winhelp_res.h
@@ -13,7 +13,19 @@
#define MNID_HELP_ABOUT 0x141
#define MNID_HELP_WINE 0x142
+#define MNID_CTXT_ANNOTATE 0x200
+#define MNID_CTXT_COPY 0x201
+#define MNID_CTXT_PRINT 0x202
+#define MNID_CTXT_FONTS_SMALL 0x210
+#define MNID_CTXT_FONTS_NORMAL 0x211
+#define MNID_CTXT_FONTS_LARGE 0x212
+#define MNID_CTXT_HELP_DEFAULT 0x220
+#define MNID_CTXT_HELP_VISIBLE 0x221
+#define MNID_CTXT_HELP_NONVISIBLE 0x222
+#define MNID_CTXT_SYSTEM_COLORS 0x230
+
#define MAIN_MENU 0x10F
+#define CONTEXT_MENU 0x1F0
#define STID_WINE_HELP 0x120
#define STID_WHERROR 0x121
More information about the wine-patches
mailing list