From 275a3c04db4638e98ba0b7f22c096bb0d87b0eb7 Mon Sep 17 00:00:00 2001
From: Cameron Cawley <ccawley2011@gmail.com>
Date: Fri, 18 Feb 2022 22:17:45 +0000
Subject: [PATCH] windows: Add menu bars to the hotlist, cookies and global
 history windows

---
 frontends/windows/cookies.c        | 56 +++++++++++++++++
 frontends/windows/corewindow.c     | 22 ++++++-
 frontends/windows/corewindow.h     | 16 ++++-
 frontends/windows/global_history.c | 87 ++++++++++++++++++++++++++
 frontends/windows/hotlist.c        | 88 ++++++++++++++++++++++++++
 frontends/windows/res/resource.rc  | 99 ++++++++++++++++++++++++++++++
 frontends/windows/resourceid.h     | 42 +++++++++++++
 7 files changed, 408 insertions(+), 2 deletions(-)

diff --git a/frontends/windows/cookies.c b/frontends/windows/cookies.c
index ee754bc3f..54b8314c6 100644
--- a/frontends/windows/cookies.c
+++ b/frontends/windows/cookies.c
@@ -35,6 +35,7 @@
 #include "windows/corewindow.h"
 #include "windows/cookies.h"
 #include "windows/gui.h"
