From 67c6f233d7e60ad59918e734fe565f5f5dfd28d5 Mon Sep 17 00:00:00 2001 From: Kirill Volinsky Date: Sun, 20 May 2012 18:33:39 +0000 Subject: projects renames and fixes git-svn-id: http://svn.miranda-ng.org/main/trunk@105 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/AVS/options.cpp | 1147 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1147 insertions(+) create mode 100644 plugins/AVS/options.cpp (limited to 'plugins/AVS/options.cpp') diff --git a/plugins/AVS/options.cpp b/plugins/AVS/options.cpp new file mode 100644 index 0000000000..58502a9655 --- /dev/null +++ b/plugins/AVS/options.cpp @@ -0,0 +1,1147 @@ +/* + +Miranda IM: the free IM client for Microsoft* Windows* + +Copyright 2000-2004 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "commonheaders.h" + +#define DM_SETAVATARNAME (WM_USER + 10) +#define DM_REALODAVATAR (WM_USER + 11) +#define DM_AVATARCHANGED (WM_USER + 12) +#define DM_PROTOCOLCHANGED (WM_USER + 13) + +extern int _DebugPopup(HANDLE hContact, const char *fmt, ...); +extern INT_PTR SetAvatar(WPARAM wParam, LPARAM lParam); +extern OBJLIST g_ProtoPictures; +extern HANDLE hEventChanged; +extern HINSTANCE g_hInst; +extern HICON g_hIcon; + +extern int CreateAvatarInCache(HANDLE hContact, struct avatarCacheEntry *ace, char *szProto); +extern INT_PTR ProtectAvatar(WPARAM wParam, LPARAM lParam); +extern int SetAvatarAttribute(HANDLE hContact, DWORD attrib, int mode); +extern int ChangeAvatar(HANDLE hContact, BOOL fLoad, BOOL fNotifyHist = FALSE, int pa_format = 0); +extern void DeleteAvatarFromCache(HANDLE, BOOL); +extern HBITMAP LoadPNG(struct avatarCacheEntry *ace, char *szFilename); +extern HANDLE GetContactThatHaveTheAvatar(HANDLE hContact, int locked = -1); + +extern int ProtoServiceExists(const char *szModule,const char *szService); +extern BOOL Proto_IsAvatarsEnabled(const char *proto); +extern BOOL ScreenToClient(HWND hWnd, LPRECT lpRect); + +static BOOL dialoginit = TRUE; + +struct WindowData { + HANDLE hContact; + HANDLE hHook; +}; + +static void RemoveProtoPic(const char *szProto) +{ + DBDeleteContactSetting(NULL, PPICT_MODULE, szProto); + + if ( szProto == NULL ) + return; + + if ( !lstrcmpA(AVS_DEFAULT, szProto )) { + for (int i = 0; i < g_ProtoPictures.getCount(); i++) { + protoPicCacheEntry& p = g_ProtoPictures[i]; + if (p.szProtoname == NULL) + continue; + + p.clear(); + CreateAvatarInCache(0, &p, ( char* )p.szProtoname); + NotifyEventHooks(hEventChanged, 0, (LPARAM)&p); + } + return; + } + + if (strstr(szProto, "Global avatar for")) { + char szProtoname[MAX_PATH] = {0}; + lstrcpynA(szProtoname, szProto, lstrlenA(szProto)- lstrlenA("accounts")); + lstrcpyA(szProtoname, strrchr(szProtoname, ' ') + 1); + for (int i = 0; i < g_ProtoPictures.getCount(); i++) { + protoPicCacheEntry& p = g_ProtoPictures[i]; + + PROTOACCOUNT* pdescr = (PROTOACCOUNT*)CallService(MS_PROTO_GETACCOUNT, 0, (LPARAM)p.szProtoname); + if (pdescr == NULL && lstrcmpA(p.szProtoname, szProto)) + continue; + + if (!lstrcmpA(p.szProtoname, szProto) || !lstrcmpA(pdescr->szProtoName, szProtoname)) { + if (p.szProtoname == NULL) + continue; + + p.clear(); + CreateAvatarInCache(0, &p, ( char* )p.szProtoname); + NotifyEventHooks( hEventChanged, 0, (LPARAM)&p ); + } + } + return; + } + + for (int i = 0; i < g_ProtoPictures.getCount(); i++) { + protoPicCacheEntry& p = g_ProtoPictures[i]; + if ( !lstrcmpA( p.szProtoname, szProto )) { + p.clear(); + NotifyEventHooks( hEventChanged, 0, (LPARAM)&p ); + } + } +} + +static void SetProtoPic(char *szProto) +{ + TCHAR FileName[MAX_PATH]; + OPENFILENAME ofn={0}; + TCHAR filter[256]; + + filter[0] = '\0'; + CallService(MS_UTILS_GETBITMAPFILTERSTRINGST, SIZEOF(filter), ( LPARAM )filter); + + ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; + ofn.lpstrFilter = filter; + ofn.hwndOwner=0; + ofn.lpstrFile = FileName; + ofn.nMaxFile = MAX_PATH; + ofn.nMaxFileTitle = MAX_PATH; + ofn.Flags=OFN_HIDEREADONLY; + ofn.lpstrInitialDir = _T("."); + *FileName = '\0'; + ofn.lpstrDefExt = _T(""); + if ( GetOpenFileName( &ofn )) { + HANDLE hFile; + + if ((hFile = CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) + return; + + CloseHandle(hFile); + + TCHAR szNewPath[MAX_PATH]; + AVS_pathToRelative(FileName, szNewPath); + DBWriteContactSettingTString(NULL, PPICT_MODULE, szProto, szNewPath); + + if (!lstrcmpA(AVS_DEFAULT, szProto)) { + for ( int i = 0; i < g_ProtoPictures.getCount(); i++ ) { + protoPicCacheEntry& p = g_ProtoPictures[i]; + if (lstrlenA(p.szProtoname) != 0) { + if (p.hbmPic == 0) { + CreateAvatarInCache(0, &p, ( char* )szProto); + NotifyEventHooks(hEventChanged, 0, (LPARAM)&p); + } + } + } + } + else if (strstr(szProto, "Global avatar for")) { + char szProtoname[MAX_PATH] = {0}; + lstrcpynA(szProtoname, szProto, lstrlenA(szProto)- lstrlenA("accounts")); + lstrcpyA(szProtoname, strrchr(szProtoname, ' ') + 1); + for (int i = 0; i < g_ProtoPictures.getCount(); i++) { + PROTOACCOUNT* pdescr = (PROTOACCOUNT*)CallService(MS_PROTO_GETACCOUNT, 0, (LPARAM)g_ProtoPictures[i].szProtoname); + if (pdescr == NULL && lstrcmpA(g_ProtoPictures[i].szProtoname, szProto)) + continue; + + if (!lstrcmpA(g_ProtoPictures[i].szProtoname, szProto) || !lstrcmpA(pdescr->szProtoName, szProtoname)) { + protoPicCacheEntry& p = g_ProtoPictures[i]; + if (lstrlenA(p.szProtoname) != 0) { + if (p.hbmPic == 0) { + CreateAvatarInCache(0, &p, ( char* )szProto); + NotifyEventHooks(hEventChanged, 0, (LPARAM)&p); + } + } + } + } + } + else { + for (int i = 0; i < g_ProtoPictures.getCount(); i++) { + protoPicCacheEntry& p = g_ProtoPictures[i]; + if ( lstrlenA(p.szProtoname) == 0) + break; + + if (!strcmp(p.szProtoname, szProto) && lstrlenA(p.szProtoname) == lstrlenA(szProto)) { + if (p.hbmPic != 0) + DeleteObject(p.hbmPic); + ZeroMemory(&p, sizeof(avatarCacheEntry)); + CreateAvatarInCache(0, &p, ( char* )szProto); + NotifyEventHooks(hEventChanged, 0, (LPARAM)&p ); + break; + } + } + } + } +} + +static char* g_selectedProto; + +INT_PTR CALLBACK DlgProcOptionsAvatars(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) { + case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); + + CheckDlgButton(hwndDlg, IDC_SHOWWARNINGS, DBGetContactSettingByte(0, AVS_MODULE, "warnings", 0)); + CheckDlgButton(hwndDlg, IDC_MAKE_GRAYSCALE, DBGetContactSettingByte(0, AVS_MODULE, "MakeGrayscale", 0)); + CheckDlgButton(hwndDlg, IDC_MAKE_TRANSPARENT_BKG, DBGetContactSettingByte(0, AVS_MODULE, "MakeTransparentBkg", 0)); + CheckDlgButton(hwndDlg, IDC_MAKE_TRANSP_PROPORTIONAL, DBGetContactSettingByte(0, AVS_MODULE, "MakeTransparencyProportionalToColorDiff", 0)); + + SendDlgItemMessage(hwndDlg, IDC_BKG_NUM_POINTS_SPIN, UDM_SETRANGE, 0, MAKELONG(8, 2)); + SendDlgItemMessage(hwndDlg, IDC_BKG_NUM_POINTS_SPIN, UDM_SETPOS, 0, (LPARAM)DBGetContactSettingWord(0, AVS_MODULE, "TranspBkgNumPoints", 5)); + + SendDlgItemMessage(hwndDlg, IDC_BKG_COLOR_DIFFERENCE_SPIN, UDM_SETRANGE, 0, MAKELONG(100, 0)); + SendDlgItemMessage(hwndDlg, IDC_BKG_COLOR_DIFFERENCE_SPIN, UDM_SETPOS, 0, (LPARAM)DBGetContactSettingWord(0, AVS_MODULE, "TranspBkgColorDiff", 10)); + { + BOOL enabled = IsDlgButtonChecked(hwndDlg, IDC_MAKE_TRANSPARENT_BKG); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_NUM_POINTS_L), enabled); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_NUM_POINTS_SPIN), enabled); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_NUM_POINTS), enabled); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_COLOR_DIFFERENCE_L), enabled); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_COLOR_DIFFERENCE_SPIN), enabled); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_COLOR_DIFFERENCE), enabled); + EnableWindow(GetDlgItem(hwndDlg, IDC_MAKE_TRANSP_PROPORTIONAL), enabled); + } + + return TRUE; + + case WM_COMMAND: + if ((LOWORD(wParam) == IDC_BKG_NUM_POINTS || LOWORD(wParam) == IDC_BKG_COLOR_DIFFERENCE) + && (HIWORD(wParam) != EN_CHANGE || (HWND) lParam != GetFocus())) + return FALSE; + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + + case WM_NOTIFY: + switch (((LPNMHDR) lParam)->idFrom) { + case IDC_MAKE_TRANSPARENT_BKG: + { + BOOL transp_enabled = IsDlgButtonChecked(hwndDlg, IDC_MAKE_TRANSPARENT_BKG); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_NUM_POINTS_L), transp_enabled); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_NUM_POINTS_SPIN), transp_enabled); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_NUM_POINTS), transp_enabled); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_COLOR_DIFFERENCE_L), transp_enabled); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_COLOR_DIFFERENCE_SPIN), transp_enabled); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_COLOR_DIFFERENCE), transp_enabled); + EnableWindow(GetDlgItem(hwndDlg, IDC_MAKE_TRANSP_PROPORTIONAL), transp_enabled); + break; + } + case 0: + switch (((LPNMHDR) lParam)->code) { + case PSN_APPLY: + DBWriteContactSettingByte(NULL, AVS_MODULE, "warnings", IsDlgButtonChecked(hwndDlg, IDC_SHOWWARNINGS) ? 1 : 0); + DBWriteContactSettingByte(NULL, AVS_MODULE, "MakeGrayscale", IsDlgButtonChecked(hwndDlg, IDC_MAKE_GRAYSCALE) ? 1 : 0); + DBWriteContactSettingByte(NULL, AVS_MODULE, "MakeTransparentBkg", IsDlgButtonChecked(hwndDlg, IDC_MAKE_TRANSPARENT_BKG) ? 1 : 0); + DBWriteContactSettingByte(NULL, AVS_MODULE, "MakeTransparencyProportionalToColorDiff", IsDlgButtonChecked(hwndDlg, IDC_MAKE_TRANSP_PROPORTIONAL) ? 1 : 0); + DBWriteContactSettingWord(NULL, AVS_MODULE, "TranspBkgNumPoints", (WORD) SendDlgItemMessage(hwndDlg, IDC_BKG_NUM_POINTS_SPIN, UDM_GETPOS, 0, 0)); + DBWriteContactSettingWord(NULL, AVS_MODULE, "TranspBkgColorDiff", (WORD) SendDlgItemMessage(hwndDlg, IDC_BKG_COLOR_DIFFERENCE_SPIN, UDM_GETPOS, 0, 0)); + } } + break; + } + return FALSE; +} + +INT_PTR CALLBACK DlgProcOptionsOwn(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) { + case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); + + CheckDlgButton(hwndDlg, IDC_MAKE_MY_AVATARS_TRANSP, DBGetContactSettingByte(0, AVS_MODULE, "MakeMyAvatarsTransparent", 0)); + CheckDlgButton(hwndDlg, IDC_SET_MAKE_SQUARE, DBGetContactSettingByte(0, AVS_MODULE, "SetAllwaysMakeSquare", 0)); + + return TRUE; + + case WM_COMMAND: + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + + case WM_NOTIFY: + switch (((LPNMHDR) lParam)->idFrom) { + case 0: + switch (((LPNMHDR) lParam)->code) { + case PSN_APPLY: + DBWriteContactSettingByte(NULL, AVS_MODULE, "MakeMyAvatarsTransparent", IsDlgButtonChecked(hwndDlg, IDC_MAKE_MY_AVATARS_TRANSP) ? 1 : 0); + DBWriteContactSettingByte(NULL, AVS_MODULE, "SetAllwaysMakeSquare", IsDlgButtonChecked(hwndDlg, IDC_SET_MAKE_SQUARE) ? 1 : 0); + } } + break; + } + return FALSE; +} + +static char* GetProtoFromList(HWND hwndDlg, int iItem) +{ + LVITEM item; + item.mask = LVIF_PARAM; + item.iItem = iItem; + if ( !ListView_GetItem( GetDlgItem(hwndDlg, IDC_PROTOCOLS), &item )) + return NULL; + + protoPicCacheEntry* pce = ( protoPicCacheEntry* )item.lParam; + return ( pce == NULL ) ? NULL : pce->szProtoname; +} + +INT_PTR CALLBACK DlgProcOptionsProtos(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + HWND hwndList = GetDlgItem(hwndDlg, IDC_PROTOCOLS); + HWND hwndChoosePic = GetDlgItem(hwndDlg, IDC_SETPROTOPIC); + HWND hwndRemovePic = GetDlgItem(hwndDlg, IDC_REMOVEPROTOPIC); + + switch (msg) { + case WM_INITDIALOG: + { + LVITEM item = {0}; + LVCOLUMN lvc = {0}; + UINT64 newItem = 0; + + dialoginit = TRUE; + TranslateDialogDefault(hwndDlg); + ListView_SetExtendedListViewStyle(hwndList, LVS_EX_CHECKBOXES); + lvc.mask = LVCF_FMT; + lvc.fmt = LVCFMT_IMAGE | LVCFMT_LEFT; + ListView_InsertColumn(hwndList, 0, &lvc); + + item.mask = LVIF_TEXT | LVIF_PARAM; + item.iItem = 1000; + for (int i = 0; i < g_ProtoPictures.getCount(); i++ ) { + item.lParam = ( LPARAM )&g_ProtoPictures[i]; + item.pszText = g_ProtoPictures[i].tszAccName; + newItem = ListView_InsertItem(hwndList, &item); + if (newItem >= 0) + ListView_SetCheckState(hwndList, newItem, + DBGetContactSettingByte(NULL, AVS_MODULE, g_ProtoPictures[i].szProtoname, 1) ? TRUE : FALSE); + } + ListView_SetColumnWidth(hwndList, 0, LVSCW_AUTOSIZE); + ListView_Arrange(hwndList, LVA_ALIGNLEFT | LVA_ALIGNTOP); + EnableWindow(hwndChoosePic, FALSE); + EnableWindow(hwndRemovePic, FALSE); + + dialoginit = FALSE; + } + return TRUE; + + case WM_COMMAND: + switch(LOWORD(wParam)) { + case IDC_SETPROTOPIC: + case IDC_REMOVEPROTOPIC: + { + int iItem = ListView_GetSelectionMark(hwndList); + char* szProto = GetProtoFromList(hwndDlg, iItem); + if ( szProto ) { + if (LOWORD(wParam) == IDC_SETPROTOPIC) + SetProtoPic( szProto ); + else + RemoveProtoPic( szProto ); + + NMHDR nm = { hwndList, IDC_PROTOCOLS, NM_CLICK }; + SendMessage(hwndDlg, WM_NOTIFY, 0, (LPARAM)&nm); + } + break; + } + } + break; + + case WM_DRAWITEM: + { + LPDRAWITEMSTRUCT dis = (LPDRAWITEMSTRUCT) lParam; + + if (dis->CtlType == ODT_BUTTON && dis->CtlID == IDC_PROTOPIC) { + AVATARDRAWREQUEST avdrq = {0}; + avdrq.cbSize = sizeof(avdrq); + avdrq.hTargetDC = dis->hDC; + avdrq.dwFlags |= AVDRQ_PROTOPICT; + avdrq.szProto = g_selectedProto; + GetClientRect(GetDlgItem(hwndDlg, IDC_PROTOPIC), &avdrq.rcDraw); + CallService(MS_AV_DRAWAVATAR, 0, (LPARAM)&avdrq); + } + return TRUE; + } + + case WM_NOTIFY: + if (dialoginit) + break; + + switch (((LPNMHDR) lParam)->idFrom) { + case IDC_PROTOCOLS: + switch (((LPNMHDR) lParam)->code) { + case LVN_KEYDOWN: + { + NMLVKEYDOWN* ptkd = (NMLVKEYDOWN*)lParam; + if (ptkd&&ptkd->wVKey==VK_SPACE&&ListView_GetSelectedCount(ptkd->hdr.hwndFrom)==1) + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + } + break; + case LVN_ITEMCHANGED: + { + NMLISTVIEW *nmlv = (NMLISTVIEW *)lParam; + if (IsWindowVisible(GetDlgItem(hwndDlg, IDC_PROTOCOLS)) && ((nmlv->uNewState ^ nmlv->uOldState) & LVIS_STATEIMAGEMASK)) + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + } + break; + case NM_CLICK: + { + EnableWindow(hwndChoosePic, TRUE); + EnableWindow(hwndRemovePic, TRUE); + + int iItem = ListView_GetSelectionMark(hwndList); + g_selectedProto = GetProtoFromList(hwndDlg, iItem); + if ( g_selectedProto ) { + DBVARIANT dbv = {0}; + if (!DBGetContactSettingTString(NULL, PPICT_MODULE, g_selectedProto, &dbv)) + { + if (!AVS_pathIsAbsolute(dbv.ptszVal)) + { + TCHAR szFinalPath[MAX_PATH]; + mir_sntprintf(szFinalPath, SIZEOF(szFinalPath), _T("%%miranda_path%%\\%s"), dbv.ptszVal); + SetDlgItemText(hwndDlg, IDC_PROTOAVATARNAME, szFinalPath); + } + else SetDlgItemText(hwndDlg, IDC_PROTOAVATARNAME, dbv.ptszVal); + + InvalidateRect(GetDlgItem(hwndDlg, IDC_PROTOPIC), NULL, TRUE); + DBFreeVariant(&dbv); + } + else { + SetWindowText(GetDlgItem(hwndDlg, IDC_PROTOAVATARNAME), _T("")); + InvalidateRect(GetDlgItem(hwndDlg, IDC_PROTOPIC), NULL, TRUE); + } + } + break; + } + } + break; + case 0: + switch (((LPNMHDR) lParam)->code) { + case PSN_APPLY: + { + for (int i = 0; i < ListView_GetItemCount(hwndList); i++) { + char *szProto = GetProtoFromList(hwndDlg, i); + + BOOL oldVal = DBGetContactSettingByte(NULL, AVS_MODULE, szProto, 1); + BOOL newVal = ListView_GetCheckState(hwndList, i); + + if (oldVal && !newVal) + { + HANDLE hContact = (HANDLE) CallService(MS_DB_CONTACT_FINDFIRST, 0, 0); + while (hContact != NULL) + { + char* szContactProto = (char*) CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM) hContact, 0); + if (szContactProto != NULL && !strcmp(szContactProto, szProto)) + DeleteAvatarFromCache(hContact, TRUE); + + hContact = (HANDLE) CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM) hContact, 0); + } + } + + if (newVal) + DBWriteContactSettingByte(NULL, AVS_MODULE, szProto, 1); + else + DBWriteContactSettingByte(NULL, AVS_MODULE, szProto, 0); + } + } + } + } + break; + } + return FALSE; +} + +void LoadTransparentData(HWND hwndDlg, HANDLE hContact) +{ + CheckDlgButton(hwndDlg, IDC_MAKETRANSPBKG, DBGetContactSettingByte(hContact, "ContactPhoto", "MakeTransparentBkg", DBGetContactSettingByte(0, AVS_MODULE, "MakeTransparentBkg", 0))); + SendDlgItemMessage(hwndDlg, IDC_BKG_NUM_POINTS_SPIN, UDM_SETPOS, 0, (LPARAM)DBGetContactSettingWord(hContact, "ContactPhoto", "TranspBkgNumPoints", DBGetContactSettingWord(0, AVS_MODULE, "TranspBkgNumPoints", 5))); + SendDlgItemMessage(hwndDlg, IDC_BKG_COLOR_DIFFERENCE_SPIN, UDM_SETPOS, 0, (LPARAM)DBGetContactSettingWord(hContact, "ContactPhoto", "TranspBkgColorDiff", DBGetContactSettingWord(0, AVS_MODULE, "TranspBkgColorDiff", 10))); + + BOOL transp_enabled = IsDlgButtonChecked(hwndDlg, IDC_MAKETRANSPBKG); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_NUM_POINTS_L), transp_enabled); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_NUM_POINTS_SPIN), transp_enabled); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_NUM_POINTS), transp_enabled); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_COLOR_DIFFERENCE_L), transp_enabled); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_COLOR_DIFFERENCE_SPIN), transp_enabled); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_COLOR_DIFFERENCE), transp_enabled); +} + +void SaveTransparentData(HWND hwndDlg, HANDLE hContact) +{ + BOOL transp = IsDlgButtonChecked(hwndDlg, IDC_MAKETRANSPBKG); + if (DBGetContactSettingByte(0, AVS_MODULE, "MakeTransparentBkg", 0) == transp) + DBDeleteContactSetting(hContact, "ContactPhoto", "MakeTransparentBkg"); + else + DBWriteContactSettingByte(hContact, "ContactPhoto", "MakeTransparentBkg", transp); + + WORD tmp = (WORD) SendDlgItemMessage(hwndDlg, IDC_BKG_NUM_POINTS_SPIN, UDM_GETPOS, 0, 0); + if (DBGetContactSettingWord(0, AVS_MODULE, "TranspBkgNumPoints", 5) == tmp) + DBDeleteContactSetting(hContact, "ContactPhoto", "TranspBkgNumPoints"); + else + DBWriteContactSettingWord(hContact, "ContactPhoto", "TranspBkgNumPoints", tmp); + + tmp = (WORD) SendDlgItemMessage(hwndDlg, IDC_BKG_COLOR_DIFFERENCE_SPIN, UDM_GETPOS, 0, 0); + if (DBGetContactSettingWord(0, AVS_MODULE, "TranspBkgColorDiff", 10) == tmp) + DBDeleteContactSetting(hContact, "ContactPhoto", "TranspBkgColorDiff"); + else + DBWriteContactSettingWord(hContact, "ContactPhoto", "TranspBkgColorDiff", tmp); +} + +void SaveTransparentData(HWND hwndDlg, HANDLE hContact, BOOL locked) +{ + SaveTransparentData(hwndDlg, hContact); + + HANDLE tmp = GetContactThatHaveTheAvatar(hContact, locked); + if (tmp != hContact) + SaveTransparentData(hwndDlg, tmp); +} + +INT_PTR CALLBACK DlgProcAvatarOptions(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + HANDLE hContact; + struct WindowData *dat = (struct WindowData *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + + if (dat) + hContact = dat->hContact; + + switch(msg) { + case WM_INITDIALOG: + { + TCHAR szTitle[512]; + TCHAR *szNick = NULL; + struct WindowData *dat = (struct WindowData *)malloc(sizeof(struct WindowData)); + + if (dat) + dat->hContact = (HANDLE)lParam; + + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)dat); + hContact = (HANDLE)lParam; + TranslateDialogDefault(hwndDlg); + if (hContact) { + szNick = (TCHAR *)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hContact, GCDNF_TCHAR); + mir_sntprintf(szTitle, 500, TranslateT("Set avatar options for %s"), szNick); + SetWindowText(hwndDlg, szTitle); + } + SendMessage(hwndDlg, DM_SETAVATARNAME, 0, 0); + ShowWindow(hwndDlg, SW_SHOWNORMAL); + InvalidateRect(GetDlgItem(hwndDlg, IDC_PROTOPIC), NULL, FALSE); + CheckDlgButton(hwndDlg, IDC_PROTECTAVATAR, DBGetContactSettingByte(hContact, "ContactPhoto", "Locked", 0) ? TRUE : FALSE); + CheckDlgButton(hwndDlg, IDC_HIDEAVATAR, DBGetContactSettingByte(hContact, "ContactPhoto", "Hidden", 0) ? TRUE : FALSE); + + SendDlgItemMessage(hwndDlg, IDC_BKG_NUM_POINTS_SPIN, UDM_SETBUDDY, (WPARAM)GetDlgItem(hwndDlg, IDC_BKG_NUM_POINTS), 0); + SendDlgItemMessage(hwndDlg, IDC_BKG_NUM_POINTS_SPIN, UDM_SETRANGE, 0, MAKELONG(8, 2)); + + SendDlgItemMessage(hwndDlg, IDC_BKG_COLOR_DIFFERENCE_SPIN, UDM_SETBUDDY, (WPARAM)GetDlgItem(hwndDlg, IDC_BKG_COLOR_DIFFERENCE), 0); + SendDlgItemMessage(hwndDlg, IDC_BKG_COLOR_DIFFERENCE_SPIN, UDM_SETRANGE, 0, MAKELONG(100, 0)); + + LoadTransparentData(hwndDlg, GetContactThatHaveTheAvatar(hContact)); + dat->hHook = HookEventMessage(ME_AV_AVATARCHANGED, hwndDlg, DM_AVATARCHANGED); + SendMessage(hwndDlg, WM_SETICON, IMAGE_ICON, (LPARAM)g_hIcon); + } + return TRUE; + + case WM_COMMAND: + switch(LOWORD(wParam)) { + case ID_USE_DEFAULTS: + hContact = GetContactThatHaveTheAvatar(hContact); + + DBDeleteContactSetting(hContact, "ContactPhoto", "MakeTransparentBkg"); + DBDeleteContactSetting(hContact, "ContactPhoto", "TranspBkgNumPoints"); + DBDeleteContactSetting(hContact, "ContactPhoto", "TranspBkgColorDiff"); + + LoadTransparentData(hwndDlg, hContact); + + SendMessage(hwndDlg, DM_REALODAVATAR, 0, 0); + break; + + case IDOK: + { + BOOL locked = IsDlgButtonChecked(hwndDlg, IDC_PROTECTAVATAR); + int hidden = IsDlgButtonChecked(hwndDlg, IDC_HIDEAVATAR) ? 1 : 0; + SetAvatarAttribute(hContact, AVS_HIDEONCLIST, hidden); + if (hidden != DBGetContactSettingByte(hContact, "ContactPhoto", "Hidden", 0)) + DBWriteContactSettingByte(hContact, "ContactPhoto", "Hidden", hidden); + + if (!locked && DBGetContactSettingByte(hContact, "ContactPhoto", "NeedUpdate", 0)) + QueueAdd(hContact); + + // Continue to the cancel handle + } + + case IDCANCEL: + DestroyWindow(hwndDlg); + break; + + case IDC_PROTECTAVATAR: + { + BOOL locked = IsDlgButtonChecked(hwndDlg, IDC_PROTECTAVATAR); + ProtectAvatar((WPARAM)hContact, locked ? 1 : 0); + } + break; + + case IDC_CHANGE: + SetAvatar((WPARAM)hContact, 0); + SendMessage(hwndDlg, DM_SETAVATARNAME, 0, 0); + CheckDlgButton(hwndDlg, IDC_PROTECTAVATAR, DBGetContactSettingByte(hContact, "ContactPhoto", "Locked", 0) ? TRUE : FALSE); + break; + + case IDC_BKG_NUM_POINTS: + case IDC_BKG_COLOR_DIFFERENCE: + if (HIWORD(wParam)!=EN_CHANGE || (HWND)lParam!=GetFocus()) + break; + + case IDC_MAKETRANSPBKG: + { + BOOL enable = IsDlgButtonChecked(hwndDlg, IDC_MAKETRANSPBKG); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_NUM_POINTS_L), enable); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_NUM_POINTS_SPIN), enable); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_NUM_POINTS), enable); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_COLOR_DIFFERENCE_L), enable); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_COLOR_DIFFERENCE_SPIN), enable); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_COLOR_DIFFERENCE), enable); + + SendMessage(hwndDlg, DM_REALODAVATAR, 0, 0); + } + break; + + case IDC_RESET: + { + char *szProto = ( char* )CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); + DBVARIANT dbv = {0}; + + ProtectAvatar((WPARAM)hContact, 0); + if (MessageBox(0, TranslateT("Delete picture file from disk (may be necessary to force a reload, but will delete local pictures)?"), TranslateT("Reset contact picture"), MB_YESNO) == IDYES) { + if (!DBGetContactSettingTString(hContact, "ContactPhoto", "File", &dbv)) { + DeleteFile(dbv.ptszVal); + DBFreeVariant(&dbv); + } + } + DBDeleteContactSetting(hContact, "ContactPhoto", "Locked"); + DBDeleteContactSetting(hContact, "ContactPhoto", "Backup"); + DBDeleteContactSetting(hContact, "ContactPhoto", "RFile"); + DBDeleteContactSetting(hContact, "ContactPhoto", "File"); + DBDeleteContactSetting(hContact, "ContactPhoto", "Format"); + DBDeleteContactSetting(hContact, szProto, "AvatarHash"); + DBDeleteContactSetting(hContact, szProto, "AvatarSaved"); + DeleteAvatarFromCache(hContact, FALSE); + + QueueAdd(hContact); + + DestroyWindow(hwndDlg); + } + break; + + case IDC_DELETE: + { + DBVARIANT dbv = {0}; + ProtectAvatar((WPARAM)hContact, 0); + if (MessageBox(0, TranslateT("Delete picture file from disk (may be necessary to force a reload, but will delete local pictures)?"), TranslateT("Reset contact picture"), MB_YESNO) == IDYES) { + if (!DBGetContactSettingTString(hContact, "ContactPhoto", "File", &dbv)) { + DeleteFile(dbv.ptszVal); + DBFreeVariant(&dbv); + } + } + DBDeleteContactSetting(hContact, "ContactPhoto", "Locked"); + DBDeleteContactSetting(hContact, "ContactPhoto", "Backup"); + DBDeleteContactSetting(hContact, "ContactPhoto", "RFile"); + DBDeleteContactSetting(hContact, "ContactPhoto", "File"); + DBDeleteContactSetting(hContact, "ContactPhoto", "Format"); + DeleteAvatarFromCache(hContact, FALSE); + SendMessage(hwndDlg, DM_SETAVATARNAME, 0, 0); + InvalidateRect(GetDlgItem(hwndDlg, IDC_PROTOPIC), NULL, TRUE); + break; + } + } + break; + + case WM_DRAWITEM: + { + LPDRAWITEMSTRUCT dis = (LPDRAWITEMSTRUCT) lParam; + + if (dis->CtlType == ODT_BUTTON && dis->CtlID == IDC_PROTOPIC) { + AVATARDRAWREQUEST avdrq = {0}; + GetClientRect(GetDlgItem(hwndDlg, IDC_PROTOPIC), &avdrq.rcDraw); + + FillRect(dis->hDC, &avdrq.rcDraw, GetSysColorBrush(COLOR_BTNFACE)); + + avdrq.hContact = hContact; + avdrq.cbSize = sizeof(avdrq); + avdrq.hTargetDC = dis->hDC; + avdrq.dwFlags |= AVDRQ_DRAWBORDER; + avdrq.clrBorder = GetSysColor(COLOR_BTNTEXT); + avdrq.radius = 6; + if (!CallService(MS_AV_DRAWAVATAR, 0, (LPARAM)&avdrq)) + { + // Get text rectangle + RECT rc = avdrq.rcDraw; + rc.top += 10; + rc.bottom -= 10; + rc.left += 10; + rc.right -= 10; + + // Calc text size + RECT rc_ret = rc; + DrawText(dis->hDC, TranslateT("Contact has no avatar"), -1, &rc_ret, + DT_WORDBREAK | DT_NOPREFIX | DT_CENTER | DT_CALCRECT); + + // Calc needed size + rc.top += ((rc.bottom - rc.top) - (rc_ret.bottom - rc_ret.top)) / 2; + rc.bottom = rc.top + (rc_ret.bottom - rc_ret.top); + DrawText(dis->hDC, TranslateT("Contact has no avatar"), -1, &rc, + DT_WORDBREAK | DT_NOPREFIX | DT_CENTER); + } + + FrameRect(dis->hDC, &avdrq.rcDraw, GetSysColorBrush(COLOR_BTNSHADOW)); + } + return TRUE; + } + case DM_SETAVATARNAME: + { + TCHAR szFinalName[MAX_PATH]; + DBVARIANT dbv = {0}; + BYTE is_locked = DBGetContactSettingByte(hContact, "ContactPhoto", "Locked", 0); + + szFinalName[0] = 0; + + if (is_locked && !DBGetContactSettingTString(hContact, "ContactPhoto", "Backup", &dbv)) { + AVS_pathToAbsolute(dbv.ptszVal, szFinalName); + DBFreeVariant(&dbv); + } + else if (!DBGetContactSettingTString(hContact, "ContactPhoto", "RFile", &dbv)) { + AVS_pathToAbsolute(dbv.ptszVal, szFinalName); + DBFreeVariant(&dbv); + } + else if (!DBGetContactSettingTString(hContact, "ContactPhoto", "File", &dbv)) { + AVS_pathToAbsolute(dbv.ptszVal, szFinalName); + DBFreeVariant(&dbv); + } + szFinalName[MAX_PATH - 1] = 0; + SetDlgItemText(hwndDlg, IDC_AVATARNAME, szFinalName); + break; + } + + case DM_REALODAVATAR: + SaveTransparentData(hwndDlg, hContact, IsDlgButtonChecked(hwndDlg, IDC_PROTECTAVATAR)); + ChangeAvatar(hContact, TRUE); + InvalidateRect(GetDlgItem(hwndDlg, IDC_PROTOPIC), NULL, TRUE); + break; + + case DM_AVATARCHANGED: + InvalidateRect(GetDlgItem(hwndDlg, IDC_PROTOPIC), NULL, TRUE); + break; + + case WM_NCDESTROY: + if (dat) { + UnhookEvent(dat->hHook); + free(dat); + } + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, 0); + break; + } + return FALSE; +} + +INT_PTR CALLBACK DlgProcAvatarUserInfo(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + HANDLE hContact; + struct WindowData *dat = (struct WindowData *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + + if (dat) + hContact = dat->hContact; + + switch(msg) { + case WM_INITDIALOG: + { + dat = (struct WindowData *) malloc(sizeof(struct WindowData)); + if (dat == NULL) + return FALSE; + dat->hContact = (HANDLE)lParam; + + HWND protopic = GetDlgItem(hwndDlg, IDC_PROTOPIC); + SendMessage(protopic, AVATAR_SETCONTACT, 0, (LPARAM) dat->hContact); + SendMessage(protopic, AVATAR_SETAVATARBORDERCOLOR, 0, (LPARAM) GetSysColor(COLOR_BTNSHADOW)); + SendMessage(protopic, AVATAR_SETNOAVATARTEXT, 0, (LPARAM) LPGENT("Contact has no avatar")); + SendMessage(protopic, AVATAR_RESPECTHIDDEN, 0, (LPARAM) FALSE); + SendMessage(protopic, AVATAR_SETRESIZEIFSMALLER, 0, (LPARAM) FALSE); + + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)dat); + hContact = (HANDLE)lParam; + TranslateDialogDefault(hwndDlg); + SendMessage(hwndDlg, DM_SETAVATARNAME, 0, 0); + CheckDlgButton(hwndDlg, IDC_PROTECTAVATAR, DBGetContactSettingByte(hContact, "ContactPhoto", "Locked", 0) ? TRUE : FALSE); + CheckDlgButton(hwndDlg, IDC_HIDEAVATAR, DBGetContactSettingByte(hContact, "ContactPhoto", "Hidden", 0) ? TRUE : FALSE); + + SendDlgItemMessage(hwndDlg, IDC_BKG_NUM_POINTS_SPIN, UDM_SETBUDDY, (WPARAM)GetDlgItem(hwndDlg, IDC_BKG_NUM_POINTS), 0); + SendDlgItemMessage(hwndDlg, IDC_BKG_NUM_POINTS_SPIN, UDM_SETRANGE, 0, MAKELONG(8, 2)); + + SendDlgItemMessage(hwndDlg, IDC_BKG_COLOR_DIFFERENCE_SPIN, UDM_SETBUDDY, (WPARAM)GetDlgItem(hwndDlg, IDC_BKG_COLOR_DIFFERENCE), 0); + SendDlgItemMessage(hwndDlg, IDC_BKG_COLOR_DIFFERENCE_SPIN, UDM_SETRANGE, 0, MAKELONG(100, 0)); + + LoadTransparentData(hwndDlg, GetContactThatHaveTheAvatar(hContact)); + } + break; + + case WM_COMMAND: + switch(LOWORD(wParam)) { + case ID_USE_DEFAULTS: + hContact = GetContactThatHaveTheAvatar(hContact); + + DBDeleteContactSetting(hContact, "ContactPhoto", "MakeTransparentBkg"); + DBDeleteContactSetting(hContact, "ContactPhoto", "TranspBkgNumPoints"); + DBDeleteContactSetting(hContact, "ContactPhoto", "TranspBkgColorDiff"); + + LoadTransparentData(hwndDlg, hContact); + + SendMessage(hwndDlg, DM_REALODAVATAR, 0, 0); + break; + + case IDC_CHANGE: + SetAvatar((WPARAM)hContact, 0); + SendMessage(hwndDlg, DM_SETAVATARNAME, 0, 0); + CheckDlgButton(hwndDlg, IDC_PROTECTAVATAR, DBGetContactSettingByte(hContact, "ContactPhoto", "Locked", 0) ? TRUE : FALSE); + break; + + case IDC_HIDEAVATAR: + { + int hidden = IsDlgButtonChecked(hwndDlg, IDC_HIDEAVATAR) ? 1 : 0; + SetAvatarAttribute(hContact, AVS_HIDEONCLIST, hidden); + if (hidden != DBGetContactSettingByte(hContact, "ContactPhoto", "Hidden", 0)) + DBWriteContactSettingByte(hContact, "ContactPhoto", "Hidden", hidden); + break; + } + + case IDC_PROTECTAVATAR: + { + BOOL locked = IsDlgButtonChecked(hwndDlg, IDC_PROTECTAVATAR); + SaveTransparentData(hwndDlg, hContact, locked); + ProtectAvatar((WPARAM)hContact, locked ? 1 : 0); + + break; + } + case IDC_BKG_NUM_POINTS: + case IDC_BKG_COLOR_DIFFERENCE: + if (HIWORD(wParam)!=EN_CHANGE || (HWND)lParam!=GetFocus()) + break; + case IDC_MAKETRANSPBKG: + { + BOOL enable = IsDlgButtonChecked(hwndDlg, IDC_MAKETRANSPBKG); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_NUM_POINTS_L), enable); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_NUM_POINTS_SPIN), enable); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_NUM_POINTS), enable); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_COLOR_DIFFERENCE_L), enable); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_COLOR_DIFFERENCE_SPIN), enable); + EnableWindow(GetDlgItem(hwndDlg, IDC_BKG_COLOR_DIFFERENCE), enable); + + SendMessage(hwndDlg, DM_REALODAVATAR, 0, 0); + break; + } + case IDC_RESET: + { + char *szProto = ( char* )CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); + DBVARIANT dbv = {0}; + + ProtectAvatar((WPARAM)hContact, 0); + if (MessageBox(0, TranslateT("Delete picture file from disk (may be necessary to force a reload, but will delete local pictures)?"), TranslateT("Reset contact picture"), MB_YESNO) == IDYES) { + if (!DBGetContactSettingTString(hContact, "ContactPhoto", "File", &dbv)) { + DeleteFile(dbv.ptszVal); + DBFreeVariant(&dbv); + } + } + DBDeleteContactSetting(hContact, "ContactPhoto", "Locked"); + DBDeleteContactSetting(hContact, "ContactPhoto", "Backup"); + DBDeleteContactSetting(hContact, "ContactPhoto", "RFile"); + DBDeleteContactSetting(hContact, "ContactPhoto", "File"); + DBDeleteContactSetting(hContact, "ContactPhoto", "Format"); + DBDeleteContactSetting(hContact, szProto, "AvatarHash"); + DBDeleteContactSetting(hContact, szProto, "AvatarSaved"); + DeleteAvatarFromCache(hContact, FALSE); + + QueueAdd(hContact); + break; + } + case IDC_DELETE: + { + DBVARIANT dbv = {0}; + + ProtectAvatar((WPARAM)hContact, 0); + if (MessageBox(0, TranslateT("Delete picture file from disk (may be necessary to force a reload, but will delete local pictures)?"), TranslateT("Reset contact picture"), MB_YESNO) == IDYES) { + if (!DBGetContactSettingTString(hContact, "ContactPhoto", "File", &dbv)) { + DeleteFile(dbv.ptszVal); + DBFreeVariant(&dbv); + } + } + DBDeleteContactSetting(hContact, "ContactPhoto", "Locked"); + DBDeleteContactSetting(hContact, "ContactPhoto", "Backup"); + DBDeleteContactSetting(hContact, "ContactPhoto", "RFile"); + DBDeleteContactSetting(hContact, "ContactPhoto", "File"); + DBDeleteContactSetting(hContact, "ContactPhoto", "Format"); + DeleteAvatarFromCache(hContact, FALSE); + SendMessage(hwndDlg, DM_SETAVATARNAME, 0, 0); + break; + } + } + break; + + case DM_REALODAVATAR: + SaveTransparentData(hwndDlg, hContact, IsDlgButtonChecked(hwndDlg, IDC_PROTECTAVATAR)); + ChangeAvatar(hContact, TRUE); + break; + + case WM_NCDESTROY: + if (dat) + free(dat); + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, 0); + break; + } + return FALSE; +} + +static char * GetSelectedProtocol(HWND hwndDlg) +{ + HWND hwndList = GetDlgItem(hwndDlg, IDC_PROTOCOLS); + + // Get selection + int iItem = ListView_GetSelectionMark(hwndList); + if (iItem < 0) + return NULL; + + // Get protocol name + LVITEM item = {0}; + item.mask = LVIF_PARAM; + item.iItem = iItem; + SendMessage(hwndList, LVM_GETITEMA, 0, (LPARAM)&item); + return ( char* ) item.lParam; +} + +static void EnableDisableControls(HWND hwndDlg, char *proto) +{ + if (IsDlgButtonChecked(hwndDlg, IDC_PER_PROTO)) + { + if (proto == NULL) + { + EnableWindow(GetDlgItem(hwndDlg, IDC_CHANGE), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_DELETE), FALSE); + } + else + { + if (!ProtoServiceExists(proto, PS_SETMYAVATAR)) + { + EnableWindow(GetDlgItem(hwndDlg, IDC_CHANGE), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_DELETE), FALSE); + } + else + { + EnableWindow(GetDlgItem(hwndDlg, IDC_CHANGE), TRUE); + + int width, height; + SendDlgItemMessage(hwndDlg, IDC_PROTOPIC, AVATAR_GETUSEDSPACE, (WPARAM) &width, (LPARAM) &height); + EnableWindow(GetDlgItem(hwndDlg, IDC_DELETE), (LPARAM) width != 0 || height != 0); + } + } + } + else + { + EnableWindow(GetDlgItem(hwndDlg, IDC_CHANGE), TRUE); + + if (DBGetContactSettingByte(NULL, AVS_MODULE, "GlobalUserAvatarNotConsistent", 1)) + { + EnableWindow(GetDlgItem(hwndDlg, IDC_DELETE), TRUE); + } + else + { + int width, height; + SendDlgItemMessage(hwndDlg, IDC_PROTOPIC, AVATAR_GETUSEDSPACE, (WPARAM) &width, (LPARAM) &height); + EnableWindow(GetDlgItem(hwndDlg, IDC_DELETE), (LPARAM) width != 0 || height != 0); + } + } +} + +static void OffsetWindow(HWND parent, HWND hwnd, int dx, int dy) +{ + RECT rc; + GetWindowRect(hwnd, &rc); + ScreenToClient(parent, &rc); + OffsetRect(&rc, dx, dy); + MoveWindow(hwnd, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE); +} + +static void EnableDisableProtocols(HWND hwndDlg, BOOL init) +{ + int diff = 147; // Pre-calc + BOOL perProto = IsDlgButtonChecked(hwndDlg, IDC_PER_PROTO); + HWND hwndList = GetDlgItem(hwndDlg, IDC_PROTOCOLS); + + if (perProto) + { + if (!init && !IsWindowVisible(hwndList)) + { + // Show list of protocols + ShowWindow(hwndList, SW_SHOW); + + // Move controls + OffsetWindow(hwndDlg, GetDlgItem(hwndDlg, IDC_PROTOPIC), diff, 0); + OffsetWindow(hwndDlg, GetDlgItem(hwndDlg, IDC_CHANGE), diff, 0); + OffsetWindow(hwndDlg, GetDlgItem(hwndDlg, IDC_DELETE), diff, 0); + } + + char * proto = GetSelectedProtocol(hwndDlg); + if (proto == NULL) + { + ListView_SetItemState(hwndList, 0, LVIS_FOCUSED | LVIS_SELECTED, 0x0F); + } + else + { + SendDlgItemMessage(hwndDlg, IDC_PROTOPIC, AVATAR_SETPROTOCOL, 0, (LPARAM) proto); + EnableDisableControls(hwndDlg, proto); + } + } + else + { + if (init || IsWindowVisible(hwndList)) + { + // Show list of protocols + ShowWindow(hwndList, SW_HIDE); + + // Move controls + OffsetWindow(hwndDlg, GetDlgItem(hwndDlg, IDC_PROTOPIC), -diff, 0); + OffsetWindow(hwndDlg, GetDlgItem(hwndDlg, IDC_CHANGE), -diff, 0); + OffsetWindow(hwndDlg, GetDlgItem(hwndDlg, IDC_DELETE), -diff, 0); + } + + SendDlgItemMessage(hwndDlg, IDC_PROTOPIC, AVATAR_SETPROTOCOL, 0, NULL); + } +} + +INT_PTR CALLBACK DlgProcAvatarProtoInfo(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) { + case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); + { + HWND protopic = GetDlgItem(hwndDlg, IDC_PROTOPIC); + SendMessage(protopic, AVATAR_SETAVATARBORDERCOLOR, 0, (LPARAM) GetSysColor(COLOR_BTNSHADOW)); + SendMessage(protopic, AVATAR_SETNOAVATARTEXT, 0, (LPARAM) LPGENT("No avatar")); + SendMessage(protopic, AVATAR_SETRESIZEIFSMALLER, 0, (LPARAM) FALSE); + + HWND hwndList = GetDlgItem(hwndDlg, IDC_PROTOCOLS); + ListView_SetExtendedListViewStyleEx(hwndList, 0, LVS_EX_SUBITEMIMAGES); + + HIMAGELIST hIml = ImageList_Create(16, 16, ILC_MASK | (IsWinVerXPPlus()? ILC_COLOR32 : ILC_COLOR16), 4, 0); + ListView_SetImageList(hwndList, hIml, LVSIL_SMALL); + + LVCOLUMN lvc = {0}; + lvc.mask = LVCF_FMT; + lvc.fmt = LVCFMT_IMAGE | LVCFMT_LEFT; + ListView_InsertColumn(hwndList, 0, &lvc); + + LVITEM item = {0}; + item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE; + item.iItem = 1000; + + // List protocols + PROTOACCOUNT **accs; + int i, count, num = 0; + + ProtoEnumAccounts( &count, &accs ); + for (i = 0; i < count; i++) + { + if ( !ProtoServiceExists( accs[i]->szModuleName, PS_GETMYAVATAR)) + continue; + + if ( !Proto_IsAvatarsEnabled( accs[i]->szModuleName )) + continue; + + ImageList_AddIcon(hIml, LoadSkinnedProtoIcon( accs[i]->szModuleName, ID_STATUS_ONLINE)); + item.pszText = accs[i]->tszAccountName; + item.iImage = num; + item.lParam = (LPARAM)accs[i]->szModuleName; + + ListView_InsertItem(hwndList, &item); + num++; + } + + ListView_SetColumnWidth(hwndList, 0, LVSCW_AUTOSIZE); + ListView_Arrange(hwndList, LVA_ALIGNLEFT | LVA_ALIGNTOP); + + // Check if should show per protocol avatars + CheckDlgButton(hwndDlg, IDC_PER_PROTO, DBGetContactSettingByte(NULL, AVS_MODULE, "PerProtocolUserAvatars", 1)); + EnableDisableProtocols(hwndDlg, TRUE); + } + break; + + case WM_NOTIFY: + { + LPNMHDR nm = (LPNMHDR) lParam; + switch(nm->idFrom) { + case IDC_PROTOCOLS: + switch (nm->code) { + case LVN_ITEMCHANGED: + { + LPNMLISTVIEW li = (LPNMLISTVIEW) nm; + if (li->uNewState & LVIS_SELECTED) + { + SendDlgItemMessage(hwndDlg, IDC_PROTOPIC, AVATAR_SETPROTOCOL, 0, li->lParam); + EnableDisableControls(hwndDlg, ( char* ) li->lParam); + } + } + break; + } + break; + + case IDC_PROTOPIC: + switch (nm->code) { + case NM_AVATAR_CHANGED: + EnableDisableControls(hwndDlg, GetSelectedProtocol(hwndDlg)); + break; + } + break; + } + break; + } + case WM_COMMAND: + switch(LOWORD(wParam)) { + case IDC_CHANGE: + if (!IsDlgButtonChecked(hwndDlg, IDC_PER_PROTO)) + avSetMyAvatar(NULL, NULL); + else { + char *proto = GetSelectedProtocol(hwndDlg); + if (proto != NULL) + avSetMyAvatar(proto, NULL); + } + break; + + case IDC_DELETE: + if (!IsDlgButtonChecked(hwndDlg, IDC_PER_PROTO)) { + if (MessageBox(hwndDlg, TranslateT("Are you sure you want to remove your avatar?"), TranslateT("Global Avatar"), MB_YESNO) == IDYES) + avSetMyAvatar(NULL, _T("")); + } + else { + char *proto = GetSelectedProtocol(hwndDlg); + if (proto == NULL) + break; + + char description[256]; + CallProtoService(proto, PS_GETNAME, SIZEOF(description),(LPARAM) description); + TCHAR *descr = mir_a2t(description); + if (MessageBox(hwndDlg, TranslateT("Are you sure you want to remove your avatar?"), descr, MB_YESNO) == IDYES) + avSetMyAvatar(proto, _T("")); + mir_free(descr); + } + break; + + case IDC_PER_PROTO: + DBWriteContactSettingByte(NULL, AVS_MODULE, "PerProtocolUserAvatars", IsDlgButtonChecked(hwndDlg, IDC_PER_PROTO) ? 1 : 0); + EnableDisableProtocols(hwndDlg, FALSE); + break; + } + break; + } + return FALSE; +} -- cgit v1.2.3