winhelp: Added support for font scaling when using RichEdit.
authorEric Pouech <eric.pouech@orange.fr>
Thu, 1 May 2008 19:17:29 +0000 (21:17 +0200)
committerAlexandre Julliard <julliard@winehq.org>
Fri, 2 May 2008 09:24:04 +0000 (11:24 +0200)
programs/winhelp/En.rc
programs/winhelp/Fr.rc
programs/winhelp/hlpfile.c
programs/winhelp/hlpfile.h
programs/winhelp/winhelp.c
programs/winhelp/winhelp.h
programs/winhelp/winhelp_res.h

index 6dd621366607a14ee7f0332a56ce922a8fe126e9..40d61a26c8770213ee9211fafe37d0ec7d6adca2 100644 (file)
@@ -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
index 6696dcb86d1eaa448df4553018b1fe78b5d28021..0a19713dbc70535beac980846fa65abbe28efa3a 100644 (file)
@@ -82,3 +82,26 @@ STID_HELP_FILES_HLP,         "Fichiers d'aide (*.hlp)"
 STID_FILE_NOT_FOUND_s  "Impossible de trouver ��%s��. Souhaitez-vous rechercher ce fichier vous-m�me�?"
 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
index 69c8eda505b437cdbd92fed2f576d9e1d748c07b..d78fb26ca9425d865fbe6dbcb56008526bf16d47 100644 (file)
@@ -1289,7 +1289,13 @@ static BOOL HLPFILE_BrowseParagraph(HLPFILE_PAGE* page, struct RtfData* rd, BYTE
 
                     WINE_TRACE("Changing font to %d\n", font);
                     format += 3;
-                    fs = (4 * page->file->fonts[font].LogFont.lfHeight - 3) / 5;
+                    switch (rd->font_scale)
+                    {
+                    case 0: fs = (4 * page->file->fonts[font].LogFont.lfHeight - 13) / 5; break;
+                    default:
+                    case 1: fs = (4 * page->file->fonts[font].LogFont.lfHeight - 3) / 5; break;
+                    case 2: fs = (4 * page->file->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",
@@ -1499,7 +1505,7 @@ done:
  *             HLPFILE_BrowsePage
  *
  */
-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;
@@ -1513,6 +1519,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;
 
     switch (hlpfile->charset)
     {
index c37fa1c997e7e5baf5ad2bee2c9fbba00ff90b66..0f58c854649aab50e7759d56343c0195e0568002 100644 (file)
@@ -180,9 +180,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;     /* how to scale fonts */
     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);
index 83bc0a7513d294e8248fd99d753d2056ca027d9c..b7fcc21ffab69c3d17d8fc0998edf52c0efed592 100644 (file)
@@ -591,6 +591,7 @@ BOOL WINHELP_CreateHelpWindow(WINHELP_WNDPAGE* wpage, int nCmdShow, BOOL remembe
         win->lpszName = name;
         win->hHandCur = LoadCursorW(0, (LPWSTR)IDC_HAND);
         win->back.index = 0;
+        win->font_scale = 1;
     }
     win->page = wpage->page;
     win->info = wpage->wininfo;
@@ -665,6 +666,7 @@ BOOL WINHELP_CreateHelpWindow(WINHELP_WNDPAGE* wpage, int nCmdShow, BOOL remembe
         DWORD   mask = SendMessage(hTextWnd, EM_GETEVENTMASK, 0, 0);
         RECT    rect;
 
+        win->font_scale = Globals.active_win->font_scale;
         WINHELP_SetupText(hTextWnd, win, wpage->relative);
 
         /* we need the window to be shown for richedit to compute the size */
@@ -862,6 +864,40 @@ 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*) GetWindowLongPtr(hWnd, 0);
+            if (win->font_scale != 0)
+            {
+                win->font_scale = 0;
+                WINHELP_SetupText(GetDlgItem(hWnd, CTL_ID_TEXT), win, 0 /* FIXME */);
+            }
+            break;
+        case MNID_CTXT_FONTS_NORMAL:
+            win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
+            if (win->font_scale != 1)
+            {
+                win->font_scale = 1;
+                WINHELP_SetupText(GetDlgItem(hWnd, CTL_ID_TEXT), win, 0 /* FIXME */);
+            }
+            break;
+        case MNID_CTXT_FONTS_LARGE:
+            win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
+            if (win->font_scale != 2)
+            {
+                win->font_scale = 2;
+                WINHELP_SetupText(GetDlgItem(hWnd, CTL_ID_TEXT), win, 0 /* FIXME */);
+            }
+            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 */
             for (button = win->first_button; button; button = button->next)
@@ -934,8 +970,47 @@ static LRESULT CALLBACK WINHELP_MainWndProc(HWND hWnd, UINT msg, WPARAM wParam,
             case EN_MSGFILTER:
                 {
                     const MSGFILTER*    msgf = (const MSGFILTER*)lParam;
-                    return WINHELP_HandleTextMouse((WINHELP_WINDOW*)GetWindowLong(hWnd, 0),
-                                                   msgf->msg, msgf->lParam);
+                    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*)GetWindowLongPtr(hWnd, 0),
+                                                       msgf->msg, msgf->lParam);
+                    }
                 }
                 break;
 
@@ -994,7 +1069,7 @@ static void WINHELP_SetupText(HWND hTextWnd, WINHELP_WINDOW* win, ULONG relative
         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;
index cd4a2dfc15c4c55e485ce6f91d844d288e3fbe97..05555390042f44ce65181b7726ffdc2154a3ad94 100644 (file)
@@ -91,6 +91,7 @@ typedef struct tagWinHelp
     HLPFILE_LINK*       current_link;
 
     WINHELP_PAGESET     back;
+    unsigned            font_scale; /* 0 = small, 1 = normal, 2 = large */
 
     struct tagWinHelp*  next;
 } WINHELP_WINDOW;
index 89c3c4c4ddf9589d963fcee69b70fcc83bb19214..3450859664e9c70b516edfd831be3f6296cb5aff 100644 (file)
 #define MNID_HELP_ABOUT         0x141
 #define MNID_HELP_WINE          0x142
 
-#define MAIN_MENU              0x10F
+#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              0xF000
+#define CONTEXT_MENU            0xF001
 
 #define STID_WINE_HELP         0x120
 #define STID_WHERROR           0x121