+#include "windows/resourceid.h"
 
 
 struct nsw32_cookie_window {
@@ -43,6 +44,59 @@ struct nsw32_cookie_window {
 
 static struct nsw32_cookie_window *cookie_window = NULL;
 
+/**
+ * callback for menu selection in cookie window
+ *
+ * \param nsw32_cw The nsw32 core window structure.
+ * \param nskey The netsurf key code
+ * \return NSERROR_OK on success otherwise apropriate error code
+ */
+static nserror
+nsw32_cookie_command(struct nsw32_corewindow *nsw32_cw, int identifier)
+{
+	switch (identifier) {
+	case IDM_COOKIES_EDIT_DELETE_SELECTED:
+		cookie_manager_keypress(NS_KEY_DELETE_LEFT);
+		break;
+	case IDM_COOKIES_EDIT_DELETE_ALL:
+		cookie_manager_keypress(NS_KEY_ESCAPE);
+		cookie_manager_keypress(NS_KEY_ESCAPE);
+		cookie_manager_keypress(NS_KEY_SELECT_ALL);
+		cookie_manager_keypress(NS_KEY_DELETE_LEFT);
+		break;
+	case IDM_COOKIES_EDIT_SELECT_ALL:
+		cookie_manager_keypress(NS_KEY_ESCAPE);
+		cookie_manager_keypress(NS_KEY_ESCAPE);
+		cookie_manager_keypress(NS_KEY_SELECT_ALL);
+		break;
+	case IDM_COOKIES_EDIT_CLEAR_SELECTION:
+		cookie_manager_keypress(NS_KEY_CLEAR_SELECTION);
+		break;
+	case IDM_COOKIES_VIEW_EXPAND_ALL:
+		cookie_manager_expand(false);
+		break;
+	case IDM_COOKIES_VIEW_EXPAND_DOMAINS:
+		cookie_manager_expand(true);
+		break;
+	case IDM_COOKIES_VIEW_EXPAND_COOKIES:
+		cookie_manager_expand(false);
+		break;
+	case IDM_COOKIES_VIEW_COLLAPSE_ALL:
+		cookie_manager_contract(true);
+		break;
+	case IDM_COOKIES_VIEW_COLLAPSE_DOMAINS:
+		cookie_manager_contract(true);
+		break;
+	case IDM_COOKIES_VIEW_COLLAPSE_COOKIES:
+		cookie_manager_contract(false);
+		break;
+	default:
+		return NSERROR_NOT_IMPLEMENTED;
+	}
+
+	return NSERROR_OK;
+}
+
 /**
  * callback for keypress on cookie window
  *
@@ -143,7 +197,9 @@ static nserror nsw32_cookie_init(HINSTANCE hInstance)
 	}
 
 	ncwin->core.title = "NetSurf Cookies";
+	ncwin->core.menu = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU_COOKIES));
 	ncwin->core.draw = nsw32_cookie_draw;
+	ncwin->core.command = nsw32_cookie_command;
 	ncwin->core.key = nsw32_cookie_key;
 	ncwin->core.mouse = nsw32_cookie_mouse;
 	ncwin->core.close = nsw32_cookie_close;
diff --git a/frontends/windows/corewindow.c b/frontends/windows/corewindow.c
index 7d6dc69b0..9a26efb43 100644
--- a/frontends/windows/corewindow.c
+++ b/frontends/windows/corewindow.c
@@ -147,6 +147,20 @@ nsw32_corewindow_paint(struct nsw32_corewindow *nsw32_cw, HWND hwnd)
 	return 0;
 }
 
+static LRESULT
+nsw32_corewindow_command(struct nsw32_corewindow *nsw32_cw,
+			 HWND hwnd,
+			 WPARAM wparam,
+			 LPARAM lparam)
+{
+	if (!nsw32_cw->command)
+		return 1;
+
+	nsw32_cw->command(nsw32_cw, LOWORD(wparam));
+
+	return 0; /* control message handled */
+}
+
 static LRESULT
 nsw32_corewindow_vscroll(struct nsw32_corewindow *nsw32_cw,
 			 HWND hwnd,
@@ -353,6 +367,12 @@ nsw32_window_corewindow_event_callback(HWND hwnd,
 		case WM_PAINT: /* redraw the exposed part of the window */
 			return nsw32_corewindow_paint(nsw32_cw, hwnd);
 
+		case WM_COMMAND:
+			if (nsw32_corewindow_command(nsw32_cw, hwnd, wparam, lparam) == 0) {
+				return 0;
+			}
+			break;
+
 		case WM_SIZE:
 			update_scrollbars(nsw32_cw);
 			break;
@@ -551,7 +571,7 @@ nsw32_corewindow_init(HINSTANCE hInstance,
 					500,
 					400,
 					hWndParent,
-					NULL,
+					nsw32_cw->menu,
 					hInstance,
 					NULL);
 	if (nsw32_cw->hWnd == NULL) {
diff --git a/frontends/windows/corewindow.h b/frontends/windows/corewindow.h
index cffae3cbd..b91787a85 100644
--- a/frontends/windows/corewindow.h
+++ b/frontends/windows/corewindow.h
@@ -36,7 +36,10 @@ struct nsw32_corewindow {
 
 	/** window title */
 	const char *title;
-	
+
+	/** window menu */
+	HMENU menu;
+
         /** drag status set by core */
         core_window_drag_status drag_status;
 
@@ -52,6 +55,17 @@ struct nsw32_corewindow {
          */
         nserror (*draw)(struct nsw32_corewindow *nsw32_cw, int scrollx, int scrolly, struct rect *r);
 
+        /**
+         * callback for menu selection in nsw32 core window
+         *
+         * \param nsw32_cw The nsw32 core window structure.
+         * \param nskey The netsurf key code.
+         * \return NSERROR_OK if key processed,
+         *         NSERROR_NOT_IMPLEMENTED if command not processed
+         *         otherwise apropriate error code
+         */
+        nserror (*command)(struct nsw32_corewindow *nsw32_cw, int identifier);
+
         /**
          * callback for keypress on nsw32 core window
          *
diff --git a/frontends/windows/global_history.c b/frontends/windows/global_history.c
index dcc75ba21..c26fad3b8 100644
--- a/frontends/windows/global_history.c
+++ b/frontends/windows/global_history.c
@@ -34,6 +34,7 @@
 #include "windows/plot.h"
 #include "windows/corewindow.h"
 #include "windows/global_history.h"
+#include "windows/resourceid.h"
 
 
 struct nsw32_global_history_window {
@@ -42,6 +43,90 @@ struct nsw32_global_history_window {
 
 static struct nsw32_global_history_window *global_history_window = NULL;
 
+/**
+ * callback for menu selection in global history window
+ *
+ * \param nsw32_cw The nsw32 core window structure.
+ * \param nskey The netsurf key code
+ * \return NSERROR_OK on success otherwise apropriate error code
+ */
+static nserror
+nsw32_global_history_command(struct nsw32_corewindow *nsw32_cw, int identifier)
+{
+	switch (identifier) {
+	case IDM_GLOBAL_HISTORY_FILE_EXPORT:
+	{
+		OPENFILENAMEA ofn;
+		char filename[260];
+
+		memset(&ofn, 0, sizeof(ofn));
+		ofn.lStructSize = sizeof(ofn);
+		ofn.hwndOwner = nsw32_cw->hWnd;
+		ofn.lpstrFile = filename;
+		ofn.lpstrFile[0] = 0;
+		ofn.nMaxFile = sizeof(filename);
+		ofn.lpstrFilter = "HTML document (*.html)\0*.html\0";
+		ofn.nFilterIndex = 1;
+		ofn.lpstrFileTitle = NULL;
+		ofn.nMaxFileTitle = 0;
+		ofn.Flags = OFN_PATHMUSTEXIST;
+		ofn.lpstrDefExt = "html";
+
+		strncat(ofn.lpstrFile, "history.html", ofn.nMaxFile);
+
+		if (GetSaveFileNameA(&ofn)) {
+			global_history_export(ofn.lpstrFile, NULL);
+		}
+
+		break;
+	}
+	case IDM_GLOBAL_HISTORY_EDIT_DELETE_SELECTED:
+		global_history_keypress(NS_KEY_DELETE_LEFT);
+		break;
+	case IDM_GLOBAL_HISTORY_EDIT_DELETE_ALL:
+		global_history_keypress(NS_KEY_ESCAPE);
+		global_history_keypress(NS_KEY_ESCAPE);
+		global_history_keypress(NS_KEY_SELECT_ALL);
+		global_history_keypress(NS_KEY_DELETE_LEFT);
+		break;
+	case IDM_GLOBAL_HISTORY_EDIT_SELECT_ALL:
+		global_history_keypress(NS_KEY_ESCAPE);
+		global_history_keypress(NS_KEY_ESCAPE);
+		global_history_keypress(NS_KEY_SELECT_ALL);
+		break;
+	case IDM_GLOBAL_HISTORY_EDIT_CLEAR_SELECTION:
+		global_history_keypress(NS_KEY_ESCAPE);
+		global_history_keypress(NS_KEY_ESCAPE);
+		global_history_keypress(NS_KEY_CLEAR_SELECTION);
+		break;
+	case IDM_GLOBAL_HISTORY_VIEW_EXPAND_ALL:
+		global_history_expand(false);
+		break;
+	case IDM_GLOBAL_HISTORY_VIEW_EXPAND_DIRECTORIES:
+		global_history_expand(true);
+		break;
+	case IDM_GLOBAL_HISTORY_VIEW_EXPAND_ADDRESSES:
+		global_history_expand(false);
+		break;
+	case IDM_GLOBAL_HISTORY_VIEW_COLLAPSE_ALL:
+		global_history_contract(true);
+		break;
+	case IDM_GLOBAL_HISTORY_VIEW_COLLAPSE_DIRECTORIES:
+		global_history_contract(true);
+		break;
+	case IDM_GLOBAL_HISTORY_VIEW_COLLAPSE_ADDRESSES:
+		global_history_contract(false);
+		break;
+	case IDM_GLOBAL_HISTORY_LAUNCH:
+		global_history_keypress(NS_KEY_CR);
+		break;
+	default:
+		return NSERROR_NOT_IMPLEMENTED;
+	}
+
+	return NSERROR_OK;
+}
+
 /**
  * callback for keypress on global_history window
  *
@@ -132,7 +217,9 @@ static nserror nsw32_global_history_init(HINSTANCE hInstance)
 	}
 
 	ncwin->core.title = "NetSurf Global History";
+	ncwin->core.menu = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU_GLOBAL_HISTORY));
 	ncwin->core.draw = nsw32_global_history_draw;
+	ncwin->core.command = nsw32_global_history_command;
 	ncwin->core.key = nsw32_global_history_key;
 	ncwin->core.mouse = nsw32_global_history_mouse;
 	ncwin->core.close = nsw32_global_history_close;
diff --git a/frontends/windows/hotlist.c b/frontends/windows/hotlist.c
index e8dd90b34..d4e82074d 100644
--- a/frontends/windows/hotlist.c
+++ b/frontends/windows/hotlist.c
@@ -34,6 +34,7 @@
 #include "windows/plot.h"
 #include "windows/corewindow.h"
 #include "windows/hotlist.h"
+#include "windows/resourceid.h"
 
 
 /**
@@ -46,6 +47,91 @@ struct nsw32_hotlist_window {
 /** hotlist window singleton */
 static struct nsw32_hotlist_window *hotlist_window = NULL;
 
+/**
+ * callback for menu selection in hotlist window
+ *
+ * \param nsw32_cw The nsw32 core window structure.
+ * \param nskey The netsurf key code
+ * \return NSERROR_OK on success otherwise apropriate error code
+ */
+static nserror
+nsw32_hotlist_command(struct nsw32_corewindow *nsw32_cw, int identifier)
+{
+	switch (identifier) {
+	case IDM_HOTLIST_FILE_EXPORT:
+	{
+		OPENFILENAMEA ofn;
+		char filename[260];
+
+		memset(&ofn, 0, sizeof(ofn));
+		ofn.lStructSize = sizeof(ofn);
+		ofn.hwndOwner = nsw32_cw->hWnd;
+		ofn.lpstrFile = filename;
+		ofn.lpstrFile[0] = 0;
+		ofn.nMaxFile = sizeof(filename);
+		ofn.lpstrFilter = "HTML document (*.html)\0*.html\0";
+		ofn.nFilterIndex = 1;
+		ofn.lpstrFileTitle = NULL;
+		ofn.nMaxFileTitle = 0;
+		ofn.Flags = OFN_PATHMUSTEXIST;
+		ofn.lpstrDefExt = "html";
+
+		strncat(ofn.lpstrFile, "hotlist.html", ofn.nMaxFile);
+
+		if (GetSaveFileNameA(&ofn)) {
+			hotlist_export(ofn.lpstrFile, NULL);
+		}
+
+		break;
+	}
+	case IDM_HOTLIST_FILE_NEW_FOLDER:
+		hotlist_add_folder(NULL, false, 0);
+		break;
+	case IDM_HOTLIST_FILE_NEW_ENTRY:
+		hotlist_add_entry(NULL, NULL, false, 0);
+		break;
+	case IDM_HOTLIST_EDIT_EDIT:
+		hotlist_edit_selection();
+		break;
+	case IDM_HOTLIST_EDIT_DELETE:
+		hotlist_keypress(NS_KEY_DELETE_LEFT);
+		break;
+	case IDM_HOTLIST_EDIT_SELECT_ALL:
+		hotlist_keypress(NS_KEY_ESCAPE);
+		hotlist_keypress(NS_KEY_ESCAPE);
+		hotlist_keypress(NS_KEY_SELECT_ALL);
+		break;
+	case IDM_HOTLIST_EDIT_CLEAR_SELECTION:
+		hotlist_keypress(NS_KEY_CLEAR_SELECTION);
+		break;
+	case IDM_HOTLIST_VIEW_EXPAND_ALL:
+		hotlist_expand(false);
+		break;
+	case IDM_HOTLIST_VIEW_EXPAND_DIRECTORIES:
+		hotlist_expand(true);
+		break;
+	case IDM_HOTLIST_VIEW_EXPAND_ADDRESSES:
+		hotlist_expand(false);
+		break;
+	case IDM_HOTLIST_VIEW_COLLAPSE_ALL:
+		hotlist_contract(true);
+		break;
+	case IDM_HOTLIST_VIEW_COLLAPSE_DIRECTORIES:
+		hotlist_contract(true);
+		break;
+	case IDM_HOTLIST_VIEW_COLLAPSE_ADDRESSES:
+		hotlist_contract(false);
+		break;
+	case IDM_HOTLIST_LAUNCH:
+		hotlist_keypress(NS_KEY_CR);
+		break;
+	default:
+		return NSERROR_NOT_IMPLEMENTED;
+	}
+
+	return NSERROR_OK;
+}
+
 /**
  * callback for keypress on hotlist window
  *
@@ -136,7 +222,9 @@ static nserror nsw32_hotlist_init(HINSTANCE hInstance)
 	}
 
 	ncwin->core.title = "NetSurf Bookmarks";
+	ncwin->core.menu = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU_HOTLIST));
 	ncwin->core.draw = nsw32_hotlist_draw;
+	ncwin->core.command = nsw32_hotlist_command;
 	ncwin->core.key = nsw32_hotlist_key;
 	ncwin->core.mouse = nsw32_hotlist_mouse;
 	ncwin->core.close = nsw32_hotlist_close;
diff --git a/frontends/windows/res/resource.rc b/frontends/windows/res/resource.rc
index 9e9927b0c..d6cf87590 100644
--- a/frontends/windows/res/resource.rc
+++ b/frontends/windows/res/resource.rc
@@ -162,6 +162,105 @@ IDR_MENU_MAIN MENU
 
 
 
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+IDR_MENU_HOTLIST MENU
+{
+    POPUP "&File"
+    {
+        MENUITEM "Export", IDM_HOTLIST_FILE_EXPORT
+        MENUITEM "New folder", IDM_HOTLIST_FILE_NEW_FOLDER
+        MENUITEM "New entry", IDM_HOTLIST_FILE_NEW_ENTRY
+    }
+    POPUP "&Edit"
+    {
+        MENUITEM "Edit", IDM_HOTLIST_EDIT_EDIT
+        MENUITEM "Delete", IDM_HOTLIST_EDIT_DELETE
+        MENUITEM "Select all", IDM_HOTLIST_EDIT_SELECT_ALL
+        MENUITEM "Clear selection", IDM_HOTLIST_EDIT_CLEAR_SELECTION
+    }
+    POPUP "&View"
+    {
+        POPUP "Expand"
+        {
+            MENUITEM "All", IDM_HOTLIST_VIEW_EXPAND_ALL
+            MENUITEM "Directories", IDM_HOTLIST_VIEW_EXPAND_DIRECTORIES
+            MENUITEM "Addresses", IDM_HOTLIST_VIEW_EXPAND_ADDRESSES
+        }
+        POPUP "Collapse"
+        {
+            MENUITEM "All", IDM_HOTLIST_VIEW_COLLAPSE_ALL
+            MENUITEM "Directories", IDM_HOTLIST_VIEW_COLLAPSE_DIRECTORIES
+            MENUITEM "Addresses", IDM_HOTLIST_VIEW_COLLAPSE_ADDRESSES
+        }
+    }
+    MENUITEM "&Launch", IDM_HOTLIST_LAUNCH
+}
+
+
+
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+IDR_MENU_COOKIES MENU
+{
+    POPUP "&Edit"
+    {
+        MENUITEM "Delete", IDM_COOKIES_EDIT_DELETE_SELECTED
+        MENUITEM "Delete all", IDM_COOKIES_EDIT_DELETE_ALL
+        MENUITEM "Select all", IDM_COOKIES_EDIT_SELECT_ALL
+        MENUITEM "Clear selection", IDM_COOKIES_EDIT_CLEAR_SELECTION
+    }
+    POPUP "&View"
+    {
+        POPUP "Expand"
+        {
+            MENUITEM "All", IDM_COOKIES_VIEW_EXPAND_ALL
+            MENUITEM "Domains", IDM_COOKIES_VIEW_EXPAND_DOMAINS
+            MENUITEM "Cookies", IDM_COOKIES_VIEW_EXPAND_COOKIES
+        }
+        POPUP "Collapse"
+        {
+            MENUITEM "All", IDM_COOKIES_VIEW_COLLAPSE_ALL
+            MENUITEM "Domains", IDM_COOKIES_VIEW_COLLAPSE_DOMAINS
+            MENUITEM "Cookies", IDM_COOKIES_VIEW_COLLAPSE_COOKIES
+        }
+    }
+}
+
+
+
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+IDR_MENU_GLOBAL_HISTORY MENU
+{
+    POPUP "&File"
+    {
+        MENUITEM "Export", IDM_GLOBAL_HISTORY_FILE_EXPORT
+    }
+    POPUP "&Edit"
+    {
+        MENUITEM "Delete", IDM_GLOBAL_HISTORY_EDIT_DELETE_SELECTED
+        MENUITEM "Delete all", IDM_GLOBAL_HISTORY_EDIT_DELETE_ALL
+        MENUITEM "Select all", IDM_GLOBAL_HISTORY_EDIT_SELECT_ALL
+        MENUITEM "Clear selection", IDM_GLOBAL_HISTORY_EDIT_CLEAR_SELECTION
+    }
+    POPUP "&View"
+    {
+        POPUP "Expand"
+        {
+            MENUITEM "All", IDM_GLOBAL_HISTORY_VIEW_EXPAND_ALL
+            MENUITEM "Directories", IDM_GLOBAL_HISTORY_VIEW_EXPAND_DIRECTORIES
+            MENUITEM "Addresses", IDM_GLOBAL_HISTORY_VIEW_EXPAND_ADDRESSES
+        }
+        POPUP "Collapse"
+        {
+            MENUITEM "All", IDM_GLOBAL_HISTORY_VIEW_COLLAPSE_ALL
+            MENUITEM "Directories", IDM_GLOBAL_HISTORY_VIEW_COLLAPSE_DIRECTORIES
+            MENUITEM "Addresses", IDM_GLOBAL_HISTORY_VIEW_COLLAPSE_ADDRESSES
+        }
+    }
+    MENUITEM "&Launch", IDM_GLOBAL_HISTORY_LAUNCH
+}
+
+
+
 //
 // Dialog resources
 //
diff --git a/frontends/windows/resourceid.h b/frontends/windows/resourceid.h
index db275913b..7f4cdc578 100644
--- a/frontends/windows/resourceid.h
+++ b/frontends/windows/resourceid.h
@@ -138,4 +138,46 @@
 
 #define IDR_MENU_CONTEXT 11000
 
+#define IDR_MENU_HOTLIST 12000
+#define IDM_HOTLIST_FILE_EXPORT 12101
+#define IDM_HOTLIST_FILE_NEW_FOLDER 12102
+#define IDM_HOTLIST_FILE_NEW_ENTRY 12103
+#define IDM_HOTLIST_EDIT_EDIT 12201
+#define IDM_HOTLIST_EDIT_DELETE 12202
+#define IDM_HOTLIST_EDIT_SELECT_ALL 12203
+#define IDM_HOTLIST_EDIT_CLEAR_SELECTION 12204
+#define IDM_HOTLIST_VIEW_EXPAND_ALL 12301
+#define IDM_HOTLIST_VIEW_EXPAND_DIRECTORIES 12302
+#define IDM_HOTLIST_VIEW_EXPAND_ADDRESSES 12303
+#define IDM_HOTLIST_VIEW_COLLAPSE_ALL 12304
+#define IDM_HOTLIST_VIEW_COLLAPSE_DIRECTORIES 12305
+#define IDM_HOTLIST_VIEW_COLLAPSE_ADDRESSES 12306
+#define IDM_HOTLIST_LAUNCH 12400
+
+#define IDR_MENU_COOKIES 13000
+#define IDM_COOKIES_EDIT_DELETE_SELECTED 13101
+#define IDM_COOKIES_EDIT_DELETE_ALL 13102
+#define IDM_COOKIES_EDIT_SELECT_ALL 13103
+#define IDM_COOKIES_EDIT_CLEAR_SELECTION 13104
+#define IDM_COOKIES_VIEW_EXPAND_ALL 13201
+#define IDM_COOKIES_VIEW_EXPAND_DOMAINS 13202
+#define IDM_COOKIES_VIEW_EXPAND_COOKIES 13203
+#define IDM_COOKIES_VIEW_COLLAPSE_ALL 13204
+#define IDM_COOKIES_VIEW_COLLAPSE_DOMAINS 13205
+#define IDM_COOKIES_VIEW_COLLAPSE_COOKIES 13206
+
+#define IDR_MENU_GLOBAL_HISTORY 14000
+#define IDM_GLOBAL_HISTORY_FILE_EXPORT 14101
+#define IDM_GLOBAL_HISTORY_EDIT_DELETE_SELECTED 14201
+#define IDM_GLOBAL_HISTORY_EDIT_DELETE_ALL 14202
+#define IDM_GLOBAL_HISTORY_EDIT_SELECT_ALL 14203
+#define IDM_GLOBAL_HISTORY_EDIT_CLEAR_SELECTION 14204
+#define IDM_GLOBAL_HISTORY_VIEW_EXPAND_ALL 14301
+#define IDM_GLOBAL_HISTORY_VIEW_EXPAND_DIRECTORIES 14302
+#define IDM_GLOBAL_HISTORY_VIEW_EXPAND_ADDRESSES 14303
+#define IDM_GLOBAL_HISTORY_VIEW_COLLAPSE_ALL 14304
+#define IDM_GLOBAL_HISTORY_VIEW_COLLAPSE_DIRECTORIES 14305
+#define IDM_GLOBAL_HISTORY_VIEW_COLLAPSE_ADDRESSES 14306
+#define IDM_GLOBAL_HISTORY_LAUNCH 14401
+
 #endif
-- 
2.30.2

