From de1514fc0896e3e8dc76a0c6be90b810186afdde Mon Sep 17 00:00:00 2001
From: George Hazan <ghazan@miranda.im>
Date: Wed, 18 Sep 2019 18:09:18 +0300
Subject: Scriver: typing options -> UI classes

---
 plugins/Scriver/src/chat_options.cpp |  33 ++++-
 plugins/Scriver/src/msgoptions.cpp   | 243 ++++++++++++++---------------------
 2 files changed, 126 insertions(+), 150 deletions(-)

(limited to 'plugins/Scriver')

diff --git a/plugins/Scriver/src/chat_options.cpp b/plugins/Scriver/src/chat_options.cpp
index 318eb64e72..c3ae07d1d3 100644
--- a/plugins/Scriver/src/chat_options.cpp
+++ b/plugins/Scriver/src/chat_options.cpp
@@ -223,7 +223,7 @@ static INT CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM p
 
 #define OPT_FIXHEADINGS (WM_USER+1)
 
-INT_PTR CALLBACK DlgProcOptions1(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+static INT_PTR CALLBACK DlgProcOptions1(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
 	static HTREEITEM hListHeading1 = nullptr;
 	static HTREEITEM hListHeading4 = nullptr;
@@ -329,7 +329,7 @@ INT_PTR CALLBACK DlgProcOptions1(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM
 	return FALSE;
 }
 
-INT_PTR CALLBACK DlgProcOptions2(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+static INT_PTR CALLBACK DlgProcOptions2(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
 	static HTREEITEM hListHeading2 = nullptr;
 	static HTREEITEM hListHeading3 = nullptr;
@@ -621,7 +621,7 @@ INT_PTR CALLBACK DlgProcOptions2(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM
 	return FALSE;
 }
 
-INT_PTR CALLBACK DlgProcOptionsPopup(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+static INT_PTR CALLBACK DlgProcOptionsPopup(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
 	switch (uMsg) {
 	case WM_INITDIALOG:
@@ -716,3 +716,30 @@ INT_PTR CALLBACK DlgProcOptionsPopup(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPA
 	}
 	return FALSE;
 }
+
+void ChatOptInitialize(WPARAM wParam)
+{
+	OPTIONSDIALOGPAGE odp = {};
+	odp.position = 910000000;
+	odp.flags = ODPF_BOLDGROUPS;
+	odp.szGroup.a = LPGEN("Message sessions");
+	odp.szTitle.a = LPGEN("Group chats");
+
+	odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTIONS1);
+	odp.pfnDlgProc = DlgProcOptions1;
+	odp.szTab.a = LPGEN("General");
+	g_plugin.addOptions(wParam, &odp);
+
+	odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTIONS2);
+	odp.pfnDlgProc = DlgProcOptions2;
+	odp.szTab.a = LPGEN("Event log");
+	g_plugin.addOptions(wParam, &odp);
+
+	////////////////////////////////////////////////////////////////////////////////////////
+	odp.position = 910000002;
+	odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTIONSPOPUP);
+	odp.szGroup.a = LPGEN("Popups");
+	odp.szTitle.a = LPGEN("Messaging");
+	odp.pfnDlgProc = DlgProcOptionsPopup;
+	g_plugin.addOptions(wParam, &odp);
+}
diff --git a/plugins/Scriver/src/msgoptions.cpp b/plugins/Scriver/src/msgoptions.cpp
index 45660ba6bc..09f89361da 100644
--- a/plugins/Scriver/src/msgoptions.cpp
+++ b/plugins/Scriver/src/msgoptions.cpp
@@ -23,10 +23,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 #include "stdafx.h"
 
-INT_PTR CALLBACK DlgProcOptions1(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
-INT_PTR CALLBACK DlgProcOptions2(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
-INT_PTR CALLBACK DlgProcOptionsPopup(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
-
 #define FONTF_BOLD   1
 #define FONTF_ITALIC 2
 
@@ -712,144 +708,118 @@ public:
 
 /////////////////////////////////////////////////////////////////////////////////////////
 
-static void ResetCList(HWND hwndDlg)
+class CTypeOptionsDlg : public CDlgBase
 {
-	if (!db_get_b(0, "CList", "UseGroups", SETTING_USEGROUPS_DEFAULT))
-		SendDlgItemMessage(hwndDlg, IDC_CLIST, CLM_SETUSEGROUPS, FALSE, 0);
-	else
-		SendDlgItemMessage(hwndDlg, IDC_CLIST, CLM_SETUSEGROUPS, TRUE, 0);
-	SendDlgItemMessage(hwndDlg, IDC_CLIST, CLM_SETHIDEEMPTYGROUPS, 1, 0);
-}
+	HANDLE hItemNew, hItemUnknown;
 
-static void RebuildList(HWND hwndDlg, HANDLE hItemNew, HANDLE hItemUnknown)
-{
-	BYTE defType = g_plugin.bTypingNew;
-	if (hItemNew && defType)
-		SendDlgItemMessage(hwndDlg, IDC_CLIST, CLM_SETCHECKMARK, (WPARAM)hItemNew, 1);
+	CCtrlClc m_list;
+	CCtrlCheck chkTyping, chkTypingWin, chkTypingTray, chkTypingBalloon, chkTypingClist, chkTypingSwitch;
 
-	if (hItemUnknown && g_plugin.bTypingUnknown)
-		SendDlgItemMessage(hwndDlg, IDC_CLIST, CLM_SETCHECKMARK, (WPARAM)hItemUnknown, 1);
+public:
+	CTypeOptionsDlg() :
+		CDlgBase(g_plugin, IDD_OPT_MSGTYPE),
+		m_list(this, IDC_CLIST),
+		chkTyping(this, IDC_SHOWNOTIFY),
+		chkTypingWin(this, IDC_TYPEWIN),
+		chkTypingTray(this, IDC_TYPETRAY),
+		chkTypingClist(this, IDC_NOTIFYTRAY),
+		chkTypingSwitch(this, IDC_TYPINGSWITCH),
+		chkTypingBalloon(this, IDC_NOTIFYBALLOON)
+	{
+		CreateLink(chkTyping, g_plugin.bShowTyping);
+		CreateLink(chkTypingWin, g_plugin.bShowTypingWin);
+		CreateLink(chkTypingTray, g_plugin.bShowTypingTray);
+		CreateLink(chkTypingClist, g_plugin.bShowTypingClist);
+		CreateLink(chkTypingSwitch, g_plugin.bShowTypingSwitch);
+
+		m_list.OnListRebuilt = Callback(this, &CTypeOptionsDlg::onRebuildClist);
+		m_list.OnOptionsChanged = Callback(this, &CTypeOptionsDlg::onResetClist);
 
-	for (auto &hContact : Contacts()) {
-		HANDLE hItem = (HANDLE)SendDlgItemMessage(hwndDlg, IDC_CLIST, CLM_FINDCONTACT, hContact, 0);
-		if (hItem && g_plugin.getByte(hContact, SRMSGSET_TYPING, defType))
-			SendDlgItemMessage(hwndDlg, IDC_CLIST, CLM_SETCHECKMARK, (WPARAM)hItem, 1);
+		chkTyping.OnChange = Callback(this, &CTypeOptionsDlg::onChange_Notify);
+		chkTypingTray.OnChange = Callback(this, &CTypeOptionsDlg::onChange_Tray);
 	}
-}
 
-static void SaveList(HWND hwndDlg, HANDLE hItemNew, HANDLE hItemUnknown)
-{
-	if (hItemNew)
-		g_plugin.bTypingNew = SendDlgItemMessage(hwndDlg, IDC_CLIST, CLM_GETCHECKMARK, (WPARAM)hItemNew, 0) != 0;
+	bool OnInitDialog() override
+	{
+		CLCINFOITEM cii = { sizeof(cii) };
+		cii.flags = CLCIIF_GROUPFONT | CLCIIF_CHECKBOX;
+		cii.pszText = TranslateT("** New contacts **");
+		hItemNew = m_list.AddInfoItem(&cii);
+		cii.pszText = TranslateT("** Unknown contacts **");
+		hItemUnknown = m_list.AddInfoItem(&cii);
 
-	if (hItemUnknown)
-		g_plugin.bTypingUnknown = SendDlgItemMessage(hwndDlg, IDC_CLIST, CLM_GETCHECKMARK, (WPARAM)hItemUnknown, 0) != 0;
+		SetWindowLongPtr(m_list.GetHwnd(), GWL_STYLE, GetWindowLongPtr(m_list.GetHwnd(), GWL_STYLE) | CLS_SHOWHIDDEN | CLS_NOHIDEOFFLINE);
+		onResetClist(0);
 
-	for (auto &hContact : Contacts()) {
-		HANDLE hItem = (HANDLE)SendDlgItemMessage(hwndDlg, IDC_CLIST, CLM_FINDCONTACT, hContact, 0);
-		if (hItem)
-			g_plugin.setByte(hContact, SRMSGSET_TYPING, (BYTE)(SendDlgItemMessage(hwndDlg, IDC_CLIST, CLM_GETCHECKMARK, (WPARAM)hItem, 0) ? 1 : 0));
+		chkTypingBalloon.SetState(!g_plugin.bShowTypingClist);
+
+		onChange_Notify(0);
+		onChange_Tray(0);
+		return true;
 	}
-}
 
-static INT_PTR CALLBACK DlgProcTypeOptions(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
-{
-	static HANDLE hItemNew, hItemUnknown;
-
-	switch (msg) {
-	case WM_INITDIALOG:
-		TranslateDialogDefault(hwndDlg);
-		{
-			CLCINFOITEM cii = { sizeof(cii) };
-			cii.flags = CLCIIF_GROUPFONT | CLCIIF_CHECKBOX;
-			cii.pszText = (wchar_t*)TranslateT("** New contacts **");
-			hItemNew = (HANDLE)SendDlgItemMessage(hwndDlg, IDC_CLIST, CLM_ADDINFOITEM, 0, (LPARAM)&cii);
-			cii.pszText = (wchar_t*)TranslateT("** Unknown contacts **");
-			hItemUnknown = (HANDLE)SendDlgItemMessage(hwndDlg, IDC_CLIST, CLM_ADDINFOITEM, 0, (LPARAM)&cii);
-		}
+	bool OnApply() override
+	{
+		if (hItemNew)
+			g_plugin.bTypingNew = m_list.GetCheck(hItemNew);
 
-		SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_CLIST), GWL_STYLE, GetWindowLongPtr(GetDlgItem(hwndDlg, IDC_CLIST), GWL_STYLE) | CLS_SHOWHIDDEN | CLS_NOHIDEOFFLINE);
-		ResetCList(hwndDlg);
-
-		CheckDlgButton(hwndDlg, IDC_SHOWNOTIFY, g_plugin.bShowTyping ? BST_CHECKED : BST_UNCHECKED);
-		CheckDlgButton(hwndDlg, IDC_TYPEWIN, g_plugin.bShowTypingWin ? BST_CHECKED : BST_UNCHECKED);
-		CheckDlgButton(hwndDlg, IDC_TYPETRAY, g_plugin.bShowTypingTray ? BST_CHECKED : BST_UNCHECKED);
-		CheckDlgButton(hwndDlg, IDC_NOTIFYTRAY, g_plugin.bShowTypingClist ? BST_CHECKED : BST_UNCHECKED);
-		CheckDlgButton(hwndDlg, IDC_NOTIFYBALLOON, !g_plugin.bShowTypingClist ? BST_CHECKED : BST_UNCHECKED);
-		CheckDlgButton(hwndDlg, IDC_TYPINGSWITCH, g_plugin.bShowTypingSwitch ? BST_CHECKED : BST_UNCHECKED);
-		EnableWindow(GetDlgItem(hwndDlg, IDC_TYPEWIN), IsDlgButtonChecked(hwndDlg, IDC_SHOWNOTIFY));
-		EnableWindow(GetDlgItem(hwndDlg, IDC_TYPETRAY), IsDlgButtonChecked(hwndDlg, IDC_SHOWNOTIFY));
-		EnableWindow(GetDlgItem(hwndDlg, IDC_NOTIFYTRAY), IsDlgButtonChecked(hwndDlg, IDC_TYPETRAY));
-		EnableWindow(GetDlgItem(hwndDlg, IDC_NOTIFYBALLOON), IsDlgButtonChecked(hwndDlg, IDC_TYPETRAY));
-		break;
-
-	case WM_COMMAND:
-		switch (LOWORD(wParam)) {
-		case IDC_TYPETRAY:
-			if (IsDlgButtonChecked(hwndDlg, IDC_TYPETRAY)) {
-				EnableWindow(GetDlgItem(hwndDlg, IDC_NOTIFYTRAY), TRUE);
-				EnableWindow(GetDlgItem(hwndDlg, IDC_NOTIFYBALLOON), TRUE);
-			}
-			else {
-				EnableWindow(GetDlgItem(hwndDlg, IDC_NOTIFYTRAY), FALSE);
-				EnableWindow(GetDlgItem(hwndDlg, IDC_NOTIFYBALLOON), FALSE);
-			}
-			SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
-			break;
+		if (hItemUnknown)
+			g_plugin.bTypingUnknown = m_list.GetCheck(hItemUnknown);
 
-		case IDC_SHOWNOTIFY:
-			EnableWindow(GetDlgItem(hwndDlg, IDC_TYPEWIN), IsDlgButtonChecked(hwndDlg, IDC_SHOWNOTIFY));
-			EnableWindow(GetDlgItem(hwndDlg, IDC_TYPETRAY), IsDlgButtonChecked(hwndDlg, IDC_SHOWNOTIFY));
-			EnableWindow(GetDlgItem(hwndDlg, IDC_NOTIFYTRAY), IsDlgButtonChecked(hwndDlg, IDC_SHOWNOTIFY));
-			EnableWindow(GetDlgItem(hwndDlg, IDC_NOTIFYBALLOON), IsDlgButtonChecked(hwndDlg, IDC_SHOWNOTIFY));
-			__fallthrough;
-
-		case IDC_TYPEWIN:
-		case IDC_NOTIFYTRAY:
-		case IDC_NOTIFYBALLOON:
-		case IDC_TYPINGSWITCH:
-			SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
-			break;
+		for (auto &hContact : Contacts()) {
+			HANDLE hItem = m_list.FindContact(hContact);
+			if (hItem)
+				g_plugin.setByte(hContact, SRMSGSET_TYPING, m_list.GetCheck(hItem));
 		}
-		break;
-	
-	case WM_NOTIFY:
-		switch (((NMHDR *)lParam)->idFrom) {
-		case IDC_CLIST:
-			switch (((NMHDR *)lParam)->code) {
-			case CLN_OPTIONSCHANGED:
-				ResetCList(hwndDlg);
-				break;
-			case CLN_CHECKCHANGED:
-				SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
-				break;
-			case CLN_LISTREBUILT:
-				RebuildList(hwndDlg, hItemNew, hItemUnknown);
-				break;
-			}
-			break;
-		
-		case 0:
-			switch (((LPNMHDR)lParam)->code) {
-			case PSN_APPLY:
-				SaveList(hwndDlg, hItemNew, hItemUnknown);
-				g_plugin.bShowTyping = IsDlgButtonChecked(hwndDlg, IDC_SHOWNOTIFY);
-				g_plugin.bShowTypingWin = IsDlgButtonChecked(hwndDlg, IDC_TYPEWIN);
-				g_plugin.bShowTypingTray = IsDlgButtonChecked(hwndDlg, IDC_TYPETRAY);
-				g_plugin.bShowTypingClist = IsDlgButtonChecked(hwndDlg, IDC_NOTIFYTRAY);
-				g_plugin.bShowTypingSwitch = IsDlgButtonChecked(hwndDlg, IDC_TYPINGSWITCH);
-				ReloadGlobals();
-				Srmm_Broadcast(DM_OPTIONSAPPLIED, 0, 0);
-			}
-			break;
+
+		ReloadGlobals();
+		Srmm_Broadcast(DM_OPTIONSAPPLIED, 0, 0);
+		return true;
+	}
+
+	void onChange_Notify(CCtrlCheck *)
+	{
+		bool bChecked = chkTyping.GetState();
+		chkTypingWin.Enable(bChecked);
+		chkTypingTray.Enable(bChecked);
+		chkTypingClist.Enable(bChecked);
+		chkTypingBalloon.Enable(bChecked);
+	}
+
+	void onChange_Tray(CCtrlCheck *)
+	{
+		bool bChecked = chkTypingTray.GetState();
+		chkTypingClist.Enable(bChecked);
+		chkTypingBalloon.Enable(bChecked);
+	}
+
+	void onRebuildClist(CCtrlClc *)
+	{
+		BYTE defType = g_plugin.bTypingNew;
+		if (hItemNew && defType)
+			m_list.SetCheck(hItemNew, 1);
+
+		if (hItemUnknown && g_plugin.bTypingUnknown)
+			m_list.SetCheck(hItemUnknown, 1);
+
+		for (auto &hContact : Contacts()) {
+			HANDLE hItem = m_list.FindContact(hContact);
+			if (hItem && g_plugin.getByte(hContact, SRMSGSET_TYPING, defType))
+				m_list.SetCheck(hItem, 1);
 		}
-		break;
 	}
-	return FALSE;
-}
+
+	void onResetClist(CCtrlClc *)
+	{
+		m_list.SetUseGroups(db_get_b(0, "CList", "UseGroups", SETTING_USEGROUPS_DEFAULT));
+		m_list.SetHideEmptyGroups(true);
+	}
+};
 
 /////////////////////////////////////////////////////////////////////////////////////////
 
+void ChatOptInitialize(WPARAM);
+
 int OptInitialise(WPARAM wParam, LPARAM)
 {
 	OPTIONSDIALOGPAGE odp = {};
@@ -874,33 +844,12 @@ int OptInitialise(WPARAM wParam, LPARAM)
 	g_plugin.addOptions(wParam, &odp);
 
 	////////////////////////////////////////////////////////////////////////////////////////
-	odp.pDialog = nullptr;
 	odp.szGroup.a = LPGEN("Message sessions");
-	odp.szTitle.a = LPGEN("Group chats");
-
-	odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTIONS1);
-	odp.pfnDlgProc = DlgProcOptions1;
-	odp.szTab.a = LPGEN("General");
-	g_plugin.addOptions(wParam, &odp);
-
-	odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTIONS2);
-	odp.pfnDlgProc = DlgProcOptions2;
-	odp.szTab.a = LPGEN("Event log");
-	g_plugin.addOptions(wParam, &odp);
-
-	////////////////////////////////////////////////////////////////////////////////////////
-	odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_MSGTYPE);
 	odp.szTitle.a = LPGEN("Typing notify");
-	odp.pfnDlgProc = DlgProcTypeOptions;
-	odp.szTab.a = nullptr;
+	odp.pDialog = new CTypeOptionsDlg();
 	g_plugin.addOptions(wParam, &odp);
 
 	////////////////////////////////////////////////////////////////////////////////////////
-	odp.position = 910000002;
-	odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTIONSPOPUP);
-	odp.szGroup.a = LPGEN("Popups");
-	odp.szTitle.a = LPGEN("Messaging");
-	odp.pfnDlgProc = DlgProcOptionsPopup;
-	g_plugin.addOptions(wParam, &odp);
+	ChatOptInitialize(wParam);
 	return 0;
 }
-- 
cgit v1.2.3