[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