From 6c0c95718d89b90c1993ca85656183e1a1c27bfe Mon Sep 17 00:00:00 2001
From: George Hazan <george.hazan@gmail.com>
Date: Tue, 16 Jan 2024 19:39:31 +0300
Subject: =?UTF-8?q?fixes=20#4078=20(=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D1=82?=
 =?UTF-8?q?=D1=8C=20=D0=BC=D0=B5=D0=BD=D1=8E=20=D0=B3=D1=80=D1=83=D0=BF?=
 =?UTF-8?q?=D0=BF=20=D0=B4=D0=BE=D1=81=D1=82=D1=83=D0=BF=D0=BD=D0=B5=D0=B5?=
 =?UTF-8?q?)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/mir_app/src/clc.cpp         |  26 +---
 src/mir_app/src/clui.cpp        |   2 +-
 src/mir_app/src/genmenu.h       |   3 +-
 src/mir_app/src/menu_groups.cpp | 334 ++++++++++++++++------------------------
 src/mir_app/src/mir_app.def     |   1 -
 src/mir_app/src/mir_app64.def   |   1 -
 src/mir_app/src/resource.h      |   5 -
 7 files changed, 133 insertions(+), 239 deletions(-)

(limited to 'src/mir_app')

diff --git a/src/mir_app/src/clc.cpp b/src/mir_app/src/clc.cpp
index 458aae07a0..b52c63f672 100644
--- a/src/mir_app/src/clc.cpp
+++ b/src/mir_app/src/clc.cpp
@@ -1201,7 +1201,7 @@ LBL_MoveSelection:
 			if (dat->selection != -1 && hitFlags & (CLCHT_ONITEMICON | CLCHT_ONITEMCHECK | CLCHT_ONITEMLABEL)) {
 				HMENU hMenu;
 				if (contact->type == CLCIT_GROUP)
-					hMenu = Menu_BuildSubGroupMenu(contact->group);
+					hMenu = Menu_BuildGroupMenu(contact->group);
 				else if (contact->type == CLCIT_CONTACT)
 					hMenu = Menu_BuildContactMenu(contact->hContact);
 				else
@@ -1231,30 +1231,8 @@ LBL_MoveSelection:
 			if (Clist_MenuProcessCommand(LOWORD(wParam), MPCF_CONTACTMENU, contact->hContact))
 				break;
 
-		if (contact->type == CLCIT_GROUP) {
-			switch (LOWORD(wParam)) {
-			case POPUP_NEWGROUP:
-			case POPUP_NEWSUBGROUP:
-				SetWindowLongPtr(hwnd, GWL_STYLE, GetWindowLongPtr(hwnd, GWL_STYLE) & ~CLS_HIDEEMPTYGROUPS);
-				SetWindowLongPtr(hwnd, GWL_STYLE, GetWindowLongPtr(hwnd, GWL_STYLE) | CLS_USEGROUPS);
-				if (LOWORD(wParam) == POPUP_NEWGROUP)
-					Clist_GroupCreate(0, nullptr);
-				else
-					Clist_GroupCreate(contact->groupId, nullptr);
-				break;
-			case POPUP_RENAMEGROUP:
-				g_clistApi.pfnBeginRenameSelection(hwnd, dat);
-				break;
-			case POPUP_DELETEGROUP:
-				Clist_GroupDelete(contact->groupId);
-				break;
-			case POPUP_GROUPHIDEOFFLINE:
-				Clist_GroupSetFlags(contact->groupId, MAKELPARAM(contact->group->bHideOffline ? 0 : GROUPF_HIDEOFFLINE, GROUPF_HIDEOFFLINE));
-				break;
-			}
-
+		if (contact->type == CLCIT_GROUP)
 			Menu_ProcessCommandById(wParam, (LPARAM)hwnd);
-		}
 		break;
 
 	case WM_DESTROY:
diff --git a/src/mir_app/src/clui.cpp b/src/mir_app/src/clui.cpp
index 3837862075..e46368d640 100644
--- a/src/mir_app/src/clui.cpp
+++ b/src/mir_app/src/clui.cpp
@@ -892,7 +892,7 @@ LRESULT CALLBACK fnContactListWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM
 				}
 			}
 			if (PtInRect(&rc, pt)) {
-				HMENU hMenu = Menu_BuildGroupMenu();
+				HMENU hMenu = Menu_BuildGroupMenu(nullptr);
 				TrackPopupMenu(hMenu, TPM_TOPALIGN | TPM_LEFTALIGN | TPM_LEFTBUTTON, pt.x, pt.y, 0, hwnd, nullptr);
 				Menu_DestroyNestedMenu(hMenu);
 				return 0;
diff --git a/src/mir_app/src/genmenu.h b/src/mir_app/src/genmenu.h
index 072c252171..bf004c48b6 100644
--- a/src/mir_app/src/genmenu.h
+++ b/src/mir_app/src/genmenu.h
@@ -126,8 +126,7 @@ int UninitGenMenu();
 
 int Menu_LoadFromDatabase(TMO_IntMenuItem *pimi, void *param);
 
-HMENU Menu_BuildGroupMenu(void);
-HMENU Menu_BuildSubGroupMenu(struct ClcGroup *group);
+HMENU Menu_BuildGroupMenu(struct ClcGroup *group);
 
 LPTSTR GetMenuItemText(TMO_IntMenuItem*);
 
diff --git a/src/mir_app/src/menu_groups.cpp b/src/mir_app/src/menu_groups.cpp
index ea5b08bc98..a8dccf8e77 100644
--- a/src/mir_app/src/menu_groups.cpp
+++ b/src/mir_app/src/menu_groups.cpp
@@ -25,15 +25,14 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include "stdafx.h"
 
 /////////////////////////////////////////////////////////////////////////////////////////
-//////////////////////////////         Group MENU          //////////////////////////////
+// Group menu
 
-int hGroupMenuObject, hSubGroupMenuObject;
+int hGroupMenuObject;
 
-static HANDLE hEventPreBuildGroupMenu, hEventPreBuildSubGroupMenu;
-static HGENMENU hHideOfflineUsersMenuItem;
-static HGENMENU hHideOfflineUsersOutHereMenuItem;
-static HGENMENU hHideEmptyGroupsMenuItem;
-static HGENMENU hDisableGroupsMenuItem;
+static HANDLE hEventPreBuildGroupMenu;
+static HGENMENU hmiHideOfflineUsers, hmiHideOfflineUsersInHere, hmiHideOfflineUsersOutHere;
+static HGENMENU hmiHideEmptyGroups, hmiDisableGroups;
+static HGENMENU hmiCreateSubgroup, hmiRenameGroup, hmiDeleteGroup;
 
 // Groupmenu exec param(ownerdata)
 
@@ -43,12 +42,12 @@ struct GroupMenuExecParam
 	int Param1, Param2;
 };
 
-HMENU Menu_BuildGroupMenu()
+HMENU Menu_BuildGroupMenu(struct ClcGroup *group)
 {
-	NotifyEventHooks(hEventPreBuildGroupMenu, 0, 0);
+	NotifyEventHooks(hEventPreBuildGroupMenu, WPARAM(group), 0);
 
 	HMENU hMenu = CreatePopupMenu();
-	Menu_Build(hMenu, hGroupMenuObject);
+	Menu_Build(hMenu, hGroupMenuObject, WPARAM(group));
 	return hMenu;
 }
 
@@ -73,6 +72,22 @@ MIR_APP_DLL(HGENMENU) Menu_AddGroupMenuItem(TMO_MenuItem *pmi, GroupMenuParam *g
 	return hNewItem;
 }
 
+// called with:
+// wparam - ClcGroup*
+// lparam - lparam from winproc
+static INT_PTR GroupMenuCheckService(WPARAM wParam, LPARAM)
+{
+	TCheckProcParam *CParam = (TCheckProcParam *)wParam;
+	if (CParam) {
+		GroupMenuExecParam *mmep = (GroupMenuExecParam *)(CParam->MenuItemOwnerData);
+		if (mmep) {
+			mmep->Param1 = CParam->wParam;
+			mmep->Param2 = CParam->lParam;
+		}
+	}
+	return 1;
+}
+
 // called with:
 // wparam - ownerdata
 // lparam - lparam from winproc
