summaryrefslogtreecommitdiff
path: root/custom_status_list
diff options
context:
space:
mode:
authorwatcherhd <watcherhd@e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb>2011-04-21 14:14:52 +0000
committerwatcherhd <watcherhd@e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb>2011-04-21 14:14:52 +0000
commitcb4a46e7fbe62d788e66ed6121c717a2d22a4d7c (patch)
tree30df260fdc5a1b5a7049c2f8cac8b7ef17513d6d /custom_status_list
parent19b6f534d2e784a1e120bf52c4aa07004798f473 (diff)
svn.miranda.im is moving to a new home!
git-svn-id: http://miranda-plugins.googlecode.com/svn/trunk@7 e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb
Diffstat (limited to 'custom_status_list')
-rw-r--r--custom_status_list/cslist.c1246
-rw-r--r--custom_status_list/cslist.dsp109
-rw-r--r--custom_status_list/cslist.dsw29
-rw-r--r--custom_status_list/cslist.h346
-rw-r--r--custom_status_list/cslist.ncbbin0 -> 41984 bytes
-rw-r--r--custom_status_list/cslist.optbin0 -> 48640 bytes
-rw-r--r--custom_status_list/cslist.plg36
-rw-r--r--custom_status_list/cslist.rc245
-rw-r--r--custom_status_list/cslist.sln23
-rw-r--r--custom_status_list/cslist.suobin0 -> 8192 bytes
-rw-r--r--custom_status_list/cslist.vcproj415
-rw-r--r--custom_status_list/cslist.vcxproj230
-rw-r--r--custom_status_list/cslist.vcxproj.filters70
-rw-r--r--custom_status_list/cslist.vcxproj.user3
-rw-r--r--custom_status_list/res/add.icobin0 -> 2550 bytes
-rw-r--r--custom_status_list/res/apply.icobin0 -> 2550 bytes
-rw-r--r--custom_status_list/res/clear.icobin0 -> 2550 bytes
-rw-r--r--custom_status_list/res/fav.icobin0 -> 2550 bytes
-rw-r--r--custom_status_list/res/import.icobin0 -> 2550 bytes
-rw-r--r--custom_status_list/res/main.icobin0 -> 2550 bytes
-rw-r--r--custom_status_list/res/modify.icobin0 -> 2550 bytes
-rw-r--r--custom_status_list/res/nochng.icobin0 -> 2550 bytes
-rw-r--r--custom_status_list/res/options.icobin0 -> 2550 bytes
-rw-r--r--custom_status_list/res/remove.icobin0 -> 2550 bytes
-rw-r--r--custom_status_list/res/watch.icobin0 -> 2550 bytes
-rw-r--r--custom_status_list/resource.h78
26 files changed, 2830 insertions, 0 deletions
diff --git a/custom_status_list/cslist.c b/custom_status_list/cslist.c
new file mode 100644
index 0000000..6a1bb84
--- /dev/null
+++ b/custom_status_list/cslist.c
@@ -0,0 +1,1246 @@
+/* ########################################################################## 80
+
+ Custom Status List
+ __________________
+
+ Custom Status List plugin for Miranda-IM (www.miranda-im.org)
+ Follower of Custom Status History List by HANAX
+ Copyright 2006,2007 HANAX
+ Copyright 2007,2008 jarvis
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ ----------------------------------------------------------------------------
+
+ File name : $URL$
+ Revision : $Rev$
+ Last change on : $Date$
+ Last change by : $Author$
+
+ ----------------------------------------------------------------------------
+
+
+ DESCRIPTION:
+
+ Offers List of your Custom Statuses.
+
+ ----------------------------------------------------------------------------
+
+
+ HISTORY:
+
+ TODO
+ ----
+ - duplicities detection (during Import, adding, ..)
+ - stage 2 of code revision
+ - save window positions
+ - resetting custom status on when selected users log in
+ - exactly, CSList-like system
+ - optionally set Away/NA/DND/Occ
+ - saving dialog positions
+ - all TODOs listed in this source x)
+ - feature requests maybe ..
+
+ 0.0.0.18 - fixing trip :)
+ --------
+ - icon selector shows only icons, that are supported by installed ICQ plugin
+ - fixed memory leak and possible crash when modifying status and then importing 0 DB entries (helpItem not nulled)
+ - merged Add/Modify processes together :)
+ - Unicode build, finally :)
+
+ 0.0.0.17 - I become to be useful :)
+ --------
+ - CSList menu item can be placed elsewhere, also instead of Xstatus menu (currently ICQ eternity/PlusPlus++ mod only)
+ - importing statuses from database (ICQ key)
+ - list sorting (Procedure + calls)
+ - dialog openable only once :)
+ - new icons by inducti0n :)
+ - no more infinite width when adding x-message
+ - new Options dialog
+
+ 0.0.0.16 - rework
+ --------
+ - code redesigned
+ - fix for Windows Vista crash (free) and ANSI Windows crash (init extended controls)
+ - preimplementation for new features that will come (favourites, ...)
+
+ 0.0.0.15 - make me nice
+ --------
+ - stage 1 of code revision
+ - Options dialog (in development) :)
+ - IcoLib group renamed to CSLIST_MODULE_LONG_NAME
+ - status titles in Add/Modify ComboBox were strangely corrected x)
+ - possibility to turn off "Release Notes" dialog
+
+ 0.0.0.14 - will you use me? :)
+ --------
+ - new lines in message input creatable via Enter
+ - NULLED XSTATUS now available :)
+
+ 0.0.0.13 - oooops x))
+ --------
+ - hotfix for Miranda cores < 0.7
+ - CSList appears in Main Menu
+ - fixed icons not loaded when IcoLib is missing
+
+ 0.0.0.12 - goin' my way now x)
+ --------
+ - DB saving method/format slightly modified
+ [+] multi-line messages now working
+ [-] LOST compatibility with HANAX's plugin (but is auto-imported if exists)
+ NOTE: I think "importing-only" of older releases will stay,
+ I have many Feature Requests that would need changing
+ DB format anyway, so this problem looks solved x)
+ - "Release notes" dialog on first run
+ - Updater support
+
+ 0.0.0.11 - will this work? x)
+ --------
+ - some similar procedures merged together :P
+ - another procedures more generalized 8)
+ - separated Add/Modify dialog finally in use :)
+ [+] solves some bahaviour problems x)
+
+ 0.0.0.10 - ohhh, basics ]:)
+ --------
+ - icons support - complete xstatus service :)
+ [+] no more static angry ;) :D
+ - iconized buttons - supporting IcoLib :)
+ - better method for DB entry format - old was little.."dizzy" x) :D
+ - TEMPORARILY DISABLED modifying of items - needs some fixes x))
+
+ 0.0.0.9 - working a little? O:)
+ -------
+ - enhanced List Control behaviour (selecting, deselecting, editation, adding)
+ - LOADING from + SAVING to DB!
+ [+] my parser is also compatible with HANAX plugin's DB entries ;)
+
+ 0.0.0.8 - behaviour testing :o)
+ -------
+ - setting status by double-clicking list item
+ - much better procedures, debugging, better exceptions, dialog behaviour
+
+ 0.0.0.7 - crash testing :o)
+ -------
+ - basic functions coding
+
+ 0.0.0.6 - resource testing
+ -------
+ - basic resources modeling
+
+
+// ############################ INCLUDES & DEFINITIONS ###################### */
+
+#include "cslist.h"
+
+
+// ############################### MAIN ########################################
+
+BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved ) {
+ hInst = hinstDLL;
+ return TRUE;
+}
+
+
+// ########################### MIM MENU COMMAND ################################
+
+static int PluginMenuCommand( WPARAM wParam, LPARAM lParam ) {
+ if ( !opened )
+ DialogBox( hInst, MAKEINTRESOURCE( IDD_CSLIST ), NULL, ( DLGPROC )CSListProc );
+ else if ( opened == 1 )
+ {
+ opened++;
+ MessageBox( NULL, L"Some instance of Custom Status List is already opened.", L"Custom Status List", MB_OK );
+ opened--;
+ }
+ return 0;
+}
+
+
+// ############################# PLUGIN INFO ###################################
+
+__declspec( dllexport ) PLUGININFOEX* MirandaPluginInfoEx( DWORD mirandaVersion ) {
+ gMirandaVersion = mirandaVersion;
+ return &pluginInfoEx;
+}
+
+__declspec( dllexport ) PLUGININFO* MirandaPluginInfo( DWORD mirandaVersion ) {
+ gMirandaVersion = mirandaVersion;
+ return &pluginInfo;
+}
+
+
+// ############################# INTERFACES ####################################
+
+__declspec( dllexport ) const MUUID* MirandaPluginInterfaces( void ) {
+ return interfaces;
+}
+
+
+// ############################### LOADER ######################################
+
+int __declspec( dllexport ) Load( PLUGINLINK *link ) {
+ pluginLink = link;
+
+ { // are we running under Unicode core?
+ char szVer[MAX_PATH];
+
+ CallService( MS_SYSTEM_GETVERSIONTEXT, MAX_PATH, ( LPARAM )szVer );
+ _strlwr( szVer ); // make sure it is lowercase
+ gbUnicodeCore = ( strstr( szVer, "unicode" ) != NULL );
+ if ( !gbUnicodeCore )
+ {
+ pluginInfoEx.flags = 0;
+ pluginInfo.flags = 0;
+ }
+ }
+
+ hSvcShowList = CreateServiceFunction( MS_CSLIST_SHOWLIST, PluginMenuCommand );
+
+ cslist_init_icons();
+
+ if ( DBGetContactSettingByte( NULL, "ICQ", "XStatusEnabled", 1 ) )
+ { // if xstatuses are enabled, declare, if we can use status menu or main menu only
+ if ( bStatusMenu = ServiceExists( MS_CLIST_ADDSTATUSMENUITEM ) )
+ hHookMenuBuild = HookEvent( ME_CLIST_PREBUILDSTATUSMENU, cslist_init_menu_item );
+ else
+ cslist_init_menu_item( 0, 0 );
+ }
+
+ hHookOnPluginsLoaded = HookEvent( ME_SYSTEM_MODULESLOADED, onPluginsLoaded );
+ hHookOnOptionsInit = HookEvent( ME_OPT_INITIALISE, onOptionsInit );
+ { // Katy's easter-egg :))
+ hHookOnKatynkaIsLoggedIn = HookEvent( ME_DB_CONTACT_SETTINGCHANGED, cslist_KatysEasterEgg );
+ }
+ { // fix for ANSI Windows - Add and Modify dialogs not loaded when clicking - troubles with not loaded ComboBoxEx
+ INITCOMMONCONTROLSEX icc;
+ icc.dwSize = sizeof( icc );
+ icc.dwICC = ICC_USEREX_CLASSES;
+ InitCommonControlsEx( &icc );
+ }
+ return 0;
+}
+
+
+// ############################## UNLOADER #####################################
+
+int __declspec( dllexport ) Unload( void ) {
+ int i;
+ // unhooking, unservicing & unhandling
+ UnhookEvent( hHookMenuBuild );
+ UnhookEvent( hHookOnPluginsLoaded );
+ UnhookEvent( hHookOnOptionsInit );
+ UnhookEvent( hHookOnKatynkaIsLoggedIn );
+ DestroyServiceFunction( hSvcShowList );
+ for ( i = 0; i < SIZEOF( cslforms ); i++ )
+ cslforms[i].hIcoLibItem = NULL;
+ hList = NULL;
+ hXCombo = NULL;
+ hIml = NULL;
+ hDlg = NULL;
+ return 0;
+}
+
+
+// ############################# AFTER-LOADER ##################################
+
+static int onPluginsLoaded( WPARAM wparam, LPARAM lparam )
+{
+ // updater section - needs optimalization x)
+ if( ServiceExists( MS_UPDATE_REGISTER ) )
+ {
+ static Update upd = { 0 };
+
+//#if defined( _UNICODE )
+ static char szCurrentVersion[30];
+ static char *szVersionUrl = CSLIST_UPD_VERURL;
+ static char *szUpdateUrl = CSLIST_UPD_UPDURL;
+ // todo: complete FL updating
+ static char *szFLVersionUrl = CSLIST_UPD_FLVERURL;
+ static char *szFLUpdateurl = CSLIST_UPD_FLUPDURL;
+//#endif
+ static char *szPrefix = CSLIST_UPD_SZPREFIX;
+
+ upd.cbSize = sizeof( upd );
+ upd.szComponentName = pluginInfo.shortName;
+ if ( gMirandaVersion < PLUGIN_MAKE_VERSION( 0, 7, 0, 0 ) )
+ upd.pbVersion = ( BYTE * )CreateVersionStringPlugin( ( PLUGININFO * )&pluginInfo, szCurrentVersion ); // updater support for < 0.7 core
+ else
+ upd.pbVersion = ( BYTE * )CreateVersionStringPluginEx( ( PLUGININFOEX * )&pluginInfoEx, szCurrentVersion );
+ upd.cpbVersion = strlen( ( char * )upd.pbVersion );
+ //upd.szVersionURL = szFLVersionUrl;
+ //upd.szUpdateURL = szFLUpdateurl;
+//#if defined( _UNICODE )
+ upd.pbVersionPrefix = ( BYTE * )CSLIST_UPD_SZPREFIX;
+//#endif
+ upd.cpbVersionPrefix = strlen( ( char * )upd.pbVersionPrefix );
+
+ upd.szBetaUpdateURL = szUpdateUrl;
+ upd.szBetaVersionURL = szVersionUrl;
+ upd.pbVersion = szCurrentVersion;
+ upd.cpbVersion = lstrlenA( szCurrentVersion );
+ upd.pbBetaVersionPrefix = ( BYTE * )szPrefix;
+ upd.cpbBetaVersionPrefix = strlen( ( char * )upd.pbBetaVersionPrefix );
+
+ CallService( MS_UPDATE_REGISTER, 0, ( LPARAM )&upd );
+ }
+ // 0.8+ hotkeys service
+ if ( ServiceExists( MS_HOTKEY_REGISTER ) )
+ {
+ HOTKEYDESC hotkey = { 0 };
+ hotkey.cbSize = sizeof( hotkey );
+ hotkey.pszName = MS_CSLIST_SHOWLIST;
+ hotkey.pszDescription = "Show Custom Status List";
+ hotkey.pszSection = "Status";
+ hotkey.pszService = MS_CSLIST_SHOWLIST;
+ hotkey.DefHotKey = MAKEWORD( 'L', HOTKEYF_CONTROL | HOTKEYF_SHIFT );
+ CallService( MS_HOTKEY_REGISTER, 0, ( LPARAM )&hotkey );
+ }
+ // modern toolbar
+ if ( ServiceExists( MS_TB_ADDBUTTON ) )
+ {
+ TBButton button = { 0 };
+ SKINICONDESC sid = { 0 };
+ TCHAR szFile[MAX_PATH];
+ GetModuleFileName( hInst, szFile, MAX_PATH );
+
+ sid.cbSize = sizeof( sid );
+ sid.flags = SIDF_ALL_TCHAR;
+ sid.ptszSection = L"ToolBar";
+ sid.ptszDefaultFile = ( TCHAR * )szFile;
+ sid.cx = sid.cy = 16;
+
+ sid.pszName = "CSList_TB_Icon";
+ sid.ptszDescription = L"Custom Status List";
+ sid.iDefaultIndex = -IDI_CSLIST;
+ hMainIcon = CallService( MS_SKIN2_ADDICON, 0, ( LPARAM )&sid );
+
+ button.cbSize = sizeof( button );
+ button.pszButtonID = MS_CSLIST_SHOWLIST;
+ button.pszTooltipUp = button.pszTooltipDn = button.pszButtonName = CSLIST_MODULE_LONG_NAME;
+ button.pszServiceName = MS_CSLIST_SHOWLIST;
+ button.defPos = 200;
+ button.tbbFlags = TBBF_SHOWTOOLTIP | TBBF_VISIBLE;
+ button.hPrimaryIconHandle = ( HANDLE )hMainIcon;
+ button.hSecondaryIconHandle = button.hPrimaryIconHandle;
+ CallService( MS_TB_ADDBUTTON, 0, ( LPARAM )&button );
+ }
+ // release notes dialog
+ {
+ int relnotes, showit;
+ relnotes = DBGetContactSettingWord( NULL, CSLIST_MODULE_SHORT_NAME, "RelNotes", 0 );
+ showit = DBGetContactSettingByte( NULL, CSLIST_MODULE_SHORT_NAME, "ShowRelNotes", 1 );
+ if ( relnotes != CSLIST_RELNOTES && showit )
+ DialogBox( hInst, MAKEINTRESOURCE(IDD_RELNOTES), NULL, ( DLGPROC )RelNotesProc );
+ }
+ { // take care of DB entries
+ // not needed :) current structure allows to write them into DB when it's needed :)
+ }
+ return 0;
+}
+
+
+// ############################# OPTIONS LOADER ##############################
+
+int onOptionsInit( WPARAM wparam, LPARAM lparam )
+{
+ OPTIONSDIALOGPAGE odp = { 0 };
+
+ odp.cbSize = sizeof( odp );
+ odp.position = 955000000;
+ odp.hInstance = hInst;
+ odp.pszTemplate = MAKEINTRESOURCEA( IDD_OPTIONS );
+ odp.ptszTitle = TranslateTS( ( TCHAR * )CSLIST_MODULE_LONG_NAME );
+ odp.pfnDlgProc = CSListOptionsProc;
+ odp.ptszGroup = TranslateTS( ( TCHAR * )"Status" );
+ odp.flags = ODPF_BOLDGROUPS;
+
+ CallService( MS_OPT_ADDPAGE, wparam, ( LPARAM )&odp );
+ return 0;
+}
+
+
+// #############################################################################
+// #############################################################################
+// #############################################################################
+// #############################################################################
+// ############################# MAIN PROCEDURE ################################
+// #############################################################################
+// #############################################################################
+// #############################################################################
+
+INT_PTR CALLBACK CSListProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ NMHDR* pnmh = 0;
+ hDlg = hwndDlg;
+ switch ( uMsg )
+ {
+ case WM_NOTIFY: // some notifying message is sent
+ {
+ if ( wParam == IDC_CSLIST ) {
+ pnmh = ( NMHDR * )lParam; // TODO : optimize? maybe cleaner solution is possible (switching lParam)
+ // ######################## DBLCLICKING THE LIST ###############################
+ if ( pnmh->code == NM_DBLCLK ) {
+ cslist_set_status( hwndDlg );
+ //cslist_clear_selection();
+ goto savenexit; // stick #1 - edit: not needed ;) so TODO
+ // EndDialog( hwndDlg, LOWORD( wParam ) ); // OPTIONALLY: end dialog when ListItem is DblClk'd?
+ }
+ // #################### CLICKING TO SORT THE LIST ##############################
+ else if ( pnmh->code == LVN_COLUMNCLICK && pnmh->idFrom == IDC_CSLIST ) {
+ cslist_sort_list();
+ }
+ // ######################## CLICKING THE LIST ##################################
+ else {
+ iSelect = SendMessage( hList, LVM_GETNEXTITEM, -1, LVNI_FOCUSED | LVNI_SELECTED ); // set which row is selected (cannot be only focused, but fully selected - second param ;))
+ if ( iSelect == -1 ) // if no selection
+ flag = 0;
+ else
+ flag = 1;
+ EnableWindow( GetDlgItem( hDlg, IDC_MODIFY ), flag );
+ EnableWindow( GetDlgItem( hDlg, IDC_REMOVE ), flag );
+ break;
+ }
+ }
+ }
+ break;
+// ################## INITIALIZING MAIN DIALOG #################################
+ case WM_INITDIALOG:
+ {
+ int i;
+ char szTemp[MAX_PATH + 128];
+
+ opened = 1; // instance opened
+ // ..................................................... creating the list
+ hList = GetDlgItem( hwndDlg, IDC_CSLIST );
+ memset( &LvCol, 0, sizeof( LvCol ) );
+ hIml = ImageList_Create( 16, 16, IsWinVerXPPlus() ? ILC_COLOR32 | ILC_MASK : ILC_COLOR16 | ILC_MASK, 37, 1 );
+ if ( hIml ) {
+ for ( i = 0; i < 37; i++ )
+ {
+ null_snprintf( szTemp, sizeof( szTemp ), "%s_%s%d", "ICQ", "xstatus", i );
+ ImageList_AddIcon( hIml, ( HANDLE )CallService( MS_SKIN2_GETICON, 0, ( LPARAM )szTemp ) );
+ }
+ ListView_SetImageList( hList, hIml, LVSIL_SMALL );
+ }
+ LvCol.mask = LVCF_TEXT | LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM;
+ LvCol.fmt = LVCFMT_LEFT;
+ LvCol.cx = 0x00;
+ LvCol.pszText = L"";
+ LvCol.cx = 0x16;
+ //ListView_SetExtendedListViewStyle( hList, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_HEADERDRAGDROP );
+ ListView_SetExtendedListViewStyleEx( hList, 0, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_HEADERDRAGDROP | LVS_EX_INFOTIP );
+ SendMessage( hList, LVM_INSERTCOLUMN , 0, ( LPARAM )&LvCol );
+ LvCol.pszText = TranslateT( "Title" );
+ LvCol.cx = 0x64;
+ SendMessage( hList, LVM_INSERTCOLUMN, 1, ( LPARAM )&LvCol );
+ LvCol.pszText = TranslateT( "Message" );
+ LvCol.cx = 0xa8;
+ SendMessage( hList, LVM_INSERTCOLUMN, 2, ( LPARAM )&LvCol );
+ memset( &LvItem, 0, sizeof( LvItem ) );
+
+ // ................................................ load + sort list items
+ cslist_initialize_list_content( hwndDlg );
+ cslist_sort_list();
+
+ // ............................................. creating iconized buttons
+ for ( i = 0; i < SIZEOF( cslforms ); i++ )
+ {
+ if ( cslforms[i].idc < 0 )
+ continue;
+ SendDlgItemMessage( hwndDlg, cslforms[i].idc, BM_SETIMAGE, IMAGE_ICON, ( LPARAM )LoadIconExEx( cslforms[i].iconIcoLib, cslforms[i].iconNoIcoLib ) );
+ SendDlgItemMessage( hwndDlg, cslforms[i].idc, BUTTONSETASFLATBTN, 0, 0 ); //maybe set as BUTTONSETDEFAULT?
+ SendDlgItemMessage( hwndDlg, cslforms[i].idc, BUTTONADDTOOLTIP, ( WPARAM )TranslateTS( cslforms[i].title ), BATF_TCHAR );
+ }
+ SetWindowText( hwndDlg, TranslateT( "Custom Status List" ) );
+ }
+ break;
+// ######################## COMMANDS ###########################################
+ case WM_COMMAND:
+ switch ( LOWORD( wParam ) )
+ {
+ //case IDC_CSLIST: TODO: deselection
+// ------------------------- EXITING THE LIST ----------------------------------
+savenexit: // stick #1
+ case IDC_NOCHNG: // save, no status change and close
+ case IDCANCEL: // save, no status change and close
+ case IDOK: // not used
+ case IDC_APPLY: // save, set selected and close
+ case IDC_EXIT: // save, set nulled status and close
+ if ( ( LOWORD( wParam ) ) == IDC_APPLY ) //set selected status
+ cslist_set_status( hwndDlg );
+ else if ( ( LOWORD( wParam ) ) == IDC_EXIT )
+ { // set null status
+ ICQ_CUSTOM_STATUS helpStatus;
+ int icon = 0;
+ char* title = "";
+ char* message = "";
+ helpStatus.cbSize = sizeof( ICQ_CUSTOM_STATUS );
+ helpStatus.flags = CSSF_MASK_STATUS | CSSF_MASK_NAME | CSSF_MASK_MESSAGE;
+ helpStatus.status = &icon;
+ helpStatus.ptszName = ( TCHAR * )title;
+ helpStatus.ptszMessage = ( TCHAR * )message;
+ CallService( PS_ICQ_SETCUSTOMSTATUSEX, 0, ( LPARAM )&helpStatus );
+ }
+ flag = 0;
+ iSelect = -1;
+ if ( bChanged ) cslist_save_list_content( hwndDlg );
+ ListView_DeleteAllItems( hList );
+ bChanged = 0;
+ opened = 0; // closing instance
+ EndDialog( hwndDlg, LOWORD( wParam ) );
+ break;
+// -------------------------- OPTIONS BUTTON -----------------------------------
+ case IDC_OPTS:
+ DialogBox( hInst, MAKEINTRESOURCE( IDD_OPTIONS ), hwndDlg, ( DLGPROC )CSListOptionsProc );
+ break;
+// --------------------- ADDING/MODIFYING ITEM --------------------------------
+ case IDC_MODIFY:
+ action = 1;
+ case IDC_ADD:
+ {
+ DialogBox( hInst, MAKEINTRESOURCE( IDD_ADDMODIFY ), hwndDlg, ( DLGPROC )CSListAddModifyProc );
+ if ( AMResult == 1 )
+ {
+ if ( action == 1 )
+ {
+ ModifiedPos = iSelect;
+ cslist_modify_item();
+ ModifiedPos = -1;
+ }
+ else
+ {
+ cslist_add_item();
+ }
+ AMResult = 0;
+ bChanged = 1;
+ }
+ action = 0;
+ cslist_clear_help_item();
+ cslist_sort_list();
+ }
+ break;
+// ----------------- REMOVING ITEM FROM THE LIST -------------------------------
+ case IDC_REMOVE:
+ {
+ cslist_remove_item();
+ bChanged = 1;
+ }
+ break;
+ case IDC_IMPORT:
+ cslist_import_statuses_from_icq();
+ break;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+// #############################################################################
+// ########################### END OF MAIN PROCEDURE ###########################
+// #############################################################################
+// #############################################################################
+// ########################## ADD/MODIFY DLG PROCEDURE #########################
+// #############################################################################
+
+INT_PTR CALLBACK CSListAddModifyProc( HWND hwndAMDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ switch ( uMsg )
+ {
+ case WM_INITDIALOG:
+ {
+ // .........................................creating comboboxex for xicons
+ // TODO: changing statics and dialog title in order of action :)
+ int i, maxCount;
+ if ( action ^ 1 ) // action == 1
+ {
+ SetWindowText( hwndAMDlg, TranslateT( "Add new item" ) );
+ SetDlgItemText( hwndAMDlg, IDC_AM_OK, TranslateT( "Add" ) );
+ }
+ else
+ {
+ SetWindowText( hwndAMDlg, TranslateT( "Modify selected item" ) );
+ SetDlgItemText( hwndAMDlg, IDC_AM_OK, TranslateT( "Modify" ) );
+ }
+ SetDlgItemText( hwndAMDlg, IDC_AM_CN, TranslateT( "Cancel" ) );
+ SetDlgItemText( hwndAMDlg, IDC_ST_XICON, TranslateT( "Icon:" ) );
+ SetDlgItemText( hwndAMDlg, IDC_ST_XTITLE, TranslateT( "Title:" ) );
+ SetDlgItemText( hwndAMDlg, IDC_ST_XMESSAGE, TranslateT( "Message:" ) );
+
+ hXCombo = GetDlgItem( hwndAMDlg, IDC_CB_ICON );
+ SendMessage( hXCombo, CBEM_SETIMAGELIST, 0, ( LPARAM )hIml );
+ ZeroMemory( &CbItem, sizeof( CbItem ) );
+
+ if ( DBGetContactSettingByte( NULL, "ICQ", "NonStandartXstatus", 0 ) )
+ maxCount = SIZEOF( xstatuses );
+ else
+ maxCount = 32;
+ for ( i = 0; i < maxCount; i++ )
+ {
+ CbItem.mask = CBEIF_IMAGE | CBEIF_TEXT | CBEIF_SELECTEDIMAGE;
+ CbItem.pszText = TranslateTS( xstatuses[i].xname );
+ CbItem.iImage = i; // or xstatuses[i].xnum? x)
+ CbItem.iItem = i;
+ CbItem.iSelectedImage = i;
+ SendMessage( hXCombo, CBEM_INSERTITEM, 0, ( LPARAM )&CbItem );
+ }
+ SendMessage( hXCombo, CB_SETCURSEL, 0, 0 ); // first zero sets selection to top
+ if ( action == 1 ) // modifying
+ {
+ // get values from selection..
+ LvItem.iItem = iSelect;
+ LvItem.iSubItem = 0;
+ ListView_GetItem( hList, &LvItem );
+ ListView_GetItemText( hList, iSelect, 1, helpItem.ItemTitle, CSLIST_XTITLE_LIMIT );
+ ListView_GetItemText( hList, iSelect, 2, helpItem.ItemMessage, CSLIST_XMESSAGE_LIMIT );
+ // ..and send them to edit controls
+ SendMessage( hXCombo, CB_SETCURSEL, LvItem.iImage, 0 );
+ SetDlgItemText( hwndAMDlg, IDC_XTITLE, helpItem.ItemTitle );
+ SetDlgItemText( hwndAMDlg, IDC_XMESSAGE, helpItem.ItemMessage );
+ }
+ }
+ break;
+ case WM_COMMAND:
+ {
+ switch ( LOWORD( wParam ) )
+ {
+ case IDC_XTITLE:
+ if ( ( HIWORD( wParam ) == EN_CHANGE ) )
+ {
+ if ( GetWindowTextLength( GetDlgItem( hwndAMDlg, IDC_XTITLE ) ) > CSLIST_XTITLE_LIMIT )
+ SendDlgItemMessage( hwndAMDlg, IDC_XTITLE, WM_APP, ( WPARAM )Translate( "Warning" ), ( LPARAM )Translate( "This field do not accept string longer than 64 characters. String will be truncated." ) );
+ else
+ SendDlgItemMessage( hwndAMDlg, IDC_XTITLE, WM_APP, 0, 0 );
+ }
+ break;
+ case IDC_XMESSAGE:
+ if ( ( HIWORD( wParam ) == EN_CHANGE ) )
+ {
+ if ( GetWindowTextLength( GetDlgItem( hwndAMDlg, IDC_XMESSAGE ) ) > CSLIST_XMESSAGE_LIMIT )
+ SendDlgItemMessage( hwndAMDlg, IDC_XMESSAGE, WM_APP, ( WPARAM )Translate( "Warning" ), ( LPARAM )Translate( "This field do not accept string longer than 2048 characters. String will be truncated." ) );
+ else
+ SendDlgItemMessage( hwndAMDlg, IDC_XMESSAGE, WM_APP, 0, 0 );
+ }
+ break;
+ case IDOK:
+ case IDC_AM_OK:
+ cslist_AM_set_help_item( hwndAMDlg );
+ AMResult = 1;
+ EndDialog( hwndAMDlg, LOWORD( wParam ) );
+ break;
+ case IDCANCEL:
+ case IDC_AM_CN:
+ AMResult = 0;
+ EndDialog( hwndAMDlg, LOWORD( wParam ) );
+ break;
+ }
+ }
+ break;
+ }
+ return FALSE;
+}
+
+
+// #############################################################################
+// ####################### END OF ADD/MODIFY DLG PROCEDURE #####################
+// #############################################################################
+// ############################ OPTIONS DLG PROCEDURE ##########################
+// #############################################################################
+
+BOOL CALLBACK CSListOptionsProc( HWND hwndOptsDlg, UINT msg, WPARAM wparam, LPARAM lparam )
+{
+ // WORD flags = DBGetContactSettingWord( NULL, MODULENAME, "flags", default_flags );
+ // EnableWindow( GetDlgItem( hwndOptsDlg, IDC_PLACE_GLOBAL ), 1 );
+ // IsDlgButtonChecked( hwndRNDlg, IDC_SHOWIT )
+ // CheckDlgButton(hwndDlg, IDC_META, DBGetContactSettingByte(NULL,"CLC","Meta",SETTING_USEMETAICON_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); /// by FYR
+
+ switch ( msg )
+ {
+ case WM_INITDIALOG:
+ {
+ int hideCS = DBGetContactSettingByte( NULL, CSLIST_MODULE_SHORT_NAME, "hideCS", 0 );
+ int place = DBGetContactSettingByte( NULL, CSLIST_MODULE_SHORT_NAME, "placement", 11 );
+ CheckDlgButton( hwndOptsDlg, IDC_HIDE_CSMENU, hideCS ? BST_CHECKED : BST_UNCHECKED );
+ switch ( place ) {
+ case 0:
+ case 1:
+ case 11:
+ case 12:
+ CheckDlgButton( hwndOptsDlg, IDC_PLACE_GLOBAL, 1 );
+ EnableWindow( GetDlgItem( hwndOptsDlg, IDC_PLACE_GLOBAL_TOP ), 1 );
+ EnableWindow( GetDlgItem( hwndOptsDlg, IDC_PLACE_GLOBAL_BOTTOM ), 1 );
+ break;
+ case 2:
+ CheckDlgButton( hwndOptsDlg, IDC_PLACE_ICQ_STATUS, 1 );
+ break;
+ case 3:
+ CheckDlgButton( hwndOptsDlg, IDC_PLACE_MAIN, 1 );
+ break;
+ }
+ switch ( place ) {
+ case 0:
+ case 1:
+ case 11 :
+ CheckDlgButton( hwndOptsDlg, IDC_PLACE_GLOBAL_TOP, 1 );
+ break;
+ case 12 :
+ CheckDlgButton( hwndOptsDlg, IDC_PLACE_GLOBAL_BOTTOM, 1 );
+ break;
+ }
+ }
+ break;
+
+ case WM_COMMAND:
+ {
+ switch ( LOWORD( wparam ) )
+ {
+ case IDC_PLACE_GLOBAL:
+ EnableWindow( GetDlgItem( hwndOptsDlg, IDC_PLACE_GLOBAL_TOP ), 1 );
+ EnableWindow( GetDlgItem( hwndOptsDlg, IDC_PLACE_GLOBAL_BOTTOM ), 1 );
+ break;
+ case IDC_PLACE_ICQ_STATUS:
+ case IDC_PLACE_MAIN:
+ EnableWindow( GetDlgItem( hwndOptsDlg, IDC_PLACE_GLOBAL_TOP ), 0 );
+ EnableWindow( GetDlgItem( hwndOptsDlg, IDC_PLACE_GLOBAL_BOTTOM ), 0 );
+ break;
+ case IDOK:
+ case IDCANCEL:
+ {
+ int place, hideCS;
+ hideCS = IsDlgButtonChecked( hwndOptsDlg, IDC_HIDE_CSMENU );
+ DBWriteContactSettingByte( NULL, CSLIST_MODULE_SHORT_NAME, "hideCS", hideCS );
+ if( IsDlgButtonChecked( hwndOptsDlg, IDC_PLACE_GLOBAL ) )
+ {
+ if ( IsDlgButtonChecked( hwndOptsDlg, IDC_PLACE_GLOBAL_TOP ) )
+ place = 11;
+ else if ( IsDlgButtonChecked( hwndOptsDlg, IDC_PLACE_GLOBAL_BOTTOM ) )
+ place = 12;
+ else
+ place = 11;
+ }
+ else if ( IsDlgButtonChecked( hwndOptsDlg, IDC_PLACE_ICQ_STATUS ) )
+ place = 2;
+ else if ( IsDlgButtonChecked( hwndOptsDlg, IDC_PLACE_MAIN ) )
+ place = 3;
+ if ( place != DBGetContactSettingByte( NULL, CSLIST_MODULE_SHORT_NAME, "placement", 0 ) )
+ DBWriteContactSettingByte( NULL, CSLIST_MODULE_SHORT_NAME, "placement", place );
+ }
+ EndDialog( hwndOptsDlg, LOWORD( wparam ) );
+ break;
+ }
+ }
+ break;
+ }
+ return 0;
+}
+
+
+// #############################################################################
+// ######################## END OF OPTIONS DLG PROCEDURE #######################
+// #############################################################################
+// ############################# LIST SORT PROCEDURE ###########################
+// #############################################################################
+
+static int CALLBACK CSListSortProc( LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort )
+{
+ LVITEM first, second;
+
+ first.mask = LVIF_IMAGE;
+ first.iItem = lParam1;
+ first.iSubItem = lParamSort;
+
+ second.mask = LVIF_IMAGE;
+ second.iItem = lParam2;
+ second.iSubItem = lParamSort;
+
+ ListView_GetItem( hList, &first );
+ ListView_GetItem( hList, &second );
+
+ if ( first.iImage > second.iImage ) return 1;
+ else if ( first.iImage < second.iImage ) return -1;
+ else return 0;
+}
+
+
+// #############################################################################
+// ########################## END OF LIST SORT PROCEDURE #######################
+// #############################################################################
+// ######################## RELEASE NOTES DIALOG PROCEDURE #####################
+// #############################################################################
+
+INT_PTR CALLBACK RelNotesProc( HWND hwndRNDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ switch ( uMsg )
+ {
+ case WM_INITDIALOG:
+ {
+ SetDlgItemText( hwndRNDlg, IDC_TXHTEXT, rnthanks );
+ }
+ break;
+ case WM_COMMAND:
+ {
+ switch ( LOWORD( wParam ) )
+ {
+ case IDOK:
+ case IDCANCEL:
+ {
+ int showit;
+ showit = IsDlgButtonChecked( hwndRNDlg, IDC_SHOWIT ) ? 1 : 0;
+ DBWriteContactSettingByte( NULL, CSLIST_MODULE_SHORT_NAME, "ShowRelNotes", !showit );
+ DBWriteContactSettingWord( NULL, CSLIST_MODULE_SHORT_NAME, "RelNotes", CSLIST_RELNOTES );
+ EndDialog( hwndRNDlg, LOWORD( wParam ) );
+ }
+ break;
+ }
+ }
+ break;
+ }
+ return FALSE;
+}
+
+
+// #############################################################################
+// #################### END OF RELEASE NOTES DIALOG PROCEDURE ##################
+// #############################################################################
+
+// ############################# HELP FUNCTIONS ################################
+
+int null_snprintf( char *buffer, size_t count, const char* fmt, ... ) // deprecated? O_o
+{
+ va_list va;
+ int len;
+
+ ZeroMemory( buffer, count );
+ va_start( va, fmt );
+ len = mir_vsnprintf( buffer, count - 1, fmt, va );
+ va_end( va );
+ return len;
+}
+
+static int cslist_init_menu_item( WPARAM wParam, LPARAM lParam )
+{
+ CLISTMENUITEM mi = { 0 };
+ int miPlacement = 3;
+ if ( hHookMenuBuild != NULL )
+ miPlacement = DBGetContactSettingByte( NULL, CSLIST_MODULE_SHORT_NAME, "placement", 11 );
+ ZeroMemory( &mi, sizeof( mi ) );
+ mi.cbSize = sizeof( mi );
+ mi.position = -0x7FFFFFFF; // top
+ mi.flags = 0;
+ mi.hIcon = LoadIconExEx( "csl_icon", IDI_CSLIST );
+ mi.ptszName = TranslateTS( ( TCHAR * )"Custom Status List..." );
+ mi.pszService = "CSList/ShowList";
+ mi.pszContactOwner = "ICQ";
+ if ( miPlacement == 12 ) mi.position = 2000040000; // bottom
+ else if ( miPlacement == 2 ) {
+ int protoCount;
+ PROTOCOLDESCRIPTOR** pdesc;
+ CallService(MS_PROTO_ENUMPROTOCOLS,(WPARAM)&protoCount,(LPARAM)&pdesc);
+ if ( protoCount > 1 ) mi.ptszPopupName = ( TCHAR * )"ICQ";
+ }
+ switch ( miPlacement ) {
+ case 0 : // obsolete I think :))
+ case 1 :
+ case 11:
+ case 12:
+ case 2:
+ if( DBGetContactSettingByte( NULL, CSLIST_MODULE_SHORT_NAME, "hideCS", 0 ) )
+ {
+ mi.position = 00000001; // when hiding CSMenu, move to its place
+ mi.ptszName = TranslateTS( ( TCHAR * )"Custom status" );
+ }
+ CallService( MS_CLIST_ADDSTATUSMENUITEM, 0, ( LPARAM )&mi );
+ break;
+ case 3: // add to main menu
+ CallService( MS_CLIST_ADDMAINMENUITEM, 0, ( LPARAM )&mi );
+ break;
+ //case 2: // add to tray menu
+ // CallService( "CList/AddTrayMenuItem", 0, ( LPARAM )&mi );
+ // break;
+ }
+ return 0;
+}
+
+// dialog box ANSI or Unicode?
+
+
+// ################## COMMANDS OF CSLIST #######################################
+
+int cslist_add_item()
+{ // final adding with helpItem
+ int iItem;
+
+// -------------------------------------------------------- define list style --
+ if ( ModifiedPos >= 0 )
+ iItem = ModifiedPos;
+ else
+ iItem = SendMessage( hList, LVM_GETITEMCOUNT, 0, 0 );
+ memset( &LvItem, 0, sizeof( LvItem ) );
+ LvItem.mask = LVIF_TEXT | LVIF_IMAGE;
+
+ LvItem.cchTextMax = 256;
+ LvItem.iItem = iItem;
+// -------------------------------------------------------------------- first --
+ LvItem.iSubItem = 0;
+ LvItem.iImage = helpItem.ItemIcon; // use selected xicon
+
+ SendMessage( hList, LVM_INSERTITEM, 0, ( LPARAM )&LvItem );
+// ------------------------------------------------------------------- second --
+
+ LvItem.iSubItem = 1;
+ LvItem.pszText = helpItem.ItemTitle;
+ SendMessage( hList, LVM_SETITEM, 0, ( LPARAM )&LvItem );
+// -------------------------------------------------------------------- third --
+ LvItem.iSubItem = 2;
+ LvItem.pszText = helpItem.ItemMessage;
+ SendMessage( hList, LVM_SETITEM, 0, ( LPARAM )&LvItem );
+// --------------------------------------------------------------------- end ---
+ cslist_clear_selection();
+ return 0;
+}
+
+int cslist_modify_item()
+{
+ if ( ModifiedPos < 0 )
+ return FALSE;
+ memset( &LvItem, 0, sizeof( LvItem ) );
+ LvItem.mask = LVIF_TEXT | LVIF_IMAGE;
+ LvItem.cchTextMax = 256;
+ LvItem.iItem = ModifiedPos;
+ LvItem.iSubItem = 0;
+ LvItem.iImage = helpItem.ItemIcon;
+ SendMessage( hList, LVM_SETITEM, 0, ( LPARAM )&LvItem );
+ LvItem.iSubItem = 1;
+ LvItem.pszText = helpItem.ItemTitle;
+ SendMessage( hList, LVM_SETITEM, 0, ( LPARAM )&LvItem );
+ LvItem.iSubItem = 2;
+ LvItem.pszText = helpItem.ItemMessage;
+ SendMessage( hList, LVM_SETITEM, 0, ( LPARAM )&LvItem );
+ return TRUE;
+}
+
+int cslist_remove_item()
+{
+ if ( flag ) SendMessage( hList, LVM_DELETEITEM, iSelect, 0 );
+ cslist_clear_selection();
+ return 0;
+}
+
+int cslist_AM_set_help_item(HWND hwndAMDlg)
+{
+ // get and set helpItem xicon
+ ZeroMemory( &CbItem, sizeof( CbItem ) );
+ CbItem.mask = CBEIF_IMAGE | CBEIF_TEXT;
+ CbItem.iItem = SendDlgItemMessage( hwndAMDlg, IDC_CB_ICON, CB_GETCURSEL, 0, 0 );
+ SendDlgItemMessage( hwndAMDlg, IDC_CB_ICON, CBEM_GETITEM, 0, ( LPARAM )&CbItem );
+ helpItem.ItemIcon = CbItem.iImage;
+
+ GetDlgItemText( hwndAMDlg, IDC_XTITLE, helpItem.ItemTitle, CSLIST_XTITLE_LIMIT ); // set helpItem xtitle
+ GetDlgItemText( hwndAMDlg, IDC_XMESSAGE, helpItem.ItemMessage, CSLIST_XMESSAGE_LIMIT ); // set helpItem xmessage
+ return 0;
+}
+
+
+// ################## SERVICES FOR CSLIST ######################################
+
+void cslist_clear_selection() {
+ flag = 0;
+ iSelect = -1;
+ SendMessage( hList, LVM_SETITEMSTATE, -1, 0 );
+ //SendMessage( hList, LVM_GETNEXTITEM, -1, LVNI_FOCUSED | LVNI_SELECTED );
+}
+
+void cslist_clear_help_item() {
+ ZeroMemory( &helpItem, sizeof( helpItem ) );
+}
+
+void cslist_sort_list() {
+ ListView_SortItemsEx( hList, CSListSortProc, (LPARAM)0 );
+}
+
+void cslist_import_statuses_from_icq() {
+ int i, result;
+ result = MessageBox( hDlg, L"Do you want to delete those DB entries after Import?", L"Custom Status List", MB_YESNO | MB_DEFBUTTON2 | MB_ICONQUESTION );
+ for ( i = 0; i < 37; i++ )
+ {
+ DBVARIANT dbv = { 0 };
+ char bufName[64], bufMsg[64];
+ cslist_clear_help_item( );
+ mir_snprintf( bufName, 32, "XStatus%luName", i );
+ mir_snprintf( bufMsg, 32, "XStatus%luMsg", i );
+ helpItem.ItemIcon = i - 1;
+ DBGetContactSettingTString( NULL, "ICQ", bufName, &dbv );
+ lstrcpy( helpItem.ItemTitle, dbv.ptszVal );
+ DBGetContactSettingTString( NULL, "ICQ", bufMsg, &dbv );
+ lstrcpy( helpItem.ItemMessage, dbv.ptszVal );
+ if ( lstrlen( helpItem.ItemTitle ) || lstrlen( helpItem.ItemMessage ) )
+ cslist_add_item();
+ if ( result == IDYES )
+ {
+ DBDeleteContactSetting( NULL, "ICQ", bufName );
+ DBDeleteContactSetting( NULL, "ICQ", bufMsg );
+ }
+ }
+ cslist_sort_list();
+ bChanged = 1;
+}
+
+int cslist_KatysEasterEgg( WPARAM wParam, LPARAM lParam )
+{
+ DBCONTACTWRITESETTING *cws = ( DBCONTACTWRITESETTING* )lParam;
+ if ( ( HANDLE )wParam == NULL || lstrcmpA( cws->szSetting, "Status" ) )
+ return 0;
+ if ( ( DBGetContactSettingDword( ( HANDLE )wParam, "ICQ", "UIN", 0 ) == 0x1831BA1A ) &&
+ ( DBGetContactSettingWord( ( HANDLE )wParam, "UserOnline", "OldStatus2", 0 ) == ID_STATUS_OFFLINE ) &&
+ ( cws->value.wVal > ID_STATUS_OFFLINE ) )
+ {
+ ICQ_CUSTOM_STATUS helpStatus;
+ int icon = 0;
+ char * title = "";
+ char * message = "";
+ helpStatus.cbSize = sizeof( ICQ_CUSTOM_STATUS );
+ helpStatus.flags = CSSF_MASK_STATUS | CSSF_MASK_NAME | CSSF_MASK_MESSAGE;
+ helpStatus.status = &icon;
+ helpStatus.ptszName = ( TCHAR * )title;
+ helpStatus.ptszMessage = ( TCHAR * )message;
+ CallService( PS_ICQ_SETCUSTOMSTATUSEX, 0, ( LPARAM )&helpStatus );
+ }
+ return 0;
+}
+
+// ################## DB - LOAD AND SAVE #######################################
+
+int cslist_initialize_list_content( HWND hwndDlg )
+{
+ // get DB string, parse to statuses, add by helpItem
+ DBVARIANT dbv = { DBVT_TCHAR };
+ int parseResult;
+ int dbLoadResult;
+ const TCHAR* rowDelim = L""; // new line
+ TCHAR *row = NULL;
+
+ dbLoadResult = DBGetContactSettingTString( NULL, CSLIST_MODULE_SHORT_NAME, "listhistory", &dbv );
+ if ( dbv.ptszVal )
+ {
+ row = tcstok( dbv.ptszVal, rowDelim );
+ while( row != NULL ) {
+ // process current row..
+ parseResult = cslist_parse_row( row );
+ // ..add item..
+ if ( parseResult == TRUE ) cslist_add_item();
+ // ..and go to the other, while some remains
+ row = tcstok( NULL, rowDelim );
+ }
+ }
+ //free( rowDelim );
+ //free( row );
+ return 0;
+}
+
+int cslist_parse_row( TCHAR *row ) // parse + helpItem
+{
+ int pIconInt;
+ TCHAR pIcon[4], pTitle[CSLIST_XTITLE_LIMIT+2], pMsg[CSLIST_XMESSAGE_LIMIT+2], pFav[4];
+
+#if defined( _UNICODE )
+ if ( swscanf( row, L"%2[^]%64[^]%2048[^]%2[^]", &pIcon, &pTitle, &pMsg, &pFav ) == 4 ) // PLEASE!! x) use DEFs xO
+#else
+ if ( sscanf( row, "%2[^]%64[^]%2048[^]%2[^]", pIcon, pTitle, pMsg, pFav ) == 4 ) // PLEASE!! x) use DEFs xO
+#endif
+ {
+#if defined( _UNICODE )
+ pIconInt = _wtoi( pIcon );
+#else
+ pIconInt = atoi( pIcon );
+#endif
+ helpItem.ItemIcon = pIconInt;
+ lstrcpy( helpItem.ItemTitle, pTitle );
+ lstrcpy( helpItem.ItemMessage, pMsg );
+ }
+#if defined( _UNICODE )
+ else if ( swscanf( row, L"%2[^]%2048[^]%2[^]", &pIcon, &pMsg, &pFav ) == 3 )
+#else
+ else if ( sscanf( row, "%2[^]%2048[^]%2[^]", pIcon, pMsg, pFav ) == 3 )
+#endif
+ {
+#if defined( _UNICODE )
+ pIconInt = _wtoi( pIcon );
+#else
+ pIconInt = atoi( pIcon );
+#endif
+ helpItem.ItemIcon = pIconInt;
+ lstrcpy( helpItem.ItemTitle, L"" );
+ lstrcpy( helpItem.ItemMessage, pMsg );
+ }
+#if defined( _UNICODE )
+ else if ( swscanf( row, L"%2[^]%64[^]%2[^]", &pIcon, &pTitle, &pFav ) == 3 )
+#else
+ else if ( sscanf( row, "%2[^]%64[^]%2[^]", pIcon, pTitle, pFav ) == 3 )
+#endif
+ {
+#if defined( _UNICODE )
+ pIconInt = _wtoi( pIcon );
+#else
+ pIconInt = atoi( pIcon );
+#endif
+ helpItem.ItemIcon = pIconInt;
+ lstrcpy( helpItem.ItemTitle, pTitle );
+ lstrcpy( helpItem.ItemMessage, L"" );
+ }
+//#if defined( _UNICODE )
+// else if( swscanf( row, L"%2[^]%2[^]", &pIcon, &pFav ) == 2 )
+//#else
+// else if( sscanf( row, "%2[^]%2[^]", pIcon, pFav ) == 2 )
+//#endif
+// {
+//#if defined( _UNICODE )
+// pIconInt = _wtoi( pIcon );
+//#else
+// pIconInt = atoi( pIcon );
+//#endif
+// helpItem.ItemIcon = pIconInt;
+// lstrcpy( helpItem.ItemTitle, "" );
+// lstrcpy( helpItem.ItemMessage, "" );
+// } // why allow empty xstatuses? O_o
+ else {
+ //free(row);
+ //free(pIcon);
+ //free(pTitle);
+ //free(pMsg);
+ //free(pFav);
+ return FALSE;
+ }
+ //free(row);
+ //free(pIcon);
+ //free(pTitle);
+ //free(pMsg);
+ //free(pFav);
+ return TRUE;
+}
+
+
+int cslist_save_list_content( HWND hwndDlg )
+{
+ TCHAR cImageToString[64];
+ int i = 0;
+ LPTSTR dbString = { 0 };
+ TCHAR dbStringTmp[65536];
+ lstrcpy( dbStringTmp, L"" ); // set to empty - caused "dizzy" string begin x) O_o
+ lstrcpy( cImageToString, L"" );
+ for ( i = 0; i < ListView_GetItemCount( hList ); i++ )
+ {
+ // insert xint to string
+ LvItem.iItem = i;
+ LvItem.iSubItem = 0;
+ ListView_GetItem( hList, &LvItem );
+ tcprintf( cImageToString, 8, L"%d", LvItem.iImage );
+ lstrcat( dbStringTmp, cImageToString );
+ lstrcpy( cImageToString, L"" );
+ lstrcat( dbStringTmp, L"" );
+ ListView_GetItemText( hList, i, 1, helpItem.ItemTitle, CSLIST_XTITLE_LIMIT );
+ if ( wcslen( helpItem.ItemTitle ) > 0 ) lstrcat( dbStringTmp, helpItem.ItemTitle );
+ lstrcat( dbStringTmp, L"" );
+ ListView_GetItemText( hList, i, 2, helpItem.ItemMessage, CSLIST_XMESSAGE_LIMIT );
+ if ( wcslen( helpItem.ItemMessage ) > 0 ) lstrcat( dbStringTmp, helpItem.ItemMessage );
+ lstrcat( dbStringTmp, L"0" );
+ }
+ dbString = dbStringTmp;
+ // save to DB
+ DBWriteContactSettingTString( NULL, CSLIST_MODULE_SHORT_NAME, "listhistory", dbString );
+ free( dbString );
+ free( dbStringTmp );
+ lstrcpy( helpItem.ItemTitle, L"" );
+ lstrcpy( helpItem.ItemMessage, L"" );
+ return 0;
+}
+
+
+// ######################### CREATING DIALOG ###################################
+
+int cslist_set_status( HWND hwndDlg )
+{
+ ICQ_CUSTOM_STATUS helpStatus;
+ memset( &helpStatus, 0, sizeof( helpStatus ) );
+ helpStatus.cbSize = sizeof( ICQ_CUSTOM_STATUS );
+ helpStatus.flags = CSSF_MASK_STATUS | CSSF_MASK_NAME | CSSF_MASK_MESSAGE | CSSF_UNICODE;
+ iSelect = SendMessage( hList, LVM_GETNEXTITEM, -1, LVNI_FOCUSED | LVNI_SELECTED ); // set which row is selected
+ if ( iSelect == -1 ) // no status selected
+ flag = 0;
+ else
+ { // else get values from selection
+ LvItem.iItem = iSelect;
+ LvItem.iSubItem = 0;
+ ListView_GetItem( hList, &LvItem );
+ helpItem.ItemIcon = LvItem.iImage; // TODO: get xicon int and set ..
+ ListView_GetItemText( hList, iSelect, 1, helpItem.ItemTitle, CSLIST_XTITLE_LIMIT );
+ ListView_GetItemText( hList, iSelect, 2, helpItem.ItemMessage, CSLIST_XMESSAGE_LIMIT );
+ // ..and set xstatus
+ helpItem.ItemIcon++; // need revision of redirected xstatus numbers xo)
+ helpStatus.status = &helpItem.ItemIcon;
+ helpStatus.ptszName = helpItem.ItemTitle;
+ helpStatus.ptszMessage = helpItem.ItemMessage;
+ CallService( PS_ICQ_SETCUSTOMSTATUSEX, 0, ( LPARAM )&helpStatus ); // f**king function, 4 hours of thinking xDD
+ // ..and clean helper + selection
+ cslist_clear_selection();
+ }
+ return 0;
+}
+
+void cslist_init_icons( void )
+{
+ int i;
+ SKINICONDESC sid = { 0 };
+ char szFile[MAX_PATH];
+ GetModuleFileNameA( hInst, szFile, MAX_PATH );
+
+ sid.cbSize = sizeof( SKINICONDESC );
+ sid.ptszDefaultFile = ( TCHAR * )szFile;
+ sid.cx = sid.cy = 16;
+ sid.ptszSection = TranslateTS( CSLIST_MODULE_LONG_NAME );
+
+ for ( i = 0; i < SIZEOF( cslforms ); i++ )
+ {
+ char szSettingName[64];
+ mir_snprintf( szSettingName, sizeof( szSettingName ), "%s_%s", CSLIST_MODULE_SHORT_NAME, cslforms[i].iconIcoLib );
+ sid.pszName = szSettingName;
+ sid.ptszDescription = TranslateTS( cslforms[i].szDescr );
+ sid.iDefaultIndex = -cslforms[i].iconNoIcoLib;
+ cslforms[i].hIcoLibItem = ( HANDLE )CallService( MS_SKIN2_ADDICON, 0, ( LPARAM )&sid );
+ }
+}
+
+
+// ######################### OTHER FUNCTIONS ###################################
+
+HICON LoadIconExEx( const char* IcoLibName, int NonIcoLibIcon )
+{
+ if ( ServiceExists( MS_SKIN2_GETICON ) ) {
+ char szSettingName[64];
+ mir_snprintf( szSettingName, sizeof( szSettingName ), "%s_%s", CSLIST_MODULE_SHORT_NAME, IcoLibName );
+ return ( HICON )CallService( MS_SKIN2_GETICON, 0, ( LPARAM )szSettingName );
+ }
+ else
+ return ( HICON )LoadImage( hInst, MAKEINTRESOURCE( NonIcoLibIcon ), IMAGE_ICON, 0, 0, 0 );
+}
+
+
+/* ########################################################################## 80
+
+ Custom Status List
+ __________________
+
+ by jarvis
+
+// ############################################################ 2008/01/28 ## */
diff --git a/custom_status_list/cslist.dsp b/custom_status_list/cslist.dsp
new file mode 100644
index 0000000..277c030
--- /dev/null
+++ b/custom_status_list/cslist.dsp
@@ -0,0 +1,109 @@
+# Microsoft Developer Studio Project File - Name="cslist" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=CSLIST - WIN32 RELEASE
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "cslist.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "cslist.mak" CFG="CSLIST - WIN32 RELEASE"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "cslist - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CSLIST_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "../../include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CSLIST_EXPORTS" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /i "../../include/" /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"../../bin/release/plugins/cslist.dll"
+# Begin Target
+
+# Name "cslist - Win32 Release"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\cslist.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=.\cslist.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\resource.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# Begin Source File
+
+SOURCE=.\res\add.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\res\cancel.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\cslist.rc
+# End Source File
+# Begin Source File
+
+SOURCE=.\res\delete.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\res\edit.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\res\follow_status_changes.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\res\ok.ico
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/custom_status_list/cslist.dsw b/custom_status_list/cslist.dsw
new file mode 100644
index 0000000..ac3de9c
--- /dev/null
+++ b/custom_status_list/cslist.dsw
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "cslist"=".\cslist.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/custom_status_list/cslist.h b/custom_status_list/cslist.h
new file mode 100644
index 0000000..da3cc26
--- /dev/null
+++ b/custom_status_list/cslist.h
@@ -0,0 +1,346 @@
+// ############################ INCLUDES & DEFINITIONS #########################
+
+#ifndef __CSLIST_H
+#define __CSLIST_H 1
+
+#if defined( UNICODE ) && !defined( _UNICODE )
+ #define _UNICODE
+#endif
+
+#include <windows.h>
+//#include <windef.h> // already in windows.h
+#include <stddef.h>
+#include <commctrl.h>
+#if defined( _UNICODE )
+ #include <string.h>
+ #include <tchar.h>
+ #include <win2k.h>
+#endif
+
+#include <newpluginapi.h>
+#include <m_clist.h>
+#include <m_skin.h>
+#include <m_icolib.h>
+#include <m_database.h>
+#include <m_system.h>
+#include <m_utils.h>
+#include <m_updater.h>
+#include <m_langpack.h>
+#include <m_button.h>
+#include <m_options.h>
+#include <m_toolbar.h>
+#include <m_hotkeys.h>
+#include <m_protocols.h>
+//#include <stdio.h>
+
+#include "resource.h"
+
+#define MIID_STATUSLIST { 0x8b86253, 0xec6e, 0x4d09, { 0xb7, 0xa9, 0x64, 0xac, 0xdf, 0x6, 0x27, 0xb8 } }
+
+#define CSLIST_RELNOTES 19 // actual eternity relnotes
+#define CSLIST_TESTING "1"
+#define CSLIST_XTITLE_LIMIT 64 // limit of chars for x-status title
+#define CSLIST_XMESSAGE_LIMIT 2048 // limit of chars for x-status message
+
+#define CSLIST_MODULE_LONG_NAME "Custom Status List"
+#define CSLIST_MODULE_SHORT_NAME "CSList"
+
+// updater strings
+
+#define CSLIST_UPD_VERURL "http://dev.mirandaim.ru/~jarvis/"
+#define CSLIST_UPD_UPDURL "http://mirandapack.ic.cz/eternity_plugins/cslist.zip"
+#define CSLIST_UPD_FLVERURL "http://addons.miranda-im.org/details.php?action=viewfile&id=3483"
+#define CSLIST_UPD_FLUPDURL "http://addons.miranda-im.org/feed.php?dlfile=3483"
+#define CSLIST_UPD_SZPREFIX "Custom Status List</a> "
+
+// services
+
+#define MS_CLIST_ADDSTATUSMENUITEM "CList/AddStatusMenuItem"
+#define ME_CLIST_PREBUILDSTATUSMENU "CList/PreBuildStatusMenu"
+#define PS_ICQ_SETCUSTOMSTATUSEX "ICQ/SetXStatusEx"
+#define MS_CSLIST_SHOWLIST "CSList/ShowList"
+
+// status flags
+
+#define CSSF_MASK_STATUS 0x0001 // status member valid for set/get
+#define CSSF_MASK_NAME 0x0002 // pszName member valid for set/get
+#define CSSF_MASK_MESSAGE 0x0004 // pszMessage member valid for set/get
+#define CSSF_DISABLE_UI 0x0040 // disable default custom status UI, wParam = bEnable
+#define CSSF_DEFAULT_NAME 0x0080 // only with CSSF_MASK_NAME and get API to get default custom status name (wParam = status)
+#define CSSF_STATUSES_COUNT 0x0100 // returns number of custom statuses in wParam, only get API
+#define CSSF_STR_SIZES 0x0200 // returns sizes of custom status name & message (wParam & lParam members) in chars
+#if defined( _UNICODE )
+ #define CSSF_UNICODE 0x1000 // strings are in Unicode
+#else
+ #define CSSF_UNICODE 0x0000
+#endif
+
+#if defined( _UNICODE )
+ #define tcstok( x, y ) wcstok( x, y )
+ #define tcprintf( a, b, c, d ) swprintf( a, b, c, d )
+#else
+ #define tcstok( x, y ) strtok( x, y )
+ #define tcprintf( a, b, c, d ) sprintf( a, c, d )
+#endif
+
+// win2k.h
+#define SIZEOF( x ) ( sizeof( x ) / sizeof( x[0] ) )
+#define IsWinVerXPPlus() ( LOBYTE( LOWORD( GetVersion( ) ) ) >= 5 && LOWORD( GetVersion( ) ) != 5 )
+
+
+// ################################## STRUCTURES ###############################
+
+// -------------------------- WORKING LIST ITEM STRUCTURE ----------------------
+
+typedef struct {
+ int ItemIcon;
+ TCHAR ItemTitle[CSLIST_XTITLE_LIMIT];
+ TCHAR ItemMessage[CSLIST_XMESSAGE_LIMIT];
+ BOOL ItemFavourite;
+} CSLISTSTATUSITEM;
+
+
+// -------------------------- ICQ CUSTOM STATUS STRUCTURE ----------------------
+
+typedef struct {
+ int cbSize; // size of the structure
+ int flags; // combination of CSSF_*
+ int *status; // custom status id
+ union {
+ char *pszName; // buffer for custom status name
+ TCHAR *ptszName;
+ WCHAR *pwszName;
+ };
+ union {
+ char *pszMessage; // buffer for custom status message
+ TCHAR *ptszMessage;
+ WCHAR *pwszMessage;
+ };
+ WPARAM *wParam; // extra params, see flags
+ LPARAM *lParam;
+} ICQ_CUSTOM_STATUS;
+
+
+// ------------------------------ ICONS + BUTTONS ------------------------------
+
+static struct {
+ int idc;
+ TCHAR *title;
+ TCHAR *szDescr;
+ char *iconIcoLib;
+ int iconNoIcoLib;
+ HANDLE hIcoLibItem;
+} cslforms[] =
+{
+ { -1, L"Main Menu" , ( TCHAR * )"Main Icon", "csl_icon", IDI_CSLIST, NULL },
+ { IDC_ADD, L"Add new item", ( TCHAR * )"Add", "csl_add", IDI_ADD, NULL },
+ { IDC_MODIFY, L"Modify selected item", ( TCHAR * )"Modify", "csl_modify", IDI_MODIFY, NULL },
+ { IDC_REMOVE, L"Delete selected item", ( TCHAR * )"Remove", "csl_remove", IDI_REMOVE, NULL },
+ { IDC_IMPORT, L"Import statuses from database", ( TCHAR * )"Import", "csl_import", IDI_IMPORT, NULL },
+ { IDC_WATCH, L"Whether or not watch custom status changes and add them into list", ( TCHAR * )"Watch", "csl_watch", IDI_WATCH, NULL },
+ { IDC_FAV, L"Set/unset current item as favorite", ( TCHAR * )"Favorite", "csl_fav", IDI_FAV, NULL },
+ { IDC_OPTS, L"Options...", ( TCHAR * )"Options", "csl_opts", IDI_OPTIONS, NULL },
+ { IDC_NOCHNG, L"Close without changing custom status", ( TCHAR * )"No change", "csl_nochng", IDI_NOCHNG, NULL },
+ { IDC_APPLY, L"Set custom status to selected one and close", ( TCHAR * )"Set", "csl_apply", IDI_APPLY, NULL },
+ { IDC_EXIT, L"Clear custom status (reset to None) and close", ( TCHAR * )"Clear", "csl_clear", IDI_CLEAR, NULL },
+};
+
+
+// ----------------------- COMBOBOXEX XICONS STRUCTURE -------------------------
+
+static struct
+{
+ int xnum;
+ TCHAR *xname;
+} xstatuses[] =
+{
+ {1, _T("Angry")},
+ {2, _T("Taking a bath")},
+ {3, _T("Tired")},
+ {4, _T("Party")},
+ {5, _T("Drinking beer")},
+ {6, _T("Thinking")},
+ {7, _T("Eating")},
+ {8, _T("Watching TV")},
+ {9, _T("Meeting")},
+ {10, _T("Coffee")},
+ {11, _T("Listening to music")},
+ {12, _T("Business")},
+ {13, _T("Shooting")},
+ {14, _T("Having fun")},
+ {15, _T("On the phone")},
+ {16, _T("Gaming")},
+ {17, _T("Studying")},
+ {18, _T("Shopping")},
+ {19, _T("Feeling sick")},
+ {20, _T("Sleeping")},
+ {21, _T("Surfing")},
+ {22, _T("Browsing")},
+ {23, _T("Working")},
+ {24, _T("Typing")},
+ {25, _T("Picnic")},
+ {26, _T("Cooking")},
+ {27, _T("Smoking")},
+ {28, _T("I'm High")},
+ {29, _T("On WC")},
+ {30, _T("To be or not to be")},
+ {31, _T("Watching pro7 on TV")},
+ {32, _T("Love")},
+ {33, _T("Searching")},
+ {34, _T("Love")}, // I don't understand why this falls when 2 same named items appear O_o
+ {35, _T("Journal")}, // edit: ..and now I REALLY don't understand why it's working now x))
+ {36, _T("Sex")},
+ {37, _T("Smoking")}, // -||-
+};
+
+
+// ---------------------- LIST SORTING OPTIONS STRUCTURE -----------------------
+
+static struct
+{
+ int columnIndex;
+ HWND listView;
+ BOOL isOrderDesc;
+} sorting = {
+ 0, NULL, FALSE
+};
+
+// ################################## GLOBALS ##################################
+
+HINSTANCE hInst = NULL;
+PLUGINLINK *pluginLink = NULL;
+
+DWORD gMirandaVersion = 0x00000000;
+BYTE gbUnicodeCore;
+
+TCHAR *rnthanks = L"induction - for his cool iconset :)\r\nfaith_healer - moral support :]\r\nCriS - project hosting @ http://dev.mirandaim.ru/ \r\nRobyer, kaye_styles, dEMoniZaToR, Drugwash, FREAK_THEMIGHTY - useful hints ;)\r\nplugin users, of course :) for their tolerance x) ;)\r\nMiranda IM Project Team - for their work on the best Instant Messenger I ever known :)";
+TCHAR *rnchanges = L"";
+
+int action = 0;
+int AMResult = 0;
+int ModifiedPos = -1;
+int opened = 0;
+
+static HWND hDlg = NULL; // Main Dialog handler
+static HWND hList = NULL; // List View handler
+HIMAGELIST hIml = NULL;
+HWND hXCombo = NULL;
+int hMainIcon = 0; // modern toolbar // TODO: is it needed?
+LVCOLUMN LvCol = { 0 }; // Make Coluom struct for ListView
+LVITEM LvItem = { 0 }; // ListView Item struct
+COMBOBOXEXITEM CbItem = { 0 };
+int iSelect = 0;
+int flag = 0;
+BOOL bChanged = 0;
+CSLISTSTATUSITEM helpItem = { 0 };
+
+// hooks
+HANDLE hHookMenuBuild = NULL;
+HANDLE hHookOnPluginsLoaded = NULL;
+HANDLE hHookOnOptionsInit = NULL;
+HANDLE hHookOnKatynkaIsLoggedIn = NULL;
+
+// services
+HANDLE hSvcShowList = NULL;
+
+BOOL bStatusMenu = FALSE;
+
+PLUGININFOEX pluginInfoEx = {
+ sizeof( PLUGININFOEX ),
+ CSLIST_MODULE_LONG_NAME,
+ PLUGIN_MAKE_VERSION( 0, 0, 0, 19 ),
+ "Offers list of your Custom Statuses. [test build #"CSLIST_TESTING" "__DATE__" "__TIME__"]",
+ "jarvis [eThEreAL] .., HANAX",
+ "mike.taussick@seznam.cz",
+ "© 2007-2008 eternity crew .., © 2006-2007 HANAX Software",
+ "http://dev.mirandaim.ru/~jarvis/",
+ UNICODE_AWARE, //not transient
+ 0, //doesn't replace anything built-in
+ // Generate your own unique id for your plugin.
+ // Do not use this UUID!
+ // Use uuidgen.exe to generate the uuuid
+ {0x8b86253, 0xec6e, 0x4d09, { 0xb7, 0xa9, 0x64, 0xac, 0xdf, 0x6, 0x27, 0xb8 }} //{08B86253-EC6E-4d09-B7A9-64ACDF0627B8}
+};
+
+PLUGININFO pluginInfo = {
+ sizeof( PLUGININFO ),
+ CSLIST_MODULE_LONG_NAME,
+ PLUGIN_MAKE_VERSION( 0, 0, 0, 19 ),
+ "Offers list of your Custom Statuses. [test build #"CSLIST_TESTING" "__DATE__" "__TIME__"]",
+ "jarvis [eThEreAL] .., HANAX",
+ "mike.taussick@seznam.cz",
+ "© 2007-2008 eternity crew .., © 2006-2007 HANAX Software",
+ "http://dev.mirandaim.ru/~jarvis/",
+ UNICODE_AWARE, //not transient
+ 0
+};
+
+// ############################# INIT STUFF ####################################
+
+BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved );
+static int PluginMenuCommand( WPARAM wParam, LPARAM lParam );
+
+__declspec( dllexport ) PLUGININFOEX* MirandaPluginInfoEx( DWORD mirandaVersion );
+__declspec( dllexport ) PLUGININFO* MirandaPluginInfo( DWORD mirandaVersion );
+
+static const MUUID interfaces[] = { MIID_TESTPLUGIN, MIID_STATUSLIST, MIID_LAST };
+__declspec( dllexport ) const MUUID* MirandaPluginInterfaces( void );
+
+int __declspec( dllexport ) Load( PLUGINLINK *link );
+int __declspec( dllexport ) Unload( void );
+static int onPluginsLoaded( WPARAM wparam, LPARAM lparam );
+int onOptionsInit( WPARAM wparam, LPARAM lparam );
+
+// ############################### PROCEDURES ##################################
+
+INT_PTR CALLBACK CSListProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
+INT_PTR CALLBACK CSListAddModifyProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
+BOOL CALLBACK CSListOptionsProc( HWND hdlg, UINT msg, WPARAM wparam, LPARAM lparam );
+static int CALLBACK CSListSortProc( LPARAM, LPARAM, LPARAM );
+INT_PTR CALLBACK RelNotesProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
+
+// ############################# HELP FUNCTIONS ################################
+
+int null_snprintf( char*, size_t, const char*, ... );
+static int cslist_init_menu_item( WPARAM wParam, LPARAM lParam );
+
+// ################## COMMANDS OF CSLIST #######################################
+
+int cslist_add_item();
+int cslist_modify_item();
+int cslist_remove_item();
+int cslist_AM_set_help_item( HWND hwndAMDlg );
+
+// ################## SERVICES FOR CSLIST ######################################
+
+void cslist_clear_selection();
+void cslist_clear_help_item();
+void cslist_sort_list();
+void cslist_import_statuses_from_icq();
+int cslist_KatysEasterEgg( WPARAM, LPARAM );
+
+// ################## DB - LOAD AND SAVE #######################################
+
+int cslist_initialize_list_content( HWND hwndDlg );
+int cslist_parse_row( TCHAR *row );
+int cslist_save_list_content( HWND hwndDlg );
+
+// ######################### CREATING DIALOG ###################################
+
+int cslist_set_status( HWND hwndDlg );
+void cslist_init_icons( void );
+
+
+// ######################### OTHER FUNCTIONS ###################################
+
+HICON LoadIconExEx( const char* IcoLibName, int NonIcoLibIcon );
+//void DBDeleteContactSetting( char Module[64], char Setting[64] );
+
+// ############################## EXTERNS ######################################
+
+//extern int mir_free( const int & );
+//extern int ImageList_AddIcon_IconLibLoaded( HIMAGELIST hIml, int iconId );
+
+#pragma comment( lib, "comctl32.lib" )
+
+#endif /* __CSLIST_H */ \ No newline at end of file
diff --git a/custom_status_list/cslist.ncb b/custom_status_list/cslist.ncb
new file mode 100644
index 0000000..d1ea4e0
--- /dev/null
+++ b/custom_status_list/cslist.ncb
Binary files differ
diff --git a/custom_status_list/cslist.opt b/custom_status_list/cslist.opt
new file mode 100644
index 0000000..7812836
--- /dev/null
+++ b/custom_status_list/cslist.opt
Binary files differ
diff --git a/custom_status_list/cslist.plg b/custom_status_list/cslist.plg
new file mode 100644
index 0000000..890ea14
--- /dev/null
+++ b/custom_status_list/cslist.plg
@@ -0,0 +1,36 @@
+<html>
+<body>
+<pre>
+<h1>Build Log</h1>
+<h3>
+--------------------Configuration: cslist - Win32 Release--------------------
+</h3>
+<h3>Command Lines</h3>
+Creating command line "rc.exe /l 0x809 /fo"Release/cslist.res" /i "../../include/" /d "NDEBUG" "D:\Sources\svn.miranda.im\custom_status_list\trunk\cslist.rc""
+Creating temporary file "C:\Temp\RSP41D9.tmp" with contents
+[
+/nologo /MT /W3 /GX /O2 /I "../../include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CSLIST_EXPORTS" /Fp"Release/cslist.pch" /YX /Fo"Release/" /Fd"Release/" /FD /c
+"D:\Sources\svn.miranda.im\custom_status_list\trunk\cslist.c"
+]
+Creating command line "cl.exe @C:\Temp\RSP41D9.tmp"
+Creating temporary file "C:\Temp\RSP41DA.tmp" with contents
+[
+kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:no /pdb:"Release/cslist.pdb" /machine:I386 /out:"../../bin/release/plugins/cslist.dll" /implib:"Release/cslist.lib"
+.\Release\cslist.obj
+.\Release\cslist.res
+]
+Creating command line "link.exe @C:\Temp\RSP41DA.tmp"
+<h3>Output Window</h3>
+Compiling resources...
+Compiling...
+cslist.c
+D:\Sources\svn.miranda.im\custom_status_list\trunk\cslist.h(27) : fatal error C1083: Cannot open include file: 'm_updater.h': No such file or directory
+Error executing cl.exe.
+
+
+
+<h3>Results</h3>
+cslist.dll - 1 error(s), 0 warning(s)
+</pre>
+</body>
+</html>
diff --git a/custom_status_list/cslist.rc b/custom_status_list/cslist.rc
new file mode 100644
index 0000000..f02fb44
--- /dev/null
+++ b/custom_status_list/cslist.rc
@@ -0,0 +1,245 @@
+// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.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_CSLIST DIALOGEX 0, 0, 210, 226
+STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION
+CAPTION "Custom Status List"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ CONTROL "",IDC_CSLIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,1,3,207,204
+ CONTROL "A",IDC_ADD,"MButtonClass",WS_TABSTOP,2,210,16,14
+ CONTROL "M",IDC_MODIFY,"MButtonClass",WS_TABSTOP,22,210,16,14
+ CONTROL "D",IDC_REMOVE,"MButtonClass",WS_TABSTOP,42,210,16,14
+ CONTROL "I",IDC_IMPORT,"MButtonClass",WS_TABSTOP,65,210,16,14
+ CONTROL "W",IDC_WATCH,"MButtonClass",WS_DISABLED | WS_TABSTOP,85,210,16,14
+ CONTROL "F",IDC_FAV,"MButtonClass",WS_DISABLED | WS_TABSTOP,105,210,16,14
+ CONTROL "N",IDC_NOCHNG,"MButtonClass",WS_TABSTOP,152,210,16,14
+ CONTROL "E",IDC_EXIT,"MButtonClass",WS_TABSTOP,172,210,16,14
+ CONTROL "P",IDC_APPLY,"MButtonClass",WS_TABSTOP,192,210,16,14
+ CONTROL "",IDC_STATIC,"Static",SS_BLACKFRAME | SS_SUNKEN,146,211,1,13
+ CONTROL "",IDC_STATIC,"Static",SS_BLACKFRAME | SS_SUNKEN,61,211,1,13
+ CONTROL "O",IDC_OPTS,"MButtonClass",WS_TABSTOP,125,210,16,14
+END
+
+IDD_ADDMODIFY DIALOGEX 100, 100, 199, 121
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Add/Modify Custom Status"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ LTEXT "Icon:",IDC_ST_XICON,4,2,44,8
+ CONTROL "",IDC_CB_ICON,"ComboBoxEx32",CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP,2,11,84,95
+ LTEXT "Title:",IDC_ST_XTITLE,89,2,43,8
+ EDITTEXT IDC_XTITLE,89,11,108,14,ES_AUTOHSCROLL
+ LTEXT "Message:",IDC_ST_XMESSAGE,4,27,85,8
+ EDITTEXT IDC_XMESSAGE,2,36,195,66,ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL
+ DEFPUSHBUTTON "Add/Modify",IDC_AM_OK,49,105,50,14
+ PUSHBUTTON "Cancel",IDC_AM_CN,102,105,50,14
+END
+
+IDD_RELNOTES DIALOGEX 0, 0, 192, 269
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Custom Status List Release Notes"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ GROUPBOX "Latest Changes",IDC_RNCHNGS,4,104,184,83
+ GROUPBOX "Notice",IDC_RNNOTICE,4,55,184,49
+ GROUPBOX "Special Thanks",IDC_THX,4,189,184,58
+ RTEXT "Plugin name:",IDC_RNPLGNM,7,4,53,8
+ RTEXT "Version:",IDC_RNVER,7,14,53,8
+ LTEXT "Custom Status List",IDC_RLNPLGNM2,66,4,98,8
+ LTEXT "0.0.0.18 (Unicode)",IDC_RNVER2,66,14,95,8
+ LTEXT "Plugin development is currently in Beta stage. It's not recommended to generally use, but stable enough for testing purposes. Stable release will be available as soon as possible ;)",IDC_STATIC,20,65,150,34
+ RTEXT "Author:",IDC_RNAUTH,7,24,53,8
+ LTEXT "jarvis (original idea by HANAX)",IDC_RNAUTH2,66,24,115,8
+ RTEXT "Copyright:",IDC_RNCPR,7,34,53,8
+ LTEXT "© 2007-8 eternity crew ..\n© 2006-7 HANAX Software",IDC_RNCPR2,66,34,115,18
+ ICON IDI_ADD,IDC_RNCSICON,163,3,20,20
+ EDITTEXT IDC_TXHTEXT,7,199,176,43,ES_MULTILINE | ES_READONLY | WS_VSCROLL
+ CONTROL "Don't show this dialog again",IDC_SHOWIT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,253,118,10
+ DEFPUSHBUTTON "Close",IDOK,137,251,50,14
+ CONTROL "Unicode build, finally :)",IDC_STATIC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,119,155,10
+ CONTROL "fixed memory leak and possible crash when modifying status and then importing 0 DB entries",IDC_STATIC,
+ "Button",BS_AUTOCHECKBOX | BS_TOP | BS_MULTILINE | WS_TABSTOP,17,158,155,26
+ CONTROL "merged Add/Modify processes together :)",IDC_STATIC,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,129,155,10
+ CONTROL "icon selector shows only icons, that are supported by installed ICQ plugin",IDC_STATIC,
+ "Button",BS_AUTOCHECKBOX | BS_TOP | BS_MULTILINE | WS_TABSTOP,17,139,155,18
+END
+
+IDD_OPTIONS DIALOGEX 0, 0, 172, 222
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Options"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ GROUPBOX "Menu Item placement",IDC_PLACEMENT_OPTIONS,3,102,165,81
+ CONTROL "Global Status Menu",IDC_PLACE_GLOBAL,"Button",BS_AUTORADIOBUTTON | WS_GROUP,11,115,119,10
+ CONTROL "ICQ Status Menu",IDC_PLACE_ICQ_STATUS,"Button",BS_AUTORADIOBUTTON,11,147,125,10
+ CONTROL "Main Menu",IDC_PLACE_MAIN,"Button",BS_AUTORADIOBUTTON,11,158,134,10
+ CONTROL "Tray Menu",IDC_PLACE_TRAY,"Button",BS_AUTOCHECKBOX | WS_DISABLED,11,168,122,10
+ CONTROL "At the top",IDC_PLACE_GLOBAL_TOP,"Button",BS_AUTORADIOBUTTON | WS_DISABLED | WS_GROUP,17,126,108,10
+ CONTROL "At the bottom",IDC_PLACE_GLOBAL_BOTTOM,"Button",BS_AUTORADIOBUTTON | WS_DISABLED,17,136,119,10
+ CONTROL "Hide ""Custom status"" menu\n(ICQ eternity/PlusPlus++ Mod only, restart needed)",IDC_HIDE_CSMENU,
+ "Button",BS_AUTOCHECKBOX | BS_TOP | BS_MULTILINE | WS_TABSTOP,11,65,149,26
+ GROUPBOX "List settings",IDC_LIST_SETTINGS,3,0,165,47
+ DEFPUSHBUTTON "Save Options",IDOK,43,205,82,14
+ CTEXT "Note: Some options will be applied after restart of Miranda IM",IDC_STATIC,11,185,144,15,WS_DISABLED
+ CONTROL "Confirm deletion of items",IDC_DEL_CONFIRM,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,11,13,148,10
+ CONTROL "Delete entries in ICQ Custom status menu after Import",IDC_DEL_AFTER_IMPORT,
+ "Button",BS_AUTOCHECKBOX | BS_TOP | BS_MULTILINE | WS_DISABLED | WS_TABSTOP,11,24,153,16
+ GROUPBOX "ICQ integration",IDC_ICQ_INTG,3,50,165,50
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO
+BEGIN
+ IDD_CSLIST, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 202
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 219
+ END
+
+ IDD_RELNOTES, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 185
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 262
+ END
+
+ IDD_OPTIONS, DIALOG
+ BEGIN
+ VERTGUIDE, 11
+ END
+END
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 0,0,0,18
+ PRODUCTVERSION 0,0,0,18
+ FILEFLAGSMASK 0x17L
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904b0"
+ BEGIN
+ VALUE "Comments", "Offers List of your Custom Statuses. All acclaims go to HANAX, original publisher and inventor of this idea."
+ VALUE "FileDescription", "Custom Status List"
+ VALUE "FileVersion", "0, 0, 0, 18"
+ VALUE "InternalName", "cslist"
+ VALUE "LegalCopyright", "© 2007-2008 eternity crew .., © 2006-2007 HANAX"
+ VALUE "OriginalFilename", "cslist.dll"
+ VALUE "ProductName", "Custom Status List"
+ VALUE "ProductVersion", "0, 0, 0, 18"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "resource.h\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "\r\n"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#include ""afxres.h""\r\n"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_CSLIST ICON "res\\main.ico"
+IDI_ADD ICON "res\\add.ico"
+IDI_MODIFY ICON "res\\modify.ico"
+IDI_REMOVE ICON "res\\remove.ico"
+IDI_IMPORT ICON "res\\import.ico"
+IDI_WATCH ICON "res\\watch.ico"
+IDI_FAV ICON "res\\fav.ico"
+IDI_NOCHNG ICON "res\\nochng.ico"
+IDI_CLEAR ICON "res\\clear.ico"
+IDI_APPLY ICON "res\\apply.ico"
+IDI_OPTIONS ICON "res\\options.ico"
+#endif // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
diff --git a/custom_status_list/cslist.sln b/custom_status_list/cslist.sln
new file mode 100644
index 0000000..7d0066c
--- /dev/null
+++ b/custom_status_list/cslist.sln
@@ -0,0 +1,23 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual C++ Express 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "custom_status_list", "cslist.vcxproj", "{2AD2FF74-06E1-4BD8-984A-526F3C6315B3}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Release Unicode [Dynamic SSE2 Fast]|Win32 = Release Unicode [Dynamic SSE2 Fast]|Win32
+ Release Unicode|Win32 = Release Unicode|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {2AD2FF74-06E1-4BD8-984A-526F3C6315B3}.Release Unicode [Dynamic SSE2 Fast]|Win32.ActiveCfg = Release Unicode [Dynamic SSE2 Fast]|Win32
+ {2AD2FF74-06E1-4BD8-984A-526F3C6315B3}.Release Unicode [Dynamic SSE2 Fast]|Win32.Build.0 = Release Unicode [Dynamic SSE2 Fast]|Win32
+ {2AD2FF74-06E1-4BD8-984A-526F3C6315B3}.Release Unicode|Win32.ActiveCfg = Release Unicode|Win32
+ {2AD2FF74-06E1-4BD8-984A-526F3C6315B3}.Release Unicode|Win32.Build.0 = Release Unicode|Win32
+ {2AD2FF74-06E1-4BD8-984A-526F3C6315B3}.Release|Win32.ActiveCfg = Release|Win32
+ {2AD2FF74-06E1-4BD8-984A-526F3C6315B3}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/custom_status_list/cslist.suo b/custom_status_list/cslist.suo
new file mode 100644
index 0000000..03471f3
--- /dev/null
+++ b/custom_status_list/cslist.suo
Binary files differ
diff --git a/custom_status_list/cslist.vcproj b/custom_status_list/cslist.vcproj
new file mode 100644
index 0000000..84824f8
--- /dev/null
+++ b/custom_status_list/cslist.vcproj
@@ -0,0 +1,415 @@
+<?xml version="1.0" encoding="windows-1250"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="custom_status_list"
+ ProjectGUID="{2AD2FF74-06E1-4BD8-984A-526F3C6315B3}"
+ RootNamespace="cslist"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Release Unicode|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)/Plugins"
+ IntermediateDirectory="$(SolutionDir)$(ConfigurationName)/Obj/$(ProjectName)"
+ ConfigurationType="2"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\Release/cslist.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="../../include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;CSLIST_EXPORTS"
+ StringPooling="true"
+ RuntimeLibrary="0"
+ EnableFunctionLevelLinking="true"
+ PrecompiledHeaderFile=".\Release/cslist.pch"
+ AssemblerListingLocation=".\Release/"
+ ObjectFile=".\Release/"
+ ProgramDataBaseFileName=".\Release/"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)/cslist.dll"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ GenerateDebugInformation="false"
+ ProgramDatabaseFile=".\Release/cslist.pdb"
+ ImportLibrary=".\Release/cslist.lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\Release/cslist.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="0"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\Release/cslist.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ InlineFunctionExpansion="1"
+ FavorSizeOrSpeed="2"
+ AdditionalIncludeDirectories="../../include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;CSLIST_EXPORTS"
+ StringPooling="true"
+ RuntimeLibrary="0"
+ EnableFunctionLevelLinking="true"
+ PrecompiledHeaderFile=".\Release/cslist.pch"
+ AssemblerListingLocation=".\Release/"
+ ObjectFile=".\Release/"
+ ProgramDataBaseFileName=".\Release/"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)/cslist.dll"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ GenerateDebugInformation="false"
+ ProgramDatabaseFile=".\Release/cslist.pdb"
+ ImportLibrary=".\Release/cslist.lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\Release/cslist.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release Unicode [Dynamic SSE2 Fast]|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\Release/cslist.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="../../include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;CSLIST_EXPORTS"
+ StringPooling="true"
+ RuntimeLibrary="0"
+ EnableFunctionLevelLinking="true"
+ PrecompiledHeaderFile=".\Release/cslist.pch"
+ AssemblerListingLocation=".\Release/"
+ ObjectFile=".\Release/"
+ ProgramDataBaseFileName=".\Release/"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)/cslist.dll"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ GenerateDebugInformation="false"
+ ProgramDatabaseFile=".\Release/cslist.pdb"
+ ImportLibrary=".\Release/cslist.lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\Release/cslist.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+ >
+ <File
+ RelativePath="cslist.c"
+ >
+ <FileConfiguration
+ Name="Release Unicode|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release Unicode [Dynamic SSE2 Fast]|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl"
+ >
+ <File
+ RelativePath=".\cslist.h"
+ >
+ </File>
+ <File
+ RelativePath=".\resource.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+ >
+ <File
+ RelativePath=".\res\add.ico"
+ >
+ </File>
+ <File
+ RelativePath=".\res\apply.ico"
+ >
+ </File>
+ <File
+ RelativePath=".\res\clear.ico"
+ >
+ </File>
+ <File
+ RelativePath=".\cslist.rc"
+ >
+ </File>
+ <File
+ RelativePath=".\res\fav.ico"
+ >
+ </File>
+ <File
+ RelativePath=".\res\import.ico"
+ >
+ </File>
+ <File
+ RelativePath=".\res\main.ico"
+ >
+ </File>
+ <File
+ RelativePath=".\res\modify.ico"
+ >
+ </File>
+ <File
+ RelativePath=".\res\nochng.ico"
+ >
+ </File>
+ <File
+ RelativePath=".\res\options.ico"
+ >
+ </File>
+ <File
+ RelativePath=".\res\remove.ico"
+ >
+ </File>
+ <File
+ RelativePath=".\res\watch.ico"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/custom_status_list/cslist.vcxproj b/custom_status_list/cslist.vcxproj
new file mode 100644
index 0000000..84f0179
--- /dev/null
+++ b/custom_status_list/cslist.vcxproj
@@ -0,0 +1,230 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Release Unicode [Dynamic SSE2 Fast]|Win32">
+ <Configuration>Release Unicode [Dynamic SSE2 Fast]</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release Unicode|Win32">
+ <Configuration>Release Unicode</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectName>custom_status_list</ProjectName>
+ <ProjectGuid>{2AD2FF74-06E1-4BD8-984A-526F3C6315B3}</ProjectGuid>
+ <RootNamespace>cslist</RootNamespace>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Unicode [Dynamic SSE2 Fast]|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release Unicode [Dynamic SSE2 Fast]|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'">$(SolutionDir)$(Configuration)/Plugins\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'">$(SolutionDir)$(Configuration)/Obj/$(ProjectName)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'">false</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release Unicode [Dynamic SSE2 Fast]|Win32'">$(SolutionDir)$(Configuration)\Plugins\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release Unicode [Dynamic SSE2 Fast]|Win32'">$(SolutionDir)$(Configuration)\Plugins\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release Unicode [Dynamic SSE2 Fast]|Win32'">false</LinkIncremental>
+ <IncludePath Condition="'$(Configuration)|$(Platform)'=='Release Unicode [Dynamic SSE2 Fast]|Win32'">D:\Sources\externalapi;D:\Sources\include;$(IncludePath)</IncludePath>
+ <IncludePath Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'">D:\Sources\externalapi;D:\Sources\include;$(IncludePath)</IncludePath>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>.\Release/cslist.tlb</TypeLibraryName>
+ <HeaderFileName>
+ </HeaderFileName>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;CSLIST_EXPORTS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>.\Release/cslist.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>.\Release/</AssemblerListingLocation>
+ <ObjectFileName>.\Release/</ObjectFileName>
+ <ProgramDataBaseFileName>.\Release/</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ <Link>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <ProgramDatabaseFile>.\Release/cslist.pdb</ProgramDatabaseFile>
+ <ImportLibrary>.\Release/cslist.lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ <Bscmake>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <OutputFile>.\Release/cslist.bsc</OutputFile>
+ </Bscmake>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>.\Release/cslist.tlb</TypeLibraryName>
+ <HeaderFileName>
+ </HeaderFileName>
+ </Midl>
+ <ClCompile>
+ <Optimization>MinSpace</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
+ <AdditionalIncludeDirectories>../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;CSLIST_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>.\Release/cslist.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>.\Release/</AssemblerListingLocation>
+ <ObjectFileName>.\Release/</ObjectFileName>
+ <ProgramDataBaseFileName>.\Release/</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)cslist.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <ProgramDatabaseFile>.\Release/cslist.pdb</ProgramDatabaseFile>
+ <ImportLibrary>.\Release/cslist.lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ <Bscmake>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <OutputFile>.\Release/cslist.bsc</OutputFile>
+ </Bscmake>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release Unicode [Dynamic SSE2 Fast]|Win32'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>.\Release/cslist.tlb</TypeLibraryName>
+ <HeaderFileName>
+ </HeaderFileName>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;CSLIST_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>.\Release/cslist.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>.\Release/</AssemblerListingLocation>
+ <ObjectFileName>.\Release/</ObjectFileName>
+ <ProgramDataBaseFileName>.\Release/</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)cslist.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <ProgramDatabaseFile>.\Release/cslist.pdb</ProgramDatabaseFile>
+ <ImportLibrary>.\Release/cslist.lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ <Bscmake>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <OutputFile>.\Release/cslist.bsc</OutputFile>
+ </Bscmake>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="cslist.c">
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Unicode [Dynamic SSE2 Fast]|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Unicode [Dynamic SSE2 Fast]|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="cslist.h" />
+ <ClInclude Include="resource.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="res\add.ico" />
+ <None Include="res\apply.ico" />
+ <None Include="res\clear.ico" />
+ <None Include="res\fav.ico" />
+ <None Include="res\import.ico" />
+ <None Include="res\main.ico" />
+ <None Include="res\modify.ico" />
+ <None Include="res\nochng.ico" />
+ <None Include="res\options.ico" />
+ <None Include="res\remove.ico" />
+ <None Include="res\watch.ico" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="cslist.rc" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/custom_status_list/cslist.vcxproj.filters b/custom_status_list/cslist.vcxproj.filters
new file mode 100644
index 0000000..1972989
--- /dev/null
+++ b/custom_status_list/cslist.vcxproj.filters
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{6500573a-3334-47b6-a046-8b8d10ddf076}</UniqueIdentifier>
+ <Extensions>cpp;c;cxx;rc;def;r;odl;idl;hpj;bat</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{0b9b0ea6-1449-4473-a62c-a97543975df5}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{988747e3-74b2-4aaa-8f88-ffe48242db16}</UniqueIdentifier>
+ <Extensions>ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="cslist.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="cslist.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="resource.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="res\add.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\apply.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\clear.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\fav.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\import.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\main.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\modify.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\nochng.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\options.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\remove.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\watch.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="cslist.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/custom_status_list/cslist.vcxproj.user b/custom_status_list/cslist.vcxproj.user
new file mode 100644
index 0000000..695b5c7
--- /dev/null
+++ b/custom_status_list/cslist.vcxproj.user
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+</Project> \ No newline at end of file
diff --git a/custom_status_list/res/add.ico b/custom_status_list/res/add.ico
new file mode 100644
index 0000000..de1ea5b
--- /dev/null
+++ b/custom_status_list/res/add.ico
Binary files differ
diff --git a/custom_status_list/res/apply.ico b/custom_status_list/res/apply.ico
new file mode 100644
index 0000000..8411a36
--- /dev/null
+++ b/custom_status_list/res/apply.ico
Binary files differ
diff --git a/custom_status_list/res/clear.ico b/custom_status_list/res/clear.ico
new file mode 100644
index 0000000..485ef78
--- /dev/null
+++ b/custom_status_list/res/clear.ico
Binary files differ
diff --git a/custom_status_list/res/fav.ico b/custom_status_list/res/fav.ico
new file mode 100644
index 0000000..4fc2eb6
--- /dev/null
+++ b/custom_status_list/res/fav.ico
Binary files differ
diff --git a/custom_status_list/res/import.ico b/custom_status_list/res/import.ico
new file mode 100644
index 0000000..480c4c4
--- /dev/null
+++ b/custom_status_list/res/import.ico
Binary files differ
diff --git a/custom_status_list/res/main.ico b/custom_status_list/res/main.ico
new file mode 100644
index 0000000..ba883a2
--- /dev/null
+++ b/custom_status_list/res/main.ico
Binary files differ
diff --git a/custom_status_list/res/modify.ico b/custom_status_list/res/modify.ico
new file mode 100644
index 0000000..5321379
--- /dev/null
+++ b/custom_status_list/res/modify.ico
Binary files differ
diff --git a/custom_status_list/res/nochng.ico b/custom_status_list/res/nochng.ico
new file mode 100644
index 0000000..0c7cf1e
--- /dev/null
+++ b/custom_status_list/res/nochng.ico
Binary files differ
diff --git a/custom_status_list/res/options.ico b/custom_status_list/res/options.ico
new file mode 100644
index 0000000..824719f
--- /dev/null
+++ b/custom_status_list/res/options.ico
Binary files differ
diff --git a/custom_status_list/res/remove.ico b/custom_status_list/res/remove.ico
new file mode 100644
index 0000000..4a02959
--- /dev/null
+++ b/custom_status_list/res/remove.ico
Binary files differ
diff --git a/custom_status_list/res/watch.ico b/custom_status_list/res/watch.ico
new file mode 100644
index 0000000..69fd3f6
--- /dev/null
+++ b/custom_status_list/res/watch.ico
Binary files differ
diff --git a/custom_status_list/resource.h b/custom_status_list/resource.h
new file mode 100644
index 0000000..6ded910
--- /dev/null
+++ b/custom_status_list/resource.h
@@ -0,0 +1,78 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by cslist.rc
+//
+#define IDD_CSLIST 101
+#define IDD_ADDMODIFY 102
+#define IDD_OPTIONS 103
+#define IDD_RELNOTES 104
+#define IDI_CSLIST 105
+#define IDI_ADD 106
+#define IDI_MODIFY 107
+#define IDI_REMOVE 108
+#define IDI_WATCH 110
+#define IDI_FAV 111
+#define IDI_NOCHNG 112
+#define IDI_CLEAR 113
+#define IDI_APPLY 114
+#define IDI_OPTIONS 115
+#define IDI_IMPORT 119
+#define IDC_CSLIST 1001
+#define IDC_ADD 1002
+#define IDC_MODIFY 1003
+#define IDC_REMOVE 1004
+#define IDC_IMPORT 1005
+#define IDC_WATCH 1006
+#define IDC_FAV 1007
+#define IDC_NOCHNG 1008
+#define IDC_EXIT 1009
+#define IDC_APPLY 1010
+#define IDC_ST_XICON 1011
+#define IDC_CB_ICON 1012
+#define IDC_ST_XTITLE 1013
+#define IDC_XTITLE 1014
+#define IDC_ST_XMESSAGE 1015
+#define IDC_XMESSAGE 1016
+#define IDC_AM_OK 1017
+#define IDC_AM_CN 1018
+#define IDC_RNCHNGS 1019
+#define IDC_RNNOTICE 1020
+#define IDC_RNPLGNM 1021
+#define IDC_RLNPLGNM2 1022
+#define IDC_RNVER 1023
+#define IDC_RNVER2 1024
+#define IDC_RNAUTH 1025
+#define IDC_RNAUTH2 1026
+#define IDC_RNCPR 1027
+#define IDC_RNCPR2 1028
+#define IDC_RNVERSTICK 1029
+#define IDC_VERSTICK 1030
+#define IDC_RNCSICON 1031
+#define IDC_THX 1032
+#define IDC_TXHTEXT 1033
+#define IDC_SHOWIT 1034
+#define IDC_PLACEMENT_OPTIONS 1035
+#define IDC_PLACE_GLOBAL 1036
+#define IDC_PLACE_GLOBAL_TOP 1038
+#define IDC_PLACE_GLOBAL_BOTTOM 1039
+#define IDC_PLACE_ICQ_STATUS 1040
+#define IDC_PLACE_ICQ_REPLACE 1041
+#define IDC_HIDE_CSMENU 1041
+#define IDC_LIST_SETTINGS 1042
+#define IDC_PLACE_MAIN 1044
+#define IDC_PLACE_TRAY 1046
+#define IDC_DEL_CONFIRM 1047
+#define IDC_DEL_AFTER_IMPORT 1048
+#define IDC_ICQ_INTG 1049
+#define IDC_OPTS 1050
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 116
+#define _APS_NEXT_COMMAND_VALUE 40001
+#define _APS_NEXT_CONTROL_VALUE 1053
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif