From b25fef05f6feb88edd6ddad6a27193db9257d2de Mon Sep 17 00:00:00 2001 From: Vadim Dashevskiy Date: Fri, 20 Jul 2012 12:16:27 +0000 Subject: MenuItemEx: changed folder structure git-svn-id: http://svn.miranda-ng.org/main/trunk@1078 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/MenuItemEx/src/images.cpp | 363 ++++++++++ plugins/MenuItemEx/src/images.h | 8 + plugins/MenuItemEx/src/main.cpp | 1386 ++++++++++++++++++++++++++++++++++++ plugins/MenuItemEx/src/menuex.h | 73 ++ plugins/MenuItemEx/src/options.cpp | 136 ++++ plugins/MenuItemEx/src/resource.h | 52 ++ plugins/MenuItemEx/src/version.h | 13 + 7 files changed, 2031 insertions(+) create mode 100644 plugins/MenuItemEx/src/images.cpp create mode 100644 plugins/MenuItemEx/src/images.h create mode 100644 plugins/MenuItemEx/src/main.cpp create mode 100644 plugins/MenuItemEx/src/menuex.h create mode 100644 plugins/MenuItemEx/src/options.cpp create mode 100644 plugins/MenuItemEx/src/resource.h create mode 100644 plugins/MenuItemEx/src/version.h (limited to 'plugins/MenuItemEx/src') diff --git a/plugins/MenuItemEx/src/images.cpp b/plugins/MenuItemEx/src/images.cpp new file mode 100644 index 0000000000..51903294bb --- /dev/null +++ b/plugins/MenuItemEx/src/images.cpp @@ -0,0 +1,363 @@ +#include "menuex.h" +#include "images.h" + +extern HINSTANCE hinstance; + + +void HalfBitmap32Alpha(HBITMAP hBitmap) +{ + BITMAP bmp; + DWORD dwLen; + BYTE *p; + int x, y; + + GetObject(hBitmap, sizeof(bmp), &bmp); + + if (bmp.bmBitsPixel != 32) + return; + + dwLen = bmp.bmWidth * bmp.bmHeight * (bmp.bmBitsPixel / 8); + p = (BYTE *)malloc(dwLen); + if (p == NULL) + return; + memset(p, 0, dwLen); + + GetBitmapBits(hBitmap, dwLen, p); + + for (y = 0; y < bmp.bmHeight; ++y) { + BYTE *px = p + bmp.bmWidth * 4 * y; + + for (x = 0; x < bmp.bmWidth; ++x) + { + px[3]>>=1; + px += 4; + } + } + + SetBitmapBits(hBitmap, dwLen, p); + + free(p); +} + + +// Make a bitmap all transparent, but only if it is a 32bpp +//void MakeBmpTransparent(HBITMAP hBitmap) +//{ +// BITMAP bmp; +// DWORD dwLen; +// BYTE *p; +// +// GetObject(hBitmap, sizeof(bmp), &bmp); +// +// if (bmp.bmBitsPixel != 32) +// return; +// +// dwLen = bmp.bmWidth * bmp.bmHeight * (bmp.bmBitsPixel / 8); +// p = (BYTE *)malloc(dwLen); +// if (p == NULL) +// return; +// +// memset(p, 0, dwLen); +// SetBitmapBits(hBitmap, dwLen, p); +// +// free(p); +//} + + +// Correct alpha from bitmaps loaded without it (it cames with 0 and should be 255) +void CorrectBitmap32Alpha(HBITMAP hBitmap, BOOL force) +{ + BITMAP bmp; + DWORD dwLen; + BYTE *p; + int x, y; + BOOL fixIt; + + GetObject(hBitmap, sizeof(bmp), &bmp); + + if (bmp.bmBitsPixel != 32) + return; + + dwLen = bmp.bmWidth * bmp.bmHeight * (bmp.bmBitsPixel / 8); + p = (BYTE *)malloc(dwLen); + if (p == NULL) + return; + memset(p, 0, dwLen); + + GetBitmapBits(hBitmap, dwLen, p); + + fixIt = TRUE; + for (y = 0; fixIt && y < bmp.bmHeight; ++y) { + BYTE *px = p + bmp.bmWidth * 4 * y; + + for (x = 0; fixIt && x < bmp.bmWidth; ++x) + { + if (px[3] != 0 && !force) + { + fixIt = FALSE; + } + else + { + if (px[0] != 0 || px[1] != 0 || px[2] != 0) + px[3] = 255; + } + + px += 4; + } + } + + if (fixIt) + SetBitmapBits(hBitmap, dwLen, p); + + free(p); +} + + +HBITMAP CopyBitmapTo32(HBITMAP hBitmap) +{ + BITMAPINFO RGB32BitsBITMAPINFO; + BYTE * ptPixels; + HBITMAP hDirectBitmap; + + BITMAP bmp; + DWORD dwLen; + BYTE *p; + + GetObject(hBitmap, sizeof(bmp), &bmp); + + dwLen = bmp.bmWidth * bmp.bmHeight * 4; + p = (BYTE *)malloc(dwLen); + if (p == NULL) + return NULL; + + // Create bitmap + ZeroMemory(&RGB32BitsBITMAPINFO, sizeof(BITMAPINFO)); + RGB32BitsBITMAPINFO.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + RGB32BitsBITMAPINFO.bmiHeader.biWidth = bmp.bmWidth; + RGB32BitsBITMAPINFO.bmiHeader.biHeight = bmp.bmHeight; + RGB32BitsBITMAPINFO.bmiHeader.biPlanes = 1; + RGB32BitsBITMAPINFO.bmiHeader.biBitCount = 32; + + hDirectBitmap = CreateDIBSection(NULL, + (BITMAPINFO *)&RGB32BitsBITMAPINFO, + DIB_RGB_COLORS, + (void **)&ptPixels, + NULL, 0); + + // Copy data + if (bmp.bmBitsPixel != 32) + { + HDC hdcOrig, hdcDest; + HBITMAP oldOrig, oldDest; + + hdcOrig = CreateCompatibleDC(NULL); + oldOrig = (HBITMAP) SelectObject(hdcOrig, hBitmap); + + hdcDest = CreateCompatibleDC(NULL); + oldDest = (HBITMAP) SelectObject(hdcDest, hDirectBitmap); + + BitBlt(hdcDest, 0, 0, bmp.bmWidth, bmp.bmHeight, hdcOrig, 0, 0, SRCCOPY); + + SelectObject(hdcDest, oldDest); + DeleteObject(hdcDest); + SelectObject(hdcOrig, oldOrig); + DeleteObject(hdcOrig); + + // Set alpha + CorrectBitmap32Alpha(hDirectBitmap, FALSE); + } + else + { + GetBitmapBits(hBitmap, dwLen, p); + SetBitmapBits(hDirectBitmap, dwLen, p); + } + + free(p); + + return hDirectBitmap; +} + + +//HBITMAP CreateBitmap32(int cx, int cy) +//{ +// BITMAPINFO RGB32BitsBITMAPINFO; +// UINT * ptPixels; +// HBITMAP DirectBitmap; +// +// ZeroMemory(&RGB32BitsBITMAPINFO,sizeof(BITMAPINFO)); +// RGB32BitsBITMAPINFO.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); +// RGB32BitsBITMAPINFO.bmiHeader.biWidth=cx;//bm.bmWidth; +// RGB32BitsBITMAPINFO.bmiHeader.biHeight=cy;//bm.bmHeight; +// RGB32BitsBITMAPINFO.bmiHeader.biPlanes=1; +// RGB32BitsBITMAPINFO.bmiHeader.biBitCount=32; +// +// DirectBitmap = CreateDIBSection(NULL, +// (BITMAPINFO *)&RGB32BitsBITMAPINFO, +// DIB_RGB_COLORS, +// (void **)&ptPixels, +// NULL, 0); +// return DirectBitmap; +//} + + +BOOL MakeBitmap32(HBITMAP *hBitmap) +{ + BITMAP bmp; + + GetObject(*hBitmap, sizeof(bmp), &bmp); + + if (bmp.bmBitsPixel != 32) { + // Convert to 32 bpp + HBITMAP hBmpTmp = CopyBitmapTo32(*hBitmap); + DeleteObject(*hBitmap); + *hBitmap = hBmpTmp; + } + + return TRUE; +} + + +//#define GET_PIXEL(__P__, __X__, __Y__) ( __P__ + width * 4 * (__Y__) + 4 * (__X__)) + +//BOOL MakeGrayscale(HBITMAP *hBitmap) +//{ +// BYTE *p = NULL; +// BYTE *p1; +// DWORD dwLen; +// int width, height, x, y; +// BITMAP bmp; +// +// GetObject(*hBitmap, sizeof(bmp), &bmp); +// width = bmp.bmWidth; +// height = bmp.bmHeight; +// +// dwLen = width * height * 4; +// p = (BYTE *)malloc(dwLen); +// if (p == NULL) +// { +// return FALSE; +// } +// +// if (bmp.bmBitsPixel != 32) +// { +// // Convert to 32 bpp +// HBITMAP hBmpTmp = CopyBitmapTo32(*hBitmap); +// DeleteObject(*hBitmap); +// *hBitmap = hBmpTmp; +// } +// GetBitmapBits(*hBitmap, dwLen, p); +// +// // Make grayscale +// for (y = 0 ; y < height ; y++) +// { +// for (x = 0 ; x < width ; x++) +// { +// p1 = GET_PIXEL(p, x, y); +// p1[0] = p1[1] = p1[2] = ( p1[0] + p1[1] + p1[2] ) / 3; +// } +// } +// +// dwLen = SetBitmapBits(*hBitmap, dwLen, p); +// free(p); +// +// return TRUE; +//} + + +HICON MakeHalfAlphaIcon(HICON SourceIcon) +{ + ICONINFO TargetIconInfo; + BITMAP TargetBitmapInfo; + HICON TargetIcon, TempIcon; + + TempIcon = CopyIcon(SourceIcon); + if ( !GetIconInfo(TempIcon, &TargetIconInfo)) + return NULL; + + if ( !GetObject(TargetIconInfo.hbmColor, sizeof(BITMAP), &TargetBitmapInfo)) + return NULL; + + MakeBitmap32(&TargetIconInfo.hbmColor); + HalfBitmap32Alpha(TargetIconInfo.hbmColor); + TargetIcon = CreateIconIndirect(&TargetIconInfo); + + DestroyIcon(TempIcon); + DeleteObject(TargetIconInfo.hbmColor); + DeleteObject(TargetIconInfo.hbmMask); + return TargetIcon; +} + + +//HICON MakeGrayscaleIcon(HICON SourceIcon) +//{ +// ICONINFO TargetIconInfo; +// BITMAP TargetBitmapInfo; +// HICON TargetIcon, TempIcon; +// +// TempIcon = CopyIcon(SourceIcon); +// if (! GetIconInfo(TempIcon, &TargetIconInfo) || GetObject(TargetIconInfo.hbmColor, sizeof(BITMAP), &TargetBitmapInfo)==0) return NULL; +// +// MakeGrayscale(&TargetIconInfo.hbmColor); +// +// TargetIcon = CreateIconIndirect(&TargetIconInfo); +// DestroyIcon(TempIcon); +// +// return TargetIcon; +//} + + +HICON BindOverlayIcon(HICON SourceIcon,LPCSTR OverlayIconName) +{ + ICONINFO OverlayIconInfo, TargetIconInfo; + BITMAP OverlayBitmapInfo, TargetBitmapInfo; + HBITMAP OldOverlayBitmap, OldTargetBitmap; + HICON OverlayIcon, TargetIcon, TempIcon; + HDC OverlayDC, TargetDC; + BLENDFUNCTION bf = {0,0,255,1}; + + TempIcon = CopyIcon(SourceIcon); + if ( !GetIconInfo( TempIcon, &TargetIconInfo )) + return NULL; + + MakeBitmap32(&TargetIconInfo.hbmColor); + CorrectBitmap32Alpha(TargetIconInfo.hbmColor, FALSE); + GetObject(TargetIconInfo.hbmColor, sizeof(BITMAP), &TargetBitmapInfo); + + OverlayIcon = (HICON)CallService( MS_SKIN2_GETICON, 0, (LPARAM)OverlayIconName); + if ( !GetIconInfo(OverlayIcon, &OverlayIconInfo) || !GetObject(OverlayIconInfo.hbmColor, sizeof(BITMAP), &OverlayBitmapInfo)) + return NULL; + + TargetDC = CreateCompatibleDC(NULL); + OldTargetBitmap = (HBITMAP)SelectObject(TargetDC, TargetIconInfo.hbmColor); + + OverlayDC = CreateCompatibleDC(NULL); + OldOverlayBitmap = (HBITMAP)SelectObject(OverlayDC, OverlayIconInfo.hbmColor); + + AlphaBlend(TargetDC, 0, 0, TargetBitmapInfo.bmWidth, TargetBitmapInfo.bmHeight, + OverlayDC, 0, 0, OverlayBitmapInfo.bmWidth, OverlayBitmapInfo.bmHeight, bf); + + SelectObject(TargetDC, TargetIconInfo.hbmMask); + SelectObject(OverlayDC, OverlayIconInfo.hbmMask); + + BitBlt(TargetDC, 0, 0, TargetBitmapInfo.bmWidth, TargetBitmapInfo.bmHeight, + OverlayDC, 0, 0, SRCCOPY); + + TargetIcon = CreateIconIndirect(&TargetIconInfo); + DestroyIcon(TempIcon); + //DestroyIcon(OverlayIcon); + + SelectObject(TargetDC, OldTargetBitmap); + DeleteObject(TargetIconInfo.hbmColor); + DeleteObject(TargetIconInfo.hbmMask); + DeleteDC(TargetDC); + + SelectObject(OverlayDC, OldOverlayBitmap); + DeleteObject(OverlayIconInfo.hbmColor); + DeleteObject(OverlayIconInfo.hbmMask); + DeleteDC(OverlayDC); + + return TargetIcon; +} + + +// EOF diff --git a/plugins/MenuItemEx/src/images.h b/plugins/MenuItemEx/src/images.h new file mode 100644 index 0000000000..e8288714f7 --- /dev/null +++ b/plugins/MenuItemEx/src/images.h @@ -0,0 +1,8 @@ +#ifndef __IMAGE_UTILS_H__ +#define __IMAGE_UTILS_H__ + +HICON BindOverlayIcon(HICON,LPCSTR); +//HICON MakeGrayscaleIcon(HICON); +HICON MakeHalfAlphaIcon(HICON); + +#endif // __IMAGE_UTILS_H__ diff --git a/plugins/MenuItemEx/src/main.cpp b/plugins/MenuItemEx/src/main.cpp new file mode 100644 index 0000000000..760520ce91 --- /dev/null +++ b/plugins/MenuItemEx/src/main.cpp @@ -0,0 +1,1386 @@ +#include "menuex.h" +#include "images.h" +#include "version.h" + +#define MS_SETINVIS "MenuEx/SetInvis" +#define MS_SETVIS "MenuEx/SetVis" +#define MS_HIDE "MenuEx/Hide" +#define MS_IGNORE "MenuEx/Ignore" +#define MS_PROTO "MenuEx/ChangeProto" +#define MS_ADDED "MenuEx/SendAdded" +#define MS_AUTHREQ "MenuEx/SendAuthReq" +#define MS_COPYID "MenuEx/CopyID" +#define MS_RECVFILES "MenuEx/RecvFiles" +#define MS_STATUSMSG "MenuEx/CopyStatusMsg" +#define MS_COPYIP "MenuEx/CopyIP" +#define MS_COPYMIRVER "MenuEx/CopyMirVer" + + +const int vf_default = VF_VS|VF_HFL|VF_IGN|VF_CID|VF_SHOWID|VF_RECV|VF_STAT|VF_SMNAME|VF_CIDN|VF_CIP; + +HINSTANCE hinstance; +HANDLE hmenuVis,hmenuOff,hmenuHide,hmenuIgnore,hmenuProto,hmenuAdded,hmenuAuthReq; +HANDLE hmenuCopyID,hmenuRecvFiles,hmenuStatusMsg,hmenuCopyIP,hmenuCopyMirVer; +static HANDLE hIgnoreItem[9], hProtoItem[MAX_PROTOS], hHooks[8], hServices[12]; +HICON hIcon[5]; +BOOL bMetaContacts, bMir_08; +PROTOACCOUNT **accs; +OPENOPTIONSDIALOG ood; +int protoCount; +int hLangpack; +static LONG_PTR OldAuthReqEditProc; + +struct { + char *module; + char *name; + TCHAR *fullName; + char flag; +} +static const statusMsg[] = { + { "CList", "StatusMsg", LPGENT("Status message"), 1 }, + { 0, "XStatusName", LPGENT("XStatus title"), 4 }, + { 0, "XStatusMsg", LPGENT("XStatus message"), 2 }, + { "AdvStatus", "tune/text", LPGENT("Listening to"), 8 }, + { "AdvStatus", "activity/title", LPGENT("Activity title"), 8 }, + { "AdvStatus", "activity/text", LPGENT("Activity text"), 8 } +}; + +struct +{ + TCHAR* szDescr; + char* szName; + int defIconID; +} +static const iconList[] = { + { _T("Hide from list"), "miex_hidefl", IDI_ICON0 }, + { _T("Show in list"), "miex_showil", IDI_ICON8 }, + { _T("Always visible"), "miex_vis", IDI_ICON1 }, + { _T("Never visible"), "miex_invis", IDI_ICON2 }, + { _T("Send 'You were added'"), "miex_added", IDI_ICON4 }, + { _T("Request authorization"), "miex_authorization", IDI_ICON5 }, + { _T("Copy to Account"), "miex_protocol", IDI_ICON6 }, + { _T("Ignore"), "miex_ignore", IDI_ICON7 }, + { _T("Browse Received Files"), "miex_recfiles", IDI_ICON12 }, + { _T("Copy MirVer"), "miex_copymver", IDI_ICON13 } +}; + +struct +{ + TCHAR* szDescr; + char* szName; + int defIconID; +} +static const overlayIconList[] = { + { _T("Copy ID"), "miex_copyid", IDI_ICON3 }, + { _T("Copy Status Message"), "miex_copysm1", IDI_ICON9 }, + { _T("Copy xStatus Message"), "miex_copysm2", IDI_ICON10 }, + { _T("Copy IP"), "miex_copyip", IDI_ICON11 } +}; + +struct { + TCHAR* name; + int type; + int icon; +} +static const ii[] = { + { LPGENT("All"), IGNOREEVENT_ALL, SKINICON_OTHER_FILLEDBLOB }, + { LPGENT("Messages"), IGNOREEVENT_MESSAGE, SKINICON_EVENT_MESSAGE }, + { LPGENT("URL"), IGNOREEVENT_URL, SKINICON_EVENT_URL }, + { LPGENT("Files"), IGNOREEVENT_FILE, SKINICON_EVENT_FILE }, + { LPGENT("User Online"), IGNOREEVENT_USERONLINE, SKINICON_OTHER_USERONLINE }, + { LPGENT("Authorization"), IGNOREEVENT_AUTHORIZATION, SKINICON_OTHER_MIRANDA }, + { LPGENT("You Were Added"), IGNOREEVENT_YOUWEREADDED, SKINICON_OTHER_ADDCONTACT }, + { LPGENT("Typing Notify"), IGNOREEVENT_TYPINGNOTIFY, SKINICON_OTHER_TYPING } +}; + +PLUGININFOEX pluginInfoEx = { + sizeof(PLUGININFOEX), + MODULENAME, + __VERSION_DWORD, + __DESC, + __AUTHORS, + __EMAIL, + __COPYRIGHTS, + __WEB, + UNICODE_AWARE, + MIID_MENUEX +}; + +struct ModSetLinkLinkItem { // code from dbe++ plugin by Bio + char *name; + BYTE *next; //struct ModSetLinkLinkItem +}; + +typedef struct { + struct ModSetLinkLinkItem *first; + struct ModSetLinkLinkItem *last; +} ModuleSettingLL; + +int GetSetting(HANDLE hContact, const char *szModule, const char *szSetting, DBVARIANT *dbv) +{ + DBCONTACTGETSETTING cgs; + + cgs.szModule = szModule; + cgs.szSetting = szSetting; + cgs.pValue = dbv; + dbv->type = 0; + + return CallService(MS_DB_CONTACT_GETSETTING_STR,(WPARAM)hContact,(LPARAM)&cgs); +} + +int enumModulesSettingsProc( const char *szName, LPARAM lParam) +{ + ModuleSettingLL *msll = (ModuleSettingLL *)lParam; + if (!msll->first) + { + msll->first = (struct ModSetLinkLinkItem *)malloc(sizeof(struct ModSetLinkLinkItem)); + if (!msll->first) return 1; + msll->first->name = _strdup(szName); + msll->first->next = 0; + msll->last = msll->first; + } + else + { + struct ModSetLinkLinkItem *item = (struct ModSetLinkLinkItem *)malloc(sizeof(struct ModSetLinkLinkItem)); + if (!item) return 1; + msll->last->next = (BYTE*)item; + msll->last = (struct ModSetLinkLinkItem *)item; + item->name = _strdup(szName); + item->next = 0; + } + return 0; +} + +void FreeModuleSettingLL(ModuleSettingLL* msll) +{ + if (msll) + { + struct ModSetLinkLinkItem *item = msll->first; + struct ModSetLinkLinkItem *temp; + + while (item) + { + if (item->name) + { + free(item->name); + item->name = 0; + } + temp = item; + item = (struct ModSetLinkLinkItem *)item->next; + if (temp) + { + free(temp); + temp = 0; + } + } + + msll->first = 0; + msll->last = 0; + } +} + +void RenameDbProto(HANDLE hContact, HANDLE hContactNew, char* oldName, char* newName, int delOld) +{ + DBVARIANT dbv; + ModuleSettingLL settinglist; + struct ModSetLinkLinkItem *setting; + DBCONTACTENUMSETTINGS dbces; + + // enum all setting the contact has for the module + dbces.pfnEnumProc = enumModulesSettingsProc; + dbces.szModule = oldName; + dbces.lParam = (LPARAM)&settinglist; + settinglist.first = 0; + settinglist.last = 0; + CallService(MS_DB_CONTACT_ENUMSETTINGS, (WPARAM)hContact,(LPARAM)&dbces); + + setting = settinglist.first; + while (setting) + { + if (!GetSetting(hContact,oldName,setting->name,&dbv)) + { + switch (dbv.type) + { + case DBVT_BYTE: + DBWriteContactSettingByte(hContactNew, newName, setting->name, dbv.bVal); + break; + case DBVT_WORD: + DBWriteContactSettingWord(hContactNew, newName, setting->name, dbv.wVal); + break; + case DBVT_DWORD: + DBWriteContactSettingDword(hContactNew, newName, setting->name, dbv.dVal); + break; + case DBVT_ASCIIZ: + DBWriteContactSettingString(hContactNew, newName, setting->name, dbv.pszVal); + break; + case DBVT_UTF8: + DBWriteContactSettingStringUtf(hContactNew, newName, setting->name, dbv.pszVal); + break; + case DBVT_BLOB: + DBWriteContactSettingBlob(hContactNew, newName, setting->name, dbv.pbVal, dbv.cpbVal); + break; + + } + if (delOld) + DBDeleteContactSetting(hContact, oldName, setting->name); + } + DBFreeVariant(&dbv); + setting = (struct ModSetLinkLinkItem *)setting->next; + } + FreeModuleSettingLL(&settinglist); +} // end code from dbe++ + +static void IconsInit() +{ + int i; + TCHAR tszFile[MAX_PATH]; + GetModuleFileName(hinstance, tszFile, MAX_PATH); + + SKINICONDESC sid = {0}; + sid.cbSize = sizeof(SKINICONDESC); + sid.flags = SIDF_ALL_TCHAR; + sid.ptszDefaultFile = tszFile; + sid.cx = sid.cy = 16; + sid.ptszSection = LPGENT(MODULENAME); + + for ( i = 0; i < SIZEOF(iconList); i++ ) { + sid.pszName = iconList[i].szName; + sid.ptszDescription = iconList[i].szDescr; + sid.iDefaultIndex = -iconList[i].defIconID; + Skin_AddIcon(&sid); + } + + for ( i = 0; i < SIZEOF(overlayIconList); i++ ) { + sid.pszName = overlayIconList[i].szName; + sid.ptszDescription = overlayIconList[i].szDescr; + sid.iDefaultIndex = -overlayIconList[i].defIconID; + Skin_AddIcon(&sid); + } +} + +void ShowPopup(char* szText, TCHAR* tszText, HANDLE hContact) +{ + POPUPDATAT ppd = {0}; + TCHAR* text = 0; + + if (tszText) + text = mir_tstrdup(tszText); + else if (szText) + text = mir_a2t(szText); + if (!text) return; + + ppd.lchIcon = LoadSkinnedIcon(SKINICON_OTHER_MIRANDA); + ppd.lchContact = hContact; + _tcsncpy(ppd.lptzContactName, (TCHAR*)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hContact, GCDNF_TCHAR), MAX_CONTACTNAME - 1); + _tcsncpy(ppd.lptzText, text, MAX_SECONDLINE - 1); + ppd.iSeconds = -1; + + PUAddPopUpT(&ppd); + mir_free(text); +} + +BOOL DirectoryExists(HANDLE hContact) +{ + int attr; + char path[MAX_PATH]; + CallService(MS_FILE_GETRECEIVEDFILESFOLDER, (WPARAM)hContact, (LPARAM)&path); + attr = GetFileAttributesA(path); + return (attr != -1) && (attr&FILE_ATTRIBUTE_DIRECTORY); +} + +void CopyToClipboard(HWND hwnd,LPSTR pszMsg, LPTSTR ptszMsg) +{ + HGLOBAL hglbCopy; + LPTSTR lptstrCopy; + LPTSTR buf = 0; + if (ptszMsg) + buf = mir_tstrdup(ptszMsg); + else if (pszMsg) + buf = mir_a2t(pszMsg); + + if (buf == 0) + return; + + hglbCopy = GlobalAlloc(GMEM_MOVEABLE, (lstrlen(buf)+1)*sizeof(TCHAR)); + lptstrCopy = (LPTSTR)GlobalLock(hglbCopy); + lstrcpy(lptstrCopy, buf); + mir_free(buf); + GlobalUnlock(hglbCopy); + + OpenClipboard(NULL); + EmptyClipboard(); + + SetClipboardData(CF_UNICODETEXT, hglbCopy); + + CloseClipboard(); +} + +BOOL isMetaContact(HANDLE hContact) { + + char *proto; + if(bMetaContacts) { + proto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); + if ( lstrcmpA(proto,"MetaContacts") == 0 ) { + return TRUE; + } + } + return FALSE; +} + +HANDLE getDefaultContact(HANDLE hContact) { + + if(bMetaContacts) { + return (HANDLE)CallService(MS_MC_GETDEFAULTCONTACT,(WPARAM)hContact,0); + } + return 0; +} + +HANDLE getMostOnline(HANDLE hContact) { + + if(bMetaContacts) { + return (HANDLE)CallService(MS_MC_GETMOSTONLINECONTACT,(WPARAM)hContact,0); + } + return 0; +} + +void GetID(HANDLE hContact,LPSTR szProto,LPSTR szID) +{ + DBVARIANT dbv_uniqueid; + LPSTR uID = (LPSTR) CallProtoService(szProto, PS_GETCAPS, PFLAG_UNIQUEIDSETTING, 0); + if ( uID == (LPSTR)CALLSERVICE_NOTFOUND ) + uID = NULL; + + *szID = '\0'; + + if ( uID && DBGetContactSetting(hContact, szProto, uID ,&dbv_uniqueid) == 0 ) { + if (dbv_uniqueid.type == DBVT_DWORD) + wsprintfA(szID, "%u", dbv_uniqueid.dVal); + else if (dbv_uniqueid.type == DBVT_WORD) + wsprintfA(szID, "%u", dbv_uniqueid.wVal); + else if (dbv_uniqueid.type == DBVT_BLOB) + wsprintfA(szID, "%s", dbv_uniqueid.cpbVal); + else + wsprintfA(szID, "%s", dbv_uniqueid.pszVal); + + DBFreeVariant(&dbv_uniqueid); + } +} + +int StatusMsgExists(HANDLE hContact) +{ + LPSTR module,msg; + char par[32]; + BOOL ret = 0; + int i; + + module = (LPSTR) CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); + if (!module) return 0; + + for(i = 0; i < SIZEOF(statusMsg); i++) { + if (statusMsg[i].flag & 8) + mir_snprintf(par, SIZEOF(par), "%s/%s", module, statusMsg[i].name); + else + strcpy(par, statusMsg[i].name); + + msg = DBGetString(hContact, (statusMsg[i].module) ? statusMsg[i].module : module, par); + if(msg) { + if(strlen(msg)) + ret |= statusMsg[i].flag; + mir_free(msg); + } + } + return ret; +} + +BOOL IPExists(HANDLE hContact) +{ + LPSTR szProto; + DWORD mIP,rIP; + + szProto = (LPSTR) CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); + if (!szProto) return 0; + + mIP = DBGetContactSettingDword(hContact, szProto, "IP", 0); + rIP = DBGetContactSettingDword(hContact, szProto, "RealIP", 0); + + return (mIP != 0 || rIP != 0); +} + +BOOL MirVerExists(HANDLE hContact) +{ + LPSTR szProto, msg; + BOOL ret = 0; + + szProto = (LPSTR) CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); + if (!szProto) return 0; + + msg = DBGetString(hContact,szProto,"MirVer"); + if(msg) { + if(strlen(msg)) ret = 1; + mir_free(msg); + } + + return ret; +} + +void getIP(HANDLE hContact,LPSTR szProto,LPSTR szIP) +{ + char szmIP[64] = {0}; + char szrIP[64] = {0}; + DWORD mIP = DBGetContactSettingDword(hContact, szProto, "IP", 0); + DWORD rIP = DBGetContactSettingDword(hContact, szProto, "RealIP", 0); + if ( mIP ) wsprintfA(szmIP, "External IP: %d.%d.%d.%d\r\n", mIP>>24,(mIP>>16)&0xFF,(mIP>>8)&0xFF,mIP&0xFF); + if ( rIP ) wsprintfA(szrIP, "Internal IP: %d.%d.%d.%d\r\n", rIP>>24,(rIP>>16)&0xFF,(rIP>>8)&0xFF,rIP&0xFF); + strcpy(szIP,szrIP); + strcat(szIP,szmIP); +} + +LPSTR getMirVer(HANDLE hContact) +{ + LPSTR szProto, msg; + + szProto = (LPSTR) CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); + if (!szProto) return NULL; + + msg = DBGetString(hContact,szProto,"MirVer"); + if(msg) { + if(strlen(msg)) + return msg; + mir_free(msg); + } + + return NULL; +} + +static LRESULT CALLBACK AuthReqEditSubclassProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) +{ + switch(msg) { + case WM_CHAR: + if(wParam == '\n' && CTRL_IS_PRESSED) { // ctrl + ENTER + PostMessage(GetParent(hwnd), WM_COMMAND, IDOK, 0); + return 0; + } + if(wParam == 1 && CTRL_IS_PRESSED) { // ctrl + a + SendMessage(hwnd, EM_SETSEL, 0, -1); + return 0; + } + break; + case WM_SETFOCUS: + SendMessage(hwnd, EM_SETSEL, 0, -1); + break; + } + return CallWindowProc((WNDPROC)OldAuthReqEditProc,hwnd,msg,wParam,lParam); +} + +INT_PTR CALLBACK AuthReqWndProc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam) +{ + static HANDLE hcontact; + + switch(msg){ + case WM_INITDIALOG: + TranslateDialogDefault(hdlg); + OldAuthReqEditProc = SetWindowLongPtr(GetDlgItem(hdlg, IDC_REASON), GWLP_WNDPROC, (LONG_PTR)AuthReqEditSubclassProc); + SendDlgItemMessage(hdlg, IDC_REASON, EM_LIMITTEXT, (WPARAM)255, 0); + SetDlgItemText(hdlg, IDC_REASON, TranslateT("Please authorize me to add you to my contact list.")); + hcontact = (HANDLE)lparam; + break; + + case WM_COMMAND: + switch(LOWORD(wparam)) { + case IDOK: + { + char szReason[256] = {0}; + + WCHAR wszReason[256] = {0}; + + if (CallService(MS_SYSTEM_GETVERSION, 0, 0) < 0x00090007) + { + GetDlgItemTextA(hdlg,IDC_REASON,szReason,255); + CallContactService(hcontact,PSS_AUTHREQUEST,0,(LPARAM)szReason); + } + else + { + GetDlgItemText(hdlg,IDC_REASON,wszReason,255); + CallContactService(hcontact,PSS_AUTHREQUESTW,0,(LPARAM)wszReason); + } + + } // fall through + case IDCANCEL: + DestroyWindow(hdlg); + break; + } + break; + } + + return 0; +} + +BOOL isVisSupport(HANDLE hContact) +{ + char *szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact,0); + if(szProto == NULL) return 0; + return CallProtoService(szProto,PS_GETCAPS,PFLAGNUM_1,0)&PF1_INVISLIST; +} + +BOOL isInvSupport(HANDLE hContact) +{ + char *szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact,0); + if(szProto == NULL) return 0; + return CallProtoService(szProto,PS_GETCAPS,PFLAGNUM_1,0)&PF1_VISLIST; +} + +BOOL isProtoOnline(char *szProto) +{ +//#ifdef _DEBUG +// return TRUE; +//#else + DWORD protoStatus; + protoStatus = CallProtoService(szProto,PS_GETSTATUS,0,0); + return (protoStatus > ID_STATUS_OFFLINE && protoStatus < ID_STATUS_IDLE); + +//#endif +} + +INT_PTR onSendAuthRequest(WPARAM wparam,LPARAM lparam) +{ + DWORD flags; + char *szProto; + + szProto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO,wparam,0); + + flags = CallProtoService(szProto,PS_GETCAPS,PFLAGNUM_4,0); + if (flags&PF4_NOCUSTOMAUTH) + CallContactService((HANDLE)wparam,PSS_AUTHREQUEST,0, (LPARAM)""); + else + CreateDialogParam(hinstance,MAKEINTRESOURCE(IDD_AUTHREQ),(HWND)CallService(MS_CLUI_GETHWND,0,0),AuthReqWndProc,(LPARAM)wparam); + + return 0; +} + +INT_PTR onSendAdded(WPARAM wparam,LPARAM lparam) +{ + CallContactService((HANDLE)wparam,PSS_ADDED,0,0); + return 0; +} + +// set the invisible-flag in db +INT_PTR onSetInvis(WPARAM wparam,LPARAM lparam) +{ + CallContactService((HANDLE)wparam,PSS_SETAPPARENTMODE,(DBGetContactSettingWord((HANDLE)wparam,(const char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,wparam,0),"ApparentMode",0) == ID_STATUS_OFFLINE)?0:ID_STATUS_OFFLINE,0); + return 0; +} + +// set visible-flag in db +INT_PTR onSetVis(WPARAM wparam,LPARAM lparam) +{ + CallContactService((HANDLE)wparam,PSS_SETAPPARENTMODE,(DBGetContactSettingWord((HANDLE)wparam,(const char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,wparam,0),"ApparentMode",0) == ID_STATUS_ONLINE)?0:ID_STATUS_ONLINE,0); + return 0; +} + +INT_PTR onHide(WPARAM wparam,LPARAM lparam) +{ + DBWriteContactSettingByte((HANDLE)wparam,"CList","Hidden",(byte)!DBGetContactSettingByte((HANDLE)wparam,"CList","Hidden",0)); + CallService(MS_CLUI_SORTLIST,0,0); + return 0; +} + +void ShowItem(CLISTMENUITEM *cli, HANDLE hmenu) +{ + cli->flags = CMIM_FLAGS | CMIF_TCHAR; + CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)hmenu,(LPARAM)cli); +} + +void HideItem(CLISTMENUITEM *cli,HANDLE hmenu) +{ + cli->flags|=CMIF_HIDDEN; + CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)hmenu,(LPARAM)cli); +} + +// following 4 functions should be self-explanatory +void ModifyVisibleSet(CLISTMENUITEM *cli,int mode,BOOL alpha) +{ + cli->flags |= CMIM_ICON; + cli->hIcon = (mode) ? hIcon[1] : (alpha?hIcon[3] : LoadSkinnedIcon(SKINICON_OTHER_SMALLDOT)); + CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hmenuVis, (LPARAM)cli); +} + +void ModifyInvisSet(CLISTMENUITEM *cli,int mode,BOOL alpha) +{ + cli->flags |= CMIM_ICON; + cli->hIcon = (mode) ? hIcon[2] : (alpha ? hIcon[4] : LoadSkinnedIcon(SKINICON_OTHER_SMALLDOT)); + CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hmenuOff, (LPARAM)cli); +} + +void ModifyHidden(CLISTMENUITEM *cli,int mode) +{ + cli->flags |= CMIM_ICON | CMIM_NAME; + cli->hIcon = (mode) ? + (HICON)CallService( MS_SKIN2_GETICON, 0, (LPARAM)"miex_showil") : + (HICON)CallService( MS_SKIN2_GETICON, 0, (LPARAM)"miex_hidefl"); + cli->ptszName = mode ? LPGENT("Show in list") : LPGENT("Hide from list"); + CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hmenuHide, (LPARAM)cli); +} + +void ModifyCopyID(CLISTMENUITEM *cli, HANDLE hContact, BOOL bShowID, BOOL bTrimID) +{ + LPSTR szProto; + char szID[256]; + TCHAR buffer[256]; + HICON hIconCID; + HANDLE hC; + + cli->flags|=CMIM_ICON|CMIM_NAME; + + if(isMetaContact(hContact)) { + hC = getMostOnline(hContact); + if ( !hContact ) hC = getDefaultContact(hContact); + hContact = hC; + } + + szProto = (LPSTR) CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); + if (!szProto) { + HideItem(cli,hmenuCopyID); + return; + } + hIconCID = (HICON) CallProtoService(szProto, PS_LOADICON, PLI_PROTOCOL|PLIF_SMALL, 0); + cli->hIcon = BindOverlayIcon(hIconCID, "miex_copyid"); + DestroyIcon(hIconCID); + hIconCID = cli->hIcon; + + GetID(hContact,szProto,(LPSTR)&szID); + if(szID[0]) + { + if (bShowID) + { + TCHAR* tmp; + + if (bTrimID && (strlen(szID) > MAX_IDLEN)) + { + szID[MAX_IDLEN - 2] = szID[MAX_IDLEN - 1] = szID[MAX_IDLEN] = '.'; + szID[MAX_IDLEN + 1] = 0; + } + tmp = mir_a2t(szID); + mir_sntprintf(buffer, SIZEOF(buffer), _T("%s [%s]"), TranslateT("Copy ID"), tmp); + mir_free(tmp); + + cli->ptszName = (TCHAR*)&buffer; + } + else + cli->ptszName = _T("Copy ID"); + } + else { + cli->flags = CMIM_FLAGS|CMIF_HIDDEN; + } + CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)hmenuCopyID,(LPARAM)cli); + DestroyIcon(hIconCID); +} + +void ModifyStatusMsg(CLISTMENUITEM *cli,HANDLE hContact) +{ + LPSTR szProto; + HICON hIconSMsg; + + cli->flags|=CMIM_ICON; + + szProto = (LPSTR) CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); + if (!szProto) { + HideItem(cli,hmenuStatusMsg); + return; + } + + hIconSMsg = (HICON) CallProtoService(szProto, PS_LOADICON, PLI_PROTOCOL|PLIF_SMALL, 0); + cli->hIcon = BindOverlayIcon(hIconSMsg, (StatusMsgExists(hContact)&2) ? "miex_copysm2" : "miex_copysm1"); + DestroyIcon(hIconSMsg); + hIconSMsg = cli->hIcon; + + CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)hmenuStatusMsg,(LPARAM)cli); + DestroyIcon(hIconSMsg); +} + +void ModifyCopyIP(CLISTMENUITEM *cli,HANDLE hContact) +{ + LPSTR szProto; + HICON hIconCIP; + + cli->flags |= CMIM_ICON; + + szProto = (LPSTR) CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); + if (!szProto) { + HideItem(cli,hmenuCopyIP); + return; + } + + hIconCIP = (HICON) CallProtoService(szProto, PS_LOADICON, PLI_PROTOCOL|PLIF_SMALL, 0); + + cli->hIcon = BindOverlayIcon(hIconCIP, "miex_copyip"); + DestroyIcon(hIconCIP); + hIconCIP = cli->hIcon; + + CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)hmenuCopyIP,(LPARAM)cli); + DestroyIcon(hIconCIP); +} + +void ModifyCopyMirVer(CLISTMENUITEM *cli,HANDLE hContact) +{ + LPSTR msg; + cli->flags|=CMIM_ICON; + cli->hIcon = NULL; + if(ServiceExists(MS_FP_GETCLIENTICON)) { + msg = getMirVer(hContact); + if(msg) { + cli->hIcon = (HICON)CallService(MS_FP_GETCLIENTICON,(WPARAM)msg,(LPARAM)1); + mir_free(msg); + } + } + if (!cli->hIcon) cli->hIcon = hIcon[0]; + CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)hmenuCopyMirVer,(LPARAM)cli); +} + +INT_PTR onCopyID(WPARAM wparam,LPARAM lparam) +{ + LPSTR szProto; + char szID[128] = {0}, buffer[256] = {0}; + HANDLE hContact ,hC; + PROTOACCOUNT* pa; + + hContact = (HANDLE)wparam; + if(isMetaContact(hContact)) { + hC = getMostOnline(hContact); + if ( !hContact ) hC = getDefaultContact(hContact); + hContact = hC; + } + if ((szProto = (LPSTR) CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0)) == NULL) + return 0; + + GetID(hContact,szProto,(LPSTR)&szID); + + if(DBGetContactSettingDword(NULL,VISPLG,"flags",vf_default)&VF_CIDN) { + if (bMir_08) + pa = (PROTOACCOUNT*)CallService(MS_PROTO_GETACCOUNT, 0, (LPARAM)szProto); + + if (bMir_08 && !pa->bOldProto) + mir_snprintf(buffer, SIZEOF(buffer), "%s: %s", pa->szProtoName, szID); + else + mir_snprintf(buffer, SIZEOF(buffer), "%s: %s", szProto, szID); + } + else + strcpy(buffer, szID); + + CopyToClipboard((HWND)lparam, buffer, 0); + if(CTRL_IS_PRESSED && ServiceExists(MS_POPUP_ADDPOPUP)) + ShowPopup(buffer, 0, hContact); + + return 0; +} + +INT_PTR onCopyStatusMsg(WPARAM wparam,LPARAM lparam) +{ + LPSTR module; + LPTSTR msg; + char par[32]; + TCHAR buffer[2048]; + int i; + DWORD flags = DBGetContactSettingDword(NULL,VISPLG,"flags",vf_default); + + module = (LPSTR) CallService(MS_PROTO_GETCONTACTBASEPROTO, wparam, 0); + if (!module) return 0; + + buffer[0] = 0; + for(i = 0; i < SIZEOF(statusMsg); i++) { + if (statusMsg[i].flag & 8) + mir_snprintf(par, SIZEOF(par), "%s/%s", module, statusMsg[i].name); + else + strcpy(par, statusMsg[i].name); + + msg = DBGetStringT((HANDLE)wparam, (statusMsg[i].module) ? statusMsg[i].module : module, par); + if(msg) + { + if(_tcsclen(msg)) + { + if (flags&VF_SMNAME) + { + _tcsncat (buffer, TranslateTS(statusMsg[i].fullName), (SIZEOF(buffer) - _tcsclen(buffer) - 1)); + _tcsncat (buffer, _T(": "), (SIZEOF(buffer) - _tcsclen(buffer) - 1)); + } + _tcsncat(buffer, msg, (SIZEOF(buffer) - _tcsclen(buffer) - 1)); + _tcsncat(buffer, _T("\r\n"), (SIZEOF(buffer) - _tcsclen(buffer) - 1)); + } + mir_free(msg); + } + } + + CopyToClipboard((HWND)lparam, 0, buffer); + if(CTRL_IS_PRESSED && ServiceExists(MS_POPUP_ADDPOPUP)) + ShowPopup(0, buffer, (HANDLE)wparam); + + return 0; +} + +INT_PTR onCopyIP(WPARAM wparam,LPARAM lparam) +{ + LPSTR szProto; + char szIP[128]; + + szProto = (LPSTR) CallService(MS_PROTO_GETCONTACTBASEPROTO, wparam, 0); + getIP((HANDLE)wparam,szProto,(LPSTR)&szIP); + + CopyToClipboard((HWND)lparam, szIP, 0); + if(CTRL_IS_PRESSED && ServiceExists(MS_POPUP_ADDPOPUP)) + ShowPopup(szIP, 0, (HANDLE)wparam); + + return 0; +} + +INT_PTR onCopyMirVer(WPARAM wparam,LPARAM lparam) +{ + LPSTR msg = getMirVer((HANDLE)wparam); + if(msg) { + CopyToClipboard((HWND)lparam, msg, 0); + if(CTRL_IS_PRESSED && ServiceExists(MS_POPUP_ADDPOPUP)) + ShowPopup(msg, 0, (HANDLE)wparam); + + mir_free(msg); + } + return 0; +} + +INT_PTR onRecvFiles(WPARAM wparam,LPARAM lparam) +{ + char path[MAX_PATH]; + CallService(MS_FILE_GETRECEIVEDFILESFOLDER, wparam, (LPARAM)&path); + ShellExecuteA(0, "open", path, 0, 0, SW_SHOW); + return 0; +} + +INT_PTR onChangeProto(WPARAM wparam,LPARAM lparam) +{ + HANDLE hContact, hContactNew; + + hContact = (HANDLE)wparam; + if (!strcmp((char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, wparam, 0), (char*)lparam)) + return 0; + + if (CTRL_IS_PRESSED) + { + hContactNew = hContact; + RenameDbProto(hContact, hContactNew, (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0), (char*)lparam, 1); + CallService(MS_PROTO_REMOVEFROMCONTACT, (WPARAM)hContact, CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0)); + CallService(MS_PROTO_ADDTOCONTACT, (WPARAM)hContactNew, lparam); + } + else + { + hContactNew = (HANDLE)CallService(MS_DB_CONTACT_ADD, 0, 0); + if (hContactNew) + { + CallService(MS_PROTO_ADDTOCONTACT, (WPARAM)hContactNew, lparam); + RenameDbProto(hContact, hContactNew, (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0), (char*)lparam, 0); + RenameDbProto(hContact, hContactNew, "CList", "CList", 0); + } + else + return 0; + } + if(MessageBox(NULL,(LPCTSTR)TranslateT("Do you want to send authorization request\nto new contact?"), + TranslateT("Miranda IM"), MB_OKCANCEL | MB_SETFOREGROUND | MB_TOPMOST) == IDOK) + + onSendAuthRequest((WPARAM)hContactNew, 0); + + return 0; +} + +int isIgnored(HANDLE hContact, int type) +{ + int i = 0, all = 0; + if (type == IGNOREEVENT_ALL) + { + for (i = 1; i < SIZEOF(ii); i++) + { + if (isIgnored(hContact, ii[i].type)) + all++; + } + return (all == SIZEOF(ii) - 1) ? 1 : 0; // ignoring all or not + } + else + return CallService(MS_IGNORE_ISIGNORED, (WPARAM)hContact, (LPARAM)type); +} + +INT_PTR onIgnore(WPARAM wparam,LPARAM lparam) +{ + if (DBGetContactSettingByte(NULL, VISPLG, "ignorehide", 0) && (lparam == IGNOREEVENT_ALL)) { + DBWriteContactSettingByte((HANDLE)wparam, "CList", "Hidden", (isIgnored((HANDLE)wparam, lparam) ? (byte)0 : (byte)1)); + CallService(MS_CLUI_SORTLIST, 0, 0); + } + + CallService(isIgnored((HANDLE)wparam, lparam) ? MS_IGNORE_UNIGNORE : MS_IGNORE_IGNORE, wparam, lparam); + return 0; +} + +static HANDLE AddSubmenuItem(HANDLE hRoot, TCHAR* name, HICON icon, DWORD flag, char* service, int pos, int param) +{ + CLISTMENUITEM mi = { 0 }; + mi.cbSize = sizeof(mi); + mi.hParentMenu = (HGENMENU)hRoot; + mi.pszPopupName = (char*)hRoot; // for Miranda 0.7 + mi.popupPosition = param; + mi.position = pos; + mi.ptszName = name; + mi.hIcon = icon; + mi.flags = CMIF_TCHAR | CMIF_CHILDPOPUP; + if (flag) + mi.flags |= flag; + mi.pszService = service; + return Menu_AddContactMenuItem(&mi); +} + +static void ModifySubmenuItem(HANDLE hItem, TCHAR* name, int checked, int hidden) +{ + CLISTMENUITEM mi = { 0 }; + mi.cbSize = sizeof(mi); + mi.ptszName = name; + mi.flags = CMIM_FLAGS | CMIF_TCHAR; + if ( checked ) + mi.flags |= CMIF_CHECKED; + if ( hidden ) + mi.flags |= CMIF_HIDDEN; + CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hItem, (LPARAM)&mi); +} + +// called when the contact-menu is built +int BuildMenu(WPARAM wparam,LPARAM lparam) +{ + CLISTMENUITEM miAV = {0},miNV,miHFL,miIGN,miPROTO,miADD,miREQ,miCID,miRECV,miSTAT,miCIP,miCMV; + DWORD flags = DBGetContactSettingDword(NULL,VISPLG,"flags",vf_default); + int i = 0, j = 0, check = 0, all = 0, hide = 0; + BOOL bIsOnline = FALSE, bShowAll = CTRL_IS_PRESSED; + PROTOACCOUNT* pa; + char* pszProto; + pszProto = (LPSTR)CallService(MS_PROTO_GETCONTACTBASEPROTO, wparam, 0); + if(bMir_08) + pa = (PROTOACCOUNT*)CallService(MS_PROTO_GETACCOUNT, 0, (LPARAM)pszProto); + + bIsOnline = isProtoOnline(pszProto); + + miAV.cbSize = sizeof(CLISTMENUITEM); + miAV.flags = CMIM_FLAGS | CMIF_TCHAR; + miAV.hIcon = NULL; + miAV.pszContactOwner = NULL; + miNV = miHFL = miIGN = miPROTO = miADD = miREQ = miCID = miRECV = miSTAT = miCIP = miCMV = miAV; + + if(bShowAll || flags&VF_VS) { + ShowItem(&miAV,hmenuVis); + ShowItem(&miNV,hmenuOff); + } + else { + HideItem(&miAV,hmenuVis); + HideItem(&miNV,hmenuOff); + } + + if(bShowAll || flags&VF_HFL){ + ShowItem(&miHFL,hmenuHide); + ModifyHidden(&miHFL,DBGetContactSettingByte((HANDLE)wparam,"CList","Hidden",0)); + } + else HideItem(&miHFL,hmenuHide); + + if(bShowAll || flags&VF_IGN) + { + ShowItem(&miIGN,hmenuIgnore); + for (i = 1; i < SIZEOF(ii); i++) + { + check = isIgnored((HANDLE)wparam, ii[i].type); + if (check) + all++; + ModifySubmenuItem(hIgnoreItem[i], ii[i].name, check, 0); + + if (all == SIZEOF(ii) - 1) // ignor all + check = 1; + else + check = 0; + ModifySubmenuItem(hIgnoreItem[0], ii[i].name, check, 0); + } + } + + else HideItem(&miIGN,hmenuIgnore); + + if(bMir_08 && pa && (bShowAll || flags&VF_PROTO)) + { + for (i = 0; i < protoCount; i++) + { + if ((!accs[i]->bIsEnabled) || (strcmp(pa->szProtoName, accs[i]->szProtoName))) + hide = 1; + else + { + hide = 0; + j++; + } + + if (CallService(MS_PROTO_ISPROTOONCONTACT, wparam, (LPARAM)accs[i]->szModuleName)) + check = 1; + else + check = 0; + + ModifySubmenuItem(hProtoItem[i], accs[i]->tszAccountName, check, hide); + } + if (j > 1) + ShowItem(&miPROTO,hmenuProto); + else + HideItem(&miPROTO,hmenuProto); + } + else HideItem(&miPROTO,hmenuProto); + + if ((bShowAll || flags & VF_ADD) && bIsOnline && (bMir_08 ? IsAccountEnabled( pa ) : TRUE)) + ShowItem(&miADD,hmenuAdded); + else + HideItem(&miADD,hmenuAdded); + + if ((bShowAll || flags & VF_REQ) && bIsOnline && (bMir_08 ? IsAccountEnabled( pa ) : TRUE)) + ShowItem(&miREQ,hmenuAuthReq); + else + HideItem(&miREQ,hmenuAuthReq); + + if(bShowAll || flags&VF_CID){ + ShowItem(&miCID,hmenuCopyID); + ModifyCopyID(&miCID,(HANDLE)wparam, flags&VF_SHOWID, flags&VF_TRIMID); + } + else HideItem(&miCID,hmenuCopyID); + + if ((bShowAll || flags&VF_RECV) && DirectoryExists((HANDLE)wparam)) ShowItem(&miRECV,hmenuRecvFiles); + else HideItem(&miRECV,hmenuRecvFiles); + + if ((bShowAll || flags&VF_STAT) && StatusMsgExists((HANDLE)wparam)) { + ShowItem(&miSTAT,hmenuStatusMsg); + ModifyStatusMsg(&miSTAT,(HANDLE)wparam); + } + else HideItem(&miSTAT,hmenuStatusMsg); + + if ((bShowAll || flags&VF_CIP) && IPExists((HANDLE)wparam)) { + ShowItem(&miCIP,hmenuCopyIP); + ModifyCopyIP(&miCIP,(HANDLE)wparam); + } + else HideItem(&miCIP,hmenuCopyIP); + + if ((bShowAll || flags&VF_CMV) && MirVerExists((HANDLE)wparam)) { + ShowItem(&miCMV,hmenuCopyMirVer); + ModifyCopyMirVer(&miCMV,(HANDLE)wparam); + } + else HideItem(&miCMV,hmenuCopyMirVer); + + if(bShowAll || (flags&VF_VS)) + { + int apparent = DBGetContactSettingWord((HANDLE)wparam,(const char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,wparam,0),"ApparentMode",0); + if(isVisSupport((HANDLE)wparam)) ModifyVisibleSet(&miAV,apparent == ID_STATUS_ONLINE,flags&VF_SAI); + else HideItem(&miAV,hmenuVis); + if(isInvSupport((HANDLE)wparam)) ModifyInvisSet(&miNV,apparent == ID_STATUS_OFFLINE,flags&VF_SAI); + else HideItem(&miAV,hmenuOff); + } + return 0; +} + +int EnumProtoSubmenu(WPARAM wparam, LPARAM lparam) +{ + int i; + int pos = 1000; + if (protoCount) // remove old items + { + for (i = 0; i < protoCount; i++) + { + if (hProtoItem[i]) + { + CallService(MS_CLIST_REMOVECONTACTMENUITEM, (WPARAM)hProtoItem[i], 0); + hProtoItem[i] = 0; + } + } + } + CallService( MS_PROTO_ENUMACCOUNTS, (WPARAM)&protoCount, (LPARAM)&accs); + if (protoCount > MAX_PROTOS) + protoCount = MAX_PROTOS; + for (i = 0; i < protoCount; i++) + { + hProtoItem[i] = AddSubmenuItem((HGENMENU)hmenuProto, accs[i]->tszAccountName, + LoadSkinnedProtoIcon(accs[i]->szModuleName, ID_STATUS_ONLINE), CMIF_KEEPUNTRANSLATED, + MS_PROTO, pos++, (int)accs[i]->szModuleName); + } + return 0; +} + +// Tabsrmm toolbar support +static int TabsrmmButtonPressed(WPARAM wParam, LPARAM lParam) +{ + CustomButtonClickData *cbcd = (CustomButtonClickData *)lParam; + + if (!strcmp(cbcd->pszModule, MODULENAME) && cbcd->dwButtonId == 0) + onRecvFiles(wParam, 0); + + return 0; +} + +static int TabsrmmButtonsInit(WPARAM wParam, LPARAM lParam) +{ + BBButton bbd = {0}; + + bbd.cbSize = sizeof(BBButton); + bbd.pszModuleName = MODULENAME; + bbd.dwButtonID = 0; + bbd.dwDefPos = 1000; + bbd.ptszTooltip = _T("Browse Received Files"); + bbd.bbbFlags = BBBF_ISLSIDEBUTTON | BBBF_CANBEHIDDEN; + bbd.hIcon = (HANDLE)CallService(MS_SKIN2_GETICONHANDLE, 0, (LPARAM)"miex_recfiles"); + CallService (MS_BB_ADDBUTTON, 0, (LPARAM)&bbd); + + return 0; +} + +static void TabsrmmButtonsModify(HANDLE hContact) +{ + if (!DirectoryExists(hContact)) + { + BBButton bbd = {0}; + bbd.cbSize = sizeof(BBButton); + bbd.dwButtonID = 0; + bbd.pszModuleName = MODULENAME; + bbd.bbbFlags = BBSF_DISABLED | BBSF_HIDDEN; + CallService(MS_BB_SETBUTTONSTATE, (WPARAM)hContact, (LPARAM)&bbd); + } +} + +static int ContactWindowOpen(WPARAM wparam,LPARAM lParam) +{ + MessageWindowEventData *MWeventdata = (MessageWindowEventData*)lParam; + + if(MWeventdata->uType == MSG_WINDOW_EVT_OPENING && MWeventdata->hContact) + { + TabsrmmButtonsModify(MWeventdata->hContact); + } + return 0; +} + +static int ContactSettingChanged( WPARAM wParam, LPARAM lParam ) +{ // NSN + DBCONTACTWRITESETTING *cws = ( DBCONTACTWRITESETTING* )lParam; + WORD newStatus = 0, oldStatus = 0; + DWORD dwStatuses = 0; + time_t tCurrentTime; + char *lpzProto; + + if ( ( HANDLE )wParam == NULL || lstrcmpA( cws->szSetting, "Status" )) + return 0; + + newStatus = cws->value.wVal; + oldStatus = DBGetContactSettingWord((HANDLE)wParam,"UserOnline","OldStatus2",ID_STATUS_OFFLINE ); + if (oldStatus == newStatus) + return 0; + + tCurrentTime = time( NULL ); + lpzProto = ( char* )CallService( MS_PROTO_GETCONTACTBASEPROTO, ( WPARAM )wParam, 0); + + // ignore chat rooms + if (DBGetContactSettingByte((HANDLE)wParam, lpzProto, "ChatRoom", 0)) + return 0; + + if (oldStatus == ID_STATUS_OFFLINE) + { + // set online timestamp for this contact, only when not set already + if (!DBGetContactSettingDword( ( HANDLE )wParam, lpzProto, "LogonTS", FALSE)) + DBWriteContactSettingDword( ( HANDLE )wParam, lpzProto, "LogonTS", ( DWORD )tCurrentTime); + + // TODO: dont reset logoff timestamp? + DBDeleteContactSetting( ( HANDLE )wParam, lpzProto, "LogoffTS"); + + // TESTING: updating user's details + if (DBGetContactSettingDword(NULL, VISPLG, "flags", vf_default) & VF_REFRESH) + { + // don't refresh Hidden or NotOnList contact's details + if (!DBGetContactSettingByte((HANDLE)wParam, "CList", "Hidden", 0) && !DBGetContactSettingByte((HANDLE)wParam, "CList", "NotOnList", 0)) + CallContactService( ( HANDLE )wParam, PSS_GETINFO, 0, 0 ); + } + } + if (newStatus == ID_STATUS_OFFLINE) + { + // set offline timestamp for this contact + DBWriteContactSettingDword( ( HANDLE )wParam, lpzProto, "LogoffTS", ( DWORD )tCurrentTime); + // reset logon timestamp + DBDeleteContactSetting( ( HANDLE )wParam, lpzProto, "LogonTS"); + + // set last status for this contact + DBWriteContactSettingDword( ( HANDLE )wParam, lpzProto, "LastStatus", ( DWORD )oldStatus); + } + DBWriteContactSettingWord( ( HANDLE )wParam, "UserOnline", "OldStatus2", newStatus); + + return 0; +} + +// called when all modules are loaded +static int PluginInit(WPARAM wparam,LPARAM lparam) +{ + int pos = 1000, i = 0; + + CLISTMENUITEM mi; + + IconsInit(); + + bMetaContacts = ServiceExists(MS_MC_GETMETACONTACT) != 0; + bMir_08 = ServiceExists(MS_PROTO_GETACCOUNT) != 0; + + hServices[0] = CreateServiceFunction(MS_SETINVIS,onSetInvis); + hServices[1] = CreateServiceFunction(MS_SETVIS,onSetVis); + hServices[2] = CreateServiceFunction(MS_HIDE,onHide); + hServices[3] = CreateServiceFunction(MS_IGNORE,onIgnore); + if (bMir_08) + hServices[4] = CreateServiceFunction(MS_PROTO,onChangeProto); + hServices[5] = CreateServiceFunction(MS_ADDED,onSendAdded); + hServices[6] = CreateServiceFunction(MS_AUTHREQ,onSendAuthRequest); + hServices[7] = CreateServiceFunction(MS_COPYID,onCopyID); + hServices[8] = CreateServiceFunction(MS_RECVFILES,onRecvFiles); + hServices[9] = CreateServiceFunction(MS_STATUSMSG,onCopyStatusMsg); + hServices[10] = CreateServiceFunction(MS_COPYIP,onCopyIP); + hServices[11] = CreateServiceFunction(MS_COPYMIRVER,onCopyMirVer); + + mi.cbSize = sizeof(CLISTMENUITEM); + mi.flags = CMIF_TCHAR; + mi.hIcon = NULL; + mi.pszContactOwner = NULL; + + mi.position = 120000; + mi.ptszName = LPGENT("Always visible"); + mi.pszService = MS_SETVIS; + hmenuVis = Menu_AddContactMenuItem(&mi); + + mi.position++; + mi.ptszName = LPGENT("Never visible"); + mi.pszService = MS_SETINVIS; + hmenuOff = Menu_AddContactMenuItem(&mi); + + mi.position++; + mi.ptszName = NULL; + mi.pszService = MS_HIDE; + hmenuHide = Menu_AddContactMenuItem(&mi); + + mi.position++; + mi.pszPopupName = (char*)-1; // for Miranda 0.7 + mi.ptszName = LPGENT("Ignore"); + mi.pszService = 0; + mi.flags |= CMIF_ROOTHANDLE; + mi.hIcon = (HICON)CallService( MS_SKIN2_GETICON, 0, (LPARAM)"miex_ignore" ); + hmenuIgnore = Menu_AddContactMenuItem(&mi); + + hIgnoreItem[0] = AddSubmenuItem(hmenuIgnore, ii[0].name, LoadSkinnedIcon(ii[0].icon), 0, MS_IGNORE, pos, ii[0].type ); + pos += 100000; // insert separator + for (i = 1; i < SIZEOF(ii); i++) + hIgnoreItem[i] = AddSubmenuItem(hmenuIgnore, ii[i].name, LoadSkinnedIcon(ii[i].icon), 0, MS_IGNORE, pos++, ii[i].type ); + + pos += 100000; // insert separator + ood.cbSize = sizeof(ood); + ood.pszGroup = "Events"; + ood.pszPage = "Ignore"; + AddSubmenuItem(hmenuIgnore, LPGENT("Open ignore settings"), (HICON)CallService( MS_SKIN2_GETICON, 0, (LPARAM)"miex_ignore"), 0, MS_OPT_OPENOPTIONS, pos, (int)&ood ); + + mi.pszPopupName = 0; + if (bMir_08) { + mi.position++; + mi.ptszName = LPGENT("Copy to Account"); + mi.pszService = MS_PROTO; + mi.hIcon = ( HICON )CallService( MS_SKIN2_GETICON, 0, (LPARAM)"miex_protocol"); + hmenuProto = Menu_AddContactMenuItem(&mi); + + EnumProtoSubmenu(0, 0); + } + + mi.flags = CMIF_TCHAR; + + mi.position++; + mi.ptszName = LPGENT("Send 'You were added'"); + mi.pszService = MS_ADDED; + mi.hIcon = ( HICON )CallService( MS_SKIN2_GETICON, 0, (LPARAM)"miex_added"); + hmenuAdded = Menu_AddContactMenuItem(&mi); + + mi.position++; + mi.ptszName = LPGENT("Request authorization"); + mi.pszService = MS_AUTHREQ; + mi.hIcon = ( HICON )CallService( MS_SKIN2_GETICON, 0, (LPARAM)"miex_authorization"); + hmenuAuthReq = Menu_AddContactMenuItem(&mi); + + mi.position++; + mi.ptszName = LPGENT("Copy ID"); + mi.pszService = MS_COPYID; + hmenuCopyID = Menu_AddContactMenuItem(&mi); + + mi.position++; + mi.ptszName = LPGENT("Browse Received Files"); + mi.pszService = MS_RECVFILES; + mi.hIcon = ( HICON )CallService( MS_SKIN2_GETICON, 0, (LPARAM)"miex_recfiles"); + hmenuRecvFiles = Menu_AddContactMenuItem(&mi); + + mi.position++; + mi.ptszName = LPGENT("Copy Status Message"); + mi.pszService = MS_STATUSMSG; + mi.hIcon = NULL;//LoadIcon(hinstance, MAKEINTRESOURCE(IDI_ICON5)); + hmenuStatusMsg = Menu_AddContactMenuItem(&mi); + + mi.position++; + mi.ptszName = LPGENT("Copy IP"); + mi.pszService = MS_COPYIP; + hmenuCopyIP = Menu_AddContactMenuItem(&mi); + + mi.position++; + mi.ptszName = LPGENT("Copy MirVer"); + mi.pszService = MS_COPYMIRVER; + hmenuCopyMirVer = Menu_AddContactMenuItem(&mi); + + hIcon[0] = ( HICON )CallService( MS_SKIN2_GETICON, 0, (LPARAM)"miex_copymver"); + hIcon[1] = ( HICON )CallService( MS_SKIN2_GETICON, 0, (LPARAM)"miex_vis"); + hIcon[2] = ( HICON )CallService( MS_SKIN2_GETICON, 0, (LPARAM)"miex_invis"); + hIcon[3] = MakeHalfAlphaIcon(hIcon[1]); + hIcon[4] = MakeHalfAlphaIcon(hIcon[2]); + + hHooks[0] = HookEvent(ME_CLIST_PREBUILDCONTACTMENU,BuildMenu); + hHooks[1] = HookEvent(ME_OPT_INITIALISE,OptionsInit); + hHooks[2] = HookEvent(ME_DB_CONTACT_SETTINGCHANGED,ContactSettingChanged); + if (bMir_08) + hHooks[3] = HookEvent(ME_PROTO_ACCLISTCHANGED, EnumProtoSubmenu); + hHooks[4] = HookEvent(ME_MSG_TOOLBARLOADED, TabsrmmButtonsInit); + if (hHooks[4]) + { + hHooks[5] = HookEvent(ME_MSG_BUTTONPRESSED, TabsrmmButtonPressed); + hHooks[6] = HookEvent(ME_MSG_WINDOWEVENT,ContactWindowOpen); + } + + return 0; +} + +extern "C" __declspec(dllexport) const MUUID MirandaInterfaces[] = {MIID_MENUEX, MIID_LAST}; + +extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) +{ + return &pluginInfoEx; +} + +extern "C" __declspec(dllexport) int Load(void) +{ + + mir_getLP(&pluginInfoEx); + hHooks[7] = HookEvent(ME_SYSTEM_MODULESLOADED,PluginInit); + return 0; +} + +extern "C" __declspec(dllexport) int Unload(void) +{ + int i; + for (i = 0; i < SIZEOF(hHooks); i++) + { + if (hHooks[i]) + UnhookEvent(hHooks[i]); + } + for (i = 0; i < SIZEOF(hServices); i++) + { + if (hServices[i]) + DestroyServiceFunction(hServices[i]); + } + + DestroyIcon( hIcon[3] ); + DestroyIcon( hIcon[4] ); + return 0; +} + +BOOL WINAPI DllMain(HINSTANCE hinst,DWORD fdwReason,LPVOID lpvReserved) +{ + hinstance = hinst; + return 1; +} \ No newline at end of file diff --git a/plugins/MenuItemEx/src/menuex.h b/plugins/MenuItemEx/src/menuex.h new file mode 100644 index 0000000000..5f6540827a --- /dev/null +++ b/plugins/MenuItemEx/src/menuex.h @@ -0,0 +1,73 @@ +#ifndef MENUEX_H__ +#define MENUEX_H__ + +#define _CRT_SECURE_NO_DEPRECATE +#define MIRANDA_VER 0x0A00 + +#include "m_stdhdr.h" +#include +#include "resource.h" +#include +#include "newpluginapi.h" +#include "win2k.h" +#include "time.h" +#include "m_system.h" +#include "m_utils.h" +#include "m_options.h" +#include "m_database.h" +#include "m_langpack.h" +#include "m_file.h" +#include "m_clist.h" +#include "m_protosvc.h" +#include "m_protomod.h" +#include "m_clui.h" +#include "m_ignore.h" +#include "m_icolib.h" +#include "m_skin.h" +#include "m_genmenu.h" +#include "m_popup.h" +#include "m_message.h" +#include "m_fingerprint.h" +#include "m_metacontacts.h" +#include "m_msg_buttonsbar.h" + +#pragma optimize("gsy",on) + +#define VISPLG "MenuItemEx" +#define MODULENAME VISPLG + +#define MIIM_STRING 0x00000040 + +extern PLUGININFOEX pluginInfoEx; + +int OptionsInit(WPARAM,LPARAM); + +#define MAX_PROTOS 32 +#define MAX_GROUPS 32 +#define MAX_IDLEN 16 + +#define VF_VS 0x00000001 +#define VF_SMNAME 0x00000002 +#define VF_HFL 0x00000004 +#define VF_IGN 0x00000008 +#define VF_PROTO 0x00000010 +#define VF_SHOWID 0x00000020 +#define VF_ADD 0x00000040 +#define VF_REQ 0x00000080 +#define VF_CID 0x00000100 +#define VF_RECV 0x00000200 +#define VF_STAT 0x00000400 +#define VF_CIDN 0x00000800 +#define VF_CIP 0x00001000 +#define VF_SAI 0x00002000 +#define VF_TRIMID 0x00004000 +#define VF_CMV 0x00008000 +#define VF_IGNH 0x00010000 +#define VF_REFRESH 0x00020000 + +#define CTRL_IS_PRESSED (GetAsyncKeyState(VK_CONTROL)&0x8000) + +extern const int vf_default; +extern BOOL bMir_08; + +#endif diff --git a/plugins/MenuItemEx/src/options.cpp b/plugins/MenuItemEx/src/options.cpp new file mode 100644 index 0000000000..0aa0bbb68b --- /dev/null +++ b/plugins/MenuItemEx/src/options.cpp @@ -0,0 +1,136 @@ +#include "menuex.h" + + +extern HINSTANCE hinstance; + +struct { + int idc; + int flag; +} +static const checkboxes[]={ + { IDC_COPYID, VF_CID }, + { IDC_STATUSMSG, VF_STAT }, + { IDC_COPYIP, VF_CIP }, + { IDC_COPYMIRVER, VF_CMV }, + { IDC_VIS, VF_VS }, + { IDC_SHOWALPHAICONS, VF_SAI }, + { IDC_HIDE, VF_HFL }, + { IDC_IGNORE, VF_IGN }, + { IDC_IGNOREHIDE, VF_IGNH }, + { IDC_PROTOS, VF_PROTO }, + { IDC_ADDED, VF_ADD }, + { IDC_AUTHREQ, VF_REQ }, + { IDC_SHOWID, VF_SHOWID }, + { IDC_COPYIDNAME, VF_CIDN }, + { IDC_RECVFILES, VF_RECV }, + { IDC_SMNAME, VF_SMNAME }, + { IDC_TRIMID, VF_TRIMID }, + { IDC_REFRESH_DETAILS, VF_REFRESH } +}; + +INT_PTR CALLBACK OptionsProc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam) +{ + DWORD flags=DBGetContactSettingDword(NULL,VISPLG,"flags",vf_default); + TCHAR buffer[64] = {0}; + int i; + + switch(msg) + { + case WM_INITDIALOG: + + TranslateDialogDefault(hdlg); + + for (i = 0; i < SIZEOF(checkboxes); i++) + { + CheckDlgButton(hdlg, checkboxes[i].idc, (flags & checkboxes[i].flag) ? BST_CHECKED : BST_UNCHECKED); + } + + if (ServiceExists(MS_POPUP_ADDPOPUP)) + { + for (i = 0; i < 4; i++) + { + GetDlgItemText(hdlg, checkboxes[i].idc, buffer, SIZEOF(buffer) - 3); + _tcscat(buffer, _T(" *")); + SetDlgItemText(hdlg, checkboxes[i].idc, buffer); + } + } + else + ShowWindow(GetDlgItem(hdlg, IDC_HINT1), SW_HIDE); + + if (!bMir_08) + EnableWindow(GetDlgItem(hdlg,IDC_PROTOS), 0); + + SendMessage(hdlg, WM_USER + 50, 0, 0); + return 0; + + case WM_USER+50: + + EnableWindow(GetDlgItem(hdlg,IDC_SHOWALPHAICONS), + IsDlgButtonChecked(hdlg,IDC_VIS) == BST_CHECKED); + EnableWindow(GetDlgItem(hdlg,IDC_IGNOREHIDE), + IsDlgButtonChecked(hdlg,IDC_IGNORE) == BST_CHECKED); + EnableWindow(GetDlgItem(hdlg,IDC_COPYIDNAME), + IsDlgButtonChecked(hdlg,IDC_COPYID) == BST_CHECKED); + EnableWindow(GetDlgItem(hdlg,IDC_SHOWID), + IsDlgButtonChecked(hdlg,IDC_COPYID) == BST_CHECKED); + EnableWindow(GetDlgItem(hdlg,IDC_TRIMID), + (IsDlgButtonChecked(hdlg,IDC_COPYID) == BST_CHECKED && IsDlgButtonChecked(hdlg,IDC_SHOWID) == BST_CHECKED)); + EnableWindow(GetDlgItem(hdlg,IDC_SMNAME), + IsDlgButtonChecked(hdlg,IDC_STATUSMSG) == BST_CHECKED); + return 1; + + case WM_NOTIFY: + switch(((LPNMHDR)lparam)->code){ + case PSN_APPLY: + { + DWORD mod_flags=0; + + for (i = 0; i < SIZEOF(checkboxes); i++) + { + mod_flags |= IsDlgButtonChecked(hdlg, checkboxes[i].idc) ? checkboxes[i].flag : 0; + } + + //DBDeleteContactSetting(NULL,VISPLG,"flags"); + DBWriteContactSettingDword(NULL,VISPLG,"flags",mod_flags); + + return 1; + } + } + break; + + case WM_COMMAND: + if(HIWORD(wparam)==BN_CLICKED && GetFocus()==(HWND)lparam) { + SendMessage(GetParent(hdlg),PSM_CHANGED,0,0); + if (LOWORD(wparam) == IDC_VIS || + LOWORD(wparam) == IDC_IGNORE || + LOWORD(wparam) == IDC_COPYID || + LOWORD(wparam) == IDC_STATUSMSG || + LOWORD(wparam) == IDC_SHOWID) { + + SendMessage(hdlg, WM_USER + 50, 0, 0); + } + } + return 0; + + case WM_CLOSE: + EndDialog(hdlg,0); + return 0; + } + return 0; +} + +int OptionsInit(WPARAM wparam,LPARAM lparam) +{ + OPTIONSDIALOGPAGE odp={0}; + odp.cbSize = sizeof(odp); + odp.position = 955000000; + odp.hInstance = hinstance; + odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTIONS); + odp.pszTitle = MODULENAME; + odp.pfnDlgProc = OptionsProc; + odp.pszGroup = LPGEN("Customize"); + odp.flags = ODPF_BOLDGROUPS; + Options_AddPage(wparam,&odp); + + return 0; +} diff --git a/plugins/MenuItemEx/src/resource.h b/plugins/MenuItemEx/src/resource.h new file mode 100644 index 0000000000..18b7de34cd --- /dev/null +++ b/plugins/MenuItemEx/src/resource.h @@ -0,0 +1,52 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by resource.rc +// +#define IDD_OPTIONS 101 +#define IDD_AUTHREQ 103 +#define IDI_ICON0 110 +#define IDI_ICON1 111 +#define IDI_ICON2 112 +#define IDI_ICON3 113 +#define IDI_ICON4 114 +#define IDI_ICON5 115 +#define IDI_ICON6 116 +#define IDI_ICON7 117 +#define IDI_ICON8 118 +#define IDI_ICON9 119 +#define IDI_ICON10 120 +#define IDI_ICON11 121 +#define IDI_ICON12 122 +#define IDI_ICON13 123 +#define IDC_VIS 1000 +#define IDC_REASON 1001 +#define IDC_HIDE 1002 +#define IDC_IGNORE 1003 +#define IDC_PROTOS 1004 +#define IDC_REFRESH_DETAILS 1005 +#define IDC_ADDED 1006 +#define IDC_AUTHREQ 1007 +#define IDC_COPYID 1008 +#define IDC_RECVFILES 1009 +#define IDC_STATUSMSG 1010 +#define IDC_COPYIDNAME 1011 +#define IDC_COPYIP 1012 +#define IDC_SHOWALPHAICONS 1013 +#define IDC_SMNAME 1014 +#define IDC_COPYMIRVER 1015 +#define IDC_HINT1 1016 +#define IDC_SHOWID 1017 +#define IDC_TRIMID 1018 +#define IDC_IGNOREHIDE 1019 +#define IDC_STATIC -1 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 124 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1017 +#define _APS_NEXT_SYMED_VALUE 125 +#endif +#endif diff --git a/plugins/MenuItemEx/src/version.h b/plugins/MenuItemEx/src/version.h new file mode 100644 index 0000000000..b98a1d6faf --- /dev/null +++ b/plugins/MenuItemEx/src/version.h @@ -0,0 +1,13 @@ +#define __FILEVERSION_STRING 1,3,0,9 +#define __VERSION_STRING "1.3.0.9" +#define __VERSION_DWORD 0x01030009 + +#define __PLUGIN_NAME "MenuItemEx" +#define __WEB "http://nightly.miranda.im" +#define __DESC "Adds some useful options to a contacts menu." +#define __AUTHORS "Heiko Schillinger, Baloo, Billy_Bons, Robert Posel" +#define __EMAIL "micron@nexgo.de, baloo@bk.ru, tatarinov.sergey@gmail.com, robyer@seznam.cz" +#define __COPYRIGHTS "© 2001-03 Heiko Schillinger, © 2006-08 Baloo, © 2009-10 Billy_Bons, © 2011-12 Robert Posel" + +// {b1902a52-9114-4d7e-ac2e-b3a52e01d574} +#define MIID_MENUEX {0xb1902a52, 0x9114, 0x4d7e, { 0xac, 0x2e, 0xb3, 0xa5, 0x2e, 0x01, 0xd5, 0x74 }} -- cgit v1.2.3