@@ -114,7 +129,7 @@ static INT_PTR UseGroupsHelper(WPARAM, LPARAM)
 	return newVal;
 }
 
-static INT_PTR HideOfflineHelper(WPARAM, LPARAM)
+static INT_PTR ToggleOfflineHelper(WPARAM, LPARAM)
 {
 	return g_clistApi.pfnSetHideOffline(-1);
 }
@@ -134,119 +149,58 @@ static INT_PTR CreateGroupHelper(WPARAM, LPARAM)
 	return 0;
 }
 
-static int OnBuildGroupMenu(WPARAM, LPARAM)
+static INT_PTR CreateSubGroupHelper(WPARAM wParam, LPARAM)
 {
-	bool bChecked = Clist::HideOffline;
-	Menu_SetChecked(hHideOfflineUsersMenuItem, bChecked);
-
-	bChecked = SendMessage(g_clistApi.hwndContactTree, CLM_GETHIDEOFFLINEROOT, 0, 0) != 0;
-	Menu_SetChecked(hHideOfflineUsersOutHereMenuItem, bChecked);
+	SendMessage(g_clistApi.hwndContactTree, CLM_SETHIDEEMPTYGROUPS, 0, 0);
+	SendMessage(g_clistApi.hwndContactTree, CLM_SETUSEGROUPS, 1, 0);
 
-	uint32_t dwStyle = GetWindowLongPtr(g_clistApi.hwndContactTree, GWL_STYLE);
-	Menu_SetChecked(hHideEmptyGroupsMenuItem, (dwStyle & CLS_HIDEEMPTYGROUPS) != 0);
-	Menu_SetChecked(hDisableGroupsMenuItem, (dwStyle & CLS_USEGROUPS) == 0);
+	auto *pGroup = (ClcGroup *)wParam;
+	Clist_GroupCreate(pGroup ? pGroup->groupId : 0, nullptr);
 	return 0;
 }
 
-/////////////////////////////////////////////////////////////////////////////////////////
-//////////////////////////////        SubGroup MENU        //////////////////////////////
-
-struct SubGroupMenuExecParam
+static INT_PTR HideInGroupHelper(WPARAM wParam, LPARAM)
 {
-	char *szServiceName;
-	int Param1, Param2;
-};
-
-HMENU Menu_BuildSubGroupMenu(ClcGroup *group)
-{
-	NotifyEventHooks(hEventPreBuildSubGroupMenu, (WPARAM)group, 0);
-
-	HMENU hMenu = CreatePopupMenu();
-	Menu_Build(hMenu, hSubGroupMenuObject, (WPARAM)group, 0);
-	return hMenu;
+	auto *pGroup = (ClcGroup *)wParam;
+	Clist_GroupSetFlags(pGroup->groupId, MAKELPARAM(pGroup->bHideOffline ? 0 : GROUPF_HIDEOFFLINE, GROUPF_HIDEOFFLINE));
+	return 0;
 }
 
-/////////////////////////////////////////////////////////////////////////////////////////
-
-MIR_APP_DLL(HGENMENU) Menu_AddSubGroupMenuItem(TMO_MenuItem *pmi, GroupMenuParam *gmp)
+static INT_PTR RenameGroupHelper(WPARAM wParam, LPARAM)
 {
-	SubGroupMenuExecParam *mmep = (SubGroupMenuExecParam *)mir_calloc(sizeof(SubGroupMenuExecParam));
-	if (mmep == nullptr)
-		return nullptr;
-
-	// we need just one parametr.
-	mmep->szServiceName = mir_strdup(pmi->pszService);
-	if (gmp != nullptr) {
-		mmep->Param1 = gmp->wParam;
-		mmep->Param2 = gmp->lParam;
-	}
-
-	HGENMENU hNewItem = Menu_AddItem(hSubGroupMenuObject, pmi, mmep);
-
-	char buf[1024];
-	mir_snprintf(buf, "%s/%s", pmi->pszService, pmi->name.a);
-	Menu_ConfigureItem(hNewItem, MCI_OPT_UNIQUENAME, buf);
-	return hNewItem;
+	auto *pGroup = (ClcGroup *)wParam;
+	PostMessage(g_clistApi.hwndContactTree, CLM_EDITLABEL, pGroup->groupId | HCONTACT_ISGROUP, 0);
+	return 0;
 }
 
