From 4a99d3eefa615153732e9ba503c712907e46fb7e Mon Sep 17 00:00:00 2001 From: George Hazan Date: Wed, 5 Aug 2020 22:24:11 +0300 Subject: fixes #2513 (Clist_Modern: Possibility of renaming View Mode(s)) --- plugins/Clist_modern/res/resource.rc | 9 +- plugins/Clist_modern/src/modern_viewmodebar.cpp | 1236 +++++++++++------------ plugins/Clist_modern/src/resource.h | 6 +- plugins/Clist_modern/src/version.h | 2 +- 4 files changed, 624 insertions(+), 629 deletions(-) (limited to 'plugins') diff --git a/plugins/Clist_modern/res/resource.rc b/plugins/Clist_modern/res/resource.rc index e0a3667736..eead268fb7 100644 --- a/plugins/Clist_modern/res/resource.rc +++ b/plugins/Clist_modern/res/resource.rc @@ -167,13 +167,12 @@ BEGIN CONTROL "",IDC_TAB,"SysTabControl32",0x0,4,4,301,264 LTEXT "",IDC_STATIC7,6,22,297,244 GROUPBOX "Available view modes",IDC_STATIC1,9,20,158,85 - LISTBOX IDC_VIEWMODES,12,30,123,55,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP,WS_EX_CLIENTEDGE + LISTBOX IDC_VIEWMODES,12,30,123,71,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP,WS_EX_CLIENTEDGE GROUPBOX "Include protocols",IDC_STATIC2,171,20,130,85 CONTROL "",IDC_PROTOCOLS,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_AUTOARRANGE | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,175,30,121,72 - PUSHBUTTON "+",IDC_ADDVIEWMODE,142,39,18,16 - PUSHBUTTON "-",IDC_DELETEVIEWMODE,142,60,18,16 - LTEXT "New",IDC_STATIC5,15,91,38,11,0,WS_EX_TRANSPARENT - EDITTEXT IDC_NEWVIEMODE,59,88,76,13,ES_AUTOHSCROLL + CONTROL "",IDC_ADDVIEWMODE,"MButtonClass",WS_TABSTOP,142,40,18,16 + CONTROL "",IDC_RENAMEVIEWMODE,"MButtonClass",WS_TABSTOP,142,60,18,16 + CONTROL "",IDC_DELETEVIEWMODE,"MButtonClass",WS_TABSTOP,142,80,18,16 GROUPBOX "Include groups",IDC_STATIC3,8,105,159,89,0,WS_EX_TRANSPARENT CONTROL "",IDC_GROUPS,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_AUTOARRANGE | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,12,116,122,57 CONTROL "Show contacts in groups",IDC_USEGROUPS,"Button",BS_AUTO3STATE | WS_TABSTOP,12,178,122,11 diff --git a/plugins/Clist_modern/src/modern_viewmodebar.cpp b/plugins/Clist_modern/src/modern_viewmodebar.cpp index 5f52895231..c6fb949c12 100644 --- a/plugins/Clist_modern/src/modern_viewmodebar.cpp +++ b/plugins/Clist_modern/src/modern_viewmodebar.cpp @@ -34,8 +34,7 @@ $Id: viewmodes.c 2998 2006-06-01 07:11:52Z nightwish2004 $ #define TIMERID_VIEWMODEEXPIRE 100 typedef int(__cdecl *pfnEnumCallback)(char *szName); -static HWND clvmHwnd = nullptr; -static int clvm_curItem = 0; +HWND g_ViewModeOptDlg = nullptr; HMENU hViewModeMenu = nullptr; static HWND hwndSelector = nullptr; @@ -45,30 +44,27 @@ static int nullImage; static DWORD stickyStatusMask = 0; static char g_szModename[2048]; -static int g_ViewModeOptDlg = FALSE; - static UINT _page1Controls[] = { - IDC_STATIC1, IDC_STATIC2, IDC_STATIC3, IDC_STATIC5, IDC_STATIC4, - IDC_STATIC8, IDC_ADDVIEWMODE, IDC_DELETEVIEWMODE, IDC_NEWVIEMODE, IDC_GROUPS, IDC_PROTOCOLS, + IDC_STATIC1, IDC_STATIC2, IDC_STATIC3, IDC_STATIC4, + IDC_STATIC8, IDC_ADDVIEWMODE, IDC_RENAMEVIEWMODE, IDC_DELETEVIEWMODE, IDC_GROUPS, IDC_PROTOCOLS, IDC_VIEWMODES, IDC_STATUSMODES, IDC_STATIC12, IDC_STATIC13, IDC_STATIC14, IDC_PROTOGROUPOP, IDC_GROUPSTATUSOP, IDC_AUTOCLEAR, IDC_AUTOCLEARVAL, IDC_AUTOCLEARSPIN, IDC_STATIC15, IDC_STATIC16, - IDC_LASTMESSAGEOP, IDC_LASTMESSAGEUNIT, IDC_LASTMSG, IDC_LASTMSGVALUE, IDC_USEGROUPS, 0 + IDC_LASTMESSAGEOP, IDC_LASTMESSAGEUNIT, IDC_LASTMSG, IDC_LASTMSGVALUE, IDC_USEGROUPS }; -static UINT _page2Controls[] = { IDC_CLIST, IDC_STATIC9, IDC_STATIC8, IDC_CLEARALL, IDC_CURVIEWMODE2, 0 }; +static UINT _page2Controls[] = { IDC_CLIST, IDC_STATIC9, IDC_STATIC8, IDC_CLEARALL, IDC_CURVIEWMODE2 }; static UINT _buttons[] = { IDC_RESETMODES, IDC_SELECTMODE, IDC_CONFIGUREMODES }; static BOOL sttDrawViewModeBackground(HWND hwnd, HDC hdc, RECT *rect); static void DeleteViewMode(char * szName); -/* - * enumerate all view modes, call the callback function with the mode name - * useful for filling lists, menus and so on.. - */ +///////////////////////////////////////////////////////////////////////////////////////// +// enumerate all view modes, call the callback function with the mode name +// useful for filling lists, menus and so on.. -int CLVM_EnumProc(const char *szSetting, void *lParam) +static int CLVM_EnumProc(const char *szSetting, void *lParam) { pfnEnumCallback EnumCallback = (pfnEnumCallback)lParam; if (szSetting != nullptr) @@ -81,334 +77,249 @@ void CLVM_EnumModes(pfnEnumCallback EnumCallback) db_enum_settings(0, CLVM_EnumProc, CLVM_MODULE, EnumCallback); } -int FillModes(char *szsetting) +///////////////////////////////////////////////////////////////////////////////////////// + +static int DeleteAutoModesCallback(char *szsetting) { - if (BYTE(szsetting[0]) == 246) - return 1; if (szsetting[0] == 13) - return 1; - - ptrW temp(mir_utf8decodeW(szsetting)); - if (temp != nullptr) - SendDlgItemMessage(clvmHwnd, IDC_VIEWMODES, LB_INSERTSTRING, -1, (LPARAM)temp.get()); + DeleteViewMode(szsetting); return 1; } -static void ShowPage(HWND hwnd, int page) +void SaveViewMode(const char *name, const wchar_t *szGroupFilter, const char *szProtoFilter, DWORD dwStatusMask, DWORD dwStickyStatusMask, + unsigned int options, unsigned int stickies, unsigned int operators, unsigned int lmdat) { - int i = 0; - int pageChange = 0; - - if (page == 0 && IsWindowVisible(GetDlgItem(hwnd, _page2Controls[0]))) - pageChange = 1; - - if (page == 1 && IsWindowVisible(GetDlgItem(hwnd, _page1Controls[0]))) - pageChange = 1; + CLVM_EnumModes(DeleteAutoModesCallback); - if (pageChange) - SendMessage(hwnd, WM_SETREDRAW, FALSE, 0); + char szSetting[512]; + mir_snprintf(szSetting, "%c%s_PF", 246, name); + db_set_s(0, CLVM_MODULE, szSetting, szProtoFilter); + mir_snprintf(szSetting, "%c%s_GF", 246, name); + db_set_ws(0, CLVM_MODULE, szSetting, szGroupFilter); + mir_snprintf(szSetting, "%c%s_SM", 246, name); + db_set_dw(0, CLVM_MODULE, szSetting, dwStatusMask); + mir_snprintf(szSetting, "%c%s_SSM", 246, name); + db_set_dw(0, CLVM_MODULE, szSetting, dwStickyStatusMask); + mir_snprintf(szSetting, "%c%s_OPT", 246, name); + db_set_dw(0, CLVM_MODULE, szSetting, options); + mir_snprintf(szSetting, "%c%s_LM", 246, name); + db_set_dw(0, CLVM_MODULE, szSetting, lmdat); - switch (page) { - case 0: - while (_page1Controls[i] != 0) - ShowWindow(GetDlgItem(hwnd, _page1Controls[i++]), SW_SHOW); - i = 0; - while (_page2Controls[i] != 0) - ShowWindow(GetDlgItem(hwnd, _page2Controls[i++]), SW_HIDE); - break; - case 1: - while (_page1Controls[i] != 0) - ShowWindow(GetDlgItem(hwnd, _page1Controls[i++]), SW_HIDE); - i = 0; - while (_page2Controls[i] != 0) - ShowWindow(GetDlgItem(hwnd, _page2Controls[i++]), SW_SHOW); - break; - } - if (pageChange) { - SendMessage(hwnd, WM_SETREDRAW, TRUE, 0); - RedrawWindow(hwnd, nullptr, nullptr, RDW_ERASE | RDW_INVALIDATE); - } + db_set_dw(0, CLVM_MODULE, name, MAKELONG((unsigned short)operators, (unsigned short)stickies)); } -static int UpdateClistItem(MCONTACT hContact, DWORD mask) -{ - for (int i = ID_STATUS_OFFLINE; i <= ID_STATUS_MAX; i++) - SendDlgItemMessage(clvmHwnd, IDC_CLIST, CLM_SETEXTRAIMAGE, hContact, MAKELONG(i - ID_STATUS_OFFLINE, - (1 << (i - ID_STATUS_OFFLINE)) & mask ? i - ID_STATUS_OFFLINE : nullImage)); - - return 0; -} +///////////////////////////////////////////////////////////////////////////////////////// -static DWORD GetMaskForItem(HANDLE hItem) +void DeleteViewMode(char *szName) { - DWORD dwMask = 0; - - for (int i = 0; i <= ID_STATUS_MAX - ID_STATUS_OFFLINE; i++) - dwMask |= (SendDlgItemMessage(clvmHwnd, IDC_CLIST, CLM_GETEXTRAIMAGE, (WPARAM)hItem, i) == nullImage ? 0 : 1 << i); - - return dwMask; -} + char szSetting[256]; -static void UpdateStickies() -{ - for (auto &hContact : Contacts()) { - MCONTACT hItem = (MCONTACT)SendDlgItemMessage(clvmHwnd, IDC_CLIST, CLM_FINDCONTACT, hContact, 0); - if (hItem) - SendDlgItemMessage(clvmHwnd, IDC_CLIST, CLM_SETCHECKMARK, (WPARAM)hItem, (BYTE)db_get_dw(hContact, CLVM_MODULE, g_szModename, 0) ? 1 : 0); + mir_snprintf(szSetting, "%c%s_PF", 246, szName); + db_unset(0, CLVM_MODULE, szSetting); + mir_snprintf(szSetting, "%c%s_GF", 246, szName); + db_unset(0, CLVM_MODULE, szSetting); + mir_snprintf(szSetting, "%c%s_SM", 246, szName); + db_unset(0, CLVM_MODULE, szSetting); + mir_snprintf(szSetting, "%c%s_VA", 246, szName); + db_unset(0, CLVM_MODULE, szSetting); + mir_snprintf(szSetting, "%c%s_SSM", 246, szName); + db_unset(0, CLVM_MODULE, szSetting); + mir_snprintf(szSetting, "%c%s_OPT", 246, szName); + db_unset(0, CLVM_MODULE, szSetting); + mir_snprintf(szSetting, "%c%s_LM", 246, szName); + db_unset(0, CLVM_MODULE, szSetting); + db_unset(0, CLVM_MODULE, szName); - DWORD localMask = HIWORD(db_get_dw(hContact, CLVM_MODULE, g_szModename, 0)); - UpdateClistItem(hItem, (localMask == 0 || localMask == stickyStatusMask) ? stickyStatusMask : localMask); + if (!mir_strcmp(g_CluiData.current_viewmode, szName) && mir_strlen(szName) == mir_strlen(g_CluiData.current_viewmode)) { + g_CluiData.bFilterEffective = 0; + Clist_Broadcast(CLM_AUTOREBUILD, 0, 0); + SetWindowText(hwndSelector, TranslateT("All contacts")); } - for (int i = ID_STATUS_OFFLINE; i <= ID_STATUS_MAX; i++) - SendDlgItemMessage(clvmHwnd, IDC_CLIST, CLM_SETEXTRAIMAGE, (WPARAM)hInfoItem, MAKELONG(i - ID_STATUS_OFFLINE, (1 << (i - ID_STATUS_OFFLINE)) & stickyStatusMask ? i - ID_STATUS_OFFLINE : MAX_STATUS_COUNT)); - - HANDLE hItem = (HANDLE)SendDlgItemMessage(clvmHwnd, IDC_CLIST, CLM_GETNEXTITEM, CLGN_ROOT, 0); - hItem = (HANDLE)SendDlgItemMessage(clvmHwnd, IDC_CLIST, CLM_GETNEXTITEM, CLGN_NEXTGROUP, (LPARAM)hItem); - while (hItem) { - for (int i = ID_STATUS_OFFLINE; i <= ID_STATUS_MAX; i++) - SendDlgItemMessage(clvmHwnd, IDC_CLIST, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELONG(i - ID_STATUS_OFFLINE, nullImage)); - hItem = (HANDLE)SendDlgItemMessage(clvmHwnd, IDC_CLIST, CLM_GETNEXTITEM, CLGN_NEXTGROUP, (LPARAM)hItem); - } + for (auto &hContact : Contacts()) + if (db_get_dw(hContact, CLVM_MODULE, szName, -1) != -1) + db_set_dw(hContact, CLVM_MODULE, szName, 0); } -static int FillDialog(HWND hwnd) +///////////////////////////////////////////////////////////////////////////////////////// +// View modes setup dialog + +class CViewModeSetupDlg : public CDlgBase { - LVCOLUMN lvc = { 0 }; - HWND hwndList = GetDlgItem(hwnd, IDC_PROTOCOLS); + int m_iCurrItem = -1; - CLVM_EnumModes(FillModes); - ListView_SetExtendedListViewStyle(GetDlgItem(hwnd, IDC_PROTOCOLS), LVS_EX_CHECKBOXES); - lvc.mask = LVCF_FMT; - lvc.fmt = LVCFMT_IMAGE | LVCFMT_LEFT; - ListView_InsertColumn(hwndList, 0, &lvc); + CCtrlCheck chkLastMsg; + CCtrlButton btnClearAll, btnApply; + CCtrlMButton btnAdd, btnRename, btnDelete; + CCtrlListBox modes; + CCtrlListView protocols, groups, statuses; + CCtrlClc clist; - // fill protocols... + static int __cdecl FillModes(const char *szsetting, void *param) { - LVITEM item = { 0 }; - item.mask = LVIF_TEXT | LVIF_PARAM; - item.iItem = 1000; - for (auto &pa : Accounts()) { - item.lParam = (LPARAM)pa->szModuleName; - item.pszText = pa->tszAccountName; - ListView_InsertItem(hwndList, &item); + if (BYTE(szsetting[0]) == 246) + return 1; + if (szsetting[0] == 13) + return 1; + + ptrW temp(mir_utf8decodeW(szsetting)); + if (temp != nullptr) { + CCtrlListBox *modes = (CCtrlListBox *)param; + modes->AddString(temp); } + return 1; } - ListView_SetColumnWidth(hwndList, 0, LVSCW_AUTOSIZE); - ListView_Arrange(hwndList, LVA_ALIGNLEFT | LVA_ALIGNTOP); - - // fill groups + DWORD GetMaskForItem(HANDLE hItem) { - hwndList = GetDlgItem(hwnd, IDC_GROUPS); - - ListView_SetExtendedListViewStyle(hwndList, LVS_EX_CHECKBOXES); - lvc.mask = LVCF_FMT; - lvc.fmt = LVCFMT_IMAGE | LVCFMT_LEFT; - ListView_InsertColumn(hwndList, 0, &lvc); + DWORD dwMask = 0; - LVITEM item = { 0 }; - item.mask = LVIF_TEXT; - item.iItem = 1000; + for (int i = 0; i <= ID_STATUS_MAX - ID_STATUS_OFFLINE; i++) + dwMask |= (clist.GetExtraImage(hItem, i) == nullImage ? 0 : 1 << i); - item.pszText = TranslateT("Ungrouped contacts"); - SendMessage(hwndList, LVM_INSERTITEM, 0, (LPARAM)&item); - - wchar_t *szGroup; - for (int i = 1; (szGroup = Clist_GroupGetName(i, nullptr)) != nullptr; i++) { - item.pszText = szGroup; - SendMessage(hwndList, LVM_INSERTITEM, 0, (LPARAM)&item); - } - ListView_SetColumnWidth(hwndList, 0, LVSCW_AUTOSIZE); - ListView_Arrange(hwndList, LVA_ALIGNLEFT | LVA_ALIGNTOP); - } - hwndList = GetDlgItem(hwnd, IDC_STATUSMODES); - ListView_SetExtendedListViewStyle(hwndList, LVS_EX_CHECKBOXES); - lvc.mask = LVCF_FMT; - lvc.fmt = LVCFMT_IMAGE | LVCFMT_LEFT; - ListView_InsertColumn(hwndList, 0, &lvc); - for (int i = ID_STATUS_OFFLINE; i <= ID_STATUS_MAX; i++) { - LVITEM item = { 0 }; - item.mask = LVIF_TEXT; - item.pszText = Clist_GetStatusModeDescription(i, 0); - item.iItem = i - ID_STATUS_OFFLINE; - SendMessage(hwndList, LVM_INSERTITEM, 0, (LPARAM)&item); + return dwMask; } - ListView_SetColumnWidth(hwndList, 0, LVSCW_AUTOSIZE); - ListView_Arrange(hwndList, LVA_ALIGNLEFT | LVA_ALIGNTOP); - - SendDlgItemMessage(hwnd, IDC_PROTOGROUPOP, CB_INSERTSTRING, -1, (LPARAM)TranslateT("And")); - SendDlgItemMessage(hwnd, IDC_PROTOGROUPOP, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Or")); - SendDlgItemMessage(hwnd, IDC_GROUPSTATUSOP, CB_INSERTSTRING, -1, (LPARAM)TranslateT("And")); - SendDlgItemMessage(hwnd, IDC_GROUPSTATUSOP, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Or")); - - SendDlgItemMessage(hwnd, IDC_LASTMESSAGEOP, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Older than")); - SendDlgItemMessage(hwnd, IDC_LASTMESSAGEOP, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Newer than")); - - SendDlgItemMessage(hwnd, IDC_LASTMESSAGEUNIT, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Minutes")); - SendDlgItemMessage(hwnd, IDC_LASTMESSAGEUNIT, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Hours")); - SendDlgItemMessage(hwnd, IDC_LASTMESSAGEUNIT, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Days")); - SendDlgItemMessage(hwnd, IDC_LASTMESSAGEOP, CB_SETCURSEL, 0, 0); - SendDlgItemMessage(hwnd, IDC_LASTMESSAGEUNIT, CB_SETCURSEL, 0, 0); - SetDlgItemInt(hwnd, IDC_LASTMSGVALUE, 0, 0); - return 0; -} -static void SetAllChildIcons(HWND hwndList, HANDLE hFirstItem, int iColumn, int iImage) -{ - int typeOfFirst = SendMessage(hwndList, CLM_GETITEMTYPE, (WPARAM)hFirstItem, 0); - - // check groups - HANDLE hItem = (typeOfFirst == CLCIT_GROUP) ? hFirstItem : (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); - } + //////////////////////////////////////////////////////////////////////////////////////// + // fills dialog with data - // 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); - } -} + void FillDialog() + { + db_enum_settings(0, FillModes, CLVM_MODULE, &modes); -static void SetIconsForColumn(HWND hwndList, HANDLE hItem, HANDLE hItemAll, int iColumn, int iImage) -{ - int itemType = SendMessage(hwndList, CLM_GETITEMTYPE, (WPARAM)hItem, 0); - if (itemType == 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)); - } - else if (itemType == CLCIT_INFO) { - 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)); - if (hItem == hItemAll) - SetAllChildIcons(hwndList, hItem, iColumn, iImage); - else - SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(iColumn, iImage)); //hItemUnknown - } - else if (itemType == CLCIT_GROUP) { - 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)); - hItem = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_CHILD, (LPARAM)hItem); - if (hItem) - SetAllChildIcons(hwndList, hItem, iColumn, iImage); - } -} + // fill protocols... + protocols.SetExtendedListViewStyle(LVS_EX_CHECKBOXES); -static int DeleteAutoModesCallback(char *szsetting) -{ - if (szsetting[0] == 13) - DeleteViewMode(szsetting); - return 1; -} + LVCOLUMN lvc = {}; + lvc.mask = LVCF_FMT; + lvc.fmt = LVCFMT_IMAGE | LVCFMT_LEFT; + protocols.InsertColumn(0, &lvc); + { + LVITEM item = {}; + item.mask = LVIF_TEXT | LVIF_PARAM; + item.iItem = 1000; + for (auto &pa : Accounts()) { + item.lParam = (LPARAM)pa->szModuleName; + item.pszText = pa->tszAccountName; + protocols.InsertItem(&item); + } + } + protocols.SetColumnWidth(0, LVSCW_AUTOSIZE); + protocols.Arrange(LVA_ALIGNLEFT | LVA_ALIGNTOP); + // fill groups + groups.SetExtendedListViewStyle(LVS_EX_CHECKBOXES); + lvc.mask = LVCF_FMT; + lvc.fmt = LVCFMT_IMAGE | LVCFMT_LEFT; + groups.InsertColumn(0, &lvc); + { + LVITEM item = {}; + item.mask = LVIF_TEXT; + item.iItem = 1000; + item.pszText = TranslateT("Ungrouped contacts"); + groups.InsertItem(&item); + + wchar_t *szGroup; + for (int i = 1; (szGroup = Clist_GroupGetName(i, nullptr)) != nullptr; i++) { + item.pszText = szGroup; + groups.InsertItem(&item); + } + } + groups.SetColumnWidth(0, LVSCW_AUTOSIZE); + groups.Arrange(LVA_ALIGNLEFT | LVA_ALIGNTOP); -void SaveViewMode(const char *name, const wchar_t *szGroupFilter, const char *szProtoFilter, DWORD dwStatusMask, DWORD dwStickyStatusMask, - unsigned int options, unsigned int stickies, unsigned int operators, unsigned int lmdat) -{ - CLVM_EnumModes(DeleteAutoModesCallback); + // fill statuses + statuses.SetExtendedListViewStyle(LVS_EX_CHECKBOXES); - char szSetting[512]; - mir_snprintf(szSetting, "%c%s_PF", 246, name); - db_set_s(0, CLVM_MODULE, szSetting, szProtoFilter); - mir_snprintf(szSetting, "%c%s_GF", 246, name); - db_set_ws(0, CLVM_MODULE, szSetting, szGroupFilter); - mir_snprintf(szSetting, "%c%s_SM", 246, name); - db_set_dw(0, CLVM_MODULE, szSetting, dwStatusMask); - mir_snprintf(szSetting, "%c%s_SSM", 246, name); - db_set_dw(0, CLVM_MODULE, szSetting, dwStickyStatusMask); - mir_snprintf(szSetting, "%c%s_OPT", 246, name); - db_set_dw(0, CLVM_MODULE, szSetting, options); - mir_snprintf(szSetting, "%c%s_LM", 246, name); - db_set_dw(0, CLVM_MODULE, szSetting, lmdat); + lvc.mask = LVCF_FMT; + lvc.fmt = LVCFMT_IMAGE | LVCFMT_LEFT; + statuses.InsertColumn(0, &lvc); - db_set_dw(0, CLVM_MODULE, name, MAKELONG((unsigned short)operators, (unsigned short)stickies)); -} + for (int i = ID_STATUS_OFFLINE; i <= ID_STATUS_MAX; i++) { + LVITEM item = {}; + item.mask = LVIF_TEXT; + item.pszText = Clist_GetStatusModeDescription(i, 0); + item.iItem = i - ID_STATUS_OFFLINE; + statuses.InsertItem(&item); + } + statuses.SetColumnWidth(0, LVSCW_AUTOSIZE); + statuses.Arrange(LVA_ALIGNLEFT | LVA_ALIGNTOP); + + SendDlgItemMessage(m_hwnd, IDC_PROTOGROUPOP, CB_INSERTSTRING, -1, (LPARAM)TranslateT("And")); + SendDlgItemMessage(m_hwnd, IDC_PROTOGROUPOP, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Or")); + SendDlgItemMessage(m_hwnd, IDC_GROUPSTATUSOP, CB_INSERTSTRING, -1, (LPARAM)TranslateT("And")); + SendDlgItemMessage(m_hwnd, IDC_GROUPSTATUSOP, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Or")); + + SendDlgItemMessage(m_hwnd, IDC_LASTMESSAGEOP, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Older than")); + SendDlgItemMessage(m_hwnd, IDC_LASTMESSAGEOP, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Newer than")); + + SendDlgItemMessage(m_hwnd, IDC_LASTMESSAGEUNIT, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Minutes")); + SendDlgItemMessage(m_hwnd, IDC_LASTMESSAGEUNIT, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Hours")); + SendDlgItemMessage(m_hwnd, IDC_LASTMESSAGEUNIT, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Days")); + SendDlgItemMessage(m_hwnd, IDC_LASTMESSAGEOP, CB_SETCURSEL, 0, 0); + SendDlgItemMessage(m_hwnd, IDC_LASTMESSAGEUNIT, CB_SETCURSEL, 0, 0); + SetDlgItemInt(m_hwnd, IDC_LASTMSGVALUE, 0, 0); + } -/* - * saves the state of the filter definitions for the current item - */ + //////////////////////////////////////////////////////////////////////////////////////// + // saves the state of the filter definitions for the current item -void SaveState() -{ - wchar_t newGroupFilter[2048] = L"|"; - char newProtoFilter[2048] = "|"; - DWORD statusMask = 0; - DWORD operators = 0; + void SaveState() + { + wchar_t newGroupFilter[2048] = L"|"; + char newProtoFilter[2048] = "|"; + DWORD statusMask = 0; + DWORD operators = 0; - if (clvm_curItem == -1) - return; + if (m_iCurrItem == -1) + return; - { - LVITEM item = { 0 }; - HWND hwndList = GetDlgItem(clvmHwnd, IDC_PROTOCOLS); - for (int i = 0; i < ListView_GetItemCount(hwndList); i++) { - if (ListView_GetCheckState(hwndList, i)) { + for (int i = 0; i < protocols.GetItemCount(); i++) { + if (protocols.GetCheckState(i)) { + LVITEM item = {}; item.mask = LVIF_PARAM; item.iItem = i; - ListView_GetItem(hwndList, &item); + protocols.GetItem(&item); - mir_strncat(newProtoFilter, (char*)item.lParam, _countof(newProtoFilter) - mir_strlen(newProtoFilter)); + mir_strncat(newProtoFilter, (char *)item.lParam, _countof(newProtoFilter) - mir_strlen(newProtoFilter)); mir_strncat(newProtoFilter, "|", _countof(newProtoFilter) - mir_strlen(newProtoFilter)); newProtoFilter[2047] = 0; } } - } - { - LVITEM item = { 0 }; - wchar_t szTemp[256]; - HWND hwndList = GetDlgItem(clvmHwnd, IDC_GROUPS); + operators |= groups.GetCheckState(0) ? CLVM_INCLUDED_UNGROUPED : 0; - operators |= ListView_GetCheckState(hwndList, 0) ? CLVM_INCLUDED_UNGROUPED : 0; - - for (int i = 0; i < ListView_GetItemCount(hwndList); i++) { - if (ListView_GetCheckState(hwndList, i)) { + for (int i = 0; i < groups.GetItemCount(); i++) { + if (groups.GetCheckState(i)) { + wchar_t szTemp[256]; + LVITEM item = {}; item.mask = LVIF_TEXT; item.pszText = szTemp; item.cchTextMax = _countof(szTemp); item.iItem = i; - SendMessage(hwndList, LVM_GETITEM, 0, (LPARAM)&item); + groups.GetItem(&item); mir_wstrncat(newGroupFilter, szTemp, _countof(newGroupFilter) - mir_wstrlen(newGroupFilter)); mir_wstrncat(newGroupFilter, L"|", _countof(newGroupFilter) - mir_wstrlen(newGroupFilter)); newGroupFilter[2047] = 0; } } - } - { - HWND hwndList = GetDlgItem(clvmHwnd, IDC_STATUSMODES); + for (int i = ID_STATUS_OFFLINE; i <= ID_STATUS_MAX; i++) - if (ListView_GetCheckState(hwndList, i - ID_STATUS_OFFLINE)) + if (statuses.GetCheckState(i - ID_STATUS_OFFLINE)) statusMask |= (1 << (i - ID_STATUS_OFFLINE)); - } - int iLen = SendDlgItemMessage(clvmHwnd, IDC_VIEWMODES, LB_GETTEXTLEN, clvm_curItem, 0); - if (iLen) { unsigned int stickies = 0; - - wchar_t *szTempModeName = (wchar_t*)mir_alloc((iLen + 1) * sizeof(wchar_t)); + ptrW szTempModeName(modes.GetItemText(m_iCurrItem)); if (szTempModeName) { - SendDlgItemMessage(clvmHwnd, IDC_VIEWMODES, LB_GETTEXT, clvm_curItem, (LPARAM)szTempModeName); - T2Utf szModeName(szTempModeName); DWORD dwGlobalMask = GetMaskForItem(hInfoItem); for (auto &hContact : Contacts()) { - HANDLE hItem = (HANDLE)SendDlgItemMessage(clvmHwnd, IDC_CLIST, CLM_FINDCONTACT, hContact, 0); + HANDLE hItem = clist.FindContact(hContact); if (hItem == nullptr) continue; - if (SendDlgItemMessage(clvmHwnd, IDC_CLIST, CLM_GETCHECKMARK, (WPARAM)hItem, 0)) { + if (clist.GetCheck(hItem)) { DWORD dwLocalMask = GetMaskForItem(hItem); db_set_dw(hContact, CLVM_MODULE, szModeName, MAKELONG(1, (unsigned short)dwLocalMask)); stickies++; @@ -419,431 +330,516 @@ void SaveState() } } - operators |= ((SendDlgItemMessage(clvmHwnd, IDC_PROTOGROUPOP, CB_GETCURSEL, 0, 0) == 1 ? CLVM_PROTOGROUP_OP : 0) | - (SendDlgItemMessage(clvmHwnd, IDC_GROUPSTATUSOP, CB_GETCURSEL, 0, 0) == 1 ? CLVM_GROUPSTATUS_OP : 0) | - (IsDlgButtonChecked(clvmHwnd, IDC_AUTOCLEAR) ? CLVM_AUTOCLEAR : 0) | - (IsDlgButtonChecked(clvmHwnd, IDC_LASTMSG) ? CLVM_USELASTMSG : 0) | - (IsDlgButtonChecked(clvmHwnd, IDC_USEGROUPS) == BST_CHECKED ? CLVM_USEGROUPS : 0) | - (IsDlgButtonChecked(clvmHwnd, IDC_USEGROUPS) == BST_UNCHECKED ? CLVM_DONOTUSEGROUPS : 0) - ); + operators |= ((SendDlgItemMessage(m_hwnd, IDC_PROTOGROUPOP, CB_GETCURSEL, 0, 0) == 1 ? CLVM_PROTOGROUP_OP : 0) | + (SendDlgItemMessage(m_hwnd, IDC_GROUPSTATUSOP, CB_GETCURSEL, 0, 0) == 1 ? CLVM_GROUPSTATUS_OP : 0) | + (IsDlgButtonChecked(m_hwnd, IDC_AUTOCLEAR) ? CLVM_AUTOCLEAR : 0) | + (chkLastMsg.GetState() ? CLVM_USELASTMSG : 0) | + (IsDlgButtonChecked(m_hwnd, IDC_USEGROUPS) == BST_CHECKED ? CLVM_USEGROUPS : 0) | + (IsDlgButtonChecked(m_hwnd, IDC_USEGROUPS) == BST_UNCHECKED ? CLVM_DONOTUSEGROUPS : 0)); - DWORD options = SendDlgItemMessage(clvmHwnd, IDC_AUTOCLEARSPIN, UDM_GETPOS, 0, 0); + DWORD options = SendDlgItemMessage(m_hwnd, IDC_AUTOCLEARSPIN, UDM_GETPOS, 0, 0); BOOL translated; - DWORD lmdat = MAKELONG(GetDlgItemInt(clvmHwnd, IDC_LASTMSGVALUE, &translated, FALSE), - MAKEWORD(SendDlgItemMessage(clvmHwnd, IDC_LASTMESSAGEOP, CB_GETCURSEL, 0, 0), - SendDlgItemMessage(clvmHwnd, IDC_LASTMESSAGEUNIT, CB_GETCURSEL, 0, 0))); + DWORD lmdat = MAKELONG(GetDlgItemInt(m_hwnd, IDC_LASTMSGVALUE, &translated, FALSE), + MAKEWORD(SendDlgItemMessage(m_hwnd, IDC_LASTMESSAGEOP, CB_GETCURSEL, 0, 0), + SendDlgItemMessage(m_hwnd, IDC_LASTMESSAGEUNIT, CB_GETCURSEL, 0, 0))); SaveViewMode(szModeName, newGroupFilter, newProtoFilter, statusMask, dwGlobalMask, options, stickies, operators, lmdat); - - mir_free(szTempModeName); - szTempModeName = nullptr; } + btnApply.Disable(); } - EnableWindow(GetDlgItem(clvmHwnd, IDC_APPLY), FALSE); -} -/* - * updates the filter list boxes with the data taken from the filtering string - */ + //////////////////////////////////////////////////////////////////////////////////////// -static void UpdateFilters() -{ - char szSetting[128]; - DWORD dwFlags; - DWORD opt; - - if (clvm_curItem == LB_ERR) - return; - - int iLen = SendDlgItemMessageA(clvmHwnd, IDC_VIEWMODES, LB_GETTEXTLEN, clvm_curItem, 0); - if (iLen == 0) - return; + 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); + } - wchar_t *szTempBuf = (wchar_t*)_alloca((iLen + 1) * sizeof(wchar_t)); - SendDlgItemMessage(clvmHwnd, IDC_VIEWMODES, LB_GETTEXT, clvm_curItem, (LPARAM)szTempBuf); + // check contacts + if (typeOfFirst == CLCIT_CONTACT) + hItem = hFirstItem; + else + hItem = clist.GetNextItem(hFirstItem, CLGN_NEXTCONTACT); - T2Utf szBuf(szTempBuf); - mir_strncpy(g_szModename, szBuf, _countof(g_szModename)); - { - wchar_t szTemp[100]; - mir_snwprintf(szTemp, TranslateT("Configuring view mode: %s"), szTempBuf); - SetDlgItemText(clvmHwnd, IDC_CURVIEWMODE2, szTemp); + 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); + } } - mir_snprintf(szSetting, "%c%s_PF", 246, szBuf.get()); - ptrA szPF(db_get_sa(0, CLVM_MODULE, szSetting)); - if (szPF == nullptr) - return; - - mir_snprintf(szSetting, "%c%s_GF", 246, szBuf.get()); - ptrW szGF(db_get_wsa(0, CLVM_MODULE, szSetting)); - if (szGF == nullptr) - return; - - mir_snprintf(szSetting, "%c%s_OPT", 246, szBuf.get()); - if ((opt = db_get_dw(0, CLVM_MODULE, szSetting, -1)) != -1) - SendDlgItemMessage(clvmHwnd, IDC_AUTOCLEARSPIN, UDM_SETPOS, 0, MAKELONG(LOWORD(opt), 0)); - - mir_snprintf(szSetting, "%c%s_SM", 246, szBuf.get()); - DWORD statusMask = db_get_dw(0, CLVM_MODULE, szSetting, 0); - mir_snprintf(szSetting, "%c%s_SSM", 246, szBuf.get()); - stickyStatusMask = db_get_dw(0, CLVM_MODULE, szSetting, -1); - dwFlags = db_get_dw(0, CLVM_MODULE, szBuf, 0); + + void SetIconsForColumn(HANDLE hItem, HANDLE hItemAll, int iColumn, int iImage) { - char szMask[256]; - HWND hwndList = GetDlgItem(clvmHwnd, IDC_PROTOCOLS); - - LVITEM item = { 0 }; - item.mask = LVIF_PARAM; - - for (int i = 0; i < ListView_GetItemCount(hwndList); i++) { - item.iItem = i; - ListView_GetItem(hwndList, &item); - mir_snprintf(szMask, "%s|", (char*)item.lParam); - if (szPF && strstr(szPF, szMask)) - ListView_SetCheckState(hwndList, i, TRUE) + int itemType = clist.GetItemType(hItem); + if (itemType == CLCIT_CONTACT) { + int oldiImage = clist.GetExtraImage(hItem, iColumn); + if (oldiImage != EMPTY_EXTRA_ICON && oldiImage != iImage) + clist.SetExtraImage(hItem, iColumn, iImage); + } + else if (itemType == CLCIT_INFO) { + int oldiImage = clist.GetExtraImage(hItem, iColumn); + if (oldiImage != EMPTY_EXTRA_ICON && oldiImage != iImage) + clist.SetExtraImage(hItem, iColumn, iImage); + if (hItem == hItemAll) + SetAllChildIcons(hItem, iColumn, iImage); else - ListView_SetCheckState(hwndList, i, FALSE); + clist.SetExtraImage(hItem, iColumn, iImage); + } + else if (itemType == CLCIT_GROUP) { + int oldiImage = clist.GetExtraImage(hItem, iColumn); + if (oldiImage != EMPTY_EXTRA_ICON && oldiImage != iImage) + clist.SetExtraImage(hItem, iColumn, iImage); + + hItem = clist.GetNextItem(hItem, CLGN_CHILD); + if (hItem) + SetAllChildIcons(hItem, iColumn, iImage); } } + + //////////////////////////////////////////////////////////////////////////////////////// + + void ShowPage(int page) { - wchar_t szTemp[256]; - wchar_t szMask[256]; - int i; - HWND hwndList = GetDlgItem(clvmHwnd, IDC_GROUPS); - - LVITEM item = { 0 }; - item.mask = LVIF_TEXT; - item.pszText = szTemp; - item.cchTextMax = _countof(szTemp); - - ListView_SetCheckState(hwndList, 0, dwFlags & CLVM_INCLUDED_UNGROUPED ? TRUE : FALSE); - - for (i = 1; i < ListView_GetItemCount(hwndList); i++) { - item.iItem = i; - SendMessage(hwndList, LVM_GETITEM, 0, (LPARAM)&item); - mir_snwprintf(szMask, L"%s|", szTemp); - if (szGF && wcsstr(szGF, szMask)) - ListView_SetCheckState(hwndList, i, TRUE) - else - ListView_SetCheckState(hwndList, i, FALSE); + int pageChange = 0; + + if (page == 0 && IsWindowVisible(GetDlgItem(m_hwnd, _page2Controls[0]))) + pageChange = 1; + + if (page == 1 && IsWindowVisible(GetDlgItem(m_hwnd, _page1Controls[0]))) + pageChange = 1; + + if (pageChange) + SendMessage(m_hwnd, WM_SETREDRAW, FALSE, 0); + + switch (page) { + case 0: + for (auto &ctrlId : _page1Controls) + ShowWindow(GetDlgItem(m_hwnd, ctrlId), SW_SHOW); + + for (auto &ctrlId : _page2Controls) + ShowWindow(GetDlgItem(m_hwnd, ctrlId), SW_HIDE); + break; + + case 1: + for (auto &ctrlId : _page1Controls) + ShowWindow(GetDlgItem(m_hwnd, ctrlId), SW_HIDE); + + for (auto &ctrlId : _page2Controls) + ShowWindow(GetDlgItem(m_hwnd, ctrlId), SW_SHOW); + break; + } + + if (pageChange) { + SendMessage(m_hwnd, WM_SETREDRAW, TRUE, 0); + RedrawWindow(m_hwnd, nullptr, nullptr, RDW_ERASE | RDW_INVALIDATE); } } + + //////////////////////////////////////////////////////////////////////////////////////// + + void UpdateClistItem(HANDLE hItem, DWORD mask) { - HWND hwndList = GetDlgItem(clvmHwnd, IDC_STATUSMODES); + for (int i = ID_STATUS_OFFLINE; i <= ID_STATUS_MAX; i++) + clist.SetExtraImage(hItem, i - ID_STATUS_OFFLINE, (1 << (i - ID_STATUS_OFFLINE)) & mask ? i - ID_STATUS_OFFLINE : nullImage); + } + + //////////////////////////////////////////////////////////////////////////////////////// + // updates the filter list boxes with the data taken from the filtering string + + void UpdateFilters() + { + char szSetting[128]; + DWORD dwFlags; + DWORD opt; + + if (m_iCurrItem == LB_ERR) + return; + + ptrW szTempBuf(modes.GetItemText(m_iCurrItem)); + T2Utf szBuf(szTempBuf); + mir_strncpy(g_szModename, szBuf, _countof(g_szModename)); + { + wchar_t szTemp[100]; + mir_snwprintf(szTemp, TranslateT("Configuring view mode: %s"), szTempBuf); + SetDlgItemText(m_hwnd, IDC_CURVIEWMODE2, szTemp); + } + mir_snprintf(szSetting, "%c%s_PF", 246, szBuf.get()); + ptrA szPF(db_get_sa(0, CLVM_MODULE, szSetting)); + if (szPF == nullptr) + return; + + mir_snprintf(szSetting, "%c%s_GF", 246, szBuf.get()); + ptrW szGF(db_get_wsa(0, CLVM_MODULE, szSetting)); + if (szGF == nullptr) + return; + + mir_snprintf(szSetting, "%c%s_OPT", 246, szBuf.get()); + if ((opt = db_get_dw(0, CLVM_MODULE, szSetting, -1)) != -1) + SendDlgItemMessage(m_hwnd, IDC_AUTOCLEARSPIN, UDM_SETPOS, 0, MAKELONG(LOWORD(opt), 0)); + + mir_snprintf(szSetting, "%c%s_SM", 246, szBuf.get()); + DWORD statusMask = db_get_dw(0, CLVM_MODULE, szSetting, 0); + mir_snprintf(szSetting, "%c%s_SSM", 246, szBuf.get()); + stickyStatusMask = db_get_dw(0, CLVM_MODULE, szSetting, -1); + dwFlags = db_get_dw(0, CLVM_MODULE, szBuf, 0); + { + char szMask[256]; + + LVITEM item = { 0 }; + item.mask = LVIF_PARAM; + + for (int i = 0; i < protocols.GetItemCount(); i++) { + item.iItem = i; + protocols.GetItem(&item); + mir_snprintf(szMask, "%s|", (char *)item.lParam); + if (szPF && strstr(szPF, szMask)) + protocols.SetCheckState(i, TRUE); + else + protocols.SetCheckState(i, FALSE); + } + } + { + wchar_t szTemp[256]; + wchar_t szMask[256]; + + LVITEM item = {}; + item.mask = LVIF_TEXT; + item.pszText = szTemp; + item.cchTextMax = _countof(szTemp); + + groups.SetCheckState(0, (dwFlags & CLVM_INCLUDED_UNGROUPED) ? TRUE : FALSE); + + for (int i = 1; i < groups.GetItemCount(); i++) { + item.iItem = i; + groups.GetItem(&item); + mir_snwprintf(szMask, L"%s|", szTemp); + if (szGF && wcsstr(szGF, szMask)) + groups.SetCheckState(i, TRUE); + else + groups.SetCheckState(i, FALSE); + } + } for (int i = ID_STATUS_OFFLINE; i <= ID_STATUS_MAX; i++) { if ((1 << (i - ID_STATUS_OFFLINE)) & statusMask) - ListView_SetCheckState(hwndList, i - ID_STATUS_OFFLINE, TRUE) + statuses.SetCheckState(i - ID_STATUS_OFFLINE, TRUE); else - ListView_SetCheckState(hwndList, i - ID_STATUS_OFFLINE, FALSE); + statuses.SetCheckState(i - ID_STATUS_OFFLINE, FALSE); } - } - SendDlgItemMessage(clvmHwnd, IDC_PROTOGROUPOP, CB_SETCURSEL, dwFlags & CLVM_PROTOGROUP_OP ? 1 : 0, 0); - SendDlgItemMessage(clvmHwnd, IDC_GROUPSTATUSOP, CB_SETCURSEL, dwFlags & CLVM_GROUPSTATUS_OP ? 1 : 0, 0); - CheckDlgButton(clvmHwnd, IDC_AUTOCLEAR, dwFlags & CLVM_AUTOCLEAR ? BST_CHECKED : BST_UNCHECKED); - UpdateStickies(); - int useLastMsg = dwFlags & CLVM_USELASTMSG; - int useGroupsState = (dwFlags & CLVM_USEGROUPS) ? BST_CHECKED : (dwFlags & CLVM_DONOTUSEGROUPS) ? BST_UNCHECKED : BST_INDETERMINATE; + SendDlgItemMessage(m_hwnd, IDC_PROTOGROUPOP, CB_SETCURSEL, dwFlags & CLVM_PROTOGROUP_OP ? 1 : 0, 0); + SendDlgItemMessage(m_hwnd, IDC_GROUPSTATUSOP, CB_SETCURSEL, dwFlags & CLVM_GROUPSTATUS_OP ? 1 : 0, 0); + CheckDlgButton(m_hwnd, IDC_AUTOCLEAR, dwFlags & CLVM_AUTOCLEAR ? BST_CHECKED : BST_UNCHECKED); + onListRebuilt_Clist(0); - CheckDlgButton(clvmHwnd, IDC_LASTMSG, useLastMsg ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(clvmHwnd, IDC_USEGROUPS, useGroupsState ? BST_CHECKED : BST_UNCHECKED); + int useLastMsg = dwFlags & CLVM_USELASTMSG; + int useGroupsState = (dwFlags & CLVM_USEGROUPS) ? BST_CHECKED : (dwFlags & CLVM_DONOTUSEGROUPS) ? BST_UNCHECKED : BST_INDETERMINATE; - EnableWindow(GetDlgItem(clvmHwnd, IDC_LASTMESSAGEOP), useLastMsg); - EnableWindow(GetDlgItem(clvmHwnd, IDC_LASTMSGVALUE), useLastMsg); - EnableWindow(GetDlgItem(clvmHwnd, IDC_LASTMESSAGEUNIT), useLastMsg); + chkLastMsg.SetState(useLastMsg); + CheckDlgButton(m_hwnd, IDC_USEGROUPS, useGroupsState ? BST_CHECKED : BST_UNCHECKED); - mir_snprintf(szSetting, "%c%s_LM", 246, szBuf.get()); - DWORD lmdat = db_get_dw(0, CLVM_MODULE, szSetting, 0); + EnableWindow(GetDlgItem(m_hwnd, IDC_LASTMESSAGEOP), useLastMsg); + EnableWindow(GetDlgItem(m_hwnd, IDC_LASTMSGVALUE), useLastMsg); + EnableWindow(GetDlgItem(m_hwnd, IDC_LASTMESSAGEUNIT), useLastMsg); - SetDlgItemInt(clvmHwnd, IDC_LASTMSGVALUE, LOWORD(lmdat), FALSE); - BYTE bTmp = LOBYTE(HIWORD(lmdat)); - SendDlgItemMessage(clvmHwnd, IDC_LASTMESSAGEOP, CB_SETCURSEL, bTmp, 0); - bTmp = HIBYTE(HIWORD(lmdat)); - SendDlgItemMessage(clvmHwnd, IDC_LASTMESSAGEUNIT, CB_SETCURSEL, bTmp, 0); + mir_snprintf(szSetting, "%c%s_LM", 246, szBuf.get()); + DWORD lmdat = db_get_dw(0, CLVM_MODULE, szSetting, 0); - ShowPage(clvmHwnd, 0); -} + SetDlgItemInt(m_hwnd, IDC_LASTMSGVALUE, LOWORD(lmdat), FALSE); + BYTE bTmp = LOBYTE(HIWORD(lmdat)); + SendDlgItemMessage(m_hwnd, IDC_LASTMESSAGEOP, CB_SETCURSEL, bTmp, 0); + bTmp = HIBYTE(HIWORD(lmdat)); + SendDlgItemMessage(m_hwnd, IDC_LASTMESSAGEUNIT, CB_SETCURSEL, bTmp, 0); -void DeleteViewMode(char *szName) -{ - char szSetting[256]; + ShowPage(0); + } - mir_snprintf(szSetting, "%c%s_PF", 246, szName); - db_unset(0, CLVM_MODULE, szSetting); - mir_snprintf(szSetting, "%c%s_GF", 246, szName); - db_unset(0, CLVM_MODULE, szSetting); - mir_snprintf(szSetting, "%c%s_SM", 246, szName); - db_unset(0, CLVM_MODULE, szSetting); - mir_snprintf(szSetting, "%c%s_VA", 246, szName); - db_unset(0, CLVM_MODULE, szSetting); - mir_snprintf(szSetting, "%c%s_SSM", 246, szName); - db_unset(0, CLVM_MODULE, szSetting); - db_unset(0, CLVM_MODULE, szName); +public: + CViewModeSetupDlg() : + CDlgBase(g_plugin, IDD_OPT_VIEWMODES), + clist(this, IDC_CLIST), + modes(this, IDC_VIEWMODES), + groups(this, IDC_GROUPS), + statuses(this, IDC_STATUSMODES), + protocols(this, IDC_PROTOCOLS), + btnAdd(this, IDC_ADDVIEWMODE, SKINICON_OTHER_ADDCONTACT, LPGEN("Add view mode")), + btnRename(this, IDC_RENAMEVIEWMODE, SKINICON_OTHER_RENAME, LPGEN("Rename view mode")), + btnDelete(this, IDC_DELETEVIEWMODE, SKINICON_OTHER_DELETE, LPGEN("Remove view mode")), + btnApply(this, IDC_APPLY), + btnClearAll(this, IDC_CLEARALL), + chkLastMsg(this, IDC_LASTMSG) + { + btnAdd.OnClick = Callback(this, &CViewModeSetupDlg::onClick_Add); + btnApply.OnClick = Callback(this, &CViewModeSetupDlg::onClick_Apply); + btnRename.OnClick = Callback(this, &CViewModeSetupDlg::onClick_Rename); + btnDelete.OnClick = Callback(this, &CViewModeSetupDlg::onClick_Delete); + btnClearAll.OnClick = Callback(this, &CViewModeSetupDlg::onClick_ClearAll); - if (!mir_strcmp(g_CluiData.current_viewmode, szName) && mir_strlen(szName) == mir_strlen(g_CluiData.current_viewmode)) { - g_CluiData.bFilterEffective = 0; - Clist_Broadcast(CLM_AUTOREBUILD, 0, 0); - SetWindowText(hwndSelector, TranslateT("All contacts")); - } + chkLastMsg.OnChange = Callback(this, &CViewModeSetupDlg::onChange_LastMsg); - for (auto &hContact : Contacts()) - if (db_get_dw(hContact, CLVM_MODULE, szName, -1) != -1) - db_set_dw(hContact, CLVM_MODULE, szName, 0); -} + modes.OnSelChange = Callback(this, &CViewModeSetupDlg::onSelChange_List); -INT_PTR CALLBACK DlgProcViewModesSetup(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - clvmHwnd = hwndDlg; + clist.OnListRebuilt = Callback(this, &CViewModeSetupDlg::onListRebuilt_Clist); + } - switch (msg) { - case WM_INITDIALOG: - xpt_EnableThemeDialogTexture(hwndDlg, ETDT_ENABLETAB); + bool OnInitDialog() override + { + g_ViewModeOptDlg = m_hwnd; + xpt_EnableThemeDialogTexture(m_hwnd, ETDT_ENABLETAB); himlViewModes = ImageList_Create(16, 16, ILC_MASK | ILC_COLOR32, 12, 0); - { - int i; - for (i = ID_STATUS_OFFLINE; i <= ID_STATUS_MAX; i++) { - HICON hIcon = Skin_LoadProtoIcon(nullptr, i); - ImageList_AddIcon(himlViewModes, hIcon); - IcoLib_ReleaseIcon(hIcon); - } - HICON hIcon = (HICON)LoadImage(g_hMirApp, MAKEINTRESOURCE(IDI_SMALLDOT), IMAGE_ICON, 16, 16, 0); - nullImage = ImageList_AddIcon(himlViewModes, hIcon); - DestroyIcon(hIcon); + for (int i = ID_STATUS_OFFLINE; i <= ID_STATUS_MAX; i++) { + HICON hIcon = Skin_LoadProtoIcon(nullptr, i); + ImageList_AddIcon(himlViewModes, hIcon); + IcoLib_ReleaseIcon(hIcon); + } - RECT rcClient; - GetClientRect(hwndDlg, &rcClient); + HICON hIcon = (HICON)LoadImage(g_hMirApp, MAKEINTRESOURCE(IDI_SMALLDOT), IMAGE_ICON, 16, 16, 0); + nullImage = ImageList_AddIcon(himlViewModes, hIcon); + DestroyIcon(hIcon); - TCITEM tci; - tci.mask = TCIF_PARAM | TCIF_TEXT; - tci.lParam = 0; - tci.pszText = TranslateT("Sticky contacts"); - SendDlgItemMessage(hwndDlg, IDC_TAB, TCM_INSERTITEM, 0, (LPARAM)&tci); + RECT rcClient; + GetClientRect(m_hwnd, &rcClient); - tci.pszText = TranslateT("Filtering"); - SendDlgItemMessage(hwndDlg, IDC_TAB, TCM_INSERTITEM, 0, (LPARAM)&tci); + TCITEM tci; + tci.mask = TCIF_PARAM | TCIF_TEXT; + tci.lParam = 0; + tci.pszText = TranslateT("Sticky contacts"); + SendDlgItemMessage(m_hwnd, IDC_TAB, TCM_INSERTITEM, 0, (LPARAM)&tci); - TabCtrl_SetCurSel(GetDlgItem(hwndDlg, IDC_TAB), 0); + tci.pszText = TranslateT("Filtering"); + SendDlgItemMessage(m_hwnd, IDC_TAB, TCM_INSERTITEM, 0, (LPARAM)&tci); - TranslateDialogDefault(hwndDlg); - FillDialog(hwndDlg); - EnableWindow(GetDlgItem(hwndDlg, IDC_ADDVIEWMODE), FALSE); - { - LONG_PTR style = GetWindowLongPtr(GetDlgItem(hwndDlg, IDC_CLIST), GWL_STYLE); - style &= (~CLS_SHOWHIDDEN); - SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_CLIST), GWL_STYLE, style); - } + TabCtrl_SetCurSel(GetDlgItem(m_hwnd, IDC_TAB), 0); - SendDlgItemMessage(hwndDlg, IDC_CLIST, CLM_SETEXTRAIMAGELIST, 0, (LPARAM)himlViewModes); - SendDlgItemMessage(hwndDlg, IDC_CLIST, CLM_SETEXTRACOLUMNS, ID_STATUS_MAX - ID_STATUS_OFFLINE, 0); + FillDialog(); - CLCINFOITEM cii = { sizeof(cii) }; - cii.hParentGroup = nullptr; - cii.pszText = TranslateT("*** All contacts ***"); - hInfoItem = (HANDLE)SendDlgItemMessage(hwndDlg, IDC_CLIST, CLM_ADDINFOITEM, 0, (LPARAM)&cii); - SendDlgItemMessage(hwndDlg, IDC_CLIST, CLM_SETHIDEEMPTYGROUPS, 1, 0); + SetWindowLong(clist.GetHwnd(), GWL_STYLE, GetWindowLong(clist.GetHwnd(), GWL_STYLE) & ~CLS_SHOWHIDDEN); + clist.SetExtraImageList(himlViewModes); + clist.SetExtraColumns(ID_STATUS_MAX - ID_STATUS_OFFLINE); + clist.SetHideEmptyGroups(true); - int index = 0; + CLCINFOITEM cii = { sizeof(cii) }; + cii.hParentGroup = nullptr; + cii.pszText = TranslateT("*** All contacts ***"); + hInfoItem = clist.AddInfoItem(&cii); - if (g_CluiData.current_viewmode[0] != '\0') { - wchar_t *temp = mir_utf8decodeW(g_CluiData.current_viewmode); - if (temp) { - index = SendDlgItemMessage(hwndDlg, IDC_VIEWMODES, LB_FINDSTRING, -1, (LPARAM)temp); - mir_free(temp); - } - if (index == -1) - index = 0; - } + int index = 0; - if (SendDlgItemMessage(hwndDlg, IDC_VIEWMODES, LB_SETCURSEL, index, 0) != LB_ERR) { - clvm_curItem = index; - UpdateFilters(); + if (g_CluiData.current_viewmode[0] != '\0') { + wchar_t *temp = mir_utf8decodeW(g_CluiData.current_viewmode); + if (temp) { + index = modes.FindString(temp); + mir_free(temp); } - else clvm_curItem = -1; - - g_ViewModeOptDlg = TRUE; - i = 0; - while (_page2Controls[i] != 0) - ShowWindow(GetDlgItem(hwndDlg, _page2Controls[i++]), SW_HIDE); - ShowWindow(hwndDlg, SW_SHOWNORMAL); - EnableWindow(GetDlgItem(hwndDlg, IDC_APPLY), FALSE); - SendDlgItemMessage(hwndDlg, IDC_AUTOCLEARSPIN, UDM_SETRANGE, 0, MAKELONG(1000, 0)); - SetWindowText(hwndDlg, TranslateT("Configure view modes")); + if (index == -1) + index = 0; } - return TRUE; - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDC_PROTOGROUPOP: - case IDC_GROUPSTATUSOP: - case IDC_LASTMESSAGEUNIT: - case IDC_LASTMESSAGEOP: - if (HIWORD(wParam) == CBN_SELCHANGE) - EnableWindow(GetDlgItem(hwndDlg, IDC_APPLY), TRUE); - break; + if (modes.SetCurSel(0) != LB_ERR) { + m_iCurrItem = index; + UpdateFilters(); + } + else m_iCurrItem = -1; + + for (auto &ctrlId : _page2Controls) + ShowWindow(GetDlgItem(m_hwnd, ctrlId), SW_HIDE); + ShowWindow(m_hwnd, SW_SHOWNORMAL); + btnApply.Disable(); + SendDlgItemMessage(m_hwnd, IDC_AUTOCLEARSPIN, UDM_SETRANGE, 0, MAKELONG(1000, 0)); + SetWindowText(m_hwnd, TranslateT("Configure view modes")); + return true; + } - case IDC_USEGROUPS: - EnableWindow(GetDlgItem(hwndDlg, IDC_APPLY), TRUE); - break; + void OnChange() override + { + btnApply.Enable(); + } - case IDC_AUTOCLEAR: - EnableWindow(GetDlgItem(hwndDlg, IDC_APPLY), TRUE); - break; + bool OnApply() override + { + SaveState(); + if (g_CluiData.bFilterEffective) + ApplyViewMode(g_CluiData.current_viewmode); + return true; + } - case IDC_LASTMSG: - { - int bUseLastMsg = IsDlgButtonChecked(hwndDlg, IDC_LASTMSG); - EnableWindow(GetDlgItem(hwndDlg, IDC_LASTMESSAGEOP), bUseLastMsg); - EnableWindow(GetDlgItem(hwndDlg, IDC_LASTMESSAGEUNIT), bUseLastMsg); - EnableWindow(GetDlgItem(hwndDlg, IDC_LASTMSGVALUE), bUseLastMsg); - EnableWindow(GetDlgItem(hwndDlg, IDC_APPLY), TRUE); - } - break; + void OnDestroy() override + { + ImageList_RemoveAll(himlViewModes); + ImageList_Destroy(himlViewModes); + g_ViewModeOptDlg = nullptr; + } - case IDC_AUTOCLEARVAL: - case IDC_LASTMSGVALUE: - if (HIWORD(wParam) == EN_CHANGE && GetFocus() == (HWND)lParam) - EnableWindow(GetDlgItem(hwndDlg, IDC_APPLY), TRUE); - break; + void onChange_LastMsg(CCtrlCheck *) + { + bool bUseLastMsg = chkLastMsg.GetState(); + EnableWindow(GetDlgItem(m_hwnd, IDC_LASTMESSAGEOP), bUseLastMsg); + EnableWindow(GetDlgItem(m_hwnd, IDC_LASTMESSAGEUNIT), bUseLastMsg); + EnableWindow(GetDlgItem(m_hwnd, IDC_LASTMSGVALUE), bUseLastMsg); + btnApply.Enable(); + } - case IDC_DELETEVIEWMODE: - if (MessageBox(nullptr, TranslateT("Really delete this view mode? This cannot be undone"), TranslateT("Delete a view mode"), MB_YESNO | MB_ICONQUESTION) == IDYES) { - int iLen = SendDlgItemMessage(hwndDlg, IDC_VIEWMODES, LB_GETTEXTLEN, SendDlgItemMessage(hwndDlg, IDC_VIEWMODES, LB_GETCURSEL, 0, 0), 0); - if (iLen) { - wchar_t *szTempBuf = (wchar_t *)_alloca((iLen + 1) * sizeof(wchar_t)); - SendDlgItemMessage(hwndDlg, IDC_VIEWMODES, LB_GETTEXT, SendDlgItemMessage(hwndDlg, IDC_VIEWMODES, LB_GETCURSEL, 0, 0), (LPARAM)szTempBuf); - DeleteViewMode(T2Utf(szTempBuf)); - - SendDlgItemMessage(hwndDlg, IDC_VIEWMODES, LB_DELETESTRING, SendDlgItemMessage(hwndDlg, IDC_VIEWMODES, LB_GETCURSEL, 0, 0), 0); - if (SendDlgItemMessage(hwndDlg, IDC_VIEWMODES, LB_SETCURSEL, 0, 0) != LB_ERR) { - clvm_curItem = 0; - UpdateFilters(); - } - else clvm_curItem = -1; - } - } - break; + void onClick_Add(CCtrlButton *) + { + ENTER_STRING es = {}; + es.caption = LPGENW("Enter view mode name"); + if (!EnterString(&es)) + return; - case IDC_ADDVIEWMODE: - { - wchar_t szBuf[256]; - szBuf[0] = 0; - GetDlgItemText(hwndDlg, IDC_NEWVIEMODE, szBuf, _countof(szBuf)); - szBuf[255] = 0; - - if (szBuf[0] != 0) { - T2Utf szUTF8Buf(szBuf); - - if (db_get_dw(0, CLVM_MODULE, szUTF8Buf, -1) != -1) - MessageBox(nullptr, TranslateT("A view mode with this name does already exist"), TranslateT("Duplicate name"), MB_OK); - else { - int iNewItem = SendDlgItemMessage(hwndDlg, IDC_VIEWMODES, LB_INSERTSTRING, -1, (LPARAM)szBuf); - if (iNewItem != LB_ERR) { - SendDlgItemMessage(hwndDlg, IDC_VIEWMODES, LB_SETCURSEL, (WPARAM)iNewItem, 0); - SaveViewMode(szUTF8Buf, L"", "", 0, -1, 0, 0, 0, 0); - clvm_curItem = iNewItem; - UpdateStickies(); - SendDlgItemMessage(hwndDlg, IDC_PROTOGROUPOP, CB_SETCURSEL, 0, 0); - SendDlgItemMessage(hwndDlg, IDC_GROUPSTATUSOP, CB_SETCURSEL, 0, 0); - } - } - SetDlgItemText(hwndDlg, IDC_NEWVIEMODE, L""); - } - EnableWindow(GetDlgItem(hwndDlg, IDC_ADDVIEWMODE), FALSE); - UpdateFilters(); - ShowPage(clvmHwnd, 0); - break; - } - case IDC_CLEARALL: - { - for (auto &hContact : Contacts()) { - HANDLE hItem = (HANDLE)SendDlgItemMessage(hwndDlg, IDC_CLIST, CLM_FINDCONTACT, hContact, 0); - if (hItem) - SendDlgItemMessage(hwndDlg, IDC_CLIST, CLM_SETCHECKMARK, (WPARAM)hItem, 0); - } + T2Utf szUTF8Buf(es.ptszResult); + + if (db_get_dw(0, CLVM_MODULE, szUTF8Buf, -1) != -1) + MessageBox(nullptr, TranslateT("A view mode with this name does already exist"), TranslateT("Duplicate name"), MB_OK); + else { + int iNewItem = modes.AddString(es.ptszResult); + if (iNewItem != LB_ERR) { + modes.SetCurSel(iNewItem); + SaveViewMode(szUTF8Buf, L"", "", 0, -1, 0, 0, 0, 0); + m_iCurrItem = iNewItem; + onListRebuilt_Clist(0); + SendDlgItemMessage(m_hwnd, IDC_PROTOGROUPOP, CB_SETCURSEL, 0, 0); + SendDlgItemMessage(m_hwnd, IDC_GROUPSTATUSOP, CB_SETCURSEL, 0, 0); } - case IDOK: - case IDC_APPLY: - SaveState(); - if (g_CluiData.bFilterEffective) - ApplyViewMode(g_CluiData.current_viewmode); - if (LOWORD(wParam) == IDOK) - DestroyWindow(hwndDlg); - break; - case IDCANCEL: - DestroyWindow(hwndDlg); - break; } - if (LOWORD(wParam) == IDC_NEWVIEMODE && HIWORD(wParam) == EN_CHANGE) - EnableWindow(GetDlgItem(hwndDlg, IDC_ADDVIEWMODE), TRUE); + UpdateFilters(); + ShowPage(0); + } + + void onClick_Rename(CCtrlButton *) + { + ENTER_STRING es = {}; + es.caption = LPGENW("Enter new view mode name"); + if (!EnterString(&es)) + return; + + int idx = modes.GetCurSel(); + ptrW szTempBuf(modes.GetItemText(idx)); + if (!mir_wstrlen(szTempBuf)) + return; + + DeleteViewMode(T2Utf(szTempBuf)); + modes.DeleteString(idx); + modes.InsertString(es.ptszResult, idx); + modes.SetCurSel(idx); + SaveState(); + } + + void onClick_Delete(CCtrlButton *) + { + if (IDYES != MessageBox(nullptr, TranslateT("Really delete this view mode? This cannot be undone"), TranslateT("Delete a view mode"), MB_YESNO | MB_ICONQUESTION)) + return; + + int idx = modes.GetCurSel(); + ptrW szTempBuf(modes.GetItemText(idx)); + if (!mir_wstrlen(szTempBuf)) + return; - if (LOWORD(wParam) == IDC_VIEWMODES && HIWORD(wParam) == LBN_SELCHANGE) { - SaveState(); - clvm_curItem = SendDlgItemMessage(hwndDlg, IDC_VIEWMODES, LB_GETCURSEL, 0, 0); + DeleteViewMode(T2Utf(szTempBuf)); + + modes.DeleteString(idx); + if (modes.SetCurSel(0) != LB_ERR) { + m_iCurrItem = 0; UpdateFilters(); - //EnableWindow(GetDlgItem(hwndDlg, IDC_APPLY), TRUE); - //SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); } - break; + else m_iCurrItem = -1; + } - case WM_NOTIFY: - switch (((LPNMHDR)lParam)->idFrom) { - case IDC_GROUPS: - case IDC_STATUSMODES: - case IDC_PROTOCOLS: - case IDC_CLIST: - if (((LPNMHDR)lParam)->code == NM_CLICK || ((LPNMHDR)lParam)->code == CLN_CHECKCHANGED) - EnableWindow(GetDlgItem(hwndDlg, IDC_APPLY), TRUE); - - if (((LPNMHDR)lParam)->code == CLN_LISTREBUILT) - UpdateStickies(); - - if (((LPNMHDR)lParam)->code == NM_CLICK) { - NMCLISTCONTROL *nm = (NMCLISTCONTROL *)lParam; - if (nm->iColumn == -1) - break; + void onClick_Apply(CCtrlButton *) + { + OnApply(); + } - DWORD hitFlags; - HANDLE hItem = (HANDLE)SendDlgItemMessage(hwndDlg, IDC_CLIST, CLM_HITTEST, (WPARAM)&hitFlags, MAKELPARAM(nm->pt.x, nm->pt.y)); - if (hItem == nullptr) - break; + void onClick_ClearAll(CCtrlButton*) + { + for (auto &hContact : Contacts()) { + HANDLE hItem = clist.FindContact(hContact); + if (hItem) + clist.SetCheck(hItem, 0); + } + } - if (!(hitFlags & CLCHT_ONITEMEXTRA)) - break; + void onSelChange_List(CCtrlListBox*) + { + SaveState(); + m_iCurrItem = modes.GetCurSel(); + UpdateFilters(); + } - int iImage = SendDlgItemMessage(hwndDlg, IDC_CLIST, CLM_GETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(nm->iColumn, 0)); - if (iImage == nullImage) - iImage = nm->iColumn; - else if (iImage != EMPTY_EXTRA_ICON) - iImage = nullImage; - SetIconsForColumn(GetDlgItem(hwndDlg, IDC_CLIST), hItem, hInfoItem, nm->iColumn, iImage); - } - break; + void onListRebuilt_Clist(CCtrlClc::TEventInfo *) + { + for (auto &hContact : Contacts()) { + HANDLE hItem = clist.FindContact(hContact); + if (hItem) + clist.SetCheck(hItem, db_get_dw(hContact, CLVM_MODULE, g_szModename, 0)); - case IDC_TAB: - if (((LPNMHDR)lParam)->code == TCN_SELCHANGE) { - int id = TabCtrl_GetCurSel(GetDlgItem(hwndDlg, IDC_TAB)); + DWORD localMask = HIWORD(db_get_dw(hContact, CLVM_MODULE, g_szModename, 0)); + UpdateClistItem(hItem, (localMask == 0 || localMask == stickyStatusMask) ? stickyStatusMask : localMask); + } + + for (int i = ID_STATUS_OFFLINE; i <= ID_STATUS_MAX; i++) + clist.SetExtraImage(hInfoItem, i - ID_STATUS_OFFLINE, (1 << (i - ID_STATUS_OFFLINE)) & stickyStatusMask ? i - ID_STATUS_OFFLINE : MAX_STATUS_COUNT); + + HANDLE hItem = clist.GetNextItem(0, CLGN_ROOT); + hItem = clist.GetNextItem(hItem, CLGN_NEXTGROUP); + while (hItem) { + for (int i = ID_STATUS_OFFLINE; i <= ID_STATUS_MAX; i++) + clist.SetExtraImage(hItem, i - ID_STATUS_OFFLINE, nullImage); + hItem = clist.GetNextItem(hItem, CLGN_NEXTGROUP); + } + } + + void onClick_Clist(CCtrlClc::TEventInfo *ev) + { + NMCLISTCONTROL *nm = (NMCLISTCONTROL *)ev->info; + if (nm->iColumn == -1) + return; + + DWORD hitFlags; + HANDLE hItem = clist.HitTest(nm->pt.x, nm->pt.y, &hitFlags); + if (hItem == nullptr) + return; + + if (!(hitFlags & CLCHT_ONITEMEXTRA)) + return; + + int iImage = clist.GetExtraImage(hItem, nm->iColumn); + if (iImage == nullImage) + iImage = nm->iColumn; + else if (iImage != EMPTY_EXTRA_ICON) + iImage = nullImage; + SetIconsForColumn(hItem, hInfoItem, nm->iColumn, iImage); + } + + INT_PTR DlgProc(UINT msg, WPARAM wParam, LPARAM lParam) override + { + if (msg == WM_NOTIFY) { + LPNMHDR hdr = (LPNMHDR)lParam; + if (hdr->code == TCN_SELCHANGE && hdr->idFrom == IDC_TAB) { + int id = TabCtrl_GetCurSel(GetDlgItem(m_hwnd, IDC_TAB)); if (id == 0) - ShowPage(hwndDlg, 0); + ShowPage(0); else - ShowPage(hwndDlg, 1); - break; + ShowPage(1); + return 0; } } - break; - case WM_DESTROY: - ImageList_RemoveAll(himlViewModes); - ImageList_Destroy(himlViewModes); - g_ViewModeOptDlg = FALSE; - break; + return CDlgBase::DlgProc(msg, wParam, lParam); } - return FALSE; -} +}; ///////////////////////////////////////////////////////////////////////////////////////// @@ -1074,7 +1070,7 @@ clvm_reset_command: case IDC_CONFIGUREMODES: clvm_config_command: if (!g_ViewModeOptDlg) - CreateDialogParam(g_plugin.getInst(), MAKEINTRESOURCE(IDD_OPT_VIEWMODES), nullptr, DlgProcViewModesSetup, 0); + (new CViewModeSetupDlg())->Create(); break; } diff --git a/plugins/Clist_modern/src/resource.h b/plugins/Clist_modern/src/resource.h index 7aac6af638..2da51322ab 100644 --- a/plugins/Clist_modern/src/resource.h +++ b/plugins/Clist_modern/src/resource.h @@ -4,10 +4,10 @@ // #define IDC_ALWAYS_VISIBLEICON 0 #define IDC_APPLY 3 -#define IDD_OPT_ITEM_CONTACT_TIME 102 +#define IDD_OPT_ITEM_CONTACT_TIME 101 #define IDI_MIRANDA 102 #define IDD_OPT_ROWTMPL 103 -#define IDI_SMS 103 +#define IDI_SMS 104 #define IDD_OPT_CLIST 126 #define IDD_OPT_SOUND 134 #define IDD_OPT_HOTKEYS 134 @@ -448,7 +448,7 @@ #define IDC_PROTOCOLS 19103 #define IDC_ADDVIEWMODE 19104 #define IDC_DELETEVIEWMODE 19105 -#define IDC_NEWVIEMODE 19106 +#define IDC_RENAMEVIEWMODE 19106 #define IDC_GROUPS 19107 #define IDC_STATUSMODES 19108 #define IDC_CLIST 19109 diff --git a/plugins/Clist_modern/src/version.h b/plugins/Clist_modern/src/version.h index 090ab46c27..04c33a3fbc 100644 --- a/plugins/Clist_modern/src/version.h +++ b/plugins/Clist_modern/src/version.h @@ -1,7 +1,7 @@ #define __MAJOR_VERSION 0 #define __MINOR_VERSION 9 #define __RELEASE_NUM 1 -#define __BUILD_NUM 10 +#define __BUILD_NUM 11 #include -- cgit v1.2.3