[CALC] Add support for HTML-Help. CORE-15019
authorCarlo-Bramini <carlo_bramini@users.sourceforge.net>
Mon, 6 Aug 2018 18:22:36 +0000 (20:22 +0200)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Mon, 18 Mar 2019 00:34:01 +0000 (01:34 +0100)
base/applications/calc/CMakeLists.txt
base/applications/calc/calc.h
base/applications/calc/htmlhelp.c [new file with mode: 0644]
base/applications/calc/winmain.c

index a92c7c3..ffe0ee3 100644 (file)
@@ -7,6 +7,7 @@ list(APPEND SOURCE
     rpn_ieee.c
     utl_ieee.c
     winmain.c
+    htmlhelp.c
     calc.h)
 
 file(GLOB calc_rc_deps res/*.*)
index afbc813..db984f0 100644 (file)
 
 #define MAX_CALC_SIZE       256
 
+/* HTMLHELP SUPPORT */
+typedef HWND (WINAPI* type_HtmlHelpA)(HWND, LPCSTR, UINT, DWORD);
+typedef HWND (WINAPI* type_HtmlHelpW)(HWND, LPCWSTR, UINT, DWORD);
+
+extern type_HtmlHelpA calc_HtmlHelpA;
+extern type_HtmlHelpW calc_HtmlHelpW;
+
+#ifndef UNICODE
+#define calc_HtmlHelp   calc_HtmlHelpA
+#else
+#define calc_HtmlHelp   calc_HtmlHelpW
+#endif
+
+void HtmlHelp_Start(HINSTANCE hInstance);
+void HtmlHelp_Stop(void);
+
 /*#define USE_KEYBOARD_HOOK*/
 
 #define SIZEOF(_ar)     (sizeof(_ar)/sizeof(_ar[1]))
diff --git a/base/applications/calc/htmlhelp.c b/base/applications/calc/htmlhelp.c
new file mode 100644 (file)
index 0000000..a306ae4
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * ReactOS Calc (HtmlHelp support)
+ *
+ * Copyright 2007-2017, Carlo Bramini
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include "calc.h"
+
+#define GET_CB(name) \
+    calc_##name = (type_##name)GetProcAddress(hHtmlHelp, #name); \
+    if (calc_##name == NULL) calc_##name = dummy_##name;
+
+static HWND WINAPI
+dummy_HtmlHelpA(HWND hWnd, LPCSTR pszFile, UINT uCommand, DWORD dwData);
+
+static HWND WINAPI
+dummy_HtmlHelpW(HWND hWnd, LPCWSTR pszFile, UINT uCommand, DWORD dwData);
+
+type_HtmlHelpA calc_HtmlHelpA = dummy_HtmlHelpA;
+type_HtmlHelpW calc_HtmlHelpW = dummy_HtmlHelpW;
+
+static HMODULE hHtmlHelp;
+
+static HWND WINAPI
+dummy_HtmlHelpA(HWND hWnd, LPCSTR pszFile, UINT uCommand, DWORD dwData)
+{
+    return NULL;
+}
+
+static HWND WINAPI
+dummy_HtmlHelpW(HWND hWnd, LPCWSTR pszFile, UINT uCommand, DWORD dwData)
+{
+    return NULL;
+}
+
+void HtmlHelp_Start(HINSTANCE hInstance)
+{
+    hHtmlHelp = LoadLibrary(_T("HTMLHELP"));
+    if (hHtmlHelp == NULL)
+        return;
+
+    GET_CB(HtmlHelpW)
+    GET_CB(HtmlHelpA)
+}
+
+void HtmlHelp_Stop(void)
+{
+    if(hHtmlHelp == NULL)
+        return;
+
+    FreeLibrary(hHtmlHelp);
+    hHtmlHelp = NULL;
+}
index ad9b576..696e3ee 100644 (file)
@@ -20,7 +20,7 @@
 
 #include "calc.h"
 
-#define HTMLHELP_PATH(_pt)  TEXT("%systemroot%\\Help\\calc.chm::") TEXT(_pt)
+#define HTMLHELP_PATH(_pt)  _T("%systemroot%\\Help\\calc.chm::") _T(_pt)
 
 #define MAKE_BITMASK4(_show_b16, _show_b10, _show_b8, _show_b2) \
     (((_show_b2)  << 0) | \
@@ -1181,7 +1181,7 @@ static void handle_context_menu(HWND hWnd, WPARAM wp, LPARAM lp)
         popup.rcMargins.left   = -1;
         popup.rcMargins.right  = -1;
         popup.idString = GetWindowLongPtr((HWND)wp, GWL_ID);
-        HtmlHelp((HWND)wp, HTMLHELP_PATH("/popups.txt"), HH_DISPLAY_TEXT_POPUP, (DWORD_PTR)&popup);
+        calc_HtmlHelp((HWND)wp, HTMLHELP_PATH("/popups.txt"), HH_DISPLAY_TEXT_POPUP, (DWORD_PTR)&popup);
     }
 #else
     (void)idm;
@@ -1272,8 +1272,9 @@ static INT_PTR CALLBACK DlgMainProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
         return SubclassButtonProc(hWnd, wp, lp);
 
     case WM_INITDIALOG:
-        // For now, the Help dialog is disabled because of lacking of HTML Help support
+#ifdef DISABLE_HTMLHELP_SUPPORT
         EnableMenuItem(GetMenu(hWnd), IDM_HELP_HELP, MF_BYCOMMAND | MF_GRAYED);
+#endif
         calc.hWnd=hWnd;
 
 #ifdef USE_KEYBOARD_HOOK
@@ -1358,7 +1359,7 @@ static INT_PTR CALLBACK DlgMainProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
         }
         case IDM_HELP_HELP:
 #ifndef DISABLE_HTMLHELP_SUPPORT
-            HtmlHelp(hWnd, HTMLHELP_PATH("/general_information.htm"), HH_DISPLAY_TOPIC, (DWORD_PTR)NULL);
+            calc_HtmlHelp(hWnd, HTMLHELP_PATH("/general_information.htm"), HH_DISPLAY_TOPIC, (DWORD_PTR)NULL);
 #endif
             return TRUE;
         case IDM_VIEW_STANDARD:
@@ -1763,6 +1764,7 @@ static INT_PTR CALLBACK DlgMainProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
         calc.action = IDC_STATIC;
         DestroyWindow(hWnd);
         return TRUE;
+
     case WM_DESTROY:
         /* Get (x,y) position of the calculator */
         GetWindowRect(hWnd, &rc);
@@ -1812,6 +1814,8 @@ int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdL
     load_config();
     start_rpn_engine();
 
+    HtmlHelp_Start(hInstance);
+
     do {
         /* ignore hwnd: dialogs are already visible! */
         if (calc.layout == CALC_LAYOUT_SCIENTIFIC)
@@ -1839,5 +1843,7 @@ int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdL
 
     stop_rpn_engine();
 
+    HtmlHelp_Stop();
+
     return 0;
 }