summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/m_ignore.h7
-rw-r--r--src/mir_app/res/cloud.icobin0 -> 1150 bytes
-rw-r--r--src/mir_app/res/resource.rc4
-rw-r--r--src/mir_app/src/ei_services.cpp1
-rw-r--r--src/mir_app/src/file.cpp2
-rw-r--r--src/mir_app/src/ignore.cpp499
-rw-r--r--src/mir_app/src/resource.h2
7 files changed, 256 insertions, 259 deletions
diff --git a/include/m_ignore.h b/include/m_ignore.h
index 544638e477..f40f26b946 100644
--- a/include/m_ignore.h
+++ b/include/m_ignore.h
@@ -36,9 +36,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define IGNOREEVENT_ALL (int)(-1)
#define IGNOREEVENT_MESSAGE 1
#define IGNOREEVENT_FILE 2
-#define IGNOREEVENT_USERONLINE 3
-#define IGNOREEVENT_AUTHORIZATION 4
-#define IGNOREEVENT_TYPINGNOTIFY 5
+#define IGNOREEVENT_OFFLINEFILE 3
+#define IGNOREEVENT_USERONLINE 4
+#define IGNOREEVENT_AUTHORIZATION 5
+#define IGNOREEVENT_TYPINGNOTIFY 6
// determines if a message type to a contact should be ignored
// mask is one of IGNOREEVENT_* constants
diff --git a/src/mir_app/res/cloud.ico b/src/mir_app/res/cloud.ico
new file mode 100644
index 0000000000..d5349f353f
--- /dev/null
+++ b/src/mir_app/res/cloud.ico
Binary files differ
diff --git a/src/mir_app/res/resource.rc b/src/mir_app/res/resource.rc
index 83ec6b8e1a..dc8d53c75d 100644
--- a/src/mir_app/res/resource.rc
+++ b/src/mir_app/res/resource.rc
@@ -298,6 +298,8 @@ BEGIN
LTEXT "Messages",IDC_STATIC,28,178,70,8,SS_NOPREFIX | SS_CENTERIMAGE
ICON IDI_FILE,IDC_FILEICON,8,187,20,20,SS_CENTERIMAGE
LTEXT "Files",IDC_STATIC,28,193,70,8,SS_NOPREFIX | SS_CENTERIMAGE
+ ICON IDI_DATABASE,IDC_OFFLINEICON,8,202,20,20,SS_CENTERIMAGE
+ LTEXT "Offline files",IDC_STATIC,28,208,70,8,SS_NOPREFIX | SS_CENTERIMAGE
ICON IDI_USERONLINE,IDC_ONLINEICON,96,172,20,20,SS_CENTERIMAGE
LTEXT "Online notification",IDC_STATIC,116,178,107,8,SS_NOPREFIX | SS_CENTERIMAGE
ICON IDI_MIRANDA,IDC_AUTHICON,96,187,20,20,SS_CENTERIMAGE
@@ -1616,6 +1618,8 @@ IDI_CHAT ICON "chat_channel.ico"
IDI_CODE ICON "code.ico"
+IDI_CLOUD ICON "cloud.ico"
+
IDI_MALE ICON "male.ico"
IDI_FEMALE ICON "female.ico"
diff --git a/src/mir_app/src/ei_services.cpp b/src/mir_app/src/ei_services.cpp
index 5e0bcd2155..dc25159768 100644
--- a/src/mir_app/src/ei_services.cpp
+++ b/src/mir_app/src/ei_services.cpp
@@ -468,6 +468,7 @@ static IconItem iconList[] =
{ LPGEN("Database"), "database", IDI_DATABASE },
{ LPGEN("Attach"), "attach", IDI_ATTACH },
{ LPGEN("Code"), "code", IDI_CODE },
+ { LPGEN("Offline file"), "cloud", IDI_CLOUD },
};
void LoadExtraIconsModule()
diff --git a/src/mir_app/src/file.cpp b/src/mir_app/src/file.cpp
index 97323e5efb..2e26c4e807 100644
--- a/src/mir_app/src/file.cpp
+++ b/src/mir_app/src/file.cpp
@@ -238,7 +238,7 @@ MEVENT Proto_RecvFile(MCONTACT hContact, DB::FILE_BLOB &blob, DB::EventInfo &dbe
else {
// load cloud files always (if OfflineSize = 0)
// or if they are less than a limit (if a transfer has specified file size)
- if (bSilent && File::bOfflineAuto)
+ if (bSilent && File::bOfflineAuto && !Ignore_IsIgnored(hContact, IGNOREEVENT_OFFLINEFILE))
if (File::iOfflineSize == 0 || (blob.getSize() > 0 && blob.getSize() < File::iOfflineSize * 1024))
DownloadOfflineFile(hContact, hdbe, dbei, false, new OFD_Download());
diff --git a/src/mir_app/src/ignore.cpp b/src/mir_app/src/ignore.cpp
index 26228ec358..d4e46b8a1f 100644
--- a/src/mir_app/src/ignore.cpp
+++ b/src/mir_app/src/ignore.cpp
@@ -24,12 +24,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "stdafx.h"
-#define IGNOREEVENT_MAX 5
+#define IGNOREEVENT_MAX 6
-static int masks[IGNOREEVENT_MAX] = { 0x0001, 0x0004, 0x0008, 0x0010, 0x0040 };
+static int masks[IGNOREEVENT_MAX] = { 0x0001, 0x0020, 0x0004, 0x0008, 0x0010, 0x0040 };
-static uint32_t ignoreIdToPf1[IGNOREEVENT_MAX] = { PF1_IMRECV, PF1_FILERECV, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
-static uint32_t ignoreIdToPf4[IGNOREEVENT_MAX] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, PF4_SUPPORTTYPING };
+static uint32_t ignoreIdToPf1[IGNOREEVENT_MAX] = { PF1_IMRECV, 0xFFFFFFFF, PF1_FILERECV, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
+static uint32_t ignoreIdToPf4[IGNOREEVENT_MAX] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, PF4_SUPPORTTYPING };
static uint32_t GetMask(MCONTACT hContact)
{
@@ -47,294 +47,283 @@ static uint32_t GetMask(MCONTACT hContact)
return mask;
}
-static void SetListGroupIcons(HWND hwndList, HANDLE hFirstItem, HANDLE hParentItem, int *groupChildCount)
+static void SaveItemValue(MCONTACT hContact, const char *pszSetting, uint32_t dwValue)
{
- int iconOn[IGNOREEVENT_MAX] = { 1, 1, 1, 1, 1 };
- int childCount[IGNOREEVENT_MAX] = { 0, 0, 0, 0, 0 };
- HANDLE hItem, hChildItem;
+ db_set_dw(hContact, "Ignore", pszSetting, dwValue);
- 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) {
- hChildItem = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_CHILD, (LPARAM)hItem);
- if (hChildItem)
- SetListGroupIcons(hwndList, hChildItem, hItem, childCount);
-
- for (int i = 0; i < _countof(iconOn); i++)
- if (iconOn[i] && SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hItem, i) == 0)
- iconOn[i] = 0;
- hItem = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_NEXTGROUP, (LPARAM)hItem);
- }
-
- // check contacts
- if (typeOfFirst == CLCIT_CONTACT) hItem = hFirstItem;
- else hItem = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_NEXTCONTACT, (LPARAM)hFirstItem);
- while (hItem) {
- for (int i = 0; i < _countof(iconOn); i++) {
- int iImage = SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hItem, i);
- if (iconOn[i] && iImage == 0) iconOn[i] = 0;
- if (iImage != EMPTY_EXTRA_ICON)
- childCount[i]++;
- }
- hItem = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_NEXTCONTACT, (LPARAM)hItem);
- }
-
- // set icons
- for (int i = 0; i < _countof(iconOn); i++) {
- SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hParentItem, MAKELPARAM(i, childCount[i] ? (iconOn[i] ? i + 3 : 0) : EMPTY_EXTRA_ICON));
- if (groupChildCount)
- groupChildCount[i] += childCount[i];
- }
- SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hParentItem, MAKELPARAM(IGNOREEVENT_MAX, 1));
- SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hParentItem, MAKELPARAM(IGNOREEVENT_MAX + 1, 2));
+ // assign the same value to all subs, if any
+ for (int i = db_mc_getSubCount(hContact) - 1; i >= 0; i--)
+ db_set_dw(db_mc_getSub(hContact, i), "Ignore", pszSetting, dwValue);
}
-static void SetAllChildIcons(HWND hwndList, HANDLE hFirstItem, int iColumn, int iImage)
+class IgnoreOptsDlg : public CDlgBase
{
- 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);
- }
-
- // 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);
- }
-}
+ HICON hIcons[IGNOREEVENT_MAX + 2];
+ HANDLE hItemAll, hItemUnknown;
+
+ CCtrlClc m_clist;
+
+ void SetListGroupIcons(HANDLE hFirstItem, HANDLE hParentItem, int *groupChildCount)
+ {
+ int iconOn[IGNOREEVENT_MAX] = { 1, 1, 1, 1, 1, 1 };
+ int childCount[IGNOREEVENT_MAX] = { 0, 0, 0, 0, 0, 0 };
+ HANDLE hItem, hChildItem;
+
+ int typeOfFirst = m_clist.GetItemType(hFirstItem);
+
+ // check groups
+ hItem = (typeOfFirst == CLCIT_GROUP) ? hFirstItem : m_clist.GetNextItem(hFirstItem, CLGN_NEXTGROUP);
+ while (hItem) {
+ hChildItem = m_clist.GetNextItem(hItem, CLGN_CHILD);
+ if (hChildItem)
+ SetListGroupIcons(hChildItem, hItem, childCount);
+
+ for (int i = 0; i < _countof(iconOn); i++)
+ if (iconOn[i] && m_clist.GetExtraImage(hItem, i) == 0)
+ iconOn[i] = 0;
+ hItem = m_clist.GetNextItem(hItem, CLGN_NEXTGROUP);
+ }
-static void ResetListOptions(HWND hwndList)
-{
- SendMessage(hwndList, CLM_SETHIDEEMPTYGROUPS, 1, 0);
-}
+ // check contacts
+ hItem = (typeOfFirst == CLCIT_CONTACT) ? hFirstItem : m_clist.GetNextItem(hFirstItem, CLGN_NEXTCONTACT);
+ while (hItem) {
+ for (int i = 0; i < _countof(iconOn); i++) {
+ int iImage = m_clist.GetExtraImage(hItem, i);
+ if (iconOn[i] && iImage == 0)
+ iconOn[i] = 0;
+ if (iImage != EMPTY_EXTRA_ICON)
+ childCount[i]++;
+ }
+ hItem = m_clist.GetNextItem(hItem, CLGN_NEXTCONTACT);
+ }
-static void SetIconsForColumn(HWND hwndList, HANDLE hItem, HANDLE hItemAll, int iColumn, int iImage)
-{
- switch (SendMessage(hwndList, CLM_GETITEMTYPE, (WPARAM)hItem, 0)) {
- case CLCIT_INFO:
- if (hItem == hItemAll)
- SetAllChildIcons(hwndList, hItem, iColumn, iImage);
- else
- SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(iColumn, iImage)); //hItemUnknown
- break;
-
- case CLCIT_GROUP:
- hItem = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_CHILD, (LPARAM)hItem);
- if (hItem)
- SetAllChildIcons(hwndList, hItem, iColumn, iImage);
- break;
-
- case CLCIT_CONTACT:
- int oldiImage = SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hItem, iColumn);
- if (oldiImage != EMPTY_EXTRA_ICON && oldiImage != iImage)
- SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(iColumn, iImage));
- break;
+ // set icons
+ for (int i = 0; i < _countof(iconOn); i++) {
+ m_clist.SetExtraImage(hParentItem, i, childCount[i] ? (iconOn[i] ? i + 3 : 0) : EMPTY_EXTRA_ICON);
+ if (groupChildCount)
+ groupChildCount[i] += childCount[i];
+ }
+ m_clist.SetExtraImage(hParentItem, IGNOREEVENT_MAX, 1);
+ m_clist.SetExtraImage(hParentItem, IGNOREEVENT_MAX + 1, 2);
}
-}
-static void InitialiseItem(HWND hwndList, MCONTACT hContact, HANDLE hItem, uint32_t proto1Caps, uint32_t proto4Caps)
-{
- uint32_t mask = GetMask(hContact);
- for (int i = 0; i < IGNOREEVENT_MAX; i++)
- if ((ignoreIdToPf1[i] == 0xFFFFFFFF && ignoreIdToPf4[i] == 0xFFFFFFFF) || (proto1Caps & ignoreIdToPf1[i] || proto4Caps & ignoreIdToPf4[i]))
- SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(i, (mask & masks[i]) ? i + 3 : 0));
+ void SetAllChildIcons(HANDLE hFirstItem, int iColumn, int iImage)
+ {
+ int typeOfFirst = m_clist.GetItemType(hFirstItem);
+
+ // check groups
+ HANDLE hItem = (typeOfFirst == CLCIT_GROUP) ? hFirstItem : m_clist.GetNextItem(hFirstItem, CLGN_NEXTGROUP);
+ while (hItem) {
+ HANDLE hChildItem = m_clist.GetNextItem(hItem, CLGN_CHILD);
+ if (hChildItem)
+ SetAllChildIcons(hChildItem, iColumn, iImage);
+ hItem = m_clist.GetNextItem(hItem, CLGN_NEXTGROUP);
+ }
- SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(IGNOREEVENT_MAX, 1));
- SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(IGNOREEVENT_MAX + 1, 2));
-}
+ // check contacts
+ hItem = (typeOfFirst == CLCIT_CONTACT) ? hFirstItem : m_clist.GetNextItem(hFirstItem, CLGN_NEXTCONTACT);
+ while (hItem) {
+ int iOldIcon = m_clist.GetExtraImage(hItem, iColumn);
+ if (iOldIcon != EMPTY_EXTRA_ICON && iOldIcon != iImage)
+ m_clist.SetExtraImage(hItem, iColumn, iImage);
+ hItem = m_clist.GetNextItem(hItem, CLGN_NEXTCONTACT);
+ }
+ }
-static void SaveItemValue(MCONTACT hContact, const char *pszSetting, uint32_t dwValue)
-{
- db_set_dw(hContact, "Ignore", pszSetting, dwValue);
+ void ResetListOptions()
+ {
+ m_clist.SetHideEmptyGroups(true);
+ }
- // assign the same value to all subs, if any
- for (int i = db_mc_getSubCount(hContact) - 1; i >= 0; i--)
- db_set_dw(db_mc_getSub(hContact, i), "Ignore", pszSetting, dwValue);
-}
+ void SetIconsForColumn(HANDLE hItem, int iColumn, int iImage)
+ {
+ switch (m_clist.GetItemType(hItem)) {
+ case CLCIT_INFO:
+ if (hItem == hItemAll)
+ SetAllChildIcons(hItem, iColumn, iImage);
+ else
+ m_clist.SetExtraImage(hItem, iColumn, iImage); // hItemUnknown
+ break;
-static void SaveItemMask(HWND hwndList, MCONTACT hContact, HANDLE hItem, const char *pszSetting)
-{
- uint32_t mask = 0;
- for (int i = 0; i < IGNOREEVENT_MAX; i++) {
- int iImage = SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(i, 0));
- if (iImage && iImage != EMPTY_EXTRA_ICON)
- mask |= masks[i];
- }
- SaveItemValue(hContact, pszSetting, mask);
-}
+ case CLCIT_GROUP:
+ hItem = m_clist.GetNextItem(hItem, CLGN_CHILD);
+ if (hItem)
+ SetAllChildIcons(hItem, iColumn, iImage);
+ break;
-static void SetAllContactIcons(HWND hwndList)
-{
- for (auto &hContact : Contacts()) {
- HANDLE hItem = (HANDLE)SendMessage(hwndList, CLM_FINDCONTACT, hContact, 0);
- if (hItem && SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(IGNOREEVENT_MAX, 0)) == EMPTY_EXTRA_ICON) {
- uint32_t proto1Caps, proto4Caps;
- char *szProto = Proto_GetBaseAccountName(hContact);
- if (szProto) {
- proto1Caps = CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_1);
- proto4Caps = CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_4);
- }
- else proto1Caps = proto4Caps = 0;
- InitialiseItem(hwndList, hContact, hItem, proto1Caps, proto4Caps);
- if (!Contact::IsHidden(hContact))
- SendMessage(hwndList, CLM_SETCHECKMARK, (WPARAM)hItem, 1);
+ case CLCIT_CONTACT:
+ int oldiImage = m_clist.GetExtraImage(hItem, iColumn);
+ if (oldiImage != EMPTY_EXTRA_ICON && oldiImage != iImage)
+ m_clist.SetExtraImage(hItem, iColumn, iImage);
+ break;
}
}
-}
-static INT_PTR CALLBACK DlgProcIgnoreOpts(HWND hwndDlg, UINT msg, WPARAM, LPARAM lParam)
-{
- static HICON hIcons[IGNOREEVENT_MAX + 2];
- static HANDLE hItemAll, hItemUnknown;
-
- switch (msg) {
- case WM_INITDIALOG:
- TranslateDialogDefault(hwndDlg);
- {
- HIMAGELIST hIml = ImageList_Create(g_iIconSX, g_iIconSY, ILC_COLOR32 | ILC_MASK, 3 + IGNOREEVENT_MAX, 3 + IGNOREEVENT_MAX);
- ImageList_AddSkinIcon(hIml, SKINICON_OTHER_SMALLDOT);
- ImageList_AddSkinIcon(hIml, SKINICON_OTHER_FILLEDBLOB);
- ImageList_AddSkinIcon(hIml, SKINICON_OTHER_EMPTYBLOB);
- ImageList_AddSkinIcon(hIml, SKINICON_EVENT_MESSAGE);
- ImageList_AddSkinIcon(hIml, SKINICON_EVENT_FILE);
- ImageList_AddSkinIcon(hIml, SKINICON_OTHER_USERONLINE);
- ImageList_AddSkinIcon(hIml, SKINICON_AUTH_REQUEST);
- ImageList_AddSkinIcon(hIml, SKINICON_OTHER_TYPING);
-
- SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_SETEXTRAIMAGELIST, 0, (LPARAM)hIml);
- for (int i = 0; i < _countof(hIcons); i++)
- hIcons[i] = ImageList_GetIcon(hIml, 1 + i, ILD_NORMAL);
- }
+ void InitialiseItem(MCONTACT hContact, HANDLE hItem, uint32_t proto1Caps, uint32_t proto4Caps)
+ {
+ uint32_t mask = GetMask(hContact);
+ for (int i = 0; i < IGNOREEVENT_MAX; i++)
+ if ((ignoreIdToPf1[i] == 0xFFFFFFFF && ignoreIdToPf4[i] == 0xFFFFFFFF) || (proto1Caps & ignoreIdToPf1[i] || proto4Caps & ignoreIdToPf4[i]))
+ m_clist.SetExtraImage(hItem, i, (mask & masks[i]) ? i + 3 : 0);
- SendDlgItemMessage(hwndDlg, IDC_ALLICON, STM_SETICON, (WPARAM)hIcons[0], 0);
- SendDlgItemMessage(hwndDlg, IDC_NONEICON, STM_SETICON, (WPARAM)hIcons[1], 0);
- SendDlgItemMessage(hwndDlg, IDC_MSGICON, STM_SETICON, (WPARAM)hIcons[2], 0);
- SendDlgItemMessage(hwndDlg, IDC_FILEICON, STM_SETICON, (WPARAM)hIcons[3], 0);
- SendDlgItemMessage(hwndDlg, IDC_ONLINEICON, STM_SETICON, (WPARAM)hIcons[4], 0);
- SendDlgItemMessage(hwndDlg, IDC_AUTHICON, STM_SETICON, (WPARAM)hIcons[5], 0);
- SendDlgItemMessage(hwndDlg, IDC_TYPINGICON, STM_SETICON, (WPARAM)hIcons[6], 0);
-
- ResetListOptions(GetDlgItem(hwndDlg, IDC_LIST));
- SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_SETEXTRACOLUMNS, IGNOREEVENT_MAX + 2, 0);
- {
- CLCINFOITEM cii = { sizeof(cii) };
- cii.flags = CLCIIF_GROUPFONT;
- cii.pszText = TranslateT("** All contacts **");
- hItemAll = (HANDLE)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_ADDINFOITEM, 0, (LPARAM)&cii);
-
- cii.pszText = TranslateT("** Unknown contacts **");
- hItemUnknown = (HANDLE)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_ADDINFOITEM, 0, (LPARAM)&cii);
- InitialiseItem(GetDlgItem(hwndDlg, IDC_LIST), 0, hItemUnknown, 0xFFFFFFFF, 0xFFFFFFFF);
+ m_clist.SetExtraImage(hItem, IGNOREEVENT_MAX, 1);
+ m_clist.SetExtraImage(hItem, IGNOREEVENT_MAX + 1, 2);
+ }
+
+ void SaveItemMask(MCONTACT hContact, HANDLE hItem, const char *pszSetting)
+ {
+ uint32_t mask = 0;
+ for (int i = 0; i < IGNOREEVENT_MAX; i++) {
+ int iImage = m_clist.GetExtraImage(hItem, i);
+ if (iImage && iImage != EMPTY_EXTRA_ICON)
+ mask |= masks[i];
}
+ SaveItemValue(hContact, pszSetting, mask);
+ }
- SetAllContactIcons(GetDlgItem(hwndDlg, IDC_LIST));
- SetListGroupIcons(GetDlgItem(hwndDlg, IDC_LIST), (HANDLE)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETNEXTITEM, CLGN_ROOT, 0), hItemAll, nullptr);
- return TRUE;
-
- case WM_SETFOCUS:
- SetFocus(GetDlgItem(hwndDlg, IDC_LIST));
- break;
-
- case WM_NOTIFY:
- switch (((LPNMHDR)lParam)->idFrom) {
- case IDC_LIST:
- switch (((LPNMHDR)lParam)->code) {
- case CLN_NEWCONTACT:
- case CLN_LISTREBUILT:
- SetAllContactIcons(GetDlgItem(hwndDlg, IDC_LIST));
- __fallthrough;
- case CLN_CONTACTMOVED:
- SetListGroupIcons(GetDlgItem(hwndDlg, IDC_LIST), (HANDLE)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETNEXTITEM, CLGN_ROOT, 0), hItemAll, nullptr);
- break;
- case CLN_OPTIONSCHANGED:
- ResetListOptions(GetDlgItem(hwndDlg, IDC_LIST));
- break;
- case CLN_CHECKCHANGED:
- SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
- break;
- case NM_CLICK:
- NMCLISTCONTROL *nm = (NMCLISTCONTROL*)lParam;
- if (nm->iColumn == -1)
- break;
-
- uint32_t hitFlags;
- HANDLE hItem = (HANDLE)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_HITTEST, (WPARAM)&hitFlags, MAKELPARAM(nm->pt.x, nm->pt.y));
- if (hItem == nullptr || !(hitFlags & CLCHT_ONITEMEXTRA))
- break;
-
- if (nm->iColumn == IGNOREEVENT_MAX) { // ignore all
- for (int iImage = 0; iImage < IGNOREEVENT_MAX; iImage++)
- SetIconsForColumn(GetDlgItem(hwndDlg, IDC_LIST), hItem, hItemAll, iImage, iImage + 3);
+ void SetAllContactIcons()
+ {
+ for (auto &hContact : Contacts()) {
+ HANDLE hItem = m_clist.FindContact(hContact);
+ if (hItem && m_clist.GetExtraImage(hItem, IGNOREEVENT_MAX) == EMPTY_EXTRA_ICON) {
+ uint32_t proto1Caps, proto4Caps;
+ char *szProto = Proto_GetBaseAccountName(hContact);
+ if (szProto) {
+ proto1Caps = CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_1);
+ proto4Caps = CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_4);
}
- else if (nm->iColumn == IGNOREEVENT_MAX + 1) { // ignore none
- for (int iImage = 0; iImage < IGNOREEVENT_MAX; iImage++)
- SetIconsForColumn(GetDlgItem(hwndDlg, IDC_LIST), hItem, hItemAll, iImage, 0);
- }
- else {
- int iImage = SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(nm->iColumn, 0));
- if (iImage == 0)
- iImage = nm->iColumn + 3;
- else if (iImage != EMPTY_EXTRA_ICON)
- iImage = 0;
- SetIconsForColumn(GetDlgItem(hwndDlg, IDC_LIST), hItem, hItemAll, nm->iColumn, iImage);
- }
- SetListGroupIcons(GetDlgItem(hwndDlg, IDC_LIST), (HANDLE)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETNEXTITEM, CLGN_ROOT, 0), hItemAll, nullptr);
- SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ else proto1Caps = proto4Caps = 0;
+ InitialiseItem(hContact, hItem, proto1Caps, proto4Caps);
+ if (!Contact::IsHidden(hContact))
+ m_clist.SetCheck(hItem, 1);
}
- break;
+ }
+ }
- case 0:
- switch (((LPNMHDR)lParam)->code) {
- case PSN_APPLY:
- for (auto &hContact : Contacts()) {
- HANDLE hItem = (HANDLE)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_FINDCONTACT, hContact, 0);
- if (hItem)
- SaveItemMask(GetDlgItem(hwndDlg, IDC_LIST), hContact, hItem, "Mask1");
- Contact::Hide(hContact, !SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETCHECKMARK, (WPARAM)hItem, 0));
- }
+public:
+ IgnoreOptsDlg() :
+ CDlgBase(g_plugin, IDD_OPT_IGNORE),
+ m_clist(this, IDC_LIST)
+ {
+ m_clist.OnClick = Callback(this, &IgnoreOptsDlg::onClistClicked);
+ m_clist.OnOptionsChanged = Callback(this, &IgnoreOptsDlg::onClistOptionsChanged);
+ m_clist.OnListRebuilt = m_clist.OnNewContact = Callback(this, &IgnoreOptsDlg::onClistRebuilt);
+ }
- SaveItemMask(GetDlgItem(hwndDlg, IDC_LIST), 0, hItemAll, "Default1");
- SaveItemMask(GetDlgItem(hwndDlg, IDC_LIST), 0, hItemUnknown, "Mask1");
- return TRUE;
- }
+ bool OnInitDialog() override
+ {
+ HIMAGELIST hIml = ImageList_Create(g_iIconSX, g_iIconSY, ILC_COLOR32 | ILC_MASK, 3 + IGNOREEVENT_MAX, 3 + IGNOREEVENT_MAX);
+ ImageList_AddSkinIcon(hIml, SKINICON_OTHER_SMALLDOT);
+ ImageList_AddSkinIcon(hIml, SKINICON_OTHER_FILLEDBLOB);
+ ImageList_AddSkinIcon(hIml, SKINICON_OTHER_EMPTYBLOB);
+ ImageList_AddSkinIcon(hIml, SKINICON_EVENT_MESSAGE);
+ ImageList_AddSkinIcon(hIml, SKINICON_EVENT_FILE);
+ ImageList_AddIcon(hIml, g_plugin.getIcon(IDI_CLOUD));
+ ImageList_AddSkinIcon(hIml, SKINICON_OTHER_USERONLINE);
+ ImageList_AddSkinIcon(hIml, SKINICON_AUTH_REQUEST);
+ ImageList_AddSkinIcon(hIml, SKINICON_OTHER_TYPING);
+
+ m_clist.SetExtraImageList(hIml);
+ for (int i = 0; i < _countof(hIcons); i++)
+ hIcons[i] = ImageList_GetIcon(hIml, 1 + i, ILD_NORMAL);
+
+ SendDlgItemMessage(m_hwnd, IDC_ALLICON, STM_SETICON, (WPARAM)hIcons[0], 0);
+ SendDlgItemMessage(m_hwnd, IDC_NONEICON, STM_SETICON, (WPARAM)hIcons[1], 0);
+ SendDlgItemMessage(m_hwnd, IDC_MSGICON, STM_SETICON, (WPARAM)hIcons[2], 0);
+ SendDlgItemMessage(m_hwnd, IDC_FILEICON, STM_SETICON, (WPARAM)hIcons[3], 0);
+ SendDlgItemMessage(m_hwnd, IDC_OFFLINEICON, STM_SETICON, (WPARAM)hIcons[4], 0);
+ SendDlgItemMessage(m_hwnd, IDC_ONLINEICON, STM_SETICON, (WPARAM)hIcons[5], 0);
+ SendDlgItemMessage(m_hwnd, IDC_AUTHICON, STM_SETICON, (WPARAM)hIcons[6], 0);
+ SendDlgItemMessage(m_hwnd, IDC_TYPINGICON, STM_SETICON, (WPARAM)hIcons[7], 0);
+
+ ResetListOptions();
+ m_clist.SetExtraColumns(IGNOREEVENT_MAX + 2);
+
+ CLCINFOITEM cii = { sizeof(cii) };
+ cii.flags = CLCIIF_GROUPFONT;
+ cii.pszText = TranslateT("** All contacts **");
+ hItemAll = m_clist.AddInfoItem(&cii);
+
+ cii.pszText = TranslateT("** Unknown contacts **");
+ hItemUnknown = m_clist.AddInfoItem(&cii);
+ InitialiseItem(0, hItemUnknown, 0xFFFFFFFF, 0xFFFFFFFF);
+
+ SetFocus(m_clist.GetHwnd());
+ SetAllContactIcons();
+ SetListGroupIcons(m_clist.GetNextItem(0, CLGN_ROOT), hItemAll, nullptr);
+ return true;
+ }
+
+ bool OnApply() override
+ {
+ for (auto &hContact : Contacts()) {
+ HANDLE hItem = m_clist.FindContact(hContact);
+ if (hItem)
+ SaveItemMask(hContact, hItem, "Mask1");
+ Contact::Hide(hContact, !m_clist.GetCheck(hItem));
}
- break;
- case WM_DESTROY:
+ SaveItemMask(0, hItemAll, "Default1");
+ SaveItemMask(0, hItemUnknown, "Mask1");
+ return true;
+ }
+
+ void OnDestroy() override
+ {
for (auto &it : hIcons)
DestroyIcon(it);
- HIMAGELIST hIml = (HIMAGELIST)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETEXTRAIMAGELIST, 0, 0);
- ImageList_Destroy(hIml);
- break;
+ ImageList_Destroy(m_clist.GetExtraImageList());
}
- return FALSE;
-}
+
+ void onClistRebuilt(CCtrlClc *)
+ {
+ SetAllContactIcons();
+ SetListGroupIcons(m_clist.GetNextItem(0, CLGN_ROOT), hItemAll, nullptr);
+ }
+
+ void onClistOptionsChanged(CCtrlClc *)
+ {
+ ResetListOptions();
+ }
+
+ void onClistClicked(CCtrlClc::TEventInfo *ev)
+ {
+ auto *nm = ev->info;
+
+ uint32_t hitFlags;
+ HANDLE hItem = m_clist.HitTest(nm->pt.x, nm->pt.y, &hitFlags);
+ if (hItem == nullptr || !(hitFlags & CLCHT_ONITEMEXTRA))
+ return;
+
+ if (nm->iColumn == IGNOREEVENT_MAX) { // ignore all
+ for (int iImage = 0; iImage < IGNOREEVENT_MAX; iImage++)
+ SetIconsForColumn(hItem, iImage, iImage + 3);
+ }
+ else if (nm->iColumn == IGNOREEVENT_MAX + 1) { // ignore none
+ for (int iImage = 0; iImage < IGNOREEVENT_MAX; iImage++)
+ SetIconsForColumn(hItem, iImage, 0);
+ }
+ else {
+ int iImage = m_clist.GetExtraImage(hItem, nm->iColumn);
+ if (iImage == 0)
+ iImage = nm->iColumn + 3;
+ else if (iImage != EMPTY_EXTRA_ICON)
+ iImage = 0;
+ SetIconsForColumn(hItem, nm->iColumn, iImage);
+ }
+ SetListGroupIcons(m_clist.GetNextItem(0, CLGN_ROOT), hItemAll, nullptr);
+ NotifyChange();
+ }
+};
static int IgnoreOptInitialise(WPARAM wParam, LPARAM)
{
OPTIONSDIALOGPAGE odp = {};
odp.position = 900000000;
- odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_IGNORE);
odp.szTitle.a = LPGEN("Ignore");
odp.szGroup.a = LPGEN("Contacts");
- odp.pfnDlgProc = DlgProcIgnoreOpts;
+ odp.pDialog = new IgnoreOptsDlg();
odp.flags = ODPF_BOLDGROUPS;
g_plugin.addOptions(wParam, &odp);
return 0;
diff --git a/src/mir_app/src/resource.h b/src/mir_app/src/resource.h
index 40da83b5af..d5e1b418f0 100644
--- a/src/mir_app/src/resource.h
+++ b/src/mir_app/src/resource.h
@@ -47,6 +47,7 @@
#define IDI_URL 138
#define IDI_ATTACH 139
#define IDI_CODE 140
+#define IDI_CLOUD 141
#define IDI_MCMENUOFF 144
#define IDI_MCMENU 145
#define IDI_MCCONVERT 146
@@ -361,6 +362,7 @@
#define IDC_ALLICON 1208
#define IDC_NONEICON 1209
#define IDC_TYPINGICON 1210
+#define IDC_OFFLINEICON 1211
#define IDC_FILEDIR 1213
#define IDC_TRANSFERCOMPLETED 1214
#define IDC_LANG 1215