From a3a666e6df4692260b56d28e80c840894428feca Mon Sep 17 00:00:00 2001 From: Kirill Volinsky Date: Sat, 23 Jun 2012 13:24:59 +0000 Subject: HistorySweeperLight: renamed to .cpp git-svn-id: http://svn.miranda-ng.org/main/trunk@549 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/HistorySweeperLight/historysweeperlight.c | 256 --------------- .../HistorySweeperLight/historysweeperlight.cpp | 256 +++++++++++++++ plugins/HistorySweeperLight/main.c | 185 ----------- plugins/HistorySweeperLight/main.cpp | 185 +++++++++++ plugins/HistorySweeperLight/options.c | 354 --------------------- plugins/HistorySweeperLight/options.cpp | 354 +++++++++++++++++++++ 6 files changed, 795 insertions(+), 795 deletions(-) delete mode 100644 plugins/HistorySweeperLight/historysweeperlight.c create mode 100644 plugins/HistorySweeperLight/historysweeperlight.cpp delete mode 100644 plugins/HistorySweeperLight/main.c create mode 100644 plugins/HistorySweeperLight/main.cpp delete mode 100644 plugins/HistorySweeperLight/options.c create mode 100644 plugins/HistorySweeperLight/options.cpp diff --git a/plugins/HistorySweeperLight/historysweeperlight.c b/plugins/HistorySweeperLight/historysweeperlight.c deleted file mode 100644 index 50cc7e1386..0000000000 --- a/plugins/HistorySweeperLight/historysweeperlight.c +++ /dev/null @@ -1,256 +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" - -#ifdef VC6BUILD -#define _____TIMEPROC time -#else -#define _____TIMEPROC _time32 -#endif - -_CRTIMP __time32_t __cdecl _____TIMEPROC(_Out_opt_ __time32_t * _Time); - -typedef struct -{ - time_t time; - int keep; -} CriteriaStruct; - -// build criteria -time_t BuildCriteria(int dwti) -{ - time_t tim = _____TIMEPROC(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 = 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; -} diff --git a/plugins/HistorySweeperLight/historysweeperlight.cpp b/plugins/HistorySweeperLight/historysweeperlight.cpp new file mode 100644 index 0000000000..50cc7e1386 --- /dev/null +++ b/plugins/HistorySweeperLight/historysweeperlight.cpp @@ -0,0 +1,256 @@ +/* +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" + +#ifdef VC6BUILD +#define _____TIMEPROC time +#else +#define _____TIMEPROC _time32 +#endif + +_CRTIMP __time32_t __cdecl _____TIMEPROC(_Out_opt_ __time32_t * _Time); + +typedef struct +{ + time_t time; + int keep; +} CriteriaStruct; + +// build criteria +time_t BuildCriteria(int dwti) +{ + time_t tim = _____TIMEPROC(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 = 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; +} diff --git a/plugins/HistorySweeperLight/main.c b/plugins/HistorySweeperLight/main.c deleted file mode 100644 index 3174ab1369..0000000000 --- a/plugins/HistorySweeperLight/main.c +++ /dev/null @@ -1,185 +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; -PLUGINLINK *pluginLink; - -struct MM_INTERFACE mmi; - -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, - 0, - 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; -} - -__declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) -{ - return &pluginInfoEx; -} - -int __declspec(dllexport) Load(PLUGINLINK *link) -{ - pluginLink = link; - - mir_getMMI(&mmi); - mir_getLP(&pluginInfoEx); - - hHooks[0] = HookEvent(ME_SYSTEM_MODULESLOADED, OnModulesLoaded); - hHooks[1] = HookEvent(ME_OPT_INITIALISE, HSOptInitialise); - - InitIcons(); - - return 0; -} - -int __declspec(dllexport) Unload(void) -{ - int i; - - ShutdownAction(); - - for (i = 0; i < SIZEOF(hHooks); i++) - { - if (hHooks[i]) - UnhookEvent(hHooks[i]); - } - - return 0; -} diff --git a/plugins/HistorySweeperLight/main.cpp b/plugins/HistorySweeperLight/main.cpp new file mode 100644 index 0000000000..3174ab1369 --- /dev/null +++ b/plugins/HistorySweeperLight/main.cpp @@ -0,0 +1,185 @@ +/* +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; +PLUGINLINK *pluginLink; + +struct MM_INTERFACE mmi; + +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, + 0, + 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; +} + +__declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) +{ + return &pluginInfoEx; +} + +int __declspec(dllexport) Load(PLUGINLINK *link) +{ + pluginLink = link; + + mir_getMMI(&mmi); + mir_getLP(&pluginInfoEx); + + hHooks[0] = HookEvent(ME_SYSTEM_MODULESLOADED, OnModulesLoaded); + hHooks[1] = HookEvent(ME_OPT_INITIALISE, HSOptInitialise); + + InitIcons(); + + return 0; +} + +int __declspec(dllexport) Unload(void) +{ + int i; + + ShutdownAction(); + + for (i = 0; i < SIZEOF(hHooks); i++) + { + if (hHooks[i]) + UnhookEvent(hHooks[i]); + } + + return 0; +} diff --git a/plugins/HistorySweeperLight/options.c b/plugins/HistorySweeperLight/options.c deleted file mode 100644 index f98f5dc67c..0000000000 --- a/plugins/HistorySweeperLight/options.c +++ /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) -{ - int i; char szSettingName[100]; SKINICONDESC sid = {0}; TCHAR szFile[MAX_PATH]; - - GetModuleFileName(hInst, szFile, SIZEOF(szFile)); - - sid.cbSize = sizeof(SKINICONDESC); - sid.ptszDefaultFile = szFile; - sid.cx = sid.cy = 16; - sid.pszName = szSettingName; - sid.pszSection = ModuleName; - sid.flags = SIDF_PATH_TCHAR; - - for (i = 0; i < SIZEOF(iconList); i++) - { - mir_snprintf(szSettingName, SIZEOF(szSettingName), "%s_%s", ModuleName, iconList[i].szName); - - 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/options.cpp b/plugins/HistorySweeperLight/options.cpp new file mode 100644 index 0000000000..f98f5dc67c --- /dev/null +++ b/plugins/HistorySweeperLight/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) +{ + int i; char szSettingName[100]; SKINICONDESC sid = {0}; TCHAR szFile[MAX_PATH]; + + GetModuleFileName(hInst, szFile, SIZEOF(szFile)); + + sid.cbSize = sizeof(SKINICONDESC); + sid.ptszDefaultFile = szFile; + sid.cx = sid.cy = 16; + sid.pszName = szSettingName; + sid.pszSection = ModuleName; + sid.flags = SIDF_PATH_TCHAR; + + for (i = 0; i < SIZEOF(iconList); i++) + { + mir_snprintf(szSettingName, SIZEOF(szSettingName), "%s_%s", ModuleName, iconList[i].szName); + + 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; +} -- cgit v1.2.3