From 7dddb66b003f830035dd9364da563477204e7ae1 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Fri, 10 Jul 2020 15:54:20 +0300 Subject: NoHistory: option added to enable history removal for newly added contacts --- plugins/NoHistory/src/dllmain.cpp | 14 +- plugins/NoHistory/src/options.cpp | 393 ++++++++++++++++++-------------------- plugins/NoHistory/src/stdafx.h | 3 + plugins/NoHistory/src/version.h | 14 +- 4 files changed, 213 insertions(+), 211 deletions(-) diff --git a/plugins/NoHistory/src/dllmain.cpp b/plugins/NoHistory/src/dllmain.cpp index 4f51522157..c0e80b7676 100644 --- a/plugins/NoHistory/src/dllmain.cpp +++ b/plugins/NoHistory/src/dllmain.cpp @@ -41,7 +41,8 @@ PLUGININFOEX pluginInfoEx = }; CMPlugin::CMPlugin() : - PLUGIN(MODULENAME, pluginInfoEx) + PLUGIN(MODULENAME, pluginInfoEx), + bEnabledForNew(MODULENAME, "EnabledForNew", true) {} ///////////////////////////////////////////////////////////////////////////////////////// @@ -198,8 +199,18 @@ int IconPressed(WPARAM hContact, LPARAM lParam) return 0; } +///////////////////////////////////////////////////////////////////////////////////////// +// add default setting for new contacts +static int OnContactAdded(WPARAM hContact, LPARAM) +{ + g_plugin.setByte(hContact, DBSETTING_REMOVE, g_plugin.bEnabledForNew); + return 0; +} + +///////////////////////////////////////////////////////////////////////////////////////// // add icon to srmm status icons + void SrmmMenu_Load() { StatusIconData sid = {}; @@ -256,6 +267,7 @@ int CMPlugin::Load() InitIcons(); HookEvent(ME_CLIST_PREBUILDCONTACTMENU, PrebuildContactMenu); + HookEvent(ME_DB_CONTACT_ADDED, OnContactAdded); HookEvent(ME_DB_EVENT_ADDED, OnDatabaseEventAdd); HookEvent(ME_OPT_INITIALISE, OptInit); HookEvent(ME_SYSTEM_MODULESLOADED, ModulesLoaded); diff --git a/plugins/NoHistory/src/options.cpp b/plugins/NoHistory/src/options.cpp index 92944f174f..f34b580395 100644 --- a/plugins/NoHistory/src/options.cpp +++ b/plugins/NoHistory/src/options.cpp @@ -1,232 +1,219 @@ #include "stdafx.h" -static void SetListGroupIcons(HWND hwndList, HANDLE hFirstItem, HANDLE hParentItem, int *groupChildCount) +class CDlgOptionsDlg : public CDlgBase { - int iconOn = 1; - int childCount = 0; - int iImage; - HANDLE hItem; - - int typeOfFirst = SendMessage(hwndList, CLM_GETITEMTYPE, (WPARAM)hFirstItem, 0); - - //check groups - if (typeOfFirst == CLCIT_GROUP) - hItem = hFirstItem; - else - hItem = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_NEXTGROUP, (LPARAM)hFirstItem); - while (hItem) { - HANDLE hChildItem = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_CHILD, (LPARAM)hItem); - if (hChildItem) - SetListGroupIcons(hwndList, hChildItem, hItem, &childCount); - if (iconOn && SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hItem, 0) == 0) - iconOn = 0; - hItem = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_NEXTGROUP, (LPARAM)hItem); - } + HANDLE hItemAll, hItemNew; + + CCtrlClc clist; + + void SetListGroupIcons(HANDLE hFirstItem, HANDLE hParentItem, int *groupChildCount = nullptr) + { + int iconOn = 1; + int childCount = 0; + + int typeOfFirst = clist.GetItemType(hFirstItem); + + // check groups + HANDLE hItem = (typeOfFirst == CLCIT_GROUP) ? hFirstItem : clist.GetNextItem(hFirstItem, CLGN_NEXTGROUP); + while (hItem) { + HANDLE hChildItem = clist.GetNextItem(hItem, CLGN_CHILD); + if (hChildItem) + SetListGroupIcons(hChildItem, hItem, &childCount); + if (iconOn && clist.GetExtraImage(hItem, 0) == 0) + iconOn = 0; + hItem = clist.GetNextItem(hItem, CLGN_NEXTGROUP); + } - //check contacts - if (typeOfFirst == CLCIT_CONTACT) - hItem = hFirstItem; - else - hItem = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_NEXTCONTACT, (LPARAM)hFirstItem); - while (hItem) { - iImage = SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hItem, 0); - if (iconOn && iImage == 0) - iconOn = 0; - if (iImage != EMPTY_EXTRA_ICON) - childCount++; - hItem = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_NEXTCONTACT, (LPARAM)hItem); - } - //set icons - SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hParentItem, MAKELPARAM(0, childCount ? (iconOn ? 1 : 0) : EMPTY_EXTRA_ICON)); - if (groupChildCount) - *groupChildCount += childCount; -} + // check contacts + hItem = (typeOfFirst == CLCIT_CONTACT) ? hFirstItem : clist.GetNextItem(hFirstItem, CLGN_NEXTCONTACT); + while (hItem) { + int iImage = clist.GetExtraImage(hItem, 0); + if (iconOn && iImage == 0) + iconOn = 0; + if (iImage != EMPTY_EXTRA_ICON) + childCount++; + hItem = clist.GetNextItem(hItem, CLGN_NEXTCONTACT); + } -static void SetAllChildIcons(HWND hwndList, HANDLE hFirstItem, int iColumn, int iImage) -{ - HANDLE hItem; - - int typeOfFirst = SendMessage(hwndList, CLM_GETITEMTYPE, (WPARAM)hFirstItem, 0); - //check groups - if (typeOfFirst == CLCIT_GROUP) hItem = hFirstItem; - else hItem = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_NEXTGROUP, (LPARAM)hFirstItem); - while (hItem) { - HANDLE hChildItem = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_CHILD, (LPARAM)hItem); - if (hChildItem) - SetAllChildIcons(hwndList, hChildItem, iColumn, iImage); - hItem = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_NEXTGROUP, (LPARAM)hItem); + // set icons + clist.SetExtraImage(hParentItem, 0, childCount ? (iconOn ? 1 : 0) : EMPTY_EXTRA_ICON); + if (groupChildCount) + *groupChildCount += childCount; } - //check contacts - if (typeOfFirst == CLCIT_CONTACT) - hItem = hFirstItem; - else - hItem = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_NEXTCONTACT, (LPARAM)hFirstItem); - - while (hItem) { - int iOldIcon = SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hItem, iColumn); - if (iOldIcon != EMPTY_EXTRA_ICON && iOldIcon != iImage) - SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(iColumn, iImage)); - hItem = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_NEXTCONTACT, (LPARAM)hItem); - } -} -static void ResetListOptions(HWND hwndList) -{ - SetWindowLongPtr(hwndList, GWL_STYLE, GetWindowLongPtr(hwndList, GWL_STYLE) | CLS_SHOWHIDDEN); -} + void SetAllChildIcons(HANDLE hFirstItem, int iColumn, int iImage) + { + int typeOfFirst = clist.GetItemType(hFirstItem); + // check groups + HANDLE hItem = (typeOfFirst == CLCIT_GROUP) ? hFirstItem : clist.GetNextItem(hFirstItem, CLGN_NEXTGROUP); + while (hItem) { + HANDLE hChildItem = clist.GetNextItem(hItem, CLGN_CHILD); + if (hChildItem) + SetAllChildIcons(hChildItem, iColumn, iImage); + hItem = clist.GetNextItem(hItem, CLGN_NEXTGROUP); + } + + // check contacts + hItem = (typeOfFirst == CLCIT_CONTACT) ? hFirstItem : clist.GetNextItem(hFirstItem, CLGN_NEXTCONTACT); + while (hItem) { + int iOldIcon = clist.GetExtraImage(hItem, iColumn); + if (iOldIcon != EMPTY_EXTRA_ICON && iOldIcon != iImage) + clist.SetExtraImage(hItem, iColumn, iImage); + hItem = clist.GetNextItem(hItem, CLGN_NEXTCONTACT); + } + } -static void SetAllContactIcons(HWND hwndList) -{ - for (auto &hContact : Contacts()) { - char *proto = Proto_GetBaseAccountName(hContact); - bool chat_room = (proto && db_get_b(hContact, proto, "ChatRoom", 0) != 0); - - if (!chat_room) { - HANDLE hItem = (HANDLE)SendMessage(hwndList, CLM_FINDCONTACT, hContact, 0); - if (hItem) { - bool disabled = (g_plugin.getByte(hContact, DBSETTING_REMOVE) == 1); - SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(0, disabled ? 1 : 0)); + void SetAllContactIcons() + { + for (auto &hContact : Contacts()) { + char *proto = Proto_GetBaseAccountName(hContact); + bool chat_room = (proto && db_get_b(hContact, proto, "ChatRoom", 0) != 0); + + if (!chat_room) { + HANDLE hItem = clist.FindContact(hContact); + if (hItem) { + bool disabled = (g_plugin.getByte(hContact, DBSETTING_REMOVE) == 1); + clist.SetExtraImage(hItem, 0, disabled ? 1 : 0); + } } } } -} -static INT_PTR CALLBACK DlgProcOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - static HANDLE hItemAll; - static HWND hwndList; - - switch (msg) { - case WM_INITDIALOG: - TranslateDialogDefault(hwndDlg); - hwndList = GetDlgItem(hwndDlg, IDC_LIST); - { - HIMAGELIST hIml = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR32 | ILC_MASK, 2, 2); - g_plugin.addImgListIcon(hIml, IDI_HKEEP); - g_plugin.addImgListIcon(hIml, IDI_HREMOVE); - SendMessage(hwndList, CLM_SETEXTRAIMAGELIST, 0, (LPARAM)hIml); - - SendDlgItemMessage(hwndDlg, IDC_PIC_KEEP, STM_SETICON, (WPARAM)g_plugin.getIcon(IDI_HKEEP), 0); - SendDlgItemMessage(hwndDlg, IDC_PIC_REMOVE, STM_SETICON, (WPARAM)g_plugin.getIcon(IDI_HREMOVE), 0); - } - ResetListOptions(hwndList); - SendMessage(hwndList, CLM_SETEXTRACOLUMNS, 1, 0); - { - CLCINFOITEM cii = { sizeof(cii) }; - cii.flags = CLCIIF_GROUPFONT; - cii.pszText = TranslateT("** All contacts **"); - hItemAll = (HANDLE)SendMessage(hwndList, CLM_ADDINFOITEM, 0, (LPARAM)&cii); - } +public: + CDlgOptionsDlg() : + CDlgBase(g_plugin, IDD_OPT), + clist(this, IDC_LIST) + { + clist.OnNewContact = clist.OnListRebuilt = Callback(this, &CDlgOptionsDlg::onListRebuilt); + clist.OnOptionsChanged = Callback(this, &CDlgOptionsDlg::onOptionsChanged); + clist.OnContactMoved = Callback(this, &CDlgOptionsDlg::onContactMoved); + clist.OnClick = Callback(this, &CDlgOptionsDlg::onClick); + } - SetAllContactIcons(hwndList); - SetListGroupIcons(hwndList, (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_ROOT, 0), hItemAll, nullptr); - - SendDlgItemMessage(hwndDlg, IDC_SPN_TIMEOUT, UDM_SETRANGE, 0, (LPARAM)MAKELONG(60 * 60, 1)); - return FALSE; - - case WM_SETFOCUS: - SetFocus(hwndList); - break; - - case WM_COMMAND: - if (HIWORD(wParam) == EN_CHANGE && (HWND)lParam == GetFocus()) - SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lParam)->idFrom) { - case IDC_LIST: - switch (((LPNMHDR)lParam)->code) { - case CLN_NEWCONTACT: - case CLN_LISTREBUILT: - SetAllContactIcons(hwndList); - //fall through - case CLN_CONTACTMOVED: - SetListGroupIcons(hwndList, (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_ROOT, 0), hItemAll, nullptr); - break; - - case CLN_OPTIONSCHANGED: - ResetListOptions(hwndList); - break; - - case NM_CLICK: - // Make sure we have an extra column - NMCLISTCONTROL *nm = (NMCLISTCONTROL*)lParam; - if (nm->iColumn == -1) - break; - - // Find clicked item - DWORD hitFlags; - HANDLE hItem = (HANDLE)SendMessage(hwndList, CLM_HITTEST, (WPARAM)&hitFlags, MAKELPARAM(nm->pt.x, nm->pt.y)); - if (hItem == nullptr || !(hitFlags & CLCHT_ONITEMEXTRA)) - break; - - // Get image in clicked column (0=none, 1=visible, 2=invisible) - int iImage = SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(nm->iColumn, 0)); - if (iImage == 0) - iImage = nm->iColumn + 1; - else if (iImage == 1) - iImage = 0; - - // Update list, making sure that the options are mutually exclusive - switch (SendMessage(hwndList, CLM_GETITEMTYPE, (WPARAM)hItem, 0)) { - case CLCIT_CONTACT: - SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(nm->iColumn, iImage)); - break; - case CLCIT_INFO: // All Contacts - SetAllChildIcons(hwndList, hItem, nm->iColumn, iImage); - break; - case CLCIT_GROUP: - hItem = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_CHILD, (LPARAM)hItem); - if (hItem) - SetAllChildIcons(hwndList, hItem, nm->iColumn, iImage); - } - // Update the all/none icons - SetListGroupIcons(hwndList, (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_ROOT, 0), hItemAll, nullptr); + bool OnInitDialog() override + { + HIMAGELIST hIml = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR32 | ILC_MASK, 2, 2); + g_plugin.addImgListIcon(hIml, IDI_HKEEP); + g_plugin.addImgListIcon(hIml, IDI_HREMOVE); + clist.SetExtraImageList(hIml); - // Activate Apply button - SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); - } - break; + SendDlgItemMessage(m_hwnd, IDC_PIC_KEEP, STM_SETICON, (WPARAM)g_plugin.getIcon(IDI_HKEEP), 0); + SendDlgItemMessage(m_hwnd, IDC_PIC_REMOVE, STM_SETICON, (WPARAM)g_plugin.getIcon(IDI_HREMOVE), 0); - case 0: - switch (((LPNMHDR)lParam)->code) { - case PSN_APPLY: - for (auto &hContact : Contacts()) { - char *proto = Proto_GetBaseAccountName(hContact); - bool chat_room = (proto && db_get_b(hContact, proto, "ChatRoom", 0) != 0); - - if (!chat_room) { - HANDLE hItem = (HANDLE)SendMessage(hwndList, CLM_FINDCONTACT, hContact, 0); - if (hItem) { - int iImage = SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(0, 0)); - g_plugin.setByte(hContact, DBSETTING_REMOVE, iImage == 1); - } - } + onOptionsChanged(0); + clist.SetExtraColumns(1); + + CLCINFOITEM cii = { sizeof(cii) }; + cii.flags = CLCIIF_GROUPFONT; + + cii.pszText = TranslateT("** All contacts **"); + hItemAll = clist.AddInfoItem(&cii); + + cii.pszText = TranslateT("** New contacts **"); + hItemNew = clist.AddInfoItem(&cii); + clist.SetExtraImage(hItemNew, 0, g_plugin.bEnabledForNew); + + onListRebuilt(0); + SetFocus(clist.GetHwnd()); + + SendDlgItemMessage(m_hwnd, IDC_SPN_TIMEOUT, UDM_SETRANGE, 0, (LPARAM)MAKELONG(60 * 60, 1)); + return true; + } + + bool OnApply() override + { + g_plugin.bEnabledForNew = clist.GetExtraImage(hItemNew, 0); + + for (auto &hContact : Contacts()) { + char *proto = Proto_GetBaseAccountName(hContact); + bool chat_room = (proto && db_get_b(hContact, proto, "ChatRoom", 0) != 0); + + if (!chat_room) { + HANDLE hItem = clist.FindContact(hContact); + if (hItem) { + int iImage = clist.GetExtraImage(hItem, 0); + g_plugin.setByte(hContact, DBSETTING_REMOVE, iImage == 1); } - return TRUE; } } - break; + return true; + } - case WM_DESTROY: - ImageList_Destroy((HIMAGELIST)SendMessage(hwndList, CLM_GETEXTRAIMAGELIST, 0, 0)); - break; + void OnDestroy() override + { + ImageList_Destroy(clist.GetExtraImageList()); } - return 0; -} + void onListRebuilt(CCtrlClc::TEventInfo *) + { + SetAllContactIcons(); + SetListGroupIcons(clist.GetNextItem(CLGN_ROOT, 0), hItemAll); + } + + void onOptionsChanged(CCtrlClc::TEventInfo *) + { + SetWindowLongPtr(clist.GetHwnd(), GWL_STYLE, GetWindowLongPtr(clist.GetHwnd(), GWL_STYLE) | CLS_SHOWHIDDEN | CLS_HIDEEMPTYGROUPS); + } + + void onContactMoved(CCtrlClc::TEventInfo *) + { + SetListGroupIcons(clist.GetNextItem(CLGN_ROOT, 0), hItemAll); + } + + void onClick(CCtrlClc::TEventInfo *ev) + { + // Make sure we have an extra column + NMCLISTCONTROL *nm = ev->info; + if (nm->iColumn == -1) + return; + + // Find clicked item + DWORD hitFlags; + HANDLE hItem = clist.HitTest(nm->pt.x, nm->pt.y, &hitFlags); + if (hItem == nullptr || !(hitFlags & CLCHT_ONITEMEXTRA)) + return; + + // Get image in clicked column + int iImage = clist.GetExtraImage(hItem, 0); + if (iImage == 0) + iImage = 0 + 1; + else if (iImage == 1) + iImage = 0; + + // Update list, making sure that the options are mutually exclusive + switch (clist.GetItemType(hItem)) { + case CLCIT_CONTACT: + clist.SetExtraImage(hItem, 0, iImage); + break; + case CLCIT_INFO: + if (hItem == hItemAll) + SetAllChildIcons(hItem, 0, iImage); + else + clist.SetExtraImage(hItem, 0, iImage); + break; + case CLCIT_GROUP: + hItem = clist.GetNextItem(hItem, CLGN_CHILD); + if (hItem) + SetAllChildIcons(hItem, 0, iImage); + } + + // Update the all/none icons + SetListGroupIcons(clist.GetNextItem(CLGN_ROOT, 0), hItemAll); + + // Activate Apply button + NotifyChange(); + } +}; int OptInit(WPARAM wParam, LPARAM) { OPTIONSDIALOGPAGE odp = {}; - odp.flags = ODPF_BOLDGROUPS | ODPF_UNICODE; + odp.flags = ODPF_BOLDGROUPS; odp.position = -790000000; - odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT); - odp.szTitle.w = LPGENW("No History"); - odp.szGroup.w = LPGENW("History"); - odp.szTab.w = LPGENW("Logging"); - odp.pfnDlgProc = DlgProcOpts; + odp.szGroup.a = LPGEN("History"); + odp.szTitle.a = LPGEN("No History"); + odp.szTab.a = LPGEN("Logging"); + odp.pDialog = new CDlgOptionsDlg(); g_plugin.addOptions(wParam, &odp); return 0; } diff --git a/plugins/NoHistory/src/stdafx.h b/plugins/NoHistory/src/stdafx.h index 5da0cb63ac..82ca708c8a 100644 --- a/plugins/NoHistory/src/stdafx.h +++ b/plugins/NoHistory/src/stdafx.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -29,6 +30,8 @@ struct CMPlugin : public PLUGIN { CMPlugin(); + CMOption bEnabledForNew; + int Load() override; int Unload() override; }; diff --git a/plugins/NoHistory/src/version.h b/plugins/NoHistory/src/version.h index dfe53dd546..0b1d605720 100644 --- a/plugins/NoHistory/src/version.h +++ b/plugins/NoHistory/src/version.h @@ -1,13 +1,13 @@ -#define __MAJOR_VERSION 0 -#define __MINOR_VERSION 2 +#define __MAJOR_VERSION 0 +#define __MINOR_VERSION 2 #define __RELEASE_NUM 3 -#define __BUILD_NUM 0 +#define __BUILD_NUM 1 #include #define __PLUGIN_NAME "NoHistory" #define __FILENAME "NoHistory.dll" -#define __DESCRIPTION "Prevent Miranda from storing any history." -#define __AUTHOR "Scott Ellis, NightFox" -#define __AUTHORWEB "https://miranda-ng.org/p/NoHistory/" -#define __COPYRIGHT "© 2005 Scott Ellis, 2010-17 NightFox, 2017-20 Miranda NG team" +#define __DESCRIPTION "Prevent Miranda from storing any history." +#define __AUTHOR "Scott Ellis, NightFox" +#define __AUTHORWEB "https://miranda-ng.org/p/NoHistory/" +#define __COPYRIGHT "© 2005 Scott Ellis, 2010-17 NightFox, 2017-20 Miranda NG team" -- cgit v1.2.3