From 2e784e23903934a362dc52e3cd2c8ed742a64557 Mon Sep 17 00:00:00 2001 From: Vadim Dashevskiy Date: Mon, 21 Jul 2014 21:12:43 +0000 Subject: Clist_mw moved to deprecated git-svn-id: http://svn.miranda-ng.org/main/trunk@9914 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/!Deprecated/Clist_mw/clist_mw_10.vcxproj | 249 ++ .../Clist_mw/clist_mw_10.vcxproj.filters | 122 + plugins/!Deprecated/Clist_mw/clist_mw_12.vcxproj | 252 ++ .../Clist_mw/clist_mw_12.vcxproj.filters | 122 + plugins/!Deprecated/Clist_mw/res/1.ico | Bin 0 -> 1150 bytes plugins/!Deprecated/Clist_mw/res/2.ico | Bin 0 -> 1150 bytes plugins/!Deprecated/Clist_mw/res/3.ico | Bin 0 -> 1150 bytes plugins/!Deprecated/Clist_mw/res/4.ico | Bin 0 -> 1150 bytes plugins/!Deprecated/Clist_mw/res/5.ico | Bin 0 -> 1150 bytes plugins/!Deprecated/Clist_mw/res/6.ico | Bin 0 -> 1150 bytes plugins/!Deprecated/Clist_mw/res/7.ico | Bin 0 -> 1150 bytes plugins/!Deprecated/Clist_mw/res/8.ico | Bin 0 -> 1150 bytes plugins/!Deprecated/Clist_mw/res/Miranda.ico | Bin 0 -> 1150 bytes plugins/!Deprecated/Clist_mw/res/Version.rc | 38 + plugins/!Deprecated/Clist_mw/res/addgoupp.ico | Bin 0 -> 1150 bytes plugins/!Deprecated/Clist_mw/res/delete.ico | Bin 0 -> 1150 bytes plugins/!Deprecated/Clist_mw/res/globus.ico | Bin 0 -> 1150 bytes plugins/!Deprecated/Clist_mw/res/icon1.ico | Bin 0 -> 1150 bytes plugins/!Deprecated/Clist_mw/res/icon2.ico | Bin 0 -> 1150 bytes .../!Deprecated/Clist_mw/res/mirandaclassic.ico | Bin 0 -> 1150 bytes plugins/!Deprecated/Clist_mw/res/notick.ico | Bin 0 -> 1150 bytes plugins/!Deprecated/Clist_mw/res/notick1.ico | Bin 0 -> 1150 bytes plugins/!Deprecated/Clist_mw/res/rename.ico | Bin 0 -> 1150 bytes plugins/!Deprecated/Clist_mw/res/resource.rc | 530 ++++ plugins/!Deprecated/Clist_mw/res/sendmail.ico | Bin 0 -> 1150 bytes plugins/!Deprecated/Clist_mw/res/sms.ico | Bin 0 -> 1150 bytes plugins/!Deprecated/Clist_mw/src/BkgrCfg.cpp | 310 +++ plugins/!Deprecated/Clist_mw/src/BkgrCfg.h | 18 + .../Clist_mw/src/CLUIFrames/cluiframes.cpp | 2860 ++++++++++++++++++++ .../Clist_mw/src/CLUIFrames/cluiframes.h | 120 + .../Clist_mw/src/CLUIFrames/framesmenu.cpp | 122 + .../Clist_mw/src/CLUIFrames/statusbar.cpp | 497 ++++ plugins/!Deprecated/Clist_mw/src/Version.h | 14 + plugins/!Deprecated/Clist_mw/src/clc.cpp | 319 +++ plugins/!Deprecated/Clist_mw/src/clc.h | 148 + plugins/!Deprecated/Clist_mw/src/clcfonts.cpp | 117 + plugins/!Deprecated/Clist_mw/src/clcidents.cpp | 307 +++ plugins/!Deprecated/Clist_mw/src/clcitems.cpp | 685 +++++ plugins/!Deprecated/Clist_mw/src/clcopts.cpp | 548 ++++ plugins/!Deprecated/Clist_mw/src/clcpaint.cpp | 662 +++++ plugins/!Deprecated/Clist_mw/src/clcutils.cpp | 289 ++ plugins/!Deprecated/Clist_mw/src/clist.h | 55 + plugins/!Deprecated/Clist_mw/src/clistmenus.cpp | 62 + plugins/!Deprecated/Clist_mw/src/clistmod.cpp | 133 + plugins/!Deprecated/Clist_mw/src/clistopts.cpp | 237 ++ plugins/!Deprecated/Clist_mw/src/clistsettings.cpp | 340 +++ plugins/!Deprecated/Clist_mw/src/clisttray.cpp | 263 ++ plugins/!Deprecated/Clist_mw/src/clui.cpp | 765 ++++++ plugins/!Deprecated/Clist_mw/src/cluiopts.cpp | 373 +++ plugins/!Deprecated/Clist_mw/src/cluiservices.cpp | 176 ++ plugins/!Deprecated/Clist_mw/src/commonheaders.cpp | 29 + plugins/!Deprecated/Clist_mw/src/commonheaders.h | 116 + plugins/!Deprecated/Clist_mw/src/contact.cpp | 178 ++ plugins/!Deprecated/Clist_mw/src/groupmenu.cpp | 566 ++++ plugins/!Deprecated/Clist_mw/src/init.cpp | 225 ++ plugins/!Deprecated/Clist_mw/src/keyboard.cpp | 67 + plugins/!Deprecated/Clist_mw/src/resource.h | 642 +++++ plugins/!Deprecated/Clist_mw/src/stdafx.cpp | 18 + 58 files changed, 12574 insertions(+) create mode 100644 plugins/!Deprecated/Clist_mw/clist_mw_10.vcxproj create mode 100644 plugins/!Deprecated/Clist_mw/clist_mw_10.vcxproj.filters create mode 100644 plugins/!Deprecated/Clist_mw/clist_mw_12.vcxproj create mode 100644 plugins/!Deprecated/Clist_mw/clist_mw_12.vcxproj.filters create mode 100644 plugins/!Deprecated/Clist_mw/res/1.ico create mode 100644 plugins/!Deprecated/Clist_mw/res/2.ico create mode 100644 plugins/!Deprecated/Clist_mw/res/3.ico create mode 100644 plugins/!Deprecated/Clist_mw/res/4.ico create mode 100644 plugins/!Deprecated/Clist_mw/res/5.ico create mode 100644 plugins/!Deprecated/Clist_mw/res/6.ico create mode 100644 plugins/!Deprecated/Clist_mw/res/7.ico create mode 100644 plugins/!Deprecated/Clist_mw/res/8.ico create mode 100644 plugins/!Deprecated/Clist_mw/res/Miranda.ico create mode 100644 plugins/!Deprecated/Clist_mw/res/Version.rc create mode 100644 plugins/!Deprecated/Clist_mw/res/addgoupp.ico create mode 100644 plugins/!Deprecated/Clist_mw/res/delete.ico create mode 100644 plugins/!Deprecated/Clist_mw/res/globus.ico create mode 100644 plugins/!Deprecated/Clist_mw/res/icon1.ico create mode 100644 plugins/!Deprecated/Clist_mw/res/icon2.ico create mode 100644 plugins/!Deprecated/Clist_mw/res/mirandaclassic.ico create mode 100644 plugins/!Deprecated/Clist_mw/res/notick.ico create mode 100644 plugins/!Deprecated/Clist_mw/res/notick1.ico create mode 100644 plugins/!Deprecated/Clist_mw/res/rename.ico create mode 100644 plugins/!Deprecated/Clist_mw/res/resource.rc create mode 100644 plugins/!Deprecated/Clist_mw/res/sendmail.ico create mode 100644 plugins/!Deprecated/Clist_mw/res/sms.ico create mode 100644 plugins/!Deprecated/Clist_mw/src/BkgrCfg.cpp create mode 100644 plugins/!Deprecated/Clist_mw/src/BkgrCfg.h create mode 100644 plugins/!Deprecated/Clist_mw/src/CLUIFrames/cluiframes.cpp create mode 100644 plugins/!Deprecated/Clist_mw/src/CLUIFrames/cluiframes.h create mode 100644 plugins/!Deprecated/Clist_mw/src/CLUIFrames/framesmenu.cpp create mode 100644 plugins/!Deprecated/Clist_mw/src/CLUIFrames/statusbar.cpp create mode 100644 plugins/!Deprecated/Clist_mw/src/Version.h create mode 100644 plugins/!Deprecated/Clist_mw/src/clc.cpp create mode 100644 plugins/!Deprecated/Clist_mw/src/clc.h create mode 100644 plugins/!Deprecated/Clist_mw/src/clcfonts.cpp create mode 100644 plugins/!Deprecated/Clist_mw/src/clcidents.cpp create mode 100644 plugins/!Deprecated/Clist_mw/src/clcitems.cpp create mode 100644 plugins/!Deprecated/Clist_mw/src/clcopts.cpp create mode 100644 plugins/!Deprecated/Clist_mw/src/clcpaint.cpp create mode 100644 plugins/!Deprecated/Clist_mw/src/clcutils.cpp create mode 100644 plugins/!Deprecated/Clist_mw/src/clist.h create mode 100644 plugins/!Deprecated/Clist_mw/src/clistmenus.cpp create mode 100644 plugins/!Deprecated/Clist_mw/src/clistmod.cpp create mode 100644 plugins/!Deprecated/Clist_mw/src/clistopts.cpp create mode 100644 plugins/!Deprecated/Clist_mw/src/clistsettings.cpp create mode 100644 plugins/!Deprecated/Clist_mw/src/clisttray.cpp create mode 100644 plugins/!Deprecated/Clist_mw/src/clui.cpp create mode 100644 plugins/!Deprecated/Clist_mw/src/cluiopts.cpp create mode 100644 plugins/!Deprecated/Clist_mw/src/cluiservices.cpp create mode 100644 plugins/!Deprecated/Clist_mw/src/commonheaders.cpp create mode 100644 plugins/!Deprecated/Clist_mw/src/commonheaders.h create mode 100644 plugins/!Deprecated/Clist_mw/src/contact.cpp create mode 100644 plugins/!Deprecated/Clist_mw/src/groupmenu.cpp create mode 100644 plugins/!Deprecated/Clist_mw/src/init.cpp create mode 100644 plugins/!Deprecated/Clist_mw/src/keyboard.cpp create mode 100644 plugins/!Deprecated/Clist_mw/src/resource.h create mode 100644 plugins/!Deprecated/Clist_mw/src/stdafx.cpp (limited to 'plugins/!Deprecated/Clist_mw') diff --git a/plugins/!Deprecated/Clist_mw/clist_mw_10.vcxproj b/plugins/!Deprecated/Clist_mw/clist_mw_10.vcxproj new file mode 100644 index 0000000000..a5df001f7f --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/clist_mw_10.vcxproj @@ -0,0 +1,249 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + Clist_mw + {56997126-0098-407A-94E1-7C5748C1C9EF} + + + + DynamicLibrary + Unicode + true + + + DynamicLibrary + Unicode + + + DynamicLibrary + Unicode + true + + + DynamicLibrary + Unicode + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + $(SolutionDir)$(Configuration)\Plugins\ + $(SolutionDir)$(Configuration)\Obj\$(ProjectName)\ + $(SolutionDir)$(Configuration)64\Plugins\ + $(SolutionDir)$(Configuration)64\Obj\$(ProjectName)\ + $(SolutionDir)$(Configuration)\Plugins\ + $(SolutionDir)$(Configuration)\Obj\$(ProjectName)\ + $(SolutionDir)$(Configuration)64\Plugins\ + $(SolutionDir)$(Configuration)64\Obj\$(ProjectName)\ + true + + + + Disabled + ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + _DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + false + EnableFastChecks + MultiThreadedDebugDLL + true + Use + commonheaders.h + Level3 + EditAndContinue + false + + + _DEBUG;%(PreprocessorDefinitions) + ..\..\include;..\..\include\msapi + + + comctl32.lib;UxTheme.lib;shlwapi.lib;%(AdditionalDependencies) + true + 0x6590000 + false + $(IntDir)$(TargetName).lib + Windows + type=%27Win32%27 name=%27Microsoft.Windows.Common-Controls%27 version=%276.0.0.0%27 processorArchitecture=%27X86%27 publicKeyToken=%276595b64144ccf1df%27 language=%27*%27;%(AdditionalManifestDependencies) + $(ProfileDir)..\..\bin10\lib + + + + + Disabled + ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + _DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + false + EnableFastChecks + MultiThreadedDebugDLL + true + Use + commonheaders.h + Level3 + false + + + _DEBUG;%(PreprocessorDefinitions) + ..\..\include;..\..\include\msapi + + + comctl32.lib;UxTheme.lib;shlwapi.lib;%(AdditionalDependencies) + type=%27Win32%27 name=%27Microsoft.Windows.Common-Controls%27 version=%276.0.0.0%27 processorArchitecture=%27*%27 publicKeyToken=%276595b64144ccf1df%27 language=%27*%27;%(AdditionalManifestDependencies) + true + 0x6590000 + false + $(IntDir)$(TargetName).lib + Windows + $(ProfileDir)..\..\bin10\lib + + + + + Full + OnlyExplicitInline + Size + ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + false + true + Fast + Use + commonheaders.h + Level3 + false + + + NDEBUG;%(PreprocessorDefinitions) + ..\..\include;..\..\include\msapi + + + comctl32.lib;UxTheme.lib;shlwapi.lib;%(AdditionalDependencies) + type=%27Win32%27 name=%27Microsoft.Windows.Common-Controls%27 version=%276.0.0.0%27 processorArchitecture=%27X86%27 publicKeyToken=%276595b64144ccf1df%27 language=%27*%27;%(AdditionalManifestDependencies) + true + true + true + 0x6590000 + false + $(IntDir)$(TargetName).lib + Windows + $(ProfileDir)..\..\bin10\lib + /PDBALTPATH:%_PDB% + + + + + Full + OnlyExplicitInline + Size + ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + false + true + Fast + Use + commonheaders.h + Level3 + false + + + NDEBUG;%(PreprocessorDefinitions) + ..\..\include;..\..\include\msapi + + + comctl32.lib;UxTheme.lib;shlwapi.lib;%(AdditionalDependencies) + type=%27Win32%27 name=%27Microsoft.Windows.Common-Controls%27 version=%276.0.0.0%27 processorArchitecture=%27*%27 publicKeyToken=%276595b64144ccf1df%27 language=%27*%27;%(AdditionalManifestDependencies) + true + true + true + 0x6590000 + false + $(IntDir)$(TargetName).lib + Windows + $(ProfileDir)..\..\bin10\lib + /PDBALTPATH:%_PDB% + + + + + + + + + + + + + + + + + + + + + Create + + + + + + + ..\commonheaders.h + + + ..\commonheaders.h + + + ..\commonheaders.h + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/!Deprecated/Clist_mw/clist_mw_10.vcxproj.filters b/plugins/!Deprecated/Clist_mw/clist_mw_10.vcxproj.filters new file mode 100644 index 0000000000..c117a63633 --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/clist_mw_10.vcxproj.filters @@ -0,0 +1,122 @@ + + + + + {6c881602-dfa1-45ce-8613-13d8c6bd3ad5} + cpp;c;cxx;rc;def;r;odl;idl;hpj;bat + + + {56b79972-29f3-40b1-bf23-ccffb8791acd} + h;hpp;hxx;hm;inl + + + {a32ba414-7a6a-4ff3-9127-2fba358accda} + ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Resource Files + + + Resource Files + + + \ No newline at end of file diff --git a/plugins/!Deprecated/Clist_mw/clist_mw_12.vcxproj b/plugins/!Deprecated/Clist_mw/clist_mw_12.vcxproj new file mode 100644 index 0000000000..45ddd741c8 --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/clist_mw_12.vcxproj @@ -0,0 +1,252 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + Clist_mw + {56997126-0098-407A-94E1-7C5748C1C9EF} + + + + DynamicLibrary + Unicode + true + v120_xp + + + DynamicLibrary + Unicode + v120_xp + + + DynamicLibrary + Unicode + true + v120_xp + + + DynamicLibrary + Unicode + v120_xp + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + $(SolutionDir)$(Configuration)\Plugins\ + $(SolutionDir)$(Configuration)\Obj\$(ProjectName)\ + $(SolutionDir)$(Configuration)64\Plugins\ + $(SolutionDir)$(Configuration)64\Obj\$(ProjectName)\ + $(SolutionDir)$(Configuration)\Plugins\ + $(SolutionDir)$(Configuration)\Obj\$(ProjectName)\ + $(SolutionDir)$(Configuration)64\Plugins\ + $(SolutionDir)$(Configuration)64\Obj\$(ProjectName)\ + true + + + + Disabled + ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + _DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + false + EnableFastChecks + MultiThreadedDebugDLL + true + Use + commonheaders.h + Level3 + EditAndContinue + false + + + _DEBUG;%(PreprocessorDefinitions) + ..\..\include;..\..\include\msapi + + + comctl32.lib;UxTheme.lib;shlwapi.lib;%(AdditionalDependencies) + true + 0x6590000 + false + $(IntDir)$(TargetName).lib + Windows + type=%27Win32%27 name=%27Microsoft.Windows.Common-Controls%27 version=%276.0.0.0%27 processorArchitecture=%27X86%27 publicKeyToken=%276595b64144ccf1df%27 language=%27*%27;%(AdditionalManifestDependencies) + $(ProfileDir)..\..\bin12\lib + false + + + + + Disabled + ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + _DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + false + EnableFastChecks + MultiThreadedDebugDLL + true + Use + commonheaders.h + Level3 + false + + + _DEBUG;%(PreprocessorDefinitions) + ..\..\include;..\..\include\msapi + + + comctl32.lib;UxTheme.lib;shlwapi.lib;%(AdditionalDependencies) + type=%27Win32%27 name=%27Microsoft.Windows.Common-Controls%27 version=%276.0.0.0%27 processorArchitecture=%27*%27 publicKeyToken=%276595b64144ccf1df%27 language=%27*%27;%(AdditionalManifestDependencies) + true + 0x6590000 + false + $(IntDir)$(TargetName).lib + Windows + $(ProfileDir)..\..\bin12\lib + + + + + Full + OnlyExplicitInline + Size + ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + false + true + Fast + Use + commonheaders.h + Level3 + false + + + NDEBUG;%(PreprocessorDefinitions) + ..\..\include;..\..\include\msapi + + + comctl32.lib;UxTheme.lib;shlwapi.lib;%(AdditionalDependencies) + type=%27Win32%27 name=%27Microsoft.Windows.Common-Controls%27 version=%276.0.0.0%27 processorArchitecture=%27X86%27 publicKeyToken=%276595b64144ccf1df%27 language=%27*%27;%(AdditionalManifestDependencies) + true + true + true + 0x6590000 + false + $(IntDir)$(TargetName).lib + Windows + $(ProfileDir)..\..\bin12\lib + + + + + Full + OnlyExplicitInline + Size + ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + false + true + Fast + Use + commonheaders.h + Level3 + false + + + NDEBUG;%(PreprocessorDefinitions) + ..\..\include;..\..\include\msapi + + + comctl32.lib;UxTheme.lib;shlwapi.lib;%(AdditionalDependencies) + type=%27Win32%27 name=%27Microsoft.Windows.Common-Controls%27 version=%276.0.0.0%27 processorArchitecture=%27*%27 publicKeyToken=%276595b64144ccf1df%27 language=%27*%27;%(AdditionalManifestDependencies) + true + true + true + 0x6590000 + false + $(IntDir)$(TargetName).lib + Windows + $(ProfileDir)..\..\bin12\lib + + + + + + + + + + + + + + + + + + + + + Create + + + + + + + ..\commonheaders.h + + + ..\commonheaders.h + + + ..\commonheaders.h + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/!Deprecated/Clist_mw/clist_mw_12.vcxproj.filters b/plugins/!Deprecated/Clist_mw/clist_mw_12.vcxproj.filters new file mode 100644 index 0000000000..c117a63633 --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/clist_mw_12.vcxproj.filters @@ -0,0 +1,122 @@ + + + + + {6c881602-dfa1-45ce-8613-13d8c6bd3ad5} + cpp;c;cxx;rc;def;r;odl;idl;hpj;bat + + + {56b79972-29f3-40b1-bf23-ccffb8791acd} + h;hpp;hxx;hm;inl + + + {a32ba414-7a6a-4ff3-9127-2fba358accda} + ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Resource Files + + + Resource Files + + + \ No newline at end of file diff --git a/plugins/!Deprecated/Clist_mw/res/1.ico b/plugins/!Deprecated/Clist_mw/res/1.ico new file mode 100644 index 0000000000..df6c8fc04e Binary files /dev/null and b/plugins/!Deprecated/Clist_mw/res/1.ico differ diff --git a/plugins/!Deprecated/Clist_mw/res/2.ico b/plugins/!Deprecated/Clist_mw/res/2.ico new file mode 100644 index 0000000000..ce05d2b327 Binary files /dev/null and b/plugins/!Deprecated/Clist_mw/res/2.ico differ diff --git a/plugins/!Deprecated/Clist_mw/res/3.ico b/plugins/!Deprecated/Clist_mw/res/3.ico new file mode 100644 index 0000000000..4bdb2b9e8a Binary files /dev/null and b/plugins/!Deprecated/Clist_mw/res/3.ico differ diff --git a/plugins/!Deprecated/Clist_mw/res/4.ico b/plugins/!Deprecated/Clist_mw/res/4.ico new file mode 100644 index 0000000000..712f0b3905 Binary files /dev/null and b/plugins/!Deprecated/Clist_mw/res/4.ico differ diff --git a/plugins/!Deprecated/Clist_mw/res/5.ico b/plugins/!Deprecated/Clist_mw/res/5.ico new file mode 100644 index 0000000000..4ab50eafd3 Binary files /dev/null and b/plugins/!Deprecated/Clist_mw/res/5.ico differ diff --git a/plugins/!Deprecated/Clist_mw/res/6.ico b/plugins/!Deprecated/Clist_mw/res/6.ico new file mode 100644 index 0000000000..35629e8cd2 Binary files /dev/null and b/plugins/!Deprecated/Clist_mw/res/6.ico differ diff --git a/plugins/!Deprecated/Clist_mw/res/7.ico b/plugins/!Deprecated/Clist_mw/res/7.ico new file mode 100644 index 0000000000..cdb11c58bd Binary files /dev/null and b/plugins/!Deprecated/Clist_mw/res/7.ico differ diff --git a/plugins/!Deprecated/Clist_mw/res/8.ico b/plugins/!Deprecated/Clist_mw/res/8.ico new file mode 100644 index 0000000000..4489d84723 Binary files /dev/null and b/plugins/!Deprecated/Clist_mw/res/8.ico differ diff --git a/plugins/!Deprecated/Clist_mw/res/Miranda.ico b/plugins/!Deprecated/Clist_mw/res/Miranda.ico new file mode 100644 index 0000000000..db8dc77c09 Binary files /dev/null and b/plugins/!Deprecated/Clist_mw/res/Miranda.ico differ diff --git a/plugins/!Deprecated/Clist_mw/res/Version.rc b/plugins/!Deprecated/Clist_mw/res/Version.rc new file mode 100644 index 0000000000..5bfbab4754 --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/res/Version.rc @@ -0,0 +1,38 @@ +// Microsoft Visual C++ generated resource script. +// +#ifdef APSTUDIO_INVOKED +#error this file is not editable by Microsoft Visual C++ +#endif //APSTUDIO_INVOKED + +#include "afxres.h" +#include "..\src\version.h" + +VS_VERSION_INFO VERSIONINFO + FILEVERSION __FILEVERSION_STRING + PRODUCTVERSION __FILEVERSION_STRING + FILEFLAGSMASK 0x17L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x0L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "FileDescription", __DESCRIPTION + VALUE "InternalName", __PLUGIN_NAME + VALUE "LegalCopyright", __COPYRIGHT + VALUE "OriginalFilename", __FILENAME + VALUE "ProductName", __PLUGIN_NAME + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END diff --git a/plugins/!Deprecated/Clist_mw/res/addgoupp.ico b/plugins/!Deprecated/Clist_mw/res/addgoupp.ico new file mode 100644 index 0000000000..539c32fcd9 Binary files /dev/null and b/plugins/!Deprecated/Clist_mw/res/addgoupp.ico differ diff --git a/plugins/!Deprecated/Clist_mw/res/delete.ico b/plugins/!Deprecated/Clist_mw/res/delete.ico new file mode 100644 index 0000000000..3770daf2fc Binary files /dev/null and b/plugins/!Deprecated/Clist_mw/res/delete.ico differ diff --git a/plugins/!Deprecated/Clist_mw/res/globus.ico b/plugins/!Deprecated/Clist_mw/res/globus.ico new file mode 100644 index 0000000000..dbf58aeb04 Binary files /dev/null and b/plugins/!Deprecated/Clist_mw/res/globus.ico differ diff --git a/plugins/!Deprecated/Clist_mw/res/icon1.ico b/plugins/!Deprecated/Clist_mw/res/icon1.ico new file mode 100644 index 0000000000..cad0e2a5cc Binary files /dev/null and b/plugins/!Deprecated/Clist_mw/res/icon1.ico differ diff --git a/plugins/!Deprecated/Clist_mw/res/icon2.ico b/plugins/!Deprecated/Clist_mw/res/icon2.ico new file mode 100644 index 0000000000..8ee933d416 Binary files /dev/null and b/plugins/!Deprecated/Clist_mw/res/icon2.ico differ diff --git a/plugins/!Deprecated/Clist_mw/res/mirandaclassic.ico b/plugins/!Deprecated/Clist_mw/res/mirandaclassic.ico new file mode 100644 index 0000000000..0c8d999e70 Binary files /dev/null and b/plugins/!Deprecated/Clist_mw/res/mirandaclassic.ico differ diff --git a/plugins/!Deprecated/Clist_mw/res/notick.ico b/plugins/!Deprecated/Clist_mw/res/notick.ico new file mode 100644 index 0000000000..2a78c302df Binary files /dev/null and b/plugins/!Deprecated/Clist_mw/res/notick.ico differ diff --git a/plugins/!Deprecated/Clist_mw/res/notick1.ico b/plugins/!Deprecated/Clist_mw/res/notick1.ico new file mode 100644 index 0000000000..0ba1d546f3 Binary files /dev/null and b/plugins/!Deprecated/Clist_mw/res/notick1.ico differ diff --git a/plugins/!Deprecated/Clist_mw/res/rename.ico b/plugins/!Deprecated/Clist_mw/res/rename.ico new file mode 100644 index 0000000000..90848f1179 Binary files /dev/null and b/plugins/!Deprecated/Clist_mw/res/rename.ico differ diff --git a/plugins/!Deprecated/Clist_mw/res/resource.rc b/plugins/!Deprecated/Clist_mw/res/resource.rc new file mode 100644 index 0000000000..f3337f2f52 --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/res/resource.rc @@ -0,0 +1,530 @@ +// Microsoft Visual C++ generated resource script. +// +#include "..\src\resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include +#include + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Ðóññêèé (Ðîññèÿ) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS) +LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT +#pragma code_page(1251) + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_GLOBUS ICON "globus.ico" +IDI_SMS ICON "sms.ico" +IDI_ICQC1 ICON "1.ico" +IDI_ICQC2 ICON "2.ico" +IDI_ICQC3 ICON "3.ico" +IDI_ICQC4 ICON "4.ico" +IDI_ICQC5 ICON "5.ico" +IDI_ICQC6 ICON "6.ico" +IDI_ICQC7 ICON "7.ico" +IDI_ICQC8 ICON "8.ico" +IDI_EMAIL ICON "sendmail.ico" +IDI_NEWGROUP2 ICON "addgoupp.ico" +IDI_RENAME ICON "rename.ico" +IDI_DELETE ICON "delete.ico" +IDI_NOTICK ICON "..\\..\\..\\src\\res\\check_off.ico" +IDI_TICK ICON "..\\..\\..\\src\\res\\check_on.ico" +IDI_BLANK ICON "..\\..\\..\\src\\res\\_blank.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// Cursor +// + +IDC_HYPERLINKHAND CURSOR "..\\..\\..\\src\\res\\cursor_hyperlink.cur" +IDC_DROP CURSOR "..\\..\\..\\src\\res\\cursor_drag_copy.cur" +IDC_DROPUSER CURSOR "..\\..\\..\\src\\res\\cursor_drop_user.cur" + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_OPT_CLCBKG2 DIALOGEX 0, 0, 234, 164 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Settings",IDC_STATIC,4,19,226,141 + LTEXT "Background color:",IDC_BC_STATIC,12,35,72,8,NOT WS_GROUP + CONTROL "",IDC_BKGCOLOUR,"ColourPicker",WS_TABSTOP,84,34,32,10 + LTEXT "Selection color:",IDC_SC_STATIC,12,51,72,8 + CONTROL "",IDC_SELCOLOUR,"ColourPicker",WS_TABSTOP,84,50,32,10 + CONTROL "Use background bitmap",IDC_BITMAP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,68,161,10 + EDITTEXT IDC_FILENAME,22,82,184,12,ES_AUTOHSCROLL + PUSHBUTTON "...",IDC_BROWSE,208,82,15,11 + CONTROL "Stretch to width",IDC_STRETCHH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,99,98,10 + CONTROL "Stretch to height",IDC_STRETCHV,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,121,99,101,10 + CONTROL "Tile horizontally",IDC_TILEH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,112,98,10 + CONTROL "Tile vertically",IDC_TILEV,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,125,98,10 + CONTROL "Scroll with text",IDC_SCROLL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,121,125,100,10 + CONTROL "Stretch proportionally",IDC_PROPORTIONAL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,121,112,101,10 + CONTROL "Tile vertically according to Row Height",IDC_TILEVROWH, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,140,205,10 + COMBOBOX IDC_BKGRLIST,4,5,226,155,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP +END + +IDD_OPT_GENMENU DIALOGEX 0, 0, 306, 241 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CONTROL "Tree1",IDC_MENUITEMS,"SysTreeView32",TVS_SHOWSELALWAYS | WS_DISABLED | WS_BORDER | WS_TABSTOP,155,15,134,200 + CONTROL "Tree2",IDC_MENUOBJECTS,"SysTreeView32",TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,10,15,119,80 + LTEXT "Warning!\r\nThis MenuObject not support user defined options.",IDC_NOTSUPPORTWARNING,10,110,130,31,NOT WS_VISIBLE + GROUPBOX "MenuObjects",IDC_STATIC,5,5,133,95 + GROUPBOX "MenuItems",IDC_STATIC,148,5,147,215 + PUSHBUTTON "InsertSeparator",IDC_INSERTSEPARATOR,90,146,54,14,WS_DISABLED + LTEXT "Service:",IDC_STATIC,0,166,27,8 + EDITTEXT IDC_GENMENU_SERVICE,29,164,115,14,ES_AUTOHSCROLL | WS_DISABLED + LTEXT "Name:",IDC_STATIC,0,183,28,8 + EDITTEXT IDC_GENMENU_CUSTOMNAME,29,180,116,14,ES_AUTOHSCROLL | WS_DISABLED + PUSHBUTTON "Set",IDC_GENMENU_SET,128,196,17,14,WS_DISABLED + PUSHBUTTON "Default",IDC_GENMENU_DEFAULT,77,196,43,14,WS_DISABLED +END + +IDD_DELETECONTACT DIALOGEX 0, 0, 284, 90 +STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "Delete Contact" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + DEFPUSHBUTTON "No",IDNO,162,38,65,14 + PUSHBUTTON "Yes",IDYES,54,38,65,14 + CONTROL "Hide from list only, in order to keep their history and ignore/visibility settings",IDC_HIDE, + "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,7,65,270,9 + LTEXT "Use Options->Contacts->Ignore to unhide contacts.",IDC_STATIC,20,78,257,8 + CONTROL "Are you sure you want to delete %s?",IDC_TOPLINE,"Static",SS_SIMPLE | SS_NOPREFIX | WS_GROUP,7,7,270,8 + LTEXT "This will erase all history and settings for this contact!",IDC_STATIC,7,18,239,14 +END + +IDD_OPT_CLIST DIALOGEX 0, 0, 314, 232 +STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CONTROL "Hide offline users",IDC_HIDEOFFLINE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,17,124,10 + CONTROL "Hide empty groups",IDC_HIDEEMPTYGROUPS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,33,124,10 + CONTROL "Disable groups",IDC_DISABLEGROUPS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,50,124,10 + CONTROL "Ask before deleting contacts",IDC_CONFIRMDELETE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,67,124,10 + CONTROL "Always on top",IDC_ONTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,84,124,10 + CONTROL "Hide contact list after it has been idle for",IDC_AUTOHIDE, + "Button",BS_AUTOCHECKBOX | BS_TOP | BS_MULTILINE | WS_TABSTOP,10,100,124,22 + EDITTEXT IDC_HIDETIME,54,109,30,12,ES_RIGHT | ES_NUMBER + CONTROL "Spin1",IDC_HIDETIMESPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS | UDS_HOTTRACK,75,108,10,14 + LTEXT "seconds",IDC_STAUTOHIDESECS,87,111,47,8 + CONTROL "Sort contacts by name",IDC_SORTBYNAME,"Button",BS_AUTORADIOBUTTON | WS_GROUP,153,14,151,10 + CONTROL "Sort contacts by status",IDC_SORTBYSTATUS,"Button",BS_AUTORADIOBUTTON,153,38,151,10 + CONTROL "Sort contacts by protocol",IDC_SORTBYPROTO,"Button",BS_AUTORADIOBUTTON,153,51,151,10 + CONTROL "Single click interface",IDC_ONECLK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,151,82,151,10 + CONTROL "Always show status in tooltip",IDC_ALWAYSSTATUS,"Button",BS_AUTOCHECKBOX | BS_TOP | BS_MULTILINE | WS_TABSTOP,151,95,151,11 + CONTROL "Disable icon blinking",IDC_DISABLEBLINK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,151,108,151,9 + EDITTEXT IDC_BLINKTIME,153,122,35,12,ES_NUMBER + LTEXT "ms, delay between icon blinking",IDC_STATIC,203,124,102,8 + CONTROL "Show",IDC_DONTCYCLE,"Button",BS_AUTORADIOBUTTON | WS_GROUP,10,155,97,10 + COMBOBOX IDC_PRIMARYSTATUS,107,153,78,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "icon when statuses differ",IDC_STATIC,189,155,116,8,NOT WS_GROUP + CONTROL "Cycle icons every",IDC_CYCLE,"Button",BS_AUTORADIOBUTTON,10,170,97,10 + EDITTEXT IDC_CYCLETIME,107,170,30,12,ES_RIGHT | ES_NUMBER + CONTROL "Spin1",IDC_CYCLETIMESPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS | UDS_HOTTRACK,137,168,11,14 + LTEXT "seconds, when statuses differ",IDC_STATIC,154,172,151,8,NOT WS_GROUP + CONTROL "Show multiple icons",IDC_MULTITRAY,"Button",BS_AUTORADIOBUTTON,9,184,98,10 + CONTROL "Only when statuses differ",IDC_ALWAYSMULTI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,107,184,198,10 + GROUPBOX "Contact list",IDC_STCLISTGROUP,2,2,135,139 + GROUPBOX "System tray icon",IDC_STATIC,143,71,169,70 + GROUPBOX "System tray icon when using multiple protocols",IDC_STATIC,2,142,310,57 + GROUPBOX "Contact list sorting",IDC_STATIC,143,2,169,69,WS_GROUP + CONTROL "Spin5",IDC_BLINKSPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS | UDS_HOTTRACK,177,109,11,12 + CONTROL "Don't move offline user to bottom",IDC_NOOFFLINEMOVE, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,168,26,142,10 + CONTROL "Pin to desktop",IDC_ONDESKTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,120,125,15 + CONTROL "Disable icon blinking",IDC_ICONBLINK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,84,97,10 + GROUPBOX "Rows",IDC_STATIC,2,199,174,31 + LTEXT "Row height:",IDC_STATIC,10,213,65,8 + EDITTEXT IDC_ROWHEIGHT,77,211,40,13,ES_RIGHT | ES_NUMBER + CONTROL "Spin1",IDC_ROWHEIGHTSPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS | UDS_HOTTRACK,97,210,10,14 + LTEXT "pixels",IDC_STATIC,112,213,62,8 + CONTROL "Gamma correction",IDC_GAMMACORRECT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,180,211,95,10 +END + +IDD_OPT_CLUI DIALOGEX 0, 0, 314, 232 +STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Window",IDC_STWINDOWGROUP,4,4,305,121 + CONTROL "Always on top",IDC_ONTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,18,128,10 + CONTROL "Tool style main window",IDC_TOOLWND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,32,128,10 + CONTROL "Minimize to tray",IDC_MIN2TRAY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,46,128,10 + CONTROL "Hide contact list after it has been idle for",IDC_AUTOHIDE, + "Button",BS_AUTOCHECKBOX | BS_TOP | BS_MULTILINE | WS_TABSTOP,141,18,162,10 + EDITTEXT IDC_HIDETIME,151,33,30,12,ES_RIGHT | ES_NUMBER + CONTROL "Spin1",IDC_HIDETIMESPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS | UDS_HOTTRACK,172,32,10,14 + LTEXT "seconds",IDC_STATIC01,186,35,56,8 + CONTROL "Automatically resize window to height of list",IDC_AUTOSIZE, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,141,55,162,10 + LTEXT "maximum",IDC_STATIC21,151,71,45,8 + EDITTEXT IDC_MAXSIZEHEIGHT,197,69,31,12,ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER + CONTROL "Spin1",IDC_MAXSIZESPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_HOTTRACK,218,68,10,14 + LTEXT "% of screen",IDC_STATIC22,230,71,69,8 + CONTROL "Size upwards",IDC_AUTOSIZEUPWARD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,151,86,147,10 + LTEXT "Title bar text:",IDC_STATIC,12,106,51,8 + GROUPBOX "Translucency options",IDC_STATIC,4,130,191,80 + CONTROL "Fade contact list in/out",IDC_FADEINOUT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,140,163,10 + CONTROL "Transparent contact list",IDC_TRANSPARENT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,152,151,9 + LTEXT "Inactive opacity:",IDC_STATIC11,23,165,67,8 + CONTROL "Slider2",IDC_TRANSINACTIVE,"msctls_trackbar32",TBS_TOP | TBS_NOTICKS | WS_TABSTOP,95,164,70,11 + LTEXT "Active opacity:",IDC_STATIC12,23,181,67,8 + CONTROL "Slider2",IDC_TRANSACTIVE,"msctls_trackbar32",TBS_TOP | TBS_NOTICKS | WS_TABSTOP,95,179,70,11 + LTEXT "000%",IDC_INACTIVEPERC,165,164,25,8,SS_NOPREFIX + LTEXT "000%",IDC_ACTIVEPERC,165,184,25,8,SS_NOPREFIX + CONTROL "Show menu bar",IDC_SHOWMAINMENU,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,60,128,10 + CONTROL "Easy move",IDC_CLIENTDRAG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,74,128,10 + CONTROL "Show title bar",IDC_SHOWCAPTION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,88,128,10 + CONTROL "If window is partially covered, bring to front instead of hiding",IDC_BRINGTOFRONT, + "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,141,102,162,16 + EDITTEXT IDC_TITLETEXT,63,104,72,12,ES_AUTOHSCROLL + CONTROL "Enable drop shadow (restart required)",IDC_DROPSHADOW, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,194,138,10 +END + +IDD_OPT_CLC DIALOGEX 0, 0, 314, 251 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Items",IDC_STATIC,2,2,310,114 + CONTROL "Show divider between online and offline contacts",IDC_DIVIDERONOFF, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,13,179,10 + CONTROL "Hot track items as mouse passes over",IDC_TRACKSELECT, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,28,179,10 + CONTROL "Disable drag and drop of items",IDC_DISABLEDRAGDROP, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,43,179,10 + CONTROL "Disable rename of items by clicking twice",IDC_NOTEDITLABELS, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,58,179,10 + CONTROL "Show selection even when list is not focused",IDC_SHOWSELALWAYS, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,73,179,10 + CONTROL "Make selection highlight translucent",IDC_NOTNOTRANSLUCENTSEL, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,88,179,10 + LTEXT "'Hide offline' means to hide:",IDC_STATIC,191,10,112,8 + CONTROL "Tree1",IDC_HIDEOFFLINEOPTS,"SysTreeView32",TVS_DISABLEDRAGDROP | TVS_NOTOOLTIPS | TVS_NONEVENHEIGHT | WS_BORDER | WS_TABSTOP,191,20,112,80 + GROUPBOX "Groups",IDC_STATIC,2,120,148,121 + CONTROL "Draw a line alongside group names",IDC_LINEWITHGROUPS, + "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,11,129,131,16 + CONTROL "Show counts of number of contacts in a group",IDC_SHOWGROUPCOUNTS, + "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,11,147,131,16 + CONTROL "Hide group counts when there are none online",IDC_HIDECOUNTSWHENEMPTY, + "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,11,165,131,16 + CONTROL "Sort groups alphabetically",IDC_SORTGROUPSALPHA,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,11,183,131,16 + CONTROL "Quicksearch in open groups only",IDC_QUICKSEARCHVISONLY, + "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,11,201,131,16 + LTEXT "Indent groups by:",IDC_STATIC,11,221,67,8 + EDITTEXT IDC_GROUPINDENT,78,219,31,12,ES_RIGHT | ES_NUMBER + CONTROL "Spin1",IDC_GROUPINDENTSPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS | UDS_HOTTRACK,95,215,10,14 + LTEXT "pixels",IDC_STATIC,112,221,36,8 + GROUPBOX "Visual",IDC_STATIC,156,120,156,121 + CONTROL "Scroll list smoothly",IDC_NOTNOSMOOTHSCROLLING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,164,130,139,10 + LTEXT "Time:",IDC_STATIC11,174,144,42,8 + EDITTEXT IDC_SMOOTHTIME,216,142,31,12,ES_RIGHT | ES_NUMBER + CONTROL "Spin1",IDC_SMOOTHTIMESPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS | UDS_HOTTRACK,237,137,10,14 + LTEXT "milliseconds",IDC_STATIC12,250,140,56,8,SS_CENTERIMAGE + LTEXT "Left margin:",IDC_STATIC,165,180,52,8 + EDITTEXT IDC_LEFTMARGIN,215,180,31,12,ES_RIGHT | ES_NUMBER + CONTROL "Spin1",IDC_LEFTMARGINSPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS | UDS_HOTTRACK,240,180,10,14 + LTEXT "pixels",IDC_STATIC,250,180,54,8 + CONTROL "Gray out entire list when:",IDC_GREYOUT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,165,195,139,10 + CONTROL "Tree1",IDC_GREYOUTOPTS,"SysTreeView32",TVS_DISABLEDRAGDROP | TVS_NOTOOLTIPS | TVS_NONEVENHEIGHT | WS_BORDER | WS_TABSTOP,165,205,139,30 + CONTROL "Dim idle contacts",IDC_IDLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,102,153,10 + CONTROL "Hide vertical scrollbar",IDC_NOSCROLLBAR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,165,160,140,10 +END + +IDD_OPT_CLCBKG DIALOGEX 0, 0, 235, 151 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Contact list background",IDC_STATIC,4,4,227,141 + LTEXT "Background color:",IDC_STATIC,12,20,72,8,NOT WS_GROUP + CONTROL "",IDC_BKGCOLOUR,"ColourPicker",WS_TABSTOP,84,19,32,10 + LTEXT "Selection color:",IDC_STATIC,12,36,72,8 + CONTROL "",IDC_SELCOLOUR,"ColourPicker",WS_TABSTOP,84,35,32,10 + CONTROL "Use background bitmap",IDC_BITMAP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,53,161,10 + EDITTEXT IDC_FILENAME,22,67,184,12,ES_AUTOHSCROLL + PUSHBUTTON "...",IDC_BROWSE,208,67,15,11 + CONTROL "Stretch to width",IDC_STRETCHH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,84,100,10 + CONTROL "Stretch to height",IDC_STRETCHV,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,121,84,101,10 + CONTROL "Tile horizontally",IDC_TILEH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,97,93,10 + CONTROL "Tile vertically",IDC_TILEV,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,110,85,10 + CONTROL "Scroll with text",IDC_SCROLL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,121,110,100,10 + CONTROL "Stretch proportionally",IDC_PROPORTIONAL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,121,97,101,10 + CONTROL "Tile vertically according to Row Height",IDC_TILEVROWH, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,125,205,10 +END + +IDD_OPT_META_CLC DIALOGEX 0, 0, 259, 97 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CONTROL "Use 'Meta' protocol icons for metacontacts",IDC_META, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,13,233,10 + CONTROL "Avoid double click expand",IDC_METADBLCLK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,29,233,10 + CONTROL "Hide all extra icons for subcontacts",IDC_METASUBEXTRA, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,45,233,10 + GROUPBOX "Metacontacts supporting",-1,2,2,252,90 + CONTROL "Ignore empty extra icons places (arrange to right)",IDC_METASUBEXTRA_IGN, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,75,233,10 + CONTROL "Hide offline subcontacts",IDC_METASUB_HIDEOFFLINE, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,60,233,10 +END + +IDD_OPT_SBAR DIALOGEX 0, 0, 178, 211 +STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Status bar",IDC_STATIC,4,4,170,201 + CONTROL "Show status bar",IDC_SHOWSBAR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,17,152,10 + CONTROL "Show icons",IDC_SHOWICON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,20,35,142,10 + CONTROL "Show protocol names",IDC_SHOWPROTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,20,47,142,10 + CONTROL "Show status text",IDC_SHOWSTATUS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,20,59,142,10 + CONTROL "Right click opens status menu",IDC_RIGHTSTATUS,"Button",BS_AUTORADIOBUTTON,20,111,142,10 + CONTROL "Right click opens Miranda menu",IDC_RIGHTMIRANDA,"Button",BS_AUTORADIOBUTTON,20,122,142,10 + CONTROL "Make sections equal width",IDC_EQUALSECTIONS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,20,141,142,10 + CONTROL "",IDC_BKGCOLOUR,"ColourPicker",WS_TABSTOP,100,175,32,10 + LTEXT "Background color:",IDC_STATIC,20,175,72,8,NOT WS_GROUP + PUSHBUTTON "-",IDC_DEFBKCOLOR,135,175,6,10 + CONTROL "Show size grip",IDC_SHOWSIZEGRIP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,20,72,142,10 + CONTROL "Show bevel effect on panels",IDC_SBPANELBEVEL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,20,86,107,10 + CONTROL "Use connecting icon",IDC_USECONNECTINGICON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,20,97,82,10 + CONTROL "Use new drawer for status bar",IDC_USEOWNERDRAW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,20,160,142,10 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_OPT_CLCBKG2, DIALOG + BEGIN + BOTTOMMARGIN, 149 + END + + IDD_DELETECONTACT, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 277 + TOPMARGIN, 7 + BOTTOMMARGIN, 85 + END + + IDD_OPT_CLIST, DIALOG + BEGIN + LEFTMARGIN, 2 + RIGHTMARGIN, 312 + VERTGUIDE, 10 + VERTGUIDE, 107 + TOPMARGIN, 2 + BOTTOMMARGIN, 204 + HORZGUIDE, 182 + HORZGUIDE, 196 + END + + IDD_OPT_CLUI, DIALOG + BEGIN + LEFTMARGIN, 4 + RIGHTMARGIN, 309 + VERTGUIDE, 13 + VERTGUIDE, 23 + VERTGUIDE, 112 + VERTGUIDE, 141 + VERTGUIDE, 151 + VERTGUIDE, 175 + VERTGUIDE, 242 + VERTGUIDE, 246 + TOPMARGIN, 4 + BOTTOMMARGIN, 228 + HORZGUIDE, 18 + HORZGUIDE, 39 + HORZGUIDE, 75 + HORZGUIDE, 180 + HORZGUIDE, 196 + END + + IDD_OPT_CLC, DIALOG + BEGIN + LEFTMARGIN, 2 + RIGHTMARGIN, 312 + VERTGUIDE, 11 + VERTGUIDE, 164 + VERTGUIDE, 216 + TOPMARGIN, 2 + BOTTOMMARGIN, 249 + HORZGUIDE, 145 + HORZGUIDE, 163 + HORZGUIDE, 222 + END + + IDD_OPT_CLCBKG, DIALOG + BEGIN + LEFTMARGIN, 4 + RIGHTMARGIN, 231 + VERTGUIDE, 12 + VERTGUIDE, 22 + VERTGUIDE, 122 + TOPMARGIN, 4 + BOTTOMMARGIN, 147 + HORZGUIDE, 24 + HORZGUIDE, 40 + HORZGUIDE, 73 + HORZGUIDE, 89 + HORZGUIDE, 102 + HORZGUIDE, 115 + END + + IDD_OPT_META_CLC, DIALOG + BEGIN + LEFTMARGIN, 2 + RIGHTMARGIN, 257 + VERTGUIDE, 11 + VERTGUIDE, 244 + TOPMARGIN, 2 + BOTTOMMARGIN, 92 + END + + IDD_OPT_SBAR, DIALOG + BEGIN + LEFTMARGIN, 4 + RIGHTMARGIN, 174 + VERTGUIDE, 12 + VERTGUIDE, 22 + VERTGUIDE, 164 + TOPMARGIN, 4 + BOTTOMMARGIN, 207 + HORZGUIDE, 33 + HORZGUIDE, 73 + END +END +#endif // APSTUDIO_INVOKED + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "..\\src\\resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include \r\n" + "#include \r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDR_CLISTMENU MENU +BEGIN + POPUP "&Main menu" + BEGIN + MENUITEM SEPARATOR + MENUITEM "E&xit", ID_ICQ_EXIT + END + POPUP "&Status" + BEGIN + MENUITEM "&Offline\tCtrl+0", ID_STATUS_OFFLINE, CHECKED + MENUITEM "On&line\tCtrl+1", ID_STATUS_ONLINE + MENUITEM "&Away\tCtrl+2", ID_STATUS_AWAY + MENUITEM "&NA\tCtrl+3", ID_STATUS_NA + MENUITEM "Occ&upied\tCtrl+4", ID_STATUS_OCCUPIED + MENUITEM "&DND\tCtrl+5", ID_STATUS_DND + MENUITEM "&Free for chat\tCtrl+6", ID_STATUS_FREECHAT + MENUITEM "&Invisible\tCtrl+7", ID_STATUS_INVISIBLE + MENUITEM "On the &phone\tCtrl+8", ID_STATUS_ONTHEPHONE + MENUITEM "Out to &lunch\tCtrl+9", ID_STATUS_OUTTOLUNCH + END +END + +IDR_CONTEXT MENU +BEGIN + POPUP "Tray" + BEGIN + MENUITEM "&Hide/Show", ID_TRAY_HIDE + MENUITEM SEPARATOR + MENUITEM "E&xit", ID_TRAY_EXIT + END + POPUP "Nowhere" + BEGIN + MENUITEM "&New group", POPUP_NEWGROUP + MENUITEM SEPARATOR + MENUITEM "&Hide offline users", POPUP_HIDEOFFLINE + MENUITEM "Hide &offline users out here", POPUP_HIDEOFFLINEROOT + MENUITEM "Hide &empty groups", POPUP_HIDEEMPTYGROUPS + MENUITEM "Disable &groups", POPUP_DISABLEGROUPS + MENUITEM SEPARATOR + MENUITEM "Hide Miranda", POPUP_HIDEMIRANDA + END + POPUP "Group" + BEGIN + MENUITEM "&New subgroup", POPUP_NEWSUBGROUP + MENUITEM "&Hide offline users in here", POPUP_GROUPHIDEOFFLINE + MENUITEM SEPARATOR + MENUITEM "&Rename group", POPUP_RENAMEGROUP + MENUITEM "&Delete group", POPUP_DELETEGROUP + END +END + +#endif // Ðóññêèé (Ðîññèÿ) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/!Deprecated/Clist_mw/res/sendmail.ico b/plugins/!Deprecated/Clist_mw/res/sendmail.ico new file mode 100644 index 0000000000..461ecc9557 Binary files /dev/null and b/plugins/!Deprecated/Clist_mw/res/sendmail.ico differ diff --git a/plugins/!Deprecated/Clist_mw/res/sms.ico b/plugins/!Deprecated/Clist_mw/res/sms.ico new file mode 100644 index 0000000000..6d6ff2162b Binary files /dev/null and b/plugins/!Deprecated/Clist_mw/res/sms.ico differ diff --git a/plugins/!Deprecated/Clist_mw/src/BkgrCfg.cpp b/plugins/!Deprecated/Clist_mw/src/BkgrCfg.cpp new file mode 100644 index 0000000000..8895bacbaa --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/BkgrCfg.cpp @@ -0,0 +1,310 @@ + +#include "commonheaders.h" + +#define DEFAULT_BKCOLOUR GetSysColor(COLOR_3DFACE) +#define DEFAULT_USEBITMAP 0 +#define DEFAULT_BKBMPUSE CLB_STRETCH +#define DEFAULT_SELBKCOLOUR GetSysColor(COLOR_HIGHLIGHT) + + +extern HINSTANCE g_hInst; + +char **bkgrList = NULL; +int bkgrCount = 0; +HANDLE hEventBkgrChanged; + +#define M_BKGR_UPDATE (WM_USER+10) +#define M_BKGR_SETSTATE (WM_USER+11) +#define M_BKGR_GETSTATE (WM_USER+12) + +#define M_BKGR_BACKCOLOR 0x01 +#define M_BKGR_SELECTCOLOR 0x02 +#define M_BKGR_ALLOWBITMAPS 0x04 +#define M_BKGR_STRETCH 0x08 +#define M_BKGR_TILE 0x10 + +#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0])) +static const int bitmapRelatedControls[] = { + IDC_FILENAME,IDC_BROWSE,IDC_STRETCHH,IDC_STRETCHV,IDC_TILEH,IDC_TILEV, + IDC_SCROLL,IDC_PROPORTIONAL,IDC_TILEVROWH +}; +struct BkgrItem +{ + BYTE changed; + BYTE useBitmap; + COLORREF bkColor, selColor; + char filename[MAX_PATH]; + WORD flags; +}; +struct BkgrData +{ + struct BkgrItem *item; + int indx; + int count; +}; +static INT_PTR CALLBACK DlgProcBkgOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + struct BkgrData *dat = (struct BkgrData *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + switch (msg) + { + case WM_INITDIALOG: + { + int indx; + HWND hList = GetDlgItem(hwndDlg, IDC_BKGRLIST); + TranslateDialogDefault(hwndDlg); + + dat = (struct BkgrData*)mir_alloc(sizeof(struct BkgrData)); + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)dat); + dat->count = bkgrCount; + dat->item = (struct BkgrItem*)mir_alloc(sizeof(struct BkgrItem)*dat->count); + dat->indx = CB_ERR; + for (indx = 0; indx < dat->count; indx++) + { + char *module = bkgrList[indx] + strlen(bkgrList[indx]) + 1; + int jndx; + + dat->item[indx].changed = FALSE; + dat->item[indx].useBitmap = db_get_b(NULL,module, "UseBitmap", DEFAULT_USEBITMAP); + dat->item[indx].bkColor = db_get_dw(NULL,module, "BkColour", DEFAULT_BKCOLOUR); + dat->item[indx].selColor = db_get_dw(NULL,module, "SelBkColour", DEFAULT_SELBKCOLOUR); + { + DBVARIANT dbv; + if ( !db_get_s(NULL,module,"BkBitmap",&dbv)) + { + int retval = PathToAbsolute(dbv.pszVal, dat->item[indx].filename); + if ( !retval || retval == CALLSERVICE_NOTFOUND) + lstrcpynA(dat->item[indx].filename, dbv.pszVal, MAX_PATH); + mir_free(dbv.pszVal); + } + else + *dat->item[indx].filename = 0; + } + dat->item[indx].flags = db_get_w(NULL,module,"BkBmpUse", DEFAULT_BKBMPUSE); + jndx = SendMessageA(hList, CB_ADDSTRING, 0, (LPARAM)Translate(bkgrList[indx])); + SendMessage(hList, CB_SETITEMDATA, jndx, indx); + } + SendMessage(hList, CB_SETCURSEL, 0, 0); + PostMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(IDC_BKGRLIST, CBN_SELCHANGE), 0); + SHAutoComplete(GetDlgItem(hwndDlg, IDC_FILENAME), 1); + return TRUE; + } + case WM_DESTROY: + if (dat) + { + if (dat->item) mir_free(dat->item); + mir_free(dat); + } + + return TRUE; + + case M_BKGR_GETSTATE: + { + int indx = wParam; + if (indx == CB_ERR || indx >= dat->count) break; + indx = SendDlgItemMessage(hwndDlg, IDC_BKGRLIST, CB_GETITEMDATA, indx, 0); + + dat->item[indx].useBitmap = IsDlgButtonChecked(hwndDlg,IDC_BITMAP); + dat->item[indx].bkColor = SendDlgItemMessage(hwndDlg, IDC_BKGCOLOUR, CPM_GETCOLOUR,0,0); + dat->item[indx].selColor = SendDlgItemMessage(hwndDlg, IDC_SELCOLOUR, CPM_GETCOLOUR,0,0); + GetDlgItemTextA(hwndDlg, IDC_FILENAME, dat->item[indx].filename, sizeof(dat->item[indx].filename)); + { + WORD flags = 0; + if (IsDlgButtonChecked(hwndDlg,IDC_STRETCHH)) flags |= CLB_STRETCHH; + if (IsDlgButtonChecked(hwndDlg,IDC_STRETCHV)) flags |= CLB_STRETCHV; + if (IsDlgButtonChecked(hwndDlg,IDC_TILEH)) flags |= CLBF_TILEH; + if (IsDlgButtonChecked(hwndDlg,IDC_TILEV)) flags |= CLBF_TILEV; + if (IsDlgButtonChecked(hwndDlg,IDC_SCROLL)) flags |= CLBF_SCROLL; + if (IsDlgButtonChecked(hwndDlg,IDC_PROPORTIONAL)) flags |= CLBF_PROPORTIONAL; + if (IsDlgButtonChecked(hwndDlg,IDC_TILEVROWH)) flags |= CLBF_TILEVTOROWHEIGHT; + dat->item[indx].flags = flags; + } + break; + } + case M_BKGR_SETSTATE: + { + int indx = wParam; + int flags = dat->item[indx].flags; + if (indx == CB_ERR || indx >= dat->count) break; + indx = SendDlgItemMessage(hwndDlg, IDC_BKGRLIST, CB_GETITEMDATA, indx, 0); + + CheckDlgButton(hwndDlg, IDC_BITMAP, dat->item[indx].useBitmap?BST_CHECKED:BST_UNCHECKED); + + SendDlgItemMessage(hwndDlg, IDC_BKGCOLOUR, CPM_SETDEFAULTCOLOUR, 0, DEFAULT_BKCOLOUR); + SendDlgItemMessage(hwndDlg, IDC_BKGCOLOUR, CPM_SETCOLOUR, 0, dat->item[indx].bkColor); + SendDlgItemMessage(hwndDlg, IDC_SELCOLOUR, CPM_SETDEFAULTCOLOUR, 0, DEFAULT_SELBKCOLOUR); + SendDlgItemMessage(hwndDlg, IDC_SELCOLOUR, CPM_SETCOLOUR, 0, dat->item[indx].selColor); + SetDlgItemTextA(hwndDlg, IDC_FILENAME, dat->item[indx].filename); + + CheckDlgButton(hwndDlg,IDC_STRETCHH, flags&CLB_STRETCHH?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg,IDC_STRETCHV,flags&CLB_STRETCHV?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg,IDC_TILEH,flags&CLBF_TILEH?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg,IDC_TILEV,flags&CLBF_TILEV?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg,IDC_SCROLL,flags&CLBF_SCROLL?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg,IDC_PROPORTIONAL,flags&CLBF_PROPORTIONAL?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg,IDC_TILEVROWH,flags&CLBF_TILEVTOROWHEIGHT?BST_CHECKED:BST_UNCHECKED); + + SendMessage(hwndDlg, M_BKGR_UPDATE, 0,0); + break; + } + case M_BKGR_UPDATE: + { + int isChecked = IsDlgButtonChecked(hwndDlg,IDC_BITMAP); + int indx; + for (indx = 0; indx < ARRAY_SIZE(bitmapRelatedControls); indx++) + EnableWindow(GetDlgItem(hwndDlg, bitmapRelatedControls[indx]),isChecked); + break; + } + case WM_COMMAND: + if (LOWORD(wParam) == IDC_BROWSE) { + char str[MAX_PATH]; + OPENFILENAMEA ofn = {0}; + char filter[512]; + + GetDlgItemTextA(hwndDlg,IDC_FILENAME, str, sizeof(str)); + ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; + ofn.hwndOwner = hwndDlg; + ofn.hInstance = NULL; + CallService(MS_UTILS_GETBITMAPFILTERSTRINGS, sizeof(filter), (LPARAM)filter); + ofn.lpstrFilter = filter; + ofn.lpstrFile = str; + ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; + ofn.nMaxFile = sizeof(str); + ofn.nMaxFileTitle = MAX_PATH; + ofn.lpstrDefExt = "bmp"; + if ( !GetOpenFileNameA(&ofn)) break; + SetDlgItemTextA(hwndDlg, IDC_FILENAME, str); + } + else if (LOWORD(wParam) == IDC_FILENAME && HIWORD(wParam) != EN_CHANGE) + break; + + if (LOWORD(wParam) == IDC_BITMAP) + SendMessage(hwndDlg, M_BKGR_UPDATE, 0,0); + if (LOWORD(wParam) == IDC_FILENAME && (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus())) + return 0; + if (LOWORD(wParam) == IDC_BKGRLIST) { + if (HIWORD(wParam) == CBN_SELCHANGE) { + SendMessage(hwndDlg, M_BKGR_GETSTATE, dat->indx, 0); + SendMessage(hwndDlg, M_BKGR_SETSTATE, dat->indx = SendDlgItemMessage(hwndDlg, IDC_BKGRLIST, CB_GETCURSEL, 0,0), 0); + } + return 0; + } + { + int indx = SendDlgItemMessage(hwndDlg, IDC_BKGRLIST, CB_GETCURSEL, 0,0); + if (indx != CB_ERR && indx < dat->count) { + indx = SendDlgItemMessage(hwndDlg, IDC_BKGRLIST, CB_GETITEMDATA, indx, 0); + dat->item[indx].changed = TRUE; + + } + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0,0); + } + break; + case WM_NOTIFY: + switch(((LPNMHDR)lParam)->idFrom) + { + case 0: + switch (((LPNMHDR)lParam)->code) + { + case PSN_APPLY: + { + int indx; + SendMessage(hwndDlg, M_BKGR_GETSTATE, SendDlgItemMessage(hwndDlg, IDC_BKGRLIST, CB_GETCURSEL, 0,0), 0); + for (indx = 0; indx < dat->count; indx++) + if (dat->item[indx].changed) + { + char *module = bkgrList[indx] + strlen(bkgrList[indx]) + 1; + db_set_b(NULL, module, "UseBitmap", (BYTE)dat->item[indx].useBitmap); + { + COLORREF col; + + if ((col = dat->item[indx].bkColor) == DEFAULT_BKCOLOUR) + db_unset(NULL, module, "BkColour"); + else + db_set_dw(NULL, module, "BkColour", col); + + if ((col = dat->item[indx].selColor) == DEFAULT_SELBKCOLOUR) + db_unset(NULL, module, "SelBkColour"); + else + db_set_dw(NULL, module, "SelBkColour", col); + } + { + char str[MAX_PATH]; + int retval = PathToAbsolute(dat->item[indx].filename, str); + if ( !retval || retval == CALLSERVICE_NOTFOUND) + db_set_s(NULL, module, "BkBitmap", dat->item[indx].filename); + else + db_set_s(NULL, module, "BkBitmap", str); + } + db_set_w(NULL, module, "BkBmpUse", dat->item[indx].flags); + dat->item[indx].changed = FALSE; + NotifyEventHooks(hEventBkgrChanged, (WPARAM)module, 0); + } + return TRUE; + } + } + break; + } + break; + } + return FALSE; +} + +static INT_PTR BkgrCfg_Register(WPARAM wParam, LPARAM lParam) +{ + char *szSetting = (char *)wParam; + char *value, *tok; + size_t len = strlen(szSetting) + 1; + + value = (char *)mir_alloc(len + 4); // add room for flags (DWORD) + memcpy(value, szSetting, len); + tok = strchr(value, '/'); + if (tok == NULL) { + mir_free(value); + return 1; + } + *tok = 0; + *(DWORD*)(value + len) = lParam; + + bkgrList = (char **)mir_realloc(bkgrList, sizeof(char*)*(bkgrCount+1)); + bkgrList[bkgrCount] = value; + bkgrCount++; + + return 0; +} + +int OnOptionsInit(WPARAM wParam, LPARAM lParam) +{ + OPTIONSDIALOGPAGE odp = { sizeof(odp) }; + odp.hInstance = g_hInst; + odp.pszGroup = LPGEN("Customize"); + odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_CLCBKG2); + odp.pszTitle = LPGEN("Backgrounds"); + odp.pfnDlgProc = DlgProcBkgOpts; + odp.flags = ODPF_BOLDGROUPS; + Options_AddPage(wParam, &odp); + return 0; +} + +int BGModuleLoad() +{ + HookEvent(ME_OPT_INITIALISE, OnOptionsInit); + + CreateServiceFunction(MS_BACKGROUNDCONFIG_REGISTER, BkgrCfg_Register); + + hEventBkgrChanged = CreateHookableEvent(ME_BACKGROUNDCONFIG_CHANGED); + return 0; +} + +int BGModuleUnload(void) +{ + if (bkgrList != NULL) + { + int indx; + for (indx = 0; indx < bkgrCount; indx++) + if (bkgrList[indx] != NULL) + mir_free(bkgrList[indx]); + mir_free(bkgrList); + } + DestroyHookableEvent(hEventBkgrChanged); + + return 0; +} diff --git a/plugins/!Deprecated/Clist_mw/src/BkgrCfg.h b/plugins/!Deprecated/Clist_mw/src/BkgrCfg.h new file mode 100644 index 0000000000..a47b53a603 --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/BkgrCfg.h @@ -0,0 +1,18 @@ +// +// Register of plugin's user +// +// wParam = (WPARAM)szSetting - string that describes a user +// format: Category/ModuleName, +// eg: "Contact list background/CLUI", +// "Status bar background/StatusBar" +// lParam = (LPARAM)dwFlags +// +#define MS_BACKGROUNDCONFIG_REGISTER "BkgrCfg/Register" + +// +// Notification about changed background +// wParam = ModuleName +// lParam = 0 +#define ME_BACKGROUNDCONFIG_CHANGED "BkgrCfg/Changed" + +#define CLBF_TILEVTOROWHEIGHT 0x0100 diff --git a/plugins/!Deprecated/Clist_mw/src/CLUIFrames/cluiframes.cpp b/plugins/!Deprecated/Clist_mw/src/CLUIFrames/cluiframes.cpp new file mode 100644 index 0000000000..129bd2e794 --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/CLUIFrames/cluiframes.cpp @@ -0,0 +1,2860 @@ +/* + +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), +Copyright (c) 2000-03 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "../commonheaders.h" + +extern HINSTANCE g_hInst; + +//we use dynamic frame list, +//but who wants so huge number of frames ?? +#define MAX_FRAMES 16 + +#define UNCOLLAPSED_FRAME_SIZE 0 +#define DEFAULT_TITLEBAR_HEIGHT 20 + +//legacy menu support +#define frame_menu_lock 1 +#define frame_menu_visible 2 +#define frame_menu_showtitlebar 3 +#define frame_menu_floating 4 +static int UpdateTBToolTip(int framepos); +INT_PTR CLUIFrameSetFloat(WPARAM wParam, LPARAM lParam); +int CLUIFrameResizeFloatingFrame(int framepos); +extern int InitFramesMenus(void); +int GapBetweenTitlebar; + +LOGFONTA TitleBarLogFont = {0}; + +boolean FramesSysNotStarted = TRUE; + +static int sortfunc(const void *a,const void *b) +{ + SortData *sd1,*sd2; + sd1 = (SortData *)a; + sd2 = (SortData *)b; + if (sd1->order > sd2->order){return(1);} + if (sd1->order < sd2->order){return(-1);} + //if (sd1->order == sd2->order){return 0;} + return 0; +} + +//static FRAMEWND Frames[MAX_FRAMES]; +static FRAMEWND *Frames = NULL; + +static int nFramescount = 0; +static int alclientFrame = -1;//for fast access to frame with alclient properties +static int NextFrameId = 100; + +HFONT TitleBarFont; +static int TitleBarH = DEFAULT_TITLEBAR_HEIGHT; +static boolean resizing = FALSE; + +// menus +static HANDLE contMIVisible,contMITitle,contMITBVisible,contMILock,contMIColl,contMIFloating; +static HANDLE contMIAlignRoot; +static HANDLE contMIAlignTop,contMIAlignClient,contMIAlignBottom; +static HANDLE contMIBorder; +static HGENMENU MainMIRoot = (HGENMENU)-1; + +// others +static int ContactListHeight; +static int LastStoreTick = 0; + +static int lbypos = -1; +static int oldframeheight = -1; +static int curdragbar = -1; +static CRITICAL_SECTION csFrameHook; + +static BOOLEAN CLUIFramesFitInSize(void); +static int RemoveItemFromList(int pos,FRAMEWND **lpFrames,int *FrameItemCount); +HWND hWndExplorerToolBar; +static int GapBetweenFrames = 1; + +static int RemoveItemFromList(int pos,FRAMEWND **lpFrames,int *FrameItemCount) +{ + memcpy(&((*lpFrames)[pos]),&((*lpFrames)[pos+1]),sizeof(FRAMEWND)*(*FrameItemCount-pos-1)); + (*FrameItemCount)--; + (*lpFrames) = (FRAMEWND*)realloc((*lpFrames),sizeof(FRAMEWND)*(*FrameItemCount)); + return 0; +} + +static int id2pos(int id) +{ + if (FramesSysNotStarted) + return -1; + + for (int i=0;idockOpt.hwndLeft == NULL && pThumbLeft->dockOpt.hwndRight == NULL ) { + pThumbRight->dockOpt.hwndLeft = pThumbLeft->ContainerWnd; + pThumbLeft->dockOpt.hwndRight = pThumbRight->ContainerWnd; + } +} + +static void UndockThumbs( FRAMEWND *pThumb1, FRAMEWND *pThumb2 ) +{ + if ( pThumb1 == NULL || pThumb2 == NULL ) + return; + + if ( pThumb1->dockOpt.hwndRight == pThumb2->ContainerWnd ) + pThumb1->dockOpt.hwndRight = NULL; + + if ( pThumb1->dockOpt.hwndLeft == pThumb2->ContainerWnd ) + pThumb1->dockOpt.hwndLeft = NULL; + + if ( pThumb2->dockOpt.hwndRight == pThumb1->ContainerWnd ) + pThumb2->dockOpt.hwndRight = NULL; + + if ( pThumb2->dockOpt.hwndLeft == pThumb1->ContainerWnd ) + pThumb2->dockOpt.hwndLeft = NULL; +} + +BOOLEAN bMoveTogether; + +static void PositionThumb( FRAMEWND *pThumb, short nX, short nY ) +{ + FRAMEWND *pCurThumb = &Frames[0]; + FRAMEWND *pDockThumb = pThumb; + FRAMEWND fakeMainWindow; + FRAMEWND fakeTaskBarWindow; + RECT rc; + RECT rcThumb; + RECT rcOld; + SIZE sizeScreen; + int nNewX; + int nNewY; + int nOffs = 10; + int nWidth; + int nHeight; + POINT pt; + RECT rcLeft; + RECT rcTop; + RECT rcRight; + RECT rcBottom; + BOOL bDocked; + BOOL bDockedLeft; + BOOL bDockedRight; + BOOL bLeading; + int frmidx = 0; + + if ( pThumb == NULL ) + return; + + sizeScreen.cx = GetSystemMetrics( SM_CXSCREEN ); + sizeScreen.cy = GetSystemMetrics( SM_CYSCREEN ); + + // Get thumb dimnsions + GetWindowRect( pThumb->ContainerWnd, &rcThumb ); + nWidth = rcThumb.right - rcThumb.left; + nHeight = rcThumb.bottom - rcThumb.top; + + // Docking to the edges of the screen + nNewX = nX < nOffs ? 0 : nX; + nNewX = nNewX > ( sizeScreen.cx - nWidth - nOffs ) ? ( sizeScreen.cx - nWidth ) : nNewX; + nNewY = nY < nOffs ? 0 : nY; + nNewY = nNewY > ( sizeScreen.cy - nHeight - nOffs ) ? ( sizeScreen.cy - nHeight ) : nNewY; + + bLeading = pThumb->dockOpt.hwndRight != NULL; + + if ( bMoveTogether ) { + UndockThumbs( pThumb, FindFrameByWnd( pThumb->dockOpt.hwndLeft )); + GetWindowRect( pThumb->ContainerWnd, &rcOld ); + } + + memset(&fakeMainWindow,0,sizeof(fakeMainWindow)); + fakeMainWindow.ContainerWnd = pcli->hwndContactList; + fakeMainWindow.floating = TRUE; + + memset(&fakeTaskBarWindow,0,sizeof(fakeTaskBarWindow)); + fakeTaskBarWindow.ContainerWnd = hWndExplorerToolBar; + fakeTaskBarWindow.floating = TRUE; + + while( pCurThumb != NULL ) { + if (pCurThumb->floating) { + if ( pCurThumb != pThumb ) { + GetWindowRect( pThumb->ContainerWnd, &rcThumb ); + OffsetRect( &rcThumb, nX - rcThumb.left, nY - rcThumb.top ); + + GetWindowRect( pCurThumb->ContainerWnd, &rc ); + + // These are rects we will dock into + rcLeft.left = rc.left - nOffs; + rcLeft.top = rc.top - nOffs; + rcLeft.right = rc.left + nOffs; + rcLeft.bottom = rc.bottom + nOffs; + + rcTop.left = rc.left - nOffs; + rcTop.top = rc.top - nOffs; + rcTop.right = rc.right + nOffs; + rcTop.bottom = rc.top + nOffs; + + rcRight.left = rc.right - nOffs; + rcRight.top = rc.top - nOffs; + rcRight.right = rc.right + nOffs; + rcRight.bottom = rc.bottom + nOffs; + + rcBottom.left = rc.left - nOffs; + rcBottom.top = rc.bottom - nOffs; + rcBottom.right = rc.right + nOffs; + rcBottom.bottom = rc.bottom + nOffs; + + + bDockedLeft = FALSE; + bDockedRight = FALSE; + + // Upper-left + pt.x = rcThumb.left; + pt.y = rcThumb.top; + bDocked = FALSE; + + if ( PtInRect( &rcRight, pt )) { + nNewX = rc.right; + bDocked = TRUE; + } + + if ( PtInRect( &rcBottom, pt )) { + nNewY = rc.bottom; + if ( PtInRect( &rcLeft, pt )) + nNewX = rc.left; + } + + if ( PtInRect( &rcTop, pt )) { + nNewY = rc.top; + bDockedLeft = bDocked; + } + + // Upper-right + pt.x = rcThumb.right; + pt.y = rcThumb.top; + bDocked = FALSE; + + if ( !bLeading && PtInRect( &rcLeft, pt )) { + if ( !bDockedLeft ) { + nNewX = rc.left - nWidth; + bDocked = TRUE; + } + else if ( rc.right == rcThumb.left ) + bDocked = TRUE; + } + + if ( PtInRect( &rcBottom, pt )) { + nNewY = rc.bottom; + if ( PtInRect( &rcRight, pt )) + nNewX = rc.right - nWidth; + } + + if ( !bLeading && PtInRect( &rcTop, pt )) { + nNewY = rc.top; + bDockedRight = bDocked; + } + + if ( bMoveTogether ) { + if ( bDockedRight ) + DockThumbs( pThumb, pCurThumb, TRUE ); + + if ( bDockedLeft ) + DockThumbs( pCurThumb, pThumb, FALSE ); + } + + // Lower-left + pt.x = rcThumb.left; + pt.y = rcThumb.bottom; + + if ( PtInRect( &rcRight, pt )) + nNewX = rc.right; + + if ( PtInRect( &rcTop, pt )) { + nNewY = rc.top - nHeight; + if ( PtInRect( &rcLeft, pt )) + nNewX = rc.left; + } + + // Lower-right + pt.x = rcThumb.right; + pt.y = rcThumb.bottom; + + if ( !bLeading && PtInRect( &rcLeft, pt )) + nNewX = rc.left - nWidth; + + if ( !bLeading && PtInRect( &rcTop, pt )) { + nNewY = rc.top - nHeight; + if ( PtInRect( &rcRight, pt )) + nNewX = rc.right - nWidth; + } + } + } + + frmidx++; + if (pCurThumb->ContainerWnd = fakeTaskBarWindow.ContainerWnd){break;} + if (pCurThumb->ContainerWnd = fakeMainWindow.ContainerWnd){ + pCurThumb = &fakeTaskBarWindow;continue;} + if (frmidx = nFramescount){ + pCurThumb = &fakeMainWindow;continue; + } + + pCurThumb = &Frames[frmidx]; + } + + // Adjust coords once again + nNewX = nNewX < nOffs ? 0 : nNewX; + nNewX = nNewX > ( sizeScreen.cx - nWidth - nOffs ) ? ( sizeScreen.cx - nWidth ) : nNewX; + nNewY = nNewY < nOffs ? 0 : nNewY; + nNewY = nNewY > ( sizeScreen.cy - nHeight - nOffs ) ? ( sizeScreen.cy - nHeight ) : nNewY; + + SetWindowPos( pThumb->ContainerWnd, HWND_TOPMOST, nNewX, nNewY, 0, 0, SWP_NOSIZE | SWP_NOZORDER ); + + // OK, move all docked thumbs + if ( bMoveTogether ) { + pDockThumb = FindFrameByWnd( pDockThumb->dockOpt.hwndRight ); + PositionThumb( pDockThumb, (short)( nNewX + nWidth ), (short)nNewY ); + } +} + +////////// + +void GetBorderSize(HWND hwnd,RECT *rect) +{ + RECT wr,cr; + POINT pt1,pt2; + + GetWindowRect(hwnd,&wr); + GetClientRect(hwnd,&cr); + pt1.y = cr.top;pt1.x = cr.left; + pt2.y = cr.bottom;pt2.x = cr.right; + + ClientToScreen(hwnd,&pt1); + ClientToScreen(hwnd,&pt2); + + cr.top = pt1.y;cr.left = pt1.x; + cr.bottom = pt2.y;cr.right = pt2.x; + + rect->top = cr.top-wr.top; + rect->left = cr.left-wr.left; + rect->right = wr.right-cr.right; + rect->bottom = wr.bottom-cr.bottom; +} + +//append string +char __inline *AS(char *str,const char *setting,char *addstr) +{ + if (str != NULL) { + strcpy(str,setting); + strcat(str,addstr); + } + return str; +} + +int DBLoadFrameSettingsAtPos(int pos,int Frameid) +{ + char sadd[15]; + char buf[255]; + + _itoa(pos,sadd,10); + + //boolean + Frames[Frameid].collapsed = db_get_b(0,CLUIFrameModule,AS(buf,"Collapse",sadd),Frames[Frameid].collapsed); + + Frames[Frameid].Locked = db_get_b(0,CLUIFrameModule,AS(buf,"Locked",sadd),Frames[Frameid].Locked); + Frames[Frameid].visible = db_get_b(0,CLUIFrameModule,AS(buf,"Visible",sadd),Frames[Frameid].visible); + Frames[Frameid].TitleBar.ShowTitleBar = db_get_b(0,CLUIFrameModule,AS(buf,"TBVisile",sadd),Frames[Frameid].TitleBar.ShowTitleBar); + + Frames[Frameid].height = db_get_w(0,CLUIFrameModule,AS(buf,"Height",sadd),Frames[Frameid].height); + Frames[Frameid].HeightWhenCollapsed = db_get_w(0,CLUIFrameModule,AS(buf,"HeightCollapsed",sadd),0); + Frames[Frameid].align = db_get_w(0,CLUIFrameModule,AS(buf,"Align",sadd),Frames[Frameid].align); + + Frames[Frameid].FloatingPos.x = DBGetContactSettingRangedWord(0,CLUIFrameModule,AS(buf,"FloatX",sadd),100,0,1024); + Frames[Frameid].FloatingPos.y = DBGetContactSettingRangedWord(0,CLUIFrameModule,AS(buf,"FloatY",sadd),100,0,1024); + Frames[Frameid].FloatingSize.x = DBGetContactSettingRangedWord(0,CLUIFrameModule,AS(buf,"FloatW",sadd),100,0,1024); + Frames[Frameid].FloatingSize.y = DBGetContactSettingRangedWord(0,CLUIFrameModule,AS(buf,"FloatH",sadd),100,0,1024); + + Frames[Frameid].floating = db_get_b(0,CLUIFrameModule,AS(buf,"Floating",sadd),0); + Frames[Frameid].order = db_get_w(0,CLUIFrameModule,AS(buf,"Order",sadd),0); + + Frames[Frameid].UseBorder = db_get_b(0,CLUIFrameModule,AS(buf,"UseBorder",sadd),Frames[Frameid].UseBorder); + + return 0; +} + +int DBStoreFrameSettingsAtPos(int pos,int Frameid) +{ + char sadd[16]; + char buf[255]; + + _itoa(pos,sadd,10); + + db_set_ts(0,CLUIFrameModule,AS(buf,"Name",sadd),Frames[Frameid].name); + //boolean + db_set_b(0,CLUIFrameModule,AS(buf,"Collapse",sadd),(BYTE)btoint(Frames[Frameid].collapsed)); + db_set_b(0,CLUIFrameModule,AS(buf,"Locked",sadd),(BYTE)btoint(Frames[Frameid].Locked)); + db_set_b(0,CLUIFrameModule,AS(buf,"Visible",sadd),(BYTE)btoint(Frames[Frameid].visible)); + db_set_b(0,CLUIFrameModule,AS(buf,"TBVisile",sadd),(BYTE)btoint(Frames[Frameid].TitleBar.ShowTitleBar)); + + db_set_w(0,CLUIFrameModule,AS(buf,"Height",sadd),(WORD)Frames[Frameid].height); + db_set_w(0,CLUIFrameModule,AS(buf,"HeightCollapsed",sadd),(WORD)Frames[Frameid].HeightWhenCollapsed); + db_set_w(0,CLUIFrameModule,AS(buf,"Align",sadd),(WORD)Frames[Frameid].align); + //FloatingPos + db_set_w(0,CLUIFrameModule,AS(buf,"FloatX",sadd),(WORD)Frames[Frameid].FloatingPos.x); + db_set_w(0,CLUIFrameModule,AS(buf,"FloatY",sadd),(WORD)Frames[Frameid].FloatingPos.y); + db_set_w(0,CLUIFrameModule,AS(buf,"FloatW",sadd),(WORD)Frames[Frameid].FloatingSize.x); + db_set_w(0,CLUIFrameModule,AS(buf,"FloatH",sadd),(WORD)Frames[Frameid].FloatingSize.y); + + db_set_b(0,CLUIFrameModule,AS(buf,"Floating",sadd),(BYTE)btoint(Frames[Frameid].floating)); + db_set_b(0,CLUIFrameModule,AS(buf,"UseBorder",sadd),(BYTE)btoint(Frames[Frameid].UseBorder)); + db_set_w(0,CLUIFrameModule,AS(buf,"Order",sadd),(WORD)Frames[Frameid].order); + //db_set_s(0,CLUIFrameModule,AS(buf,"TBName",sadd),Frames[Frameid].TitleBar.tbname); + return 0; +} + +int LocateStorePosition(int Frameid,int maxstored) +{ + if (Frames[Frameid].name == NULL) + return -1; + + for (int i=0; i < maxstored; i++) { + char settingname[255]; + mir_snprintf(settingname, sizeof(settingname), "Name%d",i); + LPTSTR frmname = db_get_tsa(0,CLUIFrameModule,settingname); + if (frmname == NULL) + continue; + + if (lstrcmpi(frmname,Frames[Frameid].name) == 0) { + mir_free(frmname); + return i; + } + mir_free(frmname); + } + return -1; +} + +int CLUIFramesLoadFrameSettings(int Frameid) +{ + if (Frameid < 0 || Frameid >= nFramescount) + return -1; + + int maxstored = db_get_w(0,CLUIFrameModule,"StoredFrames",-1); + if (maxstored == -1) + return 0; + + int storpos = LocateStorePosition(Frameid,maxstored); + if (storpos == -1) + return 0; + + DBLoadFrameSettingsAtPos(storpos,Frameid); + return 0; +} + +int CLUIFramesStoreFrameSettings(int Frameid) +{ + if (Frameid < 0 || Frameid >= nFramescount) + return -1; + + int maxstored = db_get_w(0,CLUIFrameModule,"StoredFrames",-1); + if (maxstored == -1) + maxstored = 0; + + int storpos = LocateStorePosition(Frameid,maxstored); + if (storpos == -1) { + storpos = maxstored; + maxstored++; + } + + DBStoreFrameSettingsAtPos(storpos,Frameid); + db_set_w(0,CLUIFrameModule,"StoredFrames",(WORD)maxstored); + //ulockfrm(); + return 0; +} + +int CLUIFramesStoreAllFrames() +{ + lockfrm(); + for (int i=0;i= 0 && pos < nFramescount) { + CLISTMENUITEM mi = { sizeof(mi) }; + mi.flags = CMIM_NAME|CMIF_CHILDPOPUP|CMIF_TCHAR; + mi.ptszName = Frames[pos].TitleBar.tbname ? Frames[pos].TitleBar.tbname : Frames[pos].name; + ModifyMItem((WPARAM)contMITitle,(LPARAM)&mi); + + mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP; + if (Frames[pos].visible) mi.flags |= CMIF_CHECKED; + ModifyMItem((WPARAM)contMIVisible,(LPARAM)&mi); + + mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP; + if (Frames[pos].Locked) mi.flags |= CMIF_CHECKED; + ModifyMItem((WPARAM)contMILock,(LPARAM)&mi); + + mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP; + if (Frames[pos].TitleBar.ShowTitleBar) mi.flags |= CMIF_CHECKED; + ModifyMItem((WPARAM)contMITBVisible,(LPARAM)&mi); + + mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP; + if (Frames[pos].floating) mi.flags |= CMIF_CHECKED; + ModifyMItem((WPARAM)contMIFloating,(LPARAM)&mi); + + mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP; + if ((Frames[pos].UseBorder)) mi.flags |= CMIF_CHECKED; + ModifyMItem((WPARAM)contMIBorder,(LPARAM)&mi); + + mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP; + if (Frames[pos].align&alTop) mi.flags |= CMIF_CHECKED; + ModifyMItem((WPARAM)contMIAlignTop,(LPARAM)&mi); + + mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP; + if (Frames[pos].align&alClient) mi.flags |= CMIF_CHECKED; + ModifyMItem((WPARAM)contMIAlignClient,(LPARAM)&mi); + + mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP; + if (Frames[pos].align&alBottom) mi.flags |= CMIF_CHECKED; + ModifyMItem((WPARAM)contMIAlignBottom,(LPARAM)&mi); + + mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP; + if (Frames[pos].collapsed) mi.flags |= CMIF_CHECKED; + if ((!Frames[pos].visible)||(Frames[pos].Locked)||(pos == CLUIFramesGetalClientFrame())) mi.flags |= CMIF_GRAYED; + ModifyMItem((WPARAM)contMIColl,(LPARAM)&mi); + } + ulockfrm(); + return 0; +} + +INT_PTR CLUIFramesModifyMainMenuItems(WPARAM wParam, LPARAM lParam) +{ + lockfrm(); + + int pos = id2pos(wParam); + if (pos >= 0 && pos < nFramescount) { + CLISTMENUITEM mi = { sizeof(mi) }; + mi.flags = CMIM_NAME|CMIF_CHILDPOPUP|CMIF_TCHAR; + mi.ptszName = Frames[pos].TitleBar.tbname ? Frames[pos].TitleBar.tbname : Frames[pos].name; + Menu_ModifyItem(Frames[pos].MenuHandles.MITitle, &mi); + + mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP; + if (Frames[pos].visible) mi.flags |= CMIF_CHECKED; + Menu_ModifyItem(Frames[pos].MenuHandles.MIVisible, &mi); + + mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP; + if (Frames[pos].Locked) mi.flags |= CMIF_CHECKED; + Menu_ModifyItem(Frames[pos].MenuHandles.MILock, &mi); + + mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP; + if (Frames[pos].TitleBar.ShowTitleBar) mi.flags |= CMIF_CHECKED; + Menu_ModifyItem(Frames[pos].MenuHandles.MITBVisible, &mi); + + mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP; + if (Frames[pos].floating) mi.flags |= CMIF_CHECKED; + Menu_ModifyItem(Frames[pos].MenuHandles.MIFloating, &mi); + + mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP; + if ((Frames[pos].UseBorder)) mi.flags |= CMIF_CHECKED; + Menu_ModifyItem(Frames[pos].MenuHandles.MIBorder, &mi); + + mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP|((Frames[pos].align&alClient)?CMIF_GRAYED:0); + if (Frames[pos].align&alTop) mi.flags |= CMIF_CHECKED; + Menu_ModifyItem(Frames[pos].MenuHandles.MIAlignTop, &mi); + + mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP; + if (Frames[pos].align&alClient) mi.flags |= CMIF_CHECKED; + Menu_ModifyItem(Frames[pos].MenuHandles.MIAlignClient, &mi); + + mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP|((Frames[pos].align&alClient)?CMIF_GRAYED:0); + if (Frames[pos].align&alBottom) mi.flags |= CMIF_CHECKED; + Menu_ModifyItem(Frames[pos].MenuHandles.MIAlignBottom, &mi); + + mi.flags = CMIM_FLAGS|CMIF_CHILDPOPUP; + if (Frames[pos].collapsed) mi.flags |= CMIF_CHECKED; + if ((!Frames[pos].visible)||Frames[pos].Locked||(pos == CLUIFramesGetalClientFrame())) mi.flags |= CMIF_GRAYED; + Menu_ModifyItem(Frames[pos].MenuHandles.MIColl, &mi); + } + ulockfrm(); + return 0; +} + +//hiword(wParam) = frameid,loword(wParam) = flag +INT_PTR CLUIFramesGetFrameOptions(WPARAM wParam, LPARAM lParam) +{ + if (FramesSysNotStarted) return 0; + + lockfrm(); + int pos = id2pos(HIWORD(wParam)); + if (pos < 0 || pos >= nFramescount) { + ulockfrm(); + return -1; + } + + INT_PTR retval; + + switch(LOWORD(wParam)) { + case FO_FLAGS: + retval = 0; + if (Frames[pos].visible) retval |= F_VISIBLE; + if ( !Frames[pos].collapsed) retval |= F_UNCOLLAPSED; + if (Frames[pos].Locked) retval |= F_LOCKED; + if (Frames[pos].TitleBar.ShowTitleBar) retval |= F_SHOWTB; + if (Frames[pos].TitleBar.ShowTitleBarTip) retval |= F_SHOWTBTIP; + if ( !(GetWindowLongPtr(Frames[pos].hWnd,GWL_STYLE)&WS_BORDER)) retval |= F_NOBORDER; + break; + + case FO_NAME: + retval = (INT_PTR)Frames[pos].name; + break; + + case FO_TBNAME: + retval = (INT_PTR)Frames[pos].TitleBar.tbname; + break; + + case FO_TBTIPNAME: + retval = (INT_PTR)Frames[pos].TitleBar.tooltip; + break; + + case FO_TBSTYLE: + retval = GetWindowLongPtr(Frames[pos].TitleBar.hwnd,GWL_STYLE); + break; + + case FO_TBEXSTYLE: + retval = GetWindowLongPtr(Frames[pos].TitleBar.hwnd,GWL_EXSTYLE); + break; + + case FO_ICON: + retval = (INT_PTR)Frames[pos].TitleBar.hicon; + break; + + case FO_HEIGHT: + retval = (INT_PTR)Frames[pos].height; + break; + + case FO_ALIGN: + retval = (INT_PTR)Frames[pos].align; + break; + case FO_FLOATING: + retval = (INT_PTR)Frames[pos].floating; + break; + default: + retval = -1; + break; + } + ulockfrm(); + return retval; +} + +//hiword(wParam) = frameid,loword(wParam) = flag +INT_PTR CLUIFramesSetFrameOptions(WPARAM wParam, LPARAM lParam) +{ + lockfrm(); + int pos = id2pos(HIWORD(wParam)); + if (pos<0||pos>=nFramescount) { + ulockfrm(); + return -1; + } + + INT_PTR retval; // value to be returned + + switch(LOWORD(wParam) & ~FO_UNICODETEXT) { + case FO_FLAGS:{ + int flag = lParam; + LONG_PTR style; + + Frames[pos].dwFlags = flag; + Frames[pos].visible = FALSE; + if (flag&F_VISIBLE) Frames[pos].visible = TRUE; + + Frames[pos].collapsed = TRUE; + if (flag&F_UNCOLLAPSED) Frames[pos].collapsed = FALSE; + + Frames[pos].Locked = FALSE; + if (flag&F_LOCKED) Frames[pos].Locked = TRUE; + + Frames[pos].UseBorder = TRUE; + if (flag&F_NOBORDER) Frames[pos].UseBorder = FALSE; + + Frames[pos].TitleBar.ShowTitleBar = FALSE; + if (flag&F_SHOWTB) Frames[pos].TitleBar.ShowTitleBar = TRUE; + + Frames[pos].TitleBar.ShowTitleBarTip = FALSE; + if (flag&F_SHOWTBTIP) Frames[pos].TitleBar.ShowTitleBarTip = TRUE; + + SendMessage(Frames[pos].TitleBar.hwndTip,TTM_ACTIVATE,(WPARAM)Frames[pos].TitleBar.ShowTitleBarTip,0); + + style = GetWindowLongPtr(Frames[pos].hWnd,GWL_STYLE); + style |= WS_BORDER; + if (flag&F_NOBORDER) {style &= (~WS_BORDER);} + SetWindowLongPtr(Frames[pos].hWnd,GWL_STYLE,(LONG_PTR)style); + ulockfrm(); + CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0); + return 0; + } + + case FO_NAME: + if (lParam == 0) {ulockfrm(); return -1;} + mir_free(Frames[pos].name); + Frames[pos].name = mir_tstrdup((LPTSTR)lParam); + ulockfrm(); + return 0; + + case FO_TBNAME: + if (lParam == 0) {ulockfrm(); return(-1);} + mir_free(Frames[pos].TitleBar.tbname); + Frames[pos].TitleBar.tbname = mir_tstrdup((LPTSTR)lParam); + ulockfrm(); + if (Frames[pos].floating&&(Frames[pos].TitleBar.tbname != NULL)){SetWindowText(Frames[pos].ContainerWnd,Frames[pos].TitleBar.tbname);} + return 0; + + case FO_TBTIPNAME: + if (lParam == 0) {ulockfrm(); return(-1);} + mir_free(Frames[pos].TitleBar.tooltip); + Frames[pos].TitleBar.tooltip = mir_tstrdup((LPTSTR)lParam); + UpdateTBToolTip(pos); + ulockfrm(); + return 0; + + case FO_TBSTYLE: + SetWindowLongPtr(Frames[pos].TitleBar.hwnd,GWL_STYLE,lParam); + ulockfrm(); + return 0; + + case FO_TBEXSTYLE: + SetWindowLongPtr(Frames[pos].TitleBar.hwnd,GWL_EXSTYLE,lParam); + ulockfrm(); + return 0; + + case FO_ICON: + Frames[pos].TitleBar.hicon = (HICON)lParam; + ulockfrm(); + return 0; + + case FO_HEIGHT: + if (lParam<0) {ulockfrm(); return -1;} + retval = Frames[pos].height; + Frames[pos].height = lParam; + if ( !CLUIFramesFitInSize()) Frames[pos].height = retval; + retval = Frames[pos].height; + ulockfrm(); + + return retval; + + case FO_FLOATING: + if (lParam<0) {ulockfrm(); return -1;} + + { + int id = Frames[pos].id; + Frames[pos].floating = !(lParam); + ulockfrm(); + + CLUIFrameSetFloat(id,1);//lparam = 1 use stored width and height + return wParam; + } + + case FO_ALIGN: + if ( !(lParam&alTop || lParam&alBottom || lParam&alClient)) { + OutputDebugStringA("Wrong align option \r\n"); + return (-1); + } + + if ((lParam&alClient)&&(CLUIFramesGetalClientFrame()>=0)) { //only one alClient frame possible + alclientFrame = -1;//recalc it + ulockfrm(); + return -1; + } + Frames[pos].align = lParam; + + ulockfrm(); + return 0; + } + ulockfrm(); + CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0); + return -1; +} + +//wparam = lparam = 0 +static INT_PTR CLUIFramesShowAll(WPARAM wParam, LPARAM lParam) +{ + for (int i=0;ihwndContactList,0); + return 0; +} + +//wparam = lparam = 0 +INT_PTR CLUIFramesShowAllTitleBars(WPARAM wParam, LPARAM lParam) +{ + for (int i=0;ihwndContactList,0); + return 0; +} + +//wparam = lparam = 0 +INT_PTR CLUIFramesHideAllTitleBars(WPARAM wParam, LPARAM lParam) +{ + for (int i=0;ihwndContactList,0); + return 0; +} + +//wparam = frameid +INT_PTR CLUIFramesShowHideFrame(WPARAM wParam, LPARAM lParam) +{ + lockfrm(); + int pos = id2pos(wParam); + if ( pos >= 0 && (int)pos < nFramescount) + Frames[pos].visible = !Frames[pos].visible; + if (Frames[pos].floating) + CLUIFrameResizeFloatingFrame(pos); + ulockfrm(); + + if ( !Frames[pos].floating) + CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0); + return 0; +} + +//wparam = frameid +INT_PTR CLUIFramesShowHideFrameTitleBar(WPARAM wParam, LPARAM lParam) +{ + lockfrm(); + int pos = id2pos(wParam); + if ( pos >= 0 && (int)pos < nFramescount) + Frames[pos].TitleBar.ShowTitleBar = !Frames[pos].TitleBar.ShowTitleBar; + + ulockfrm(); + + CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0); + return 0; +} + +//wparam = frameid +//lparam = -1 up ,1 down +INT_PTR CLUIFramesMoveUpDown(WPARAM wParam, LPARAM lParam) +{ + int pos,i,curpos,curalign,v,tmpval; + + lockfrm(); + pos = id2pos(wParam); + if (pos >= 0 &&(int)pos < nFramescount) { + SortData *sd; + curpos = Frames[pos].order; + curalign = Frames[pos].align; + v = 0; + sd = (SortData*)malloc(sizeof(SortData)*nFramescount); + memset(sd,0,sizeof(SortData)*nFramescount); + for (i=0; i < nFramescount; i++) { + if (Frames[i].floating||(!Frames[i].visible)||(Frames[i].align != curalign)) + continue; + + sd[v].order = Frames[i].order; + sd[v].realpos = i; + v++; + } + if (v == 0) { + ulockfrm(); + return 0; + } + qsort(sd,v,sizeof(SortData),sortfunc); + for (i=0; i < v; i++) { + if (sd[i].realpos == pos) { + if (lParam == -1) { + if (i >= v-1) + break; + + tmpval = Frames[sd[i+1].realpos].order; + Frames[sd[i+1].realpos].order = Frames[pos].order; + Frames[pos].order = tmpval; + break; + } + if (lParam == +1) { + if (i < 1) + break; + + tmpval = Frames[sd[i-1].realpos].order; + Frames[sd[i-1].realpos].order = Frames[pos].order; + Frames[pos].order = tmpval; + break; + } + } + } + + free(sd); + CLUIFramesStoreFrameSettings(pos); + CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0); + } + ulockfrm(); + return 0; +} + +//wparam = frameid +//lparam = alignment +INT_PTR CLUIFramesSetAlign(WPARAM wParam, LPARAM lParam) +{ + CLUIFramesSetFrameOptions(MAKEWPARAM(FO_ALIGN,wParam),lParam); + CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0); + return 0; +} + +INT_PTR CLUIFramesSetAlignalTop(WPARAM wParam, LPARAM lParam) +{ + return CLUIFramesSetAlign(wParam,alTop); +} + +INT_PTR CLUIFramesSetAlignalBottom(WPARAM wParam, LPARAM lParam) +{ + return CLUIFramesSetAlign(wParam,alBottom); +} + +INT_PTR CLUIFramesSetAlignalClient(WPARAM wParam, LPARAM lParam) +{ + return CLUIFramesSetAlign(wParam,alClient); +} + +//wparam = frameid +INT_PTR CLUIFramesLockUnlockFrame(WPARAM wParam, LPARAM lParam) +{ + lockfrm(); + int pos = id2pos(wParam); + if (pos >= 0 && (int)pos < nFramescount) { + Frames[pos].Locked = !Frames[pos].Locked; + CLUIFramesStoreFrameSettings(pos); + } + ulockfrm(); + return 0; +} + +//wparam = frameid +INT_PTR CLUIFramesSetUnSetBorder(WPARAM wParam, LPARAM lParam) +{ + int oldflags; + + lockfrm(); + int FrameId = id2pos(wParam); + if (FrameId == -1) { + ulockfrm(); + return -1; + } + + boolean flt = oldflags = CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS,MAKEWPARAM(FO_FLAGS,wParam),0); + if (oldflags & F_NOBORDER) + oldflags &= (~F_NOBORDER); + else + oldflags |= F_NOBORDER; + + HWND hw = Frames[FrameId].hWnd; + RECT rc; + GetWindowRect(hw, &rc); + + ulockfrm(); + CallService(MS_CLIST_FRAMES_SETFRAMEOPTIONS,MAKEWPARAM(FO_FLAGS,wParam),oldflags); + + SetWindowPos(hw,0,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_DRAWFRAME); + return 0; +} + +//wparam = frameid +INT_PTR CLUIFramesCollapseUnCollapseFrame(WPARAM wParam, LPARAM lParam) +{ + int FrameId; + + lockfrm(); + FrameId = id2pos(wParam); + if (FrameId >= 0 && FrameId < nFramescount) { + int oldHeight; + + // do not collapse/uncollapse client/locked/invisible frames + if (Frames[FrameId].align == alClient&&!(Frames[FrameId].Locked||(!Frames[FrameId].visible)||Frames[FrameId].floating)) { + RECT rc; + if (CallService(MS_CLIST_DOCKINGISDOCKED,0,0)) { + ulockfrm(); + return 0; + } + if ( db_get_b(NULL,"CLUI","AutoSize",0)) { + ulockfrm(); + return 0; + } + + GetWindowRect(pcli->hwndContactList, &rc); + + if (Frames[FrameId].collapsed == TRUE) { + rc.bottom -= rc.top; + rc.bottom -= Frames[FrameId].height; + Frames[FrameId].HeightWhenCollapsed = Frames[FrameId].height; + Frames[FrameId].collapsed = FALSE; + } + else { + rc.bottom -= rc.top; + rc.bottom += Frames[FrameId].HeightWhenCollapsed; + Frames[FrameId].collapsed = TRUE; + } + + SetWindowPos(pcli->hwndContactList,NULL,0,0,rc.right-rc.left,rc.bottom,SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOMOVE); + + CLUIFramesStoreAllFrames(); + ulockfrm(); + return 0; + } + + if (Frames[FrameId].Locked||(!Frames[FrameId].visible)) + return 0; + + oldHeight = Frames[FrameId].height; + + // if collapsed, uncollapse + if (Frames[FrameId].collapsed == TRUE) { + Frames[FrameId].HeightWhenCollapsed = Frames[FrameId].height; + Frames[FrameId].height = UNCOLLAPSED_FRAME_SIZE; + Frames[FrameId].collapsed = FALSE; + } + // if uncollapsed, collapse + else { + Frames[FrameId].height = Frames[FrameId].HeightWhenCollapsed; + Frames[FrameId].collapsed = TRUE; + } + + if ( !Frames[FrameId].floating) { + if ( !CLUIFramesFitInSize()) { + //cant collapse,we can resize only for height2*UNCOLLAPSED_FRAME_SIZE) { + oldHeight = Frames[alfrm].height-UNCOLLAPSED_FRAME_SIZE; + Frames[FrameId].collapsed = TRUE; + } + } + else { + int i,sumheight = 0; + for (i=0; i < nFramescount; i++) { + if ((Frames[i].align != alClient)&&(!Frames[i].floating)&&(Frames[i].visible)&&(!Frames[i].needhide)) { + sumheight += (Frames[i].height)+(TitleBarH*btoint(Frames[i].TitleBar.ShowTitleBar))+2; + return FALSE; + } + + if (sumheight>ContactListHeight-0-2) + Frames[FrameId].height = (ContactListHeight-0-2)-sumheight; + } + } + + Frames[FrameId].height = oldHeight; + + if (Frames[FrameId].collapsed == FALSE) { + if (Frames[FrameId].floating) + SetWindowPos(Frames[FrameId].ContainerWnd,HWND_TOP,0,0,Frames[FrameId].wndSize.right-Frames[FrameId].wndSize.left+6,Frames[FrameId].height+DEFAULT_TITLEBAR_HEIGHT+4,SWP_SHOWWINDOW|SWP_NOMOVE); + + ulockfrm(); + return -1; + } + } + } + + ulockfrm(); + + if ( !Frames[FrameId].floating) + CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0); + else { + //SetWindowPos(Frames[FrameId].hWnd,HWND_TOP,0,0,Frames[FrameId].wndSize.right-Frames[FrameId].wndSize.left,Frames[FrameId].height,SWP_SHOWWINDOW|SWP_NOMOVE); + RECT contwnd; + GetWindowRect(Frames[FrameId].ContainerWnd,&contwnd); + contwnd.top = contwnd.bottom-contwnd.top;//height + contwnd.left = contwnd.right-contwnd.left;//width + + contwnd.top -= (oldHeight-Frames[FrameId].height);//newheight + SetWindowPos(Frames[FrameId].ContainerWnd,HWND_TOP,0,0,contwnd.left,contwnd.top,SWP_SHOWWINDOW|SWP_NOMOVE); + } + CLUIFramesStoreAllFrames(); + return 0; + } + else return -1; + + ulockfrm(); + return 0; +} + +static int CLUIFramesLoadMainMenu() +{ + if (MainMIRoot != (HGENMENU)-1) { + CallService(MS_CLIST_REMOVEMAINMENUITEM,(WPARAM)MainMIRoot,0); + MainMIRoot = (HGENMENU)-1; + } + + // create root menu + CLISTMENUITEM mi = { sizeof(mi) }; + mi.icolibItem = LoadSkinnedIconHandle(SKINICON_OTHER_FRAME); + mi.flags = CMIF_ROOTPOPUP; + mi.position = 3000090000; + mi.pszPopupName = (char*)-1; + mi.pszName = LPGEN("Frames"); + mi.pszService = 0; + MainMIRoot = Menu_AddMainMenuItem(&mi); + + // create frames menu + int separator = 3000200000; + for (int i=0; i < nFramescount; i++) { + mi.hIcon = Frames[i].TitleBar.hicon; + mi.flags = CMIF_CHILDPOPUP | CMIF_ROOTPOPUP | CMIF_TCHAR; + mi.position = separator; + mi.hParentMenu = MainMIRoot; + mi.ptszName = Frames[i].TitleBar.tbname ? Frames[i].TitleBar.tbname : Frames[i].name; + mi.pszService = 0; + Frames[i].MenuHandles.MainMenuItem = Menu_AddMainMenuItem(&mi); + CLUIFramesCreateMenuForFrame(Frames[i].id,(int)Frames[i].MenuHandles.MainMenuItem,separator,Menu_AddMainMenuItem); + CLUIFramesModifyMainMenuItems(Frames[i].id,0); + //NotifyEventHooks(hPreBuildFrameMenuEvent,i,(LPARAM)Frames[i].MenuHandles.MainMenuItem); + CallService(MS_CLIST_FRAMEMENUNOTIFY,(WPARAM)Frames[i].id,(LPARAM)Frames[i].MenuHandles.MainMenuItem); + separator++; + } + + separator += 100000; + + // create "show all frames" menu + mi.hIcon = NULL; + mi.flags = CMIF_CHILDPOPUP; + mi.position = separator++; + mi.hParentMenu = MainMIRoot; + mi.pszName = LPGEN("Show all frames"); + mi.pszService = MS_CLIST_FRAMES_SHOWALLFRAMES; + Menu_AddMainMenuItem(&mi); + + // create "show all titlebars" menu + mi.hIcon = NULL; + mi.position = separator++; + mi.hParentMenu = MainMIRoot; + mi.flags = CMIF_CHILDPOPUP; + mi.pszName = LPGEN("Show all title bars"); + mi.pszService = MS_CLIST_FRAMES_SHOWALLFRAMESTB; + Menu_AddMainMenuItem(&mi); + + // create "hide all titlebars" menu + mi.hIcon = NULL; + mi.position = separator++; + mi.hParentMenu = MainMIRoot; + mi.flags = CMIF_CHILDPOPUP; + mi.pszName = LPGEN("Hide all title bars"); + mi.pszService = MS_CLIST_FRAMES_HIDEALLFRAMESTB; + Menu_AddMainMenuItem(&mi); + return 0; +} + +static HFONT CLUILoadTitleBarFont() +{ + char facename[] = "MS Shell Dlg"; + HFONT hfont; + LOGFONT logfont; + memset(&logfont,0,sizeof(logfont)); + memcpy(logfont.lfFaceName,facename,sizeof(facename)); + logfont.lfWeight = FW_NORMAL; + logfont.lfHeight = -10; + hfont = CreateFontIndirect(&logfont); + return hfont; +} + +static int UpdateTBToolTip(int framepos) +{ + TOOLINFO ti = { 0 }; + ti.cbSize = sizeof(ti); + ti.lpszText = Frames[framepos].TitleBar.tooltip; + ti.hinst = g_hInst; + ti.uFlags = TTF_IDISHWND|TTF_SUBCLASS ; + ti.uId = (UINT_PTR)Frames[framepos].TitleBar.hwnd; + + return SendMessage(Frames[framepos].TitleBar.hwndTip, TTM_UPDATETIPTEXT, 0, (LPARAM)&ti); +} + +//wparam = (CLISTFrame*)clfrm +INT_PTR CLUIFramesAddFrame(WPARAM wParam, LPARAM lParam) +{ + int retval; + LONG_PTR style; + CLISTFrame *clfrm = (CLISTFrame *)wParam; + + if (pcli->hwndContactList == 0) return -1; + if (FramesSysNotStarted) return -1; + if (clfrm->cbSize != sizeof(CLISTFrame)) return -1; + if ( !(TitleBarFont)) TitleBarFont = CLUILoadTitleBarFont(); + + lockfrm(); + if (nFramescount>=MAX_FRAMES) { ulockfrm(); return -1;} + Frames = (FRAMEWND*)realloc(Frames,sizeof(FRAMEWND)*(nFramescount+1)); + + memset(&Frames[nFramescount],0,sizeof(FRAMEWND)); + Frames[nFramescount].id = NextFrameId++; + Frames[nFramescount].align = clfrm->align; + Frames[nFramescount].hWnd = clfrm->hWnd; + Frames[nFramescount].height = clfrm->height; + Frames[nFramescount].TitleBar.hicon = clfrm->hIcon; + Frames[nFramescount].floating = FALSE; + + //override tbbtip + //clfrm->Flags != F_SHOWTBTIP; + // + if ( db_get_b(0,CLUIFrameModule,"RemoveAllBorders",0) == 1) + clfrm->Flags |= F_NOBORDER; + + Frames[nFramescount].dwFlags = clfrm->Flags; + + if (clfrm->name == NULL||((clfrm->Flags&F_UNICODE) ? lstrlenW(clfrm->wname) : lstrlenA(clfrm->name)) == 0) { + Frames[nFramescount].name = (LPTSTR)malloc(255 * sizeof(TCHAR)); + GetClassName(Frames[nFramescount].hWnd,Frames[nFramescount].name,255); + } + else Frames[nFramescount].name = (clfrm->Flags&F_UNICODE) ? mir_u2t(clfrm->wname) : mir_a2t(clfrm->name); + + if (IsBadCodePtr((FARPROC)clfrm->TBname) || clfrm->TBname == NULL + || ((clfrm->Flags&F_UNICODE) ? lstrlenW(clfrm->TBwname) : lstrlenA(clfrm->TBname)) == 0) + Frames[nFramescount].TitleBar.tbname = mir_tstrdup(Frames[nFramescount].name); + else + Frames[nFramescount].TitleBar.tbname = (clfrm->Flags&F_UNICODE) ? mir_u2t(clfrm->TBwname) : mir_a2t(clfrm->TBname); + Frames[nFramescount].needhide = FALSE; + Frames[nFramescount].TitleBar.ShowTitleBar = (clfrm->Flags&F_SHOWTB?TRUE:FALSE); + Frames[nFramescount].TitleBar.ShowTitleBarTip = (clfrm->Flags&F_SHOWTBTIP?TRUE:FALSE); + + Frames[nFramescount].collapsed = clfrm->Flags & F_UNCOLLAPSED ? FALSE:TRUE; + Frames[nFramescount].Locked = clfrm->Flags & F_LOCKED ? TRUE : FALSE; + Frames[nFramescount].visible = clfrm->Flags & F_VISIBLE ? TRUE : FALSE; + + Frames[nFramescount].UseBorder = (clfrm->Flags&F_NOBORDER)?FALSE:TRUE; + + // create frame + Frames[nFramescount].TitleBar.hwnd = CreateWindow(CLUIFrameTitleBarClassName,Frames[nFramescount].name, + ( db_get_b(0,CLUIFrameModule,"RemoveAllTitleBarBorders",0)?0:WS_BORDER) |WS_CHILD|WS_CLIPCHILDREN| + (Frames[nFramescount].TitleBar.ShowTitleBar?WS_VISIBLE:0)| WS_CLIPCHILDREN, + 0,0,0,0,pcli->hwndContactList,NULL,g_hInst,NULL); + SetWindowLongPtr(Frames[nFramescount].TitleBar.hwnd,GWLP_USERDATA,Frames[nFramescount].id); + + Frames[nFramescount].TitleBar.hwndTip = CreateWindowEx(0, TOOLTIPS_CLASS, NULL, + WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + pcli->hwndContactList, NULL, g_hInst, NULL); + + SetWindowPos(Frames[nFramescount].TitleBar.hwndTip, HWND_TOPMOST,0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); + + TOOLINFO ti = { 0 }; + ti.cbSize = sizeof(ti); + ti.lpszText = _T(""); + ti.hinst = g_hInst; + ti.uFlags = TTF_IDISHWND|TTF_SUBCLASS ; + ti.uId = (UINT_PTR)Frames[nFramescount].TitleBar.hwnd; + SendMessage(Frames[nFramescount].TitleBar.hwndTip,TTM_ADDTOOL,0,(LPARAM)&ti); + + SendMessage(Frames[nFramescount].TitleBar.hwndTip,TTM_ACTIVATE,(WPARAM)Frames[nFramescount].TitleBar.ShowTitleBarTip,0); + + Frames[nFramescount].oldstyles = GetWindowLongPtr(Frames[nFramescount].hWnd,GWL_STYLE); + Frames[nFramescount].TitleBar.oldstyles = GetWindowLongPtr(Frames[nFramescount].TitleBar.hwnd,GWL_STYLE); + //Frames[nFramescount].FloatingPos.x = + + retval = Frames[nFramescount].id; + Frames[nFramescount].order = nFramescount+1; + nFramescount++; + + CLUIFramesLoadFrameSettings(id2pos(retval)); + style = GetWindowLongPtr(Frames[nFramescount-1].hWnd,GWL_STYLE); + style &= (~WS_BORDER); + style |= ((Frames[nFramescount-1].UseBorder)?WS_BORDER:0); + SetWindowLongPtr(Frames[nFramescount-1].hWnd,GWL_STYLE,style); + + if (Frames[nFramescount-1].order == 0){Frames[nFramescount-1].order = nFramescount;} + ulockfrm(); + + alclientFrame = -1;//recalc it + CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0); + + if (Frames[nFramescount-1].floating) { + Frames[nFramescount-1].floating = FALSE; + CLUIFrameSetFloat(retval,1);//lparam = 1 use stored width and height + } + + return retval; +} + +static INT_PTR CLUIFramesRemoveFrame(WPARAM wParam, LPARAM lParam) +{ + if (FramesSysNotStarted) + return -1; + + lockfrm(); + int pos = id2pos(wParam); + + if (pos<0||pos>nFramescount){ulockfrm();return(-1);} + + mir_free(Frames[pos].name); + mir_free(Frames[pos].TitleBar.tbname); + mir_free(Frames[pos].TitleBar.tooltip); + + DestroyWindow(Frames[pos].hWnd); + Frames[pos].hWnd = (HWND)-1; + DestroyWindow(Frames[pos].TitleBar.hwnd); + Frames[pos].TitleBar.hwnd = (HWND)-1; + DestroyWindow(Frames[pos].ContainerWnd); + Frames[pos].ContainerWnd = (HWND)-1; + DestroyMenu(Frames[pos].TitleBar.hmenu); + + RemoveItemFromList(pos,&Frames,&nFramescount); + + ulockfrm(); + InvalidateRect(pcli->hwndContactList,NULL,TRUE); + CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0); + InvalidateRect(pcli->hwndContactList,NULL,TRUE); + + return 0; +} + + +int CLUIFramesForceUpdateTB(const FRAMEWND *Frame) +{ + if (Frame->TitleBar.hwnd != 0) + RedrawWindow(Frame->TitleBar.hwnd,NULL,NULL,RDW_ALLCHILDREN|RDW_UPDATENOW|RDW_ERASE|RDW_INVALIDATE|RDW_FRAME); + return 0; +} + +int CLUIFramesForceUpdateFrame(const FRAMEWND *Frame) +{ + if (Frame->hWnd != 0) { + RedrawWindow(Frame->hWnd,NULL,NULL,RDW_UPDATENOW|RDW_FRAME|RDW_ERASE|RDW_INVALIDATE); + UpdateWindow(Frame->hWnd); + } + if (Frame->floating) { + if (Frame->ContainerWnd != 0) + RedrawWindow(Frame->ContainerWnd,NULL,NULL,RDW_UPDATENOW|RDW_ALLCHILDREN|RDW_ERASE|RDW_INVALIDATE|RDW_FRAME); + } + return 0; +} + +int CLUIFrameMoveResize(const FRAMEWND *Frame) +{ + //int b; + // we need to show or hide the frame? + if (Frame->visible&&(!Frame->needhide)) { + ShowWindow(Frame->hWnd,SW_SHOW); + ShowWindow(Frame->TitleBar.hwnd,Frame->TitleBar.ShowTitleBar == TRUE?SW_SHOW:SW_HIDE); + } + else { + ShowWindow(Frame->hWnd,SW_HIDE); + ShowWindow(Frame->TitleBar.hwnd,SW_HIDE); + return 0; + } + + // set frame position + SetWindowPos(Frame->hWnd,NULL,Frame->wndSize.left,Frame->wndSize.top, + Frame->wndSize.right-Frame->wndSize.left, + Frame->wndSize.bottom-Frame->wndSize.top,SWP_NOZORDER|SWP_NOREDRAW); + + // set titlebar position + if (Frame->TitleBar.ShowTitleBar) + SetWindowPos(Frame->TitleBar.hwnd,NULL,Frame->wndSize.left,Frame->wndSize.top-TitleBarH-GapBetweenTitlebar, + Frame->wndSize.right-Frame->wndSize.left, + TitleBarH,SWP_NOZORDER|SWP_NOREDRAW ); + + return 0; +} + +BOOLEAN CLUIFramesFitInSize(void) +{ + int sumheight = 0; + int tbh = 0; // title bar height + + int clientfrm = CLUIFramesGetalClientFrame(); + if (clientfrm != -1) + tbh = TitleBarH*btoint(Frames[clientfrm].TitleBar.ShowTitleBar); + + for (int i=0;iContactListHeight-tbh-2) + return FALSE; + } + } + return TRUE; +} + +int CLUIFramesGetMinHeight() +{ + int i,tbh,clientfrm,sumheight = 0; + RECT border; + int allbord = 0; + if (pcli->hwndContactList == NULL) return 0; + lockfrm(); + + // search for alClient frame and get the titlebar's height + tbh = 0; + clientfrm = CLUIFramesGetalClientFrame(); + if (clientfrm != -1) + tbh = TitleBarH*btoint(Frames[clientfrm].TitleBar.ShowTitleBar); + + for (i=0; i < nFramescount; i++) { + if ((Frames[i].align != alClient)&&(Frames[i].visible)&&(!Frames[i].needhide)&&(!Frames[i].floating)) { + RECT wsize; + + GetWindowRect(Frames[i].hWnd,&wsize); + sumheight += (wsize.bottom-wsize.top)+(TitleBarH*btoint(Frames[i].TitleBar.ShowTitleBar))+3; + } + } + ulockfrm(); + GetBorderSize(pcli->hwndContactList,&border); + return (sumheight+border.top+border.bottom+allbord+tbh+3); +} + +int CLUIFramesResize(const RECT newsize) +{ + int sumheight = 9999999,newheight; + int prevframe,prevframebottomline; + int tbh,curfrmtbh; + int drawitems; + int clientfrm; + int i,j; + int sepw = GapBetweenFrames; + SortData *sdarray; + + GapBetweenTitlebar = (int)db_get_dw(NULL,"CLUIFrames","GapBetweenTitleBar",1); + GapBetweenFrames = db_get_dw(NULL,"CLUIFrames","GapBetweenFrames",1); + TitleBarH = db_get_dw(NULL,"CLUIFrames","TitleBarH",DEFAULT_TITLEBAR_HEIGHT); + + if (nFramescount < 1) + return 0; + + newheight = newsize.bottom-newsize.top; + + // search for alClient frame and get the titlebar's height + tbh = 0; + clientfrm = CLUIFramesGetalClientFrame(); + if (clientfrm != -1) + tbh = (TitleBarH+GapBetweenTitlebar)*btoint(Frames[clientfrm].TitleBar.ShowTitleBar); + + for (i=0; i < nFramescount; i++) { + if ( !Frames[i].floating) { + Frames[i].needhide = FALSE; + Frames[i].wndSize.left = 0; + Frames[i].wndSize.right = newsize.right-0; + } + } + + //sorting stuff + sdarray = (SortData*)malloc(sizeof(SortData)*nFramescount); + if (sdarray == NULL){return(-1);} + for (i=0;i(newheight-tbh)&&drawitems>0) { + sumheight = 0; + drawitems = 0; + for (i=0;inewheight-tbh) { + sumheight -= (Frames[i].height)+curfrmtbh+sepw; + Frames[i].needhide = TRUE; + drawitems--; + break; + } + } + } + } + + prevframe = -1; + prevframebottomline = 0; + for (j = 0;jnewheight){ + //prevframebottomline -= Frames[i].height+(curfrmtbh+1); + //Frames[i].needhide = TRUE; + } + } + } + + if (sumheightnewheight) { + //prevframebottomline -= Frames[i].height+(tbh+1); + //Frames[i].needhide = TRUE; + } + break; + } + } + } + + //newheight + prevframebottomline = newheight+sepw; + //prevframe = -1; + for (j = nFramescount-1;j>=0;j--) { + //move all alBottom frames + i = sdarray[j].realpos; + if ((Frames[i].visible)&&(!Frames[i].floating)&&(!Frames[i].needhide)&&(Frames[i].align == alBottom)) { + curfrmtbh = (TitleBarH+GapBetweenTitlebar)*btoint(Frames[i].TitleBar.ShowTitleBar); + + Frames[i].wndSize.bottom = prevframebottomline-sepw; + Frames[i].wndSize.top = Frames[i].wndSize.bottom-Frames[i].height-(Frames[i].UseBorder?2:0); + Frames[i].prevvisframe = prevframe; + prevframe = i; + prevframebottomline = Frames[i].wndSize.top/*-1*/-curfrmtbh; + if (prevframebottomline>newheight) { + + } + } + } + + if (sdarray != NULL) { + free(sdarray); + sdarray = NULL; + } + + for (i=0;ihwndContactList,0); return 0;} + if (lParam&FU_FMPOS) CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,1); + lockfrm(); + int pos = id2pos(wParam); + if (pos < 0 || pos >= nFramescount) { ulockfrm(); return -1;} + if (lParam & FU_TBREDRAW) CLUIFramesForceUpdateTB(&Frames[pos]); + if (lParam & FU_FMREDRAW) CLUIFramesForceUpdateFrame(&Frames[pos]); + ulockfrm(); + + return 0; +} + +int CLUIFramesOnClistResize(WPARAM wParam, LPARAM lParam) +{ + RECT nRect,rcStatus; + int tick,i; + + if (FramesSysNotStarted) return -1; + lockfrm(); + + GetClientRect(pcli->hwndContactList,&nRect); + + rcStatus.top = rcStatus.bottom = 0; + + nRect.bottom -= nRect.top; + nRect.bottom -= (rcStatus.bottom-rcStatus.top); + nRect.right -= nRect.left; + nRect.left = 0; + nRect.top = 0; + ContactListHeight = nRect.bottom; + + tick = GetTickCount(); + + CLUIFramesResize(nRect); + + for (i=0; i < nFramescount; i++) { + CLUIFramesForceUpdateFrame(&Frames[i]); + CLUIFramesForceUpdateTB(&Frames[i]); + } + + //resizing = FALSE; + ulockfrm(); + tick = GetTickCount()-tick; + + if (pcli->hwndContactList != 0) InvalidateRect(pcli->hwndContactList,NULL,TRUE); + if (pcli->hwndContactList != 0) UpdateWindow(pcli->hwndContactList); + + Sleep(0); + + //dont save to database too many times + if (GetTickCount() - LastStoreTick > 1000) { + CLUIFramesStoreAllFrames(); + LastStoreTick = GetTickCount(); + } + return 0; +} + +static HBITMAP hBmpBackground; +static int backgroundBmpUse; +static COLORREF bkColour; +static COLORREF SelBkColour; +boolean AlignCOLLIconToLeft; //will hide frame icon + +int OnFrameTitleBarBackgroundChange(WPARAM wParam, LPARAM lParam) +{ + DBVARIANT dbv; + + AlignCOLLIconToLeft = db_get_b(NULL,"FrameTitleBar","AlignCOLLIconToLeft",0); + + bkColour = db_get_dw(NULL,"FrameTitleBar","BkColour",CLCDEFAULT_BKCOLOUR); + //SelBkColour = db_get_dw(NULL,"FrameTitleBar","SelBkColour",0); + + if (hBmpBackground) {DeleteObject(hBmpBackground); hBmpBackground = NULL;} + if ( db_get_b(NULL,"FrameTitleBar","UseBitmap",CLCDEFAULT_USEBITMAP)) { + if ( !db_get(NULL,"FrameTitleBar","BkBitmap",&dbv)) { + hBmpBackground = (HBITMAP)CallService(MS_UTILS_LOADBITMAP,0,(LPARAM)dbv.pszVal); + mir_free(dbv.pszVal); + } + } + backgroundBmpUse = db_get_w(NULL,"FrameTitleBar","BkBmpUse",CLCDEFAULT_BKBMPUSE); + + CLUIFramesOnClistResize(0,0); + return 0; +} + +void DrawBackGroundTTB(HWND hwnd,HDC mhdc) +{ + HDC hdcMem,hdc; + RECT clRect,*rcPaint; + + int yScroll = 0; + int y; + PAINTSTRUCT paintst = {0}; + HBITMAP hBmpOsb,hOldBmp; + DWORD style = GetWindowLongPtr(hwnd,GWL_STYLE); + int grey = 0; + HFONT oFont; + HBRUSH hBrushAlternateGrey = NULL; + + HFONT hFont; + + //InvalidateRect(hwnd,0,FALSE); + + hFont = (HFONT)SendMessage(hwnd,WM_GETFONT,0,0); + + if (mhdc) { + hdc = mhdc; + rcPaint = NULL; + } + else { + hdc = BeginPaint(hwnd,&paintst); + rcPaint = &(paintst.rcPaint); + } + + GetClientRect(hwnd,&clRect); + if (rcPaint == NULL) rcPaint = &clRect; + if (rcPaint->right-rcPaint->left == 0||rcPaint->top-rcPaint->bottom == 0) rcPaint = &clRect; + y = -yScroll; + hdcMem = CreateCompatibleDC(hdc); + hBmpOsb = CreateBitmap(clRect.right,clRect.bottom,1,GetDeviceCaps(hdc,BITSPIXEL),NULL); + hOldBmp = (HBITMAP)SelectObject(hdcMem,hBmpOsb); + oFont = (HFONT)SelectObject(hdcMem,hFont); + SetBkMode(hdcMem,TRANSPARENT); + { + HBRUSH hBrush = CreateSolidBrush(bkColour); + HBRUSH hoBrush = (HBRUSH)SelectObject(hdcMem,hBrush); + FillRect(hdcMem,rcPaint,hBrush); + SelectObject(hdcMem,hoBrush); + DeleteObject(hBrush); + if (hBmpBackground) { + BITMAP bmp; + HDC hdcBmp; + int x,y; + int maxx,maxy; + int destw,desth; + + GetObject(hBmpBackground,sizeof(bmp),&bmp); + hdcBmp = CreateCompatibleDC(hdcMem); + SelectObject(hdcBmp,hBmpBackground); + y = backgroundBmpUse&CLBF_SCROLL?-yScroll:0; + maxx = backgroundBmpUse&CLBF_TILEH?clRect.right:1; + maxy = backgroundBmpUse&CLBF_TILEV?maxy = rcPaint->bottom:y+1; + switch(backgroundBmpUse&CLBM_TYPE) { + case CLB_STRETCH: + if (backgroundBmpUse&CLBF_PROPORTIONAL) { + if (clRect.right*bmp.bmHeighttop-desth) continue; + for (x = 0;xleft,rcPaint->top,rcPaint->right-rcPaint->left,rcPaint->bottom-rcPaint->top,hdcMem,rcPaint->left,rcPaint->top,SRCCOPY); + + SelectObject(hdcMem,hOldBmp); + SelectObject(hdcMem,oFont); + DeleteObject(hBmpOsb); + DeleteDC(hdcMem); + paintst.fErase = FALSE; + //DeleteObject(hFont); + if ( !mhdc) + EndPaint(hwnd,&paintst); +} + +static int DrawTitleBar(HDC dc,RECT rect,int Frameid) +{ + HDC paintDC = dc; + + HDC hdcMem = CreateCompatibleDC(paintDC); + HBITMAP hBmpOsb = CreateBitmap(rect.right,rect.bottom,1,GetDeviceCaps(paintDC,BITSPIXEL),NULL); + HBITMAP hoBmp = (HBITMAP)SelectObject(hdcMem,hBmpOsb); + + HFONT hoTTBFont = (HFONT)SelectObject(hdcMem,TitleBarFont); + SetBkMode(hdcMem,TRANSPARENT); + + HBRUSH hBack = GetSysColorBrush(COLOR_3DFACE); + HBRUSH hoBrush = (HBRUSH)SelectObject(hdcMem,hBack); + + lockfrm(); + + int pos = id2pos(Frameid); + if (pos >= 0 && pos < nFramescount) { + GetClientRect(Frames[pos].TitleBar.hwnd,&Frames[pos].TitleBar.wndSize); + + //set font charset + HFONT hf = (HFONT)GetStockObject(DEFAULT_GUI_FONT); + if (TitleBarLogFont.lfHeight != 0) + hf = CreateFontIndirectA(&TitleBarLogFont); + + HFONT oFont = (HFONT)SelectObject(hdcMem,hf); + + DrawBackGroundTTB(Frames[pos].TitleBar.hwnd,hdcMem); + //hFront = CreateSolidPe (SelBkColour); + //SelectObject(hdcMem,hFront); + SelBkColour = db_get_dw(NULL,"CLUIFrames","FramesTitleBarFontCol",0); + if (SelBkColour) SetTextColor(hdcMem,SelBkColour); + + if ( !AlignCOLLIconToLeft) { + + if (Frames[pos].TitleBar.hicon != NULL) { + //(TitleBarH>>1)-(GetSystemMetrics(SM_CXSMICON)>>1) + DrawIconEx(hdcMem,2,((TitleBarH>>1)-(GetSystemMetrics(SM_CYSMICON)>>1)),Frames[pos].TitleBar.hicon,GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0,NULL,DI_NORMAL); + TextOut(hdcMem,GetSystemMetrics(SM_CYSMICON)+4,0,Frames[pos].TitleBar.tbname,lstrlen(Frames[pos].TitleBar.tbname)); + } + else + TextOut(hdcMem,2,0,Frames[pos].TitleBar.tbname,lstrlen(Frames[pos].TitleBar.tbname)); + } + else + TextOut(hdcMem,GetSystemMetrics(SM_CXSMICON)+2,0,Frames[pos].TitleBar.tbname,lstrlen(Frames[pos].TitleBar.tbname)); + + if ( !AlignCOLLIconToLeft) + DrawIconEx(hdcMem,Frames[pos].TitleBar.wndSize.right-GetSystemMetrics(SM_CXSMICON)-2,((TitleBarH>>1)-(GetSystemMetrics(SM_CXSMICON)>>1)),Frames[pos].collapsed?LoadSkinnedIcon(SKINICON_OTHER_GROUPOPEN):LoadSkinnedIcon(SKINICON_OTHER_GROUPSHUT),GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0,NULL,DI_NORMAL); + else + DrawIconEx(hdcMem,0,((TitleBarH>>1)-(GetSystemMetrics(SM_CXSMICON)>>1)),Frames[pos].collapsed?LoadSkinnedIcon(SKINICON_OTHER_GROUPOPEN):LoadSkinnedIcon(SKINICON_OTHER_GROUPSHUT),GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0,NULL,DI_NORMAL); + + DeleteObject(hf); + SelectObject(hdcMem,oFont); + } + ulockfrm(); + + BitBlt(paintDC,rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,hdcMem,rect.left,rect.top,SRCCOPY); + + SelectObject(hdcMem,hoBmp); + SelectObject(hdcMem,hoBrush); + SelectObject(hdcMem,hoTTBFont); + DeleteDC(hdcMem); + DeleteObject(hBack); + DeleteObject(hBmpOsb); + return 0; +} + +//for old multiwindow +#define MPCF_CONTEXTFRAMEMENU 3 +POINT ptOld; +short nLeft = 0; +short nTop = 0; + +LRESULT CALLBACK CLUIFrameTitleBarProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + RECT rect; + int Frameid,Framemod,direction; + int xpos,ypos; + + Frameid = (GetWindowLongPtr(hwnd,GWLP_USERDATA)); + memset(&rect,0,sizeof(rect)); + + switch(msg) { + case WM_CREATE: + SendMessage(hwnd,WM_SETFONT,(WPARAM)TitleBarFont,0); + return FALSE; + + case WM_MEASUREITEM: + return CallService(MS_CLIST_MENUMEASUREITEM,wParam,lParam); + + case WM_DRAWITEM: + return CallService(MS_CLIST_MENUDRAWITEM,wParam,lParam); + + case WM_ENABLE: + if (hwnd != 0) InvalidateRect(hwnd,NULL,FALSE); + return 0; + + case WM_COMMAND: + if ( CallService(MS_CLIST_MENUPROCESSCOMMAND, MAKEWPARAM(LOWORD(wParam),0), Frameid)) + break; + + if (HIWORD(wParam) == 0) { //mouse events for self created menu + int framepos = id2pos(Frameid); + if (framepos == -1) + break; + + switch(LOWORD(wParam)) { + case frame_menu_lock: + Frames[framepos].Locked = !Frames[framepos].Locked; + break; + case frame_menu_visible: + Frames[framepos].visible = !Frames[framepos].visible; + break; + case frame_menu_showtitlebar: + Frames[framepos].TitleBar.ShowTitleBar = !Frames[framepos].TitleBar.ShowTitleBar; + break; + case frame_menu_floating: + CLUIFrameSetFloat(Frameid,0); + break; + } + CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0); + } + break; + + case WM_RBUTTONDOWN: + { + HMENU hmenu; + POINT pt; + GetCursorPos(&pt); + + if (ServiceExists(MS_CLIST_MENUBUILDFRAMECONTEXT)) + hmenu = (HMENU)CallService(MS_CLIST_MENUBUILDFRAMECONTEXT,Frameid,0); + else { + //legacy menu support + int framepos = id2pos(Frameid); + lockfrm(); + if (framepos == -1){ulockfrm();break;} + hmenu = CreatePopupMenu(); + + AppendMenu(hmenu,MF_STRING|MF_DISABLED|MF_GRAYED,15,Frames[framepos].name); + AppendMenu(hmenu,MF_SEPARATOR,16,_T("")); + + if (Frames[framepos].Locked) + {AppendMenu(hmenu,MF_STRING|MF_CHECKED,frame_menu_lock,TranslateT("Lock frame"));} + else{AppendMenu(hmenu,MF_STRING,frame_menu_lock,TranslateT("Lock frame"));} + + if (Frames[framepos].visible) + {AppendMenu(hmenu,MF_STRING|MF_CHECKED,frame_menu_visible,TranslateT("Visible"));} + else{AppendMenu(hmenu,MF_STRING,frame_menu_visible,TranslateT("Visible"));} + + if (Frames[framepos].TitleBar.ShowTitleBar) + {AppendMenu(hmenu,MF_STRING|MF_CHECKED,frame_menu_showtitlebar,TranslateT("Show title bar"));} + else{AppendMenu(hmenu,MF_STRING,frame_menu_showtitlebar,TranslateT("Show title bar"));} + + if (Frames[framepos].floating) + {AppendMenu(hmenu,MF_STRING|MF_CHECKED,frame_menu_floating,TranslateT("Floating"));} + else{AppendMenu(hmenu,MF_STRING,frame_menu_floating,TranslateT("Floating"));} + + ulockfrm(); + } + + TrackPopupMenu(hmenu,TPM_LEFTALIGN,pt.x,pt.y,0,hwnd,0); + DestroyMenu(hmenu); + } + break; + + case WM_LBUTTONDBLCLK: + Framemod = -1; + lbypos = -1;oldframeheight = -1;ReleaseCapture(); + CallService(MS_CLIST_FRAMES_UCOLLFRAME,Frameid,0); + lbypos = -1;oldframeheight = -1;ReleaseCapture(); + break; + + case WM_LBUTTONUP: + if (GetCapture() != hwnd) + break; + curdragbar = -1;lbypos = -1;oldframeheight = -1;ReleaseCapture(); + break; + + case WM_LBUTTONDOWN: + { + int framepos = id2pos(Frameid); + if (framepos == -1) + break; + + lockfrm(); + if (Frames[framepos].floating) + { + POINT pt; + GetCursorPos(&pt); + Frames[framepos].TitleBar.oldpos = pt; + } + + if (( !(wParam & MK_CONTROL)) && Frames[framepos].Locked && (!(Frames[framepos].floating))) { + if ( db_get_b(NULL,"CLUI","ClientAreaDrag",0)) { + POINT pt; + //pt = nm->pt; + GetCursorPos(&pt); + return SendMessage(GetParent(hwnd), WM_SYSCOMMAND, SC_MOVE|HTCAPTION,MAKELPARAM(pt.x,pt.y)); + } + } + + if (Frames[framepos].floating) { + RECT rc; + GetCursorPos(&ptOld); + //ClientToScreen(hwnd,&ptOld); + GetWindowRect( hwnd, &rc ); + + nLeft = (short)rc.left; + nTop = (short)rc.top; + } + ulockfrm(); + SetCapture(hwnd); + } + break; + + case WM_MOUSEMOVE: + { + POINT pt,pt2; + RECT wndr; + int pos; + + char TBcapt[255]; + + lockfrm(); + pos = id2pos(Frameid); + + if (pos != -1) { + int oldflags; + mir_snprintf(TBcapt, SIZEOF(TBcapt), "%s - h:%d, vis:%d, fl:%d, fl:(%d,%d,%d,%d),or: %d", + Frames[pos].name, Frames[pos].height, Frames[pos].visible, Frames[pos].floating, + Frames[pos].FloatingPos.x, Frames[pos].FloatingPos.y, + Frames[pos].FloatingSize.x, Frames[pos].FloatingSize.y, + Frames[pos].order); + + oldflags = CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS,MAKEWPARAM(FO_FLAGS,Frames[pos].id),0); + if ( !(oldflags & F_SHOWTBTIP)) + oldflags |= F_SHOWTBTIP; + } + + ulockfrm(); + + if (wParam & MK_LBUTTON) { + RECT rcMiranda; + RECT rcwnd,rcOverlap; + POINT newpt,ofspt,curpt,newpos; + //if (GetCapture() != hwnd){break;} + //curdragbar = -1;lbypos = -1;oldframeheight = -1;ReleaseCapture(); + lockfrm(); + pos = id2pos(Frameid); + if (Frames[pos].floating) { + + GetCursorPos(&curpt); + rcwnd.bottom = curpt.y+5; + rcwnd.top = curpt.y; + rcwnd.left = curpt.x; + rcwnd.right = curpt.x+5; + + GetWindowRect(pcli->hwndContactList, &rcMiranda ); + //GetWindowRect( Frames[pos].ContainerWnd, &rcwnd ); + //IntersectRect( &rcOverlap, &rcwnd, &rcMiranda ) + if (IsWindowVisible(pcli->hwndContactList) &&IntersectRect( &rcOverlap, &rcwnd, &rcMiranda )) { + int id = Frames[pos].id; + ulockfrm(); + + ofspt.x = 0;ofspt.y = 0; + ClientToScreen(Frames[pos].TitleBar.hwnd,&ofspt); + ofspt.x = curpt.x-ofspt.x;ofspt.y = curpt.y-ofspt.y; + + CLUIFrameSetFloat(id,0); + newpt.x = 0;newpt.y = 0; + ClientToScreen(Frames[pos].TitleBar.hwnd,&newpt); + SetCursorPos(newpt.x+ofspt.x,newpt.y+ofspt.y); + GetCursorPos(&curpt); + lockfrm(); + Frames[pos].TitleBar.oldpos = curpt; + ulockfrm(); + return 0; + } + } + else { + int id = Frames[pos].id; + + GetCursorPos(&curpt); + rcwnd.bottom = curpt.y+5; + rcwnd.top = curpt.y; + rcwnd.left = curpt.x; + rcwnd.right = curpt.x+5; + + GetWindowRect(pcli->hwndContactList, &rcMiranda ); + + if ( !IntersectRect( &rcOverlap, &rcwnd, &rcMiranda )) { + ulockfrm(); + GetCursorPos(&curpt); + GetWindowRect( Frames[pos].hWnd, &rcwnd ); + rcwnd.left = rcwnd.right-rcwnd.left; + rcwnd.top = rcwnd.bottom-rcwnd.top; + newpos.x = curpt.x;newpos.y = curpt.y; + if (curpt.x>=(rcMiranda.right-1)){newpos.x = curpt.x+5;} + if (curpt.x<=(rcMiranda.left+1)){newpos.x = curpt.x-(rcwnd.left)-5;} + + if (curpt.y>=(rcMiranda.bottom-1)){newpos.y = curpt.y+5;} + if (curpt.y<=(rcMiranda.top+1)){newpos.y = curpt.y-(rcwnd.top)-5;} + + + ofspt.x = 0;ofspt.y = 0; + //ClientToScreen(Frames[pos].TitleBar.hwnd,&ofspt); + GetWindowRect(Frames[pos].TitleBar.hwnd,&rcwnd); + ofspt.x = curpt.x-ofspt.x;ofspt.y = curpt.y-ofspt.y; + + Frames[pos].FloatingPos.x = newpos.x; + Frames[pos].FloatingPos.y = newpos.y; + CLUIFrameSetFloat(id,0); + //SetWindowPos(Frames[pos].ContainerWnd,0,newpos.x,newpos.y,0,0,SWP_NOSIZE); + + lockfrm(); + newpt.x = 0;newpt.y = 0; + ClientToScreen(Frames[pos].TitleBar.hwnd,&newpt); + + GetWindowRect( Frames[pos].hWnd, &rcwnd ); + SetCursorPos(newpt.x+(rcwnd.right-rcwnd.left)/2,newpt.y+(rcwnd.bottom-rcwnd.top)/2); + GetCursorPos(&curpt); + + Frames[pos].TitleBar.oldpos = curpt; + ulockfrm(); + + return 0; + } + } + ulockfrm(); + } + + if (wParam & MK_LBUTTON) { + int newh = -1,prevold; + + if (GetCapture() != hwnd){break;} + + lockfrm(); + pos = id2pos(Frameid); + + if (Frames[pos].floating) { + GetCursorPos(&pt); + if ((Frames[pos].TitleBar.oldpos.x != pt.x)||(Frames[pos].TitleBar.oldpos.y != pt.y)) { + + pt2 = pt; + ScreenToClient(hwnd,&pt2); + GetWindowRect(Frames[pos].ContainerWnd,&wndr); + + int dX,dY; + POINT ptNew; + + ptNew.x = pt.x; + ptNew.y = pt.y; + //ClientToScreen( hwnd, &ptNew ); + + dX = ptNew.x - ptOld.x; + dY = ptNew.y - ptOld.y; + + nLeft += (short)dX; + nTop += (short)dY; + + if ( !(wParam & MK_CONTROL)) + PositionThumb( &Frames[pos], nLeft, nTop ); + else + SetWindowPos( Frames[pos].ContainerWnd, + HWND_TOPMOST, + nLeft, + nTop, + 0, + 0, + SWP_NOSIZE | SWP_NOZORDER ); + + ptOld = ptNew; + + pt.x = nLeft; + pt.y = nTop; + Frames[pos].TitleBar.oldpos = pt; + } + + ulockfrm(); + return 0; + } + + if (Frames[pos].prevvisframe != -1) { + GetCursorPos(&pt); + + if ((Frames[pos].TitleBar.oldpos.x == pt.x)&&(Frames[pos].TitleBar.oldpos.y == pt.y)) { + ulockfrm(); + break; + } + + ypos = rect.top+pt.y;xpos = rect.left+pt.x; + Framemod = -1; + + if (Frames[pos].align == alBottom) { + direction = -1; + Framemod = pos; + } + else { + direction = 1; + Framemod = Frames[pos].prevvisframe; + } + if (Frames[Framemod].Locked) {ulockfrm();break;} + if (curdragbar != -1&&curdragbar != pos) {ulockfrm();break;} + + if (lbypos == -1) { + curdragbar = pos; + lbypos = ypos; + oldframeheight = Frames[Framemod].height; + SetCapture(hwnd); + {ulockfrm();break;} + } + + newh = oldframeheight+direction*(ypos-lbypos); + if (newh > 0) { + prevold = Frames[Framemod].height; + Frames[Framemod].height = newh; + if ( !CLUIFramesFitInSize()) { + Frames[Framemod].height = prevold; + ulockfrm(); + return TRUE; + } + Frames[Framemod].height = newh; + if (newh > 3) + Frames[Framemod].collapsed = TRUE; + } + Frames[pos].TitleBar.oldpos = pt; + } + ulockfrm(); + if (newh > 0) + CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList, 0); + break; + } + curdragbar = -1;lbypos = -1;oldframeheight = -1;ReleaseCapture(); + } + break; + + case WM_PRINTCLIENT: + if (lParam & PRF_CLIENT) { + GetClientRect(hwnd,&rect); + DrawTitleBar((HDC)wParam,rect,Frameid); + } + + case WM_PAINT: + { + HDC paintDC; + PAINTSTRUCT paintStruct; + + //GetClientRect(hwnd,&rect); + paintDC = BeginPaint(hwnd, &paintStruct); + rect = paintStruct.rcPaint; + DrawTitleBar(paintDC,rect,Frameid); + EndPaint(hwnd, &paintStruct); + } + return 0; + + default: + return DefWindowProc(hwnd, msg, wParam, lParam); + } + return TRUE; +} + +int CLUIFrameResizeFloatingFrame(int framepos) +{ + int width,height; + RECT rect; + + if ( !Frames[framepos].floating){return 0;} + if (Frames[framepos].ContainerWnd == 0){return 0;} + GetClientRect(Frames[framepos].ContainerWnd,&rect); + + width = rect.right-rect.left; + height = rect.bottom-rect.top; + + Frames[framepos].visible?ShowWindow(Frames[framepos].ContainerWnd,SW_SHOW):ShowWindow(Frames[framepos].ContainerWnd,SW_HIDE); + + if (Frames[framepos].TitleBar.ShowTitleBar) { + ShowWindow(Frames[framepos].TitleBar.hwnd,SW_SHOW); + Frames[framepos].height = height-DEFAULT_TITLEBAR_HEIGHT; + + SetWindowPos(Frames[framepos].TitleBar.hwnd,HWND_TOP,0,0,width,DEFAULT_TITLEBAR_HEIGHT,SWP_SHOWWINDOW|SWP_DRAWFRAME); + SetWindowPos(Frames[framepos].hWnd,HWND_TOP,0,DEFAULT_TITLEBAR_HEIGHT,width,height-DEFAULT_TITLEBAR_HEIGHT,SWP_SHOWWINDOW); + } + else { + Frames[framepos].height = height; + ShowWindow(Frames[framepos].TitleBar.hwnd,SW_HIDE); + SetWindowPos(Frames[framepos].hWnd,HWND_TOP,0,0,width,height,SWP_SHOWWINDOW); + } + + if (Frames[framepos].ContainerWnd != 0) + UpdateWindow(Frames[framepos].ContainerWnd); + + GetWindowRect(Frames[framepos].hWnd,&Frames[framepos].wndSize); + return 0; +} + +static int CLUIFrameOnMainMenuBuild(WPARAM wParam, LPARAM lParam) +{ + CLUIFramesLoadMainMenu(); + return 0; +} + +LRESULT CALLBACK CLUIFrameContainerWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + RECT rect = { 0 }; + int Frameid = (GetWindowLongPtr(hwnd,GWLP_USERDATA)); + + switch(msg) { + case WM_CREATE: + { + lockfrm(); + int framepos = id2pos(Frameid); + ulockfrm(); + } + return 0; + + case WM_GETMINMAXINFO: + { + int framepos; + MINMAXINFO minmax; + + lockfrm(); + framepos = id2pos(Frameid); + if (framepos<0||framepos>=nFramescount){ulockfrm();break;} + if ( !Frames[framepos].minmaxenabled){ulockfrm();break;} + if (Frames[framepos].ContainerWnd == 0){ulockfrm();break;} + + if (Frames[framepos].Locked) { + RECT rct; + + GetWindowRect(hwnd,&rct); + ((LPMINMAXINFO)lParam)->ptMinTrackSize.x = rct.right-rct.left; + ((LPMINMAXINFO)lParam)->ptMinTrackSize.y = rct.bottom-rct.top; + ((LPMINMAXINFO)lParam)->ptMaxTrackSize.x = rct.right-rct.left; + ((LPMINMAXINFO)lParam)->ptMaxTrackSize.y = rct.bottom-rct.top; + } + + memset(&minmax,0,sizeof(minmax)); + if (SendMessage(Frames[framepos].hWnd,WM_GETMINMAXINFO,0,(LPARAM)&minmax) == 0) { + RECT border; + int tbh = TitleBarH*btoint(Frames[framepos].TitleBar.ShowTitleBar); + GetBorderSize(hwnd,&border); + if (minmax.ptMaxTrackSize.x != 0&&minmax.ptMaxTrackSize.y != 0){ + ((LPMINMAXINFO)lParam)->ptMinTrackSize.x = minmax.ptMinTrackSize.x; + ((LPMINMAXINFO)lParam)->ptMinTrackSize.y = minmax.ptMinTrackSize.y; + ((LPMINMAXINFO)lParam)->ptMaxTrackSize.x = minmax.ptMaxTrackSize.x+border.left+border.right; + ((LPMINMAXINFO)lParam)->ptMaxTrackSize.y = minmax.ptMaxTrackSize.y+tbh+border.top+border.bottom; + } + } + else { + ulockfrm(); + return(DefWindowProc(hwnd, msg, wParam, lParam)); + } + + ulockfrm(); + } + + case WM_MOVE: + { + lockfrm(); + int framepos = id2pos(Frameid); + + if (framepos<0||framepos>=nFramescount){ulockfrm();break;} + if (Frames[framepos].ContainerWnd == 0){ulockfrm();return 0;} + + RECT rect; + GetWindowRect(Frames[framepos].ContainerWnd,&rect); + Frames[framepos].FloatingPos.x = rect.left; + Frames[framepos].FloatingPos.y = rect.top; + Frames[framepos].FloatingSize.x = rect.right-rect.left; + Frames[framepos].FloatingSize.y = rect.bottom-rect.top; + + CLUIFramesStoreFrameSettings(framepos); + ulockfrm(); + } + return 0; + + case WM_SIZE: + { + lockfrm(); + int framepos = id2pos(Frameid); + + if (framepos<0||framepos>=nFramescount){ulockfrm();break;} + if (Frames[framepos].ContainerWnd == 0){ulockfrm();return 0;} + CLUIFrameResizeFloatingFrame(framepos); + + RECT rect; + GetWindowRect(Frames[framepos].ContainerWnd,&rect); + Frames[framepos].FloatingPos.x = rect.left; + Frames[framepos].FloatingPos.y = rect.top; + Frames[framepos].FloatingSize.x = rect.right-rect.left; + Frames[framepos].FloatingSize.y = rect.bottom-rect.top; + + CLUIFramesStoreFrameSettings(framepos); + ulockfrm(); + } + return 0; + + case WM_CLOSE: + DestroyWindow(hwnd); + break; + + case WM_DESTROY: + return 0; + } + return DefWindowProc(hwnd, msg, wParam, lParam); +} + +static HWND CreateContainerWindow(HWND parent,int x,int y,int width,int height) +{ + return(CreateWindowA("FramesContainer","aaaa",WS_POPUP|WS_THICKFRAME,x,y,width,height,parent,0,g_hInst,0)); +} + +INT_PTR CLUIFrameSetFloat(WPARAM wParam, LPARAM lParam) +{ + HWND hwndtmp, hwndtooltiptmp; + FRAMEWND *frame; + int pos; + + lockfrm(); + + pos = id2pos(wParam); + if (pos < 0 || pos > nFramescount) { + ulockfrm(); + return 0; + } + + frame = &Frames[pos]; + + //parent = GetParent(Frames[wParam].hWnd); + if (frame->floating) { + SetParent(frame->hWnd,pcli->hwndContactList); + SetParent(frame->TitleBar.hwnd,pcli->hwndContactList); + frame->floating = FALSE; + DestroyWindow(frame->ContainerWnd); + frame->ContainerWnd = NULL; + } + else { + RECT recttb,rectw,border; + LONG_PTR temp; + int neww,newh; + BOOLEAN locked; + + frame->oldstyles = GetWindowLongPtr(frame->hWnd,GWL_STYLE); + frame->TitleBar.oldstyles = GetWindowLongPtr(frame->TitleBar.hwnd,GWL_STYLE); + locked = frame->Locked; + frame->Locked = FALSE; + frame->minmaxenabled = FALSE; + + GetWindowRect(frame->hWnd,&rectw); + GetWindowRect(frame->TitleBar.hwnd,&recttb); + if ( !frame->TitleBar.ShowTitleBar) + recttb.top = recttb.bottom = recttb.left = recttb.right = 0; + + frame->ContainerWnd = CreateContainerWindow(pcli->hwndContactList,frame->FloatingPos.x,frame->FloatingPos.y,10,10); + + SetParent(frame->hWnd,frame->ContainerWnd); + SetParent(frame->TitleBar.hwnd,frame->ContainerWnd); + + GetBorderSize(frame->ContainerWnd,&border); + + SetWindowLongPtr(frame->ContainerWnd, GWLP_USERDATA, frame->id); + if ((lParam == 1)) { + if ((frame->FloatingPos.x != 0)&&(frame->FloatingPos.y != 0)) { + if (frame->FloatingPos.x<20){frame->FloatingPos.x = 40;} + if (frame->FloatingPos.y<20){frame->FloatingPos.y = 40;} + + SetWindowPos(frame->ContainerWnd,HWND_TOPMOST,frame->FloatingPos.x,frame->FloatingPos.y,frame->FloatingSize.x,frame->FloatingSize.y,SWP_HIDEWINDOW); + } + else SetWindowPos(frame->ContainerWnd,HWND_TOPMOST,120,120,140,140,SWP_HIDEWINDOW); + } + else { + neww = rectw.right-rectw.left+border.left+border.right; + newh = (rectw.bottom-rectw.top)+(recttb.bottom-recttb.top)+border.top+border.bottom; + if (neww<20){neww = 40;} + if (newh<20){newh = 40;} + if (frame->FloatingPos.x<20){frame->FloatingPos.x = 40;} + if (frame->FloatingPos.y<20){frame->FloatingPos.y = 40;} + + SetWindowPos(frame->ContainerWnd,HWND_TOPMOST,frame->FloatingPos.x,frame->FloatingPos.y,neww,newh,SWP_HIDEWINDOW); + } + + SetWindowText(frame->ContainerWnd,frame->TitleBar.tbname); + + temp = GetWindowLongPtr(frame->ContainerWnd,GWL_EXSTYLE); + temp |= WS_EX_TOOLWINDOW | WS_EX_TOPMOST ; + SetWindowLongPtr(frame->ContainerWnd,GWL_EXSTYLE,temp); + + frame->floating = TRUE; + frame->Locked = locked; + } + + CLUIFramesStoreFrameSettings(pos); + frame->minmaxenabled = TRUE; + hwndtooltiptmp = frame->TitleBar.hwndTip; + + hwndtmp = frame->ContainerWnd; + ulockfrm(); + CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList, 0); + SendMessage(hwndtmp,WM_SIZE,0,0); + + SetWindowPos(hwndtooltiptmp, HWND_TOPMOST,0, 0, 0, 0,SWP_NOMOVE | SWP_NOSIZE ); + return 0; +} + +static int CLUIFrameOnFontChange(WPARAM wParam, LPARAM lParam) +{ + FontID fid = {0}; + fid.cbSize = sizeof(fid); + memset(&TitleBarLogFont,0,sizeof(TitleBarLogFont)); + + strcpy(fid.group,LPGEN("Frames")); + strcpy(fid.name,LPGEN("TitleBarFont")); + strcpy(fid.dbSettingsGroup,"CLUIFrames"); + strcpy(fid.prefix,"FramesTitleBarFont"); + + CallService(MS_FONT_GET,(WPARAM)&fid,(LPARAM)&TitleBarLogFont); + CLUIFramesOnClistResize(0,0); + return 0; +} + +static void CLUIRegisterFonts() +{ + FontID fid = {0}; + fid.cbSize = sizeof(fid); + strcpy(fid.group, LPGEN("Frames")); + strcpy(fid.name, LPGEN("TitleBarFont")); + strcpy(fid.dbSettingsGroup, "CLUIFrames"); + strcpy(fid.prefix, "FramesTitleBarFont"); + FontRegister(&fid); + + CLUIFrameOnFontChange(0,0); + + HookEvent(ME_FONT_RELOAD,CLUIFrameOnFontChange); +} + +static int CLUIFrameOnModulesLoad(WPARAM wParam, LPARAM lParam) +{ + CLUIFramesLoadMainMenu(); + CLUIFramesCreateMenuForFrame(-1,-1,000010000,Menu_AddContextFrameMenuItem); + CLUIRegisterFonts(); + return 0; +} + +static int CLUIFrameOnModulesUnload(WPARAM wParam, LPARAM lParam) +{ + CallService(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMIVisible, 0 ); + CallService(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMITitle, 0 ); + CallService(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMITBVisible, 0 ); + CallService(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMILock, 0 ); + CallService(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMIColl, 0 ); + CallService(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMIFloating, 0 ); + CallService(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMIAlignRoot, 0 ); + CallService(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMIAlignTop, 0 ); + CallService(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMIAlignClient, 0 ); + CallService(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMIAlignBottom, 0 ); + CallService(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMIBorder, 0 ); + return 0; +} + +int LoadCLUIFramesModule(void) +{ + WNDCLASS wndclass; + wndclass.style = CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW ; + wndclass.lpfnWndProc = CLUIFrameTitleBarProc; + wndclass.cbClsExtra = 0; + wndclass.cbWndExtra = 0; + wndclass.hInstance = g_hInst; + wndclass.hIcon = NULL; + wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); + wndclass.hbrBackground = NULL; + wndclass.lpszMenuName = NULL; + wndclass.lpszClassName = CLUIFrameTitleBarClassName; + RegisterClass(&wndclass); + + //container helper + WNDCLASS cntclass; + cntclass.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW | CS_DROPSHADOW; + cntclass.lpfnWndProc = CLUIFrameContainerWndProc; + cntclass.cbClsExtra = 0; + cntclass.cbWndExtra = 0; + cntclass.hInstance = g_hInst; + cntclass.hIcon = NULL; + cntclass.hCursor = LoadCursor(NULL, IDC_ARROW); + cntclass.hbrBackground = NULL; + cntclass.lpszMenuName = NULL; + cntclass.lpszClassName = _T("FramesContainer"); + RegisterClass(&cntclass); + //end container helper + + GapBetweenFrames = db_get_dw(NULL,"CLUIFrames","GapBetweenFrames",1); + + nFramescount = 0; + InitializeCriticalSection(&csFrameHook); + InitFramesMenus(); + + HookEvent(ME_SYSTEM_MODULESLOADED,CLUIFrameOnModulesLoad); + HookEvent(ME_CLIST_PREBUILDFRAMEMENU,CLUIFramesModifyContextMenuForFrame); + HookEvent(ME_CLIST_PREBUILDMAINMENU,CLUIFrameOnMainMenuBuild); + + CreateServiceFunction(MS_CLIST_FRAMES_ADDFRAME,CLUIFramesAddFrame); + CreateServiceFunction(MS_CLIST_FRAMES_REMOVEFRAME,CLUIFramesRemoveFrame); + + CreateServiceFunction(MS_CLIST_FRAMES_SETFRAMEOPTIONS,CLUIFramesSetFrameOptions); + CreateServiceFunction(MS_CLIST_FRAMES_GETFRAMEOPTIONS,CLUIFramesGetFrameOptions); + CreateServiceFunction(MS_CLIST_FRAMES_UPDATEFRAME,CLUIFramesUpdateFrame); + + CreateServiceFunction(MS_CLIST_FRAMES_SHFRAMETITLEBAR,CLUIFramesShowHideFrameTitleBar); + CreateServiceFunction(MS_CLIST_FRAMES_SHOWALLFRAMESTB,CLUIFramesShowAllTitleBars); + CreateServiceFunction(MS_CLIST_FRAMES_HIDEALLFRAMESTB,CLUIFramesHideAllTitleBars); + CreateServiceFunction(MS_CLIST_FRAMES_SHFRAME,CLUIFramesShowHideFrame); + CreateServiceFunction(MS_CLIST_FRAMES_SHOWALLFRAMES,CLUIFramesShowAll); + + CreateServiceFunction(MS_CLIST_FRAMES_ULFRAME,CLUIFramesLockUnlockFrame); + CreateServiceFunction(MS_CLIST_FRAMES_UCOLLFRAME,CLUIFramesCollapseUnCollapseFrame); + CreateServiceFunction(MS_CLIST_FRAMES_SETUNBORDER,CLUIFramesSetUnSetBorder); + + CreateServiceFunction(CLUIFRAMESSETALIGN,CLUIFramesSetAlign); + CreateServiceFunction(CLUIFRAMESMOVEUPDOWN,CLUIFramesMoveUpDown); + + CreateServiceFunction(CLUIFRAMESSETALIGNALTOP,CLUIFramesSetAlignalTop); + CreateServiceFunction(CLUIFRAMESSETALIGNALCLIENT,CLUIFramesSetAlignalClient); + CreateServiceFunction(CLUIFRAMESSETALIGNALBOTTOM,CLUIFramesSetAlignalBottom); + + CreateServiceFunction("Set_Floating",CLUIFrameSetFloat); + hWndExplorerToolBar = FindWindowExA(0,0,"Shell_TrayWnd",NULL); + OnFrameTitleBarBackgroundChange(0,0); + FramesSysNotStarted = FALSE; + HookEvent(ME_SYSTEM_PRESHUTDOWN, CLUIFrameOnModulesUnload); + return 0; +} + +int UnLoadCLUIFramesModule(void) +{ + FramesSysNotStarted = TRUE; + + CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0); + CLUIFramesStoreAllFrames(); + lockfrm(); + for (int i=0; i < nFramescount; i++) { + DestroyWindow(Frames[i].hWnd); + Frames[i].hWnd = (HWND)-1; + DestroyWindow(Frames[i].TitleBar.hwnd); + Frames[i].TitleBar.hwnd = (HWND)-1; + DestroyWindow(Frames[i].ContainerWnd); + Frames[i].ContainerWnd = (HWND)-1; + DestroyMenu(Frames[i].TitleBar.hmenu); + + mir_free(Frames[i].name); + mir_free(Frames[i].TitleBar.tbname); + mir_free(Frames[i].TitleBar.tooltip); + } + + free(Frames); + Frames = NULL; + nFramescount = 0; + UnregisterClass(CLUIFrameTitleBarClassName,g_hInst); + DeleteObject(TitleBarFont); + ulockfrm(); + DeleteCriticalSection(&csFrameHook); + return 0; +} diff --git a/plugins/!Deprecated/Clist_mw/src/CLUIFrames/cluiframes.h b/plugins/!Deprecated/Clist_mw/src/CLUIFrames/cluiframes.h new file mode 100644 index 0000000000..b38975ea8f --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/CLUIFrames/cluiframes.h @@ -0,0 +1,120 @@ +/* +Miranda ICQ: the free icq client for MS Windows +Copyright (C) 2000-2 Richard Hughes, Roland Rabien & Tristan Van de Vreede + +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. +*/ + +#pragma once + +#ifndef _CLUIFRAMES_H_ +#define _CLUIFRAMES_H_ + +int LoadCLUIFramesModule(void); +int UnLoadCLUIFramesModule(void); +int CLUIFramesGetMinHeight(); +int CLUIFramesOnClistResize(WPARAM wParam, LPARAM lParam); + +typedef struct tagProtocolData { + char *RealName; + int protopos; + boolean show; +} ProtocolData; + +typedef struct +{ + int order; + int realpos; +} SortData; + + + + +//============ +#define CLUIFRAMESSETALIGN "CLUIFramesSetAlign" + +#define CLUIFRAMESSETALIGNALTOP "CLUIFramesSetAlignalTop" +#define CLUIFRAMESSETALIGNALCLIENT "CLUIFramesSetAlignalClient" +#define CLUIFRAMESSETALIGNALBOTTOM "CLUIFramesSetAlignalBottom" + +#define CLUIFRAMESMOVEUPDOWN "CLUIFramesMoveUpDown" + +struct FrameMenuHandles +{ + HGENMENU MainMenuItem; + HGENMENU MIVisible, MITitle, MITBVisible, MILock, MIColl, MIFloating, MIAlignRoot; + HGENMENU MIAlignTop, MIAlignClient, MIAlignBottom, MIBorder; +}; + +struct FrameTitleBar +{ + HWND hwnd; + HWND TitleBarbutt; + HWND hwndTip; + + LPTSTR tbname; + LPTSTR tooltip; + HMENU hmenu; + HICON hicon; + + BOOLEAN ShowTitleBar; + BOOLEAN ShowTitleBarTip; + COLORREF BackColour; + int oldstyles; + POINT oldpos; + RECT wndSize; +}; + +struct DockOpt +{ + HWND hwndLeft; + HWND hwndRight; +}; + +struct FRAMEWND +{ + int id; + HWND hWnd; + RECT wndSize; + LPTSTR name; + int align; + int height; + int dwFlags; + BOOLEAN Locked; + BOOLEAN visible; + BOOLEAN needhide; + BOOLEAN collapsed; + int prevvisframe; + int HeightWhenCollapsed; + FrameTitleBar TitleBar; + FrameMenuHandles MenuHandles; + int oldstyles; + BOOLEAN floating; + HWND ContainerWnd; + POINT FloatingPos; + POINT FloatingSize; + BOOLEAN minmaxenabled; + BOOLEAN UseBorder; + int order; + DockOpt dockOpt; +}; + +#define OFFSET_PROTOPOS 200 +#define OFFSET_VISIBLE 400 + +#define CLUIFrameTitleBarClassName _T("CLUIFrameTitleBar") +#define CLUIFrameModule "CLUIFrames" + +#endif diff --git a/plugins/!Deprecated/Clist_mw/src/CLUIFrames/framesmenu.cpp b/plugins/!Deprecated/Clist_mw/src/CLUIFrames/framesmenu.cpp new file mode 100644 index 0000000000..d414bdc2f2 --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/CLUIFrames/framesmenu.cpp @@ -0,0 +1,122 @@ +#include "../commonheaders.h" + +//========================== Frames +HANDLE hFrameMenuObject; +static HANDLE hPreBuildFrameMenuEvent; + +//contactmenu exec param(ownerdata) +//also used in checkservice +typedef struct{ + char *szServiceName; + int Frameid; + INT_PTR param1; +} FrameMenuExecParam, *lpFrameMenuExecParam; + +INT_PTR FreeOwnerDataFrameMenu(WPARAM wParam, LPARAM lParam) +{ + lpFrameMenuExecParam cmep = (lpFrameMenuExecParam)lParam; + if (cmep != NULL){ + mir_free(cmep->szServiceName); + mir_free(cmep); + } + return 0; +} + +static INT_PTR AddContextFrameMenuItem(WPARAM wParam, LPARAM lParam) +{ + CLISTMENUITEM *mi = (CLISTMENUITEM *)lParam; + + TMO_MenuItem tmi; + if (!pcli->pfnConvertMenu(mi, &tmi)) + return NULL; + + tmi.root = (mi->flags & CMIF_ROOTHANDLE) ? mi->hParentMenu : NULL; + + lpFrameMenuExecParam fmep = (lpFrameMenuExecParam)mir_alloc(sizeof(FrameMenuExecParam)); + if (fmep == NULL) + return 0; + + fmep->szServiceName = mir_strdup(mi->pszService); + fmep->Frameid = mi->popupPosition; + fmep->param1 = (INT_PTR)mi->pszContactOwner; + tmi.ownerdata = fmep; + + return CallService(MO_ADDNEWMENUITEM, (WPARAM)hFrameMenuObject, (LPARAM)&tmi); +} + +static INT_PTR RemoveContextFrameMenuItem(WPARAM wParam, LPARAM lParam) +{ + CallService(MO_REMOVEMENUITEM,wParam,0); + return 0; +} + +//called with: +//wparam - ownerdata +//lparam - lparam from winproc +INT_PTR FrameMenuExecService(WPARAM wParam, LPARAM lParam) +{ + lpFrameMenuExecParam fmep = (lpFrameMenuExecParam)wParam; + if (fmep == NULL) + return -1; + + CallService(fmep->szServiceName, lParam, fmep->param1); + return 0; +} + +//true - ok,false ignore +INT_PTR FrameMenuCheckService(WPARAM wParam, LPARAM lParam) +{ + PCheckProcParam pcpp = (PCheckProcParam)wParam; + if (pcpp == NULL) + return FALSE; + + TMO_MenuItem mi; + if (CallService(MO_GETMENUITEM, (WPARAM)pcpp->MenuItemHandle, (LPARAM)&mi) == 0) { + lpFrameMenuExecParam fmep = (lpFrameMenuExecParam)mi.ownerdata; + if (fmep != NULL) { + //pcpp->wParam - frameid + if (((WPARAM)fmep->Frameid == pcpp->wParam) || fmep->Frameid == -1) + return TRUE; + } + } + return FALSE; +} + +static INT_PTR ContextFrameMenuNotify(WPARAM wParam, LPARAM lParam) +{ + NotifyEventHooks(hPreBuildFrameMenuEvent, wParam, lParam); + return 0; +} + +static INT_PTR BuildContextFrameMenu(WPARAM wParam, LPARAM lParam) +{ + ListParam param = {0}; + param.MenuObjectHandle = hFrameMenuObject; + param.wParam = wParam; + param.lParam = lParam; + + HMENU hMenu = CreatePopupMenu(); + ContextFrameMenuNotify(wParam, -1); + CallService(MO_BUILDMENU, (WPARAM)hMenu, (LPARAM)¶m); + return (INT_PTR)hMenu; +} + +//========================== Frames end + +int InitFramesMenus(void) +{ + CreateServiceFunction("FrameMenuExecService", FrameMenuExecService); + CreateServiceFunction("FrameMenuCheckService", FrameMenuCheckService); + CreateServiceFunction("FrameMenuFreeService", FreeOwnerDataFrameMenu); + + CreateServiceFunction(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, RemoveContextFrameMenuItem); + CreateServiceFunction("CList/AddContextFrameMenuItem", AddContextFrameMenuItem); + CreateServiceFunction(MS_CLIST_MENUBUILDFRAMECONTEXT, BuildContextFrameMenu); + CreateServiceFunction(MS_CLIST_FRAMEMENUNOTIFY, ContextFrameMenuNotify); + hPreBuildFrameMenuEvent = CreateHookableEvent(ME_CLIST_PREBUILDFRAMEMENU); + + // frame menu object + hFrameMenuObject = MO_CreateMenuObject("FrameMenu", LPGEN("Frame menu"), "FrameMenuCheckService", "FrameMenuExecService"); + MO_SetMenuObjectParam(hFrameMenuObject, OPT_MENUOBJECT_SET_FREE_SERVICE, "FrameMenuFreeService"); + return 0; +} diff --git a/plugins/!Deprecated/Clist_mw/src/CLUIFrames/statusbar.cpp b/plugins/!Deprecated/Clist_mw/src/CLUIFrames/statusbar.cpp new file mode 100644 index 0000000000..9df66c7368 --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/CLUIFrames/statusbar.cpp @@ -0,0 +1,497 @@ +#include "../commonheaders.h" + +extern HINSTANCE g_hInst; +HANDLE hStatusBarShowToolTipEvent,hStatusBarHideToolTipEvent; +boolean canloadstatusbar = FALSE; +HWND helperhwnd = 0; +HANDLE hFrameHelperStatusBar; + +void CluiProtocolStatusChanged(int parStatus, const char* szProto); + +INT_PTR GetConnectingIconService (WPARAM wParam, LPARAM lParam); + +int RecreateStatusBar(HWND); +int UseOwnerDrawStatusBar; + +#define TM_STATUSBAR 23435234 +#define TM_STATUSBARHIDE 23435235 +boolean tooltipshoing; +WNDPROC OldWindowProc = NULL; + + +POINT lastpnt; +RECT OldRc = {0}; +static HBITMAP hBmpBackground; +static int backgroundBmpUse; +static COLORREF bkColour; +extern BYTE showOpts; +int extraspace; + +int OnStatusBarBackgroundChange() +{ + showOpts = db_get_b(NULL,"CLUI","SBarShow",1); + bkColour = db_get_dw(NULL,"StatusBar","BkColour",CLCDEFAULT_BKCOLOUR); + if (hBmpBackground) + DeleteObject(hBmpBackground), hBmpBackground = NULL; + + if ( db_get_b(NULL,"StatusBar","UseBitmap",CLCDEFAULT_USEBITMAP)) { + DBVARIANT dbv; + if ( !db_get_ts(NULL, "StatusBar", "BkBitmap", &dbv)) { + hBmpBackground = (HBITMAP)CallService(MS_UTILS_LOADBITMAPT, 0, (LPARAM)dbv.ptszVal); + db_free(&dbv); + } + } + + backgroundBmpUse = db_get_w(NULL,"StatusBar","BkBmpUse",CLCDEFAULT_BKBMPUSE); + extraspace = db_get_dw(NULL,"StatusBar","BkExtraSpace",0); + + RecreateStatusBar(pcli->hwndContactList); + if (pcli->hwndStatus) InvalidateRect(pcli->hwndStatus,NULL,TRUE); + return 0; +} + + +void DrawDataForStatusBar(LPDRAWITEMSTRUCT dis) +{ + ProtocolData *PD = (ProtocolData *)dis->itemData; + SIZE textSize; + boolean NeedDestroy = FALSE; + + if (PD == NULL || dis->hDC == NULL) + return; + + //clip it + HRGN hrgn = CreateRectRgn(dis->rcItem.left, dis->rcItem.top, dis->rcItem.right, dis->rcItem.bottom); + SelectClipRgn(dis->hDC, hrgn); + + char *szProto = PD->RealName; + int status = CallProtoService(szProto,PS_GETSTATUS,0,0); + SetBkMode(dis->hDC,TRANSPARENT); + int x = dis->rcItem.left+extraspace; + + if (showOpts & 1) { + HICON hIcon; + if ( db_get_b(NULL, "CLUI", "UseConnectingIcon", 1) == 1 && status < ID_STATUS_OFFLINE) { + hIcon = (HICON)GetConnectingIconService((WPARAM)szProto, 0); + if (hIcon) + NeedDestroy = TRUE; + else + hIcon = LoadSkinnedProtoIcon(szProto,status); + } + else hIcon = LoadSkinnedProtoIcon(szProto,status); + + DrawIconEx(dis->hDC,x,(dis->rcItem.top+dis->rcItem.bottom-GetSystemMetrics(SM_CYSMICON))>>1,hIcon,GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0,NULL,DI_NORMAL); + if (NeedDestroy) DestroyIcon(hIcon); + x += GetSystemMetrics(SM_CXSMICON)+2; + } + else x += 2; + + if (showOpts & 2) { + PROTOACCOUNT *pa = ProtoGetAccount(szProto); + TCHAR szName[64]; + mir_sntprintf(szName, SIZEOF(szName), _T("%s%s"), pa->tszAccountName, showOpts&4 ? _T(" ") : _T("")); + GetTextExtentPoint32(dis->hDC, szName, (int)_tcslen(szName), &textSize); + + TextOut(dis->hDC,x,(dis->rcItem.top+dis->rcItem.bottom-textSize.cy)>>1,szName,lstrlen(szName)); + x += textSize.cx; + } + + if (showOpts & 4) { + TCHAR *szStatus = pcli->pfnGetStatusModeDescription(status, 0); + if ( !szStatus) + szStatus = _T(""); + GetTextExtentPoint32(dis->hDC,szStatus,lstrlen(szStatus),&textSize); + TextOut(dis->hDC,x,(dis->rcItem.top+dis->rcItem.bottom-textSize.cy)>>1,szStatus,lstrlen(szStatus)); + } + SelectClipRgn(dis->hDC, NULL); + DeleteObject(hrgn); +} + +void DrawBackGround(HWND hwnd,HDC mhdc) +{ + HDC hdcMem,hdc; + RECT clRect,*rcPaint; + + int yScroll = 0; + int y; + PAINTSTRUCT paintst = {0}; + HBITMAP hBmpOsb,holdbmp; + DWORD style = GetWindowLongPtr(hwnd,GWL_STYLE); + int grey = 0; + HFONT oFont; + HBRUSH hBrushAlternateGrey = NULL; + + HFONT hFont = (HFONT)SendMessage(hwnd,WM_GETFONT,0,0); + if (mhdc) { + hdc = mhdc; + rcPaint = NULL; + } + else { + hdc = BeginPaint(hwnd,&paintst); + rcPaint = &(paintst.rcPaint); + } + + GetClientRect(hwnd,&clRect); + if (rcPaint == NULL) rcPaint = &clRect; + if (rcPaint->right-rcPaint->left == 0||rcPaint->top-rcPaint->bottom == 0) rcPaint = &clRect; + y = -yScroll; + hdcMem = CreateCompatibleDC(hdc); + hBmpOsb = CreateBitmap(clRect.right,clRect.bottom,1,GetDeviceCaps(hdc,BITSPIXEL),NULL); + holdbmp = (HBITMAP)SelectObject(hdcMem,hBmpOsb); + oFont = (HFONT)SelectObject(hdcMem,hFont); + SetBkMode(hdcMem,TRANSPARENT); + { + HBRUSH hBrush = CreateSolidBrush(bkColour); + HBRUSH hoBrush = (HBRUSH)SelectObject(hdcMem,hBrush); + FillRect(hdcMem,rcPaint,hBrush); + SelectObject(hdcMem,hoBrush); + DeleteObject(hBrush); + if (hBmpBackground) { + BITMAP bmp; + int x,y; + int maxx,maxy; + int destw,desth; + + GetObject(hBmpBackground,sizeof(bmp),&bmp); + HDC hdcBmp = CreateCompatibleDC(hdcMem); + HDC holdbackbmp = (HDC)SelectObject(hdcBmp,hBmpBackground); + y = backgroundBmpUse&CLBF_SCROLL?-yScroll:0; + maxx = backgroundBmpUse&CLBF_TILEH?clRect.right:1; + maxy = backgroundBmpUse&CLBF_TILEV?maxy = rcPaint->bottom:y+1; + switch(backgroundBmpUse&CLBM_TYPE) { + case CLB_STRETCH: + if (backgroundBmpUse&CLBF_PROPORTIONAL) { + if (clRect.right*bmp.bmHeighttop-desth) continue; + for (x = 0;xhwndStatus,SB_GETTEXT,(WPARAM)nPanel,0); + if (PD == NULL) + continue; + + SendMessage(hwnd,SB_GETRECT,(WPARAM)nPanel,(LPARAM)&rc); + + rc.top = 0; + rc.left = nPanel*sectwidth+startoffset; + rc.right = rc.left+sectwidth-1; + ds.rcItem = rc; + ds.itemData = (ULONG_PTR)PD; + ds.itemID = nPanel; + + DrawDataForStatusBar(&ds); + } } + + BitBlt(hdc,rcPaint->left,rcPaint->top,rcPaint->right-rcPaint->left,rcPaint->bottom-rcPaint->top,hdcMem,rcPaint->left,rcPaint->top,SRCCOPY); + + SelectObject(hdcMem,holdbmp); + SelectObject(hdcMem,oFont); + DeleteObject(hBmpOsb); + DeleteDC(hdcMem); + paintst.fErase = FALSE; + if ( !mhdc) + EndPaint(hwnd,&paintst); +} + +static LRESULT CALLBACK StatusBarOwnerDrawProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + if (UseOwnerDrawStatusBar) { + switch(uMsg) { + case WM_ERASEBKGND: + return 0; + + case WM_PRINT: + DrawBackGround(hwnd,(HDC)wParam); + return 0; + + case WM_PAINT: + DrawBackGround(hwnd,0); + return 0; + } + } + return mir_callNextSubclass(hwnd, StatusBarOwnerDrawProc, uMsg, wParam, lParam); +} + +LRESULT CALLBACK StatusHelperProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) { + case WM_CREATE: + tooltipshoing = FALSE; + return FALSE; + + case WM_GETMINMAXINFO: + if (pcli->hwndStatus) { + RECT rct; + GetWindowRect(pcli->hwndStatus,&rct); + memset((LPMINMAXINFO)lParam, 0, sizeof(MINMAXINFO)); + ((LPMINMAXINFO)lParam)->ptMinTrackSize.x = 5; + ((LPMINMAXINFO)lParam)->ptMinTrackSize.y = rct.bottom-rct.top; + ((LPMINMAXINFO)lParam)->ptMaxTrackSize.x = 1600; + ((LPMINMAXINFO)lParam)->ptMaxTrackSize.y = rct.bottom-rct.top; + return 0; + } + break; + + case WM_NCHITTEST: + case WM_SHOWWINDOW: + if (hFrameHelperStatusBar) { + int res = CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS, MAKEWPARAM(FO_FLAGS,hFrameHelperStatusBar),0); + db_set_b(0, "CLUI", "ShowSBar", (res & F_VISIBLE) != 0); + } + + if (tooltipshoing){ + NotifyEventHooks(hStatusBarHideToolTipEvent, 0, 0); + tooltipshoing = FALSE; + } + return 0; + + case WM_TIMER: + if (wParam == TM_STATUSBARHIDE) { + KillTimer(hwnd,TM_STATUSBARHIDE); + + if (tooltipshoing){ + NotifyEventHooks(hStatusBarHideToolTipEvent,0,0); + tooltipshoing = FALSE; + } + } + + if (wParam == TM_STATUSBAR) { + KillTimer(hwnd,TM_STATUSBAR); + + POINT pt; + GetCursorPos(&pt); + if (pt.x == lastpnt.x&&pt.y == lastpnt.y) { + RECT rc; + ScreenToClient(pcli->hwndStatus, &pt); + int nParts = SendMessage(pcli->hwndStatus,SB_GETPARTS,0,0); + for (int i = 0;ihwndStatus,SB_GETRECT,i,(LPARAM)&rc); + if (PtInRect(&rc,pt)) { + ProtocolData *PD = (ProtocolData *)SendMessage(pcli->hwndStatus,SB_GETTEXT,i,0); + if (PD == NULL) + return 0; + + NotifyEventHooks(hStatusBarShowToolTipEvent,(WPARAM)PD->RealName,0); + SetTimer(hwnd,TM_STATUSBARHIDE,db_get_w(NULL,"CLUIFrames","HideToolTipTime",5000),0); + tooltipshoing = TRUE; + break; + } + } + } + } + return 0; + + case WM_SETCURSOR: + { + POINT pt; + GetCursorPos(&pt); + if (pt.x == lastpnt.x&&pt.y == lastpnt.y) + return 0; + + lastpnt = pt; + if (tooltipshoing){ + KillTimer(hwnd,TM_STATUSBARHIDE); + NotifyEventHooks(hStatusBarHideToolTipEvent,0,0); + tooltipshoing = FALSE; + } + KillTimer(hwnd,TM_STATUSBAR); + SetTimer(hwnd,TM_STATUSBAR,db_get_w(NULL,"CLC","InfoTipHoverTime",750),0); + } + return 0; + + case WM_NOTIFY: + if (lParam == 0) + return 0; + + if (((LPNMHDR)lParam)->hwndFrom == pcli->hwndStatus) + if (((LPNMHDR)lParam)->code == WM_NCHITTEST) + LPNMMOUSE lpnmmouse = (LPNMMOUSE) lParam; + + case WM_CONTEXTMENU: + KillTimer(hwnd,TM_STATUSBARHIDE); + + if (tooltipshoing) + NotifyEventHooks(hStatusBarHideToolTipEvent,0,0); + + tooltipshoing = FALSE; + + case WM_MEASUREITEM: + case WM_DRAWITEM: + //parent do all work for us + return(SendMessage(pcli->hwndContactList,msg,wParam,lParam)); + + case WM_MOVE: + PostMessage(pcli->hwndStatus,WM_MOVE,wParam,lParam); + + case WM_SIZE: + { + RECT rc; + int b; + if (pcli->hwndStatus != 0) { + GetClientRect(hwnd,&rc); + + b = LOWORD(lParam); + if (b != 0&&(rc.right-rc.left) != (OldRc.right-OldRc.left)) { + OldRc = rc; + if (canloadstatusbar) + if ( db_get_b(NULL,"CLUI","UseOwnerDrawStatusBar",0)||db_get_b(NULL,"CLUI","EqualSections",1)) + CluiProtocolStatusChanged(0,0); + } + if (msg == WM_SIZE) PostMessage(pcli->hwndStatus,WM_SIZE,wParam,lParam); + if (pcli->hwndStatus != 0) InvalidateRect(pcli->hwndStatus,NULL,TRUE); + return 0; + } + } + + default: + return DefWindowProc(hwnd, msg, wParam, lParam); + + } + return DefWindowProc(hwnd, msg, wParam, lParam); +} + +HWND CreateStatusHelper(HWND parent) +{ + WNDCLASS wndclass = {0}; + TCHAR pluginname[] = _T("Statushelper"); + + if (GetClassInfo(g_hInst,pluginname,&wndclass) == 0 ) { + wndclass.style = 0; + wndclass.lpfnWndProc = StatusHelperProc; + wndclass.cbClsExtra = 0; + wndclass.cbWndExtra = 0; + wndclass.hInstance = g_hInst; + wndclass.hIcon = NULL; + wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); + wndclass.hbrBackground = (HBRUSH)(COLOR_3DFACE+1); + wndclass.lpszMenuName = NULL; + wndclass.lpszClassName = pluginname; + RegisterClass(&wndclass); + } + + return(CreateWindow(pluginname,pluginname, + /*WS_THICKFRAME|*/WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN, + 0,0,0,0,parent,NULL,g_hInst,NULL)); +} + +HANDLE CreateStatusBarFrame() +{ + RECT rc; + GetWindowRect(helperhwnd,&rc); + int h = rc.bottom-rc.top; + + CLISTFrame Frame = { 0 }; + Frame.cbSize = sizeof(CLISTFrame); + Frame.hWnd = helperhwnd; + Frame.align = alBottom; + Frame.hIcon = LoadSkinnedIcon(SKINICON_OTHER_FRAME); + Frame.Flags = ( db_get_b(NULL,"CLUI","ShowSBar",1)?F_VISIBLE:0)|F_LOCKED|F_NOBORDER|F_TCHAR; + Frame.height = (h == 0) ? 20 : h; + Frame.tname = _T("Status"); + Frame.TBtname = TranslateT("Status bar"); + hFrameHelperStatusBar = (HANDLE)CallService(MS_CLIST_FRAMES_ADDFRAME,(WPARAM)&Frame,0); + + return hFrameHelperStatusBar; +} + +int RecreateStatusBar(HWND parent) +{ + if (pcli->hwndStatus) { + FreeProtocolData(); + DestroyWindow(pcli->hwndStatus); + } + pcli->hwndStatus = 0; + if (hFrameHelperStatusBar) CallService(MS_CLIST_FRAMES_REMOVEFRAME,(WPARAM)hFrameHelperStatusBar,0); + + helperhwnd = CreateStatusHelper(parent); + UseOwnerDrawStatusBar = db_get_b(NULL,"CLUI","UseOwnerDrawStatusBar",0); + + //create the status wnd + pcli->hwndStatus = CreateStatusWindow( + ( db_get_b(0,"CLUI","SBarUseSizeGrip",TRUE) && (!UseOwnerDrawStatusBar)?SBARS_SIZEGRIP:0)| + WS_CHILD | ( db_get_b(NULL,"CLUI","ShowSBar",1)?WS_VISIBLE:0), _T(""), helperhwnd, 0); + + OldWindowProc = (WNDPROC)GetWindowLongPtr(pcli->hwndStatus,GWLP_WNDPROC); + mir_subclassWindow(pcli->hwndStatus, StatusBarOwnerDrawProc); + CreateStatusBarFrame(); + + SetWindowPos(helperhwnd,NULL,1,1,1,1,SWP_NOZORDER); + CluiProtocolStatusChanged(0,0); + CallService(MS_CLIST_FRAMES_UPDATEFRAME,-1,0); + return 0; +} + +HWND CreateStatusBarhWnd(HWND parent) +{ + RecreateStatusBar(parent); + OnStatusBarBackgroundChange(); + + hStatusBarShowToolTipEvent = CreateHookableEvent(ME_CLIST_FRAMES_SB_SHOW_TOOLTIP); + hStatusBarHideToolTipEvent = CreateHookableEvent(ME_CLIST_FRAMES_SB_HIDE_TOOLTIP); + return pcli->hwndStatus; +} diff --git a/plugins/!Deprecated/Clist_mw/src/Version.h b/plugins/!Deprecated/Clist_mw/src/Version.h new file mode 100644 index 0000000000..961c80eef1 --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/Version.h @@ -0,0 +1,14 @@ +#define __MAJOR_VERSION 0 +#define __MINOR_VERSION 9 +#define __RELEASE_NUM 0 +#define __BUILD_NUM 0 + +#include + +#define __PLUGIN_NAME "MultiWindow contact list" +#define __FILENAME "Clist_mw.dll" +#define __DESCRIPTION "Displays contacts, event notifications, protocol status with MW modifications." +#define __AUTHOR "Bethoven" +#define __AUTHOREMAIL "bethoven@mailgate.ru" +#define __AUTHORWEB "http://miranda-ng.org/p/Clist_mw/" +#define __COPYRIGHT "Copyright 2000-2010 Miranda IM project, 2012 Miranda NG project." diff --git a/plugins/!Deprecated/Clist_mw/src/clc.cpp b/plugins/!Deprecated/Clist_mw/src/clc.cpp new file mode 100644 index 0000000000..a3c382c1cc --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/clc.cpp @@ -0,0 +1,319 @@ +/* + +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), +Copyright (c) 2000-03 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ +#include "commonheaders.h" + +int DefaultImageListColorDepth = ILC_COLOR32; + +HIMAGELIST himlCListClc; + +static HANDLE hSettingChanged1; + +int BgStatusBarChange(WPARAM wParam, LPARAM lParam); + +int BgClcChange(WPARAM wParam, LPARAM lParam); +int OnFrameTitleBarBackgroundChange(WPARAM wParam, LPARAM lParam); + +void InitDisplayNameCache(SortedList *list); +void FreeDisplayNameCache(SortedList *list); + +void UnloadCLUIModule( void ); + +extern int sortByStatus; +struct ClcContact * hitcontact = NULL; + +extern LRESULT ( CALLBACK *saveContactListControlWndProc )(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); + +static int stopStatusUpdater = 0; +void StatusUpdaterThread(void*) +{ + int i,curdelay,lastcheck = 0; + MCONTACT hContact = db_find_first(); + + SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_LOWEST); + + while (!stopStatusUpdater) { + curdelay = db_get_b(hContact,"CList","StatusMsgAutoDelay",15000); + if (curdelay<5000) curdelay = 5000; + + if ((int)(GetTickCount()-lastcheck)>curdelay) + { + lastcheck = GetTickCount(); + if ( db_get_b(hContact,"CList","StatusMsgAuto",0)) { + for (i = 0; i<5; i++) { + if (hContact != NULL) { + ClcCacheEntry *pdnce = (ClcCacheEntry *)pcli->pfnGetCacheEntry(hContact); + if (pdnce && !pdnce->protoNotExists && pdnce->szProto) + CallContactService(hContact, PSS_GETAWAYMSG, 0, 0); + + hContact = db_find_next(hContact); + } + if (hContact == NULL) { + hContact = db_find_first(); + if (hContact == NULL) + break; + } + Sleep(500); + } + } + } + //Sleep( db_get_b(hContact,"CList","StatusMsgAutoDelay",100)); + Sleep(200); + } +} + +HMENU BuildGroupPopupMenu( ClcGroup* group ) +{ + return (HMENU)CallService(MS_CLIST_MENUBUILDSUBGROUP,(WPARAM)group,0); +} + +void SortClcByTimer (HWND hwnd) +{ + KillTimer(hwnd,TIMERID_DELAYEDRESORTCLC); + SetTimer(hwnd,TIMERID_DELAYEDRESORTCLC,db_get_b(NULL,"CLUI","DELAYEDTIMER",200),NULL); +} + +static int ClcSettingChanged(WPARAM hContact, LPARAM lParam) +{ + DBCONTACTWRITESETTING *cws = (DBCONTACTWRITESETTING*)lParam; + + if (hContact != NULL && !strcmp(cws->szModule, META_PROTO) && !strcmp(cws->szSetting, "ParentMeta")) + pcli->pfnClcBroadcast(INTM_NAMEORDERCHANGED, 0, 0); + + if (hContact != NULL && !strcmp(cws->szModule, "CList")) { + if (!strcmp(cws->szSetting, "noOffline")) + pcli->pfnClcBroadcast(INTM_NAMEORDERCHANGED, hContact, lParam); + else if (!strcmp(cws->szSetting, "StatusMsg")) + pcli->pfnClcBroadcast(INTM_STATUSMSGCHANGED, hContact, lParam); + } + return 0; +} + +static int ClcModulesLoaded(WPARAM wParam, LPARAM lParam) +{ + CallService(MS_BACKGROUNDCONFIG_REGISTER, (WPARAM)(LPGEN("Status bar background")"/StatusBar"), 0); + CallService(MS_BACKGROUNDCONFIG_REGISTER, (WPARAM)(LPGEN("List background")"/CLC"), 0); + CallService(MS_BACKGROUNDCONFIG_REGISTER, (WPARAM)(LPGEN("Frames title bar background")"/FrameTitleBar"), 0); + HookEvent(ME_BACKGROUNDCONFIG_CHANGED, BgClcChange); + HookEvent(ME_BACKGROUNDCONFIG_CHANGED, BgStatusBarChange); + HookEvent(ME_BACKGROUNDCONFIG_CHANGED, OnFrameTitleBarBackgroundChange); + return 0; +} + +static int ClcShutdown(WPARAM wParam, LPARAM lParam) +{ + UnhookEvent(hSettingChanged1); + UnloadCLUIModule(); + return 0; +} + +LRESULT CALLBACK ContactListControlWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + struct ClcData *dat = (struct ClcData*)GetWindowLongPtr(hwnd, 0); + if (msg >= CLM_FIRST && msg < CLM_LAST) + return pcli->pfnProcessExternalMessages(hwnd, dat, msg, wParam, lParam); + + switch (msg) { + case WM_CREATE: + dat = (struct ClcData*)mir_calloc(sizeof(struct ClcData)); + SetWindowLongPtr(hwnd, 0, (LONG_PTR)dat); + InitDisplayNameCache(&dat->lCLCContactsCache); + break; + + case INTM_ICONCHANGED: + { + int recalcScrollBar = 0, shouldShow; + MCONTACT hSelItem = NULL; + struct ClcContact *selcontact = NULL; + ClcCacheEntry *cacheEntry = GetContactFullCacheEntry(wParam); + + WORD status; + int needsResort = 0; + + char *szProto = cacheEntry->szProto; + if (szProto == NULL) + status = ID_STATUS_OFFLINE; + else + status = cacheEntry->status; + + // this means an offline msg is flashing, so the contact should be shown + shouldShow = (GetWindowLongPtr(hwnd, GWL_STYLE) & CLS_SHOWHIDDEN || !cacheEntry->bIsHidden) && + (!pcli->pfnIsHiddenMode(dat, status) || cacheEntry->noHiddenOffline || pcli->pfnGetContactIcon(wParam) != LOWORD(lParam)); + + ClcContact *contact; + ClcGroup *group; + if (!FindItem(hwnd, dat, wParam, &contact, &group, NULL)) { + if (shouldShow && CallService(MS_DB_CONTACT_IS, wParam, 0)) { + if (dat->selection >= 0 && GetRowByIndex(dat, dat->selection, &selcontact, NULL) != -1) + hSelItem = (MCONTACT)pcli->pfnContactToHItem(selcontact); + AddContactToTree(hwnd, dat, wParam, 0, 0); + needsResort = 1; + recalcScrollBar = 1; + FindItem(hwnd, dat, wParam, &contact, NULL, NULL); + if (contact) { + contact->iImage = (WORD)lParam; + pcli->pfnNotifyNewContact(hwnd, wParam); + dat->needsResort = 1; + } + } + } + else { + //item in list already + DWORD style = GetWindowLongPtr(hwnd, GWL_STYLE); + if (contact->iImage == (WORD)lParam) break; + if (sortByStatus) dat->needsResort = 1; + + if (!shouldShow && !(style & CLS_NOHIDEOFFLINE) && (style & CLS_HIDEOFFLINE || group->hideOffline)) { + if (dat->selection >= 0 && GetRowByIndex(dat, dat->selection, &selcontact, NULL) != -1) + hSelItem = (MCONTACT)pcli->pfnContactToHItem(selcontact); + RemoveItemFromGroup(hwnd, group, contact, 0); + recalcScrollBar = 1; + dat->needsResort = 1; + } + else { + int oldflags; + contact->iImage = (WORD)lParam; + oldflags = contact->flags; + if (!pcli->pfnIsHiddenMode(dat, status) || cacheEntry->noHiddenOffline) contact->flags |= CONTACTF_ONLINE; + else contact->flags &= ~CONTACTF_ONLINE; + if (oldflags != contact->flags) + dat->needsResort = 1; + } + } + if (hSelItem) { + ClcGroup *selgroup; + if (FindItem(hwnd, dat, hSelItem, &selcontact, &selgroup, NULL)) + dat->selection = GetRowsPriorTo(&dat->list, selgroup, List_IndexOf((SortedList*)&selgroup->cl, selcontact)); + else + dat->selection = -1; + } + + SortClcByTimer(hwnd); + if (recalcScrollBar) RecalcScrollBar(hwnd, dat); + goto LBL_Exit; + } + case INTM_STATUSMSGCHANGED: + { + DBVARIANT dbv; + + if (!(dat->style & CLS_SHOWSTATUSMESSAGES)) + break; + + ClcContact *contact; + ClcGroup *group; + if (FindItem(hwnd, dat, wParam, &contact, &group, NULL) && contact != NULL) { + contact->flags &= ~CONTACTF_STATUSMSG; + if (!db_get_ts(wParam, "CList", "StatusMsg", &dbv)) { + int j; + if (dbv.ptszVal == NULL || _tcslen(dbv.ptszVal) == 0) break; + lstrcpyn(contact->szStatusMsg, dbv.ptszVal, SIZEOF(contact->szStatusMsg)); + for (j = (int)_tcslen(contact->szStatusMsg) - 1; j >= 0; j--) { + if (contact->szStatusMsg[j] == '\r' || contact->szStatusMsg[j] == '\n' || contact->szStatusMsg[j] == '\t') { + contact->szStatusMsg[j] = ' '; + } + } + db_free(&dbv); + if (contact->szStatusMsg[0] != 0) { + contact->flags |= CONTACTF_STATUSMSG; + dat->needsResort = TRUE; + } + } + } + + InvalidateRect(hwnd, NULL, TRUE); + + SortClcByTimer(hwnd); + RecalcScrollBar(hwnd, dat); + goto LBL_Exit; + } + + case WM_TIMER: + if (wParam == TIMERID_DELAYEDREPAINT) { + KillTimer(hwnd, TIMERID_DELAYEDREPAINT); + InvalidateRect(hwnd, NULL, FALSE); + break; + } + + if (wParam == TIMERID_SUBEXPAND) { + KillTimer(hwnd, TIMERID_SUBEXPAND); + if (hitcontact) { + if (hitcontact->SubExpanded) hitcontact->SubExpanded = 0; else hitcontact->SubExpanded = 1; + db_set_b(hitcontact->hContact, "CList", "Expanded", hitcontact->SubExpanded); + } + hitcontact = NULL; + dat->needsResort = 1; + SortCLC(hwnd, dat, 1); + RecalcScrollBar(hwnd, dat); + break; + } + break; + + case WM_DESTROY: + FreeDisplayNameCache(&dat->lCLCContactsCache); + stopStatusUpdater = 1; + break; + } + + LRESULT res = saveContactListControlWndProc(hwnd, msg, wParam, lParam); + switch (msg) { + case WM_CREATE: + mir_forkthread(StatusUpdaterThread, 0); + break; + } + return res; + +LBL_Exit: + return DefWindowProc(hwnd, msg, wParam, lParam); +} + +int LoadCLCModule(void) +{ + LoadCLUIFramesModule(); + + himlCListClc = (HIMAGELIST)CallService(MS_CLIST_GETICONSIMAGELIST, 0, 0); + + HookEvent(ME_SYSTEM_MODULESLOADED, ClcModulesLoaded); + hSettingChanged1 = HookEvent(ME_DB_CONTACT_SETTINGCHANGED, ClcSettingChanged); + HookEvent(ME_OPT_INITIALISE, ClcOptInit); + HookEvent(ME_SYSTEM_SHUTDOWN, ClcShutdown); + return 0; +} + +///////////////////////////////////////////////////////////////////////////////////////// + +static INT_PTR CLUIGetCapsService(WPARAM wParam, LPARAM lParam) +{ + switch (wParam) { + case CLUICAPS_FLAGS1: + return CLUIF_HIDEEMPTYGROUPS | CLUIF_DISABLEGROUPS | CLUIF_HASONTOPOPTION | CLUIF_HASAUTOHIDEOPTION; + case CLUICAPS_FLAGS2: + return MAKELONG(EXTRA_ICON_COUNT, 1); + } + return 0; +} + +int PreloadCLCModule() +{ + CreateServiceFunction(MS_CLUI_GETCAPS, CLUIGetCapsService); + return 0; +} diff --git a/plugins/!Deprecated/Clist_mw/src/clc.h b/plugins/!Deprecated/Clist_mw/src/clc.h new file mode 100644 index 0000000000..efc13fd87d --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/clc.h @@ -0,0 +1,148 @@ +/* + +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), +Copyright (c) 2000-03 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ +#ifndef _CLC_H_ +#define _CLC_H_ + +#define CLB_TOPLEFT 0 +#define CLB_STRETCHV 1 +#define CLB_STRETCHH 2 //and tile vertically +#define CLB_STRETCH 3 + +#define CLBM_TYPE 0x00FF + +#define CLBF_TILEH 0x1000 +#define CLBF_TILEV 0x2000 +#define CLBF_PROPORTIONAL 0x4000 +#define CLBF_SCROLL 0x8000 +#define CLBF_TILEVTOROWHEIGHT 0x0100 + +#define FONTID_CONTACTS 0 +#define FONTID_INVIS 1 +#define FONTID_OFFLINE 2 +#define FONTID_NOTONLIST 3 +#define FONTID_GROUPS 4 +#define FONTID_GROUPCOUNTS 5 +#define FONTID_DIVIDERS 6 +#define FONTID_OFFINVIS 7 +#define FONTID_STATUSMSG 8 +#define FONTID_GROUPSCLOSED 9 +#define FONTID_CONTACTSHOVER 10 + +#define TIMERID_DELAYEDREPAINT 16 +#define TIMERID_SUBEXPAND 21 + +#define CONTACTF_STATUSMSG 64 + +#define INTM_STATUSMSGCHANGED (WM_USER+26) + +#define CLS_SHOWSTATUSMESSAGES 0x800 + +#define CLS_EX_MULTICOLUMNALIGNLEFT 0x00001000 + +#define MAXSTATUSMSGLEN 256 + +struct ClcContact : public ClcContactBase +{ + ClcContact *subcontacts; + BYTE SubAllocated; + BYTE SubExpanded; + BYTE isSubcontact; + TCHAR szStatusMsg[MAXSTATUSMSGLEN]; +}; + +struct ClcData : public ClcDataBase +{ + DWORD style; + SortedList lCLCContactsCache; + BYTE doubleClickExpand; + int MetaIgnoreEmptyExtra; +}; + +//clcidents.c +int GetRowsPriorTo(ClcGroup *group,ClcGroup *subgroup,int contactIndex); +int FindItem(HWND hwnd, struct ClcData *dat, DWORD dwItem, struct ClcContact **contact, ClcGroup **subgroup, int *isVisible); +int GetRowByIndex(struct ClcData *dat,int testindex,struct ClcContact **contact,ClcGroup **subgroup); +void ClearRowByIndexCache(); + +//clcitems.c +ClcGroup *AddGroup(HWND hwnd,struct ClcData *dat,const TCHAR *szName,DWORD flags,int groupId,int calcTotalMembers); +void FreeGroup(ClcGroup *group); +int AddInfoItemToGroup(ClcGroup *group,int flags,const TCHAR *pszText); +void FreeContact(struct ClcContact *p); +void RebuildEntireList(HWND hwnd,struct ClcData *dat); +ClcGroup *RemoveItemFromGroup(HWND hwnd,ClcGroup *group,struct ClcContact *contact,int updateTotalCount); +void DeleteItemFromTree(HWND hwnd, MCONTACT hItem); +void AddContactToTree(HWND hwnd, struct ClcData *dat, MCONTACT hContact, int updateTotalCount, int checkHideOffline); +void SortCLC(HWND hwnd,struct ClcData *dat,int useInsertionSort); +int GetGroupContentsCount(ClcGroup *group,int visibleOnly); +int GetNewSelection(ClcGroup *group,int selection, int direction); +void SaveStateAndRebuildList(HWND hwnd,struct ClcData *dat); + +//clcmsgs.c +LRESULT ProcessExternalMessages(HWND hwnd,struct ClcData *dat,UINT msg,WPARAM wParam, LPARAM lParam); + +//clcutils.c +void RecalcScrollBar(HWND hwnd,struct ClcData *dat); +void BeginRenameSelection(HWND hwnd,struct ClcData *dat); +int HitTest(HWND hwnd,struct ClcData *dat,int testx,int testy,struct ClcContact **contact,ClcGroup **group,DWORD *flags); +void ScrollTo(HWND hwnd,struct ClcData *dat,int desty,int noSmooth); +void LoadClcOptions(HWND hwnd,struct ClcData *dat); + +//clcpaint.c +void PaintClc(HWND hwnd,struct ClcData *dat,HDC hdc,RECT *rcPaint); + +//clcopts.c +int ClcOptInit(WPARAM wParam, LPARAM lParam); + +//clcfiledrop.c +void InitFileDropping(void); +void FreeFileDropping(void); +void RegisterFileDropping(HWND hwnd); +void UnregisterFileDropping(HWND hwnd); + +//cluiservices.c +void FreeProtocolData( void ); + +int GetContactCachedStatus(MCONTACT hContact); +char *GetContactCachedProtocol(MCONTACT hContact); + +#define CLUI_SetDrawerService "CLUI/SETDRAWERSERVICE" +typedef struct { + int cbSize; + char *PluginName; + char *Comments; + char *GetDrawFuncsServiceName; + +} DrawerServiceStruct,*pDrawerServiceStruct ; + +#define CLUI_EXT_FUNC_PAINTCLC 1 + +typedef struct { + int cbSize; + void (*PaintClc)(HWND,struct ClcData *,HDC,RECT *,int ,ClcProtoStatus *,HIMAGELIST); +} ExternDrawer,*pExternDrawer ; + +extern ExternDrawer SED; + +#endif /* _CLC_H_ */ diff --git a/plugins/!Deprecated/Clist_mw/src/clcfonts.cpp b/plugins/!Deprecated/Clist_mw/src/clcfonts.cpp new file mode 100644 index 0000000000..de73ee3600 --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/clcfonts.cpp @@ -0,0 +1,117 @@ +/* + +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), +Copyright (c) 2000-10 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "commonheaders.h" + +struct +{ + const TCHAR *tszName; + int iMask; +} +static clistFontDescr[] = +{ + { LPGENT("Standard contacts"), FIDF_CLASSGENERAL }, + { LPGENT("Online contacts to whom you have a different visibility"), FIDF_CLASSGENERAL }, + { LPGENT("Offline contacts"), FIDF_CLASSGENERAL }, + { LPGENT("Contacts which are 'not on list'"), FIDF_CLASSGENERAL }, + { LPGENT("Groups"), FIDF_CLASSHEADER }, + { LPGENT("Group member counts"), FIDF_CLASSHEADER }, + { LPGENT("Dividers"), FIDF_CLASSSMALL }, + { LPGENT("Offline contacts to whom you have a different visibility"), FIDF_CLASSGENERAL }, + { LPGENT("Status messages"), FIDF_CLASSGENERAL }, + { LPGENT("Group closed"), FIDF_CLASSGENERAL }, + { LPGENT("Hovered contacts"), FIDF_CLASSGENERAL } +}; + +#define CLCDEFAULT_BKCOLOUR GetSysColor(COLOR_3DFACE) +#define CLCDEFAULT_SELTEXTCOLOUR GetSysColor(COLOR_HIGHLIGHTTEXT) + +static int FS_FontsChanged(WPARAM wParam, LPARAM lParam) +{ + pcli->pfnClcOptionsChanged(); + return 0; +} + +void RegisterCListFonts() +{ + FontIDT fontid = { sizeof(fontid) }; + fontid.flags = FIDF_DEFAULTVALID | FIDF_ALLOWREREGISTER | FIDF_APPENDNAME | FIDF_NOAS | FIDF_SAVEPOINTSIZE | FIDF_ALLOWEFFECTS; + strncpy(fontid.dbSettingsGroup, "CLC", sizeof(fontid.dbSettingsGroup)); + _tcsncpy(fontid.group, _T("Contact list"), SIZEOF(fontid.group)); + + HDC hdc = GetDC(NULL); + for (int i = 0; i < SIZEOF(clistFontDescr); i++) { + LOGFONT lf; + pcli->pfnGetFontSetting(i, &lf, &fontid.deffontsettings.colour); + lf.lfHeight = -MulDiv(lf.lfHeight, GetDeviceCaps(hdc, LOGPIXELSY), 72); + + _tcsncpy_s(fontid.deffontsettings.szFace, lf.lfFaceName, _TRUNCATE); + fontid.deffontsettings.charset = lf.lfCharSet; + fontid.deffontsettings.size = (char)lf.lfHeight; + fontid.deffontsettings.style = (lf.lfWeight >= FW_BOLD ? DBFONTF_BOLD : 0) | (lf.lfItalic ? DBFONTF_ITALIC : 0); + + fontid.flags &= ~FIDF_CLASSMASK; + fontid.flags |= clistFontDescr[i].iMask; + + _tcsncpy(fontid.name, clistFontDescr[i].tszName, SIZEOF(fontid.name)); + + char idstr[10]; + mir_snprintf(idstr, SIZEOF(idstr), "Font%d", i); + strncpy(fontid.prefix, idstr, SIZEOF(fontid.prefix)); + fontid.order = i; + FontRegisterT(&fontid); + } + ReleaseDC(NULL, hdc); + + // and colours + ColourIDT colourid = { sizeof(colourid) }; + colourid.order = 0; + strncpy(colourid.dbSettingsGroup, "CLC", sizeof(colourid.dbSettingsGroup)); + + strncpy(colourid.setting, "BkColour", sizeof(colourid.setting)); + _tcsncpy(colourid.name, LPGENT("Background"), SIZEOF(colourid.name)); + _tcsncpy(colourid.group, LPGENT("Contact list"), SIZEOF(colourid.group)); + colourid.defcolour = CLCDEFAULT_BKCOLOUR; + ColourRegisterT(&colourid); + + strncpy(colourid.setting, "SelTextColour", sizeof(colourid.setting)); + _tcsncpy(colourid.name, LPGENT("Selected text"), SIZEOF(colourid.name)); + colourid.order = 1; + colourid.defcolour = CLCDEFAULT_SELTEXTCOLOUR; + ColourRegisterT(&colourid); + + strncpy(colourid.setting, "HotTextColour", sizeof(colourid.setting)); + _tcsncpy(colourid.name, LPGENT("Hottrack text"), SIZEOF(colourid.name)); + colourid.order = 1; + colourid.defcolour = CLCDEFAULT_HOTTEXTCOLOUR; + ColourRegisterT(&colourid); + + strncpy(colourid.setting, "QuickSearchColour", sizeof(colourid.setting)); + _tcsncpy(colourid.name, LPGENT("Quicksearch text"), SIZEOF(colourid.name)); + colourid.order = 1; + colourid.defcolour = CLCDEFAULT_QUICKSEARCHCOLOUR; + ColourRegisterT(&colourid); + + HookEvent(ME_FONT_RELOAD, FS_FontsChanged); +} diff --git a/plugins/!Deprecated/Clist_mw/src/clcidents.cpp b/plugins/!Deprecated/Clist_mw/src/clcidents.cpp new file mode 100644 index 0000000000..c74a2d8bfb --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/clcidents.cpp @@ -0,0 +1,307 @@ +/* + +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), +Copyright (c) 2000-03 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ +#include "commonheaders.h" +#include "clc.h" + +/* the CLC uses 3 different ways to identify elements in its list, this file +contains routines to convert between them. + +1) struct ClcContact/ClcGroup pair. Only ever used within the duration +of a single operation, but used at some point in nearly everything +2) index integer. The 0-based number of the item from the top. Only visible +items are counted (ie not closed groups). Used for saving selection and drag +highlight +3) hItem handle. Either the hContact or (hGroup|HCONTACT_ISGROUP). Used +exclusively externally + +1->2: GetRowsPriorTo() +1->3: ContactToHItem() +3->1: FindItem() +2->1: GetRowByIndex() +*/ + +int GetRowsPriorTo(ClcGroup *group,ClcGroup *subgroup,int contactIndex) +{ + int count = 0; + + group->scanIndex = 0; + for (;;) { + if (group->scanIndex == group->cl.count) { + group = group->parent; + if (group == NULL) + break; + group->scanIndex++; + continue; + } + + if (group == subgroup && contactIndex == group->scanIndex) + return count; + + count++; + if ((group->cl.items[group->scanIndex]->type == CLCIT_CONTACT) && (group->cl.items[group->scanIndex]->flags & CONTACTF_STATUSMSG)) + count++; + + if (group->cl.items[group->scanIndex]->type == CLCIT_GROUP) { + if (group->cl.items[group->scanIndex]->group == subgroup && contactIndex == -1) + return count-1; + if (group->cl.items[group->scanIndex]->group->expanded) { + group = group->cl.items[group->scanIndex]->group; + group->scanIndex = 0; + continue; + } + } + + if (group->cl.items[group->scanIndex]->type == CLCIT_CONTACT) + count += group->cl.items[group->scanIndex]->SubAllocated*group->cl.items[group->scanIndex]->SubExpanded; + + group->scanIndex++; + } + return -1; +} + +ClcCacheEntry *GetCLCFullCacheEntry(struct ClcData *dat,MCONTACT hContact) +{ + if (hContact == 0) + return NULL; + + ClcCacheEntry dnce; + dnce.hContact = hContact; + ClcCacheEntry *pdnce = (ClcCacheEntry*)List_Find(&dat->lCLCContactsCache,&dnce); + if (pdnce == NULL) { + pdnce = (ClcCacheEntry*)mir_calloc(sizeof(ClcCacheEntry)); + pdnce->hContact = hContact; + + int idx; + List_GetIndex(&dat->lCLCContactsCache,pdnce,&idx); + List_Insert(&dat->lCLCContactsCache,pdnce,idx); + + ClcCacheEntry *pdnce2 = (ClcCacheEntry*)List_Find(&dat->lCLCContactsCache,&dnce);//for check + if (pdnce2->hContact != pdnce->hContact) + return NULL; + + if (pdnce2 != pdnce) + return NULL; + } + + return (pdnce); +} + +void ClearClcContactCache(struct ClcData *dat,MCONTACT hContact) +{ + ClcCacheEntry *cacheEntry; + + if (hContact == INVALID_CONTACT_ID) { + int i,tick; + tick = GetTickCount(); + + for (i = 0;i<(dat->lCLCContactsCache.realCount);i++) { + ClcCacheEntry *pdnce = (ClcCacheEntry *)dat->lCLCContactsCache.items[i]; + pdnce->ClcContact = NULL; + } + tick = GetTickCount()-tick; + { + char buf[256]; + mir_snprintf(buf, SIZEOF(buf), "Clear full cache %d ms\r\n", tick); + OutputDebugStringA(buf); + } + } + if ( !IsHContactGroup(hContact) && !IsHContactInfo(hContact)) { + cacheEntry = GetCLCFullCacheEntry(dat,hContact); + if (cacheEntry != NULL) + cacheEntry->ClcContact = NULL; + } +} + +void SetClcContactCacheItem(struct ClcData *dat, MCONTACT hContact, void *contact) +{ + ClcCacheEntry *cacheEntry; + if ( !IsHContactGroup(hContact) && !IsHContactInfo(hContact)) { + cacheEntry = GetCLCFullCacheEntry(dat,hContact); + if (cacheEntry != NULL) + cacheEntry->ClcContact = contact; + } +} + +int FindItem(HWND hwnd, struct ClcData *dat, DWORD dwItem, struct ClcContact **contact, ClcGroup **subgroup, int *isVisible) +{ + int index = 0, i; + int nowVisible = 1; + ClcGroup *group = &dat->list; + + group->scanIndex = 0; + + if (isVisible == NULL && dwItem != NULL && subgroup == NULL && !IsHContactGroup(dwItem) && !IsHContactInfo(dwItem)) { + //try use cache + ClcCacheEntry *cacheEntry = GetCLCFullCacheEntry(dat, dwItem); + if (cacheEntry != NULL) { + if (cacheEntry->ClcContact == NULL) { + int *isv = {0}; + void *z = {0}; + int ret; + ret = FindItem(hwnd,dat,dwItem,(struct ClcContact ** )&z,(struct ClcGroup** )&isv,NULL); + if (ret == 0) {return 0;} + cacheEntry->ClcContact = (void *)z; + } + + if (cacheEntry->ClcContact != NULL) { + if (contact != NULL) + *contact = (struct ClcContact *)cacheEntry->ClcContact; + + return 1; + } + } + } + + group = &dat->list; + + for (;;) { + if (group->scanIndex == group->cl.count) { + ClcGroup *tgroup; + group = group->parent; + if (group == NULL) + break; + + nowVisible = 1; + for (tgroup = group;tgroup;tgroup = tgroup->parent) + if ( !group->expanded) { + nowVisible = 0; + break; + } + + group->scanIndex++; + continue; + } + if (nowVisible) index++; + if ((IsHContactGroup(dwItem) && group->cl.items[group->scanIndex]->type == CLCIT_GROUP && (dwItem & ~HCONTACT_ISGROUP) == group->cl.items[group->scanIndex]->groupId) || + (IsHContactContact(dwItem) && group->cl.items[group->scanIndex]->type == CLCIT_CONTACT && group->cl.items[group->scanIndex]->hContact == dwItem) || + (IsHContactInfo(dwItem) && group->cl.items[group->scanIndex]->type == CLCIT_INFO && group->cl.items[group->scanIndex]->hContact == (dwItem & ~HCONTACT_ISINFO))) + { + if (isVisible) { + if ( !nowVisible) *isVisible = 0; + else { + if ((index+1)*dat->rowHeightyScroll) *isVisible = 0; + else { + RECT clRect; + GetClientRect(hwnd,&clRect); + if (index*dat->rowHeight>=dat->yScroll+clRect.bottom) *isVisible = 0; + else *isVisible = 1; + } } } + + if (contact) *contact = group->cl.items[group->scanIndex]; + if (subgroup) *subgroup = group; + return 1; + } + + if (group->cl.items[group->scanIndex]->type == CLCIT_CONTACT && + group->cl.items[group->scanIndex]->SubAllocated>0) + for (i = 1; i<=group->cl.items[group->scanIndex]->SubAllocated; i++) + if (IsHContactContact(dwItem) && group->cl.items[group->scanIndex]->subcontacts[i-1].hContact == dwItem) { + if (contact) *contact = &group->cl.items[group->scanIndex]->subcontacts[i-1]; + if (subgroup) *subgroup = group; + return 1; + } + + if (group->cl.items[group->scanIndex]->type == CLCIT_GROUP) { + ClcGroup* save = group; + group = group->cl.items[group->scanIndex]->group; + group->scanIndex = 0; + nowVisible &= group->expanded; + continue; + } + group->scanIndex++; + } + + if (isVisible) *isVisible = FALSE; + if (contact) *contact = NULL; + if (subgroup) *subgroup = NULL; + return 0; +} +#define CacheArrSize 255 +ClcGroup *CacheIndex[CacheArrSize] = {NULL}; +boolean CacheIndexClear = TRUE; +void ClearRowByIndexCache() +{ + if ( !CacheIndexClear) { + memset(CacheIndex,0,sizeof(CacheIndex)); + CacheIndexClear = TRUE; + } +} + +int GetRowByIndex(struct ClcData *dat,int testindex,struct ClcContact **contact,ClcGroup **subgroup) +{ + int index = 0,i; + ClcGroup *group = &dat->list; + + if (testindex < 0) return -1; + + group->scanIndex = 0; + for (;;) { + if (group->scanIndex == group->cl.count) { + group = group->parent; + if (group == NULL) break; + group->scanIndex++; + continue; + } + if ((index>0) && (indexcl.items[group->scanIndex]; + if (subgroup) *subgroup = group; + return index; + } + + if (group->cl.items[group->scanIndex]->type == CLCIT_CONTACT) + if (group->cl.items[group->scanIndex]->SubAllocated) + if (group->cl.items[group->scanIndex]->SubExpanded) { + for (i = 0;icl.items[group->scanIndex]->SubAllocated;i++) { + if ((index>0) && (indexcl.items[group->scanIndex]->subcontacts[i]; + if (subgroup) *subgroup = group; + return index; + } + } + } + + index++; + if ((group->cl.items[group->scanIndex]->type == CLCIT_CONTACT) && (group->cl.items[group->scanIndex]->flags & CONTACTF_STATUSMSG)) + index++; + + if (group->cl.items[group->scanIndex]->type == CLCIT_GROUP && group->cl.items[group->scanIndex]->group->expanded) { + group = group->cl.items[group->scanIndex]->group; + group->scanIndex = 0; + continue; + } + group->scanIndex++; + } + return -1; +} diff --git a/plugins/!Deprecated/Clist_mw/src/clcitems.cpp b/plugins/!Deprecated/Clist_mw/src/clcitems.cpp new file mode 100644 index 0000000000..0e67a18318 --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/clcitems.cpp @@ -0,0 +1,685 @@ +/* + +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), +Copyright (c) 2000-03 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "commonheaders.h" +#include "clc.h" +#include "clist.h" +#include "m_metacontacts.h" + + +extern int ( *saveAddItemToGroup )( ClcGroup *group, int iAboveItem ); +extern int ( *saveAddInfoItemToGroup )(ClcGroup *group,int flags,const TCHAR *pszText); +extern ClcGroup* ( *saveAddGroup )(HWND hwnd,struct ClcData *dat,const TCHAR *szName,DWORD flags,int groupId,int calcTotalMembers); +extern void (*saveFreeContact)(struct ClcContact *p); +extern void (*saveFreeGroup)(ClcGroup *p); + +//routines for managing adding/removal of items in the list, including sorting + +extern void ClearClcContactCache(struct ClcData *dat,MCONTACT hContact); + +void AddSubcontacts(struct ClcContact * cont) +{ + int subcount,i,j; + ClcCacheEntry *cacheEntry; + cacheEntry = GetContactFullCacheEntry(cont->hContact); + OutputDebugStringA("Proceed AddSubcontacts\r\n"); + subcount = db_mc_getSubCount(cont->hContact); + cont->SubExpanded = db_get_b(cont->hContact,"CList","Expanded",0); + cont->isSubcontact = 0; + cont->subcontacts = (struct ClcContact *) mir_realloc(cont->subcontacts, sizeof(struct ClcContact)*subcount); + cont->SubAllocated = subcount; + i = 0; + for (j = 0; jhContact, j); + cacheEntry = GetContactFullCacheEntry(hsub); + if ( !(db_get_b(NULL,"CLC","MetaHideOfflineSub",1) && db_get_b(NULL, "CList", "HideOffline", SETTING_HIDEOFFLINE_DEFAULT)) || + cacheEntry->status != ID_STATUS_OFFLINE ) + { + cont->subcontacts[i].hContact = cacheEntry->hContact; + cont->subcontacts[i].iImage = pcli->pfnGetContactIcon(cacheEntry->hContact); + memset(cont->subcontacts[i].iExtraImage, 0xFF, sizeof(cont->subcontacts[i].iExtraImage)); + cont->subcontacts[i].proto = cacheEntry->szProto; + lstrcpyn(cont->subcontacts[i].szText,cacheEntry->tszName,SIZEOF(cont->subcontacts[i].szText)); + cont->subcontacts[i].type = CLCIT_CONTACT; + //cont->flags = 0;//CONTACTF_ONLINE; + cont->subcontacts[i].isSubcontact = 1; + i++; + } + } + cont->SubAllocated = i; + if (i == 0) + mir_free(cont->subcontacts); +} + +void FreeContact(struct ClcContact *p) +{ + if ( p->SubAllocated && !p->isSubcontact) + mir_free(p->subcontacts); + + saveFreeContact( p ); +} + +int AddItemToGroup(ClcGroup *group,int iAboveItem) +{ + iAboveItem = saveAddItemToGroup( group, iAboveItem ); + ClearRowByIndexCache(); + return iAboveItem; +} + +ClcGroup *AddGroup(HWND hwnd,struct ClcData *dat,const TCHAR *szName,DWORD flags,int groupId,int calcTotalMembers) +{ + ClearRowByIndexCache(); + dat->needsResort = 1; + ClcGroup *result = saveAddGroup( hwnd, dat, szName, flags, groupId, calcTotalMembers); + ClearRowByIndexCache(); + return result; +} + +void FreeGroup(ClcGroup *group) +{ + saveFreeGroup( group ); + ClearRowByIndexCache(); +} + +int AddInfoItemToGroup(ClcGroup *group,int flags,const TCHAR *pszText) +{ + int i = saveAddInfoItemToGroup( group, flags, pszText ); + ClearRowByIndexCache(); + return i; +} + +static struct ClcContact* AddContactToGroup(struct ClcData *dat,ClcGroup *group,ClcCacheEntry *cacheEntry) +{ + char *szProto; + WORD apparentMode; + DWORD idleMode; + MCONTACT hContact; + DBVARIANT dbv; + int i; + int img = -1; + int basicIcon = 0; + + if (cacheEntry == NULL || group == NULL || dat == NULL) + return NULL; + + hContact = cacheEntry->hContact; + + dat->needsResort = 1; + for (i = group->cl.count-1;i>=0;i--) + if (group->cl.items[i]->type != CLCIT_INFO || !(group->cl.items[i]->flags&CLCIIF_BELOWCONTACTS)) break; + i = AddItemToGroup(group,i+1); + group->cl.items[i]->type = CLCIT_CONTACT; + group->cl.items[i]->SubAllocated = 0; + group->cl.items[i]->isSubcontact = 0; + group->cl.items[i]->subcontacts = NULL; + + if (ProtoServiceExists(cacheEntry->szProto, PS_GETADVANCEDSTATUSICON)) + img = ProtoCallService(cacheEntry->szProto, PS_GETADVANCEDSTATUSICON, hContact, 0); + + if (img == -1 || !(LOWORD(img))) + img = pcli->pfnGetContactIcon(hContact); + + group->cl.items[i]->iImage = img; + + cacheEntry = GetContactFullCacheEntry(hContact); + group->cl.items[i]->hContact = hContact; + + //cacheEntry->ClcContact = &(group->cl.items[i]); + //SetClcContactCacheItem(dat,hContact,&(group->cl.items[i])); + + szProto = cacheEntry->szProto; + if (szProto != NULL && !pcli->pfnIsHiddenMode(dat,cacheEntry->status)) + group->cl.items[i]->flags |= CONTACTF_ONLINE; + apparentMode = szProto != NULL?cacheEntry->ApparentMode:0; + if (apparentMode == ID_STATUS_OFFLINE) group->cl.items[i]->flags |= CONTACTF_INVISTO; + else if (apparentMode == ID_STATUS_ONLINE) group->cl.items[i]->flags |= CONTACTF_VISTO; + else if (apparentMode) group->cl.items[i]->flags |= CONTACTF_VISTO|CONTACTF_INVISTO; + if (cacheEntry->NotOnList) group->cl.items[i]->flags |= CONTACTF_NOTONLIST; + idleMode = szProto != NULL?cacheEntry->IdleTS:0; + if (idleMode) group->cl.items[i]->flags |= CONTACTF_IDLE; + + lstrcpyn(group->cl.items[i]->szText,cacheEntry->tszName, SIZEOF(group->cl.items[i]->szText)); + group->cl.items[i]->proto = szProto; + + if (dat->style & CLS_SHOWSTATUSMESSAGES) { + if ( !db_get_ts(hContact, "CList", "StatusMsg", &dbv)) { + int j; + lstrcpyn(group->cl.items[i]->szStatusMsg, dbv.ptszVal, SIZEOF(group->cl.items[i]->szStatusMsg)); + for (j = (int)_tcslen(group->cl.items[i]->szStatusMsg)-1;j>=0;j--) { + if (group->cl.items[i]->szStatusMsg[j] == '\r' || group->cl.items[i]->szStatusMsg[j] == '\n' || group->cl.items[i]->szStatusMsg[j] == '\t') { + group->cl.items[i]->szStatusMsg[j] = ' '; + } + } + db_free(&dbv); + if (group->cl.items[i]->szStatusMsg[0] != 0) { + group->cl.items[i]->flags |= CONTACTF_STATUSMSG; + } + } + } + + ClearRowByIndexCache(); + return group->cl.items[i]; +} + +void AddContactToTree(HWND hwnd, ClcData *dat, MCONTACT hContact, int updateTotalCount, int checkHideOffline) +{ + if (FindItem(hwnd, dat, hContact, NULL, NULL, NULL) == 1) + return; + + ClcCacheEntry *cacheEntry = GetContactFullCacheEntry(hContact); + if (cacheEntry == NULL) + return; + + char *szProto = cacheEntry->szProto; + + dat->needsResort = 1; + ClearRowByIndexCache(); + ClearClcContactCache(dat,hContact); + + WORD status; + DWORD style = GetWindowLongPtr(hwnd,GWL_STYLE); + if (style & CLS_NOHIDEOFFLINE) checkHideOffline = 0; + if (checkHideOffline) { + if (szProto == NULL) status = ID_STATUS_OFFLINE; + else status = cacheEntry->status; + } + + ClcGroup *group; + if (lstrlen(cacheEntry->tszGroup) == 0) + group = &dat->list; + else { + group = AddGroup(hwnd,dat,cacheEntry->tszGroup,(DWORD)-1,0,0); + if (group == NULL) { + DWORD groupFlags; + int i; + if ( !(style & CLS_HIDEEMPTYGROUPS)) + return; + + if (checkHideOffline && pcli->pfnIsHiddenMode(dat,status)) { + for (i = 1;;i++) { + TCHAR *szGroupName = pcli->pfnGetGroupName(i, &groupFlags); + if (szGroupName == NULL) + return; //never happens + if ( !lstrcmp(szGroupName,cacheEntry->tszGroup)) + break; + } + if (groupFlags & GROUPF_HIDEOFFLINE) + return; + } + for (i = 1;; i++) { + TCHAR *szGroupName = pcli->pfnGetGroupName(i, &groupFlags); + if (szGroupName == NULL) + return; //never happens + if ( !lstrcmp(szGroupName,cacheEntry->tszGroup)) + break; + size_t len = lstrlen(szGroupName); + if ( !_tcsncmp(szGroupName,cacheEntry->tszGroup,len) && cacheEntry->tszGroup[len] == '\\') + AddGroup(hwnd,dat,szGroupName,groupFlags,i,1); + } + group = AddGroup(hwnd,dat,cacheEntry->tszGroup,groupFlags,i,1); + } + } + + if (checkHideOffline) { + if (pcli->pfnIsHiddenMode(dat,status) && (style & CLS_HIDEOFFLINE || group->hideOffline)) { + if (updateTotalCount) group->totalMembers++; + return; + } + } + + ClcContact *cont = AddContactToGroup(dat, group, cacheEntry); + if (cont && cont->proto) { + cont->SubAllocated = 0; + if (strcmp(cont->proto, META_PROTO) == 0) + AddSubcontacts(cont); + } + if (updateTotalCount) + group->totalMembers++; + ClearRowByIndexCache(); +} + +extern ClcGroup* ( *saveRemoveItemFromGroup )(HWND hwnd,ClcGroup *group,struct ClcContact *contact,int updateTotalCount); + +ClcGroup *RemoveItemFromGroup(HWND hwnd,ClcGroup *group,struct ClcContact *contact,int updateTotalCount) +{ + ClearRowByIndexCache(); + if (contact->type == CLCIT_CONTACT) { + struct ClcData* dat = (struct ClcData*)GetWindowLongPtr(hwnd,0); + ClearClcContactCache(dat,contact->hContact); + } + + group = saveRemoveItemFromGroup(hwnd, group, contact, updateTotalCount); + + ClearRowByIndexCache(); + return group; +} + +void DeleteItemFromTree(HWND hwnd, MCONTACT hItem) +{ + struct ClcContact *contact; + ClcGroup *group; + struct ClcData *dat = (struct ClcData*)GetWindowLongPtr(hwnd,0); + + ClearRowByIndexCache(); + dat->needsResort = 1; + + if (!FindItem(hwnd, dat, hItem, &contact, &group, NULL)) { + DBVARIANT dbv; + int i,nameOffset; + if ( !IsHContactContact(hItem)) return; + ClearClcContactCache(dat,hItem); + + if (db_get_ts(hItem,"CList","Group",&dbv)) return; + + //decrease member counts of all parent groups too + group = &dat->list; + nameOffset = 0; + for (i = 0;;i++) { + if (group->scanIndex == group->cl.count) + break; + + if (group->cl.items[i]->type == CLCIT_GROUP) { + int len = lstrlen(group->cl.items[i]->szText); + if ( !_tcsncmp(group->cl.items[i]->szText,dbv.ptszVal+nameOffset,len) && (dbv.ptszVal[nameOffset+len] == '\\' || dbv.pszVal[nameOffset+len] == '\0')) { + group->totalMembers--; + if (dbv.pszVal[nameOffset+len] == '\0') + break; + } + } + } + mir_free(dbv.pszVal); + } + else RemoveItemFromGroup(hwnd,group,contact,1); + + ClearRowByIndexCache(); +} + + + +void RebuildEntireList(HWND hwnd,struct ClcData *dat) +{ +// char *szProto; + DWORD style = GetWindowLongPtr(hwnd,GWL_STYLE); + struct ClcContact * cont; + ClcGroup *group; + //DBVARIANT dbv; + int tick = GetTickCount(); + + ClearRowByIndexCache(); + ClearClcContactCache(dat, INVALID_CONTACT_ID); + + dat->list.expanded = 1; + dat->list.hideOffline = db_get_b(NULL,"CLC","HideOfflineRoot",0); + memset( &dat->list.cl, 0, sizeof( dat->list.cl )); + dat->list.cl.increment = 30; + dat->needsResort = 1; + dat->selection = -1; + { + int i; + TCHAR *szGroupName; + DWORD groupFlags; + + for (i = 1;;i++) { + szGroupName = pcli->pfnGetGroupName(i,&groupFlags); + if (szGroupName == NULL) + break; + + AddGroup(hwnd,dat,szGroupName,groupFlags,i,0); + } + } + + for (MCONTACT hContact = db_find_first(); hContact; hContact = db_find_next(hContact)) { + ClcCacheEntry *cacheEntry; + cont = NULL; + cacheEntry = GetContactFullCacheEntry(hContact); + //cacheEntry->ClcContact = NULL; + ClearClcContactCache(dat,hContact); + if (cacheEntry == NULL) + MessageBoxA(0,"Fail To Get CacheEntry for hContact","!!!!!!!!",0); + + if (style&CLS_SHOWHIDDEN || !cacheEntry->bIsHidden) { + if (lstrlen(cacheEntry->tszGroup) == 0) + group = &dat->list; + else { + group = AddGroup(hwnd,dat,cacheEntry->tszGroup,(DWORD)-1,0,0); + //mir_free(dbv.pszVal); + } + + if (group != NULL) { + group->totalMembers++; + if ( !(style & CLS_NOHIDEOFFLINE) && (style & CLS_HIDEOFFLINE || group->hideOffline)) { + if (cacheEntry->szProto == NULL) { + if ( !pcli->pfnIsHiddenMode(dat,ID_STATUS_OFFLINE)||cacheEntry->noHiddenOffline) + cont = AddContactToGroup(dat,group,cacheEntry); + } + else if ( !pcli->pfnIsHiddenMode(dat,cacheEntry->status)||cacheEntry->noHiddenOffline) + cont = AddContactToGroup(dat,group,cacheEntry); + } + else cont = AddContactToGroup(dat,group,cacheEntry); + } + } + if (cont && cont->proto) { + cont->SubAllocated = 0; + if (strcmp(cont->proto, META_PROTO) == 0) + AddSubcontacts(cont); + } + } + + if (style&CLS_HIDEEMPTYGROUPS) { + group = &dat->list; + group->scanIndex = 0; + for (;;) { + if (group->scanIndex == group->cl.count) { + group = group->parent; + if (group == NULL) + break; + } + else if (group->cl.items[group->scanIndex]->type == CLCIT_GROUP) { + if (group->cl.items[group->scanIndex]->group->cl.count == 0) { + group = RemoveItemFromGroup(hwnd,group,group->cl.items[group->scanIndex],0); + } + else { + group = group->cl.items[group->scanIndex]->group; + group->scanIndex = 0; + } + continue; + } + group->scanIndex++; + } + } + + SortCLC(hwnd,dat,0); + tick = GetTickCount()-tick; + { + char buf[255]; + //sprintf(buf,"%s %s took %i ms",__FILE__,__LINE__,tick); + mir_snprintf(buf, SIZEOF(buf), "RebuildEntireList %d \r\n", tick); + + OutputDebugStringA(buf); + db_set_dw(0,"CLUI","PF:Last RebuildEntireList Time:",tick); + } +} + + +int GetNewSelection(ClcGroup *group, int selection, int direction) +{ + int lastcount = 0, count = 0;//group->cl.count; + ClcGroup *topgroup = group; + if (selection<0) { + return 0; + } + group->scanIndex = 0; + for (;;) { + if (group->scanIndex == group->cl.count) { + group = group->parent; + if (group == NULL) + break; + + group->scanIndex++; + continue; + } + if (count>=selection) return count; + lastcount = count; + count++; + if ((group->cl.items[group->scanIndex]->type == CLCIT_CONTACT) && (group->cl.items[group->scanIndex]->flags & CONTACTF_STATUSMSG)) { + count++; + } + if ( !direction) { + if (count>selection) return lastcount; + } + if (group->cl.items[group->scanIndex]->type == CLCIT_GROUP && (group->cl.items[group->scanIndex]->group->expanded)) { + group = group->cl.items[group->scanIndex]->group; + group->scanIndex = 0; + continue; + } + group->scanIndex++; + } + return lastcount; + } + +int GetGroupContentsCount(ClcGroup *group,int visibleOnly) +{ + int count = 0;//group->cl.count; + ClcGroup *topgroup = group; + + group->scanIndex = 0; + for (;;) { + if (group->scanIndex == group->cl.count) { + if (group == topgroup) break; + group = group->parent; + group->scanIndex++; + continue; + } + + count++; + if ((group->cl.items[group->scanIndex]->type == CLCIT_CONTACT) && (group->cl.items[group->scanIndex]->flags & CONTACTF_STATUSMSG)) + count++; + + if (group->cl.items[group->scanIndex]->type == CLCIT_GROUP && (!visibleOnly || group->cl.items[group->scanIndex]->group->expanded)) { + group = group->cl.items[group->scanIndex]->group; + group->scanIndex = 0; + continue; + } + group->scanIndex++; + } + return count; +} + +extern void ( *saveSortCLC )(HWND hwnd,struct ClcData *dat,int useInsertionSort); + +void SortCLC(HWND hwnd,struct ClcData *dat,int useInsertionSort) +{ +#ifdef _DEBUG + DWORD tick = GetTickCount(); +#endif + int oldSort = dat->needsResort; + saveSortCLC(hwnd, dat, useInsertionSort); + if ( oldSort ) + ClearRowByIndexCache(); + +#ifdef _DEBUG + { + char buf[255]; + //sprintf(buf,"%s %s took %i ms",__FILE__,__LINE__,tick); + tick = GetTickCount()-tick; + if (tick > 5) { + mir_snprintf(buf, SIZEOF(buf), "SortCLC %d \r\n", tick); + OutputDebugStringA(buf); + db_set_dw(0,"CLUI","PF:Last SortCLC Time:",tick); + } + } +#endif +} + +struct SavedContactState_t +{ + MCONTACT hContact; + WORD iExtraImage[EXTRA_ICON_COUNT]; + int checked; +}; + +struct SavedGroupState_t +{ + int groupId, expanded; +}; + +struct SavedInfoState_t +{ + int parentId; + struct ClcContact contact; +}; + +void SaveStateAndRebuildList(HWND hwnd,struct ClcData *dat) +{ + NMCLISTCONTROL nm; + int i,j; + struct SavedGroupState_t *savedGroup = NULL; + int savedGroupCount = 0,savedGroupAlloced = 0; + struct SavedContactState_t *savedContact = NULL; + int savedContactCount = 0,savedContactAlloced = 0; + struct SavedInfoState_t *savedInfo = NULL; + int savedInfoCount = 0,savedInfoAlloced = 0; + ClcGroup *group; + struct ClcContact *contact; + + int tick = GetTickCount(); + int allocstep = 1024; + pcli->pfnHideInfoTip(hwnd,dat); + KillTimer(hwnd,TIMERID_INFOTIP); + KillTimer(hwnd,TIMERID_RENAME); + pcli->pfnEndRename(hwnd,dat,1); + + group = &dat->list; + group->scanIndex = 0; + for (;;) { + if (group->scanIndex == group->cl.count) { + group = group->parent; + if (group == NULL) + break; + } + else if (group->cl.items[group->scanIndex]->type == CLCIT_GROUP) { + group = group->cl.items[group->scanIndex]->group; + group->scanIndex = 0; + if (++savedGroupCount>savedGroupAlloced) { + savedGroupAlloced += allocstep; + savedGroup = (struct SavedGroupState_t*)mir_realloc(savedGroup,sizeof(struct SavedGroupState_t)*savedGroupAlloced); + } + savedGroup[savedGroupCount-1].groupId = group->groupId; + savedGroup[savedGroupCount-1].expanded = group->expanded; + continue; + } + else if (group->cl.items[group->scanIndex]->type == CLCIT_CONTACT) { + if (++savedContactCount>savedContactAlloced) { + savedContactAlloced += allocstep; + savedContact = (struct SavedContactState_t*)mir_realloc(savedContact,sizeof(struct SavedContactState_t)*savedContactAlloced); + } + savedContact[savedContactCount-1].hContact = group->cl.items[group->scanIndex]->hContact; + memcpy(savedContact[savedContactCount-1].iExtraImage, group->cl.items[group->scanIndex]->iExtraImage, sizeof(contact->iExtraImage)); + savedContact[savedContactCount-1].checked = group->cl.items[group->scanIndex]->flags & CONTACTF_CHECKED; + if (group->cl.items[group->scanIndex]->SubAllocated>0) + { + int l; + for (l = 0; lcl.items[group->scanIndex]->SubAllocated; l++) + { + if (++savedContactCount>savedContactAlloced) { + savedContactAlloced += allocstep; + savedContact = (struct SavedContactState_t*)mir_realloc(savedContact,sizeof(struct SavedContactState_t)*savedContactAlloced); + } + savedContact[savedContactCount-1].hContact = group->cl.items[group->scanIndex]->subcontacts[l].hContact; + memcpy(savedContact[savedContactCount-1].iExtraImage, group->cl.items[group->scanIndex]->subcontacts[l].iExtraImage, sizeof(contact->iExtraImage)); + savedContact[savedContactCount-1].checked = group->cl.items[group->scanIndex]->subcontacts[l].flags&CONTACTF_CHECKED; + } + } + } + else if (group->cl.items[group->scanIndex]->type == CLCIT_INFO) { + if (++savedInfoCount>savedInfoAlloced) { + savedInfoAlloced += allocstep; + savedInfo = (struct SavedInfoState_t*)mir_realloc(savedInfo,sizeof(struct SavedInfoState_t)*savedInfoAlloced); + } + if (group->parent == NULL) + savedInfo[savedInfoCount-1].parentId = -1; + else + savedInfo[savedInfoCount-1].parentId = group->groupId; + savedInfo[savedInfoCount-1].contact = *group->cl.items[group->scanIndex]; + } + group->scanIndex++; + } + + pcli->pfnFreeGroup(&dat->list); + RebuildEntireList(hwnd,dat); + + group = &dat->list; + group->scanIndex = 0; + for (;;) { + if (group->scanIndex == group->cl.count) { + group = group->parent; + if (group == NULL) + break; + } + else if (group->cl.items[group->scanIndex]->type == CLCIT_GROUP) { + group = group->cl.items[group->scanIndex]->group; + group->scanIndex = 0; + for (i = 0;igroupId) { + group->expanded = savedGroup[i].expanded; + break; + } + continue; + } + else if (group->cl.items[group->scanIndex]->type == CLCIT_CONTACT) { + for (i = 0;icl.items[group->scanIndex]->hContact) { + memcpy(group->cl.items[group->scanIndex]->iExtraImage, savedContact[i].iExtraImage, sizeof(contact->iExtraImage)); + if (savedContact[i].checked) + group->cl.items[group->scanIndex]->flags |= CONTACTF_CHECKED; + break; + } + if (group->cl.items[group->scanIndex]->SubAllocated>0) + { + for (int l = 0; lcl.items[group->scanIndex]->SubAllocated; l++) + for (i = 0;icl.items[group->scanIndex]->subcontacts[l].hContact) { + memcpy(group->cl.items[group->scanIndex]->subcontacts[l].iExtraImage, savedContact[i].iExtraImage, sizeof(contact->iExtraImage)); + if (savedContact[i].checked) + group->cl.items[group->scanIndex]->subcontacts[l].flags |= CONTACTF_CHECKED; + break; + } + } + } + group->scanIndex++; + } + if (savedGroup) mir_free(savedGroup); + if (savedContact) mir_free(savedContact); + for (i = 0;ilist; + else { + if (!FindItem(hwnd, dat, savedInfo[i].parentId | HCONTACT_ISGROUP, &contact, NULL, NULL)) + continue; + group = contact->group; + } + j = AddInfoItemToGroup(group,savedInfo[i].contact.flags,_T("")); + *group->cl.items[j] = savedInfo[i].contact; + } + if (savedInfo) mir_free(savedInfo); + pcli->pfnRecalculateGroupCheckboxes(hwnd,dat); + + RecalcScrollBar(hwnd,dat); + nm.hdr.code = CLN_LISTREBUILT; + nm.hdr.hwndFrom = hwnd; + nm.hdr.idFrom = GetDlgCtrlID(hwnd); + + + //srand(GetTickCount()); + + tick = GetTickCount()-tick; + { + char buf[255]; + //sprintf(buf,"%s %s took %i ms",__FILE__,__LINE__,tick); + mir_snprintf(buf, SIZEOF(buf), "SaveStateAndRebuildList %d \r\n", tick); + + OutputDebugStringA(buf); + } + ClearRowByIndexCache(); + SendMessage(GetParent(hwnd),WM_NOTIFY,0,(LPARAM)&nm); +} diff --git a/plugins/!Deprecated/Clist_mw/src/clcopts.cpp b/plugins/!Deprecated/Clist_mw/src/clcopts.cpp new file mode 100644 index 0000000000..2ce7736a7a --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/clcopts.cpp @@ -0,0 +1,548 @@ +/* + +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), +Copyright (c) 2000-03 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "commonheaders.h" +#include "clc.h" + +#define DBFONTF_BOLD 1 +#define DBFONTF_ITALIC 2 +#define DBFONTF_UNDERLINE 4 + +static INT_PTR CALLBACK DlgProcClcMainOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); +static INT_PTR CALLBACK DlgProcClcMetaOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); +static INT_PTR CALLBACK DlgProcClcBkgOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); + +static INT_PTR CALLBACK DlgProcStatusBarBkgOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); +int OnStatusBarBackgroundChange(); + +int BgClcChange(WPARAM wParam, LPARAM lParam) +{ + pcli->pfnClcOptionsChanged(); + return 0; +} + +int BgStatusBarChange(WPARAM wParam, LPARAM lParam) +{ + pcli->pfnClcOptionsChanged(); + OnStatusBarBackgroundChange(); + return 0; +} + +int ClcOptInit(WPARAM wParam, LPARAM lParam) +{ + OPTIONSDIALOGPAGE odp = { sizeof(odp) }; + odp.hInstance = g_hInst; + odp.pszGroup = LPGEN("Contact list"); + odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_CLC); + odp.pszTitle = LPGEN("List"); + odp.pfnDlgProc = DlgProcClcMainOpts; + odp.flags = ODPF_BOLDGROUPS; + Options_AddPage(wParam, &odp); + + if (!ServiceExists(MS_BACKGROUNDCONFIG_REGISTER)) { + odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_CLCBKG); + odp.pszTitle = LPGEN("List background"); + odp.pfnDlgProc = DlgProcClcBkgOpts; + odp.flags = ODPF_BOLDGROUPS; + Options_AddPage(wParam, &odp); + } + + odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_META_CLC); + odp.pszTitle = LPGEN("List metacontacts"); + odp.pfnDlgProc = DlgProcClcMetaOpts; + Options_AddPage(wParam, &odp); + + if (!ServiceExists(MS_BACKGROUNDCONFIG_REGISTER)) { + odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_CLCBKG); + odp.pszTitle = LPGEN("Status bar background"); + odp.pfnDlgProc = DlgProcStatusBarBkgOpts; + odp.flags = ODPF_BOLDGROUPS; + Options_AddPage(wParam, &odp); + } + + return 0; +} + +struct CheckBoxToStyleEx_t { + int id; + DWORD flag; + int not; +} static const checkBoxToStyleEx[] = { + {IDC_DISABLEDRAGDROP,CLS_EX_DISABLEDRAGDROP,0}, + {IDC_NOTEDITLABELS,CLS_EX_EDITLABELS,1}, + {IDC_SHOWSELALWAYS,CLS_EX_SHOWSELALWAYS,0}, + {IDC_TRACKSELECT,CLS_EX_TRACKSELECT,0}, + {IDC_SHOWGROUPCOUNTS,CLS_EX_SHOWGROUPCOUNTS,0}, + {IDC_HIDECOUNTSWHENEMPTY,CLS_EX_HIDECOUNTSWHENEMPTY,0}, + {IDC_DIVIDERONOFF,CLS_EX_DIVIDERONOFF,0}, + {IDC_NOTNOTRANSLUCENTSEL,CLS_EX_NOTRANSLUCENTSEL,1}, + {IDC_LINEWITHGROUPS,CLS_EX_LINEWITHGROUPS,0}, + {IDC_QUICKSEARCHVISONLY,CLS_EX_QUICKSEARCHVISONLY,0}, + {IDC_SORTGROUPSALPHA,CLS_EX_SORTGROUPSALPHA,0}, + {IDC_NOTNOSMOOTHSCROLLING,CLS_EX_NOSMOOTHSCROLLING,1}}; + +struct CheckBoxValues_t { + DWORD style; + TCHAR *szDescr; +}; +static const struct CheckBoxValues_t greyoutValues[] = +{ + {GREYF_UNFOCUS, LPGENT("Not focused") }, + {MODEF_OFFLINE, LPGENT("Offline") }, + {PF2_ONLINE, LPGENT("Online") }, + {PF2_SHORTAWAY, LPGENT("Away") }, + {PF2_LONGAWAY, LPGENT("NA") }, + {PF2_LIGHTDND, LPGENT("Occupied") }, + {PF2_HEAVYDND, LPGENT("DND") }, + {PF2_FREECHAT, LPGENT("Free for chat") }, + {PF2_INVISIBLE, LPGENT("Invisible") }, + {PF2_OUTTOLUNCH, LPGENT("Out to lunch") }, + {PF2_ONTHEPHONE, LPGENT("On the phone") } +}; + +static const struct CheckBoxValues_t offlineValues[] = +{ + {MODEF_OFFLINE, LPGENT("Offline") }, + {PF2_ONLINE, LPGENT("Online") }, + {PF2_SHORTAWAY, LPGENT("Away") }, + {PF2_LONGAWAY, LPGENT("NA") }, + {PF2_LIGHTDND, LPGENT("Occupied") }, + {PF2_HEAVYDND, LPGENT("DND") }, + {PF2_FREECHAT, LPGENT("Free for chat") }, + {PF2_INVISIBLE, LPGENT("Invisible") }, + {PF2_OUTTOLUNCH, LPGENT("Out to lunch") }, + {PF2_ONTHEPHONE, LPGENT("On the phone") } +}; + +static void FillCheckBoxTree(HWND hwndTree,const struct CheckBoxValues_t *values,int nValues,DWORD style) +{ + TVINSERTSTRUCT tvis; + int i; + + tvis.hParent = NULL; + tvis.hInsertAfter = TVI_LAST; + tvis.item.mask = TVIF_PARAM|TVIF_TEXT|TVIF_STATE; + for (i = 0;i>12 == 2)) flags |= tvi.lParam; + tvi.hItem = TreeView_GetNextSibling(hwndTree,tvi.hItem); + } + return flags; +} + +static INT_PTR CALLBACK DlgProcClcMetaOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + LPNMHDR t; + t = ((LPNMHDR)lParam); + switch (msg) + { + case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); + + CheckDlgButton(hwndDlg, IDC_META, db_get_b(NULL,"CLC","Meta",0) ? BST_CHECKED : BST_UNCHECKED); /// by FYR + CheckDlgButton(hwndDlg, IDC_METADBLCLK, db_get_b(NULL,"CLC","MetaDoubleClick",0) ? BST_CHECKED : BST_UNCHECKED); /// by FYR + CheckDlgButton(hwndDlg, IDC_METASUBEXTRA, db_get_b(NULL,"CLC","MetaHideExtra",0) ? BST_CHECKED : BST_UNCHECKED); /// by FYR + CheckDlgButton(hwndDlg, IDC_METASUBEXTRA_IGN, db_get_b(NULL,"CLC","MetaIgnoreEmptyExtra",1) ? BST_CHECKED : BST_UNCHECKED); /// by FYR + CheckDlgButton(hwndDlg, IDC_METASUB_HIDEOFFLINE, db_get_b(NULL,"CLC","MetaHideOfflineSub",1) ? BST_CHECKED : BST_UNCHECKED); /// by FYR + return TRUE; + case WM_COMMAND: + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + return TRUE; + case WM_NOTIFY: + + switch(t->idFrom) + { + case 0: + switch (t->code) + { + case PSN_APPLY: + db_set_b(NULL,"CLC","Meta",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_META)); // by FYR + db_set_b(NULL,"CLC","MetaDoubleClick",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_METADBLCLK)); // by FYR + db_set_b(NULL,"CLC","MetaHideExtra",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_METASUBEXTRA)); // by FYR + db_set_b(NULL,"CLC","MetaIgnoreEmptyExtra",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_METASUBEXTRA_IGN)); // by FYR + db_set_b(NULL,"CLC","MetaHideOfflineSub",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_METASUB_HIDEOFFLINE)); // by FYR + pcli->pfnClcOptionsChanged(); + return TRUE; + } + break; + } + break; + } + return FALSE; +} + +static INT_PTR CALLBACK DlgProcClcMainOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) { + case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); + SetWindowLongPtr(GetDlgItem(hwndDlg,IDC_GREYOUTOPTS),GWL_STYLE,GetWindowLongPtr(GetDlgItem(hwndDlg,IDC_GREYOUTOPTS),GWL_STYLE)|TVS_NOHSCROLL|TVS_CHECKBOXES); + SetWindowLongPtr(GetDlgItem(hwndDlg,IDC_HIDEOFFLINEOPTS),GWL_STYLE,GetWindowLongPtr(GetDlgItem(hwndDlg,IDC_HIDEOFFLINEOPTS),GWL_STYLE)|TVS_NOHSCROLL|TVS_CHECKBOXES); + { + DWORD exStyle = db_get_dw(NULL,"CLC","ExStyle",pcli->pfnGetDefaultExStyle()); + for (int i = 0;i < SIZEOF(checkBoxToStyleEx); i++) + CheckDlgButton(hwndDlg,checkBoxToStyleEx[i].id,(exStyle&checkBoxToStyleEx[i].flag)^(checkBoxToStyleEx[i].flag*checkBoxToStyleEx[i].not)?BST_CHECKED:BST_UNCHECKED); + + UDACCEL accel[2] = {{0,10},{2,50}}; + SendDlgItemMessage(hwndDlg,IDC_SMOOTHTIMESPIN,UDM_SETRANGE,0,MAKELONG(999,0)); + SendDlgItemMessage(hwndDlg,IDC_SMOOTHTIMESPIN,UDM_SETACCEL,SIZEOF(accel), (LPARAM)&accel ); + SendDlgItemMessage(hwndDlg,IDC_SMOOTHTIMESPIN,UDM_SETPOS,0,MAKELONG(db_get_w(NULL,"CLC","ScrollTime",CLCDEFAULT_SCROLLTIME),0)); + } + CheckDlgButton(hwndDlg,IDC_IDLE,db_get_b(NULL,"CLC","ShowIdle",CLCDEFAULT_SHOWIDLE)?BST_CHECKED:BST_UNCHECKED); + + SendDlgItemMessage(hwndDlg,IDC_LEFTMARGINSPIN,UDM_SETRANGE,0,MAKELONG(64,0)); + SendDlgItemMessage(hwndDlg,IDC_LEFTMARGINSPIN,UDM_SETPOS,0,MAKELONG( db_get_b(NULL,"CLC","LeftMargin",CLCDEFAULT_LEFTMARGIN),0)); + SendDlgItemMessage(hwndDlg,IDC_GROUPINDENTSPIN,UDM_SETRANGE,0,MAKELONG(50,0)); + SendDlgItemMessage(hwndDlg,IDC_GROUPINDENTSPIN,UDM_SETPOS,0,MAKELONG( db_get_b(NULL,"CLC","GroupIndent",CLCDEFAULT_GROUPINDENT),0)); + CheckDlgButton(hwndDlg,IDC_GREYOUT,db_get_dw(NULL,"CLC","GreyoutFlags",CLCDEFAULT_GREYOUTFLAGS)?BST_CHECKED:BST_UNCHECKED); + + + EnableWindow(GetDlgItem(hwndDlg,IDC_SMOOTHTIME),IsDlgButtonChecked(hwndDlg,IDC_NOTNOSMOOTHSCROLLING)); + EnableWindow(GetDlgItem(hwndDlg,IDC_GREYOUTOPTS),IsDlgButtonChecked(hwndDlg,IDC_GREYOUT)); + FillCheckBoxTree(GetDlgItem(hwndDlg,IDC_GREYOUTOPTS),greyoutValues,SIZEOF(greyoutValues),db_get_dw(NULL,"CLC","FullGreyoutFlags",CLCDEFAULT_FULLGREYOUTFLAGS)); + FillCheckBoxTree(GetDlgItem(hwndDlg,IDC_HIDEOFFLINEOPTS),offlineValues,SIZEOF(offlineValues),db_get_dw(NULL,"CLC","OfflineModes",CLCDEFAULT_OFFLINEMODES)); + CheckDlgButton(hwndDlg,IDC_NOSCROLLBAR,db_get_b(NULL,"CLC","NoVScrollBar",0)?BST_CHECKED:BST_UNCHECKED); + return TRUE; + + case WM_VSCROLL: + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + + case WM_COMMAND: + if (LOWORD(wParam) == IDC_NOTNOSMOOTHSCROLLING) + EnableWindow(GetDlgItem(hwndDlg,IDC_SMOOTHTIME),IsDlgButtonChecked(hwndDlg,IDC_NOTNOSMOOTHSCROLLING)); + if (LOWORD(wParam) == IDC_GREYOUT) + EnableWindow(GetDlgItem(hwndDlg,IDC_GREYOUTOPTS),IsDlgButtonChecked(hwndDlg,IDC_GREYOUT)); + if ((LOWORD(wParam) == IDC_LEFTMARGIN || LOWORD(wParam) == IDC_SMOOTHTIME || LOWORD(wParam) == IDC_GROUPINDENT) && (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus())) + return 0; + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + + case WM_NOTIFY: + switch(((LPNMHDR)lParam)->idFrom) { + case IDC_GREYOUTOPTS: + case IDC_HIDEOFFLINEOPTS: + if (((LPNMHDR)lParam)->code == NM_CLICK) { + TVHITTESTINFO hti; + hti.pt.x = (short)LOWORD(GetMessagePos()); + hti.pt.y = (short)HIWORD(GetMessagePos()); + ScreenToClient(((LPNMHDR)lParam)->hwndFrom,&hti.pt); + if (TreeView_HitTest(((LPNMHDR)lParam)->hwndFrom,&hti)) + if (hti.flags&TVHT_ONITEMSTATEICON) { + TVITEM tvi; + tvi.mask = TVIF_HANDLE|TVIF_IMAGE|TVIF_SELECTEDIMAGE; + tvi.hItem = hti.hItem; + TreeView_GetItem(((LPNMHDR)lParam)->hwndFrom,&tvi); + tvi.iImage = tvi.iSelectedImage = (tvi.iImage == 1) ? 2 : 1; + TreeView_SetItem(((LPNMHDR)lParam)->hwndFrom,&tvi); + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + } + } + break; + case 0: + if (((LPNMHDR)lParam)->code == PSN_APPLY) { + int i; + DWORD exStyle = 0; + for (i = 0;i < SIZEOF(checkBoxToStyleEx);i++) + if ((IsDlgButtonChecked(hwndDlg,checkBoxToStyleEx[i].id) == 0) == checkBoxToStyleEx[i].not) + exStyle |= checkBoxToStyleEx[i].flag; + db_set_dw(NULL,"CLC","ExStyle",exStyle); + + DWORD fullGreyoutFlags = MakeCheckBoxTreeFlags(GetDlgItem(hwndDlg,IDC_GREYOUTOPTS)); + db_set_dw(NULL,"CLC","FullGreyoutFlags",fullGreyoutFlags); + if (IsDlgButtonChecked(hwndDlg,IDC_GREYOUT)) + db_set_dw(NULL,"CLC","GreyoutFlags",fullGreyoutFlags); + else + db_set_dw(NULL,"CLC","GreyoutFlags",0); + + db_set_b(NULL,"CLC","ShowIdle",(BYTE)(IsDlgButtonChecked(hwndDlg,IDC_IDLE)?1:0)); + db_set_dw(NULL,"CLC","OfflineModes",MakeCheckBoxTreeFlags(GetDlgItem(hwndDlg,IDC_HIDEOFFLINEOPTS))); + db_set_b(NULL,"CLC","LeftMargin",(BYTE)SendDlgItemMessage(hwndDlg,IDC_LEFTMARGINSPIN,UDM_GETPOS,0,0)); + db_set_w(NULL,"CLC","ScrollTime",(WORD)SendDlgItemMessage(hwndDlg,IDC_SMOOTHTIMESPIN,UDM_GETPOS,0,0)); + db_set_b(NULL,"CLC","GroupIndent",(BYTE)SendDlgItemMessage(hwndDlg,IDC_GROUPINDENTSPIN,UDM_GETPOS,0,0)); + db_set_b(NULL,"CLC","NoVScrollBar",(BYTE)(IsDlgButtonChecked(hwndDlg,IDC_NOSCROLLBAR)?1:0)); + + pcli->pfnClcOptionsChanged(); + return TRUE; + } + } + break; + + case WM_DESTROY: + ImageList_Destroy(TreeView_GetImageList(GetDlgItem(hwndDlg,IDC_GREYOUTOPTS),TVSIL_NORMAL)); + break; + } + return FALSE; +} + +static INT_PTR CALLBACK DlgProcStatusBarBkgOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) { + case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); + CheckDlgButton(hwndDlg,IDC_BITMAP,db_get_b(NULL,"StatusBar","UseBitmap",CLCDEFAULT_USEBITMAP)?BST_CHECKED:BST_UNCHECKED); + SendMessage(hwndDlg,WM_USER+10,0,0); + SendDlgItemMessage(hwndDlg,IDC_BKGCOLOUR,CPM_SETDEFAULTCOLOUR,0,CLCDEFAULT_BKCOLOUR); + SendDlgItemMessage(hwndDlg,IDC_BKGCOLOUR,CPM_SETCOLOUR,0,db_get_dw(NULL,"StatusBar","BkColour",CLCDEFAULT_BKCOLOUR)); + SendDlgItemMessage(hwndDlg,IDC_SELCOLOUR,CPM_SETDEFAULTCOLOUR,0,CLCDEFAULT_SELBKCOLOUR); + SendDlgItemMessage(hwndDlg,IDC_SELCOLOUR,CPM_SETCOLOUR,0,db_get_dw(NULL,"StatusBar","SelBkColour",CLCDEFAULT_SELBKCOLOUR)); + { + DBVARIANT dbv; + if ( !db_get_s(NULL,"StatusBar","BkBitmap",&dbv)) { + SetDlgItemTextA(hwndDlg,IDC_FILENAME,dbv.pszVal); + + char szPath[MAX_PATH]; + if ( PathToAbsolute(dbv.pszVal, szPath)) + SetDlgItemTextA(hwndDlg, IDC_FILENAME, szPath); + + mir_free(dbv.pszVal); + } + + WORD bmpUse = db_get_w(NULL,"StatusBar","BkBmpUse",CLCDEFAULT_BKBMPUSE); + CheckDlgButton(hwndDlg,IDC_STRETCHH,bmpUse&CLB_STRETCHH?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg,IDC_STRETCHV,bmpUse&CLB_STRETCHV?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg,IDC_TILEH,bmpUse&CLBF_TILEH?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg,IDC_TILEV,bmpUse&CLBF_TILEV?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg,IDC_SCROLL,bmpUse&CLBF_SCROLL?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg,IDC_PROPORTIONAL,bmpUse&CLBF_PROPORTIONAL?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg,IDC_TILEVROWH,bmpUse&CLBF_TILEVTOROWHEIGHT?BST_CHECKED:BST_UNCHECKED); + + SHAutoComplete(GetDlgItem(hwndDlg, IDC_FILENAME), 1); + } + return TRUE; + + case WM_USER+10: + EnableWindow(GetDlgItem(hwndDlg,IDC_FILENAME),IsDlgButtonChecked(hwndDlg,IDC_BITMAP)); + EnableWindow(GetDlgItem(hwndDlg,IDC_BROWSE),IsDlgButtonChecked(hwndDlg,IDC_BITMAP)); + EnableWindow(GetDlgItem(hwndDlg,IDC_STRETCHH),IsDlgButtonChecked(hwndDlg,IDC_BITMAP)); + EnableWindow(GetDlgItem(hwndDlg,IDC_STRETCHV),IsDlgButtonChecked(hwndDlg,IDC_BITMAP)); + EnableWindow(GetDlgItem(hwndDlg,IDC_TILEH),IsDlgButtonChecked(hwndDlg,IDC_BITMAP)); + EnableWindow(GetDlgItem(hwndDlg,IDC_TILEV),IsDlgButtonChecked(hwndDlg,IDC_BITMAP)); + EnableWindow(GetDlgItem(hwndDlg,IDC_SCROLL),IsDlgButtonChecked(hwndDlg,IDC_BITMAP)); + EnableWindow(GetDlgItem(hwndDlg,IDC_PROPORTIONAL),IsDlgButtonChecked(hwndDlg,IDC_BITMAP)); + EnableWindow(GetDlgItem(hwndDlg,IDC_TILEVROWH),IsDlgButtonChecked(hwndDlg,IDC_BITMAP)); + break; + + case WM_COMMAND: + if (LOWORD(wParam) == IDC_BROWSE) { + char str[MAX_PATH]; + OPENFILENAMEA ofn = {0}; + char filter[512]; + + GetDlgItemTextA(hwndDlg,IDC_FILENAME,str,SIZEOF(str)); + ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; + ofn.hwndOwner = hwndDlg; + ofn.hInstance = NULL; + CallService(MS_UTILS_GETBITMAPFILTERSTRINGS,SIZEOF(filter),(LPARAM)filter); + ofn.lpstrFilter = filter; + ofn.lpstrFile = str; + ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; + ofn.nMaxFile = SIZEOF(str); + ofn.nMaxFileTitle = MAX_PATH; + ofn.lpstrDefExt = "bmp"; + if ( !GetOpenFileNameA(&ofn)) break; + SetDlgItemTextA(hwndDlg,IDC_FILENAME,str); + } + else if (LOWORD(wParam) == IDC_FILENAME && HIWORD(wParam) != EN_CHANGE) break; + if (LOWORD(wParam) == IDC_BITMAP) SendMessage(hwndDlg,WM_USER+10,0,0); + if (LOWORD(wParam) == IDC_FILENAME && (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus())) return 0; + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + + case WM_NOTIFY: + switch(((LPNMHDR)lParam)->idFrom) { + case 0: + switch (((LPNMHDR)lParam)->code) { + case PSN_APPLY: + db_set_b(NULL,"StatusBar","UseBitmap",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_BITMAP)); + { + COLORREF col; + col = SendDlgItemMessage(hwndDlg,IDC_BKGCOLOUR,CPM_GETCOLOUR,0,0); + if (col == CLCDEFAULT_BKCOLOUR) db_unset(NULL,"StatusBar","BkColour"); + else db_set_dw(NULL,"StatusBar","BkColour",col); + col = SendDlgItemMessage(hwndDlg,IDC_SELCOLOUR,CPM_GETCOLOUR,0,0); + if (col == CLCDEFAULT_SELBKCOLOUR) db_unset(NULL,"StatusBar","SelBkColour"); + else db_set_dw(NULL,"StatusBar","SelBkColour",col); + + char str[MAX_PATH],strrel[MAX_PATH]; + GetDlgItemTextA(hwndDlg,IDC_FILENAME,str,SIZEOF(str)); + if ( PathToRelative(str, strrel)) + db_set_s(NULL,"StatusBar","BkBitmap",strrel); + else + db_set_s(NULL,"StatusBar","BkBitmap",str); + + WORD flags = 0; + if (IsDlgButtonChecked(hwndDlg,IDC_STRETCHH)) flags |= CLB_STRETCHH; + if (IsDlgButtonChecked(hwndDlg,IDC_STRETCHV)) flags |= CLB_STRETCHV; + if (IsDlgButtonChecked(hwndDlg,IDC_TILEH)) flags |= CLBF_TILEH; + if (IsDlgButtonChecked(hwndDlg,IDC_TILEV)) flags |= CLBF_TILEV; + if (IsDlgButtonChecked(hwndDlg,IDC_SCROLL)) flags |= CLBF_SCROLL; + if (IsDlgButtonChecked(hwndDlg,IDC_PROPORTIONAL)) flags |= CLBF_PROPORTIONAL; + if (IsDlgButtonChecked(hwndDlg,IDC_TILEVROWH)) flags |= CLBF_TILEVTOROWHEIGHT; + + db_set_w(NULL,"StatusBar","BkBmpUse",flags); + } + + pcli->pfnClcOptionsChanged(); + OnStatusBarBackgroundChange(); + return TRUE; + } + break; + } + break; + } + return FALSE; +} + +static INT_PTR CALLBACK DlgProcClcBkgOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) { + case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); + CheckDlgButton(hwndDlg,IDC_BITMAP,db_get_b(NULL,"CLC","UseBitmap",CLCDEFAULT_USEBITMAP)?BST_CHECKED:BST_UNCHECKED); + SendMessage(hwndDlg,WM_USER+10,0,0); + SendDlgItemMessage(hwndDlg,IDC_BKGCOLOUR,CPM_SETDEFAULTCOLOUR,0,CLCDEFAULT_BKCOLOUR); + SendDlgItemMessage(hwndDlg,IDC_BKGCOLOUR,CPM_SETCOLOUR,0,db_get_dw(NULL,"CLC","BkColour",CLCDEFAULT_BKCOLOUR)); + SendDlgItemMessage(hwndDlg,IDC_SELCOLOUR,CPM_SETDEFAULTCOLOUR,0,CLCDEFAULT_SELBKCOLOUR); + SendDlgItemMessage(hwndDlg,IDC_SELCOLOUR,CPM_SETCOLOUR,0,db_get_dw(NULL,"CLC","SelBkColour",CLCDEFAULT_SELBKCOLOUR)); + { + DBVARIANT dbv; + if ( !db_get_s(NULL,"CLC","BkBitmap",&dbv)) { + SetDlgItemTextA(hwndDlg,IDC_FILENAME,dbv.pszVal); + + char szPath[MAX_PATH]; + if ( PathToAbsolute(dbv.pszVal, szPath)) + SetDlgItemTextA(hwndDlg,IDC_FILENAME,szPath); + + mir_free(dbv.pszVal); + } + } + + { WORD bmpUse = db_get_w(NULL,"CLC","BkBmpUse",CLCDEFAULT_BKBMPUSE); + CheckDlgButton(hwndDlg,IDC_STRETCHH,bmpUse&CLB_STRETCHH?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg,IDC_STRETCHV,bmpUse&CLB_STRETCHV?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg,IDC_TILEH,bmpUse&CLBF_TILEH?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg,IDC_TILEV,bmpUse&CLBF_TILEV?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg,IDC_SCROLL,bmpUse&CLBF_SCROLL?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg,IDC_PROPORTIONAL,bmpUse&CLBF_PROPORTIONAL?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg,IDC_TILEVROWH,bmpUse&CLBF_TILEVTOROWHEIGHT?BST_CHECKED:BST_UNCHECKED); + + } + SHAutoComplete(GetDlgItem(hwndDlg,IDC_FILENAME),1); + return TRUE; + case WM_USER+10: + EnableWindow(GetDlgItem(hwndDlg,IDC_FILENAME),IsDlgButtonChecked(hwndDlg,IDC_BITMAP)); + EnableWindow(GetDlgItem(hwndDlg,IDC_BROWSE),IsDlgButtonChecked(hwndDlg,IDC_BITMAP)); + EnableWindow(GetDlgItem(hwndDlg,IDC_STRETCHH),IsDlgButtonChecked(hwndDlg,IDC_BITMAP)); + EnableWindow(GetDlgItem(hwndDlg,IDC_STRETCHV),IsDlgButtonChecked(hwndDlg,IDC_BITMAP)); + EnableWindow(GetDlgItem(hwndDlg,IDC_TILEH),IsDlgButtonChecked(hwndDlg,IDC_BITMAP)); + EnableWindow(GetDlgItem(hwndDlg,IDC_TILEV),IsDlgButtonChecked(hwndDlg,IDC_BITMAP)); + EnableWindow(GetDlgItem(hwndDlg,IDC_SCROLL),IsDlgButtonChecked(hwndDlg,IDC_BITMAP)); + EnableWindow(GetDlgItem(hwndDlg,IDC_PROPORTIONAL),IsDlgButtonChecked(hwndDlg,IDC_BITMAP)); + EnableWindow(GetDlgItem(hwndDlg,IDC_TILEVROWH),IsDlgButtonChecked(hwndDlg,IDC_BITMAP)); + break; + case WM_COMMAND: + if (LOWORD(wParam) == IDC_BROWSE) { + char str[MAX_PATH]; + OPENFILENAMEA ofn = {0}; + char filter[512]; + + GetDlgItemTextA(hwndDlg,IDC_FILENAME,str,SIZEOF(str)); + ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; + ofn.hwndOwner = hwndDlg; + ofn.hInstance = NULL; + CallService(MS_UTILS_GETBITMAPFILTERSTRINGS,SIZEOF(filter),(LPARAM)filter); + ofn.lpstrFilter = filter; + ofn.lpstrFile = str; + ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; + ofn.nMaxFile = SIZEOF(str); + ofn.nMaxFileTitle = MAX_PATH; + ofn.lpstrDefExt = "bmp"; + if ( !GetOpenFileNameA(&ofn)) break; + SetDlgItemTextA(hwndDlg,IDC_FILENAME,str); + } + else if (LOWORD(wParam) == IDC_FILENAME && HIWORD(wParam) != EN_CHANGE) break; + if (LOWORD(wParam) == IDC_BITMAP) SendMessage(hwndDlg,WM_USER+10,0,0); + if (LOWORD(wParam) == IDC_FILENAME && (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus())) return 0; + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case WM_NOTIFY: + switch(((LPNMHDR)lParam)->idFrom) { + case 0: + switch (((LPNMHDR)lParam)->code) { + case PSN_APPLY: + db_set_b(NULL,"CLC","UseBitmap",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_BITMAP)); + { COLORREF col; + col = SendDlgItemMessage(hwndDlg,IDC_BKGCOLOUR,CPM_GETCOLOUR,0,0); + if (col == CLCDEFAULT_BKCOLOUR) db_unset(NULL,"CLC","BkColour"); + else db_set_dw(NULL,"CLC","BkColour",col); + col = SendDlgItemMessage(hwndDlg,IDC_SELCOLOUR,CPM_GETCOLOUR,0,0); + if (col == CLCDEFAULT_SELBKCOLOUR) db_unset(NULL,"CLC","SelBkColour"); + else db_set_dw(NULL,"CLC","SelBkColour",col); + } + { + char str[MAX_PATH],strrel[MAX_PATH]; + GetDlgItemTextA(hwndDlg,IDC_FILENAME,str,SIZEOF(str)); + if ( PathToRelative(str, strrel)) + db_set_s(NULL,"CLC","BkBitmap",strrel); + else + db_set_s(NULL,"CLC","BkBitmap",str); + } + { WORD flags = 0; + if (IsDlgButtonChecked(hwndDlg,IDC_STRETCHH)) flags |= CLB_STRETCHH; + if (IsDlgButtonChecked(hwndDlg,IDC_STRETCHV)) flags |= CLB_STRETCHV; + if (IsDlgButtonChecked(hwndDlg,IDC_TILEH)) flags |= CLBF_TILEH; + if (IsDlgButtonChecked(hwndDlg,IDC_TILEV)) flags |= CLBF_TILEV; + if (IsDlgButtonChecked(hwndDlg,IDC_SCROLL)) flags |= CLBF_SCROLL; + if (IsDlgButtonChecked(hwndDlg,IDC_PROPORTIONAL)) flags |= CLBF_PROPORTIONAL; + if (IsDlgButtonChecked(hwndDlg,IDC_TILEVROWH)) flags |= CLBF_TILEVTOROWHEIGHT; + + db_set_w(NULL,"CLC","BkBmpUse",flags); + } + + pcli->pfnClcOptionsChanged(); + return TRUE; + } + break; + } + break; + } + return FALSE; +} diff --git a/plugins/!Deprecated/Clist_mw/src/clcpaint.cpp b/plugins/!Deprecated/Clist_mw/src/clcpaint.cpp new file mode 100644 index 0000000000..fef2359bd5 --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/clcpaint.cpp @@ -0,0 +1,662 @@ +/* + +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), +Copyright (c) 2000-03 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "commonheaders.h" +#include "clc.h" + +extern HIMAGELIST himlCListClc; +static BYTE divide3[765] = {255}; +int MetaIgnoreEmptyExtra; +ExternDrawer SED; + +static void ChangeToFont(HDC hdc,struct ClcData *dat,int id,int *fontHeight) +{ + SelectObject(hdc,dat->fontInfo[id].hFont); + SetTextColor(hdc,dat->fontInfo[id].colour); + if (fontHeight) *fontHeight = dat->fontInfo[id].fontHeight; +} + +static void __inline SetHotTrackColour(HDC hdc,struct ClcData *dat) +{ + if (dat->gammaCorrection) { + COLORREF oldCol,newCol; + int oldLum,newLum; + + oldCol = GetTextColor(hdc); + oldLum = (GetRValue(oldCol)*30+GetGValue(oldCol)*59+GetBValue(oldCol)*11)/100; + newLum = (GetRValue(dat->hotTextColour)*30+GetGValue(dat->hotTextColour)*59+GetBValue(dat->hotTextColour)*11)/100; + if (newLum == 0) { + SetTextColor(hdc,dat->hotTextColour); + return; + } + if (newLum>=oldLum+20) { + oldLum += 20; + newCol = RGB(GetRValue(dat->hotTextColour)*oldLum/newLum,GetGValue(dat->hotTextColour)*oldLum/newLum,GetBValue(dat->hotTextColour)*oldLum/newLum); + } + else if (newLum<=oldLum) { + int r,g,b; + r = GetRValue(dat->hotTextColour)*oldLum/newLum; + g = GetGValue(dat->hotTextColour)*oldLum/newLum; + b = GetBValue(dat->hotTextColour)*oldLum/newLum; + if (r>255) { + g += (r-255)*3/7; + b += (r-255)*3/7; + r = 255; + } + if (g>255) { + r += (g-255)*59/41; + if (r>255) r = 255; + b += (g-255)*59/41; + g = 255; + } + if (b>255) { + r += (b-255)*11/89; + if (r>255) r = 255; + g += (b-255)*11/89; + if (g>255) g = 255; + b = 255; + } + newCol = RGB(r,g,b); + } + else newCol = dat->hotTextColour; + SetTextColor(hdc,newCol); + } + else + SetTextColor(hdc,dat->hotTextColour); +} + +static int GetStatusOnlineness(int status) +{ + switch(status) { + case ID_STATUS_FREECHAT: return 110; + case ID_STATUS_ONLINE: return 100; + case ID_STATUS_OCCUPIED: return 60; + case ID_STATUS_ONTHEPHONE: return 50; + case ID_STATUS_DND: return 40; + case ID_STATUS_AWAY: return 30; + case ID_STATUS_OUTTOLUNCH: return 20; + case ID_STATUS_NA: return 10; + case ID_STATUS_INVISIBLE: return 5; + } + return 0; +} + +static int GetGeneralisedStatus(void) +{ + int i,status,thisStatus,statusOnlineness,thisOnlineness; + + status = ID_STATUS_OFFLINE; + statusOnlineness = 0; + + for (i = 0;ihClcProtoCount;i++) { + thisStatus = pcli->clcProto[i].dwStatus; + if (thisStatus == ID_STATUS_INVISIBLE) + return ID_STATUS_INVISIBLE; + + thisOnlineness = GetStatusOnlineness(thisStatus); + if (thisOnlineness > statusOnlineness) { + status = thisStatus; + statusOnlineness = thisOnlineness; + } + } + return status; +} + +static int GetRealStatus(struct ClcContact * contact, int status) +{ + int i; + char *szProto = contact->proto; + if ( !szProto) return status; + for (i = 0;ihClcProtoCount;i++) { + if ( !lstrcmpA(pcli->clcProto[i].szProto,szProto)) { + return pcli->clcProto[i].dwStatus; + } + } + return status; +} + +void InternalPaintClc(HWND hwnd,struct ClcData *dat,HDC hdc,RECT *rcPaint) +{ + HDC hdcMem; + HBITMAP oldbmp; + HBITMAP oldbm; + HFONT oldfont; + RECT clRect; + int y,indent,index,fontHeight, subindex, subident; + struct ClcContact *Drawing; + ClcGroup *group; + HBITMAP hBmpOsb; + DWORD style = GetWindowLongPtr(hwnd,GWL_STYLE); + int status = GetGeneralisedStatus(); + int grey = 0,groupCountsFontTopShift; + HBRUSH hBrushAlternateGrey = NULL; + POINT pt; + RECT testrc; + + // yes I know about GetSysColorBrush() + COLORREF tmpbkcolour = dat->bkColour; + + if (dat->greyoutFlags & pcli->pfnClcStatusToPf2(status) || style&WS_DISABLED) grey = 1; + else if (GetFocus() != hwnd && dat->greyoutFlags&GREYF_UNFOCUS) grey = 1; + GetClientRect(hwnd,&clRect); + + if (rcPaint == NULL) rcPaint = &clRect; + //rcPaint = &clRect; + + if (IsRectEmpty(rcPaint)) return; + GetCursorPos(&pt); + ScreenToClient(hwnd,&pt); + + + y = -dat->yScroll; + hdcMem = CreateCompatibleDC(hdc); + hBmpOsb = CreateBitmap(clRect.right,clRect.bottom,1,GetDeviceCaps(hdc,BITSPIXEL),NULL); + oldbmp = (HBITMAP)SelectObject(hdcMem,hBmpOsb); + { + oldfont = (HFONT)SelectObject(hdcMem,dat->fontInfo[FONTID_GROUPS].hFont); + + TEXTMETRIC tm; + GetTextMetrics(hdcMem,&tm); + groupCountsFontTopShift = tm.tmAscent; + SelectObject(hdcMem,dat->fontInfo[FONTID_GROUPCOUNTS].hFont); + GetTextMetrics(hdcMem,&tm); + groupCountsFontTopShift -= tm.tmAscent; + SelectObject(hdcMem,oldfont); + } + + if (style&CLS_GREYALTERNATE) + hBrushAlternateGrey = CreateSolidBrush(GetNearestColor(hdcMem,RGB(GetRValue(tmpbkcolour)-10,GetGValue(tmpbkcolour)-10,GetBValue(tmpbkcolour)-10))); + + ChangeToFont(hdcMem,dat,FONTID_CONTACTS,&fontHeight); + SetBkMode(hdcMem,TRANSPARENT); + + HBRUSH hBrush,hoBrush; + + hBrush = CreateSolidBrush(tmpbkcolour); + hoBrush = (HBRUSH)SelectObject(hdcMem,hBrush); + FillRect(hdcMem,rcPaint,hBrush); + SelectObject(hdcMem,hoBrush); + DeleteObject(hBrush); + if (dat->hBmpBackground) { + BITMAP bmp; + HDC hdcBmp; + int x,y; + int maxx,maxy; + int destw,desth; + + // XXX: Halftone isnt supported on 9x, however the scretch problems dont happen on 98. + SetStretchBltMode(hdcMem, HALFTONE); + + GetObject(dat->hBmpBackground,sizeof(bmp),&bmp); + hdcBmp = CreateCompatibleDC(hdcMem); + oldbm = (HBITMAP)SelectObject(hdcBmp,dat->hBmpBackground); + y = dat->backgroundBmpUse&CLBF_SCROLL?-dat->yScroll:0; + maxx = dat->backgroundBmpUse&CLBF_TILEH?clRect.right:1; + maxy = dat->backgroundBmpUse&CLBF_TILEV?maxy = rcPaint->bottom:y+1; + switch(dat->backgroundBmpUse&CLBM_TYPE) { + case CLB_STRETCH: + if (dat->backgroundBmpUse&CLBF_PROPORTIONAL) { + if (clRect.right*bmp.bmHeightbackgroundBmpUse&CLBF_PROPORTIONAL) { + destw = clRect.right; + desth = destw*bmp.bmHeight/bmp.bmWidth; + } + else { + destw = clRect.right; + desth = bmp.bmHeight; + if (dat->backgroundBmpUse&CLBF_TILEVTOROWHEIGHT) + desth = dat->rowHeight; + } + break; + + case CLB_STRETCHV: + if (dat->backgroundBmpUse&CLBF_PROPORTIONAL) { + desth = clRect.bottom; + destw = desth*bmp.bmWidth/bmp.bmHeight; + } + else { + destw = bmp.bmWidth; + desth = clRect.bottom; + } + break; + + default: //clb_topleft + destw = bmp.bmWidth; + desth = bmp.bmHeight; + if (dat->backgroundBmpUse&CLBF_TILEVTOROWHEIGHT) + desth = dat->rowHeight; + break; + } + + for (;ytop-desth) continue; + for (x = 0;xlist; + group->scanIndex = 0; + indent = 0; + subindex = -1; + for (index = 0;ybottom;) { + if (subindex == -1) + if (group->scanIndex == group->cl.count) { + group = group->parent; + indent--; + if (group == NULL) break; + group->scanIndex++; + continue; + } + + if (y>rcPaint->top-dat->rowHeight ) { + int iImage = -1; + int selected; + int hottrack; + SIZE textSize,countsSize,spaceSize; + int width,checkboxWidth; + char *szCounts; + + if (subindex == -1) { + Drawing = group->cl.items[group->scanIndex]; + subident = 0; + } + else { + Drawing = &(group->cl.items[group->scanIndex]->subcontacts[subindex]); + subident = dat->rowHeight/2; + } + //alternating grey + + selected = index == dat->selection && (dat->showSelAlways || dat->exStyle&CLS_EX_SHOWSELALWAYS || GetFocus() == hwnd) && Drawing->type != CLCIT_DIVIDER; + hottrack = dat->exStyle&CLS_EX_TRACKSELECT && Drawing->type != CLCIT_DIVIDER && dat->iHotTrack == index; + + if (style&CLS_GREYALTERNATE && index&1) { + RECT rc; + rc.top = y; rc.bottom = rc.top+dat->rowHeight; + rc.left = 0; rc.right = clRect.right; + FillRect(hdcMem,&rc,hBrushAlternateGrey); + } + + //setup + if (Drawing->type == CLCIT_GROUP) { + if (Drawing->group->expanded) + ChangeToFont(hdcMem,dat,FONTID_GROUPS,&fontHeight); + else + ChangeToFont(hdcMem,dat,FONTID_GROUPSCLOSED,&fontHeight); + } + else if (Drawing->type == CLCIT_INFO) { + if (Drawing->flags&CLCIIF_GROUPFONT) ChangeToFont(hdcMem,dat,FONTID_GROUPS,&fontHeight); + else ChangeToFont(hdcMem,dat,FONTID_CONTACTS,&fontHeight); + } + else if (Drawing->type == CLCIT_DIVIDER) + ChangeToFont(hdcMem,dat,FONTID_DIVIDERS,&fontHeight); + else if (Drawing->type == CLCIT_CONTACT && (Drawing->flags&CONTACTF_NOTONLIST) && (!Drawing->isSubcontact)) + ChangeToFont(hdcMem,dat,FONTID_NOTONLIST,&fontHeight); + else if ( Drawing->type == CLCIT_CONTACT && + ( + (Drawing->flags&CONTACTF_INVISTO && (!Drawing->isSubcontact) && GetRealStatus(group->cl.items[group->scanIndex], status) != ID_STATUS_INVISIBLE ) + || + (Drawing->flags&CONTACTF_VISTO && (!Drawing->isSubcontact) && GetRealStatus(group->cl.items[group->scanIndex], status) == ID_STATUS_INVISIBLE) + ) + ) + { + // the contact is in the always visible list and the proto is invisible + // the contact is in the always invisible and the proto is in any other mode + ChangeToFont(hdcMem,dat, Drawing->flags&CONTACTF_ONLINE ? FONTID_INVIS:FONTID_OFFINVIS ,&fontHeight); + } + else if (Drawing->type == CLCIT_CONTACT && (!(Drawing->flags&CONTACTF_ONLINE) && (!Drawing->isSubcontact))) + ChangeToFont(hdcMem,dat,FONTID_OFFLINE,&fontHeight); + else + ChangeToFont(hdcMem,dat,FONTID_CONTACTS,&fontHeight); + GetTextExtentPoint32(hdcMem,Drawing->szText,lstrlen(Drawing->szText),&textSize); + width = textSize.cx; + if (Drawing->type == CLCIT_GROUP) { + szCounts = pcli->pfnGetGroupCountsText(dat,group->cl.items[group->scanIndex]); + if (szCounts[0]) { + GetTextExtentPoint32A(hdcMem," ",1,&spaceSize); + ChangeToFont(hdcMem,dat,FONTID_GROUPCOUNTS,&fontHeight); + GetTextExtentPoint32A(hdcMem,szCounts,lstrlenA(szCounts),&countsSize); + width += spaceSize.cx+countsSize.cx; + } + } + + if ((style&CLS_CHECKBOXES && Drawing->type == CLCIT_CONTACT) || + (style&CLS_GROUPCHECKBOXES && Drawing->type == CLCIT_GROUP) || + (Drawing->type == CLCIT_INFO && Drawing->flags&CLCIIF_CHECKBOX)) + checkboxWidth = dat->checkboxSize+2; + else checkboxWidth = 0; + + //background + if (selected) { + // default value - paint on text + int x=dat->leftMargin+indent*dat->groupIndent+checkboxWidth+dat->iconXSpace-2+subident; + ImageList_DrawEx(dat->himlHighlight,0,hdcMem,x,y,min(width+5,clRect.right-x),dat->rowHeight,CLR_NONE,CLR_NONE,dat->exStyle&CLS_EX_NOTRANSLUCENTSEL?ILD_NORMAL:ILD_BLEND25); + SetTextColor(hdcMem,dat->selTextColour); + } + else if (hottrack) + SetHotTrackColour(hdcMem,dat); + + //checkboxes + if (checkboxWidth) { + RECT rc; + HANDLE hTheme = OpenThemeData(hwnd,L"BUTTON"); + + rc.left = dat->leftMargin+indent*dat->groupIndent+subident; + rc.right = rc.left+dat->checkboxSize; + rc.top = y+((dat->rowHeight-dat->checkboxSize)>>1); + rc.bottom = rc.top+dat->checkboxSize; + DrawThemeBackground(hTheme, hdcMem, BP_CHECKBOX, Drawing->flags&CONTACTF_CHECKED?(hottrack?CBS_CHECKEDHOT:CBS_CHECKEDNORMAL):(hottrack?CBS_UNCHECKEDHOT:CBS_UNCHECKEDNORMAL), &rc, &rc); + CloseThemeData(hTheme); + } + + //icon + if (Drawing->type == CLCIT_GROUP) + iImage = Drawing->group->expanded?IMAGE_GROUPOPEN:IMAGE_GROUPSHUT; + else if (Drawing->type == CLCIT_CONTACT) + iImage = Drawing->iImage; + if (iImage != -1) { + /*COLORREF colourFg = dat->selBkColour; + int mode = ILD_NORMAL; + if (selected) mode = ILD_SELECTED; + else if (hottrack) {mode = ILD_FOCUS; colourFg = dat->hotTextColour;} + else if (Drawing->type == CLCIT_CONTACT && Drawing->flags&CONTACTF_NOTONLIST) {colourFg = dat->fontInfo[FONTID_NOTONLIST].colour; mode = ILD_BLEND50;} + ImageList_DrawEx(himlCListClc,iImage,hdcMem,dat->leftMargin+indent*dat->groupIndent+checkboxWidth,y+((dat->rowHeight-16)>>1),0,0,CLR_NONE,colourFg,mode); + */ + COLORREF colourFg = dat->selBkColour; + int mode = ILD_NORMAL; + if (hottrack) {colourFg = dat->hotTextColour;} + else if (Drawing->type == CLCIT_CONTACT && Drawing->flags&CONTACTF_NOTONLIST && (!Drawing->isSubcontact)) {colourFg = dat->fontInfo[FONTID_NOTONLIST].colour; mode = ILD_BLEND50;} + if (Drawing->type == CLCIT_CONTACT && dat->showIdle && (Drawing->flags&CONTACTF_IDLE)&& (!Drawing->isSubcontact) && GetRealStatus(group->cl.items[group->scanIndex],ID_STATUS_OFFLINE) != ID_STATUS_OFFLINE) + mode = ILD_SELECTED; + ImageList_DrawEx(himlCListClc,iImage,hdcMem,dat->leftMargin+subident+indent*dat->groupIndent+checkboxWidth,y+((dat->rowHeight-16)>>1),0,0,CLR_NONE,colourFg,mode); + } + + //text + if (Drawing->type == CLCIT_DIVIDER) { + RECT rc; + rc.top = y+(dat->rowHeight>>1); rc.bottom = rc.top+2; + rc.left = dat->leftMargin+indent*dat->groupIndent; + rc.right = rc.left+((clRect.right-rc.left-textSize.cx)>>1)-3; + DrawEdge(hdcMem,&rc,BDR_SUNKENOUTER,BF_RECT); + TextOut(hdcMem,rc.right+3,y+((dat->rowHeight-fontHeight)>>1),Drawing->szText,lstrlen(Drawing->szText)); + rc.left = rc.right+6+textSize.cx; + rc.right = clRect.right; + DrawEdge(hdcMem,&rc,BDR_SUNKENOUTER,BF_RECT); + } + else if (Drawing->type == CLCIT_GROUP) { + RECT rc; + if (szCounts[0]) { + ClcGroup *clcg; + + clcg = (ClcGroup *)Drawing; + + fontHeight = dat->fontInfo[FONTID_GROUPS].fontHeight; + + rc.left = dat->leftMargin+indent*dat->groupIndent+checkboxWidth+dat->iconXSpace; + rc.right = min(clRect.right-countsSize.cx,rc.left+textSize.cx+spaceSize.cx); + rc.top = y+((dat->rowHeight-fontHeight)>>1); + rc.bottom = rc.top+textSize.cy; + if (rc.rightgroup->expanded) + { + ChangeToFont(hdcMem,dat,FONTID_GROUPS,&fontHeight); + } + else + { + ChangeToFont(hdcMem,dat,FONTID_GROUPSCLOSED,&fontHeight); + } + + if (selected) + SetTextColor(hdcMem,dat->selTextColour); + else if (hottrack) + SetHotTrackColour(hdcMem,dat); + rc.right--; + ExtTextOut(hdcMem,rc.left,rc.top,ETO_CLIPPED,&rc,Drawing->szText,lstrlen(Drawing->szText),NULL); + } + else TextOut(hdcMem,dat->leftMargin+indent*dat->groupIndent+checkboxWidth+dat->iconXSpace,y+((dat->rowHeight-fontHeight)>>1),Drawing->szText,lstrlen(Drawing->szText)); + if (dat->exStyle&CLS_EX_LINEWITHGROUPS) { + //calc if extra icons present + int enabledextraicons = 0; + for (iImage = 0;iImageextraColumnsCount;iImage++) { + if (Drawing->iExtraImage[iImage] == EMPTY_EXTRA_ICON) + continue; + enabledextraicons++; + } + rc.top = y+(dat->rowHeight>>1); rc.bottom = rc.top+2; + rc.left = dat->leftMargin+subident+indent*dat->groupIndent+checkboxWidth+dat->iconXSpace+width+3; + rc.right = clRect.right-1-dat->extraColumnSpacing*enabledextraicons; + if (rc.right-rc.left>1) DrawEdge(hdcMem,&rc,BDR_SUNKENOUTER,BF_RECT); + } + } + else { + RECT rc; + rc.left = dat->leftMargin+subident+indent*dat->groupIndent+checkboxWidth+dat->iconXSpace; + rc.top = y+((dat->rowHeight-fontHeight)>>1); + rc.bottom = rc.top+dat->rowHeight; + rc.right = clRect.right; + if (Drawing->type == CLCIT_CONTACT) + if (hottrack) + ChangeToFont(hdcMem,dat,FONTID_CONTACTSHOVER,&fontHeight); + + DrawText(hdcMem,Drawing->szText,lstrlen(Drawing->szText),&rc,DT_END_ELLIPSIS); + + } + + if (selected) { + if (Drawing->type != CLCIT_DIVIDER) { + SetTextColor(hdcMem,dat->quickSearchColour); + TextOut(hdcMem,dat->leftMargin+subident+indent*dat->groupIndent+checkboxWidth+dat->iconXSpace,y+((dat->rowHeight-fontHeight)>>1),Drawing->szText,lstrlen(dat->szQuickSearch)); + } + } + + if (dat->style&CLS_SHOWSTATUSMESSAGES) + { + // status message + if (group->cl.items[group->scanIndex]->type == CLCIT_CONTACT && group->cl.items[group->scanIndex]->flags & CONTACTF_STATUSMSG) { + TCHAR * szText = group->cl.items[group->scanIndex]->szStatusMsg; + RECT rc; + rc.left = dat->leftMargin + indent * dat->groupIndent + checkboxWidth + dat->iconXSpace; + rc.top = y+dat->rowHeight+((dat->rowHeight-fontHeight)>>1); + rc.right = (clRect.right - clRect.left); + rc.bottom = rc.top+dat->rowHeight; + ChangeToFont(hdcMem,dat,FONTID_STATUSMSG,&fontHeight); + //ExtTextOut(hdcMem,rc.left,rc.top,ETO_CLIPPED,&rc,szText,lstrlen(szText),NULL); + DrawText(hdcMem, szText, lstrlen(szText), &rc, DT_SINGLELINE | DT_EDITCONTROL | DT_NOPREFIX | DT_NOCLIP | DT_WORD_ELLIPSIS); + } + } + + if ( !Drawing->isSubcontact || ( db_get_b(NULL,"CLC","MetaHideExtra",0) == 0)) { + + //extra icons + if ( !(style & CLS_EX_MULTICOLUMNALIGNLEFT)) { + int c = dat->extraColumnsCount; + for (iImage = dat->extraColumnsCount-1;iImage>=0;iImage--) { + COLORREF colourFg = dat->selBkColour; + int mode = ILD_NORMAL; + + if (Drawing->iExtraImage[iImage] == EMPTY_EXTRA_ICON) + continue; + + if (selected) mode = ILD_SELECTED; + else if (hottrack) {mode = ILD_FOCUS; colourFg = dat->hotTextColour;} + else if (Drawing->type == CLCIT_CONTACT && Drawing->flags&CONTACTF_NOTONLIST) {colourFg = dat->fontInfo[FONTID_NOTONLIST].colour; mode = ILD_BLEND50;} + { + + } + if (dat->MetaIgnoreEmptyExtra) c--; else c = iImage; + + testrc.left = clRect.right-dat->extraColumnSpacing*(dat->extraColumnsCount-c); + testrc.top = (y+((dat->rowHeight-16)>>1)); + testrc.right = testrc.left+16; + testrc.bottom = testrc.top+16; + if ( !PtInRect(&testrc,pt)) + mode = ILD_NORMAL; + + ImageList_DrawEx(dat->himlExtraColumns,Drawing->iExtraImage[iImage],hdcMem,clRect.right-dat->extraColumnSpacing*(dat->extraColumnsCount-c),y+((dat->rowHeight-16)>>1),0,0,CLR_NONE,colourFg,mode); + } + } + else { + int ic = 0; + for (iImage = 0;iImageextraColumnsCount;iImage++) { + COLORREF colourFg = dat->selBkColour; + int mode = ILD_NORMAL; + int x; + + if (Drawing->iExtraImage[iImage] == EMPTY_EXTRA_ICON) + continue; + + if (hottrack) { + mode = ILD_FOCUS; + colourFg = dat->hotTextColour; + } + else if (Drawing->type == CLCIT_CONTACT && (Drawing->flags & CONTACTF_NOTONLIST)) { + colourFg = dat->fontInfo[FONTID_NOTONLIST].colour; + mode = ILD_BLEND50; + } + + x = (dat->leftMargin+indent*dat->groupIndent+checkboxWidth+dat->iconXSpace-2+width); + x += 16; + x = x+dat->extraColumnSpacing*(ic); + if (iImage == dat->extraColumnsCount-1) {x = clRect.right-18;} + ImageList_DrawEx(dat->himlExtraColumns,Drawing->iExtraImage[iImage],hdcMem, + x, + y+((dat->rowHeight-16)>>1),0,0,CLR_NONE,colourFg,mode); + + ic++; + } + } + } + } + index++; + y += dat->rowHeight; + + if (group->cl.items[group->scanIndex]->type == CLCIT_CONTACT && group->cl.items[group->scanIndex]->flags & CONTACTF_STATUSMSG) { + y += dat->rowHeight; + index++; + } + + //increment by subcontacts + if (group->cl.items[group->scanIndex]->subcontacts != NULL && group->cl.items[group->scanIndex]->type != CLCIT_GROUP) + if (group->cl.items[group->scanIndex]->SubExpanded) + if (subindexcl.items[group->scanIndex]->SubAllocated-1) + subindex++; + else subindex = -1; + + if (subindex == -1) { + if (group->cl.items[group->scanIndex]->type == CLCIT_GROUP && group->cl.items[group->scanIndex]->group->expanded) { + group = group->cl.items[group->scanIndex]->group; + indent++; + group->scanIndex = 0; + subindex = -1; + continue; + } + group->scanIndex++; + } + } + if (dat->iInsertionMark != -1) { //insertion mark + HBRUSH hBrush,hoBrush; + POINT pts[8]; + HRGN hRgn; + + pts[0].x = dat->leftMargin; pts[0].y = dat->iInsertionMark*dat->rowHeight-dat->yScroll-4; + pts[1].x = pts[0].x+2; pts[1].y = pts[0].y+3; + pts[2].x = clRect.right-4; pts[2].y = pts[1].y; + pts[3].x = clRect.right-1; pts[3].y = pts[0].y-1; + pts[4].x = pts[3].x; pts[4].y = pts[0].y+7; + pts[5].x = pts[2].x+1; pts[5].y = pts[1].y+2; + pts[6].x = pts[1].x; pts[6].y = pts[5].y; + pts[7].x = pts[0].x; pts[7].y = pts[4].y; + hRgn = CreatePolygonRgn(pts,SIZEOF(pts),ALTERNATE); + hBrush = CreateSolidBrush(dat->fontInfo[FONTID_CONTACTS].colour); + hoBrush = (HBRUSH)SelectObject(hdcMem,hBrush); + FillRgn(hdcMem,hRgn,hBrush); + SelectObject(hdcMem,hoBrush); + DeleteObject(hBrush); + } + if ( !grey) + BitBlt(hdc,rcPaint->left,rcPaint->top,rcPaint->right-rcPaint->left,rcPaint->bottom-rcPaint->top,hdcMem,rcPaint->left,rcPaint->top,SRCCOPY); + //DeleteDC(hdcMem); + if (hBrushAlternateGrey) DeleteObject(hBrushAlternateGrey); + if (grey) { + PBYTE bits; + BITMAPINFOHEADER bmih = {0}; + int i; + int greyRed,greyGreen,greyBlue; + COLORREF greyColour; + bmih.biBitCount = 32; + bmih.biSize = sizeof(bmih); + bmih.biCompression = BI_RGB; + bmih.biHeight = -clRect.bottom; + bmih.biPlanes = 1; + bmih.biWidth = clRect.right; + bits = (PBYTE)mir_alloc(4*bmih.biWidth*-bmih.biHeight); + GetDIBits(hdc,hBmpOsb,0,clRect.bottom,bits,(BITMAPINFO*)&bmih,DIB_RGB_COLORS); + greyColour = GetSysColor(COLOR_3DFACE); + greyRed = GetRValue(greyColour)*2; + greyGreen = GetGValue(greyColour)*2; + greyBlue = GetBValue(greyColour)*2; + if (divide3[0] == 255) { + for (i = 0; i < SIZEOF(divide3); i++) divide3[i] = (i+1)/3; + } + for (i = 4*clRect.right*clRect.bottom-4;i>=0;i -= 4) { + bits[i] = divide3[bits[i]+greyBlue]; + bits[i+1] = divide3[bits[i+1]+greyGreen]; + bits[i+2] = divide3[bits[i+2]+greyRed]; + } + SetDIBitsToDevice(hdc,0,0,clRect.right,clRect.bottom,0,0,0,clRect.bottom,bits,(BITMAPINFO*)&bmih,DIB_RGB_COLORS); + mir_free(bits); + } + SelectObject(hdcMem,oldfont); + SelectObject(hdcMem,oldbmp); + DeleteObject(hBmpOsb); + DeleteDC(hdcMem); +} + +void PaintClc(HWND hwnd,struct ClcData *dat,HDC hdc,RECT *rcPaint) +{ + if (SED.cbSize == sizeof(SED)&&SED.PaintClc != NULL) { + SED.PaintClc(hwnd,dat,hdc,rcPaint,pcli->hClcProtoCount,pcli->clcProto,himlCListClc); + return; + } + InternalPaintClc(hwnd,dat,hdc,rcPaint); +} diff --git a/plugins/!Deprecated/Clist_mw/src/clcutils.cpp b/plugins/!Deprecated/Clist_mw/src/clcutils.cpp new file mode 100644 index 0000000000..0edfda16ed --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/clcutils.cpp @@ -0,0 +1,289 @@ +/* + +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), +Copyright (c) 2000-03 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "commonheaders.h" +#include "clc.h" + +//loads of stuff that didn't really fit anywhere else + +int HitTest(HWND hwnd,struct ClcData *dat,int testx,int testy,struct ClcContact **contact,ClcGroup **group,DWORD *flags) +{ + struct ClcContact *hitcontact; + ClcGroup *hitgroup; + int hit,indent,width,i,cxSmIcon; + int checkboxWidth, subident,ic = 0; + SIZE textSize; + HDC hdc; + HFONT oldfont; + RECT clRect; + DWORD style = GetWindowLongPtr(hwnd,GWL_STYLE); + + if (flags) *flags = 0; + GetClientRect(hwnd,&clRect); + if (testx<0 || testy<0 || testy>=clRect.bottom || testx>=clRect.right) { + if (flags) { + if (testx<0) *flags |= CLCHT_TOLEFT; + else if (testx>=clRect.right) *flags |= CLCHT_TORIGHT; + if (testy<0) *flags |= CLCHT_ABOVE; + else if (testy>=clRect.bottom) *flags |= CLCHT_BELOW; + } + return -1; + } + if (testxleftMargin) { + if (flags) *flags |= CLCHT_INLEFTMARGIN|CLCHT_NOWHERE; + return -1; + } + hit = GetRowByIndex(dat ,(testy+dat->yScroll)/dat->rowHeight,&hitcontact,&hitgroup); + if (hit == -1) { + if (flags) *flags |= CLCHT_NOWHERE|CLCHT_BELOWITEMS; + return -1; + } + if (contact) *contact = hitcontact; + if (group) *group = hitgroup; + ///////// + if (hitcontact->type == CLCIT_CONTACT && hitcontact->isSubcontact) + subident = dat->rowHeight/2; + else + subident = 0; + + for (indent = 0;hitgroup->parent;indent++,hitgroup = hitgroup->parent); + if (testxleftMargin+indent*dat->groupIndent+subident) { + if (flags) *flags |= CLCHT_ONITEMINDENT; + return hit; + } + checkboxWidth = 0; + if (style&CLS_CHECKBOXES && hitcontact->type == CLCIT_CONTACT) checkboxWidth = dat->checkboxSize+2; + if (style&CLS_GROUPCHECKBOXES && hitcontact->type == CLCIT_GROUP) checkboxWidth = dat->checkboxSize+2; + if (hitcontact->type == CLCIT_INFO && hitcontact->flags&CLCIIF_CHECKBOX) checkboxWidth = dat->checkboxSize+2; + if (testxleftMargin+indent*dat->groupIndent+checkboxWidth+subident) { + if (flags) *flags |= CLCHT_ONITEMCHECK; + return hit; + } + if (testxleftMargin+indent*dat->groupIndent+checkboxWidth+dat->iconXSpace+subident) { + if (flags) *flags |= CLCHT_ONITEMICON; + return hit; + } + + hdc = GetDC(hwnd); + GetTextExtentPoint32(hdc,hitcontact->szText,lstrlen(hitcontact->szText),&textSize); + width = textSize.cx; + + cxSmIcon = GetSystemMetrics(SM_CXSMICON); + + for (i=0; i < dat->extraColumnsCount; i++) { + int x; + if (hitcontact->iExtraImage[i] == EMPTY_EXTRA_ICON) + continue; + + if ((style & CLS_EX_MULTICOLUMNALIGNLEFT)) { + x = (dat->leftMargin+indent*dat->groupIndent+checkboxWidth+dat->iconXSpace-2+width); + x += 16; + x = x+dat->extraColumnSpacing*(ic); + if (i == dat->extraColumnsCount-1) {x = clRect.right-18;} + } + else { + int ir; + if (dat->MetaIgnoreEmptyExtra) { + ir = 0; + for (int j = i;jextraColumnsCount;j++) + if (hitcontact->iExtraImage[j] != EMPTY_EXTRA_ICON) + ir++; + } + else ir = dat->extraColumnsCount-i; + + x = clRect.right-dat->extraColumnSpacing*ir; + } + ic++; + + if (testx >= x && testx < x + cxSmIcon) { + if (flags) + *flags |= CLCHT_ONITEMEXTRA|(i<<24); + + ReleaseDC(hwnd,hdc); + return hit; + } + } + + if (hitcontact->type == CLCIT_GROUP) + oldfont = (HFONT)SelectObject(hdc,dat->fontInfo[FONTID_GROUPS].hFont); + else + oldfont = (HFONT)SelectObject(hdc,dat->fontInfo[FONTID_CONTACTS].hFont); + + GetTextExtentPoint32(hdc,hitcontact->szText,lstrlen(hitcontact->szText),&textSize); + width = textSize.cx; + if (hitcontact->type == CLCIT_GROUP) { + char *szCounts = pcli->pfnGetGroupCountsText(dat,hitcontact); + if (szCounts[0]) { + GetTextExtentPoint32A(hdc," ",1,&textSize); + width += textSize.cx; + SelectObject(hdc,dat->fontInfo[FONTID_GROUPCOUNTS].hFont); + GetTextExtentPoint32A(hdc,szCounts,lstrlenA(szCounts),&textSize); + width += textSize.cx; + } + } + SelectObject(hdc,oldfont); + ReleaseDC(hwnd,hdc); + if (testxleftMargin+indent*dat->groupIndent+checkboxWidth+dat->iconXSpace+width+4+subident) { + if (flags) *flags |= CLCHT_ONITEMLABEL; + return hit; + } + if (flags) *flags |= CLCHT_NOWHERE; + return -1; +} + +void ScrollTo(HWND hwnd,struct ClcData *dat,int desty,int noSmooth) +{ + DWORD startTick,nowTick; + int oldy = dat->yScroll; + RECT clRect,rcInvalidate; + int maxy,previousy; + + if (dat->iHotTrack != -1 && dat->yScroll != desty) { + pcli->pfnInvalidateItem(hwnd,dat,dat->iHotTrack); + dat->iHotTrack = -1; + ReleaseCapture(); + } + GetClientRect(hwnd,&clRect); + rcInvalidate = clRect; + maxy = dat->rowHeight*GetGroupContentsCount(&dat->list,2)-clRect.bottom; + if (desty>maxy) desty = maxy; + if (desty<0) desty = 0; + if (abs(desty-dat->yScroll)<4) noSmooth = 1; + if ( !noSmooth && dat->exStyle&CLS_EX_NOSMOOTHSCROLLING) noSmooth = 1; + previousy = dat->yScroll; + if ( !noSmooth) { + startTick = GetTickCount(); + for (;;) { + nowTick = GetTickCount(); + if (nowTick>=startTick+dat->scrollTime) break; + dat->yScroll = oldy+(desty-oldy)*(int)(nowTick-startTick)/dat->scrollTime; + if (dat->backgroundBmpUse&CLBF_SCROLL || dat->hBmpBackground == NULL) + ScrollWindowEx(hwnd,0,previousy-dat->yScroll,NULL,NULL,NULL,NULL,SW_INVALIDATE); + else + InvalidateRect(hwnd,NULL,FALSE); + previousy = dat->yScroll; + SetScrollPos(hwnd,SB_VERT,dat->yScroll,TRUE); + UpdateWindow(hwnd); + } + } + dat->yScroll = desty; + if (dat->backgroundBmpUse&CLBF_SCROLL || dat->hBmpBackground == NULL) + ScrollWindowEx(hwnd,0,previousy-dat->yScroll,NULL,NULL,NULL,NULL,SW_INVALIDATE); + else + InvalidateRect(hwnd,NULL,FALSE); + SetScrollPos(hwnd,SB_VERT,dat->yScroll,TRUE); +} + +void RecalcScrollBar(HWND hwnd,struct ClcData *dat) +{ + SCROLLINFO si = {0}; + RECT clRect; + NMCLISTCONTROL nm; + boolean sbar = FALSE; + + GetClientRect(hwnd,&clRect); + + si.cbSize = sizeof(si); + si.fMask = SIF_ALL; + si.nMin = 0; + si.nMax = dat->rowHeight*GetGroupContentsCount(&dat->list,2)-1; + si.nPage = clRect.bottom; + si.nPos = dat->yScroll; + + nm.hdr.code = CLN_LISTSIZECHANGE; + nm.hdr.hwndFrom = hwnd; + nm.hdr.idFrom = GetDlgCtrlID(hwnd); + nm.pt.y = si.nMax; + SendMessage(GetParent(hwnd),WM_NOTIFY,0,(LPARAM)&nm); + + GetClientRect(hwnd,&clRect); + si.cbSize = sizeof(si); + si.fMask = SIF_ALL; + si.nMin = 0; + si.nMax = dat->rowHeight*GetGroupContentsCount(&dat->list,2)-1; + si.nPage = clRect.bottom; + si.nPos = dat->yScroll; + + sbar = (dat->noVScrollbar == 1||(int)si.nPage>si.nMax); + + ShowScrollBar(hwnd,SB_VERT,sbar? FALSE : TRUE); + if ( !sbar) { + if ( GetWindowLongPtr(hwnd,GWL_STYLE)&CLS_CONTACTLIST ) { + if ( dat->noVScrollbar == 0 ) SetScrollInfo(hwnd,SB_VERT,&si,TRUE); + else SetScrollInfo(hwnd,SB_VERT,&si,FALSE); + } + else SetScrollInfo(hwnd,SB_VERT,&si,TRUE); + } + ScrollTo(hwnd,dat,dat->yScroll,1); +} + +void CalcEipPosition( struct ClcData *dat, struct ClcContact *contact, ClcGroup *group, POINT *result) +{ + int indent; + for (indent = 0; group->parent; indent++, group = group->parent); + result->x = indent * dat->groupIndent + dat->iconXSpace - 2; + result->y = dat->selection * dat->rowHeight - dat->yScroll; + + if (contact->type == CLCIT_CONTACT && contact->isSubcontact) + result->x += dat->rowHeight/2; +} + +void GetDefaultFontSetting(int i,LOGFONT *lf,COLORREF *colour) +{ + SystemParametersInfo(SPI_GETICONTITLELOGFONT,sizeof(LOGFONT),lf,FALSE); + *colour = GetSysColor(COLOR_WINDOWTEXT); + switch(i) { + case FONTID_GROUPS: + lf->lfWeight = FW_BOLD; + break; + case FONTID_GROUPCOUNTS: + lf->lfHeight = (int)(lf->lfHeight*.75); + *colour = GetSysColor(COLOR_3DSHADOW); + break; + case FONTID_OFFINVIS: + case FONTID_INVIS: + lf->lfItalic = !lf->lfItalic; + break; + case FONTID_DIVIDERS: + lf->lfHeight = (int)(lf->lfHeight*.75); + break; + case FONTID_NOTONLIST: + *colour = GetSysColor(COLOR_3DSHADOW); + break; +} } + +extern void ( *saveLoadClcOptions )(HWND hwnd,struct ClcData *dat); + +void LoadClcOptions(HWND hwnd,struct ClcData *dat) +{ + int i; + + dat->style = GetWindowLongPtr(hwnd,GWL_STYLE); + dat->MetaIgnoreEmptyExtra = db_get_b(NULL,"CLC","MetaIgnoreEmptyExtra",1); + saveLoadClcOptions( hwnd, dat ); + + for (i = 0; i <= FONTID_MAX; i++) + if (dat->fontInfo[i].fontHeight > dat->rowHeight) + dat->rowHeight = dat->fontInfo[i].fontHeight; +} diff --git a/plugins/!Deprecated/Clist_mw/src/clist.h b/plugins/!Deprecated/Clist_mw/src/clist.h new file mode 100644 index 0000000000..dad33fa285 --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/clist.h @@ -0,0 +1,55 @@ +/* + +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), +Copyright (c) 2000-03 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#ifndef _CLIST_H_ +#define _CLIST_H_ + +void LoadContactTree(void); +int ExtIconFromStatusMode(MCONTACT hContact, const char *szProto,int status); +HTREEITEM GetTreeItemByHContact(MCONTACT hContact); +void TrayIconUpdateWithImageList(int iImage,const char *szNewTip,char *szPreferredProto); +void SortContacts(void); +void ChangeContactIcon(MCONTACT hContact,int iIcon,int add); +int GetContactInfosForSort(MCONTACT hContact,char **Proto,TCHAR **Name,int *Status); + +struct ClcCacheEntry : public ClcCacheEntryBase +{ + int noHiddenOffline; + + char *szProto; + boolean protoNotExists; + int status; + + int i; + int ApparentMode; + int NotOnList; + int IdleTS; + void *ClcContact; + BYTE IsExpanded; + boolean isUnknown; +}; + +ClcCacheEntry* GetContactFullCacheEntry(MCONTACT hContact); + +#endif \ No newline at end of file diff --git a/plugins/!Deprecated/Clist_mw/src/clistmenus.cpp b/plugins/!Deprecated/Clist_mw/src/clistmenus.cpp new file mode 100644 index 0000000000..8a9f96d06f --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/clistmenus.cpp @@ -0,0 +1,62 @@ +/* + +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), +Copyright (c) 2000-06 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "commonheaders.h" +#pragma hdrstop + +static HMENU hMainMenu, hMainStatusMenu; + +void DestroyTrayMenu(HMENU hMenu) +{ + int i, cnt; + + cnt = GetMenuItemCount(hMenu); + for (i = 0; i < cnt; ++i) { + HMENU hSubMenu = GetSubMenu(hMenu, i); + if (hSubMenu == hMainStatusMenu || hSubMenu == hMainMenu) + RemoveMenu(hMenu, i--, MF_BYPOSITION); + } + DestroyMenu(hMenu); +} + +INT_PTR CloseAction(WPARAM wParam, LPARAM lParam) +{ + if (CallService(MS_SYSTEM_OKTOEXIT, 0, 0)) + DestroyWindow(pcli->hwndContactList); + + return 0; +} + +int InitCustomMenus(void) +{ + CreateServiceFunction("CloseAction", CloseAction); + hMainStatusMenu = (HMENU)CallService(MS_CLIST_MENUGETSTATUS, 0, 0); + hMainMenu = (HMENU)CallService(MS_CLIST_MENUGETMAIN, 0, 0); + + return 0; +} + +void UninitCustomMenus(void) +{ +} diff --git a/plugins/!Deprecated/Clist_mw/src/clistmod.cpp b/plugins/!Deprecated/Clist_mw/src/clistmod.cpp new file mode 100644 index 0000000000..869fcfc56c --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/clistmod.cpp @@ -0,0 +1,133 @@ +/* + +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), +Copyright (c) 2000-03 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "commonheaders.h" + +extern int DefaultImageListColorDepth; + +int InitCustomMenus(void); +void UninitCustomMenus(void); +int ContactSettingChanged(WPARAM wParam, LPARAM lParam); +int CListOptInit(WPARAM wParam, LPARAM lParam); +INT_PTR ContactChangeGroup(WPARAM wParam, LPARAM lParam); +INT_PTR HotkeysProcessMessage(WPARAM wParam, LPARAM lParam) { return pcli->pfnHotkeysProcessMessage(wParam, lParam); } +void InitTrayMenus(void); + +HIMAGELIST hCListImages; + +HANDLE hContactIconChangedEvent; +extern BYTE nameOrder[]; + +static HANDLE hSettingChanged, hProtoAckHook; + +int cli_IconFromStatusMode(const char *szProto,int nStatus, MCONTACT hContact) +{ + int result = -1; + if (hContact && szProto) { + char * szActProto = (char*)szProto; + int nActStatus = nStatus; + MCONTACT hActContact = hContact; + if (!db_get_b(NULL, "CLC", "Meta", 0) && !strcmp(szActProto, META_PROTO)) { + // substitute params by mostonline contact datas + MCONTACT hMostOnlineContact = db_mc_getMostOnline(hActContact); + if (hMostOnlineContact && hMostOnlineContact != (MCONTACT)CALLSERVICE_NOTFOUND) { + ClcCacheEntry *cacheEntry = (ClcCacheEntry *)pcli->pfnGetCacheEntry(hMostOnlineContact); + if (cacheEntry && cacheEntry->szProto) { + szActProto = cacheEntry->szProto; + nActStatus = cacheEntry->status; + hActContact = hMostOnlineContact; + } + } + } + + if (ProtoServiceExists(szActProto, PS_GETADVANCEDSTATUSICON)) + result = ProtoCallService(szActProto, PS_GETADVANCEDSTATUSICON, (WPARAM)hActContact, 0); + + // result == -1 means no Advanced icon. LOWORD(result) == 0 happens when Advanced icon returned by ICQ (i.e. no transpot) + if (result == -1 || !(LOWORD(result))) + result = saveIconFromStatusMode(szActProto, nActStatus, NULL); + } + else result = saveIconFromStatusMode(szProto, nStatus, NULL); + return result; +} + +int ExtIconFromStatusMode(MCONTACT hContact, const char *szProto,int status) +{ + return pcli->pfnIconFromStatusMode(szProto,status,hContact); +} + +/////////// End by FYR //////// + +static int ProtocolAck(WPARAM wParam, LPARAM lParam) +{ + ACKDATA *ack = (ACKDATA*)lParam; + if (ack->type == ACKTYPE_AWAYMSG && ack->lParam) { + DBVARIANT dbv; + if ( !db_get_ts(ack->hContact, "CList", "StatusMsg", &dbv)) { + if ( !_tcscmp(dbv.ptszVal, (TCHAR *)ack->lParam)) { + db_free(&dbv); + return 0; + } + db_free(&dbv); + } + if ( db_get_b(NULL,"CList","ShowStatusMsg",0) || db_get_b(ack->hContact,"CList","StatusMsgAuto",0)) + db_set_ts(ack->hContact, "CList", "StatusMsg", (TCHAR *)ack->lParam); + } + + return 0; +} + +static INT_PTR GetStatusMode(WPARAM wParam, LPARAM lParam) +{ + return pcli->currentDesiredStatusMode; +} + +static int ContactListShutdownProc(WPARAM wParam, LPARAM lParam) +{ + UnhookEvent(hProtoAckHook); + UninitCustomMenus(); + return 0; +} + +int LoadContactListModule(void) +{ + for (MCONTACT hContact = db_find_first(); hContact; hContact = db_find_next(hContact)) + db_set_s(hContact, "CList", "StatusMsg", ""); + + hCListImages = (HIMAGELIST)CallService(MS_CLIST_GETICONSIMAGELIST, 0, 0); + DefaultImageListColorDepth = db_get_dw(NULL,"CList","DefaultImageListColorDepth",ILC_COLOR32); + + hProtoAckHook = (HANDLE) HookEvent(ME_PROTO_ACK, ProtocolAck); + HookEvent(ME_OPT_INITIALISE,CListOptInit); + HookEvent(ME_SYSTEM_SHUTDOWN,ContactListShutdownProc); + hSettingChanged = HookEvent(ME_DB_CONTACT_SETTINGCHANGED,ContactSettingChanged); + hContactIconChangedEvent = CreateHookableEvent(ME_CLIST_CONTACTICONCHANGED); + CreateServiceFunction(MS_CLIST_CONTACTCHANGEGROUP,ContactChangeGroup); + CreateServiceFunction(MS_CLIST_HOTKEYSPROCESSMESSAGE,HotkeysProcessMessage); + CreateServiceFunction(MS_CLIST_GETSTATUSMODE, GetStatusMode); + + InitCustomMenus(); + InitTrayMenus(); + return 0; +} diff --git a/plugins/!Deprecated/Clist_mw/src/clistopts.cpp b/plugins/!Deprecated/Clist_mw/src/clistopts.cpp new file mode 100644 index 0000000000..490e184230 --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/clistopts.cpp @@ -0,0 +1,237 @@ +/* + +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), +Copyright (c) 2000-03 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "commonheaders.h" +#include "clist.h" + +int HotKeysRegister(HWND hwnd); +void HotKeysUnregister(HWND hwnd); +void LoadContactTree(void); +void SortContacts(void); + +static INT_PTR CALLBACK DlgProcGenOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); + +int CListOptInit(WPARAM wParam, LPARAM lParam) +{ + OPTIONSDIALOGPAGE odp = { sizeof(odp) }; + odp.position = -1000000000; + odp.hInstance = g_hInst; + odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_CLIST); + odp.pszTitle = LPGEN("Contact list"); + odp.pfnDlgProc = DlgProcGenOpts; + odp.flags = ODPF_BOLDGROUPS; + Options_AddPage(wParam, &odp); + return 0; +} + +static INT_PTR CALLBACK DlgProcGenOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) + { + case WM_USER+1: + { + MCONTACT hContact = wParam; + DBCONTACTWRITESETTING * ws = (DBCONTACTWRITESETTING *)lParam; + if ( hContact == NULL && ws != NULL && ws->szModule != NULL && ws->szSetting != NULL + && lstrcmpiA(ws->szModule,"CList") == 0 && lstrcmpiA(ws->szSetting,"UseGroups") == 0 + && IsWindowVisible(hwndDlg)) { + CheckDlgButton(hwndDlg,IDC_DISABLEGROUPS,ws->value.bVal == 0); + } + break; + } + case WM_DESTROY: + { + UnhookEvent( (HANDLE)GetWindowLongPtr(hwndDlg,GWLP_USERDATA)); + break; + } + + case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)HookEventMessage(ME_DB_CONTACT_SETTINGCHANGED,hwndDlg,WM_USER+1)); + + CheckDlgButton(hwndDlg,IDC_GAMMACORRECT,db_get_b(NULL,"CLC","GammaCorrect",CLCDEFAULT_GAMMACORRECT)?BST_CHECKED:BST_UNCHECKED); + + SendDlgItemMessage(hwndDlg,IDC_ROWHEIGHTSPIN,UDM_SETBUDDY,(WPARAM)GetDlgItem(hwndDlg,IDC_ROWHEIGHT),0); + SendDlgItemMessage(hwndDlg,IDC_ROWHEIGHTSPIN,UDM_SETRANGE,0,MAKELONG(255,0)); + SendDlgItemMessage(hwndDlg,IDC_ROWHEIGHTSPIN,UDM_SETPOS,0,MAKELONG( db_get_b(NULL,"CLC","RowHeight",CLCDEFAULT_ROWHEIGHT),0)); + + CheckDlgButton(hwndDlg, IDC_ONTOP, db_get_b(NULL,"CList","OnTop",SETTING_ONTOP_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_HIDEOFFLINE, db_get_b(NULL,"CList","HideOffline",SETTING_HIDEOFFLINE_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_HIDEEMPTYGROUPS, db_get_b(NULL,"CList","HideEmptyGroups",SETTING_HIDEEMPTYGROUPS_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_DISABLEGROUPS, db_get_b(NULL,"CList","UseGroups",SETTING_USEGROUPS_DEFAULT) ? BST_UNCHECKED : BST_CHECKED); + CheckDlgButton(hwndDlg, IDC_SORTBYNAME, + !db_get_b(NULL,"CList","SortByStatus",SETTING_SORTBYSTATUS_DEFAULT) && + !db_get_b(NULL,"CList","SortByProto",SETTING_SORTBYPROTO_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); + + CheckDlgButton(hwndDlg, IDC_SORTBYSTATUS, db_get_b(NULL,"CList","SortByStatus",SETTING_SORTBYSTATUS_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_NOOFFLINEMOVE, db_get_b(NULL,"CList","NoOfflineBottom",SETTING_NOOFFLINEBOTTOM_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); + + CheckDlgButton(hwndDlg, IDC_SORTBYPROTO, db_get_b(NULL,"CList","SortByProto",SETTING_SORTBYPROTO_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CONFIRMDELETE, db_get_b(NULL,"CList","ConfirmDelete",SETTING_CONFIRMDELETE_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_AUTOHIDE, db_get_b(NULL,"CList","AutoHide",SETTING_AUTOHIDE_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); + EnableWindow(GetDlgItem(hwndDlg,IDC_HIDETIME),IsDlgButtonChecked(hwndDlg,IDC_AUTOHIDE)); + EnableWindow(GetDlgItem(hwndDlg,IDC_HIDETIMESPIN),IsDlgButtonChecked(hwndDlg,IDC_AUTOHIDE)); + { + DWORD caps = CallService(MS_CLUI_GETCAPS,CLUICAPS_FLAGS1,0); + if ( !(caps&CLUIF_HIDEEMPTYGROUPS)) ShowWindow(GetDlgItem(hwndDlg,IDC_HIDEEMPTYGROUPS),SW_HIDE); + if ( !(caps&CLUIF_DISABLEGROUPS)) ShowWindow(GetDlgItem(hwndDlg,IDC_DISABLEGROUPS),SW_HIDE); + if (caps&CLUIF_HASONTOPOPTION) ShowWindow(GetDlgItem(hwndDlg,IDC_ONTOP),SW_HIDE); + if (caps&CLUIF_HASAUTOHIDEOPTION) { + ShowWindow(GetDlgItem(hwndDlg,IDC_AUTOHIDE),SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg,IDC_HIDETIME),SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg,IDC_HIDETIMESPIN),SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg,IDC_STAUTOHIDESECS),SW_HIDE); + } + } + SendDlgItemMessage(hwndDlg,IDC_HIDETIMESPIN,UDM_SETRANGE,0,MAKELONG(900,1)); + SendDlgItemMessage(hwndDlg,IDC_HIDETIMESPIN,UDM_SETPOS,0,MAKELONG(db_get_w(NULL,"CList","HideTime",SETTING_HIDETIME_DEFAULT),0)); + CheckDlgButton(hwndDlg, IDC_ONECLK, db_get_b(NULL,"CList","Tray1Click",SETTING_TRAY1CLICK_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_ALWAYSSTATUS, db_get_b(NULL,"CList","AlwaysStatus",SETTING_ALWAYSSTATUS_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_ALWAYSMULTI, !db_get_b(NULL,"CList","AlwaysMulti",SETTING_ALWAYSMULTI_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_DONTCYCLE, db_get_b(NULL,"CList","TrayIcon",SETTING_TRAYICON_DEFAULT) == SETTING_TRAYICON_SINGLE ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CYCLE, db_get_b(NULL,"CList","TrayIcon",SETTING_TRAYICON_DEFAULT) == SETTING_TRAYICON_CYCLE ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_MULTITRAY, db_get_b(NULL,"CList","TrayIcon",SETTING_TRAYICON_DEFAULT) == SETTING_TRAYICON_MULTI ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_DISABLEBLINK, db_get_b(NULL,"CList","DisableTrayFlash",0) == 1 ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_ICONBLINK, db_get_b(NULL,"CList","NoIconBlink",0) == 1 ? BST_CHECKED : BST_UNCHECKED ); + + if (IsDlgButtonChecked(hwndDlg,IDC_DONTCYCLE)) { + EnableWindow(GetDlgItem(hwndDlg,IDC_CYCLETIMESPIN),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_CYCLETIME),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_ALWAYSMULTI),FALSE); + } + if (IsDlgButtonChecked(hwndDlg,IDC_CYCLE)) { + EnableWindow(GetDlgItem(hwndDlg,IDC_PRIMARYSTATUS),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_ALWAYSMULTI),FALSE); + } + if (IsDlgButtonChecked(hwndDlg,IDC_MULTITRAY)) { + EnableWindow(GetDlgItem(hwndDlg,IDC_CYCLETIMESPIN),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_CYCLETIME),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_PRIMARYSTATUS),FALSE); + } + SendDlgItemMessage(hwndDlg,IDC_CYCLETIMESPIN,UDM_SETRANGE,0,MAKELONG(120,1)); + SendDlgItemMessage(hwndDlg,IDC_CYCLETIMESPIN,UDM_SETPOS,0,MAKELONG(db_get_w(NULL,"CList","CycleTime",SETTING_CYCLETIME_DEFAULT),0)); + { int i,count,item; + PROTOACCOUNT **accs; + DBVARIANT dbv = {DBVT_DELETED}; + db_get_s(NULL,"CList","PrimaryStatus",&dbv); + ProtoEnumAccounts( &count, &accs ); + item = SendDlgItemMessage(hwndDlg,IDC_PRIMARYSTATUS,CB_ADDSTRING,0,(LPARAM)TranslateT("Global")); + SendDlgItemMessage(hwndDlg,IDC_PRIMARYSTATUS,CB_SETITEMDATA,item,0); + for ( i = 0; i < count; i++ ) { + if ( !IsAccountEnabled(accs[i]) || CallProtoService(accs[i]->szModuleName, PS_GETCAPS, PFLAGNUM_2, 0) == 0) + continue; + + item = SendDlgItemMessage(hwndDlg,IDC_PRIMARYSTATUS,CB_ADDSTRING,0,(LPARAM)accs[i]->tszAccountName); + SendDlgItemMessage(hwndDlg,IDC_PRIMARYSTATUS,CB_SETITEMDATA,item,(LPARAM)accs[i] ); + if ( dbv.type == DBVT_ASCIIZ && !lstrcmpA( dbv.pszVal, accs[i]->szModuleName )) + SendDlgItemMessage(hwndDlg,IDC_PRIMARYSTATUS,CB_SETCURSEL,item,0); + } + } + if (-1 == (int)SendDlgItemMessage(hwndDlg,IDC_PRIMARYSTATUS,CB_GETCURSEL,0,0)) + SendDlgItemMessage(hwndDlg,IDC_PRIMARYSTATUS,CB_SETCURSEL,0,0); + SendDlgItemMessage(hwndDlg,IDC_BLINKSPIN,UDM_SETBUDDY,(WPARAM)GetDlgItem(hwndDlg,IDC_BLINKTIME),0); // set buddy + SendDlgItemMessage(hwndDlg,IDC_BLINKSPIN,UDM_SETRANGE,0,MAKELONG(0x3FFF,250)); + SendDlgItemMessage(hwndDlg,IDC_BLINKSPIN,UDM_SETPOS,0,MAKELONG(db_get_w(NULL,"CList","IconFlashTime",550),0)); + return TRUE; + case WM_VSCROLL: + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case WM_COMMAND: + switch (LOWORD(wParam)) { + case IDC_AUTOHIDE: + EnableWindow(GetDlgItem(hwndDlg,IDC_HIDETIME),IsDlgButtonChecked(hwndDlg,IDC_AUTOHIDE)); + EnableWindow(GetDlgItem(hwndDlg,IDC_HIDETIMESPIN),IsDlgButtonChecked(hwndDlg,IDC_AUTOHIDE)); + break; + case IDC_DONTCYCLE: + case IDC_CYCLE: + case IDC_MULTITRAY: + EnableWindow(GetDlgItem(hwndDlg,IDC_PRIMARYSTATUS),IsDlgButtonChecked(hwndDlg,IDC_DONTCYCLE)); + EnableWindow(GetDlgItem(hwndDlg,IDC_CYCLETIME),IsDlgButtonChecked(hwndDlg,IDC_CYCLE)); + EnableWindow(GetDlgItem(hwndDlg,IDC_CYCLETIMESPIN),IsDlgButtonChecked(hwndDlg,IDC_CYCLE)); + EnableWindow(GetDlgItem(hwndDlg,IDC_ALWAYSMULTI),IsDlgButtonChecked(hwndDlg,IDC_MULTITRAY)); + break; + case IDC_ROWHEIGHT: + if (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus()) return 0; + break; + } + if ((LOWORD(wParam) == IDC_HIDETIME || LOWORD(wParam) == IDC_CYCLETIME) && HIWORD(wParam) != EN_CHANGE) break; + if (LOWORD(wParam) == IDC_PRIMARYSTATUS && HIWORD(wParam) != CBN_SELCHANGE) break; + if ((LOWORD(wParam) == IDC_HIDETIME || LOWORD(wParam) == IDC_CYCLETIME) && (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus())) return 0; + if (LOWORD(wParam) == IDC_BLINKTIME && HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus()) return 0; // dont make apply enabled during buddy set crap + + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case WM_NOTIFY: + switch (((LPNMHDR)lParam)->idFrom) { + case 0: + switch (((LPNMHDR)lParam)->code) { + case PSN_APPLY: + db_set_b(NULL,"CList","HideOffline",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_HIDEOFFLINE)); + { + DWORD caps = CallService(MS_CLUI_GETCAPS,CLUICAPS_FLAGS1,0); + if (caps & CLUIF_HIDEEMPTYGROUPS) db_set_b(NULL,"CList","HideEmptyGroups",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_HIDEEMPTYGROUPS)); + if (caps & CLUIF_DISABLEGROUPS) db_set_b(NULL,"CList","UseGroups",(BYTE)!IsDlgButtonChecked(hwndDlg,IDC_DISABLEGROUPS)); + if ( !(caps & CLUIF_HASONTOPOPTION)) { + db_set_b(NULL,"CList","OnTop",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_ONTOP)); + SetWindowPos(pcli->hwndContactList,IsDlgButtonChecked(hwndDlg,IDC_ONTOP)?HWND_TOPMOST:HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + } + if ( !(caps & CLUIF_HASAUTOHIDEOPTION)) { + db_set_b(NULL,"CList","AutoHide",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_AUTOHIDE)); + db_set_w(NULL,"CList","HideTime",(WORD)SendDlgItemMessage(hwndDlg,IDC_HIDETIMESPIN,UDM_GETPOS,0,0)); + } + } + db_set_b(NULL,"CList","SortByStatus",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_SORTBYSTATUS)); + db_set_b(NULL,"CList","SortByProto",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_SORTBYPROTO)); + db_set_b(NULL,"CList","NoOfflineBottom",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_NOOFFLINEMOVE)); + db_set_b(NULL,"CLC","RowHeight",(BYTE)SendDlgItemMessage(hwndDlg,IDC_ROWHEIGHTSPIN,UDM_GETPOS,0,0)); + db_set_b(NULL,"CLC","GammaCorrect",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_GAMMACORRECT)); + + db_set_b(NULL,"CList","ConfirmDelete",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_CONFIRMDELETE)); + db_set_b(NULL,"CList","Tray1Click",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_ONECLK)); + db_set_b(NULL,"CList","AlwaysStatus",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_ALWAYSSTATUS)); + db_set_b(NULL,"CList","AlwaysMulti",(BYTE)!IsDlgButtonChecked(hwndDlg,IDC_ALWAYSMULTI)); + db_set_b(NULL,"CList","TrayIcon",(BYTE)(IsDlgButtonChecked(hwndDlg,IDC_DONTCYCLE)?SETTING_TRAYICON_SINGLE:(IsDlgButtonChecked(hwndDlg,IDC_CYCLE)?SETTING_TRAYICON_CYCLE:SETTING_TRAYICON_MULTI))); + db_set_w(NULL,"CList","CycleTime",(WORD)SendDlgItemMessage(hwndDlg,IDC_CYCLETIMESPIN,UDM_GETPOS,0,0)); + db_set_w(NULL,"CList","IconFlashTime",(WORD)SendDlgItemMessage(hwndDlg,IDC_BLINKSPIN,UDM_GETPOS,0,0)); + db_set_b(NULL,"CList","DisableTrayFlash",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_DISABLEBLINK)); + db_set_b(NULL,"CList","NoIconBlink", (BYTE)IsDlgButtonChecked(hwndDlg,IDC_ICONBLINK)); + { + int cursel = SendDlgItemMessage(hwndDlg,IDC_PRIMARYSTATUS,CB_GETCURSEL,0,0); + PROTOACCOUNT *pa = (PROTOACCOUNT*)SendDlgItemMessage(hwndDlg,IDC_PRIMARYSTATUS,CB_GETITEMDATA,cursel,0); + if ( pa == NULL ) + db_unset(NULL, "CList","PrimaryStatus"); + else + db_set_s(NULL,"CList","PrimaryStatus", pa->szModuleName); + } + pcli->pfnTrayIconIconsChanged(); + LoadContactTree(); /* this won't do job properly since it only really works when changes happen */ + pcli->pfnInitAutoRebuild(pcli->hwndContactTree); /* force reshuffle */ + return TRUE; + } + break; + } + break; + } + return FALSE; +} diff --git a/plugins/!Deprecated/Clist_mw/src/clistsettings.cpp b/plugins/!Deprecated/Clist_mw/src/clistsettings.cpp new file mode 100644 index 0000000000..01b42ebf6f --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/clistsettings.cpp @@ -0,0 +1,340 @@ +/* + +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), +Copyright (c) 2000-03 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "commonheaders.h" +#include "clist.h" + +TCHAR *GetNameForContact(MCONTACT hContact,int flag,boolean *isUnknown); +char *GetProtoForContact(MCONTACT hContact); +int GetStatusForContact(MCONTACT hContact,char *szProto); +TCHAR *UnknownConctactTranslatedName; +extern boolean OnModulesLoadedCalled; +void InvalidateDisplayNameCacheEntryByPDNE(MCONTACT hContact,ClcCacheEntry *pdnce,int SettingType); + +static int handleCompare( ClcCacheEntry* c1, ClcCacheEntry* c2 ) +{ + return (char*)c1->hContact - (char*)c2->hContact; +} + +void InitDisplayNameCache(SortedList *list) +{ + int i, idx; + + memset(list,0,sizeof(SortedList)); + list->sortFunc = (FSortFunc)handleCompare; + list->increment = CallService(MS_DB_CONTACT_GETCOUNT,0,0)+1; + + i = 0; + for (MCONTACT hContact = db_find_first(); hContact; hContact = db_find_next(hContact)) { + ClcCacheEntry *pdnce = (ClcCacheEntry *)mir_calloc(sizeof(ClcCacheEntry)); + pdnce->hContact = hContact; + InvalidateDisplayNameCacheEntryByPDNE(hContact,pdnce,0); + List_GetIndex(list,pdnce,&idx); + List_Insert(list,pdnce,idx); + i++; +} } + +void FreeDisplayNameCacheItem(ClcCacheEntry *p) +{ + if ( p->tszName) { mir_free(p->tszName); p->tszName = NULL; } + if ( p->szProto) { mir_free(p->szProto); p->szProto = NULL; } + if ( p->tszGroup) { mir_free(p->tszGroup); p->tszGroup = NULL; } +} + +void FreeDisplayNameCache(SortedList *list) +{ + for (int i = 0; i < list->realCount; i++) { + FreeDisplayNameCacheItem((ClcCacheEntry*)list->items[i] ); + mir_free(list->items[i]); + } + + List_Destroy(list); +} + +void CheckPDNCE(ClcCacheEntry *_pdnce) +{ + ClcCacheEntry *pdnce = (ClcCacheEntry *)_pdnce; + if (pdnce == NULL) + return; + + if (pdnce->szProto == NULL && pdnce->protoNotExists == FALSE) { + pdnce->szProto = GetProtoForContact(pdnce->hContact); + if (pdnce->szProto == NULL) + pdnce->protoNotExists = FALSE; + else { + if (CallService(MS_PROTO_ISPROTOCOLLOADED,0,(LPARAM)pdnce->szProto) == 0) + pdnce->protoNotExists = TRUE; + else { + if ( pdnce->szProto && pdnce->tszName ) { + mir_free(pdnce->tszName); + pdnce->tszName = NULL; + } } } } + + if (pdnce->tszName == NULL) + { + if (pdnce->protoNotExists) + pdnce->tszName = mir_tstrdup(TranslateT("_NoProtocol_")); + else { + if (OnModulesLoadedCalled) + pdnce->tszName = GetNameForContact(pdnce->hContact,0,&pdnce->isUnknown); + else + pdnce->tszName = GetNameForContact(pdnce->hContact,0,NULL); + } + } + else { + if (pdnce->isUnknown&&pdnce->szProto&&pdnce->protoNotExists == TRUE&&OnModulesLoadedCalled) { + pdnce->protoNotExists = FALSE; + mir_free(pdnce->tszName); + pdnce->tszName = GetNameForContact(pdnce->hContact,0,&pdnce->isUnknown); + } } + + if (pdnce->status == 0) + pdnce->status = GetStatusForContact(pdnce->hContact,pdnce->szProto); + + if (pdnce->tszGroup == NULL) + { + DBVARIANT dbv; + + if ( !db_get_ts(pdnce->hContact,"CList","Group",&dbv)) + { + pdnce->tszGroup = mir_tstrdup(dbv.ptszVal); + mir_free(dbv.pszVal); + } + else pdnce->tszGroup = mir_tstrdup( _T("")); + } + + if (pdnce->bIsHidden == -1) + pdnce->bIsHidden = db_get_b(pdnce->hContact,"CList","Hidden",0); + + if (pdnce->noHiddenOffline == -1) + pdnce->noHiddenOffline = db_get_b(pdnce->hContact,"CList","noOffline",0); + + if ( pdnce->IdleTS == -1 ) + pdnce->IdleTS = db_get_dw(pdnce->hContact,pdnce->szProto,"IdleTS",0); + + if (pdnce->ApparentMode == -1) + pdnce->ApparentMode = db_get_w(pdnce->hContact,pdnce->szProto,"ApparentMode",0); + + if (pdnce->NotOnList == -1) + pdnce->NotOnList = db_get_b(pdnce->hContact,"CList","NotOnList",0); + + if (pdnce->IsExpanded == -1) + pdnce->IsExpanded = db_get_b(pdnce->hContact,"CList","Expanded",0); +} + +void InvalidateDisplayNameCacheEntryByPDNE(MCONTACT hContact,ClcCacheEntry *pdnce,int SettingType) +{ + if ( hContact == NULL || pdnce == NULL ) + return; + + if ( SettingType == -1 || SettingType == DBVT_DELETED ) + { + mir_free(pdnce->tszName); + pdnce->tszName = NULL; + mir_free(pdnce->tszGroup); + pdnce->tszGroup = NULL; + + pdnce->bIsHidden = -1; + pdnce->protoNotExists = FALSE; + mir_free(pdnce->szProto); + pdnce->szProto = NULL; + pdnce->status = 0; + pdnce->IdleTS = -1; + pdnce->ApparentMode = -1; + pdnce->NotOnList = -1; + pdnce->isUnknown = FALSE; + pdnce->noHiddenOffline = -1; + pdnce->IsExpanded = -1; + return; + } + + if (SettingType >= DBVT_WCHAR) + { + mir_free(pdnce->tszName); + pdnce->tszName = NULL; + mir_free(pdnce->tszGroup); + pdnce->tszGroup = NULL; + mir_free(pdnce->szProto); + pdnce->szProto = NULL; + return; + } + + // in other cases clear all binary cache + pdnce->bIsHidden = -1; + pdnce->protoNotExists = FALSE; + pdnce->status = 0; + pdnce->IdleTS = -1; + pdnce->ApparentMode = -1; + pdnce->NotOnList = -1; + pdnce->isUnknown = FALSE; + pdnce->noHiddenOffline = -1; + pdnce->IsExpanded = -1; +} + +char *GetContactCachedProtocol(MCONTACT hContact) +{ + ClcCacheEntry *cacheEntry = (ClcCacheEntry *)pcli->pfnGetCacheEntry(hContact); + if (cacheEntry&&cacheEntry->szProto) + return cacheEntry->szProto; + + return NULL; +} + +char *GetProtoForContact(MCONTACT hContact) +{ + return mir_strdup(GetContactProto(hContact)); +} + +int GetStatusForContact(MCONTACT hContact,char *szProto) +{ + int status = ID_STATUS_OFFLINE; + if (szProto) + status = db_get_w((MCONTACT)hContact, szProto, "Status", ID_STATUS_OFFLINE); + + return (status); +} + +TCHAR* GetNameForContact(MCONTACT hContact,int flag,boolean *isUnknown) +{ + TCHAR* result = pcli->pfnGetContactDisplayName(hContact, flag | GCDNF_NOCACHE); + + if (isUnknown) { + if (UnknownConctactTranslatedName == NULL) + UnknownConctactTranslatedName = TranslateT("(Unknown Contact)"); + + *isUnknown = lstrcmp(result ,UnknownConctactTranslatedName) == 0; + } + + return result; +} + +ClcCacheEntry *GetContactFullCacheEntry(MCONTACT hContact) +{ + ClcCacheEntry *cacheEntry = (ClcCacheEntry *)pcli->pfnGetCacheEntry(hContact); + if (cacheEntry != NULL) + return(cacheEntry); + + return NULL; +} + +int GetContactInfosForSort(MCONTACT hContact,char **Proto,TCHAR **Name,int *Status) +{ + ClcCacheEntry *cacheEntry = (ClcCacheEntry *)pcli->pfnGetCacheEntry(hContact); + if (cacheEntry != NULL) + { + if (Proto != NULL) *Proto = cacheEntry->szProto; + if (Name != NULL) *Name = cacheEntry->tszName; + if (Status != NULL) *Status = cacheEntry->status; + } + return 0; +} + +int GetContactCachedStatus(MCONTACT hContact) +{ + ClcCacheEntry *cacheEntry = (ClcCacheEntry *)pcli->pfnGetCacheEntry(hContact); + if (cacheEntry&&cacheEntry->status != 0) return cacheEntry->status; + return 0; +} + +int ContactSettingChanged(WPARAM hContact, LPARAM lParam) +{ + DBCONTACTWRITESETTING *cws = (DBCONTACTWRITESETTING*)lParam; + + // Early exit + if (hContact == NULL) + return 0; + + __try + { + ClcCacheEntry *pdnce = (ClcCacheEntry *)pcli->pfnGetCacheEntry(hContact); + if (pdnce == NULL) { + OutputDebugStringA("!!! Very bad pdnce not found."); + return 0; + } + + if (pdnce && pdnce->protoNotExists == FALSE && pdnce->szProto) { + if ( !strcmp(cws->szModule,pdnce->szProto)) { + InvalidateDisplayNameCacheEntryByPDNE(hContact,pdnce,cws->value.type); + + if (cws->value.type == DBVT_WORD && !strcmp(cws->szSetting, "Status")) { + if ( !(pdnce->bIsHidden == 1)) { + + if ( db_get_b(NULL,"CList","ShowStatusMsg",0)||db_get_b(hContact,"CList","StatusMsgAuto",0)) + db_set_s(hContact, "CList", "StatusMsg", ""); + + if ( db_get_b(NULL, "CList", "HideOffline", SETTING_HIDEOFFLINE_DEFAULT)) { + // User's state is changing, and we are hideOffline-ing + if (cws->value.wVal == ID_STATUS_OFFLINE) { + ChangeContactIcon(hContact, ExtIconFromStatusMode(hContact,cws->szModule, cws->value.wVal), 0); //by FYR + return 0; + } + ChangeContactIcon(hContact, ExtIconFromStatusMode(hContact,cws->szModule, cws->value.wVal), 0); //by FYR + } + else ChangeContactIcon(hContact, ExtIconFromStatusMode(hContact,cws->szModule, cws->value.wVal), 0); //by FYR + } + } + else if (!strcmp(cws->szModule, META_PROTO)) { + pcli->pfnInitAutoRebuild(pcli->hwndContactTree); + return 0; + } + else return 0; + + SortContacts(); + } + } + + if ( !strcmp(cws->szModule,"CList")) { + if (pdnce->tszName == NULL || !strcmp(cws->szSetting,"MyHandle")) + InvalidateDisplayNameCacheEntryByPDNE(hContact,pdnce,cws->value.type); + + if ((!strcmp(cws->szSetting,"Group"))) + InvalidateDisplayNameCacheEntryByPDNE(hContact,pdnce,cws->value.type); + + if ( !strcmp(cws->szSetting,"Hidden")) { + InvalidateDisplayNameCacheEntryByPDNE(hContact,pdnce,cws->value.type); + if (cws->value.type == DBVT_DELETED || cws->value.bVal == 0) { + char *szProto = GetContactProto(hContact); + ChangeContactIcon(hContact,ExtIconFromStatusMode(hContact, szProto, szProto == NULL ? ID_STATUS_OFFLINE : db_get_w(hContact, szProto, "Status", ID_STATUS_OFFLINE)), 1); //by FYR + } + } + + if ( !strcmp(cws->szSetting, "noOffline")) + InvalidateDisplayNameCacheEntryByPDNE(hContact, pdnce, cws->value.type); + } + + if ( !strcmp(cws->szModule, "Protocol")) { + if ( !strcmp(cws->szSetting,"p")) { + OutputDebugStringA("CHANGE: proto\r\n"); + InvalidateDisplayNameCacheEntryByPDNE(hContact, pdnce, cws->value.type); + char *szProto = (cws->value.type == DBVT_DELETED) ? NULL : cws->value.pszVal; + ChangeContactIcon(hContact, ExtIconFromStatusMode(hContact, szProto, szProto == NULL?ID_STATUS_OFFLINE:db_get_w(hContact,szProto,"Status",ID_STATUS_OFFLINE)),0); //by FYR + } + } + } + __except (exceptFunction(GetExceptionInformation())) + { + } + + return 0; +} diff --git a/plugins/!Deprecated/Clist_mw/src/clisttray.cpp b/plugins/!Deprecated/Clist_mw/src/clisttray.cpp new file mode 100644 index 0000000000..aa89abe500 --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/clisttray.cpp @@ -0,0 +1,263 @@ +/* + +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), +Copyright (c) 2000-03 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "commonheaders.h" +#include "m_clui.h" + +#define TIM_CALLBACK (WM_USER+1857) +#define TIM_CREATE (WM_USER+1858) + +extern INT_PTR ( *saveTrayIconProcessMessage )(WPARAM wParam, LPARAM lParam); +void DestroyTrayMenu(HMENU hMenu); + +INT_PTR TrayIconProcessMessage(WPARAM wParam, LPARAM lParam) +{ + MSG *msg = (MSG*)wParam; + switch(msg->message) { + case WM_DRAWITEM: + return CallService(MS_CLIST_MENUDRAWITEM,msg->wParam,msg->lParam); + break; + + case WM_MEASUREITEM: + return CallService(MS_CLIST_MENUMEASUREITEM,msg->wParam,msg->lParam); + break; + + case TIM_CALLBACK: + if (msg->lParam == WM_RBUTTONUP) { + POINT pt; + HMENU hMenu = (HMENU)CallService(MS_CLIST_MENUBUILDTRAY,0,0); + + SetForegroundWindow(msg->hwnd); + SetFocus(msg->hwnd); + GetCursorPos(&pt); + TrackPopupMenu(hMenu, TPM_TOPALIGN | TPM_LEFTALIGN, pt.x, pt.y, 0, msg->hwnd, NULL); + DestroyTrayMenu(hMenu); + } + else break; + + *((LRESULT*)lParam) = 0; + return TRUE; + } + + return saveTrayIconProcessMessage( wParam, lParam ); +} + +//////////////////////////////TRAY MENU///////////////////////// +HANDLE hTrayMenuObject; + +HANDLE hTrayMainMenuItemProxy; +HANDLE hHideShowMainMenuItem; +HANDLE hTrayStatusMenuItemProxy; +HANDLE hPreBuildTrayMenuEvent; + +//traymenu exec param(ownerdata) +typedef struct +{ + char *szServiceName; + INT_PTR Param1; +} + TrayMenuExecParam,*lpTrayMenuExecParam; + +/* +wparam = handle to the menu item returned by MS_CLIST_ADDCONTACTMENUITEM +return 0 on success. +*/ +static INT_PTR RemoveTrayMenuItem(WPARAM wParam, LPARAM lParam) +{ + CallService(MO_REMOVEMENUITEM,wParam,0); + return 0; +} + +static INT_PTR BuildTrayMenu(WPARAM wParam, LPARAM lParam) +{ + int tick; + HMENU hMenu; + ListParam param = { 0 }; + param.MenuObjectHandle = hTrayMenuObject; + + //hMenu = hMainMenu; + hMenu = CreatePopupMenu(); + //hMenu = wParam; + tick = GetTickCount(); + + NotifyEventHooks(hPreBuildTrayMenuEvent,0,0); + + CallService(MO_BUILDMENU,(WPARAM)hMenu,(LPARAM)¶m); + //DrawMenuBar((HWND)CallService("CLUI/GetHwnd",0,0)); + tick = GetTickCount()-tick; + return (INT_PTR)hMenu; +} + +static INT_PTR AddTrayMenuItem(WPARAM wParam, LPARAM lParam) +{ + TMO_MenuItem tmi; + CLISTMENUITEM *mi = (CLISTMENUITEM*)lParam; + if ( !pcli->pfnConvertMenu(mi, &tmi)) + return NULL; + + lpTrayMenuExecParam mmep = (lpTrayMenuExecParam)mir_alloc(sizeof(TrayMenuExecParam)); + if (mmep == NULL) + return 0; + + mmep->szServiceName = mir_strdup(mi->pszService); + mmep->Param1 = mi->popupPosition; + tmi.ownerdata = mmep; + + OptParam op; + op.Handle = (HANDLE)CallService(MO_ADDNEWMENUITEM,(WPARAM)hTrayMenuObject,(LPARAM)&tmi); + op.Setting = OPT_MENUITEMSETUNIQNAME; + op.Value = (INT_PTR)mi->pszService; + CallService(MO_SETOPTIONSMENUITEM,0,(LPARAM)&op); + return (INT_PTR)op.Handle; +} + +INT_PTR TrayMenuCheckService(WPARAM wParam, LPARAM lParam) +{ + return 0; +} + +INT_PTR TrayMenuonAddService(WPARAM wParam, LPARAM lParam) +{ + MENUITEMINFO *mii = (MENUITEMINFO* )wParam; + if (mii == NULL) return 0; + + if (hHideShowMainMenuItem == (HANDLE)lParam) { + mii->fMask |= MIIM_STATE; + mii->fState |= MFS_DEFAULT; + } + + if (hTrayMainMenuItemProxy == (HANDLE)lParam) { + mii->fMask |= MIIM_SUBMENU; + mii->hSubMenu = (HMENU)CallService(MS_CLIST_MENUGETMAIN,0,0); + } + + if (hTrayStatusMenuItemProxy == (HANDLE)lParam) { + mii->fMask |= MIIM_SUBMENU; + mii->hSubMenu = (HMENU)CallService(MS_CLIST_MENUGETSTATUS,0,0); + } + + return(TRUE); +} + + +//called with: +//wparam - ownerdata +//lparam - lparam from winproc +INT_PTR TrayMenuExecService(WPARAM wParam, LPARAM lParam) +{ + if (wParam != 0) + { + lpTrayMenuExecParam mmep = (lpTrayMenuExecParam)wParam; + if ( !strcmp(mmep->szServiceName,"Help/AboutCommand")) + { + //bug in help.c,it used wparam as parent window handle without reason. + mmep->Param1 = 0; + } + CallService(mmep->szServiceName,mmep->Param1,lParam); + } + return(1); +} + +INT_PTR FreeOwnerDataTrayMenu (WPARAM wParam, LPARAM lParam) +{ + + lpTrayMenuExecParam mmep; + mmep = (lpTrayMenuExecParam)lParam; + if (mmep != NULL){ + mir_free(mmep->szServiceName); + mir_free(mmep); + } + + return 0; +} + +void InitTrayMenus(void) +{ + //Tray menu + hTrayMenuObject = MO_CreateMenuObject("TrayMenu", LPGEN("Tray menu"), 0, "CLISTMENUSTRAY/ExecService"); + MO_SetMenuObjectParam(hTrayMenuObject, OPT_USERDEFINEDITEMS, TRUE); + MO_SetMenuObjectParam(hTrayMenuObject, OPT_MENUOBJECT_SET_FREE_SERVICE, "CLISTMENUSTRAY/FreeOwnerDataTrayMenu"); + MO_SetMenuObjectParam(hTrayMenuObject, OPT_MENUOBJECT_SET_ONADD_SERVICE, "CLISTMENUSTRAY/TrayMenuonAddService"); + + CreateServiceFunction("CLISTMENUSTRAY/ExecService",TrayMenuExecService); + CreateServiceFunction("CLISTMENUSTRAY/FreeOwnerDataTrayMenu",FreeOwnerDataTrayMenu); + CreateServiceFunction("CLISTMENUSTRAY/TrayMenuonAddService",TrayMenuonAddService); + + CreateServiceFunction("CList/AddTrayMenuItem",AddTrayMenuItem); + CreateServiceFunction(MS_CLIST_REMOVETRAYMENUITEM,RemoveTrayMenuItem); + CreateServiceFunction(MS_CLIST_MENUBUILDTRAY,BuildTrayMenu); + hPreBuildTrayMenuEvent = CreateHookableEvent(ME_CLIST_PREBUILDTRAYMENU); + + //add exit command to menu + CLISTMENUITEM mi = { sizeof(mi) }; + mi.position = 900000; + mi.pszService = "CloseAction"; + mi.pszName = LPGEN("E&xit"); + AddTrayMenuItem(0,(LPARAM)&mi); + + memset(&mi,0,sizeof(mi)); + mi.cbSize = sizeof(mi); + mi.position = 100000; + mi.pszService = MS_CLIST_SHOWHIDE; + mi.pszName = LPGEN("&Hide/Show"); + hHideShowMainMenuItem = (HANDLE)AddTrayMenuItem(0,(LPARAM)&mi); + + memset(&mi,0,sizeof(mi)); + mi.cbSize = sizeof(mi); + mi.position = 200000; + mi.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_FINDUSER)); + mi.pszService = "FindAdd/FindAddCommand"; + mi.pszName = LPGEN("&Find/Add contacts..."); + AddTrayMenuItem(0,(LPARAM)&mi); + + memset(&mi,0,sizeof(mi)); + mi.cbSize = sizeof(mi); + mi.position = 300000; + mi.pszService = ""; + mi.pszName = LPGEN("&Main menu"); + hTrayMainMenuItemProxy = (HANDLE)AddTrayMenuItem(0,(LPARAM)&mi); + + memset(&mi,0,sizeof(mi)); + mi.cbSize = sizeof(mi); + mi.position = 300100; + mi.pszService = ""; + mi.pszName = LPGEN("&Status"); + hTrayStatusMenuItemProxy = (HANDLE)AddTrayMenuItem(0,(LPARAM)&mi); + + memset(&mi,0,sizeof(mi)); + mi.cbSize = sizeof(mi); + mi.position = 400000; + mi.hIcon = LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_OPTIONS)); + mi.pszService = "Options/OptionsCommand"; + mi.pszName = LPGEN("&Options..."); + AddTrayMenuItem(0,(LPARAM)&mi); + + memset(&mi,0,sizeof(mi)); + mi.cbSize = sizeof(mi); + mi.position = 500000; + mi.hIcon = LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_CLIENTMIRANDA)); + mi.pszService = "Help/AboutCommand"; + mi.pszName = LPGEN("&About"); + AddTrayMenuItem(0,(LPARAM)&mi); +} diff --git a/plugins/!Deprecated/Clist_mw/src/clui.cpp b/plugins/!Deprecated/Clist_mw/src/clui.cpp new file mode 100644 index 0000000000..69ea15f8e1 --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/clui.cpp @@ -0,0 +1,765 @@ +/* + +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), +Copyright (c) 2000-03 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "commonheaders.h" + +#define TM_AUTOALPHA 1 +#define TM_STATUSBARUPDATE 200 +#define MENU_MIRANDAMENU 0xFFFF1234 + +extern int DefaultImageListColorDepth; + +HMENU hMenuMain; +static HANDLE hContactDraggingEvent,hContactDroppedEvent,hContactDragStopEvent; +UINT hMsgGetProfile = 0; + +extern boolean canloadstatusbar; +boolean OnModulesLoadedCalled = FALSE; + +static int transparentFocus = 1; +static byte oldhideoffline; +static int lastreqh = 0,requr = 0,disableautoupd = 1; +HANDLE hFrameContactTree; +BYTE showOpts;//for statusbar + +typedef struct +{ + int IconsCount; + int CycleStartTick; + char *szProto; + int n; + int TimerCreated; +} + ProtoTicks,*pProtoTicks; + +ProtoTicks CycleStartTick[64];//max 64 protocols + +int CycleTimeInterval = 2000; +int CycleIconCount = 8; +int DefaultStep = 100; + +int CluiOptInit(WPARAM wParam, LPARAM lParam); +int SortList(WPARAM wParam, LPARAM lParam); + +void CluiProtocolStatusChanged(int parStatus, const char* szProto); + +extern void ReloadExtraIcons(); +extern HWND CreateStatusBarhWnd(HWND parent); +extern HANDLE CreateStatusBarFrame(); +extern int CLUIFramesUpdateFrame(WPARAM wParam, LPARAM lParam); +extern void DrawDataForStatusBar(LPDRAWITEMSTRUCT dis); +extern void InitGroupMenus(); +extern int UseOwnerDrawStatusBar; + +HICON GetConnectingIconForProto(char *szProto,int b); +HICON GetConnectingIconForProto_DLL(char *szProto,int b); + +void RegisterProtoIconsForAllProtoIconLib(); + +static int CluiModulesLoaded(WPARAM wParam, LPARAM lParam) +{ + MENUITEMINFO mii = { sizeof(mii) }; + mii.fMask = MIIM_SUBMENU; + mii.hSubMenu = (HMENU)CallService(MS_CLIST_MENUGETMAIN,0,0); + SetMenuItemInfo(hMenuMain,0,TRUE,&mii); + mii.hSubMenu = (HMENU)CallService(MS_CLIST_MENUGETSTATUS,0,0); + SetMenuItemInfo(hMenuMain,1,TRUE,&mii); + + canloadstatusbar = TRUE; + SendMessage(pcli->hwndContactList,WM_SIZE,0,0); + CluiProtocolStatusChanged(0,0); + Sleep(0); + PostMessage(pcli->hwndContactList,M_CREATECLC,0,0); + + OnModulesLoadedCalled = TRUE; + pcli->pfnInvalidateDisplayNameCacheEntry(INVALID_CONTACT_ID); + InitGroupMenus(); + RegisterProtoIconsForAllProtoIconLib(); + return 0; +} + +pProtoTicks GetProtoTicksByProto(char * szProto) +{ + int i; + + for (i = 0;i<64;i++) + { + if (CycleStartTick[i].szProto == NULL) break; + if (strcmp(CycleStartTick[i].szProto,szProto)) continue; + return(&CycleStartTick[i]); + } + for (i = 0;i<64;i++) + { + if (CycleStartTick[i].szProto == NULL) + { + CycleStartTick[i].szProto = mir_strdup(szProto); + CycleStartTick[i].CycleStartTick = 0; + CycleStartTick[i].n = i; + return(&CycleStartTick[i]); + } + } + return NULL; +} + +int GetConnectingIconForProtoCount(char *szProto) +{ + char file[MAX_PATH],fileFull[MAX_PATH],szFullPath[MAX_PATH]; + char szPath[MAX_PATH]; + char *str; + int ret; + + GetModuleFileNameA(GetModuleHandle(NULL), szPath, MAX_PATH); + str = strrchr(szPath,'\\'); + if (str != NULL) *str = 0; + mir_snprintf(szFullPath, SIZEOF(szFullPath), "%s\\Icons\\proto_conn_%s.dll", szPath, szProto); + + lstrcpynA(file,szFullPath,SIZEOF(file)); + PathToAbsolute(file, fileFull); + ret = ExtractIconExA(fileFull,-1,NULL,NULL,1); + if (ret == 0&&!strcmp(szProto,"ICQ")) ret = 8; + return ret; +} + +static HICON ExtractIconFromPath(const char *path) +{ + char *comma; + char file[MAX_PATH],fileFull[MAX_PATH]; + int n; + HICON hIcon; + lstrcpynA(file,path,SIZEOF(file)); + comma = strrchr(file,','); + if (comma == NULL) n = 0; + else {n = atoi(comma+1); *comma = 0;} + PathToAbsolute(file, fileFull); + + hIcon = NULL; + ExtractIconExA(fileFull,n,NULL,&hIcon,1); + return hIcon; +} + +HICON LoadIconFromExternalFile(char *filename,int i,boolean UseLibrary,boolean registerit,char *IconName,char *SectName,char *Description,int internalidx,HICON DefIcon) +{ + char szPath[MAX_PATH],szMyPath[MAX_PATH], szFullPath[MAX_PATH],*str; + HICON hIcon = NULL; + + memset(szMyPath,0,SIZEOF(szMyPath)); + memset(szFullPath,0,SIZEOF(szFullPath)); + + if (filename != NULL) + { + GetModuleFileNameA(GetModuleHandle(NULL), szPath, MAX_PATH); + GetModuleFileNameA(g_hInst, szMyPath, MAX_PATH); + str = strrchr(szPath,'\\'); + if (str != NULL) *str = 0; + mir_snprintf(szFullPath, SIZEOF(szFullPath), "%s\\Icons\\%s,%d", szPath, filename, i); + } + + if ( !UseLibrary) { + hIcon = ExtractIconFromPath(szFullPath); + if (hIcon) return hIcon; + } + else { + if (registerit && IconName != NULL && SectName != NULL) { + SKINICONDESC sid = { sizeof(sid) }; + sid.pszSection = SectName; + sid.pszName = IconName; + sid.pszDescription = Description; + if (szMyPath[0] != 0) + sid.pszDefaultFile = szMyPath; + + sid.iDefaultIndex = internalidx; + sid.hDefaultIcon = DefIcon; + + Skin_AddIcon(&sid); + } + return Skin_GetIcon(IconName); + } + + return (HICON)0; +} + +void RegisterProtoIcons (char *protoname) +{ + if ( db_get_b(NULL,"CList","UseProtoIconFromIcoLib",1)) + { + int i; + char buf[256]; + char buf2[256]; + for (i = 0;i<8;i++) + { + mir_snprintf(buf, SIZEOF(buf), "%s #%d", protoname, i); + mir_snprintf(buf2, SIZEOF(buf2), "Contact list/Connection Icons %s", protoname); + + LoadIconFromExternalFile(NULL,i,TRUE,TRUE,buf,buf2,buf,0,GetConnectingIconForProto_DLL(protoname,i)); + } + } +} + +void RegisterProtoIconsForAllProtoIconLib() +{ + int protoCount,i; + PROTOACCOUNT **accs; + + ProtoEnumAccounts( &protoCount, &accs ); + for ( i = 0; i < protoCount; i++ ) + if ( IsAccountEnabled( accs[i] ) && CallProtoService( accs[i]->szModuleName, PS_GETCAPS, PFLAGNUM_2, 0 )) + RegisterProtoIcons( accs[i]->szModuleName ); +} + +HICON GetConnectingIconForProto_DLL(char *szProto,int b) +{ + char szFullPath[MAX_PATH]; + HICON hIcon = NULL; + + b = b-1; + mir_snprintf(szFullPath, SIZEOF(szFullPath), "proto_conn_%s.dll", szProto); + // hIcon = ExtractIconFromPath(szFullPath); + // if (hIcon) return hIcon; + + hIcon = LoadIconFromExternalFile(szFullPath,b+1,FALSE,FALSE,NULL,NULL,NULL,0,0); + if (hIcon) return hIcon; + +#ifdef _DEBUG + { + char buf [256]; + mir_snprintf(buf, SIZEOF(buf), "IconNotFound %s %d\r\n", szProto, b); + // OutputDebugStringA(buf); + } +#endif + + if ( !strcmp(szProto,"ICQ")) + { + +#ifdef _DEBUG + char buf [256]; + mir_snprintf(buf, SIZEOF(buf), "Icon %d %d\r\n", GetTickCount(), b); + //OutputDebugStringA(buf); +#endif + return(LoadIconA(g_hInst,(LPCSTR)(IDI_ICQC1+b))); + } + + return(hIcon); +} + +HICON GetConnectingIconForProto(char *szProto,int b) +{ + if ( db_get_b(NULL,"CList","UseProtoIconFromIcoLib",1)) { + HICON hIcon = 0; + char buf[256]; + mir_snprintf(buf, SIZEOF(buf), "%s #%d", szProto, b); + + hIcon = LoadIconFromExternalFile(NULL,b,TRUE,FALSE,buf,"Contact list/Connection icons",buf,0,NULL); + if (hIcon == NULL) return (GetConnectingIconForProto_DLL(szProto,b)); + return (CopyIcon(hIcon)); + } + + return GetConnectingIconForProto_DLL(szProto, b); +} + +//wParam == szProto +INT_PTR GetConnectingIconService(WPARAM wParam, LPARAM lParam) +{ + int b; + ProtoTicks *pt = NULL; + HICON hIcon = NULL; + + char *szProto = (char *)wParam; + if ( !szProto) return 0; + + pt = GetProtoTicksByProto(szProto); + + if (pt != NULL) { + if (pt->CycleStartTick != 0&&pt->IconsCount != 0) { + b = ((GetTickCount()-pt->CycleStartTick)/(DefaultStep))%pt->IconsCount; + hIcon = GetConnectingIconForProto(szProto,b); + } + } + + return (INT_PTR)hIcon; +} + +int CreateTimerForConnectingIcon(WPARAM wParam, LPARAM lParam) +{ + int status = (int)wParam; + char *szProto = (char *)lParam; + if ( !szProto) return 0; + if ( !status) return 0; + + if (( db_get_b(NULL,"CLUI","UseConnectingIcon",1) == 1) && status >= ID_STATUS_CONNECTING && status <= ID_STATUS_CONNECTING + MAX_CONNECT_RETRIES) { + ProtoTicks *pt = NULL; + int cnt; + + pt = GetProtoTicksByProto(szProto); + if (pt != NULL) { + if (pt->CycleStartTick == 0) { + KillTimer(pcli->hwndContactList,TM_STATUSBARUPDATE+pt->n); + cnt = GetConnectingIconForProtoCount(szProto); + if ( db_get_b(NULL,"Clist","UseProtoIconFromIcoLib",1)) + cnt = 8; + + if (cnt != 0) { + DefaultStep = db_get_w(NULL,"CLUI","DefaultStepConnectingIcon",100); + pt->IconsCount = cnt; + SetTimer(pcli->hwndContactList,TM_STATUSBARUPDATE+pt->n,(int)(DefaultStep)/1,0); + pt->TimerCreated = 1; + pt->CycleStartTick = GetTickCount(); + } + } + } + } + return 0; +} + +// Restore protocols to the last global status. +// Used to reconnect on restore after standby. + +int OnSettingChanging(WPARAM hContact, LPARAM lParam) +{ + DBCONTACTWRITESETTING *dbcws = (DBCONTACTWRITESETTING *)lParam; + if (hContact == 0) { + if ((dbcws->value.type == DBVT_BYTE) && !strcmp(dbcws->szModule,"CLUI")) { + if (!strcmp(dbcws->szSetting,"SBarShow")) { + showOpts = dbcws->value.bVal; + return 0; + } + } + } + return 0; +} + +HWND PreCreateCLC(HWND parent) +{ + pcli->hwndContactTree = CreateWindow( _T(CLISTCONTROL_CLASS),_T(""), + WS_CHILD|WS_CLIPCHILDREN|CLS_CONTACTLIST + |( db_get_b(NULL,"CList","UseGroups",SETTING_USEGROUPS_DEFAULT)?CLS_USEGROUPS:0) + | CLS_HIDEOFFLINE + //|( db_get_b(NULL,"CList","HideOffline",SETTING_HIDEOFFLINE_DEFAULT)?CLS_HIDEOFFLINE:0) + |( db_get_b(NULL,"CList","HideEmptyGroups",SETTING_HIDEEMPTYGROUPS_DEFAULT)?CLS_HIDEEMPTYGROUPS:0) + |( db_get_b(NULL,"CList","ShowStatusMessages",1)?CLS_SHOWSTATUSMESSAGES:0) + |CLS_MULTICOLUMN + //|db_get_b(NULL,"CLUI","ExtraIconsAlignToLeft",1)?CLS_EX_MULTICOLUMNALIGNLEFT:0 + ,0,0,0,0,parent,NULL,g_hInst,NULL); + + return pcli->hwndContactTree; +} + +int CreateCLC(HWND parent) +{ + Sleep(0); + { + // create contact list frame + CLISTFrame Frame; + memset(&Frame,0,sizeof(Frame)); + Frame.cbSize = sizeof(CLISTFrame); + Frame.hWnd = pcli->hwndContactTree; + Frame.align = alClient; + Frame.hIcon = LoadSkinnedIcon(SKINICON_OTHER_FRAME); + //LoadIcon(hInst,MAKEINTRESOURCE(IDI_MIRANDA)); + Frame.Flags = F_VISIBLE|F_SHOWTB|F_SHOWTBTIP|F_TCHAR; + Frame.tname = _T("My contacts"); + Frame.TBtname = TranslateT("My contacts"); + hFrameContactTree = (HWND)CallService(MS_CLIST_FRAMES_ADDFRAME,(WPARAM)&Frame,0); + //free(Frame.name); + CallService(MS_CLIST_FRAMES_SETFRAMEOPTIONS,MAKEWPARAM(FO_TBTIPNAME,hFrameContactTree),(LPARAM)TranslateT("My Contacts")); + } + + lastreqh = 0; + CallService(MS_CLIST_SETHIDEOFFLINE,(WPARAM)oldhideoffline,0); + + int state = db_get_b(NULL,"CList","State",SETTING_STATE_NORMAL); + if (state == SETTING_STATE_NORMAL) ShowWindow(pcli->hwndContactList, SW_SHOW); + else if (state == SETTING_STATE_MINIMIZED) ShowWindow(pcli->hwndContactList, SW_SHOWMINIMIZED); + + lastreqh = 0; + disableautoupd = 0; + + HookEvent(ME_DB_CONTACT_SETTINGCHANGED,OnSettingChanging); + return 0; +} + +int GetStatsuBarProtoRect(HWND hwnd,char *szProto,RECT *rc) +{ + int nParts,nPanel; + ProtocolData *PD; + int startoffset = db_get_dw(NULL,"StatusBar","FirstIconOffset",0); + + if ( !UseOwnerDrawStatusBar) startoffset = 0; + + nParts = SendMessage(hwnd,SB_GETPARTS,0,0); + FillMemory(rc,sizeof(RECT),0); + + for (nPanel = 0;nPanelhwndStatus,SB_GETTEXT,(WPARAM)nPanel,0); + if ( PD == NULL ) + return 0; + + if ( !strcmp(szProto,PD->RealName)) + { + SendMessage(hwnd,SB_GETRECT,(WPARAM)nPanel,(LPARAM)rc); + rc->left += startoffset; + rc->right += startoffset; + return 0; + } + } + return 0; +} + +extern LRESULT ( CALLBACK *saveContactListWndProc )(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); + +LRESULT CALLBACK ContactListWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + /* + This registers a window message with RegisterWindowMessage() and then waits for such a message, + if it gets it, it tries to open a file mapping object and then maps it to this process space, + it expects 256 bytes of data (incl. NULL) it will then write back the profile it is using the DB to fill in the answer. + + The caller is expected to create this mapping object and tell us the ID we need to open ours. + */ + + if (msg == hMsgGetProfile && wParam != 0) { /* got IPC message */ + HANDLE hMap; + char szName[MAX_PATH]; + int rc = 0; + mir_snprintf(szName, SIZEOF(szName), "Miranda::%u", wParam); // caller will tell us the ID of the map + hMap = OpenFileMappingA(FILE_MAP_ALL_ACCESS,FALSE,szName); + if (hMap != NULL) { + void *hView = NULL; + hView = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, MAX_PATH); + if (hView) { + char szFilePath[MAX_PATH], szProfile[MAX_PATH]; + CallService(MS_DB_GETPROFILEPATH,MAX_PATH,(LPARAM)&szFilePath); + CallService(MS_DB_GETPROFILENAME,MAX_PATH,(LPARAM)&szProfile); + mir_snprintf((char*)hView, MAX_PATH, "%s\\%s", szFilePath, szProfile); + UnmapViewOfFile(hView); + rc = 1; + } + CloseHandle(hMap); + } + return rc; + } + + switch (msg) { + case WM_CREATE: + TranslateMenu(GetMenu(hwnd)); + DrawMenuBar(hwnd); + showOpts = db_get_b(NULL,"CLUI","SBarShow",1); + + //create the status wnd + //pcli->hwndStatus == CreateStatusWindow(WS_CHILD | ( db_get_b(NULL,"CLUI","ShowSBar",1)?WS_VISIBLE:0), "", hwnd, 0); + CluiProtocolStatusChanged(0,0); + + hMsgGetProfile = RegisterWindowMessageA( "Miranda::GetProfile" ); // don't localise + + if ( db_get_b( NULL, "CList", "Transparent", 0 )) { + SetWindowLongPtr(hwnd, GWL_EXSTYLE, GetWindowLongPtr(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED); + SetLayeredWindowAttributes(hwnd, RGB(0,0,0), (BYTE)db_get_b(NULL,"CList","Alpha",SETTING_ALPHA_DEFAULT), LWA_ALPHA); + } + transparentFocus = 1; + return FALSE; + + case M_SETALLEXTRAICONS: + return TRUE; + + case M_CREATECLC: + CreateCLC(hwnd); + return TRUE; + + case WM_SIZE: + { + RECT rc; + if ( wParam != SIZE_MINIMIZED ) { + if ( pcli->hwndContactList != NULL ) + CLUIFramesOnClistResize((WPARAM)hwnd,0); + + GetWindowRect(hwnd, &rc); + if ( !CallService(MS_CLIST_DOCKINGISDOCKED,0,0)) { + //if docked, dont remember pos (except for width) + db_set_dw(NULL,"CList","Height",(DWORD)(rc.bottom - rc.top)); + db_set_dw(NULL,"CList","x",(DWORD)rc.left); + db_set_dw(NULL,"CList","y",(DWORD)rc.top); + } + db_set_dw(NULL,"CList","Width",(DWORD)(rc.right - rc.left)); + } + if ( wParam == SIZE_MINIMIZED ) { + if ( db_get_b(NULL,"CList","Min2Tray",SETTING_MIN2TRAY_DEFAULT )) { + ShowWindow(hwnd, SW_HIDE); + db_set_b(NULL,"CList","State",SETTING_STATE_HIDDEN); + } + else db_set_b(NULL,"CList","State",SETTING_STATE_MINIMIZED); + } + return 0; + } + + case WM_SETFOCUS: + { + boolean isfloating; + if ( hFrameContactTree ) { + isfloating = CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS,MAKEWPARAM(FO_FLOATING,hFrameContactTree),0); + if ( isfloating == FALSE) + SetFocus(pcli->hwndContactTree); + } + return 0; + } + case WM_TIMER: + if ((int)wParam>=TM_STATUSBARUPDATE&&(int)wParam<=TM_STATUSBARUPDATE+64) { + int status,i; + + ProtoTicks *pt = NULL; + for (i = 0;i<64;i++) { + pt = &CycleStartTick[i]; + if (pt->szProto != NULL&&pt->TimerCreated == 1) { + status = CallProtoService(pt->szProto,PS_GETSTATUS,0,0); + if ( !(status>=ID_STATUS_CONNECTING&&status<=ID_STATUS_CONNECTING+MAX_CONNECT_RETRIES)) + { + pt->CycleStartTick = 0; + KillTimer(hwnd,TM_STATUSBARUPDATE+pt->n); + pt->TimerCreated = 0; + } } } + + pt = &CycleStartTick[wParam-TM_STATUSBARUPDATE]; + { + RECT rc; + GetStatsuBarProtoRect(pcli->hwndStatus,pt->szProto,&rc); + rc.right = rc.left+GetSystemMetrics(SM_CXSMICON)+1; + rc.top = 0; + + if (IsWindowVisible(pcli->hwndStatus)) InvalidateRect(pcli->hwndStatus,&rc,TRUE); + pcli->pfnTrayIconUpdateBase(pt->szProto); + } + //SendMessage(pcli->hwndStatus,WM_PAINT,0,0); + UpdateWindow(pcli->hwndStatus); + return TRUE; + } + break; + + case WM_DRAWITEM: + { + LPDRAWITEMSTRUCT dis = (LPDRAWITEMSTRUCT)lParam; + if (dis->hwndItem == pcli->hwndStatus) { + DrawDataForStatusBar(dis); + return 0; + } + if (dis->CtlType != ODT_MENU) + return 0; + } + break; + + case WM_KEYDOWN: + CallService(MS_CLIST_MENUPROCESSHOTKEY, wParam, MPCF_MAINMENU | MPCF_CONTACTMENU); + if (wParam == VK_F5) + pcli->pfnInitAutoRebuild(pcli->hwndContactTree); + return TRUE; + + case WM_GETMINMAXINFO: + DefWindowProc(hwnd,msg,wParam,lParam); + ((LPMINMAXINFO)lParam)->ptMinTrackSize.x = 18; + if (requr == 0){((LPMINMAXINFO)lParam)->ptMinTrackSize.y = CLUIFramesGetMinHeight();} + return 0; + + //MSG FROM CHILD CONTROL + case WM_NOTIFY: + if (((LPNMHDR)lParam)->hwndFrom == pcli->hwndContactTree) { + switch (((LPNMHDR)lParam)->code) { + case CLN_LISTSIZECHANGE: + { + NMCLISTCONTROL *nmc = (NMCLISTCONTROL*)lParam; + RECT rcWindow,rcTree,rcWorkArea; + int maxHeight,newHeight; + int winstyle; + + if ( !disableautoupd && db_get_b( NULL, "CLUI", "AutoSize", 0 )) { + if ( !CallService(MS_CLIST_DOCKINGISDOCKED,0,0) && hFrameContactTree != 0 ) { + maxHeight = db_get_b(NULL,"CLUI","MaxSizeHeight",75); + GetWindowRect(hwnd,&rcWindow); + GetWindowRect(pcli->hwndContactTree,&rcTree); + winstyle = GetWindowLongPtr(pcli->hwndContactTree,GWL_STYLE); + + SystemParametersInfo(SPI_GETWORKAREA,0,&rcWorkArea,FALSE); + lastreqh = nmc->pt.y; + newHeight = max(nmc->pt.y,3)+1+((winstyle&WS_BORDER)?2:0)+(rcWindow.bottom-rcWindow.top)-(rcTree.bottom-rcTree.top); + if (newHeight != rcWindow.bottom - rcWindow.top ) { + if (newHeight>(rcWorkArea.bottom-rcWorkArea.top)*maxHeight/100) + newHeight = (rcWorkArea.bottom-rcWorkArea.top)*maxHeight/100; + if ( db_get_b(NULL,"CLUI","AutoSizeUpward",0)) { + rcWindow.top = rcWindow.bottom-newHeight; + if (rcWindow.toprcWorkArea.bottom) rcWindow.bottom = rcWorkArea.bottom; + } + + if (requr == 0) { + requr = 1; + SetWindowPos(hwnd,0,rcWindow.left,rcWindow.top,rcWindow.right-rcWindow.left,rcWindow.bottom-rcWindow.top,SWP_NOZORDER|SWP_NOACTIVATE); + GetWindowRect(hwnd,&rcWindow); + requr = 0; + } } } } + return TRUE; + } + } + } + else if (((LPNMHDR)lParam)->hwndFrom == pcli->hwndStatus) { + if (((LPNMHDR)lParam)->code == NM_CLICK ) { + int nParts = 0, nPanel = 0; + NMMOUSE *nm = (NMMOUSE*)lParam; + HMENU hMenu; + RECT rc; + POINT pt; + int totcount; + ProtocolData *PD; + int menuid; + int startoffset = db_get_dw(NULL,"StatusBar","FirstIconOffset",0); + int extraspace = db_get_dw(NULL,"StatusBar","BkExtraSpace",0); + boolean UseOwnerDrawStatusBar = db_get_b(NULL,"CLUI","UseOwnerDrawStatusBar",0); + + hMenu = (HMENU)CallService(MS_CLIST_MENUGETSTATUS,0,0); + nParts = SendMessage(pcli->hwndStatus,SB_GETPARTS,0,0); + + if (nm->dwItemSpec == 0xFFFFFFFE) { + nPanel = nParts-1; + SendMessage(pcli->hwndStatus,SB_GETRECT,nPanel,(LPARAM)&rc); + if (nm->pt.x < rc.left) return FALSE; + } + else { + if ( !((startoffset) != 0 && UseOwnerDrawStatusBar)) { + nPanel = nm->dwItemSpec; + SendMessage(pcli->hwndStatus,SB_GETRECT,nPanel,(LPARAM)&rc); + } + else { + RECT clrc = { 0 }; + GetClientRect(pcli->hwndStatus,&clrc); + clrc.right -= clrc.left; + clrc.right -= startoffset; + int sectwidth = clrc.right/nParts; + + for (nPanel = 0;nPanelhwndStatus,SB_GETTEXT,(WPARAM)nPanel,0); + if (PD == NULL) + continue; + + rc.top = 0; + rc.bottom = clrc.bottom; + rc.left = nPanel*sectwidth+startoffset; + rc.right = rc.left+sectwidth-1; + + if (PtInRect(&rc,nm->pt)) + break; + } } } + + totcount = db_get_dw(0,"Protocols","ProtoCount",0); + PD = (ProtocolData *)SendMessage(pcli->hwndStatus,SB_GETTEXT,(WPARAM)nPanel,0); + if (PD == NULL){return 0;} + menuid = nPanel; + + if (menuid<0){break;} + hMenu = (HMENU)CallService(MS_CLIST_MENUGETSTATUS,0,0); + { + unsigned int cpnl = 0; + int mcnt = GetMenuItemCount(hMenu); + for (int i = 0; ihwndContactTree); + pcli->hwndContactList = NULL; + + UnLoadCLUIFramesModule(); + db_set_b(NULL, "CList", "State", (BYTE)state); + PostQuitMessage(0); + break; + } + + return saveContactListWndProc( hwnd, msg, wParam, lParam ); +} + +int LoadCLUIModule(void) +{ + DBVARIANT dbv; + TCHAR titleText[256]; + canloadstatusbar = FALSE; + hFrameContactTree = 0; + + HookEvent(ME_SYSTEM_MODULESLOADED,CluiModulesLoaded); + HookEvent(ME_OPT_INITIALISE,CluiOptInit); + hContactDraggingEvent = CreateHookableEvent(ME_CLUI_CONTACTDRAGGING); + hContactDroppedEvent = CreateHookableEvent(ME_CLUI_CONTACTDROPPED); + hContactDragStopEvent = CreateHookableEvent(ME_CLUI_CONTACTDRAGSTOP); + + CreateServiceFunction("CLUI/GetConnectingIconForProtocol",GetConnectingIconService); + + if (db_get_ts(NULL,"CList","TitleText",&dbv)) + lstrcpyn(titleText,_T(MIRANDANAME),SIZEOF(titleText)); + else { + lstrcpyn(titleText,dbv.ptszVal,SIZEOF(titleText)); + db_free(&dbv); + } + + oldhideoffline = db_get_b(NULL,"CList","HideOffline",SETTING_HIDEOFFLINE_DEFAULT); + + int laster = GetLastError(); + PreCreateCLC(pcli->hwndContactList); + + // create status bar frame + CreateStatusBarhWnd(pcli->hwndContactList); + + hMenuMain = GetMenu(pcli->hwndContactList); + if ( !db_get_b(NULL, "CLUI", "ShowMainMenu", SETTING_SHOWMAINMENU_DEFAULT)) + SetMenu(pcli->hwndContactList, NULL); + SetWindowPos(pcli->hwndContactList, db_get_b(NULL,"CList","OnTop",SETTING_ONTOP_DEFAULT) ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); + + lastreqh = 0; + return 0; +} + +void UnloadCLUIModule() +{ + for (int i = 0; i < SIZEOF(CycleStartTick); i++) + if ( CycleStartTick[i].szProto != NULL) + mir_free(CycleStartTick[i].szProto); +} \ No newline at end of file diff --git a/plugins/!Deprecated/Clist_mw/src/cluiopts.cpp b/plugins/!Deprecated/Clist_mw/src/cluiopts.cpp new file mode 100644 index 0000000000..1287c5cab5 --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/cluiopts.cpp @@ -0,0 +1,373 @@ +/* + +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), +Copyright (c) 2000-03 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "commonheaders.h" + +extern HMENU hMenuMain; +static INT_PTR CALLBACK DlgProcCluiOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); +static INT_PTR CALLBACK DlgProcSBarOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); +extern HANDLE hFrameHelperStatusBar; +extern int UseOwnerDrawStatusBar; + +void CluiProtocolStatusChanged(int parStatus, const char* szProto); +int OnStatusBarBackgroundChange(); + +int CluiOptInit(WPARAM wParam, LPARAM lParam) +{ + OPTIONSDIALOGPAGE odp = { sizeof(odp) }; + odp.hInstance = g_hInst; + odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_CLUI); + odp.pszTitle = LPGEN("Window"); + odp.pszGroup = LPGEN("Contact list"); + odp.pfnDlgProc = DlgProcCluiOpts; + odp.flags = ODPF_BOLDGROUPS; + Options_AddPage(wParam, &odp); + + odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_SBAR); + odp.pszTitle = LPGEN("Status bar"); + odp.pfnDlgProc = DlgProcSBarOpts; + odp.flags = ODPF_BOLDGROUPS; + Options_AddPage(wParam, &odp); + return 0; +} + +static INT_PTR CALLBACK DlgProcCluiOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) { + case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); + CheckDlgButton(hwndDlg, IDC_BRINGTOFRONT, db_get_b(NULL,"CList","BringToFront",SETTING_BRINGTOFRONT_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_ONTOP, db_get_b(NULL,"CList","OnTop",SETTING_ONTOP_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_TOOLWND, db_get_b(NULL,"CList","ToolWindow",SETTING_TOOLWINDOW_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_MIN2TRAY, db_get_b(NULL,"CList","Min2Tray",SETTING_MIN2TRAY_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); + if (IsDlgButtonChecked(hwndDlg,IDC_TOOLWND)) EnableWindow(GetDlgItem(hwndDlg,IDC_MIN2TRAY),FALSE); + CheckDlgButton(hwndDlg, IDC_SHOWCAPTION, db_get_b(NULL,"CLUI","ShowCaption",SETTING_SHOWCAPTION_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_SHOWMAINMENU, db_get_b(NULL,"CLUI","ShowMainMenu",SETTING_SHOWMAINMENU_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CLIENTDRAG, db_get_b(NULL,"CLUI","ClientAreaDrag",SETTING_CLIENTDRAG_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); + if ( !IsDlgButtonChecked(hwndDlg,IDC_SHOWCAPTION)) { + EnableWindow(GetDlgItem(hwndDlg,IDC_MIN2TRAY),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_TOOLWND),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_TITLETEXT),FALSE); + } + CheckDlgButton(hwndDlg, IDC_FADEINOUT, db_get_b(NULL,"CLUI","FadeInOut",0) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_AUTOSIZE, db_get_b(NULL,"CLUI","AutoSize",0) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_DROPSHADOW, db_get_b(NULL,"CList","WindowShadow",0) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_ONDESKTOP, db_get_b(NULL,"CList","OnDesktop", 0) ? BST_CHECKED : BST_UNCHECKED); + SendDlgItemMessage(hwndDlg,IDC_MAXSIZESPIN,UDM_SETRANGE,0,MAKELONG(100,0)); + SendDlgItemMessage(hwndDlg,IDC_MAXSIZESPIN,UDM_SETPOS,0,db_get_b(NULL,"CLUI","MaxSizeHeight",75)); + CheckDlgButton(hwndDlg, IDC_AUTOSIZEUPWARD, db_get_b(NULL,"CLUI","AutoSizeUpward",0) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_AUTOHIDE, db_get_b(NULL,"CList","AutoHide",SETTING_AUTOHIDE_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); + SendDlgItemMessage(hwndDlg,IDC_HIDETIMESPIN,UDM_SETRANGE,0,MAKELONG(900,1)); + SendDlgItemMessage(hwndDlg,IDC_HIDETIMESPIN,UDM_SETPOS,0,MAKELONG(db_get_w(NULL,"CList","HideTime",SETTING_HIDETIME_DEFAULT),0)); + EnableWindow(GetDlgItem(hwndDlg,IDC_HIDETIME),IsDlgButtonChecked(hwndDlg,IDC_AUTOHIDE)); + EnableWindow(GetDlgItem(hwndDlg,IDC_HIDETIMESPIN),IsDlgButtonChecked(hwndDlg,IDC_AUTOHIDE)); + EnableWindow(GetDlgItem(hwndDlg,IDC_STATIC01),IsDlgButtonChecked(hwndDlg,IDC_AUTOHIDE)); + if ( !IsDlgButtonChecked(hwndDlg,IDC_AUTOSIZE)) { + EnableWindow(GetDlgItem(hwndDlg,IDC_STATIC21),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_STATIC22),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_MAXSIZEHEIGHT),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_MAXSIZESPIN),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_AUTOSIZEUPWARD),FALSE); + } + + { DBVARIANT dbv; + char *s; + char szUin[20]; + + if (db_get_s(NULL,"CList","TitleText",&dbv) == 0&&(dbv.pszVal)) + { + s = mir_strdup(dbv.pszVal); + mir_free(dbv.pszVal); + } + else + { + s = mir_strdup(MIRANDANAME); + } + + if (s) + { + SetDlgItemTextA(hwndDlg,IDC_TITLETEXT,s); + mir_free(s); + } + + SendDlgItemMessage(hwndDlg,IDC_TITLETEXT,CB_ADDSTRING,0,(LPARAM)MIRANDANAME); + mir_snprintf(szUin, SIZEOF(szUin), "%u", db_get_dw(NULL, "ICQ", "UIN", 0)); + SendDlgItemMessage(hwndDlg,IDC_TITLETEXT,CB_ADDSTRING,0,(LPARAM)szUin); + + if ( !db_get_s(NULL,"ICQ","Nick",&dbv)) { + SendDlgItemMessage(hwndDlg,IDC_TITLETEXT,CB_ADDSTRING,0,(LPARAM)dbv.pszVal); + mir_free(dbv.pszVal); + dbv.pszVal = NULL; + } + if ( !db_get_s(NULL,"ICQ","FirstName",&dbv)) { + SendDlgItemMessage(hwndDlg,IDC_TITLETEXT,CB_ADDSTRING,0,(LPARAM)dbv.pszVal); + mir_free(dbv.pszVal); + dbv.pszVal = NULL; + } + if ( !db_get_s(NULL,"ICQ","e-mail",&dbv)) { + SendDlgItemMessage(hwndDlg,IDC_TITLETEXT,CB_ADDSTRING,0,(LPARAM)dbv.pszVal); + mir_free(dbv.pszVal); + dbv.pszVal = NULL; + } + } + CheckDlgButton(hwndDlg, IDC_TRANSPARENT, db_get_b(NULL, "CList", "Transparent", SETTING_TRANSPARENT_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); + if ( !IsDlgButtonChecked(hwndDlg,IDC_TRANSPARENT)) { + EnableWindow(GetDlgItem(hwndDlg,IDC_STATIC11),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_STATIC12),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_TRANSACTIVE),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_TRANSINACTIVE),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_ACTIVEPERC),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_INACTIVEPERC),FALSE); + } + SendDlgItemMessage(hwndDlg,IDC_TRANSACTIVE,TBM_SETRANGE,FALSE,MAKELONG(1,255)); + SendDlgItemMessage(hwndDlg,IDC_TRANSINACTIVE,TBM_SETRANGE,FALSE,MAKELONG(1,255)); + SendDlgItemMessage(hwndDlg,IDC_TRANSACTIVE,TBM_SETPOS,TRUE,db_get_b(NULL,"CList","Alpha",SETTING_ALPHA_DEFAULT)); + SendDlgItemMessage(hwndDlg,IDC_TRANSINACTIVE,TBM_SETPOS,TRUE,db_get_b(NULL,"CList","AutoAlpha",SETTING_AUTOALPHA_DEFAULT)); + SendMessage(hwndDlg,WM_HSCROLL,0x12345678,0); + return TRUE; + + case WM_COMMAND: + if (LOWORD(wParam) == IDC_AUTOHIDE) { + EnableWindow(GetDlgItem(hwndDlg,IDC_HIDETIME),IsDlgButtonChecked(hwndDlg,IDC_AUTOHIDE)); + EnableWindow(GetDlgItem(hwndDlg,IDC_HIDETIMESPIN),IsDlgButtonChecked(hwndDlg,IDC_AUTOHIDE)); + EnableWindow(GetDlgItem(hwndDlg,IDC_STATIC01),IsDlgButtonChecked(hwndDlg,IDC_AUTOHIDE)); + } + else if (LOWORD(wParam) == IDC_TRANSPARENT) { + EnableWindow(GetDlgItem(hwndDlg,IDC_STATIC11),IsDlgButtonChecked(hwndDlg,IDC_TRANSPARENT)); + EnableWindow(GetDlgItem(hwndDlg,IDC_STATIC12),IsDlgButtonChecked(hwndDlg,IDC_TRANSPARENT)); + EnableWindow(GetDlgItem(hwndDlg,IDC_TRANSACTIVE),IsDlgButtonChecked(hwndDlg,IDC_TRANSPARENT)); + EnableWindow(GetDlgItem(hwndDlg,IDC_TRANSINACTIVE),IsDlgButtonChecked(hwndDlg,IDC_TRANSPARENT)); + EnableWindow(GetDlgItem(hwndDlg,IDC_ACTIVEPERC),IsDlgButtonChecked(hwndDlg,IDC_TRANSPARENT)); + EnableWindow(GetDlgItem(hwndDlg,IDC_INACTIVEPERC),IsDlgButtonChecked(hwndDlg,IDC_TRANSPARENT)); + } + else if (LOWORD(wParam) == IDC_AUTOSIZE) { + EnableWindow(GetDlgItem(hwndDlg,IDC_STATIC21),IsDlgButtonChecked(hwndDlg,IDC_AUTOSIZE)); + EnableWindow(GetDlgItem(hwndDlg,IDC_STATIC22),IsDlgButtonChecked(hwndDlg,IDC_AUTOSIZE)); + EnableWindow(GetDlgItem(hwndDlg,IDC_MAXSIZEHEIGHT),IsDlgButtonChecked(hwndDlg,IDC_AUTOSIZE)); + EnableWindow(GetDlgItem(hwndDlg,IDC_MAXSIZESPIN),IsDlgButtonChecked(hwndDlg,IDC_AUTOSIZE)); + EnableWindow(GetDlgItem(hwndDlg,IDC_AUTOSIZEUPWARD),IsDlgButtonChecked(hwndDlg,IDC_AUTOSIZE)); + } + else if (LOWORD(wParam) == IDC_TOOLWND) { + EnableWindow(GetDlgItem(hwndDlg,IDC_MIN2TRAY),!IsDlgButtonChecked(hwndDlg,IDC_TOOLWND)); + } + else if (LOWORD(wParam) == IDC_SHOWCAPTION) { + EnableWindow(GetDlgItem(hwndDlg,IDC_TOOLWND),IsDlgButtonChecked(hwndDlg,IDC_SHOWCAPTION)); + EnableWindow(GetDlgItem(hwndDlg,IDC_MIN2TRAY),!IsDlgButtonChecked(hwndDlg,IDC_TOOLWND) && IsDlgButtonChecked(hwndDlg,IDC_SHOWCAPTION)); + EnableWindow(GetDlgItem(hwndDlg,IDC_TITLETEXT),IsDlgButtonChecked(hwndDlg,IDC_SHOWCAPTION)); + } + + if ((LOWORD(wParam) == IDC_HIDETIME || LOWORD(wParam) == IDC_TITLETEXT || LOWORD(wParam) == IDC_MAXSIZEHEIGHT) && + (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus())) + return 0; + + // Enable apply button + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + + case WM_HSCROLL: + { char str[10]; + mir_snprintf(str, SIZEOF(str), "%d%%", 100 * SendDlgItemMessage(hwndDlg, IDC_TRANSINACTIVE, TBM_GETPOS, 0, 0) / 255); + SetDlgItemTextA(hwndDlg,IDC_INACTIVEPERC,str); + mir_snprintf(str, SIZEOF(str), "%d%%", 100 * SendDlgItemMessage(hwndDlg, IDC_TRANSACTIVE, TBM_GETPOS, 0, 0) / 255); + SetDlgItemTextA(hwndDlg,IDC_ACTIVEPERC,str); + } + if (wParam != 0x12345678) SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case WM_NOTIFY: + switch (((LPNMHDR)lParam)->code) + { + case PSN_APPLY: + db_set_b(NULL,"CList","OnTop",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_ONTOP)); + SetWindowPos(pcli->hwndContactList, IsDlgButtonChecked(hwndDlg,IDC_ONTOP)?HWND_TOPMOST:HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + + db_set_b(NULL,"CList","ToolWindow",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_TOOLWND)); + db_set_b(NULL,"CList","BringToFront",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_BRINGTOFRONT)); + if (IsDlgButtonChecked(hwndDlg,IDC_TOOLWND)) { + // Window must be hidden to dynamically remove the taskbar button. + // See http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/programmersguide/shell_int/shell_int_programming/taskbar.asp + WINDOWPLACEMENT p; + p.length = sizeof(p); + GetWindowPlacement(pcli->hwndContactList,&p); + ShowWindow(pcli->hwndContactList,SW_HIDE); + SetWindowLongPtr(pcli->hwndContactList,GWL_EXSTYLE,GetWindowLongPtr(pcli->hwndContactList,GWL_EXSTYLE)|WS_EX_TOOLWINDOW|WS_EX_WINDOWEDGE); + SetWindowPlacement(pcli->hwndContactList,&p); + } + else + SetWindowLongPtr(pcli->hwndContactList,GWL_EXSTYLE,GetWindowLongPtr(pcli->hwndContactList,GWL_EXSTYLE)&~WS_EX_TOOLWINDOW); + + if (IsDlgButtonChecked(hwndDlg,IDC_ONDESKTOP)) { + HWND hProgMan = FindWindowA("Progman",NULL); + if (IsWindow(hProgMan)) SetParent(pcli->hwndContactList,hProgMan); + } else { + SetParent(pcli->hwndContactList,NULL); + } + + db_set_b(NULL,"CLUI","ShowCaption",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_SHOWCAPTION)); + db_set_b(NULL,"CLUI","ShowMainMenu",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_SHOWMAINMENU)); + db_set_b(NULL,"CLUI","ClientAreaDrag",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_CLIENTDRAG)); + + if (IsDlgButtonChecked(hwndDlg,IDC_SHOWCAPTION)) + SetWindowLongPtr(pcli->hwndContactList,GWL_STYLE,GetWindowLongPtr(pcli->hwndContactList,GWL_STYLE)|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX); + else + SetWindowLongPtr(pcli->hwndContactList,GWL_STYLE,GetWindowLongPtr(pcli->hwndContactList,GWL_STYLE)&~(WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX)); + + if ( !IsDlgButtonChecked(hwndDlg,IDC_SHOWMAINMENU)) SetMenu(pcli->hwndContactList,NULL); + else SetMenu(pcli->hwndContactList,hMenuMain); + + SetWindowPos(pcli->hwndContactList,0,0,0,0,0,SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED); + RedrawWindow(pcli->hwndContactList,NULL,NULL,RDW_FRAME|RDW_INVALIDATE); + + db_set_b(NULL,"CList","Min2Tray",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_MIN2TRAY)); + if (IsIconic(pcli->hwndContactList) && !IsDlgButtonChecked(hwndDlg,IDC_TOOLWND)) + ShowWindow(pcli->hwndContactList,IsDlgButtonChecked(hwndDlg,IDC_MIN2TRAY)?SW_HIDE:SW_SHOW); + + { TCHAR title[256]; + GetDlgItemText(hwndDlg,IDC_TITLETEXT,title,SIZEOF(title)); + db_set_ts(NULL,"CList","TitleText",title); + SetWindowText(pcli->hwndContactList,title); + } + db_set_b(NULL,"CLUI","FadeInOut",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_FADEINOUT)); + db_set_b(NULL,"CLUI","AutoSize",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_AUTOSIZE)); + db_set_b(NULL,"CLUI","MaxSizeHeight",(BYTE)GetDlgItemInt(hwndDlg,IDC_MAXSIZEHEIGHT,NULL,FALSE)); + db_set_b(NULL,"CLUI","AutoSizeUpward",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_AUTOSIZEUPWARD)); + db_set_b(NULL,"CList","AutoHide",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_AUTOHIDE)); + db_set_w(NULL,"CList","HideTime",(WORD)SendDlgItemMessage(hwndDlg,IDC_HIDETIMESPIN,UDM_GETPOS,0,0)); + + db_set_b(NULL,"CList","Transparent",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_TRANSPARENT)); + db_set_b(NULL,"CList","Alpha",(BYTE)SendDlgItemMessage(hwndDlg,IDC_TRANSACTIVE,TBM_GETPOS,0,0)); + db_set_b(NULL,"CList","AutoAlpha",(BYTE)SendDlgItemMessage(hwndDlg,IDC_TRANSINACTIVE,TBM_GETPOS,0,0)); + db_set_b(NULL,"CList","WindowShadow",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_DROPSHADOW)); + db_set_b(NULL,"CList","OnDesktop",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_ONDESKTOP)); + if (IsDlgButtonChecked(hwndDlg,IDC_TRANSPARENT)) { + SetWindowLongPtr(pcli->hwndContactList, GWL_EXSTYLE, GetWindowLongPtr(pcli->hwndContactList, GWL_EXSTYLE) | WS_EX_LAYERED); + SetLayeredWindowAttributes(pcli->hwndContactList, RGB(0,0,0), (BYTE)db_get_b(NULL,"CList","AutoAlpha",SETTING_AUTOALPHA_DEFAULT), LWA_ALPHA); + } + else SetWindowLongPtr(pcli->hwndContactList, GWL_EXSTYLE, GetWindowLongPtr(pcli->hwndContactList, GWL_EXSTYLE) & ~WS_EX_LAYERED); + + SendMessage(pcli->hwndContactTree,WM_SIZE,0,0); //forces it to send a cln_listsizechanged + return TRUE; + } + break; + } + return FALSE; +} + +static INT_PTR CALLBACK DlgProcSBarOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) { + case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); + CheckDlgButton(hwndDlg, IDC_SHOWSBAR, db_get_b(NULL,"CLUI","ShowSBar",1) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_USECONNECTINGICON, db_get_b(NULL,"CLUI","UseConnectingIcon",1) ? BST_CHECKED : BST_UNCHECKED); + { BYTE showOpts = db_get_b(NULL,"CLUI","SBarShow",1); + CheckDlgButton(hwndDlg, IDC_SHOWICON, showOpts&1 ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_SHOWPROTO, showOpts&2 ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_SHOWSTATUS, showOpts&4 ? BST_CHECKED : BST_UNCHECKED); + } + CheckDlgButton(hwndDlg, IDC_RIGHTSTATUS, db_get_b(NULL,"CLUI","SBarRightClk",0) ? BST_UNCHECKED : BST_CHECKED); + CheckDlgButton(hwndDlg, IDC_RIGHTMIRANDA, !IsDlgButtonChecked(hwndDlg,IDC_RIGHTSTATUS) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_EQUALSECTIONS, db_get_b(NULL,"CLUI","EqualSections",0) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_SBPANELBEVEL, db_get_b(NULL,"CLUI","SBarBevel",1) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_SHOWSIZEGRIP, db_get_b(NULL,"CLUI","SBarUseSizeGrip",1) ? BST_CHECKED : BST_UNCHECKED); + + CheckDlgButton(hwndDlg, IDC_USEOWNERDRAW, db_get_b(NULL,"CLUI","UseOwnerDrawStatusBar",1) ? BST_CHECKED : BST_UNCHECKED); + + SendDlgItemMessage(hwndDlg,IDC_BKGCOLOUR,CPM_SETCOLOUR,0,db_get_dw(NULL,"CLUI","SBarBKColor",CLR_DEFAULT)); + + if ( !IsDlgButtonChecked(hwndDlg,IDC_SHOWSBAR)) { + EnableWindow(GetDlgItem(hwndDlg,IDC_SHOWICON),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_SHOWPROTO),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_SHOWSTATUS),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_RIGHTSTATUS),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_RIGHTMIRANDA),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_EQUALSECTIONS),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_SBPANELBEVEL),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_SHOWSIZEGRIP),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_USECONNECTINGICON),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_USEOWNERDRAW),FALSE); + + } + return TRUE; + case WM_COMMAND: + if (LOWORD(wParam) == IDC_SHOWSBAR) { + EnableWindow(GetDlgItem(hwndDlg,IDC_SHOWICON),IsDlgButtonChecked(hwndDlg,IDC_SHOWSBAR)); + EnableWindow(GetDlgItem(hwndDlg,IDC_SHOWPROTO),IsDlgButtonChecked(hwndDlg,IDC_SHOWSBAR)); + EnableWindow(GetDlgItem(hwndDlg,IDC_SHOWSTATUS),IsDlgButtonChecked(hwndDlg,IDC_SHOWSBAR)); + EnableWindow(GetDlgItem(hwndDlg,IDC_RIGHTSTATUS),IsDlgButtonChecked(hwndDlg,IDC_SHOWSBAR)); + EnableWindow(GetDlgItem(hwndDlg,IDC_RIGHTMIRANDA),IsDlgButtonChecked(hwndDlg,IDC_SHOWSBAR)); + EnableWindow(GetDlgItem(hwndDlg,IDC_EQUALSECTIONS),IsDlgButtonChecked(hwndDlg,IDC_SHOWSBAR)); + EnableWindow(GetDlgItem(hwndDlg,IDC_SBPANELBEVEL),IsDlgButtonChecked(hwndDlg,IDC_SHOWSBAR)); + EnableWindow(GetDlgItem(hwndDlg,IDC_SHOWSIZEGRIP),IsDlgButtonChecked(hwndDlg,IDC_SHOWSBAR)); + EnableWindow(GetDlgItem(hwndDlg,IDC_USECONNECTINGICON),IsDlgButtonChecked(hwndDlg,IDC_SHOWSBAR)); + EnableWindow(GetDlgItem(hwndDlg,IDC_USEOWNERDRAW),IsDlgButtonChecked(hwndDlg,IDC_SHOWSBAR)); + + } + if (LOWORD(wParam) == IDC_DEFBKCOLOR) + { + SendDlgItemMessage(hwndDlg,IDC_BKGCOLOUR,CPM_SETCOLOUR,0,CLR_DEFAULT); + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + } + + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case WM_NOTIFY: + switch (((LPNMHDR)lParam)->code) { + case PSN_APPLY: + { + COLORREF col = SendDlgItemMessage(hwndDlg,IDC_BKGCOLOUR,CPM_GETCOLOUR,0,0); + db_set_dw(NULL,"CLUI","SBarBKColor",col); + + db_set_b(NULL,"CLUI","ShowSBar",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_SHOWSBAR)); + db_set_b(NULL,"CLUI","SBarShow",(BYTE)((IsDlgButtonChecked(hwndDlg,IDC_SHOWICON)?1:0)|(IsDlgButtonChecked(hwndDlg,IDC_SHOWPROTO)?2:0)|(IsDlgButtonChecked(hwndDlg,IDC_SHOWSTATUS)?4:0))); + db_set_b(NULL,"CLUI","SBarRightClk",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_RIGHTMIRANDA)); + db_set_b(NULL,"CLUI","EqualSections",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_EQUALSECTIONS)); + db_set_b(NULL,"CLUI","SBarBevel",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_SBPANELBEVEL)); + db_set_b(NULL,"CLUI","SBarUseSizeGrip",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_SHOWSIZEGRIP)); + + db_set_b(NULL,"CLUI","UseConnectingIcon",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_USECONNECTINGICON)); + db_set_b(NULL,"CLUI","UseOwnerDrawStatusBar",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_USEOWNERDRAW)); + UseOwnerDrawStatusBar = db_get_b(NULL,"CLUI","UseOwnerDrawStatusBar",0); + + int frameopt = CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS,MAKEWPARAM(FO_FLAGS,hFrameHelperStatusBar),0); + frameopt &= ~F_VISIBLE; + + if (IsDlgButtonChecked(hwndDlg,IDC_SHOWSBAR)) { + ShowWindow(pcli->hwndStatus,SW_SHOW); + frameopt |= F_VISIBLE; + } + else ShowWindow(pcli->hwndStatus,SW_HIDE); + + CallService(MS_CLIST_FRAMES_SETFRAMEOPTIONS,MAKEWPARAM(FO_FLAGS,hFrameHelperStatusBar),frameopt); + + SendMessage(pcli->hwndContactList,WM_SIZE,0,0); + + OnStatusBarBackgroundChange(); + CluiProtocolStatusChanged(0,0); + return TRUE; + } + } + break; + } + return FALSE; +} diff --git a/plugins/!Deprecated/Clist_mw/src/cluiservices.cpp b/plugins/!Deprecated/Clist_mw/src/cluiservices.cpp new file mode 100644 index 0000000000..4fc0066b1e --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/cluiservices.cpp @@ -0,0 +1,176 @@ +/* + +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), +Copyright (c) 2000-03 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "commonheaders.h" + +extern int CreateTimerForConnectingIcon(WPARAM,LPARAM); + +void FreeProtocolData( void ) +{ + //free protocol data + int nPanel; + int nParts = SendMessage(pcli->hwndStatus,SB_GETPARTS,0,0); + for (nPanel = 0;nPanelhwndStatus,SB_GETTEXT,(WPARAM)nPanel,0); + if (PD != NULL && !IsBadCodePtr(( FARPROC )PD)) { + SendMessage(pcli->hwndStatus,SB_SETTEXT,(WPARAM)nPanel|SBT_OWNERDRAW,0); + if (PD->RealName) mir_free(PD->RealName); + if (PD) mir_free(PD); +} } } + +void CluiProtocolStatusChanged(int parStatus, const char* szProto) +{ + int protoCount,i; + PROTOACCOUNT **accs; + int *partWidths,partCount; + int borders[3]; + int flags; + int FirstIconOffset; + + if ( pcli->hwndStatus == 0 ) + return; + + FirstIconOffset = db_get_dw(NULL,"CLUI","FirstIconOffset",0); + + ProtoEnumAccounts( &protoCount, &accs ); + if ( protoCount == 0 ) + return; + + OutputDebugStringA("CluiProtocolStatusChanged"); + OutputDebugStringA("\r\n"); + FreeProtocolData(); + + SendMessage(pcli->hwndStatus,SB_GETBORDERS,0,(LPARAM)&borders); + + SendMessage(pcli->hwndStatus,SB_SETBKCOLOR,0,db_get_dw(0,"CLUI","SBarBKColor",CLR_DEFAULT)); + partWidths = (int*)alloca((protoCount+1)*sizeof(int)); + //partWidths[0] = FirstIconOffset; + if ( db_get_b(NULL,"CLUI","UseOwnerDrawStatusBar",0)||db_get_b(NULL,"CLUI","EqualSections",1)) + { + RECT rc; + int toshow, part; + + SendMessage(pcli->hwndStatus,WM_SIZE,0,0); + GetClientRect(pcli->hwndStatus,&rc); + rc.right -= borders[0]*2; + toshow = 0; + for (i = 0;ipfnGetProtocolVisibility( accs[i]->szModuleName )) + continue; + + toshow++; + } + + if (toshow>0) + { + for (part = 0,i = 0;ipfnGetProtocolVisibility( accs[i]->szModuleName )) + continue; + + partWidths[part] = ((part+1)*(rc.right/toshow))-(borders[2]>>1); + //partWidths[part] = 40*part+40; + part++; + } + //partCount = part; + } + partCount = toshow; + + } + else { + HDC hdc; + SIZE textSize; + BYTE showOpts = db_get_b(NULL,"CLUI","SBarShow",5); + DWORD extraspace = db_get_dw(NULL,"StatusBar","BkExtraSpace",0); + DWORD startoffset = db_get_dw(NULL,"StatusBar","FirstIconOffset",0); + int x; + + hdc = GetDC(pcli->hwndStatus); + + for (partCount = 0,i = 0;ipfnGetAccountIndexByPos(i); + if (ind < 0) + continue; + + if ( !pcli->pfnGetProtocolVisibility(accs[ind]->szModuleName)) + continue; + + x = 2; + if (showOpts & 1) x += GetSystemMetrics(SM_CXSMICON); + if (showOpts & 2) { + TCHAR szName[64]; + mir_sntprintf(szName, SIZEOF(szName), _T("%s%s"), accs[ind]->tszAccountName, showOpts&4 ? _T(" ") : _T("")); + GetTextExtentPoint32(hdc, szName, (int)_tcslen(szName), &textSize); + x += textSize.cx; + } + if (showOpts & 4) { + int status = CallProtoService(accs[ind]->szModuleName, PS_GETSTATUS, 0, 0); + TCHAR *szStatus = pcli->pfnGetStatusModeDescription(status, 0); + if ( !szStatus) + szStatus = _T(""); + GetTextExtentPoint32(hdc, szStatus, (int)_tcslen(szStatus), &textSize); + x += textSize.cx; + } + if (showOpts&6) x += 2; + partWidths[partCount] = (partCount?partWidths[partCount-1]:startoffset)+x+extraspace; + partCount++; + } + ReleaseDC(pcli->hwndStatus,hdc); + } + if (partCount == 0) { + SendMessage(pcli->hwndStatus,SB_SIMPLE,TRUE,0); + return; + } + SendMessage(pcli->hwndStatus,SB_SIMPLE,FALSE,0); + + partWidths[partCount-1] = -1; + + SendMessage(pcli->hwndStatus,SB_SETMINHEIGHT,GetSystemMetrics(SM_CYSMICON)+2,0); + SendMessage(pcli->hwndStatus,SB_SETPARTS,partCount,(LPARAM)partWidths); + + flags = SBT_OWNERDRAW; + if ( !db_get_b(NULL, "CLUI", "SBarBevel", 1)) + flags |= SBT_NOBORDERS; + + for (partCount = 0, i = 0; ipfnGetAccountIndexByPos(i); + if (ind < 0) continue; + + if ( !pcli->pfnGetProtocolVisibility(accs[ind]->szModuleName)) + continue; + + ProtocolData *PD = (ProtocolData*)mir_alloc(sizeof(ProtocolData)); + PD->RealName = mir_strdup(accs[ind]->szModuleName); + PD->protopos = accs[ind]->iOrder; + + SendMessage(pcli->hwndStatus, SB_SETTEXT, partCount++ | flags, (LPARAM)PD); + } + + CreateTimerForConnectingIcon(parStatus, (LPARAM)szProto); + InvalidateRect(pcli->hwndStatus, NULL, FALSE); + return; +} diff --git a/plugins/!Deprecated/Clist_mw/src/commonheaders.cpp b/plugins/!Deprecated/Clist_mw/src/commonheaders.cpp new file mode 100644 index 0000000000..c76992e096 --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/commonheaders.cpp @@ -0,0 +1,29 @@ +#include "commonheaders.h" + +#define SAFE_PTR(a) a?(IsBadReadPtr(a,1)?a = NULL:a):a + +int __cdecl MyStrCmp (const char *a, const char *b) +{ + SAFE_PTR(a); + SAFE_PTR(b); + if ( !(a && b)) return a != b; + return (strcmp(a,b)); +} + +DWORD exceptFunction(LPEXCEPTION_POINTERS EP) +{ + //printf("1 "); // printed first + char buf[4096]; + + + mir_snprintf(buf, SIZEOF(buf), "\r\nExceptCode: %x\r\nExceptFlags: %x\r\nExceptAddress: %p\r\n", + EP->ExceptionRecord->ExceptionCode, + EP->ExceptionRecord->ExceptionFlags, + EP->ExceptionRecord->ExceptionAddress + ); + OutputDebugStringA(buf); + MessageBoxA(0,buf,"clist_mw Exception",0); + + + return EXCEPTION_EXECUTE_HANDLER; +} diff --git a/plugins/!Deprecated/Clist_mw/src/commonheaders.h b/plugins/!Deprecated/Clist_mw/src/commonheaders.h new file mode 100644 index 0000000000..ed78d84707 --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/commonheaders.h @@ -0,0 +1,116 @@ +/* + +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), +Copyright (c) 2000-04 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +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. +*/ + +#define _CRT_SECURE_NO_WARNINGS +#ifndef _COMMON_HEADERS_H_ +#define _COMMON_HEADERS_H_ 1 + +#define _WIN32_WINNT 0x0501 +#define _WIN32_IE 0x0501 + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "resource.h" +#include "Version.h" +#include "clc.h" +#include "clist.h" +#include "CLUIFrames/cluiframes.h" +#include "BkgrCfg.h" + +// shared vars +extern HINSTANCE g_hInst; + +/* most free()'s are invalid when the code is executed from a dll, so this changes + all the bad free()'s to good ones, however it's still incorrect code. The reasons for not + changing them include: + + * db_free has a CallService() lookup + * free() is executed in some large loops to do with clist creation of group data + * easy search and replace + +*/ + +#ifndef CS_DROPSHADOW +#define CS_DROPSHADOW 0x00020000 +#endif + +extern BOOL __cdecl strstri(const char *a, const char *b); +extern BOOL __cdecl boolstrcmpi(const char *a, const char *b); +extern int __cdecl MyStrCmp (const char *a, const char *b); +extern int __cdecl MyStrLen (const char *a); +extern int __cdecl MyStrCmpi(const char *a, const char *b); +extern int __cdecl MyStrCmpiT(const TCHAR *a, const TCHAR *b); + +extern DWORD exceptFunction(LPEXCEPTION_POINTERS EP); + +extern int (*saveIconFromStatusMode)(const char *szProto, int nStatus, MCONTACT hContact); + +//from bkg options + +// Register of plugin's user +// +// wParam = (WPARAM)szSetting - string that describes a user +// format: Category/ModuleName, +// eg: "Contact list background/CLUI", +// "Status bar background/StatusBar" +// lParam = (LPARAM)dwFlags +// +#define MS_BACKGROUNDCONFIG_REGISTER "BkgrCfg/Register" + +// +// Notification about changed background +// wParam = ModuleName +// lParam = 0 +#define ME_BACKGROUNDCONFIG_CHANGED "BkgrCfg/Changed" + + + +#define EXTRACOLUMNCOUNT 9 + + +#endif diff --git a/plugins/!Deprecated/Clist_mw/src/contact.cpp b/plugins/!Deprecated/Clist_mw/src/contact.cpp new file mode 100644 index 0000000000..4f2fe4b3d7 --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/contact.cpp @@ -0,0 +1,178 @@ +/* + +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), +Copyright (c) 2000-03 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "commonheaders.h" +#include "m_clui.h" +#include "clist.h" + +extern HANDLE hContactIconChangedEvent; +extern int GetContactCachedStatus(MCONTACT hContact); +extern char *GetContactCachedProtocol(MCONTACT hContact); + +int sortByStatus; +static int sortByProto; +static int sortNoOfflineBottom; +struct { + int status,order; +} statusModeOrder[] = { + {ID_STATUS_OFFLINE,500}, + {ID_STATUS_ONLINE,0}, + {ID_STATUS_AWAY,200}, + {ID_STATUS_DND,400}, + {ID_STATUS_NA,450}, + {ID_STATUS_OCCUPIED,100}, + {ID_STATUS_FREECHAT,50}, + {ID_STATUS_INVISIBLE,20}, + {ID_STATUS_ONTHEPHONE,150}, + {ID_STATUS_OUTTOLUNCH,425}}; + +static int GetContactStatus(MCONTACT hContact) +{ + /* + + char *szProto; + + szProto = GetContactProto(hContact,0); + if (szProto == NULL) return ID_STATUS_OFFLINE; + return db_get_w(hContact,szProto,"Status",ID_STATUS_OFFLINE); + */ + return (GetContactCachedStatus(hContact)); +} + +void ChangeContactIcon(MCONTACT hContact,int iIcon,int add) +{ + //clui MS_CLUI_CONTACTADDED MS_CLUI_CONTACTSETICON this methods is null + //CallService(add?MS_CLUI_CONTACTADDED:MS_CLUI_CONTACTSETICON,hContact,iIcon); + NotifyEventHooks(hContactIconChangedEvent,hContact,iIcon); +} + +static int GetStatusModeOrdering(int statusMode) +{ + int i; + for (i = 0; i< SIZEOF(statusModeOrder); i++) + if (statusModeOrder[i].status == statusMode) return statusModeOrder[i].order; + return 1000; +} + +void LoadContactTree(void) +{ + int tick = GetTickCount(); + CallService(MS_CLUI_LISTBEGINREBUILD,0,0); + for (int i=1;; i++) { + if ((char*)CallService(MS_CLIST_GROUPGETNAME2, i, 0) == NULL) + break; + CallService(MS_CLUI_GROUPADDED, i, 0); + } + + int hideOffline = db_get_b(NULL,"CList","HideOffline",SETTING_HIDEOFFLINE_DEFAULT); + + for (MCONTACT hContact = db_find_first(); hContact; hContact = db_find_next(hContact)) { + ClcCacheEntry *cacheEntry = GetContactFullCacheEntry(hContact); + if (cacheEntry == NULL) { + MessageBoxA(0,"Fail To Get CacheEntry for hContact","!!!!!",0); + break; + } + int status = cacheEntry->status; + if ((!hideOffline || status != ID_STATUS_OFFLINE) && !cacheEntry->bIsHidden) + ChangeContactIcon(hContact,ExtIconFromStatusMode(hContact,(char*)cacheEntry->szProto,status),1); + } + sortByStatus = db_get_b(NULL,"CList","SortByStatus",SETTING_SORTBYSTATUS_DEFAULT); + sortByProto = db_get_b(NULL,"CList","SortByProto",SETTING_SORTBYPROTO_DEFAULT); + sortNoOfflineBottom = db_get_b(NULL,"CList","NoOfflineBottom",SETTING_NOOFFLINEBOTTOM_DEFAULT); + + CallService(MS_CLUI_LISTENDREBUILD,0,0); + + tick = GetTickCount()-tick; + + char buf[255]; + mir_snprintf(buf, SIZEOF(buf), "LoadContactTree %d \r\n", tick); + OutputDebugStringA(buf); +} + +#define SAFESTRING(a) a?a:"" + +int CompareContacts( const struct ClcContact *contact1, const struct ClcContact *contact2 ) +{ + MCONTACT a = contact1->hContact, b = contact2->hContact; + TCHAR *namea,*nameb; + int statusa,statusb; + char *szProto1,*szProto2; + int rc; + + GetContactInfosForSort(a,&szProto1,&namea,&statusa); + GetContactInfosForSort(b,&szProto2,&nameb,&statusb); + + if (sortByProto) { + + /* deal with statuses, online contacts have to go above offline */ + if (sortNoOfflineBottom == 0) + if ((statusa == ID_STATUS_OFFLINE) != (statusb == ID_STATUS_OFFLINE)) { + return 2*(statusa == ID_STATUS_OFFLINE)-1; + } + /* both are online, now check protocols */ + rc = strcmp(SAFESTRING(szProto1),SAFESTRING(szProto2)); /* strcmp() doesn't like NULL so feed in "" as needed */ + if (rc != 0 && (szProto1 != NULL && szProto2 != NULL)) return rc; + /* protocols are the same, order by display name */ + } + + if (sortByStatus) { + int ordera,orderb; + ordera = GetStatusModeOrdering(statusa); + orderb = GetStatusModeOrdering(statusb); + if (ordera != orderb) return ordera-orderb; + } + else { + //one is offline: offline goes below online + if (sortNoOfflineBottom == 0) + { + if ((statusa == ID_STATUS_OFFLINE) != (statusb == ID_STATUS_OFFLINE)) { + return 2*(statusa == ID_STATUS_OFFLINE)-1; + } + } + } + + //otherwise just compare names + return _tcsicmp(namea,nameb); +} + +#undef SAFESTRING + +void SortContacts(void) +{ + //avoid doing lots of resorts in quick succession + sortByStatus = db_get_b(NULL,"CList","SortByStatus",SETTING_SORTBYSTATUS_DEFAULT); + sortByProto = db_get_b(NULL,"CList","SortByProto",SETTING_SORTBYPROTO_DEFAULT); +} + +INT_PTR ContactChangeGroup(WPARAM hContact, LPARAM lParam) +{ + CallService(MS_CLUI_CONTACTDELETED, hContact, 0); + if ((HANDLE)lParam == NULL) + db_unset(hContact, "CList", "Group"); + else + db_set_s(hContact, "CList", "Group", (char*)CallService(MS_CLIST_GROUPGETNAME2, lParam, (LPARAM)(int*)NULL)); + + CallService(MS_CLUI_CONTACTADDED, hContact, ExtIconFromStatusMode(hContact, GetContactProto(hContact), GetContactStatus(hContact))); + return 0; +} diff --git a/plugins/!Deprecated/Clist_mw/src/groupmenu.cpp b/plugins/!Deprecated/Clist_mw/src/groupmenu.cpp new file mode 100644 index 0000000000..70932d494c --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/groupmenu.cpp @@ -0,0 +1,566 @@ +/* + +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), +Copyright (c) 2000-03 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "commonheaders.h" +#include "m_clui.h" +#include "clist.h" +#include "clc.h" + +//////////////////////////////Group MENU///////////////////////// + +extern HANDLE hHideShowMainMenuItem; +HANDLE hGroupMenuObject; + +HANDLE hGroupMainMenuItemProxy; +HANDLE hGroupStatusMenuItemProxy; +HANDLE hPreBuildGroupMenuEvent; + +HGENMENU hHideOfflineUsersMenuItem, hHideOfflineUsersOutHereMenuItem, hHideEmptyGroupsMenuItem; +HGENMENU hDisableGroupsMenuItem, hNewGroupMenuItem, hNewSubGroupMenuItem; + +int NewGroupIconidx; + +extern HIMAGELIST hCListImages; +HICON LoadIconFromExternalFile(char *filename, int i, boolean UseLibrary, boolean registerit, char *IconName, char *SectName, char *Description, int internalidx, HICON DefIcon); + +void InitSubGroupMenus(void); + +//Groupmenu exec param(ownerdata) +typedef struct{ + char *szServiceName; + int Param1, Param2; +} GroupMenuExecParam, *lpGroupMenuExecParam; + +/* +wparam = handle to the menu item returned by MS_CLIST_ADDCONTACTMENUITEM +return 0 on success. +*/ +static INT_PTR RemoveGroupMenuItem(WPARAM wParam, LPARAM lParam) +{ + CallService(MO_REMOVEMENUITEM, wParam, 0); + return 0; +} + + +static INT_PTR BuildGroupMenu(WPARAM wParam, LPARAM lParam) +{ + int tick; + HMENU hMenu; + ListParam param = {0}; + param.MenuObjectHandle = hGroupMenuObject; + + //hMenu = hMainMenu; + hMenu = CreatePopupMenu(); + //hMenu = wParam; + tick = GetTickCount(); + + NotifyEventHooks(hPreBuildGroupMenuEvent, 0, 0); + + CallService(MO_BUILDMENU, (WPARAM)hMenu, (LPARAM)¶m); + //DrawMenuBar((HWND)CallService("CLUI/GetHwnd",0,0)); + tick = GetTickCount() - tick; + return (INT_PTR)hMenu; +} + +static INT_PTR AddGroupMenuItem(WPARAM wParam, LPARAM lParam) +{ + TMO_MenuItem tmi; + CLISTMENUITEM *mi = (CLISTMENUITEM *)lParam; + if (!pcli->pfnConvertMenu(mi, &tmi)) + return 0; + + lpGroupMenuExecParam mmep = (lpGroupMenuExecParam)mir_calloc(sizeof(GroupMenuExecParam)); + if (mmep == NULL) + return 0; + + //we need just one parametr. + mmep->szServiceName = mir_strdup(mi->pszService); + mmep->Param1 = mi->popupPosition; + lpGroupMenuParam gmp = (lpGroupMenuParam)wParam; + if (gmp != NULL) { + mmep->Param1 = gmp->wParam; + mmep->Param2 = gmp->lParam; + } + tmi.ownerdata = mmep; + + char buf[1024]; + mir_snprintf(buf, SIZEOF(buf), "%s/%s", mi->pszService, mi->pszName); + + OptParam op; + op.Handle = (HANDLE)CallService(MO_ADDNEWMENUITEM, (WPARAM)hGroupMenuObject, (LPARAM)&tmi); + op.Setting = OPT_MENUITEMSETUNIQNAME; + op.Value = (INT_PTR)buf; + CallService(MO_SETOPTIONSMENUITEM, 0, (LPARAM)&op); + return (INT_PTR)op.Handle; + +// mainItemCount++; +// return MENU_CUSTOMITEMMAIN|(mainMenuItem[mainItemCount-1].id); +} + +INT_PTR GroupMenuCheckService(WPARAM wParam, LPARAM lParam) +{ +//not used + return 0; +} + +INT_PTR GroupMenuonAddService(WPARAM wParam, LPARAM lParam) +{ + MENUITEMINFO *mii = (MENUITEMINFO *)wParam; + if (mii == NULL) return 0; + + if (hHideShowMainMenuItem == (HANDLE)lParam) { + mii->fMask |= MIIM_STATE; + mii->fState |= MFS_DEFAULT; + } + + if (hGroupMainMenuItemProxy == (HANDLE)lParam) { + mii->fMask |= MIIM_SUBMENU; + mii->hSubMenu = (HMENU)CallService(MS_CLIST_MENUGETMAIN, 0, 0); + } + + if (hGroupStatusMenuItemProxy == (HANDLE)lParam) { + mii->fMask |= MIIM_SUBMENU; + mii->hSubMenu = (HMENU)CallService(MS_CLIST_MENUGETSTATUS, 0, 0); + } + + return TRUE; +} + +//called with: +//wparam - ownerdata +//lparam - lparam from winproc +INT_PTR GroupMenuExecService(WPARAM wParam, LPARAM lParam) +{ + if (wParam != 0) { + lpGroupMenuExecParam mmep = (lpGroupMenuExecParam)wParam; + if (!strcmp(mmep->szServiceName, "Help/AboutCommand")) { + //bug in help.c,it used wparam as parent window handle without reason. + mmep->Param1 = 0; + CallService(mmep->szServiceName, mmep->Param1, lParam); + } + else + CallService(mmep->szServiceName, mmep->Param1, mmep->Param2); + + } + return 1; +} + +INT_PTR FreeOwnerDataGroupMenu(WPARAM wParam, LPARAM lParam) +{ + lpGroupMenuExecParam mmep = (lpGroupMenuExecParam)lParam; + if (mmep != NULL) { + mir_free(mmep->szServiceName); + mir_free(mmep); + } + return 0; +} + +INT_PTR HideGroupsHelper(WPARAM wParam, LPARAM lParam) +{ + int newVal = !(GetWindowLongPtr(pcli->hwndContactTree, GWL_STYLE) & CLS_HIDEEMPTYGROUPS); + db_set_b(NULL, "CList", "HideEmptyGroups", (BYTE)newVal); + SendMessage(pcli->hwndContactTree, CLM_SETHIDEEMPTYGROUPS, newVal, 0); + return 0; +} + +INT_PTR UseGroupsHelper(WPARAM wParam, LPARAM lParam) +{ + int newVal = !(GetWindowLongPtr(pcli->hwndContactTree, GWL_STYLE) & CLS_USEGROUPS); + db_set_b(NULL, "CList", "UseGroups", (BYTE)newVal); + SendMessage(pcli->hwndContactTree, CLM_SETUSEGROUPS, newVal, 0); + return 0; +} + +INT_PTR HideOfflineRootHelper(WPARAM wParam, LPARAM lParam) +{ + SendMessage(pcli->hwndContactTree, CLM_SETHIDEOFFLINEROOT, !SendMessage(pcli->hwndContactTree, CLM_GETHIDEOFFLINEROOT, 0, 0), 0); + return 0; +} + +static int OnBuildGroupMenu(WPARAM wParam, LPARAM lParam) +{ + CLISTMENUITEM mi = { sizeof(mi) }; + mi.flags = CMIM_FLAGS | (db_get_b(NULL, "CList", "HideOffline", SETTING_HIDEOFFLINE_DEFAULT) ? CMIF_CHECKED : 0); + Menu_ModifyItem(hHideOfflineUsersMenuItem, &mi); + + mi.flags = CMIM_FLAGS | (SendMessage(pcli->hwndContactTree, CLM_GETHIDEOFFLINEROOT, 0, 0) ? CMIF_CHECKED : 0); + Menu_ModifyItem(hHideOfflineUsersOutHereMenuItem, &mi); + + mi.flags = CMIM_FLAGS | (GetWindowLongPtr(pcli->hwndContactTree, GWL_STYLE) & CLS_HIDEEMPTYGROUPS ? CMIF_CHECKED : 0); + Menu_ModifyItem(hHideEmptyGroupsMenuItem, &mi); + + mi.flags = CMIM_FLAGS | (GetWindowLongPtr(pcli->hwndContactTree, GWL_STYLE) & CLS_USEGROUPS ? 0 : CMIF_CHECKED); + Menu_ModifyItem(hDisableGroupsMenuItem, &mi); + return 0; +} + +int static OnIconLibIconChanged(WPARAM wParam, LPARAM lParam) +{ + HICON hicon = LoadIconFromExternalFile("clisticons.dll", 2, TRUE, FALSE, "NewGroup", "Contact list", "New group", -IDI_NEWGROUP, 0); + NewGroupIconidx = ImageList_ReplaceIcon(hCListImages, NewGroupIconidx, hicon); + + CLISTMENUITEM mi = { sizeof(mi) }; + mi.flags = CMIM_ICON; + mi.hIcon = ImageList_GetIcon(hCListImages, NewGroupIconidx, 0); + Menu_ModifyItem(hNewSubGroupMenuItem, &mi); + Menu_ModifyItem(hNewGroupMenuItem, &mi); + return 0; +} + +void InitGroupMenus(void) +{ + HICON hicon = LoadIconFromExternalFile("clisticons.dll", 2, TRUE, TRUE, "NewGroup", "Contact list", "New group", -IDI_NEWGROUP2, 0); + NewGroupIconidx = ImageList_AddIcon(hCListImages, hicon); + + CreateServiceFunction("CLISTMENUSGroup/ExecService", GroupMenuExecService); + CreateServiceFunction("CLISTMENUSGroup/FreeOwnerDataGroupMenu", FreeOwnerDataGroupMenu); + CreateServiceFunction("CLISTMENUSGroup/GroupMenuonAddService", GroupMenuonAddService); + CreateServiceFunction("CLISTMENUSGroup/HideGroupsHelper", HideGroupsHelper); + CreateServiceFunction("CLISTMENUSGroup/UseGroupsHelper", UseGroupsHelper); + CreateServiceFunction("CLISTMENUSGroup/HideOfflineRootHelper", HideOfflineRootHelper); + + CreateServiceFunction("CList/AddGroupMenuItem", AddGroupMenuItem); + CreateServiceFunction(MS_CLIST_REMOVEGROUPMENUITEM, RemoveGroupMenuItem); + CreateServiceFunction(MS_CLIST_MENUBUILDGROUP, BuildGroupMenu); + hPreBuildGroupMenuEvent = CreateHookableEvent(ME_CLIST_PREBUILDGROUPMENU); + HookEvent(ME_CLIST_PREBUILDGROUPMENU, OnBuildGroupMenu); + + InitSubGroupMenus(); + + // Group menu + hGroupMenuObject = MO_CreateMenuObject("GroupMenu", LPGEN("Group menu"), 0, "CLISTMENUSGroup/ExecService"); + MO_SetMenuObjectParam(hGroupMenuObject, OPT_USERDEFINEDITEMS, TRUE); + MO_SetMenuObjectParam(hGroupMenuObject, OPT_MENUOBJECT_SET_FREE_SERVICE, "CLISTMENUSGroup/FreeOwnerDataGroupMenu"); + MO_SetMenuObjectParam(hGroupMenuObject, OPT_MENUOBJECT_SET_ONADD_SERVICE, "CLISTMENUSGroup/GroupMenuonAddService"); + { + //add exit command to menu + GroupMenuParam gmp; + + CLISTMENUITEM mi = { sizeof(mi) }; + mi.position = 1900000; + mi.pszService = "CloseAction"; + mi.pszName = LPGEN("E&xit"); + AddGroupMenuItem(0, (LPARAM)&mi); + + memset(&mi, 0, sizeof(mi)); + mi.cbSize = sizeof(mi); + mi.position = 500; + mi.pszService = MS_CLIST_SHOWHIDE; + mi.pszName = LPGEN("&Hide/Show"); + hHideShowMainMenuItem = (HANDLE)AddGroupMenuItem(0, (LPARAM)&mi); + + memset(&mi, 0, sizeof(mi)); + mi.cbSize = sizeof(mi); + mi.position = 200000; + mi.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_FINDUSER)); + mi.pszService = "FindAdd/FindAddCommand"; + mi.pszName = LPGEN("&Find/Add contacts..."); + AddGroupMenuItem(0, (LPARAM)&mi); + + memset(&mi, 0, sizeof(mi)); + mi.cbSize = sizeof(mi); + mi.position = 300000; + mi.pszService = ""; + mi.pszName = LPGEN("&Main menu"); + hGroupMainMenuItemProxy = (HANDLE)AddGroupMenuItem(0, (LPARAM)&mi); + + memset(&mi, 0, sizeof(mi)); + mi.cbSize = sizeof(mi); + mi.position = 300100; + mi.pszService = ""; + mi.pszName = LPGEN("&Status"); + hGroupStatusMenuItemProxy = (HANDLE)AddGroupMenuItem(0, (LPARAM)&mi); + + memset(&mi, 0, sizeof(mi)); + mi.cbSize = sizeof(mi); + mi.position = 400000; + mi.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_OPTIONS)); + mi.pszService = "Options/OptionsCommand"; + mi.pszName = LPGEN("&Options..."); + + AddGroupMenuItem(0, (LPARAM)&mi); + + memset(&mi, 0, sizeof(mi)); + mi.cbSize = sizeof(mi); + mi.position = 500000; + mi.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_CLIENTMIRANDA)); + mi.pszService = "Help/AboutCommand"; + mi.pszName = LPGEN("&About"); + + //AddGroupMenuItem(0, (LPARAM)&mi); + + memset(&mi, 0, sizeof(mi)); + mi.cbSize = sizeof(mi); + mi.position = 100000; + mi.hIcon = ImageList_GetIcon(hCListImages, NewGroupIconidx, 0); + mi.pszService = MS_CLIST_GROUPCREATE; + mi.pszName = LPGEN("&New group"); + hNewGroupMenuItem = (HGENMENU)AddGroupMenuItem(0, (LPARAM)&mi); + + memset(&mi, 0, sizeof(mi)); + mi.cbSize = sizeof(mi); + mi.position = 100001; + mi.hIcon = NULL; + mi.pszService = MS_CLIST_SETHIDEOFFLINE; + mi.pszName = LPGEN("&Hide offline users"); + gmp.lParam = 0; + gmp.wParam = -1; + hHideOfflineUsersMenuItem = (HGENMENU)AddGroupMenuItem((WPARAM)&gmp, (LPARAM)&mi); + + memset(&mi, 0, sizeof(mi)); + mi.cbSize = sizeof(mi); + mi.position = 100002; + mi.hIcon = NULL; + mi.pszService = "CLISTMENUSGroup/HideOfflineRootHelper"; + mi.pszName = LPGEN("Hide &offline users out here"); + hHideOfflineUsersOutHereMenuItem = (HGENMENU)AddGroupMenuItem(0, (LPARAM)&mi); + + memset(&mi, 0, sizeof(mi)); + mi.cbSize = sizeof(mi); + mi.position = 100003; + mi.hIcon = NULL; + mi.pszService = "CLISTMENUSGroup/HideGroupsHelper"; + mi.pszName = LPGEN("Hide &empty groups"); + hHideEmptyGroupsMenuItem = (HGENMENU)AddGroupMenuItem(0, (LPARAM)&mi); + + memset(&mi, 0, sizeof(mi)); + mi.cbSize = sizeof(mi); + mi.position = 100004; + mi.hIcon = NULL; + mi.pszService = "CLISTMENUSGroup/UseGroupsHelper"; + mi.pszName = LPGEN("Disable &groups"); + hDisableGroupsMenuItem = (HGENMENU)AddGroupMenuItem(0, (LPARAM)&mi); + + HookEvent(ME_SKIN2_ICONSCHANGED, OnIconLibIconChanged); + } +} + +//////////////////////////////END Group MENU///////////////////////// + + + + +//////////////////////////////SubGroup MENU///////////////////////// +HANDLE hSubGroupMenuObject; + +HANDLE hSubGroupMainMenuItemProxy; +HANDLE hSubGroupStatusMenuItemProxy; +HANDLE hPreBuildSubGroupMenuEvent; + +HGENMENU hHideOfflineUsersHereMenuItem; + +//SubGroupmenu exec param(ownerdata) +typedef struct{ + char *szServiceName; + int Param1, Param2; +} SubGroupMenuExecParam, *lpSubGroupMenuExecParam; + +/* +wparam = handle to the menu item returned by MS_CLIST_ADDCONTACTMENUITEM +return 0 on success. +*/ +static INT_PTR RemoveSubGroupMenuItem(WPARAM wParam, LPARAM lParam) +{ + CallService(MO_REMOVEMENUITEM, wParam, 0); + return 0; +} + +static int OnBuildSubGroupMenu(WPARAM wParam, LPARAM lParam) +{ + ClcGroup *group = (ClcGroup *)wParam; + if (wParam == 0) return 0; + + //contact->group + CLISTMENUITEM mi = { sizeof(mi) }; + mi.flags = CMIM_FLAGS | (group->hideOffline ? CMIF_CHECKED : 0); + Menu_ModifyItem(hHideOfflineUsersHereMenuItem, &mi); + return 0; +} + +static INT_PTR BuildSubGroupMenu(WPARAM wParam, LPARAM lParam) +{ + int tick; + HMENU hMenu; + ListParam param = { 0 }; + param.MenuObjectHandle = hSubGroupMenuObject; + param.wParam = wParam; + + //hMenu = hMainMenu; + hMenu = CreatePopupMenu(); + //hMenu = wParam; + tick = GetTickCount(); + + NotifyEventHooks(hPreBuildSubGroupMenuEvent, wParam, 0); + + CallService(MO_BUILDMENU, (WPARAM)hMenu, (LPARAM)¶m); + //DrawMenuBar((HWND)CallService("CLUI/GetHwnd",0,0)); + tick = GetTickCount() - tick; + return (INT_PTR)hMenu; +} + +static INT_PTR AddSubGroupMenuItem(WPARAM wParam, LPARAM lParam) +{ + TMO_MenuItem tmi; + CLISTMENUITEM *mi = (CLISTMENUITEM *)lParam; + if (!pcli->pfnConvertMenu(mi, &tmi)) + return 0; + + lpSubGroupMenuExecParam mmep = (lpSubGroupMenuExecParam)mir_calloc(sizeof(SubGroupMenuExecParam)); + if (mmep == NULL) + return 0; + + //we need just one parametr. + mmep->szServiceName = mir_strdup(mi->pszService); + mmep->Param1 = mi->popupPosition; + lpGroupMenuParam gmp = (lpGroupMenuParam)wParam; + if (gmp != NULL ) { + mmep->Param1 = gmp->wParam; + mmep->Param2 = gmp->lParam; + } + tmi.ownerdata = mmep; + + char buf[1024]; + mir_snprintf(buf, SIZEOF(buf), "%s/%s", mi->pszService, mi->pszName); + + OptParam op; + op.Handle = (HANDLE)CallService(MO_ADDNEWMENUITEM, (WPARAM)hSubGroupMenuObject, (LPARAM)&tmi); + op.Setting = OPT_MENUITEMSETUNIQNAME; + op.Value = (INT_PTR)buf; + CallService(MO_SETOPTIONSMENUITEM, 0, (LPARAM)&op); + return (INT_PTR)op.Handle; +} + +INT_PTR SubGroupMenuCheckService(WPARAM wParam, LPARAM lParam) +{ + return 0; +} + +INT_PTR SubGroupMenuonAddService(WPARAM wParam, LPARAM lParam) +{ + MENUITEMINFO *mii = (MENUITEMINFO *)wParam; + if (mii == NULL) + return 0; + + return TRUE; +} + +//called with: +//wparam - ownerdata +//lparam - lparam from winproc +INT_PTR SubGroupMenuExecService(WPARAM wParam, LPARAM lParam) +{ + if (wParam != 0) { + lpSubGroupMenuExecParam mmep = (lpSubGroupMenuExecParam)wParam; + if (!strcmp(mmep->szServiceName, "Help/AboutCommand")) { + //bug in help.c,it used wparam as parent window handle without reason. + mmep->Param1 = 0; + CallService(mmep->szServiceName, mmep->Param1, lParam); + } + else + CallService(mmep->szServiceName, mmep->Param1, mmep->Param2); + } + + return 1; +} + +INT_PTR FreeOwnerDataSubGroupMenu(WPARAM wParam, LPARAM lParam) +{ + lpSubGroupMenuExecParam mmep = (lpSubGroupMenuExecParam)lParam; + if (mmep != NULL) { + mir_free(mmep->szServiceName); + mir_free(mmep); + } + return 0; +} + +//wparam menu handle to pass to clc.c +INT_PTR GroupMenuExecProxy(WPARAM wParam, LPARAM lParam) +{ + SendMessage(pcli->hwndContactTree, WM_COMMAND, wParam, 0); + return 0; +} + +void InitSubGroupMenus(void) +{ + CreateServiceFunction("CLISTMENUSSubGroup/ExecService", SubGroupMenuExecService); + CreateServiceFunction("CLISTMENUSSubGroup/FreeOwnerDataSubGroupMenu", FreeOwnerDataSubGroupMenu); + CreateServiceFunction("CLISTMENUSSubGroup/SubGroupMenuonAddService", SubGroupMenuonAddService); + CreateServiceFunction("CLISTMENUSSubGroup/GroupMenuExecProxy", GroupMenuExecProxy); + + CreateServiceFunction("CList/AddSubGroupMenuItem", AddSubGroupMenuItem); + CreateServiceFunction(MS_CLIST_REMOVESUBGROUPMENUITEM, RemoveSubGroupMenuItem); + CreateServiceFunction(MS_CLIST_MENUBUILDSUBGROUP, BuildSubGroupMenu); + hPreBuildSubGroupMenuEvent = CreateHookableEvent(ME_CLIST_PREBUILDSUBGROUPMENU); + HookEvent(ME_CLIST_PREBUILDSUBGROUPMENU, OnBuildSubGroupMenu); + + //SubGroup menu + hSubGroupMenuObject = MO_CreateMenuObject("SubGroupMenu", LPGEN("Subgroup menu"), 0, "CLISTMENUSSubGroup/ExecService"); + MO_SetMenuObjectParam(hSubGroupMenuObject, OPT_USERDEFINEDITEMS, TRUE); + MO_SetMenuObjectParam(hSubGroupMenuObject, OPT_MENUOBJECT_SET_FREE_SERVICE, "CLISTMENUSSubGroup/FreeOwnerDataSubGroupMenu"); + MO_SetMenuObjectParam(hSubGroupMenuObject, OPT_MENUOBJECT_SET_ONADD_SERVICE, "CLISTMENUSSubGroup/SubGroupMenuonAddService"); + + //add exit command to menu + GroupMenuParam gmp; + + CLISTMENUITEM mi = { sizeof(mi) }; + mi.position = 1000; + mi.hIcon = ImageList_GetIcon(hCListImages, NewGroupIconidx, 0); + mi.pszService = "CLISTMENUSSubGroup/GroupMenuExecProxy"; + mi.pszName = LPGEN("&New subgroup"); + gmp.lParam = 0; + gmp.wParam = POPUP_NEWSUBGROUP; + hNewSubGroupMenuItem = (HGENMENU)AddSubGroupMenuItem((WPARAM)&gmp, (LPARAM)&mi); + + memset(&mi, 0, sizeof(mi)); + mi.cbSize = sizeof(mi); + mi.position = 1001; + mi.hIcon = NULL; + mi.pszService = "CLISTMENUSSubGroup/GroupMenuExecProxy"; + mi.pszName = LPGEN("&Hide offline users in here"); + gmp.lParam = 0; + gmp.wParam = POPUP_GROUPHIDEOFFLINE; + hHideOfflineUsersHereMenuItem = (HGENMENU)AddSubGroupMenuItem((WPARAM)&gmp, (LPARAM)&mi); + + memset(&mi, 0, sizeof(mi)); + mi.cbSize = sizeof(mi); + mi.position = 900001; + mi.icolibItem = LoadSkinnedIconHandle(SKINICON_OTHER_RENAME); //LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_RENAME)); + mi.pszService = "CLISTMENUSSubGroup/GroupMenuExecProxy"; + mi.pszName = LPGEN("&Rename group"); + gmp.lParam = 0; + gmp.wParam = POPUP_RENAMEGROUP; + AddSubGroupMenuItem((WPARAM)&gmp, (LPARAM)&mi); + + memset(&mi, 0, sizeof(mi)); + mi.cbSize = sizeof(mi); + mi.position = 900002; + mi.icolibItem = LoadSkinnedIconHandle(SKINICON_OTHER_DELETE); //LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_DELETE)); + mi.pszService = "CLISTMENUSSubGroup/GroupMenuExecProxy"; + mi.pszName = LPGEN("&Delete group"); + gmp.lParam = 0; + gmp.wParam = POPUP_DELETEGROUP; + AddSubGroupMenuItem((WPARAM)&gmp, (LPARAM)&mi); +} + +//////////////////////////////END SubGroup MENU///////////////////////// diff --git a/plugins/!Deprecated/Clist_mw/src/init.cpp b/plugins/!Deprecated/Clist_mw/src/init.cpp new file mode 100644 index 0000000000..dd509257b9 --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/init.cpp @@ -0,0 +1,225 @@ +/* + +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), +Copyright (c) 2000-04 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "commonheaders.h" + +HINSTANCE g_hInst = 0; +CLIST_INTERFACE* pcli = NULL; +int hLangpack; + +static HANDLE hCListShutdown = 0; + +HMENU BuildGroupPopupMenu( ClcGroup* group ); + +void CalcEipPosition( struct ClcData *dat, struct ClcContact *contact, ClcGroup *group, POINT *result); +void CheckPDNCE(ClcCacheEntry*); +void CluiProtocolStatusChanged( int, const char* ); +int CompareContacts( const struct ClcContact *contact1, const struct ClcContact *contact2 ); +void FreeDisplayNameCacheItem(ClcCacheEntry*); +void GetDefaultFontSetting(int i,LOGFONT *lf,COLORREF *colour); +void RebuildEntireList(HWND hwnd,struct ClcData *dat); +void RecalcScrollBar(HWND hwnd,struct ClcData *dat); + +ClcGroup* ( *saveAddGroup )(HWND hwnd,struct ClcData *dat,const TCHAR *szName,DWORD flags,int groupId,int calcTotalMembers); +ClcGroup* ( *saveRemoveItemFromGroup )(HWND hwnd,ClcGroup *group,struct ClcContact *contact,int updateTotalCount); + +void (*saveFreeContact)(struct ClcContact *p); +void (*saveFreeGroup)(ClcGroup *p); + +LRESULT ( CALLBACK *saveContactListControlWndProc )( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ); +LRESULT CALLBACK ContactListControlWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); + +LRESULT ( CALLBACK *saveContactListWndProc )(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); +LRESULT CALLBACK ContactListWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); + +void ( *saveLoadClcOptions )(HWND hwnd,struct ClcData *dat); + +int ( *saveAddItemToGroup )( ClcGroup *group, int iAboveItem ); +int AddItemToGroup(ClcGroup *group, int iAboveItem); + +int ( *saveAddInfoItemToGroup)(ClcGroup *group,int flags,const TCHAR *pszText); +int AddInfoItemToGroup(ClcGroup *group,int flags,const TCHAR *pszText); + +void ( *saveSortCLC )(HWND hwnd,struct ClcData *dat,int useInsertionSort); +void SortCLC(HWND hwnd,struct ClcData *dat,int useInsertionSort); + +INT_PTR ( *saveTrayIconProcessMessage )(WPARAM wParam, LPARAM lParam); +INT_PTR TrayIconProcessMessage(WPARAM wParam, LPARAM lParam); + +int (*saveIconFromStatusMode)(const char *szProto,int nStatus, MCONTACT hContact); +int cli_IconFromStatusMode(const char *szProto,int nStatus, MCONTACT hContact); + +//from clcfonts +void RegisterCListFonts( void ); +//from bgrcfg +extern int BGModuleLoad(); +extern int BGModuleUnload(); + +PLUGININFOEX pluginInfo = { + sizeof(PLUGININFOEX), + __PLUGIN_NAME, + PLUGIN_MAKE_VERSION(__MAJOR_VERSION, __MINOR_VERSION, __RELEASE_NUM, __BUILD_NUM), + __DESCRIPTION, + __AUTHOR, + __AUTHOREMAIL, + __COPYRIGHT, + __AUTHORWEB, + UNICODE_AWARE, + // {2A417AB9-16F2-472D-9AE3-415103C78A64} + {0x2a417ab9, 0x16f2, 0x472d, {0x9a, 0xe3, 0x41, 0x51, 0x3, 0xc7, 0x8a, 0x64}} +}; + +BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD dwReason, LPVOID reserved) +{ + g_hInst = hInstDLL; + DisableThreadLibraryCalls(g_hInst); + return TRUE; +} + +extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) +{ + return &pluginInfo; +} + +extern "C" __declspec(dllexport) const MUUID MirandaInterfaces[] = {MIID_CLIST, MIID_LAST}; + +int LoadContactListModule(void); +int PreloadCLCModule(void); +int LoadCLCModule(void); +int LoadCLUIModule(); +int InitSkinHotKeys(); + +static int OnModulesLoaded(WPARAM wParam, LPARAM lParam) +{ + if ( LoadCLUIModule()) + return 1; + + InitSkinHotKeys(); + RegisterCListFonts(); + return 0; +} + +INT_PTR SetDrawer(WPARAM wParam, LPARAM lParam) +{ + pDrawerServiceStruct DSS = (pDrawerServiceStruct)wParam; + if (DSS->cbSize != sizeof(*DSS)) return -1; + if (DSS->PluginName == NULL) return -1; + if (DSS->GetDrawFuncsServiceName == NULL) return -1; + if ( !ServiceExists(DSS->GetDrawFuncsServiceName)) return -1; + + + SED.cbSize = sizeof(SED); + SED.PaintClc = (void (__cdecl *)(HWND,struct ClcData *,HDC,RECT *,int ,ClcProtoStatus *,HIMAGELIST))CallService(DSS->GetDrawFuncsServiceName,CLUI_EXT_FUNC_PAINTCLC,0); + if ( !SED.PaintClc) return -1; + return 0; +} + +static struct ClcContact* fnCreateClcContact( void ) +{ + return (struct ClcContact*)mir_calloc( sizeof( struct ClcContact )); +} + +static ClcCacheEntry *fnCreateCacheItem(MCONTACT hContact ) +{ + ClcCacheEntry *p = (ClcCacheEntry *)mir_calloc( sizeof( ClcCacheEntry )); + if ( p ) + p->hContact = hContact; + return p; +} + +extern "C" int __declspec(dllexport) CListInitialise() +{ + int rc = 0; + + OutputDebugStringA("CListInitialise ClistMW\r\n"); + mir_getLP( &pluginInfo ); + mir_getCLI(); + + PreloadCLCModule(); + + pcli->hInst = g_hInst; + pcli->pfnBuildGroupPopupMenu = BuildGroupPopupMenu; + pcli->pfnCalcEipPosition = CalcEipPosition; + pcli->pfnCheckCacheItem = CheckPDNCE; + pcli->pfnCluiProtocolStatusChanged = CluiProtocolStatusChanged; + pcli->pfnCompareContacts = CompareContacts; + pcli->pfnCreateClcContact = fnCreateClcContact; + pcli->pfnCreateCacheItem = fnCreateCacheItem; + pcli->pfnFindItem = FindItem; + pcli->pfnFreeCacheItem = FreeDisplayNameCacheItem; + pcli->pfnGetDefaultFontSetting = GetDefaultFontSetting; + pcli->pfnGetRowsPriorTo = GetRowsPriorTo; + pcli->pfnGetRowByIndex = GetRowByIndex; + pcli->pfnHitTest = HitTest; + pcli->pfnPaintClc = PaintClc; + pcli->pfnRebuildEntireList = RebuildEntireList; + pcli->pfnRecalcScrollBar = RecalcScrollBar; + pcli->pfnScrollTo = ScrollTo; + + saveIconFromStatusMode = pcli->pfnIconFromStatusMode; + pcli->pfnIconFromStatusMode = cli_IconFromStatusMode; + + saveAddGroup = pcli->pfnAddGroup; pcli->pfnAddGroup = AddGroup; + saveAddInfoItemToGroup = pcli->pfnAddInfoItemToGroup; pcli->pfnAddInfoItemToGroup = AddInfoItemToGroup; + saveAddItemToGroup = pcli->pfnAddItemToGroup; pcli->pfnAddItemToGroup = AddItemToGroup; + saveRemoveItemFromGroup = pcli->pfnRemoveItemFromGroup; pcli->pfnRemoveItemFromGroup = RemoveItemFromGroup; + saveFreeContact = pcli->pfnFreeContact; pcli->pfnFreeContact = FreeContact; + saveFreeGroup = pcli->pfnFreeGroup; pcli->pfnFreeGroup = FreeGroup; + saveContactListControlWndProc = pcli->pfnContactListControlWndProc; pcli->pfnContactListControlWndProc = ContactListControlWndProc; + saveTrayIconProcessMessage = pcli->pfnTrayIconProcessMessage; pcli->pfnTrayIconProcessMessage = TrayIconProcessMessage; + saveContactListWndProc = pcli->pfnContactListWndProc; pcli->pfnContactListWndProc = ContactListWndProc; + saveLoadClcOptions = pcli->pfnLoadClcOptions; pcli->pfnLoadClcOptions = LoadClcOptions; + saveSortCLC = pcli->pfnSortCLC; pcli->pfnSortCLC = SortCLC; + + memset(&SED,0,sizeof(SED)); + CreateServiceFunction(CLUI_SetDrawerService,SetDrawer); + + rc = LoadContactListModule(); + if (rc == 0) + rc = LoadCLCModule(); + + HookEvent(ME_SYSTEM_MODULESLOADED, OnModulesLoaded); + BGModuleLoad(); + + OutputDebugStringA("CListInitialise ClistMW...Done\r\n"); + + return rc; +} + +// never called by a newer plugin loader. +extern "C" int __declspec(dllexport) Load(void) +{ + OutputDebugStringA("Load ClistMW\r\n"); + CListInitialise(); + return 1; +} + +extern "C" int __declspec(dllexport) Unload(void) +{ + OutputDebugStringA("Unloading ClistMW\r\n"); + if (IsWindow(pcli->hwndContactList)) DestroyWindow(pcli->hwndContactList); + BGModuleUnload(); + pcli->hwndContactList = 0; + return 0; +} diff --git a/plugins/!Deprecated/Clist_mw/src/keyboard.cpp b/plugins/!Deprecated/Clist_mw/src/keyboard.cpp new file mode 100644 index 0000000000..bd8a438231 --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/keyboard.cpp @@ -0,0 +1,67 @@ +/* + +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), +Copyright (c) 2000-03 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "commonheaders.h" +#include + +INT_PTR hkCloseMiranda(WPARAM wParam, LPARAM lParam) +{ + CallService("CloseAction", 0, 0); + return 0; +} + +INT_PTR hkRestoreStatus(WPARAM wParam, LPARAM lParam) +{ + int nStatus = db_get_w(NULL, "CList", "Status", ID_STATUS_OFFLINE); + CallService(MS_CLIST_SETSTATUSMODE, nStatus, 0); + + return 0; +} + +int InitSkinHotKeys(void) +{ + CreateServiceFunction("CLIST/HK/CloseMiranda",hkCloseMiranda); + CreateServiceFunction("CLIST/HK/RestoreStatus",hkRestoreStatus); + + HOTKEYDESC shk = {0}; + shk.cbSize = sizeof(shk); + + shk.pszDescription = LPGEN("Close Miranda"); + shk.pszName = "CloseMiranda"; + shk.pszSection = "Main"; + shk.pszService = "CLIST/HK/CloseMiranda"; + Hotkey_Register(&shk); + + shk.pszDescription = LPGEN("Restore last status"); + shk.pszName = "RestoreLastStatus"; + shk.pszSection = "Status"; + shk.pszService = "CLIST/HK/RestoreStatus"; + Hotkey_Register(&shk); + + return 0; +} + +void UninitSkinHotKeys(void) +{ +} diff --git a/plugins/!Deprecated/Clist_mw/src/resource.h b/plugins/!Deprecated/Clist_mw/src/resource.h new file mode 100644 index 0000000000..a726d14957 --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/resource.h @@ -0,0 +1,642 @@ +//{{NO_DEPENDENCIES}} +// Âêëþ÷àåìûé ôàéë, ñîçäàííûé â Microsoft Visual C++. +// Èñïîëüçóåòñÿ d:\MNG_orig\plugins\Clist_mw\res\resource.rc +// +#define IDC_AUTHICON 1 +#define IDC_NOTOALL 3 +#define IDC_APPLY 3 +#define MIM_V1 10 +#define IDI_GLOBUS 11 +#define MIM_V2 20 +#define MIM_V3 30 +#define MIM_V4 30 +#define IDD_ABOUT 103 +#define IDI_SMS 103 +#define IDI_ONLINE 104 +#define IDI_OFFLINE 105 +#define IDD_GNUPL 110 +#define IDD_ADDED 115 +#define IDD_URLSEND 119 +#define IDD_URLRECV 120 +#define IDD_AUTHREQ 121 +#define IDD_DETAILS 125 +#define IDD_OPT_CLIST 126 +#define IDD_HISTORY 127 +#define IDI_AWAY 128 +#define IDI_FREE4CHAT 129 +#define IDI_INVISIBLE 130 +#define IDI_NA 131 +#define IDD_OPT_SOUND 134 +#define IDD_OPT_HOTKEYS 134 +#define IDI_SENDURL 135 +#define IDI_RECVMSG 136 +#define IDI_SENDMSG 137 +#define IDI_URL 138 +#define IDI_DND 158 +#define IDI_OCCUPIED 159 +#define IDI_USERDETAILS 160 +#define IDI_FINDUSER 161 +#define IDI_HELP 162 +#define IDI_OPTIONS 163 +#define IDI_MIRANDAWEBSITE 172 +#define IDI_RENAME 173 +#define IDI_HISTORY 174 +#define IDI_DELETE 175 +#define IDR_CONTEXT 180 +#define IDC_DROP 183 +#define IDD_OPT_HOTKEY 184 +#define IDD_HISTORY_FIND 192 +#define IDI_SENDEMAIL 193 +#define IDD_FILERECV 194 +#define IDD_PROFILEMANAGER 197 +#define IDD_NEWPROFILE 198 +#define IDR_CLISTMENU 199 +#define IDI_BLANK 200 +#define IDD_FINDADD 201 +#define IDI_USERONLINE 201 +#define IDD_OPT_AUTOAWAY 202 +#define IDI_GROUPSHUT 202 +#define IDD_OPTIONS 203 +#define IDI_GROUPOPEN 203 +#define IDD_PLUGINCONFLICT 204 +#define IDD_FILESEND 205 +#define IDI_NOTICK 205 +#define IDD_OPT_PLUGINS 206 +#define IDI_TICK 206 +#define IDD_OPT_ICONS 207 +#define IDI_FILE 207 +#define IDI_TIMESTAMP 208 +#define IDI_CHANGEFONT 209 +#define IDI_ADDCONTACT 210 +#define IDI_SMALLDOT 211 +#define IDI_FILLEDBLOB 212 +#define IDD_READAWAYMSG 213 +#define IDI_EMPTYBLOB 213 +#define IDD_OPT_IGNORE 214 +#define IDC_HYPERLINKHAND 214 +#define IDD_OPT_VISIBILITY 215 +#define IDC_DROPUSER 215 +#define IDD_SETAWAYMSG 216 +#define IDI_DETAILSLOGO 216 +#define IDD_OPT_AWAYMSG 217 +#define IDD_OPT_CLUI 218 +#define IDD_INFO_SUMMARY 220 +#define IDD_INFO_CONTACT 221 +#define IDD_INFO_BACKGROUND 222 +#define IDD_INFO_NOTES 223 +#define IDD_ADDEMAIL 226 +#define IDD_ICONINDEX 227 +#define IDD_OPT_CLC 228 +#define IDD_OPT_CLCBKG 230 +#define IDD_INFO_LOCATION 231 +#define IDD_INFO_WORK 232 +#define IDD_ADDPHONE 233 +#define IDD_OPT_SBAR 234 +#define IDD_INSTALLINI 235 +#define IDD_WARNINICHANGE 236 +#define IDD_INIIMPORTDONE 237 +#define IDB_SORTCOLUP 239 +#define IDB_SORTCOLDOWN 240 +#define IDD_OPT_NETLIB 246 +#define IDD_NETLIBLOGOPTS 247 +#define IDD_FILETRANSFERINFO 249 +#define IDD_OPT_FILETRANSFER 250 +#define IDD_FILEEXISTS 251 +#define IDD_DELETECONTACT 254 +#define IDD_DENYREASON 256 +#define IDD_ADDCONTACT 257 +#define IDD_OPT_CONTACT 261 +#define IDD_OPT_PROTOCOLORDER 262 +#define IDI_MULTISEND 263 +#define IDI_DOWNARROW 264 +#define IDD_CREDITS 265 +#define IDD_OPT_IDLE 268 +#define IDI_ICQC1 269 +#define IDI_ICQC2 270 +#define IDI_ICQC3 271 +#define IDI_ICQC4 272 +#define IDI_ICQC5 273 +#define IDI_ICQC6 274 +#define IDI_ICQC7 275 +#define IDI_ICQC8 276 +#define IDI_EMAIL 277 +#define IDD_OPT_META_CLC 279 +#define IDI_NEWGROUP 282 +#define IDI_NEWGROUP2 282 +#define IDI_CLIENTTRILLIAN 298 +#define IDI_CLIENTMIRANDA 299 +#define IDI_CLIENTRQ 300 +#define IDI_CLIENTGAIM 301 +#define IDI_CLIENTIM2 302 +#define IDI_CLIENTKOPETE 303 +#define IDI_CLIENTLICQ 304 +#define IDI_CLIENTQIP 305 +#define IDI_CLIENTSIM 306 +#define IDI_MIRANDA2 307 +#define IDD_OPT_CLCBKG2 308 +#define IDI_CLIENTICQL5 315 +#define IDI_CLIENTAGILE 318 +#define IDI_CLIENTGNOMEICU 319 +#define IDI_ICON1 320 +#define IDI_CLIENTMOBICQ 320 +#define IDI_CLIENTSPAMBOT 321 +#define IDI_CLIENTICQMAC 322 +#define IDI_CLIENTIMPLUS 323 +#define IDI_CLIENTYSM 324 +#define IDI_CLIENTYAMIGO 325 +#define IDI_CLIENTWEBICQ 326 +#define IDI_CLIENTVICQ 327 +#define IDI_CLIENTSTRICQ 328 +#define IDI_CLIENTSTICQ 329 +#define IDI_CLIENTNICQ2 330 +#define IDI_CLIENTPSI 331 +#define IDI_CLIENTMOB2ICQ 333 +#define IDI_CLIENTMICQ 334 +#define IDI_CLIENTLIBICQ2000 335 +#define IDI_CLIENTCENTERICQ 336 +#define IDI_CLIENTALICQ 337 +#define IDI_CLIENTICQ2000 339 +#define IDI_CLIENTICQ2001 340 +#define IDI_CLIENTICQ2003 341 +#define IDI_CLIENTICQLITE 342 +#define IDI_CLIENTICQLITE4 343 +#define IDI_CLIENTICQLITE5 344 +#define IDI_CLIENTICQGOF 345 +#define IDI_CLIENTICQGOJ 346 +#define IDC_RESETPROTOCOLDATA 1000 +#define IDC_SAVE 1001 +#define IDC_DEFBKCOLOR 1001 +#define IDI_ONTHEPHONE 1002 +#define IDC_MESSAGE 1002 +#define IDI_OUTTOLUNCH 1003 +#define IDC_AUTOCLOSE 1004 +#define IDC_FROM 1005 +#define IDC_AUTOMIN 1005 +#define IDC_DATE 1006 +#define IDC_DUMPRECV 1006 +#define IDC_MSG 1008 +#define IDC_PROXYDNS 1008 +#define IDC_NAME 1009 +#define IDC_PROXYTYPE 1009 +#define IDC_STATIC23 1010 +#define IDC_NAMEVAL 1010 +#define IDC_SPECIFYPORTS 1013 +#define IDC_ST_ENTERMSG 1013 +#define IDC_ST_ENTERURL 1014 +#define IDC_SPECIFYPORTSO 1014 +#define IDC_TEXT 1019 +#define IDC_SHOWNAMES 1024 +#define IDC_ABOUT 1032 +#define IDC_MYNOTES 1033 +#define IDC_URLS 1037 +#define IDC_REPLY 1039 +#define IDC_URL 1041 +#define IDC_REASON 1046 +#define IDC_EMAIL 1048 +#define IDC_NAMENICK 1049 +#define IDC_NAMEFIRST 1050 +#define IDC_NAMELAST 1051 +#define IDC_NICK 1053 +#define IDC_GENDER 1060 +#define IDC_CITY 1061 +#define IDC_STATE 1062 +#define IDC_COUNTRY 1063 +#define IDC_AGE 1064 +#define IDC_ZIP 1064 +#define IDC_PHONE 1065 +#define IDC_STREET 1065 +#define IDC_COMPANY 1066 +#define IDC_LANGUAGE1 1066 +#define IDC_TIMEZONE 1067 +#define IDC_DEPARTMENT 1067 +#define IDC_LOCALTIME 1068 +#define IDC_DETAILS 1069 +#define IDC_POSITION 1069 +#define IDC_LANGUAGE2 1069 +#define IDC_ADD 1070 +#define IDC_LANGUAGE3 1070 +#define IDC_MOREOPTIONS 1071 +#define IDC_USERMENU 1071 +#define IDC_MIN2TRAY 1073 +#define IDC_ONTOP 1074 +#define IDC_SHOWMAINMENU 1075 +#define IDC_CLIENTDRAG 1076 +#define IDC_EDIT 1078 +#define IDC_LIST 1079 +#define IDC_HISTORY 1080 +#define IDC_USESOUND 1085 +#define IDC_TOOLWND 1097 +#define IDC_ONECLK 1098 +#define IDC_SHOWCAPTION 1098 +#define IDC_HIDEOFFLINE 1099 +#define IDC_SHOWHIDE 1100 +#define IDC_HIDEEMPTYGROUPS 1100 +#define IDC_SORTBYSTATUS 1101 +#define IDC_FADEINOUT 1101 +#define IDC_READMSG 1102 +#define IDC_AUTOSIZE 1102 +#define IDC_DISABLEGROUPS 1102 +#define IDC_AUTOSIZEUPWARD 1103 +#define IDC_ALWAYSSTATUS 1103 +#define IDC_NETSEARCH 1104 +#define IDC_CONFIRMDELETE 1104 +#define IDC_SORTBYPROTO 1105 +#define IDC_SHOWOPTIONS 1105 +#define IDC_SEARCHURL 1106 +#define IDC_BUILDTIME 1108 +#define IDC_NUMBER 1113 +#define IDC_UIN 1123 +#define IDC_TRANSPARENT 1124 +#define IDC_TRANSINACTIVE 1126 +#define IDC_TRANSACTIVE 1128 +#define IDC_FINDWHAT 1131 +#define IDC_FIND 1132 +#define IDC_FILE 1133 +#define IDC_PROFILELIST 1134 +#define IDC_NEWPROFILE 1135 +#define IDC_NEWPROFILENAME 1136 +#define IDC_TABS 1141 +#define IDC_RESULTS 1142 +#define IDC_STATUS 1144 +#define IDC_SCREENSAVE 1145 +#define IDC_TIMED 1146 +#define IDC_AWAYTIME 1147 +#define IDC_USEPROXY 1148 +#define IDC_SETNA 1148 +#define IDC_PROXYAUTH 1149 +#define IDC_NATIME 1149 +#define IDC_PROXYHOST 1150 +#define IDC_PROXYPORT 1151 +#define IDC_PROXYUSER 1152 +#define IDC_PROXYPASS 1153 +#define IDC_STATIC11 1154 +#define IDC_STATIC12 1155 +#define IDC_STATIC21 1156 +#define IDC_STATIC22 1157 +#define IDC_STATIC31 1158 +#define IDC_STATIC32 1159 +#define IDC_PROXYAUTHNTLM 1160 +#define IDC_HKSHOWHIDE 1162 +#define IDC_HKREADMSG 1163 +#define IDC_SOUNDLIST 1163 +#define IDC_HKSEARCH 1164 +#define IDC_CHANGE 1164 +#define IDC_PREVIEW 1165 +#define IDC_HKSHOWOPTIONS 1165 +#define IDC_PLUGINLIST 1167 +#define IDC_FEATURENAME 1168 +#define IDC_CHOOSE 1169 +#define IDC_TO 1170 +#define IDC_ABOUTGROUP 1175 +#define IDC_DESCRIPTION 1176 +#define IDC_AUTHOR 1177 +#define IDC_COPYRIGHT 1178 +#define IDC_VERSION 1179 +#define IDC_HOMEPAGE 1181 +#define IDC_RESTARTREQD 1182 +#define IDC_ICONSET 1183 +#define IDC_BROWSE 1184 +#define IDC_RUNATSTARTBROWSE 1185 +#define IDC_PAGETREE 1186 +#define IDC_RUNNOW 1186 +#define IDC_INACTIVEPERC 1187 +#define IDC_ACTIVEPERC 1188 +#define IDC_SEARCHNEWWND 1188 +#define IDC_RETRIEVING 1193 +#define IDC_TITLETEXT 1196 +#define IDC_GETMORE 1200 +#define IDC_VISIBLEICON 1204 +#define IDC_INVISIBLEICON 1205 +#define IDC_FILEICON 1206 +#define IDC_ONLINEICON 1207 +#define IDC_FILENAMES 1208 +#define IDC_ALLICON 1208 +#define IDC_DONTREPLY 1209 +#define IDC_NONEICON 1209 +#define IDC_USEPREVIOUS 1210 +#define IDC_NODIALOG 1211 +#define IDC_USESPECIFIC 1212 +#define IDC_FILEDIR 1213 +#define IDC_ALLFILESPROGRESS 1217 +#define IDC_CURRENTSPEED 1219 +#define IDC_STAWAYTYPE 1220 +#define IDC_WHITERECT 1221 +#define IDC_ALLSPEED 1221 +#define IDC_CURRENTFILEPROGRESS 1222 +#define IDC_CURRENTFILEGROUP 1223 +#define IDC_FIRSTNAME 1224 +#define IDC_LASTNAME 1225 +#define IDC_CURRENTTRANSFERRED 1225 +#define IDC_DOBDAY 1226 +#define IDC_DOBMONTH 1227 +#define IDC_WEBPAGE 1228 +#define IDC_DOBYEAR 1228 +#define IDC_UPDATING 1231 +#define IDC_NAMEORDER 1234 +#define IDC_AUTOHIDE 1235 +#define IDC_HIDETIME 1236 +#define IDC_RECONNECTREQD 1239 +#define IDC_IMPORT 1241 +#define IDC_TOMAIN 1243 +#define IDC_TOPROTO 1244 +#define IDC_PROTOLIST 1245 +#define IDC_TODEFICON 1246 +#define IDC_IMPORTMULTI 1247 +#define IDC_MAXSIZEHEIGHT 1254 +#define IDC_MAXSIZESPIN 1255 +#define IDC_FONTID 1256 +#define IDC_SAMETYPE 1257 +#define IDC_SAMESTYLE 1258 +#define IDC_SAMECOLOUR 1259 +#define IDC_SAMEAS 1260 +#define IDC_TYPEFACE 1261 +#define IDC_BOLD 1262 +#define IDC_ITALIC 1263 +#define IDC_COLOUR 1264 +#define IDC_UNDERLINE 1265 +#define IDC_HOTCOLOUR 1267 +#define IDC_SAMESIZE 1268 +#define IDC_BKGCOLOUR 1269 +#define IDC_FILENAME 1271 +#define IDC_SCROLL 1277 +#define IDC_PROPORTIONAL 1278 +#define IDC_SELCOLOUR 1281 +#define IDC_QUICKCOLOUR 1282 +#define IDC_SMOOTHTIME 1283 +#define IDC_SMOOTHTIMESPIN 1284 +#define IDC_GREYOUT 1285 +#define IDC_ROWHEIGHT 1285 +#define IDC_ROWHEIGHTSPIN 1286 +#define IDC_GREYOUTOPTS 1288 +#define IDC_GROUPINDENT 1289 +#define IDC_GROUPINDENTSPIN 1290 +#define IDC_LEFTMARGIN 1291 +#define IDC_SAMPLE 1292 +#define IDC_LEFTMARGINSPIN 1292 +#define IDC_FONTSIZE 1293 +#define IDC_STRETCHH 1298 +#define IDC_STRETCHV 1299 +#define IDC_TILEH 1300 +#define IDC_SCRIPT 1300 +#define IDC_TILEV 1301 +#define IDC_GAMMACORRECT 1302 +#define IDC_TILEVROWH 1302 +#define IDC_INTERESTS 1305 +#define IDC_EMAILS 1306 +#define IDC_PAST 1307 +#define IDC_HIDEOFFLINEOPTS 1308 +#define IDC_PHONES 1308 +#define IDC_SMS 1310 +#define IDC_AREA 1312 +#define IDC_UPDATE 1313 +#define IDC_DONTCYCLE 1315 +#define IDC_PRIMARYSTATUS 1316 +#define IDC_CYCLE 1317 +#define IDC_CYCLETIME 1318 +#define IDC_CYCLETIMESPIN 1319 +#define IDC_HIDETIMESPIN 1320 +#define IDC_MULTITRAY 1321 +#define IDC_ALWAYSMULTI 1322 +#define IDC_SHOWICON 1323 +#define IDC_SHOWPROTO 1324 +#define IDC_SHOWSTATUS 1325 +#define IDC_EQUALSECTIONS 1326 +#define IDC_SHOWSIZEGRIP 1327 +#define IDC_USEOWNERDRAW 1328 +#define IDC_SHOWSBAR 1329 +#define IDC_RIGHTMIRANDA 1330 +#define IDC_RIGHTSTATUS 1331 +#define IDC_ININAME 1333 +#define IDC_VIEWINI 1334 +#define IDC_SECURITYINFO 1335 +#define IDC_SETTINGNAME 1336 +#define IDC_NEWVALUE 1337 +#define IDC_WARNNOMORE 1338 +#define IDC_DELETE 1339 +#define IDC_RECYCLE 1340 +#define IDC_NEWNAME 1341 +#define IDC_MOVE 1342 +#define IDC_LEAVE 1343 +#define IDC_EXPERT 1346 +#define IDC_SORTBYNAME 1347 +#define IDC_STAUTOHIDESECS 1349 +#define IDC_STCLISTGROUP 1350 +#define IDC_DISABLEDRAGDROP 1351 +#define IDC_NOTEDITLABELS 1352 +#define IDC_SHOWSELALWAYS 1353 +#define IDC_TRACKSELECT 1354 +#define IDC_SHOWGROUPCOUNTS 1355 +#define IDC_HIDECOUNTSWHENEMPTY 1356 +#define IDC_DIVIDERONOFF 1357 +#define IDC_NOTNOTRANSLUCENTSEL 1358 +#define IDC_LINEWITHGROUPS 1359 +#define IDC_QUICKSEARCHVISONLY 1360 +#define IDC_SORTGROUPSALPHA 1361 +#define IDC_NOTNOSMOOTHSCROLLING 1362 +#define IDC_BITMAP 1363 +#define IDC_STWINDOWGROUP 1364 +#define IDC_STATIC01 1365 +#define IDC_CATEGORYLIST 1366 +#define IDC_LOADICONS 1369 +#define IDC_STICONSGROUP 1371 +#define IDC_MSGICON 1375 +#define IDC_URLICON 1376 +#define IDC_STNOPAGE 1377 +#define IDC_STCHECKMARKS 1380 +#define IDC_STSAMETEXT 1382 +#define IDC_STASTEXT 1383 +#define IDC_STSIZETEXT 1384 +#define IDC_STCOLOURTEXT 1385 +#define IDC_STHORZBAR 1386 +#define IDC_MIRANDA 1388 +#define IDC_STATUSBAR 1389 +#define IDC_PROTOIDGROUP 1392 +#define IDC_BYPROTOID 1393 +#define IDC_PROTOID 1394 +#define IDC_EMAILGROUP 1395 +#define IDC_BYEMAIL 1396 +#define IDC_STNAMENICK 1397 +#define IDC_NAMEGROUP 1398 +#define IDC_BYNAME 1399 +#define IDC_STNAMEFIRST 1400 +#define IDC_STNAMELAST 1401 +#define IDC_ADVANCEDGROUP 1402 +#define IDC_BYADVANCED 1403 +#define IDC_ADVANCED 1404 +#define IDC_STSIMPLERIGHT 1440 +#define IDC_NETLIBUSERS 1443 +#define IDC_STOFTENPORT 1445 +#define IDC_STATIC51 1446 +#define IDC_STATIC52 1447 +#define IDC_STATIC43 1448 +#define IDC_LOGOPTIONS 1449 +#define IDC_PORTSRANGE 1450 +#define IDC_TOCONSOLE 1451 +#define IDC_STATIC53 1451 +#define IDC_SHOWCONSOLEATSTART 1452 +#define IDC_PORTSRANGEO 1452 +#define IDC_STATIC54 1453 +#define IDC_SHOWCONSOLE 1454 +#define IDC_TOOUTPUTDEBUGSTRING 1455 +#define IDC_TOFILE 1456 +#define IDC_CLEARCONSOLE 1457 +#define IDC_RUNATSTART 1458 +#define IDC_DUMPSENT 1464 +#define IDC_DUMPPROXY 1466 +#define IDC_TEXTDUMPS 1467 +#define IDC_AUTODETECTTEXT 1468 +#define IDC_TIMEFORMAT 1469 +#define IDC_FILENAMEBROWSE 1470 +#define IDC_SHOWTHISDLGATSTART 1471 +#define IDC_FILEDIRBROWSE 1475 +#define IDC_ALLFILESGROUP 1476 +#define IDC_SCANCMDLINEBROWSE 1476 +#define IDC_ALLTRANSFERRED 1477 +#define IDC_OPENFOLDER 1478 +#define IDC_OPENFILE 1479 +#define IDC_TOTALSIZE 1480 +#define IDC_APPENDNICKTODIR 1483 +#define IDC_AUTOACCEPT 1484 +#define IDC_SCANCMDLINE 1485 +#define IDC_WARNBEFOREOPENING 1488 +#define IDC_SCANDURINGDL 1489 +#define IDC_SCANAFTERDL 1490 +#define IDC_NOSCANNER 1491 +#define IDC_ST_CMDLINE 1492 +#define IDC_ST_CMDLINEHELP 1493 +#define IDC_PROPERTIES 1496 +#define IDC_RESUME 1497 +#define IDC_EXISTINGICON 1499 +#define IDC_RESUMEALL 1500 +#define IDC_OVERWRITE 1501 +#define IDC_OVERWRITEALL 1502 +#define IDC_SKIP 1503 +#define IDC_EXISTINGSIZE 1506 +#define IDC_EXISTINGDATE 1507 +#define IDC_EXISTINGTYPE 1508 +#define IDC_NEWICON 1509 +#define IDC_NEWSIZE 1510 +#define IDC_NEWDATE 1511 +#define IDC_NEWTYPE 1512 +#define IDC_SAVEAS 1513 +#define IDC_ASK 1516 +#define IDC_RENAME 1519 +#define IDC_VIRUSSCANNERGROUP 1520 +#define IDC_HIDE 1534 +#define IDC_TOPLINE 1535 +#define IDC_GPLBTN 1536 +#define IDC_MAIL 1536 +#define IDC_MYHANDLE 1540 +#define IDC_GROUP 1541 +#define IDC_ADDED 1542 +#define IDC_AUTH 1543 +#define IDC_PLUGINSTATIC1 1559 +#define IDC_DELETEHISTORY 1560 +#define IDC_HOTKEYURLSTR 1567 +#define IDC_SETNASTR 1568 +#define IDC_AAUTHOR 1569 +#define IDC_AHOMEPAGE 1570 +#define IDC_AVERSION 1571 +#define IDC_ACOPYRIGHT 1572 +#define IDC_ADESCRIPTION 1573 +#define IDC_PLUGINENABLE 1574 +#define IDC_AUTHREQ 1577 +#define IDC_AUTHGB 1578 +#define IDC_BRINGTOFRONT 1579 +#define IDC_PROTOCOL 1580 +#define IDC_CONTRIBLINK 1586 +#define IDC_HOMELINK 1587 +#define IDC_SUPPORTLINK 1588 +#define IDC_DEVS 1589 +#define IDC_GPL 1590 +#define IDC_LOGO 1591 +#define IDC_PROTOCOLORDER 1591 +#define IDC_PROTOCOLORDERWARNING 1592 +#define IDC_CREDITSTEXT 1595 +#define IDC_WSLOCK 1599 +#define IDC_BLINKTIME 1607 +#define IDC_BLINKSPIN 1608 +#define IDC_DISABLEBLINK 1609 +#define IDC_IDLE 1610 +#define IDC_SBPANELBEVEL 1611 +#define IDC_META 1611 +#define IDC_DROPSHADOW 1612 +#define IDC_METADBLCLK 1612 +#define IDC_NOSCROLLBAR 1613 +#define IDC_METASUBEXTRA 1614 +#define IDC_METASUBEXTRA_IGN 1615 +#define IDC_METASUB_HIDEOFFLINE 1616 +#define IDC_BUTTON1 1633 +#define IDC_IDLECHECK 1636 +#define IDC_IDLEONWINDOWS 1637 +#define IDC_IDLEONMIRANDA 1638 +#define IDC_IDLEUSEGLI 1639 +#define IDC_SCREENSAVER 1642 +#define IDC_LOCKED 1643 +#define IDC_IDLESHORT 1644 +#define IDC_IDLELONG 1645 +#define IDC_IDLE1STTIME 1646 +#define IDC_IDLE2NDTIME 1647 +#define IDC_IDLEPRIVATE 1649 +#define IDC_AASTATUS 1650 +#define IDC_AASHORTIDLE 1651 +#define IDC_AALONGSTATUS 1652 +#define IDC_AALONGIDLE 1656 +#define IDC_NOOFFLINEMOVE 1657 +#define IDC_HOTKEYTREE 1657 +#define IDC_LOCATION 1659 +#define IDC_SGROUP 1660 +#define IDC_SLOC 1661 +#define IDC_ONDESKTOP 1662 +#define IDC_SETHOTKEY 1759 +#define IDC_HKTITLE 1760 +#define IDC_CHECK1 1761 +#define IDC_USECONNECTINGICON 1761 +#define IDC_BKGRLIST 1762 +#define IDC_BC_STATIC 1763 +#define IDC_SC_STATIC 1764 +#define IDD_OPT_GENMENU 11267 +#define IDC_MENUITEMS 11710 +#define IDC_MENUOBJECTS 11711 +#define IDC_NOTSUPPORTWARNING 11712 +#define IDC_INSERTSEPARATOR 11715 +#define IDC_GENMENU_SERVICE 11716 +#define IDC_GENMENU_CUSTOMNAME 11717 +#define IDC_GENMENU_SET 11718 +#define IDC_GENMENU_SET2 11719 +#define IDC_GENMENU_DEFAULT 11719 +#define IDC_ICONBLINK 11720 +#define IDI_SEARCHALL 32548 +#define ID_ICQ_EXIT 40001 +#define IDM_COPY 40001 +#define ID_RESET 40002 +#define POPUP_HIDEEMPTYGROUPS 40003 +#define POPUP_NEWSUBGROUP 40004 +#define POPUP_HIDEOFFLINE 40005 +#define POPUP_GROUPHIDEOFFLINE 40006 +#define POPUP_HIDEOFFLINEROOT 40007 +#define POPUP_DISABLEGROUPS 40008 +#define IDC_SENDMESSAGE 40009 +#define IDM_COPYALL 40011 +#define IDM_SELECTALL 40012 +#define IDM_CLEAR 40013 +#define IDM_OPENNEW 40014 +#define IDM_OPENEXISTING 40015 +#define IDM_COPYLINK 40016 +#define POPUP_HIDEMIRANDA 40017 +#define ID_TRAY_HIDE 40038 +#define ID_TRAY_EXIT 40040 +#define POPUP_NEWGROUP 40050 +#define POPUP_RENAMEGROUP 40052 +#define POPUP_DELETEGROUP 40053 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 347 +#define _APS_NEXT_COMMAND_VALUE 40018 +#define _APS_NEXT_CONTROL_VALUE 1763 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/plugins/!Deprecated/Clist_mw/src/stdafx.cpp b/plugins/!Deprecated/Clist_mw/src/stdafx.cpp new file mode 100644 index 0000000000..0edf9e36e6 --- /dev/null +++ b/plugins/!Deprecated/Clist_mw/src/stdafx.cpp @@ -0,0 +1,18 @@ +/* +Copyright (C) 2012-14 Miranda NG project (http://miranda-ng.org) + +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 version 2 +of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include "commonheaders.h" \ No newline at end of file -- cgit v1.2.3