From cb4a46e7fbe62d788e66ed6121c717a2d22a4d7c Mon Sep 17 00:00:00 2001 From: watcherhd Date: Thu, 21 Apr 2011 14:14:52 +0000 Subject: svn.miranda.im is moving to a new home! git-svn-id: http://miranda-plugins.googlecode.com/svn/trunk@7 e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb --- popup/src/config.cpp | 356 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 356 insertions(+) create mode 100644 popup/src/config.cpp (limited to 'popup/src/config.cpp') diff --git a/popup/src/config.cpp b/popup/src/config.cpp new file mode 100644 index 0000000..b8ff1f5 --- /dev/null +++ b/popup/src/config.cpp @@ -0,0 +1,356 @@ +/* +Popup Plus plugin for Miranda IM + +Copyright © 2002 Luca Santarelli, + © 2004-2007 Victor Pavlychko + © 2010 MPK + © 2010 Merlin_de + +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. + +=============================================================================== + +File name : $HeadURL: http://svn.miranda.im/mainrepo/popup/trunk/src/config.cpp $ +Revision : $Revision: 1651 $ +Last change on : $Date: 2010-07-15 20:31:06 +0300 (Чт, 15 июл 2010) $ +Last change by : $Author: Merlin_de $ + +=============================================================================== +*/ + +#include "headers.h" + +//===== General Plugin ===== +HINSTANCE hInst; +HANDLE hMainThread; +//MNOTIFYLINK *notifyLink; //deprecatet +PLUGINLINK *pluginLink; +HANDLE hSemaphore; +BOOL closing = FALSE; +MM_INTERFACE mmi; +LIST_INTERFACE li; +UTF8_INTERFACE utfi; +MTEXT_INTERFACE MText = {0}; +HANDLE folderId; +BOOL gbPopupLoaded = FALSE; +BOOL gbHppInstalled = FALSE; +LPCSTR gszMetaProto = ""; + +//===== Brushes, Colours and Fonts ===== +HBITMAP hbmNoAvatar; + +//===== Options ===== +POPUPOPTIONS PopUpOptions; +//SKINELEMENT *skin; +//SKINELEMENT *w_skin; +//SKINELEMENT *n_skin; + + +//===== Plugin information ===== + +PLUGININFOEX pluginInfoEx = +{ + sizeof(PLUGININFOEX), + POPUP_DISPLAYNAME, + PLUGIN_MAKE_VERSION(__MAJOR_VERSION,__MINOR_VERSION,__RELEASE_NUM,__BUILD_NUM), + POPUP_DESCRIPTION, + POPUP_AUTHOR, + POPUP_EMAIL, + POPUP_COPYRIGHT, + POPUP_WEBPAGE, + 0, + 0, + POPUP_UUID +}; + +PLUGININFO pluginInfo = +{ + sizeof(PLUGININFO), + pluginInfoEx.shortName, + pluginInfoEx.version, + pluginInfoEx.description, + pluginInfoEx.author, + pluginInfoEx.authorEmail, + pluginInfoEx.copyright, + pluginInfoEx.homepage, + pluginInfoEx.flags, + pluginInfoEx.replacesDefaultModule +}; + +// MLU layer for ansi release +#if !defined(_UNICODE) +BOOL (WINAPI *MySetLayeredWindowAttributes)(HWND,COLORREF,BYTE,DWORD); +BOOL (WINAPI *MyAnimateWindow)(HWND hWnd,DWORD dwTime,DWORD dwFlags); +BOOL (WINAPI *MyGetMonitorInfo)(HMONITOR hMonitor, LPMONITORINFO lpmi); +BOOL (WINAPI *MyUpdateLayeredWindow) + (HWND hwnd, HDC hdcDST, POINT *pptDst, SIZE *psize, HDC hdcSrc, POINT *pptSrc, + COLORREF crKey, BLENDFUNCTION *pblend, DWORD dwFlags); +HMONITOR (WINAPI *MyMonitorFromWindow)(HWND hWnd, DWORD dwFlags); +BOOL (WINAPI *MyTransparentBlt)(HDC, int, int, int, int, HDC, int, int, int, int, UINT); +BOOL (WINAPI *MyAlphaBlend)(HDC, int, int, int, int, HDC, int, int, int, int, BLENDFUNCTION); + +// gdi32.dll +BOOL (WINAPI *MyGetTextExtentPoint32W)(HDC, LPCWSTR, int, LPSIZE); + +//user32.dll +int (WINAPI *MyDrawTextW)(HDC, LPCWSTR, int, LPRECT, UINT); +int (WINAPI *MyDrawTextExW)(HDC, LPCWSTR, int, LPRECT, UINT, LPDRAWTEXTPARAMS); +BOOL (WINAPI *MySetWindowTextW)(HWND, LPCWSTR); +LRESULT (WINAPI *MySendMessageW)(HWND, UINT, WPARAM, LPARAM); +LRESULT (WINAPI *MyCallWindowProcW)(WNDPROC, HWND, UINT, WPARAM, LPARAM); +HWND (WINAPI *MyCreateWindowExW)(DWORD, LPCWSTR, LPCWSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID); + +#endif + +HRESULT (WINAPI *MyDwmEnableBlurBehindWindow)(HWND hWnd, DWM_BLURBEHIND *pBlurBehind); + +//====== Common Vars ======================== + +static int NukePopupSettings(const char* szModul); +static INT_PTR __stdcall DlgProcPopupWelcome(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) + { + case WM_INITDIALOG: + { + TranslateDialogDefault(hwnd); + + LOGFONT lf; + GetObject((HFONT)SendMessage(GetDlgItem(hwnd, IDC_TITLE), WM_GETFONT, 0, 0), sizeof(lf), &lf); + lf.lfWeight = FW_BOLD; + lf.lfHeight *= 1.8; + SendMessage(GetDlgItem(hwnd, IDC_TITLE), WM_SETFONT, (WPARAM)CreateFontIndirect(&lf), TRUE); + + GetObject((HFONT)SendMessage(GetDlgItem(hwnd, IDC_VERSION), WM_GETFONT, 0, 0), sizeof(lf), &lf); + lf.lfHeight *= 1.3; + SendMessage(GetDlgItem(hwnd, IDC_VERSION), WM_SETFONT, (WPARAM)CreateFontIndirect(&lf), TRUE); + SetWindowText(GetDlgItem(hwnd, IDC_VERSION), _T(__VERSION_STRING_DOT)); + + HRSRC hRes = FindResource(hInst, MAKEINTRESOURCE(IDR_WHATSNEW), _T("TEXT")); + DWORD ResSize = SizeofResource(hInst,hRes); + HRSRC hResLoad = (HRSRC)LoadResource(hInst, hRes); + char *lpResLock = (char *)LockResource(hResLoad); +// lpResLock [ResSize] = 0; + TCHAR* ptszMsg = mir_a2t(lpResLock); + SetWindowText(GetDlgItem(hwnd, IDC_WHATSNEW), ptszMsg); + mir_free(ptszMsg); + UnlockResource(lpResLock); + FreeResource(hRes); + CheckDlgButton(hwnd, IDC_NONEWS, DBGetContactSettingByte(NULL, MODULNAME, "NeverShowNews", 0)); + + return TRUE; + } + case WM_CTLCOLORSTATIC: + { + if (GetWindowLongPtr((HWND)lParam, GWLP_ID) != IDC_NONEWS) + return (INT_PTR)GetStockObject(WHITE_BRUSH); + break; + } + case WM_COMMAND: + { + switch (LOWORD(wParam)) // control id + { + case ID_OK: + { + DBWriteContactSettingByte(NULL, MODULNAME, "NeverShowNews", IsDlgButtonChecked(hwnd, IDC_NONEWS)?1:0); + SendMessage(hwnd, WM_CLOSE, 0, 0); + return TRUE; + } + case IDC_RESET: + { + if (MessageBox(hwnd, TranslateT("Do you really want to reset Popup Plus settings?"), _T(MODULNAME_LONG), MB_ICONWARNING|MB_YESNO) == IDYES) + { + NukePopupSettings(MODULNAME); + OptionLoaded = false; + LoadOptions(); + } + return TRUE; + } + } + break; + } + case WM_CLOSE: + { + DestroyWindow(hwnd); + return TRUE; + } + } + return FALSE; +} + +// common funcs +void LoadOptions() { + ZeroMemory(&PopUpOptions, sizeof(PopUpOptions)); + #if defined(_DEBUG) + PopUpOptions.debug = DBGetContactSettingByte(NULL, MODULNAME, "debug", FALSE); + #endif + DWORD prevVersion = DBGetContactSettingDword(NULL, MODULNAME, "PopupPlusVersion", 0); + if ( (prevVersion < pluginInfo.version) && + !PopUpOptions.debug && + !DBGetContactSettingByte(NULL, MODULNAME, "NeverShowNews", 0) + ) { + HWND hwnd = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_WELCOME), NULL, DlgProcPopupWelcome, prevVersion); + RECT rc, rcDesk; + GetWindowRect(hwnd, &rc); + SystemParametersInfo(SPI_GETWORKAREA, 0, &rcDesk, 0); + SetWindowPos(hwnd, HWND_TOP, + rcDesk.left + (rcDesk.right - rcDesk.left - (rc.right - rc.left)) / 2, + rcDesk.top + (rcDesk.bottom - rcDesk.top - (rc.bottom - rc.top)) / 2, + rc.right - rc.left, + rc.bottom - rc.top, + SWP_SHOWWINDOW); + ShowWindow(hwnd, SW_SHOWNORMAL); + } + DBWriteContactSettingDword(NULL, MODULNAME, "PopupPlusVersion", pluginInfo.version); + + //Load PopUp Options + if(!OptionLoaded){ + LoadOption_General(); + LoadOption_Skins(); + LoadOption_Actions(); + LoadOption_AdvOpts(); + LoadOption_OldOpts(); + } + Check_ReorderPopUps(); + OptionLoaded = true; + return; +} + +void PopUpPreview() +{ + TCHAR *lptzTitle1Eng = TranslateT("The Jabberwocky"); + TCHAR *lptzText1Eng = TranslateTS( + _T("`Twas brillig, and the slithy toves\r\n") + _T("Did gyre and gimble in the wabe:\r\n") + _T("All mimsy were the borogoves,\r\n") + _T("And the mome raths outgrabe.\r\n") + _T("\t[b][i]Lewis Carroll, 1855[/i][/b]") + ); + + TCHAR *lptzTitle2 = TranslateT("Test preview for the popup plugin settings. This is supposed to be long enough not to fit in one line..."); + TCHAR *lptzText2 = TranslateTS( + _T("This is a special test preview for the popup ") + _T("plugin settings. The text and title are quite ") + _T("long so you can tweak your skin and plugin ") + _T("settings to best fit your needs :)") + ); + + POPUPDATA2 ppd = {0}; + + ZeroMemory(&ppd, sizeof(ppd)); + ppd.cbSize = sizeof(ppd); + ppd.flags = PU2_TCHAR; + +#if defined(_DEBUG) + // test per-contact popups + for (HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0); hContact; + hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0)) + { + if (DBGetContactSettingDword(hContact, "ICQ", "UIN", 0) == 256771455) + { + ppd.lchContact = hContact; + break; + } + } +#endif + ppd.lptzTitle = lptzTitle1Eng; + ppd.lptzText = lptzText1Eng; + ppd.lchIcon = LoadSkinnedIcon(SKINICON_EVENT_MESSAGE); + CallService(MS_POPUP_ADDPOPUP2, (WPARAM)&ppd, APF_NO_HISTORY); + if (PopUpOptions.UseAnimations || PopUpOptions.UseEffect) Sleep((ANIM_TIME*2)/3); //Pause + + ZeroMemory(&ppd, sizeof(ppd)); + ppd.cbSize = sizeof(ppd); + ppd.flags = PU2_TCHAR; + ppd.lptzTitle = lptzTitle2; + ppd.lptzText = lptzText2; + ppd.lchIcon = LoadSkinnedIcon(SKINICON_OTHER_MIRANDA); + ppd.hbmAvatar = hbmNoAvatar; +#if defined(_DEBUG) +//remove testactions + POPUPACTION actions[3]; + actions[0].cbSize = sizeof(POPUPACTION); + actions[0].flags = PAF_ENABLED; + lstrcpyA(actions[0].lpzTitle, "Popup Plus/Test action"); + actions[0].lchIcon = IcoLib_GetIcon(ICO_POPUP_ON,0); + actions[0].wParam = actions[0].lParam = -1; + + actions[1].cbSize = sizeof(POPUPACTION); + actions[1].flags = PAF_ENABLED; + lstrcpyA(actions[1].lpzTitle, "Popup Plus/Second test action"); + actions[1].lchIcon = IcoLib_GetIcon(ICO_ACT_CLOSE,0); + actions[1].wParam = actions[1].lParam = -1; + + actions[2].cbSize = sizeof(POPUPACTION); + actions[2].flags = PAF_ENABLED; + lstrcpyA(actions[2].lpzTitle, "Popup Plus/One more action"); + actions[2].lchIcon = LoadSkinnedIcon(SKINICON_OTHER_MIRANDA); + actions[2].wParam = actions[2].lParam = -1; + + ppd.lpActions = actions; + ppd.actionCount = SIZEOF(actions); +#endif + CallService(MS_POPUP_ADDPOPUP2, (WPARAM)&ppd, APF_NO_HISTORY); + if (PopUpOptions.UseAnimations || PopUpOptions.UseEffect) Sleep((ANIM_TIME*2)/3); //Pause + + PUShowMessageT(TranslateT("This is a notification message"), (DWORD)SM_NOTIFY|0x80000000); + if (PopUpOptions.UseAnimations || PopUpOptions.UseEffect) Sleep((ANIM_TIME*2)/3); //Pause + + PUShowMessageT(TranslateT("This is a warning message"), (DWORD)SM_WARNING|0x80000000); + if (PopUpOptions.UseAnimations || PopUpOptions.UseEffect) Sleep((ANIM_TIME*2)/3); //Pause + + PUShowMessageT(TranslateT("This is an error message"), (DWORD)SM_ERROR|0x80000000); +} + +// nuke settings: +struct NukeSettingsList +{ + char *name; + NukeSettingsList *next; +} *setting_items = NULL; + +int SettingsEnumProc(const char *szSetting, LPARAM lParam) +{ + NukeSettingsList *newItem = (NukeSettingsList *)mir_alloc(sizeof(NukeSettingsList)); + newItem->name = mir_strdup(szSetting); + newItem->next = setting_items; + setting_items = newItem; + return 0; +} + +static int NukePopupSettings(const char* szModul) +{ + DBCONTACTENUMSETTINGS dbces; + setting_items = 0; + dbces.pfnEnumProc = SettingsEnumProc; + dbces.szModule = szModul; + CallService(MS_DB_CONTACT_ENUMSETTINGS, 0, (LPARAM)(DBCONTACTENUMSETTINGS*)&dbces); + while (setting_items) + { + NukeSettingsList *next = setting_items->next; + + DBCONTACTGETSETTING dbcgs; + dbcgs.szModule = szModul; + dbcgs.szSetting = setting_items->name; + CallService(MS_DB_CONTACT_DELETESETTING, 0, (LPARAM)&dbcgs); + + mir_free(setting_items->name); + mir_free(setting_items); + setting_items = next; + } + DBWriteContactSettingDword(NULL, MODULNAME, "PopupPlusVersion", pluginInfo.version); + + return 0; +} -- cgit v1.2.3