-/////////////////////////////////////////////////////////////////////////////////////////
-
-static INT_PTR SubGroupMenuCheckService(WPARAM wParam, LPARAM)
+static INT_PTR DeleteGroupHelper(WPARAM wParam, LPARAM)
 {
-	TCheckProcParam *CParam = (TCheckProcParam *)wParam;
-	if (CParam) {
-		SubGroupMenuExecParam *mmep = (SubGroupMenuExecParam *)(CParam->MenuItemOwnerData);
-		if (mmep)
-			mmep->Param2 = CParam->lParam;
-	}
-	return 1;
+	auto *pGroup = (ClcGroup *)wParam;
+	Clist_GroupDelete(pGroup->groupId);
+	return 0;
 }
 
-/////////////////////////////////////////////////////////////////////////////////////////
-// called with:
-// wparam - ownerdata
-// lparam - lparam from winproc
-
-static INT_PTR SubGroupMenuExecService(WPARAM wParam, LPARAM lParam)
+static int OnBuildGroupMenu(WPARAM wParam, LPARAM)
 {
-	if (wParam != 0) {
-		SubGroupMenuExecParam *mmep = (SubGroupMenuExecParam *)wParam;
-		CallService(mmep->szServiceName, mmep->Param1, lParam);
-	}
-	return 1;
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
+	bool bChecked = Clist::HideOffline;
+	Menu_SetChecked(hmiHideOfflineUsers, bChecked);
 
-static INT_PTR FreeOwnerDataSubGroupMenu(WPARAM, LPARAM lParam)
-{
-	SubGroupMenuExecParam *mmep = (SubGroupMenuExecParam *)lParam;
-	if (mmep != nullptr) {
-		mir_free(mmep->szServiceName);
-		mir_free(mmep);
-	}
-	return 0;
-}
+	bChecked = SendMessage(g_clistApi.hwndContactTree, CLM_GETHIDEOFFLINEROOT, 0, 0) != 0;
+	Menu_SetChecked(hmiHideOfflineUsersOutHere, bChecked);
 
-/////////////////////////////////////////////////////////////////////////////////////////
+	uint32_t dwStyle = GetWindowLongPtr(g_clistApi.hwndContactTree, GWL_STYLE);
+	Menu_SetChecked(hmiHideEmptyGroups, (dwStyle & CLS_HIDEEMPTYGROUPS) != 0);
+	Menu_SetChecked(hmiDisableGroups, (dwStyle & CLS_USEGROUPS) == 0);
 
-static HGENMENU hHideOfflineUsersHereMenuItem;
+	Menu_ShowItem(hmiRenameGroup, wParam != 0);
+	Menu_ShowItem(hmiDeleteGroup, wParam != 0);
+	Menu_ShowItem(hmiCreateSubgroup, wParam != 0);
+	Menu_ShowItem(hmiHideOfflineUsersInHere, wParam != 0);
+	Menu_ShowItem(hmiHideOfflineUsersOutHere, wParam == 0);
 
-static int OnBuildSubGroupMenu(WPARAM wParam, LPARAM)
-{
-	ClcGroup *group = (ClcGroup*)wParam;
+	ClcGroup *group = (ClcGroup *)wParam;
 	if (group != nullptr) // contact->group
-		Menu_SetChecked(hHideOfflineUsersHereMenuItem, group->bHideOffline != 0);
-	return 0;
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// wparam menu handle to pass to clc.c
-// lparam WM_COMMAND HWND
-
-static INT_PTR GroupMenuExecProxy(WPARAM wParam, LPARAM lParam)
-{
-	SendMessage(lParam ? (HWND)lParam : (HWND)g_clistApi.hwndContactTree, WM_COMMAND, wParam, 0);
+		Menu_SetChecked(hmiHideOfflineUsersInHere, group->bHideOffline != 0);
 	return 0;
 }
 
@@ -254,10 +208,9 @@ static INT_PTR GroupMenuExecProxy(WPARAM wParam, LPARAM lParam)
 
 void InitGroupMenus(void)
 {
-	GroupMenuParam gmp = {};
-
 	// Group menu
 	CreateServiceFunction("CLISTMENUSGroup/ExecService", GroupMenuExecService);
+	CreateServiceFunction("CLISTMENUSGroup/CheckService", GroupMenuCheckService);
 	CreateServiceFunction("CLISTMENUSGroup/FreeOwnerDataGroupMenu", FreeOwnerDataGroupMenu);
 
 	hEventPreBuildGroupMenu = CreateHookableEvent(ME_CLIST_PREBUILDGROUPMENU);
@@ -265,106 +218,77 @@ void InitGroupMenus(void)
 
 	hGroupMenuObject = Menu_AddObject("GroupMenu", LPGEN("Group menu"), nullptr, "CLISTMENUSGroup/ExecService");
 	Menu_ConfigureObject(hGroupMenuObject, MCO_OPT_USERDEFINEDITEMS, TRUE);
+	Menu_ConfigureObject(hGroupMenuObject, MCO_OPT_CHECK_SERVICE, "CLISTMENUSGroup/CheckService");
 	Menu_ConfigureObject(hGroupMenuObject, MCO_OPT_FREE_SERVICE, "CLISTMENUSGroup/FreeOwnerDataGroupMenu");
 	Menu_ConfigureObject(hGroupMenuObject, MCO_OPT_ONADD_SERVICE, "CLISTMENUSGroup/GroupMenuOnAddService");
-	{
-		CMenuItem mi(&g_plugin);
-
-		SET_UID(mi, 0x2f75bc72, 0xd836, 0x4922, 0x9f, 0xe, 0xed, 0x9e, 0xe7, 0x2b, 0x84, 0xf0);
-		mi.position = 100000;
-		mi.hIcolibItem = Skin_GetIconHandle(SKINICON_OTHER_GROUPADD);
-		mi.pszService = "CLISTMENUSGroup/CreateGroupHelper";
-		mi.name.a = LPGEN("New group");
-		Menu_AddGroupMenuItem(&mi);
-		CreateServiceFunction(mi.pszService, CreateGroupHelper);
-
-		SET_UID(mi, 0xe6269658, 0x69, 0x4094, 0x9b, 0x35, 0x4e, 0x80, 0x29, 0x26, 0xf, 0x8e);
-		mi.position = 500001;
-		mi.hIcolibItem = nullptr;
-		mi.pszService = MS_CLIST_TOGGLEHIDEOFFLINE;
-		mi.name.a = LPGEN("Hide offline users");
-		gmp.wParam = -1;
-		hHideOfflineUsersMenuItem = Menu_AddGroupMenuItem(&mi, &gmp);
-		CreateServiceFunction(mi.pszService, HideOfflineHelper);
-
-		SET_UID(mi, 0xeded7371, 0xf6e6, 0x48c3, 0x8c, 0x9e, 0x62, 0xc1, 0xd5, 0xcb, 0x51, 0xbc);
-		mi.position++;
-		mi.pszService = MS_CLIST_TOGGLEHIDEOFFLINEROOT;
-		mi.name.a = LPGEN("Hide offline users out here");
-		hHideOfflineUsersOutHereMenuItem = Menu_AddGroupMenuItem(&mi);
-		CreateServiceFunction(mi.pszService, HideOfflineRootHelper);
-
-		SET_UID(mi, 0x4c17b9cf, 0x513a, 0x41d8, 0x8d, 0x2b, 0x89, 0x44, 0x81, 0x14, 0x0, 0x91);
-		mi.position++;
-		mi.pszService = MS_CLIST_TOGGLEEMPTYGROUPS;
-		mi.name.a = LPGEN("Hide empty groups");
-		hHideEmptyGroupsMenuItem = Menu_AddGroupMenuItem(&mi);
-		CreateServiceFunction(mi.pszService, HideGroupsHelper);
-
-		SET_UID(mi, 0xfcbdbbb1, 0xa553, 0x49ac, 0xa5, 0xdf, 0xb4, 0x81, 0x38, 0xf, 0xa0, 0xc7);
-		mi.position++;
-		mi.pszService = MS_CLIST_TOGGLEGROUPS;
-		mi.name.a = LPGEN("Disable groups");
-		hDisableGroupsMenuItem = Menu_AddGroupMenuItem(&mi);
-		CreateServiceFunction(mi.pszService, UseGroupsHelper);
-
-		SET_UID(mi, 0xfffb8733, 0xa3e4, 0x4566, 0xa6, 0x6e, 0x4c, 0x4c, 0x7c, 0xe9, 0x56, 0x99);
-		mi.position = 1900000;
-		mi.pszService = "CloseAction";
-		mi.hIcolibItem = Skin_GetIconHandle(SKINICON_OTHER_EXIT);
-		mi.name.a = LPGEN("Exit");
-		Menu_AddGroupMenuItem(&mi);
-	}
 
-	// SubGroup menu
-	CreateServiceFunction("CLISTMENUSSubGroup/ExecService", SubGroupMenuExecService);
-	CreateServiceFunction("CLISTMENUSSubGroup/FreeOwnerDataSubGroupMenu", FreeOwnerDataSubGroupMenu);
-	CreateServiceFunction("CLISTMENUSSubGroup/SubGroupMenuCheckService", SubGroupMenuCheckService);
-
-	hEventPreBuildSubGroupMenu = CreateHookableEvent(ME_CLIST_PREBUILDSUBGROUPMENU);
-	HookEvent(ME_CLIST_PREBUILDSUBGROUPMENU, OnBuildSubGroupMenu);
-
-	hSubGroupMenuObject = Menu_AddObject("SubGroupMenu", LPGEN("Subgroup menu"), nullptr, "CLISTMENUSSubGroup/ExecService");
-	Menu_ConfigureObject(hSubGroupMenuObject, MCO_OPT_USERDEFINEDITEMS, TRUE);
-	Menu_ConfigureObject(hSubGroupMenuObject, MCO_OPT_FREE_SERVICE, "CLISTMENUSSubGroup/FreeOwnerDataSubGroupMenu");
-	Menu_ConfigureObject(hSubGroupMenuObject, MCO_OPT_CHECK_SERVICE, "CLISTMENUSSubGroup/SubGroupMenuCheckService");
-	{
-		CMenuItem mi(&g_plugin);
-		mi.pszService = "CLISTMENUSSubGroup/GroupMenuExecProxy";
-		CreateServiceFunction(mi.pszService, GroupMenuExecProxy);
-
-		SET_UID(mi, 0xd208f1d2, 0x7220, 0x4d37, 0xb6, 0xe4, 0xd5, 0x4a, 0xe8, 0xa3, 0xf4, 0x53);
-		mi.position = 1000;
-		mi.name.a = LPGEN("New group");
-		mi.hIcolibItem = Skin_GetIconHandle(SKINICON_AUTH_ADD);
-		gmp.wParam = POPUP_NEWGROUP;
-		Menu_AddSubGroupMenuItem(&mi, &gmp);
-
-		SET_UID(mi, 0x24bcb592, 0x660e, 0x4541, 0xa0, 0xac, 0x11, 0x4a, 0x23, 0xc8, 0x9b, 0x91);
-		mi.position++;
-		mi.name.a = LPGEN("New subgroup");
-		gmp.wParam = POPUP_NEWSUBGROUP;
-		Menu_AddSubGroupMenuItem(&mi, &gmp);
-
-		SET_UID(mi, 0xd85f5ff0, 0x12ca, 0x464d, 0x86, 0x51, 0x53, 0x36, 0x9f, 0x1d, 0x80, 0x45);
-		mi.position++;
-		mi.hIcolibItem = nullptr;
-		mi.name.a = LPGEN("Hide offline users in here");
-		gmp.wParam = POPUP_GROUPHIDEOFFLINE;
-		hHideOfflineUsersHereMenuItem = Menu_AddSubGroupMenuItem(&mi, &gmp);
-
-		SET_UID(mi, 0xf0953dd, 0x5c31, 0x48a4, 0xb4, 0x16, 0x89, 0x5, 0x97, 0xd0, 0x75, 0x3e);
-		mi.position = 900001;
-		mi.hIcolibItem = Skin_GetIconHandle(SKINICON_OTHER_RENAME);
-		mi.name.a = LPGEN("Rename group");
-		gmp.wParam = POPUP_RENAMEGROUP;
-		Menu_AddSubGroupMenuItem(&mi, &gmp);
-
-		SET_UID(mi, 0xb0d63cda, 0xa743, 0x4cfa, 0xa6, 0x2d, 0x50, 0xc0, 0x90, 0xe7, 0x6a, 0xc4);
-		mi.position++;
-		mi.hIcolibItem = Skin_GetIconHandle(SKINICON_OTHER_DELETE);
-		mi.name.a = LPGEN("Delete group");
-		gmp.wParam = POPUP_DELETEGROUP;
-		Menu_AddSubGroupMenuItem(&mi, &gmp);
-	}
+	CMenuItem mi(&g_plugin);
+
+	SET_UID(mi, 0x2f75bc72, 0xd836, 0x4922, 0x9f, 0xe, 0xed, 0x9e, 0xe7, 0x2b, 0x84, 0xf0);
+	mi.position = 100000;
+	mi.hIcolibItem = Skin_GetIconHandle(SKINICON_OTHER_GROUPADD);
+	mi.pszService = "CLISTMENUSGroup/CreateGroupHelper";
+	mi.name.a = LPGEN("New group");
+	Menu_AddGroupMenuItem(&mi);
+	CreateServiceFunction(mi.pszService, CreateGroupHelper);
+
+	SET_UID(mi, 0x24bcb592, 0x660e, 0x4541, 0xa0, 0xac, 0x11, 0x4a, 0x23, 0xc8, 0x9b, 0x91);
+	mi.position++;
+	mi.name.a = LPGEN("New subgroup");
+	mi.pszService = "CLISTMENUSGroup/CreateGroupHelper";
+	hmiCreateSubgroup = Menu_AddGroupMenuItem(&mi);
+	CreateServiceFunction(mi.pszService, CreateSubGroupHelper);
+
+	SET_UID(mi, 0xe6269658, 0x69, 0x4094, 0x9b, 0x35, 0x4e, 0x80, 0x29, 0x26, 0xf, 0x8e);
+	mi.position = 500001;
+	mi.hIcolibItem = nullptr;
+	mi.pszService = MS_CLIST_TOGGLEHIDEOFFLINE;
+	mi.name.a = LPGEN("Hide offline users");
+	hmiHideOfflineUsers = Menu_AddGroupMenuItem(&mi);
+	CreateServiceFunction(mi.pszService, ToggleOfflineHelper);
+
+	SET_UID(mi, 0xeded7371, 0xf6e6, 0x48c3, 0x8c, 0x9e, 0x62, 0xc1, 0xd5, 0xcb, 0x51, 0xbc);
+	mi.position++;
+	mi.pszService = MS_CLIST_TOGGLEHIDEOFFLINEROOT;
+	mi.name.a = LPGEN("Hide offline users out here");
+	hmiHideOfflineUsersOutHere = Menu_AddGroupMenuItem(&mi);
+	CreateServiceFunction(mi.pszService, HideOfflineRootHelper);
+
+	SET_UID(mi, 0x4c17b9cf, 0x513a, 0x41d8, 0x8d, 0x2b, 0x89, 0x44, 0x81, 0x14, 0x0, 0x91);
+	mi.position++;
+	mi.pszService = MS_CLIST_TOGGLEEMPTYGROUPS;
+	mi.name.a = LPGEN("Hide empty groups");
+	hmiHideEmptyGroups = Menu_AddGroupMenuItem(&mi);
+	CreateServiceFunction(mi.pszService, HideGroupsHelper);
+
+	SET_UID(mi, 0xfcbdbbb1, 0xa553, 0x49ac, 0xa5, 0xdf, 0xb4, 0x81, 0x38, 0xf, 0xa0, 0xc7);
+	mi.position++;
+	mi.pszService = MS_CLIST_TOGGLEGROUPS;
+	mi.name.a = LPGEN("Disable groups");
+	hmiDisableGroups = Menu_AddGroupMenuItem(&mi);
+	CreateServiceFunction(mi.pszService, UseGroupsHelper);
+	
+	SET_UID(mi, 0xd85f5ff0, 0x12ca, 0x464d, 0x86, 0x51, 0x53, 0x36, 0x9f, 0x1d, 0x80, 0x45);
+	mi.position = 900001;
+	mi.hIcolibItem = nullptr;
+	mi.name.a = LPGEN("Hide offline users in here");
+	mi.pszService = "CLISTMENUSGroup/HideInGroupHelper";
+	hmiHideOfflineUsersInHere = Menu_AddGroupMenuItem(&mi);
+	CreateServiceFunction(mi.pszService, HideInGroupHelper);
+
+	SET_UID(mi, 0xf0953dd, 0x5c31, 0x48a4, 0xb4, 0x16, 0x89, 0x5, 0x97, 0xd0, 0x75, 0x3e);
+	mi.position++;
+	mi.name.a = LPGEN("Rename group");
+	mi.hIcolibItem = Skin_GetIconHandle(SKINICON_OTHER_RENAME);
+	mi.pszService = "CLISTMENUSGroup/RenameGroupHelper";
+	hmiRenameGroup = Menu_AddGroupMenuItem(&mi);
+	CreateServiceFunction(mi.pszService, RenameGroupHelper);
+
+	SET_UID(mi, 0xb0d63cda, 0xa743, 0x4cfa, 0xa6, 0x2d, 0x50, 0xc0, 0x90, 0xe7, 0x6a, 0xc4);
+	mi.position++;
+	mi.name.a = LPGEN("Delete group");
+	mi.hIcolibItem = Skin_GetIconHandle(SKINICON_OTHER_DELETE);
+	mi.pszService = "CLISTMENUSGroup/DeleteGroupHelper";
+	hmiDeleteGroup = Menu_AddGroupMenuItem(&mi);
+	CreateServiceFunction(mi.pszService, DeleteGroupHelper);
 }
diff --git a/src/mir_app/src/mir_app.def b/src/mir_app/src/mir_app.def
index f1267d12ad..9a82e8e1f0 100644
--- a/src/mir_app/src/mir_app.def
+++ b/src/mir_app/src/mir_app.def
@@ -158,7 +158,6 @@ Menu_BuildContactMenu @226
 Menu_GetMainMenu @228
 Menu_GetStatusMenu @229
 Menu_AddGroupMenuItem @231
-Menu_AddSubGroupMenuItem @232
 Menu_AddTrayMenuItem @234
 Menu_BuildTrayMenu @235
 Menu_DestroyNestedMenu @236
diff --git a/src/mir_app/src/mir_app64.def b/src/mir_app/src/mir_app64.def
index 4dd4d1e245..64227040f5 100644
--- a/src/mir_app/src/mir_app64.def
+++ b/src/mir_app/src/mir_app64.def
@@ -158,7 +158,6 @@ Menu_BuildContactMenu @226
 Menu_GetMainMenu @228
 Menu_GetStatusMenu @229
 Menu_AddGroupMenuItem @231
-Menu_AddSubGroupMenuItem @232
 Menu_AddTrayMenuItem @234
 Menu_BuildTrayMenu @235
 Menu_DestroyNestedMenu @236
diff --git a/src/mir_app/src/resource.h b/src/mir_app/src/resource.h
index d3bd1a71b9..1576f6d873 100644
--- a/src/mir_app/src/resource.h
+++ b/src/mir_app/src/resource.h
@@ -664,9 +664,6 @@
 #define ID_ICQ_EXIT                     40001
 #define IDM_COPY                        40001
 #define ID_RESET                        40002
-#define POPUP_NEWGROUP                  40003
-#define POPUP_NEWSUBGROUP               40004
-#define POPUP_GROUPHIDEOFFLINE          40006
 #define IDM_SENDMESSAGE                 40009
 #define IDM_COPYALL                     40011
 #define IDM_SELECTALL                   40012
@@ -675,8 +672,6 @@
 #define IDM_COPYLINK                    40015
 #define ID_CANCELCHANGE                 40018
 #define POPUP_GROUPSHOWOFFLINE          40019
-#define POPUP_RENAMEGROUP               40052
-#define POPUP_DELETEGROUP               40053
 #define ID_GROUP                        40066
 #define ID_UNGROUP                      40067
 #define IDM_SEARCH_GOOGLE               40080
-- 
cgit v1.2.3