From 18e0b1e1b7e216e13c58d863510af4a25df1fee1 Mon Sep 17 00:00:00 2001 From: Vadim Dashevskiy Date: Mon, 23 Jul 2012 09:46:45 +0000 Subject: HistorySweeperLight, MyDetails, NewEventNotify: changed folder structure git-svn-id: http://svn.miranda-ng.org/main/trunk@1112 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/HistorySweeperLight/act1.ico | Bin 1150 -> 0 bytes plugins/HistorySweeperLight/act2.ico | Bin 1150 -> 0 bytes plugins/HistorySweeperLight/actDel.ico | Bin 1150 -> 0 bytes plugins/HistorySweeperLight/actG.ico | Bin 1150 -> 0 bytes .../docs/historysweeperlight-translation.txt | 14 + .../historysweeperlight-translation.txt | 14 - .../HistorySweeperLight/historysweeperlight.cpp | 248 -- plugins/HistorySweeperLight/historysweeperlight.h | 71 - plugins/HistorySweeperLight/historysweeperlight.rc | 83 - .../historysweeperlight_10.vcxproj | 26 +- .../historysweeperlight_10.vcxproj.filters | 14 +- plugins/HistorySweeperLight/main.cpp | 179 -- plugins/HistorySweeperLight/options.cpp | 354 --- plugins/HistorySweeperLight/res/act1.ico | Bin 0 -> 1150 bytes plugins/HistorySweeperLight/res/act2.ico | Bin 0 -> 1150 bytes plugins/HistorySweeperLight/res/actDel.ico | Bin 0 -> 1150 bytes plugins/HistorySweeperLight/res/actG.ico | Bin 0 -> 1150 bytes .../HistorySweeperLight/res/historysweeperlight.rc | 83 + plugins/HistorySweeperLight/resource.h | 18 - .../src/historysweeperlight.cpp | 248 ++ .../HistorySweeperLight/src/historysweeperlight.h | 71 + plugins/HistorySweeperLight/src/main.cpp | 179 ++ plugins/HistorySweeperLight/src/options.cpp | 354 +++ plugins/HistorySweeperLight/src/resource.h | 18 + plugins/HistorySweeperLight/src/version.h | 23 + plugins/HistorySweeperLight/version.h | 23 - plugins/MyDetails/commons.h | 109 - plugins/MyDetails/data.cpp | 689 ----- plugins/MyDetails/data.h | 163 -- plugins/MyDetails/frame.cpp | 2757 -------------------- plugins/MyDetails/frame.h | 38 - plugins/MyDetails/mydetails.cpp | 737 ------ plugins/MyDetails/mydetails.vcxproj | 34 +- plugins/MyDetails/mydetails.vcxproj.filters | 18 +- plugins/MyDetails/options.cpp | 160 -- plugins/MyDetails/options.h | 79 - plugins/MyDetails/res/resource.rc | 353 +++ plugins/MyDetails/resource.h | 71 - plugins/MyDetails/resource.rc | 356 --- plugins/MyDetails/src/commons.h | 109 + plugins/MyDetails/src/data.cpp | 689 +++++ plugins/MyDetails/src/data.h | 163 ++ plugins/MyDetails/src/frame.cpp | 2757 ++++++++++++++++++++ plugins/MyDetails/src/frame.h | 38 + plugins/MyDetails/src/mydetails.cpp | 737 ++++++ plugins/MyDetails/src/options.cpp | 160 ++ plugins/MyDetails/src/options.h | 79 + plugins/MyDetails/src/resource.h | 71 + plugins/NewEventNotify/!changelog.txt | 27 - plugins/NewEventNotify/docs/!changelog.txt | 27 + .../docs/neweventnotify-translation.txt | 56 + plugins/NewEventNotify/main.cpp | 268 -- plugins/NewEventNotify/menuitem.cpp | 72 - .../NewEventNotify/neweventnotify-translation.txt | 56 - plugins/NewEventNotify/neweventnotify.h | 234 -- plugins/NewEventNotify/neweventnotify.vcxproj | 26 +- .../NewEventNotify/neweventnotify.vcxproj.filters | 22 +- plugins/NewEventNotify/options.cpp | 332 --- plugins/NewEventNotify/popup.cpp | 614 ----- plugins/NewEventNotify/res/resource.rc | 198 ++ plugins/NewEventNotify/resource.h | 75 - plugins/NewEventNotify/resource.rc | 198 -- plugins/NewEventNotify/src/main.cpp | 268 ++ plugins/NewEventNotify/src/menuitem.cpp | 72 + plugins/NewEventNotify/src/neweventnotify.h | 234 ++ plugins/NewEventNotify/src/options.cpp | 332 +++ plugins/NewEventNotify/src/popup.cpp | 614 +++++ plugins/NewEventNotify/src/resource.h | 75 + 68 files changed, 8084 insertions(+), 8103 deletions(-) delete mode 100644 plugins/HistorySweeperLight/act1.ico delete mode 100644 plugins/HistorySweeperLight/act2.ico delete mode 100644 plugins/HistorySweeperLight/actDel.ico delete mode 100644 plugins/HistorySweeperLight/actG.ico create mode 100644 plugins/HistorySweeperLight/docs/historysweeperlight-translation.txt delete mode 100644 plugins/HistorySweeperLight/historysweeperlight-translation.txt delete mode 100644 plugins/HistorySweeperLight/historysweeperlight.cpp delete mode 100644 plugins/HistorySweeperLight/historysweeperlight.h delete mode 100644 plugins/HistorySweeperLight/historysweeperlight.rc delete mode 100644 plugins/HistorySweeperLight/main.cpp delete mode 100644 plugins/HistorySweeperLight/options.cpp create mode 100644 plugins/HistorySweeperLight/res/act1.ico create mode 100644 plugins/HistorySweeperLight/res/act2.ico create mode 100644 plugins/HistorySweeperLight/res/actDel.ico create mode 100644 plugins/HistorySweeperLight/res/actG.ico create mode 100644 plugins/HistorySweeperLight/res/historysweeperlight.rc delete mode 100644 plugins/HistorySweeperLight/resource.h create mode 100644 plugins/HistorySweeperLight/src/historysweeperlight.cpp create mode 100644 plugins/HistorySweeperLight/src/historysweeperlight.h create mode 100644 plugins/HistorySweeperLight/src/main.cpp create mode 100644 plugins/HistorySweeperLight/src/options.cpp create mode 100644 plugins/HistorySweeperLight/src/resource.h create mode 100644 plugins/HistorySweeperLight/src/version.h delete mode 100644 plugins/HistorySweeperLight/version.h delete mode 100644 plugins/MyDetails/commons.h delete mode 100644 plugins/MyDetails/data.cpp delete mode 100644 plugins/MyDetails/data.h delete mode 100644 plugins/MyDetails/frame.cpp delete mode 100644 plugins/MyDetails/frame.h delete mode 100644 plugins/MyDetails/mydetails.cpp delete mode 100644 plugins/MyDetails/options.cpp delete mode 100644 plugins/MyDetails/options.h create mode 100644 plugins/MyDetails/res/resource.rc delete mode 100644 plugins/MyDetails/resource.h delete mode 100644 plugins/MyDetails/resource.rc create mode 100644 plugins/MyDetails/src/commons.h create mode 100644 plugins/MyDetails/src/data.cpp create mode 100644 plugins/MyDetails/src/data.h create mode 100644 plugins/MyDetails/src/frame.cpp create mode 100644 plugins/MyDetails/src/frame.h create mode 100644 plugins/MyDetails/src/mydetails.cpp create mode 100644 plugins/MyDetails/src/options.cpp create mode 100644 plugins/MyDetails/src/options.h create mode 100644 plugins/MyDetails/src/resource.h delete mode 100644 plugins/NewEventNotify/!changelog.txt create mode 100644 plugins/NewEventNotify/docs/!changelog.txt create mode 100644 plugins/NewEventNotify/docs/neweventnotify-translation.txt delete mode 100644 plugins/NewEventNotify/main.cpp delete mode 100644 plugins/NewEventNotify/menuitem.cpp delete mode 100644 plugins/NewEventNotify/neweventnotify-translation.txt delete mode 100644 plugins/NewEventNotify/neweventnotify.h delete mode 100644 plugins/NewEventNotify/options.cpp delete mode 100644 plugins/NewEventNotify/popup.cpp create mode 100644 plugins/NewEventNotify/res/resource.rc delete mode 100644 plugins/NewEventNotify/resource.h delete mode 100644 plugins/NewEventNotify/resource.rc create mode 100644 plugins/NewEventNotify/src/main.cpp create mode 100644 plugins/NewEventNotify/src/menuitem.cpp create mode 100644 plugins/NewEventNotify/src/neweventnotify.h create mode 100644 plugins/NewEventNotify/src/options.cpp create mode 100644 plugins/NewEventNotify/src/popup.cpp create mode 100644 plugins/NewEventNotify/src/resource.h (limited to 'plugins') diff --git a/plugins/HistorySweeperLight/act1.ico b/plugins/HistorySweeperLight/act1.ico deleted file mode 100644 index 0557c177a1..0000000000 Binary files a/plugins/HistorySweeperLight/act1.ico and /dev/null differ diff --git a/plugins/HistorySweeperLight/act2.ico b/plugins/HistorySweeperLight/act2.ico deleted file mode 100644 index 957572de2b..0000000000 Binary files a/plugins/HistorySweeperLight/act2.ico and /dev/null differ diff --git a/plugins/HistorySweeperLight/actDel.ico b/plugins/HistorySweeperLight/actDel.ico deleted file mode 100644 index 748ab4b65e..0000000000 Binary files a/plugins/HistorySweeperLight/actDel.ico and /dev/null differ diff --git a/plugins/HistorySweeperLight/actG.ico b/plugins/HistorySweeperLight/actG.ico deleted file mode 100644 index 1273d332ae..0000000000 Binary files a/plugins/HistorySweeperLight/actG.ico and /dev/null differ diff --git a/plugins/HistorySweeperLight/docs/historysweeperlight-translation.txt b/plugins/HistorySweeperLight/docs/historysweeperlight-translation.txt new file mode 100644 index 0000000000..5601d12f3b --- /dev/null +++ b/plugins/HistorySweeperLight/docs/historysweeperlight-translation.txt @@ -0,0 +1,14 @@ +; Common strings that belong to many files +;[Delete all events] +;[Keep all events] + +; ../../plugins/HistorySweeperLight/historysweeperlight.rc +;[Action 1] +;[Action 2] +;[History Sweeper Light] +;[Sweep history for this contacts:] + +; ../../plugins/HistorySweeperLight/options.cpp +;[*** Defaut Action ***] +;[*** System History ***] +;[History] diff --git a/plugins/HistorySweeperLight/historysweeperlight-translation.txt b/plugins/HistorySweeperLight/historysweeperlight-translation.txt deleted file mode 100644 index 5601d12f3b..0000000000 --- a/plugins/HistorySweeperLight/historysweeperlight-translation.txt +++ /dev/null @@ -1,14 +0,0 @@ -; Common strings that belong to many files -;[Delete all events] -;[Keep all events] - -; ../../plugins/HistorySweeperLight/historysweeperlight.rc -;[Action 1] -;[Action 2] -;[History Sweeper Light] -;[Sweep history for this contacts:] - -; ../../plugins/HistorySweeperLight/options.cpp -;[*** Defaut Action ***] -;[*** System History ***] -;[History] diff --git a/plugins/HistorySweeperLight/historysweeperlight.cpp b/plugins/HistorySweeperLight/historysweeperlight.cpp deleted file mode 100644 index 50e37ddc34..0000000000 --- a/plugins/HistorySweeperLight/historysweeperlight.cpp +++ /dev/null @@ -1,248 +0,0 @@ -/* -Miranda IM History Sweeper Light plugin -Copyright (C) 2002-2003 Sergey V. Gershovich -Copyright (C) 2006-2009 Boris Krasnovskiy -Copyright (C) 2010, 2011 tico-tico - -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 "historysweeperlight.h" - -typedef struct -{ - time_t time; - int keep; -} CriteriaStruct; - -// build criteria -time_t BuildCriteria(int dwti) -{ - time_t tim = time(NULL); - - switch (dwti) - { - case 0: - tim -= 1 * 24 * 3600; - break; - case 1: - tim -= 3 * 24 * 3600; - break; - case 2: - tim -= 7 * 24 * 3600; - break; - case 3: - tim -= 14 * 24 * 3600; - break; - case 4: - tim -= 30 * 24 * 3600; - break; - case 5: - tim -= 90 * 24 * 3600; - break; - case 6: - tim -= 180 * 24 * 3600; - break; - default: - tim -= 365 * 24 * 3600; - } - return tim; -} - -// keep criteria -int KeepCriteria(int dwti) -{ - switch (dwti) - { - case 0: - return 1; - case 1: - return 2; - case 2: - return 5; - case 3: - return 10; - case 4: - return 20; - default: - return 50; - } -} - -typedef struct -{ - HANDLE hDBEvent; - DWORD CRC32; - DWORD Timestamp; -} BEventData; - -static int CompareBookmarks( const void* p1, const void* p2 ) -{ - return (BYTE*)((BEventData*)p1)->hDBEvent - (BYTE*)((BEventData*)p2)->hDBEvent; -} - -static void GetBookmarks(HANDLE hContact, BEventData** books, size_t* bookcnt ) -{ - DBVARIANT dbv; - DBCONTACTGETSETTING cgs; - - *books = NULL; - *bookcnt = 0; - - cgs.szModule = "HistoryPlusPlus"; - cgs.szSetting = "Bookmarks"; - cgs.pValue = &dbv; - if (CallService(MS_DB_CONTACT_GETSETTING, (WPARAM)hContact, (LPARAM)&cgs) == 0) - { - if (dbv.cpbVal > 2 && *(WORD*)dbv.pbVal >= sizeof(BEventData)) - { - size_t recSize = *(WORD*)dbv.pbVal; - size_t numb = (dbv.cpbVal - sizeof(WORD)) / recSize; - - BEventData* tbooks = (BEventData*)mir_alloc(sizeof(BEventData)*numb); - size_t tbookcnt = 0; - - size_t i; - BYTE* evs = dbv.pbVal + sizeof(WORD); - - for (i=0; i --eventsCnt)) break; - - doDelete = TRUE; - - if (!(dbei.flags & (DBEF_SENT | DBEF_READ)) && keepUnread) doDelete = FALSE; // keep unread events - - if (bookcnt != 0) // keep bookmarks - { - ev.hDBEvent = hDBEvent; - item = (BEventData*)bsearch( &ev, books, bookcnt, sizeof(BEventData), CompareBookmarks); - if (item != NULL) - if (item->Timestamp == dbei.timestamp) - { - doDelete = FALSE; - btshift = (--bookcnt - (item - books))*sizeof(BEventData); - if (btshift) memmove(item, item+1, btshift); - } - } - - // find next event - hDBEventNext = (HANDLE)CallService(MS_DB_EVENT_FINDNEXT, (WPARAM)hDBEvent, 0); - - if (doDelete) CallService(MS_DB_EVENT_DELETE, (WPARAM)hContact, (LPARAM)hDBEvent); - - hDBEvent = hDBEventNext; - } // while (hDBEvent != NULL) - - mir_free(books); - - // switch ON safety mode as fast as we can to avoid DB corruption - if (unsafe) CallService(MS_DB_SETSAFETYMODE, 1, 0); - - SetCursor(LoadCursor(0, IDC_ARROW)); - } // if (eventsCnt != 0) -} - -// shutdown action -void ShutdownAction(void) -{ - CriteriaStruct Criteria; - HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0); - - Criteria.keep = KeepCriteria(DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownKeep", 0)); - Criteria.time = BuildCriteria(DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownOlder", 0)); - - SweepHistoryFromContact(NULL, Criteria, FALSE); // sweep system history, keepunread==0 - - while ( hContact != NULL ) - { - SweepHistoryFromContact(hContact, Criteria, TRUE); // sweep contact history, keepunread==1 - - hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0); // go to next contact - } -} - -int OnWindowEvent(WPARAM wParam, LPARAM lParam) -{ - MessageWindowEventData* msgEvData = (MessageWindowEventData*)lParam; - - if (msgEvData->uType == MSG_WINDOW_EVT_CLOSE && DBGetContactSettingByte(NULL, ModuleName, "SweepOnClose", 0)) - { - CriteriaStruct Criteria; - - Criteria.keep = KeepCriteria(DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownKeep", 0)); - Criteria.time = BuildCriteria(DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownOlder", 0)); - - SweepHistoryFromContact(msgEvData->hContact, Criteria, TRUE); - } - - return 0; -} \ No newline at end of file diff --git a/plugins/HistorySweeperLight/historysweeperlight.h b/plugins/HistorySweeperLight/historysweeperlight.h deleted file mode 100644 index c7fbeaeb25..0000000000 --- a/plugins/HistorySweeperLight/historysweeperlight.h +++ /dev/null @@ -1,71 +0,0 @@ -/* -Miranda IM History Sweeper Light plugin -Copyright (C) 2002-2003 Sergey V. Gershovich -Copyright (C) 2006-2009 Boris Krasnovskiy -Copyright (C) 2010, 2011 tico-tico - -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. -*/ -#ifndef __HISTORYSWEEPERLIGHT_H__ -#define __HISTORYSWEEPERLIGHT_H__ - -#define MIRANDA_VER 0x0A00 - -#if !defined( _WIN64 ) - #define _USE_32BIT_TIME_T -#endif - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "resource.h" - -// Plugin name -#define ModuleName "History Sweeper Light" - -// Plugin UUID for New plugin loader -// req. 0.7.18+ core -// {1D9BF74A-44A8-4b3f-A6E5-73069D3A8979} -#define MIID_HISTORYSWEEPERLIGHT { 0x1d9bf74a, 0x44a8, 0x4b3f, { 0xa6, 0xe5, 0x73, 0x6, 0x9d, 0x3a, 0x89, 0x79 } } - -// main.c -extern HINSTANCE hInst; - -// options.c -extern const char* time_stamp_strings[]; -extern const char* keep_strings[]; -int HSOptInitialise(WPARAM wParam, LPARAM lParam); -void InitIcons(void); -void ReleaseIconEx(const char* name); -HICON LoadIconEx(const char* name); -HANDLE GetIconHandle(const char* name); - -// historysweeper.c -void ShutdownAction(void); -int OnWindowEvent(WPARAM wParam, LPARAM lParam); - -#endif diff --git a/plugins/HistorySweeperLight/historysweeperlight.rc b/plugins/HistorySweeperLight/historysweeperlight.rc deleted file mode 100644 index 31129587ca..0000000000 --- a/plugins/HistorySweeperLight/historysweeperlight.rc +++ /dev/null @@ -1,83 +0,0 @@ -// Generated by ResEdit 1.4.13 -// Copyright (C) 2006-2010 -// http://www.resedit.net - -#include -#include "resource.h" -#include "version.h" - - - -// -// Dialog resources -// -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -IDD_OPT_HISTORYSWEEPER DIALOGEX 0, 0, 313, 240 -STYLE DS_SHELLFONT | WS_VISIBLE | WS_CHILDWINDOW -EXSTYLE WS_EX_CONTROLPARENT -FONT 8, "MS Shell Dlg", 0, 0, 1 -{ - GROUPBOX "History Sweeper Light", IDC_STATIC, 0, 0, 313, 240 - LTEXT "Sweep history for this contacts:", IDC_STATIC, 8, 12, 296, 10 - CONTROL "", IDC_LIST, "CListControl", 0x500101D2, 8, 22, 297, 139, 0x00000200 - ICON "", IDC_ACT1, 8, 164, 21, 20, SS_ICON - LTEXT "Action 1", IDC_STATIC, 22, 164, 118, 10 - COMBOBOX IDC_SSOLDER, 8, 177, 140, 70, WS_TABSTOP | WS_VSCROLL | WS_TABSTOP | CBS_DROPDOWNLIST - ICON "", IDC_ACT2, 165, 164, 21, 20, SS_ICON - LTEXT "Action 2", IDC_STATIC, 179, 164, 118, 10 - COMBOBOX IDC_SSKEEP, 165, 177, 140, 70, WS_TABSTOP | WS_VSCROLL | WS_TABSTOP | CBS_DROPDOWNLIST - AUTOCHECKBOX "Sweep on closing message window", IDC_SWEEPONCLOSE, 8, 197, 294, 10 - AUTOCHECKBOX "Clicking on the icon in the status bar will change settings", IDC_HISTMW, 8, 211, 294, 10 - AUTOCHECKBOX "Use UNSAFE mode (sweep fastest as possible, but dangerous for DB)", IDC_UNSAFEMODE, 8, 225, 294, 10 -} - - - -// -// Icon resources -// -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -IDI_ACT1 ICON "act1.ico" - - -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -IDI_ACT2 ICON "act2.ico" - - -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -IDI_ACTG ICON "actG.ico" - -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -IDI_ACTDEL ICON "actDel.ico" - -// -// Version Information resources -// -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -VS_VERSION_INFO VERSIONINFO - FILEVERSION __FILEVERSION_STRING - PRODUCTVERSION __FILEVERSION_STRING - FILEOS VOS__WINDOWS32 - FILETYPE VFT_DLL - FILESUBTYPE VFT2_UNKNOWN - FILEFLAGSMASK 0x00000017 - FILEFLAGS 0x00000000 -{ - BLOCK "StringFileInfo" - { - BLOCK "040904b0" - { - VALUE "FileDescription", "History Sweeper Light Miranda IM Plugin" - VALUE "FileVersion", __VERSION_STRING - VALUE "InternalName", "History Sweeper Light" - VALUE "LegalCopyright", "Copyright (C) Boris Krasnovskiy 2006-2009, (C) 2010, 2011 tico-tico" - VALUE "OriginalFilename", "historysweeperlight.dll" - VALUE "ProductName", "History Sweeper Light Miranda IM Plugin" - VALUE "ProductVersion", __VERSION_STRING - } - } - BLOCK "VarFileInfo" - { - VALUE "Translation", 0x0409, 0x04B0 - } -} diff --git a/plugins/HistorySweeperLight/historysweeperlight_10.vcxproj b/plugins/HistorySweeperLight/historysweeperlight_10.vcxproj index 8e14d01bf3..4025de2343 100644 --- a/plugins/HistorySweeperLight/historysweeperlight_10.vcxproj +++ b/plugins/HistorySweeperLight/historysweeperlight_10.vcxproj @@ -72,13 +72,12 @@ Disabled - WIN32;_DEBUG;_WINDOWS;_USRDLL;HISTORYSWEEPERLIGHT_EXPORTS;%(PreprocessorDefinitions) + WIN32;_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue - 4996;%(DisableSpecificWarnings) ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) @@ -97,11 +96,10 @@ Disabled - WIN64;_DEBUG;_WINDOWS;_USRDLL;HISTORYSWEEPERLIGHT_EXPORTS;%(PreprocessorDefinitions) + WIN64;_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level3 - 4996;%(DisableSpecificWarnings) ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) @@ -123,11 +121,10 @@ OnlyExplicitInline false Size - WIN32;NDEBUG;_WINDOWS;_USRDLL;HISTORYSWEEPERLIGHT_EXPORTS;%(PreprocessorDefinitions) + WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) true true Level3 - 4996;%(DisableSpecificWarnings) ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) @@ -151,11 +148,10 @@ OnlyExplicitInline false Size - WIN64;NDEBUG;_WINDOWS;_USRDLL;HISTORYSWEEPERLIGHT_EXPORTS;%(PreprocessorDefinitions) + WIN64;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) true true Level3 - 4996;%(DisableSpecificWarnings) ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) @@ -174,17 +170,17 @@ - - - + + + - - - + + + - + diff --git a/plugins/HistorySweeperLight/historysweeperlight_10.vcxproj.filters b/plugins/HistorySweeperLight/historysweeperlight_10.vcxproj.filters index 215f46c7f5..8e33f1e2f8 100644 --- a/plugins/HistorySweeperLight/historysweeperlight_10.vcxproj.filters +++ b/plugins/HistorySweeperLight/historysweeperlight_10.vcxproj.filters @@ -15,29 +15,29 @@ - + Source Files - + Source Files - + Source Files - + Header Files - + Header Files - + Header Files - + Resource Files diff --git a/plugins/HistorySweeperLight/main.cpp b/plugins/HistorySweeperLight/main.cpp deleted file mode 100644 index c6f8b427ac..0000000000 --- a/plugins/HistorySweeperLight/main.cpp +++ /dev/null @@ -1,179 +0,0 @@ -/* -Miranda IM History Sweeper Light plugin -Copyright (C) 2002-2003 Sergey V. Gershovich -Copyright (C) 2006-2009 Boris Krasnovskiy -Copyright (C) 2010, 2011 tico-tico - -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 "historysweeperlight.h" -#include "version.h" - -HINSTANCE hInst; - -static HANDLE hHooks[5]; -int hLangpack; - -static PLUGININFOEX pluginInfoEx = -{ - // about plugin - sizeof(PLUGININFOEX), - "History Sweeper Light", - __VERSION_DWORD, - "This plugin can sweep system history, history from all contacts or only from chosen; also it may sweep history older than certain time; and may do it at Miranda IM startup/shutdown.", - "Sergey V. Gershovich a.k.a. Jazzy$, Boris Krasnovskiy, tico-tico", - "", - "© 2002-2003 Sergey V. Gershovich a.k.a. Jazzy$, 2006-2009 Boris Krasnovskiy, 2010, 2011 tico-tico", - "", - UNICODE_AWARE, - MIID_HISTORYSWEEPERLIGHT -}; - -BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) -{ - hInst=hinstDLL; - return TRUE; -} - -int OnIconPressed(WPARAM wParam, LPARAM lParam) -{ - StatusIconClickData *sicd = (StatusIconClickData *)lParam; - - if ( !(sicd->flags & MBCF_RIGHTBUTTON) && !lstrcmpA(sicd->szModule, ModuleName) - && DBGetContactSettingByte(NULL, ModuleName, "ChangeInMW", 0)) - { - int nh = sicd->dwId; HANDLE hContact = (HANDLE)wParam; StatusIconData sid = {0}; - - sid.cbSize = sizeof(sid); - sid.szModule = ModuleName; - sid.dwId = nh; - sid.flags = MBF_HIDDEN; - CallService(MS_MSG_MODIFYICON, (WPARAM)hContact, (LPARAM)&sid); - - nh = (nh + 1) % 4; - DBWriteContactSettingByte((HANDLE)wParam, ModuleName, "SweepHistory", (BYTE)nh); - - sid.dwId = nh; - sid.flags = 0; - CallService(MS_MSG_MODIFYICON, (WPARAM)hContact, (LPARAM)&sid); - } - return 0; -} - - -int OnModulesLoaded(WPARAM wParam, LPARAM lParam) -{ - StatusIconData sid = {0}; - int i, sweep = DBGetContactSettingByte(NULL, ModuleName, "SweepHistory", 0); - HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0); - - sid.cbSize = sizeof(sid); - sid.szModule = ModuleName; - - sid.hIcon = LoadIconEx("actG"); - if (sweep == 0) - sid.szTooltip = Translate("Keep all events"); - else if (sweep == 1) - { - sid.szTooltip = Translate(time_stamp_strings[DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownOlder", 0)]); - } - else if (sweep == 2) - { - sid.szTooltip = Translate(keep_strings[DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownKeep", 0)]); - } - else if (sweep == 3) - { - sid.szTooltip = Translate("Delete all events"); - } - sid.flags = MBF_HIDDEN; - CallService(MS_MSG_ADDICON, 0, (LPARAM)&sid); - - sid.dwId = 1; - sid.hIcon = LoadIconEx("act1"); - sid.szTooltip = Translate(time_stamp_strings[DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownOlder", 0)]); - sid.flags = MBF_HIDDEN; - CallService(MS_MSG_ADDICON, 0, (LPARAM)&sid); - - sid.dwId = 2; - sid.hIcon = LoadIconEx("act2"); - sid.szTooltip = Translate(keep_strings[DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownKeep", 0)]); - sid.flags = MBF_HIDDEN; - CallService(MS_MSG_ADDICON, 0, (LPARAM)&sid); - - sid.dwId = 3; - sid.hIcon = LoadIconEx("actDel"); - sid.szTooltip = Translate("Delete all events"); - sid.flags = MBF_HIDDEN; - CallService(MS_MSG_ADDICON, 0, (LPARAM)&sid); - - // for new contacts - while ( hContact != NULL ) - { - ZeroMemory(&sid,sizeof(sid)); - - sweep = DBGetContactSettingByte(hContact, ModuleName, "SweepHistory", 0); - - sid.cbSize = sizeof(sid); - sid.szModule = ModuleName; - - for(i = 0; i < 4; i++) - { - sid.dwId = i; - sid.flags = (sweep == i) ? 0 : MBF_HIDDEN; - CallService(MS_MSG_MODIFYICON, (WPARAM)hContact, (LPARAM)&sid); - } - - hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0); - } - - hHooks[2] = HookEvent(ME_MSG_WINDOWEVENT, OnWindowEvent); - hHooks[3] = HookEvent(ME_MSG_ICONPRESSED, OnIconPressed); - - return 0; -} - -extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) -{ - return &pluginInfoEx; -} - -extern "C" __declspec(dllexport) int Load(void) -{ - - mir_getLP(&pluginInfoEx); - - hHooks[0] = HookEvent(ME_SYSTEM_MODULESLOADED, OnModulesLoaded); - hHooks[1] = HookEvent(ME_OPT_INITIALISE, HSOptInitialise); - - InitIcons(); - - return 0; -} - -extern "C" __declspec(dllexport) int Unload(void) -{ - int i; - - ShutdownAction(); - - for (i = 0; i < SIZEOF(hHooks); i++) - { - if (hHooks[i]) - UnhookEvent(hHooks[i]); - } - - return 0; -} \ No newline at end of file diff --git a/plugins/HistorySweeperLight/options.cpp b/plugins/HistorySweeperLight/options.cpp deleted file mode 100644 index 2963f8bb2b..0000000000 --- a/plugins/HistorySweeperLight/options.cpp +++ /dev/null @@ -1,354 +0,0 @@ -/* -Miranda IM History Sweeper Light plugin -Copyright (C) 2002-2003 Sergey V. Gershovich -Copyright (C) 2006-2009 Boris Krasnovskiy -Copyright (C) 2010, 2011 tico-tico - -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 "historysweeperlight.h" - -// Time Stamps strings -const char* time_stamp_strings[] = -{ - "Delete older than 1 day", - "Delete older than 3 days", - "Delete older than 7 days", - "Delete older than 2 weeks (14 days)", - "Delete older than 1 month (30 days)", - "Delete older than 3 months (90 days)", - "Delete older than 6 months (180 days)", - "Delete older than 1 year (365 days)" -}; - -const char* keep_strings[] = -{ - "Keep 1 last event", - "Keep 2 last events", - "Keep 5 last events", - "Keep 10 last events", - "Keep 20 last events", - "Keep 50 last events" -}; - -struct -{ - char* szDescr; - char* szName; - int defIconID; -} -static const iconList[] = -{ - { "Default Action", "actG", IDI_ACTG }, - { "Action 1", "act1", IDI_ACT1 }, - { "Action 2", "act2", IDI_ACT2 }, - { "Delete All", "actDel", IDI_ACTDEL } -}; - -static HANDLE hIconLibItem[SIZEOF(iconList)]; - -void InitIcons(void) -{ - TCHAR szFile[MAX_PATH]; - GetModuleFileName(hInst, szFile, SIZEOF(szFile)); - - SKINICONDESC sid = { 0 }; - sid.cbSize = sizeof(SKINICONDESC); - sid.ptszDefaultFile = szFile; - sid.cx = sid.cy = 16; - sid.pszSection = ModuleName; - sid.flags = SIDF_PATH_TCHAR; - - for (int i=0; i < SIZEOF(iconList); i++) { - char szSettingName[100]; - mir_snprintf(szSettingName, SIZEOF(szSettingName), "%s_%s", ModuleName, iconList[i].szName); - sid.pszName = szSettingName; - - sid.pszDescription = (char*)iconList[i].szDescr; - sid.iDefaultIndex = -iconList[i].defIconID; - hIconLibItem[i] = Skin_AddIcon(&sid); - } -} - -HICON LoadIconEx(const char* name) -{ - char szSettingName[100]; - mir_snprintf(szSettingName, sizeof(szSettingName), "%s_%s", ModuleName, name); - return (HICON)CallService(MS_SKIN2_GETICON, 0, (LPARAM)szSettingName); -} - -HANDLE GetIconHandle(const char* name) -{ - int i; - - for (i=0; i < SIZEOF(iconList); i++) - if (lstrcmpA(iconList[i].szName, name) == 0) - return hIconLibItem[i]; - - return NULL; -} - -void ReleaseIconEx(const char* name) -{ - char szSettingName[100]; - mir_snprintf(szSettingName, sizeof(szSettingName), "%s_%s", ModuleName, name); - CallService(MS_SKIN2_RELEASEICON, 0, (LPARAM)szSettingName); -} - -HANDLE hAllContacts, hSystemHistory; - -void ResetListOptions(HWND hwndList) -{ - int i; - - SendMessage(hwndList, CLM_SETBKBITMAP, 0, 0); - SendMessage(hwndList, CLM_SETBKCOLOR, GetSysColor(COLOR_WINDOW), 0); - SendMessage(hwndList, CLM_SETGREYOUTFLAGS, 0, 0); - SendMessage(hwndList, CLM_SETLEFTMARGIN, 4, 0); - SendMessage(hwndList, CLM_SETINDENT, 10, 0); - - for (i=0; i<=FONTID_MAX; i++) - SendMessage(hwndList, CLM_SETTEXTCOLOR, i, GetSysColor(COLOR_WINDOWTEXT)); -} - -static void ShowAllContactIcons(HWND hwndList) -{ - HANDLE hContact, hItem; - - SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hAllContacts, - MAKELPARAM(0, DBGetContactSettingByte(NULL, ModuleName, "SweepHistory", 0))); - SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hSystemHistory, - MAKELPARAM(0, DBGetContactSettingByte(NULL, ModuleName, "SweepSHistory", 0))); - - for (hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0); hContact; - hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0)) - { - hItem = (HANDLE)SendMessage(hwndList, CLM_FINDCONTACT, (WPARAM)hContact, 0); - SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hItem, - MAKELPARAM(0, DBGetContactSettingByte(hContact, ModuleName, "SweepHistory", 0))); - } -}//ShowAllContactIcons - -void LoadSettings(HWND hwndDlg) -{ - int i; CLCINFOITEM cii = {0}; HWND hwndList = GetDlgItem(hwndDlg, IDC_LIST); - - cii.cbSize = sizeof(cii); - cii.flags = CLCIIF_GROUPFONT; - - cii.pszText = TranslateT("*** Defaut Action ***"); - hAllContacts = (HANDLE)SendMessage(hwndList, CLM_ADDINFOITEM, 0, (LPARAM)&cii); - - cii.pszText = TranslateT("*** System History ***"); - hSystemHistory = (HANDLE)SendMessage(hwndList, CLM_ADDINFOITEM, 0, (LPARAM)&cii); - - ShowAllContactIcons(hwndList); - - SendDlgItemMessage(hwndDlg, IDC_SSOLDER, CB_RESETCONTENT, 0, 0); - SendDlgItemMessage(hwndDlg, IDC_SSKEEP, CB_RESETCONTENT, 0, 0); - - for (i = 0; i < SIZEOF(time_stamp_strings); i++) - { - TCHAR* ptszTimeStr = (TCHAR*)CallService(MS_LANGPACK_PCHARTOTCHAR, 0, (LPARAM)time_stamp_strings[i]); - SendDlgItemMessage(hwndDlg, IDC_SSOLDER, CB_ADDSTRING, 0, (LPARAM)ptszTimeStr); - mir_free(ptszTimeStr); - } - - for (i = 0; i < SIZEOF(keep_strings); i++) - { - TCHAR* ptszTimeStr = (TCHAR*)CallService(MS_LANGPACK_PCHARTOTCHAR, 0, (LPARAM)keep_strings[i]); - SendDlgItemMessage(hwndDlg, IDC_SSKEEP, CB_ADDSTRING, 0, (LPARAM)ptszTimeStr); - mir_free(ptszTimeStr); - } - - SendDlgItemMessage(hwndDlg, IDC_SSOLDER, CB_SETCURSEL, DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownOlder", 0), 0); - SendDlgItemMessage(hwndDlg, IDC_SSKEEP, CB_SETCURSEL, DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownKeep", 0), 0); - - CheckDlgButton(hwndDlg, IDC_UNSAFEMODE, DBGetContactSettingByte(NULL, ModuleName, "UnsafeMode", 0)); - CheckDlgButton(hwndDlg, IDC_SWEEPONCLOSE, DBGetContactSettingByte(NULL, ModuleName, "SweepOnClose", 0)); - CheckDlgButton(hwndDlg, IDC_HISTMW, DBGetContactSettingByte(NULL, ModuleName, "ChangeInMW", 0)); -}//LoadSettings - - -void SaveSettings(HWND hwndDlg) -{ - int st, i; StatusIconData sid = {0}; HANDLE hContact, hItem; HWND hwndList = GetDlgItem(hwndDlg, IDC_LIST); - - DBWriteContactSettingByte(NULL, ModuleName, "StartupShutdownOlder", (BYTE)SendDlgItemMessage(hwndDlg, IDC_SSOLDER, CB_GETCURSEL, 0, 0)); - DBWriteContactSettingByte(NULL, ModuleName, "StartupShutdownKeep", (BYTE)SendDlgItemMessage(hwndDlg, IDC_SSKEEP, CB_GETCURSEL, 0, 0)); - DBWriteContactSettingByte(NULL, ModuleName, "UnsafeMode", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_UNSAFEMODE)); - DBWriteContactSettingByte(NULL, ModuleName, "SweepOnClose", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_SWEEPONCLOSE)); - DBWriteContactSettingByte(NULL, ModuleName, "ChangeInMW", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_HISTMW)); - - sid.cbSize = sizeof(sid); - sid.szModule = ModuleName; - - DBWriteContactSettingByte(NULL, ModuleName, "SweepHistory", - (BYTE)SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hAllContacts, 0)); - DBWriteContactSettingByte(NULL, ModuleName, "SweepSHistory", - (BYTE)SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hSystemHistory, 0)); - - for (hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0); hContact; - hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0)) - { - hItem = (HANDLE)SendMessage(hwndList, CLM_FINDCONTACT, (WPARAM)hContact, 0); - - st = SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hItem, 0); - if ( st != 0 ) DBWriteContactSettingByte(hContact, ModuleName, "SweepHistory", (BYTE)st); - else DBDeleteContactSetting(hContact, ModuleName, "SweepHistory"); - - // set per-contact icons in status bar - for(i = 0; i < 4; i++) - { - sid.dwId = i; - sid.flags = (st == i) ? 0 : MBF_HIDDEN; - CallService(MS_MSG_MODIFYICON, (WPARAM)hContact, (LPARAM)&sid); - } - } - - // set tooltips - st = DBGetContactSettingByte(NULL, ModuleName, "SweepHistory", 0); - - sid.dwId = 0; - if (st == 0) sid.szTooltip = Translate("Keep all events"); - else if (st == 1) sid.szTooltip = Translate(time_stamp_strings[DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownOlder", 0)]); - else if (st == 2) sid.szTooltip = Translate(keep_strings[DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownKeep", 0)]); - else if (st == 3) sid.szTooltip = Translate("Delete all events"); - CallService(MS_MSG_MODIFYICON, 0, (LPARAM)&sid); - - sid.dwId = 1; - sid.szTooltip = Translate(time_stamp_strings[DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownOlder", 0)]); - CallService(MS_MSG_MODIFYICON, 0, (LPARAM)&sid); - - sid.dwId = 2; - sid.szTooltip = Translate(keep_strings[DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownKeep", 0)]); - CallService(MS_MSG_MODIFYICON, 0, (LPARAM)&sid); -}//SaveSettings - -INT_PTR CALLBACK DlgProcHSOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - switch (msg) - { - case WM_INITDIALOG: - { - HIMAGELIST hIml = ImageList_Create( GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), - ILC_MASK | (IsWinVerXPPlus() ? ILC_COLOR32 : ILC_COLOR16 ), 2, 2 ); - - HICON hIcon = LoadSkinnedIcon(SKINICON_OTHER_SMALLDOT); - ImageList_AddIcon(hIml, hIcon); - CallService(MS_SKIN2_RELEASEICON, (WPARAM)hIcon, 0); - - hIcon = LoadIconEx("act1"); - ImageList_AddIcon(hIml, hIcon); - SendDlgItemMessage(hwndDlg, IDC_ACT1, STM_SETICON, (WPARAM)hIcon, 0); - - hIcon = LoadIconEx("act2"); - ImageList_AddIcon(hIml, hIcon); - SendDlgItemMessage(hwndDlg, IDC_ACT2, STM_SETICON, (WPARAM)hIcon, 0); - - hIcon = LoadIconEx("actDel"); - ImageList_AddIcon(hIml, hIcon); - - SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_SETEXTRAIMAGELIST, 0, (LPARAM)hIml); - SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_SETEXTRACOLUMNS, 1, 0); - - TranslateDialogDefault(hwndDlg); - ResetListOptions(GetDlgItem(hwndDlg, IDC_LIST)); - LoadSettings(hwndDlg); - } - return TRUE; - - case WM_DESTROY: - { - HIMAGELIST hIml = (HIMAGELIST)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETEXTRAIMAGELIST, 0, 0); - ImageList_Destroy(hIml); - ReleaseIconEx("act1"); - ReleaseIconEx("act2"); - ReleaseIconEx("actDel"); - } - break; - - case WM_COMMAND: - SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); // Send message to activate "Apply" button - return TRUE; - - case WM_NOTIFY: - { - NMCLISTCONTROL* nmc = (NMCLISTCONTROL*)lParam; - if ( nmc->hdr.idFrom == 0 && nmc->hdr.code == (unsigned)PSN_APPLY ) - { - SaveSettings(hwndDlg); - } - else if (nmc->hdr.idFrom == IDC_LIST) - { - switch (nmc->hdr.code) - { - case CLN_NEWCONTACT: - case CLN_LISTREBUILT: - ShowAllContactIcons(nmc->hdr.hwndFrom); - break; - - case CLN_OPTIONSCHANGED: - ResetListOptions(nmc->hdr.hwndFrom); - break; - - case NM_CLICK: - { - HANDLE hItem; DWORD hitFlags; int iImage; - - if ( nmc->iColumn == -1 ) - break; - - // Find clicked item - hItem = (HANDLE)SendMessage(nmc->hdr.hwndFrom, CLM_HITTEST, (WPARAM)&hitFlags, MAKELPARAM(nmc->pt.x,nmc->pt.y)); - // Nothing was clicked - if (hItem == NULL || !(IsHContactContact(hItem) || IsHContactInfo(hItem))) - break; - - // It was not our extended icon - if (!(hitFlags & CLCHT_ONITEMEXTRA)) - break; - - iImage = SendMessage(nmc->hdr.hwndFrom, CLM_GETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(nmc->iColumn, 0)); - SendMessage(nmc->hdr.hwndFrom, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(nmc->iColumn, (iImage + 1) % 4)); - - // Activate Apply button - SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); - } - break; - } - } - } - break; - } - return FALSE; -} - -int HSOptInitialise(WPARAM wParam,LPARAM lParam) -{ - OPTIONSDIALOGPAGE odp = {0}; - odp.cbSize = sizeof(odp); - odp.position = 0; - odp.hInstance = hInst; - odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_HISTORYSWEEPER); - odp.pszTitle = ModuleName; - odp.pszGroup = LPGEN("History"); - odp.pfnDlgProc = DlgProcHSOpts; - odp.flags = ODPF_BOLDGROUPS; - Options_AddPage(wParam, &odp); - - return 0; -} diff --git a/plugins/HistorySweeperLight/res/act1.ico b/plugins/HistorySweeperLight/res/act1.ico new file mode 100644 index 0000000000..0557c177a1 Binary files /dev/null and b/plugins/HistorySweeperLight/res/act1.ico differ diff --git a/plugins/HistorySweeperLight/res/act2.ico b/plugins/HistorySweeperLight/res/act2.ico new file mode 100644 index 0000000000..957572de2b Binary files /dev/null and b/plugins/HistorySweeperLight/res/act2.ico differ diff --git a/plugins/HistorySweeperLight/res/actDel.ico b/plugins/HistorySweeperLight/res/actDel.ico new file mode 100644 index 0000000000..748ab4b65e Binary files /dev/null and b/plugins/HistorySweeperLight/res/actDel.ico differ diff --git a/plugins/HistorySweeperLight/res/actG.ico b/plugins/HistorySweeperLight/res/actG.ico new file mode 100644 index 0000000000..1273d332ae Binary files /dev/null and b/plugins/HistorySweeperLight/res/actG.ico differ diff --git a/plugins/HistorySweeperLight/res/historysweeperlight.rc b/plugins/HistorySweeperLight/res/historysweeperlight.rc new file mode 100644 index 0000000000..e322d6468e --- /dev/null +++ b/plugins/HistorySweeperLight/res/historysweeperlight.rc @@ -0,0 +1,83 @@ +// Generated by ResEdit 1.4.13 +// Copyright (C) 2006-2010 +// http://www.resedit.net + +#include +#include "..\src\resource.h" +#include "..\src\version.h" + + + +// +// Dialog resources +// +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +IDD_OPT_HISTORYSWEEPER DIALOGEX 0, 0, 313, 240 +STYLE DS_SHELLFONT | WS_VISIBLE | WS_CHILDWINDOW +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 1 +{ + GROUPBOX "History Sweeper Light", IDC_STATIC, 0, 0, 313, 240 + LTEXT "Sweep history for this contacts:", IDC_STATIC, 8, 12, 296, 10 + CONTROL "", IDC_LIST, "CListControl", 0x500101D2, 8, 22, 297, 139, 0x00000200 + ICON "", IDC_ACT1, 8, 164, 21, 20, SS_ICON + LTEXT "Action 1", IDC_STATIC, 22, 164, 118, 10 + COMBOBOX IDC_SSOLDER, 8, 177, 140, 70, WS_TABSTOP | WS_VSCROLL | WS_TABSTOP | CBS_DROPDOWNLIST + ICON "", IDC_ACT2, 165, 164, 21, 20, SS_ICON + LTEXT "Action 2", IDC_STATIC, 179, 164, 118, 10 + COMBOBOX IDC_SSKEEP, 165, 177, 140, 70, WS_TABSTOP | WS_VSCROLL | WS_TABSTOP | CBS_DROPDOWNLIST + AUTOCHECKBOX "Sweep on closing message window", IDC_SWEEPONCLOSE, 8, 197, 294, 10 + AUTOCHECKBOX "Clicking on the icon in the status bar will change settings", IDC_HISTMW, 8, 211, 294, 10 + AUTOCHECKBOX "Use UNSAFE mode (sweep fastest as possible, but dangerous for DB)", IDC_UNSAFEMODE, 8, 225, 294, 10 +} + + + +// +// Icon resources +// +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +IDI_ACT1 ICON "act1.ico" + + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +IDI_ACT2 ICON "act2.ico" + + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +IDI_ACTG ICON "actG.ico" + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +IDI_ACTDEL ICON "actDel.ico" + +// +// Version Information resources +// +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +VS_VERSION_INFO VERSIONINFO + FILEVERSION __FILEVERSION_STRING + PRODUCTVERSION __FILEVERSION_STRING + FILEOS VOS__WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE VFT2_UNKNOWN + FILEFLAGSMASK 0x00000017 + FILEFLAGS 0x00000000 +{ + BLOCK "StringFileInfo" + { + BLOCK "040904b0" + { + VALUE "FileDescription", "History Sweeper Light Miranda IM Plugin" + VALUE "FileVersion", __VERSION_STRING + VALUE "InternalName", "History Sweeper Light" + VALUE "LegalCopyright", "Copyright (C) Boris Krasnovskiy 2006-2009, (C) 2010, 2011 tico-tico" + VALUE "OriginalFilename", "historysweeperlight.dll" + VALUE "ProductName", "History Sweeper Light Miranda IM Plugin" + VALUE "ProductVersion", __VERSION_STRING + } + } + BLOCK "VarFileInfo" + { + VALUE "Translation", 0x0409, 0x04B0 + } +} diff --git a/plugins/HistorySweeperLight/resource.h b/plugins/HistorySweeperLight/resource.h deleted file mode 100644 index bfa91d1d4e..0000000000 --- a/plugins/HistorySweeperLight/resource.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef IDC_STATIC -#define IDC_STATIC (-1) -#endif - -#define IDD_OPT_HISTORYSWEEPER 101 -#define IDI_ACTG 102 -#define IDI_ACT1 103 -#define IDI_ACT2 104 -#define IDI_ACTDEL 105 -#define IDC_LIST 106 -#define IDC_SSOLDER 107 -#define IDC_UNSAFEMODE 108 -#define IDC_SWEEPONCLOSE 109 -#define IDC_SSKEEP 110 -#define IDC_HISTMW 111 -#define IDC_ACT1 112 -#define IDC_ACT2 113 - diff --git a/plugins/HistorySweeperLight/src/historysweeperlight.cpp b/plugins/HistorySweeperLight/src/historysweeperlight.cpp new file mode 100644 index 0000000000..50e37ddc34 --- /dev/null +++ b/plugins/HistorySweeperLight/src/historysweeperlight.cpp @@ -0,0 +1,248 @@ +/* +Miranda IM History Sweeper Light plugin +Copyright (C) 2002-2003 Sergey V. Gershovich +Copyright (C) 2006-2009 Boris Krasnovskiy +Copyright (C) 2010, 2011 tico-tico + +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 "historysweeperlight.h" + +typedef struct +{ + time_t time; + int keep; +} CriteriaStruct; + +// build criteria +time_t BuildCriteria(int dwti) +{ + time_t tim = time(NULL); + + switch (dwti) + { + case 0: + tim -= 1 * 24 * 3600; + break; + case 1: + tim -= 3 * 24 * 3600; + break; + case 2: + tim -= 7 * 24 * 3600; + break; + case 3: + tim -= 14 * 24 * 3600; + break; + case 4: + tim -= 30 * 24 * 3600; + break; + case 5: + tim -= 90 * 24 * 3600; + break; + case 6: + tim -= 180 * 24 * 3600; + break; + default: + tim -= 365 * 24 * 3600; + } + return tim; +} + +// keep criteria +int KeepCriteria(int dwti) +{ + switch (dwti) + { + case 0: + return 1; + case 1: + return 2; + case 2: + return 5; + case 3: + return 10; + case 4: + return 20; + default: + return 50; + } +} + +typedef struct +{ + HANDLE hDBEvent; + DWORD CRC32; + DWORD Timestamp; +} BEventData; + +static int CompareBookmarks( const void* p1, const void* p2 ) +{ + return (BYTE*)((BEventData*)p1)->hDBEvent - (BYTE*)((BEventData*)p2)->hDBEvent; +} + +static void GetBookmarks(HANDLE hContact, BEventData** books, size_t* bookcnt ) +{ + DBVARIANT dbv; + DBCONTACTGETSETTING cgs; + + *books = NULL; + *bookcnt = 0; + + cgs.szModule = "HistoryPlusPlus"; + cgs.szSetting = "Bookmarks"; + cgs.pValue = &dbv; + if (CallService(MS_DB_CONTACT_GETSETTING, (WPARAM)hContact, (LPARAM)&cgs) == 0) + { + if (dbv.cpbVal > 2 && *(WORD*)dbv.pbVal >= sizeof(BEventData)) + { + size_t recSize = *(WORD*)dbv.pbVal; + size_t numb = (dbv.cpbVal - sizeof(WORD)) / recSize; + + BEventData* tbooks = (BEventData*)mir_alloc(sizeof(BEventData)*numb); + size_t tbookcnt = 0; + + size_t i; + BYTE* evs = dbv.pbVal + sizeof(WORD); + + for (i=0; i --eventsCnt)) break; + + doDelete = TRUE; + + if (!(dbei.flags & (DBEF_SENT | DBEF_READ)) && keepUnread) doDelete = FALSE; // keep unread events + + if (bookcnt != 0) // keep bookmarks + { + ev.hDBEvent = hDBEvent; + item = (BEventData*)bsearch( &ev, books, bookcnt, sizeof(BEventData), CompareBookmarks); + if (item != NULL) + if (item->Timestamp == dbei.timestamp) + { + doDelete = FALSE; + btshift = (--bookcnt - (item - books))*sizeof(BEventData); + if (btshift) memmove(item, item+1, btshift); + } + } + + // find next event + hDBEventNext = (HANDLE)CallService(MS_DB_EVENT_FINDNEXT, (WPARAM)hDBEvent, 0); + + if (doDelete) CallService(MS_DB_EVENT_DELETE, (WPARAM)hContact, (LPARAM)hDBEvent); + + hDBEvent = hDBEventNext; + } // while (hDBEvent != NULL) + + mir_free(books); + + // switch ON safety mode as fast as we can to avoid DB corruption + if (unsafe) CallService(MS_DB_SETSAFETYMODE, 1, 0); + + SetCursor(LoadCursor(0, IDC_ARROW)); + } // if (eventsCnt != 0) +} + +// shutdown action +void ShutdownAction(void) +{ + CriteriaStruct Criteria; + HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0); + + Criteria.keep = KeepCriteria(DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownKeep", 0)); + Criteria.time = BuildCriteria(DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownOlder", 0)); + + SweepHistoryFromContact(NULL, Criteria, FALSE); // sweep system history, keepunread==0 + + while ( hContact != NULL ) + { + SweepHistoryFromContact(hContact, Criteria, TRUE); // sweep contact history, keepunread==1 + + hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0); // go to next contact + } +} + +int OnWindowEvent(WPARAM wParam, LPARAM lParam) +{ + MessageWindowEventData* msgEvData = (MessageWindowEventData*)lParam; + + if (msgEvData->uType == MSG_WINDOW_EVT_CLOSE && DBGetContactSettingByte(NULL, ModuleName, "SweepOnClose", 0)) + { + CriteriaStruct Criteria; + + Criteria.keep = KeepCriteria(DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownKeep", 0)); + Criteria.time = BuildCriteria(DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownOlder", 0)); + + SweepHistoryFromContact(msgEvData->hContact, Criteria, TRUE); + } + + return 0; +} \ No newline at end of file diff --git a/plugins/HistorySweeperLight/src/historysweeperlight.h b/plugins/HistorySweeperLight/src/historysweeperlight.h new file mode 100644 index 0000000000..c7fbeaeb25 --- /dev/null +++ b/plugins/HistorySweeperLight/src/historysweeperlight.h @@ -0,0 +1,71 @@ +/* +Miranda IM History Sweeper Light plugin +Copyright (C) 2002-2003 Sergey V. Gershovich +Copyright (C) 2006-2009 Boris Krasnovskiy +Copyright (C) 2010, 2011 tico-tico + +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. +*/ +#ifndef __HISTORYSWEEPERLIGHT_H__ +#define __HISTORYSWEEPERLIGHT_H__ + +#define MIRANDA_VER 0x0A00 + +#if !defined( _WIN64 ) + #define _USE_32BIT_TIME_T +#endif + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "resource.h" + +// Plugin name +#define ModuleName "History Sweeper Light" + +// Plugin UUID for New plugin loader +// req. 0.7.18+ core +// {1D9BF74A-44A8-4b3f-A6E5-73069D3A8979} +#define MIID_HISTORYSWEEPERLIGHT { 0x1d9bf74a, 0x44a8, 0x4b3f, { 0xa6, 0xe5, 0x73, 0x6, 0x9d, 0x3a, 0x89, 0x79 } } + +// main.c +extern HINSTANCE hInst; + +// options.c +extern const char* time_stamp_strings[]; +extern const char* keep_strings[]; +int HSOptInitialise(WPARAM wParam, LPARAM lParam); +void InitIcons(void); +void ReleaseIconEx(const char* name); +HICON LoadIconEx(const char* name); +HANDLE GetIconHandle(const char* name); + +// historysweeper.c +void ShutdownAction(void); +int OnWindowEvent(WPARAM wParam, LPARAM lParam); + +#endif diff --git a/plugins/HistorySweeperLight/src/main.cpp b/plugins/HistorySweeperLight/src/main.cpp new file mode 100644 index 0000000000..c6f8b427ac --- /dev/null +++ b/plugins/HistorySweeperLight/src/main.cpp @@ -0,0 +1,179 @@ +/* +Miranda IM History Sweeper Light plugin +Copyright (C) 2002-2003 Sergey V. Gershovich +Copyright (C) 2006-2009 Boris Krasnovskiy +Copyright (C) 2010, 2011 tico-tico + +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 "historysweeperlight.h" +#include "version.h" + +HINSTANCE hInst; + +static HANDLE hHooks[5]; +int hLangpack; + +static PLUGININFOEX pluginInfoEx = +{ + // about plugin + sizeof(PLUGININFOEX), + "History Sweeper Light", + __VERSION_DWORD, + "This plugin can sweep system history, history from all contacts or only from chosen; also it may sweep history older than certain time; and may do it at Miranda IM startup/shutdown.", + "Sergey V. Gershovich a.k.a. Jazzy$, Boris Krasnovskiy, tico-tico", + "", + "© 2002-2003 Sergey V. Gershovich a.k.a. Jazzy$, 2006-2009 Boris Krasnovskiy, 2010, 2011 tico-tico", + "", + UNICODE_AWARE, + MIID_HISTORYSWEEPERLIGHT +}; + +BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) +{ + hInst=hinstDLL; + return TRUE; +} + +int OnIconPressed(WPARAM wParam, LPARAM lParam) +{ + StatusIconClickData *sicd = (StatusIconClickData *)lParam; + + if ( !(sicd->flags & MBCF_RIGHTBUTTON) && !lstrcmpA(sicd->szModule, ModuleName) + && DBGetContactSettingByte(NULL, ModuleName, "ChangeInMW", 0)) + { + int nh = sicd->dwId; HANDLE hContact = (HANDLE)wParam; StatusIconData sid = {0}; + + sid.cbSize = sizeof(sid); + sid.szModule = ModuleName; + sid.dwId = nh; + sid.flags = MBF_HIDDEN; + CallService(MS_MSG_MODIFYICON, (WPARAM)hContact, (LPARAM)&sid); + + nh = (nh + 1) % 4; + DBWriteContactSettingByte((HANDLE)wParam, ModuleName, "SweepHistory", (BYTE)nh); + + sid.dwId = nh; + sid.flags = 0; + CallService(MS_MSG_MODIFYICON, (WPARAM)hContact, (LPARAM)&sid); + } + return 0; +} + + +int OnModulesLoaded(WPARAM wParam, LPARAM lParam) +{ + StatusIconData sid = {0}; + int i, sweep = DBGetContactSettingByte(NULL, ModuleName, "SweepHistory", 0); + HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0); + + sid.cbSize = sizeof(sid); + sid.szModule = ModuleName; + + sid.hIcon = LoadIconEx("actG"); + if (sweep == 0) + sid.szTooltip = Translate("Keep all events"); + else if (sweep == 1) + { + sid.szTooltip = Translate(time_stamp_strings[DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownOlder", 0)]); + } + else if (sweep == 2) + { + sid.szTooltip = Translate(keep_strings[DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownKeep", 0)]); + } + else if (sweep == 3) + { + sid.szTooltip = Translate("Delete all events"); + } + sid.flags = MBF_HIDDEN; + CallService(MS_MSG_ADDICON, 0, (LPARAM)&sid); + + sid.dwId = 1; + sid.hIcon = LoadIconEx("act1"); + sid.szTooltip = Translate(time_stamp_strings[DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownOlder", 0)]); + sid.flags = MBF_HIDDEN; + CallService(MS_MSG_ADDICON, 0, (LPARAM)&sid); + + sid.dwId = 2; + sid.hIcon = LoadIconEx("act2"); + sid.szTooltip = Translate(keep_strings[DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownKeep", 0)]); + sid.flags = MBF_HIDDEN; + CallService(MS_MSG_ADDICON, 0, (LPARAM)&sid); + + sid.dwId = 3; + sid.hIcon = LoadIconEx("actDel"); + sid.szTooltip = Translate("Delete all events"); + sid.flags = MBF_HIDDEN; + CallService(MS_MSG_ADDICON, 0, (LPARAM)&sid); + + // for new contacts + while ( hContact != NULL ) + { + ZeroMemory(&sid,sizeof(sid)); + + sweep = DBGetContactSettingByte(hContact, ModuleName, "SweepHistory", 0); + + sid.cbSize = sizeof(sid); + sid.szModule = ModuleName; + + for(i = 0; i < 4; i++) + { + sid.dwId = i; + sid.flags = (sweep == i) ? 0 : MBF_HIDDEN; + CallService(MS_MSG_MODIFYICON, (WPARAM)hContact, (LPARAM)&sid); + } + + hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0); + } + + hHooks[2] = HookEvent(ME_MSG_WINDOWEVENT, OnWindowEvent); + hHooks[3] = HookEvent(ME_MSG_ICONPRESSED, OnIconPressed); + + return 0; +} + +extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) +{ + return &pluginInfoEx; +} + +extern "C" __declspec(dllexport) int Load(void) +{ + + mir_getLP(&pluginInfoEx); + + hHooks[0] = HookEvent(ME_SYSTEM_MODULESLOADED, OnModulesLoaded); + hHooks[1] = HookEvent(ME_OPT_INITIALISE, HSOptInitialise); + + InitIcons(); + + return 0; +} + +extern "C" __declspec(dllexport) int Unload(void) +{ + int i; + + ShutdownAction(); + + for (i = 0; i < SIZEOF(hHooks); i++) + { + if (hHooks[i]) + UnhookEvent(hHooks[i]); + } + + return 0; +} \ No newline at end of file diff --git a/plugins/HistorySweeperLight/src/options.cpp b/plugins/HistorySweeperLight/src/options.cpp new file mode 100644 index 0000000000..2963f8bb2b --- /dev/null +++ b/plugins/HistorySweeperLight/src/options.cpp @@ -0,0 +1,354 @@ +/* +Miranda IM History Sweeper Light plugin +Copyright (C) 2002-2003 Sergey V. Gershovich +Copyright (C) 2006-2009 Boris Krasnovskiy +Copyright (C) 2010, 2011 tico-tico + +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 "historysweeperlight.h" + +// Time Stamps strings +const char* time_stamp_strings[] = +{ + "Delete older than 1 day", + "Delete older than 3 days", + "Delete older than 7 days", + "Delete older than 2 weeks (14 days)", + "Delete older than 1 month (30 days)", + "Delete older than 3 months (90 days)", + "Delete older than 6 months (180 days)", + "Delete older than 1 year (365 days)" +}; + +const char* keep_strings[] = +{ + "Keep 1 last event", + "Keep 2 last events", + "Keep 5 last events", + "Keep 10 last events", + "Keep 20 last events", + "Keep 50 last events" +}; + +struct +{ + char* szDescr; + char* szName; + int defIconID; +} +static const iconList[] = +{ + { "Default Action", "actG", IDI_ACTG }, + { "Action 1", "act1", IDI_ACT1 }, + { "Action 2", "act2", IDI_ACT2 }, + { "Delete All", "actDel", IDI_ACTDEL } +}; + +static HANDLE hIconLibItem[SIZEOF(iconList)]; + +void InitIcons(void) +{ + TCHAR szFile[MAX_PATH]; + GetModuleFileName(hInst, szFile, SIZEOF(szFile)); + + SKINICONDESC sid = { 0 }; + sid.cbSize = sizeof(SKINICONDESC); + sid.ptszDefaultFile = szFile; + sid.cx = sid.cy = 16; + sid.pszSection = ModuleName; + sid.flags = SIDF_PATH_TCHAR; + + for (int i=0; i < SIZEOF(iconList); i++) { + char szSettingName[100]; + mir_snprintf(szSettingName, SIZEOF(szSettingName), "%s_%s", ModuleName, iconList[i].szName); + sid.pszName = szSettingName; + + sid.pszDescription = (char*)iconList[i].szDescr; + sid.iDefaultIndex = -iconList[i].defIconID; + hIconLibItem[i] = Skin_AddIcon(&sid); + } +} + +HICON LoadIconEx(const char* name) +{ + char szSettingName[100]; + mir_snprintf(szSettingName, sizeof(szSettingName), "%s_%s", ModuleName, name); + return (HICON)CallService(MS_SKIN2_GETICON, 0, (LPARAM)szSettingName); +} + +HANDLE GetIconHandle(const char* name) +{ + int i; + + for (i=0; i < SIZEOF(iconList); i++) + if (lstrcmpA(iconList[i].szName, name) == 0) + return hIconLibItem[i]; + + return NULL; +} + +void ReleaseIconEx(const char* name) +{ + char szSettingName[100]; + mir_snprintf(szSettingName, sizeof(szSettingName), "%s_%s", ModuleName, name); + CallService(MS_SKIN2_RELEASEICON, 0, (LPARAM)szSettingName); +} + +HANDLE hAllContacts, hSystemHistory; + +void ResetListOptions(HWND hwndList) +{ + int i; + + SendMessage(hwndList, CLM_SETBKBITMAP, 0, 0); + SendMessage(hwndList, CLM_SETBKCOLOR, GetSysColor(COLOR_WINDOW), 0); + SendMessage(hwndList, CLM_SETGREYOUTFLAGS, 0, 0); + SendMessage(hwndList, CLM_SETLEFTMARGIN, 4, 0); + SendMessage(hwndList, CLM_SETINDENT, 10, 0); + + for (i=0; i<=FONTID_MAX; i++) + SendMessage(hwndList, CLM_SETTEXTCOLOR, i, GetSysColor(COLOR_WINDOWTEXT)); +} + +static void ShowAllContactIcons(HWND hwndList) +{ + HANDLE hContact, hItem; + + SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hAllContacts, + MAKELPARAM(0, DBGetContactSettingByte(NULL, ModuleName, "SweepHistory", 0))); + SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hSystemHistory, + MAKELPARAM(0, DBGetContactSettingByte(NULL, ModuleName, "SweepSHistory", 0))); + + for (hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0); hContact; + hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0)) + { + hItem = (HANDLE)SendMessage(hwndList, CLM_FINDCONTACT, (WPARAM)hContact, 0); + SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hItem, + MAKELPARAM(0, DBGetContactSettingByte(hContact, ModuleName, "SweepHistory", 0))); + } +}//ShowAllContactIcons + +void LoadSettings(HWND hwndDlg) +{ + int i; CLCINFOITEM cii = {0}; HWND hwndList = GetDlgItem(hwndDlg, IDC_LIST); + + cii.cbSize = sizeof(cii); + cii.flags = CLCIIF_GROUPFONT; + + cii.pszText = TranslateT("*** Defaut Action ***"); + hAllContacts = (HANDLE)SendMessage(hwndList, CLM_ADDINFOITEM, 0, (LPARAM)&cii); + + cii.pszText = TranslateT("*** System History ***"); + hSystemHistory = (HANDLE)SendMessage(hwndList, CLM_ADDINFOITEM, 0, (LPARAM)&cii); + + ShowAllContactIcons(hwndList); + + SendDlgItemMessage(hwndDlg, IDC_SSOLDER, CB_RESETCONTENT, 0, 0); + SendDlgItemMessage(hwndDlg, IDC_SSKEEP, CB_RESETCONTENT, 0, 0); + + for (i = 0; i < SIZEOF(time_stamp_strings); i++) + { + TCHAR* ptszTimeStr = (TCHAR*)CallService(MS_LANGPACK_PCHARTOTCHAR, 0, (LPARAM)time_stamp_strings[i]); + SendDlgItemMessage(hwndDlg, IDC_SSOLDER, CB_ADDSTRING, 0, (LPARAM)ptszTimeStr); + mir_free(ptszTimeStr); + } + + for (i = 0; i < SIZEOF(keep_strings); i++) + { + TCHAR* ptszTimeStr = (TCHAR*)CallService(MS_LANGPACK_PCHARTOTCHAR, 0, (LPARAM)keep_strings[i]); + SendDlgItemMessage(hwndDlg, IDC_SSKEEP, CB_ADDSTRING, 0, (LPARAM)ptszTimeStr); + mir_free(ptszTimeStr); + } + + SendDlgItemMessage(hwndDlg, IDC_SSOLDER, CB_SETCURSEL, DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownOlder", 0), 0); + SendDlgItemMessage(hwndDlg, IDC_SSKEEP, CB_SETCURSEL, DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownKeep", 0), 0); + + CheckDlgButton(hwndDlg, IDC_UNSAFEMODE, DBGetContactSettingByte(NULL, ModuleName, "UnsafeMode", 0)); + CheckDlgButton(hwndDlg, IDC_SWEEPONCLOSE, DBGetContactSettingByte(NULL, ModuleName, "SweepOnClose", 0)); + CheckDlgButton(hwndDlg, IDC_HISTMW, DBGetContactSettingByte(NULL, ModuleName, "ChangeInMW", 0)); +}//LoadSettings + + +void SaveSettings(HWND hwndDlg) +{ + int st, i; StatusIconData sid = {0}; HANDLE hContact, hItem; HWND hwndList = GetDlgItem(hwndDlg, IDC_LIST); + + DBWriteContactSettingByte(NULL, ModuleName, "StartupShutdownOlder", (BYTE)SendDlgItemMessage(hwndDlg, IDC_SSOLDER, CB_GETCURSEL, 0, 0)); + DBWriteContactSettingByte(NULL, ModuleName, "StartupShutdownKeep", (BYTE)SendDlgItemMessage(hwndDlg, IDC_SSKEEP, CB_GETCURSEL, 0, 0)); + DBWriteContactSettingByte(NULL, ModuleName, "UnsafeMode", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_UNSAFEMODE)); + DBWriteContactSettingByte(NULL, ModuleName, "SweepOnClose", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_SWEEPONCLOSE)); + DBWriteContactSettingByte(NULL, ModuleName, "ChangeInMW", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_HISTMW)); + + sid.cbSize = sizeof(sid); + sid.szModule = ModuleName; + + DBWriteContactSettingByte(NULL, ModuleName, "SweepHistory", + (BYTE)SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hAllContacts, 0)); + DBWriteContactSettingByte(NULL, ModuleName, "SweepSHistory", + (BYTE)SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hSystemHistory, 0)); + + for (hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0); hContact; + hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0)) + { + hItem = (HANDLE)SendMessage(hwndList, CLM_FINDCONTACT, (WPARAM)hContact, 0); + + st = SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hItem, 0); + if ( st != 0 ) DBWriteContactSettingByte(hContact, ModuleName, "SweepHistory", (BYTE)st); + else DBDeleteContactSetting(hContact, ModuleName, "SweepHistory"); + + // set per-contact icons in status bar + for(i = 0; i < 4; i++) + { + sid.dwId = i; + sid.flags = (st == i) ? 0 : MBF_HIDDEN; + CallService(MS_MSG_MODIFYICON, (WPARAM)hContact, (LPARAM)&sid); + } + } + + // set tooltips + st = DBGetContactSettingByte(NULL, ModuleName, "SweepHistory", 0); + + sid.dwId = 0; + if (st == 0) sid.szTooltip = Translate("Keep all events"); + else if (st == 1) sid.szTooltip = Translate(time_stamp_strings[DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownOlder", 0)]); + else if (st == 2) sid.szTooltip = Translate(keep_strings[DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownKeep", 0)]); + else if (st == 3) sid.szTooltip = Translate("Delete all events"); + CallService(MS_MSG_MODIFYICON, 0, (LPARAM)&sid); + + sid.dwId = 1; + sid.szTooltip = Translate(time_stamp_strings[DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownOlder", 0)]); + CallService(MS_MSG_MODIFYICON, 0, (LPARAM)&sid); + + sid.dwId = 2; + sid.szTooltip = Translate(keep_strings[DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownKeep", 0)]); + CallService(MS_MSG_MODIFYICON, 0, (LPARAM)&sid); +}//SaveSettings + +INT_PTR CALLBACK DlgProcHSOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) + { + case WM_INITDIALOG: + { + HIMAGELIST hIml = ImageList_Create( GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), + ILC_MASK | (IsWinVerXPPlus() ? ILC_COLOR32 : ILC_COLOR16 ), 2, 2 ); + + HICON hIcon = LoadSkinnedIcon(SKINICON_OTHER_SMALLDOT); + ImageList_AddIcon(hIml, hIcon); + CallService(MS_SKIN2_RELEASEICON, (WPARAM)hIcon, 0); + + hIcon = LoadIconEx("act1"); + ImageList_AddIcon(hIml, hIcon); + SendDlgItemMessage(hwndDlg, IDC_ACT1, STM_SETICON, (WPARAM)hIcon, 0); + + hIcon = LoadIconEx("act2"); + ImageList_AddIcon(hIml, hIcon); + SendDlgItemMessage(hwndDlg, IDC_ACT2, STM_SETICON, (WPARAM)hIcon, 0); + + hIcon = LoadIconEx("actDel"); + ImageList_AddIcon(hIml, hIcon); + + SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_SETEXTRAIMAGELIST, 0, (LPARAM)hIml); + SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_SETEXTRACOLUMNS, 1, 0); + + TranslateDialogDefault(hwndDlg); + ResetListOptions(GetDlgItem(hwndDlg, IDC_LIST)); + LoadSettings(hwndDlg); + } + return TRUE; + + case WM_DESTROY: + { + HIMAGELIST hIml = (HIMAGELIST)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETEXTRAIMAGELIST, 0, 0); + ImageList_Destroy(hIml); + ReleaseIconEx("act1"); + ReleaseIconEx("act2"); + ReleaseIconEx("actDel"); + } + break; + + case WM_COMMAND: + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); // Send message to activate "Apply" button + return TRUE; + + case WM_NOTIFY: + { + NMCLISTCONTROL* nmc = (NMCLISTCONTROL*)lParam; + if ( nmc->hdr.idFrom == 0 && nmc->hdr.code == (unsigned)PSN_APPLY ) + { + SaveSettings(hwndDlg); + } + else if (nmc->hdr.idFrom == IDC_LIST) + { + switch (nmc->hdr.code) + { + case CLN_NEWCONTACT: + case CLN_LISTREBUILT: + ShowAllContactIcons(nmc->hdr.hwndFrom); + break; + + case CLN_OPTIONSCHANGED: + ResetListOptions(nmc->hdr.hwndFrom); + break; + + case NM_CLICK: + { + HANDLE hItem; DWORD hitFlags; int iImage; + + if ( nmc->iColumn == -1 ) + break; + + // Find clicked item + hItem = (HANDLE)SendMessage(nmc->hdr.hwndFrom, CLM_HITTEST, (WPARAM)&hitFlags, MAKELPARAM(nmc->pt.x,nmc->pt.y)); + // Nothing was clicked + if (hItem == NULL || !(IsHContactContact(hItem) || IsHContactInfo(hItem))) + break; + + // It was not our extended icon + if (!(hitFlags & CLCHT_ONITEMEXTRA)) + break; + + iImage = SendMessage(nmc->hdr.hwndFrom, CLM_GETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(nmc->iColumn, 0)); + SendMessage(nmc->hdr.hwndFrom, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(nmc->iColumn, (iImage + 1) % 4)); + + // Activate Apply button + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + } + break; + } + } + } + break; + } + return FALSE; +} + +int HSOptInitialise(WPARAM wParam,LPARAM lParam) +{ + OPTIONSDIALOGPAGE odp = {0}; + odp.cbSize = sizeof(odp); + odp.position = 0; + odp.hInstance = hInst; + odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_HISTORYSWEEPER); + odp.pszTitle = ModuleName; + odp.pszGroup = LPGEN("History"); + odp.pfnDlgProc = DlgProcHSOpts; + odp.flags = ODPF_BOLDGROUPS; + Options_AddPage(wParam, &odp); + + return 0; +} diff --git a/plugins/HistorySweeperLight/src/resource.h b/plugins/HistorySweeperLight/src/resource.h new file mode 100644 index 0000000000..bfa91d1d4e --- /dev/null +++ b/plugins/HistorySweeperLight/src/resource.h @@ -0,0 +1,18 @@ +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_OPT_HISTORYSWEEPER 101 +#define IDI_ACTG 102 +#define IDI_ACT1 103 +#define IDI_ACT2 104 +#define IDI_ACTDEL 105 +#define IDC_LIST 106 +#define IDC_SSOLDER 107 +#define IDC_UNSAFEMODE 108 +#define IDC_SWEEPONCLOSE 109 +#define IDC_SSKEEP 110 +#define IDC_HISTMW 111 +#define IDC_ACT1 112 +#define IDC_ACT2 113 + diff --git a/plugins/HistorySweeperLight/src/version.h b/plugins/HistorySweeperLight/src/version.h new file mode 100644 index 0000000000..245200a539 --- /dev/null +++ b/plugins/HistorySweeperLight/src/version.h @@ -0,0 +1,23 @@ +/* +Plugin of Miranda IM for communicating with users of the MSN Messenger protocol. +Copyright (c) 2008-2009 Boris Krasnovskiy. +Copyright (C) 2010, 2011 tico-tico + +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, see . +*/ + +#define __FILEVERSION_STRING 0,0,0,7 +#define __VERSION_STRING "0.0.0.7" +#define __VERSION_DWORD PLUGIN_MAKE_VERSION(0, 0, 0, 7) + diff --git a/plugins/HistorySweeperLight/version.h b/plugins/HistorySweeperLight/version.h deleted file mode 100644 index 245200a539..0000000000 --- a/plugins/HistorySweeperLight/version.h +++ /dev/null @@ -1,23 +0,0 @@ -/* -Plugin of Miranda IM for communicating with users of the MSN Messenger protocol. -Copyright (c) 2008-2009 Boris Krasnovskiy. -Copyright (C) 2010, 2011 tico-tico - -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, see . -*/ - -#define __FILEVERSION_STRING 0,0,0,7 -#define __VERSION_STRING "0.0.0.7" -#define __VERSION_DWORD PLUGIN_MAKE_VERSION(0, 0, 0, 7) - diff --git a/plugins/MyDetails/commons.h b/plugins/MyDetails/commons.h deleted file mode 100644 index 4753c28d70..0000000000 --- a/plugins/MyDetails/commons.h +++ /dev/null @@ -1,109 +0,0 @@ -/* -Copyright (C) 2005 Ricardo Pescuma Domenecci - -This is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public -License as published by the Free Software Foundation; either -version 2 of the License, or (at your option) any later version. - -This 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 -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with this file; see the file license.txt. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. -*/ - - -#ifndef __COMMONS_H__ -# define __COMMONS_H__ - -#define _CRT_SECURE_NO_WARNINGS - -#define _WIN32_WINNT 0x0501 -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include "m_cluiframes.h" -#include "m_simpleaway.h" - -#include -#include - -#include - -#include "resource.h" - -#define MODULE_NAME "MyDetails" - -#define SETTING_FRAME_VISIBLE "FrameVisible" -#define SETTING_DEFAULT_NICK "DefaultNick" - -extern HINSTANCE hInst; - -extern long nickname_dialog_open; -extern long status_msg_dialog_open; - -#include "m_mydetails.h" -#include "data.h" -#include "options.h" -#include "frame.h" -#include "../utils/mir_smileys.h" -#include "../utils/mir_memory.h" -#include "../utils/mir_options.h" -#include "../utils/mir_icons.h" - -#define PS_GETMYAVATARMAXSIZE "/GetMyAvatarMaxSize" - -#define PS_GETMYNICKNAMEMAXLENGTH "/GetMyNicknameMaxLength" - -// See if a protocol service exists -__inline static int ProtoServiceExists(const char *szModule,const char *szService) -{ - char str[MAXMODULELABELLENGTH]; - strcpy(str,szModule); - strcat(str,szService); - return ServiceExists(str); -} - -// Helper -static __inline int DRAW_TEXT(HDC hDC, LPCTSTR lpString, int nCount, LPRECT lpRect, UINT uFormat, const char *protocol, - SmileysParseInfo parseInfo) -{ - if (!opts.replace_smileys) - return DrawText(hDC, lpString, nCount, lpRect, uFormat); - - return Smileys_DrawText(hDC, lpString, nCount, lpRect, uFormat | (opts.resize_smileys ? DT_RESIZE_SMILEYS : 0), - opts.use_contact_list_smileys ? "clist" : protocol, parseInfo); -} - -#endif // __COMMONS_H__ diff --git a/plugins/MyDetails/data.cpp b/plugins/MyDetails/data.cpp deleted file mode 100644 index c29af17ed0..0000000000 --- a/plugins/MyDetails/data.cpp +++ /dev/null @@ -1,689 +0,0 @@ -/* -Copyright (C) 2005 Ricardo Pescuma Domenecci - -This is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public -License as published by the Free Software Foundation; either -version 2 of the License, or (at your option) any later version. - -This 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 -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with this file; see the file license.txt. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. -*/ - - -#include "commons.h" -#include "data.h" - -static char *StatusModeToDbSetting(int status,const char *suffix); - -ProtocolArray *protocols = NULL; - -void InitProtocolData() -{ - PROTOACCOUNT **protos; - int count; - CallService(MS_PROTO_ENUMACCOUNTS, (WPARAM)&count, (LPARAM)&protos); - - protocols = new ProtocolArray(count); - - for (int i = 0; i < count; i++) { - PROTOACCOUNT* acc = protos[i]; - if (acc->type != PROTOTYPE_PROTOCOL) - continue; - - if (acc->szModuleName == NULL || acc->szModuleName[0] == '\0') - continue; - - // Found a protocol - Protocol *p = new Protocol(acc->szModuleName, acc->tszAccountName); - if ( p->IsValid()) - protocols->Add(p); - else - delete p; - } -} - -void DeInitProtocolData() -{ - delete protocols; -} - - -// Protocol Class /////////////////////////////////////////////////////////////////////////////////////////// - -Protocol::Protocol(const char *aName, const TCHAR* descr) -{ - lstrcpynA(name, aName, SIZEOF(name)); - lstrcpyn(description, descr, SIZEOF(description)); - - nickname[0] = _T('\0'); - status_message[0] = _T('\0'); - listening_to[0] = _T('\0'); - ace = NULL; - avatar_file[0] = _T('\0'); - avatar_bmp = NULL; - custom_status = 0; - data_changed = true; - - // Load services - int caps = CallProtoService(name, PS_GETCAPS, PFLAGNUM_1, 0); - valid = (caps & PF1_IM) == PF1_IM && strcmp(aName, "MetaContacts"); - if ( !valid) - return; - - can_have_listening_to = (ProtoServiceExists(name, PS_SET_LISTENINGTO) != 0); - - caps = CallProtoService(name, PS_GETCAPS, PFLAGNUM_4, 0); - can_have_avatar = (caps & PF4_AVATARS) != 0; - - PF3 = CallProtoService(name, PS_GETCAPS, (WPARAM)PFLAGNUM_3, 0); - - avatar_max_width = 0; - avatar_max_height = 0; - if (ProtoServiceExists(name, PS_GETMYAVATARMAXSIZE)) - CallProtoService(name, PS_GETMYAVATARMAXSIZE, (WPARAM) &avatar_max_width, (LPARAM) &avatar_max_height); - - can_set_nick = ProtoServiceExists(name, PS_SETMYNICKNAME) != FALSE; - - // Initial value - GetStatus(); - GetStatusMsg(); - GetNick(); - GetAvatar(); -} - -Protocol::~Protocol() -{ -} - -void Protocol::lcopystr(TCHAR *dest, TCHAR *src, size_t maxlen) -{ - if (lstrcmp(dest, src) != 0) - { - data_changed = true; - lstrcpyn(dest, src, maxlen); - } -} - -bool Protocol::IsValid() -{ - return valid; -} - - -int Protocol::GetStatus() -{ - int old_status = status; - status = CallProtoService(name, PS_GETSTATUS, 0, 0); - - if (old_status != status) - data_changed = true; - - if (/*status > ID_STATUS_OFFLINE &&*/ ProtoServiceExists(name, PS_ICQ_GETCUSTOMSTATUS)) - { - custom_status = CallProtoService(name, PS_ICQ_GETCUSTOMSTATUS, (WPARAM) &custom_status_name, - (LPARAM) &custom_status_message); - } - else - { - custom_status = 0; - } - - if (custom_status == 0) - { - TCHAR *tmp = (TCHAR*) CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, status, GSMDF_TCHAR); - lcopystr(status_name, tmp, SIZEOF(status_name)); - } - else - { - DBVARIANT dbv; - TCHAR tmp[256]; tmp[0] = 0; - - if (custom_status_name != NULL && custom_status_name[0] != '\0' - && !DBGetContactSettingTString(0, name, _T2A(custom_status_name), &dbv)) - { - if (dbv.ptszVal != NULL && dbv.ptszVal[0] != _T('\0')) - lstrcpyn(tmp, dbv.ptszVal, SIZEOF(tmp)); - else - lstrcpyn(tmp, TranslateT(""), SIZEOF(tmp)); - - DBFreeVariant(&dbv); - } - else - { - lstrcpyn(tmp, TranslateT(""), SIZEOF(tmp)); - } - - if (custom_status_message != NULL && custom_status_message[0] != '\0' - && !DBGetContactSettingTString(0, name, _T2A(custom_status_message), &dbv)) - { - if (dbv.ptszVal != NULL && dbv.ptszVal[0] != '\0') - { - int len = lstrlen(tmp); - - if (len < SIZEOF(tmp)) - lstrcpyn(&tmp[len], _T(": "), SIZEOF(tmp) - len); - - len += 2; - - if (len < SIZEOF(tmp)) - lstrcpyn(&tmp[len], dbv.ptszVal, SIZEOF(tmp) - len); - } - - DBFreeVariant(&dbv); - } - - lcopystr(status_name, tmp, SIZEOF(status_name)); - } - - return status; -} - -void Protocol::SetStatus(int aStatus) -{ - TCHAR status_msg[256]; - - if (ServiceExists(MS_CS_SETSTATUSEX)) - { - // :'( - - // BEGIN From commomstatus.cpp (KeepStatus) - int i, count, pCount; - PROTOACCOUNT **accs; - - pCount = 0; - CallService(MS_PROTO_ENUMPROTOCOLS,(WPARAM)&count,(LPARAM)&accs); - for (i=0; i < count; i++) { - if (accs[i]->type != PROTOTYPE_PROTOCOL || CallProtoService(accs[i]->szModuleName,PS_GETCAPS,PFLAGNUM_2,0)==0) - continue; - pCount++; - } - // END From commomstatus.cpp (KeepStatus) - - - PROTOCOLSETTINGEX **pse = (PROTOCOLSETTINGEX **) mir_alloc0(pCount * sizeof(PROTOCOLSETTINGEX *)); - - for (i = 0; i < pCount; i++) { - pse[i] = (PROTOCOLSETTINGEX *) mir_alloc0(sizeof(PROTOCOLSETTINGEX)); - pse[i]->szName = ""; - } - - pse[0]->cbSize = sizeof(PROTOCOLSETTINGEX); - pse[0]->status = aStatus; - pse[0]->szName = name; - - GetStatusMsg(aStatus, status_msg, SIZEOF(status_msg)); - pse[0]->szMsg = status_msg; - - CallService(MS_CS_SETSTATUSEX, (WPARAM) &pse, 0); - - for (i = 0; i < pCount; i++) - mir_free(pse[i]); - mir_free(pse); - } - else - { - CallProtoService(name, PS_SETSTATUS, aStatus, 0); - - if (CanSetStatusMsg(aStatus)) { - TCHAR status_msg[MS_MYDETAILS_GETMYSTATUSMESSAGE_BUFFER_SIZE]; - GetStatusMsg(aStatus, status_msg, SIZEOF(status_msg)); - SetStatusMsg(aStatus, status_msg); - } - } -} - - -bool Protocol::CanGetStatusMsg() -{ - return CanGetStatusMsg(status); -} - -bool Protocol::CanGetStatusMsg(int aStatus) -{ - return (CallProtoService(name, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND) != 0 - && (PF3 & Proto_Status2Flag(aStatus)); -} - - -bool Protocol::CanSetStatusMsg() -{ - return CanSetStatusMsg(GetStatus()); // <- Simple away handled by this one -} - -bool Protocol::CanSetStatusMsg(int aStatus) -{ - return CanGetStatusMsg(aStatus); -} - -void Protocol::GetStatusMsg(int aStatus, TCHAR *msg, size_t msg_size) -{ - if ( !CanGetStatusMsg()) - { - lcopystr(msg, _T(""), msg_size); - return; - } - - if (aStatus == status && ProtoServiceExists(name, PS_GETMYAWAYMSG) ) - { - TCHAR *tmp = (TCHAR*) CallProtoService(name, PS_GETMYAWAYMSG, 0, SGMA_TCHAR); - lcopystr(msg, tmp == NULL ? _T("") : tmp, msg_size); - } - - else if (ServiceExists(MS_AWAYMSG_GETSTATUSMSG)) - { - TCHAR *tmp = (TCHAR*) CallService(MS_AWAYMSG_GETSTATUSMSGT, (WPARAM)aStatus, 0); - if (tmp != NULL) - { - lcopystr(msg, tmp, msg_size); - mir_free(tmp); - } - else lcopystr(msg, _T(""), msg_size); - } -} - -TCHAR* Protocol::GetStatusMsg() -{ - GetStatusMsg(status, status_message, SIZEOF(status_message)); - return status_message; -} - -void Protocol::SetStatusMsg(const TCHAR *message) -{ - SetStatusMsg(GetStatus(), message); -} - -void Protocol::SetStatusMsg(int aStatus, const TCHAR *message) -{ - if ( !CanSetStatusMsg(aStatus)) - return; - - CallProtoService(name, PS_SETAWAYMSGT, (WPARAM)aStatus, (LPARAM)message); -} - -bool Protocol::HasAvatar() -{ - GetAvatar(); - - return avatar_bmp != NULL; -} - -bool Protocol::CanGetAvatar() -{ - if ( !can_have_avatar) - return false; - - if ( !ServiceExists(MS_AV_GETMYAVATAR)) - return false; - - return true; -} - -void Protocol::GetAvatar() -{ - // See if can get one - if ( !CanGetAvatar()) - return; - - avatar_file[0] = '\0'; - avatar_bmp = NULL; - ace = NULL; - - // Get HBITMAP from cache - ace = (avatarCacheEntry *)CallService(MS_AV_GETMYAVATAR, 0, (LPARAM) name); - if (ace != NULL) - avatar_bmp = ace->hbmPic; - - data_changed = true; -} - - -bool Protocol::CanGetNick() -{ - return ServiceExists(MS_CONTACT_GETCONTACTINFO) != FALSE; -} - -int Protocol::GetNickMaxLength() -{ - if (ProtoServiceExists(name, PS_GETMYNICKNAMEMAXLENGTH)) - { - int ret = CallProtoService(name, PS_GETMYNICKNAMEMAXLENGTH, 0, 0); - if (ret <= 0) - ret = MS_MYDETAILS_GETMYNICKNAME_BUFFER_SIZE; - return ret; - } - else - return MS_MYDETAILS_GETMYNICKNAME_BUFFER_SIZE; -} - -TCHAR* Protocol::GetNick() -{ - // See if can get one - if ( !CanGetNick()) - return NULL; - - // Get it - CONTACTINFO ci = { 0 }; - ci.cbSize = sizeof(ci); - ci.hContact = NULL; - ci.szProto = name; - ci.dwFlag = CNF_DISPLAY; - -#ifdef UNICODE - ci.dwFlag |= CNF_UNICODE; -#endif - - if ( !CallService(MS_CONTACT_GETCONTACTINFO, 0, (LPARAM) & ci)) - { - // CNF_DISPLAY always returns a string type - lcopystr(nickname, ci.pszVal, SIZEOF(nickname)); - mir_free(ci.pszVal); - } - else lcopystr(nickname, _T(""), SIZEOF(nickname)); - - return nickname; -} - - -bool Protocol::CanSetNick() -{ - return can_set_nick; -} - - -void Protocol::SetNick(const TCHAR *nick) -{ - // See if can get one - if ( !CanSetNick()) - return; - - if (nick == NULL) - return; - - // Get it - CallProtoService(name, PS_SETMYNICKNAME, SMNN_TCHAR, (LPARAM)nick); -} - - -bool Protocol::CanSetAvatar() -{ - return ServiceExists(MS_AV_SETMYAVATAR) != FALSE && ServiceExists(MS_AV_CANSETMYAVATAR) != FALSE && - CallService(MS_AV_CANSETMYAVATAR, (WPARAM) name, 0); -} - -void Protocol::SetAvatar(const TCHAR *file_name) -{ - if ( !CanSetAvatar()) - return; - - CallService(MS_AV_SETMYAVATART, (WPARAM) name, (LPARAM) file_name); -} - -bool Protocol::CanGetListeningTo() -{ - return can_have_listening_to; -} - -bool Protocol::CanSetListeningTo() -{ - return CanGetListeningTo() && ServiceExists(MS_LISTENINGTO_ENABLE); -} - -bool Protocol::ListeningToEnabled() -{ - return CanSetListeningTo() && CallService(MS_LISTENINGTO_ENABLED, (WPARAM) name, 0) != 0; -} - -TCHAR * Protocol::GetListeningTo() -{ - if ( !CanGetListeningTo()) - { - lcopystr(listening_to, _T(""), SIZEOF(listening_to)); - return listening_to; - } - - DBVARIANT dbv = {0}; - if ( DBGetContactSettingTString(NULL, name, "ListeningTo", &dbv)) - { - lcopystr(listening_to, _T(""), SIZEOF(listening_to)); - return listening_to; - } - - lcopystr(listening_to, dbv.ptszVal, SIZEOF(listening_to)); - DBFreeVariant(&dbv); - return listening_to; -} - -// ProtocolDataArray Class ///////////////////////////////////////////////////////////////////////////// - -ProtocolArray::ProtocolArray(int max_size) -{ - buffer = (Protocol **) malloc(max_size * sizeof(Protocol*)); - buffer_len = 0; - - GetDefaultNick(); - GetDefaultAvatar(); -} - - -ProtocolArray::~ProtocolArray() -{ - if (buffer != NULL) { - for ( int i = 0 ; i < buffer_len ; i++ ) - delete buffer[i]; - free(buffer); - } -} - - -int ProtocolArray::GetSize() -{ - return buffer_len; -} - - -void ProtocolArray::Add(Protocol *p) -{ - buffer[buffer_len] = p; - buffer_len++; -} - - -Protocol * ProtocolArray::Get(int i) -{ - if (i >= buffer_len) - return NULL; - else - return buffer[i]; -} - - -Protocol * ProtocolArray::Get(const char *name) -{ - if (name == NULL) - return NULL; - - for ( int i = 0 ; i < buffer_len ; i++ ) - { - if (strcmp(name, buffer[i]->name) == 0) - return buffer[i]; - } - - return NULL; -} - - -bool ProtocolArray::CanSetStatusMsgPerProtocol() -{ - return ServiceExists(MS_SA_CHANGESTATUSMSG) != 0; -} - - -void ProtocolArray::GetAvatars() -{ - for ( int i = 0 ; i < buffer_len ; i++ ) - { - buffer[i]->GetAvatar(); - } -} - -void ProtocolArray::GetStatusMsgs() -{ - for ( int i = 0 ; i < buffer_len ; i++ ) - buffer[i]->GetStatusMsg(); -} - -void ProtocolArray::GetStatuses() -{ - for ( int i = 0 ; i < buffer_len ; i++ ) - buffer[i]->GetStatus(); -} - -int ProtocolArray::GetGlobalStatus() -{ - int status = CallService(MS_CLIST_GETSTATUSMODE, 0, 0); - if (status == ID_STATUS_CONNECTING) - status = ID_STATUS_OFFLINE; - - return status; -} - -bool ProtocolArray::CanSetAvatars() -{ - return ServiceExists(MS_AV_SETMYAVATART) != FALSE; -} - -void ProtocolArray::SetAvatars(const TCHAR *file_name) -{ - if ( !CanSetAvatars()) - return; - - CallService(MS_AV_SETMYAVATART, NULL, (WPARAM) file_name); -} - -void ProtocolArray::SetNicks(const TCHAR *nick) -{ - if (nick == NULL || nick[0] == '\0') - return; - - lstrcpyn(default_nick, nick, SIZEOF(default_nick)); - - DBWriteContactSettingTString(0, MODULE_NAME, SETTING_DEFAULT_NICK, nick); - - for ( int i = 0 ; i < buffer_len ; i++ ) - buffer[i]->SetNick(default_nick); -} - - -void ProtocolArray::SetStatus(int aStatus) -{ - CallService(MS_CLIST_SETSTATUSMODE, aStatus, 0); -} - -void ProtocolArray::SetStatusMsgs(const TCHAR *message) -{ - for (int i = ID_STATUS_OFFLINE ; i <= ID_STATUS_IDLE; i++) - SetStatusMsgs(i, message); -} - -void ProtocolArray::SetStatusMsgs(int status, const TCHAR *message) -{ - DBWriteContactSettingTString(NULL,"SRAway",StatusModeToDbSetting(status,"Msg"),message); - - // Save default also - if ( !db_get_b(NULL,"SRAway",StatusModeToDbSetting(status,"UsePrev"),0)) - DBWriteContactSettingTString(NULL,"SRAway",StatusModeToDbSetting(status,"Default"),message); - - for ( int i = 0 ; i < buffer_len ; i++ ) - if (buffer[i]->status == status) - buffer[i]->SetStatusMsg(status, message); -} - -void ProtocolArray::GetDefaultNick() -{ - DBVARIANT dbv; - if ( !DBGetContactSettingTString(0, MODULE_NAME, SETTING_DEFAULT_NICK, &dbv)) { - lstrcpyn(default_nick, dbv.ptszVal, SIZEOF(default_nick)); - DBFreeVariant(&dbv); - } - else default_nick[0] = '\0'; -} - -void ProtocolArray::GetDefaultAvatar() -{ - DBVARIANT dbv; - if ( !DBGetContactSettingTString(0, "ContactPhoto", "File", &dbv)) { - lstrcpyn(default_avatar_file, dbv.ptszVal, SIZEOF(default_avatar_file)); - DBFreeVariant(&dbv); - } - else default_avatar_file[0] = '\0'; -} - -TCHAR* ProtocolArray::GetDefaultStatusMsg() -{ - return GetDefaultStatusMsg(CallService(MS_CLIST_GETSTATUSMODE, 0, 0)); -} - -TCHAR* ProtocolArray::GetDefaultStatusMsg(int status) -{ - default_status_message[0] = '\0'; - - if (ServiceExists(MS_AWAYMSG_GETSTATUSMSG)) { - if (status == ID_STATUS_CONNECTING) - status = ID_STATUS_OFFLINE; - - TCHAR *tmp = (TCHAR*) CallService(MS_AWAYMSG_GETSTATUSMSGT, (WPARAM)status, 0); - if (tmp != NULL) { - lstrcpyn(default_status_message, tmp, SIZEOF(default_status_message)); - mir_free(tmp); - } - } - - return default_status_message; -} - -bool ProtocolArray::CanSetListeningTo() -{ - return ServiceExists(MS_LISTENINGTO_ENABLE) != 0; -} - -bool ProtocolArray::ListeningToEnabled() -{ - return CanSetListeningTo() && CallService(MS_LISTENINGTO_ENABLED, 0, 0) != 0; -} - - -////////////////////////////////////////////////////////////////////////////////////////////////////// -// Helper functions - -static char *StatusModeToDbSetting(int status,const char *suffix) -{ - char *prefix; - static char str[64]; - - switch(status) { - case ID_STATUS_AWAY: prefix="Away"; break; - case ID_STATUS_NA: prefix="Na"; break; - case ID_STATUS_DND: prefix="Dnd"; break; - case ID_STATUS_OCCUPIED: prefix="Occupied"; break; - case ID_STATUS_FREECHAT: prefix="FreeChat"; break; - case ID_STATUS_ONLINE: prefix="On"; break; - case ID_STATUS_OFFLINE: prefix="Off"; break; - case ID_STATUS_INVISIBLE: prefix="Inv"; break; - case ID_STATUS_ONTHEPHONE: prefix="Otp"; break; - case ID_STATUS_OUTTOLUNCH: prefix="Otl"; break; - case ID_STATUS_IDLE: prefix="Idl"; break; - default: return NULL; - } - lstrcpyA(str,prefix); lstrcatA(str,suffix); - return str; -} - - diff --git a/plugins/MyDetails/data.h b/plugins/MyDetails/data.h deleted file mode 100644 index d8c75beda4..0000000000 --- a/plugins/MyDetails/data.h +++ /dev/null @@ -1,163 +0,0 @@ -/* -Copyright (C) 2005 Ricardo Pescuma Domenecci - -This is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public -License as published by the Free Software Foundation; either -version 2 of the License, or (at your option) any later version. - -This 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 -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with this file; see the file license.txt. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. -*/ - - -#ifndef __DATA_H__ -# define __DATA_H__ - - -//#include "protocol_config.h" - -class Protocol -{ - // Attributes //////////// -protected: - bool valid; - bool can_set_nick; - bool can_have_avatar; - bool can_have_listening_to; - int PF3; - - void lcopystr(TCHAR *dest, TCHAR *src, size_t maxlen); - -public: - // Name of protocol - char name[256]; - TCHAR description[256]; - TCHAR nickname[256]; - TCHAR status_name[256]; - TCHAR *custom_status_name; - TCHAR status_message[1024]; - TCHAR *custom_status_message; - TCHAR listening_to[1024]; - AVATARCACHEENTRY *ace; - TCHAR avatar_file[1024]; - HBITMAP avatar_bmp; - int status; - int custom_status; - - int avatar_max_width; - int avatar_max_height; - - bool data_changed; - - - // Methods /////////////// - - Protocol(const char *name, const TCHAR *descr); - ~Protocol(); - - bool IsValid(); - - int GetStatus(); // Copy to cache and return a copy - void SetStatus(int aStatus); - - bool HasAvatar(); - bool CanGetAvatar(); - void GetAvatar(); // Copy to cache - - bool CanSetAvatar(); - void SetAvatar(const TCHAR *file_name); - //void SetAvatar(const char *file_name, HBITMAP hBmp); - - bool CanGetNick(); - TCHAR * GetNick(); // Copy to cache and return a copy - int GetNickMaxLength(); - bool CanSetNick(); - void SetNick(const TCHAR *nick); - - bool CanGetListeningTo(); - bool CanSetListeningTo(); - bool ListeningToEnabled(); - TCHAR * GetListeningTo(); // Copy to cache and return a copy - - bool CanGetStatusMsg(); - bool CanGetStatusMsg(int aStatus); - TCHAR * GetStatusMsg(); // Copy to cache and return a copy - void GetStatusMsg(int aStatus, TCHAR *msg, size_t msg_size); - bool CanSetStatusMsg(); - bool CanSetStatusMsg(int aStatus); - void SetStatusMsg(const TCHAR *message); - void SetStatusMsg(int aStatus, const TCHAR *message); -}; - - - -class ProtocolArray -{ -protected: - // Attributes //////////// - Protocol **buffer; - int buffer_len; - -public: - TCHAR default_nick[256]; - TCHAR default_avatar_file[256]; - TCHAR default_status_message[256]; - - // Methods /////////////// - - ProtocolArray(int max_size); - virtual ~ProtocolArray(); - - int GetSize(); - - void Add(Protocol *p); - Protocol* Get(int i); - Protocol* Get(const char *name); - - void GetAvatars(); - bool CanSetAvatars(); - void SetAvatars(const TCHAR *file); - - void SetNicks(const TCHAR *nick); - - void SetStatus(int aStatus); - - void SetStatusMsgs(const TCHAR *message); - void SetStatusMsgs(int status, const TCHAR *message); - - void GetStatusMsgs(); - void GetStatuses(); - int GetGlobalStatus(); - - bool CanSetStatusMsgPerProtocol(); - - void GetDefaultNick(); // Copy to cache - void GetDefaultAvatar(); // Copy to cache - TCHAR* GetDefaultStatusMsg(); // Copy to cache - TCHAR* GetDefaultStatusMsg(int status); - - bool CanSetListeningTo(); - bool ListeningToEnabled(); -}; - -extern ProtocolArray *protocols; - - - -void InitProtocolData(); -void DeInitProtocolData(); - - - - - - -#endif // __DATA_H__ diff --git a/plugins/MyDetails/frame.cpp b/plugins/MyDetails/frame.cpp deleted file mode 100644 index baaf0b26dd..0000000000 --- a/plugins/MyDetails/frame.cpp +++ /dev/null @@ -1,2757 +0,0 @@ -/* -Copyright (C) 2005 Ricardo Pescuma Domenecci - -This is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public -License as published by the Free Software Foundation; either -version 2 of the License, or (at your option) any later version. - -This 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 -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with this file; see the file license.txt. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. -*/ - -#include "commons.h" - -#include - -// Prototypes ///////////////////////////////////////////////////////////////////////////////////// - -#define WINDOW_NAME_PREFIX "mydetails_window" -#define WINDOW_CLASS_NAME _T("MyDetailsFrame") -#define CONTAINER_CLASS_NAME _T("MyDetailsFrameContainer") - -#define ID_FRAME_TIMER 1011 -#define ID_RECALC_TIMER 1012 -#define ID_STATUSMESSAGE_TIMER 1013 - -#define RECALC_TIME 1000 - -#define IDC_HAND MAKEINTRESOURCE(32649) - -#define DEFAULT_NICKNAME _T("") -#define DEFAULT_STATUS_MESSAGE _T("") -#define DEFAULT_LISTENING_TO _T("") - - -// Messages -#define MWM_REFRESH (WM_USER+10) -#define MWM_NICK_CHANGED (WM_USER+11) -#define MWM_STATUS_CHANGED (WM_USER+12) -#define MWM_STATUS_MSG_CHANGED (WM_USER+13) -#define MWM_AVATAR_CHANGED (WM_USER+14) -#define MWM_LISTENINGTO_CHANGED (WM_USER+15) - - -HWND hwnd_frame = NULL; -HWND hwnd_container = NULL; - -int frame_id = -1; - -HANDLE hMenuShowHideFrame = 0; - -#define FONT_NICK 0 -#define FONT_PROTO 1 -#define FONT_STATUS 2 -#define FONT_AWAY_MSG 3 -#define FONT_LISTENING_TO 4 -#define NUM_FONTS 5 - -FontIDT font_id[NUM_FONTS]; -HFONT hFont[NUM_FONTS]; -COLORREF font_colour[NUM_FONTS]; - -// Defaults -TCHAR *font_names[] = { LPGENT("Nickname"), LPGENT("Protocol"), LPGENT("Status"), LPGENT("Status Message"), LPGENT("Listening To") }; -char font_sizes[] = { 13, 8, 8, 8, 8 }; -BYTE font_styles[] = { DBFONTF_BOLD, 0, 0, DBFONTF_ITALIC, DBFONTF_ITALIC }; -COLORREF font_colors[] = { RGB(0,0,0), RGB(0,0,0), RGB(0,0,0), RGB(150,150,150), RGB(150,150,150) }; - - -int CreateFrame(); -void FixMainMenu(); -void RefreshFrame(); -void RedrawFrame(); - - -// used when no multiwindow functionality available -bool MyDetailsFrameVisible(); -void SetMyDetailsFrameVisible(bool visible); -INT_PTR ShowHideMenuFunc(WPARAM wParam, LPARAM lParam); -INT_PTR ShowFrameFunc(WPARAM wParam, LPARAM lParam); -INT_PTR HideFrameFunc(WPARAM wParam, LPARAM lParam); -INT_PTR ShowHideFrameFunc(WPARAM wParam, LPARAM lParam); - -LRESULT CALLBACK FrameContainerWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); -LRESULT CALLBACK FrameWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); -void SetCycleTime(); -void SetCycleTime(HWND hwnd); -void SetStatusMessageRefreshTime(); -void SetStatusMessageRefreshTime(HWND hwnd); -int SettingsChangedHook(WPARAM wParam, LPARAM lParam); -int AvatarChangedHook(WPARAM wParam, LPARAM lParam); -int ProtoAckHook(WPARAM wParam, LPARAM lParam); -int SmileyAddOptionsChangedHook(WPARAM wParam,LPARAM lParam); -int ListeningtoEnableStateChangedHook(WPARAM wParam,LPARAM lParam); - - -#define OUTSIDE_BORDER 6 -#define SPACE_IMG_TEXT 6 -#define SPACE_TEXT_TEXT 0 -#define SPACE_ICON_TEXT 2 -#define ICON_SIZE 16 - -#define BORDER_SPACE 2 - -struct MyDetailsFrameData -{ - RECT proto_rect; - bool draw_proto; - bool mouse_over_proto; - - bool draw_proto_cycle; - RECT next_proto_rect; - HWND next_proto_tt_hwnd; - RECT prev_proto_rect; - HWND prev_proto_tt_hwnd; - - RECT img_rect; - bool draw_img; - bool mouse_over_img; - - RECT nick_rect; - bool draw_nick; - bool mouse_over_nick; - HWND nick_tt_hwnd; - - RECT status_rect; - RECT status_icon_rect; - RECT status_text_rect; - bool draw_status; - bool mouse_over_status; - HWND status_tt_hwnd; - - RECT away_msg_rect; - bool draw_away_msg; - bool mouse_over_away_msg; - HWND away_msg_tt_hwnd; - - RECT listening_to_rect; - RECT listening_to_icon_rect; - RECT listening_to_text_rect; - bool draw_listening_to; - bool mouse_over_listening_to; - HWND listening_to_tt_hwnd; - - int protocol_number; - - bool showing_menu; - bool skinning; - bool recalc_rectangles; - - bool get_status_messages; -}; - - -// Functions ////////////////////////////////////////////////////////////////////////////////////// - -void InitFrames() -{ - InitContactListSmileys(); - - CreateFrame(); - - HookEvent(ME_DB_CONTACT_SETTINGCHANGED, SettingsChangedHook); - HookEvent(ME_AV_MYAVATARCHANGED, AvatarChangedHook); - HookEvent(ME_PROTO_ACK, ProtoAckHook); - HookEvent(ME_SMILEYADD_OPTIONSCHANGED,SmileyAddOptionsChangedHook); - HookEvent(ME_LISTENINGTO_ENABLE_STATE_CHANGED,ListeningtoEnableStateChangedHook); -} - - -void DeInitFrames() -{ - if (ServiceExists(MS_CLIST_FRAMES_REMOVEFRAME) && frame_id != -1) - { - CallService(MS_CLIST_FRAMES_REMOVEFRAME, (WPARAM)frame_id, 0); - } - - for (int i = 0 ; i < NUM_FONTS ; i++ ) - { - if (hFont[i] != 0) DeleteObject(hFont[i]); - } - - if (hwnd_frame != NULL) DestroyWindow(hwnd_frame); - if (hwnd_container != NULL) DestroyWindow(hwnd_container); -} - - -int ReloadFont(WPARAM wParam, LPARAM lParam) -{ - LOGFONT log_font; - - for (int i = 0 ; i < NUM_FONTS ; i++ ) - { - if (hFont[i] != 0) DeleteObject(hFont[i]); - - font_colour[i] = CallService(MS_FONT_GETT, (WPARAM)&font_id[i], (LPARAM)&log_font); - hFont[i] = CreateFontIndirect(&log_font); - } - - RefreshFrame(); - return 0; -} - -int SmileyAddOptionsChangedHook(WPARAM wParam,LPARAM lParam) -{ - RefreshFrame(); - return 0; -} - -int CreateFrame() -{ - HDC hdc = GetDC(NULL); - - for (int i = 0 ; i < NUM_FONTS ; i++) { - ZeroMemory(&font_id[i], sizeof(font_id[i])); - - font_id[i].cbSize = sizeof(FontIDT); - _tcsncpy(font_id[i].group, LPGENT("My Details"), SIZEOF(font_id[i].group)); - _tcsncpy(font_id[i].name, font_names[i], SIZEOF(font_id[i].name)); - strncpy(font_id[i].dbSettingsGroup, MODULE_NAME, SIZEOF(font_id[i].dbSettingsGroup)); - - char tmp[128]; - mir_snprintf(tmp, sizeof(tmp), "%sFont", font_names[i]); - strncpy(font_id[i].prefix, tmp, SIZEOF(font_id[i].prefix)); - - font_id[i].deffontsettings.colour = font_colors[i]; - font_id[i].deffontsettings.size = -MulDiv(font_sizes[i], GetDeviceCaps(hdc, LOGPIXELSY), 72); - font_id[i].deffontsettings.style = font_styles[i]; - font_id[i].deffontsettings.charset = DEFAULT_CHARSET; - _tcsncpy(font_id[i].deffontsettings.szFace, _T("Tahoma"), SIZEOF(font_id[i].deffontsettings.szFace)); - font_id[i].order = i; - font_id[i].flags = FIDF_DEFAULTVALID; - FontRegisterT(&font_id[i]); - } - - ReleaseDC(NULL, hdc); - - ReloadFont(0,0); - HookEvent(ME_FONT_RELOAD, ReloadFont); - - WNDCLASS wndclass; - wndclass.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW; //CS_PARENTDC | CS_HREDRAW | CS_VREDRAW; - wndclass.lpfnWndProc = FrameWindowProc; - wndclass.cbClsExtra = 0; - wndclass.cbWndExtra = 0; - wndclass.hInstance = hInst; - wndclass.hIcon = NULL; - wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); - wndclass.hbrBackground = 0; //(HBRUSH)(COLOR_3DFACE+1); - wndclass.lpszMenuName = NULL; - wndclass.lpszClassName = WINDOW_CLASS_NAME; - RegisterClass(&wndclass); - - if (ServiceExists(MS_CLIST_FRAMES_ADDFRAME)) { - hwnd_frame = CreateWindow(WINDOW_CLASS_NAME, TranslateT("My Details"), - WS_CHILD | WS_VISIBLE, - 0,0,10,10, (HWND)CallService(MS_CLUI_GETHWND, 0, 0), NULL, hInst, NULL); - - CLISTFrame Frame = {0}; - - Frame.cbSize = sizeof(Frame); - Frame.tname = LPGENT("My Details"); - Frame.cbSize = sizeof(CLISTFrame); - Frame.hWnd = hwnd_frame; - Frame.align = alTop; - Frame.Flags = F_VISIBLE | F_SHOWTB | F_SHOWTBTIP | F_NOBORDER | F_SKINNED | F_TCHAR; - Frame.height = 100; - frame_id = CallService(MS_CLIST_FRAMES_ADDFRAME, (WPARAM)&Frame, 0); - - if ( db_get_b(NULL, "MyDetails", "ForceHideFrame", 0)) { - int flags = CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS, MAKEWPARAM(FO_FLAGS, frame_id), 0); - if (flags & F_VISIBLE) - CallService(MS_CLIST_FRAMES_SHFRAME, frame_id, 0); - - db_unset(NULL, "MyDetails", "ForceHideFrame"); - } - - if ( db_get_b(NULL, "MyDetails", "ForceShowFrame", 0)) { - int flags = CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS, MAKEWPARAM(FO_FLAGS, frame_id), 0); - if (!(flags & F_VISIBLE)) - CallService(MS_CLIST_FRAMES_SHFRAME, frame_id, 0); - - db_unset(NULL, "MyDetails", "ForceShowFrame"); - } - } - else { - wndclass.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;//CS_HREDRAW | CS_VREDRAW; - wndclass.lpfnWndProc = FrameContainerWindowProc; - wndclass.cbClsExtra = 0; - wndclass.cbWndExtra = 0; - wndclass.hInstance = hInst; - wndclass.hIcon = NULL; - wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); - wndclass.hbrBackground = 0; //(HBRUSH)(COLOR_3DFACE+1); - wndclass.lpszMenuName = NULL; - wndclass.lpszClassName = CONTAINER_CLASS_NAME; - RegisterClass(&wndclass); - - hwnd_container = CreateWindowEx(WS_EX_TOOLWINDOW, CONTAINER_CLASS_NAME, TranslateT("My Details"), - (WS_THICKFRAME | WS_CAPTION | WS_SYSMENU) & ~WS_VISIBLE, - 0,0,200,130, (HWND)CallService(MS_CLUI_GETHWND, 0, 0), NULL, hInst, NULL); - - hwnd_frame = CreateWindow(WINDOW_CLASS_NAME, TranslateT("My Details"), - WS_CHILD | WS_VISIBLE, - 0,0,10,10, hwnd_container, NULL, hInst, NULL); - - SetWindowLong(hwnd_container, GWLP_USERDATA, (LONG)hwnd_frame); - SendMessage(hwnd_container, WM_SIZE, 0, 0); - - // Create menu item - - CLISTMENUITEM menu = {0}; - - menu.cbSize=sizeof(menu); - menu.flags = CMIF_TCHAR; - menu.popupPosition = -0x7FFFFFFF; - menu.ptszPopupName = LPGENT("My Details"); - menu.position = 1; // 500010000 - menu.hIcon = LoadSkinnedIcon(SKINICON_OTHER_MIRANDA); - menu.ptszName = LPGENT("Show My Details"); - menu.pszService= MODULE_NAME "/ShowHideMyDetails"; - hMenuShowHideFrame = Menu_AddMainMenuItem(&menu); - - if ( db_get_b(0, MODULE_NAME, SETTING_FRAME_VISIBLE, 1) == 1) { - ShowWindow(hwnd_container, SW_SHOW); - FixMainMenu(); - } - } - - CreateServiceFunction(MS_MYDETAILS_SHOWFRAME, ShowFrameFunc); - CreateServiceFunction(MS_MYDETAILS_HIDEFRAME, HideFrameFunc); - CreateServiceFunction(MS_MYDETAILS_SHOWHIDEFRAME, ShowHideFrameFunc); - return 0; -} - - -bool FrameIsFloating() -{ - if (frame_id == -1) - return true; // no frames, always floating - - return (CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS, MAKEWPARAM(FO_FLOATING, frame_id), 0) != 0); -} - - -LRESULT CALLBACK FrameContainerWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - switch(msg) { - case WM_SHOWWINDOW: - if ((BOOL)wParam) - Utils_RestoreWindowPosition(hwnd, 0, MODULE_NAME, WINDOW_NAME_PREFIX); - else - Utils_SaveWindowPosition(hwnd, 0, MODULE_NAME, WINDOW_NAME_PREFIX); - break; - - case WM_ERASEBKGND: - SendMessage((HWND)GetWindowLong(hwnd, GWLP_USERDATA), WM_ERASEBKGND, wParam, lParam); - break; - - case WM_SIZE: - { - HWND child = (HWND)GetWindowLong(hwnd, GWLP_USERDATA); - RECT r; - GetClientRect(hwnd, &r); - - SetWindowPos(child, 0, r.left, r.top, r.right - r.left, r.bottom - r.top, SWP_NOZORDER | SWP_NOACTIVATE); - InvalidateRect(child, NULL, TRUE); - } - return TRUE; - - case WM_CLOSE: - DBWriteContactSettingByte(0, MODULE_NAME, SETTING_FRAME_VISIBLE, 0); - ShowWindow(hwnd, SW_HIDE); - FixMainMenu(); - return TRUE; - } - - return DefWindowProc(hwnd, msg, wParam, lParam); -} - - -BOOL ScreenToClient(HWND hWnd, LPRECT lpRect) -{ - POINT pt; - pt.x = lpRect->left; - pt.y = lpRect->top; - - BOOL ret = ScreenToClient(hWnd, &pt); - if ( !ret) - return ret; - - lpRect->left = pt.x; - lpRect->top = pt.y; - - pt.x = lpRect->right; - pt.y = lpRect->bottom; - - ret = ScreenToClient(hWnd, &pt); - - lpRect->right = pt.x; - lpRect->bottom = pt.y; - - return ret; -} - -BOOL MoveWindow(HWND hWnd, const RECT &rect, BOOL bRepaint) -{ - return MoveWindow(hWnd, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, bRepaint); -} - -RECT GetInnerRect(const RECT &rc, const RECT &clipping) -{ - RECT rc_ret = rc; - rc_ret.left = max(rc.left, clipping.left); - rc_ret.top = max(rc.top, clipping.top); - rc_ret.right = min(rc.right, clipping.right); - rc_ret.bottom = min(rc.bottom, clipping.bottom); - - return rc_ret; -} - -RECT GetRect(HDC hdc, RECT rc, SIZE s, UINT uFormat, int next_top, int text_left, bool frame = true, - bool end_elipsis_on_frame = true) -{ - RECT r = rc; - - if (frame && end_elipsis_on_frame) - { - // Add space to ... - uFormat &= ~DT_END_ELLIPSIS; - - RECT rc_tmp = rc; - DrawText(hdc, _T(" ..."), 4, &rc_tmp, DT_CALCRECT | uFormat); - - s.cx += rc_tmp.right - rc_tmp.left; - } - - r.top = next_top; - r.bottom = r.top + s.cy; - - if (opts.draw_text_align_right) - { - r.left = r.right - s.cx; - } - else - { - r.left = text_left; - r.right = r.left + s.cx; - } - - if (frame) - { - r.bottom += 2 * BORDER_SPACE; - - if (opts.draw_text_align_right) - r.left -= 2 * BORDER_SPACE; - else - r.right += 2 * BORDER_SPACE; - } - - // Make it fit inside original rc - r.top = max(next_top, r.top); - r.bottom = min(rc.bottom, r.bottom); - r.left = max(text_left, r.left); - r.right = min(rc.right, r.right); - - return r; -} - -RECT GetRect(HDC hdc, RECT rc, const TCHAR *text, const TCHAR *def_text, Protocol *proto, UINT uFormat, - int next_top, int text_left, bool smileys = true, bool frame = true, bool end_elipsis_on_frame = true) -{ - const TCHAR *tmp; - - if (text[0] == '\0') - tmp = TranslateTS(def_text); - else - tmp = text; - - uFormat &= ~DT_END_ELLIPSIS; - - SIZE s; - RECT r_tmp = rc; - - // Only first line - TCHAR *tmp2 = _tcsdup(tmp); - TCHAR *pos = _tcschr(tmp2, '\r'); - if (pos != NULL) pos[0] = '\0'; - pos = _tcschr(tmp2, '\n'); - if (pos != NULL) pos[0] = '\0'; - - if (smileys) - DRAW_TEXT(hdc, tmp2, _tcslen(tmp2), &r_tmp, uFormat | DT_CALCRECT, proto->name, NULL); - else - DrawText(hdc, tmp2, _tcslen(tmp2), &r_tmp, uFormat | DT_CALCRECT); - - free(tmp2); - - s.cx = r_tmp.right - r_tmp.left; - s.cy = r_tmp.bottom - r_tmp.top; - - return GetRect(hdc, rc, s, uFormat, next_top, text_left, frame, end_elipsis_on_frame); -} - -HWND CreateTooltip(HWND hwnd, RECT &rect) -{ - // struct specifying control classes to register - INITCOMMONCONTROLSEX iccex; - HWND hwndTT; // handle to the ToolTip control - // struct specifying info about tool in ToolTip control - TOOLINFO ti; - unsigned int uid = 0; // for ti initialization - - // Load the ToolTip class from the DLL. - iccex.dwSize = sizeof(iccex); - iccex.dwICC = ICC_BAR_CLASSES; - - if (!InitCommonControlsEx(&iccex)) - return NULL; - - /* CREATE A TOOLTIP WINDOW */ - hwndTT = CreateWindowEx(WS_EX_TOPMOST, - TOOLTIPS_CLASS, - NULL, - WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, - CW_USEDEFAULT, - CW_USEDEFAULT, - CW_USEDEFAULT, - CW_USEDEFAULT, - hwnd, - NULL, - hInst, - NULL - ); - - /* INITIALIZE MEMBERS OF THE TOOLINFO STRUCTURE */ - ti.cbSize = sizeof(TOOLINFO); - ti.uFlags = TTF_SUBCLASS; - ti.hwnd = hwnd; - ti.hinst = hInst; - ti.uId = uid; - ti.lpszText = LPSTR_TEXTCALLBACK; - // ToolTip control will cover the whole window - ti.rect.left = rect.left; - ti.rect.top = rect.top; - ti.rect.right = rect.right; - ti.rect.bottom = rect.bottom; - - /* SEND AN ADDTOOL MESSAGE TO THE TOOLTIP CONTROL WINDOW */ - SendMessage(hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti); - SendMessage(hwndTT, TTM_SETDELAYTIME, (WPARAM) (DWORD) TTDT_AUTOPOP, (LPARAM) MAKELONG(24 * 60 * 60 * 1000, 0)); - - return hwndTT; -} - -void DeleteTooltipWindows(MyDetailsFrameData *data) -{ - if (data->nick_tt_hwnd != NULL) { - DestroyWindow(data->nick_tt_hwnd); - data->nick_tt_hwnd = NULL; - } - - if (data->status_tt_hwnd != NULL) { - DestroyWindow(data->status_tt_hwnd); - data->status_tt_hwnd = NULL; - } - - if (data->next_proto_tt_hwnd != NULL) { - DestroyWindow(data->next_proto_tt_hwnd); - data->next_proto_tt_hwnd = NULL; - } - - if (data->prev_proto_tt_hwnd != NULL) { - DestroyWindow(data->prev_proto_tt_hwnd); - data->prev_proto_tt_hwnd = NULL; - } - - if (data->away_msg_tt_hwnd != NULL) { - DestroyWindow(data->away_msg_tt_hwnd); - data->away_msg_tt_hwnd = NULL; - } - - if (data->listening_to_tt_hwnd != NULL) { - DestroyWindow(data->listening_to_tt_hwnd); - data->listening_to_tt_hwnd = NULL; - } -} - -void CalcRectangles(HWND hwnd) -{ - HDC hdc = GetDC(hwnd); - HFONT hOldFont = (HFONT) GetCurrentObject(hdc, OBJ_FONT); - MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd, GWLP_USERDATA); - - if (hdc == NULL || data == NULL) - return; - - Protocol *proto = protocols->Get(data->protocol_number); - if (proto == NULL) - return; - - data->recalc_rectangles = false; - proto->data_changed = false; - - data->draw_proto = false; - data->draw_proto_cycle = false; - data->draw_img = false; - data->draw_nick = false; - data->draw_status = false; - data->draw_away_msg = false; - data->draw_listening_to = false; - - DeleteTooltipWindows(data); - - if (ServiceExists(MS_CLIST_FRAMES_SETFRAMEOPTIONS) && frame_id != -1) { - int flags = CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS, MAKEWPARAM(FO_FLAGS, frame_id), 0); - if (flags & F_UNCOLLAPSED) { - RECT rf; - GetClientRect(hwnd, &rf); - - int size = 0; - - if (rf.bottom - rf.top != size) { - if (FrameIsFloating()) { - HWND parent = GetParent(hwnd); - if (parent != NULL) { - RECT rp_client, rp_window, r_window; - GetClientRect(parent, &rp_client); - GetWindowRect(parent, &rp_window); - GetWindowRect(hwnd, &r_window); - int diff = (rp_window.bottom - rp_window.top) - (rp_client.bottom - rp_client.top); - if (ServiceExists(MS_CLIST_FRAMES_ADDFRAME)) - diff += (r_window.top - rp_window.top); - - SetWindowPos(parent, 0, 0, 0, rp_window.right - rp_window.left, size + diff, SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE); - } - } - } - SelectObject(hdc, hOldFont); - ReleaseDC(hwnd, hdc); - return; - } - } - - RECT r; - GetClientRect(hwnd, &r); - - if (opts.resize_frame) - r.bottom = 0x7FFFFFFF; - - int next_top; - int text_left; - int avatar_bottom = 0; - - UINT uFormat = DT_SINGLELINE | DT_NOPREFIX | DT_END_ELLIPSIS - | (opts.draw_text_align_right ? DT_RIGHT : DT_LEFT) - | (opts.draw_text_rtl ? DT_RTLREADING : 0); - - // make some borders - r.left += min(opts.borders[LEFT], r.right); - r.right = max(r.right - opts.borders[RIGHT], r.left); - r.top += min(opts.borders[TOP], r.bottom); - r.bottom = max(r.bottom - opts.borders[BOTTOM], r.top); - - next_top = r.top; - text_left = r.left; - - // Draw image? - if (proto->CanGetAvatar()) { - if (proto->avatar_bmp != NULL) { - data->draw_img = true; - - BITMAP bmp; - if (GetObject(proto->avatar_bmp, sizeof(bmp), &bmp)) { - // make bounds - RECT rc = r; - - LONG width; - LONG height; - - if (opts.draw_avatar_custom_size) { - rc.right = opts.draw_avatar_custom_size_pixels; - - width = opts.draw_avatar_custom_size_pixels; - height = opts.draw_avatar_custom_size_pixels; - } - else if (opts.resize_frame) { - rc.right = rc.left + (rc.right - rc.left) / 3; - - width = rc.right - rc.left; - height = rc.bottom - rc.top; - } - else { - rc.right = rc.left + min((rc.right - rc.left) / 3, rc.bottom - rc.top); - - width = rc.right - rc.left; - height = rc.bottom - rc.top; - } - - // Fit to image proportions - if ( !opts.draw_avatar_allow_to_grow) { - if (width > bmp.bmWidth) - width = bmp.bmWidth; - - if (height > bmp.bmHeight) - height = bmp.bmHeight; - } - - if ( !opts.resize_frame && height * bmp.bmWidth / bmp.bmHeight <= width) - width = height * bmp.bmWidth / bmp.bmHeight; - else - height = width * bmp.bmHeight / bmp.bmWidth; - - rc.right = rc.left + width; - rc.bottom = rc.top + height; - - data->img_rect = rc; - - avatar_bottom = data->img_rect.bottom + SPACE_TEXT_TEXT; - - // Make space to nick - text_left = data->img_rect.right + SPACE_IMG_TEXT; - } - } - } - - // Always draw nick - data->draw_nick = true; - SelectObject(hdc, hFont[FONT_NICK]); - - data->nick_rect = GetRect(hdc, r, proto->nickname, DEFAULT_NICKNAME, proto, uFormat, next_top, text_left); - - if (proto->nickname[0] != '\0') - data->nick_tt_hwnd = CreateTooltip(hwnd, data->nick_rect); - - next_top = data->nick_rect.bottom + SPACE_TEXT_TEXT; - - // Fits more? - if (next_top > r.bottom) - goto finish; - - if (next_top > avatar_bottom && opts.use_avatar_space_to_draw_text) - text_left = r.left; - - // Protocol? - if (opts.draw_show_protocol_name) { - data->draw_proto = true; - - SelectObject(hdc, hFont[FONT_PROTO]); - - RECT tmp_r = r; - int tmp_text_left = text_left; - if (opts.show_protocol_cycle_button) - tmp_r.right -= 2 * ICON_SIZE; - - data->proto_rect = GetRect(hdc, tmp_r, proto->description, _T(""), proto, uFormat, - next_top, tmp_text_left, false, true, false); - - if (opts.show_protocol_cycle_button) { - data->draw_proto_cycle= true; - - RECT prev = r; - prev.top = next_top; - prev.bottom = min(r.bottom, prev.top + ICON_SIZE); - - int diff = (data->proto_rect.bottom - data->proto_rect.top) - (prev.bottom - prev.top); - if (diff < 0) { - diff = -diff / 2; - data->proto_rect.top += diff; - data->proto_rect.bottom += diff; - } - else { - diff = diff / 2; - prev.top += diff; - prev.bottom += diff; - } - - prev.right -= ICON_SIZE; - prev.left = prev.right - ICON_SIZE; - - RECT next = prev; - next.left += ICON_SIZE; - next.right += ICON_SIZE; - - prev.left = max(text_left, prev.left); - prev.right = min(r.right, prev.right); - next.left = max(text_left, next.left); - next.right = min(r.right, next.right); - - data->prev_proto_rect = prev; - data->next_proto_rect = next; - - data->next_proto_tt_hwnd = CreateTooltip(hwnd, data->next_proto_rect); - data->prev_proto_tt_hwnd = CreateTooltip(hwnd, data->prev_proto_rect); - - - next_top = max(data->next_proto_rect.bottom, data->proto_rect.bottom) + SPACE_TEXT_TEXT; - } - else next_top = data->proto_rect.bottom + SPACE_TEXT_TEXT; - } - - // Fits more? - if (next_top + 2 * BORDER_SPACE > r.bottom) - goto finish; - - if (next_top > avatar_bottom && opts.use_avatar_space_to_draw_text) - text_left = r.left; - - // Status data? - { - data->draw_status = true; - - SelectObject(hdc, hFont[FONT_STATUS]); - - // Text size - RECT r_tmp = r; - DrawText(hdc, proto->status_name, _tcslen(proto->status_name), &r_tmp, - DT_CALCRECT | (uFormat & ~DT_END_ELLIPSIS)); - - SIZE s; - s.cy = max(r_tmp.bottom - r_tmp.top, ICON_SIZE); - s.cx = ICON_SIZE + SPACE_ICON_TEXT + r_tmp.right - r_tmp.left; - - // Status global rect - data->status_rect = GetRect(hdc, r, s, uFormat, next_top, text_left, true, false); - - if (proto->status_name[0] != '\0') - data->status_tt_hwnd = CreateTooltip(hwnd, data->status_rect); - - next_top = data->status_rect.bottom + SPACE_TEXT_TEXT; - - RECT rc_inner = data->status_rect; - rc_inner.top += BORDER_SPACE; - rc_inner.bottom -= BORDER_SPACE; - rc_inner.left += BORDER_SPACE; - rc_inner.right -= BORDER_SPACE; - - // Icon - data->status_icon_rect = rc_inner; - - if (opts.draw_text_align_right || opts.draw_text_rtl) - data->status_icon_rect.left = max(data->status_icon_rect.right - ICON_SIZE, rc_inner.left); - else - data->status_icon_rect.right = min(data->status_icon_rect.left + ICON_SIZE, rc_inner.right); - - if (r_tmp.bottom - r_tmp.top > ICON_SIZE) { - data->status_icon_rect.top += (r_tmp.bottom - r_tmp.top - ICON_SIZE) / 2; - data->status_icon_rect.bottom = data->status_icon_rect.top + ICON_SIZE; - } - - // Text - data->status_text_rect = GetInnerRect(rc_inner, r); - - if (opts.draw_text_align_right || opts.draw_text_rtl) - data->status_text_rect.right = max(data->status_icon_rect.left - SPACE_ICON_TEXT, rc_inner.left); - else - data->status_text_rect.left = min(data->status_icon_rect.right + SPACE_ICON_TEXT, rc_inner.right); - - if (ICON_SIZE > r_tmp.bottom - r_tmp.top) { - data->status_text_rect.top += (ICON_SIZE - (r_tmp.bottom - r_tmp.top)) / 2; - data->status_text_rect.bottom = data->status_text_rect.top + r_tmp.bottom - r_tmp.top; - } - } - - // Fits more? - if (next_top + 2 * BORDER_SPACE > r.bottom) - goto finish; - - if (next_top > avatar_bottom && opts.use_avatar_space_to_draw_text) - text_left = r.left; - - // Away msg? - if (proto->CanGetStatusMsg()) { - data->draw_away_msg = true; - - SelectObject(hdc, hFont[FONT_AWAY_MSG]); - - data->away_msg_rect = GetRect(hdc, r, proto->status_message, DEFAULT_STATUS_MESSAGE, proto, uFormat, next_top, text_left); - - if (proto->status_message[0] != '\0') - data->away_msg_tt_hwnd = CreateTooltip(hwnd, data->away_msg_rect); - - next_top = data->away_msg_rect.bottom + SPACE_TEXT_TEXT; - } - - // Fits more? - if (next_top + 2 * BORDER_SPACE > r.bottom) - goto finish; - - if (next_top > avatar_bottom && opts.use_avatar_space_to_draw_text) - text_left = r.left; - - // Listening to - if (proto->ListeningToEnabled() && proto->GetStatus() > ID_STATUS_OFFLINE) { - data->draw_listening_to = true; - - if (proto->listening_to[0] == '\0') { - SelectObject(hdc, hFont[FONT_LISTENING_TO]); - - data->listening_to_rect = GetRect(hdc, r, proto->listening_to, DEFAULT_LISTENING_TO, proto, uFormat, - next_top, text_left); - - data->listening_to_text_rect = data->listening_to_rect; - ZeroMemory(&data->listening_to_icon_rect, sizeof(data->listening_to_icon_rect)); - - next_top = data->listening_to_rect.bottom + SPACE_TEXT_TEXT; - } - else { - SelectObject(hdc, hFont[FONT_LISTENING_TO]); - - // Text size - RECT r_tmp = r; - DrawText(hdc, proto->listening_to, _tcslen(proto->listening_to), &r_tmp, - DT_CALCRECT | (uFormat & ~DT_END_ELLIPSIS)); - - SIZE s; - s.cy = max(r_tmp.bottom - r_tmp.top, ICON_SIZE); - s.cx = ICON_SIZE + SPACE_ICON_TEXT + r_tmp.right - r_tmp.left; - - // listening to global rect - data->listening_to_rect = GetRect(hdc, r, s, uFormat, next_top, text_left, true, false); - - data->listening_to_tt_hwnd = CreateTooltip(hwnd, data->listening_to_rect); - - next_top = data->listening_to_rect.bottom + SPACE_TEXT_TEXT; - - RECT rc_inner = data->listening_to_rect; - rc_inner.top += BORDER_SPACE; - rc_inner.bottom -= BORDER_SPACE; - rc_inner.left += BORDER_SPACE; - rc_inner.right -= BORDER_SPACE; - - // Icon - data->listening_to_icon_rect = rc_inner; - - if (opts.draw_text_align_right || opts.draw_text_rtl) - data->listening_to_icon_rect.left = max(data->listening_to_icon_rect.right - ICON_SIZE, rc_inner.left); - else - data->listening_to_icon_rect.right = min(data->listening_to_icon_rect.left + ICON_SIZE, rc_inner.right); - - if (r_tmp.bottom - r_tmp.top > ICON_SIZE) { - data->listening_to_icon_rect.top += (r_tmp.bottom - r_tmp.top - ICON_SIZE) / 2; - data->listening_to_icon_rect.bottom = data->listening_to_icon_rect.top + ICON_SIZE; - } - - // Text - data->listening_to_text_rect = GetInnerRect(rc_inner, r); - - if (opts.draw_text_align_right || opts.draw_text_rtl) - data->listening_to_text_rect.right = max(data->listening_to_icon_rect.left - SPACE_ICON_TEXT, rc_inner.left); - else - data->listening_to_text_rect.left = min(data->listening_to_icon_rect.right + SPACE_ICON_TEXT, rc_inner.right); - - if (ICON_SIZE > r_tmp.bottom - r_tmp.top) { - data->listening_to_text_rect.top += (ICON_SIZE - (r_tmp.bottom - r_tmp.top)) / 2; - data->listening_to_text_rect.bottom = data->listening_to_text_rect.top + r_tmp.bottom - r_tmp.top; - } - } - } - - r.bottom = max(next_top - SPACE_TEXT_TEXT, avatar_bottom); - - if (opts.resize_frame && ServiceExists(MS_CLIST_FRAMES_SETFRAMEOPTIONS) && frame_id != -1) { - RECT rf; - GetClientRect(hwnd, &rf); - - int size = r.bottom + opts.borders[BOTTOM]; - - if (rf.bottom - rf.top != size) { - if (FrameIsFloating()) { - HWND parent = GetParent(hwnd); - - if (parent != NULL) { - RECT rp_client, rp_window, r_window; - GetClientRect(parent, &rp_client); - GetWindowRect(parent, &rp_window); - GetWindowRect(hwnd, &r_window); - int diff = (rp_window.bottom - rp_window.top) - (rp_client.bottom - rp_client.top); - if (ServiceExists(MS_CLIST_FRAMES_ADDFRAME)) - diff += (r_window.top - rp_window.top); - - SetWindowPos(parent, 0, 0, 0, rp_window.right - rp_window.left, size + diff, SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE); - } - } - else if (IsWindowVisible(hwnd) && ServiceExists(MS_CLIST_FRAMES_ADDFRAME)) { - int flags = CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS, MAKEWPARAM(FO_FLAGS, frame_id), 0); - if (flags & F_VISIBLE) { - CallService(MS_CLIST_FRAMES_SETFRAMEOPTIONS, MAKEWPARAM(FO_HEIGHT, frame_id), (LPARAM)(size)); - CallService(MS_CLIST_FRAMES_UPDATEFRAME, (WPARAM)frame_id, (LPARAM)(FU_TBREDRAW | FU_FMREDRAW | FU_FMPOS)); - } - } - } - } - -finish: - SelectObject(hdc, hOldFont); - ReleaseDC(hwnd, hdc); -} - - -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; -} - -void EraseBackground(HWND hwnd, HDC hdc, MyDetailsFrameData* data) -{ - RECT r; - GetClientRect(hwnd, &r); - - if (data->skinning) - SkinDrawWindowBack(hwnd, hdc, &r, "Main,ID=Background"); - else { - HBRUSH hB = CreateSolidBrush((COLORREF) DBGetContactSettingDword(NULL,"MyDetails","BackgroundColor",GetSysColor(COLOR_BTNFACE))); - FillRect(hdc, &r, hB); - DeleteObject(hB); - } -} - -void DrawTextWithRect(HDC hdc, const TCHAR *text, const TCHAR *def_text, RECT rc, UINT uFormat, - bool mouse_over, Protocol *proto, bool replace_smileys = true) -{ - const TCHAR *tmp; - if (text[0] == '\0') - tmp = TranslateTS(def_text); - else - tmp = text; - - // Only first line - TCHAR *tmp2 = _tcsdup(tmp); - TCHAR *pos = _tcsrchr(tmp2, '\r'); - if (pos != NULL) pos[0] = '\0'; - pos = _tcschr(tmp2, '\n'); - if (pos != NULL) pos[0] = '\0'; - - - RECT r = rc; - r.top += BORDER_SPACE; - r.bottom -= BORDER_SPACE; - r.left += BORDER_SPACE; - r.right -= BORDER_SPACE; - - HRGN rgn = CreateRectRgnIndirect(&r); - SelectClipRgn(hdc, rgn); - - RECT rc_tmp; - int text_height; - - if (mouse_over) - { - uFormat &= ~DT_END_ELLIPSIS; - - rc_tmp = r; - text_height = DrawText(hdc, _T(" ..."), 4, &rc_tmp, DT_CALCRECT | uFormat); - rc_tmp.top += (r.bottom - r.top - text_height) >> 1; - rc_tmp.bottom = rc_tmp.top + text_height; - - if (uFormat & DT_RTLREADING) - { - rc_tmp.right = r.left + (rc_tmp.right - rc_tmp.left); - rc_tmp.left = r.left; - - r.left += rc_tmp.right - rc_tmp.left; - } - else - { - rc_tmp.left = r.right - (rc_tmp.right - rc_tmp.left); - rc_tmp.right = r.right; - - r.right -= rc_tmp.right - rc_tmp.left; - } - } - - if (replace_smileys) - DRAW_TEXT(hdc, tmp2, _tcslen(tmp2), &r, uFormat, proto->name, NULL); - else - DrawText(hdc, tmp2, _tcslen(tmp2), &r, uFormat); - - if (mouse_over) - { - DrawText(hdc, _T(" ..."), 4, &rc_tmp, uFormat); - } - - SelectClipRgn(hdc, NULL); - DeleteObject(rgn); - - if (mouse_over) - FrameRect(hdc, &rc, (HBRUSH) GetStockObject(GRAY_BRUSH)); - - free(tmp2); -} - -void Draw(HWND hwnd, HDC hdc_orig) -{ - MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd, GWLP_USERDATA); - Protocol *proto = protocols->Get(data->protocol_number); - - if (proto == NULL) { - EraseBackground(hwnd, hdc_orig, data); - return; - } - - if (data->recalc_rectangles || proto->data_changed) - CalcRectangles(hwnd); - - RECT r_full; - GetClientRect(hwnd, &r_full); - RECT r = r_full; - - HDC hdc = CreateCompatibleDC(hdc_orig); - HBITMAP hBmp = CreateBitmap32(r.right,r.bottom);//,1,GetDeviceCaps(hdc,BITSPIXEL),NULL); - SelectObject(hdc, hBmp); - - int old_bk_mode = SetBkMode(hdc, TRANSPARENT); - HFONT old_font = (HFONT) SelectObject(hdc, hFont[0]); - COLORREF old_color = GetTextColor(hdc); - SetStretchBltMode(hdc, HALFTONE); - - // Erase - EraseBackground(hwnd, hdc, data); - - r.left += min(opts.borders[LEFT], r.right); - r.right = max(r.right - opts.borders[RIGHT], r.left); - r.top += min(opts.borders[TOP], r.bottom); - r.bottom = max(r.bottom - opts.borders[BOTTOM], r.top); - - // Draw items - - UINT uFormat = DT_SINGLELINE | DT_NOPREFIX | DT_END_ELLIPSIS - | (opts.draw_text_align_right ? DT_RIGHT : DT_LEFT) - | (opts.draw_text_rtl ? DT_RTLREADING : 0); - - // Image - if (data->draw_img) - { - RECT rc = GetInnerRect(data->img_rect, r); - HRGN rgn = CreateRectRgnIndirect(&rc); - SelectClipRgn(hdc, rgn); - - int width = data->img_rect.right - data->img_rect.left; - int height = data->img_rect.bottom - data->img_rect.top; - - int round_radius; - if (opts.draw_avatar_round_corner) - { - if (opts.draw_avatar_use_custom_corner_size) - round_radius = opts.draw_avatar_custom_corner_size; - else - round_radius = min(width, height) / 6; - } - else - { - round_radius = 0; - } - - - AVATARDRAWREQUEST adr = {0}; - adr.cbSize = sizeof(AVATARDRAWREQUEST); - adr.hTargetDC = hdc; - adr.rcDraw = data->img_rect; - - adr.dwFlags = AVDRQ_OWNPIC | AVDRQ_HIDEBORDERONTRANSPARENCY | - (opts.draw_avatar_border ? AVDRQ_DRAWBORDER : 0 ) | - (opts.draw_avatar_round_corner ? AVDRQ_ROUNDEDCORNER : 0 ); - adr.clrBorder = opts.draw_avatar_border_color; - adr.radius = round_radius; - adr.alpha = 255; - adr.szProto = proto->name; - - CallService(MS_AV_DRAWAVATAR, 0, (LPARAM) &adr); - - // Clipping rgn - SelectClipRgn(hdc, NULL); - DeleteObject(rgn); - } - - // Nick - if (data->draw_nick) - { - RECT rc = GetInnerRect(data->nick_rect, r); - HRGN rgn = CreateRectRgnIndirect(&rc); - SelectClipRgn(hdc, rgn); - - SelectObject(hdc, hFont[FONT_NICK]); - SetTextColor(hdc, font_colour[FONT_NICK]); - - DrawTextWithRect(hdc, proto->nickname, DEFAULT_NICKNAME, rc, uFormat, - data->mouse_over_nick && proto->CanSetNick(), proto); - - // Clipping rgn - SelectClipRgn(hdc, NULL); - DeleteObject(rgn); - } - - // Protocol cycle icon - if (data->draw_proto_cycle) - { - RECT rc = GetInnerRect(data->next_proto_rect, r); - HRGN rgn = CreateRectRgnIndirect(&rc); - SelectClipRgn(hdc, rgn); - - HICON icon = Skin_GetIcon("MYDETAILS_NEXT_PROTOCOL"); - if (icon == NULL) - icon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_RIGHT_ARROW)); - DrawIconEx(hdc, data->next_proto_rect.left, data->next_proto_rect.top, icon, ICON_SIZE, ICON_SIZE, 0, NULL, DI_NORMAL); - Skin_ReleaseIcon(icon); - - SelectClipRgn(hdc, NULL); - DeleteObject(rgn); - - rc = GetInnerRect(data->prev_proto_rect, r); - rgn = CreateRectRgnIndirect(&rc); - SelectClipRgn(hdc, rgn); - - icon = Skin_GetIcon("MYDETAILS_PREV_PROTOCOL"); - if (icon == NULL) - icon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_RIGHT_ARROW)); - DrawIconEx(hdc, data->prev_proto_rect.left, data->prev_proto_rect.top, icon, ICON_SIZE, ICON_SIZE, 0, NULL, DI_NORMAL); - Skin_ReleaseIcon(icon); - - SelectClipRgn(hdc, NULL); - DeleteObject(rgn); - } - - // Protocol - if (data->draw_proto) - { - RECT rc = GetInnerRect(data->proto_rect, r); - RECT rr = rc; - rr.top += BORDER_SPACE; - rr.bottom -= BORDER_SPACE; - rr.left += BORDER_SPACE; - rr.right -= BORDER_SPACE; - - HRGN rgn = CreateRectRgnIndirect(&rc); - SelectClipRgn(hdc, rgn); - - SelectObject(hdc, hFont[FONT_PROTO]); - SetTextColor(hdc, font_colour[FONT_PROTO]); - - DrawText(hdc, proto->description, _tcslen(proto->description), &rr, uFormat); - - // Clipping rgn - SelectClipRgn(hdc, NULL); - DeleteObject(rgn); - - if (data->mouse_over_proto) - FrameRect(hdc, &rc, (HBRUSH) GetStockObject(GRAY_BRUSH)); - } - - // Status - if (data->draw_status) - { - RECT rtmp = GetInnerRect(data->status_rect, r); - RECT rr = rtmp; - rr.top += BORDER_SPACE; - rr.bottom -= BORDER_SPACE; - rr.left += BORDER_SPACE; - rr.right -= BORDER_SPACE; - - RECT rc = GetInnerRect(data->status_icon_rect, rr); - HRGN rgn = CreateRectRgnIndirect(&rc); - SelectClipRgn(hdc, rgn); - - HICON status_icon; - if (proto->custom_status != 0 && ProtoServiceExists(proto->name, PS_ICQ_GETCUSTOMSTATUSICON)) - { - status_icon = (HICON) CallProtoService(proto->name, PS_ICQ_GETCUSTOMSTATUSICON, proto->custom_status, 0); - } - else - { - status_icon = LoadSkinnedProtoIcon(proto->name, proto->status); - } - if (status_icon != NULL) - { - DrawIconEx(hdc, data->status_icon_rect.left, data->status_icon_rect.top, status_icon, - ICON_SIZE, ICON_SIZE, 0, NULL, DI_NORMAL); - DeleteObject(status_icon); - } - - SelectClipRgn(hdc, NULL); - DeleteObject(rgn); - - rc = GetInnerRect(data->status_text_rect, rr); - rgn = CreateRectRgnIndirect(&rc); - SelectClipRgn(hdc, rgn); - - SelectObject(hdc, hFont[FONT_STATUS]); - SetTextColor(hdc, font_colour[FONT_STATUS]); - - DrawText(hdc, proto->status_name, _tcslen(proto->status_name), &rc, uFormat); - - SelectClipRgn(hdc, NULL); - DeleteObject(rgn); - - if (data->mouse_over_status) - FrameRect(hdc, &rtmp, (HBRUSH) GetStockObject(GRAY_BRUSH)); - } - - // Away message - if (data->draw_away_msg) - { - RECT rc = GetInnerRect(data->away_msg_rect, r); - HRGN rgn = CreateRectRgnIndirect(&rc); - SelectClipRgn(hdc, rgn); - - SelectObject(hdc, hFont[FONT_AWAY_MSG]); - SetTextColor(hdc, font_colour[FONT_AWAY_MSG]); - - DrawTextWithRect(hdc, proto->status_message, DEFAULT_STATUS_MESSAGE, rc, uFormat, - data->mouse_over_away_msg && proto->CanSetStatusMsg(), proto); - - // Clipping rgn - SelectClipRgn(hdc, NULL); - DeleteObject(rgn); - } - - // Listening to - if (data->draw_listening_to) - { - if (data->listening_to_icon_rect.left == 0 && data->listening_to_icon_rect.right == 0) - { - RECT rc = GetInnerRect(data->listening_to_rect, r); - HRGN rgn = CreateRectRgnIndirect(&rc); - SelectClipRgn(hdc, rgn); - - SelectObject(hdc, hFont[FONT_LISTENING_TO]); - SetTextColor(hdc, font_colour[FONT_LISTENING_TO]); - - DrawTextWithRect(hdc, proto->listening_to, DEFAULT_LISTENING_TO, rc, uFormat, - data->mouse_over_listening_to && protocols->CanSetListeningTo(), proto); - - // Clipping rgn - SelectClipRgn(hdc, NULL); - DeleteObject(rgn); - } - else - { - RECT rtmp = GetInnerRect(data->listening_to_rect, r); - RECT rr = rtmp; - rr.top += BORDER_SPACE; - rr.bottom -= BORDER_SPACE; - rr.left += BORDER_SPACE; - rr.right -= BORDER_SPACE; - - RECT rc = GetInnerRect(data->listening_to_icon_rect, rr); - HRGN rgn = CreateRectRgnIndirect(&rc); - SelectClipRgn(hdc, rgn); - - HICON icon = Skin_GetIcon("LISTENING_TO_ICON"); - if (icon == NULL) - icon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_LISTENINGTO)); - DrawIconEx(hdc, data->listening_to_icon_rect.left, data->listening_to_icon_rect.top, icon, ICON_SIZE, ICON_SIZE, 0, NULL, DI_NORMAL); - Skin_ReleaseIcon(icon); - - SelectClipRgn(hdc, NULL); - DeleteObject(rgn); - - rc = GetInnerRect(data->listening_to_text_rect, rr); - rgn = CreateRectRgnIndirect(&rc); - SelectClipRgn(hdc, rgn); - - SelectObject(hdc, hFont[FONT_LISTENING_TO]); - SetTextColor(hdc, font_colour[FONT_LISTENING_TO]); - - DrawText(hdc, proto->listening_to, _tcslen(proto->listening_to), &rc, uFormat); - - SelectClipRgn(hdc, NULL); - DeleteObject(rgn); - - if (data->mouse_over_listening_to && protocols->CanSetListeningTo()) - FrameRect(hdc, &rtmp, (HBRUSH) GetStockObject(GRAY_BRUSH)); - } - } - - SelectObject(hdc, old_font); - SetTextColor(hdc, old_color); - SetBkMode(hdc, old_bk_mode); - - BitBlt(hdc_orig, r_full.left, r_full.top, r_full.right - r_full.left, - r_full.bottom - r_full.top, hdc, r_full.left, r_full.top, SRCCOPY); - DeleteDC(hdc); - DeleteObject(hBmp); -} - -bool InsideRect(POINT *p, RECT *r) -{ - return p->x >= r->left && p->x < r->right && p->y >= r->top && p->y < r->bottom; -} - -void MakeHover(HWND hwnd, bool draw, bool *hover, POINT *p, RECT *r) -{ - if (draw && p != NULL && r != NULL && InsideRect(p, r)) - { - if ( !*hover) - { - *hover = true; - - InvalidateRect(hwnd, NULL, FALSE); - - TRACKMOUSEEVENT tme; - tme.cbSize = sizeof(TRACKMOUSEEVENT); - tme.dwFlags = TME_LEAVE; - tme.hwndTrack = hwnd; - tme.dwHoverTime = HOVER_DEFAULT; - TrackMouseEvent(&tme); - } - } - else - { - if (*hover) - { - *hover = false; - - InvalidateRect(hwnd, NULL, FALSE); - } - } -} - -void ShowGlobalStatusMenu(HWND hwnd, MyDetailsFrameData *data, Protocol *proto, POINT &p) -{ - HMENU submenu = (HMENU) CallService(MS_CLIST_MENUGETSTATUS,0,0); - - if (opts.draw_text_align_right) - p.x = data->status_rect.right; - else - p.x = data->status_rect.left; - p.y = data->status_rect.bottom+1; - ClientToScreen(hwnd, &p); - - int ret = TrackPopupMenu(submenu, TPM_TOPALIGN|TPM_RIGHTBUTTON|TPM_RETURNCMD - | (opts.draw_text_align_right ? TPM_RIGHTALIGN : TPM_LEFTALIGN), p.x, p.y, 0, hwnd, NULL); - - if (ret) - CallService(MS_CLIST_MENUPROCESSCOMMAND, MAKEWPARAM(LOWORD(ret),MPCF_MAINMENU),(LPARAM)NULL); -} - -void ShowProtocolStatusMenu(HWND hwnd, MyDetailsFrameData *data, Protocol *proto, POINT &p) -{ - HMENU menu = (HMENU) CallService(MS_CLIST_MENUGETSTATUS,0,0); - HMENU submenu = NULL; - - if (menu != NULL) - { - // Find the correct menu item - int count = GetMenuItemCount(menu); - for (int i = 0 ; i < count && submenu == NULL; i++) - { - MENUITEMINFO mii = {0}; - - mii.cbSize = sizeof(mii); - - if (!IsWinVer98Plus()) - mii.fMask = MIIM_TYPE; - else - mii.fMask = MIIM_STRING; - - GetMenuItemInfo(menu, i, TRUE, &mii); - - if (mii.cch != 0) { - mii.cch++; - mii.dwTypeData = (TCHAR*)malloc(sizeof(TCHAR) * mii.cch); - GetMenuItemInfo(menu, i, TRUE, &mii); - - if ( _tcscmp(mii.dwTypeData, proto->description) == 0) - submenu = GetSubMenu(menu, i); - - free(mii.dwTypeData); - } - } - - if (submenu == NULL && protocols->GetSize() == 1) - { - submenu = menu; - } - } - - if (submenu != NULL) - { - if (opts.draw_text_align_right) - p.x = data->status_rect.right; - else - p.x = data->status_rect.left; - p.y = data->status_rect.bottom+1; - ClientToScreen(hwnd, &p); - - int ret = TrackPopupMenu(submenu, TPM_TOPALIGN|TPM_RIGHTBUTTON|TPM_RETURNCMD - | (opts.draw_text_align_right ? TPM_RIGHTALIGN : TPM_LEFTALIGN), p.x, p.y, 0, hwnd, NULL); - - if (ret) - CallService(MS_CLIST_MENUPROCESSCOMMAND, MAKEWPARAM(LOWORD(ret),MPCF_MAINMENU),(LPARAM)NULL); - - /* - if (to_remove < 5) - { - DestroyMenu(submenu); - } - */ - } - else - { - // Well, lets do it by hand - static int statusModePf2List[]={0xFFFFFFFF,PF2_ONLINE,PF2_SHORTAWAY,PF2_LONGAWAY,PF2_LIGHTDND,PF2_HEAVYDND,PF2_FREECHAT,PF2_INVISIBLE,PF2_ONTHEPHONE,PF2_OUTTOLUNCH}; - - menu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU1)); - submenu = GetSubMenu(menu, 0); - CallService(MS_LANGPACK_TRANSLATEMENU,(WPARAM)submenu,0); - - DWORD flags = CallProtoService(proto->name, PS_GETCAPS, PFLAGNUM_2,0); - for ( int i = GetMenuItemCount(submenu) -1 ; i >= 0 ; i-- ) - { - if ( !(flags & statusModePf2List[i])) - { - // Hide menu - RemoveMenu(submenu, i, MF_BYPOSITION); - } - } - - if (opts.draw_text_align_right) - p.x = data->status_rect.right; - else - p.x = data->status_rect.left; - p.y = data->status_rect.bottom+1; - ClientToScreen(hwnd, &p); - - int ret = TrackPopupMenu(submenu, TPM_TOPALIGN|TPM_RIGHTBUTTON|TPM_RETURNCMD - | (opts.draw_text_align_right ? TPM_RIGHTALIGN : TPM_LEFTALIGN), p.x, p.y, 0, hwnd, NULL); - DestroyMenu(menu); - if (ret) - { - proto->SetStatus(ret); - } - } -} - -void ShowListeningToMenu(HWND hwnd, MyDetailsFrameData *data, Protocol *proto, POINT &p) -{ - HMENU menu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU1)); - HMENU submenu = GetSubMenu(menu, 5); - CallService(MS_LANGPACK_TRANSLATEMENU,(WPARAM)submenu,0); - - // Add this proto to menu - TCHAR tmp[128]; - mir_sntprintf(tmp, SIZEOF(tmp), TranslateT("Enable Listening To for %s"), proto->description); - - MENUITEMINFO mii = {0}; - mii.cbSize = sizeof(mii); - mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE; - mii.fType = MFT_STRING; - mii.fState = proto->ListeningToEnabled() ? MFS_CHECKED : 0; - mii.dwTypeData = tmp; - mii.cch = _tcslen(tmp); - mii.wID = 1; - - if ( !proto->CanSetListeningTo()) - { - mii.fState |= MFS_DISABLED; - } - - InsertMenuItem(submenu, 0, TRUE, &mii); - - ZeroMemory(&mii, sizeof(mii)); - mii.cbSize = sizeof(mii); - mii.fMask = MIIM_STATE; - mii.fState = protocols->ListeningToEnabled() ? MFS_CHECKED : 0; - - if ( !protocols->CanSetListeningTo()) - { - mii.fState |= MFS_DISABLED; - } - - SetMenuItemInfo(submenu, ID_LISTENINGTOPOPUP_SENDLISTENINGTO, FALSE, &mii); - - if (opts.draw_text_align_right) - p.x = data->listening_to_rect.right; - else - p.x = data->listening_to_rect.left; - p.y = data->listening_to_rect.bottom+1; - ClientToScreen(hwnd, &p); - - int ret = TrackPopupMenu(submenu, TPM_TOPALIGN|TPM_RIGHTBUTTON|TPM_RETURNCMD - | (opts.draw_text_align_right ? TPM_RIGHTALIGN : TPM_LEFTALIGN), p.x, p.y, 0, hwnd, NULL); - DestroyMenu(menu); - - switch(ret) - { - case 1: - { - CallService(MS_LISTENINGTO_ENABLE, (LPARAM) proto->name, !proto->ListeningToEnabled()); - break; - } - case ID_LISTENINGTOPOPUP_SENDLISTENINGTO: - { - CallService(MS_LISTENINGTO_ENABLE, 0, !protocols->ListeningToEnabled()); - break; - } - } - -} - - -LRESULT CALLBACK FrameWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - switch(msg) - { - case WM_CREATE: - { - MyDetailsFrameData *data = new MyDetailsFrameData(); - ZeroMemory(data, sizeof(MyDetailsFrameData)); - SetWindowLong(hwnd, GWLP_USERDATA, (LONG) data); - - data->recalc_rectangles = true; - data->get_status_messages = false; - data->showing_menu = false; - data->skinning = ServiceExists(MS_SKIN_DRAWGLYPH) != 0; - - data->protocol_number = DBGetContactSettingWord(NULL,"MyDetails","ProtocolNumber",0); - if (data->protocol_number >= protocols->GetSize()) - data->protocol_number = 0; - - SetCycleTime(hwnd); - SetStatusMessageRefreshTime(hwnd); - - TRACKMOUSEEVENT tme; - tme.cbSize = sizeof(TRACKMOUSEEVENT); - tme.dwFlags = TME_HOVER | TME_LEAVE; - tme.hwndTrack = hwnd; - tme.dwHoverTime = HOVER_DEFAULT; - TrackMouseEvent(&tme); - - return TRUE; - } - - case WM_PRINTCLIENT: - Draw(hwnd, (HDC)wParam); - return TRUE; - - case WM_PAINT: - { - RECT r; - - if (GetUpdateRect(hwnd, &r, FALSE)) - { - PAINTSTRUCT ps; - - HDC hdc = BeginPaint(hwnd, &ps); - Draw(hwnd, hdc); - EndPaint(hwnd, &ps); - } - - return TRUE; - } - - case WM_SIZE: - { - //InvalidateRect(hwnd, NULL, FALSE); - MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd, GWLP_USERDATA); - data->recalc_rectangles = true; - RedrawFrame(); - break; - } - - case WM_TIMER: - { - MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd, GWLP_USERDATA); - - if (wParam == ID_FRAME_TIMER) - { - if ( !data->showing_menu) - CallService(MS_MYDETAILS_SHOWNEXTPROTOCOL, 0, 0); - } - else if (wParam == ID_RECALC_TIMER) - { - KillTimer(hwnd, ID_RECALC_TIMER); - - if (data->get_status_messages) - { - SetStatusMessageRefreshTime(hwnd); - data->get_status_messages = false; - - protocols->GetStatuses(); - protocols->GetStatusMsgs(); - - data->recalc_rectangles = true; - } - - RedrawFrame(); - } - else if (wParam == ID_STATUSMESSAGE_TIMER) - { - SetStatusMessageRefreshTime(hwnd); - - PostMessage(hwnd, MWM_STATUS_MSG_CHANGED, 0, 0); - } - - return TRUE; - } - - case WM_LBUTTONUP: - { - MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd, GWLP_USERDATA); - Protocol *proto = protocols->Get(data->protocol_number); - if (proto == NULL) - break; - - POINT p; - p.x = LOWORD(lParam); - p.y = HIWORD(lParam); - - // In image? - if (data->draw_img && InsideRect(&p, &data->img_rect) && proto->CanSetAvatar()) - { - if (opts.global_on_avatar) - CallService(MS_MYDETAILS_SETMYAVATARUI, 0, 0); - else - CallService(MS_MYDETAILS_SETMYAVATARUI, 0, (LPARAM) proto->name); - } - // In nick? - else if (data->draw_nick && InsideRect(&p, &data->nick_rect) && proto->CanSetNick()) - { - if (opts.global_on_nickname) - CallService(MS_MYDETAILS_SETMYNICKNAMEUI, 0, 0); - else - CallService(MS_MYDETAILS_SETMYNICKNAMEUI, 0, (LPARAM) proto->name); - } - // In proto cycle button? - else if (data->draw_proto_cycle && InsideRect(&p, &data->next_proto_rect)) - { - CallService(MS_MYDETAILS_SHOWNEXTPROTOCOL, 0, 0); - } - else if (data->draw_proto_cycle && InsideRect(&p, &data->prev_proto_rect)) - { - CallService(MS_MYDETAILS_SHOWPREVIOUSPROTOCOL, 0, 0); - } - // In status message? - else if (data->draw_away_msg && InsideRect(&p, &data->away_msg_rect) && proto->CanSetStatusMsg()) - { - if (opts.global_on_status_message) - CallService(MS_MYDETAILS_SETMYSTATUSMESSAGEUI, 0, 0); - else - CallService(MS_MYDETAILS_SETMYSTATUSMESSAGEUI, 0, (LPARAM) proto->name); - } - // In status? - else if (data->draw_status && InsideRect(&p, &data->status_rect)) - { - data->showing_menu = true; - - if (opts.global_on_status) - ShowGlobalStatusMenu(hwnd, data, proto, p); - else - ShowProtocolStatusMenu(hwnd, data, proto, p); - - data->showing_menu = false; - } - // In listening to? - else if (data->draw_listening_to && InsideRect(&p, &data->listening_to_rect) && protocols->CanSetListeningTo()) - { - ShowListeningToMenu(hwnd, data, proto, p); - } - // In protocol? - else if (data->draw_proto && InsideRect(&p, &data->proto_rect)) - { - data->showing_menu = true; - - HMENU menu = CreatePopupMenu(); - - for (int i = protocols->GetSize() - 1 ; i >= 0 ; i--) - { - MENUITEMINFO mii = {0}; - mii.cbSize = sizeof(mii); - mii.fMask = MIIM_ID | MIIM_TYPE; - mii.fType = MFT_STRING; - mii.dwTypeData = protocols->Get(i)->description; - mii.cch = _tcslen(protocols->Get(i)->description); - mii.wID = i + 1; - - if (i == data->protocol_number) { - mii.fMask |= MIIM_STATE; - mii.fState = MFS_DISABLED; - } - - InsertMenuItem(menu, 0, TRUE, &mii); - } - - if (opts.draw_text_align_right) - p.x = data->proto_rect.right; - else - p.x = data->proto_rect.left; - p.y = data->proto_rect.bottom+1; - ClientToScreen(hwnd, &p); - - int ret = TrackPopupMenu(menu, TPM_TOPALIGN|TPM_LEFTALIGN|TPM_RIGHTBUTTON|TPM_RETURNCMD, p.x, p.y, 0, hwnd, NULL); - DestroyMenu(menu); - - if (ret != 0) - { - PluginCommand_ShowProtocol(NULL, (WPARAM) protocols->Get(ret-1)->name); - } - - data->showing_menu = false; - } - - break; - } - - case WM_MEASUREITEM: - { - return CallService(MS_CLIST_MENUMEASUREITEM,wParam,lParam); - } - case WM_DRAWITEM: - { - return CallService(MS_CLIST_MENUDRAWITEM,wParam,lParam); - } - - case WM_CONTEXTMENU: - { - MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd, GWLP_USERDATA); - Protocol *proto = protocols->Get(data->protocol_number); - if (proto == NULL) - break; - - POINT p; - p.x = LOWORD(lParam); - p.y = HIWORD(lParam); - - ScreenToClient(hwnd, &p); - - data->showing_menu = true; - - // In image? - if (data->draw_img && InsideRect(&p, &data->img_rect)) - { - HMENU menu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU1)); - HMENU submenu = GetSubMenu(menu, 4); - CallService(MS_LANGPACK_TRANSLATEMENU,(WPARAM)submenu,0); - - // Add this proto to menu - TCHAR tmp[128]; - mir_sntprintf(tmp, SIZEOF(tmp), TranslateT("Set My Avatar for %s..."), proto->description); - - MENUITEMINFO mii = {0}; - mii.cbSize = sizeof(mii); - mii.fMask = MIIM_ID | MIIM_TYPE; - mii.fType = MFT_STRING; - mii.dwTypeData = tmp; - mii.cch = _tcslen(tmp); - mii.wID = 1; - - if ( !proto->CanSetAvatar()) - { - mii.fMask |= MIIM_STATE; - mii.fState = MFS_DISABLED; - } - - InsertMenuItem(submenu, 0, TRUE, &mii); - - ClientToScreen(hwnd, &p); - - int ret = TrackPopupMenu(submenu, TPM_TOPALIGN|TPM_LEFTALIGN|TPM_RIGHTBUTTON|TPM_RETURNCMD, p.x, p.y, 0, hwnd, NULL); - DestroyMenu(menu); - - switch(ret) - { - case 1: - { - CallService(MS_MYDETAILS_SETMYAVATARUI, 0, (LPARAM) proto->name); - break; - } - case ID_AVATARPOPUP_SETMYAVATAR: - { - CallService(MS_MYDETAILS_SETMYAVATARUI, 0, 0); - break; - } - } - } - // In nick? - else if (data->draw_nick && InsideRect(&p, &data->nick_rect)) - { - HMENU menu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU1)); - HMENU submenu = GetSubMenu(menu, 2); - CallService(MS_LANGPACK_TRANSLATEMENU,(WPARAM)submenu,0); - - // Add this proto to menu - TCHAR tmp[128]; - mir_sntprintf(tmp, SIZEOF(tmp), TranslateT("Set My Nickname for %s..."), proto->description); - - MENUITEMINFO mii = {0}; - mii.cbSize = sizeof(mii); - mii.fMask = MIIM_ID | MIIM_TYPE; - mii.fType = MFT_STRING; - mii.dwTypeData = tmp; - mii.cch = _tcslen(tmp); - mii.wID = 1; - - if ( !proto->CanSetNick()) - { - mii.fMask |= MIIM_STATE; - mii.fState = MFS_DISABLED; - } - - InsertMenuItem(submenu, 0, TRUE, &mii); - - ClientToScreen(hwnd, &p); - - int ret = TrackPopupMenu(submenu, TPM_TOPALIGN|TPM_LEFTALIGN|TPM_RIGHTBUTTON|TPM_RETURNCMD, p.x, p.y, 0, hwnd, NULL); - DestroyMenu(menu); - - switch(ret) - { - case 1: - { - CallService(MS_MYDETAILS_SETMYNICKNAMEUI, 0, (LPARAM) proto->name); - break; - } - case ID_NICKPOPUP_SETMYNICKNAME: - { - CallService(MS_MYDETAILS_SETMYNICKNAMEUI, 0, 0); - break; - } - } - } - // In proto cycle button? - else if (data->draw_proto_cycle && InsideRect(&p, &data->next_proto_rect)) - { - CallService(MS_MYDETAILS_SHOWPREVIOUSPROTOCOL, 0, 0); - } - else if (data->draw_proto_cycle && InsideRect(&p, &data->prev_proto_rect)) - { - CallService(MS_MYDETAILS_SHOWNEXTPROTOCOL, 0, 0); - } - // In status message? - else if (data->draw_away_msg && InsideRect(&p, &data->away_msg_rect)) - { - TCHAR tmp[128]; - - HMENU menu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU1)); - HMENU submenu = GetSubMenu(menu, 3); - TranslateMenu(submenu); - - if (protocols->CanSetStatusMsgPerProtocol()) { - // Add this proto to menu - mir_sntprintf(tmp, SIZEOF(tmp), TranslateT("Set My Status Message for %s..."), proto->description); - - MENUITEMINFO mii = {0}; - mii.cbSize = sizeof(mii); - mii.fMask = MIIM_ID | MIIM_TYPE; - mii.fType = MFT_STRING; - mii.dwTypeData = tmp; - mii.cch = _tcslen(tmp); - mii.wID = 1; - - if ( !proto->CanSetStatusMsg()) { - mii.fMask |= MIIM_STATE; - mii.fState = MFS_DISABLED; - } - - InsertMenuItem(submenu, 0, TRUE, &mii); - } - - // Add this to menu - mir_sntprintf(tmp, SIZEOF(tmp), TranslateT("Set My Status Message for %s..."), - CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, proto->status, GSMDF_TCHAR)); - - MENUITEMINFO mii = {0}; - mii.cbSize = sizeof(mii); - mii.fMask = MIIM_ID | MIIM_TYPE; - mii.fType = MFT_STRING; - mii.dwTypeData = tmp; - mii.cch = _tcslen(tmp); - mii.wID = 2; - - if (proto->status == ID_STATUS_OFFLINE) { - mii.fMask |= MIIM_STATE; - mii.fState = MFS_DISABLED; - } - - InsertMenuItem(submenu, 0, TRUE, &mii); - - ClientToScreen(hwnd, &p); - - int ret = TrackPopupMenu(submenu, TPM_TOPALIGN|TPM_LEFTALIGN|TPM_RIGHTBUTTON|TPM_RETURNCMD, p.x, p.y, 0, hwnd, NULL); - DestroyMenu(menu); - - switch(ret) { - case 1: - CallService(MS_MYDETAILS_SETMYSTATUSMESSAGEUI, 0, (LPARAM) proto->name); - break; - - case 2: - CallService(MS_MYDETAILS_SETMYSTATUSMESSAGEUI, (WPARAM) proto->status, 0); - break; - - case ID_STATUSMESSAGEPOPUP_SETMYSTATUSMESSAGE: - CallService(MS_MYDETAILS_SETMYSTATUSMESSAGEUI, 0, 0); - break; - } - } - // In status? - else if (data->draw_status && InsideRect(&p, &data->status_rect)) - { - if (opts.global_on_status) - ShowProtocolStatusMenu(hwnd, data, proto, p); - else - ShowGlobalStatusMenu(hwnd, data, proto, p); - } - // In listening to? - else if (data->draw_listening_to && InsideRect(&p, &data->listening_to_rect) && protocols->CanSetListeningTo()) - { - ShowListeningToMenu(hwnd, data, proto, p); - } - // In protocol? - else if (data->draw_proto && InsideRect(&p, &data->proto_rect)) - { - } - // Default context menu - else - { - HMENU menu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU1)); - HMENU submenu = GetSubMenu(menu, 1); - CallService(MS_LANGPACK_TRANSLATEMENU,(WPARAM)submenu,0); - - if (opts.cycle_through_protocols) - RemoveMenu(submenu, ID_CYCLE_THROUGH_PROTOS, MF_BYCOMMAND); - else - RemoveMenu(submenu, ID_DONT_CYCLE_THROUGH_PROTOS, MF_BYCOMMAND); - - // Add this proto to menu - TCHAR tmp[128]; - MENUITEMINFO mii = {0}; - - mir_sntprintf(tmp, SIZEOF(tmp), TranslateT("Enable Listening To for %s"), proto->description); - - ZeroMemory(&mii, sizeof(mii)); - mii.cbSize = sizeof(mii); - mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE; - mii.fType = MFT_STRING; - mii.fState = proto->ListeningToEnabled() ? MFS_CHECKED : 0; - mii.dwTypeData = tmp; - mii.cch = _tcslen(tmp); - mii.wID = 5; - - if ( !proto->CanSetListeningTo()) - { - mii.fState |= MFS_DISABLED; - } - - InsertMenuItem(submenu, 0, TRUE, &mii); - - // Add this to menu - mir_sntprintf(tmp, SIZEOF(tmp), TranslateT("Set My Status Message for %s..."), - CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, proto->status, GSMDF_TCHAR)); - - ZeroMemory(&mii, sizeof(mii)); - mii.cbSize = sizeof(mii); - mii.fMask = MIIM_ID | MIIM_TYPE; - mii.fType = MFT_STRING; - mii.dwTypeData = tmp; - mii.cch = _tcslen(tmp); - mii.wID = 4; - - if (proto->status == ID_STATUS_OFFLINE) { - mii.fMask |= MIIM_STATE; - mii.fState = MFS_DISABLED; - } - - InsertMenuItem(submenu, 0, TRUE, &mii); - - if (protocols->CanSetStatusMsgPerProtocol()) - { - // Add this proto to menu - mir_sntprintf(tmp, SIZEOF(tmp), TranslateT("Set My Status Message for %s..."), proto->description); - - ZeroMemory(&mii, sizeof(mii)); - mii.cbSize = sizeof(mii); - mii.fMask = MIIM_ID | MIIM_TYPE; - mii.fType = MFT_STRING; - mii.dwTypeData = tmp; - mii.cch = _tcslen(tmp); - mii.wID = 3; - - if ( !proto->CanSetStatusMsg()) - { - mii.fMask |= MIIM_STATE; - mii.fState = MFS_DISABLED; - } - - InsertMenuItem(submenu, 0, TRUE, &mii); - } - - mir_sntprintf(tmp, SIZEOF(tmp), TranslateT("Set My Nickname for %s..."), proto->description); - - ZeroMemory(&mii, sizeof(mii)); - mii.cbSize = sizeof(mii); - mii.fMask = MIIM_ID | MIIM_TYPE; - mii.fType = MFT_STRING; - mii.dwTypeData = tmp; - mii.cch = _tcslen(tmp); - mii.wID = 2; - - if ( !proto->CanSetNick()) - { - mii.fMask |= MIIM_STATE; - mii.fState = MFS_DISABLED; - } - - InsertMenuItem(submenu, 0, TRUE, &mii); - - mir_sntprintf(tmp, SIZEOF(tmp), TranslateT("Set My Avatar for %s..."), proto->description); - - ZeroMemory(&mii, sizeof(mii)); - mii.cbSize = sizeof(mii); - mii.fMask = MIIM_ID | MIIM_TYPE; - mii.fType = MFT_STRING; - mii.dwTypeData = tmp; - mii.cch = _tcslen(tmp); - mii.wID = 1; - - if ( !proto->CanSetAvatar()) - { - mii.fMask |= MIIM_STATE; - mii.fState = MFS_DISABLED; - } - - InsertMenuItem(submenu, 0, TRUE, &mii); - - ZeroMemory(&mii, sizeof(mii)); - mii.cbSize = sizeof(mii); - mii.fMask = MIIM_STATE; - mii.fState = protocols->ListeningToEnabled() ? MFS_CHECKED : 0; - - if ( !protocols->CanSetListeningTo()) - { - mii.fState |= MFS_DISABLED; - } - - SetMenuItemInfo(submenu, ID_CONTEXTPOPUP_ENABLELISTENINGTO, FALSE, &mii); - - ClientToScreen(hwnd, &p); - - int ret = TrackPopupMenu(submenu, TPM_TOPALIGN|TPM_LEFTALIGN|TPM_RIGHTBUTTON|TPM_RETURNCMD, p.x, p.y, 0, hwnd, NULL); - DestroyMenu(menu); - - switch(ret) - { - case 1: - { - CallService(MS_MYDETAILS_SETMYAVATARUI, 0, (LPARAM) proto->name); - break; - } - case ID_AVATARPOPUP_SETMYAVATAR: - { - CallService(MS_MYDETAILS_SETMYAVATARUI, 0, 0); - break; - } - case 2: - { - CallService(MS_MYDETAILS_SETMYNICKNAMEUI, 0, (LPARAM) proto->name); - break; - } - case ID_NICKPOPUP_SETMYNICKNAME: - { - CallService(MS_MYDETAILS_SETMYNICKNAMEUI, 0, 0); - break; - } - case 3: - { - CallService(MS_MYDETAILS_SETMYSTATUSMESSAGEUI, 0, (LPARAM) proto->name); - break; - } - case 4: - { - CallService(MS_MYDETAILS_SETMYSTATUSMESSAGEUI, (WPARAM) proto->status, 0); - break; - } - case ID_STATUSMESSAGEPOPUP_SETMYSTATUSMESSAGE: - { - CallService(MS_MYDETAILS_SETMYSTATUSMESSAGEUI, 0, 0); - break; - } - case 5: - { - CallService(MS_LISTENINGTO_ENABLE, (LPARAM) proto->name, !proto->ListeningToEnabled()); - break; - } - case ID_CONTEXTPOPUP_ENABLELISTENINGTO: - { - CallService(MS_LISTENINGTO_ENABLE, 0, !protocols->ListeningToEnabled()); - break; - } - case ID_SHOW_NEXT_PROTO: - { - CallService(MS_MYDETAILS_SHOWNEXTPROTOCOL, 0, 0); - break; - } - case ID_SHOW_PREV_PROTO: - { - CallService(MS_MYDETAILS_SHOWPREVIOUSPROTOCOL, 0, 0); - break; - } - case ID_CYCLE_THROUGH_PROTOS: - { - CallService(MS_MYDETAILS_CYCLE_THROUGH_PROTOCOLS, TRUE, 0); - break; - } - case ID_DONT_CYCLE_THROUGH_PROTOS: - { - CallService(MS_MYDETAILS_CYCLE_THROUGH_PROTOCOLS, FALSE, 0); - break; - } - } - } - - data->showing_menu = false; - - - break; - } - - case WM_MOUSELEAVE: - { - TRACKMOUSEEVENT tme; - tme.cbSize = sizeof(TRACKMOUSEEVENT); - tme.dwFlags = TME_HOVER; - tme.hwndTrack = hwnd; - tme.dwHoverTime = HOVER_DEFAULT; - TrackMouseEvent(&tme); - } - case WM_NCMOUSEMOVE: - { - MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd, GWLP_USERDATA); - - MakeHover(hwnd, data->draw_img, &data->mouse_over_img, NULL, NULL); - MakeHover(hwnd, data->draw_nick, &data->mouse_over_nick, NULL, NULL); - MakeHover(hwnd, data->draw_proto, &data->mouse_over_proto, NULL, NULL); - MakeHover(hwnd, data->draw_status, &data->mouse_over_status, NULL, NULL); - MakeHover(hwnd, data->draw_away_msg, &data->mouse_over_away_msg, NULL, NULL); - MakeHover(hwnd, data->draw_listening_to, &data->mouse_over_listening_to, NULL, NULL); - - break; - } - - case WM_MOUSEHOVER: - { - TRACKMOUSEEVENT tme; - tme.cbSize = sizeof(TRACKMOUSEEVENT); - tme.dwFlags = TME_LEAVE; - tme.hwndTrack = hwnd; - tme.dwHoverTime = HOVER_DEFAULT; - TrackMouseEvent(&tme); - } - case WM_MOUSEMOVE: - { - MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd, GWLP_USERDATA); - Protocol *proto = protocols->Get(data->protocol_number); - if (proto == NULL) - break; - - POINT p; - p.x = LOWORD(lParam); - p.y = HIWORD(lParam); - - MakeHover(hwnd, data->draw_img, &data->mouse_over_img, &p, &data->img_rect); - MakeHover(hwnd, data->draw_nick, &data->mouse_over_nick, &p, &data->nick_rect); - MakeHover(hwnd, data->draw_proto, &data->mouse_over_proto, &p, &data->proto_rect); - MakeHover(hwnd, data->draw_status, &data->mouse_over_status, &p, &data->status_rect); - MakeHover(hwnd, data->draw_away_msg, &data->mouse_over_away_msg, &p, &data->away_msg_rect); - MakeHover(hwnd, data->draw_listening_to, &data->mouse_over_listening_to, &p, &data->listening_to_rect); - - break; - } - - case WM_NOTIFY: - { - LPNMHDR lpnmhdr = (LPNMHDR) lParam; - - int i = (int) lpnmhdr->code; - - switch (lpnmhdr->code) { - case TTN_GETDISPINFO: - { - MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd, GWLP_USERDATA); - Protocol *proto = protocols->Get(data->protocol_number); - - LPNMTTDISPINFO lpttd = (LPNMTTDISPINFO) lpnmhdr; - SendMessage(lpnmhdr->hwndFrom, TTM_SETMAXTIPWIDTH, 0, 300); - - if (lpnmhdr->hwndFrom == data->nick_tt_hwnd) - lpttd->lpszText = proto->nickname; - else if (lpnmhdr->hwndFrom == data->status_tt_hwnd) - lpttd->lpszText = proto->status_name; - else if (lpnmhdr->hwndFrom == data->away_msg_tt_hwnd) - lpttd->lpszText = proto->status_message; - else if (lpnmhdr->hwndFrom == data->listening_to_tt_hwnd) - lpttd->lpszText = proto->listening_to; - else if (lpnmhdr->hwndFrom == data->next_proto_tt_hwnd) - lpttd->lpszText = _T("Show next protocol"); - else if (lpnmhdr->hwndFrom == data->prev_proto_tt_hwnd) - lpttd->lpszText = _T("Show previous protocol"); - - return 0; - } - } - - break; - } - - case WM_DESTROY: - { - KillTimer(hwnd, ID_FRAME_TIMER); - - MyDetailsFrameData *tmp = (MyDetailsFrameData *)GetWindowLong(hwnd, GWLP_USERDATA); - DeleteTooltipWindows(tmp); - if (tmp != NULL) delete tmp; - - break; - } - - // Custom Messages ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - case MWM_REFRESH: - { - MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd, GWLP_USERDATA); -// data->recalc_rectangles = true; - - KillTimer(hwnd, ID_RECALC_TIMER); - SetTimer(hwnd, ID_RECALC_TIMER, RECALC_TIME, NULL); - break; - } - - case MWM_AVATAR_CHANGED: - { - Protocol *proto = protocols->Get((const char *) wParam); - - if (proto != NULL) - { - proto->GetAvatar(); - RefreshFrame(); - } - - break; - } - - case MWM_NICK_CHANGED: - { - Protocol *proto = protocols->Get((const char *) wParam); - - if (proto != NULL) - { - proto->GetNick(); - RefreshFrame(); - } - - break; - } - - case MWM_STATUS_CHANGED: - { - Protocol *proto = protocols->Get((const char *) wParam); - - if (proto != NULL) - { - proto->GetStatus(); - proto->GetStatusMsg(); - proto->GetNick(); - - RefreshFrame(); - } - - break; - } - - case MWM_STATUS_MSG_CHANGED: - { - MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd, GWLP_USERDATA); - data->get_status_messages = true; - - RefreshFrame(); - break; - } - - case MWM_LISTENINGTO_CHANGED: - { - if (wParam != NULL) - { - Protocol *proto = protocols->Get((const char *) wParam); - if (proto != NULL) - proto->GetListeningTo(); - } - - RefreshFrameAndCalcRects(); - break; - } - } - - return DefWindowProc(hwnd, msg, wParam, lParam); -} - - -INT_PTR ShowHideFrameFunc(WPARAM wParam, LPARAM lParam) -{ - if (ServiceExists(MS_CLIST_FRAMES_ADDFRAME)) - { - CallService(MS_CLIST_FRAMES_SHFRAME, frame_id, 0); - } - else - { - if (MyDetailsFrameVisible()) - { - SendMessage(hwnd_container, WM_CLOSE, 0, 0); - } - else - { - ShowWindow(hwnd_container, SW_SHOW); - DBWriteContactSettingByte(0, MODULE_NAME, SETTING_FRAME_VISIBLE, 1); - } - - FixMainMenu(); - } - return 0; -} - - -INT_PTR ShowFrameFunc(WPARAM wParam, LPARAM lParam) -{ - if (ServiceExists(MS_CLIST_FRAMES_ADDFRAME)) - { - int flags = CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS, MAKEWPARAM(FO_FLAGS, frame_id), 0); - if (!(flags & F_VISIBLE)) - CallService(MS_CLIST_FRAMES_SHFRAME, frame_id, 0); - } - else - { - if ( !MyDetailsFrameVisible()) - { - ShowWindow(hwnd_container, SW_SHOW); - DBWriteContactSettingByte(0, MODULE_NAME, SETTING_FRAME_VISIBLE, 1); - - FixMainMenu(); - } - - } - return 0; -} - - -INT_PTR HideFrameFunc(WPARAM wParam, LPARAM lParam) -{ - if (ServiceExists(MS_CLIST_FRAMES_ADDFRAME)) - { - int flags = CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS, MAKEWPARAM(FO_FLAGS, frame_id), 0); - if (flags & F_VISIBLE) - CallService(MS_CLIST_FRAMES_SHFRAME, frame_id, 0); - } - else - { - if (MyDetailsFrameVisible()) - { - SendMessage(hwnd_container, WM_CLOSE, 0, 0); - - FixMainMenu(); - } - } - return 0; -} - - -void FixMainMenu() -{ - CLISTMENUITEM mi = {0}; - mi.cbSize = sizeof(CLISTMENUITEM); - mi.flags = CMIM_NAME; - - if (MyDetailsFrameVisible()) - mi.pszName = Translate("Hide My Details"); - else - mi.pszName = Translate("Show My Details"); - - CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hMenuShowHideFrame, (LPARAM)&mi); -} - -#include - -void RedrawFrame() -{ - if (frame_id == -1) - InvalidateRect(hwnd_container, NULL, TRUE); - else - CallService(MS_CLIST_FRAMES_UPDATEFRAME, (WPARAM)frame_id, (LPARAM)FU_TBREDRAW | FU_FMREDRAW); -} - -void RefreshFrameAndCalcRects() -{ - if (hwnd_frame != NULL) - { - MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd_frame, GWLP_USERDATA); - data->recalc_rectangles = true; - - PostMessage(hwnd_frame, MWM_REFRESH, 0, 0); - } -} - -void RefreshFrame() -{ - if (hwnd_frame != NULL) - PostMessage(hwnd_frame, MWM_REFRESH, 0, 0); -} - -// only used when no multiwindow functionality is available -bool MyDetailsFrameVisible() -{ - return IsWindowVisible(hwnd_container) ? true : false; -} - -void SetMyDetailsFrameVisible(bool visible) -{ - if (frame_id == -1 && hwnd_container != 0) - { - ShowWindow(hwnd_container, visible ? SW_SHOW : SW_HIDE); - } -} - -void SetCycleTime() -{ - if (hwnd_frame != NULL) - SetCycleTime(hwnd_frame); -} - -void SetCycleTime(HWND hwnd) -{ - KillTimer(hwnd, ID_FRAME_TIMER); - - if (opts.cycle_through_protocols) - SetTimer(hwnd, ID_FRAME_TIMER, opts.seconds_to_show_protocol * 1000, 0); -} - -void SetStatusMessageRefreshTime() -{ - if (hwnd_frame != NULL) - SetStatusMessageRefreshTime(hwnd_frame); -} - -void SetStatusMessageRefreshTime(HWND hwnd) -{ - KillTimer(hwnd, ID_STATUSMESSAGE_TIMER); - - opts.refresh_status_message_timer = DBGetContactSettingWord(NULL,"MyDetails","RefreshStatusMessageTimer",12); - if (opts.refresh_status_message_timer > 0) - { - SetTimer(hwnd, ID_STATUSMESSAGE_TIMER, opts.refresh_status_message_timer * 1000, NULL); - } -} - -INT_PTR PluginCommand_ShowNextProtocol(WPARAM wParam,LPARAM lParam) -{ - if (hwnd_frame == NULL) - return -1; - - MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd_frame, GWLP_USERDATA); - - data->protocol_number ++; - if (data->protocol_number >= protocols->GetSize()) - { - data->protocol_number = 0; - } - - DBWriteContactSettingWord(NULL,"MyDetails","ProtocolNumber",data->protocol_number); - - data->recalc_rectangles = true; - - SetCycleTime(); - - RedrawFrame(); - - return 0; -} - -INT_PTR PluginCommand_ShowPreviousProtocol(WPARAM wParam,LPARAM lParam) -{ - if (hwnd_frame == NULL) - return -1; - - MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd_frame, GWLP_USERDATA); - - data->protocol_number --; - if (data->protocol_number < 0) - { - data->protocol_number = protocols->GetSize() - 1; - } - - DBWriteContactSettingWord(NULL,"MyDetails","ProtocolNumber",data->protocol_number); - - data->recalc_rectangles = true; - - SetCycleTime(); - - RedrawFrame(); - - return 0; -} - -INT_PTR PluginCommand_ShowProtocol(WPARAM wParam,LPARAM lParam) -{ - char * proto = (char *)lParam; - int proto_num = -1; - - if (proto == NULL) - return -1; - - for (int i = 0 ; i < protocols->GetSize() ; i++) - { - if (_stricmp(protocols->Get(i)->name, proto) == 0) - { - proto_num = i; - break; - } - } - - if (proto_num == -1) - return -2; - - if (hwnd_frame == NULL) - return -3; - - MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd_frame, GWLP_USERDATA); - - data->protocol_number = proto_num; - DBWriteContactSettingWord(NULL,"MyDetails","ProtocolNumber",data->protocol_number); - - data->recalc_rectangles = true; - - SetCycleTime(); - - RedrawFrame(); - - return 0; -} - -int SettingsChangedHook(WPARAM wParam, LPARAM lParam) -{ - if (hwnd_frame == NULL) - return 0; - - DBCONTACTWRITESETTING *cws = (DBCONTACTWRITESETTING*)lParam; - - if ((HANDLE)wParam == NULL) - { - Protocol *proto = protocols->Get((const char *) cws->szModule); - - if ( !strcmp(cws->szSetting,"Status") - || ( proto != NULL && proto->custom_status != 0 - && proto->custom_status_name != NULL - && !strcmp(cws->szSetting, _T2A(proto->custom_status_name))) - || ( proto != NULL && proto->custom_status != 0 - && proto->custom_status_message != NULL - && !strcmp(cws->szSetting, _T2A(proto->custom_status_message)))) - { - // Status changed - if (proto != NULL) - PostMessage(hwnd_frame, MWM_STATUS_CHANGED, (WPARAM) proto->name, 0); - } - else if (!strcmp(cws->szSetting,"MyHandle") - || !strcmp(cws->szSetting,"UIN") - || !strcmp(cws->szSetting,"Nick") - || !strcmp(cws->szSetting,"FirstName") - || !strcmp(cws->szSetting,"e-mail") - || !strcmp(cws->szSetting,"LastName") - || !strcmp(cws->szSetting,"JID")) - { - // Name changed - if (proto != NULL) - PostMessage(hwnd_frame, MWM_NICK_CHANGED, (WPARAM) proto->name, 0); - } - else if (strstr(cws->szModule,"Away")) - { - // Status message changed - PostMessage(hwnd_frame, MWM_STATUS_MSG_CHANGED, 0, 0); - } - else if (proto != NULL && strcmp(cws->szSetting,"ListeningTo") == 0) - { - PostMessage(hwnd_frame, MWM_LISTENINGTO_CHANGED, (WPARAM) proto->name, 0); - } - } - - return 0; -} - -int AvatarChangedHook(WPARAM wParam, LPARAM lParam) -{ - if (hwnd_frame == NULL) - return 0; - - Protocol *proto = protocols->Get((const char *) wParam); - - if (proto != NULL) - PostMessage(hwnd_frame, MWM_AVATAR_CHANGED, (WPARAM) proto->name, 0); - - return 0; -} - -int ProtoAckHook(WPARAM wParam, LPARAM lParam) -{ - if (hwnd_frame == NULL) - return 0; - - ACKDATA *ack = (ACKDATA*)lParam; - - if (ack->type == ACKTYPE_STATUS) - { - Protocol *proto = protocols->Get((const char *) ack->szModule); - - if (proto != NULL) - PostMessage(hwnd_frame, MWM_STATUS_CHANGED, (WPARAM) proto->name, 0); - } - else if (ack->type == ACKTYPE_AWAYMSG) - { - Protocol *proto = protocols->Get((const char *) ack->szModule); - - if (proto != NULL) - PostMessage(hwnd_frame, MWM_STATUS_MSG_CHANGED, (WPARAM) proto->name, 0); - } - - return 0; -} - -int ListeningtoEnableStateChangedHook(WPARAM wParam,LPARAM lParam) -{ - if (hwnd_frame == NULL) - return 0; - - if (wParam == NULL || protocols->Get((const char *) wParam) != NULL) - PostMessage(hwnd_frame, MWM_LISTENINGTO_CHANGED, wParam, 0); - - return 0; -} diff --git a/plugins/MyDetails/frame.h b/plugins/MyDetails/frame.h deleted file mode 100644 index 5382d3ed46..0000000000 --- a/plugins/MyDetails/frame.h +++ /dev/null @@ -1,38 +0,0 @@ -/* -Copyright (C) 2005 Ricardo Pescuma Domenecci - -This is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public -License as published by the Free Software Foundation; either -version 2 of the License, or (at your option) any later version. - -This 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 -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with this file; see the file license.txt. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. -*/ - - -#ifndef __FRAME_H__ -# define __FRAME_H__ - - -void InitFrames(); -void DeInitFrames(); - -void RefreshFrame(); -void RefreshFrameAndCalcRects(); - -void SetCycleTime(); - -INT_PTR PluginCommand_ShowNextProtocol(WPARAM wParam,LPARAM lParam); -INT_PTR PluginCommand_ShowPreviousProtocol(WPARAM wParam,LPARAM lParam); -INT_PTR PluginCommand_ShowProtocol(WPARAM wParam,LPARAM lParam); - - -#endif // __FRAME_H__ \ No newline at end of file diff --git a/plugins/MyDetails/mydetails.cpp b/plugins/MyDetails/mydetails.cpp deleted file mode 100644 index 4b34041cbb..0000000000 --- a/plugins/MyDetails/mydetails.cpp +++ /dev/null @@ -1,737 +0,0 @@ -/* -Copyright (C) 2005 Ricardo Pescuma Domenecci - -This is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public -License as published by the Free Software Foundation; either -version 2 of the License, or (at your option) any later version. - -This 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 -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with this file; see the file license.txt. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. -*/ - - -#include "commons.h" - -// Prototypes ///////////////////////////////////////////////////////////////////////////////////// - -HINSTANCE hInst; -int hLangpack = 0; - -PLUGININFOEX pluginInfo={ - sizeof(PLUGININFOEX), - "My Details", - PLUGIN_MAKE_VERSION(0,0,1,11), - "Show and allows you to edit your details for all protocols.", - "Ricardo Pescuma Domenecci, Drugwash", - "", - "© 2005-2008 Ricardo Pescuma Domenecci, Drugwash", - "http://pescuma.org/miranda/mydetails", - UNICODE_AWARE, - { 0xa82baeb3, 0xa33c, 0x4036, { 0xb8, 0x37, 0x78, 0x3, 0xa5, 0xb6, 0xc2, 0xab } } // {A82BAEB3-A33C-4036-B837-7803A5B6C2AB} -}; - -// Hooks -HANDLE hModulesLoadedHook = NULL; -HANDLE hPreShutdownHook = NULL; - -long nickname_dialog_open; -HWND hwndSetNickname; - -long status_msg_dialog_open; -HWND hwndSetStatusMsg; - -// Hook called after init -static int MainInit(WPARAM wparam,LPARAM lparam); -static int MainUninit(WPARAM wParam, LPARAM lParam); - -// Services -static INT_PTR PluginCommand_SetMyNicknameUI(WPARAM wParam,LPARAM lParam); -static INT_PTR PluginCommand_SetMyNickname(WPARAM wParam,LPARAM lParam); -static INT_PTR PluginCommand_GetMyNickname(WPARAM wParam,LPARAM lParam); -static INT_PTR PluginCommand_SetMyAvatarUI(WPARAM wParam,LPARAM lParam); -static INT_PTR PluginCommand_SetMyAvatar(WPARAM wParam,LPARAM lParam); -static INT_PTR PluginCommand_GetMyAvatar(WPARAM wParam,LPARAM lParam); -static INT_PTR PluginCommand_SetMyStatusMessageUI(WPARAM wParam,LPARAM lParam); -static INT_PTR PluginCommand_CycleThroughtProtocols(WPARAM wParam,LPARAM lParam); - - -// Functions ////////////////////////////////////////////////////////////////////////////////////// - - -BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) -{ - hInst = hinstDLL; - return TRUE; -} - -extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) -{ - return &pluginInfo; -} - -extern "C" __declspec(dllexport) const MUUID interfaces[] = { MIID_MDETAILS, MIID_LAST }; - -extern "C" __declspec(dllexport) int Load() -{ - mir_getLP(&pluginInfo); - - // Hook event to load messages and show first one - HookEvent(ME_SYSTEM_MODULESLOADED, MainInit); - HookEvent(ME_SYSTEM_PRESHUTDOWN, MainUninit); - - nickname_dialog_open = 0; - status_msg_dialog_open = 0; - - // Options - InitOptions(); - - // Register services - CreateServiceFunction(MS_MYDETAILS_SETMYNICKNAME, PluginCommand_SetMyNickname); - CreateServiceFunction(MS_MYDETAILS_SETMYNICKNAMEUI, PluginCommand_SetMyNicknameUI); - CreateServiceFunction(MS_MYDETAILS_SETMYAVATAR, PluginCommand_SetMyAvatar); - CreateServiceFunction(MS_MYDETAILS_SETMYAVATARUI, PluginCommand_SetMyAvatarUI); - CreateServiceFunction(MS_MYDETAILS_GETMYNICKNAME, PluginCommand_GetMyNickname); - CreateServiceFunction(MS_MYDETAILS_GETMYAVATAR, PluginCommand_GetMyAvatar); - CreateServiceFunction(MS_MYDETAILS_SETMYSTATUSMESSAGEUI, PluginCommand_SetMyStatusMessageUI); - CreateServiceFunction(MS_MYDETAILS_SHOWNEXTPROTOCOL, PluginCommand_ShowNextProtocol); - CreateServiceFunction(MS_MYDETAILS_SHOWPREVIOUSPROTOCOL, PluginCommand_ShowPreviousProtocol); - CreateServiceFunction(MS_MYDETAILS_SHOWPROTOCOL, PluginCommand_ShowProtocol); - CreateServiceFunction(MS_MYDETAILS_CYCLE_THROUGH_PROTOCOLS, PluginCommand_CycleThroughtProtocols); - - return 0; -} - -extern "C" __declspec(dllexport) int Unload(void) -{ - DestroyServiceFunction(MS_MYDETAILS_SETMYNICKNAME); - DestroyServiceFunction(MS_MYDETAILS_SETMYNICKNAMEUI); - DestroyServiceFunction(MS_MYDETAILS_SETMYAVATAR); - DestroyServiceFunction(MS_MYDETAILS_SETMYAVATARUI); - DestroyServiceFunction(MS_MYDETAILS_GETMYNICKNAME); - DestroyServiceFunction(MS_MYDETAILS_GETMYAVATAR); - DestroyServiceFunction(MS_MYDETAILS_SETMYSTATUSMESSAGEUI); - DestroyServiceFunction(MS_MYDETAILS_SHOWNEXTPROTOCOL); - DestroyServiceFunction(MS_MYDETAILS_SHOWPREVIOUSPROTOCOL); - DestroyServiceFunction(MS_MYDETAILS_SHOWPROTOCOL); - DestroyServiceFunction(MS_MYDETAILS_CYCLE_THROUGH_PROTOCOLS); - - DeInitProtocolData(); - return 0; -} - - -static INT_PTR Menu_SetMyAvatarUI(WPARAM wParam,LPARAM lParam) -{ - return PluginCommand_SetMyAvatarUI(0, 0); -} - -static INT_PTR Menu_SetMyNicknameUI(WPARAM wParam,LPARAM lParam) -{ - return PluginCommand_SetMyNicknameUI(0, 0); -} - -static INT_PTR Menu_SetMyStatusMessageUI(WPARAM wParam,LPARAM lParam) -{ - return PluginCommand_SetMyStatusMessageUI(0, 0); -} - - -// Hook called after init -static int MainInit(WPARAM wparam,LPARAM lparam) -{ - InitProtocolData(); - - // Add options to menu - CLISTMENUITEM mi; - - if (protocols->CanSetAvatars()) { - ZeroMemory(&mi,sizeof(mi)); - mi.cbSize = sizeof(mi); - mi.flags = CMIF_TCHAR; - mi.popupPosition = 500050000; - mi.ptszPopupName = LPGENT("My Details"); - mi.position = 100001; - mi.ptszName = LPGENT("Set My Avatar..."); - CreateServiceFunction("MENU_" MS_MYDETAILS_SETMYAVATARUI, Menu_SetMyAvatarUI); - mi.pszService = "MENU_" MS_MYDETAILS_SETMYAVATARUI; - Menu_AddMainMenuItem(&mi); - } - - ZeroMemory(&mi,sizeof(mi)); - mi.cbSize = sizeof(mi); - mi.flags = CMIF_TCHAR; - mi.popupPosition = 500050000; - mi.ptszPopupName = LPGENT("My Details"); - mi.position = 100002; - mi.ptszName = LPGENT("Set My Nickname..."); - CreateServiceFunction("MENU_" MS_MYDETAILS_SETMYNICKNAMEUI, Menu_SetMyNicknameUI); - mi.pszService = "MENU_" MS_MYDETAILS_SETMYNICKNAMEUI; - Menu_AddMainMenuItem(&mi); - - ZeroMemory(&mi,sizeof(mi)); - mi.cbSize = sizeof(mi); - mi.flags = CMIF_TCHAR; - mi.popupPosition = 500050000; - mi.ptszPopupName = LPGENT("My Details"); - mi.position = 100003; - mi.ptszName = LPGENT("Set My Status Message..."); - CreateServiceFunction("MENU_" MS_MYDETAILS_SETMYSTATUSMESSAGEUI, Menu_SetMyStatusMessageUI); - mi.pszService = "MENU_" MS_MYDETAILS_SETMYSTATUSMESSAGEUI; - Menu_AddMainMenuItem(&mi); - - // Set protocols to show frame - ZeroMemory(&mi,sizeof(mi)); - mi.cbSize = sizeof(mi); - mi.flags = CMIF_TCHAR; - mi.popupPosition = 500050000; - mi.ptszPopupName = LPGENT("My Details"); - mi.position = 200001; - mi.ptszName = LPGENT("Show next protocol"); - mi.pszService = MS_MYDETAILS_SHOWNEXTPROTOCOL; - Menu_AddMainMenuItem(&mi); - - InitFrames(); - - if (CallService(MS_SKIN2_GETICON, 0, (LPARAM) "LISTENING_TO_ICON") == NULL) { - SKINICONDESC sid = {0}; - sid.cbSize = sizeof(SKINICONDESC); - sid.flags = SIDF_TCHAR; - sid.ptszSection = LPGENT("Contact List"); - sid.ptszDescription = LPGENT("Listening to"); - sid.pszName = "LISTENING_TO_ICON"; - sid.hDefaultIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_LISTENINGTO)); - Skin_AddIcon(&sid); - } - { - SKINICONDESC sid = {0}; - sid.cbSize = sizeof(SKINICONDESC); - sid.flags = SIDF_TCHAR; - sid.ptszSection = LPGENT("My Details"); - sid.ptszDescription = LPGENT("Previous protocol"); - sid.pszName = "MYDETAILS_PREV_PROTOCOL"; - sid.hDefaultIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_LEFT_ARROW)); - Skin_AddIcon(&sid); - } - { - SKINICONDESC sid = {0}; - sid.cbSize = sizeof(SKINICONDESC); - sid.flags = SIDF_TCHAR; - sid.ptszSection = LPGENT("My Details"); - sid.ptszDescription = LPGENT("Next protocol"); - sid.pszName = "MYDETAILS_NEXT_PROTOCOL"; - sid.hDefaultIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_RIGHT_ARROW)); - Skin_AddIcon(&sid); - } - - return 0; -} - -static int MainUninit(WPARAM wParam, LPARAM lParam) -{ - DeInitFrames(); - return 0; -} - -// Set nickname /////////////////////////////////////////////////////////////////////////////////// - -#define WMU_SETDATA (WM_USER+1) - -static INT_PTR CALLBACK DlgProcSetNickname(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - switch ( msg ) { - case WM_INITDIALOG: - TranslateDialogDefault(hwndDlg); - SendMessage(GetDlgItem(hwndDlg, IDC_NICKNAME), EM_LIMITTEXT, - MS_MYDETAILS_GETMYNICKNAME_BUFFER_SIZE - 1, 0); - return TRUE; - - case WMU_SETDATA: - { - int proto_num = (int)wParam; - - SetWindowLong(hwndDlg, GWLP_USERDATA, proto_num); - - if (proto_num == -1) { - SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)LoadSkinnedIcon(SKINICON_OTHER_MIRANDA)); - - // All protos have the same nick? - if (protocols->GetSize() > 0) { - TCHAR *nick = protocols->Get(0)->nickname; - - bool foundDefNick = true; - for (int i=1 ; foundDefNick && i < protocols->GetSize() ; i++) { - if (_tcsicmp(protocols->Get(i)->nickname, nick) != 0) { - foundDefNick = false; - break; - } - } - - if (foundDefNick) - if ( _tcsicmp(protocols->default_nick, nick) != 0) - lstrcpy(protocols->default_nick, nick); - } - - SetDlgItemText(hwndDlg, IDC_NICKNAME, protocols->default_nick); - SendDlgItemMessage(hwndDlg, IDC_NICKNAME, EM_LIMITTEXT, MS_MYDETAILS_GETMYNICKNAME_BUFFER_SIZE, 0); - } - else { - Protocol *proto = protocols->Get(proto_num); - - TCHAR tmp[128]; - mir_sntprintf(tmp, SIZEOF(tmp), TranslateT("Set My Nickname for %s"), proto->description); - - SendMessage(hwndDlg, WM_SETTEXT, 0, (LPARAM)tmp); - - HICON hIcon = (HICON)CallProtoService(proto->name, PS_LOADICON, PLI_PROTOCOL, 0); - if (hIcon != NULL) - { - SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon); - DestroyIcon(hIcon); - } - - SetDlgItemText(hwndDlg, IDC_NICKNAME, proto->nickname); - SendDlgItemMessage(hwndDlg, IDC_NICKNAME, EM_LIMITTEXT, - min(MS_MYDETAILS_GETMYNICKNAME_BUFFER_SIZE, proto->GetNickMaxLength()), 0); - } - - return TRUE; - } - - case WM_COMMAND: - switch(wParam) { - case IDOK: - { - TCHAR tmp[MS_MYDETAILS_GETMYNICKNAME_BUFFER_SIZE]; - GetDlgItemText(hwndDlg, IDC_NICKNAME, tmp, SIZEOF(tmp)); - - int proto_num = (int)GetWindowLong(hwndDlg, GWLP_USERDATA); - if (proto_num == -1) - protocols->SetNicks(tmp); - else - protocols->Get(proto_num)->SetNick(tmp); - - DestroyWindow(hwndDlg); - break; - } - case IDCANCEL: - DestroyWindow(hwndDlg); - break; - } - break; - - case WM_CLOSE: - DestroyWindow(hwndDlg); - break; - - case WM_DESTROY: - InterlockedExchange(&nickname_dialog_open, 0); - break; - } - - return FALSE; -} - -static INT_PTR PluginCommand_SetMyNicknameUI(WPARAM wParam,LPARAM lParam) -{ - char *proto = (char*)lParam; - int proto_num = -1; - - if (proto != NULL) { - int i; - for (i = 0 ; i < protocols->GetSize() ; i++) { - if (_stricmp(protocols->Get(i)->name, proto) == 0) { - proto_num = i; - break; - } - } - - if (proto_num == -1) - return -1; - - if ( !protocols->Get(i)->CanSetNick()) - return -2; - - } - - if ( !nickname_dialog_open) { - InterlockedExchange(&nickname_dialog_open, 1); - - hwndSetNickname = CreateDialog(hInst, MAKEINTRESOURCE( IDD_SETNICKNAME ), NULL, DlgProcSetNickname); - - SendMessage(hwndSetNickname, WMU_SETDATA, proto_num, 0); - } - - SetForegroundWindow( hwndSetNickname ); - SetFocus( hwndSetNickname ); - ShowWindow( hwndSetNickname, SW_SHOW ); - - return 0; -} - -static INT_PTR PluginCommand_SetMyNickname(WPARAM wParam,LPARAM lParam) -{ - char * proto = (char *)wParam; - if (proto != NULL) { - for (int i = 0 ; i < protocols->GetSize() ; i++) { - if (_stricmp(protocols->Get(i)->name, proto) == 0) { - if ( !protocols->Get(i)->CanSetNick()) - return -2; - - protocols->Get(i)->SetNick((TCHAR*)lParam); - return 0; - } - } - - return -1; - } - - protocols->SetNicks((TCHAR*)lParam); - return 0; -} - -static INT_PTR PluginCommand_GetMyNickname(WPARAM wParam,LPARAM lParam) -{ - TCHAR* ret = (TCHAR*)lParam; - char * proto = (char *)wParam; - - if (ret == NULL) - return -1; - - if (proto == NULL) { - if (protocols->default_nick != NULL) - lstrcpyn(ret, protocols->default_nick, MS_MYDETAILS_GETMYNICKNAME_BUFFER_SIZE); - else - ret[0] = '\0'; - - return 0; - } - else { - Protocol *protocol = protocols->Get(proto); - if (protocol != NULL) { - lstrcpyn(ret, protocol->nickname, MS_MYDETAILS_GETMYNICKNAME_BUFFER_SIZE); - return 0; - } - - return -1; - } -} - -// Set avatar ///////////////////////////////////////////////////////////////////////////////////// - -static INT_PTR PluginCommand_SetMyAvatarUI(WPARAM wParam,LPARAM lParam) -{ - char * proto = (char *)lParam; - int proto_num = -1; - - if (proto != NULL) - { - int i; - for (i = 0 ; i < protocols->GetSize() ; i++) - { - if (_stricmp(protocols->Get(i)->name, proto) == 0) - { - proto_num = i; - break; - } - } - - if (proto_num == -1) - return -1; - - if ( !protocols->Get(i)->CanSetAvatar()) - { - return -2; - } - } - - if (proto_num == -1) - { - protocols->SetAvatars(NULL); - } - else - { - protocols->Get(proto_num)->SetAvatar(NULL); - } - - return 0; -} - -static INT_PTR PluginCommand_SetMyAvatar(WPARAM wParam,LPARAM lParam) -{ - char *proto = (char*)wParam; - if (proto != NULL) { - for (int i = 0 ; i < protocols->GetSize() ; i++) { - if (_stricmp(protocols->Get(i)->name, proto) == 0) { - if ( !protocols->Get(i)->CanSetAvatar()) - return -2; - - protocols->Get(i)->SetAvatar((TCHAR*)lParam); - return 0; - } - } - - return -1; - } - - protocols->SetAvatars((TCHAR*)lParam); - return 0; -} - -int Status2SkinIcon(int status) -{ - switch(status) { - case ID_STATUS_AWAY: return SKINICON_STATUS_AWAY; - case ID_STATUS_NA: return SKINICON_STATUS_NA; - case ID_STATUS_DND: return SKINICON_STATUS_DND; - case ID_STATUS_OCCUPIED: return SKINICON_STATUS_OCCUPIED; - case ID_STATUS_FREECHAT: return SKINICON_STATUS_FREE4CHAT; - case ID_STATUS_ONLINE: return SKINICON_STATUS_ONLINE; - case ID_STATUS_OFFLINE: return SKINICON_STATUS_OFFLINE; - case ID_STATUS_INVISIBLE: return SKINICON_STATUS_INVISIBLE; - case ID_STATUS_ONTHEPHONE: return SKINICON_STATUS_ONTHEPHONE; - case ID_STATUS_OUTTOLUNCH: return SKINICON_STATUS_OUTTOLUNCH; - case ID_STATUS_IDLE: return SKINICON_STATUS_AWAY; - } - return SKINICON_STATUS_OFFLINE; -} - -static INT_PTR PluginCommand_GetMyAvatar(WPARAM wParam,LPARAM lParam) -{ - TCHAR* ret = (TCHAR*)lParam; - char * proto = (char *)wParam; - - if (ret == NULL) - return -1; - - if (proto == NULL) { - if (protocols->default_avatar_file != NULL) - lstrcpyn(ret, protocols->default_avatar_file, MS_MYDETAILS_GETMYAVATAR_BUFFER_SIZE); - else - ret[0] = '\0'; - - return 0; - } - - for (int i = 0 ; i < protocols->GetSize() ; i++) { - if ( _stricmp(protocols->Get(i)->name, proto) == 0) { - if ( !protocols->Get(i)->CanGetAvatar()) - return -2; - - protocols->Get(i)->GetAvatar(); - - if (protocols->Get(i)->avatar_file != NULL) - lstrcpyn(ret, protocols->Get(i)->avatar_file, MS_MYDETAILS_GETMYAVATAR_BUFFER_SIZE); - else - ret[0] = '\0'; - - return 0; - } - } - - return -1; -} - -static LRESULT CALLBACK StatusMsgEditSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - switch (msg) { - case WM_CHAR: - if (wParam == 0x0a && (GetKeyState(VK_CONTROL) & 0x8000) != 0) { - PostMessage(GetParent(hwnd), WM_COMMAND, IDOK, 0); - return 0; - } - break; - } - - return CallWindowProc((WNDPROC) GetWindowLong(hwnd, GWLP_USERDATA), hwnd, msg, wParam, lParam); -} - -struct SetStatusMessageData { - int status; - int proto_num; -}; - -static INT_PTR CALLBACK DlgProcSetStatusMessage(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - switch (msg) { - case WM_INITDIALOG: - TranslateDialogDefault(hwndDlg); - SendMessage(GetDlgItem(hwndDlg, IDC_STATUSMESSAGE), EM_LIMITTEXT, - MS_MYDETAILS_GETMYSTATUSMESSAGE_BUFFER_SIZE - 1, 0); - { - WNDPROC old_proc = (WNDPROC) SetWindowLong(GetDlgItem(hwndDlg, IDC_STATUSMESSAGE), - GWLP_WNDPROC, (LONG) StatusMsgEditSubclassProc); - SetWindowLong(GetDlgItem(hwndDlg, IDC_STATUSMESSAGE), GWLP_USERDATA, (long) old_proc); - } - return TRUE; - - case WMU_SETDATA: - { - SetStatusMessageData *data = (SetStatusMessageData *) malloc(sizeof(SetStatusMessageData)); - data->status = (int)wParam; - data->proto_num = (int)lParam; - - SetWindowLong(hwndDlg, GWLP_USERDATA, (LONG) data); - - if (data->proto_num >= 0) { - Protocol *proto = protocols->Get(data->proto_num); - - HICON hIcon = (HICON)CallProtoService(proto->name, PS_LOADICON, PLI_PROTOCOL, 0); - if (hIcon != NULL) { - SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon); - DestroyIcon(hIcon); - } - - TCHAR title[256]; - mir_sntprintf(title, SIZEOF(title), TranslateT("Set My Status Message for %s"), proto->description); - SendMessage(hwndDlg, WM_SETTEXT, 0, (LPARAM)title); - - SetDlgItemText(hwndDlg, IDC_STATUSMESSAGE, proto->GetStatusMsg()); - } - else if (data->status != 0) - { - SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)LoadSkinnedIcon(Status2SkinIcon(data->status))); - - TCHAR title[256]; - mir_sntprintf(title, SIZEOF(title), TranslateT("Set My Status Message for %s"), - CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, data->status, GSMDF_TCHAR)); - SendMessage(hwndDlg, WM_SETTEXT, 0, (LPARAM)title); - - SetDlgItemText(hwndDlg, IDC_STATUSMESSAGE, protocols->GetDefaultStatusMsg(data->status)); - } - else - { - SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)LoadSkinnedIcon(SKINICON_OTHER_MIRANDA)); - - SetDlgItemText(hwndDlg, IDC_STATUSMESSAGE, protocols->GetDefaultStatusMsg()); - } - - return TRUE; - } - case WM_COMMAND: - switch(wParam) { - case IDOK: - { - TCHAR tmp[MS_MYDETAILS_GETMYSTATUSMESSAGE_BUFFER_SIZE]; - GetDlgItemText(hwndDlg, IDC_STATUSMESSAGE, tmp, sizeof(tmp)); - - SetStatusMessageData *data = (SetStatusMessageData *) GetWindowLong(hwndDlg, GWLP_USERDATA); - - if (data->proto_num >= 0) - protocols->Get(data->proto_num)->SetStatusMsg(tmp); - else if (data->status == 0) - protocols->SetStatusMsgs(tmp); - else - protocols->SetStatusMsgs(data->status, tmp); - - DestroyWindow(hwndDlg); - } - break; - - case IDCANCEL: - DestroyWindow(hwndDlg); - break; - } - break; - - case WM_CLOSE: - DestroyWindow(hwndDlg); - break; - - case WM_DESTROY: - SetWindowLong(GetDlgItem(hwndDlg, IDC_STATUSMESSAGE), GWLP_WNDPROC, - GetWindowLong(GetDlgItem(hwndDlg, IDC_STATUSMESSAGE), GWLP_USERDATA)); - free((SetStatusMessageData *) GetWindowLong(hwndDlg, GWLP_USERDATA)); - InterlockedExchange(&status_msg_dialog_open, 0); - break; - } - - return FALSE; -} - -static INT_PTR PluginCommand_SetMyStatusMessageUI(WPARAM wParam,LPARAM lParam) -{ - int status = (int)wParam; - char * proto_name = (char *)lParam; - int proto_num = -1; - Protocol *proto = NULL; - - if (status != 0 && (status < ID_STATUS_OFFLINE || status > ID_STATUS_OUTTOLUNCH)) - return -10; - - if (proto_name != NULL) - { - for (int i = 0 ; i < protocols->GetSize() ; i++) - { - proto = protocols->Get(i); - - if (_stricmp(proto->name, proto_name) == 0) - { - proto_num = i; - break; - } - } - - if (proto_num == -1) { - return -1; - } - - if (protocols->CanSetStatusMsgPerProtocol() && !proto->CanSetStatusMsg()) { - return -2; - } - } - else if (ServiceExists(MS_SA_CHANGESTATUSMSG)) - { - if (proto == NULL && status == 0) - { - CallService(MS_SA_CHANGESTATUSMSG, protocols->GetGlobalStatus(), NULL); - } - else if (status == 0) - { - CallService(MS_SA_CHANGESTATUSMSG, proto->status, (LPARAM) proto_name); - } - else - { - CallService(MS_SA_CHANGESTATUSMSG, status, (LPARAM) proto_name); - } - - return 0; - } - - if (proto == NULL || proto->status != ID_STATUS_OFFLINE) - { - if ( !status_msg_dialog_open) - { - InterlockedExchange(&status_msg_dialog_open, 1); - - hwndSetStatusMsg = CreateDialog(hInst, MAKEINTRESOURCE( IDD_SETSTATUSMESSAGE ), NULL, DlgProcSetStatusMessage ); - - SendMessage(hwndSetStatusMsg, WMU_SETDATA, status, proto_num); - } - - SetForegroundWindow( hwndSetStatusMsg ); - SetFocus( hwndSetStatusMsg ); - ShowWindow( hwndSetStatusMsg, SW_SHOW ); - - return 0; - } - - return -3; -} - - -static INT_PTR PluginCommand_CycleThroughtProtocols(WPARAM wParam,LPARAM lParam) -{ - DBWriteContactSettingByte(NULL,"MyDetails","CicleThroughtProtocols", (BYTE) wParam); - - LoadOptions(); - - return 0; -} \ No newline at end of file diff --git a/plugins/MyDetails/mydetails.vcxproj b/plugins/MyDetails/mydetails.vcxproj index 6c317ba7d9..bc0613622c 100644 --- a/plugins/MyDetails/mydetails.vcxproj +++ b/plugins/MyDetails/mydetails.vcxproj @@ -75,7 +75,7 @@ OnlyExplicitInline Size ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;_USRDLL;MYDETAILS_EXPORTS;%(PreprocessorDefinitions) + WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) true true Use @@ -95,7 +95,7 @@ NDEBUG;%(PreprocessorDefinitions) - ..\..\include\msapi + ..\..\include;..\..\include\msapi @@ -104,7 +104,7 @@ OnlyExplicitInline Size ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) - WIN64;NDEBUG;_WINDOWS;_USRDLL;MYDETAILS_EXPORTS;%(PreprocessorDefinitions) + WIN64;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) true true Use @@ -124,14 +124,14 @@ NDEBUG;%(PreprocessorDefinitions) - ..\..\include\msapi + ..\..\include;..\..\include\msapi Disabled ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;_USRDLL;MYDETAILS_EXPORTS;%(PreprocessorDefinitions) + WIN32;_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL true @@ -151,14 +151,14 @@ _DEBUG;%(PreprocessorDefinitions) - ..\..\include\msapi + ..\..\include;..\..\include\msapi Disabled ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) - WIN64;_DEBUG;_WINDOWS;_USRDLL;MYDETAILS_EXPORTS;%(PreprocessorDefinitions) + WIN64;_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL true @@ -177,38 +177,38 @@ _DEBUG;%(PreprocessorDefinitions) - ..\..\include\msapi + ..\..\include;..\..\include\msapi NotUsing - - + + NotUsing NotUsing - + Create - + - + - - - + + + - + diff --git a/plugins/MyDetails/mydetails.vcxproj.filters b/plugins/MyDetails/mydetails.vcxproj.filters index 1b4ed68251..6551fafecb 100644 --- a/plugins/MyDetails/mydetails.vcxproj.filters +++ b/plugins/MyDetails/mydetails.vcxproj.filters @@ -15,10 +15,10 @@ - + Source Files - + Source Files @@ -27,10 +27,10 @@ Source Files - + Source Files - + Source Files @@ -38,18 +38,18 @@ - + Resource Files - + Header Files - + Header Files - + Header Files @@ -64,7 +64,7 @@ Header Files - + Header Files diff --git a/plugins/MyDetails/options.cpp b/plugins/MyDetails/options.cpp deleted file mode 100644 index a4b722b241..0000000000 --- a/plugins/MyDetails/options.cpp +++ /dev/null @@ -1,160 +0,0 @@ -/* -Copyright (C) 2005 Ricardo Pescuma Domenecci - -This is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public -License as published by the Free Software Foundation; either -version 2 of the License, or (at your option) any later version. - -This 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 -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with this file; see the file license.txt. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. -*/ - - -#include "commons.h" -#include "options.h" - -// Prototypes ///////////////////////////////////////////////////////////////////////////////////// - -Options opts; - -// Functions ////////////////////////////////////////////////////////////////////////////////////// - -static OptPageControl pageControls[] = { - { &opts.cycle_through_protocols, CONTROL_CHECKBOX, IDC_CYCLE_THROUGH_PROTOS, "CicleThroughtProtocols", (BYTE) 1 }, - { &opts.seconds_to_show_protocol, CONTROL_SPIN, IDC_CYCLE_TIME, "CicleTime", (WORD) 5, IDC_CYCLE_TIME_SPIN, (WORD) 1, (WORD) 255 }, - { &opts.draw_show_protocol_name, CONTROL_CHECKBOX, IDC_SHOW_PROTO_NAME, "ShowProtocolName", (BYTE) 1 }, - { &opts.show_protocol_cycle_button, CONTROL_CHECKBOX, IDC_SHOW_CYCLE_PROTO_BUTTON, "ShowProtocolCycleButton", (BYTE) 0 }, - { &opts.draw_text_rtl, CONTROL_CHECKBOX, IDC_TEXT_RTL, "TextRTL", (BYTE) 0 }, - { &opts.draw_text_align_right, CONTROL_CHECKBOX, IDC_TEXT_ALIGN_RIGHT, "TextAlignRight", (BYTE) 0 }, - { &opts.replace_smileys, CONTROL_CHECKBOX, IDC_REPLACE_SMILEYS, "ReplaceSmileys", (BYTE) 1 }, - { &opts.resize_smileys, CONTROL_CHECKBOX, IDC_RESIZE_SMILEYS, "ResizeSmileys", (BYTE) 0 }, - { &opts.use_contact_list_smileys, CONTROL_CHECKBOX, IDC_USE_CONTACT_LIST_SMILEYS, "UseContactListSmileys", (BYTE) 0 }, - { &opts.global_on_avatar, CONTROL_CHECKBOX, IDC_GLOBAL_ON_AVATAR, "GlobalOnAvatar", (BYTE) 0 }, - { &opts.global_on_nickname, CONTROL_CHECKBOX, IDC_GLOBAL_ON_NICKNAME, "GlobalOnNickname", (BYTE) 0 }, - { &opts.global_on_status, CONTROL_CHECKBOX, IDC_GLOBAL_ON_STATUS, "GlobalOnStatus", (BYTE) 0 }, - { &opts.global_on_status_message, CONTROL_CHECKBOX, IDC_GLOBAL_ON_STATUS_MESSAGE, "GlobalOnStatusMessage", (BYTE) 0 }, - { &opts.draw_avatar_allow_to_grow, CONTROL_CHECKBOX, IDC_AVATAR_ALLOW_TO_GROW, "AvatarAllowToGrow", (BYTE) 0 }, - { &opts.draw_avatar_custom_size, CONTROL_CHECKBOX, IDC_AVATAR_CUSTOM_SIZE_CHK, "AvatarCustomSize", (BYTE) 0 }, - { &opts.draw_avatar_custom_size_pixels, CONTROL_SPIN, IDC_AVATAR_CUSTOM_SIZE, "AvatarCustomSizePixels", (WORD) 30, IDC_AVATAR_CUSTOM_SIZE_SPIN, (WORD) 1, (WORD) 255 }, - { &opts.draw_avatar_border, CONTROL_CHECKBOX, IDC_AVATAR_DRAW_BORDER, "AvatarDrawBorders", (BYTE) 0 }, - { &opts.draw_avatar_border_color, CONTROL_COLOR, IDC_AVATAR_BORDER_COLOR, "AvatarBorderColor", (DWORD) RGB(0,0,0) }, - { &opts.draw_avatar_round_corner, CONTROL_CHECKBOX, IDC_AVATAR_ROUND_CORNERS, "AvatarRoundCorners", (BYTE) 1 }, - { &opts.draw_avatar_use_custom_corner_size, CONTROL_CHECKBOX, IDC_AVATAR_CUSTOM_CORNER_SIZE_CHECK, "AvatarUseCustomCornerSize", (BYTE) 0 }, - { &opts.draw_avatar_custom_corner_size, CONTROL_SPIN, IDC_AVATAR_CUSTOM_CORNER_SIZE, "AvatarCustomCornerSize", (WORD) 4, IDC_AVATAR_CUSTOM_CORNER_SIZE_SPIN, (WORD) 1, (WORD) 255 }, - { &opts.use_avatar_space_to_draw_text, CONTROL_CHECKBOX, IDC_AVATAR_USE_FREE_SPACE, "AvatarUseFreeSpaceToDrawText", (BYTE) 1 }, - { &opts.resize_frame, CONTROL_CHECKBOX, IDC_RESIZE_FRAME, "ResizeFrame", (BYTE) 0 }, - { &opts.borders[RIGHT], CONTROL_SPIN, IDC_BORDER_RIGHT, "BorderRight", (WORD) 8, IDC_BORDER_RIGHT_SPIN, (WORD) 0, (WORD) 255 }, - { &opts.borders[LEFT], CONTROL_SPIN, IDC_BORDER_LEFT, "BorderLeft", (WORD) 8, IDC_BORDER_LEFT_SPIN, (WORD) 0, (WORD) 255 }, - { &opts.borders[TOP], CONTROL_SPIN, IDC_BORDER_TOP, "BorderTop", (WORD) 8, IDC_BORDER_TOP_SPIN, (WORD) 0, (WORD) 255 }, - { &opts.borders[BOTTOM], CONTROL_SPIN, IDC_BORDER_BOTTOM, "BorderBottom", (WORD) 8, IDC_BORDER_BOTTOM_SPIN, (WORD) 0, (WORD) 255 }, - { &opts.bkg_color, CONTROL_COLOR, IDC_AVATAR_BKG_COLOR, "BackgroundColor", (DWORD) GetSysColor(COLOR_BTNFACE) } -}; - - -// Initializations needed by options -void LoadOptions() -{ - LoadOpts(pageControls, SIZEOF(pageControls), MODULE_NAME); - - // This is created here to assert that this key always exists - opts.refresh_status_message_timer = DBGetContactSettingWord(NULL,"MyDetails","RefreshStatusMessageTimer",12); - DBWriteContactSettingWord(NULL,"MyDetails","RefreshStatusMessageTimer", opts.refresh_status_message_timer); - - SetCycleTime(); - RefreshFrameAndCalcRects(); -} - -static INT_PTR CALLBACK DlgProcOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - BOOL ret = SaveOptsDlgProc(pageControls, SIZEOF(pageControls), MODULE_NAME, hwndDlg, msg, wParam, lParam); - - switch (msg) { - case WM_INITDIALOG: - if (!IsDlgButtonChecked(hwndDlg,IDC_AVATAR_DRAW_BORDER)) { - EnableWindow(GetDlgItem(hwndDlg,IDC_AVATAR_BORDER_COLOR_L),FALSE); - EnableWindow(GetDlgItem(hwndDlg,IDC_AVATAR_BORDER_COLOR),FALSE); - } - - if (!IsDlgButtonChecked(hwndDlg,IDC_AVATAR_ROUND_CORNERS)) { - EnableWindow(GetDlgItem(hwndDlg,IDC_AVATAR_CUSTOM_CORNER_SIZE_CHECK),FALSE); - EnableWindow(GetDlgItem(hwndDlg,IDC_AVATAR_CUSTOM_CORNER_SIZE),FALSE); - EnableWindow(GetDlgItem(hwndDlg,IDC_AVATAR_CUSTOM_CORNER_SIZE_SPIN),FALSE); - } - - if (!IsDlgButtonChecked(hwndDlg,IDC_SHOW_PROTO_NAME)) - EnableWindow(GetDlgItem(hwndDlg,IDC_SHOW_CYCLE_PROTO_BUTTON),FALSE); - - if ( !ServiceExists(MS_SMILEYADD_BATCHPARSE)) { - EnableWindow(GetDlgItem(hwndDlg,IDC_REPLACE_SMILEYS),FALSE); - EnableWindow(GetDlgItem(hwndDlg,IDC_USE_CONTACT_LIST_SMILEYS),FALSE); - EnableWindow(GetDlgItem(hwndDlg,IDC_RESIZE_SMILEYS),FALSE); - } - - if ( !ServiceExists(MS_CLIST_FRAMES_SETFRAMEOPTIONS)) - EnableWindow(GetDlgItem(hwndDlg,IDC_RESIZE_FRAME),FALSE); - - break; - - case WM_COMMAND: - if (LOWORD(wParam)==IDC_AVATAR_DRAW_BORDER) { - BOOL enabled = IsDlgButtonChecked(hwndDlg,IDC_AVATAR_DRAW_BORDER); - EnableWindow(GetDlgItem(hwndDlg,IDC_AVATAR_BORDER_COLOR_L),enabled); - EnableWindow(GetDlgItem(hwndDlg,IDC_AVATAR_BORDER_COLOR),enabled); - } - else if (LOWORD(wParam)==IDC_AVATAR_ROUND_CORNERS) { - BOOL enabled = IsDlgButtonChecked(hwndDlg,IDC_AVATAR_ROUND_CORNERS); - EnableWindow(GetDlgItem(hwndDlg,IDC_AVATAR_CUSTOM_CORNER_SIZE_CHECK),enabled); - EnableWindow(GetDlgItem(hwndDlg,IDC_AVATAR_CUSTOM_CORNER_SIZE),enabled); - EnableWindow(GetDlgItem(hwndDlg,IDC_AVATAR_CUSTOM_CORNER_SIZE_SPIN),enabled); - } - else if (LOWORD(wParam)==IDC_SHOW_PROTO_NAME) { - BOOL enabled = IsDlgButtonChecked(hwndDlg,IDC_SHOW_PROTO_NAME); - EnableWindow(GetDlgItem(hwndDlg,IDC_SHOW_CYCLE_PROTO_BUTTON),enabled); - } - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lParam)->idFrom) { - case 0: - switch (((LPNMHDR)lParam)->code) { - case PSN_APPLY: - LoadOptions(); - return TRUE; - } - break; - } - break; - } - - return ret; -} - -int InitOptionsCallback(WPARAM wParam,LPARAM lParam) -{ - OPTIONSDIALOGPAGE odp = { 0 }; - odp.cbSize = sizeof(odp); - odp.position = -200000000; - odp.hInstance = hInst; - odp.pfnDlgProc = DlgProcOpts; - odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTS); - odp.ptszGroup = LPGENT("Customize"); - odp.ptszTitle = LPGENT("My Details"); - odp.flags = ODPF_BOLDGROUPS | ODPF_TCHAR; - Options_AddPage(wParam, &odp); - return 0; -} - -void InitOptions() -{ - LoadOptions(); - - HookEvent(ME_OPT_INITIALISE, InitOptionsCallback); -} diff --git a/plugins/MyDetails/options.h b/plugins/MyDetails/options.h deleted file mode 100644 index c8b11ef725..0000000000 --- a/plugins/MyDetails/options.h +++ /dev/null @@ -1,79 +0,0 @@ -/* -Copyright (C) 2005 Ricardo Pescuma Domenecci - -This is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public -License as published by the Free Software Foundation; either -version 2 of the License, or (at your option) any later version. - -This 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 -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with this file; see the file license.txt. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. -*/ - - -#ifndef __OPTIONS_H__ -# define __OPTIONS_H__ - - -#define TOP 0 -#define LEFT 1 -#define BOTTOM 2 -#define RIGHT 3 - -struct Options -{ - bool cycle_through_protocols; - int seconds_to_show_protocol; - bool replace_smileys; - bool resize_smileys; - bool use_contact_list_smileys; - - bool draw_text_rtl; - bool draw_text_align_right; - - bool draw_show_protocol_name; - bool show_protocol_cycle_button; - - bool global_on_avatar; - bool global_on_nickname; - bool global_on_status; - bool global_on_status_message; - - bool draw_avatar_custom_size; - bool draw_avatar_allow_to_grow; - int draw_avatar_custom_size_pixels; - bool draw_avatar_border; - COLORREF draw_avatar_border_color; - bool draw_avatar_round_corner; - bool draw_avatar_use_custom_corner_size; - int draw_avatar_custom_corner_size; - - COLORREF bkg_color; - int borders[4]; - - bool use_avatar_space_to_draw_text; - - bool resize_frame; - - int refresh_status_message_timer; -}; - -extern Options opts; - - -// Initializations needed by options -void InitOptions(); - -// Loads the options from DB -// It don't need to be called, except in some rare cases -void LoadOptions(); - - -#endif // __OPTIONS_H__ diff --git a/plugins/MyDetails/res/resource.rc b/plugins/MyDetails/res/resource.rc new file mode 100644 index 0000000000..9721f9b452 --- /dev/null +++ b/plugins/MyDetails/res/resource.rc @@ -0,0 +1,353 @@ +//Microsoft Developer Studio generated resource script. +// +#include "..\src\resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" +#include "statusmodes.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,0,1,11 + PRODUCTVERSION 0,0,1,11 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "080004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", " \0" + VALUE "FileDescription", "MyDetails Miranda Plugin\0" + VALUE "FileVersion", "0, 0, 1, 11\0" + VALUE "InternalName", "mydetails\0" + VALUE "LegalCopyright", "Copyright © 2005-2008 Ricardo Pescuma Domenecci, Drugwash\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "mydetails.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "\0" + VALUE "ProductVersion", "0, 0, 1, 11\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x800, 1200 + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_SETNICKNAME DIALOG DISCARDABLE 0, 0, 283, 65 +STYLE DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | + WS_SYSMENU +CAPTION "Set My Nickname" +FONT 8, "MS Shell Dlg" +BEGIN + RTEXT "Nickname:",IDC_STATIC,7,8,51,12 + EDITTEXT IDC_NICKNAME,67,7,209,31,ES_MULTILINE | ES_AUTOVSCROLL | + WS_VSCROLL + DEFPUSHBUTTON "OK",IDOK,87,44,50,14 + PUSHBUTTON "Cancel",IDCANCEL,146,44,50,14 +END + +IDD_OPTS DIALOGEX 0, 0, 316, 246 +STYLE DS_FIXEDSYS | WS_CHILD | WS_VISIBLE +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX " General ",IDC_STATIC,7,7,302,70 + CONTROL "Cycle through protocols every:", + IDC_CYCLE_THROUGH_PROTOS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,13,18,114,14 + EDITTEXT IDC_CYCLE_TIME,129,18,35,12,ES_NUMBER + CONTROL "",IDC_CYCLE_TIME_SPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS | + UDS_HOTTRACK,156,18,11,12 + LTEXT "seconds",IDC_STATIC,171,21,32,11 + CONTROL "Global on avatar",IDC_GLOBAL_ON_AVATAR,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,207,18,96,14 + CONTROL "RTL",IDC_TEXT_RTL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, + 13,32,85,14 + CONTROL "Align text to right",IDC_TEXT_ALIGN_RIGHT,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,105,32,96,14 + CONTROL "Global on nickname",IDC_GLOBAL_ON_NICKNAME,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,207,32,96,14 + CONTROL "Auto-resize frame",IDC_RESIZE_FRAME,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,46,85,14 + CONTROL "Use contact list smileys",IDC_USE_CONTACT_LIST_SMILEYS, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,105,46,96,14 + CONTROL "Global on status",IDC_GLOBAL_ON_STATUS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,207,46,96,14 + CONTROL "Replace Smileys",IDC_REPLACE_SMILEYS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,60,85,14 + CONTROL "Resize Smileys",IDC_RESIZE_SMILEYS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,105,60,96,14 + CONTROL "Global on status message",IDC_GLOBAL_ON_STATUS_MESSAGE, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,207,61,96,14 + GROUPBOX " Frame Options ",IDC_STATIC,7,78,302,44 + LTEXT "Top:",IDC_STATIC,16,91,41,11 + EDITTEXT IDC_BORDER_TOP,59,89,35,12,ES_NUMBER + CONTROL "",IDC_BORDER_TOP_SPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS | + UDS_HOTTRACK,88,89,11,12 + LTEXT "Bottom:",IDC_STATIC,111,91,41,11 + EDITTEXT IDC_BORDER_BOTTOM,154,89,35,12,ES_NUMBER + CONTROL "",IDC_BORDER_BOTTOM_SPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | + UDS_NOTHOUSANDS | UDS_HOTTRACK,182,89,11,12 + LTEXT "Left:",IDC_STATIC,15,105,41,11 + EDITTEXT IDC_BORDER_LEFT,59,103,35,12,ES_NUMBER + CONTROL "",IDC_BORDER_LEFT_SPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | + UDS_NOTHOUSANDS | UDS_HOTTRACK,88,103,11,12 + LTEXT "Right:",IDC_STATIC,111,106,41,11 + EDITTEXT IDC_BORDER_RIGHT,154,104,35,12,ES_NUMBER + CONTROL "",IDC_BORDER_RIGHT_SPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | + UDS_NOTHOUSANDS | UDS_HOTTRACK,182,104,11,12 + LTEXT "Background Color:",IDC_AVATAR_BKG_COLOR_L,205,91,66,10 + CONTROL "",IDC_AVATAR_BKG_COLOR,"ColourPicker",WS_TABSTOP,277,89, + 17,13 + GROUPBOX " Avatar ",IDC_STATIC,7,124,302,83 + CONTROL "Custom size:",IDC_AVATAR_CUSTOM_SIZE_CHK,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,16,137,66,9 + EDITTEXT IDC_AVATAR_CUSTOM_SIZE,87,135,35,12,ES_NUMBER + CONTROL "",IDC_AVATAR_CUSTOM_SIZE_SPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | + UDS_NOTHOUSANDS | UDS_HOTTRACK,116,134,11,12 + LTEXT "pixels",IDC_STATIC,130,137,24,11 + CONTROL "Allow it to grow",IDC_AVATAR_ALLOW_TO_GROW,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,174,137,106,9 + CONTROL "Draw border on avatar",IDC_AVATAR_DRAW_BORDER,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,16,152,103,9 + LTEXT "Border Color:",IDC_AVATAR_BORDER_COLOR_L,123,152,53,10 + CONTROL "",IDC_AVATAR_BORDER_COLOR,"ColourPicker",WS_TABSTOP,180, + 149,17,13 + CONTROL "Round corners of avatars",IDC_AVATAR_ROUND_CORNERS, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,166,280,8 + CONTROL "Custom corner size:", + IDC_AVATAR_CUSTOM_CORNER_SIZE_CHECK,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,27,179,93,11 + EDITTEXT IDC_AVATAR_CUSTOM_CORNER_SIZE,127,178,35,12,ES_NUMBER + CONTROL "",IDC_AVATAR_CUSTOM_CORNER_SIZE_SPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | + UDS_NOTHOUSANDS | UDS_HOTTRACK,165,178,11,12 + LTEXT "pixels",IDC_STATIC,179,181,41,11 + CONTROL "Use free space (under avatar) to other texts", + IDC_AVATAR_USE_FREE_SPACE,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,16,195,280,8 + GROUPBOX " Protocol ",IDC_STATIC,7,209,302,28 + CONTROL "Show protocol name",IDC_SHOW_PROTO_NAME,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,221,138,14 + CONTROL "Show protocol cycle button",IDC_SHOW_CYCLE_PROTO_BUTTON, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,163,221,138,14 +END + +IDD_SETSTATUSMESSAGE DIALOG DISCARDABLE 0, 0, 283, 68 +STYLE DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | + WS_SYSMENU +CAPTION "Set My Status Message for All Status" +FONT 8, "MS Shell Dlg" +BEGIN + RTEXT "Status Message:",IDC_STATIC,7,8,69,12 + EDITTEXT IDC_STATUSMESSAGE,81,7,195,35,ES_MULTILINE | + ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL + DEFPUSHBUTTON "OK",IDOK,87,47,50,14 + PUSHBUTTON "Cancel",IDCANCEL,146,47,50,14 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO DISCARDABLE +BEGIN + IDD_SETNICKNAME, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 276 + TOPMARGIN, 7 + BOTTOMMARGIN, 58 + END + + IDD_OPTS, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 309 + TOPMARGIN, 7 + BOTTOMMARGIN, 238 + END + + IDD_SETSTATUSMESSAGE, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 276 + TOPMARGIN, 7 + BOTTOMMARGIN, 61 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_LISTENINGTO ICON "listening_to.ico" +IDI_RIGHT_ARROW ICON "rightarrow.ico" +IDI_LEFT_ARROW ICON "leftarrow.ico" +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// Portuguese (Brazil) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_PTB) +#ifdef _WIN32 +LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "..\\src\\resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "#include ""statusmodes.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDR_MENU1 MENU DISCARDABLE +BEGIN + POPUP "Status popup" + BEGIN + MENUITEM "&Offline", ID_STATUS_OFFLINE + MENUITEM "On&line", ID_STATUS_ONLINE + MENUITEM "&Away", ID_STATUS_AWAY + MENUITEM "&NA", ID_STATUS_NA + MENUITEM "Occ&upied", ID_STATUS_OCCUPIED + MENUITEM "&DND", ID_STATUS_DND + MENUITEM "&Free for chat", ID_STATUS_FREECHAT + MENUITEM "&Invisible", ID_STATUS_INVISIBLE + MENUITEM "On the &Phone", ID_STATUS_ONTHEPHONE + MENUITEM "Out to &Lunch", ID_STATUS_OUTTOLUNCH + END + POPUP "Context popup" + BEGIN + MENUITEM SEPARATOR + MENUITEM "Set My Avatar...", ID_AVATARPOPUP_SETMYAVATAR + MENUITEM "Set My Nickname...", ID_NICKPOPUP_SETMYNICKNAME + MENUITEM "Set My Status Message...", ID_STATUSMESSAGEPOPUP_SETMYSTATUSMESSAGE + + MENUITEM "Enable Listening To", ID_CONTEXTPOPUP_ENABLELISTENINGTO + + MENUITEM SEPARATOR + MENUITEM "Show next protocol", ID_SHOW_NEXT_PROTO + MENUITEM "Show previous protocol", ID_SHOW_PREV_PROTO + MENUITEM SEPARATOR + MENUITEM "Cycle through protocols", ID_CYCLE_THROUGH_PROTOS + MENUITEM "Don't cycle through protocols", + ID_DONT_CYCLE_THROUGH_PROTOS + END + POPUP "Nick popup" + BEGIN + MENUITEM SEPARATOR + MENUITEM "Set My Nickname...", ID_NICKPOPUP_SETMYNICKNAME + END + POPUP "Status message popup" + BEGIN + MENUITEM SEPARATOR + MENUITEM "Set My Status Message...", ID_STATUSMESSAGEPOPUP_SETMYSTATUSMESSAGE + + END + POPUP "Avatar popup" + BEGIN + MENUITEM SEPARATOR + MENUITEM "Set My Avatar...", ID_AVATARPOPUP_SETMYAVATAR + END + POPUP "ListeningTo popup" + BEGIN + MENUITEM SEPARATOR + MENUITEM "Enable Listening To", ID_LISTENINGTOPOPUP_SENDLISTENINGTO + + END +END + +#endif // Portuguese (Brazil) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/MyDetails/resource.h b/plugins/MyDetails/resource.h deleted file mode 100644 index b53e46d1a3..0000000000 --- a/plugins/MyDetails/resource.h +++ /dev/null @@ -1,71 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Developer Studio generated include file. -// Used by resource.rc -// -#define IDD_SETNICKNAME 101 -#define IDD_OPTS 102 -#define IDD_SETSTATUSMESSAGE 103 -#define IDR_MENU1 104 -#define IDI_LISTENINGTO 105 -#define IDI_RIGHT_ARROW 106 -#define IDI_LEFT_ARROW 107 -#define IDC_NICKNAME 1000 -#define IDC_SHOW_PROTO_NAME 1001 -#define IDC_CYCLE_THROUGH_PROTOS 1002 -#define IDC_TEXT_RTL 1003 -#define IDC_TEXT_ALIGN_RIGHT 1004 -#define IDC_REPLACE_SMILEYS 1005 -#define IDC_RESIZE_SMILEYS 1006 -#define IDC_RESIZE_FRAME 1007 -#define IDC_RESIZE_SMILEYS2 1008 -#define IDC_USE_CONTACT_LIST_SMILEYS 1008 -#define IDC_STATUSMESSAGE 1009 -#define IDC_GLOBAL_ON_NICKNAME 1009 -#define IDC_AVATAR_ALLOW_TO_GROW 1010 -#define IDC_GLOBAL_ON_STATUS_MESSAGE 1011 -#define IDC_GLOBAL_ON_STATUS 1012 -#define IDC_GLOBAL_ON_AVATAR 1013 -#define IDC_SHOW_CYCLE_PROTO_BUTTON 1014 -#define IDC_AVATAR_CUSTOM_CORNER_SIZE 1622 -#define IDC_AVATAR_CUSTOM_CORNER_SIZE_SPIN 1623 -#define IDC_BORDER_TOP 1624 -#define IDC_BORDER_TOP_SPIN 1625 -#define IDC_BORDER_LEFT 1626 -#define IDC_BORDER_LEFT_SPIN 1627 -#define IDC_BORDER_BOTTOM 1628 -#define IDC_BORDER_BOTTOM_SPIN 1629 -#define IDC_BORDER_RIGHT 1630 -#define IDC_BORDER_RIGHT_SPIN 1631 -#define IDC_CYCLE_TIME 1632 -#define IDC_CYCLE_TIME_SPIN 1633 -#define IDC_AVATAR_CUSTOM_SIZE 1634 -#define IDC_AVATAR_CUSTOM_SIZE_SPIN 1635 -#define IDC_AVATAR_CUSTOM_CORNER_SIZE_CHECK 1761 -#define IDC_AVATAR_DRAW_BORDER 1764 -#define IDC_AVATAR_CUSTOM_SIZE_CHK 1765 -#define IDC_AVATAR_ROUND_CORNERS 1800 -#define IDC_AVATAR_USE_FREE_SPACE 1801 -#define IDC_AVATAR_BORDER_COLOR_L 1839 -#define IDC_AVATAR_BORDER_COLOR 1840 -#define IDC_AVATAR_BKG_COLOR_L 1841 -#define IDC_AVATAR_BKG_COLOR 1842 -#define ID_CYCLE_THROUGH_PROTOS 40004 -#define ID_DONT_CYCLE_THROUGH_PROTOS 40005 -#define ID_SHOW_NEXT_PROTO 40006 -#define ID_SHOW_PREV_PROTO 40007 -#define ID_NICKPOPUP_SETMYNICKNAME 40008 -#define ID_STATUSMESSAGEPOPUP_SETMYSTATUSMESSAGE 40009 -#define ID_AVATARPOPUP_SETMYAVATAR 40010 -#define ID_LISTENINGTOPOPUP_SENDLISTENINGTO 40011 -#define ID_CONTEXTPOPUP_ENABLELISTENINGTO 40012 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 108 -#define _APS_NEXT_COMMAND_VALUE 40013 -#define _APS_NEXT_CONTROL_VALUE 1011 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/plugins/MyDetails/resource.rc b/plugins/MyDetails/resource.rc deleted file mode 100644 index da0ebf3c11..0000000000 --- a/plugins/MyDetails/resource.rc +++ /dev/null @@ -1,356 +0,0 @@ -//Microsoft Developer Studio generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" -#include "../../include/statusmodes.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -#ifndef _MAC -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,0,1,11 - PRODUCTVERSION 0,0,1,11 - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x40004L - FILETYPE 0x2L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "080004b0" - BEGIN - VALUE "Comments", "\0" - VALUE "CompanyName", " \0" - VALUE "FileDescription", "MyDetails Miranda Plugin\0" - VALUE "FileVersion", "0, 0, 1, 11\0" - VALUE "InternalName", "mydetails\0" - VALUE "LegalCopyright", "Copyright © 2005-2008 Ricardo Pescuma Domenecci, Drugwash\0" - VALUE "LegalTrademarks", "\0" - VALUE "OriginalFilename", "mydetails.dll\0" - VALUE "PrivateBuild", "\0" - VALUE "ProductName", "\0" - VALUE "ProductVersion", "0, 0, 1, 11\0" - VALUE "SpecialBuild", "\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x800, 1200 - END -END - -#endif // !_MAC - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_SETNICKNAME DIALOG DISCARDABLE 0, 0, 283, 65 -STYLE DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Set My Nickname" -FONT 8, "MS Shell Dlg" -BEGIN - RTEXT "Nickname:",IDC_STATIC,7,8,51,12 - EDITTEXT IDC_NICKNAME,67,7,209,31,ES_MULTILINE | ES_AUTOVSCROLL | - WS_VSCROLL - DEFPUSHBUTTON "OK",IDOK,87,44,50,14 - PUSHBUTTON "Cancel",IDCANCEL,146,44,50,14 -END - -IDD_OPTS DIALOGEX 0, 0, 316, 246 -STYLE DS_FIXEDSYS | WS_CHILD | WS_VISIBLE -EXSTYLE WS_EX_CONTROLPARENT -FONT 8, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - GROUPBOX " General ",IDC_STATIC,7,7,302,70 - CONTROL "Cycle through protocols every:", - IDC_CYCLE_THROUGH_PROTOS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,13,18,114,14 - EDITTEXT IDC_CYCLE_TIME,129,18,35,12,ES_NUMBER - CONTROL "",IDC_CYCLE_TIME_SPIN,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS | - UDS_HOTTRACK,156,18,11,12 - LTEXT "seconds",IDC_STATIC,171,21,32,11 - CONTROL "Global on avatar",IDC_GLOBAL_ON_AVATAR,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,207,18,96,14 - CONTROL "RTL",IDC_TEXT_RTL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 13,32,85,14 - CONTROL "Align text to right",IDC_TEXT_ALIGN_RIGHT,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,105,32,96,14 - CONTROL "Global on nickname",IDC_GLOBAL_ON_NICKNAME,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,207,32,96,14 - CONTROL "Auto-resize frame",IDC_RESIZE_FRAME,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,46,85,14 - CONTROL "Use contact list smileys",IDC_USE_CONTACT_LIST_SMILEYS, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,105,46,96,14 - CONTROL "Global on status",IDC_GLOBAL_ON_STATUS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,207,46,96,14 - CONTROL "Replace Smileys",IDC_REPLACE_SMILEYS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,60,85,14 - CONTROL "Resize Smileys",IDC_RESIZE_SMILEYS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,105,60,96,14 - CONTROL "Global on status message",IDC_GLOBAL_ON_STATUS_MESSAGE, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,207,61,96,14 - GROUPBOX " Frame Options ",IDC_STATIC,7,78,302,44 - LTEXT "Top:",IDC_STATIC,16,91,41,11 - EDITTEXT IDC_BORDER_TOP,59,89,35,12,ES_NUMBER - CONTROL "",IDC_BORDER_TOP_SPIN,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS | - UDS_HOTTRACK,88,89,11,12 - LTEXT "Bottom:",IDC_STATIC,111,91,41,11 - EDITTEXT IDC_BORDER_BOTTOM,154,89,35,12,ES_NUMBER - CONTROL "",IDC_BORDER_BOTTOM_SPIN,"msctls_updown32", - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | - UDS_NOTHOUSANDS | UDS_HOTTRACK,182,89,11,12 - LTEXT "Left:",IDC_STATIC,15,105,41,11 - EDITTEXT IDC_BORDER_LEFT,59,103,35,12,ES_NUMBER - CONTROL "",IDC_BORDER_LEFT_SPIN,"msctls_updown32", - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | - UDS_NOTHOUSANDS | UDS_HOTTRACK,88,103,11,12 - LTEXT "Right:",IDC_STATIC,111,106,41,11 - EDITTEXT IDC_BORDER_RIGHT,154,104,35,12,ES_NUMBER - CONTROL "",IDC_BORDER_RIGHT_SPIN,"msctls_updown32", - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | - UDS_NOTHOUSANDS | UDS_HOTTRACK,182,104,11,12 - LTEXT "Background Color:",IDC_AVATAR_BKG_COLOR_L,205,91,66,10 - CONTROL "",IDC_AVATAR_BKG_COLOR,"ColourPicker",WS_TABSTOP,277,89, - 17,13 - GROUPBOX " Avatar ",IDC_STATIC,7,124,302,83 - CONTROL "Custom size:",IDC_AVATAR_CUSTOM_SIZE_CHK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,16,137,66,9 - EDITTEXT IDC_AVATAR_CUSTOM_SIZE,87,135,35,12,ES_NUMBER - CONTROL "",IDC_AVATAR_CUSTOM_SIZE_SPIN,"msctls_updown32", - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | - UDS_NOTHOUSANDS | UDS_HOTTRACK,116,134,11,12 - LTEXT "pixels",IDC_STATIC,130,137,24,11 - CONTROL "Allow it to grow",IDC_AVATAR_ALLOW_TO_GROW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,174,137,106,9 - CONTROL "Draw border on avatar",IDC_AVATAR_DRAW_BORDER,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,16,152,103,9 - LTEXT "Border Color:",IDC_AVATAR_BORDER_COLOR_L,123,152,53,10 - CONTROL "",IDC_AVATAR_BORDER_COLOR,"ColourPicker",WS_TABSTOP,180, - 149,17,13 - CONTROL "Round corners of avatars",IDC_AVATAR_ROUND_CORNERS, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,166,280,8 - CONTROL "Custom corner size:", - IDC_AVATAR_CUSTOM_CORNER_SIZE_CHECK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,27,179,93,11 - EDITTEXT IDC_AVATAR_CUSTOM_CORNER_SIZE,127,178,35,12,ES_NUMBER - CONTROL "",IDC_AVATAR_CUSTOM_CORNER_SIZE_SPIN,"msctls_updown32", - UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | - UDS_NOTHOUSANDS | UDS_HOTTRACK,165,178,11,12 - LTEXT "pixels",IDC_STATIC,179,181,41,11 - CONTROL "Use free space (under avatar) to other texts", - IDC_AVATAR_USE_FREE_SPACE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,16,195,280,8 - GROUPBOX " Protocol ",IDC_STATIC,7,209,302,28 - CONTROL "Show protocol name",IDC_SHOW_PROTO_NAME,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,221,138,14 - CONTROL "Show protocol cycle button",IDC_SHOW_CYCLE_PROTO_BUTTON, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,163,221,138,14 -END - -IDD_SETSTATUSMESSAGE DIALOG DISCARDABLE 0, 0, 283, 68 -STYLE DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "Set My Status Message for All Status" -FONT 8, "MS Shell Dlg" -BEGIN - RTEXT "Status Message:",IDC_STATIC,7,8,69,12 - EDITTEXT IDC_STATUSMESSAGE,81,7,195,35,ES_MULTILINE | - ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL - DEFPUSHBUTTON "OK",IDOK,87,47,50,14 - PUSHBUTTON "Cancel",IDCANCEL,146,47,50,14 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_SETNICKNAME, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 276 - TOPMARGIN, 7 - BOTTOMMARGIN, 58 - END - - IDD_OPTS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 309 - TOPMARGIN, 7 - BOTTOMMARGIN, 238 - END - - IDD_SETSTATUSMESSAGE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 276 - TOPMARGIN, 7 - BOTTOMMARGIN, 61 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_LISTENINGTO ICON DISCARDABLE "res\\listening_to.ico" -IDI_RIGHT_ARROW ICON DISCARDABLE "res\\rightarrow.ico" -IDI_LEFT_ARROW ICON DISCARDABLE "res\\leftarrow.ico" -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////// -// Portuguese (Brazil) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_PTB) -#ifdef _WIN32 -LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN -#pragma code_page(1252) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "#include ""../../include/statusmodes.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDR_MENU1 MENU DISCARDABLE -BEGIN - POPUP "Status popup" - BEGIN - MENUITEM "&Offline", ID_STATUS_OFFLINE - MENUITEM "On&line", ID_STATUS_ONLINE - MENUITEM "&Away", ID_STATUS_AWAY - MENUITEM "&NA", ID_STATUS_NA - MENUITEM "Occ&upied", ID_STATUS_OCCUPIED - MENUITEM "&DND", ID_STATUS_DND - MENUITEM "&Free for chat", ID_STATUS_FREECHAT - MENUITEM "&Invisible", ID_STATUS_INVISIBLE - MENUITEM "On the &Phone", ID_STATUS_ONTHEPHONE - MENUITEM "Out to &Lunch", ID_STATUS_OUTTOLUNCH - END - POPUP "Context popup" - BEGIN - MENUITEM SEPARATOR - MENUITEM "Set My Avatar...", ID_AVATARPOPUP_SETMYAVATAR - MENUITEM "Set My Nickname...", ID_NICKPOPUP_SETMYNICKNAME - MENUITEM "Set My Status Message...", ID_STATUSMESSAGEPOPUP_SETMYSTATUSMESSAGE - - MENUITEM "Enable Listening To", ID_CONTEXTPOPUP_ENABLELISTENINGTO - - MENUITEM SEPARATOR - MENUITEM "Show next protocol", ID_SHOW_NEXT_PROTO - MENUITEM "Show previous protocol", ID_SHOW_PREV_PROTO - MENUITEM SEPARATOR - MENUITEM "Cycle through protocols", ID_CYCLE_THROUGH_PROTOS - MENUITEM "Don't cycle through protocols", - ID_DONT_CYCLE_THROUGH_PROTOS - END - POPUP "Nick popup" - BEGIN - MENUITEM SEPARATOR - MENUITEM "Set My Nickname...", ID_NICKPOPUP_SETMYNICKNAME - END - POPUP "Status message popup" - BEGIN - MENUITEM SEPARATOR - MENUITEM "Set My Status Message...", ID_STATUSMESSAGEPOPUP_SETMYSTATUSMESSAGE - - END - POPUP "Avatar popup" - BEGIN - MENUITEM SEPARATOR - MENUITEM "Set My Avatar...", ID_AVATARPOPUP_SETMYAVATAR - END - POPUP "ListeningTo popup" - BEGIN - MENUITEM SEPARATOR - MENUITEM "Enable Listening To", ID_LISTENINGTOPOPUP_SENDLISTENINGTO - - END -END - -#endif // Portuguese (Brazil) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/plugins/MyDetails/src/commons.h b/plugins/MyDetails/src/commons.h new file mode 100644 index 0000000000..4753c28d70 --- /dev/null +++ b/plugins/MyDetails/src/commons.h @@ -0,0 +1,109 @@ +/* +Copyright (C) 2005 Ricardo Pescuma Domenecci + +This is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +This 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with this file; see the file license.txt. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. +*/ + + +#ifndef __COMMONS_H__ +# define __COMMONS_H__ + +#define _CRT_SECURE_NO_WARNINGS + +#define _WIN32_WINNT 0x0501 +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include "m_cluiframes.h" +#include "m_simpleaway.h" + +#include +#include + +#include + +#include "resource.h" + +#define MODULE_NAME "MyDetails" + +#define SETTING_FRAME_VISIBLE "FrameVisible" +#define SETTING_DEFAULT_NICK "DefaultNick" + +extern HINSTANCE hInst; + +extern long nickname_dialog_open; +extern long status_msg_dialog_open; + +#include "m_mydetails.h" +#include "data.h" +#include "options.h" +#include "frame.h" +#include "../utils/mir_smileys.h" +#include "../utils/mir_memory.h" +#include "../utils/mir_options.h" +#include "../utils/mir_icons.h" + +#define PS_GETMYAVATARMAXSIZE "/GetMyAvatarMaxSize" + +#define PS_GETMYNICKNAMEMAXLENGTH "/GetMyNicknameMaxLength" + +// See if a protocol service exists +__inline static int ProtoServiceExists(const char *szModule,const char *szService) +{ + char str[MAXMODULELABELLENGTH]; + strcpy(str,szModule); + strcat(str,szService); + return ServiceExists(str); +} + +// Helper +static __inline int DRAW_TEXT(HDC hDC, LPCTSTR lpString, int nCount, LPRECT lpRect, UINT uFormat, const char *protocol, + SmileysParseInfo parseInfo) +{ + if (!opts.replace_smileys) + return DrawText(hDC, lpString, nCount, lpRect, uFormat); + + return Smileys_DrawText(hDC, lpString, nCount, lpRect, uFormat | (opts.resize_smileys ? DT_RESIZE_SMILEYS : 0), + opts.use_contact_list_smileys ? "clist" : protocol, parseInfo); +} + +#endif // __COMMONS_H__ diff --git a/plugins/MyDetails/src/data.cpp b/plugins/MyDetails/src/data.cpp new file mode 100644 index 0000000000..c29af17ed0 --- /dev/null +++ b/plugins/MyDetails/src/data.cpp @@ -0,0 +1,689 @@ +/* +Copyright (C) 2005 Ricardo Pescuma Domenecci + +This is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +This 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with this file; see the file license.txt. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. +*/ + + +#include "commons.h" +#include "data.h" + +static char *StatusModeToDbSetting(int status,const char *suffix); + +ProtocolArray *protocols = NULL; + +void InitProtocolData() +{ + PROTOACCOUNT **protos; + int count; + CallService(MS_PROTO_ENUMACCOUNTS, (WPARAM)&count, (LPARAM)&protos); + + protocols = new ProtocolArray(count); + + for (int i = 0; i < count; i++) { + PROTOACCOUNT* acc = protos[i]; + if (acc->type != PROTOTYPE_PROTOCOL) + continue; + + if (acc->szModuleName == NULL || acc->szModuleName[0] == '\0') + continue; + + // Found a protocol + Protocol *p = new Protocol(acc->szModuleName, acc->tszAccountName); + if ( p->IsValid()) + protocols->Add(p); + else + delete p; + } +} + +void DeInitProtocolData() +{ + delete protocols; +} + + +// Protocol Class /////////////////////////////////////////////////////////////////////////////////////////// + +Protocol::Protocol(const char *aName, const TCHAR* descr) +{ + lstrcpynA(name, aName, SIZEOF(name)); + lstrcpyn(description, descr, SIZEOF(description)); + + nickname[0] = _T('\0'); + status_message[0] = _T('\0'); + listening_to[0] = _T('\0'); + ace = NULL; + avatar_file[0] = _T('\0'); + avatar_bmp = NULL; + custom_status = 0; + data_changed = true; + + // Load services + int caps = CallProtoService(name, PS_GETCAPS, PFLAGNUM_1, 0); + valid = (caps & PF1_IM) == PF1_IM && strcmp(aName, "MetaContacts"); + if ( !valid) + return; + + can_have_listening_to = (ProtoServiceExists(name, PS_SET_LISTENINGTO) != 0); + + caps = CallProtoService(name, PS_GETCAPS, PFLAGNUM_4, 0); + can_have_avatar = (caps & PF4_AVATARS) != 0; + + PF3 = CallProtoService(name, PS_GETCAPS, (WPARAM)PFLAGNUM_3, 0); + + avatar_max_width = 0; + avatar_max_height = 0; + if (ProtoServiceExists(name, PS_GETMYAVATARMAXSIZE)) + CallProtoService(name, PS_GETMYAVATARMAXSIZE, (WPARAM) &avatar_max_width, (LPARAM) &avatar_max_height); + + can_set_nick = ProtoServiceExists(name, PS_SETMYNICKNAME) != FALSE; + + // Initial value + GetStatus(); + GetStatusMsg(); + GetNick(); + GetAvatar(); +} + +Protocol::~Protocol() +{ +} + +void Protocol::lcopystr(TCHAR *dest, TCHAR *src, size_t maxlen) +{ + if (lstrcmp(dest, src) != 0) + { + data_changed = true; + lstrcpyn(dest, src, maxlen); + } +} + +bool Protocol::IsValid() +{ + return valid; +} + + +int Protocol::GetStatus() +{ + int old_status = status; + status = CallProtoService(name, PS_GETSTATUS, 0, 0); + + if (old_status != status) + data_changed = true; + + if (/*status > ID_STATUS_OFFLINE &&*/ ProtoServiceExists(name, PS_ICQ_GETCUSTOMSTATUS)) + { + custom_status = CallProtoService(name, PS_ICQ_GETCUSTOMSTATUS, (WPARAM) &custom_status_name, + (LPARAM) &custom_status_message); + } + else + { + custom_status = 0; + } + + if (custom_status == 0) + { + TCHAR *tmp = (TCHAR*) CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, status, GSMDF_TCHAR); + lcopystr(status_name, tmp, SIZEOF(status_name)); + } + else + { + DBVARIANT dbv; + TCHAR tmp[256]; tmp[0] = 0; + + if (custom_status_name != NULL && custom_status_name[0] != '\0' + && !DBGetContactSettingTString(0, name, _T2A(custom_status_name), &dbv)) + { + if (dbv.ptszVal != NULL && dbv.ptszVal[0] != _T('\0')) + lstrcpyn(tmp, dbv.ptszVal, SIZEOF(tmp)); + else + lstrcpyn(tmp, TranslateT(""), SIZEOF(tmp)); + + DBFreeVariant(&dbv); + } + else + { + lstrcpyn(tmp, TranslateT(""), SIZEOF(tmp)); + } + + if (custom_status_message != NULL && custom_status_message[0] != '\0' + && !DBGetContactSettingTString(0, name, _T2A(custom_status_message), &dbv)) + { + if (dbv.ptszVal != NULL && dbv.ptszVal[0] != '\0') + { + int len = lstrlen(tmp); + + if (len < SIZEOF(tmp)) + lstrcpyn(&tmp[len], _T(": "), SIZEOF(tmp) - len); + + len += 2; + + if (len < SIZEOF(tmp)) + lstrcpyn(&tmp[len], dbv.ptszVal, SIZEOF(tmp) - len); + } + + DBFreeVariant(&dbv); + } + + lcopystr(status_name, tmp, SIZEOF(status_name)); + } + + return status; +} + +void Protocol::SetStatus(int aStatus) +{ + TCHAR status_msg[256]; + + if (ServiceExists(MS_CS_SETSTATUSEX)) + { + // :'( + + // BEGIN From commomstatus.cpp (KeepStatus) + int i, count, pCount; + PROTOACCOUNT **accs; + + pCount = 0; + CallService(MS_PROTO_ENUMPROTOCOLS,(WPARAM)&count,(LPARAM)&accs); + for (i=0; i < count; i++) { + if (accs[i]->type != PROTOTYPE_PROTOCOL || CallProtoService(accs[i]->szModuleName,PS_GETCAPS,PFLAGNUM_2,0)==0) + continue; + pCount++; + } + // END From commomstatus.cpp (KeepStatus) + + + PROTOCOLSETTINGEX **pse = (PROTOCOLSETTINGEX **) mir_alloc0(pCount * sizeof(PROTOCOLSETTINGEX *)); + + for (i = 0; i < pCount; i++) { + pse[i] = (PROTOCOLSETTINGEX *) mir_alloc0(sizeof(PROTOCOLSETTINGEX)); + pse[i]->szName = ""; + } + + pse[0]->cbSize = sizeof(PROTOCOLSETTINGEX); + pse[0]->status = aStatus; + pse[0]->szName = name; + + GetStatusMsg(aStatus, status_msg, SIZEOF(status_msg)); + pse[0]->szMsg = status_msg; + + CallService(MS_CS_SETSTATUSEX, (WPARAM) &pse, 0); + + for (i = 0; i < pCount; i++) + mir_free(pse[i]); + mir_free(pse); + } + else + { + CallProtoService(name, PS_SETSTATUS, aStatus, 0); + + if (CanSetStatusMsg(aStatus)) { + TCHAR status_msg[MS_MYDETAILS_GETMYSTATUSMESSAGE_BUFFER_SIZE]; + GetStatusMsg(aStatus, status_msg, SIZEOF(status_msg)); + SetStatusMsg(aStatus, status_msg); + } + } +} + + +bool Protocol::CanGetStatusMsg() +{ + return CanGetStatusMsg(status); +} + +bool Protocol::CanGetStatusMsg(int aStatus) +{ + return (CallProtoService(name, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND) != 0 + && (PF3 & Proto_Status2Flag(aStatus)); +} + + +bool Protocol::CanSetStatusMsg() +{ + return CanSetStatusMsg(GetStatus()); // <- Simple away handled by this one +} + +bool Protocol::CanSetStatusMsg(int aStatus) +{ + return CanGetStatusMsg(aStatus); +} + +void Protocol::GetStatusMsg(int aStatus, TCHAR *msg, size_t msg_size) +{ + if ( !CanGetStatusMsg()) + { + lcopystr(msg, _T(""), msg_size); + return; + } + + if (aStatus == status && ProtoServiceExists(name, PS_GETMYAWAYMSG) ) + { + TCHAR *tmp = (TCHAR*) CallProtoService(name, PS_GETMYAWAYMSG, 0, SGMA_TCHAR); + lcopystr(msg, tmp == NULL ? _T("") : tmp, msg_size); + } + + else if (ServiceExists(MS_AWAYMSG_GETSTATUSMSG)) + { + TCHAR *tmp = (TCHAR*) CallService(MS_AWAYMSG_GETSTATUSMSGT, (WPARAM)aStatus, 0); + if (tmp != NULL) + { + lcopystr(msg, tmp, msg_size); + mir_free(tmp); + } + else lcopystr(msg, _T(""), msg_size); + } +} + +TCHAR* Protocol::GetStatusMsg() +{ + GetStatusMsg(status, status_message, SIZEOF(status_message)); + return status_message; +} + +void Protocol::SetStatusMsg(const TCHAR *message) +{ + SetStatusMsg(GetStatus(), message); +} + +void Protocol::SetStatusMsg(int aStatus, const TCHAR *message) +{ + if ( !CanSetStatusMsg(aStatus)) + return; + + CallProtoService(name, PS_SETAWAYMSGT, (WPARAM)aStatus, (LPARAM)message); +} + +bool Protocol::HasAvatar() +{ + GetAvatar(); + + return avatar_bmp != NULL; +} + +bool Protocol::CanGetAvatar() +{ + if ( !can_have_avatar) + return false; + + if ( !ServiceExists(MS_AV_GETMYAVATAR)) + return false; + + return true; +} + +void Protocol::GetAvatar() +{ + // See if can get one + if ( !CanGetAvatar()) + return; + + avatar_file[0] = '\0'; + avatar_bmp = NULL; + ace = NULL; + + // Get HBITMAP from cache + ace = (avatarCacheEntry *)CallService(MS_AV_GETMYAVATAR, 0, (LPARAM) name); + if (ace != NULL) + avatar_bmp = ace->hbmPic; + + data_changed = true; +} + + +bool Protocol::CanGetNick() +{ + return ServiceExists(MS_CONTACT_GETCONTACTINFO) != FALSE; +} + +int Protocol::GetNickMaxLength() +{ + if (ProtoServiceExists(name, PS_GETMYNICKNAMEMAXLENGTH)) + { + int ret = CallProtoService(name, PS_GETMYNICKNAMEMAXLENGTH, 0, 0); + if (ret <= 0) + ret = MS_MYDETAILS_GETMYNICKNAME_BUFFER_SIZE; + return ret; + } + else + return MS_MYDETAILS_GETMYNICKNAME_BUFFER_SIZE; +} + +TCHAR* Protocol::GetNick() +{ + // See if can get one + if ( !CanGetNick()) + return NULL; + + // Get it + CONTACTINFO ci = { 0 }; + ci.cbSize = sizeof(ci); + ci.hContact = NULL; + ci.szProto = name; + ci.dwFlag = CNF_DISPLAY; + +#ifdef UNICODE + ci.dwFlag |= CNF_UNICODE; +#endif + + if ( !CallService(MS_CONTACT_GETCONTACTINFO, 0, (LPARAM) & ci)) + { + // CNF_DISPLAY always returns a string type + lcopystr(nickname, ci.pszVal, SIZEOF(nickname)); + mir_free(ci.pszVal); + } + else lcopystr(nickname, _T(""), SIZEOF(nickname)); + + return nickname; +} + + +bool Protocol::CanSetNick() +{ + return can_set_nick; +} + + +void Protocol::SetNick(const TCHAR *nick) +{ + // See if can get one + if ( !CanSetNick()) + return; + + if (nick == NULL) + return; + + // Get it + CallProtoService(name, PS_SETMYNICKNAME, SMNN_TCHAR, (LPARAM)nick); +} + + +bool Protocol::CanSetAvatar() +{ + return ServiceExists(MS_AV_SETMYAVATAR) != FALSE && ServiceExists(MS_AV_CANSETMYAVATAR) != FALSE && + CallService(MS_AV_CANSETMYAVATAR, (WPARAM) name, 0); +} + +void Protocol::SetAvatar(const TCHAR *file_name) +{ + if ( !CanSetAvatar()) + return; + + CallService(MS_AV_SETMYAVATART, (WPARAM) name, (LPARAM) file_name); +} + +bool Protocol::CanGetListeningTo() +{ + return can_have_listening_to; +} + +bool Protocol::CanSetListeningTo() +{ + return CanGetListeningTo() && ServiceExists(MS_LISTENINGTO_ENABLE); +} + +bool Protocol::ListeningToEnabled() +{ + return CanSetListeningTo() && CallService(MS_LISTENINGTO_ENABLED, (WPARAM) name, 0) != 0; +} + +TCHAR * Protocol::GetListeningTo() +{ + if ( !CanGetListeningTo()) + { + lcopystr(listening_to, _T(""), SIZEOF(listening_to)); + return listening_to; + } + + DBVARIANT dbv = {0}; + if ( DBGetContactSettingTString(NULL, name, "ListeningTo", &dbv)) + { + lcopystr(listening_to, _T(""), SIZEOF(listening_to)); + return listening_to; + } + + lcopystr(listening_to, dbv.ptszVal, SIZEOF(listening_to)); + DBFreeVariant(&dbv); + return listening_to; +} + +// ProtocolDataArray Class ///////////////////////////////////////////////////////////////////////////// + +ProtocolArray::ProtocolArray(int max_size) +{ + buffer = (Protocol **) malloc(max_size * sizeof(Protocol*)); + buffer_len = 0; + + GetDefaultNick(); + GetDefaultAvatar(); +} + + +ProtocolArray::~ProtocolArray() +{ + if (buffer != NULL) { + for ( int i = 0 ; i < buffer_len ; i++ ) + delete buffer[i]; + free(buffer); + } +} + + +int ProtocolArray::GetSize() +{ + return buffer_len; +} + + +void ProtocolArray::Add(Protocol *p) +{ + buffer[buffer_len] = p; + buffer_len++; +} + + +Protocol * ProtocolArray::Get(int i) +{ + if (i >= buffer_len) + return NULL; + else + return buffer[i]; +} + + +Protocol * ProtocolArray::Get(const char *name) +{ + if (name == NULL) + return NULL; + + for ( int i = 0 ; i < buffer_len ; i++ ) + { + if (strcmp(name, buffer[i]->name) == 0) + return buffer[i]; + } + + return NULL; +} + + +bool ProtocolArray::CanSetStatusMsgPerProtocol() +{ + return ServiceExists(MS_SA_CHANGESTATUSMSG) != 0; +} + + +void ProtocolArray::GetAvatars() +{ + for ( int i = 0 ; i < buffer_len ; i++ ) + { + buffer[i]->GetAvatar(); + } +} + +void ProtocolArray::GetStatusMsgs() +{ + for ( int i = 0 ; i < buffer_len ; i++ ) + buffer[i]->GetStatusMsg(); +} + +void ProtocolArray::GetStatuses() +{ + for ( int i = 0 ; i < buffer_len ; i++ ) + buffer[i]->GetStatus(); +} + +int ProtocolArray::GetGlobalStatus() +{ + int status = CallService(MS_CLIST_GETSTATUSMODE, 0, 0); + if (status == ID_STATUS_CONNECTING) + status = ID_STATUS_OFFLINE; + + return status; +} + +bool ProtocolArray::CanSetAvatars() +{ + return ServiceExists(MS_AV_SETMYAVATART) != FALSE; +} + +void ProtocolArray::SetAvatars(const TCHAR *file_name) +{ + if ( !CanSetAvatars()) + return; + + CallService(MS_AV_SETMYAVATART, NULL, (WPARAM) file_name); +} + +void ProtocolArray::SetNicks(const TCHAR *nick) +{ + if (nick == NULL || nick[0] == '\0') + return; + + lstrcpyn(default_nick, nick, SIZEOF(default_nick)); + + DBWriteContactSettingTString(0, MODULE_NAME, SETTING_DEFAULT_NICK, nick); + + for ( int i = 0 ; i < buffer_len ; i++ ) + buffer[i]->SetNick(default_nick); +} + + +void ProtocolArray::SetStatus(int aStatus) +{ + CallService(MS_CLIST_SETSTATUSMODE, aStatus, 0); +} + +void ProtocolArray::SetStatusMsgs(const TCHAR *message) +{ + for (int i = ID_STATUS_OFFLINE ; i <= ID_STATUS_IDLE; i++) + SetStatusMsgs(i, message); +} + +void ProtocolArray::SetStatusMsgs(int status, const TCHAR *message) +{ + DBWriteContactSettingTString(NULL,"SRAway",StatusModeToDbSetting(status,"Msg"),message); + + // Save default also + if ( !db_get_b(NULL,"SRAway",StatusModeToDbSetting(status,"UsePrev"),0)) + DBWriteContactSettingTString(NULL,"SRAway",StatusModeToDbSetting(status,"Default"),message); + + for ( int i = 0 ; i < buffer_len ; i++ ) + if (buffer[i]->status == status) + buffer[i]->SetStatusMsg(status, message); +} + +void ProtocolArray::GetDefaultNick() +{ + DBVARIANT dbv; + if ( !DBGetContactSettingTString(0, MODULE_NAME, SETTING_DEFAULT_NICK, &dbv)) { + lstrcpyn(default_nick, dbv.ptszVal, SIZEOF(default_nick)); + DBFreeVariant(&dbv); + } + else default_nick[0] = '\0'; +} + +void ProtocolArray::GetDefaultAvatar() +{ + DBVARIANT dbv; + if ( !DBGetContactSettingTString(0, "ContactPhoto", "File", &dbv)) { + lstrcpyn(default_avatar_file, dbv.ptszVal, SIZEOF(default_avatar_file)); + DBFreeVariant(&dbv); + } + else default_avatar_file[0] = '\0'; +} + +TCHAR* ProtocolArray::GetDefaultStatusMsg() +{ + return GetDefaultStatusMsg(CallService(MS_CLIST_GETSTATUSMODE, 0, 0)); +} + +TCHAR* ProtocolArray::GetDefaultStatusMsg(int status) +{ + default_status_message[0] = '\0'; + + if (ServiceExists(MS_AWAYMSG_GETSTATUSMSG)) { + if (status == ID_STATUS_CONNECTING) + status = ID_STATUS_OFFLINE; + + TCHAR *tmp = (TCHAR*) CallService(MS_AWAYMSG_GETSTATUSMSGT, (WPARAM)status, 0); + if (tmp != NULL) { + lstrcpyn(default_status_message, tmp, SIZEOF(default_status_message)); + mir_free(tmp); + } + } + + return default_status_message; +} + +bool ProtocolArray::CanSetListeningTo() +{ + return ServiceExists(MS_LISTENINGTO_ENABLE) != 0; +} + +bool ProtocolArray::ListeningToEnabled() +{ + return CanSetListeningTo() && CallService(MS_LISTENINGTO_ENABLED, 0, 0) != 0; +} + + +////////////////////////////////////////////////////////////////////////////////////////////////////// +// Helper functions + +static char *StatusModeToDbSetting(int status,const char *suffix) +{ + char *prefix; + static char str[64]; + + switch(status) { + case ID_STATUS_AWAY: prefix="Away"; break; + case ID_STATUS_NA: prefix="Na"; break; + case ID_STATUS_DND: prefix="Dnd"; break; + case ID_STATUS_OCCUPIED: prefix="Occupied"; break; + case ID_STATUS_FREECHAT: prefix="FreeChat"; break; + case ID_STATUS_ONLINE: prefix="On"; break; + case ID_STATUS_OFFLINE: prefix="Off"; break; + case ID_STATUS_INVISIBLE: prefix="Inv"; break; + case ID_STATUS_ONTHEPHONE: prefix="Otp"; break; + case ID_STATUS_OUTTOLUNCH: prefix="Otl"; break; + case ID_STATUS_IDLE: prefix="Idl"; break; + default: return NULL; + } + lstrcpyA(str,prefix); lstrcatA(str,suffix); + return str; +} + + diff --git a/plugins/MyDetails/src/data.h b/plugins/MyDetails/src/data.h new file mode 100644 index 0000000000..d8c75beda4 --- /dev/null +++ b/plugins/MyDetails/src/data.h @@ -0,0 +1,163 @@ +/* +Copyright (C) 2005 Ricardo Pescuma Domenecci + +This is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +This 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with this file; see the file license.txt. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. +*/ + + +#ifndef __DATA_H__ +# define __DATA_H__ + + +//#include "protocol_config.h" + +class Protocol +{ + // Attributes //////////// +protected: + bool valid; + bool can_set_nick; + bool can_have_avatar; + bool can_have_listening_to; + int PF3; + + void lcopystr(TCHAR *dest, TCHAR *src, size_t maxlen); + +public: + // Name of protocol + char name[256]; + TCHAR description[256]; + TCHAR nickname[256]; + TCHAR status_name[256]; + TCHAR *custom_status_name; + TCHAR status_message[1024]; + TCHAR *custom_status_message; + TCHAR listening_to[1024]; + AVATARCACHEENTRY *ace; + TCHAR avatar_file[1024]; + HBITMAP avatar_bmp; + int status; + int custom_status; + + int avatar_max_width; + int avatar_max_height; + + bool data_changed; + + + // Methods /////////////// + + Protocol(const char *name, const TCHAR *descr); + ~Protocol(); + + bool IsValid(); + + int GetStatus(); // Copy to cache and return a copy + void SetStatus(int aStatus); + + bool HasAvatar(); + bool CanGetAvatar(); + void GetAvatar(); // Copy to cache + + bool CanSetAvatar(); + void SetAvatar(const TCHAR *file_name); + //void SetAvatar(const char *file_name, HBITMAP hBmp); + + bool CanGetNick(); + TCHAR * GetNick(); // Copy to cache and return a copy + int GetNickMaxLength(); + bool CanSetNick(); + void SetNick(const TCHAR *nick); + + bool CanGetListeningTo(); + bool CanSetListeningTo(); + bool ListeningToEnabled(); + TCHAR * GetListeningTo(); // Copy to cache and return a copy + + bool CanGetStatusMsg(); + bool CanGetStatusMsg(int aStatus); + TCHAR * GetStatusMsg(); // Copy to cache and return a copy + void GetStatusMsg(int aStatus, TCHAR *msg, size_t msg_size); + bool CanSetStatusMsg(); + bool CanSetStatusMsg(int aStatus); + void SetStatusMsg(const TCHAR *message); + void SetStatusMsg(int aStatus, const TCHAR *message); +}; + + + +class ProtocolArray +{ +protected: + // Attributes //////////// + Protocol **buffer; + int buffer_len; + +public: + TCHAR default_nick[256]; + TCHAR default_avatar_file[256]; + TCHAR default_status_message[256]; + + // Methods /////////////// + + ProtocolArray(int max_size); + virtual ~ProtocolArray(); + + int GetSize(); + + void Add(Protocol *p); + Protocol* Get(int i); + Protocol* Get(const char *name); + + void GetAvatars(); + bool CanSetAvatars(); + void SetAvatars(const TCHAR *file); + + void SetNicks(const TCHAR *nick); + + void SetStatus(int aStatus); + + void SetStatusMsgs(const TCHAR *message); + void SetStatusMsgs(int status, const TCHAR *message); + + void GetStatusMsgs(); + void GetStatuses(); + int GetGlobalStatus(); + + bool CanSetStatusMsgPerProtocol(); + + void GetDefaultNick(); // Copy to cache + void GetDefaultAvatar(); // Copy to cache + TCHAR* GetDefaultStatusMsg(); // Copy to cache + TCHAR* GetDefaultStatusMsg(int status); + + bool CanSetListeningTo(); + bool ListeningToEnabled(); +}; + +extern ProtocolArray *protocols; + + + +void InitProtocolData(); +void DeInitProtocolData(); + + + + + + +#endif // __DATA_H__ diff --git a/plugins/MyDetails/src/frame.cpp b/plugins/MyDetails/src/frame.cpp new file mode 100644 index 0000000000..baaf0b26dd --- /dev/null +++ b/plugins/MyDetails/src/frame.cpp @@ -0,0 +1,2757 @@ +/* +Copyright (C) 2005 Ricardo Pescuma Domenecci + +This is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +This 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with this file; see the file license.txt. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. +*/ + +#include "commons.h" + +#include + +// Prototypes ///////////////////////////////////////////////////////////////////////////////////// + +#define WINDOW_NAME_PREFIX "mydetails_window" +#define WINDOW_CLASS_NAME _T("MyDetailsFrame") +#define CONTAINER_CLASS_NAME _T("MyDetailsFrameContainer") + +#define ID_FRAME_TIMER 1011 +#define ID_RECALC_TIMER 1012 +#define ID_STATUSMESSAGE_TIMER 1013 + +#define RECALC_TIME 1000 + +#define IDC_HAND MAKEINTRESOURCE(32649) + +#define DEFAULT_NICKNAME _T("") +#define DEFAULT_STATUS_MESSAGE _T("") +#define DEFAULT_LISTENING_TO _T("") + + +// Messages +#define MWM_REFRESH (WM_USER+10) +#define MWM_NICK_CHANGED (WM_USER+11) +#define MWM_STATUS_CHANGED (WM_USER+12) +#define MWM_STATUS_MSG_CHANGED (WM_USER+13) +#define MWM_AVATAR_CHANGED (WM_USER+14) +#define MWM_LISTENINGTO_CHANGED (WM_USER+15) + + +HWND hwnd_frame = NULL; +HWND hwnd_container = NULL; + +int frame_id = -1; + +HANDLE hMenuShowHideFrame = 0; + +#define FONT_NICK 0 +#define FONT_PROTO 1 +#define FONT_STATUS 2 +#define FONT_AWAY_MSG 3 +#define FONT_LISTENING_TO 4 +#define NUM_FONTS 5 + +FontIDT font_id[NUM_FONTS]; +HFONT hFont[NUM_FONTS]; +COLORREF font_colour[NUM_FONTS]; + +// Defaults +TCHAR *font_names[] = { LPGENT("Nickname"), LPGENT("Protocol"), LPGENT("Status"), LPGENT("Status Message"), LPGENT("Listening To") }; +char font_sizes[] = { 13, 8, 8, 8, 8 }; +BYTE font_styles[] = { DBFONTF_BOLD, 0, 0, DBFONTF_ITALIC, DBFONTF_ITALIC }; +COLORREF font_colors[] = { RGB(0,0,0), RGB(0,0,0), RGB(0,0,0), RGB(150,150,150), RGB(150,150,150) }; + + +int CreateFrame(); +void FixMainMenu(); +void RefreshFrame(); +void RedrawFrame(); + + +// used when no multiwindow functionality available +bool MyDetailsFrameVisible(); +void SetMyDetailsFrameVisible(bool visible); +INT_PTR ShowHideMenuFunc(WPARAM wParam, LPARAM lParam); +INT_PTR ShowFrameFunc(WPARAM wParam, LPARAM lParam); +INT_PTR HideFrameFunc(WPARAM wParam, LPARAM lParam); +INT_PTR ShowHideFrameFunc(WPARAM wParam, LPARAM lParam); + +LRESULT CALLBACK FrameContainerWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); +LRESULT CALLBACK FrameWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); +void SetCycleTime(); +void SetCycleTime(HWND hwnd); +void SetStatusMessageRefreshTime(); +void SetStatusMessageRefreshTime(HWND hwnd); +int SettingsChangedHook(WPARAM wParam, LPARAM lParam); +int AvatarChangedHook(WPARAM wParam, LPARAM lParam); +int ProtoAckHook(WPARAM wParam, LPARAM lParam); +int SmileyAddOptionsChangedHook(WPARAM wParam,LPARAM lParam); +int ListeningtoEnableStateChangedHook(WPARAM wParam,LPARAM lParam); + + +#define OUTSIDE_BORDER 6 +#define SPACE_IMG_TEXT 6 +#define SPACE_TEXT_TEXT 0 +#define SPACE_ICON_TEXT 2 +#define ICON_SIZE 16 + +#define BORDER_SPACE 2 + +struct MyDetailsFrameData +{ + RECT proto_rect; + bool draw_proto; + bool mouse_over_proto; + + bool draw_proto_cycle; + RECT next_proto_rect; + HWND next_proto_tt_hwnd; + RECT prev_proto_rect; + HWND prev_proto_tt_hwnd; + + RECT img_rect; + bool draw_img; + bool mouse_over_img; + + RECT nick_rect; + bool draw_nick; + bool mouse_over_nick; + HWND nick_tt_hwnd; + + RECT status_rect; + RECT status_icon_rect; + RECT status_text_rect; + bool draw_status; + bool mouse_over_status; + HWND status_tt_hwnd; + + RECT away_msg_rect; + bool draw_away_msg; + bool mouse_over_away_msg; + HWND away_msg_tt_hwnd; + + RECT listening_to_rect; + RECT listening_to_icon_rect; + RECT listening_to_text_rect; + bool draw_listening_to; + bool mouse_over_listening_to; + HWND listening_to_tt_hwnd; + + int protocol_number; + + bool showing_menu; + bool skinning; + bool recalc_rectangles; + + bool get_status_messages; +}; + + +// Functions ////////////////////////////////////////////////////////////////////////////////////// + +void InitFrames() +{ + InitContactListSmileys(); + + CreateFrame(); + + HookEvent(ME_DB_CONTACT_SETTINGCHANGED, SettingsChangedHook); + HookEvent(ME_AV_MYAVATARCHANGED, AvatarChangedHook); + HookEvent(ME_PROTO_ACK, ProtoAckHook); + HookEvent(ME_SMILEYADD_OPTIONSCHANGED,SmileyAddOptionsChangedHook); + HookEvent(ME_LISTENINGTO_ENABLE_STATE_CHANGED,ListeningtoEnableStateChangedHook); +} + + +void DeInitFrames() +{ + if (ServiceExists(MS_CLIST_FRAMES_REMOVEFRAME) && frame_id != -1) + { + CallService(MS_CLIST_FRAMES_REMOVEFRAME, (WPARAM)frame_id, 0); + } + + for (int i = 0 ; i < NUM_FONTS ; i++ ) + { + if (hFont[i] != 0) DeleteObject(hFont[i]); + } + + if (hwnd_frame != NULL) DestroyWindow(hwnd_frame); + if (hwnd_container != NULL) DestroyWindow(hwnd_container); +} + + +int ReloadFont(WPARAM wParam, LPARAM lParam) +{ + LOGFONT log_font; + + for (int i = 0 ; i < NUM_FONTS ; i++ ) + { + if (hFont[i] != 0) DeleteObject(hFont[i]); + + font_colour[i] = CallService(MS_FONT_GETT, (WPARAM)&font_id[i], (LPARAM)&log_font); + hFont[i] = CreateFontIndirect(&log_font); + } + + RefreshFrame(); + return 0; +} + +int SmileyAddOptionsChangedHook(WPARAM wParam,LPARAM lParam) +{ + RefreshFrame(); + return 0; +} + +int CreateFrame() +{ + HDC hdc = GetDC(NULL); + + for (int i = 0 ; i < NUM_FONTS ; i++) { + ZeroMemory(&font_id[i], sizeof(font_id[i])); + + font_id[i].cbSize = sizeof(FontIDT); + _tcsncpy(font_id[i].group, LPGENT("My Details"), SIZEOF(font_id[i].group)); + _tcsncpy(font_id[i].name, font_names[i], SIZEOF(font_id[i].name)); + strncpy(font_id[i].dbSettingsGroup, MODULE_NAME, SIZEOF(font_id[i].dbSettingsGroup)); + + char tmp[128]; + mir_snprintf(tmp, sizeof(tmp), "%sFont", font_names[i]); + strncpy(font_id[i].prefix, tmp, SIZEOF(font_id[i].prefix)); + + font_id[i].deffontsettings.colour = font_colors[i]; + font_id[i].deffontsettings.size = -MulDiv(font_sizes[i], GetDeviceCaps(hdc, LOGPIXELSY), 72); + font_id[i].deffontsettings.style = font_styles[i]; + font_id[i].deffontsettings.charset = DEFAULT_CHARSET; + _tcsncpy(font_id[i].deffontsettings.szFace, _T("Tahoma"), SIZEOF(font_id[i].deffontsettings.szFace)); + font_id[i].order = i; + font_id[i].flags = FIDF_DEFAULTVALID; + FontRegisterT(&font_id[i]); + } + + ReleaseDC(NULL, hdc); + + ReloadFont(0,0); + HookEvent(ME_FONT_RELOAD, ReloadFont); + + WNDCLASS wndclass; + wndclass.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW; //CS_PARENTDC | CS_HREDRAW | CS_VREDRAW; + wndclass.lpfnWndProc = FrameWindowProc; + wndclass.cbClsExtra = 0; + wndclass.cbWndExtra = 0; + wndclass.hInstance = hInst; + wndclass.hIcon = NULL; + wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); + wndclass.hbrBackground = 0; //(HBRUSH)(COLOR_3DFACE+1); + wndclass.lpszMenuName = NULL; + wndclass.lpszClassName = WINDOW_CLASS_NAME; + RegisterClass(&wndclass); + + if (ServiceExists(MS_CLIST_FRAMES_ADDFRAME)) { + hwnd_frame = CreateWindow(WINDOW_CLASS_NAME, TranslateT("My Details"), + WS_CHILD | WS_VISIBLE, + 0,0,10,10, (HWND)CallService(MS_CLUI_GETHWND, 0, 0), NULL, hInst, NULL); + + CLISTFrame Frame = {0}; + + Frame.cbSize = sizeof(Frame); + Frame.tname = LPGENT("My Details"); + Frame.cbSize = sizeof(CLISTFrame); + Frame.hWnd = hwnd_frame; + Frame.align = alTop; + Frame.Flags = F_VISIBLE | F_SHOWTB | F_SHOWTBTIP | F_NOBORDER | F_SKINNED | F_TCHAR; + Frame.height = 100; + frame_id = CallService(MS_CLIST_FRAMES_ADDFRAME, (WPARAM)&Frame, 0); + + if ( db_get_b(NULL, "MyDetails", "ForceHideFrame", 0)) { + int flags = CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS, MAKEWPARAM(FO_FLAGS, frame_id), 0); + if (flags & F_VISIBLE) + CallService(MS_CLIST_FRAMES_SHFRAME, frame_id, 0); + + db_unset(NULL, "MyDetails", "ForceHideFrame"); + } + + if ( db_get_b(NULL, "MyDetails", "ForceShowFrame", 0)) { + int flags = CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS, MAKEWPARAM(FO_FLAGS, frame_id), 0); + if (!(flags & F_VISIBLE)) + CallService(MS_CLIST_FRAMES_SHFRAME, frame_id, 0); + + db_unset(NULL, "MyDetails", "ForceShowFrame"); + } + } + else { + wndclass.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;//CS_HREDRAW | CS_VREDRAW; + wndclass.lpfnWndProc = FrameContainerWindowProc; + wndclass.cbClsExtra = 0; + wndclass.cbWndExtra = 0; + wndclass.hInstance = hInst; + wndclass.hIcon = NULL; + wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); + wndclass.hbrBackground = 0; //(HBRUSH)(COLOR_3DFACE+1); + wndclass.lpszMenuName = NULL; + wndclass.lpszClassName = CONTAINER_CLASS_NAME; + RegisterClass(&wndclass); + + hwnd_container = CreateWindowEx(WS_EX_TOOLWINDOW, CONTAINER_CLASS_NAME, TranslateT("My Details"), + (WS_THICKFRAME | WS_CAPTION | WS_SYSMENU) & ~WS_VISIBLE, + 0,0,200,130, (HWND)CallService(MS_CLUI_GETHWND, 0, 0), NULL, hInst, NULL); + + hwnd_frame = CreateWindow(WINDOW_CLASS_NAME, TranslateT("My Details"), + WS_CHILD | WS_VISIBLE, + 0,0,10,10, hwnd_container, NULL, hInst, NULL); + + SetWindowLong(hwnd_container, GWLP_USERDATA, (LONG)hwnd_frame); + SendMessage(hwnd_container, WM_SIZE, 0, 0); + + // Create menu item + + CLISTMENUITEM menu = {0}; + + menu.cbSize=sizeof(menu); + menu.flags = CMIF_TCHAR; + menu.popupPosition = -0x7FFFFFFF; + menu.ptszPopupName = LPGENT("My Details"); + menu.position = 1; // 500010000 + menu.hIcon = LoadSkinnedIcon(SKINICON_OTHER_MIRANDA); + menu.ptszName = LPGENT("Show My Details"); + menu.pszService= MODULE_NAME "/ShowHideMyDetails"; + hMenuShowHideFrame = Menu_AddMainMenuItem(&menu); + + if ( db_get_b(0, MODULE_NAME, SETTING_FRAME_VISIBLE, 1) == 1) { + ShowWindow(hwnd_container, SW_SHOW); + FixMainMenu(); + } + } + + CreateServiceFunction(MS_MYDETAILS_SHOWFRAME, ShowFrameFunc); + CreateServiceFunction(MS_MYDETAILS_HIDEFRAME, HideFrameFunc); + CreateServiceFunction(MS_MYDETAILS_SHOWHIDEFRAME, ShowHideFrameFunc); + return 0; +} + + +bool FrameIsFloating() +{ + if (frame_id == -1) + return true; // no frames, always floating + + return (CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS, MAKEWPARAM(FO_FLOATING, frame_id), 0) != 0); +} + + +LRESULT CALLBACK FrameContainerWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) { + case WM_SHOWWINDOW: + if ((BOOL)wParam) + Utils_RestoreWindowPosition(hwnd, 0, MODULE_NAME, WINDOW_NAME_PREFIX); + else + Utils_SaveWindowPosition(hwnd, 0, MODULE_NAME, WINDOW_NAME_PREFIX); + break; + + case WM_ERASEBKGND: + SendMessage((HWND)GetWindowLong(hwnd, GWLP_USERDATA), WM_ERASEBKGND, wParam, lParam); + break; + + case WM_SIZE: + { + HWND child = (HWND)GetWindowLong(hwnd, GWLP_USERDATA); + RECT r; + GetClientRect(hwnd, &r); + + SetWindowPos(child, 0, r.left, r.top, r.right - r.left, r.bottom - r.top, SWP_NOZORDER | SWP_NOACTIVATE); + InvalidateRect(child, NULL, TRUE); + } + return TRUE; + + case WM_CLOSE: + DBWriteContactSettingByte(0, MODULE_NAME, SETTING_FRAME_VISIBLE, 0); + ShowWindow(hwnd, SW_HIDE); + FixMainMenu(); + return TRUE; + } + + return DefWindowProc(hwnd, msg, wParam, lParam); +} + + +BOOL ScreenToClient(HWND hWnd, LPRECT lpRect) +{ + POINT pt; + pt.x = lpRect->left; + pt.y = lpRect->top; + + BOOL ret = ScreenToClient(hWnd, &pt); + if ( !ret) + return ret; + + lpRect->left = pt.x; + lpRect->top = pt.y; + + pt.x = lpRect->right; + pt.y = lpRect->bottom; + + ret = ScreenToClient(hWnd, &pt); + + lpRect->right = pt.x; + lpRect->bottom = pt.y; + + return ret; +} + +BOOL MoveWindow(HWND hWnd, const RECT &rect, BOOL bRepaint) +{ + return MoveWindow(hWnd, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, bRepaint); +} + +RECT GetInnerRect(const RECT &rc, const RECT &clipping) +{ + RECT rc_ret = rc; + rc_ret.left = max(rc.left, clipping.left); + rc_ret.top = max(rc.top, clipping.top); + rc_ret.right = min(rc.right, clipping.right); + rc_ret.bottom = min(rc.bottom, clipping.bottom); + + return rc_ret; +} + +RECT GetRect(HDC hdc, RECT rc, SIZE s, UINT uFormat, int next_top, int text_left, bool frame = true, + bool end_elipsis_on_frame = true) +{ + RECT r = rc; + + if (frame && end_elipsis_on_frame) + { + // Add space to ... + uFormat &= ~DT_END_ELLIPSIS; + + RECT rc_tmp = rc; + DrawText(hdc, _T(" ..."), 4, &rc_tmp, DT_CALCRECT | uFormat); + + s.cx += rc_tmp.right - rc_tmp.left; + } + + r.top = next_top; + r.bottom = r.top + s.cy; + + if (opts.draw_text_align_right) + { + r.left = r.right - s.cx; + } + else + { + r.left = text_left; + r.right = r.left + s.cx; + } + + if (frame) + { + r.bottom += 2 * BORDER_SPACE; + + if (opts.draw_text_align_right) + r.left -= 2 * BORDER_SPACE; + else + r.right += 2 * BORDER_SPACE; + } + + // Make it fit inside original rc + r.top = max(next_top, r.top); + r.bottom = min(rc.bottom, r.bottom); + r.left = max(text_left, r.left); + r.right = min(rc.right, r.right); + + return r; +} + +RECT GetRect(HDC hdc, RECT rc, const TCHAR *text, const TCHAR *def_text, Protocol *proto, UINT uFormat, + int next_top, int text_left, bool smileys = true, bool frame = true, bool end_elipsis_on_frame = true) +{ + const TCHAR *tmp; + + if (text[0] == '\0') + tmp = TranslateTS(def_text); + else + tmp = text; + + uFormat &= ~DT_END_ELLIPSIS; + + SIZE s; + RECT r_tmp = rc; + + // Only first line + TCHAR *tmp2 = _tcsdup(tmp); + TCHAR *pos = _tcschr(tmp2, '\r'); + if (pos != NULL) pos[0] = '\0'; + pos = _tcschr(tmp2, '\n'); + if (pos != NULL) pos[0] = '\0'; + + if (smileys) + DRAW_TEXT(hdc, tmp2, _tcslen(tmp2), &r_tmp, uFormat | DT_CALCRECT, proto->name, NULL); + else + DrawText(hdc, tmp2, _tcslen(tmp2), &r_tmp, uFormat | DT_CALCRECT); + + free(tmp2); + + s.cx = r_tmp.right - r_tmp.left; + s.cy = r_tmp.bottom - r_tmp.top; + + return GetRect(hdc, rc, s, uFormat, next_top, text_left, frame, end_elipsis_on_frame); +} + +HWND CreateTooltip(HWND hwnd, RECT &rect) +{ + // struct specifying control classes to register + INITCOMMONCONTROLSEX iccex; + HWND hwndTT; // handle to the ToolTip control + // struct specifying info about tool in ToolTip control + TOOLINFO ti; + unsigned int uid = 0; // for ti initialization + + // Load the ToolTip class from the DLL. + iccex.dwSize = sizeof(iccex); + iccex.dwICC = ICC_BAR_CLASSES; + + if (!InitCommonControlsEx(&iccex)) + return NULL; + + /* CREATE A TOOLTIP WINDOW */ + hwndTT = CreateWindowEx(WS_EX_TOPMOST, + TOOLTIPS_CLASS, + NULL, + WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + hwnd, + NULL, + hInst, + NULL + ); + + /* INITIALIZE MEMBERS OF THE TOOLINFO STRUCTURE */ + ti.cbSize = sizeof(TOOLINFO); + ti.uFlags = TTF_SUBCLASS; + ti.hwnd = hwnd; + ti.hinst = hInst; + ti.uId = uid; + ti.lpszText = LPSTR_TEXTCALLBACK; + // ToolTip control will cover the whole window + ti.rect.left = rect.left; + ti.rect.top = rect.top; + ti.rect.right = rect.right; + ti.rect.bottom = rect.bottom; + + /* SEND AN ADDTOOL MESSAGE TO THE TOOLTIP CONTROL WINDOW */ + SendMessage(hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti); + SendMessage(hwndTT, TTM_SETDELAYTIME, (WPARAM) (DWORD) TTDT_AUTOPOP, (LPARAM) MAKELONG(24 * 60 * 60 * 1000, 0)); + + return hwndTT; +} + +void DeleteTooltipWindows(MyDetailsFrameData *data) +{ + if (data->nick_tt_hwnd != NULL) { + DestroyWindow(data->nick_tt_hwnd); + data->nick_tt_hwnd = NULL; + } + + if (data->status_tt_hwnd != NULL) { + DestroyWindow(data->status_tt_hwnd); + data->status_tt_hwnd = NULL; + } + + if (data->next_proto_tt_hwnd != NULL) { + DestroyWindow(data->next_proto_tt_hwnd); + data->next_proto_tt_hwnd = NULL; + } + + if (data->prev_proto_tt_hwnd != NULL) { + DestroyWindow(data->prev_proto_tt_hwnd); + data->prev_proto_tt_hwnd = NULL; + } + + if (data->away_msg_tt_hwnd != NULL) { + DestroyWindow(data->away_msg_tt_hwnd); + data->away_msg_tt_hwnd = NULL; + } + + if (data->listening_to_tt_hwnd != NULL) { + DestroyWindow(data->listening_to_tt_hwnd); + data->listening_to_tt_hwnd = NULL; + } +} + +void CalcRectangles(HWND hwnd) +{ + HDC hdc = GetDC(hwnd); + HFONT hOldFont = (HFONT) GetCurrentObject(hdc, OBJ_FONT); + MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd, GWLP_USERDATA); + + if (hdc == NULL || data == NULL) + return; + + Protocol *proto = protocols->Get(data->protocol_number); + if (proto == NULL) + return; + + data->recalc_rectangles = false; + proto->data_changed = false; + + data->draw_proto = false; + data->draw_proto_cycle = false; + data->draw_img = false; + data->draw_nick = false; + data->draw_status = false; + data->draw_away_msg = false; + data->draw_listening_to = false; + + DeleteTooltipWindows(data); + + if (ServiceExists(MS_CLIST_FRAMES_SETFRAMEOPTIONS) && frame_id != -1) { + int flags = CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS, MAKEWPARAM(FO_FLAGS, frame_id), 0); + if (flags & F_UNCOLLAPSED) { + RECT rf; + GetClientRect(hwnd, &rf); + + int size = 0; + + if (rf.bottom - rf.top != size) { + if (FrameIsFloating()) { + HWND parent = GetParent(hwnd); + if (parent != NULL) { + RECT rp_client, rp_window, r_window; + GetClientRect(parent, &rp_client); + GetWindowRect(parent, &rp_window); + GetWindowRect(hwnd, &r_window); + int diff = (rp_window.bottom - rp_window.top) - (rp_client.bottom - rp_client.top); + if (ServiceExists(MS_CLIST_FRAMES_ADDFRAME)) + diff += (r_window.top - rp_window.top); + + SetWindowPos(parent, 0, 0, 0, rp_window.right - rp_window.left, size + diff, SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE); + } + } + } + SelectObject(hdc, hOldFont); + ReleaseDC(hwnd, hdc); + return; + } + } + + RECT r; + GetClientRect(hwnd, &r); + + if (opts.resize_frame) + r.bottom = 0x7FFFFFFF; + + int next_top; + int text_left; + int avatar_bottom = 0; + + UINT uFormat = DT_SINGLELINE | DT_NOPREFIX | DT_END_ELLIPSIS + | (opts.draw_text_align_right ? DT_RIGHT : DT_LEFT) + | (opts.draw_text_rtl ? DT_RTLREADING : 0); + + // make some borders + r.left += min(opts.borders[LEFT], r.right); + r.right = max(r.right - opts.borders[RIGHT], r.left); + r.top += min(opts.borders[TOP], r.bottom); + r.bottom = max(r.bottom - opts.borders[BOTTOM], r.top); + + next_top = r.top; + text_left = r.left; + + // Draw image? + if (proto->CanGetAvatar()) { + if (proto->avatar_bmp != NULL) { + data->draw_img = true; + + BITMAP bmp; + if (GetObject(proto->avatar_bmp, sizeof(bmp), &bmp)) { + // make bounds + RECT rc = r; + + LONG width; + LONG height; + + if (opts.draw_avatar_custom_size) { + rc.right = opts.draw_avatar_custom_size_pixels; + + width = opts.draw_avatar_custom_size_pixels; + height = opts.draw_avatar_custom_size_pixels; + } + else if (opts.resize_frame) { + rc.right = rc.left + (rc.right - rc.left) / 3; + + width = rc.right - rc.left; + height = rc.bottom - rc.top; + } + else { + rc.right = rc.left + min((rc.right - rc.left) / 3, rc.bottom - rc.top); + + width = rc.right - rc.left; + height = rc.bottom - rc.top; + } + + // Fit to image proportions + if ( !opts.draw_avatar_allow_to_grow) { + if (width > bmp.bmWidth) + width = bmp.bmWidth; + + if (height > bmp.bmHeight) + height = bmp.bmHeight; + } + + if ( !opts.resize_frame && height * bmp.bmWidth / bmp.bmHeight <= width) + width = height * bmp.bmWidth / bmp.bmHeight; + else + height = width * bmp.bmHeight / bmp.bmWidth; + + rc.right = rc.left + width; + rc.bottom = rc.top + height; + + data->img_rect = rc; + + avatar_bottom = data->img_rect.bottom + SPACE_TEXT_TEXT; + + // Make space to nick + text_left = data->img_rect.right + SPACE_IMG_TEXT; + } + } + } + + // Always draw nick + data->draw_nick = true; + SelectObject(hdc, hFont[FONT_NICK]); + + data->nick_rect = GetRect(hdc, r, proto->nickname, DEFAULT_NICKNAME, proto, uFormat, next_top, text_left); + + if (proto->nickname[0] != '\0') + data->nick_tt_hwnd = CreateTooltip(hwnd, data->nick_rect); + + next_top = data->nick_rect.bottom + SPACE_TEXT_TEXT; + + // Fits more? + if (next_top > r.bottom) + goto finish; + + if (next_top > avatar_bottom && opts.use_avatar_space_to_draw_text) + text_left = r.left; + + // Protocol? + if (opts.draw_show_protocol_name) { + data->draw_proto = true; + + SelectObject(hdc, hFont[FONT_PROTO]); + + RECT tmp_r = r; + int tmp_text_left = text_left; + if (opts.show_protocol_cycle_button) + tmp_r.right -= 2 * ICON_SIZE; + + data->proto_rect = GetRect(hdc, tmp_r, proto->description, _T(""), proto, uFormat, + next_top, tmp_text_left, false, true, false); + + if (opts.show_protocol_cycle_button) { + data->draw_proto_cycle= true; + + RECT prev = r; + prev.top = next_top; + prev.bottom = min(r.bottom, prev.top + ICON_SIZE); + + int diff = (data->proto_rect.bottom - data->proto_rect.top) - (prev.bottom - prev.top); + if (diff < 0) { + diff = -diff / 2; + data->proto_rect.top += diff; + data->proto_rect.bottom += diff; + } + else { + diff = diff / 2; + prev.top += diff; + prev.bottom += diff; + } + + prev.right -= ICON_SIZE; + prev.left = prev.right - ICON_SIZE; + + RECT next = prev; + next.left += ICON_SIZE; + next.right += ICON_SIZE; + + prev.left = max(text_left, prev.left); + prev.right = min(r.right, prev.right); + next.left = max(text_left, next.left); + next.right = min(r.right, next.right); + + data->prev_proto_rect = prev; + data->next_proto_rect = next; + + data->next_proto_tt_hwnd = CreateTooltip(hwnd, data->next_proto_rect); + data->prev_proto_tt_hwnd = CreateTooltip(hwnd, data->prev_proto_rect); + + + next_top = max(data->next_proto_rect.bottom, data->proto_rect.bottom) + SPACE_TEXT_TEXT; + } + else next_top = data->proto_rect.bottom + SPACE_TEXT_TEXT; + } + + // Fits more? + if (next_top + 2 * BORDER_SPACE > r.bottom) + goto finish; + + if (next_top > avatar_bottom && opts.use_avatar_space_to_draw_text) + text_left = r.left; + + // Status data? + { + data->draw_status = true; + + SelectObject(hdc, hFont[FONT_STATUS]); + + // Text size + RECT r_tmp = r; + DrawText(hdc, proto->status_name, _tcslen(proto->status_name), &r_tmp, + DT_CALCRECT | (uFormat & ~DT_END_ELLIPSIS)); + + SIZE s; + s.cy = max(r_tmp.bottom - r_tmp.top, ICON_SIZE); + s.cx = ICON_SIZE + SPACE_ICON_TEXT + r_tmp.right - r_tmp.left; + + // Status global rect + data->status_rect = GetRect(hdc, r, s, uFormat, next_top, text_left, true, false); + + if (proto->status_name[0] != '\0') + data->status_tt_hwnd = CreateTooltip(hwnd, data->status_rect); + + next_top = data->status_rect.bottom + SPACE_TEXT_TEXT; + + RECT rc_inner = data->status_rect; + rc_inner.top += BORDER_SPACE; + rc_inner.bottom -= BORDER_SPACE; + rc_inner.left += BORDER_SPACE; + rc_inner.right -= BORDER_SPACE; + + // Icon + data->status_icon_rect = rc_inner; + + if (opts.draw_text_align_right || opts.draw_text_rtl) + data->status_icon_rect.left = max(data->status_icon_rect.right - ICON_SIZE, rc_inner.left); + else + data->status_icon_rect.right = min(data->status_icon_rect.left + ICON_SIZE, rc_inner.right); + + if (r_tmp.bottom - r_tmp.top > ICON_SIZE) { + data->status_icon_rect.top += (r_tmp.bottom - r_tmp.top - ICON_SIZE) / 2; + data->status_icon_rect.bottom = data->status_icon_rect.top + ICON_SIZE; + } + + // Text + data->status_text_rect = GetInnerRect(rc_inner, r); + + if (opts.draw_text_align_right || opts.draw_text_rtl) + data->status_text_rect.right = max(data->status_icon_rect.left - SPACE_ICON_TEXT, rc_inner.left); + else + data->status_text_rect.left = min(data->status_icon_rect.right + SPACE_ICON_TEXT, rc_inner.right); + + if (ICON_SIZE > r_tmp.bottom - r_tmp.top) { + data->status_text_rect.top += (ICON_SIZE - (r_tmp.bottom - r_tmp.top)) / 2; + data->status_text_rect.bottom = data->status_text_rect.top + r_tmp.bottom - r_tmp.top; + } + } + + // Fits more? + if (next_top + 2 * BORDER_SPACE > r.bottom) + goto finish; + + if (next_top > avatar_bottom && opts.use_avatar_space_to_draw_text) + text_left = r.left; + + // Away msg? + if (proto->CanGetStatusMsg()) { + data->draw_away_msg = true; + + SelectObject(hdc, hFont[FONT_AWAY_MSG]); + + data->away_msg_rect = GetRect(hdc, r, proto->status_message, DEFAULT_STATUS_MESSAGE, proto, uFormat, next_top, text_left); + + if (proto->status_message[0] != '\0') + data->away_msg_tt_hwnd = CreateTooltip(hwnd, data->away_msg_rect); + + next_top = data->away_msg_rect.bottom + SPACE_TEXT_TEXT; + } + + // Fits more? + if (next_top + 2 * BORDER_SPACE > r.bottom) + goto finish; + + if (next_top > avatar_bottom && opts.use_avatar_space_to_draw_text) + text_left = r.left; + + // Listening to + if (proto->ListeningToEnabled() && proto->GetStatus() > ID_STATUS_OFFLINE) { + data->draw_listening_to = true; + + if (proto->listening_to[0] == '\0') { + SelectObject(hdc, hFont[FONT_LISTENING_TO]); + + data->listening_to_rect = GetRect(hdc, r, proto->listening_to, DEFAULT_LISTENING_TO, proto, uFormat, + next_top, text_left); + + data->listening_to_text_rect = data->listening_to_rect; + ZeroMemory(&data->listening_to_icon_rect, sizeof(data->listening_to_icon_rect)); + + next_top = data->listening_to_rect.bottom + SPACE_TEXT_TEXT; + } + else { + SelectObject(hdc, hFont[FONT_LISTENING_TO]); + + // Text size + RECT r_tmp = r; + DrawText(hdc, proto->listening_to, _tcslen(proto->listening_to), &r_tmp, + DT_CALCRECT | (uFormat & ~DT_END_ELLIPSIS)); + + SIZE s; + s.cy = max(r_tmp.bottom - r_tmp.top, ICON_SIZE); + s.cx = ICON_SIZE + SPACE_ICON_TEXT + r_tmp.right - r_tmp.left; + + // listening to global rect + data->listening_to_rect = GetRect(hdc, r, s, uFormat, next_top, text_left, true, false); + + data->listening_to_tt_hwnd = CreateTooltip(hwnd, data->listening_to_rect); + + next_top = data->listening_to_rect.bottom + SPACE_TEXT_TEXT; + + RECT rc_inner = data->listening_to_rect; + rc_inner.top += BORDER_SPACE; + rc_inner.bottom -= BORDER_SPACE; + rc_inner.left += BORDER_SPACE; + rc_inner.right -= BORDER_SPACE; + + // Icon + data->listening_to_icon_rect = rc_inner; + + if (opts.draw_text_align_right || opts.draw_text_rtl) + data->listening_to_icon_rect.left = max(data->listening_to_icon_rect.right - ICON_SIZE, rc_inner.left); + else + data->listening_to_icon_rect.right = min(data->listening_to_icon_rect.left + ICON_SIZE, rc_inner.right); + + if (r_tmp.bottom - r_tmp.top > ICON_SIZE) { + data->listening_to_icon_rect.top += (r_tmp.bottom - r_tmp.top - ICON_SIZE) / 2; + data->listening_to_icon_rect.bottom = data->listening_to_icon_rect.top + ICON_SIZE; + } + + // Text + data->listening_to_text_rect = GetInnerRect(rc_inner, r); + + if (opts.draw_text_align_right || opts.draw_text_rtl) + data->listening_to_text_rect.right = max(data->listening_to_icon_rect.left - SPACE_ICON_TEXT, rc_inner.left); + else + data->listening_to_text_rect.left = min(data->listening_to_icon_rect.right + SPACE_ICON_TEXT, rc_inner.right); + + if (ICON_SIZE > r_tmp.bottom - r_tmp.top) { + data->listening_to_text_rect.top += (ICON_SIZE - (r_tmp.bottom - r_tmp.top)) / 2; + data->listening_to_text_rect.bottom = data->listening_to_text_rect.top + r_tmp.bottom - r_tmp.top; + } + } + } + + r.bottom = max(next_top - SPACE_TEXT_TEXT, avatar_bottom); + + if (opts.resize_frame && ServiceExists(MS_CLIST_FRAMES_SETFRAMEOPTIONS) && frame_id != -1) { + RECT rf; + GetClientRect(hwnd, &rf); + + int size = r.bottom + opts.borders[BOTTOM]; + + if (rf.bottom - rf.top != size) { + if (FrameIsFloating()) { + HWND parent = GetParent(hwnd); + + if (parent != NULL) { + RECT rp_client, rp_window, r_window; + GetClientRect(parent, &rp_client); + GetWindowRect(parent, &rp_window); + GetWindowRect(hwnd, &r_window); + int diff = (rp_window.bottom - rp_window.top) - (rp_client.bottom - rp_client.top); + if (ServiceExists(MS_CLIST_FRAMES_ADDFRAME)) + diff += (r_window.top - rp_window.top); + + SetWindowPos(parent, 0, 0, 0, rp_window.right - rp_window.left, size + diff, SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE); + } + } + else if (IsWindowVisible(hwnd) && ServiceExists(MS_CLIST_FRAMES_ADDFRAME)) { + int flags = CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS, MAKEWPARAM(FO_FLAGS, frame_id), 0); + if (flags & F_VISIBLE) { + CallService(MS_CLIST_FRAMES_SETFRAMEOPTIONS, MAKEWPARAM(FO_HEIGHT, frame_id), (LPARAM)(size)); + CallService(MS_CLIST_FRAMES_UPDATEFRAME, (WPARAM)frame_id, (LPARAM)(FU_TBREDRAW | FU_FMREDRAW | FU_FMPOS)); + } + } + } + } + +finish: + SelectObject(hdc, hOldFont); + ReleaseDC(hwnd, hdc); +} + + +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; +} + +void EraseBackground(HWND hwnd, HDC hdc, MyDetailsFrameData* data) +{ + RECT r; + GetClientRect(hwnd, &r); + + if (data->skinning) + SkinDrawWindowBack(hwnd, hdc, &r, "Main,ID=Background"); + else { + HBRUSH hB = CreateSolidBrush((COLORREF) DBGetContactSettingDword(NULL,"MyDetails","BackgroundColor",GetSysColor(COLOR_BTNFACE))); + FillRect(hdc, &r, hB); + DeleteObject(hB); + } +} + +void DrawTextWithRect(HDC hdc, const TCHAR *text, const TCHAR *def_text, RECT rc, UINT uFormat, + bool mouse_over, Protocol *proto, bool replace_smileys = true) +{ + const TCHAR *tmp; + if (text[0] == '\0') + tmp = TranslateTS(def_text); + else + tmp = text; + + // Only first line + TCHAR *tmp2 = _tcsdup(tmp); + TCHAR *pos = _tcsrchr(tmp2, '\r'); + if (pos != NULL) pos[0] = '\0'; + pos = _tcschr(tmp2, '\n'); + if (pos != NULL) pos[0] = '\0'; + + + RECT r = rc; + r.top += BORDER_SPACE; + r.bottom -= BORDER_SPACE; + r.left += BORDER_SPACE; + r.right -= BORDER_SPACE; + + HRGN rgn = CreateRectRgnIndirect(&r); + SelectClipRgn(hdc, rgn); + + RECT rc_tmp; + int text_height; + + if (mouse_over) + { + uFormat &= ~DT_END_ELLIPSIS; + + rc_tmp = r; + text_height = DrawText(hdc, _T(" ..."), 4, &rc_tmp, DT_CALCRECT | uFormat); + rc_tmp.top += (r.bottom - r.top - text_height) >> 1; + rc_tmp.bottom = rc_tmp.top + text_height; + + if (uFormat & DT_RTLREADING) + { + rc_tmp.right = r.left + (rc_tmp.right - rc_tmp.left); + rc_tmp.left = r.left; + + r.left += rc_tmp.right - rc_tmp.left; + } + else + { + rc_tmp.left = r.right - (rc_tmp.right - rc_tmp.left); + rc_tmp.right = r.right; + + r.right -= rc_tmp.right - rc_tmp.left; + } + } + + if (replace_smileys) + DRAW_TEXT(hdc, tmp2, _tcslen(tmp2), &r, uFormat, proto->name, NULL); + else + DrawText(hdc, tmp2, _tcslen(tmp2), &r, uFormat); + + if (mouse_over) + { + DrawText(hdc, _T(" ..."), 4, &rc_tmp, uFormat); + } + + SelectClipRgn(hdc, NULL); + DeleteObject(rgn); + + if (mouse_over) + FrameRect(hdc, &rc, (HBRUSH) GetStockObject(GRAY_BRUSH)); + + free(tmp2); +} + +void Draw(HWND hwnd, HDC hdc_orig) +{ + MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd, GWLP_USERDATA); + Protocol *proto = protocols->Get(data->protocol_number); + + if (proto == NULL) { + EraseBackground(hwnd, hdc_orig, data); + return; + } + + if (data->recalc_rectangles || proto->data_changed) + CalcRectangles(hwnd); + + RECT r_full; + GetClientRect(hwnd, &r_full); + RECT r = r_full; + + HDC hdc = CreateCompatibleDC(hdc_orig); + HBITMAP hBmp = CreateBitmap32(r.right,r.bottom);//,1,GetDeviceCaps(hdc,BITSPIXEL),NULL); + SelectObject(hdc, hBmp); + + int old_bk_mode = SetBkMode(hdc, TRANSPARENT); + HFONT old_font = (HFONT) SelectObject(hdc, hFont[0]); + COLORREF old_color = GetTextColor(hdc); + SetStretchBltMode(hdc, HALFTONE); + + // Erase + EraseBackground(hwnd, hdc, data); + + r.left += min(opts.borders[LEFT], r.right); + r.right = max(r.right - opts.borders[RIGHT], r.left); + r.top += min(opts.borders[TOP], r.bottom); + r.bottom = max(r.bottom - opts.borders[BOTTOM], r.top); + + // Draw items + + UINT uFormat = DT_SINGLELINE | DT_NOPREFIX | DT_END_ELLIPSIS + | (opts.draw_text_align_right ? DT_RIGHT : DT_LEFT) + | (opts.draw_text_rtl ? DT_RTLREADING : 0); + + // Image + if (data->draw_img) + { + RECT rc = GetInnerRect(data->img_rect, r); + HRGN rgn = CreateRectRgnIndirect(&rc); + SelectClipRgn(hdc, rgn); + + int width = data->img_rect.right - data->img_rect.left; + int height = data->img_rect.bottom - data->img_rect.top; + + int round_radius; + if (opts.draw_avatar_round_corner) + { + if (opts.draw_avatar_use_custom_corner_size) + round_radius = opts.draw_avatar_custom_corner_size; + else + round_radius = min(width, height) / 6; + } + else + { + round_radius = 0; + } + + + AVATARDRAWREQUEST adr = {0}; + adr.cbSize = sizeof(AVATARDRAWREQUEST); + adr.hTargetDC = hdc; + adr.rcDraw = data->img_rect; + + adr.dwFlags = AVDRQ_OWNPIC | AVDRQ_HIDEBORDERONTRANSPARENCY | + (opts.draw_avatar_border ? AVDRQ_DRAWBORDER : 0 ) | + (opts.draw_avatar_round_corner ? AVDRQ_ROUNDEDCORNER : 0 ); + adr.clrBorder = opts.draw_avatar_border_color; + adr.radius = round_radius; + adr.alpha = 255; + adr.szProto = proto->name; + + CallService(MS_AV_DRAWAVATAR, 0, (LPARAM) &adr); + + // Clipping rgn + SelectClipRgn(hdc, NULL); + DeleteObject(rgn); + } + + // Nick + if (data->draw_nick) + { + RECT rc = GetInnerRect(data->nick_rect, r); + HRGN rgn = CreateRectRgnIndirect(&rc); + SelectClipRgn(hdc, rgn); + + SelectObject(hdc, hFont[FONT_NICK]); + SetTextColor(hdc, font_colour[FONT_NICK]); + + DrawTextWithRect(hdc, proto->nickname, DEFAULT_NICKNAME, rc, uFormat, + data->mouse_over_nick && proto->CanSetNick(), proto); + + // Clipping rgn + SelectClipRgn(hdc, NULL); + DeleteObject(rgn); + } + + // Protocol cycle icon + if (data->draw_proto_cycle) + { + RECT rc = GetInnerRect(data->next_proto_rect, r); + HRGN rgn = CreateRectRgnIndirect(&rc); + SelectClipRgn(hdc, rgn); + + HICON icon = Skin_GetIcon("MYDETAILS_NEXT_PROTOCOL"); + if (icon == NULL) + icon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_RIGHT_ARROW)); + DrawIconEx(hdc, data->next_proto_rect.left, data->next_proto_rect.top, icon, ICON_SIZE, ICON_SIZE, 0, NULL, DI_NORMAL); + Skin_ReleaseIcon(icon); + + SelectClipRgn(hdc, NULL); + DeleteObject(rgn); + + rc = GetInnerRect(data->prev_proto_rect, r); + rgn = CreateRectRgnIndirect(&rc); + SelectClipRgn(hdc, rgn); + + icon = Skin_GetIcon("MYDETAILS_PREV_PROTOCOL"); + if (icon == NULL) + icon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_RIGHT_ARROW)); + DrawIconEx(hdc, data->prev_proto_rect.left, data->prev_proto_rect.top, icon, ICON_SIZE, ICON_SIZE, 0, NULL, DI_NORMAL); + Skin_ReleaseIcon(icon); + + SelectClipRgn(hdc, NULL); + DeleteObject(rgn); + } + + // Protocol + if (data->draw_proto) + { + RECT rc = GetInnerRect(data->proto_rect, r); + RECT rr = rc; + rr.top += BORDER_SPACE; + rr.bottom -= BORDER_SPACE; + rr.left += BORDER_SPACE; + rr.right -= BORDER_SPACE; + + HRGN rgn = CreateRectRgnIndirect(&rc); + SelectClipRgn(hdc, rgn); + + SelectObject(hdc, hFont[FONT_PROTO]); + SetTextColor(hdc, font_colour[FONT_PROTO]); + + DrawText(hdc, proto->description, _tcslen(proto->description), &rr, uFormat); + + // Clipping rgn + SelectClipRgn(hdc, NULL); + DeleteObject(rgn); + + if (data->mouse_over_proto) + FrameRect(hdc, &rc, (HBRUSH) GetStockObject(GRAY_BRUSH)); + } + + // Status + if (data->draw_status) + { + RECT rtmp = GetInnerRect(data->status_rect, r); + RECT rr = rtmp; + rr.top += BORDER_SPACE; + rr.bottom -= BORDER_SPACE; + rr.left += BORDER_SPACE; + rr.right -= BORDER_SPACE; + + RECT rc = GetInnerRect(data->status_icon_rect, rr); + HRGN rgn = CreateRectRgnIndirect(&rc); + SelectClipRgn(hdc, rgn); + + HICON status_icon; + if (proto->custom_status != 0 && ProtoServiceExists(proto->name, PS_ICQ_GETCUSTOMSTATUSICON)) + { + status_icon = (HICON) CallProtoService(proto->name, PS_ICQ_GETCUSTOMSTATUSICON, proto->custom_status, 0); + } + else + { + status_icon = LoadSkinnedProtoIcon(proto->name, proto->status); + } + if (status_icon != NULL) + { + DrawIconEx(hdc, data->status_icon_rect.left, data->status_icon_rect.top, status_icon, + ICON_SIZE, ICON_SIZE, 0, NULL, DI_NORMAL); + DeleteObject(status_icon); + } + + SelectClipRgn(hdc, NULL); + DeleteObject(rgn); + + rc = GetInnerRect(data->status_text_rect, rr); + rgn = CreateRectRgnIndirect(&rc); + SelectClipRgn(hdc, rgn); + + SelectObject(hdc, hFont[FONT_STATUS]); + SetTextColor(hdc, font_colour[FONT_STATUS]); + + DrawText(hdc, proto->status_name, _tcslen(proto->status_name), &rc, uFormat); + + SelectClipRgn(hdc, NULL); + DeleteObject(rgn); + + if (data->mouse_over_status) + FrameRect(hdc, &rtmp, (HBRUSH) GetStockObject(GRAY_BRUSH)); + } + + // Away message + if (data->draw_away_msg) + { + RECT rc = GetInnerRect(data->away_msg_rect, r); + HRGN rgn = CreateRectRgnIndirect(&rc); + SelectClipRgn(hdc, rgn); + + SelectObject(hdc, hFont[FONT_AWAY_MSG]); + SetTextColor(hdc, font_colour[FONT_AWAY_MSG]); + + DrawTextWithRect(hdc, proto->status_message, DEFAULT_STATUS_MESSAGE, rc, uFormat, + data->mouse_over_away_msg && proto->CanSetStatusMsg(), proto); + + // Clipping rgn + SelectClipRgn(hdc, NULL); + DeleteObject(rgn); + } + + // Listening to + if (data->draw_listening_to) + { + if (data->listening_to_icon_rect.left == 0 && data->listening_to_icon_rect.right == 0) + { + RECT rc = GetInnerRect(data->listening_to_rect, r); + HRGN rgn = CreateRectRgnIndirect(&rc); + SelectClipRgn(hdc, rgn); + + SelectObject(hdc, hFont[FONT_LISTENING_TO]); + SetTextColor(hdc, font_colour[FONT_LISTENING_TO]); + + DrawTextWithRect(hdc, proto->listening_to, DEFAULT_LISTENING_TO, rc, uFormat, + data->mouse_over_listening_to && protocols->CanSetListeningTo(), proto); + + // Clipping rgn + SelectClipRgn(hdc, NULL); + DeleteObject(rgn); + } + else + { + RECT rtmp = GetInnerRect(data->listening_to_rect, r); + RECT rr = rtmp; + rr.top += BORDER_SPACE; + rr.bottom -= BORDER_SPACE; + rr.left += BORDER_SPACE; + rr.right -= BORDER_SPACE; + + RECT rc = GetInnerRect(data->listening_to_icon_rect, rr); + HRGN rgn = CreateRectRgnIndirect(&rc); + SelectClipRgn(hdc, rgn); + + HICON icon = Skin_GetIcon("LISTENING_TO_ICON"); + if (icon == NULL) + icon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_LISTENINGTO)); + DrawIconEx(hdc, data->listening_to_icon_rect.left, data->listening_to_icon_rect.top, icon, ICON_SIZE, ICON_SIZE, 0, NULL, DI_NORMAL); + Skin_ReleaseIcon(icon); + + SelectClipRgn(hdc, NULL); + DeleteObject(rgn); + + rc = GetInnerRect(data->listening_to_text_rect, rr); + rgn = CreateRectRgnIndirect(&rc); + SelectClipRgn(hdc, rgn); + + SelectObject(hdc, hFont[FONT_LISTENING_TO]); + SetTextColor(hdc, font_colour[FONT_LISTENING_TO]); + + DrawText(hdc, proto->listening_to, _tcslen(proto->listening_to), &rc, uFormat); + + SelectClipRgn(hdc, NULL); + DeleteObject(rgn); + + if (data->mouse_over_listening_to && protocols->CanSetListeningTo()) + FrameRect(hdc, &rtmp, (HBRUSH) GetStockObject(GRAY_BRUSH)); + } + } + + SelectObject(hdc, old_font); + SetTextColor(hdc, old_color); + SetBkMode(hdc, old_bk_mode); + + BitBlt(hdc_orig, r_full.left, r_full.top, r_full.right - r_full.left, + r_full.bottom - r_full.top, hdc, r_full.left, r_full.top, SRCCOPY); + DeleteDC(hdc); + DeleteObject(hBmp); +} + +bool InsideRect(POINT *p, RECT *r) +{ + return p->x >= r->left && p->x < r->right && p->y >= r->top && p->y < r->bottom; +} + +void MakeHover(HWND hwnd, bool draw, bool *hover, POINT *p, RECT *r) +{ + if (draw && p != NULL && r != NULL && InsideRect(p, r)) + { + if ( !*hover) + { + *hover = true; + + InvalidateRect(hwnd, NULL, FALSE); + + TRACKMOUSEEVENT tme; + tme.cbSize = sizeof(TRACKMOUSEEVENT); + tme.dwFlags = TME_LEAVE; + tme.hwndTrack = hwnd; + tme.dwHoverTime = HOVER_DEFAULT; + TrackMouseEvent(&tme); + } + } + else + { + if (*hover) + { + *hover = false; + + InvalidateRect(hwnd, NULL, FALSE); + } + } +} + +void ShowGlobalStatusMenu(HWND hwnd, MyDetailsFrameData *data, Protocol *proto, POINT &p) +{ + HMENU submenu = (HMENU) CallService(MS_CLIST_MENUGETSTATUS,0,0); + + if (opts.draw_text_align_right) + p.x = data->status_rect.right; + else + p.x = data->status_rect.left; + p.y = data->status_rect.bottom+1; + ClientToScreen(hwnd, &p); + + int ret = TrackPopupMenu(submenu, TPM_TOPALIGN|TPM_RIGHTBUTTON|TPM_RETURNCMD + | (opts.draw_text_align_right ? TPM_RIGHTALIGN : TPM_LEFTALIGN), p.x, p.y, 0, hwnd, NULL); + + if (ret) + CallService(MS_CLIST_MENUPROCESSCOMMAND, MAKEWPARAM(LOWORD(ret),MPCF_MAINMENU),(LPARAM)NULL); +} + +void ShowProtocolStatusMenu(HWND hwnd, MyDetailsFrameData *data, Protocol *proto, POINT &p) +{ + HMENU menu = (HMENU) CallService(MS_CLIST_MENUGETSTATUS,0,0); + HMENU submenu = NULL; + + if (menu != NULL) + { + // Find the correct menu item + int count = GetMenuItemCount(menu); + for (int i = 0 ; i < count && submenu == NULL; i++) + { + MENUITEMINFO mii = {0}; + + mii.cbSize = sizeof(mii); + + if (!IsWinVer98Plus()) + mii.fMask = MIIM_TYPE; + else + mii.fMask = MIIM_STRING; + + GetMenuItemInfo(menu, i, TRUE, &mii); + + if (mii.cch != 0) { + mii.cch++; + mii.dwTypeData = (TCHAR*)malloc(sizeof(TCHAR) * mii.cch); + GetMenuItemInfo(menu, i, TRUE, &mii); + + if ( _tcscmp(mii.dwTypeData, proto->description) == 0) + submenu = GetSubMenu(menu, i); + + free(mii.dwTypeData); + } + } + + if (submenu == NULL && protocols->GetSize() == 1) + { + submenu = menu; + } + } + + if (submenu != NULL) + { + if (opts.draw_text_align_right) + p.x = data->status_rect.right; + else + p.x = data->status_rect.left; + p.y = data->status_rect.bottom+1; + ClientToScreen(hwnd, &p); + + int ret = TrackPopupMenu(submenu, TPM_TOPALIGN|TPM_RIGHTBUTTON|TPM_RETURNCMD + | (opts.draw_text_align_right ? TPM_RIGHTALIGN : TPM_LEFTALIGN), p.x, p.y, 0, hwnd, NULL); + + if (ret) + CallService(MS_CLIST_MENUPROCESSCOMMAND, MAKEWPARAM(LOWORD(ret),MPCF_MAINMENU),(LPARAM)NULL); + + /* + if (to_remove < 5) + { + DestroyMenu(submenu); + } + */ + } + else + { + // Well, lets do it by hand + static int statusModePf2List[]={0xFFFFFFFF,PF2_ONLINE,PF2_SHORTAWAY,PF2_LONGAWAY,PF2_LIGHTDND,PF2_HEAVYDND,PF2_FREECHAT,PF2_INVISIBLE,PF2_ONTHEPHONE,PF2_OUTTOLUNCH}; + + menu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU1)); + submenu = GetSubMenu(menu, 0); + CallService(MS_LANGPACK_TRANSLATEMENU,(WPARAM)submenu,0); + + DWORD flags = CallProtoService(proto->name, PS_GETCAPS, PFLAGNUM_2,0); + for ( int i = GetMenuItemCount(submenu) -1 ; i >= 0 ; i-- ) + { + if ( !(flags & statusModePf2List[i])) + { + // Hide menu + RemoveMenu(submenu, i, MF_BYPOSITION); + } + } + + if (opts.draw_text_align_right) + p.x = data->status_rect.right; + else + p.x = data->status_rect.left; + p.y = data->status_rect.bottom+1; + ClientToScreen(hwnd, &p); + + int ret = TrackPopupMenu(submenu, TPM_TOPALIGN|TPM_RIGHTBUTTON|TPM_RETURNCMD + | (opts.draw_text_align_right ? TPM_RIGHTALIGN : TPM_LEFTALIGN), p.x, p.y, 0, hwnd, NULL); + DestroyMenu(menu); + if (ret) + { + proto->SetStatus(ret); + } + } +} + +void ShowListeningToMenu(HWND hwnd, MyDetailsFrameData *data, Protocol *proto, POINT &p) +{ + HMENU menu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU1)); + HMENU submenu = GetSubMenu(menu, 5); + CallService(MS_LANGPACK_TRANSLATEMENU,(WPARAM)submenu,0); + + // Add this proto to menu + TCHAR tmp[128]; + mir_sntprintf(tmp, SIZEOF(tmp), TranslateT("Enable Listening To for %s"), proto->description); + + MENUITEMINFO mii = {0}; + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE; + mii.fType = MFT_STRING; + mii.fState = proto->ListeningToEnabled() ? MFS_CHECKED : 0; + mii.dwTypeData = tmp; + mii.cch = _tcslen(tmp); + mii.wID = 1; + + if ( !proto->CanSetListeningTo()) + { + mii.fState |= MFS_DISABLED; + } + + InsertMenuItem(submenu, 0, TRUE, &mii); + + ZeroMemory(&mii, sizeof(mii)); + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_STATE; + mii.fState = protocols->ListeningToEnabled() ? MFS_CHECKED : 0; + + if ( !protocols->CanSetListeningTo()) + { + mii.fState |= MFS_DISABLED; + } + + SetMenuItemInfo(submenu, ID_LISTENINGTOPOPUP_SENDLISTENINGTO, FALSE, &mii); + + if (opts.draw_text_align_right) + p.x = data->listening_to_rect.right; + else + p.x = data->listening_to_rect.left; + p.y = data->listening_to_rect.bottom+1; + ClientToScreen(hwnd, &p); + + int ret = TrackPopupMenu(submenu, TPM_TOPALIGN|TPM_RIGHTBUTTON|TPM_RETURNCMD + | (opts.draw_text_align_right ? TPM_RIGHTALIGN : TPM_LEFTALIGN), p.x, p.y, 0, hwnd, NULL); + DestroyMenu(menu); + + switch(ret) + { + case 1: + { + CallService(MS_LISTENINGTO_ENABLE, (LPARAM) proto->name, !proto->ListeningToEnabled()); + break; + } + case ID_LISTENINGTOPOPUP_SENDLISTENINGTO: + { + CallService(MS_LISTENINGTO_ENABLE, 0, !protocols->ListeningToEnabled()); + break; + } + } + +} + + +LRESULT CALLBACK FrameWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) + { + case WM_CREATE: + { + MyDetailsFrameData *data = new MyDetailsFrameData(); + ZeroMemory(data, sizeof(MyDetailsFrameData)); + SetWindowLong(hwnd, GWLP_USERDATA, (LONG) data); + + data->recalc_rectangles = true; + data->get_status_messages = false; + data->showing_menu = false; + data->skinning = ServiceExists(MS_SKIN_DRAWGLYPH) != 0; + + data->protocol_number = DBGetContactSettingWord(NULL,"MyDetails","ProtocolNumber",0); + if (data->protocol_number >= protocols->GetSize()) + data->protocol_number = 0; + + SetCycleTime(hwnd); + SetStatusMessageRefreshTime(hwnd); + + TRACKMOUSEEVENT tme; + tme.cbSize = sizeof(TRACKMOUSEEVENT); + tme.dwFlags = TME_HOVER | TME_LEAVE; + tme.hwndTrack = hwnd; + tme.dwHoverTime = HOVER_DEFAULT; + TrackMouseEvent(&tme); + + return TRUE; + } + + case WM_PRINTCLIENT: + Draw(hwnd, (HDC)wParam); + return TRUE; + + case WM_PAINT: + { + RECT r; + + if (GetUpdateRect(hwnd, &r, FALSE)) + { + PAINTSTRUCT ps; + + HDC hdc = BeginPaint(hwnd, &ps); + Draw(hwnd, hdc); + EndPaint(hwnd, &ps); + } + + return TRUE; + } + + case WM_SIZE: + { + //InvalidateRect(hwnd, NULL, FALSE); + MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd, GWLP_USERDATA); + data->recalc_rectangles = true; + RedrawFrame(); + break; + } + + case WM_TIMER: + { + MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd, GWLP_USERDATA); + + if (wParam == ID_FRAME_TIMER) + { + if ( !data->showing_menu) + CallService(MS_MYDETAILS_SHOWNEXTPROTOCOL, 0, 0); + } + else if (wParam == ID_RECALC_TIMER) + { + KillTimer(hwnd, ID_RECALC_TIMER); + + if (data->get_status_messages) + { + SetStatusMessageRefreshTime(hwnd); + data->get_status_messages = false; + + protocols->GetStatuses(); + protocols->GetStatusMsgs(); + + data->recalc_rectangles = true; + } + + RedrawFrame(); + } + else if (wParam == ID_STATUSMESSAGE_TIMER) + { + SetStatusMessageRefreshTime(hwnd); + + PostMessage(hwnd, MWM_STATUS_MSG_CHANGED, 0, 0); + } + + return TRUE; + } + + case WM_LBUTTONUP: + { + MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd, GWLP_USERDATA); + Protocol *proto = protocols->Get(data->protocol_number); + if (proto == NULL) + break; + + POINT p; + p.x = LOWORD(lParam); + p.y = HIWORD(lParam); + + // In image? + if (data->draw_img && InsideRect(&p, &data->img_rect) && proto->CanSetAvatar()) + { + if (opts.global_on_avatar) + CallService(MS_MYDETAILS_SETMYAVATARUI, 0, 0); + else + CallService(MS_MYDETAILS_SETMYAVATARUI, 0, (LPARAM) proto->name); + } + // In nick? + else if (data->draw_nick && InsideRect(&p, &data->nick_rect) && proto->CanSetNick()) + { + if (opts.global_on_nickname) + CallService(MS_MYDETAILS_SETMYNICKNAMEUI, 0, 0); + else + CallService(MS_MYDETAILS_SETMYNICKNAMEUI, 0, (LPARAM) proto->name); + } + // In proto cycle button? + else if (data->draw_proto_cycle && InsideRect(&p, &data->next_proto_rect)) + { + CallService(MS_MYDETAILS_SHOWNEXTPROTOCOL, 0, 0); + } + else if (data->draw_proto_cycle && InsideRect(&p, &data->prev_proto_rect)) + { + CallService(MS_MYDETAILS_SHOWPREVIOUSPROTOCOL, 0, 0); + } + // In status message? + else if (data->draw_away_msg && InsideRect(&p, &data->away_msg_rect) && proto->CanSetStatusMsg()) + { + if (opts.global_on_status_message) + CallService(MS_MYDETAILS_SETMYSTATUSMESSAGEUI, 0, 0); + else + CallService(MS_MYDETAILS_SETMYSTATUSMESSAGEUI, 0, (LPARAM) proto->name); + } + // In status? + else if (data->draw_status && InsideRect(&p, &data->status_rect)) + { + data->showing_menu = true; + + if (opts.global_on_status) + ShowGlobalStatusMenu(hwnd, data, proto, p); + else + ShowProtocolStatusMenu(hwnd, data, proto, p); + + data->showing_menu = false; + } + // In listening to? + else if (data->draw_listening_to && InsideRect(&p, &data->listening_to_rect) && protocols->CanSetListeningTo()) + { + ShowListeningToMenu(hwnd, data, proto, p); + } + // In protocol? + else if (data->draw_proto && InsideRect(&p, &data->proto_rect)) + { + data->showing_menu = true; + + HMENU menu = CreatePopupMenu(); + + for (int i = protocols->GetSize() - 1 ; i >= 0 ; i--) + { + MENUITEMINFO mii = {0}; + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_ID | MIIM_TYPE; + mii.fType = MFT_STRING; + mii.dwTypeData = protocols->Get(i)->description; + mii.cch = _tcslen(protocols->Get(i)->description); + mii.wID = i + 1; + + if (i == data->protocol_number) { + mii.fMask |= MIIM_STATE; + mii.fState = MFS_DISABLED; + } + + InsertMenuItem(menu, 0, TRUE, &mii); + } + + if (opts.draw_text_align_right) + p.x = data->proto_rect.right; + else + p.x = data->proto_rect.left; + p.y = data->proto_rect.bottom+1; + ClientToScreen(hwnd, &p); + + int ret = TrackPopupMenu(menu, TPM_TOPALIGN|TPM_LEFTALIGN|TPM_RIGHTBUTTON|TPM_RETURNCMD, p.x, p.y, 0, hwnd, NULL); + DestroyMenu(menu); + + if (ret != 0) + { + PluginCommand_ShowProtocol(NULL, (WPARAM) protocols->Get(ret-1)->name); + } + + data->showing_menu = false; + } + + break; + } + + case WM_MEASUREITEM: + { + return CallService(MS_CLIST_MENUMEASUREITEM,wParam,lParam); + } + case WM_DRAWITEM: + { + return CallService(MS_CLIST_MENUDRAWITEM,wParam,lParam); + } + + case WM_CONTEXTMENU: + { + MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd, GWLP_USERDATA); + Protocol *proto = protocols->Get(data->protocol_number); + if (proto == NULL) + break; + + POINT p; + p.x = LOWORD(lParam); + p.y = HIWORD(lParam); + + ScreenToClient(hwnd, &p); + + data->showing_menu = true; + + // In image? + if (data->draw_img && InsideRect(&p, &data->img_rect)) + { + HMENU menu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU1)); + HMENU submenu = GetSubMenu(menu, 4); + CallService(MS_LANGPACK_TRANSLATEMENU,(WPARAM)submenu,0); + + // Add this proto to menu + TCHAR tmp[128]; + mir_sntprintf(tmp, SIZEOF(tmp), TranslateT("Set My Avatar for %s..."), proto->description); + + MENUITEMINFO mii = {0}; + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_ID | MIIM_TYPE; + mii.fType = MFT_STRING; + mii.dwTypeData = tmp; + mii.cch = _tcslen(tmp); + mii.wID = 1; + + if ( !proto->CanSetAvatar()) + { + mii.fMask |= MIIM_STATE; + mii.fState = MFS_DISABLED; + } + + InsertMenuItem(submenu, 0, TRUE, &mii); + + ClientToScreen(hwnd, &p); + + int ret = TrackPopupMenu(submenu, TPM_TOPALIGN|TPM_LEFTALIGN|TPM_RIGHTBUTTON|TPM_RETURNCMD, p.x, p.y, 0, hwnd, NULL); + DestroyMenu(menu); + + switch(ret) + { + case 1: + { + CallService(MS_MYDETAILS_SETMYAVATARUI, 0, (LPARAM) proto->name); + break; + } + case ID_AVATARPOPUP_SETMYAVATAR: + { + CallService(MS_MYDETAILS_SETMYAVATARUI, 0, 0); + break; + } + } + } + // In nick? + else if (data->draw_nick && InsideRect(&p, &data->nick_rect)) + { + HMENU menu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU1)); + HMENU submenu = GetSubMenu(menu, 2); + CallService(MS_LANGPACK_TRANSLATEMENU,(WPARAM)submenu,0); + + // Add this proto to menu + TCHAR tmp[128]; + mir_sntprintf(tmp, SIZEOF(tmp), TranslateT("Set My Nickname for %s..."), proto->description); + + MENUITEMINFO mii = {0}; + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_ID | MIIM_TYPE; + mii.fType = MFT_STRING; + mii.dwTypeData = tmp; + mii.cch = _tcslen(tmp); + mii.wID = 1; + + if ( !proto->CanSetNick()) + { + mii.fMask |= MIIM_STATE; + mii.fState = MFS_DISABLED; + } + + InsertMenuItem(submenu, 0, TRUE, &mii); + + ClientToScreen(hwnd, &p); + + int ret = TrackPopupMenu(submenu, TPM_TOPALIGN|TPM_LEFTALIGN|TPM_RIGHTBUTTON|TPM_RETURNCMD, p.x, p.y, 0, hwnd, NULL); + DestroyMenu(menu); + + switch(ret) + { + case 1: + { + CallService(MS_MYDETAILS_SETMYNICKNAMEUI, 0, (LPARAM) proto->name); + break; + } + case ID_NICKPOPUP_SETMYNICKNAME: + { + CallService(MS_MYDETAILS_SETMYNICKNAMEUI, 0, 0); + break; + } + } + } + // In proto cycle button? + else if (data->draw_proto_cycle && InsideRect(&p, &data->next_proto_rect)) + { + CallService(MS_MYDETAILS_SHOWPREVIOUSPROTOCOL, 0, 0); + } + else if (data->draw_proto_cycle && InsideRect(&p, &data->prev_proto_rect)) + { + CallService(MS_MYDETAILS_SHOWNEXTPROTOCOL, 0, 0); + } + // In status message? + else if (data->draw_away_msg && InsideRect(&p, &data->away_msg_rect)) + { + TCHAR tmp[128]; + + HMENU menu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU1)); + HMENU submenu = GetSubMenu(menu, 3); + TranslateMenu(submenu); + + if (protocols->CanSetStatusMsgPerProtocol()) { + // Add this proto to menu + mir_sntprintf(tmp, SIZEOF(tmp), TranslateT("Set My Status Message for %s..."), proto->description); + + MENUITEMINFO mii = {0}; + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_ID | MIIM_TYPE; + mii.fType = MFT_STRING; + mii.dwTypeData = tmp; + mii.cch = _tcslen(tmp); + mii.wID = 1; + + if ( !proto->CanSetStatusMsg()) { + mii.fMask |= MIIM_STATE; + mii.fState = MFS_DISABLED; + } + + InsertMenuItem(submenu, 0, TRUE, &mii); + } + + // Add this to menu + mir_sntprintf(tmp, SIZEOF(tmp), TranslateT("Set My Status Message for %s..."), + CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, proto->status, GSMDF_TCHAR)); + + MENUITEMINFO mii = {0}; + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_ID | MIIM_TYPE; + mii.fType = MFT_STRING; + mii.dwTypeData = tmp; + mii.cch = _tcslen(tmp); + mii.wID = 2; + + if (proto->status == ID_STATUS_OFFLINE) { + mii.fMask |= MIIM_STATE; + mii.fState = MFS_DISABLED; + } + + InsertMenuItem(submenu, 0, TRUE, &mii); + + ClientToScreen(hwnd, &p); + + int ret = TrackPopupMenu(submenu, TPM_TOPALIGN|TPM_LEFTALIGN|TPM_RIGHTBUTTON|TPM_RETURNCMD, p.x, p.y, 0, hwnd, NULL); + DestroyMenu(menu); + + switch(ret) { + case 1: + CallService(MS_MYDETAILS_SETMYSTATUSMESSAGEUI, 0, (LPARAM) proto->name); + break; + + case 2: + CallService(MS_MYDETAILS_SETMYSTATUSMESSAGEUI, (WPARAM) proto->status, 0); + break; + + case ID_STATUSMESSAGEPOPUP_SETMYSTATUSMESSAGE: + CallService(MS_MYDETAILS_SETMYSTATUSMESSAGEUI, 0, 0); + break; + } + } + // In status? + else if (data->draw_status && InsideRect(&p, &data->status_rect)) + { + if (opts.global_on_status) + ShowProtocolStatusMenu(hwnd, data, proto, p); + else + ShowGlobalStatusMenu(hwnd, data, proto, p); + } + // In listening to? + else if (data->draw_listening_to && InsideRect(&p, &data->listening_to_rect) && protocols->CanSetListeningTo()) + { + ShowListeningToMenu(hwnd, data, proto, p); + } + // In protocol? + else if (data->draw_proto && InsideRect(&p, &data->proto_rect)) + { + } + // Default context menu + else + { + HMENU menu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU1)); + HMENU submenu = GetSubMenu(menu, 1); + CallService(MS_LANGPACK_TRANSLATEMENU,(WPARAM)submenu,0); + + if (opts.cycle_through_protocols) + RemoveMenu(submenu, ID_CYCLE_THROUGH_PROTOS, MF_BYCOMMAND); + else + RemoveMenu(submenu, ID_DONT_CYCLE_THROUGH_PROTOS, MF_BYCOMMAND); + + // Add this proto to menu + TCHAR tmp[128]; + MENUITEMINFO mii = {0}; + + mir_sntprintf(tmp, SIZEOF(tmp), TranslateT("Enable Listening To for %s"), proto->description); + + ZeroMemory(&mii, sizeof(mii)); + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE; + mii.fType = MFT_STRING; + mii.fState = proto->ListeningToEnabled() ? MFS_CHECKED : 0; + mii.dwTypeData = tmp; + mii.cch = _tcslen(tmp); + mii.wID = 5; + + if ( !proto->CanSetListeningTo()) + { + mii.fState |= MFS_DISABLED; + } + + InsertMenuItem(submenu, 0, TRUE, &mii); + + // Add this to menu + mir_sntprintf(tmp, SIZEOF(tmp), TranslateT("Set My Status Message for %s..."), + CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, proto->status, GSMDF_TCHAR)); + + ZeroMemory(&mii, sizeof(mii)); + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_ID | MIIM_TYPE; + mii.fType = MFT_STRING; + mii.dwTypeData = tmp; + mii.cch = _tcslen(tmp); + mii.wID = 4; + + if (proto->status == ID_STATUS_OFFLINE) { + mii.fMask |= MIIM_STATE; + mii.fState = MFS_DISABLED; + } + + InsertMenuItem(submenu, 0, TRUE, &mii); + + if (protocols->CanSetStatusMsgPerProtocol()) + { + // Add this proto to menu + mir_sntprintf(tmp, SIZEOF(tmp), TranslateT("Set My Status Message for %s..."), proto->description); + + ZeroMemory(&mii, sizeof(mii)); + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_ID | MIIM_TYPE; + mii.fType = MFT_STRING; + mii.dwTypeData = tmp; + mii.cch = _tcslen(tmp); + mii.wID = 3; + + if ( !proto->CanSetStatusMsg()) + { + mii.fMask |= MIIM_STATE; + mii.fState = MFS_DISABLED; + } + + InsertMenuItem(submenu, 0, TRUE, &mii); + } + + mir_sntprintf(tmp, SIZEOF(tmp), TranslateT("Set My Nickname for %s..."), proto->description); + + ZeroMemory(&mii, sizeof(mii)); + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_ID | MIIM_TYPE; + mii.fType = MFT_STRING; + mii.dwTypeData = tmp; + mii.cch = _tcslen(tmp); + mii.wID = 2; + + if ( !proto->CanSetNick()) + { + mii.fMask |= MIIM_STATE; + mii.fState = MFS_DISABLED; + } + + InsertMenuItem(submenu, 0, TRUE, &mii); + + mir_sntprintf(tmp, SIZEOF(tmp), TranslateT("Set My Avatar for %s..."), proto->description); + + ZeroMemory(&mii, sizeof(mii)); + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_ID | MIIM_TYPE; + mii.fType = MFT_STRING; + mii.dwTypeData = tmp; + mii.cch = _tcslen(tmp); + mii.wID = 1; + + if ( !proto->CanSetAvatar()) + { + mii.fMask |= MIIM_STATE; + mii.fState = MFS_DISABLED; + } + + InsertMenuItem(submenu, 0, TRUE, &mii); + + ZeroMemory(&mii, sizeof(mii)); + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_STATE; + mii.fState = protocols->ListeningToEnabled() ? MFS_CHECKED : 0; + + if ( !protocols->CanSetListeningTo()) + { + mii.fState |= MFS_DISABLED; + } + + SetMenuItemInfo(submenu, ID_CONTEXTPOPUP_ENABLELISTENINGTO, FALSE, &mii); + + ClientToScreen(hwnd, &p); + + int ret = TrackPopupMenu(submenu, TPM_TOPALIGN|TPM_LEFTALIGN|TPM_RIGHTBUTTON|TPM_RETURNCMD, p.x, p.y, 0, hwnd, NULL); + DestroyMenu(menu); + + switch(ret) + { + case 1: + { + CallService(MS_MYDETAILS_SETMYAVATARUI, 0, (LPARAM) proto->name); + break; + } + case ID_AVATARPOPUP_SETMYAVATAR: + { + CallService(MS_MYDETAILS_SETMYAVATARUI, 0, 0); + break; + } + case 2: + { + CallService(MS_MYDETAILS_SETMYNICKNAMEUI, 0, (LPARAM) proto->name); + break; + } + case ID_NICKPOPUP_SETMYNICKNAME: + { + CallService(MS_MYDETAILS_SETMYNICKNAMEUI, 0, 0); + break; + } + case 3: + { + CallService(MS_MYDETAILS_SETMYSTATUSMESSAGEUI, 0, (LPARAM) proto->name); + break; + } + case 4: + { + CallService(MS_MYDETAILS_SETMYSTATUSMESSAGEUI, (WPARAM) proto->status, 0); + break; + } + case ID_STATUSMESSAGEPOPUP_SETMYSTATUSMESSAGE: + { + CallService(MS_MYDETAILS_SETMYSTATUSMESSAGEUI, 0, 0); + break; + } + case 5: + { + CallService(MS_LISTENINGTO_ENABLE, (LPARAM) proto->name, !proto->ListeningToEnabled()); + break; + } + case ID_CONTEXTPOPUP_ENABLELISTENINGTO: + { + CallService(MS_LISTENINGTO_ENABLE, 0, !protocols->ListeningToEnabled()); + break; + } + case ID_SHOW_NEXT_PROTO: + { + CallService(MS_MYDETAILS_SHOWNEXTPROTOCOL, 0, 0); + break; + } + case ID_SHOW_PREV_PROTO: + { + CallService(MS_MYDETAILS_SHOWPREVIOUSPROTOCOL, 0, 0); + break; + } + case ID_CYCLE_THROUGH_PROTOS: + { + CallService(MS_MYDETAILS_CYCLE_THROUGH_PROTOCOLS, TRUE, 0); + break; + } + case ID_DONT_CYCLE_THROUGH_PROTOS: + { + CallService(MS_MYDETAILS_CYCLE_THROUGH_PROTOCOLS, FALSE, 0); + break; + } + } + } + + data->showing_menu = false; + + + break; + } + + case WM_MOUSELEAVE: + { + TRACKMOUSEEVENT tme; + tme.cbSize = sizeof(TRACKMOUSEEVENT); + tme.dwFlags = TME_HOVER; + tme.hwndTrack = hwnd; + tme.dwHoverTime = HOVER_DEFAULT; + TrackMouseEvent(&tme); + } + case WM_NCMOUSEMOVE: + { + MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd, GWLP_USERDATA); + + MakeHover(hwnd, data->draw_img, &data->mouse_over_img, NULL, NULL); + MakeHover(hwnd, data->draw_nick, &data->mouse_over_nick, NULL, NULL); + MakeHover(hwnd, data->draw_proto, &data->mouse_over_proto, NULL, NULL); + MakeHover(hwnd, data->draw_status, &data->mouse_over_status, NULL, NULL); + MakeHover(hwnd, data->draw_away_msg, &data->mouse_over_away_msg, NULL, NULL); + MakeHover(hwnd, data->draw_listening_to, &data->mouse_over_listening_to, NULL, NULL); + + break; + } + + case WM_MOUSEHOVER: + { + TRACKMOUSEEVENT tme; + tme.cbSize = sizeof(TRACKMOUSEEVENT); + tme.dwFlags = TME_LEAVE; + tme.hwndTrack = hwnd; + tme.dwHoverTime = HOVER_DEFAULT; + TrackMouseEvent(&tme); + } + case WM_MOUSEMOVE: + { + MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd, GWLP_USERDATA); + Protocol *proto = protocols->Get(data->protocol_number); + if (proto == NULL) + break; + + POINT p; + p.x = LOWORD(lParam); + p.y = HIWORD(lParam); + + MakeHover(hwnd, data->draw_img, &data->mouse_over_img, &p, &data->img_rect); + MakeHover(hwnd, data->draw_nick, &data->mouse_over_nick, &p, &data->nick_rect); + MakeHover(hwnd, data->draw_proto, &data->mouse_over_proto, &p, &data->proto_rect); + MakeHover(hwnd, data->draw_status, &data->mouse_over_status, &p, &data->status_rect); + MakeHover(hwnd, data->draw_away_msg, &data->mouse_over_away_msg, &p, &data->away_msg_rect); + MakeHover(hwnd, data->draw_listening_to, &data->mouse_over_listening_to, &p, &data->listening_to_rect); + + break; + } + + case WM_NOTIFY: + { + LPNMHDR lpnmhdr = (LPNMHDR) lParam; + + int i = (int) lpnmhdr->code; + + switch (lpnmhdr->code) { + case TTN_GETDISPINFO: + { + MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd, GWLP_USERDATA); + Protocol *proto = protocols->Get(data->protocol_number); + + LPNMTTDISPINFO lpttd = (LPNMTTDISPINFO) lpnmhdr; + SendMessage(lpnmhdr->hwndFrom, TTM_SETMAXTIPWIDTH, 0, 300); + + if (lpnmhdr->hwndFrom == data->nick_tt_hwnd) + lpttd->lpszText = proto->nickname; + else if (lpnmhdr->hwndFrom == data->status_tt_hwnd) + lpttd->lpszText = proto->status_name; + else if (lpnmhdr->hwndFrom == data->away_msg_tt_hwnd) + lpttd->lpszText = proto->status_message; + else if (lpnmhdr->hwndFrom == data->listening_to_tt_hwnd) + lpttd->lpszText = proto->listening_to; + else if (lpnmhdr->hwndFrom == data->next_proto_tt_hwnd) + lpttd->lpszText = _T("Show next protocol"); + else if (lpnmhdr->hwndFrom == data->prev_proto_tt_hwnd) + lpttd->lpszText = _T("Show previous protocol"); + + return 0; + } + } + + break; + } + + case WM_DESTROY: + { + KillTimer(hwnd, ID_FRAME_TIMER); + + MyDetailsFrameData *tmp = (MyDetailsFrameData *)GetWindowLong(hwnd, GWLP_USERDATA); + DeleteTooltipWindows(tmp); + if (tmp != NULL) delete tmp; + + break; + } + + // Custom Messages ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + case MWM_REFRESH: + { + MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd, GWLP_USERDATA); +// data->recalc_rectangles = true; + + KillTimer(hwnd, ID_RECALC_TIMER); + SetTimer(hwnd, ID_RECALC_TIMER, RECALC_TIME, NULL); + break; + } + + case MWM_AVATAR_CHANGED: + { + Protocol *proto = protocols->Get((const char *) wParam); + + if (proto != NULL) + { + proto->GetAvatar(); + RefreshFrame(); + } + + break; + } + + case MWM_NICK_CHANGED: + { + Protocol *proto = protocols->Get((const char *) wParam); + + if (proto != NULL) + { + proto->GetNick(); + RefreshFrame(); + } + + break; + } + + case MWM_STATUS_CHANGED: + { + Protocol *proto = protocols->Get((const char *) wParam); + + if (proto != NULL) + { + proto->GetStatus(); + proto->GetStatusMsg(); + proto->GetNick(); + + RefreshFrame(); + } + + break; + } + + case MWM_STATUS_MSG_CHANGED: + { + MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd, GWLP_USERDATA); + data->get_status_messages = true; + + RefreshFrame(); + break; + } + + case MWM_LISTENINGTO_CHANGED: + { + if (wParam != NULL) + { + Protocol *proto = protocols->Get((const char *) wParam); + if (proto != NULL) + proto->GetListeningTo(); + } + + RefreshFrameAndCalcRects(); + break; + } + } + + return DefWindowProc(hwnd, msg, wParam, lParam); +} + + +INT_PTR ShowHideFrameFunc(WPARAM wParam, LPARAM lParam) +{ + if (ServiceExists(MS_CLIST_FRAMES_ADDFRAME)) + { + CallService(MS_CLIST_FRAMES_SHFRAME, frame_id, 0); + } + else + { + if (MyDetailsFrameVisible()) + { + SendMessage(hwnd_container, WM_CLOSE, 0, 0); + } + else + { + ShowWindow(hwnd_container, SW_SHOW); + DBWriteContactSettingByte(0, MODULE_NAME, SETTING_FRAME_VISIBLE, 1); + } + + FixMainMenu(); + } + return 0; +} + + +INT_PTR ShowFrameFunc(WPARAM wParam, LPARAM lParam) +{ + if (ServiceExists(MS_CLIST_FRAMES_ADDFRAME)) + { + int flags = CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS, MAKEWPARAM(FO_FLAGS, frame_id), 0); + if (!(flags & F_VISIBLE)) + CallService(MS_CLIST_FRAMES_SHFRAME, frame_id, 0); + } + else + { + if ( !MyDetailsFrameVisible()) + { + ShowWindow(hwnd_container, SW_SHOW); + DBWriteContactSettingByte(0, MODULE_NAME, SETTING_FRAME_VISIBLE, 1); + + FixMainMenu(); + } + + } + return 0; +} + + +INT_PTR HideFrameFunc(WPARAM wParam, LPARAM lParam) +{ + if (ServiceExists(MS_CLIST_FRAMES_ADDFRAME)) + { + int flags = CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS, MAKEWPARAM(FO_FLAGS, frame_id), 0); + if (flags & F_VISIBLE) + CallService(MS_CLIST_FRAMES_SHFRAME, frame_id, 0); + } + else + { + if (MyDetailsFrameVisible()) + { + SendMessage(hwnd_container, WM_CLOSE, 0, 0); + + FixMainMenu(); + } + } + return 0; +} + + +void FixMainMenu() +{ + CLISTMENUITEM mi = {0}; + mi.cbSize = sizeof(CLISTMENUITEM); + mi.flags = CMIM_NAME; + + if (MyDetailsFrameVisible()) + mi.pszName = Translate("Hide My Details"); + else + mi.pszName = Translate("Show My Details"); + + CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hMenuShowHideFrame, (LPARAM)&mi); +} + +#include + +void RedrawFrame() +{ + if (frame_id == -1) + InvalidateRect(hwnd_container, NULL, TRUE); + else + CallService(MS_CLIST_FRAMES_UPDATEFRAME, (WPARAM)frame_id, (LPARAM)FU_TBREDRAW | FU_FMREDRAW); +} + +void RefreshFrameAndCalcRects() +{ + if (hwnd_frame != NULL) + { + MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd_frame, GWLP_USERDATA); + data->recalc_rectangles = true; + + PostMessage(hwnd_frame, MWM_REFRESH, 0, 0); + } +} + +void RefreshFrame() +{ + if (hwnd_frame != NULL) + PostMessage(hwnd_frame, MWM_REFRESH, 0, 0); +} + +// only used when no multiwindow functionality is available +bool MyDetailsFrameVisible() +{ + return IsWindowVisible(hwnd_container) ? true : false; +} + +void SetMyDetailsFrameVisible(bool visible) +{ + if (frame_id == -1 && hwnd_container != 0) + { + ShowWindow(hwnd_container, visible ? SW_SHOW : SW_HIDE); + } +} + +void SetCycleTime() +{ + if (hwnd_frame != NULL) + SetCycleTime(hwnd_frame); +} + +void SetCycleTime(HWND hwnd) +{ + KillTimer(hwnd, ID_FRAME_TIMER); + + if (opts.cycle_through_protocols) + SetTimer(hwnd, ID_FRAME_TIMER, opts.seconds_to_show_protocol * 1000, 0); +} + +void SetStatusMessageRefreshTime() +{ + if (hwnd_frame != NULL) + SetStatusMessageRefreshTime(hwnd_frame); +} + +void SetStatusMessageRefreshTime(HWND hwnd) +{ + KillTimer(hwnd, ID_STATUSMESSAGE_TIMER); + + opts.refresh_status_message_timer = DBGetContactSettingWord(NULL,"MyDetails","RefreshStatusMessageTimer",12); + if (opts.refresh_status_message_timer > 0) + { + SetTimer(hwnd, ID_STATUSMESSAGE_TIMER, opts.refresh_status_message_timer * 1000, NULL); + } +} + +INT_PTR PluginCommand_ShowNextProtocol(WPARAM wParam,LPARAM lParam) +{ + if (hwnd_frame == NULL) + return -1; + + MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd_frame, GWLP_USERDATA); + + data->protocol_number ++; + if (data->protocol_number >= protocols->GetSize()) + { + data->protocol_number = 0; + } + + DBWriteContactSettingWord(NULL,"MyDetails","ProtocolNumber",data->protocol_number); + + data->recalc_rectangles = true; + + SetCycleTime(); + + RedrawFrame(); + + return 0; +} + +INT_PTR PluginCommand_ShowPreviousProtocol(WPARAM wParam,LPARAM lParam) +{ + if (hwnd_frame == NULL) + return -1; + + MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd_frame, GWLP_USERDATA); + + data->protocol_number --; + if (data->protocol_number < 0) + { + data->protocol_number = protocols->GetSize() - 1; + } + + DBWriteContactSettingWord(NULL,"MyDetails","ProtocolNumber",data->protocol_number); + + data->recalc_rectangles = true; + + SetCycleTime(); + + RedrawFrame(); + + return 0; +} + +INT_PTR PluginCommand_ShowProtocol(WPARAM wParam,LPARAM lParam) +{ + char * proto = (char *)lParam; + int proto_num = -1; + + if (proto == NULL) + return -1; + + for (int i = 0 ; i < protocols->GetSize() ; i++) + { + if (_stricmp(protocols->Get(i)->name, proto) == 0) + { + proto_num = i; + break; + } + } + + if (proto_num == -1) + return -2; + + if (hwnd_frame == NULL) + return -3; + + MyDetailsFrameData *data = (MyDetailsFrameData *)GetWindowLong(hwnd_frame, GWLP_USERDATA); + + data->protocol_number = proto_num; + DBWriteContactSettingWord(NULL,"MyDetails","ProtocolNumber",data->protocol_number); + + data->recalc_rectangles = true; + + SetCycleTime(); + + RedrawFrame(); + + return 0; +} + +int SettingsChangedHook(WPARAM wParam, LPARAM lParam) +{ + if (hwnd_frame == NULL) + return 0; + + DBCONTACTWRITESETTING *cws = (DBCONTACTWRITESETTING*)lParam; + + if ((HANDLE)wParam == NULL) + { + Protocol *proto = protocols->Get((const char *) cws->szModule); + + if ( !strcmp(cws->szSetting,"Status") + || ( proto != NULL && proto->custom_status != 0 + && proto->custom_status_name != NULL + && !strcmp(cws->szSetting, _T2A(proto->custom_status_name))) + || ( proto != NULL && proto->custom_status != 0 + && proto->custom_status_message != NULL + && !strcmp(cws->szSetting, _T2A(proto->custom_status_message)))) + { + // Status changed + if (proto != NULL) + PostMessage(hwnd_frame, MWM_STATUS_CHANGED, (WPARAM) proto->name, 0); + } + else if (!strcmp(cws->szSetting,"MyHandle") + || !strcmp(cws->szSetting,"UIN") + || !strcmp(cws->szSetting,"Nick") + || !strcmp(cws->szSetting,"FirstName") + || !strcmp(cws->szSetting,"e-mail") + || !strcmp(cws->szSetting,"LastName") + || !strcmp(cws->szSetting,"JID")) + { + // Name changed + if (proto != NULL) + PostMessage(hwnd_frame, MWM_NICK_CHANGED, (WPARAM) proto->name, 0); + } + else if (strstr(cws->szModule,"Away")) + { + // Status message changed + PostMessage(hwnd_frame, MWM_STATUS_MSG_CHANGED, 0, 0); + } + else if (proto != NULL && strcmp(cws->szSetting,"ListeningTo") == 0) + { + PostMessage(hwnd_frame, MWM_LISTENINGTO_CHANGED, (WPARAM) proto->name, 0); + } + } + + return 0; +} + +int AvatarChangedHook(WPARAM wParam, LPARAM lParam) +{ + if (hwnd_frame == NULL) + return 0; + + Protocol *proto = protocols->Get((const char *) wParam); + + if (proto != NULL) + PostMessage(hwnd_frame, MWM_AVATAR_CHANGED, (WPARAM) proto->name, 0); + + return 0; +} + +int ProtoAckHook(WPARAM wParam, LPARAM lParam) +{ + if (hwnd_frame == NULL) + return 0; + + ACKDATA *ack = (ACKDATA*)lParam; + + if (ack->type == ACKTYPE_STATUS) + { + Protocol *proto = protocols->Get((const char *) ack->szModule); + + if (proto != NULL) + PostMessage(hwnd_frame, MWM_STATUS_CHANGED, (WPARAM) proto->name, 0); + } + else if (ack->type == ACKTYPE_AWAYMSG) + { + Protocol *proto = protocols->Get((const char *) ack->szModule); + + if (proto != NULL) + PostMessage(hwnd_frame, MWM_STATUS_MSG_CHANGED, (WPARAM) proto->name, 0); + } + + return 0; +} + +int ListeningtoEnableStateChangedHook(WPARAM wParam,LPARAM lParam) +{ + if (hwnd_frame == NULL) + return 0; + + if (wParam == NULL || protocols->Get((const char *) wParam) != NULL) + PostMessage(hwnd_frame, MWM_LISTENINGTO_CHANGED, wParam, 0); + + return 0; +} diff --git a/plugins/MyDetails/src/frame.h b/plugins/MyDetails/src/frame.h new file mode 100644 index 0000000000..5382d3ed46 --- /dev/null +++ b/plugins/MyDetails/src/frame.h @@ -0,0 +1,38 @@ +/* +Copyright (C) 2005 Ricardo Pescuma Domenecci + +This is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +This 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with this file; see the file license.txt. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. +*/ + + +#ifndef __FRAME_H__ +# define __FRAME_H__ + + +void InitFrames(); +void DeInitFrames(); + +void RefreshFrame(); +void RefreshFrameAndCalcRects(); + +void SetCycleTime(); + +INT_PTR PluginCommand_ShowNextProtocol(WPARAM wParam,LPARAM lParam); +INT_PTR PluginCommand_ShowPreviousProtocol(WPARAM wParam,LPARAM lParam); +INT_PTR PluginCommand_ShowProtocol(WPARAM wParam,LPARAM lParam); + + +#endif // __FRAME_H__ \ No newline at end of file diff --git a/plugins/MyDetails/src/mydetails.cpp b/plugins/MyDetails/src/mydetails.cpp new file mode 100644 index 0000000000..4b34041cbb --- /dev/null +++ b/plugins/MyDetails/src/mydetails.cpp @@ -0,0 +1,737 @@ +/* +Copyright (C) 2005 Ricardo Pescuma Domenecci + +This is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +This 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with this file; see the file license.txt. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. +*/ + + +#include "commons.h" + +// Prototypes ///////////////////////////////////////////////////////////////////////////////////// + +HINSTANCE hInst; +int hLangpack = 0; + +PLUGININFOEX pluginInfo={ + sizeof(PLUGININFOEX), + "My Details", + PLUGIN_MAKE_VERSION(0,0,1,11), + "Show and allows you to edit your details for all protocols.", + "Ricardo Pescuma Domenecci, Drugwash", + "", + "© 2005-2008 Ricardo Pescuma Domenecci, Drugwash", + "http://pescuma.org/miranda/mydetails", + UNICODE_AWARE, + { 0xa82baeb3, 0xa33c, 0x4036, { 0xb8, 0x37, 0x78, 0x3, 0xa5, 0xb6, 0xc2, 0xab } } // {A82BAEB3-A33C-4036-B837-7803A5B6C2AB} +}; + +// Hooks +HANDLE hModulesLoadedHook = NULL; +HANDLE hPreShutdownHook = NULL; + +long nickname_dialog_open; +HWND hwndSetNickname; + +long status_msg_dialog_open; +HWND hwndSetStatusMsg; + +// Hook called after init +static int MainInit(WPARAM wparam,LPARAM lparam); +static int MainUninit(WPARAM wParam, LPARAM lParam); + +// Services +static INT_PTR PluginCommand_SetMyNicknameUI(WPARAM wParam,LPARAM lParam); +static INT_PTR PluginCommand_SetMyNickname(WPARAM wParam,LPARAM lParam); +static INT_PTR PluginCommand_GetMyNickname(WPARAM wParam,LPARAM lParam); +static INT_PTR PluginCommand_SetMyAvatarUI(WPARAM wParam,LPARAM lParam); +static INT_PTR PluginCommand_SetMyAvatar(WPARAM wParam,LPARAM lParam); +static INT_PTR PluginCommand_GetMyAvatar(WPARAM wParam,LPARAM lParam); +static INT_PTR PluginCommand_SetMyStatusMessageUI(WPARAM wParam,LPARAM lParam); +static INT_PTR PluginCommand_CycleThroughtProtocols(WPARAM wParam,LPARAM lParam); + + +// Functions ////////////////////////////////////////////////////////////////////////////////////// + + +BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) +{ + hInst = hinstDLL; + return TRUE; +} + +extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) +{ + return &pluginInfo; +} + +extern "C" __declspec(dllexport) const MUUID interfaces[] = { MIID_MDETAILS, MIID_LAST }; + +extern "C" __declspec(dllexport) int Load() +{ + mir_getLP(&pluginInfo); + + // Hook event to load messages and show first one + HookEvent(ME_SYSTEM_MODULESLOADED, MainInit); + HookEvent(ME_SYSTEM_PRESHUTDOWN, MainUninit); + + nickname_dialog_open = 0; + status_msg_dialog_open = 0; + + // Options + InitOptions(); + + // Register services + CreateServiceFunction(MS_MYDETAILS_SETMYNICKNAME, PluginCommand_SetMyNickname); + CreateServiceFunction(MS_MYDETAILS_SETMYNICKNAMEUI, PluginCommand_SetMyNicknameUI); + CreateServiceFunction(MS_MYDETAILS_SETMYAVATAR, PluginCommand_SetMyAvatar); + CreateServiceFunction(MS_MYDETAILS_SETMYAVATARUI, PluginCommand_SetMyAvatarUI); + CreateServiceFunction(MS_MYDETAILS_GETMYNICKNAME, PluginCommand_GetMyNickname); + CreateServiceFunction(MS_MYDETAILS_GETMYAVATAR, PluginCommand_GetMyAvatar); + CreateServiceFunction(MS_MYDETAILS_SETMYSTATUSMESSAGEUI, PluginCommand_SetMyStatusMessageUI); + CreateServiceFunction(MS_MYDETAILS_SHOWNEXTPROTOCOL, PluginCommand_ShowNextProtocol); + CreateServiceFunction(MS_MYDETAILS_SHOWPREVIOUSPROTOCOL, PluginCommand_ShowPreviousProtocol); + CreateServiceFunction(MS_MYDETAILS_SHOWPROTOCOL, PluginCommand_ShowProtocol); + CreateServiceFunction(MS_MYDETAILS_CYCLE_THROUGH_PROTOCOLS, PluginCommand_CycleThroughtProtocols); + + return 0; +} + +extern "C" __declspec(dllexport) int Unload(void) +{ + DestroyServiceFunction(MS_MYDETAILS_SETMYNICKNAME); + DestroyServiceFunction(MS_MYDETAILS_SETMYNICKNAMEUI); + DestroyServiceFunction(MS_MYDETAILS_SETMYAVATAR); + DestroyServiceFunction(MS_MYDETAILS_SETMYAVATARUI); + DestroyServiceFunction(MS_MYDETAILS_GETMYNICKNAME); + DestroyServiceFunction(MS_MYDETAILS_GETMYAVATAR); + DestroyServiceFunction(MS_MYDETAILS_SETMYSTATUSMESSAGEUI); + DestroyServiceFunction(MS_MYDETAILS_SHOWNEXTPROTOCOL); + DestroyServiceFunction(MS_MYDETAILS_SHOWPREVIOUSPROTOCOL); + DestroyServiceFunction(MS_MYDETAILS_SHOWPROTOCOL); + DestroyServiceFunction(MS_MYDETAILS_CYCLE_THROUGH_PROTOCOLS); + + DeInitProtocolData(); + return 0; +} + + +static INT_PTR Menu_SetMyAvatarUI(WPARAM wParam,LPARAM lParam) +{ + return PluginCommand_SetMyAvatarUI(0, 0); +} + +static INT_PTR Menu_SetMyNicknameUI(WPARAM wParam,LPARAM lParam) +{ + return PluginCommand_SetMyNicknameUI(0, 0); +} + +static INT_PTR Menu_SetMyStatusMessageUI(WPARAM wParam,LPARAM lParam) +{ + return PluginCommand_SetMyStatusMessageUI(0, 0); +} + + +// Hook called after init +static int MainInit(WPARAM wparam,LPARAM lparam) +{ + InitProtocolData(); + + // Add options to menu + CLISTMENUITEM mi; + + if (protocols->CanSetAvatars()) { + ZeroMemory(&mi,sizeof(mi)); + mi.cbSize = sizeof(mi); + mi.flags = CMIF_TCHAR; + mi.popupPosition = 500050000; + mi.ptszPopupName = LPGENT("My Details"); + mi.position = 100001; + mi.ptszName = LPGENT("Set My Avatar..."); + CreateServiceFunction("MENU_" MS_MYDETAILS_SETMYAVATARUI, Menu_SetMyAvatarUI); + mi.pszService = "MENU_" MS_MYDETAILS_SETMYAVATARUI; + Menu_AddMainMenuItem(&mi); + } + + ZeroMemory(&mi,sizeof(mi)); + mi.cbSize = sizeof(mi); + mi.flags = CMIF_TCHAR; + mi.popupPosition = 500050000; + mi.ptszPopupName = LPGENT("My Details"); + mi.position = 100002; + mi.ptszName = LPGENT("Set My Nickname..."); + CreateServiceFunction("MENU_" MS_MYDETAILS_SETMYNICKNAMEUI, Menu_SetMyNicknameUI); + mi.pszService = "MENU_" MS_MYDETAILS_SETMYNICKNAMEUI; + Menu_AddMainMenuItem(&mi); + + ZeroMemory(&mi,sizeof(mi)); + mi.cbSize = sizeof(mi); + mi.flags = CMIF_TCHAR; + mi.popupPosition = 500050000; + mi.ptszPopupName = LPGENT("My Details"); + mi.position = 100003; + mi.ptszName = LPGENT("Set My Status Message..."); + CreateServiceFunction("MENU_" MS_MYDETAILS_SETMYSTATUSMESSAGEUI, Menu_SetMyStatusMessageUI); + mi.pszService = "MENU_" MS_MYDETAILS_SETMYSTATUSMESSAGEUI; + Menu_AddMainMenuItem(&mi); + + // Set protocols to show frame + ZeroMemory(&mi,sizeof(mi)); + mi.cbSize = sizeof(mi); + mi.flags = CMIF_TCHAR; + mi.popupPosition = 500050000; + mi.ptszPopupName = LPGENT("My Details"); + mi.position = 200001; + mi.ptszName = LPGENT("Show next protocol"); + mi.pszService = MS_MYDETAILS_SHOWNEXTPROTOCOL; + Menu_AddMainMenuItem(&mi); + + InitFrames(); + + if (CallService(MS_SKIN2_GETICON, 0, (LPARAM) "LISTENING_TO_ICON") == NULL) { + SKINICONDESC sid = {0}; + sid.cbSize = sizeof(SKINICONDESC); + sid.flags = SIDF_TCHAR; + sid.ptszSection = LPGENT("Contact List"); + sid.ptszDescription = LPGENT("Listening to"); + sid.pszName = "LISTENING_TO_ICON"; + sid.hDefaultIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_LISTENINGTO)); + Skin_AddIcon(&sid); + } + { + SKINICONDESC sid = {0}; + sid.cbSize = sizeof(SKINICONDESC); + sid.flags = SIDF_TCHAR; + sid.ptszSection = LPGENT("My Details"); + sid.ptszDescription = LPGENT("Previous protocol"); + sid.pszName = "MYDETAILS_PREV_PROTOCOL"; + sid.hDefaultIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_LEFT_ARROW)); + Skin_AddIcon(&sid); + } + { + SKINICONDESC sid = {0}; + sid.cbSize = sizeof(SKINICONDESC); + sid.flags = SIDF_TCHAR; + sid.ptszSection = LPGENT("My Details"); + sid.ptszDescription = LPGENT("Next protocol"); + sid.pszName = "MYDETAILS_NEXT_PROTOCOL"; + sid.hDefaultIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_RIGHT_ARROW)); + Skin_AddIcon(&sid); + } + + return 0; +} + +static int MainUninit(WPARAM wParam, LPARAM lParam) +{ + DeInitFrames(); + return 0; +} + +// Set nickname /////////////////////////////////////////////////////////////////////////////////// + +#define WMU_SETDATA (WM_USER+1) + +static INT_PTR CALLBACK DlgProcSetNickname(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch ( msg ) { + case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); + SendMessage(GetDlgItem(hwndDlg, IDC_NICKNAME), EM_LIMITTEXT, + MS_MYDETAILS_GETMYNICKNAME_BUFFER_SIZE - 1, 0); + return TRUE; + + case WMU_SETDATA: + { + int proto_num = (int)wParam; + + SetWindowLong(hwndDlg, GWLP_USERDATA, proto_num); + + if (proto_num == -1) { + SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)LoadSkinnedIcon(SKINICON_OTHER_MIRANDA)); + + // All protos have the same nick? + if (protocols->GetSize() > 0) { + TCHAR *nick = protocols->Get(0)->nickname; + + bool foundDefNick = true; + for (int i=1 ; foundDefNick && i < protocols->GetSize() ; i++) { + if (_tcsicmp(protocols->Get(i)->nickname, nick) != 0) { + foundDefNick = false; + break; + } + } + + if (foundDefNick) + if ( _tcsicmp(protocols->default_nick, nick) != 0) + lstrcpy(protocols->default_nick, nick); + } + + SetDlgItemText(hwndDlg, IDC_NICKNAME, protocols->default_nick); + SendDlgItemMessage(hwndDlg, IDC_NICKNAME, EM_LIMITTEXT, MS_MYDETAILS_GETMYNICKNAME_BUFFER_SIZE, 0); + } + else { + Protocol *proto = protocols->Get(proto_num); + + TCHAR tmp[128]; + mir_sntprintf(tmp, SIZEOF(tmp), TranslateT("Set My Nickname for %s"), proto->description); + + SendMessage(hwndDlg, WM_SETTEXT, 0, (LPARAM)tmp); + + HICON hIcon = (HICON)CallProtoService(proto->name, PS_LOADICON, PLI_PROTOCOL, 0); + if (hIcon != NULL) + { + SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon); + DestroyIcon(hIcon); + } + + SetDlgItemText(hwndDlg, IDC_NICKNAME, proto->nickname); + SendDlgItemMessage(hwndDlg, IDC_NICKNAME, EM_LIMITTEXT, + min(MS_MYDETAILS_GETMYNICKNAME_BUFFER_SIZE, proto->GetNickMaxLength()), 0); + } + + return TRUE; + } + + case WM_COMMAND: + switch(wParam) { + case IDOK: + { + TCHAR tmp[MS_MYDETAILS_GETMYNICKNAME_BUFFER_SIZE]; + GetDlgItemText(hwndDlg, IDC_NICKNAME, tmp, SIZEOF(tmp)); + + int proto_num = (int)GetWindowLong(hwndDlg, GWLP_USERDATA); + if (proto_num == -1) + protocols->SetNicks(tmp); + else + protocols->Get(proto_num)->SetNick(tmp); + + DestroyWindow(hwndDlg); + break; + } + case IDCANCEL: + DestroyWindow(hwndDlg); + break; + } + break; + + case WM_CLOSE: + DestroyWindow(hwndDlg); + break; + + case WM_DESTROY: + InterlockedExchange(&nickname_dialog_open, 0); + break; + } + + return FALSE; +} + +static INT_PTR PluginCommand_SetMyNicknameUI(WPARAM wParam,LPARAM lParam) +{ + char *proto = (char*)lParam; + int proto_num = -1; + + if (proto != NULL) { + int i; + for (i = 0 ; i < protocols->GetSize() ; i++) { + if (_stricmp(protocols->Get(i)->name, proto) == 0) { + proto_num = i; + break; + } + } + + if (proto_num == -1) + return -1; + + if ( !protocols->Get(i)->CanSetNick()) + return -2; + + } + + if ( !nickname_dialog_open) { + InterlockedExchange(&nickname_dialog_open, 1); + + hwndSetNickname = CreateDialog(hInst, MAKEINTRESOURCE( IDD_SETNICKNAME ), NULL, DlgProcSetNickname); + + SendMessage(hwndSetNickname, WMU_SETDATA, proto_num, 0); + } + + SetForegroundWindow( hwndSetNickname ); + SetFocus( hwndSetNickname ); + ShowWindow( hwndSetNickname, SW_SHOW ); + + return 0; +} + +static INT_PTR PluginCommand_SetMyNickname(WPARAM wParam,LPARAM lParam) +{ + char * proto = (char *)wParam; + if (proto != NULL) { + for (int i = 0 ; i < protocols->GetSize() ; i++) { + if (_stricmp(protocols->Get(i)->name, proto) == 0) { + if ( !protocols->Get(i)->CanSetNick()) + return -2; + + protocols->Get(i)->SetNick((TCHAR*)lParam); + return 0; + } + } + + return -1; + } + + protocols->SetNicks((TCHAR*)lParam); + return 0; +} + +static INT_PTR PluginCommand_GetMyNickname(WPARAM wParam,LPARAM lParam) +{ + TCHAR* ret = (TCHAR*)lParam; + char * proto = (char *)wParam; + + if (ret == NULL) + return -1; + + if (proto == NULL) { + if (protocols->default_nick != NULL) + lstrcpyn(ret, protocols->default_nick, MS_MYDETAILS_GETMYNICKNAME_BUFFER_SIZE); + else + ret[0] = '\0'; + + return 0; + } + else { + Protocol *protocol = protocols->Get(proto); + if (protocol != NULL) { + lstrcpyn(ret, protocol->nickname, MS_MYDETAILS_GETMYNICKNAME_BUFFER_SIZE); + return 0; + } + + return -1; + } +} + +// Set avatar ///////////////////////////////////////////////////////////////////////////////////// + +static INT_PTR PluginCommand_SetMyAvatarUI(WPARAM wParam,LPARAM lParam) +{ + char * proto = (char *)lParam; + int proto_num = -1; + + if (proto != NULL) + { + int i; + for (i = 0 ; i < protocols->GetSize() ; i++) + { + if (_stricmp(protocols->Get(i)->name, proto) == 0) + { + proto_num = i; + break; + } + } + + if (proto_num == -1) + return -1; + + if ( !protocols->Get(i)->CanSetAvatar()) + { + return -2; + } + } + + if (proto_num == -1) + { + protocols->SetAvatars(NULL); + } + else + { + protocols->Get(proto_num)->SetAvatar(NULL); + } + + return 0; +} + +static INT_PTR PluginCommand_SetMyAvatar(WPARAM wParam,LPARAM lParam) +{ + char *proto = (char*)wParam; + if (proto != NULL) { + for (int i = 0 ; i < protocols->GetSize() ; i++) { + if (_stricmp(protocols->Get(i)->name, proto) == 0) { + if ( !protocols->Get(i)->CanSetAvatar()) + return -2; + + protocols->Get(i)->SetAvatar((TCHAR*)lParam); + return 0; + } + } + + return -1; + } + + protocols->SetAvatars((TCHAR*)lParam); + return 0; +} + +int Status2SkinIcon(int status) +{ + switch(status) { + case ID_STATUS_AWAY: return SKINICON_STATUS_AWAY; + case ID_STATUS_NA: return SKINICON_STATUS_NA; + case ID_STATUS_DND: return SKINICON_STATUS_DND; + case ID_STATUS_OCCUPIED: return SKINICON_STATUS_OCCUPIED; + case ID_STATUS_FREECHAT: return SKINICON_STATUS_FREE4CHAT; + case ID_STATUS_ONLINE: return SKINICON_STATUS_ONLINE; + case ID_STATUS_OFFLINE: return SKINICON_STATUS_OFFLINE; + case ID_STATUS_INVISIBLE: return SKINICON_STATUS_INVISIBLE; + case ID_STATUS_ONTHEPHONE: return SKINICON_STATUS_ONTHEPHONE; + case ID_STATUS_OUTTOLUNCH: return SKINICON_STATUS_OUTTOLUNCH; + case ID_STATUS_IDLE: return SKINICON_STATUS_AWAY; + } + return SKINICON_STATUS_OFFLINE; +} + +static INT_PTR PluginCommand_GetMyAvatar(WPARAM wParam,LPARAM lParam) +{ + TCHAR* ret = (TCHAR*)lParam; + char * proto = (char *)wParam; + + if (ret == NULL) + return -1; + + if (proto == NULL) { + if (protocols->default_avatar_file != NULL) + lstrcpyn(ret, protocols->default_avatar_file, MS_MYDETAILS_GETMYAVATAR_BUFFER_SIZE); + else + ret[0] = '\0'; + + return 0; + } + + for (int i = 0 ; i < protocols->GetSize() ; i++) { + if ( _stricmp(protocols->Get(i)->name, proto) == 0) { + if ( !protocols->Get(i)->CanGetAvatar()) + return -2; + + protocols->Get(i)->GetAvatar(); + + if (protocols->Get(i)->avatar_file != NULL) + lstrcpyn(ret, protocols->Get(i)->avatar_file, MS_MYDETAILS_GETMYAVATAR_BUFFER_SIZE); + else + ret[0] = '\0'; + + return 0; + } + } + + return -1; +} + +static LRESULT CALLBACK StatusMsgEditSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) { + case WM_CHAR: + if (wParam == 0x0a && (GetKeyState(VK_CONTROL) & 0x8000) != 0) { + PostMessage(GetParent(hwnd), WM_COMMAND, IDOK, 0); + return 0; + } + break; + } + + return CallWindowProc((WNDPROC) GetWindowLong(hwnd, GWLP_USERDATA), hwnd, msg, wParam, lParam); +} + +struct SetStatusMessageData { + int status; + int proto_num; +}; + +static INT_PTR CALLBACK DlgProcSetStatusMessage(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) { + case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); + SendMessage(GetDlgItem(hwndDlg, IDC_STATUSMESSAGE), EM_LIMITTEXT, + MS_MYDETAILS_GETMYSTATUSMESSAGE_BUFFER_SIZE - 1, 0); + { + WNDPROC old_proc = (WNDPROC) SetWindowLong(GetDlgItem(hwndDlg, IDC_STATUSMESSAGE), + GWLP_WNDPROC, (LONG) StatusMsgEditSubclassProc); + SetWindowLong(GetDlgItem(hwndDlg, IDC_STATUSMESSAGE), GWLP_USERDATA, (long) old_proc); + } + return TRUE; + + case WMU_SETDATA: + { + SetStatusMessageData *data = (SetStatusMessageData *) malloc(sizeof(SetStatusMessageData)); + data->status = (int)wParam; + data->proto_num = (int)lParam; + + SetWindowLong(hwndDlg, GWLP_USERDATA, (LONG) data); + + if (data->proto_num >= 0) { + Protocol *proto = protocols->Get(data->proto_num); + + HICON hIcon = (HICON)CallProtoService(proto->name, PS_LOADICON, PLI_PROTOCOL, 0); + if (hIcon != NULL) { + SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon); + DestroyIcon(hIcon); + } + + TCHAR title[256]; + mir_sntprintf(title, SIZEOF(title), TranslateT("Set My Status Message for %s"), proto->description); + SendMessage(hwndDlg, WM_SETTEXT, 0, (LPARAM)title); + + SetDlgItemText(hwndDlg, IDC_STATUSMESSAGE, proto->GetStatusMsg()); + } + else if (data->status != 0) + { + SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)LoadSkinnedIcon(Status2SkinIcon(data->status))); + + TCHAR title[256]; + mir_sntprintf(title, SIZEOF(title), TranslateT("Set My Status Message for %s"), + CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, data->status, GSMDF_TCHAR)); + SendMessage(hwndDlg, WM_SETTEXT, 0, (LPARAM)title); + + SetDlgItemText(hwndDlg, IDC_STATUSMESSAGE, protocols->GetDefaultStatusMsg(data->status)); + } + else + { + SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)LoadSkinnedIcon(SKINICON_OTHER_MIRANDA)); + + SetDlgItemText(hwndDlg, IDC_STATUSMESSAGE, protocols->GetDefaultStatusMsg()); + } + + return TRUE; + } + case WM_COMMAND: + switch(wParam) { + case IDOK: + { + TCHAR tmp[MS_MYDETAILS_GETMYSTATUSMESSAGE_BUFFER_SIZE]; + GetDlgItemText(hwndDlg, IDC_STATUSMESSAGE, tmp, sizeof(tmp)); + + SetStatusMessageData *data = (SetStatusMessageData *) GetWindowLong(hwndDlg, GWLP_USERDATA); + + if (data->proto_num >= 0) + protocols->Get(data->proto_num)->SetStatusMsg(tmp); + else if (data->status == 0) + protocols->SetStatusMsgs(tmp); + else + protocols->SetStatusMsgs(data->status, tmp); + + DestroyWindow(hwndDlg); + } + break; + + case IDCANCEL: + DestroyWindow(hwndDlg); + break; + } + break; + + case WM_CLOSE: + DestroyWindow(hwndDlg); + break; + + case WM_DESTROY: + SetWindowLong(GetDlgItem(hwndDlg, IDC_STATUSMESSAGE), GWLP_WNDPROC, + GetWindowLong(GetDlgItem(hwndDlg, IDC_STATUSMESSAGE), GWLP_USERDATA)); + free((SetStatusMessageData *) GetWindowLong(hwndDlg, GWLP_USERDATA)); + InterlockedExchange(&status_msg_dialog_open, 0); + break; + } + + return FALSE; +} + +static INT_PTR PluginCommand_SetMyStatusMessageUI(WPARAM wParam,LPARAM lParam) +{ + int status = (int)wParam; + char * proto_name = (char *)lParam; + int proto_num = -1; + Protocol *proto = NULL; + + if (status != 0 && (status < ID_STATUS_OFFLINE || status > ID_STATUS_OUTTOLUNCH)) + return -10; + + if (proto_name != NULL) + { + for (int i = 0 ; i < protocols->GetSize() ; i++) + { + proto = protocols->Get(i); + + if (_stricmp(proto->name, proto_name) == 0) + { + proto_num = i; + break; + } + } + + if (proto_num == -1) { + return -1; + } + + if (protocols->CanSetStatusMsgPerProtocol() && !proto->CanSetStatusMsg()) { + return -2; + } + } + else if (ServiceExists(MS_SA_CHANGESTATUSMSG)) + { + if (proto == NULL && status == 0) + { + CallService(MS_SA_CHANGESTATUSMSG, protocols->GetGlobalStatus(), NULL); + } + else if (status == 0) + { + CallService(MS_SA_CHANGESTATUSMSG, proto->status, (LPARAM) proto_name); + } + else + { + CallService(MS_SA_CHANGESTATUSMSG, status, (LPARAM) proto_name); + } + + return 0; + } + + if (proto == NULL || proto->status != ID_STATUS_OFFLINE) + { + if ( !status_msg_dialog_open) + { + InterlockedExchange(&status_msg_dialog_open, 1); + + hwndSetStatusMsg = CreateDialog(hInst, MAKEINTRESOURCE( IDD_SETSTATUSMESSAGE ), NULL, DlgProcSetStatusMessage ); + + SendMessage(hwndSetStatusMsg, WMU_SETDATA, status, proto_num); + } + + SetForegroundWindow( hwndSetStatusMsg ); + SetFocus( hwndSetStatusMsg ); + ShowWindow( hwndSetStatusMsg, SW_SHOW ); + + return 0; + } + + return -3; +} + + +static INT_PTR PluginCommand_CycleThroughtProtocols(WPARAM wParam,LPARAM lParam) +{ + DBWriteContactSettingByte(NULL,"MyDetails","CicleThroughtProtocols", (BYTE) wParam); + + LoadOptions(); + + return 0; +} \ No newline at end of file diff --git a/plugins/MyDetails/src/options.cpp b/plugins/MyDetails/src/options.cpp new file mode 100644 index 0000000000..a4b722b241 --- /dev/null +++ b/plugins/MyDetails/src/options.cpp @@ -0,0 +1,160 @@ +/* +Copyright (C) 2005 Ricardo Pescuma Domenecci + +This is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +This 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with this file; see the file license.txt. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. +*/ + + +#include "commons.h" +#include "options.h" + +// Prototypes ///////////////////////////////////////////////////////////////////////////////////// + +Options opts; + +// Functions ////////////////////////////////////////////////////////////////////////////////////// + +static OptPageControl pageControls[] = { + { &opts.cycle_through_protocols, CONTROL_CHECKBOX, IDC_CYCLE_THROUGH_PROTOS, "CicleThroughtProtocols", (BYTE) 1 }, + { &opts.seconds_to_show_protocol, CONTROL_SPIN, IDC_CYCLE_TIME, "CicleTime", (WORD) 5, IDC_CYCLE_TIME_SPIN, (WORD) 1, (WORD) 255 }, + { &opts.draw_show_protocol_name, CONTROL_CHECKBOX, IDC_SHOW_PROTO_NAME, "ShowProtocolName", (BYTE) 1 }, + { &opts.show_protocol_cycle_button, CONTROL_CHECKBOX, IDC_SHOW_CYCLE_PROTO_BUTTON, "ShowProtocolCycleButton", (BYTE) 0 }, + { &opts.draw_text_rtl, CONTROL_CHECKBOX, IDC_TEXT_RTL, "TextRTL", (BYTE) 0 }, + { &opts.draw_text_align_right, CONTROL_CHECKBOX, IDC_TEXT_ALIGN_RIGHT, "TextAlignRight", (BYTE) 0 }, + { &opts.replace_smileys, CONTROL_CHECKBOX, IDC_REPLACE_SMILEYS, "ReplaceSmileys", (BYTE) 1 }, + { &opts.resize_smileys, CONTROL_CHECKBOX, IDC_RESIZE_SMILEYS, "ResizeSmileys", (BYTE) 0 }, + { &opts.use_contact_list_smileys, CONTROL_CHECKBOX, IDC_USE_CONTACT_LIST_SMILEYS, "UseContactListSmileys", (BYTE) 0 }, + { &opts.global_on_avatar, CONTROL_CHECKBOX, IDC_GLOBAL_ON_AVATAR, "GlobalOnAvatar", (BYTE) 0 }, + { &opts.global_on_nickname, CONTROL_CHECKBOX, IDC_GLOBAL_ON_NICKNAME, "GlobalOnNickname", (BYTE) 0 }, + { &opts.global_on_status, CONTROL_CHECKBOX, IDC_GLOBAL_ON_STATUS, "GlobalOnStatus", (BYTE) 0 }, + { &opts.global_on_status_message, CONTROL_CHECKBOX, IDC_GLOBAL_ON_STATUS_MESSAGE, "GlobalOnStatusMessage", (BYTE) 0 }, + { &opts.draw_avatar_allow_to_grow, CONTROL_CHECKBOX, IDC_AVATAR_ALLOW_TO_GROW, "AvatarAllowToGrow", (BYTE) 0 }, + { &opts.draw_avatar_custom_size, CONTROL_CHECKBOX, IDC_AVATAR_CUSTOM_SIZE_CHK, "AvatarCustomSize", (BYTE) 0 }, + { &opts.draw_avatar_custom_size_pixels, CONTROL_SPIN, IDC_AVATAR_CUSTOM_SIZE, "AvatarCustomSizePixels", (WORD) 30, IDC_AVATAR_CUSTOM_SIZE_SPIN, (WORD) 1, (WORD) 255 }, + { &opts.draw_avatar_border, CONTROL_CHECKBOX, IDC_AVATAR_DRAW_BORDER, "AvatarDrawBorders", (BYTE) 0 }, + { &opts.draw_avatar_border_color, CONTROL_COLOR, IDC_AVATAR_BORDER_COLOR, "AvatarBorderColor", (DWORD) RGB(0,0,0) }, + { &opts.draw_avatar_round_corner, CONTROL_CHECKBOX, IDC_AVATAR_ROUND_CORNERS, "AvatarRoundCorners", (BYTE) 1 }, + { &opts.draw_avatar_use_custom_corner_size, CONTROL_CHECKBOX, IDC_AVATAR_CUSTOM_CORNER_SIZE_CHECK, "AvatarUseCustomCornerSize", (BYTE) 0 }, + { &opts.draw_avatar_custom_corner_size, CONTROL_SPIN, IDC_AVATAR_CUSTOM_CORNER_SIZE, "AvatarCustomCornerSize", (WORD) 4, IDC_AVATAR_CUSTOM_CORNER_SIZE_SPIN, (WORD) 1, (WORD) 255 }, + { &opts.use_avatar_space_to_draw_text, CONTROL_CHECKBOX, IDC_AVATAR_USE_FREE_SPACE, "AvatarUseFreeSpaceToDrawText", (BYTE) 1 }, + { &opts.resize_frame, CONTROL_CHECKBOX, IDC_RESIZE_FRAME, "ResizeFrame", (BYTE) 0 }, + { &opts.borders[RIGHT], CONTROL_SPIN, IDC_BORDER_RIGHT, "BorderRight", (WORD) 8, IDC_BORDER_RIGHT_SPIN, (WORD) 0, (WORD) 255 }, + { &opts.borders[LEFT], CONTROL_SPIN, IDC_BORDER_LEFT, "BorderLeft", (WORD) 8, IDC_BORDER_LEFT_SPIN, (WORD) 0, (WORD) 255 }, + { &opts.borders[TOP], CONTROL_SPIN, IDC_BORDER_TOP, "BorderTop", (WORD) 8, IDC_BORDER_TOP_SPIN, (WORD) 0, (WORD) 255 }, + { &opts.borders[BOTTOM], CONTROL_SPIN, IDC_BORDER_BOTTOM, "BorderBottom", (WORD) 8, IDC_BORDER_BOTTOM_SPIN, (WORD) 0, (WORD) 255 }, + { &opts.bkg_color, CONTROL_COLOR, IDC_AVATAR_BKG_COLOR, "BackgroundColor", (DWORD) GetSysColor(COLOR_BTNFACE) } +}; + + +// Initializations needed by options +void LoadOptions() +{ + LoadOpts(pageControls, SIZEOF(pageControls), MODULE_NAME); + + // This is created here to assert that this key always exists + opts.refresh_status_message_timer = DBGetContactSettingWord(NULL,"MyDetails","RefreshStatusMessageTimer",12); + DBWriteContactSettingWord(NULL,"MyDetails","RefreshStatusMessageTimer", opts.refresh_status_message_timer); + + SetCycleTime(); + RefreshFrameAndCalcRects(); +} + +static INT_PTR CALLBACK DlgProcOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + BOOL ret = SaveOptsDlgProc(pageControls, SIZEOF(pageControls), MODULE_NAME, hwndDlg, msg, wParam, lParam); + + switch (msg) { + case WM_INITDIALOG: + if (!IsDlgButtonChecked(hwndDlg,IDC_AVATAR_DRAW_BORDER)) { + EnableWindow(GetDlgItem(hwndDlg,IDC_AVATAR_BORDER_COLOR_L),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_AVATAR_BORDER_COLOR),FALSE); + } + + if (!IsDlgButtonChecked(hwndDlg,IDC_AVATAR_ROUND_CORNERS)) { + EnableWindow(GetDlgItem(hwndDlg,IDC_AVATAR_CUSTOM_CORNER_SIZE_CHECK),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_AVATAR_CUSTOM_CORNER_SIZE),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_AVATAR_CUSTOM_CORNER_SIZE_SPIN),FALSE); + } + + if (!IsDlgButtonChecked(hwndDlg,IDC_SHOW_PROTO_NAME)) + EnableWindow(GetDlgItem(hwndDlg,IDC_SHOW_CYCLE_PROTO_BUTTON),FALSE); + + if ( !ServiceExists(MS_SMILEYADD_BATCHPARSE)) { + EnableWindow(GetDlgItem(hwndDlg,IDC_REPLACE_SMILEYS),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_USE_CONTACT_LIST_SMILEYS),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_RESIZE_SMILEYS),FALSE); + } + + if ( !ServiceExists(MS_CLIST_FRAMES_SETFRAMEOPTIONS)) + EnableWindow(GetDlgItem(hwndDlg,IDC_RESIZE_FRAME),FALSE); + + break; + + case WM_COMMAND: + if (LOWORD(wParam)==IDC_AVATAR_DRAW_BORDER) { + BOOL enabled = IsDlgButtonChecked(hwndDlg,IDC_AVATAR_DRAW_BORDER); + EnableWindow(GetDlgItem(hwndDlg,IDC_AVATAR_BORDER_COLOR_L),enabled); + EnableWindow(GetDlgItem(hwndDlg,IDC_AVATAR_BORDER_COLOR),enabled); + } + else if (LOWORD(wParam)==IDC_AVATAR_ROUND_CORNERS) { + BOOL enabled = IsDlgButtonChecked(hwndDlg,IDC_AVATAR_ROUND_CORNERS); + EnableWindow(GetDlgItem(hwndDlg,IDC_AVATAR_CUSTOM_CORNER_SIZE_CHECK),enabled); + EnableWindow(GetDlgItem(hwndDlg,IDC_AVATAR_CUSTOM_CORNER_SIZE),enabled); + EnableWindow(GetDlgItem(hwndDlg,IDC_AVATAR_CUSTOM_CORNER_SIZE_SPIN),enabled); + } + else if (LOWORD(wParam)==IDC_SHOW_PROTO_NAME) { + BOOL enabled = IsDlgButtonChecked(hwndDlg,IDC_SHOW_PROTO_NAME); + EnableWindow(GetDlgItem(hwndDlg,IDC_SHOW_CYCLE_PROTO_BUTTON),enabled); + } + break; + + case WM_NOTIFY: + switch (((LPNMHDR)lParam)->idFrom) { + case 0: + switch (((LPNMHDR)lParam)->code) { + case PSN_APPLY: + LoadOptions(); + return TRUE; + } + break; + } + break; + } + + return ret; +} + +int InitOptionsCallback(WPARAM wParam,LPARAM lParam) +{ + OPTIONSDIALOGPAGE odp = { 0 }; + odp.cbSize = sizeof(odp); + odp.position = -200000000; + odp.hInstance = hInst; + odp.pfnDlgProc = DlgProcOpts; + odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTS); + odp.ptszGroup = LPGENT("Customize"); + odp.ptszTitle = LPGENT("My Details"); + odp.flags = ODPF_BOLDGROUPS | ODPF_TCHAR; + Options_AddPage(wParam, &odp); + return 0; +} + +void InitOptions() +{ + LoadOptions(); + + HookEvent(ME_OPT_INITIALISE, InitOptionsCallback); +} diff --git a/plugins/MyDetails/src/options.h b/plugins/MyDetails/src/options.h new file mode 100644 index 0000000000..c8b11ef725 --- /dev/null +++ b/plugins/MyDetails/src/options.h @@ -0,0 +1,79 @@ +/* +Copyright (C) 2005 Ricardo Pescuma Domenecci + +This is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +This 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with this file; see the file license.txt. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. +*/ + + +#ifndef __OPTIONS_H__ +# define __OPTIONS_H__ + + +#define TOP 0 +#define LEFT 1 +#define BOTTOM 2 +#define RIGHT 3 + +struct Options +{ + bool cycle_through_protocols; + int seconds_to_show_protocol; + bool replace_smileys; + bool resize_smileys; + bool use_contact_list_smileys; + + bool draw_text_rtl; + bool draw_text_align_right; + + bool draw_show_protocol_name; + bool show_protocol_cycle_button; + + bool global_on_avatar; + bool global_on_nickname; + bool global_on_status; + bool global_on_status_message; + + bool draw_avatar_custom_size; + bool draw_avatar_allow_to_grow; + int draw_avatar_custom_size_pixels; + bool draw_avatar_border; + COLORREF draw_avatar_border_color; + bool draw_avatar_round_corner; + bool draw_avatar_use_custom_corner_size; + int draw_avatar_custom_corner_size; + + COLORREF bkg_color; + int borders[4]; + + bool use_avatar_space_to_draw_text; + + bool resize_frame; + + int refresh_status_message_timer; +}; + +extern Options opts; + + +// Initializations needed by options +void InitOptions(); + +// Loads the options from DB +// It don't need to be called, except in some rare cases +void LoadOptions(); + + +#endif // __OPTIONS_H__ diff --git a/plugins/MyDetails/src/resource.h b/plugins/MyDetails/src/resource.h new file mode 100644 index 0000000000..b53e46d1a3 --- /dev/null +++ b/plugins/MyDetails/src/resource.h @@ -0,0 +1,71 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by resource.rc +// +#define IDD_SETNICKNAME 101 +#define IDD_OPTS 102 +#define IDD_SETSTATUSMESSAGE 103 +#define IDR_MENU1 104 +#define IDI_LISTENINGTO 105 +#define IDI_RIGHT_ARROW 106 +#define IDI_LEFT_ARROW 107 +#define IDC_NICKNAME 1000 +#define IDC_SHOW_PROTO_NAME 1001 +#define IDC_CYCLE_THROUGH_PROTOS 1002 +#define IDC_TEXT_RTL 1003 +#define IDC_TEXT_ALIGN_RIGHT 1004 +#define IDC_REPLACE_SMILEYS 1005 +#define IDC_RESIZE_SMILEYS 1006 +#define IDC_RESIZE_FRAME 1007 +#define IDC_RESIZE_SMILEYS2 1008 +#define IDC_USE_CONTACT_LIST_SMILEYS 1008 +#define IDC_STATUSMESSAGE 1009 +#define IDC_GLOBAL_ON_NICKNAME 1009 +#define IDC_AVATAR_ALLOW_TO_GROW 1010 +#define IDC_GLOBAL_ON_STATUS_MESSAGE 1011 +#define IDC_GLOBAL_ON_STATUS 1012 +#define IDC_GLOBAL_ON_AVATAR 1013 +#define IDC_SHOW_CYCLE_PROTO_BUTTON 1014 +#define IDC_AVATAR_CUSTOM_CORNER_SIZE 1622 +#define IDC_AVATAR_CUSTOM_CORNER_SIZE_SPIN 1623 +#define IDC_BORDER_TOP 1624 +#define IDC_BORDER_TOP_SPIN 1625 +#define IDC_BORDER_LEFT 1626 +#define IDC_BORDER_LEFT_SPIN 1627 +#define IDC_BORDER_BOTTOM 1628 +#define IDC_BORDER_BOTTOM_SPIN 1629 +#define IDC_BORDER_RIGHT 1630 +#define IDC_BORDER_RIGHT_SPIN 1631 +#define IDC_CYCLE_TIME 1632 +#define IDC_CYCLE_TIME_SPIN 1633 +#define IDC_AVATAR_CUSTOM_SIZE 1634 +#define IDC_AVATAR_CUSTOM_SIZE_SPIN 1635 +#define IDC_AVATAR_CUSTOM_CORNER_SIZE_CHECK 1761 +#define IDC_AVATAR_DRAW_BORDER 1764 +#define IDC_AVATAR_CUSTOM_SIZE_CHK 1765 +#define IDC_AVATAR_ROUND_CORNERS 1800 +#define IDC_AVATAR_USE_FREE_SPACE 1801 +#define IDC_AVATAR_BORDER_COLOR_L 1839 +#define IDC_AVATAR_BORDER_COLOR 1840 +#define IDC_AVATAR_BKG_COLOR_L 1841 +#define IDC_AVATAR_BKG_COLOR 1842 +#define ID_CYCLE_THROUGH_PROTOS 40004 +#define ID_DONT_CYCLE_THROUGH_PROTOS 40005 +#define ID_SHOW_NEXT_PROTO 40006 +#define ID_SHOW_PREV_PROTO 40007 +#define ID_NICKPOPUP_SETMYNICKNAME 40008 +#define ID_STATUSMESSAGEPOPUP_SETMYSTATUSMESSAGE 40009 +#define ID_AVATARPOPUP_SETMYAVATAR 40010 +#define ID_LISTENINGTOPOPUP_SENDLISTENINGTO 40011 +#define ID_CONTEXTPOPUP_ENABLELISTENINGTO 40012 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 108 +#define _APS_NEXT_COMMAND_VALUE 40013 +#define _APS_NEXT_CONTROL_VALUE 1011 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/plugins/NewEventNotify/!changelog.txt b/plugins/NewEventNotify/!changelog.txt deleted file mode 100644 index 5c755ee40c..0000000000 --- a/plugins/NewEventNotify/!changelog.txt +++ /dev/null @@ -1,27 +0,0 @@ -0.2.2.4 -- support for unicode file events - -0.2.2.3 -- fixed possible crash during processing of custom events without preview - -0.2.2.2 -- fixed possible crash when processing system history events - -0.2.2.1 -- fixed possible crash with older Miranda IM - -0.2.2.0 -- minor fixes for popup merging -- improved popup for contacts event -- added support for custom database events (e.g. no more "Unknown event" for Jabber presence events) - -0.2.1.0 -- support for Message Dialog API -- fixed Auth events preview -- several other fixes & improvements - -0.2.0.0 -- support for new UTF-8 format of messages -- full Unicode support (2in1) -- new Miranda plug-in API -- some other fixes & tweaks diff --git a/plugins/NewEventNotify/docs/!changelog.txt b/plugins/NewEventNotify/docs/!changelog.txt new file mode 100644 index 0000000000..5c755ee40c --- /dev/null +++ b/plugins/NewEventNotify/docs/!changelog.txt @@ -0,0 +1,27 @@ +0.2.2.4 +- support for unicode file events + +0.2.2.3 +- fixed possible crash during processing of custom events without preview + +0.2.2.2 +- fixed possible crash when processing system history events + +0.2.2.1 +- fixed possible crash with older Miranda IM + +0.2.2.0 +- minor fixes for popup merging +- improved popup for contacts event +- added support for custom database events (e.g. no more "Unknown event" for Jabber presence events) + +0.2.1.0 +- support for Message Dialog API +- fixed Auth events preview +- several other fixes & improvements + +0.2.0.0 +- support for new UTF-8 format of messages +- full Unicode support (2in1) +- new Miranda plug-in API +- some other fixes & tweaks diff --git a/plugins/NewEventNotify/docs/neweventnotify-translation.txt b/plugins/NewEventNotify/docs/neweventnotify-translation.txt new file mode 100644 index 0000000000..3df8e8a907 --- /dev/null +++ b/plugins/NewEventNotify/docs/neweventnotify-translation.txt @@ -0,0 +1,56 @@ +; Common strings that belong to many files +;[] + +; ../../plugins/NewEventNotify/main.c +;[Message Received] +;[Message Session] + +; ../../plugins/NewEventNotify/menuitem.c +;[PopUps] + +; ../../plugins/NewEventNotify/popup.c +;[ added you to the contact list] +;[ requested authorization] +;[Number of new message: ] +;[Plugin Test] +;[Received %d contacts.] +;[This is a sample URL event ;-)] +;[This is a sample file event :-D] +;[This is a sample message event :-)] +;[This is a sample other event ;-D] + +; ../../plugins/NewEventNotify/resource.rc +;[Background] +;[Dismiss Event] +;[Dismiss Popup] +;[Don't show Popup when Message-Dialog is already open] +;[Edit] +;[File] +;[General Options] +;[Hide Popup when sending new message] +;[Last message display first] +;[Last message display last] +;[Left Click Actions] +;[Merge popups from one user] +;[Message] +;[Message-Event only] +;[No popups for RSS contacts] +;[No popups for read messages] +;[Notify me of ...] +;[Number of begin shown messages] +;[Open Event] +;[Open Reply-Dialog instead of reading the Message] +;[Others] +;[Popup Options] +;[Preview] +;[Right Click Actions] +;[Show Date] +;[Show Headers] +;[Show Preview of Event in Popup] +;[Show Time] +;[Show entry in the PopUps menu] +;[Temporarily disable Event Popups] +;[Text] +;[Time Expires Actions] +;[Time to expires] +;[URL] diff --git a/plugins/NewEventNotify/main.cpp b/plugins/NewEventNotify/main.cpp deleted file mode 100644 index 850a01fa7a..0000000000 --- a/plugins/NewEventNotify/main.cpp +++ /dev/null @@ -1,268 +0,0 @@ -/* - Name: NewEventNotify - Plugin for Miranda IM - File: main.c - Main DLL procedures - Version: 0.2.2.2 - Description: Notifies you about some events - Author: jokusoftware, - Date: 18.07.02 13:59 / Update: 22.10.07 19:56 - Copyright: (C) 2002 Starzinger Michael - - 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 "neweventnotify.h" - -int g_IsSrmmServiceAvail = 0; -int g_IsSrmmWindowAPI = 0; -extern PLUGIN_DATA* PopUpList[20]; - -//--------------------------- -//---Some global variables for the plugin - -HINSTANCE hInst; -PLUGIN_OPTIONS pluginOptions; -int hLangpack; -PLUGININFOEX pluginInfo = { - sizeof(PLUGININFOEX), - "NewEventNotify", - PLUGIN_MAKE_VERSION(0, VER_MAJOR, VER_MINOR, VER_BUILD), - "Notifies you when you receive a message, url, file or any other event by displaying a popup. Uses the PopUp-Plugin by hrk. " - "Original plugin was written by icebreaker, modified by Prezes and some " - "bugfixes were made by vj, vlko, Nightwish, TheLeech and others. More fixes & updates by Joe @ Whale", - "icebreaker, Prezes, vj, vlko, Joe @ Whale", - "jokusoftware@miranda-im.org", - "GNU GPL", - "http://nightly.miranda.im/", - UNICODE_AWARE, - {0x3503D584, 0x6234, 0x4BEF, {0xA5, 0x53, 0x6C, 0x1B, 0x9C, 0xD4, 0x71, 0xF2 } } // {3503D584-6234-4BEF-A553-6C1B9CD471F2} -}; - -//--------------------------- -//---Hooks - -//---Handles to my hooks, needed to unhook them again -HANDLE hHookedInit; -HANDLE hHookedOpt; -HANDLE hHookedNewEvent; -HANDLE hHookedDeletedEvent; - -//---Called when a new event is added to the database -int HookedNewEvent(WPARAM wParam, LPARAM lParam) -//wParam: contact-handle -//lParam: dbevent-handle -{ - HANDLE hContact = (HANDLE)wParam; - DBEVENTINFO dbe = {0}; - PLUGIN_DATA* pdata; - DBEVENTTYPEDESCR* pei; - - //are popups currently enabled? - if (pluginOptions.bDisable) - return 0; - - //get DBEVENTINFO without pBlob - dbe.cbSize = sizeof(dbe); - CallService(MS_DB_EVENT_GET, (WPARAM)lParam, (LPARAM)&dbe); - - // Nightwish (no popups for RSS contacts at all...) - if (pluginOptions.bNoRSS) - { - if (dbe.szModule != NULL) { - if (!strncmp(dbe.szModule, "RSS", 3)) - return 0; - } - } - - //do not show popups for sub-contacts - if (hContact && ServiceExists(MS_MC_GETMETACONTACT) && CallService(MS_MC_GETMETACONTACT, (WPARAM)hContact, 0)) - return 0; - - //is it an event info about online/offline status user - if (dbe.eventType == 25368) - return 0; - - //custom database event types - if (ServiceExists(MS_DB_EVENT_GETTYPE)) - { - pei = (DBEVENTTYPEDESCR*)CallService(MS_DB_EVENT_GETTYPE, (WPARAM)dbe.szModule, (LPARAM)dbe.eventType); - if (pei && pei->cbSize >= DBEVENTTYPEDESCR_SIZE && pei->flags & DETF_NONOTIFY) - // ignore events according to flags - return 0; - } - - //if event was allready read don't show it - if (pluginOptions.bReadCheck && (dbe.flags & DBEF_READ)) - return 0; - - //is it an event sent by the user? -> don't show - if (dbe.flags & DBEF_SENT) - { - if (pluginOptions.bHideSend && NumberPopupData(hContact, EVENTTYPE_MESSAGE) != -1) - { // JK, only message event, do not influence others - pdata = PopUpList[NumberPopupData(hContact, EVENTTYPE_MESSAGE)]; - PopupAct(pdata->hWnd, MASK_DISMISS, pdata); // JK, only dismiss, i.e. do not kill event (e.g. file transfer) - } - return 0; - } - //which status do we have, are we allowed to post popups? - //UNDER CONSTRUCTION!!! - CallService(MS_CLIST_GETSTATUSMODE, 0, 0); /// TODO: JK: ???? - - if (dbe.eventType == EVENTTYPE_MESSAGE && (pluginOptions.bMsgWindowCheck && hContact && CheckMsgWnd(hContact))) - return 0; - - //is another popup for this contact already present? -> merge message popups if enabled - if (dbe.eventType == EVENTTYPE_MESSAGE && (pluginOptions.bMergePopup && NumberPopupData(hContact, EVENTTYPE_MESSAGE) != -1)) - { // JK, only merge with message events, do not mess with others - PopupUpdate(hContact, (HANDLE)lParam); - } - else - { //now finally show a popup - PopupShow(&pluginOptions, hContact, (HANDLE)lParam, (UINT)dbe.eventType); - } - return 0; -} - -//---Called when all the modules are loaded -int HookedInit(WPARAM wParam, LPARAM lParam) -{ - hHookedNewEvent = HookEvent(ME_DB_EVENT_ADDED, HookedNewEvent); - // Plugin sweeper support - if (ServiceExists("PluginSweeper/Add")) - CallService("PluginSweeper/Add", (WPARAM)MODULE, (LPARAM)MODULE); - - if (ServiceExists(MS_MSG_GETWINDOWDATA)) - g_IsSrmmWindowAPI = 1; - else - g_IsSrmmWindowAPI = 0; - - if (ServiceExists(MS_MSG_MOD_MESSAGEDIALOGOPENED)) - g_IsSrmmServiceAvail = 1; - else - g_IsSrmmServiceAvail = 0; - - return 0; -} - -//---Called when an options dialog has to be created -int HookedOptions(WPARAM wParam, LPARAM lParam) -{ - OptionsAdd(hInst, wParam); - - return 0; -} - -//--------------------------- -//---Exported Functions - -extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) -{ - return &pluginInfo; -} - -extern "C" __declspec(dllexport) const MUUID MirandaInterfaces[] = {MIID_EVENTNOTIFY, MIID_LAST}; - -extern "C" __declspec(dllexport) int Load(void) -{ - hHookedInit = HookEvent(ME_SYSTEM_MODULESLOADED, HookedInit); - hHookedOpt = HookEvent(ME_OPT_INITIALISE, HookedOptions); - - mir_getLP(&pluginInfo); - - OptionsInit(&pluginOptions); - pluginOptions.hInst = hInst; - - if (pluginOptions.bMenuitem) - MenuitemInit(!pluginOptions.bDisable); - - return 0; -} - -extern "C" __declspec(dllexport) int Unload(void) -{ - UnhookEvent(hHookedNewEvent); - UnhookEvent(hHookedOpt); - UnhookEvent(hHookedInit); - return 0; -} - -BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) -{ - hInst=hinstDLL; - return TRUE; -} - -//------------------------------------- -//---Check Window Message function - -// Took this snippet of code from "EventNotify" by micron-x, thx *g* -// checks if the message-dialog window is already opened -// return values: -// 0 - No window found -// 1 - Split-mode window found -// 2 - Single-mode window found - -int CheckMsgWnd(HANDLE hContact) -{ - if (g_IsSrmmWindowAPI) { - MessageWindowData mwd; - MessageWindowInputData mwid; - mwid.cbSize = sizeof(MessageWindowInputData); - mwid.hContact = hContact; - mwid.uFlags = MSG_WINDOW_UFLAG_MSG_BOTH; - mwd.cbSize = sizeof(MessageWindowData); - mwd.hContact = hContact; - if (!CallService(MS_MSG_GETWINDOWDATA, (WPARAM) &mwid, (LPARAM) &mwd)) { - if (mwd.hwndWindow != NULL && (mwd.uState & MSG_WINDOW_STATE_EXISTS)) return 1; - } - } - if (g_IsSrmmServiceAvail) { // use the service provided by tabSRMM - if (CallService(MS_MSG_MOD_MESSAGEDIALOGOPENED, (WPARAM)hContact, 0)) - return 1; - else - return 0; - } - else - { // old way: find it by using the window class & title - TCHAR newtitle[256]; - char *szProto; - TCHAR *contactName, *szStatus; - - szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); - contactName = (TCHAR*)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hContact, GCDNF_TCHAR); - szStatus = (TCHAR*)CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, szProto?DBGetContactSettingWord(hContact,szProto,"Status",ID_STATUS_OFFLINE):ID_STATUS_OFFLINE, GSMDF_TCHAR); - - // vj: This code was added by preeze and it does not work: - // vlko: it maybe work with other plugins - mir_sntprintf(newtitle, SIZEOF(newtitle), _T("%s (%s)"), contactName, szStatus); - if(FindWindow(_T("TMsgWindow"), newtitle)) - return 2; - - mir_sntprintf(newtitle, SIZEOF(newtitle), _T("[%s (%s)]"), contactName, szStatus); - if(FindWindow(_T("TfrmContainer"), newtitle)) - return 1; - - // vj: I have restored this code from original plugin's source: (NewEventNotify 0.0.4) - mir_sntprintf(newtitle, SIZEOF(newtitle), _T("%s (%s): %s"), contactName, szStatus, TranslateT("Message Session")); - if(FindWindow(_T("#32770"), newtitle)) // JK, this works for old SRMMs (1.0.4.x) and for mine SRMMJ - return 1; - - mir_sntprintf(newtitle, SIZEOF(newtitle), _T("%s (%s): %s"), contactName, szStatus, TranslateT("Message Received")); - if(FindWindow(_T("#32770"), newtitle)) - return 2; - - return 0; - } -} \ No newline at end of file diff --git a/plugins/NewEventNotify/menuitem.cpp b/plugins/NewEventNotify/menuitem.cpp deleted file mode 100644 index 6831c204a1..0000000000 --- a/plugins/NewEventNotify/menuitem.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/* - Name: NewEventNotify - Plugin for Miranda IM - File: menuitem.c - Manages item(s) in the Miranda Menu - Version: 0.0.4 - Description: Notifies you about some events - Author: icebreaker, - Date: 22.07.02 19:56 / Update: 24.07.02 01:39 - Copyright: (C) 2002 Starzinger Michael - - 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 "neweventnotify.h" - -CLISTMENUITEM menuitem; -HANDLE hMenuitemNotify; -BOOL bNotify; - -static INT_PTR MenuitemNotifyCmd(WPARAM wParam,LPARAM lParam) -{ - bNotify = !bNotify; - MenuitemUpdate(bNotify); - - //write changes to options->bDisable and into database - Opt_DisableNEN(!bNotify); - return 0; -} - -int MenuitemUpdate(BOOL bStatus) -{ - //menuitem.flags = CMIM_FLAGS | (bStatus ? CMIF_CHECKED : 0); - menuitem.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(bStatus ? IDI_ENABLED : IDI_DISABLED)); - if (bStatus) - menuitem.ptszName = TranslateT(MENUITEM_DISABLE); - else - menuitem.ptszName = TranslateT(MENUITEM_ENABLE); - menuitem.flags = CMIM_ICON | CMIM_NAME | CMIF_KEEPUNTRANSLATED | CMIF_TCHAR; - CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hMenuitemNotify, (LPARAM)&menuitem); - - return 0; -} - -int MenuitemInit(BOOL bStatus) -{ - CreateServiceFunction(MS_NEN_MENUNOTIFY, MenuitemNotifyCmd); - - ZeroMemory(&menuitem, sizeof(menuitem)); - menuitem.cbSize = sizeof(CLISTMENUITEM); - menuitem.position = 1; - menuitem.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ENABLED)); - menuitem.ptszPopupName = TranslateT("PopUps"); - menuitem.pszService = MS_NEN_MENUNOTIFY; - menuitem.flags = CMIF_KEEPUNTRANSLATED | CMIF_TCHAR; - hMenuitemNotify = Menu_AddMainMenuItem(&menuitem); - - bNotify = bStatus; - MenuitemUpdate(bNotify); - - return 0; -} diff --git a/plugins/NewEventNotify/neweventnotify-translation.txt b/plugins/NewEventNotify/neweventnotify-translation.txt deleted file mode 100644 index 3df8e8a907..0000000000 --- a/plugins/NewEventNotify/neweventnotify-translation.txt +++ /dev/null @@ -1,56 +0,0 @@ -; Common strings that belong to many files -;[] - -; ../../plugins/NewEventNotify/main.c -;[Message Received] -;[Message Session] - -; ../../plugins/NewEventNotify/menuitem.c -;[PopUps] - -; ../../plugins/NewEventNotify/popup.c -;[ added you to the contact list] -;[ requested authorization] -;[Number of new message: ] -;[Plugin Test] -;[Received %d contacts.] -;[This is a sample URL event ;-)] -;[This is a sample file event :-D] -;[This is a sample message event :-)] -;[This is a sample other event ;-D] - -; ../../plugins/NewEventNotify/resource.rc -;[Background] -;[Dismiss Event] -;[Dismiss Popup] -;[Don't show Popup when Message-Dialog is already open] -;[Edit] -;[File] -;[General Options] -;[Hide Popup when sending new message] -;[Last message display first] -;[Last message display last] -;[Left Click Actions] -;[Merge popups from one user] -;[Message] -;[Message-Event only] -;[No popups for RSS contacts] -;[No popups for read messages] -;[Notify me of ...] -;[Number of begin shown messages] -;[Open Event] -;[Open Reply-Dialog instead of reading the Message] -;[Others] -;[Popup Options] -;[Preview] -;[Right Click Actions] -;[Show Date] -;[Show Headers] -;[Show Preview of Event in Popup] -;[Show Time] -;[Show entry in the PopUps menu] -;[Temporarily disable Event Popups] -;[Text] -;[Time Expires Actions] -;[Time to expires] -;[URL] diff --git a/plugins/NewEventNotify/neweventnotify.h b/plugins/NewEventNotify/neweventnotify.h deleted file mode 100644 index 3818e410e9..0000000000 --- a/plugins/NewEventNotify/neweventnotify.h +++ /dev/null @@ -1,234 +0,0 @@ -/* - Name: NewEventNotify - Plugin for Miranda IM - File: neweventnotify.h - Main Header File - Version: 0.2.2.2 - Description: Notifies you about some events - Author: icebreaker, - Date: 18.07.02 13:59 / Update: 16.09.02 17:45 - Copyright: (C) 2002 Starzinger Michael - - 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 -*/ - -//--------------------------- -//---Includes -#define _CRT_SECURE_NO_WARNINGS -#define _CRT_NONSTDC_NO_DEPRECATE - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "resource.h" - -//VERY_PUBLIC Begin ... will be moved to m_neweventnotify.h -#define MS_NEN_MENUNOTIFY "NewEventNotify/MenuitemNotifyCommand" -//VERY_PUBLIC End - -#define MS_MSG_MOD_MESSAGEDIALOGOPENED "SRMsg_MOD/MessageDialogOpened" - -//--------------------------- -//---Definitions - -#define MODULE "NewEventNotify" -#define VER_MAJOR 2 -#define VER_MINOR 2 -#define VER_BUILD 3 -#define MAX_POPUPS 20 - -#define DEFAULT_COLBACK RGB(255,255,128) -#define DEFAULT_COLTEXT RGB(0,0,0) -#define DEFAULT_MASKNOTIFY (MASK_MESSAGE|MASK_URL|MASK_FILE|MASK_OTHER) -#define DEFAULT_MASKACTL (MASK_OPEN|MASK_REMOVE|MASK_DISMISS) -#define DEFAULT_MASKACTR (MASK_REMOVE|MASK_DISMISS) -#define DEFAULT_MASKACTE (MASK_DISMISS) -#define DEFAULT_DELAY -1 - -#define MASK_MESSAGE 0x0001 -#define MASK_URL 0x0002 -#define MASK_FILE 0x0004 -#define MASK_OTHER 0x0008 - -#define MASK_DISMISS 0x0001 -#define MASK_OPEN 0x0002 -#define MASK_REMOVE 0x0004 - -#define SETTING_LIFETIME_MIN 1 -#define SETTING_LIFETIME_MAX 60 -#define SETTING_LIFETIME_DEFAULT 20 - -#define MAX_DATASIZE 24 - -#ifndef WM_MOUSEWHEEL - #define WM_MOUSEWHEEL 0x020A -#endif -#define TIMER_TO_ACTION 50685 - -//Entries in the database, don't translate -#define OPT_DISABLE "Disabled" -#define OPT_PREVIEW "Preview" -#define OPT_MENUITEM "MenuItem" -#define OPT_COLDEFAULT_MESSAGE "DefaultColorMsg" -#define OPT_COLBACK_MESSAGE "ColorBackMsg" -#define OPT_COLTEXT_MESSAGE "ColorTextMsg" -#define OPT_COLDEFAULT_URL "DefaultColorUrl" -#define OPT_COLBACK_URL "ColorBackUrl" -#define OPT_COLTEXT_URL "ColorTextUrl" -#define OPT_COLDEFAULT_FILE "DefaultColorFile" -#define OPT_COLBACK_FILE "ColorBackFile" -#define OPT_COLTEXT_FILE "ColorTextFile" -#define OPT_COLDEFAULT_OTHERS "DefaultColorOthers" -#define OPT_COLBACK_OTHERS "ColorBackOthers" -#define OPT_COLTEXT_OTHERS "ColorTextOthers" -#define OPT_MASKNOTIFY "Notify" -#define OPT_MASKACTL "ActionLeft" -#define OPT_MASKACTR "ActionRight" -#define OPT_MASKACTTE "ActionTimeExpires" -#define OPT_MSGWINDOWCHECK "WindowCheck" -#define OPT_MSGREPLYWINDOW "ReplyWindow" -#define OPT_MERGEPOPUP "MergePopup" -#define OPT_DELAY_MESSAGE "DelayMessage" -#define OPT_DELAY_URL "DelayUrl" -#define OPT_DELAY_FILE "DelayFile" -#define OPT_DELAY_OTHERS "DelayOthers" -#define OPT_SHOW_DATE "ShowDate" -#define OPT_SHOW_TIME "ShowTime" -#define OPT_SHOW_HEADERS "ShowHeaders" -#define OPT_NUMBER_MSG "NumberMsg" -#define OPT_SHOW_ON "ShowOldOrNew" -#define OPT_HIDESEND "HideSend" -#define OPT_NORSS "NoRSSAnnounces" -#define OPT_READCHECK "ReadCheck" -//--------------------------- -//---Translateable Strings - -#define POPUP_COMMENT_MESSAGE "Message" -#define POPUP_COMMENT_URL "URL" -#define POPUP_COMMENT_FILE "File" -#define POPUP_COMMENT_CONTACTS "Contacts" -#define POPUP_COMMENT_ADDED "You were added!" -#define POPUP_COMMENT_AUTH "Requests your authorisation" -#define POPUP_COMMENT_WEBPAGER "ICQ Web pager" -#define POPUP_COMMENT_EMAILEXP "ICQ Email express" -#define POPUP_COMMENT_OTHER "Unknown Event" - -#define MENUITEM_NAME "Notify of new events" - -#define MENUITEM_ENABLE "Enable new event notification" -#define MENUITEM_DISABLE "Disable new event notification" - -//--------------------------- -//---Structures - -struct PLUGIN_OPTIONS -{ - HINSTANCE hInst; - BOOL bDisable; - BOOL bPreview; - BOOL bMenuitem; - BOOL bDefaultColorMsg; - BOOL bDefaultColorUrl; - BOOL bDefaultColorFile; - BOOL bDefaultColorOthers; - COLORREF colBackMsg; - COLORREF colTextMsg; - COLORREF colBackUrl; - COLORREF colTextUrl; - COLORREF colBackFile; - COLORREF colTextFile; - COLORREF colBackOthers; - COLORREF colTextOthers; - UINT maskNotify; - UINT maskActL; - UINT maskActR; - UINT maskActTE; - BOOL bMsgWindowCheck; - BOOL bMsgReplyWindow; - int iDelayMsg; - int iDelayUrl; - int iDelayFile; - int iDelayOthers; - int iDelayDefault; - BOOL bMergePopup; - BOOL bShowDate; - BOOL bShowTime; - BOOL bShowHeaders; - BYTE iNumberMsg; - BOOL bShowON; - BOOL bHideSend; - BOOL bNoRSS; - BOOL bReadCheck; -}; - -struct EVENT_DATA_EX -{ - HANDLE hEvent; - int number; - struct EVENT_DATA_EX* next; - struct EVENT_DATA_EX* prev; -}; - -struct PLUGIN_DATA -{ - UINT eventType; - HANDLE hContact; - PLUGIN_OPTIONS* pluginOptions; - HWND hWnd; - struct EVENT_DATA_EX* firstEventData; - struct EVENT_DATA_EX* firstShowEventData; - struct EVENT_DATA_EX* lastEventData; - long countEvent; - long iSeconds; - int iLock; -}; - -//--------------------------- -//---External Procedure Definitions - -int PopupShow(PLUGIN_OPTIONS* pluginOptions, HANDLE hContact, HANDLE hEvent, UINT eventType); -int PopupUpdate(HANDLE hContact, HANDLE hEvent); -int PopupPreview(PLUGIN_OPTIONS* pluginOptions); -int PopupAct(HWND hWnd, UINT mask, PLUGIN_DATA* pdata); -int OptionsInit(PLUGIN_OPTIONS* pluginOptions); -int OptionsAdd(HINSTANCE hInst, WPARAM addInfo); -int Opt_DisableNEN(BOOL Status); -int MenuitemInit(BOOL bStatus); -int MenuitemUpdate(BOOL bStatus); -int NumberPopupData(HANDLE hContact, int eventType); -int CheckMsgWnd(HANDLE hContact); - -extern HINSTANCE hInst; diff --git a/plugins/NewEventNotify/neweventnotify.vcxproj b/plugins/NewEventNotify/neweventnotify.vcxproj index d2e776cd08..7f7b394793 100644 --- a/plugins/NewEventNotify/neweventnotify.vcxproj +++ b/plugins/NewEventNotify/neweventnotify.vcxproj @@ -78,7 +78,7 @@ true EditAndContinue ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;_USRDLL;NEWEVENTNOTIFY_EXPORTS;%(PreprocessorDefinitions) + WIN32;_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) EnableFastChecks @@ -101,7 +101,7 @@ Disabled Level3 ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) - WIN64;_DEBUG;_WINDOWS;_USRDLL;NEWEVENTNOTIFY_EXPORTS;%(PreprocessorDefinitions) + WIN64;_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) EnableFastChecks @@ -125,7 +125,7 @@ Full Level3 ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;_USRDLL;NEWEVENTNOTIFY_EXPORTS;%(PreprocessorDefinitions) + WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) Size @@ -151,7 +151,7 @@ Full Level3 ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) - WIN64;NDEBUG;_WINDOWS;_USRDLL;NEWEVENTNOTIFY_EXPORTS;%(PreprocessorDefinitions) + WIN64;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) Size @@ -170,21 +170,17 @@ - - - - + + + + - - + + - - - - - + diff --git a/plugins/NewEventNotify/neweventnotify.vcxproj.filters b/plugins/NewEventNotify/neweventnotify.vcxproj.filters index 8e60643dca..533d2bbf39 100644 --- a/plugins/NewEventNotify/neweventnotify.vcxproj.filters +++ b/plugins/NewEventNotify/neweventnotify.vcxproj.filters @@ -15,38 +15,30 @@ - + Source Files - + Source Files - + Source Files - + Source Files - + Header Files - + Header Files - + Resource Files - - - Resource Files - - - Resource Files - - \ No newline at end of file diff --git a/plugins/NewEventNotify/options.cpp b/plugins/NewEventNotify/options.cpp deleted file mode 100644 index 2e22a9f5cd..0000000000 --- a/plugins/NewEventNotify/options.cpp +++ /dev/null @@ -1,332 +0,0 @@ -/* - Name: NewEventNotify - Plugin for Miranda IM - File: options.c - Manages Option Dialogs and Settings - Version: 0.0.4 - Description: Notifies you about some events - Author: icebreaker, - Date: 22.07.02 13:06 / Update: 16.09.02 17:45 - Copyright: (C) 2002 Starzinger Michael - - 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 "neweventnotify.h" - -PLUGIN_OPTIONS* options; -BOOL bWmNotify; - -int OptionsRead(void) -{ - options->bDisable = DBGetContactSettingByte(NULL, MODULE, OPT_DISABLE, FALSE); - options->bPreview = DBGetContactSettingByte(NULL, MODULE, OPT_PREVIEW, TRUE); - options->bMenuitem = DBGetContactSettingByte(NULL, MODULE, OPT_MENUITEM, FALSE); - options->bDefaultColorMsg = DBGetContactSettingByte(NULL, MODULE, OPT_COLDEFAULT_MESSAGE, FALSE); - options->bDefaultColorUrl = DBGetContactSettingByte(NULL, MODULE, OPT_COLDEFAULT_URL, FALSE); - options->bDefaultColorFile = DBGetContactSettingByte(NULL, MODULE, OPT_COLDEFAULT_FILE, FALSE); - options->bDefaultColorOthers = DBGetContactSettingByte(NULL, MODULE, OPT_COLDEFAULT_OTHERS, FALSE); - options->colBackMsg = (COLORREF)DBGetContactSettingDword(NULL, MODULE, OPT_COLBACK_MESSAGE, DEFAULT_COLBACK); - options->colTextMsg = (COLORREF)DBGetContactSettingDword(NULL, MODULE, OPT_COLTEXT_MESSAGE, DEFAULT_COLTEXT); - options->colBackUrl = (COLORREF)DBGetContactSettingDword(NULL, MODULE, OPT_COLBACK_URL, DEFAULT_COLBACK); - options->colTextUrl = (COLORREF)DBGetContactSettingDword(NULL, MODULE, OPT_COLTEXT_URL, DEFAULT_COLTEXT); - options->colBackFile = (COLORREF)DBGetContactSettingDword(NULL, MODULE, OPT_COLBACK_FILE, DEFAULT_COLBACK); - options->colTextFile = (COLORREF)DBGetContactSettingDword(NULL, MODULE, OPT_COLTEXT_FILE, DEFAULT_COLTEXT); - options->colBackOthers = (COLORREF)DBGetContactSettingDword(NULL, MODULE, OPT_COLBACK_OTHERS, DEFAULT_COLBACK); - options->colTextOthers = (COLORREF)DBGetContactSettingDword(NULL, MODULE, OPT_COLTEXT_OTHERS, DEFAULT_COLTEXT); - options->maskNotify = (UINT)DBGetContactSettingByte(NULL, MODULE, OPT_MASKNOTIFY, DEFAULT_MASKNOTIFY); - options->maskActL = (UINT)DBGetContactSettingByte(NULL, MODULE, OPT_MASKACTL, DEFAULT_MASKACTL); - options->maskActR = (UINT)DBGetContactSettingByte(NULL, MODULE, OPT_MASKACTR, DEFAULT_MASKACTR); - options->maskActTE = (UINT)DBGetContactSettingByte(NULL, MODULE, OPT_MASKACTTE, DEFAULT_MASKACTE); - options->bMsgWindowCheck = DBGetContactSettingByte(NULL, MODULE, OPT_MSGWINDOWCHECK, TRUE); - options->bMsgReplyWindow = DBGetContactSettingByte(NULL, MODULE, OPT_MSGREPLYWINDOW, FALSE); - options->bMergePopup = DBGetContactSettingByte(NULL, MODULE, OPT_MERGEPOPUP, TRUE); - options->iDelayMsg = (int)DBGetContactSettingDword(NULL, MODULE, OPT_DELAY_MESSAGE, DEFAULT_DELAY); - options->iDelayUrl = (int)DBGetContactSettingDword(NULL, MODULE, OPT_DELAY_URL, DEFAULT_DELAY); - options->iDelayFile = (int)DBGetContactSettingDword(NULL, MODULE, OPT_DELAY_FILE, DEFAULT_DELAY); - options->iDelayOthers = (int)DBGetContactSettingDword(NULL, MODULE, OPT_DELAY_OTHERS, DEFAULT_DELAY); - options->iDelayDefault = (int)DBGetContactSettingRangedWord(NULL, "PopUp", "Seconds", SETTING_LIFETIME_DEFAULT, SETTING_LIFETIME_MIN, SETTING_LIFETIME_MAX); - options->bShowDate = DBGetContactSettingByte(NULL, MODULE, OPT_SHOW_DATE, TRUE); - options->bShowTime = DBGetContactSettingByte(NULL, MODULE, OPT_SHOW_TIME, TRUE); - options->bShowHeaders = DBGetContactSettingByte(NULL, MODULE, OPT_SHOW_HEADERS, TRUE); - options->iNumberMsg = (BYTE)DBGetContactSettingByte(NULL, MODULE, OPT_NUMBER_MSG, TRUE); - options->bShowON = DBGetContactSettingByte(NULL, MODULE, OPT_SHOW_ON, TRUE); - options->bHideSend = DBGetContactSettingByte(NULL, MODULE, OPT_HIDESEND, TRUE); - options->bNoRSS = DBGetContactSettingByte(NULL, MODULE, OPT_NORSS, FALSE); - options->bReadCheck = DBGetContactSettingByte(NULL, MODULE, OPT_READCHECK, FALSE); - return 0; -} - -int OptionsWrite(void) -{ - DBWriteContactSettingByte(NULL, MODULE, OPT_DISABLE, options->bDisable); - DBWriteContactSettingByte(NULL, MODULE, OPT_PREVIEW, options->bPreview); - DBWriteContactSettingByte(NULL, MODULE, OPT_MENUITEM, options->bMenuitem); - DBWriteContactSettingByte(NULL, MODULE, OPT_COLDEFAULT_MESSAGE, options->bDefaultColorMsg); - DBWriteContactSettingByte(NULL, MODULE, OPT_COLDEFAULT_URL, options->bDefaultColorUrl); - DBWriteContactSettingByte(NULL, MODULE, OPT_COLDEFAULT_FILE, options->bDefaultColorFile); - DBWriteContactSettingByte(NULL, MODULE, OPT_COLDEFAULT_OTHERS, options->bDefaultColorOthers); - DBWriteContactSettingDword(NULL, MODULE, OPT_COLBACK_MESSAGE, (DWORD)options->colBackMsg); - DBWriteContactSettingDword(NULL, MODULE, OPT_COLTEXT_MESSAGE, (DWORD)options->colTextMsg); - DBWriteContactSettingDword(NULL, MODULE, OPT_COLBACK_URL, (DWORD)options->colBackUrl); - DBWriteContactSettingDword(NULL, MODULE, OPT_COLTEXT_URL, (DWORD)options->colTextUrl); - DBWriteContactSettingDword(NULL, MODULE, OPT_COLBACK_FILE, (DWORD)options->colBackFile); - DBWriteContactSettingDword(NULL, MODULE, OPT_COLTEXT_FILE, (DWORD)options->colTextFile); - DBWriteContactSettingDword(NULL, MODULE, OPT_COLBACK_OTHERS, (DWORD)options->colBackOthers); - DBWriteContactSettingDword(NULL, MODULE, OPT_COLTEXT_OTHERS, (DWORD)options->colTextOthers); - DBWriteContactSettingByte(NULL, MODULE, OPT_MASKNOTIFY, (BYTE)options->maskNotify); - DBWriteContactSettingByte(NULL, MODULE, OPT_MASKACTL, (BYTE)options->maskActL); - DBWriteContactSettingByte(NULL, MODULE, OPT_MASKACTR, (BYTE)options->maskActR); - DBWriteContactSettingByte(NULL, MODULE, OPT_MASKACTTE, (BYTE)options->maskActTE); - DBWriteContactSettingByte(NULL, MODULE, OPT_MSGWINDOWCHECK, options->bMsgWindowCheck); - DBWriteContactSettingByte(NULL, MODULE, OPT_MSGREPLYWINDOW, options->bMsgReplyWindow); - DBWriteContactSettingByte(NULL, MODULE, OPT_MERGEPOPUP, options->bMergePopup); - DBWriteContactSettingDword(NULL, MODULE, OPT_DELAY_MESSAGE, (DWORD)options->iDelayMsg); - DBWriteContactSettingDword(NULL, MODULE, OPT_DELAY_URL, (DWORD)options->iDelayUrl); - DBWriteContactSettingDword(NULL, MODULE, OPT_DELAY_FILE, (DWORD)options->iDelayFile); - DBWriteContactSettingDword(NULL, MODULE, OPT_DELAY_OTHERS, (DWORD)options->iDelayOthers); - DBWriteContactSettingByte(NULL, MODULE, OPT_SHOW_DATE, options->bShowDate); - DBWriteContactSettingByte(NULL, MODULE, OPT_SHOW_TIME, options->bShowTime); - DBWriteContactSettingByte(NULL, MODULE, OPT_SHOW_HEADERS, options->bShowHeaders); - DBWriteContactSettingByte(NULL, MODULE, OPT_NUMBER_MSG, (BYTE)options->iNumberMsg); - DBWriteContactSettingByte(NULL, MODULE, OPT_SHOW_ON, options->bShowON); - DBWriteContactSettingByte(NULL, MODULE, OPT_HIDESEND, options->bHideSend); - DBWriteContactSettingByte(NULL, MODULE, OPT_NORSS, options->bNoRSS); - DBWriteContactSettingByte(NULL, MODULE, OPT_READCHECK, options->bReadCheck); - return 0; -} - -static void SetCheckBoxState(HWND hWnd, int iCtrl, BOOL bState) -{ - CheckDlgButton(hWnd, iCtrl, bState ? BST_CHECKED : BST_UNCHECKED); -} - -static void EnableDlgItem(HWND hWnd, int iCtrl, BOOL bEnable) -{ - EnableWindow(GetDlgItem(hWnd, iCtrl), bEnable); -} - -static void UpdateOptionsDlgItemsState(HWND hWnd) -{ - //disable color picker when using default colors - EnableDlgItem(hWnd, IDC_COLBACK_MESSAGE, !options->bDefaultColorMsg); - EnableDlgItem(hWnd, IDC_COLTEXT_MESSAGE, !options->bDefaultColorMsg); - EnableDlgItem(hWnd, IDC_COLBACK_URL, !options->bDefaultColorUrl); - EnableDlgItem(hWnd, IDC_COLTEXT_URL, !options->bDefaultColorUrl); - EnableDlgItem(hWnd, IDC_COLBACK_FILE, !options->bDefaultColorFile); - EnableDlgItem(hWnd, IDC_COLTEXT_FILE, !options->bDefaultColorFile); - EnableDlgItem(hWnd, IDC_COLBACK_OTHERS, !options->bDefaultColorOthers); - EnableDlgItem(hWnd, IDC_COLTEXT_OTHERS, !options->bDefaultColorOthers); - //disable merge messages options when is not using - EnableDlgItem(hWnd, IDC_CHKSHOWDATE, options->bMergePopup); - EnableDlgItem(hWnd, IDC_CHKSHOWTIME, options->bMergePopup); - EnableDlgItem(hWnd, IDC_CHKSHOWHEADERS, options->bMergePopup); - EnableDlgItem(hWnd, IDC_CMDEDITHEADERS, options->bMergePopup && options->bShowHeaders); - EnableDlgItem(hWnd, IDC_NUMBERMSG, options->bMergePopup); - EnableDlgItem(hWnd, IDC_LBNUMBERMSG, options->bMergePopup); - EnableDlgItem(hWnd, IDC_RDNEW, options->bMergePopup && options->iNumberMsg); - EnableDlgItem(hWnd, IDC_RDOLD, options->bMergePopup && options->iNumberMsg); - //disable delay textbox when infinite is checked - EnableDlgItem(hWnd, IDC_DELAY_MESSAGE, options->iDelayMsg != -1); - EnableDlgItem(hWnd, IDC_DELAY_URL, options->iDelayUrl != -1); - EnableDlgItem(hWnd, IDC_DELAY_FILE, options->iDelayFile != -1); - EnableDlgItem(hWnd, IDC_DELAY_OTHERS, options->iDelayOthers != -1); -} - -static INT_PTR CALLBACK OptionsDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch (message) - { - case WM_INITDIALOG: - TranslateDialogDefault(hWnd); - //make dialog represent the current options - bWmNotify = TRUE; - SendDlgItemMessage(hWnd, IDC_COLBACK_MESSAGE, CPM_SETCOLOUR, 0, options->colBackMsg); - SendDlgItemMessage(hWnd, IDC_COLTEXT_MESSAGE, CPM_SETCOLOUR, 0, options->colTextMsg); - SendDlgItemMessage(hWnd, IDC_COLBACK_URL, CPM_SETCOLOUR, 0, options->colBackUrl); - SendDlgItemMessage(hWnd, IDC_COLTEXT_URL, CPM_SETCOLOUR, 0, options->colTextUrl); - SendDlgItemMessage(hWnd, IDC_COLBACK_FILE, CPM_SETCOLOUR, 0, options->colBackFile); - SendDlgItemMessage(hWnd, IDC_COLTEXT_FILE, CPM_SETCOLOUR, 0, options->colTextFile); - SendDlgItemMessage(hWnd, IDC_COLBACK_OTHERS, CPM_SETCOLOUR, 0, options->colBackOthers); - SendDlgItemMessage(hWnd, IDC_COLTEXT_OTHERS, CPM_SETCOLOUR, 0, options->colTextOthers); - SetCheckBoxState(hWnd, IDC_CHKDEFAULTCOL_MESSAGE, options->bDefaultColorMsg); - SetCheckBoxState(hWnd, IDC_CHKDEFAULTCOL_URL, options->bDefaultColorUrl); - SetCheckBoxState(hWnd, IDC_CHKDEFAULTCOL_FILE, options->bDefaultColorFile); - SetCheckBoxState(hWnd, IDC_CHKDEFAULTCOL_OTHERS, options->bDefaultColorOthers); - SetCheckBoxState(hWnd, IDC_CHKMENUITEM, options->bMenuitem); - SetCheckBoxState(hWnd, IDC_CHKDISABLE, options->bDisable); - SetCheckBoxState(hWnd, IDC_CHKPREVIEW, options->bPreview); - SetCheckBoxState(hWnd, IDC_CHKMERGEPOPUP, options->bMergePopup); - SetCheckBoxState(hWnd, IDC_CHKNOTIFY_MESSAGE, options->maskNotify & MASK_MESSAGE); - SetCheckBoxState(hWnd, IDC_CHKNOTIFY_URL, options->maskNotify & MASK_URL); - SetCheckBoxState(hWnd, IDC_CHKNOTIFY_FILE, options->maskNotify & MASK_FILE); - SetCheckBoxState(hWnd, IDC_CHKNOTIFY_OTHER, options->maskNotify & MASK_OTHER); - SetCheckBoxState(hWnd, IDC_CHKACTL_DISMISS, options->maskActL & MASK_DISMISS); - SetCheckBoxState(hWnd, IDC_CHKACTL_OPEN, options->maskActL & MASK_OPEN); - SetCheckBoxState(hWnd, IDC_CHKACTL_REMOVE, options->maskActL & MASK_REMOVE); - SetCheckBoxState(hWnd, IDC_CHKACTR_DISMISS, options->maskActR & MASK_DISMISS); - SetCheckBoxState(hWnd, IDC_CHKACTR_OPEN, options->maskActR & MASK_OPEN); - SetCheckBoxState(hWnd, IDC_CHKACTR_REMOVE, options->maskActR & MASK_REMOVE); - SetCheckBoxState(hWnd, IDC_CHKACTTE_DISMISS, options->maskActTE & MASK_DISMISS); - SetCheckBoxState(hWnd, IDC_CHKACTTE_OPEN, options->maskActTE & MASK_OPEN); - SetCheckBoxState(hWnd, IDC_CHKACTTE_REMOVE, options->maskActTE & MASK_REMOVE); - SetCheckBoxState(hWnd, IDC_CHKWINDOWCHECK, options->bMsgWindowCheck); - SetCheckBoxState(hWnd, IDC_CHKREPLYWINDOW, options->bMsgReplyWindow); - SetCheckBoxState(hWnd, IDC_CHKSHOWDATE, options->bShowDate); - SetCheckBoxState(hWnd, IDC_CHKSHOWTIME, options->bShowTime); - SetCheckBoxState(hWnd, IDC_CHKSHOWHEADERS, options->bShowHeaders); - SetCheckBoxState(hWnd, IDC_RDNEW, !options->bShowON); - SetCheckBoxState(hWnd, IDC_RDOLD, options->bShowON); - SetCheckBoxState(hWnd, IDC_CHKHIDESEND, options->bHideSend); - SetCheckBoxState(hWnd, IDC_SUPRESSRSS, options->bNoRSS); - SetCheckBoxState(hWnd, IDC_READCHECK, options->bReadCheck); - SetCheckBoxState(hWnd, IDC_CHKINFINITE_MESSAGE, options->iDelayMsg == -1); - SetCheckBoxState(hWnd, IDC_CHKINFINITE_URL, options->iDelayUrl == -1); - SetCheckBoxState(hWnd, IDC_CHKINFINITE_FILE, options->iDelayFile == -1); - SetCheckBoxState(hWnd, IDC_CHKINFINITE_OTHERS, options->iDelayOthers == -1); - SetDlgItemInt(hWnd, IDC_DELAY_MESSAGE, options->iDelayMsg != -1?options->iDelayMsg:0, TRUE); - SetDlgItemInt(hWnd, IDC_DELAY_URL, options->iDelayUrl != -1?options->iDelayUrl:0, TRUE); - SetDlgItemInt(hWnd, IDC_DELAY_FILE, options->iDelayFile != -1?options->iDelayFile:0, TRUE); - SetDlgItemInt(hWnd, IDC_DELAY_OTHERS, options->iDelayOthers != -1?options->iDelayOthers:0, TRUE); - SetDlgItemInt(hWnd, IDC_NUMBERMSG, options->iNumberMsg, FALSE); - //update items' states - UpdateOptionsDlgItemsState(hWnd); - bWmNotify = FALSE; - return TRUE; - - case WM_COMMAND: - if (!bWmNotify) - { - switch (LOWORD(wParam)) - { - case IDC_PREVIEW: - PopupPreview(options); - break; - default: - //update options - options->maskNotify = (IsDlgButtonChecked(hWnd, IDC_CHKNOTIFY_MESSAGE)?MASK_MESSAGE:0) | - (IsDlgButtonChecked(hWnd, IDC_CHKNOTIFY_URL)?MASK_URL:0) | - (IsDlgButtonChecked(hWnd, IDC_CHKNOTIFY_FILE)?MASK_FILE:0) | - (IsDlgButtonChecked(hWnd, IDC_CHKNOTIFY_OTHER)?MASK_OTHER:0); - options->maskActL = (IsDlgButtonChecked(hWnd, IDC_CHKACTL_DISMISS)?MASK_DISMISS:0) | - (IsDlgButtonChecked(hWnd, IDC_CHKACTL_OPEN)?MASK_OPEN:0) | - (IsDlgButtonChecked(hWnd, IDC_CHKACTL_REMOVE)?MASK_REMOVE:0); - options->maskActR = (IsDlgButtonChecked(hWnd, IDC_CHKACTR_DISMISS)?MASK_DISMISS:0) | - (IsDlgButtonChecked(hWnd, IDC_CHKACTR_OPEN)?MASK_OPEN:0) | - (IsDlgButtonChecked(hWnd, IDC_CHKACTR_REMOVE)?MASK_REMOVE:0); - options->maskActTE = (IsDlgButtonChecked(hWnd, IDC_CHKACTTE_DISMISS)?MASK_DISMISS:0) | - (IsDlgButtonChecked(hWnd, IDC_CHKACTTE_OPEN)?MASK_OPEN:0) | - (IsDlgButtonChecked(hWnd, IDC_CHKACTTE_REMOVE)?MASK_REMOVE:0); - options->bDefaultColorMsg = IsDlgButtonChecked(hWnd, IDC_CHKDEFAULTCOL_MESSAGE); - options->bDefaultColorUrl = IsDlgButtonChecked(hWnd, IDC_CHKDEFAULTCOL_URL); - options->bDefaultColorFile = IsDlgButtonChecked(hWnd, IDC_CHKDEFAULTCOL_FILE); - options->bDefaultColorOthers = IsDlgButtonChecked(hWnd, IDC_CHKDEFAULTCOL_OTHERS); - options->bMenuitem = IsDlgButtonChecked(hWnd, IDC_CHKMENUITEM); - options->bDisable = IsDlgButtonChecked(hWnd, IDC_CHKDISABLE); - options->bPreview = IsDlgButtonChecked(hWnd, IDC_CHKPREVIEW); - options->iDelayMsg = IsDlgButtonChecked(hWnd, IDC_CHKINFINITE_MESSAGE)?-1:(DWORD)GetDlgItemInt(hWnd, IDC_DELAY_MESSAGE, NULL, FALSE); - options->iDelayUrl = IsDlgButtonChecked(hWnd, IDC_CHKINFINITE_URL)?-1:(DWORD)GetDlgItemInt(hWnd, IDC_DELAY_URL, NULL, FALSE); - options->iDelayFile = IsDlgButtonChecked(hWnd, IDC_CHKINFINITE_FILE)?-1:(DWORD)GetDlgItemInt(hWnd, IDC_DELAY_FILE, NULL, FALSE); - options->iDelayOthers = IsDlgButtonChecked(hWnd, IDC_CHKINFINITE_OTHERS)?-1:(DWORD)GetDlgItemInt(hWnd, IDC_DELAY_OTHERS, NULL, FALSE); - options->bMergePopup = IsDlgButtonChecked(hWnd, IDC_CHKMERGEPOPUP); - options->bMsgWindowCheck = IsDlgButtonChecked(hWnd, IDC_CHKWINDOWCHECK); - options->bMsgReplyWindow = IsDlgButtonChecked(hWnd, IDC_CHKREPLYWINDOW); - options->bShowDate = IsDlgButtonChecked(hWnd, IDC_CHKSHOWDATE); - options->bShowTime = IsDlgButtonChecked(hWnd, IDC_CHKSHOWTIME); - options->bShowHeaders = IsDlgButtonChecked(hWnd, IDC_CHKSHOWHEADERS); - options->bShowON = IsDlgButtonChecked(hWnd, IDC_RDOLD); - options->bShowON = !IsDlgButtonChecked(hWnd, IDC_RDNEW); - options->bHideSend = IsDlgButtonChecked(hWnd, IDC_CHKHIDESEND); - options->iNumberMsg = GetDlgItemInt(hWnd, IDC_NUMBERMSG, NULL, FALSE); - options->bNoRSS = IsDlgButtonChecked(hWnd, IDC_SUPRESSRSS); - options->bReadCheck = IsDlgButtonChecked(hWnd, IDC_READCHECK); - //update items' states - UpdateOptionsDlgItemsState(hWnd); - if (HIWORD(wParam) == CPN_COLOURCHANGED) - { - options->colBackMsg = SendDlgItemMessage(hWnd, IDC_COLBACK_MESSAGE, CPM_GETCOLOUR, 0, 0); - options->colTextMsg = SendDlgItemMessage(hWnd, IDC_COLTEXT_MESSAGE, CPM_GETCOLOUR, 0, 0); - options->colBackUrl = SendDlgItemMessage(hWnd, IDC_COLBACK_URL, CPM_GETCOLOUR, 0, 0); - options->colTextUrl = SendDlgItemMessage(hWnd, IDC_COLTEXT_URL, CPM_GETCOLOUR, 0, 0); - options->colBackFile = SendDlgItemMessage(hWnd, IDC_COLBACK_FILE, CPM_GETCOLOUR, 0, 0); - options->colTextFile = SendDlgItemMessage(hWnd, IDC_COLTEXT_FILE, CPM_GETCOLOUR, 0, 0); - options->colBackOthers = SendDlgItemMessage(hWnd, IDC_COLBACK_OTHERS, CPM_GETCOLOUR, 0, 0); - options->colTextOthers = SendDlgItemMessage(hWnd, IDC_COLTEXT_OTHERS, CPM_GETCOLOUR, 0, 0); - } - //send changes to menuitem - MenuitemUpdate(!options->bDisable); - //enable "Apply" button - SendMessage(GetParent(hWnd), PSM_CHANGED, 0, 0); - break; - } - } - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lParam)->code) - { - case PSN_APPLY: - OptionsWrite(); - break; - - case PSN_RESET: - OptionsRead(); - - //maybe something changed with the menuitem - MenuitemUpdate(!options->bDisable); - break; - } - break; - - default: - break; - } - return FALSE; -} - -int OptionsAdd(HINSTANCE hInst, WPARAM addInfo) -{ - if (ServiceExists(MS_POPUP_ADDPOPUP)) { - OPTIONSDIALOGPAGE odp = { 0 }; - odp.cbSize = sizeof(odp); - odp.hInstance = hInst; - odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT); - odp.pszTitle = LPGEN("Event Notify"); - odp.pszGroup = LPGEN("PopUps"); - odp.flags = ODPF_BOLDGROUPS; - odp.pfnDlgProc = OptionsDlgProc; - Options_AddPage( addInfo, &odp); - } - - return 0; -} - -int OptionsInit(PLUGIN_OPTIONS* pluginOptions) -{ - options = pluginOptions; - - OptionsRead(); - - return 0; -} - -int Opt_DisableNEN(BOOL Status) -{ - options->bDisable = Status; - OptionsWrite(); // JK: really necessary to write everything here ???? - - //BUG! - //Update options dialog if open! - - return 0; -} diff --git a/plugins/NewEventNotify/popup.cpp b/plugins/NewEventNotify/popup.cpp deleted file mode 100644 index 355ef6cc86..0000000000 --- a/plugins/NewEventNotify/popup.cpp +++ /dev/null @@ -1,614 +0,0 @@ -/* - Name: NewEventNotify - Plugin for Miranda IM - File: popup.c - Displays a popup using the popup-plugin by hrk - Version: 2.2.3 - Description: Notifies you about some events - Author: icebreaker, - Date: 21.07.02 15:46 / Update: 16.09.02 17:45 - Copyright: (C) 2002 Starzinger Michael - - 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 "neweventnotify.h" - -extern int g_IsServiceAvail; - -static int PopupCount = 0; - -PLUGIN_DATA* PopUpList[MAX_POPUPS]; - -int NumberPopupData(HANDLE hContact, int eventType) -{ - for (int n=0; n < MAX_POPUPS; n++) { - if (!PopUpList[n] && !hContact && eventType == -1) - return n; - - if (PopUpList[n] && (PopUpList[n]->hContact == hContact) && (PopUpList[n]->iLock == 0) && (eventType == -1 || PopUpList[n]->eventType == (UINT)eventType)) - return n; - } - return -1; -} - -static int FindPopupData(PLUGIN_DATA* pdata) -{ - for (int n=0; n < MAX_POPUPS; n++) - if (PopUpList[n] == pdata) - return n; - - return -1; -} - -static void FreePopupEventData(PLUGIN_DATA* pdata) -{ - pdata->iLock = 1; - EVENT_DATA_EX* eventData = pdata->firstEventData; - while (eventData) { - if (eventData->next) { - eventData = eventData->next; - mir_free(eventData->prev); - eventData->prev = NULL; - } - else { - mir_free(eventData); - eventData = NULL; - } - } - pdata->lastEventData = pdata->firstEventData = pdata->firstShowEventData = NULL; - // remove from popup list if present - if (FindPopupData(pdata) != -1) - PopUpList[FindPopupData(pdata)] = NULL; -} - -int PopupAct(HWND hWnd, UINT mask, PLUGIN_DATA* pdata) -{ - EVENT_DATA_EX* eventData; - if (mask & MASK_OPEN) { - if (pdata) { - // do MS_MSG_SENDMESSAGE instead if wanted to reply and not read! - if (pdata->pluginOptions->bMsgReplyWindow && pdata->eventType == EVENTTYPE_MESSAGE) - CallServiceSync(MS_MSG_SENDMESSAGE, (WPARAM)pdata->hContact, (LPARAM)NULL); // JK, use core (since 0.3.3+) - else { - CLISTEVENT* cle; - int idx = 0; - - eventData = pdata->firstEventData; - if (eventData) - { - do { //try to find the correct clist event //JK - cle = (CLISTEVENT*)CallService(MS_CLIST_GETEVENT, (WPARAM)pdata->hContact, idx); - if (cle && cle->hDbEvent == eventData->hEvent) - { - if (ServiceExists(cle->pszService)) - CallServiceSync(cle->pszService, (WPARAM)NULL, (LPARAM)cle); // JK, use core (since 0.3.3+) - break; - } - idx++; - } - while (cle); - } - } - } - } - - if (mask & MASK_REMOVE) { - if (pdata) { - eventData = pdata->firstEventData; - pdata->iLock = 1; - while (eventData) { - CallService(MS_CLIST_REMOVEEVENT, (WPARAM)pdata->hContact, (LPARAM)eventData->hEvent); - CallService(MS_DB_EVENT_MARKREAD, (WPARAM)pdata->hContact, (LPARAM)eventData->hEvent); - eventData = eventData->next; - } - FreePopupEventData(pdata); - } - } - - if (mask & MASK_DISMISS) { - KillTimer(hWnd, TIMER_TO_ACTION); - FreePopupEventData(pdata); - PUDeletePopUp(hWnd); - } - - return 0; -} - -static BOOL CALLBACK PopupDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - PLUGIN_DATA* pdata = NULL; - - pdata = (PLUGIN_DATA*)CallService(MS_POPUP_GETPLUGINDATA, (WPARAM)hWnd, (LPARAM)pdata); - if (!pdata) return FALSE; - - switch (message) { - case WM_COMMAND: - PopupAct(hWnd, pdata->pluginOptions->maskActL, pdata); - break; - case WM_CONTEXTMENU: - PopupAct(hWnd, pdata->pluginOptions->maskActR, pdata); - break; - case UM_FREEPLUGINDATA: - PopupCount--; - mir_free(pdata); - return TRUE; - case UM_INITPOPUP: - pdata->hWnd = hWnd; - SetTimer(hWnd, TIMER_TO_ACTION, pdata->iSeconds * 1000, NULL); - break; - case WM_MOUSEWHEEL: - if ((short)HIWORD(wParam) > 0 && pdata->firstShowEventData->prev && - (pdata->pluginOptions->bShowON || pdata->firstShowEventData->number >= pdata->pluginOptions->iNumberMsg)) - { - pdata->firstShowEventData = pdata->firstShowEventData->prev; - PopupUpdate(pdata->hContact, NULL); - } - if ((short)HIWORD(wParam) < 0 && pdata->firstShowEventData->next && - (!pdata->pluginOptions->bShowON || pdata->countEvent - pdata->firstShowEventData->number >= pdata->pluginOptions->iNumberMsg)) - { - pdata->firstShowEventData = pdata->firstShowEventData->next; - PopupUpdate(pdata->hContact, NULL); - } - break; - case WM_SETCURSOR: - SetFocus(hWnd); - break; - case WM_TIMER: - if (wParam != TIMER_TO_ACTION) - break; - PopupAct(hWnd, pdata->pluginOptions->maskActTE, pdata); - break; - default: - break; - } - return DefWindowProc(hWnd, message, wParam, lParam); -} - -static TCHAR* GetEventPreview(DBEVENTINFO *dbei) -{ - TCHAR* comment1 = NULL; - TCHAR* comment2 = NULL; - char* commentFix = NULL; - - //now get text - switch (dbei->eventType) { - case EVENTTYPE_MESSAGE: - if (dbei->pBlob) { - if (dbei->flags & DBEF_UTF) { - // utf-8 in blob - comment1 = mir_utf8decodeT((char*)dbei->pBlob); - } - else if (dbei->cbBlob == (_tcslen((TCHAR *)dbei->pBlob)+1)*(sizeof(TCHAR)+1)) { - // wchar in blob (the old hack) - comment1 = mir_tstrdup((TCHAR*)dbei->pBlob); - } - else comment1 = mir_a2t((char *)dbei->pBlob); - } - commentFix = POPUP_COMMENT_MESSAGE; - break; - - case EVENTTYPE_URL: - // url - if (dbei->pBlob) comment2 = mir_a2t((char *)dbei->pBlob); - // comment - if (dbei->pBlob) comment1 = mir_a2t((char *)dbei->pBlob + strlen((char *)dbei->pBlob) + 1); - commentFix = POPUP_COMMENT_URL; - break; - - case EVENTTYPE_FILE: - // filenames - if (dbei->pBlob) { - if (dbei->flags & DBEF_UTF) - comment2 = mir_utf8decodeT((char*)dbei->pBlob + 4); - else - comment2 = mir_a2t((char*)dbei->pBlob + 4); - } - // description - if (dbei->pBlob) { - if (dbei->flags & DBEF_UTF) - comment1 = mir_utf8decodeT((char *)dbei->pBlob + strlen((char *)dbei->pBlob + 4) + 1); - else - comment1 = mir_a2t((char *)dbei->pBlob + strlen((char *)dbei->pBlob + 4) + 1); - } - commentFix = POPUP_COMMENT_FILE; - break; - - //blob format is: - //ASCIIZ nick - //ASCIIZ UID - case EVENTTYPE_CONTACTS: - if (dbei->pBlob) { - // count contacts in event - char* pcBlob = (char *)dbei->pBlob; - char* pcEnd = (char *)(dbei->pBlob + dbei->cbBlob); - int nContacts; - TCHAR szBuf[512]; - - for (nContacts = 1; ; nContacts++) { - // Nick - pcBlob += strlen(pcBlob) + 1; - // UIN - pcBlob += strlen(pcBlob) + 1; - // check for end of contacts - if (pcBlob >= pcEnd) - break; - } - mir_sntprintf(szBuf, SIZEOF(szBuf), TranslateT("Received %d contacts."), nContacts); - comment1 = mir_tstrdup(szBuf); - } - commentFix = POPUP_COMMENT_CONTACTS; - break; - - //blob format is: - //DWORD numeric uin (ICQ only afaik) - //DWORD HANDLE to contact - //ASCIIZ nick (or text UID) - //ASCIIZ first name - //ASCIIZ last name - //ASCIIZ email (or YID) - case EVENTTYPE_ADDED: - if (dbei->pBlob) { - char szUin[16]; - TCHAR szBuf[2048]; - TCHAR* szNick = NULL; - char *pszNick = (char *)dbei->pBlob + 8; - char *pszFirst = pszNick + strlen(pszNick) + 1; - char *pszLast = pszFirst + strlen(pszFirst) + 1; - char *pszEmail = pszLast + strlen(pszLast) + 1; - - _snprintf(szUin, 16, "%d", *((DWORD*)dbei->pBlob)); - if (strlen(pszNick) > 0) { - if (dbei->flags & DBEF_UTF) - szNick = mir_utf8decodeT(pszNick); - else - szNick = mir_a2t(pszNick); - } - else if (strlen(pszEmail) > 0) { - if (dbei->flags & DBEF_UTF) - szNick = mir_utf8decodeT(pszEmail); - else - szNick = mir_a2t(pszEmail); - } - else if (*((DWORD*)dbei->pBlob) > 0) - szNick = mir_a2t(szUin); - - if (szNick) { - _tcscpy(szBuf, szNick); - _tcscat(szBuf, TranslateT(" added you to the contact list")); - mir_free(szNick); - comment1 = mir_tstrdup(szBuf); - } - } - commentFix = POPUP_COMMENT_ADDED; - break; - - case EVENTTYPE_AUTHREQUEST: - if (dbei->pBlob) { - char szUin[16]; - TCHAR szBuf[2048]; - TCHAR* szNick = NULL; - char *pszNick = (char *)dbei->pBlob + 8; - char *pszFirst = pszNick + strlen(pszNick) + 1; - char *pszLast = pszFirst + strlen(pszFirst) + 1; - char *pszEmail = pszLast + strlen(pszLast) + 1; - - _snprintf(szUin, 16, "%d", *((DWORD*)dbei->pBlob)); - if (strlen(pszNick) > 0) { - if (dbei->flags & DBEF_UTF) - szNick = mir_utf8decodeT(pszNick); - else - szNick = mir_a2t(pszNick); - } - else if (strlen(pszEmail) > 0) { - if (dbei->flags & DBEF_UTF) - szNick = mir_utf8decodeT(pszEmail); - else - szNick = mir_a2t(pszEmail); - } - else if (*((DWORD*)dbei->pBlob) > 0) - szNick = mir_a2t(szUin); - - if (szNick) { - _tcscpy(szBuf, szNick); - _tcscat(szBuf, TranslateT(" requested authorization")); - mir_free(szNick); - comment1 = mir_tstrdup(szBuf); - } - } - commentFix = POPUP_COMMENT_AUTH; - break; - - //blob format is: - //ASCIIZ text, usually "Sender IP: xxx.xxx.xxx.xxx\r\n%s" - //ASCIIZ from name - //ASCIIZ from e-mail - case ICQEVENTTYPE_WEBPAGER: - if (dbei->pBlob) comment1 = mir_a2t((const char *)dbei->pBlob); - commentFix = POPUP_COMMENT_WEBPAGER; - break; - - //blob format is: - //ASCIIZ text, usually of the form "Subject: %s\r\n%s" - //ASCIIZ from name - //ASCIIZ from e-mail - case ICQEVENTTYPE_EMAILEXPRESS: - if (dbei->pBlob) comment1 = mir_a2t((const char *)dbei->pBlob); - commentFix = POPUP_COMMENT_EMAILEXP; - break; - - default: - if (ServiceExists(MS_DB_EVENT_GETTYPE)) { - DBEVENTTYPEDESCR* pei = (DBEVENTTYPEDESCR*)CallService(MS_DB_EVENT_GETTYPE, (WPARAM)dbei->szModule, (LPARAM)dbei->eventType); - // support for custom database event types - if (pei && pei->cbSize >= DBEVENTTYPEDESCR_SIZE_V1) { - // preview requested - if (dbei->pBlob) { - DBEVENTGETTEXT svc = {dbei, DBVT_TCHAR, CP_ACP}; - TCHAR *pet = (TCHAR*)CallService(MS_DB_EVENT_GETTEXT, 0, (LPARAM)&svc); - if (pet) { - // we've got event text, move to our memory space - comment1 = mir_tstrdup(pet); - mir_free(pet); - } - } - commentFix = pei->descr; - } - else commentFix = POPUP_COMMENT_OTHER; - } - else commentFix = POPUP_COMMENT_OTHER; - } - - if ( lstrlen(comment1) > 0) { - mir_free(comment2); - return comment1; - } - if ( lstrlen(comment2) > 0) { - mir_free(comment1); - return comment2; - } - mir_free(comment1); - mir_free(comment2); - return TranslateTS( mir_a2t(commentFix)); -} - -int PopupShow(PLUGIN_OPTIONS* pluginOptions, HANDLE hContact, HANDLE hEvent, UINT eventType) -{ - PLUGIN_DATA* pdata; - EVENT_DATA_EX* eventData; - TCHAR* sampleEvent; - long iSeconds; - - //there has to be a maximum number of popups shown at the same time - if (PopupCount >= MAX_POPUPS) - return 2; - - //check if we should report this kind of event - //get the prefered icon as well - //CHANGE: iSeconds is -1 because I use my timer to hide popup - POPUPDATAW pudw; - pudw.iSeconds = -1; - - switch (eventType) { - case EVENTTYPE_MESSAGE: - if (!(pluginOptions->maskNotify&MASK_MESSAGE)) return 1; - pudw.lchIcon = LoadSkinnedIcon(SKINICON_EVENT_MESSAGE); - pudw.colorBack = pluginOptions->bDefaultColorMsg ? 0 : pluginOptions->colBackMsg; - pudw.colorText = pluginOptions->bDefaultColorMsg ? 0 : pluginOptions->colTextMsg; - iSeconds = pluginOptions->iDelayMsg; - sampleEvent = TranslateT("This is a sample message event :-)"); - break; - - case EVENTTYPE_URL: - if (!(pluginOptions->maskNotify&MASK_URL)) return 1; - pudw.lchIcon = LoadSkinnedIcon(SKINICON_EVENT_URL); - pudw.colorBack = pluginOptions->bDefaultColorUrl ? 0 : pluginOptions->colBackUrl; - pudw.colorText = pluginOptions->bDefaultColorUrl ? 0 : pluginOptions->colTextUrl; - iSeconds = pluginOptions->iDelayUrl; - sampleEvent = TranslateT("This is a sample URL event ;-)"); - break; - - case EVENTTYPE_FILE: - if (!(pluginOptions->maskNotify&MASK_FILE)) return 1; - pudw.lchIcon = LoadSkinnedIcon(SKINICON_EVENT_FILE); - pudw.colorBack = pluginOptions->bDefaultColorFile ? 0 : pluginOptions->colBackFile; - pudw.colorText = pluginOptions->bDefaultColorFile ? 0 : pluginOptions->colTextFile; - iSeconds = pluginOptions->iDelayFile; - sampleEvent = TranslateT("This is a sample file event :-D"); - break; - - default: - if (!(pluginOptions->maskNotify&MASK_OTHER)) return 1; - pudw.lchIcon = LoadSkinnedIcon(SKINICON_OTHER_MIRANDA); - pudw.colorBack = pluginOptions->bDefaultColorOthers ? 0 : pluginOptions->colBackOthers; - pudw.colorText = pluginOptions->bDefaultColorOthers ? 0 : pluginOptions->colTextOthers; - iSeconds = pluginOptions->iDelayOthers; - sampleEvent = TranslateT("This is a sample other event ;-D"); - break; - } - - //get DBEVENTINFO with pBlob if preview is needed (when is test then is off) - DBEVENTINFO dbe = {0}; - dbe.cbSize = sizeof(dbe); - - if ((pluginOptions->bPreview || eventType == EVENTTYPE_ADDED || eventType == EVENTTYPE_AUTHREQUEST) && hEvent) { - dbe.cbBlob = CallService(MS_DB_EVENT_GETBLOBSIZE, (WPARAM)hEvent, 0); - dbe.pBlob = (PBYTE)mir_alloc(dbe.cbBlob); - } - - if (hEvent) - CallService(MS_DB_EVENT_GET, (WPARAM)hEvent, (LPARAM)&dbe); - - eventData = (EVENT_DATA_EX*)mir_alloc(sizeof(EVENT_DATA_EX)); - eventData->hEvent = hEvent; - eventData->number = 1; - eventData->next = NULL; - eventData->prev = NULL; - - // retrieve correct hContact for AUTH events - if (dbe.pBlob && (eventType == EVENTTYPE_ADDED || eventType == EVENTTYPE_AUTHREQUEST)) - hContact = *((PHANDLE)(dbe.pBlob + sizeof(DWORD))); - - // set plugin_data ... will be usable within PopupDlgProc - pdata = (PLUGIN_DATA*)mir_alloc(sizeof(PLUGIN_DATA)); - pdata->eventType = eventType; - pdata->hContact = hContact; - pdata->pluginOptions = pluginOptions; - pdata->countEvent = 1; - pdata->iLock = 0; - pdata->iSeconds = (iSeconds > 0) ? iSeconds : pluginOptions->iDelayDefault; - pdata->firstEventData = pdata->firstShowEventData = pdata->lastEventData = eventData; - - // finally create the popup - pudw.lchContact = hContact; - pudw.PluginWindowProc = (WNDPROC)PopupDlgProc; - pudw.PluginData = pdata; - - // if hContact is NULL, && hEvent is NULL then popup is only Test - if ((hContact == NULL) && (hEvent == NULL)) { - _tcsncpy((TCHAR*)pudw.lptzContactName, TranslateT("Plugin Test"), MAX_CONTACTNAME); - _tcsncpy((TCHAR*)pudw.lptzText, TranslateTS(sampleEvent), MAX_SECONDLINE); - } - else { // get the needed event data - TCHAR* szEventPreview; - - _tcsncpy((TCHAR*)pudw.lptzContactName, (TCHAR*)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hContact, GCDNF_TCHAR), MAX_CONTACTNAME); - szEventPreview = GetEventPreview(&dbe); - _tcsncpy((TCHAR*)pudw.lptzText, szEventPreview, MAX_SECONDLINE); - mir_free(szEventPreview); - } - - PopupCount++; - - PopUpList[NumberPopupData(NULL, -1)] = pdata; - // send data to popup plugin - - if (ServiceExists(MS_POPUP_ADDPOPUPT)) - { - if (CallService(MS_POPUP_ADDPOPUPT, (WPARAM)&pudw, 0) < 0) - { // popup creation failed, release popupdata - FreePopupEventData(pdata); - mir_free(pdata); - } - } - - if (dbe.pBlob) - mir_free(dbe.pBlob); - return 0; -} - - -int PopupUpdate(HANDLE hContact, HANDLE hEvent) -{ - PLUGIN_DATA* pdata; - DBEVENTINFO dbe = {0}; - EVENT_DATA_EX* eventData; - TCHAR lpzText[MAX_SECONDLINE*2] = _T("\0\0"); - int iEvent = 0; - int doReverse = 0; - - // merge only message popups - pdata = (PLUGIN_DATA*)PopUpList[NumberPopupData(hContact, EVENTTYPE_MESSAGE)]; - - if (hEvent) { - pdata->countEvent++; - - pdata->lastEventData->next = (EVENT_DATA_EX *)mir_alloc(sizeof(EVENT_DATA_EX)); - pdata->lastEventData->next->prev = pdata->lastEventData; - pdata->lastEventData = pdata->lastEventData->next; - pdata->lastEventData->hEvent = hEvent; - pdata->lastEventData->number = pdata->lastEventData->prev->number + 1; - pdata->lastEventData->next = NULL; - if (!pdata->pluginOptions->bShowON && pdata->countEvent > pdata->pluginOptions->iNumberMsg && pdata->pluginOptions->iNumberMsg) - pdata->firstShowEventData = pdata->firstShowEventData->next; - //re-init timer delay - KillTimer(pdata->hWnd, TIMER_TO_ACTION); - SetTimer(pdata->hWnd, TIMER_TO_ACTION, pdata->iSeconds * 1000, NULL); - } - - if (pdata->pluginOptions->bShowHeaders) - mir_sntprintf(lpzText, SIZEOF(lpzText), _T("[b]%s %d[/b]\n"), TranslateT("Number of new message: "), pdata->countEvent); - - doReverse = pdata->pluginOptions->bShowON; - - if ((pdata->firstShowEventData != pdata->firstEventData && doReverse) || (pdata->firstShowEventData != pdata->lastEventData && !doReverse)) - mir_sntprintf(lpzText, SIZEOF(lpzText), _T("%s...\n"), lpzText); - - //take the active event as starting one - eventData = pdata->firstShowEventData; - - while (TRUE) { - if (iEvent) { - if (doReverse) - eventData = eventData->next; - else - eventData = eventData->prev; - } - iEvent++; - //get DBEVENTINFO with pBlob if preview is needed (when is test then is off) - dbe.cbSize = sizeof(dbe); - dbe.pBlob = NULL; - dbe.cbBlob = 0; - if (pdata->pluginOptions->bPreview && eventData->hEvent) { - dbe.cbBlob = CallService(MS_DB_EVENT_GETBLOBSIZE, (WPARAM)eventData->hEvent, 0); - dbe.pBlob = (PBYTE)mir_alloc(dbe.cbBlob); - } - - if (eventData->hEvent) - CallService(MS_DB_EVENT_GET, (WPARAM)eventData->hEvent, (LPARAM)&dbe); - - if (pdata->pluginOptions->bShowDate || pdata->pluginOptions->bShowTime) { - TCHAR timestamp[MAX_DATASIZE]; - TCHAR formatTime[MAX_DATASIZE]; - if (pdata->pluginOptions->bShowDate) - _tcsncpy(formatTime, _T("%Y.%m.%d"), SIZEOF(formatTime)); - else if (pdata->pluginOptions->bShowTime) - _tcsncat(formatTime, _T(" %H:%M"), SIZEOF(formatTime)); - time_t localTime = dbe.timestamp; - _tcsftime(timestamp, SIZEOF(timestamp), formatTime, localtime(&localTime)); - mir_sntprintf(lpzText, SIZEOF(lpzText), _T("%s[b][i]%s[/i][/b]\n"), lpzText, timestamp); - } - - // prepare event preview - TCHAR* szEventPreview = GetEventPreview(&dbe); - mir_sntprintf(lpzText, SIZEOF(lpzText), _T("%s%s"), lpzText, szEventPreview); - mir_free(szEventPreview); - - if (dbe.pBlob) - mir_free(dbe.pBlob); - if (doReverse) { - if ((iEvent >= pdata->pluginOptions->iNumberMsg && pdata->pluginOptions->iNumberMsg) || !eventData->next) - break; - } - else if ((iEvent >= pdata->pluginOptions->iNumberMsg && pdata->pluginOptions->iNumberMsg) || !eventData->prev) - break; - - mir_sntprintf(lpzText, SIZEOF(lpzText), _T("%s\n"), lpzText); - } - - if ((doReverse && eventData->next) || (!doReverse && eventData->prev)) - mir_sntprintf(lpzText, SIZEOF(lpzText), _T("%s\n..."), lpzText); - - CallService(MS_POPUP_CHANGETEXTT, (WPARAM)pdata->hWnd, (LPARAM)lpzText); - return 0; -} - -int PopupPreview(PLUGIN_OPTIONS* pluginOptions) -{ - PopupShow(pluginOptions, NULL, NULL, EVENTTYPE_MESSAGE); - PopupShow(pluginOptions, NULL, NULL, EVENTTYPE_URL); - PopupShow(pluginOptions, NULL, NULL, EVENTTYPE_FILE); - PopupShow(pluginOptions, NULL, NULL, -1); - - return 0; -} diff --git a/plugins/NewEventNotify/res/resource.rc b/plugins/NewEventNotify/res/resource.rc new file mode 100644 index 0000000000..c3b672b955 --- /dev/null +++ b/plugins/NewEventNotify/res/resource.rc @@ -0,0 +1,198 @@ +// Microsoft Visual C++ generated resource script. +// +#include "..\src\resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_OPT DIALOGEX 0, 0, 314, 252 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + GROUPBOX "General Options",IDC_STATIC,6,2,199,43 + CONTROL "Show entry in the PopUps menu",IDC_CHKMENUITEM,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,10,11,190,10 + CONTROL "Temporarily disable Event Popups",IDC_CHKDISABLE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,10,21,190,10 + CONTROL "Show Preview of Event in Popup",IDC_CHKPREVIEW,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,10,31,190,10 + GROUPBOX "Popup Options",IDC_STATIC,6,45,199,75 + LTEXT "Message",IDC_STATIC,11,65,44,13 + LTEXT "URL",IDC_STATIC,11,78,44,13 + LTEXT "File",IDC_STATIC,11,91,44,13 + LTEXT "Others",IDC_STATIC,12,104,44,13 + LTEXT "Text",IDC_STATIC,56,54,23,8 + CONTROL "",IDC_COLTEXT_MESSAGE,"ColourPicker",WS_TABSTOP,56,65, + 24,13 + CONTROL "",IDC_COLTEXT_URL,"ColourPicker",WS_TABSTOP,56,77,24,13 + CONTROL "",IDC_COLTEXT_FILE,"ColourPicker",WS_TABSTOP,56,89,24, + 13 + CONTROL "",IDC_COLTEXT_OTHERS,"ColourPicker",WS_TABSTOP,56,101, + 24,13 + LTEXT "Background",IDC_STATIC,86,54,44,8 + CONTROL "",IDC_COLBACK_MESSAGE,"ColourPicker",WS_TABSTOP,86,65, + 24,13 + CONTROL "",IDC_COLBACK_URL,"ColourPicker",WS_TABSTOP,86,77,24,13 + CONTROL "",IDC_COLBACK_FILE,"ColourPicker",WS_TABSTOP,86,89,24, + 13 + CONTROL "",IDC_COLBACK_OTHERS,"ColourPicker",WS_TABSTOP,86,101, + 24,13 + CONTROL "",IDC_CHKDEFAULTCOL_MESSAGE,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,133,65,11,10 + CONTROL "",IDC_CHKDEFAULTCOL_URL,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,133,78,11,10 + CONTROL "",IDC_CHKDEFAULTCOL_FILE,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,133,91,11,10 + CONTROL "",IDC_CHKDEFAULTCOL_OTHERS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,133,103,11,10 + CTEXT "Time to expires",IDC_STATIC,144,52,48,10 + EDITTEXT IDC_DELAY_MESSAGE,155,62,26,13,ES_AUTOHSCROLL | + ES_NUMBER + EDITTEXT IDC_DELAY_URL,155,75,26,13,ES_AUTOHSCROLL | ES_NUMBER + EDITTEXT IDC_DELAY_FILE,155,88,26,13,ES_AUTOHSCROLL | ES_NUMBER + EDITTEXT IDC_DELAY_OTHERS,155,101,26,13,ES_AUTOHSCROLL | + ES_NUMBER + CONTROL "",IDC_CHKINFINITE_MESSAGE,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,185,65,11,10 + CONTROL "",IDC_CHKINFINITE_URL,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,185,78,11,10 + CONTROL "",IDC_CHKINFINITE_FILE,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,185,91,11,10 + CONTROL "",IDC_CHKINFINITE_OTHERS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,185,103,11,10 + GROUPBOX "Notify me of ...",IDC_STATIC,208,2,100,56 + CONTROL "Message",IDC_CHKNOTIFY_MESSAGE,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,212,11,90,10 + CONTROL "URL",IDC_CHKNOTIFY_URL,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,212,22,90,10 + CONTROL "File",IDC_CHKNOTIFY_FILE,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,212,33,90,10 + CONTROL "Others",IDC_CHKNOTIFY_OTHER,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,212,44,90,10 + GROUPBOX "Left Click Actions",IDC_STATIC,208,58,100,44 + CONTROL "Dismiss Popup",IDC_CHKACTL_DISMISS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,212,67,90,10 + CONTROL "Open Event",IDC_CHKACTL_OPEN,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,212,78,90,10 + CONTROL "Dismiss Event",IDC_CHKACTL_REMOVE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,212,89,90,10 + GROUPBOX "Right Click Actions",IDC_STATIC,208,102,100,44 + CONTROL "Dismiss Popup",IDC_CHKACTR_DISMISS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,212,111,90,10 + CONTROL "Open Event",IDC_CHKACTR_OPEN,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,212,122,90,10 + CONTROL "Dismiss Event",IDC_CHKACTR_REMOVE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,212,133,90,10 + GROUPBOX "Time Expires Actions",IDC_STATIC,208,147,100,44 + CONTROL "Dismiss Popup",IDC_CHKACTTE_DISMISS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,212,156,90,10 + CONTROL "Open Event",IDC_CHKACTTE_OPEN,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,212,167,90,10 + CONTROL "Dismiss Event",IDC_CHKACTTE_REMOVE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,212,178,90,10 + GROUPBOX "Message-Event only",IDC_STATIC,6,120,199,131 + CONTROL "Don't show Popup when Message-Dialog is already open", + IDC_CHKWINDOWCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, + 10,129,192,10 + CONTROL "Hide Popup when sending new message",IDC_CHKHIDESEND, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,138,192,10 + CONTROL "Open Reply-Dialog instead of reading the Message", + IDC_CHKREPLYWINDOW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, + 10,147,192,10 + CONTROL "Merge popups from one user",IDC_CHKMERGEPOPUP,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,10,157,192,10 + PUSHBUTTON "Preview",IDC_PREVIEW,228,204,60,12 + CONTROL "Show Date",IDC_CHKSHOWDATE,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,20,166,84,10 + CONTROL "Show Time",IDC_CHKSHOWTIME,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,20,176,84,10 + CONTROL "Show Headers",IDC_CHKSHOWHEADERS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,20,186,84,10 + LTEXT "Number of begin shown messages",IDC_LBNUMBERMSG,20,195, + 143,8 + EDITTEXT IDC_NUMBERMSG,171,192,26,13,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "Last message display first",IDC_RDNEW,"Button", + BS_AUTORADIOBUTTON,19,205,107,9 + CONTROL "Last message display last",IDC_RDOLD,"Button", + BS_AUTORADIOBUTTON,19,216,111,9 + PUSHBUTTON "Edit",IDC_CMDEDITHEADERS,107,185,36,11 + CONTROL "No popups for RSS contacts",IDC_SUPRESSRSS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,10,227,192,10 + CONTROL "No popups for read messages",IDC_READCHECK,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,10,237,192,10 +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "..\\src\\resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_OPT, DIALOG + BEGIN + LEFTMARGIN, 0 + RIGHTMARGIN, 308 + VERTGUIDE, 10 + TOPMARGIN, 0 + BOTTOMMARGIN, 252 + HORZGUIDE, 250 + END +END +#endif // APSTUDIO_INVOKED + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_ENABLED ICON "popup.ico" +IDI_DISABLED ICON "popup_no.ico" +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + diff --git a/plugins/NewEventNotify/resource.h b/plugins/NewEventNotify/resource.h deleted file mode 100644 index 1146a3bfab..0000000000 --- a/plugins/NewEventNotify/resource.h +++ /dev/null @@ -1,75 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by resource.rc -// -#define IDD_OPT 101 -#define IDI_ENABLED 106 -#define IDI_ICON2 107 -#define IDI_DISABLED 107 -#define IDC_PREVIEW 1000 -#define IDC_CHKNOTIFY_MESSAGE 1001 -#define IDC_CHKNOTIFY_URL 1002 -#define IDC_CHKNOTIFY_FILE 1003 -#define IDC_CHKNOTIFY_OTHER 1004 -#define IDC_CHKMENUITEM 1005 -#define IDC_CHKDISABLE 1006 -#define IDC_CHKACTL_DISMISS 1007 -#define IDC_CHKACTL_OPEN 1008 -#define IDC_CHKACTL_REMOVE 1009 -#define IDC_CHKACTR_DISMISS 1010 -#define IDC_CHKACTR_OPEN 1011 -#define IDC_CHKACTR_REMOVE 1012 -#define IDC_CHKWINDOWCHECK 1013 -#define IDC_CHKREPLYWINDOW 1014 -#define IDC_CHKPREVIEW 1015 -#define IDC_CHKINFINITE 1016 -#define IDC_CHKHIDESEND 1016 -#define IDC_CHKDEFAULTCOL_MESSAGE 1017 -#define IDC_COLBACK_MESSAGE 1018 -#define IDC_COLTEXT_MESSAGE 1019 -#define IDC_CHKDEFAULTCOL_URL 1020 -#define IDC_COLBACK_URL 1021 -#define IDC_COLTEXT_URL 1022 -#define IDC_CHKDEFAULTCOL_FILE 1023 -#define IDC_COLBACK_FILE 1024 -#define IDC_COLTEXT_FILE 1025 -#define IDC_CHKDEFAULTCOL_OTHERS 1026 -#define IDC_COLBACK_OTHERS 1027 -#define IDC_COLTEXT_OTHERS 1028 -#define IDC_MERGEPOPUP 1029 -#define IDC_CHKINFINITE_MESSAGE 1029 -#define IDC_CHKMERGEPOPUP 1030 -#define IDC_DELAY_MESSAGE 1031 -#define IDC_DELAY_URL 1032 -#define IDC_DELAY_FILE 1033 -#define IDC_DELAY_OTHERS 1034 -#define IDC_NUMBERMSG 1035 -#define IDC_CHKSHOWDATE 1036 -#define IDC_CHKSHOWTIME 1037 -#define IDC_CHKSHOWHEADERS 1038 -#define IDC_RDNEW 1039 -#define IDC_RDOLD 1040 -#define IDC_LBNUMBERMSG 1041 -#define IDC_CHKINFINITE_URL 1042 -#define IDC_CHKINFINITE_FILE 1043 -#define IDC_CHKINFINITE_OTHERS 1044 -#define IDC_CHKMERGEPOPUP2 1045 -#define IDC_SUPRESSRSS 1045 -#define IDC_TESTFORREAD 1046 -#define IDC_READCHECK 1046 -#define IDC_CMDEDITHEADERS 1047 -#define IDC_CHKACTTE_DISMISS 1049 -#define IDC_CHKACTTE_OPEN 1050 -#define IDC_CHKACTTE_REMOVE 1051 -#define IDC_STATIC -1 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 108 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1048 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/plugins/NewEventNotify/resource.rc b/plugins/NewEventNotify/resource.rc deleted file mode 100644 index 8e18c89ae5..0000000000 --- a/plugins/NewEventNotify/resource.rc +++ /dev/null @@ -1,198 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "winres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_OPT DIALOGEX 0, 0, 314, 252 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -BEGIN - GROUPBOX "General Options",IDC_STATIC,6,2,199,43 - CONTROL "Show entry in the PopUps menu",IDC_CHKMENUITEM,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,10,11,190,10 - CONTROL "Temporarily disable Event Popups",IDC_CHKDISABLE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,10,21,190,10 - CONTROL "Show Preview of Event in Popup",IDC_CHKPREVIEW,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,10,31,190,10 - GROUPBOX "Popup Options",IDC_STATIC,6,45,199,75 - LTEXT "Message",IDC_STATIC,11,65,44,13 - LTEXT "URL",IDC_STATIC,11,78,44,13 - LTEXT "File",IDC_STATIC,11,91,44,13 - LTEXT "Others",IDC_STATIC,12,104,44,13 - LTEXT "Text",IDC_STATIC,56,54,23,8 - CONTROL "",IDC_COLTEXT_MESSAGE,"ColourPicker",WS_TABSTOP,56,65, - 24,13 - CONTROL "",IDC_COLTEXT_URL,"ColourPicker",WS_TABSTOP,56,77,24,13 - CONTROL "",IDC_COLTEXT_FILE,"ColourPicker",WS_TABSTOP,56,89,24, - 13 - CONTROL "",IDC_COLTEXT_OTHERS,"ColourPicker",WS_TABSTOP,56,101, - 24,13 - LTEXT "Background",IDC_STATIC,86,54,44,8 - CONTROL "",IDC_COLBACK_MESSAGE,"ColourPicker",WS_TABSTOP,86,65, - 24,13 - CONTROL "",IDC_COLBACK_URL,"ColourPicker",WS_TABSTOP,86,77,24,13 - CONTROL "",IDC_COLBACK_FILE,"ColourPicker",WS_TABSTOP,86,89,24, - 13 - CONTROL "",IDC_COLBACK_OTHERS,"ColourPicker",WS_TABSTOP,86,101, - 24,13 - CONTROL "",IDC_CHKDEFAULTCOL_MESSAGE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,133,65,11,10 - CONTROL "",IDC_CHKDEFAULTCOL_URL,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,133,78,11,10 - CONTROL "",IDC_CHKDEFAULTCOL_FILE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,133,91,11,10 - CONTROL "",IDC_CHKDEFAULTCOL_OTHERS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,133,103,11,10 - CTEXT "Time to expires",IDC_STATIC,144,52,48,10 - EDITTEXT IDC_DELAY_MESSAGE,155,62,26,13,ES_AUTOHSCROLL | - ES_NUMBER - EDITTEXT IDC_DELAY_URL,155,75,26,13,ES_AUTOHSCROLL | ES_NUMBER - EDITTEXT IDC_DELAY_FILE,155,88,26,13,ES_AUTOHSCROLL | ES_NUMBER - EDITTEXT IDC_DELAY_OTHERS,155,101,26,13,ES_AUTOHSCROLL | - ES_NUMBER - CONTROL "",IDC_CHKINFINITE_MESSAGE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,185,65,11,10 - CONTROL "",IDC_CHKINFINITE_URL,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,185,78,11,10 - CONTROL "",IDC_CHKINFINITE_FILE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,185,91,11,10 - CONTROL "",IDC_CHKINFINITE_OTHERS,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,185,103,11,10 - GROUPBOX "Notify me of ...",IDC_STATIC,208,2,100,56 - CONTROL "Message",IDC_CHKNOTIFY_MESSAGE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,212,11,90,10 - CONTROL "URL",IDC_CHKNOTIFY_URL,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,212,22,90,10 - CONTROL "File",IDC_CHKNOTIFY_FILE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,212,33,90,10 - CONTROL "Others",IDC_CHKNOTIFY_OTHER,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,212,44,90,10 - GROUPBOX "Left Click Actions",IDC_STATIC,208,58,100,44 - CONTROL "Dismiss Popup",IDC_CHKACTL_DISMISS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,212,67,90,10 - CONTROL "Open Event",IDC_CHKACTL_OPEN,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,212,78,90,10 - CONTROL "Dismiss Event",IDC_CHKACTL_REMOVE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,212,89,90,10 - GROUPBOX "Right Click Actions",IDC_STATIC,208,102,100,44 - CONTROL "Dismiss Popup",IDC_CHKACTR_DISMISS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,212,111,90,10 - CONTROL "Open Event",IDC_CHKACTR_OPEN,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,212,122,90,10 - CONTROL "Dismiss Event",IDC_CHKACTR_REMOVE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,212,133,90,10 - GROUPBOX "Time Expires Actions",IDC_STATIC,208,147,100,44 - CONTROL "Dismiss Popup",IDC_CHKACTTE_DISMISS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,212,156,90,10 - CONTROL "Open Event",IDC_CHKACTTE_OPEN,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,212,167,90,10 - CONTROL "Dismiss Event",IDC_CHKACTTE_REMOVE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,212,178,90,10 - GROUPBOX "Message-Event only",IDC_STATIC,6,120,199,131 - CONTROL "Don't show Popup when Message-Dialog is already open", - IDC_CHKWINDOWCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 10,129,192,10 - CONTROL "Hide Popup when sending new message",IDC_CHKHIDESEND, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,138,192,10 - CONTROL "Open Reply-Dialog instead of reading the Message", - IDC_CHKREPLYWINDOW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, - 10,147,192,10 - CONTROL "Merge popups from one user",IDC_CHKMERGEPOPUP,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,10,157,192,10 - PUSHBUTTON "Preview",IDC_PREVIEW,228,204,60,12 - CONTROL "Show Date",IDC_CHKSHOWDATE,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,166,84,10 - CONTROL "Show Time",IDC_CHKSHOWTIME,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,20,176,84,10 - CONTROL "Show Headers",IDC_CHKSHOWHEADERS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,20,186,84,10 - LTEXT "Number of begin shown messages",IDC_LBNUMBERMSG,20,195, - 143,8 - EDITTEXT IDC_NUMBERMSG,171,192,26,13,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "Last message display first",IDC_RDNEW,"Button", - BS_AUTORADIOBUTTON,19,205,107,9 - CONTROL "Last message display last",IDC_RDOLD,"Button", - BS_AUTORADIOBUTTON,19,216,111,9 - PUSHBUTTON "Edit",IDC_CMDEDITHEADERS,107,185,36,11 - CONTROL "No popups for RSS contacts",IDC_SUPRESSRSS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,10,227,192,10 - CONTROL "No popups for read messages",IDC_READCHECK,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,10,237,192,10 -END - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""winres.h""\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO -BEGIN - IDD_OPT, DIALOG - BEGIN - LEFTMARGIN, 0 - RIGHTMARGIN, 308 - VERTGUIDE, 10 - TOPMARGIN, 0 - BOTTOMMARGIN, 252 - HORZGUIDE, 250 - END -END -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_ENABLED ICON "res\\popup.ico" -IDI_DISABLED ICON "res\\popup_no.ico" -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - diff --git a/plugins/NewEventNotify/src/main.cpp b/plugins/NewEventNotify/src/main.cpp new file mode 100644 index 0000000000..850a01fa7a --- /dev/null +++ b/plugins/NewEventNotify/src/main.cpp @@ -0,0 +1,268 @@ +/* + Name: NewEventNotify - Plugin for Miranda IM + File: main.c - Main DLL procedures + Version: 0.2.2.2 + Description: Notifies you about some events + Author: jokusoftware, + Date: 18.07.02 13:59 / Update: 22.10.07 19:56 + Copyright: (C) 2002 Starzinger Michael + + 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 "neweventnotify.h" + +int g_IsSrmmServiceAvail = 0; +int g_IsSrmmWindowAPI = 0; +extern PLUGIN_DATA* PopUpList[20]; + +//--------------------------- +//---Some global variables for the plugin + +HINSTANCE hInst; +PLUGIN_OPTIONS pluginOptions; +int hLangpack; +PLUGININFOEX pluginInfo = { + sizeof(PLUGININFOEX), + "NewEventNotify", + PLUGIN_MAKE_VERSION(0, VER_MAJOR, VER_MINOR, VER_BUILD), + "Notifies you when you receive a message, url, file or any other event by displaying a popup. Uses the PopUp-Plugin by hrk. " + "Original plugin was written by icebreaker, modified by Prezes and some " + "bugfixes were made by vj, vlko, Nightwish, TheLeech and others. More fixes & updates by Joe @ Whale", + "icebreaker, Prezes, vj, vlko, Joe @ Whale", + "jokusoftware@miranda-im.org", + "GNU GPL", + "http://nightly.miranda.im/", + UNICODE_AWARE, + {0x3503D584, 0x6234, 0x4BEF, {0xA5, 0x53, 0x6C, 0x1B, 0x9C, 0xD4, 0x71, 0xF2 } } // {3503D584-6234-4BEF-A553-6C1B9CD471F2} +}; + +//--------------------------- +//---Hooks + +//---Handles to my hooks, needed to unhook them again +HANDLE hHookedInit; +HANDLE hHookedOpt; +HANDLE hHookedNewEvent; +HANDLE hHookedDeletedEvent; + +//---Called when a new event is added to the database +int HookedNewEvent(WPARAM wParam, LPARAM lParam) +//wParam: contact-handle +//lParam: dbevent-handle +{ + HANDLE hContact = (HANDLE)wParam; + DBEVENTINFO dbe = {0}; + PLUGIN_DATA* pdata; + DBEVENTTYPEDESCR* pei; + + //are popups currently enabled? + if (pluginOptions.bDisable) + return 0; + + //get DBEVENTINFO without pBlob + dbe.cbSize = sizeof(dbe); + CallService(MS_DB_EVENT_GET, (WPARAM)lParam, (LPARAM)&dbe); + + // Nightwish (no popups for RSS contacts at all...) + if (pluginOptions.bNoRSS) + { + if (dbe.szModule != NULL) { + if (!strncmp(dbe.szModule, "RSS", 3)) + return 0; + } + } + + //do not show popups for sub-contacts + if (hContact && ServiceExists(MS_MC_GETMETACONTACT) && CallService(MS_MC_GETMETACONTACT, (WPARAM)hContact, 0)) + return 0; + + //is it an event info about online/offline status user + if (dbe.eventType == 25368) + return 0; + + //custom database event types + if (ServiceExists(MS_DB_EVENT_GETTYPE)) + { + pei = (DBEVENTTYPEDESCR*)CallService(MS_DB_EVENT_GETTYPE, (WPARAM)dbe.szModule, (LPARAM)dbe.eventType); + if (pei && pei->cbSize >= DBEVENTTYPEDESCR_SIZE && pei->flags & DETF_NONOTIFY) + // ignore events according to flags + return 0; + } + + //if event was allready read don't show it + if (pluginOptions.bReadCheck && (dbe.flags & DBEF_READ)) + return 0; + + //is it an event sent by the user? -> don't show + if (dbe.flags & DBEF_SENT) + { + if (pluginOptions.bHideSend && NumberPopupData(hContact, EVENTTYPE_MESSAGE) != -1) + { // JK, only message event, do not influence others + pdata = PopUpList[NumberPopupData(hContact, EVENTTYPE_MESSAGE)]; + PopupAct(pdata->hWnd, MASK_DISMISS, pdata); // JK, only dismiss, i.e. do not kill event (e.g. file transfer) + } + return 0; + } + //which status do we have, are we allowed to post popups? + //UNDER CONSTRUCTION!!! + CallService(MS_CLIST_GETSTATUSMODE, 0, 0); /// TODO: JK: ???? + + if (dbe.eventType == EVENTTYPE_MESSAGE && (pluginOptions.bMsgWindowCheck && hContact && CheckMsgWnd(hContact))) + return 0; + + //is another popup for this contact already present? -> merge message popups if enabled + if (dbe.eventType == EVENTTYPE_MESSAGE && (pluginOptions.bMergePopup && NumberPopupData(hContact, EVENTTYPE_MESSAGE) != -1)) + { // JK, only merge with message events, do not mess with others + PopupUpdate(hContact, (HANDLE)lParam); + } + else + { //now finally show a popup + PopupShow(&pluginOptions, hContact, (HANDLE)lParam, (UINT)dbe.eventType); + } + return 0; +} + +//---Called when all the modules are loaded +int HookedInit(WPARAM wParam, LPARAM lParam) +{ + hHookedNewEvent = HookEvent(ME_DB_EVENT_ADDED, HookedNewEvent); + // Plugin sweeper support + if (ServiceExists("PluginSweeper/Add")) + CallService("PluginSweeper/Add", (WPARAM)MODULE, (LPARAM)MODULE); + + if (ServiceExists(MS_MSG_GETWINDOWDATA)) + g_IsSrmmWindowAPI = 1; + else + g_IsSrmmWindowAPI = 0; + + if (ServiceExists(MS_MSG_MOD_MESSAGEDIALOGOPENED)) + g_IsSrmmServiceAvail = 1; + else + g_IsSrmmServiceAvail = 0; + + return 0; +} + +//---Called when an options dialog has to be created +int HookedOptions(WPARAM wParam, LPARAM lParam) +{ + OptionsAdd(hInst, wParam); + + return 0; +} + +//--------------------------- +//---Exported Functions + +extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) +{ + return &pluginInfo; +} + +extern "C" __declspec(dllexport) const MUUID MirandaInterfaces[] = {MIID_EVENTNOTIFY, MIID_LAST}; + +extern "C" __declspec(dllexport) int Load(void) +{ + hHookedInit = HookEvent(ME_SYSTEM_MODULESLOADED, HookedInit); + hHookedOpt = HookEvent(ME_OPT_INITIALISE, HookedOptions); + + mir_getLP(&pluginInfo); + + OptionsInit(&pluginOptions); + pluginOptions.hInst = hInst; + + if (pluginOptions.bMenuitem) + MenuitemInit(!pluginOptions.bDisable); + + return 0; +} + +extern "C" __declspec(dllexport) int Unload(void) +{ + UnhookEvent(hHookedNewEvent); + UnhookEvent(hHookedOpt); + UnhookEvent(hHookedInit); + return 0; +} + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + hInst=hinstDLL; + return TRUE; +} + +//------------------------------------- +//---Check Window Message function + +// Took this snippet of code from "EventNotify" by micron-x, thx *g* +// checks if the message-dialog window is already opened +// return values: +// 0 - No window found +// 1 - Split-mode window found +// 2 - Single-mode window found + +int CheckMsgWnd(HANDLE hContact) +{ + if (g_IsSrmmWindowAPI) { + MessageWindowData mwd; + MessageWindowInputData mwid; + mwid.cbSize = sizeof(MessageWindowInputData); + mwid.hContact = hContact; + mwid.uFlags = MSG_WINDOW_UFLAG_MSG_BOTH; + mwd.cbSize = sizeof(MessageWindowData); + mwd.hContact = hContact; + if (!CallService(MS_MSG_GETWINDOWDATA, (WPARAM) &mwid, (LPARAM) &mwd)) { + if (mwd.hwndWindow != NULL && (mwd.uState & MSG_WINDOW_STATE_EXISTS)) return 1; + } + } + if (g_IsSrmmServiceAvail) { // use the service provided by tabSRMM + if (CallService(MS_MSG_MOD_MESSAGEDIALOGOPENED, (WPARAM)hContact, 0)) + return 1; + else + return 0; + } + else + { // old way: find it by using the window class & title + TCHAR newtitle[256]; + char *szProto; + TCHAR *contactName, *szStatus; + + szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); + contactName = (TCHAR*)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hContact, GCDNF_TCHAR); + szStatus = (TCHAR*)CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, szProto?DBGetContactSettingWord(hContact,szProto,"Status",ID_STATUS_OFFLINE):ID_STATUS_OFFLINE, GSMDF_TCHAR); + + // vj: This code was added by preeze and it does not work: + // vlko: it maybe work with other plugins + mir_sntprintf(newtitle, SIZEOF(newtitle), _T("%s (%s)"), contactName, szStatus); + if(FindWindow(_T("TMsgWindow"), newtitle)) + return 2; + + mir_sntprintf(newtitle, SIZEOF(newtitle), _T("[%s (%s)]"), contactName, szStatus); + if(FindWindow(_T("TfrmContainer"), newtitle)) + return 1; + + // vj: I have restored this code from original plugin's source: (NewEventNotify 0.0.4) + mir_sntprintf(newtitle, SIZEOF(newtitle), _T("%s (%s): %s"), contactName, szStatus, TranslateT("Message Session")); + if(FindWindow(_T("#32770"), newtitle)) // JK, this works for old SRMMs (1.0.4.x) and for mine SRMMJ + return 1; + + mir_sntprintf(newtitle, SIZEOF(newtitle), _T("%s (%s): %s"), contactName, szStatus, TranslateT("Message Received")); + if(FindWindow(_T("#32770"), newtitle)) + return 2; + + return 0; + } +} \ No newline at end of file diff --git a/plugins/NewEventNotify/src/menuitem.cpp b/plugins/NewEventNotify/src/menuitem.cpp new file mode 100644 index 0000000000..6831c204a1 --- /dev/null +++ b/plugins/NewEventNotify/src/menuitem.cpp @@ -0,0 +1,72 @@ +/* + Name: NewEventNotify - Plugin for Miranda IM + File: menuitem.c - Manages item(s) in the Miranda Menu + Version: 0.0.4 + Description: Notifies you about some events + Author: icebreaker, + Date: 22.07.02 19:56 / Update: 24.07.02 01:39 + Copyright: (C) 2002 Starzinger Michael + + 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 "neweventnotify.h" + +CLISTMENUITEM menuitem; +HANDLE hMenuitemNotify; +BOOL bNotify; + +static INT_PTR MenuitemNotifyCmd(WPARAM wParam,LPARAM lParam) +{ + bNotify = !bNotify; + MenuitemUpdate(bNotify); + + //write changes to options->bDisable and into database + Opt_DisableNEN(!bNotify); + return 0; +} + +int MenuitemUpdate(BOOL bStatus) +{ + //menuitem.flags = CMIM_FLAGS | (bStatus ? CMIF_CHECKED : 0); + menuitem.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(bStatus ? IDI_ENABLED : IDI_DISABLED)); + if (bStatus) + menuitem.ptszName = TranslateT(MENUITEM_DISABLE); + else + menuitem.ptszName = TranslateT(MENUITEM_ENABLE); + menuitem.flags = CMIM_ICON | CMIM_NAME | CMIF_KEEPUNTRANSLATED | CMIF_TCHAR; + CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hMenuitemNotify, (LPARAM)&menuitem); + + return 0; +} + +int MenuitemInit(BOOL bStatus) +{ + CreateServiceFunction(MS_NEN_MENUNOTIFY, MenuitemNotifyCmd); + + ZeroMemory(&menuitem, sizeof(menuitem)); + menuitem.cbSize = sizeof(CLISTMENUITEM); + menuitem.position = 1; + menuitem.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ENABLED)); + menuitem.ptszPopupName = TranslateT("PopUps"); + menuitem.pszService = MS_NEN_MENUNOTIFY; + menuitem.flags = CMIF_KEEPUNTRANSLATED | CMIF_TCHAR; + hMenuitemNotify = Menu_AddMainMenuItem(&menuitem); + + bNotify = bStatus; + MenuitemUpdate(bNotify); + + return 0; +} diff --git a/plugins/NewEventNotify/src/neweventnotify.h b/plugins/NewEventNotify/src/neweventnotify.h new file mode 100644 index 0000000000..3818e410e9 --- /dev/null +++ b/plugins/NewEventNotify/src/neweventnotify.h @@ -0,0 +1,234 @@ +/* + Name: NewEventNotify - Plugin for Miranda IM + File: neweventnotify.h - Main Header File + Version: 0.2.2.2 + Description: Notifies you about some events + Author: icebreaker, + Date: 18.07.02 13:59 / Update: 16.09.02 17:45 + Copyright: (C) 2002 Starzinger Michael + + 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 +*/ + +//--------------------------- +//---Includes +#define _CRT_SECURE_NO_WARNINGS +#define _CRT_NONSTDC_NO_DEPRECATE + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "resource.h" + +//VERY_PUBLIC Begin ... will be moved to m_neweventnotify.h +#define MS_NEN_MENUNOTIFY "NewEventNotify/MenuitemNotifyCommand" +//VERY_PUBLIC End + +#define MS_MSG_MOD_MESSAGEDIALOGOPENED "SRMsg_MOD/MessageDialogOpened" + +//--------------------------- +//---Definitions + +#define MODULE "NewEventNotify" +#define VER_MAJOR 2 +#define VER_MINOR 2 +#define VER_BUILD 3 +#define MAX_POPUPS 20 + +#define DEFAULT_COLBACK RGB(255,255,128) +#define DEFAULT_COLTEXT RGB(0,0,0) +#define DEFAULT_MASKNOTIFY (MASK_MESSAGE|MASK_URL|MASK_FILE|MASK_OTHER) +#define DEFAULT_MASKACTL (MASK_OPEN|MASK_REMOVE|MASK_DISMISS) +#define DEFAULT_MASKACTR (MASK_REMOVE|MASK_DISMISS) +#define DEFAULT_MASKACTE (MASK_DISMISS) +#define DEFAULT_DELAY -1 + +#define MASK_MESSAGE 0x0001 +#define MASK_URL 0x0002 +#define MASK_FILE 0x0004 +#define MASK_OTHER 0x0008 + +#define MASK_DISMISS 0x0001 +#define MASK_OPEN 0x0002 +#define MASK_REMOVE 0x0004 + +#define SETTING_LIFETIME_MIN 1 +#define SETTING_LIFETIME_MAX 60 +#define SETTING_LIFETIME_DEFAULT 20 + +#define MAX_DATASIZE 24 + +#ifndef WM_MOUSEWHEEL + #define WM_MOUSEWHEEL 0x020A +#endif +#define TIMER_TO_ACTION 50685 + +//Entries in the database, don't translate +#define OPT_DISABLE "Disabled" +#define OPT_PREVIEW "Preview" +#define OPT_MENUITEM "MenuItem" +#define OPT_COLDEFAULT_MESSAGE "DefaultColorMsg" +#define OPT_COLBACK_MESSAGE "ColorBackMsg" +#define OPT_COLTEXT_MESSAGE "ColorTextMsg" +#define OPT_COLDEFAULT_URL "DefaultColorUrl" +#define OPT_COLBACK_URL "ColorBackUrl" +#define OPT_COLTEXT_URL "ColorTextUrl" +#define OPT_COLDEFAULT_FILE "DefaultColorFile" +#define OPT_COLBACK_FILE "ColorBackFile" +#define OPT_COLTEXT_FILE "ColorTextFile" +#define OPT_COLDEFAULT_OTHERS "DefaultColorOthers" +#define OPT_COLBACK_OTHERS "ColorBackOthers" +#define OPT_COLTEXT_OTHERS "ColorTextOthers" +#define OPT_MASKNOTIFY "Notify" +#define OPT_MASKACTL "ActionLeft" +#define OPT_MASKACTR "ActionRight" +#define OPT_MASKACTTE "ActionTimeExpires" +#define OPT_MSGWINDOWCHECK "WindowCheck" +#define OPT_MSGREPLYWINDOW "ReplyWindow" +#define OPT_MERGEPOPUP "MergePopup" +#define OPT_DELAY_MESSAGE "DelayMessage" +#define OPT_DELAY_URL "DelayUrl" +#define OPT_DELAY_FILE "DelayFile" +#define OPT_DELAY_OTHERS "DelayOthers" +#define OPT_SHOW_DATE "ShowDate" +#define OPT_SHOW_TIME "ShowTime" +#define OPT_SHOW_HEADERS "ShowHeaders" +#define OPT_NUMBER_MSG "NumberMsg" +#define OPT_SHOW_ON "ShowOldOrNew" +#define OPT_HIDESEND "HideSend" +#define OPT_NORSS "NoRSSAnnounces" +#define OPT_READCHECK "ReadCheck" +//--------------------------- +//---Translateable Strings + +#define POPUP_COMMENT_MESSAGE "Message" +#define POPUP_COMMENT_URL "URL" +#define POPUP_COMMENT_FILE "File" +#define POPUP_COMMENT_CONTACTS "Contacts" +#define POPUP_COMMENT_ADDED "You were added!" +#define POPUP_COMMENT_AUTH "Requests your authorisation" +#define POPUP_COMMENT_WEBPAGER "ICQ Web pager" +#define POPUP_COMMENT_EMAILEXP "ICQ Email express" +#define POPUP_COMMENT_OTHER "Unknown Event" + +#define MENUITEM_NAME "Notify of new events" + +#define MENUITEM_ENABLE "Enable new event notification" +#define MENUITEM_DISABLE "Disable new event notification" + +//--------------------------- +//---Structures + +struct PLUGIN_OPTIONS +{ + HINSTANCE hInst; + BOOL bDisable; + BOOL bPreview; + BOOL bMenuitem; + BOOL bDefaultColorMsg; + BOOL bDefaultColorUrl; + BOOL bDefaultColorFile; + BOOL bDefaultColorOthers; + COLORREF colBackMsg; + COLORREF colTextMsg; + COLORREF colBackUrl; + COLORREF colTextUrl; + COLORREF colBackFile; + COLORREF colTextFile; + COLORREF colBackOthers; + COLORREF colTextOthers; + UINT maskNotify; + UINT maskActL; + UINT maskActR; + UINT maskActTE; + BOOL bMsgWindowCheck; + BOOL bMsgReplyWindow; + int iDelayMsg; + int iDelayUrl; + int iDelayFile; + int iDelayOthers; + int iDelayDefault; + BOOL bMergePopup; + BOOL bShowDate; + BOOL bShowTime; + BOOL bShowHeaders; + BYTE iNumberMsg; + BOOL bShowON; + BOOL bHideSend; + BOOL bNoRSS; + BOOL bReadCheck; +}; + +struct EVENT_DATA_EX +{ + HANDLE hEvent; + int number; + struct EVENT_DATA_EX* next; + struct EVENT_DATA_EX* prev; +}; + +struct PLUGIN_DATA +{ + UINT eventType; + HANDLE hContact; + PLUGIN_OPTIONS* pluginOptions; + HWND hWnd; + struct EVENT_DATA_EX* firstEventData; + struct EVENT_DATA_EX* firstShowEventData; + struct EVENT_DATA_EX* lastEventData; + long countEvent; + long iSeconds; + int iLock; +}; + +//--------------------------- +//---External Procedure Definitions + +int PopupShow(PLUGIN_OPTIONS* pluginOptions, HANDLE hContact, HANDLE hEvent, UINT eventType); +int PopupUpdate(HANDLE hContact, HANDLE hEvent); +int PopupPreview(PLUGIN_OPTIONS* pluginOptions); +int PopupAct(HWND hWnd, UINT mask, PLUGIN_DATA* pdata); +int OptionsInit(PLUGIN_OPTIONS* pluginOptions); +int OptionsAdd(HINSTANCE hInst, WPARAM addInfo); +int Opt_DisableNEN(BOOL Status); +int MenuitemInit(BOOL bStatus); +int MenuitemUpdate(BOOL bStatus); +int NumberPopupData(HANDLE hContact, int eventType); +int CheckMsgWnd(HANDLE hContact); + +extern HINSTANCE hInst; diff --git a/plugins/NewEventNotify/src/options.cpp b/plugins/NewEventNotify/src/options.cpp new file mode 100644 index 0000000000..2e22a9f5cd --- /dev/null +++ b/plugins/NewEventNotify/src/options.cpp @@ -0,0 +1,332 @@ +/* + Name: NewEventNotify - Plugin for Miranda IM + File: options.c - Manages Option Dialogs and Settings + Version: 0.0.4 + Description: Notifies you about some events + Author: icebreaker, + Date: 22.07.02 13:06 / Update: 16.09.02 17:45 + Copyright: (C) 2002 Starzinger Michael + + 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 "neweventnotify.h" + +PLUGIN_OPTIONS* options; +BOOL bWmNotify; + +int OptionsRead(void) +{ + options->bDisable = DBGetContactSettingByte(NULL, MODULE, OPT_DISABLE, FALSE); + options->bPreview = DBGetContactSettingByte(NULL, MODULE, OPT_PREVIEW, TRUE); + options->bMenuitem = DBGetContactSettingByte(NULL, MODULE, OPT_MENUITEM, FALSE); + options->bDefaultColorMsg = DBGetContactSettingByte(NULL, MODULE, OPT_COLDEFAULT_MESSAGE, FALSE); + options->bDefaultColorUrl = DBGetContactSettingByte(NULL, MODULE, OPT_COLDEFAULT_URL, FALSE); + options->bDefaultColorFile = DBGetContactSettingByte(NULL, MODULE, OPT_COLDEFAULT_FILE, FALSE); + options->bDefaultColorOthers = DBGetContactSettingByte(NULL, MODULE, OPT_COLDEFAULT_OTHERS, FALSE); + options->colBackMsg = (COLORREF)DBGetContactSettingDword(NULL, MODULE, OPT_COLBACK_MESSAGE, DEFAULT_COLBACK); + options->colTextMsg = (COLORREF)DBGetContactSettingDword(NULL, MODULE, OPT_COLTEXT_MESSAGE, DEFAULT_COLTEXT); + options->colBackUrl = (COLORREF)DBGetContactSettingDword(NULL, MODULE, OPT_COLBACK_URL, DEFAULT_COLBACK); + options->colTextUrl = (COLORREF)DBGetContactSettingDword(NULL, MODULE, OPT_COLTEXT_URL, DEFAULT_COLTEXT); + options->colBackFile = (COLORREF)DBGetContactSettingDword(NULL, MODULE, OPT_COLBACK_FILE, DEFAULT_COLBACK); + options->colTextFile = (COLORREF)DBGetContactSettingDword(NULL, MODULE, OPT_COLTEXT_FILE, DEFAULT_COLTEXT); + options->colBackOthers = (COLORREF)DBGetContactSettingDword(NULL, MODULE, OPT_COLBACK_OTHERS, DEFAULT_COLBACK); + options->colTextOthers = (COLORREF)DBGetContactSettingDword(NULL, MODULE, OPT_COLTEXT_OTHERS, DEFAULT_COLTEXT); + options->maskNotify = (UINT)DBGetContactSettingByte(NULL, MODULE, OPT_MASKNOTIFY, DEFAULT_MASKNOTIFY); + options->maskActL = (UINT)DBGetContactSettingByte(NULL, MODULE, OPT_MASKACTL, DEFAULT_MASKACTL); + options->maskActR = (UINT)DBGetContactSettingByte(NULL, MODULE, OPT_MASKACTR, DEFAULT_MASKACTR); + options->maskActTE = (UINT)DBGetContactSettingByte(NULL, MODULE, OPT_MASKACTTE, DEFAULT_MASKACTE); + options->bMsgWindowCheck = DBGetContactSettingByte(NULL, MODULE, OPT_MSGWINDOWCHECK, TRUE); + options->bMsgReplyWindow = DBGetContactSettingByte(NULL, MODULE, OPT_MSGREPLYWINDOW, FALSE); + options->bMergePopup = DBGetContactSettingByte(NULL, MODULE, OPT_MERGEPOPUP, TRUE); + options->iDelayMsg = (int)DBGetContactSettingDword(NULL, MODULE, OPT_DELAY_MESSAGE, DEFAULT_DELAY); + options->iDelayUrl = (int)DBGetContactSettingDword(NULL, MODULE, OPT_DELAY_URL, DEFAULT_DELAY); + options->iDelayFile = (int)DBGetContactSettingDword(NULL, MODULE, OPT_DELAY_FILE, DEFAULT_DELAY); + options->iDelayOthers = (int)DBGetContactSettingDword(NULL, MODULE, OPT_DELAY_OTHERS, DEFAULT_DELAY); + options->iDelayDefault = (int)DBGetContactSettingRangedWord(NULL, "PopUp", "Seconds", SETTING_LIFETIME_DEFAULT, SETTING_LIFETIME_MIN, SETTING_LIFETIME_MAX); + options->bShowDate = DBGetContactSettingByte(NULL, MODULE, OPT_SHOW_DATE, TRUE); + options->bShowTime = DBGetContactSettingByte(NULL, MODULE, OPT_SHOW_TIME, TRUE); + options->bShowHeaders = DBGetContactSettingByte(NULL, MODULE, OPT_SHOW_HEADERS, TRUE); + options->iNumberMsg = (BYTE)DBGetContactSettingByte(NULL, MODULE, OPT_NUMBER_MSG, TRUE); + options->bShowON = DBGetContactSettingByte(NULL, MODULE, OPT_SHOW_ON, TRUE); + options->bHideSend = DBGetContactSettingByte(NULL, MODULE, OPT_HIDESEND, TRUE); + options->bNoRSS = DBGetContactSettingByte(NULL, MODULE, OPT_NORSS, FALSE); + options->bReadCheck = DBGetContactSettingByte(NULL, MODULE, OPT_READCHECK, FALSE); + return 0; +} + +int OptionsWrite(void) +{ + DBWriteContactSettingByte(NULL, MODULE, OPT_DISABLE, options->bDisable); + DBWriteContactSettingByte(NULL, MODULE, OPT_PREVIEW, options->bPreview); + DBWriteContactSettingByte(NULL, MODULE, OPT_MENUITEM, options->bMenuitem); + DBWriteContactSettingByte(NULL, MODULE, OPT_COLDEFAULT_MESSAGE, options->bDefaultColorMsg); + DBWriteContactSettingByte(NULL, MODULE, OPT_COLDEFAULT_URL, options->bDefaultColorUrl); + DBWriteContactSettingByte(NULL, MODULE, OPT_COLDEFAULT_FILE, options->bDefaultColorFile); + DBWriteContactSettingByte(NULL, MODULE, OPT_COLDEFAULT_OTHERS, options->bDefaultColorOthers); + DBWriteContactSettingDword(NULL, MODULE, OPT_COLBACK_MESSAGE, (DWORD)options->colBackMsg); + DBWriteContactSettingDword(NULL, MODULE, OPT_COLTEXT_MESSAGE, (DWORD)options->colTextMsg); + DBWriteContactSettingDword(NULL, MODULE, OPT_COLBACK_URL, (DWORD)options->colBackUrl); + DBWriteContactSettingDword(NULL, MODULE, OPT_COLTEXT_URL, (DWORD)options->colTextUrl); + DBWriteContactSettingDword(NULL, MODULE, OPT_COLBACK_FILE, (DWORD)options->colBackFile); + DBWriteContactSettingDword(NULL, MODULE, OPT_COLTEXT_FILE, (DWORD)options->colTextFile); + DBWriteContactSettingDword(NULL, MODULE, OPT_COLBACK_OTHERS, (DWORD)options->colBackOthers); + DBWriteContactSettingDword(NULL, MODULE, OPT_COLTEXT_OTHERS, (DWORD)options->colTextOthers); + DBWriteContactSettingByte(NULL, MODULE, OPT_MASKNOTIFY, (BYTE)options->maskNotify); + DBWriteContactSettingByte(NULL, MODULE, OPT_MASKACTL, (BYTE)options->maskActL); + DBWriteContactSettingByte(NULL, MODULE, OPT_MASKACTR, (BYTE)options->maskActR); + DBWriteContactSettingByte(NULL, MODULE, OPT_MASKACTTE, (BYTE)options->maskActTE); + DBWriteContactSettingByte(NULL, MODULE, OPT_MSGWINDOWCHECK, options->bMsgWindowCheck); + DBWriteContactSettingByte(NULL, MODULE, OPT_MSGREPLYWINDOW, options->bMsgReplyWindow); + DBWriteContactSettingByte(NULL, MODULE, OPT_MERGEPOPUP, options->bMergePopup); + DBWriteContactSettingDword(NULL, MODULE, OPT_DELAY_MESSAGE, (DWORD)options->iDelayMsg); + DBWriteContactSettingDword(NULL, MODULE, OPT_DELAY_URL, (DWORD)options->iDelayUrl); + DBWriteContactSettingDword(NULL, MODULE, OPT_DELAY_FILE, (DWORD)options->iDelayFile); + DBWriteContactSettingDword(NULL, MODULE, OPT_DELAY_OTHERS, (DWORD)options->iDelayOthers); + DBWriteContactSettingByte(NULL, MODULE, OPT_SHOW_DATE, options->bShowDate); + DBWriteContactSettingByte(NULL, MODULE, OPT_SHOW_TIME, options->bShowTime); + DBWriteContactSettingByte(NULL, MODULE, OPT_SHOW_HEADERS, options->bShowHeaders); + DBWriteContactSettingByte(NULL, MODULE, OPT_NUMBER_MSG, (BYTE)options->iNumberMsg); + DBWriteContactSettingByte(NULL, MODULE, OPT_SHOW_ON, options->bShowON); + DBWriteContactSettingByte(NULL, MODULE, OPT_HIDESEND, options->bHideSend); + DBWriteContactSettingByte(NULL, MODULE, OPT_NORSS, options->bNoRSS); + DBWriteContactSettingByte(NULL, MODULE, OPT_READCHECK, options->bReadCheck); + return 0; +} + +static void SetCheckBoxState(HWND hWnd, int iCtrl, BOOL bState) +{ + CheckDlgButton(hWnd, iCtrl, bState ? BST_CHECKED : BST_UNCHECKED); +} + +static void EnableDlgItem(HWND hWnd, int iCtrl, BOOL bEnable) +{ + EnableWindow(GetDlgItem(hWnd, iCtrl), bEnable); +} + +static void UpdateOptionsDlgItemsState(HWND hWnd) +{ + //disable color picker when using default colors + EnableDlgItem(hWnd, IDC_COLBACK_MESSAGE, !options->bDefaultColorMsg); + EnableDlgItem(hWnd, IDC_COLTEXT_MESSAGE, !options->bDefaultColorMsg); + EnableDlgItem(hWnd, IDC_COLBACK_URL, !options->bDefaultColorUrl); + EnableDlgItem(hWnd, IDC_COLTEXT_URL, !options->bDefaultColorUrl); + EnableDlgItem(hWnd, IDC_COLBACK_FILE, !options->bDefaultColorFile); + EnableDlgItem(hWnd, IDC_COLTEXT_FILE, !options->bDefaultColorFile); + EnableDlgItem(hWnd, IDC_COLBACK_OTHERS, !options->bDefaultColorOthers); + EnableDlgItem(hWnd, IDC_COLTEXT_OTHERS, !options->bDefaultColorOthers); + //disable merge messages options when is not using + EnableDlgItem(hWnd, IDC_CHKSHOWDATE, options->bMergePopup); + EnableDlgItem(hWnd, IDC_CHKSHOWTIME, options->bMergePopup); + EnableDlgItem(hWnd, IDC_CHKSHOWHEADERS, options->bMergePopup); + EnableDlgItem(hWnd, IDC_CMDEDITHEADERS, options->bMergePopup && options->bShowHeaders); + EnableDlgItem(hWnd, IDC_NUMBERMSG, options->bMergePopup); + EnableDlgItem(hWnd, IDC_LBNUMBERMSG, options->bMergePopup); + EnableDlgItem(hWnd, IDC_RDNEW, options->bMergePopup && options->iNumberMsg); + EnableDlgItem(hWnd, IDC_RDOLD, options->bMergePopup && options->iNumberMsg); + //disable delay textbox when infinite is checked + EnableDlgItem(hWnd, IDC_DELAY_MESSAGE, options->iDelayMsg != -1); + EnableDlgItem(hWnd, IDC_DELAY_URL, options->iDelayUrl != -1); + EnableDlgItem(hWnd, IDC_DELAY_FILE, options->iDelayFile != -1); + EnableDlgItem(hWnd, IDC_DELAY_OTHERS, options->iDelayOthers != -1); +} + +static INT_PTR CALLBACK OptionsDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG: + TranslateDialogDefault(hWnd); + //make dialog represent the current options + bWmNotify = TRUE; + SendDlgItemMessage(hWnd, IDC_COLBACK_MESSAGE, CPM_SETCOLOUR, 0, options->colBackMsg); + SendDlgItemMessage(hWnd, IDC_COLTEXT_MESSAGE, CPM_SETCOLOUR, 0, options->colTextMsg); + SendDlgItemMessage(hWnd, IDC_COLBACK_URL, CPM_SETCOLOUR, 0, options->colBackUrl); + SendDlgItemMessage(hWnd, IDC_COLTEXT_URL, CPM_SETCOLOUR, 0, options->colTextUrl); + SendDlgItemMessage(hWnd, IDC_COLBACK_FILE, CPM_SETCOLOUR, 0, options->colBackFile); + SendDlgItemMessage(hWnd, IDC_COLTEXT_FILE, CPM_SETCOLOUR, 0, options->colTextFile); + SendDlgItemMessage(hWnd, IDC_COLBACK_OTHERS, CPM_SETCOLOUR, 0, options->colBackOthers); + SendDlgItemMessage(hWnd, IDC_COLTEXT_OTHERS, CPM_SETCOLOUR, 0, options->colTextOthers); + SetCheckBoxState(hWnd, IDC_CHKDEFAULTCOL_MESSAGE, options->bDefaultColorMsg); + SetCheckBoxState(hWnd, IDC_CHKDEFAULTCOL_URL, options->bDefaultColorUrl); + SetCheckBoxState(hWnd, IDC_CHKDEFAULTCOL_FILE, options->bDefaultColorFile); + SetCheckBoxState(hWnd, IDC_CHKDEFAULTCOL_OTHERS, options->bDefaultColorOthers); + SetCheckBoxState(hWnd, IDC_CHKMENUITEM, options->bMenuitem); + SetCheckBoxState(hWnd, IDC_CHKDISABLE, options->bDisable); + SetCheckBoxState(hWnd, IDC_CHKPREVIEW, options->bPreview); + SetCheckBoxState(hWnd, IDC_CHKMERGEPOPUP, options->bMergePopup); + SetCheckBoxState(hWnd, IDC_CHKNOTIFY_MESSAGE, options->maskNotify & MASK_MESSAGE); + SetCheckBoxState(hWnd, IDC_CHKNOTIFY_URL, options->maskNotify & MASK_URL); + SetCheckBoxState(hWnd, IDC_CHKNOTIFY_FILE, options->maskNotify & MASK_FILE); + SetCheckBoxState(hWnd, IDC_CHKNOTIFY_OTHER, options->maskNotify & MASK_OTHER); + SetCheckBoxState(hWnd, IDC_CHKACTL_DISMISS, options->maskActL & MASK_DISMISS); + SetCheckBoxState(hWnd, IDC_CHKACTL_OPEN, options->maskActL & MASK_OPEN); + SetCheckBoxState(hWnd, IDC_CHKACTL_REMOVE, options->maskActL & MASK_REMOVE); + SetCheckBoxState(hWnd, IDC_CHKACTR_DISMISS, options->maskActR & MASK_DISMISS); + SetCheckBoxState(hWnd, IDC_CHKACTR_OPEN, options->maskActR & MASK_OPEN); + SetCheckBoxState(hWnd, IDC_CHKACTR_REMOVE, options->maskActR & MASK_REMOVE); + SetCheckBoxState(hWnd, IDC_CHKACTTE_DISMISS, options->maskActTE & MASK_DISMISS); + SetCheckBoxState(hWnd, IDC_CHKACTTE_OPEN, options->maskActTE & MASK_OPEN); + SetCheckBoxState(hWnd, IDC_CHKACTTE_REMOVE, options->maskActTE & MASK_REMOVE); + SetCheckBoxState(hWnd, IDC_CHKWINDOWCHECK, options->bMsgWindowCheck); + SetCheckBoxState(hWnd, IDC_CHKREPLYWINDOW, options->bMsgReplyWindow); + SetCheckBoxState(hWnd, IDC_CHKSHOWDATE, options->bShowDate); + SetCheckBoxState(hWnd, IDC_CHKSHOWTIME, options->bShowTime); + SetCheckBoxState(hWnd, IDC_CHKSHOWHEADERS, options->bShowHeaders); + SetCheckBoxState(hWnd, IDC_RDNEW, !options->bShowON); + SetCheckBoxState(hWnd, IDC_RDOLD, options->bShowON); + SetCheckBoxState(hWnd, IDC_CHKHIDESEND, options->bHideSend); + SetCheckBoxState(hWnd, IDC_SUPRESSRSS, options->bNoRSS); + SetCheckBoxState(hWnd, IDC_READCHECK, options->bReadCheck); + SetCheckBoxState(hWnd, IDC_CHKINFINITE_MESSAGE, options->iDelayMsg == -1); + SetCheckBoxState(hWnd, IDC_CHKINFINITE_URL, options->iDelayUrl == -1); + SetCheckBoxState(hWnd, IDC_CHKINFINITE_FILE, options->iDelayFile == -1); + SetCheckBoxState(hWnd, IDC_CHKINFINITE_OTHERS, options->iDelayOthers == -1); + SetDlgItemInt(hWnd, IDC_DELAY_MESSAGE, options->iDelayMsg != -1?options->iDelayMsg:0, TRUE); + SetDlgItemInt(hWnd, IDC_DELAY_URL, options->iDelayUrl != -1?options->iDelayUrl:0, TRUE); + SetDlgItemInt(hWnd, IDC_DELAY_FILE, options->iDelayFile != -1?options->iDelayFile:0, TRUE); + SetDlgItemInt(hWnd, IDC_DELAY_OTHERS, options->iDelayOthers != -1?options->iDelayOthers:0, TRUE); + SetDlgItemInt(hWnd, IDC_NUMBERMSG, options->iNumberMsg, FALSE); + //update items' states + UpdateOptionsDlgItemsState(hWnd); + bWmNotify = FALSE; + return TRUE; + + case WM_COMMAND: + if (!bWmNotify) + { + switch (LOWORD(wParam)) + { + case IDC_PREVIEW: + PopupPreview(options); + break; + default: + //update options + options->maskNotify = (IsDlgButtonChecked(hWnd, IDC_CHKNOTIFY_MESSAGE)?MASK_MESSAGE:0) | + (IsDlgButtonChecked(hWnd, IDC_CHKNOTIFY_URL)?MASK_URL:0) | + (IsDlgButtonChecked(hWnd, IDC_CHKNOTIFY_FILE)?MASK_FILE:0) | + (IsDlgButtonChecked(hWnd, IDC_CHKNOTIFY_OTHER)?MASK_OTHER:0); + options->maskActL = (IsDlgButtonChecked(hWnd, IDC_CHKACTL_DISMISS)?MASK_DISMISS:0) | + (IsDlgButtonChecked(hWnd, IDC_CHKACTL_OPEN)?MASK_OPEN:0) | + (IsDlgButtonChecked(hWnd, IDC_CHKACTL_REMOVE)?MASK_REMOVE:0); + options->maskActR = (IsDlgButtonChecked(hWnd, IDC_CHKACTR_DISMISS)?MASK_DISMISS:0) | + (IsDlgButtonChecked(hWnd, IDC_CHKACTR_OPEN)?MASK_OPEN:0) | + (IsDlgButtonChecked(hWnd, IDC_CHKACTR_REMOVE)?MASK_REMOVE:0); + options->maskActTE = (IsDlgButtonChecked(hWnd, IDC_CHKACTTE_DISMISS)?MASK_DISMISS:0) | + (IsDlgButtonChecked(hWnd, IDC_CHKACTTE_OPEN)?MASK_OPEN:0) | + (IsDlgButtonChecked(hWnd, IDC_CHKACTTE_REMOVE)?MASK_REMOVE:0); + options->bDefaultColorMsg = IsDlgButtonChecked(hWnd, IDC_CHKDEFAULTCOL_MESSAGE); + options->bDefaultColorUrl = IsDlgButtonChecked(hWnd, IDC_CHKDEFAULTCOL_URL); + options->bDefaultColorFile = IsDlgButtonChecked(hWnd, IDC_CHKDEFAULTCOL_FILE); + options->bDefaultColorOthers = IsDlgButtonChecked(hWnd, IDC_CHKDEFAULTCOL_OTHERS); + options->bMenuitem = IsDlgButtonChecked(hWnd, IDC_CHKMENUITEM); + options->bDisable = IsDlgButtonChecked(hWnd, IDC_CHKDISABLE); + options->bPreview = IsDlgButtonChecked(hWnd, IDC_CHKPREVIEW); + options->iDelayMsg = IsDlgButtonChecked(hWnd, IDC_CHKINFINITE_MESSAGE)?-1:(DWORD)GetDlgItemInt(hWnd, IDC_DELAY_MESSAGE, NULL, FALSE); + options->iDelayUrl = IsDlgButtonChecked(hWnd, IDC_CHKINFINITE_URL)?-1:(DWORD)GetDlgItemInt(hWnd, IDC_DELAY_URL, NULL, FALSE); + options->iDelayFile = IsDlgButtonChecked(hWnd, IDC_CHKINFINITE_FILE)?-1:(DWORD)GetDlgItemInt(hWnd, IDC_DELAY_FILE, NULL, FALSE); + options->iDelayOthers = IsDlgButtonChecked(hWnd, IDC_CHKINFINITE_OTHERS)?-1:(DWORD)GetDlgItemInt(hWnd, IDC_DELAY_OTHERS, NULL, FALSE); + options->bMergePopup = IsDlgButtonChecked(hWnd, IDC_CHKMERGEPOPUP); + options->bMsgWindowCheck = IsDlgButtonChecked(hWnd, IDC_CHKWINDOWCHECK); + options->bMsgReplyWindow = IsDlgButtonChecked(hWnd, IDC_CHKREPLYWINDOW); + options->bShowDate = IsDlgButtonChecked(hWnd, IDC_CHKSHOWDATE); + options->bShowTime = IsDlgButtonChecked(hWnd, IDC_CHKSHOWTIME); + options->bShowHeaders = IsDlgButtonChecked(hWnd, IDC_CHKSHOWHEADERS); + options->bShowON = IsDlgButtonChecked(hWnd, IDC_RDOLD); + options->bShowON = !IsDlgButtonChecked(hWnd, IDC_RDNEW); + options->bHideSend = IsDlgButtonChecked(hWnd, IDC_CHKHIDESEND); + options->iNumberMsg = GetDlgItemInt(hWnd, IDC_NUMBERMSG, NULL, FALSE); + options->bNoRSS = IsDlgButtonChecked(hWnd, IDC_SUPRESSRSS); + options->bReadCheck = IsDlgButtonChecked(hWnd, IDC_READCHECK); + //update items' states + UpdateOptionsDlgItemsState(hWnd); + if (HIWORD(wParam) == CPN_COLOURCHANGED) + { + options->colBackMsg = SendDlgItemMessage(hWnd, IDC_COLBACK_MESSAGE, CPM_GETCOLOUR, 0, 0); + options->colTextMsg = SendDlgItemMessage(hWnd, IDC_COLTEXT_MESSAGE, CPM_GETCOLOUR, 0, 0); + options->colBackUrl = SendDlgItemMessage(hWnd, IDC_COLBACK_URL, CPM_GETCOLOUR, 0, 0); + options->colTextUrl = SendDlgItemMessage(hWnd, IDC_COLTEXT_URL, CPM_GETCOLOUR, 0, 0); + options->colBackFile = SendDlgItemMessage(hWnd, IDC_COLBACK_FILE, CPM_GETCOLOUR, 0, 0); + options->colTextFile = SendDlgItemMessage(hWnd, IDC_COLTEXT_FILE, CPM_GETCOLOUR, 0, 0); + options->colBackOthers = SendDlgItemMessage(hWnd, IDC_COLBACK_OTHERS, CPM_GETCOLOUR, 0, 0); + options->colTextOthers = SendDlgItemMessage(hWnd, IDC_COLTEXT_OTHERS, CPM_GETCOLOUR, 0, 0); + } + //send changes to menuitem + MenuitemUpdate(!options->bDisable); + //enable "Apply" button + SendMessage(GetParent(hWnd), PSM_CHANGED, 0, 0); + break; + } + } + break; + + case WM_NOTIFY: + switch (((LPNMHDR)lParam)->code) + { + case PSN_APPLY: + OptionsWrite(); + break; + + case PSN_RESET: + OptionsRead(); + + //maybe something changed with the menuitem + MenuitemUpdate(!options->bDisable); + break; + } + break; + + default: + break; + } + return FALSE; +} + +int OptionsAdd(HINSTANCE hInst, WPARAM addInfo) +{ + if (ServiceExists(MS_POPUP_ADDPOPUP)) { + OPTIONSDIALOGPAGE odp = { 0 }; + odp.cbSize = sizeof(odp); + odp.hInstance = hInst; + odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT); + odp.pszTitle = LPGEN("Event Notify"); + odp.pszGroup = LPGEN("PopUps"); + odp.flags = ODPF_BOLDGROUPS; + odp.pfnDlgProc = OptionsDlgProc; + Options_AddPage( addInfo, &odp); + } + + return 0; +} + +int OptionsInit(PLUGIN_OPTIONS* pluginOptions) +{ + options = pluginOptions; + + OptionsRead(); + + return 0; +} + +int Opt_DisableNEN(BOOL Status) +{ + options->bDisable = Status; + OptionsWrite(); // JK: really necessary to write everything here ???? + + //BUG! + //Update options dialog if open! + + return 0; +} diff --git a/plugins/NewEventNotify/src/popup.cpp b/plugins/NewEventNotify/src/popup.cpp new file mode 100644 index 0000000000..355ef6cc86 --- /dev/null +++ b/plugins/NewEventNotify/src/popup.cpp @@ -0,0 +1,614 @@ +/* + Name: NewEventNotify - Plugin for Miranda IM + File: popup.c - Displays a popup using the popup-plugin by hrk + Version: 2.2.3 + Description: Notifies you about some events + Author: icebreaker, + Date: 21.07.02 15:46 / Update: 16.09.02 17:45 + Copyright: (C) 2002 Starzinger Michael + + 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 "neweventnotify.h" + +extern int g_IsServiceAvail; + +static int PopupCount = 0; + +PLUGIN_DATA* PopUpList[MAX_POPUPS]; + +int NumberPopupData(HANDLE hContact, int eventType) +{ + for (int n=0; n < MAX_POPUPS; n++) { + if (!PopUpList[n] && !hContact && eventType == -1) + return n; + + if (PopUpList[n] && (PopUpList[n]->hContact == hContact) && (PopUpList[n]->iLock == 0) && (eventType == -1 || PopUpList[n]->eventType == (UINT)eventType)) + return n; + } + return -1; +} + +static int FindPopupData(PLUGIN_DATA* pdata) +{ + for (int n=0; n < MAX_POPUPS; n++) + if (PopUpList[n] == pdata) + return n; + + return -1; +} + +static void FreePopupEventData(PLUGIN_DATA* pdata) +{ + pdata->iLock = 1; + EVENT_DATA_EX* eventData = pdata->firstEventData; + while (eventData) { + if (eventData->next) { + eventData = eventData->next; + mir_free(eventData->prev); + eventData->prev = NULL; + } + else { + mir_free(eventData); + eventData = NULL; + } + } + pdata->lastEventData = pdata->firstEventData = pdata->firstShowEventData = NULL; + // remove from popup list if present + if (FindPopupData(pdata) != -1) + PopUpList[FindPopupData(pdata)] = NULL; +} + +int PopupAct(HWND hWnd, UINT mask, PLUGIN_DATA* pdata) +{ + EVENT_DATA_EX* eventData; + if (mask & MASK_OPEN) { + if (pdata) { + // do MS_MSG_SENDMESSAGE instead if wanted to reply and not read! + if (pdata->pluginOptions->bMsgReplyWindow && pdata->eventType == EVENTTYPE_MESSAGE) + CallServiceSync(MS_MSG_SENDMESSAGE, (WPARAM)pdata->hContact, (LPARAM)NULL); // JK, use core (since 0.3.3+) + else { + CLISTEVENT* cle; + int idx = 0; + + eventData = pdata->firstEventData; + if (eventData) + { + do { //try to find the correct clist event //JK + cle = (CLISTEVENT*)CallService(MS_CLIST_GETEVENT, (WPARAM)pdata->hContact, idx); + if (cle && cle->hDbEvent == eventData->hEvent) + { + if (ServiceExists(cle->pszService)) + CallServiceSync(cle->pszService, (WPARAM)NULL, (LPARAM)cle); // JK, use core (since 0.3.3+) + break; + } + idx++; + } + while (cle); + } + } + } + } + + if (mask & MASK_REMOVE) { + if (pdata) { + eventData = pdata->firstEventData; + pdata->iLock = 1; + while (eventData) { + CallService(MS_CLIST_REMOVEEVENT, (WPARAM)pdata->hContact, (LPARAM)eventData->hEvent); + CallService(MS_DB_EVENT_MARKREAD, (WPARAM)pdata->hContact, (LPARAM)eventData->hEvent); + eventData = eventData->next; + } + FreePopupEventData(pdata); + } + } + + if (mask & MASK_DISMISS) { + KillTimer(hWnd, TIMER_TO_ACTION); + FreePopupEventData(pdata); + PUDeletePopUp(hWnd); + } + + return 0; +} + +static BOOL CALLBACK PopupDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + PLUGIN_DATA* pdata = NULL; + + pdata = (PLUGIN_DATA*)CallService(MS_POPUP_GETPLUGINDATA, (WPARAM)hWnd, (LPARAM)pdata); + if (!pdata) return FALSE; + + switch (message) { + case WM_COMMAND: + PopupAct(hWnd, pdata->pluginOptions->maskActL, pdata); + break; + case WM_CONTEXTMENU: + PopupAct(hWnd, pdata->pluginOptions->maskActR, pdata); + break; + case UM_FREEPLUGINDATA: + PopupCount--; + mir_free(pdata); + return TRUE; + case UM_INITPOPUP: + pdata->hWnd = hWnd; + SetTimer(hWnd, TIMER_TO_ACTION, pdata->iSeconds * 1000, NULL); + break; + case WM_MOUSEWHEEL: + if ((short)HIWORD(wParam) > 0 && pdata->firstShowEventData->prev && + (pdata->pluginOptions->bShowON || pdata->firstShowEventData->number >= pdata->pluginOptions->iNumberMsg)) + { + pdata->firstShowEventData = pdata->firstShowEventData->prev; + PopupUpdate(pdata->hContact, NULL); + } + if ((short)HIWORD(wParam) < 0 && pdata->firstShowEventData->next && + (!pdata->pluginOptions->bShowON || pdata->countEvent - pdata->firstShowEventData->number >= pdata->pluginOptions->iNumberMsg)) + { + pdata->firstShowEventData = pdata->firstShowEventData->next; + PopupUpdate(pdata->hContact, NULL); + } + break; + case WM_SETCURSOR: + SetFocus(hWnd); + break; + case WM_TIMER: + if (wParam != TIMER_TO_ACTION) + break; + PopupAct(hWnd, pdata->pluginOptions->maskActTE, pdata); + break; + default: + break; + } + return DefWindowProc(hWnd, message, wParam, lParam); +} + +static TCHAR* GetEventPreview(DBEVENTINFO *dbei) +{ + TCHAR* comment1 = NULL; + TCHAR* comment2 = NULL; + char* commentFix = NULL; + + //now get text + switch (dbei->eventType) { + case EVENTTYPE_MESSAGE: + if (dbei->pBlob) { + if (dbei->flags & DBEF_UTF) { + // utf-8 in blob + comment1 = mir_utf8decodeT((char*)dbei->pBlob); + } + else if (dbei->cbBlob == (_tcslen((TCHAR *)dbei->pBlob)+1)*(sizeof(TCHAR)+1)) { + // wchar in blob (the old hack) + comment1 = mir_tstrdup((TCHAR*)dbei->pBlob); + } + else comment1 = mir_a2t((char *)dbei->pBlob); + } + commentFix = POPUP_COMMENT_MESSAGE; + break; + + case EVENTTYPE_URL: + // url + if (dbei->pBlob) comment2 = mir_a2t((char *)dbei->pBlob); + // comment + if (dbei->pBlob) comment1 = mir_a2t((char *)dbei->pBlob + strlen((char *)dbei->pBlob) + 1); + commentFix = POPUP_COMMENT_URL; + break; + + case EVENTTYPE_FILE: + // filenames + if (dbei->pBlob) { + if (dbei->flags & DBEF_UTF) + comment2 = mir_utf8decodeT((char*)dbei->pBlob + 4); + else + comment2 = mir_a2t((char*)dbei->pBlob + 4); + } + // description + if (dbei->pBlob) { + if (dbei->flags & DBEF_UTF) + comment1 = mir_utf8decodeT((char *)dbei->pBlob + strlen((char *)dbei->pBlob + 4) + 1); + else + comment1 = mir_a2t((char *)dbei->pBlob + strlen((char *)dbei->pBlob + 4) + 1); + } + commentFix = POPUP_COMMENT_FILE; + break; + + //blob format is: + //ASCIIZ nick + //ASCIIZ UID + case EVENTTYPE_CONTACTS: + if (dbei->pBlob) { + // count contacts in event + char* pcBlob = (char *)dbei->pBlob; + char* pcEnd = (char *)(dbei->pBlob + dbei->cbBlob); + int nContacts; + TCHAR szBuf[512]; + + for (nContacts = 1; ; nContacts++) { + // Nick + pcBlob += strlen(pcBlob) + 1; + // UIN + pcBlob += strlen(pcBlob) + 1; + // check for end of contacts + if (pcBlob >= pcEnd) + break; + } + mir_sntprintf(szBuf, SIZEOF(szBuf), TranslateT("Received %d contacts."), nContacts); + comment1 = mir_tstrdup(szBuf); + } + commentFix = POPUP_COMMENT_CONTACTS; + break; + + //blob format is: + //DWORD numeric uin (ICQ only afaik) + //DWORD HANDLE to contact + //ASCIIZ nick (or text UID) + //ASCIIZ first name + //ASCIIZ last name + //ASCIIZ email (or YID) + case EVENTTYPE_ADDED: + if (dbei->pBlob) { + char szUin[16]; + TCHAR szBuf[2048]; + TCHAR* szNick = NULL; + char *pszNick = (char *)dbei->pBlob + 8; + char *pszFirst = pszNick + strlen(pszNick) + 1; + char *pszLast = pszFirst + strlen(pszFirst) + 1; + char *pszEmail = pszLast + strlen(pszLast) + 1; + + _snprintf(szUin, 16, "%d", *((DWORD*)dbei->pBlob)); + if (strlen(pszNick) > 0) { + if (dbei->flags & DBEF_UTF) + szNick = mir_utf8decodeT(pszNick); + else + szNick = mir_a2t(pszNick); + } + else if (strlen(pszEmail) > 0) { + if (dbei->flags & DBEF_UTF) + szNick = mir_utf8decodeT(pszEmail); + else + szNick = mir_a2t(pszEmail); + } + else if (*((DWORD*)dbei->pBlob) > 0) + szNick = mir_a2t(szUin); + + if (szNick) { + _tcscpy(szBuf, szNick); + _tcscat(szBuf, TranslateT(" added you to the contact list")); + mir_free(szNick); + comment1 = mir_tstrdup(szBuf); + } + } + commentFix = POPUP_COMMENT_ADDED; + break; + + case EVENTTYPE_AUTHREQUEST: + if (dbei->pBlob) { + char szUin[16]; + TCHAR szBuf[2048]; + TCHAR* szNick = NULL; + char *pszNick = (char *)dbei->pBlob + 8; + char *pszFirst = pszNick + strlen(pszNick) + 1; + char *pszLast = pszFirst + strlen(pszFirst) + 1; + char *pszEmail = pszLast + strlen(pszLast) + 1; + + _snprintf(szUin, 16, "%d", *((DWORD*)dbei->pBlob)); + if (strlen(pszNick) > 0) { + if (dbei->flags & DBEF_UTF) + szNick = mir_utf8decodeT(pszNick); + else + szNick = mir_a2t(pszNick); + } + else if (strlen(pszEmail) > 0) { + if (dbei->flags & DBEF_UTF) + szNick = mir_utf8decodeT(pszEmail); + else + szNick = mir_a2t(pszEmail); + } + else if (*((DWORD*)dbei->pBlob) > 0) + szNick = mir_a2t(szUin); + + if (szNick) { + _tcscpy(szBuf, szNick); + _tcscat(szBuf, TranslateT(" requested authorization")); + mir_free(szNick); + comment1 = mir_tstrdup(szBuf); + } + } + commentFix = POPUP_COMMENT_AUTH; + break; + + //blob format is: + //ASCIIZ text, usually "Sender IP: xxx.xxx.xxx.xxx\r\n%s" + //ASCIIZ from name + //ASCIIZ from e-mail + case ICQEVENTTYPE_WEBPAGER: + if (dbei->pBlob) comment1 = mir_a2t((const char *)dbei->pBlob); + commentFix = POPUP_COMMENT_WEBPAGER; + break; + + //blob format is: + //ASCIIZ text, usually of the form "Subject: %s\r\n%s" + //ASCIIZ from name + //ASCIIZ from e-mail + case ICQEVENTTYPE_EMAILEXPRESS: + if (dbei->pBlob) comment1 = mir_a2t((const char *)dbei->pBlob); + commentFix = POPUP_COMMENT_EMAILEXP; + break; + + default: + if (ServiceExists(MS_DB_EVENT_GETTYPE)) { + DBEVENTTYPEDESCR* pei = (DBEVENTTYPEDESCR*)CallService(MS_DB_EVENT_GETTYPE, (WPARAM)dbei->szModule, (LPARAM)dbei->eventType); + // support for custom database event types + if (pei && pei->cbSize >= DBEVENTTYPEDESCR_SIZE_V1) { + // preview requested + if (dbei->pBlob) { + DBEVENTGETTEXT svc = {dbei, DBVT_TCHAR, CP_ACP}; + TCHAR *pet = (TCHAR*)CallService(MS_DB_EVENT_GETTEXT, 0, (LPARAM)&svc); + if (pet) { + // we've got event text, move to our memory space + comment1 = mir_tstrdup(pet); + mir_free(pet); + } + } + commentFix = pei->descr; + } + else commentFix = POPUP_COMMENT_OTHER; + } + else commentFix = POPUP_COMMENT_OTHER; + } + + if ( lstrlen(comment1) > 0) { + mir_free(comment2); + return comment1; + } + if ( lstrlen(comment2) > 0) { + mir_free(comment1); + return comment2; + } + mir_free(comment1); + mir_free(comment2); + return TranslateTS( mir_a2t(commentFix)); +} + +int PopupShow(PLUGIN_OPTIONS* pluginOptions, HANDLE hContact, HANDLE hEvent, UINT eventType) +{ + PLUGIN_DATA* pdata; + EVENT_DATA_EX* eventData; + TCHAR* sampleEvent; + long iSeconds; + + //there has to be a maximum number of popups shown at the same time + if (PopupCount >= MAX_POPUPS) + return 2; + + //check if we should report this kind of event + //get the prefered icon as well + //CHANGE: iSeconds is -1 because I use my timer to hide popup + POPUPDATAW pudw; + pudw.iSeconds = -1; + + switch (eventType) { + case EVENTTYPE_MESSAGE: + if (!(pluginOptions->maskNotify&MASK_MESSAGE)) return 1; + pudw.lchIcon = LoadSkinnedIcon(SKINICON_EVENT_MESSAGE); + pudw.colorBack = pluginOptions->bDefaultColorMsg ? 0 : pluginOptions->colBackMsg; + pudw.colorText = pluginOptions->bDefaultColorMsg ? 0 : pluginOptions->colTextMsg; + iSeconds = pluginOptions->iDelayMsg; + sampleEvent = TranslateT("This is a sample message event :-)"); + break; + + case EVENTTYPE_URL: + if (!(pluginOptions->maskNotify&MASK_URL)) return 1; + pudw.lchIcon = LoadSkinnedIcon(SKINICON_EVENT_URL); + pudw.colorBack = pluginOptions->bDefaultColorUrl ? 0 : pluginOptions->colBackUrl; + pudw.colorText = pluginOptions->bDefaultColorUrl ? 0 : pluginOptions->colTextUrl; + iSeconds = pluginOptions->iDelayUrl; + sampleEvent = TranslateT("This is a sample URL event ;-)"); + break; + + case EVENTTYPE_FILE: + if (!(pluginOptions->maskNotify&MASK_FILE)) return 1; + pudw.lchIcon = LoadSkinnedIcon(SKINICON_EVENT_FILE); + pudw.colorBack = pluginOptions->bDefaultColorFile ? 0 : pluginOptions->colBackFile; + pudw.colorText = pluginOptions->bDefaultColorFile ? 0 : pluginOptions->colTextFile; + iSeconds = pluginOptions->iDelayFile; + sampleEvent = TranslateT("This is a sample file event :-D"); + break; + + default: + if (!(pluginOptions->maskNotify&MASK_OTHER)) return 1; + pudw.lchIcon = LoadSkinnedIcon(SKINICON_OTHER_MIRANDA); + pudw.colorBack = pluginOptions->bDefaultColorOthers ? 0 : pluginOptions->colBackOthers; + pudw.colorText = pluginOptions->bDefaultColorOthers ? 0 : pluginOptions->colTextOthers; + iSeconds = pluginOptions->iDelayOthers; + sampleEvent = TranslateT("This is a sample other event ;-D"); + break; + } + + //get DBEVENTINFO with pBlob if preview is needed (when is test then is off) + DBEVENTINFO dbe = {0}; + dbe.cbSize = sizeof(dbe); + + if ((pluginOptions->bPreview || eventType == EVENTTYPE_ADDED || eventType == EVENTTYPE_AUTHREQUEST) && hEvent) { + dbe.cbBlob = CallService(MS_DB_EVENT_GETBLOBSIZE, (WPARAM)hEvent, 0); + dbe.pBlob = (PBYTE)mir_alloc(dbe.cbBlob); + } + + if (hEvent) + CallService(MS_DB_EVENT_GET, (WPARAM)hEvent, (LPARAM)&dbe); + + eventData = (EVENT_DATA_EX*)mir_alloc(sizeof(EVENT_DATA_EX)); + eventData->hEvent = hEvent; + eventData->number = 1; + eventData->next = NULL; + eventData->prev = NULL; + + // retrieve correct hContact for AUTH events + if (dbe.pBlob && (eventType == EVENTTYPE_ADDED || eventType == EVENTTYPE_AUTHREQUEST)) + hContact = *((PHANDLE)(dbe.pBlob + sizeof(DWORD))); + + // set plugin_data ... will be usable within PopupDlgProc + pdata = (PLUGIN_DATA*)mir_alloc(sizeof(PLUGIN_DATA)); + pdata->eventType = eventType; + pdata->hContact = hContact; + pdata->pluginOptions = pluginOptions; + pdata->countEvent = 1; + pdata->iLock = 0; + pdata->iSeconds = (iSeconds > 0) ? iSeconds : pluginOptions->iDelayDefault; + pdata->firstEventData = pdata->firstShowEventData = pdata->lastEventData = eventData; + + // finally create the popup + pudw.lchContact = hContact; + pudw.PluginWindowProc = (WNDPROC)PopupDlgProc; + pudw.PluginData = pdata; + + // if hContact is NULL, && hEvent is NULL then popup is only Test + if ((hContact == NULL) && (hEvent == NULL)) { + _tcsncpy((TCHAR*)pudw.lptzContactName, TranslateT("Plugin Test"), MAX_CONTACTNAME); + _tcsncpy((TCHAR*)pudw.lptzText, TranslateTS(sampleEvent), MAX_SECONDLINE); + } + else { // get the needed event data + TCHAR* szEventPreview; + + _tcsncpy((TCHAR*)pudw.lptzContactName, (TCHAR*)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hContact, GCDNF_TCHAR), MAX_CONTACTNAME); + szEventPreview = GetEventPreview(&dbe); + _tcsncpy((TCHAR*)pudw.lptzText, szEventPreview, MAX_SECONDLINE); + mir_free(szEventPreview); + } + + PopupCount++; + + PopUpList[NumberPopupData(NULL, -1)] = pdata; + // send data to popup plugin + + if (ServiceExists(MS_POPUP_ADDPOPUPT)) + { + if (CallService(MS_POPUP_ADDPOPUPT, (WPARAM)&pudw, 0) < 0) + { // popup creation failed, release popupdata + FreePopupEventData(pdata); + mir_free(pdata); + } + } + + if (dbe.pBlob) + mir_free(dbe.pBlob); + return 0; +} + + +int PopupUpdate(HANDLE hContact, HANDLE hEvent) +{ + PLUGIN_DATA* pdata; + DBEVENTINFO dbe = {0}; + EVENT_DATA_EX* eventData; + TCHAR lpzText[MAX_SECONDLINE*2] = _T("\0\0"); + int iEvent = 0; + int doReverse = 0; + + // merge only message popups + pdata = (PLUGIN_DATA*)PopUpList[NumberPopupData(hContact, EVENTTYPE_MESSAGE)]; + + if (hEvent) { + pdata->countEvent++; + + pdata->lastEventData->next = (EVENT_DATA_EX *)mir_alloc(sizeof(EVENT_DATA_EX)); + pdata->lastEventData->next->prev = pdata->lastEventData; + pdata->lastEventData = pdata->lastEventData->next; + pdata->lastEventData->hEvent = hEvent; + pdata->lastEventData->number = pdata->lastEventData->prev->number + 1; + pdata->lastEventData->next = NULL; + if (!pdata->pluginOptions->bShowON && pdata->countEvent > pdata->pluginOptions->iNumberMsg && pdata->pluginOptions->iNumberMsg) + pdata->firstShowEventData = pdata->firstShowEventData->next; + //re-init timer delay + KillTimer(pdata->hWnd, TIMER_TO_ACTION); + SetTimer(pdata->hWnd, TIMER_TO_ACTION, pdata->iSeconds * 1000, NULL); + } + + if (pdata->pluginOptions->bShowHeaders) + mir_sntprintf(lpzText, SIZEOF(lpzText), _T("[b]%s %d[/b]\n"), TranslateT("Number of new message: "), pdata->countEvent); + + doReverse = pdata->pluginOptions->bShowON; + + if ((pdata->firstShowEventData != pdata->firstEventData && doReverse) || (pdata->firstShowEventData != pdata->lastEventData && !doReverse)) + mir_sntprintf(lpzText, SIZEOF(lpzText), _T("%s...\n"), lpzText); + + //take the active event as starting one + eventData = pdata->firstShowEventData; + + while (TRUE) { + if (iEvent) { + if (doReverse) + eventData = eventData->next; + else + eventData = eventData->prev; + } + iEvent++; + //get DBEVENTINFO with pBlob if preview is needed (when is test then is off) + dbe.cbSize = sizeof(dbe); + dbe.pBlob = NULL; + dbe.cbBlob = 0; + if (pdata->pluginOptions->bPreview && eventData->hEvent) { + dbe.cbBlob = CallService(MS_DB_EVENT_GETBLOBSIZE, (WPARAM)eventData->hEvent, 0); + dbe.pBlob = (PBYTE)mir_alloc(dbe.cbBlob); + } + + if (eventData->hEvent) + CallService(MS_DB_EVENT_GET, (WPARAM)eventData->hEvent, (LPARAM)&dbe); + + if (pdata->pluginOptions->bShowDate || pdata->pluginOptions->bShowTime) { + TCHAR timestamp[MAX_DATASIZE]; + TCHAR formatTime[MAX_DATASIZE]; + if (pdata->pluginOptions->bShowDate) + _tcsncpy(formatTime, _T("%Y.%m.%d"), SIZEOF(formatTime)); + else if (pdata->pluginOptions->bShowTime) + _tcsncat(formatTime, _T(" %H:%M"), SIZEOF(formatTime)); + time_t localTime = dbe.timestamp; + _tcsftime(timestamp, SIZEOF(timestamp), formatTime, localtime(&localTime)); + mir_sntprintf(lpzText, SIZEOF(lpzText), _T("%s[b][i]%s[/i][/b]\n"), lpzText, timestamp); + } + + // prepare event preview + TCHAR* szEventPreview = GetEventPreview(&dbe); + mir_sntprintf(lpzText, SIZEOF(lpzText), _T("%s%s"), lpzText, szEventPreview); + mir_free(szEventPreview); + + if (dbe.pBlob) + mir_free(dbe.pBlob); + if (doReverse) { + if ((iEvent >= pdata->pluginOptions->iNumberMsg && pdata->pluginOptions->iNumberMsg) || !eventData->next) + break; + } + else if ((iEvent >= pdata->pluginOptions->iNumberMsg && pdata->pluginOptions->iNumberMsg) || !eventData->prev) + break; + + mir_sntprintf(lpzText, SIZEOF(lpzText), _T("%s\n"), lpzText); + } + + if ((doReverse && eventData->next) || (!doReverse && eventData->prev)) + mir_sntprintf(lpzText, SIZEOF(lpzText), _T("%s\n..."), lpzText); + + CallService(MS_POPUP_CHANGETEXTT, (WPARAM)pdata->hWnd, (LPARAM)lpzText); + return 0; +} + +int PopupPreview(PLUGIN_OPTIONS* pluginOptions) +{ + PopupShow(pluginOptions, NULL, NULL, EVENTTYPE_MESSAGE); + PopupShow(pluginOptions, NULL, NULL, EVENTTYPE_URL); + PopupShow(pluginOptions, NULL, NULL, EVENTTYPE_FILE); + PopupShow(pluginOptions, NULL, NULL, -1); + + return 0; +} diff --git a/plugins/NewEventNotify/src/resource.h b/plugins/NewEventNotify/src/resource.h new file mode 100644 index 0000000000..1146a3bfab --- /dev/null +++ b/plugins/NewEventNotify/src/resource.h @@ -0,0 +1,75 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by resource.rc +// +#define IDD_OPT 101 +#define IDI_ENABLED 106 +#define IDI_ICON2 107 +#define IDI_DISABLED 107 +#define IDC_PREVIEW 1000 +#define IDC_CHKNOTIFY_MESSAGE 1001 +#define IDC_CHKNOTIFY_URL 1002 +#define IDC_CHKNOTIFY_FILE 1003 +#define IDC_CHKNOTIFY_OTHER 1004 +#define IDC_CHKMENUITEM 1005 +#define IDC_CHKDISABLE 1006 +#define IDC_CHKACTL_DISMISS 1007 +#define IDC_CHKACTL_OPEN 1008 +#define IDC_CHKACTL_REMOVE 1009 +#define IDC_CHKACTR_DISMISS 1010 +#define IDC_CHKACTR_OPEN 1011 +#define IDC_CHKACTR_REMOVE 1012 +#define IDC_CHKWINDOWCHECK 1013 +#define IDC_CHKREPLYWINDOW 1014 +#define IDC_CHKPREVIEW 1015 +#define IDC_CHKINFINITE 1016 +#define IDC_CHKHIDESEND 1016 +#define IDC_CHKDEFAULTCOL_MESSAGE 1017 +#define IDC_COLBACK_MESSAGE 1018 +#define IDC_COLTEXT_MESSAGE 1019 +#define IDC_CHKDEFAULTCOL_URL 1020 +#define IDC_COLBACK_URL 1021 +#define IDC_COLTEXT_URL 1022 +#define IDC_CHKDEFAULTCOL_FILE 1023 +#define IDC_COLBACK_FILE 1024 +#define IDC_COLTEXT_FILE 1025 +#define IDC_CHKDEFAULTCOL_OTHERS 1026 +#define IDC_COLBACK_OTHERS 1027 +#define IDC_COLTEXT_OTHERS 1028 +#define IDC_MERGEPOPUP 1029 +#define IDC_CHKINFINITE_MESSAGE 1029 +#define IDC_CHKMERGEPOPUP 1030 +#define IDC_DELAY_MESSAGE 1031 +#define IDC_DELAY_URL 1032 +#define IDC_DELAY_FILE 1033 +#define IDC_DELAY_OTHERS 1034 +#define IDC_NUMBERMSG 1035 +#define IDC_CHKSHOWDATE 1036 +#define IDC_CHKSHOWTIME 1037 +#define IDC_CHKSHOWHEADERS 1038 +#define IDC_RDNEW 1039 +#define IDC_RDOLD 1040 +#define IDC_LBNUMBERMSG 1041 +#define IDC_CHKINFINITE_URL 1042 +#define IDC_CHKINFINITE_FILE 1043 +#define IDC_CHKINFINITE_OTHERS 1044 +#define IDC_CHKMERGEPOPUP2 1045 +#define IDC_SUPRESSRSS 1045 +#define IDC_TESTFORREAD 1046 +#define IDC_READCHECK 1046 +#define IDC_CMDEDITHEADERS 1047 +#define IDC_CHKACTTE_DISMISS 1049 +#define IDC_CHKACTTE_OPEN 1050 +#define IDC_CHKACTTE_REMOVE 1051 +#define IDC_STATIC -1 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 108 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1048 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif -- cgit v1.2.3