From f38522708f3090a2e36542bc9588b2cb098cde46 Mon Sep 17 00:00:00 2001 From: david Date: Wed, 1 Jul 2009 14:47:29 +0000 Subject: [PATCH] git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.TB2k-SpTBXLib@6 86f37123-2d26-dd4b-92d5-da14520a7978 --- .../SpTBXLib/Demos/Customizer/Customizer.dpr | 15 + .../SpTBXLib/Demos/Customizer/Unit1.dfm | 1592 +++ .../SpTBXLib/Demos/Customizer/Unit1.pas | 350 + .../SpTBXLib/Demos/Customizer/Unit2.dfm | 1229 ++ .../SpTBXLib/Demos/Customizer/Unit2.pas | 78 + .../SpTBXLib/Demos/Customizer/advanced.txt | 55 + .../SpTBXLib/Demos/Customizer/faq.txt | 33 + .../SpTBXLib/Demos/Customizer/gnugettext.pas | 3067 +++++ .../SpTBXLib/Demos/Customizer/langcodes.txt | 15 + .../locale/de/LC_MESSAGES/default.mo | Bin 0 -> 3353 bytes .../locale/de/LC_MESSAGES/default.po | 498 + .../Demos/Customizer/locale/default.po | 497 + .../locale/es/LC_MESSAGES/default.mo | Bin 0 -> 3364 bytes .../locale/es/LC_MESSAGES/default.po | 498 + .../locale/fi/LC_MESSAGES/default.mo | Bin 0 -> 3276 bytes .../locale/fi/LC_MESSAGES/default.po | 497 + .../locale/fr/LC_MESSAGES/default.mo | Bin 0 -> 3276 bytes .../locale/fr/LC_MESSAGES/default.po | 498 + .../Demos/Customizer/locale/ignore.po | 62 + .../locale/ja/LC_MESSAGES/default.mo | Bin 0 -> 3479 bytes .../locale/ja/LC_MESSAGES/default.po | 498 + .../locale/ko/LC_MESSAGES/default.mo | Bin 0 -> 1792 bytes .../locale/ko/LC_MESSAGES/default.po | 498 + .../locale/nl/LC_MESSAGES/default.mo | Bin 0 -> 3243 bytes .../locale/nl/LC_MESSAGES/default.po | 498 + .../locale/pt_BR/LC_MESSAGES/default.mo | Bin 0 -> 3365 bytes .../locale/pt_BR/LC_MESSAGES/default.po | 499 + .../locale/ru/LC_MESSAGES/default.mo | Bin 0 -> 3891 bytes .../locale/ru/LC_MESSAGES/default.po | 498 + .../locale/sr_Cyrillic/LC_MESSAGES/default.mo | Bin 0 -> 3917 bytes .../locale/sr_Cyrillic/LC_MESSAGES/default.po | 498 + .../locale/sr_Latin/LC_MESSAGES/default.mo | Bin 0 -> 3320 bytes .../locale/sr_Latin/LC_MESSAGES/default.po | 498 + .../locale/sv/LC_MESSAGES/default.mo | Bin 0 -> 3241 bytes .../locale/sv/LC_MESSAGES/default.po | 498 + .../locale/tr/LC_MESSAGES/default.mo | Bin 0 -> 3365 bytes .../locale/tr/LC_MESSAGES/default.po | 498 + .../locale/zh_CN/LC_MESSAGES/default.mo | Bin 0 -> 3197 bytes .../locale/zh_CN/LC_MESSAGES/default.po | 431 + .../Demos/Customizer/translations.txt | 27 + .../Demos/FormPopupMenu/FormPopupMenu.dpr | 17 + .../SpTBXLib/Demos/FormPopupMenu/Unit1.dfm | 200 + .../SpTBXLib/Demos/FormPopupMenu/Unit1.pas | 123 + .../SpTBXLib/Demos/FormPopupMenu/Unit2.dfm | 27 + .../SpTBXLib/Demos/FormPopupMenu/Unit2.pas | 50 + .../SpTBXLib/Demos/FormPopupMenu/Unit3.dfm | 36 + .../SpTBXLib/Demos/FormPopupMenu/Unit3.pas | 102 + .../SpTBXLib/Demos/Overview/Overview.dpr | 13 + .../SpTBXLib/Demos/Overview/Skins/WMP11.skn | 380 + .../SpTBXLib/Demos/Overview/Unit1.dfm | 1901 ++++ .../SpTBXLib/Demos/Overview/Unit1.pas | 431 + .../SpTBXLib/Demos/Overview/hint.bmp | Bin 0 -> 21654 bytes official/2.2.2+2.4.2/SpTBXLib/LICENSE.txt | 9 + .../SpTBXLib/Lib/D12/SpTBXColorPickerForm.dcu | Bin 0 -> 20785 bytes .../SpTBXLib/Lib/D12/SpTBXControls.dcu | Bin 0 -> 176659 bytes .../SpTBXLib/Lib/D12/SpTBXCustomizer.dcu | Bin 0 -> 65630 bytes .../SpTBXLib/Lib/D12/SpTBXCustomizerForm.dcu | Bin 0 -> 22135 bytes .../SpTBXLib/Lib/D12/SpTBXDefaultSkins.dcu | Bin 0 -> 77021 bytes .../SpTBXLib/Lib/D12/SpTBXDkPanels.dcu | Bin 0 -> 111320 bytes .../SpTBXLib/Lib/D12/SpTBXEditors.dcu | Bin 0 -> 128057 bytes .../SpTBXLib/Lib/D12/SpTBXExtEditors.dcu | Bin 0 -> 42912 bytes .../SpTBXLib/Lib/D12/SpTBXFormPopupMenu.dcu | Bin 0 -> 39976 bytes .../SpTBXLib/Lib/D12/SpTBXItem.dcu | Bin 0 -> 333820 bytes .../SpTBXLib/Lib/D12/SpTBXLibDsgn_d12.bpl | Bin 0 -> 156160 bytes .../SpTBXLib/Lib/D12/SpTBXLibDsgn_d12.dcp | Bin 0 -> 11608 bytes .../SpTBXLib/Lib/D12/SpTBXLibDsgn_d12.dcu | Bin 0 -> 4942 bytes .../SpTBXLib/Lib/D12/SpTBXLib_d12.bpl | Bin 0 -> 740864 bytes .../SpTBXLib/Lib/D12/SpTBXLib_d12.dcp | Bin 0 -> 1098222 bytes .../SpTBXLib/Lib/D12/SpTBXLib_d12.dcu | Bin 0 -> 3441 bytes .../SpTBXLib/Lib/D12/SpTBXMDIMRU.dcu | Bin 0 -> 27785 bytes .../2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXReg.dcu | Bin 0 -> 11462 bytes .../SpTBXLib/Lib/D12/SpTBXSkins.dcu | Bin 0 -> 106136 bytes .../SpTBXLib/Lib/D12/SpTBXTabs.dcu | Bin 0 -> 118287 bytes official/2.2.2+2.4.2/SpTBXLib/MPL-LICENSE.txt | 469 + .../Packages/BuildPackages_D12.groupproj | 48 + .../Packages/SpTBXLibDsgn_d10.bdsproj | 175 + .../SpTBXLib/Packages/SpTBXLibDsgn_d10.dpk | 42 + .../SpTBXLib/Packages/SpTBXLibDsgn_d10.res | Bin 0 -> 32 bytes .../Packages/SpTBXLibDsgn_d11.bdsproj | 175 + .../SpTBXLib/Packages/SpTBXLibDsgn_d11.dpk | 42 + .../SpTBXLib/Packages/SpTBXLibDsgn_d11.res | Bin 0 -> 32 bytes .../SpTBXLib/Packages/SpTBXLibDsgn_d12.bpi | Bin 0 -> 2148 bytes .../SpTBXLib/Packages/SpTBXLibDsgn_d12.dcu | Bin 0 -> 4942 bytes .../SpTBXLib/Packages/SpTBXLibDsgn_d12.dpk | 40 + .../SpTBXLib/Packages/SpTBXLibDsgn_d12.dproj | 116 + .../SpTBXLib/Packages/SpTBXLibDsgn_d12.hpp | 106 + .../SpTBXLib/Packages/SpTBXLibDsgn_d12.lib | Bin 0 -> 20480 bytes .../SpTBXLib/Packages/SpTBXLibDsgn_d12.res | Bin 0 -> 32 bytes .../SpTBXLib/Packages/SpTBXLibDsgn_d7.dpk | 42 + .../SpTBXLib/Packages/SpTBXLibDsgn_d7.res | Bin 0 -> 32 bytes .../SpTBXLib/Packages/SpTBXLibDsgn_d9.dpk | 42 + .../SpTBXLib/Packages/SpTBXLibDsgn_d9.res | Bin 0 -> 32 bytes .../SpTBXLib/Packages/SpTBXLib_d10.bdsproj | 175 + .../SpTBXLib/Packages/SpTBXLib_d10.dpk | 50 + .../SpTBXLib/Packages/SpTBXLib_d10.res | Bin 0 -> 32 bytes .../SpTBXLib/Packages/SpTBXLib_d11.bdsproj | 175 + .../SpTBXLib/Packages/SpTBXLib_d11.dpk | 50 + .../SpTBXLib/Packages/SpTBXLib_d11.res | Bin 0 -> 32 bytes .../SpTBXLib/Packages/SpTBXLib_d12.bpi | Bin 0 -> 189092 bytes .../SpTBXLib/Packages/SpTBXLib_d12.dcu | Bin 0 -> 3441 bytes .../SpTBXLib/Packages/SpTBXLib_d12.dpk | 50 + .../SpTBXLib/Packages/SpTBXLib_d12.dproj | 127 + .../SpTBXLib/Packages/SpTBXLib_d12.hpp | 82 + .../SpTBXLib/Packages/SpTBXLib_d12.lib | Bin 0 -> 1070592 bytes .../SpTBXLib/Packages/SpTBXLib_d12.res | Bin 0 -> 32 bytes .../SpTBXLib/Packages/SpTBXLib_d7.dpk | 50 + .../SpTBXLib/Packages/SpTBXLib_d7.res | Bin 0 -> 32 bytes .../SpTBXLib/Packages/SpTBXLib_d9.dpk | 50 + .../SpTBXLib/Packages/SpTBXLib_d9.res | Bin 0 -> 32 bytes official/2.2.2+2.4.2/SpTBXLib/Readme.txt | 63 + .../2.2.2+2.4.2/SpTBXLib/Registration.txt | 27 + .../SpTBXLib/Source/SpTBXColorPickerForm.dcu | Bin 0 -> 23643 bytes .../SpTBXLib/Source/SpTBXColorPickerForm.dfm | 2895 +++++ .../SpTBXLib/Source/SpTBXColorPickerForm.hpp | 164 + .../SpTBXLib/Source/SpTBXColorPickerForm.pas | 522 + .../SpTBXLib/Source/SpTBXControls.dcu | Bin 0 -> 178847 bytes .../SpTBXLib/Source/SpTBXControls.hpp | 1306 +++ .../SpTBXLib/Source/SpTBXControls.pas | 4259 +++++++ .../SpTBXLib/Source/SpTBXCustomizer.dcu | Bin 0 -> 62337 bytes .../SpTBXLib/Source/SpTBXCustomizer.hpp | 260 + .../SpTBXLib/Source/SpTBXCustomizer.pas | 1620 +++ .../SpTBXLib/Source/SpTBXCustomizerForm.dcu | Bin 0 -> 22296 bytes .../SpTBXLib/Source/SpTBXCustomizerForm.dfm | 299 + .../SpTBXLib/Source/SpTBXCustomizerForm.hpp | 131 + .../SpTBXLib/Source/SpTBXCustomizerForm.pas | 531 + .../SpTBXLib/Source/SpTBXDefaultSkins.dcu | Bin 0 -> 76991 bytes .../SpTBXLib/Source/SpTBXDefaultSkins.hpp | 256 + .../SpTBXLib/Source/SpTBXDefaultSkins.pas | 2105 ++++ .../SpTBXLib/Source/SpTBXDkPanels.dcu | Bin 0 -> 114571 bytes .../SpTBXLib/Source/SpTBXDkPanels.hpp | 517 + .../SpTBXLib/Source/SpTBXDkPanels.pas | 3547 ++++++ .../SpTBXLib/Source/SpTBXEditors.dcu | Bin 0 -> 133970 bytes .../SpTBXLib/Source/SpTBXEditors.hpp | 741 ++ .../SpTBXLib/Source/SpTBXEditors.pas | 3725 +++++++ .../SpTBXLib/Source/SpTBXExtEditors.dcu | Bin 0 -> 43562 bytes .../SpTBXLib/Source/SpTBXExtEditors.hpp | 236 + .../SpTBXLib/Source/SpTBXExtEditors.pas | 1068 ++ .../SpTBXLib/Source/SpTBXFormPopupMenu.dcu | Bin 0 -> 41116 bytes .../SpTBXLib/Source/SpTBXFormPopupMenu.hpp | 275 + .../SpTBXLib/Source/SpTBXFormPopupMenu.pas | 1172 ++ .../SpTBXLib/Source/SpTBXGlyphs.res | Bin 0 -> 3788 bytes .../2.2.2+2.4.2/SpTBXLib/Source/SpTBXItem.dcu | Bin 0 -> 336321 bytes .../2.2.2+2.4.2/SpTBXLib/Source/SpTBXItem.hpp | 2061 ++++ .../2.2.2+2.4.2/SpTBXLib/Source/SpTBXItem.pas | 9857 +++++++++++++++++ .../SpTBXLib/Source/SpTBXMDIMRU.dcu | Bin 0 -> 28140 bytes .../SpTBXLib/Source/SpTBXMDIMRU.hpp | 171 + .../SpTBXLib/Source/SpTBXMDIMRU.pas | 718 ++ .../2.2.2+2.4.2/SpTBXLib/Source/SpTBXReg.dcr | Bin 0 -> 119936 bytes .../2.2.2+2.4.2/SpTBXLib/Source/SpTBXReg.dcu | Bin 0 -> 15848 bytes .../2.2.2+2.4.2/SpTBXLib/Source/SpTBXReg.hpp | 106 + .../2.2.2+2.4.2/SpTBXLib/Source/SpTBXReg.pas | 300 + .../SpTBXLib/Source/SpTBXSkins.dcu | Bin 0 -> 109176 bytes .../SpTBXLib/Source/SpTBXSkins.hpp | 459 + .../SpTBXLib/Source/SpTBXSkins.pas | 3494 ++++++ .../2.2.2+2.4.2/SpTBXLib/Source/SpTBXTabs.dcu | Bin 0 -> 119162 bytes .../2.2.2+2.4.2/SpTBXLib/Source/SpTBXTabs.hpp | 600 + .../2.2.2+2.4.2/SpTBXLib/Source/SpTBXTabs.pas | 3420 ++++++ .../2.2.2+2.4.2/SpTBXLib/SpTBXLib-LICENSE.txt | 57 + official/2.2.2+2.4.2/TB2K/DemoProj/.cvsignore | 5 + official/2.2.2+2.4.2/TB2K/DemoProj/Demo.cfg | 33 + official/2.2.2+2.4.2/TB2K/DemoProj/Demo.dof | 29 + official/2.2.2+2.4.2/TB2K/DemoProj/Demo.dpr | 22 + official/2.2.2+2.4.2/TB2K/DemoProj/Demo.res | Bin 0 -> 876 bytes official/2.2.2+2.4.2/TB2K/DemoProj/Demo1.dfm | Bin 0 -> 11901 bytes official/2.2.2+2.4.2/TB2K/DemoProj/Demo1.pas | 254 + .../2.2.2+2.4.2/TB2K/DemoProj/DemoBCB.bpr | 179 + .../2.2.2+2.4.2/TB2K/DemoProj/DemoBCB.cpp | 22 + .../2.2.2+2.4.2/TB2K/DemoProj/DemoBCB.res | Bin 0 -> 876 bytes .../2.2.2+2.4.2/TB2K/DemoProj/DemoBCB6.bpr | 115 + .../2.2.2+2.4.2/TB2K/DemoProj/DemoBCB6.cpp | 34 + .../2.2.2+2.4.2/TB2K/DemoProj/DemoBCB6.res | Bin 0 -> 876 bytes official/2.2.2+2.4.2/TB2K/GPL-LICENSE.txt | 340 + official/2.2.2+2.4.2/TB2K/Glyphs.zip | Bin 0 -> 11257 bytes official/2.2.2+2.4.2/TB2K/LICENSE.txt | 17 + official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Acc.dcu | Bin 0 -> 45020 bytes official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Anim.dcu | Bin 0 -> 6749 bytes .../2.2.2+2.4.2/TB2K/Lib/D12/TB2Common.dcu | Bin 0 -> 30393 bytes .../2.2.2+2.4.2/TB2K/Lib/D12/TB2Consts.dcu | Bin 0 -> 2247 bytes official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Dock.dcu | Bin 0 -> 151521 bytes .../TB2K/Lib/D12/TB2DsgnConvertOptions.dcu | Bin 0 -> 6174 bytes .../TB2K/Lib/D12/TB2DsgnConverter.dcu | Bin 0 -> 11115 bytes .../TB2K/Lib/D12/TB2DsgnItemEditor.dcu | Bin 0 -> 47711 bytes .../2.2.2+2.4.2/TB2K/Lib/D12/TB2ExtItems.dcu | Bin 0 -> 42648 bytes official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Hook.dcu | Bin 0 -> 8747 bytes official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Item.dcu | Bin 0 -> 188086 bytes official/2.2.2+2.4.2/TB2K/Lib/D12/TB2MDI.dcu | Bin 0 -> 30108 bytes official/2.2.2+2.4.2/TB2K/Lib/D12/TB2MRU.dcu | Bin 0 -> 16027 bytes official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Reg.dcu | Bin 0 -> 11497 bytes .../TB2K/Lib/D12/TB2ToolWindow.dcu | Bin 0 -> 16362 bytes .../2.2.2+2.4.2/TB2K/Lib/D12/TB2Toolbar.dcu | Bin 0 -> 63981 bytes official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Ver.inc | 64 + .../2.2.2+2.4.2/TB2K/Lib/D12/TB2Version.dcu | Bin 0 -> 907 bytes .../2.2.2+2.4.2/TB2K/Lib/D12/tb2k_d12.bpl | Bin 0 -> 279040 bytes .../2.2.2+2.4.2/TB2K/Lib/D12/tb2k_d12.dcp | Bin 0 -> 552472 bytes .../2.2.2+2.4.2/TB2K/Lib/D12/tb2k_d12.dcu | Bin 0 -> 2898 bytes .../2.2.2+2.4.2/TB2K/Lib/D12/tb2kdsgn_d12.bpl | Bin 0 -> 84992 bytes .../2.2.2+2.4.2/TB2K/Lib/D12/tb2kdsgn_d12.dcp | Bin 0 -> 68882 bytes .../2.2.2+2.4.2/TB2K/Lib/D12/tb2kdsgn_d12.dcu | Bin 0 -> 4606 bytes official/2.2.2+2.4.2/TB2K/Packages/.cvsignore | 10 + .../TB2K/Packages/BuildPackages_D12.groupproj | 48 + .../2.2.2+2.4.2/TB2K/Packages/tb2k_cb4.bpk | 183 + .../2.2.2+2.4.2/TB2K/Packages/tb2k_cb4.cpp | 29 + .../2.2.2+2.4.2/TB2K/Packages/tb2k_cb5.bpk | 96 + .../2.2.2+2.4.2/TB2K/Packages/tb2k_cb5.cpp | 29 + .../2.2.2+2.4.2/TB2K/Packages/tb2k_cb6.bpk | 130 + .../2.2.2+2.4.2/TB2K/Packages/tb2k_cb6.cpp | 14 + .../TB2K/Packages/tb2k_d10.bdsproj | 175 + .../2.2.2+2.4.2/TB2K/Packages/tb2k_d10.dpk | 48 + .../2.2.2+2.4.2/TB2K/Packages/tb2k_d10.res | Bin 0 -> 32 bytes .../2.2.2+2.4.2/TB2K/Packages/tb2k_d11.dpk | 49 + .../2.2.2+2.4.2/TB2K/Packages/tb2k_d11.dproj | 60 + .../2.2.2+2.4.2/TB2K/Packages/tb2k_d11.res | Bin 0 -> 32 bytes .../2.2.2+2.4.2/TB2K/Packages/tb2k_d12.dpk | 48 + .../2.2.2+2.4.2/TB2K/Packages/tb2k_d12.dproj | 131 + .../2.2.2+2.4.2/TB2K/Packages/tb2k_d12.res | Bin 0 -> 5056 bytes .../2.2.2+2.4.2/TB2K/Packages/tb2k_d4.dpk | 47 + .../2.2.2+2.4.2/TB2K/Packages/tb2k_d4.res | Bin 0 -> 32 bytes .../2.2.2+2.4.2/TB2K/Packages/tb2k_d5.dpk | 48 + .../2.2.2+2.4.2/TB2K/Packages/tb2k_d5.res | Bin 0 -> 32 bytes .../2.2.2+2.4.2/TB2K/Packages/tb2k_d6.dpk | 48 + .../2.2.2+2.4.2/TB2K/Packages/tb2k_d6.res | Bin 0 -> 32 bytes .../2.2.2+2.4.2/TB2K/Packages/tb2k_d7.dpk | 48 + .../2.2.2+2.4.2/TB2K/Packages/tb2k_d7.res | Bin 0 -> 32 bytes .../2.2.2+2.4.2/TB2K/Packages/tb2k_d9.dpk | 48 + .../2.2.2+2.4.2/TB2K/Packages/tb2k_d9.res | Bin 0 -> 32 bytes .../TB2K/Packages/tb2k_dn10.bdsproj | 197 + .../2.2.2+2.4.2/TB2K/Packages/tb2k_dn10.dpk | 120 + .../2.2.2+2.4.2/TB2K/Packages/tb2k_dn11.dpk | 120 + .../2.2.2+2.4.2/TB2K/Packages/tb2k_dn11.dproj | 82 + .../TB2K/Packages/tb2kdsgn_cb4.bpk | 181 + .../TB2K/Packages/tb2kdsgn_cb4.cpp | 23 + .../TB2K/Packages/tb2kdsgn_cb5.bpk | 95 + .../TB2K/Packages/tb2kdsgn_cb5.cpp | 23 + .../TB2K/Packages/tb2kdsgn_cb6.bpk | 125 + .../TB2K/Packages/tb2kdsgn_cb6.cpp | 18 + .../TB2K/Packages/tb2kdsgn_d10.bdsproj | 175 + .../TB2K/Packages/tb2kdsgn_d10.dpk | 42 + .../TB2K/Packages/tb2kdsgn_d10.res | Bin 0 -> 32 bytes .../TB2K/Packages/tb2kdsgn_d11.dpk | 43 + .../TB2K/Packages/tb2kdsgn_d11.dproj | 52 + .../TB2K/Packages/tb2kdsgn_d11.res | Bin 0 -> 32 bytes .../TB2K/Packages/tb2kdsgn_d12.bpi | Bin 0 -> 10388 bytes .../TB2K/Packages/tb2kdsgn_d12.dpk | 42 + .../TB2K/Packages/tb2kdsgn_d12.dproj | 129 + .../TB2K/Packages/tb2kdsgn_d12.hpp | 101 + .../TB2K/Packages/tb2kdsgn_d12.lib | Bin 0 -> 76800 bytes .../TB2K/Packages/tb2kdsgn_d12.res | Bin 0 -> 5056 bytes .../2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d4.dpk | 42 + .../2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d4.res | Bin 0 -> 32 bytes .../2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d5.dpk | 42 + .../2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d5.res | Bin 0 -> 32 bytes .../2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d6.dpk | 42 + .../2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d6.res | Bin 0 -> 32 bytes .../2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d7.dpk | 42 + .../2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d7.res | Bin 0 -> 32 bytes .../2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d9.dpk | 42 + .../2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d9.res | Bin 0 -> 32 bytes .../TB2K/Packages/tb2kdsgn_dn10.bdsproj | 188 + .../TB2K/Packages/tb2kdsgn_dn10.dpk | 111 + .../TB2K/Packages/tb2kdsgn_dn11.dpk | 112 + .../TB2K/Packages/tb2kdsgn_dn11.dproj | 82 + official/2.2.2+2.4.2/TB2K/README.txt | 22 + official/2.2.2+2.4.2/TB2K/Source/.cvsignore | 5 + .../TB2K/Source/Icons/TB2DsgnEditorImages.bmp | Bin 0 -> 1270 bytes .../TB2K/Source/Icons/TTBBackground.bmp | Bin 0 -> 406 bytes .../TB2K/Source/Icons/TTBBackground16.bmp | Bin 0 -> 246 bytes .../2.2.2+2.4.2/TB2K/Source/Icons/TTBDock.bmp | Bin 0 -> 406 bytes .../TB2K/Source/Icons/TTBDock16.bmp | Bin 0 -> 246 bytes .../TB2K/Source/Icons/TTBEditItem.bmp | Bin 0 -> 246 bytes .../TB2K/Source/Icons/TTBGroupItem.bmp | Bin 0 -> 246 bytes .../TB2K/Source/Icons/TTBImageList.bmp | Bin 0 -> 2322 bytes .../TB2K/Source/Icons/TTBImageList16.bmp | Bin 0 -> 822 bytes .../TB2K/Source/Icons/TTBItemContainer.bmp | Bin 0 -> 406 bytes .../TB2K/Source/Icons/TTBItemContainer16.bmp | Bin 0 -> 246 bytes .../TB2K/Source/Icons/TTBMDIHandler.bmp | Bin 0 -> 406 bytes .../TB2K/Source/Icons/TTBMDIHandler16.bmp | Bin 0 -> 246 bytes .../TB2K/Source/Icons/TTBMDIWindowItem.bmp | Bin 0 -> 246 bytes .../TB2K/Source/Icons/TTBMRUList.bmp | Bin 0 -> 406 bytes .../TB2K/Source/Icons/TTBMRUList16.bmp | Bin 0 -> 246 bytes .../TB2K/Source/Icons/TTBMRUListItem.bmp | Bin 0 -> 246 bytes .../TB2K/Source/Icons/TTBPopupMenu.bmp | Bin 0 -> 1782 bytes .../TB2K/Source/Icons/TTBPopupMenu16.bmp | Bin 0 -> 822 bytes .../TB2K/Source/Icons/TTBToolWindow.bmp | Bin 0 -> 406 bytes .../TB2K/Source/Icons/TTBToolWindow16.bmp | Bin 0 -> 246 bytes .../TB2K/Source/Icons/TTBToolbar.bmp | Bin 0 -> 406 bytes .../TB2K/Source/Icons/TTBToolbar16.bmp | Bin 0 -> 246 bytes official/2.2.2+2.4.2/TB2K/Source/TB2Acc.pas | 1393 +++ official/2.2.2+2.4.2/TB2K/Source/TB2Anim.pas | 323 + .../2.2.2+2.4.2/TB2K/Source/TB2Common.pas | 1571 +++ .../2.2.2+2.4.2/TB2K/Source/TB2Consts.pas | 34 + official/2.2.2+2.4.2/TB2K/Source/TB2Dock.pas | 5670 ++++++++++ .../TB2K/Source/TB2DsgnConvertOptions.dfm | Bin 0 -> 903 bytes .../TB2K/Source/TB2DsgnConvertOptions.dfm.txt | 65 + .../TB2K/Source/TB2DsgnConvertOptions.hpp | 64 + .../TB2K/Source/TB2DsgnConvertOptions.pas | 67 + .../TB2K/Source/TB2DsgnConverter.dfm | Bin 0 -> 795 bytes .../TB2K/Source/TB2DsgnConverter.dfm.txt | 51 + .../TB2K/Source/TB2DsgnConverter.hpp | 64 + .../TB2K/Source/TB2DsgnConverter.pas | 217 + .../TB2K/Source/TB2DsgnItemEditor.dfm | Bin 0 -> 2866 bytes .../TB2K/Source/TB2DsgnItemEditor.dfm.txt | 184 + .../TB2K/Source/TB2DsgnItemEditor.hpp | 189 + .../TB2K/Source/TB2DsgnItemEditor.pas | 1439 +++ .../TB2K/Source/TB2DsgnItemEditor.res | Bin 0 -> 2520 bytes .../2.2.2+2.4.2/TB2K/Source/TB2ExtItems.pas | 990 ++ official/2.2.2+2.4.2/TB2K/Source/TB2Hook.pas | 344 + official/2.2.2+2.4.2/TB2K/Source/TB2Item.pas | 6982 ++++++++++++ official/2.2.2+2.4.2/TB2K/Source/TB2MDI.pas | 714 ++ official/2.2.2+2.4.2/TB2K/Source/TB2MDI.res | Bin 0 -> 712 bytes official/2.2.2+2.4.2/TB2K/Source/TB2MRU.pas | 417 + .../2.2.2+2.4.2/TB2K/Source/TB2OleMarshal.pas | 203 + official/2.2.2+2.4.2/TB2K/Source/TB2Reg.dcr | Bin 0 -> 5188 bytes official/2.2.2+2.4.2/TB2K/Source/TB2Reg.hpp | 53 + official/2.2.2+2.4.2/TB2K/Source/TB2Reg.pas | 317 + .../2.2.2+2.4.2/TB2K/Source/TB2ResCursors.res | Bin 0 -> 1304 bytes .../2.2.2+2.4.2/TB2K/Source/TB2ToolWindow.pas | 258 + .../2.2.2+2.4.2/TB2K/Source/TB2Toolbar.pas | 1794 +++ official/2.2.2+2.4.2/TB2K/Source/TB2Ver.inc | 64 + .../2.2.2+2.4.2/TB2K/Source/TB2Version.pas | 63 + official/2.2.2+2.4.2/TB2K/TB2k-LICENSE.txt | 61 + official/2.2.2+2.4.2/TB2K/tb2k.chm | Bin 0 -> 84104 bytes official/2.2.2+2.4.2/TB2K/whatsnew.htm | 419 + 322 files changed, 94993 insertions(+) create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/Customizer.dpr create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/Unit1.dfm create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/Unit1.pas create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/Unit2.dfm create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/Unit2.pas create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/advanced.txt create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/faq.txt create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/gnugettext.pas create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/langcodes.txt create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/de/LC_MESSAGES/default.mo create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/de/LC_MESSAGES/default.po create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/default.po create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/es/LC_MESSAGES/default.mo create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/es/LC_MESSAGES/default.po create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/fi/LC_MESSAGES/default.mo create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/fi/LC_MESSAGES/default.po create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/fr/LC_MESSAGES/default.mo create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/fr/LC_MESSAGES/default.po create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/ignore.po create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/ja/LC_MESSAGES/default.mo create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/ja/LC_MESSAGES/default.po create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/ko/LC_MESSAGES/default.mo create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/ko/LC_MESSAGES/default.po create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/nl/LC_MESSAGES/default.mo create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/nl/LC_MESSAGES/default.po create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/pt_BR/LC_MESSAGES/default.mo create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/pt_BR/LC_MESSAGES/default.po create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/ru/LC_MESSAGES/default.mo create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/ru/LC_MESSAGES/default.po create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/sr_Cyrillic/LC_MESSAGES/default.mo create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/sr_Cyrillic/LC_MESSAGES/default.po create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/sr_Latin/LC_MESSAGES/default.mo create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/sr_Latin/LC_MESSAGES/default.po create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/sv/LC_MESSAGES/default.mo create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/sv/LC_MESSAGES/default.po create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/tr/LC_MESSAGES/default.mo create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/tr/LC_MESSAGES/default.po create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/zh_CN/LC_MESSAGES/default.mo create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/zh_CN/LC_MESSAGES/default.po create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/translations.txt create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/FormPopupMenu.dpr create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/Unit1.dfm create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/Unit1.pas create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/Unit2.dfm create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/Unit2.pas create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/Unit3.dfm create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/Unit3.pas create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Overview/Overview.dpr create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Overview/Skins/WMP11.skn create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Overview/Unit1.dfm create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Overview/Unit1.pas create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Demos/Overview/hint.bmp create mode 100644 official/2.2.2+2.4.2/SpTBXLib/LICENSE.txt create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXColorPickerForm.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXControls.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXCustomizer.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXCustomizerForm.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXDefaultSkins.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXDkPanels.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXEditors.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXExtEditors.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXFormPopupMenu.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXItem.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXLibDsgn_d12.bpl create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXLibDsgn_d12.dcp create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXLibDsgn_d12.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXLib_d12.bpl create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXLib_d12.dcp create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXLib_d12.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXMDIMRU.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXReg.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXSkins.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXTabs.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/MPL-LICENSE.txt create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/BuildPackages_D12.groupproj create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d10.bdsproj create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d10.dpk create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d10.res create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d11.bdsproj create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d11.dpk create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d11.res create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d12.bpi create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d12.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d12.dpk create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d12.dproj create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d12.hpp create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d12.lib create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d12.res create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d7.dpk create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d7.res create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d9.dpk create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d9.res create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d10.bdsproj create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d10.dpk create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d10.res create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d11.bdsproj create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d11.dpk create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d11.res create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d12.bpi create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d12.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d12.dpk create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d12.dproj create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d12.hpp create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d12.lib create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d12.res create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d7.dpk create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d7.res create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d9.dpk create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d9.res create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Readme.txt create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Registration.txt create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXColorPickerForm.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXColorPickerForm.dfm create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXColorPickerForm.hpp create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXColorPickerForm.pas create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXControls.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXControls.hpp create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXControls.pas create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXCustomizer.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXCustomizer.hpp create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXCustomizer.pas create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXCustomizerForm.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXCustomizerForm.dfm create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXCustomizerForm.hpp create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXCustomizerForm.pas create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXDefaultSkins.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXDefaultSkins.hpp create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXDefaultSkins.pas create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXDkPanels.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXDkPanels.hpp create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXDkPanels.pas create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXEditors.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXEditors.hpp create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXEditors.pas create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXExtEditors.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXExtEditors.hpp create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXExtEditors.pas create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXFormPopupMenu.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXFormPopupMenu.hpp create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXFormPopupMenu.pas create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXGlyphs.res create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXItem.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXItem.hpp create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXItem.pas create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXMDIMRU.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXMDIMRU.hpp create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXMDIMRU.pas create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXReg.dcr create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXReg.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXReg.hpp create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXReg.pas create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXSkins.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXSkins.hpp create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXSkins.pas create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXTabs.dcu create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXTabs.hpp create mode 100644 official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXTabs.pas create mode 100644 official/2.2.2+2.4.2/SpTBXLib/SpTBXLib-LICENSE.txt create mode 100644 official/2.2.2+2.4.2/TB2K/DemoProj/.cvsignore create mode 100644 official/2.2.2+2.4.2/TB2K/DemoProj/Demo.cfg create mode 100644 official/2.2.2+2.4.2/TB2K/DemoProj/Demo.dof create mode 100644 official/2.2.2+2.4.2/TB2K/DemoProj/Demo.dpr create mode 100644 official/2.2.2+2.4.2/TB2K/DemoProj/Demo.res create mode 100644 official/2.2.2+2.4.2/TB2K/DemoProj/Demo1.dfm create mode 100644 official/2.2.2+2.4.2/TB2K/DemoProj/Demo1.pas create mode 100644 official/2.2.2+2.4.2/TB2K/DemoProj/DemoBCB.bpr create mode 100644 official/2.2.2+2.4.2/TB2K/DemoProj/DemoBCB.cpp create mode 100644 official/2.2.2+2.4.2/TB2K/DemoProj/DemoBCB.res create mode 100644 official/2.2.2+2.4.2/TB2K/DemoProj/DemoBCB6.bpr create mode 100644 official/2.2.2+2.4.2/TB2K/DemoProj/DemoBCB6.cpp create mode 100644 official/2.2.2+2.4.2/TB2K/DemoProj/DemoBCB6.res create mode 100644 official/2.2.2+2.4.2/TB2K/GPL-LICENSE.txt create mode 100644 official/2.2.2+2.4.2/TB2K/Glyphs.zip create mode 100644 official/2.2.2+2.4.2/TB2K/LICENSE.txt create mode 100644 official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Acc.dcu create mode 100644 official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Anim.dcu create mode 100644 official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Common.dcu create mode 100644 official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Consts.dcu create mode 100644 official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Dock.dcu create mode 100644 official/2.2.2+2.4.2/TB2K/Lib/D12/TB2DsgnConvertOptions.dcu create mode 100644 official/2.2.2+2.4.2/TB2K/Lib/D12/TB2DsgnConverter.dcu create mode 100644 official/2.2.2+2.4.2/TB2K/Lib/D12/TB2DsgnItemEditor.dcu create mode 100644 official/2.2.2+2.4.2/TB2K/Lib/D12/TB2ExtItems.dcu create mode 100644 official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Hook.dcu create mode 100644 official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Item.dcu create mode 100644 official/2.2.2+2.4.2/TB2K/Lib/D12/TB2MDI.dcu create mode 100644 official/2.2.2+2.4.2/TB2K/Lib/D12/TB2MRU.dcu create mode 100644 official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Reg.dcu create mode 100644 official/2.2.2+2.4.2/TB2K/Lib/D12/TB2ToolWindow.dcu create mode 100644 official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Toolbar.dcu create mode 100644 official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Ver.inc create mode 100644 official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Version.dcu create mode 100644 official/2.2.2+2.4.2/TB2K/Lib/D12/tb2k_d12.bpl create mode 100644 official/2.2.2+2.4.2/TB2K/Lib/D12/tb2k_d12.dcp create mode 100644 official/2.2.2+2.4.2/TB2K/Lib/D12/tb2k_d12.dcu create mode 100644 official/2.2.2+2.4.2/TB2K/Lib/D12/tb2kdsgn_d12.bpl create mode 100644 official/2.2.2+2.4.2/TB2K/Lib/D12/tb2kdsgn_d12.dcp create mode 100644 official/2.2.2+2.4.2/TB2K/Lib/D12/tb2kdsgn_d12.dcu create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/.cvsignore create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/BuildPackages_D12.groupproj create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_cb4.bpk create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_cb4.cpp create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_cb5.bpk create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_cb5.cpp create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_cb6.bpk create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_cb6.cpp create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_d10.bdsproj create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_d10.dpk create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_d10.res create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_d11.dpk create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_d11.dproj create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_d11.res create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_d12.dpk create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_d12.dproj create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_d12.res create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_d4.dpk create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_d4.res create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_d5.dpk create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_d5.res create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_d6.dpk create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_d6.res create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_d7.dpk create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_d7.res create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_d9.dpk create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_d9.res create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_dn10.bdsproj create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_dn10.dpk create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_dn11.dpk create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2k_dn11.dproj create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_cb4.bpk create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_cb4.cpp create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_cb5.bpk create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_cb5.cpp create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_cb6.bpk create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_cb6.cpp create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d10.bdsproj create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d10.dpk create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d10.res create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d11.dpk create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d11.dproj create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d11.res create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d12.bpi create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d12.dpk create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d12.dproj create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d12.hpp create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d12.lib create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d12.res create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d4.dpk create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d4.res create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d5.dpk create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d5.res create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d6.dpk create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d6.res create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d7.dpk create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d7.res create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d9.dpk create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d9.res create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_dn10.bdsproj create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_dn10.dpk create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_dn11.dpk create mode 100644 official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_dn11.dproj create mode 100644 official/2.2.2+2.4.2/TB2K/README.txt create mode 100644 official/2.2.2+2.4.2/TB2K/Source/.cvsignore create mode 100644 official/2.2.2+2.4.2/TB2K/Source/Icons/TB2DsgnEditorImages.bmp create mode 100644 official/2.2.2+2.4.2/TB2K/Source/Icons/TTBBackground.bmp create mode 100644 official/2.2.2+2.4.2/TB2K/Source/Icons/TTBBackground16.bmp create mode 100644 official/2.2.2+2.4.2/TB2K/Source/Icons/TTBDock.bmp create mode 100644 official/2.2.2+2.4.2/TB2K/Source/Icons/TTBDock16.bmp create mode 100644 official/2.2.2+2.4.2/TB2K/Source/Icons/TTBEditItem.bmp create mode 100644 official/2.2.2+2.4.2/TB2K/Source/Icons/TTBGroupItem.bmp create mode 100644 official/2.2.2+2.4.2/TB2K/Source/Icons/TTBImageList.bmp create mode 100644 official/2.2.2+2.4.2/TB2K/Source/Icons/TTBImageList16.bmp create mode 100644 official/2.2.2+2.4.2/TB2K/Source/Icons/TTBItemContainer.bmp create mode 100644 official/2.2.2+2.4.2/TB2K/Source/Icons/TTBItemContainer16.bmp create mode 100644 official/2.2.2+2.4.2/TB2K/Source/Icons/TTBMDIHandler.bmp create mode 100644 official/2.2.2+2.4.2/TB2K/Source/Icons/TTBMDIHandler16.bmp create mode 100644 official/2.2.2+2.4.2/TB2K/Source/Icons/TTBMDIWindowItem.bmp create mode 100644 official/2.2.2+2.4.2/TB2K/Source/Icons/TTBMRUList.bmp create mode 100644 official/2.2.2+2.4.2/TB2K/Source/Icons/TTBMRUList16.bmp create mode 100644 official/2.2.2+2.4.2/TB2K/Source/Icons/TTBMRUListItem.bmp create mode 100644 official/2.2.2+2.4.2/TB2K/Source/Icons/TTBPopupMenu.bmp create mode 100644 official/2.2.2+2.4.2/TB2K/Source/Icons/TTBPopupMenu16.bmp create mode 100644 official/2.2.2+2.4.2/TB2K/Source/Icons/TTBToolWindow.bmp create mode 100644 official/2.2.2+2.4.2/TB2K/Source/Icons/TTBToolWindow16.bmp create mode 100644 official/2.2.2+2.4.2/TB2K/Source/Icons/TTBToolbar.bmp create mode 100644 official/2.2.2+2.4.2/TB2K/Source/Icons/TTBToolbar16.bmp create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2Acc.pas create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2Anim.pas create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2Common.pas create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2Consts.pas create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2Dock.pas create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConvertOptions.dfm create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConvertOptions.dfm.txt create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConvertOptions.hpp create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConvertOptions.pas create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConverter.dfm create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConverter.dfm.txt create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConverter.hpp create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConverter.pas create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2DsgnItemEditor.dfm create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2DsgnItemEditor.dfm.txt create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2DsgnItemEditor.hpp create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2DsgnItemEditor.pas create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2DsgnItemEditor.res create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2ExtItems.pas create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2Hook.pas create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2Item.pas create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2MDI.pas create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2MDI.res create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2MRU.pas create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2OleMarshal.pas create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2Reg.dcr create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2Reg.hpp create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2Reg.pas create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2ResCursors.res create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2ToolWindow.pas create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2Toolbar.pas create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2Ver.inc create mode 100644 official/2.2.2+2.4.2/TB2K/Source/TB2Version.pas create mode 100644 official/2.2.2+2.4.2/TB2K/TB2k-LICENSE.txt create mode 100644 official/2.2.2+2.4.2/TB2K/tb2k.chm create mode 100644 official/2.2.2+2.4.2/TB2K/whatsnew.htm diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/Customizer.dpr b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/Customizer.dpr new file mode 100644 index 0000000..0202e78 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/Customizer.dpr @@ -0,0 +1,15 @@ +program Customizer; + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}, + Unit2 in 'Unit2.pas' {Form2}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.CreateForm(TForm2, Form2); + Application.Run; +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/Unit1.dfm b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/Unit1.dfm new file mode 100644 index 0000000..a77ac8c --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/Unit1.dfm @@ -0,0 +1,1592 @@ +object Form1: TForm1 + Left = 281 + Top = 159 + Caption = 'Form1' + ClientHeight = 487 + ClientWidth = 748 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Shell Dlg 2' + Font.Style = [] + OldCreateOrder = False + ShowHint = True + OnCreate = FormCreate + OnDestroy = FormDestroy + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object SpTBXSplitter1: TSpTBXSplitter + Left = 142 + Top = 75 + Height = 347 + Cursor = crSizeWE + end + object SpTBXSplitter2: TSpTBXSplitter + Left = 614 + Top = 75 + Height = 347 + Cursor = crSizeWE + Align = alRight + end + object SpTBXTabControl1: TSpTBXTabControl + Left = 147 + Top = 75 + Width = 467 + Height = 347 + Align = alClient + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Courier New' + Font.Style = [] + ParentFont = False + ActiveTabIndex = 0 + HiddenItems = <> + object SpTBXTabItem1: TSpTBXTabItem + Caption = 'FAQ.txt' + Checked = True + end + object SpTBXTabItem2: TSpTBXTabItem + Caption = 'Advanced Techniques.txt' + end + object SpTBXTabItem3: TSpTBXTabItem + Caption = 'Translations.txt' + end + object SpTBXTabSheet3: TSpTBXTabSheet + Left = 0 + Top = 23 + Width = 467 + Height = 324 + Caption = 'Translations.txt' + ImageIndex = -1 + TabItem = 'SpTBXTabItem3' + object Memo4: TMemo + Left = 2 + Top = 0 + Width = 461 + Height = 320 + Align = alClient + BorderStyle = bsNone + ScrollBars = ssVertical + TabOrder = 0 + end + end + object SpTBXTabSheet2: TSpTBXTabSheet + Left = 0 + Top = 23 + Width = 467 + Height = 324 + Caption = 'Advanced Techniques.txt' + ImageIndex = -1 + TabItem = 'SpTBXTabItem2' + object Memo3: TMemo + Left = 2 + Top = 0 + Width = 461 + Height = 320 + Align = alClient + BorderStyle = bsNone + ScrollBars = ssVertical + TabOrder = 0 + end + end + object SpTBXTabSheet1: TSpTBXTabSheet + Left = 0 + Top = 23 + Width = 467 + Height = 324 + Caption = 'FAQ.txt' + ImageIndex = -1 + TabItem = 'SpTBXTabItem1' + object Memo2: TMemo + Left = 2 + Top = 0 + Width = 461 + Height = 320 + Align = alClient + BorderStyle = bsNone + ScrollBars = ssVertical + TabOrder = 0 + end + end + end + object SpTBXDock1: TSpTBXDock + Left = 0 + Top = 0 + Width = 748 + Height = 75 + PopupMenu = SpTBXPopupMenu1 + object tbStandard: TSpTBXToolbar + Left = 0 + Top = 23 + DockPos = 0 + DockRow = 1 + Images = ImageList1 + ShrinkMode = tbsmNone + TabOrder = 1 + Caption = 'Standard' + object tNew: TSpTBXItem + Caption = 'New' + ImageIndex = 14 + ShortCut = 16462 + OnClick = ActionsExecute + end + object tOpen: TSpTBXItem + Caption = 'Open' + ImageIndex = 15 + ShortCut = 16463 + OnClick = ActionsExecute + end + object tSave: TSpTBXItem + Caption = 'Save' + ImageIndex = 16 + ShortCut = 16467 + OnClick = ActionsExecute + end + object SpTBXSeparatorItem7: TSpTBXSeparatorItem + end + object tCut: TSpTBXItem + Caption = 'Cut' + ImageIndex = 10 + ShortCut = 16472 + OnClick = ActionsExecute + end + object tCopy: TSpTBXItem + Caption = 'Copy' + ImageIndex = 9 + ShortCut = 16451 + OnClick = ActionsExecute + end + object tPaste: TSpTBXItem + Caption = 'Paste' + DisplayMode = nbdmImageAndText + ImageIndex = 11 + ShortCut = 16470 + OnClick = ActionsExecute + end + object SpTBXSeparatorItem9: TSpTBXSeparatorItem + end + object tFind: TSpTBXItem + Caption = 'Find' + DisplayMode = nbdmImageAndText + ImageIndex = 12 + ShortCut = 16454 + OnClick = ActionsExecute + end + object SpTBXSeparatorItem12: TSpTBXSeparatorItem + end + object tSkins: TSpTBXSubmenuItem + Caption = 'Skins' + Options = [tboDropdownArrow] + object SpTBXSkinGroupItem1: TSpTBXSkinGroupItem + end + end + object SpTBXSeparatorItem13: TSpTBXSeparatorItem + end + object TBControlItem1: TTBControlItem + Control = tLanguages + end + object tLanguages: TSpTBXComboBox + Left = 282 + Top = 0 + Width = 145 + Height = 21 + Style = csDropDownList + ItemHeight = 13 + TabOrder = 0 + OnClick = tLanguagesItemClick + end + end + object tbFormat: TSpTBXToolbar + Left = 0 + Top = 49 + DockPos = 0 + DockRow = 2 + Images = ImageList1 + ShrinkMode = tbsmNone + TabOrder = 3 + Caption = 'Format' + object TBControlItem2: TTBControlItem + Control = tFont + end + object TBControlItem3: TTBControlItem + Control = tFontSize + end + object SpTBXSeparatorItem8: TSpTBXSeparatorItem + end + object tBold: TSpTBXItem + Caption = 'Bold' + DisplayMode = nbdmImageAndText + ImageIndex = 4 + ShortCut = 16450 + OnClick = ActionsExecute + end + object tItalic: TSpTBXItem + Caption = 'Italic' + ImageIndex = 5 + ShortCut = 16457 + OnClick = ActionsExecute + end + object tUnderline: TSpTBXItem + Caption = 'Underline' + ImageIndex = 6 + ShortCut = 16469 + OnClick = ActionsExecute + end + object tFont: TSpTBXComboBox + Left = 0 + Top = 0 + Width = 120 + Height = 21 + ItemHeight = 13 + TabOrder = 0 + Text = 'Verdana' + Items.Strings = ( + 'Arial' + 'Times New Roman' + 'Courier New') + end + object tFontSize: TSpTBXComboBox + Left = 120 + Top = 0 + Width = 70 + Height = 21 + ItemHeight = 13 + TabOrder = 1 + Text = '12' + Items.Strings = ( + '8' + '9' + '10' + '14' + '16' + '20') + end + end + object tbMenuBar: TSpTBXToolbar + Left = 0 + Top = 0 + CloseButton = False + DockPos = 0 + FullSize = True + Images = ImageList1 + MenuBar = True + ProcessShortCuts = True + ShrinkMode = tbsmWrap + TabOrder = 0 + Caption = 'Menu' + Customizable = False + object mFile: TSpTBXSubmenuItem + Caption = '&File' + object mNew: TSpTBXItem + Caption = 'New' + ImageIndex = 14 + ShortCut = 16462 + OnClick = ActionsExecute + end + object mOpen: TSpTBXItem + Caption = 'Open...' + ImageIndex = 15 + ShortCut = 16463 + OnClick = ActionsExecute + end + object mSave: TSpTBXItem + Caption = 'Save' + ImageIndex = 16 + ShortCut = 16467 + OnClick = ActionsExecute + end + object mPrint: TSpTBXItem + Caption = 'Print' + ImageIndex = 17 + OnClick = ActionsExecute + end + object SpTBXSeparatorItem1: TSpTBXSeparatorItem + end + object mExit: TSpTBXItem + Caption = 'Exit' + OnClick = ActionsExecute + end + end + object mEdit: TSpTBXSubmenuItem + Caption = '&Edit' + object mCut: TSpTBXItem + Caption = 'Cut' + ImageIndex = 10 + ShortCut = 16472 + OnClick = ActionsExecute + end + object mCopy: TSpTBXItem + Caption = 'Copy' + ImageIndex = 9 + ShortCut = 16451 + OnClick = ActionsExecute + end + object mPaste: TSpTBXItem + Caption = 'Paste' + ImageIndex = 11 + ShortCut = 16470 + OnClick = ActionsExecute + end + object SpTBXSeparatorItem2: TSpTBXSeparatorItem + end + object mSelectAll: TSpTBXItem + Caption = 'Select All' + ShortCut = 16449 + OnClick = ActionsExecute + end + object SpTBXSeparatorItem3: TSpTBXSeparatorItem + end + object mFind: TSpTBXItem + Caption = 'Find' + ImageIndex = 12 + ShortCut = 16454 + OnClick = ActionsExecute + end + end + object SpTBXSubmenuItem1: TSpTBXSubmenuItem + Caption = '&Format' + object mBold: TSpTBXItem + Caption = 'Bold' + ImageIndex = 4 + ShortCut = 16450 + OnClick = ActionsExecute + end + object mItalic: TSpTBXItem + Caption = 'Italic' + ImageIndex = 5 + ShortCut = 16457 + OnClick = ActionsExecute + end + object mUnderline: TSpTBXItem + Caption = 'Underline' + ImageIndex = 6 + ShortCut = 16469 + OnClick = ActionsExecute + end + object SpTBXSeparatorItem5: TSpTBXSeparatorItem + end + object mLeftJustify: TSpTBXItem + Caption = 'Left Justify' + ImageIndex = 0 + OnClick = ActionsExecute + end + object mCentered: TSpTBXItem + Caption = 'Centered' + ImageIndex = 1 + OnClick = ActionsExecute + end + object mRightJustify: TSpTBXItem + Caption = 'Right Justify' + ImageIndex = 2 + OnClick = ActionsExecute + end + object SpTBXSeparatorItem6: TSpTBXSeparatorItem + end + object mBullets: TSpTBXItem + Caption = 'Bullets' + ImageIndex = 7 + OnClick = ActionsExecute + end + object mNumberedBullets: TSpTBXItem + Caption = 'Numbered Bullets' + ImageIndex = 8 + OnClick = ActionsExecute + end + end + object mView: TSpTBXSubmenuItem + Caption = '&View' + object mSidebar: TSpTBXSubmenuItem + Caption = '&Sidebar' + object mCommandsLog: TSpTBXItem + Caption = '&Commands Log' + Control = dpLog + end + object mOptions: TSpTBXItem + Caption = '&Options' + Control = dpOptions + end + object mmHelp: TSpTBXItem + Caption = '&Help' + Control = dpHelp + end + end + object mToolbars: TSpTBXSubmenuItem + Caption = '&Toolbars' + object mStandardToolbar: TSpTBXItem + Caption = '&Standard Toolbar' + Control = tbStandard + end + object tLayoutsToolbar: TSpTBXItem + Caption = '&Layouts Toolbar' + Control = tbLayouts + end + object mFormattingToolbar: TSpTBXItem + Caption = '&Formatting Toolbar' + Control = tbFormat + end + object mNavigationToolbar: TSpTBXItem + Caption = '&Navigation Toolbar' + Control = tbNavigation + end + end + end + object mHelp: TSpTBXSubmenuItem + Caption = '&Help' + object mmmHelp: TSpTBXItem + Caption = '&Help' + end + object mAbout: TSpTBXItem + Caption = '&About' + Enabled = False + end + end + end + object tbLayouts: TSpTBXToolbar + Left = 437 + Top = 23 + DockPos = 433 + DockRow = 1 + Images = ImageList1 + ShrinkMode = tbsmNone + TabOrder = 2 + Caption = 'Layouts' + Customizable = False + object SpTBXLabelItem1: TSpTBXLabelItem + Caption = 'Layouts' + end + object TBControlItem4: TTBControlItem + Control = tLayouts + end + object tLayoutSave: TSpTBXItem + Caption = 'Save' + OnClick = tLayoutSaveClick + end + object tLayouts: TSpTBXComboBox + Left = 48 + Top = 0 + Width = 100 + Height = 21 + Style = csDropDownList + ItemHeight = 13 + TabOrder = 0 + OnClick = tLayoutsItemClick + end + end + end + object SpTBXMultiDock1: TSpTBXMultiDock + Left = 0 + Top = 75 + Width = 142 + Height = 347 + object dpLog: TSpTBXDockablePanel + Left = 0 + Top = 156 + Width = 142 + Height = 191 + Caption = 'Commands Log' + DockPos = 156 + TabOrder = 0 + object Memo1: TMemo + Left = 0 + Top = 19 + Width = 138 + Height = 168 + Align = alClient + BorderStyle = bsNone + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 1 + end + end + object dpOptions: TSpTBXDockablePanel + Left = 0 + Top = 0 + Width = 142 + Height = 156 + Caption = 'Customizer Options' + DockPos = 0 + TabOrder = 1 + end + end + object SpTBXMultiDock2: TSpTBXMultiDock + Left = 619 + Top = 75 + Width = 129 + Height = 347 + Position = dpxRight + object dpHelp: TSpTBXDockablePanel + Left = 0 + Top = 0 + Width = 129 + Height = 347 + Caption = 'Help' + DockPos = 16 + TabOrder = 0 + DesignSize = ( + 125 + 343) + object SpTBXLabel1: TSpTBXLabel + Left = 9 + Top = 32 + Width = 96 + Height = 49 + Caption = 'Right click the toolbars to customize them' + Anchors = [akLeft, akTop, akRight] + AutoSize = False + Wrapping = twWrap + end + end + end + object SpTBXDock2: TSpTBXDock + Left = 0 + Top = 422 + Width = 748 + Height = 39 + PopupMenu = SpTBXPopupMenu1 + Position = dpBottom + object tbNavigation: TSpTBXToolbar + Left = 0 + Top = 0 + Images = ImageList1 + Options = [tboImageAboveCaption, tboSameWidth] + TabOrder = 0 + Caption = 'Navigation' + DisplayMode = tbdmImageAboveCaption + object tBack: TSpTBXItem + Caption = 'Back' + ImageIndex = 20 + OnClick = ActionsExecute + end + object tForward: TSpTBXItem + Caption = 'Forward' + ImageIndex = 21 + OnClick = ActionsExecute + end + object tRefresh: TSpTBXItem + Caption = 'Refresh' + ImageIndex = 23 + OnClick = ActionsExecute + end + object tStop: TSpTBXItem + Caption = 'Stop' + ImageIndex = 22 + OnClick = ActionsExecute + end + object tSearch: TSpTBXItem + Caption = 'Search' + ImageIndex = 24 + OnClick = ActionsExecute + end + end + end + object SpTBXStatusBar1: TSpTBXStatusBar + Left = 0 + Top = 461 + Width = 748 + Height = 26 + end + object ImageList1: TImageList + Left = 192 + Top = 352 + Bitmap = { + 494C01011A001D00040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000007000000001002000000000000070 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000CE00009CFF000000CE00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000084840000FF00000084840000FF00000084840000000000000000 + CE0063CEFF006300FF000000CE00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000009C31000063 + 31000063310000840000848400000000000000000000000000000000000063CE + FF006300FF000000CE000000000000000000006363009CFFFF0000CEFF0000CE + FF0000CEFF0000CEFF00009CCE0000CEFF00009CCE0000CEFF00009CCE00009C + CE00639C9C00009CCE0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000009C310063CE310063CE + 3100009C3100009C31004A4A4A0084848400CE9C3100CE9C31009C6331000000 + 00000000CE00000000000000000000000000006363009CFFFF0000CEFF0000CE + FF0000CEFF0000CEFF0000CEFF00FF00000000CEFF00009CCE0000CEFF00009C + CE00009CCE00639C9C0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000009C310063FF310063FF + 310063CE31004A4A4A0084848400FFCE9C00FFCE3100FFCE3100CE9C31009C63 + 310000000000000000000000000000000000006363009CFFFF009CFFFF0000CE + FF0000CEFF00FF00000000CEFF00FF00000000CEFF00FF000000009CCE0000CE + FF00009CCE00009CCE0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000009C31009CFFCE0063FF310063CE + 3100008400004A4A4A00FFCE9C00FFFFCE00FFFF9C00FFFF9C00FFCE3100CE9C + 3100000000009C0031000000000000000000006363009CFFFF0000CEFF009CFF + FF0000CEFF0000CEFF00FF000000FF000000FF00000000CEFF0000CEFF00009C + CE0000CEFF00009CCE0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000009C31009CFFCE0063FF3100009C + 3100FF9C00004A4A4A00FFCE9C00FFFFFF00FFFFCE00FFFF9C00FFCE3100CE9C + 310000000000FF0000000000000000000000006363009CFFFF00FFFFFF0000CE + FF00FF000000FF000000FF00000000FFFF00FF000000FF000000FF00000000CE + FF00009CCE00009CCE0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000009C3100009C3100009C3100FFCE + 3100FFCE31004A4A4A0084848400FFFFFF00FFFFFF00FFFFCE00FFCE9C008484 + 840000000000FF6331000000000000000000006363009CFFFF0000CEFF00FFFF + FF0000CEFF0000CEFF00FF000000FF000000FF00000000CEFF0000CEFF00009C + CE0000CEFF00009CCE0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FF633100FFFFCE00FFFF3100FFCE + 3100FFCE3100FF9C00004A4A4A0084848400FFCE9C00FFCE9C00848484000000 + 0000FF633100FF6331000000000000000000006363009CFFFF00FFFFFF0000CE + FF00FFFFFF00FF00000000CEFF00FF00000000CEFF00FF00000000CEFF0000CE + FF00009CCE00009CCE0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FF633100FFFFCE00FF9C00000084 + 000000840000FFCE3100FF9C00004A4A4A004A4A4A004A4A4A004A4A4A00FF9C + 0000FF6331009C0031000000000000000000006363009CFFFF0000CEFF00FFFF + FF0000CEFF00FFFFFF0000CEFF00FF00000000CEFF0000CEFF0000CEFF0000CE + FF0000CEFF00009CCE0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FF6331000084000063CE + 3100009C3100FF633100FF9C0000FF9C0000FF9C0000FF633100FF9C0000FF63 + 3100FF000000000000000000000000000000006363009CFFFF009CFFFF009CFF + FF009CFFFF009CFFFF009CFFFF009CFFFF009CFFFF009CFFFF009CFFFF009CFF + FF009CFFFF009CFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000006331009CFFCE0063FF + 310063CE310000840000FF633100FF9C0000FF9C0000FF9C0000FF633100FF9C + 0000FF6331000000000000000000000000000063630000636300006363000063 + 6300006363000063630000636300006363000063630000636300006363000063 + 6300006363000063630000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000006331009CFF + CE0063FF310063CE3100009C31000084000000840000FF6331009C9C0000FF63 + 31000000000000000000000000000000000000000000006363009CFFFF009CFF + FF009CFFFF009CFFFF009CFFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000063 + 31000063310063FF310063FF310063CE3100009C310000840000FF633100FF63 + 3100000000000000000000000000000000000000000000000000006363000063 + 6300006363000063630000636300000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000633100006331000063310000633100FF633100000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000009C0000009C0000009C0000009C0000009C0000009C000000 + 000000000000000000000000000000000000000000000000000084848400CECE + CE00CECECE00CECECE00CECECE00CECECE00CECECE00CECECE00CECECE00CECE + CE00CECECE00CECECE0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000009C000000 + CE000000CE000000CE000000CE000000CE000000CE000000CE0000009C000000 + 9C0000009C00000000000000000000000000000000000000000084848400FFFF + FF00FFFFFF009CFFFF00FFFFFF009CFFFF00009C31009CFFFF00FFFFFF009CFF + FF00FFFFFF00CECECE0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000009C000000CE000063 + FF003100FF003100FF003100FF003100FF003100FF000000CE000000CE000000 + CE0000009C0000009C000000000000000000000000000000000084848400FFFF + FF009CFFFF00FFFFFF009CFFFF00009C3100009C3100FFFFFF009CFFFF00FFFF + FF009CFFFF00CECECE0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000009C000063FF003100 + FF003100FF003100FF003100FF003100FF003100FF003100FF003100FF000000 + CE000000CE0000009C000000000000000000000000000000000084848400FFFF + FF00FFFFFF009CFFFF00009C3100009C3100009C3100009C3100009C31009CFF + FF00FFFFFF00CECECE0000000000000000000000000000000000000000000000 + 000000000000FF9C310000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FF6331000000 + 00000000000000000000000000000000000000009C006363FF000063FF003100 + FF003100FF003100FF003100FF003100FF003100FF003100FF003100FF003100 + FF000000CE0000009C0000009C0000000000000000000000000084848400FFFF + FF009CFFFF00FFFFFF009CFFFF00009C3100009C3100FFFFFF00639C00006363 + 00009CFFFF00CECECE0000000000000000000000000000000000000000000000 + 0000FF9C3100FF9C310000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FF9C3100FF63 + 31000000000000000000000000000000000000009C006363FF00319CFF003100 + FF003100FF00FFFFFF00FFFFFF003100FF003100FF00FFFFFF00FFFFFF003100 + FF000000CE000000CE0000009C0000000000000000000000000084848400FFFF + FF00FFFFFF009CFFFF00FFFFFF009CFFFF00009C31009CFFFF00FFFFFF006363 + 0000FFFFFF00CECECE000000000000000000000000000000000000000000FF9C + 3100FFCE3100FF9C3100FF9C3100FF9C3100FF9C3100FF9C3100FF9C3100FF9C + 3100FF9C31000000000000000000000000000000000000000000FF633100FF9C + 3100FF9C3100FF9C3100FF9C3100FF9C3100FF9C3100FF9C3100FF9C3100FFCE + 3100FF63310000000000000000000000000000009C006363FF00319CFF003100 + FF003100FF003100FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003100FF003100 + FF003100FF000000CE0000009C0000000000000000000000000084848400FFFF + FF009CFFFF00636300009CFFFF00FFFFFF009CFFFF00FFFFFF009CFFFF006363 + 00009CFFFF00CECECE0000000000000000000000000000000000FF633100FFFF + 9C00FFFF9C00FFFF9C00FFFF9C00FFFF9C00FFFF9C00FFFF9C00FFFF9C00FFFF + 9C00FF9C31000000000000000000000000000000000000000000FF633100FFFF + CE00FFFFCE00FFFFCE00FFFFCE00FFFFCE00FFFFCE00FFFFCE00FFFFCE00FFFF + 9C00FFCE310000000000000000000000000000009C006363FF00319CFF003100 + FF003100FF003100FF003100FF00FFFFFF00FFFFFF003100FF003100FF003100 + FF003100FF000000CE0000009C0000000000000000000000000084848400FFFF + FF00FFFFFF0063630000FFFFFF009CFFFF00009C31009CFFFF00FFFFFF009CFF + FF00FFFFFF00CECECE000000000000000000000000000000000000000000FF63 + 3100FFFF9C00FFFF9C0000000000FF633100FF633100FF633100FF633100FF63 + 3100FF6331000000000000000000000000000000000000000000FF633100FF63 + 3100FF633100FF633100FF633100FF633100FF633100FF633100FFFFCE00FFCE + 31000000000000000000000000000000000000009C006363FF00319CFF000063 + FF003100FF003100FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003100FF003100 + FF003100FF000000CE0000009C0000000000000000000000000084848400FFFF + FF009CFFFF0063630000639C0000FFFFFF00009C3100009C31009CFFFF00FFFF + FF009CFFFF00CECECE0000000000000000000000000000000000000000000000 + 0000FF633100FFFF9C0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FF633100FFCE31000000 + 00000000000000000000000000000000000000009C006363CE00319CFF000063 + FF003100FF00FFFFFF00FFFFFF003100FF003100FF00FFFFFF00FFFFFF003100 + FF003100FF000000CE0000009C0000000000000000000000000084848400FFFF + FF00FFFFFF009CFFFF00009C3100009C3100009C3100009C3100009C31009CFF + FF00FFFFFF00CECECE0000000000000000000000000000000000000000000000 + 000000000000FF63310000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FF633100000000000000 + 0000000000000000000000000000000000000000000000009C006363FF00319C + FF000063FF003100FF003100FF003100FF003100FF003100FF003100FF003100 + FF003100FF000000CE000000000000000000000000000000000084848400FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00009C3100009C31009CFFFF00FFFF + FF00CECECE00CECECE0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FF633100000000000000 + 0000000000000000000000000000000000000000000000009C006363CE00319C + FF00319CFF000063FF000063FF003100FF003100FF003100FF003100FF003100 + FF003100FF0000009C000000000000000000000000000000000084848400FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00009C31009CFFFF00FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000009C006363 + CE006363FF00319CFF00319CFF000063FF000063FF003100FF003100FF003100 + FF000000CE00000000000000000000000000000000000000000084848400FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009CFFFF00FFFFFF009CFFFF008484 + 8400FFFFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 9C0000009C006363CE006363FF006363FF006363FF006363FF000000CE000000 + 000000000000000000000000000000000000000000000000000084848400FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF008484 + 8400000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000009C0000009C0000009C0000009C0000009C0000009C000000 + 0000000000000000000000000000000000000000000000000000848484008484 + 8400848484008484840084848400848484008484840084848400848484008484 + 8400000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008484840084848400848484008484 + 8400848484008484840084848400848484008484840084848400848484008484 + 8400848484008484840084848400848484000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000008400 + 0000840000008400000084000000840000008400000084000000840000008400 + 0000840000008400000084000000000000008484840000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000848484000000000000000000008484000084 + 8400000000000000000000000000000000000000000000000000C6C6C600C6C6 + C600000000000084840000000000000000000000000000000000C6C6C600C6C6 + C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C6000000 + 0000C6C6C6000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008484840000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000848484000000000000000000008484000084 + 8400000000000000000000000000000000000000000000000000C6C6C600C6C6 + C600000000000084840000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000C6C6C60000000000000000000000000000000000000000008400 + 0000840000008400000084000000840000000000000000000000000000008400 + 0000840000008400000084000000000000008484840084848400848484008484 + 8400848484008484840084848400848484008484840084848400848484008484 + 8400848484008484840084848400848484000000000000000000008484000084 + 8400000000000000000000000000000000000000000000000000C6C6C600C6C6 + C6000000000000848400000000000000000000000000C6C6C600C6C6C600C6C6 + C600C6C6C600C6C6C600C6C6C60000FFFF0000FFFF0000FFFF00C6C6C600C6C6 + C600000000000000000000000000000000000000000000000000000000000000 + 0000000000008400000084000000000000000000000000000000000000000000 + 0000840000008400000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000008484000084 + 8400000000000000000000000000000000000000000000000000000000000000 + 00000000000000848400000000000000000000000000C6C6C600C6C6C600C6C6 + C600C6C6C600C6C6C600C6C6C600848484008484840084848400C6C6C600C6C6 + C60000000000C6C6C60000000000000000000000000000000000000000000000 + 0000000000000000000084000000840000000000000000000000000000000000 + 0000840000008400000000000000000000008400000084000000840000008400 + 0000000000000000000000000000840000008400000084000000840000008400 + 0000840000000000000000000000000000000000000000000000008484000084 + 8400008484000084840000848400008484000084840000848400008484000084 + 8400008484000084840000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000C6C6C600C6C6C60000000000FF000000FF000000FF000000FF00 + 0000FF0000000000000000000000840000008400000084000000840000008400 + 0000840000008400000000000000000000000000000084848400840000000000 + 0000000000000000000000000000000000008484840084000000840000008484 + 8400000000000000000000000000000000000000000000000000008484000084 + 8400000000000000000000000000000000000000000000000000000000000000 + 00000084840000848400000000000000000000000000C6C6C600C6C6C600C6C6 + C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C6000000 + 0000C6C6C60000000000C6C6C600000000000000000000000000FF000000FF00 + 0000000000000000000000000000000000008400000084000000000000000000 + 0000840000008400000000000000000000000000000000000000840000008400 + 0000000000000000000000000000000000008484840084000000840000000000 + 0000000000000000000000000000000000000000000000000000008484000000 + 0000C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6 + C600000000000084840000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000C6C6 + C60000000000C6C6C6000000000000000000000000000000000000000000FF00 + 0000FF0000000000000000000000000000000000000084000000840000000000 + 0000840000008400000000000000000000000000000000000000848484008400 + 0000000000000000000000000000000000008400000084000000848484000000 + 0000000000000000000000000000000000000000000000000000008484000000 + 0000C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6 + C60000000000008484000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 0000C6C6C60000000000C6C6C600000000000000000000000000000000000000 + 0000FF000000FF000000FF000000FF000000FF000000FF000000840000008400 + 0000840000008400000000000000000000000000000000000000000000008400 + 0000840000008400000084000000840000008400000084000000000000000000 + 0000000000000000000000000000000000000000000000000000008484000000 + 0000C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6 + C600000000000084840000000000000000000000000000000000000000000000 + 0000FFFFFF000000000000000000000000000000000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FF000000FF0000000000000000000000FF000000FF0000008400 + 0000840000008400000000000000000000000000000000000000000000008484 + 8400840000000000000000000000840000008400000084848400000000000000 + 0000000000000000000000000000000000000000000000000000008484000000 + 0000C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6 + C600000000000084840000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000FF000000FF00000000000000FF000000FF0000000000 + 0000840000008400000000000000000000000000000000000000000000000000 + 0000840000008400000000000000840000008400000000000000000000000000 + 0000000000000000000000000000000000000000000000000000008484000000 + 0000C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6 + C600000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF000000000000000000000000000000000000000000FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FF000000FF000000FF000000FF0000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000848484008400000084000000840000008484840000000000000000000000 + 0000000000000000000000000000000000000000000000000000008484000000 + 0000C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6 + C60000000000C6C6C60000000000000000000000000000000000000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FF000000FF000000FF0000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000008400000084000000840000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FF000000FF0000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000008484840084000000848484000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000084000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00000000000000000000000000000000000000000084000000840000008400 + 0000840000000000000000000000000000008400000084000000840000008400 + 000084000000840000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000008484000084 + 8400008484000084840000848400008484000084840000848400008484000000 + 00000000000000000000000000000000000000000000FFFFFF00000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00000000000000000000000000000000000000000000000000848484008400 + 0000000000000000000000000000000000000000000084848400840000008400 + 000084848400000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000FFFF00000000000084 + 8400008484000084840000848400008484000084840000848400008484000084 + 8400000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000008400 + 0000840000000000000000000000000000000000000084848400840000008400 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF000000000000000000000000000000000000000000FFFFFF0000FFFF000000 + 0000008484000084840000848400008484000084840000848400008484000084 + 8400008484000000000000000000000000000000000000000000FFFFFF000000 + 00000000000000000000000000000000000000000000FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000008484 + 8400840000000000000000000000000000000000000084000000840000008484 + 840000000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000FFFF00FFFFFF0000FF + FF00000000000084840000848400008484000084840000848400008484000084 + 8400008484000084840000000000000000000000000000000000FFFFFF000000 + 00000000000000000000000000000000000000000000FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000840000008400000084000000840000008400000084000000840000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF000000000000000000000000000000000000000000FFFFFF0000FFFF00FFFF + FF0000FFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFFFFF000000 + 00000000000000000000000000000000000000000000FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000848484008400000000000000000000008400000084000000848484000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000FFFF00FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000008400000084000000000000008400000084000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF000000000000000000000000000000000000000000FFFFFF0000FFFF00FFFF + FF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF00000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF000000000000000000000000000000000000000000FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000008484840084000000840000008400000084848400000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000FFFF00FFFFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000084000000840000008400000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000084848400840000008484840000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF000000000000000000000000000000000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000840000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008400000084000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000840000008400000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000084000000840000008400000084000000840000008400 + 0000840000008400000084000000840000000000000000000000840000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000084000000840000008400000084000000840000008400 + 0000840000008400000084000000000000000000000000000000000000008400 + 0000000000000000000084000000000000000000000084000000840000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000084000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00840000000000000084000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000084000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0084000000000000000000000000000000000000008400 + 0000000000000000000084000000000000008400000000000000000000008400 + 0000000000000000000000000000000000000000000084848400008484008484 + 8400008484008484840084000000FFFFFF008400000084000000840000008400 + 00008400000084000000FFFFFF00840000008400000084000000840000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000084000000FFFFFF000000000000000000000000000000 + 000000000000FFFFFF0084000000000000000000000000000000000000008400 + 0000000000000000000084000000000000008400000000000000000000008400 + 0000000000000000000000000000000000000000000000848400848484000084 + 8400848484000084840084000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00840000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000084000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0084000000000000000000000000000000000000000000 + 0000840000008400000084000000000000008400000000000000000000008400 + 0000000000000000000000000000000000000000000084848400008484008484 + 8400008484008484840084000000FFFFFF00840000008400000084000000FFFF + FF00840000008400000084000000840000008400000084000000840000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0084000000FFFFFF000000000000000000000000000000 + 000000000000FFFFFF0084000000000000000000000000000000000000000000 + 0000000000000000000084000000000000008400000084000000840000000000 + 0000000000000000000000000000000000000000000000848400848484000084 + 8400848484000084840084000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0084000000FFFFFF0084000000000000000000000084000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00000000000000 + 0000000000000000000084000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0084000000000000000000000000000000000000000000 + 0000000000000000000084000000000000008400000000000000000000000000 + 0000000000000000000000000000000000000000000084848400008484008484 + 8400008484008484840084000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00840000008400000000000000000000000000000000000000840000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0084000000FFFFFF000000000000000000FFFFFF008400 + 0000840000008400000084000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000848400848484000084 + 8400848484000084840084000000840000008400000084000000840000008400 + 0000840000000000000000000000000000008400000084000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00000000000000 + 0000000000000000000084000000FFFFFF00FFFFFF00FFFFFF00FFFFFF008400 + 0000FFFFFF008400000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000084848400008484008484 + 8400008484008484840000848400848484000084840084848400008484008484 + 8400008484000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0084000000FFFFFF00FFFFFF00FFFFFF00FFFFFF008400 + 0000840000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000848400848484000000 + 0000000000000000000000000000000000000000000000000000000000008484 + 8400848484000000000000000000000000008400000084000000840000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00000000000000 + 0000FFFFFF000000000084000000840000008400000084000000840000008400 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000084848400848484000000 + 0000C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600000000008484 + 8400008484000000000000000000000000000000000084000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF0000000000FFFFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000848400848484000084 + 84000000000000FFFF00000000000000000000FFFF0000000000848484000084 + 8400848484000000000000000000000000008400000084000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000FFFF0000FFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000084000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008400000084000000840000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008400000084000000840000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008400000084000000840000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000848484000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000008484840000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000084848400000000008484840000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008484840000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008400000084000000840000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000084848400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008400000084000000840000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000084848400000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008400000084000000840000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000848484000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000848484000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008400000084000000840000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008400000084000000840000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008400000084000000840000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000040000000700000000100010000000000800300000000000000000000 + 000000000000000000000000FFFFFF00FFF9FFFF00000000F830FFFF00000000 + E000000100000000C00100010000000080030001000000008003000100000000 + 0001000100000000000100010000000000010001000000000001000100000000 + 000100010000000080030001000000008003000100000000C00780FF00000000 + E00FC1FF00000000F83FFFFF00000000FFFFFFFFF81FC001FFFFFFFFE007C001 + FFFFFFFFC003C001FDFFFFBF8001C001F9FFFF9F8001C001F1FFFF8F0000C001 + E003C0070000C001C003C0030000C001C003C0030000C001E003C0070000C001 + F1FFFF8F0000C001F9FFFF9F8001C001FDFFFFBF8001C001FFFFFFFFC003C003 + FFFFFFFFE007C007FFFFFFFFF81FC00FFFFFFFFFFFFF0000C001C007E0017FFE + 80018003FFFF7FFE80010001E0E1000080010001F9F3FFFF80010001FCF30E07 + 8001000006039F0F80010000CF33CF1F80018000E793CF1F8001C000F003E03F + 8001E001F983E63F8001E007FC93F27F8001F007FE1FF07F8001F003FF1FF8FF + 8001F803FF9FF8FFFFFFFFFFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 07C1FFFFC007001F07C18703C007000F07C1CF87C00700070101E78FC0070003 + 0001E78FC00700010201F01FC00700000201F31FC007001F8003F93FC007001F + C107F83FC007001FC107FC7FC0078FF1E38FFC7FC00FFFF9E38FFEFFC01FFF75 + E38FFFFFC03FFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFF3FFFC00 + DFFFFC01ED9F8000B803FC01ED6F00001FFFFC01ED6F0000FFFF0001F16F0000 + 1FFF0001FD1F0001BFFF0001FC7F0003D8030001FEFF00033FFF0003FC7F0003 + FFFF0007FD7F00031FFF000FF93F0003BFFF00FFFBBF0003380301FFFBBF8007 + BFFF03FFFBBFF87FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFF1FFFFFFFFFFFE00F1803E01FE07FFFFF1FFFF18FF8FFF83FFFFF + F18FF8FFF11FFFFFF18FFC7FF39F1FFFF01FFC7FF39F1803F18FFE3FF39F1FFF + F18FFE3FF39FFFFFF18FFF1FF39FFFFFE01FFE0FF39F1FFFFFFFFFFFE10F1803 + FFFFFFFFFFFF1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFF003FC00FF0030003FFFFFFFFFFFFFFFF0003000300030003 + FFFFFFFFFFFFFFFF003FC00FF0030003FFFFFFFFFFFFFFFF0003000300030003 + FFFFFFFFFFFFFFFF003FC00FF0030003FFFFFFFFFFFFFFFF0003000300030003 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 + 000000000000} + end + object SpTBXPopupMenu1: TSpTBXPopupMenu + Left = 224 + Top = 352 + object pGroupItem1: TTBGroupItem + LinkSubitems = mToolbars + end + object SpTBXSeparatorItem10: TSpTBXSeparatorItem + end + object pCustomize: TSpTBXItem + Caption = 'Customize...' + OnClick = aCustomizeExecute + end + object pEmbeddedCustomize: TSpTBXItem + Caption = 'Embedded Customize...' + OnClick = aEmbeddedCustomizeExecute + end + end + object SpTBXCustomizer1: TSpTBXCustomizer + Images = ImageList1 + Left = 192 + Top = 384 + object cPrint: TSpTBXItem + Caption = 'Print' + ImageIndex = 17 + OnClick = ActionsExecute + end + object cLeftJustify: TSpTBXItem + Caption = 'Left Justify' + ImageIndex = 0 + OnClick = ActionsExecute + end + object cCentered: TSpTBXItem + Caption = 'Centered' + ImageIndex = 1 + OnClick = ActionsExecute + end + object cRightJustify: TSpTBXItem + Caption = 'Right Justify' + ImageIndex = 2 + OnClick = ActionsExecute + end + object cBullets: TSpTBXItem + Caption = 'Bullets' + ImageIndex = 7 + OnClick = ActionsExecute + end + object cNumBullets: TSpTBXItem + Caption = 'Numbered Bullets' + ImageIndex = 8 + OnClick = ActionsExecute + end + object cFavs: TSpTBXItem + Caption = 'Favs' + ImageIndex = 25 + OnClick = ActionsExecute + end + object cSelectAll: TSpTBXItem + Caption = 'Select All' + ShortCut = 16449 + OnClick = ActionsExecute + end + object cExit: TSpTBXItem + Caption = 'Exit' + OnClick = ActionsExecute + end + end +end diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/Unit1.pas b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/Unit1.pas new file mode 100644 index 0000000..a56db25 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/Unit1.pas @@ -0,0 +1,350 @@ +unit Unit1; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, Menus, ImgList, ActnList, ComCtrls, + {$IFNDEF UNICODE} + TntActnList, TntDialogs, TntStdCtrls, TntSystem, TntForms, + {$ENDIF} + { TB2K } + TB2Dock, TB2Toolbar, TB2Item, TB2ExtItems, + SpTBXSkins, SpTBXItem, SpTBXControls, SpTBXDkPanels, SpTBXTabs, SpTBXEditors, + SpTBXCustomizer, + { gettext } + gnugettext; + +type + TForm1 = class(TForm) + ImageList1: TImageList; + SpTBXDock1: TSpTBXDock; + SpTBXMultiDock1: TSpTBXMultiDock; + SpTBXMultiDock2: TSpTBXMultiDock; + SpTBXDock2: TSpTBXDock; + dpLog: TSpTBXDockablePanel; + dpHelp: TSpTBXDockablePanel; + tbStandard: TSpTBXToolbar; + tbFormat: TSpTBXToolbar; + tbMenuBar: TSpTBXToolbar; + tbNavigation: TSpTBXToolbar; + mFile: TSpTBXSubmenuItem; + mEdit: TSpTBXSubmenuItem; + mView: TSpTBXSubmenuItem; + mHelp: TSpTBXSubmenuItem; + mNew: TSpTBXItem; + mOpen: TSpTBXItem; + mSave: TSpTBXItem; + SpTBXSeparatorItem1: TSpTBXSeparatorItem; + mExit: TSpTBXItem; + mCut: TSpTBXItem; + mCopy: TSpTBXItem; + mPaste: TSpTBXItem; + SpTBXSeparatorItem2: TSpTBXSeparatorItem; + mSelectAll: TSpTBXItem; + SpTBXSeparatorItem3: TSpTBXSeparatorItem; + mFind: TSpTBXItem; + mLeftJustify: TSpTBXItem; + mUnderline: TSpTBXItem; + mItalic: TSpTBXItem; + mBold: TSpTBXItem; + SpTBXSeparatorItem5: TSpTBXSeparatorItem; + mRightJustify: TSpTBXItem; + mCentered: TSpTBXItem; + SpTBXSeparatorItem6: TSpTBXSeparatorItem; + mBullets: TSpTBXItem; + mNumberedBullets: TSpTBXItem; + mSidebar: TSpTBXSubmenuItem; + mOptions: TSpTBXItem; + mmHelp: TSpTBXItem; + mToolbars: TSpTBXSubmenuItem; + SpTBXPopupMenu1: TSpTBXPopupMenu; + mStandardToolbar: TSpTBXItem; + mFormattingToolbar: TSpTBXItem; + mNavigationToolbar: TSpTBXItem; + mCommandsLog: TSpTBXItem; + dpOptions: TSpTBXDockablePanel; + mmmHelp: TSpTBXItem; + mAbout: TSpTBXItem; + tNew: TSpTBXItem; + tOpen: TSpTBXItem; + tSave: TSpTBXItem; + tCut: TSpTBXItem; + tCopy: TSpTBXItem; + tPaste: TSpTBXItem; + tBold: TSpTBXItem; + SpTBXSeparatorItem8: TSpTBXSeparatorItem; + tItalic: TSpTBXItem; + tUnderline: TSpTBXItem; + mPrint: TSpTBXItem; + SpTBXSeparatorItem7: TSpTBXSeparatorItem; + SpTBXSeparatorItem9: TSpTBXSeparatorItem; + tFind: TSpTBXItem; + tStop: TSpTBXItem; + tRefresh: TSpTBXItem; + tForward: TSpTBXItem; + tBack: TSpTBXItem; + tSearch: TSpTBXItem; + pGroupItem1: TTBGroupItem; + SpTBXSeparatorItem10: TSpTBXSeparatorItem; + pCustomize: TSpTBXItem; + tbLayouts: TSpTBXToolbar; + tLayoutSave: TSpTBXItem; + SpTBXLabelItem1: TSpTBXLabelItem; + tLayoutsToolbar: TSpTBXItem; + SpTBXCustomizer1: TSpTBXCustomizer; + cPrint: TSpTBXItem; + cLeftJustify: TSpTBXItem; + cCentered: TSpTBXItem; + cNumBullets: TSpTBXItem; + cBullets: TSpTBXItem; + cRightJustify: TSpTBXItem; + cFavs: TSpTBXItem; + cExit: TSpTBXItem; + cSelectAll: TSpTBXItem; + Memo1: TMemo; + SpTBXSubmenuItem1: TSpTBXSubmenuItem; + SpTBXTabControl1: TSpTBXTabControl; + SpTBXTabItem1: TSpTBXTabItem; + SpTBXTabSheet1: TSpTBXTabSheet; + SpTBXTabItem2: TSpTBXTabItem; + SpTBXTabSheet2: TSpTBXTabSheet; + Memo2: TMemo; + Memo3: TMemo; + SpTBXSeparatorItem12: TSpTBXSeparatorItem; + tSkins: TSpTBXSubmenuItem; + SpTBXSkinGroupItem1: TSpTBXSkinGroupItem; + pEmbeddedCustomize: TSpTBXItem; + SpTBXLabel1: TSpTBXLabel; + SpTBXSeparatorItem13: TSpTBXSeparatorItem; + SpTBXTabItem3: TSpTBXTabItem; + SpTBXTabSheet3: TSpTBXTabSheet; + Memo4: TMemo; + SpTBXSplitter1: TSpTBXSplitter; + SpTBXSplitter2: TSpTBXSplitter; + tLanguages: TSpTBXComboBox; + TBControlItem1: TTBControlItem; + tFont: TSpTBXComboBox; + TBControlItem2: TTBControlItem; + tFontSize: TSpTBXComboBox; + TBControlItem3: TTBControlItem; + tLayouts: TSpTBXComboBox; + TBControlItem4: TTBControlItem; + SpTBXStatusBar1: TSpTBXStatusBar; + procedure ActionsExecute(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure tLayoutSaveClick(Sender: TObject); + procedure tLayoutsItemClick(Sender: TObject); + procedure aCustomizeExecute(Sender: TObject); + procedure aEmbeddedCustomizeExecute(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure tLanguagesItemClick(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + FAppPath: string; + FIniPath: string; + procedure FillLayoutList(CurrentLayout: string = ''); + end; + +var + Form1: TForm1; + +implementation + +uses + Unit2; + +{$R *.dfm} + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Form } + +procedure TForm1.FormShow(Sender: TObject); +begin + FAppPath := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)); + FIniPath := FAppPath + 'Options.ini'; + + // Load the text files + Memo2.Lines.LoadFromFile(FAppPath + 'faq.txt'); + Memo3.Lines.LoadFromFile(FAppPath + 'advanced.txt'); + Memo4.Lines.LoadFromFile(FAppPath + 'translations.txt'); + + // Load the items positions and the last layout from the ini file + SpTBXCustomizer1.Load(FIniPath); + + // Load the layout list + FillLayoutList('LastLayout'); + + SpTBXCustomizer1.MenuBar := tbMenuBar; +end; + +procedure TForm1.FormDestroy(Sender: TObject); +begin + // Save the items positions and the current layout to the Ini file + SpTBXCustomizer1.Save(FIniPath); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Layouts UI } + +procedure TForm1.FillLayoutList(CurrentLayout: string); +var + I: integer; +begin + // Fill the tLayouts combobox + tLayouts.Items.Clear; + for I := 0 to SpTBXCustomizer1.Layouts.Count - 1 do + tLayouts.Items.Add(SpTBXCustomizer1.Layouts[I]); + I := tLayouts.Items.IndexOf(CurrentLayout); + if I > -1 then + tLayouts.ItemIndex := I; +end; + +procedure TForm1.tLayoutsItemClick(Sender: TObject); +begin + if tLayouts.ItemIndex > -1 then + SpTBXCustomizer1.LoadLayout(FIniPath, tLayouts.Items[tLayouts.ItemIndex]); +end; + +procedure TForm1.tLayoutSaveClick(Sender: TObject); +var + S: string; +begin + {$IFNDEF UNICODE} + S := TntDialogs.WideInputBox(_('Save Layout'), _('Save current layout as:'), ''); + {$ELSE} + S := InputBox(_('Save Layout'), _('Save current layout as:'), ''); + {$ENDIF} + if S <> '' then begin + SpTBXCustomizer1.SaveLayout(FIniPath, S); + FillLayoutList(S); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Actions } + +procedure TForm1.ActionsExecute(Sender: TObject); +begin + if Sender is TSpTBXItem then + Memo1.Lines.Add(TSpTBXItem(Sender).Caption + ' ' + _('Executed')); +end; + +procedure TForm1.aCustomizeExecute(Sender: TObject); +begin + SpTBXCustomizer1.Show; +end; + +procedure TForm1.aEmbeddedCustomizeExecute(Sender: TObject); +begin + if not Form2.Visible then begin + SpTBXCustomizer1.ShowEmbedded(Form2.ClientPanel); + Form2.Show; + Form2.tCustomize.Click; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Languages } + +function MyWideCustomLoadResString(ResStringRec: PResStringRec; var Value: WideString): Boolean; +begin + Result := True; + Value := GnuGetText.LoadResStringW(ResStringRec); +end; + +procedure SpDxGetTextInitialize(LanguageCode: string; AComponents: array of TComponent; ShellFont, UnicodeResourceStrings: Boolean); +// LanguageCode can be an ISO language code: 'en', 'es', 'ko' +// And also can be the ISO code plus a description: '[en] English', '[es] Spanish', '[ko] Korean' +var + I, L: Integer; +begin + // Get the ISO language code + L := Length(LanguageCode); + if (L > 2) and (LanguageCode[1] = '[') then begin + I := Pos(']', LanguageCode); + if (I > 0) then + LanguageCode := Copy(LanguageCode, 2, I - 2); + end; + + {$IFNDEF UNICODE} + // Override Delphi's automatic ResourceString conversion to Ansi + if UnicodeResourceStrings then begin + TntSystem.InstallTntSystemUpdates; + // Override TNT's LoadResString function + // This is necessary because dxGetText uses a different + // way to access the translated ResourceStrings. + TntSystem.WideCustomLoadResString := MyWideCustomLoadResString; + end; + {$ENDIF} + + if ShellFont then begin + if (Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion >= 5) then + DefFontData.Name := 'MS Shell Dlg 2' + else + DefFontData.Name := 'MS Shell Dlg'; + end; + + gnugettext.TP_GlobalIgnoreClassProperty(TAction,'Category'); + gnugettext.TP_GlobalIgnoreClassProperty(TControl,'HelpKeyword'); + gnugettext.TP_GlobalIgnoreClassProperty(TControl,'ImeName'); + gnugettext.TP_GlobalIgnoreClass(Graphics.TFont); + gnugettext.TP_GlobalIgnoreClass(TSpTBXTabSheet); + + gnugettext.UseLanguage(LanguageCode); + for I := Low(AComponents) to High(AComponents) do + gnugettext.TranslateComponent(AComponents[I]); +end; + +procedure SpDxGetTextChangeLanguage(LanguageCode: string; AComponents: array of TComponent); +// LanguageCode can be an ISO language code: 'en', 'es', 'ko' +// And also can be the ISO code plus a description: '[en] English', '[es] Spanish', '[ko] Korean' +var + I, L: Integer; + C: TComponent; +begin + // Get the ISO language code + L := Length(LanguageCode); + if (L > 2) and (LanguageCode[1] = '[') then begin + I := Pos(']', LanguageCode); + if (I > 0) then + LanguageCode := Copy(LanguageCode, 2, I - 2); + end; + + if LanguageCode <> gnugettext.GetCurrentLanguage then begin + gnugettext.UseLanguage(LanguageCode); + for I := Low(AComponents) to High(AComponents) do begin + C := AComponents[I]; + SpBeginUpdateAllToolbars(C); + try + gnugettext.ReTranslateComponent(C); + finally + SpEndUpdateAllToolbars(C); + end; + end; + end; +end; + +procedure TForm1.tLanguagesItemClick(Sender: TObject); +var + I: integer; +begin + I := tLanguages.ItemIndex; + if I > -1 then begin + tLanguages.Text := tLanguages.Items[I]; + // Change language and retranslate + SpDxGetTextChangeLanguage(tLanguages.Text, [Self, Form2]); + end; +end; + +procedure TForm1.FormCreate(Sender: TObject); +begin + SpDxGetTextInitialize('en', [Self], True, True); + tLanguages.Items.LoadFromFile('langcodes.txt'); + tLanguages.ItemIndex := 1; +end; + +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/Unit2.dfm b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/Unit2.dfm new file mode 100644 index 0000000..667975b --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/Unit2.dfm @@ -0,0 +1,1229 @@ +object Form2: TForm2 + Left = 279 + Top = 214 + BorderIcons = [biSystemMenu] + Caption = 'Options' + ClientHeight = 425 + ClientWidth = 456 + Color = clBtnFace + Constraints.MinHeight = 454 + Constraints.MinWidth = 464 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Shell Dlg 2' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + OnClose = FormClose + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object SpTBXDock1: TSpTBXDock + Left = 0 + Top = 0 + Width = 86 + Height = 425 + BoundLines = [blTop, blBottom, blLeft, blRight] + Position = dpLeft + object SpTBXToolbar1: TSpTBXToolbar + Left = 0 + Top = 0 + DockMode = dmCannotFloatOrChangeDocks + DragHandleStyle = dhNone + Images = ImageList1 + Options = [tboImageAboveCaption, tboSameWidth] + ShrinkMode = tbsmNone + Stretch = True + TabOrder = 0 + Caption = 'SpTBXToolbar1' + Customizable = False + DisplayMode = tbdmImageAboveCaption + object tProperties: TSpTBXItem + Caption = 'Properties' + GroupIndex = 1 + ImageIndex = 0 + OnClick = SideBarClick + CustomWidth = 80 + CustomHeight = 75 + end + object tPageSetup: TSpTBXItem + Caption = 'Page Setup' + GroupIndex = 1 + ImageIndex = 1 + OnClick = SideBarClick + CustomWidth = 80 + CustomHeight = 75 + end + object tHistory: TSpTBXItem + Caption = 'History' + GroupIndex = 1 + ImageIndex = 2 + OnClick = SideBarClick + CustomWidth = 80 + CustomHeight = 75 + end + object tFavorites: TSpTBXItem + Caption = 'Favorites' + GroupIndex = 1 + ImageIndex = 3 + OnClick = SideBarClick + CustomWidth = 80 + CustomHeight = 75 + end + object tCustomize: TSpTBXItem + Caption = 'Customizer' + GroupIndex = 1 + ImageIndex = 4 + OnClick = SideBarClick + CustomWidth = 80 + CustomHeight = 75 + end + end + end + object LeftPanel: TPanel + Left = 86 + Top = 0 + Width = 370 + Height = 425 + Align = alClient + BevelOuter = bvNone + TabOrder = 1 + object ClientPanel: TPanel + Left = 0 + Top = 28 + Width = 370 + Height = 360 + Align = alClient + BevelOuter = bvNone + TabOrder = 0 + end + object ButtonsPanel: TPanel + Left = 0 + Top = 388 + Width = 370 + Height = 37 + Align = alBottom + BevelOuter = bvNone + TabOrder = 1 + DesignSize = ( + 370 + 37) + object SpTBXButton1: TSpTBXButton + Left = 124 + Top = 7 + Width = 75 + Height = 25 + Caption = 'OK' + Anchors = [akRight, akBottom] + TabOrder = 0 + OnClick = ButtonClick + end + object SpTBXButton2: TSpTBXButton + Left = 207 + Top = 7 + Width = 75 + Height = 25 + Caption = 'Cancel' + Anchors = [akRight, akBottom] + TabOrder = 1 + OnClick = ButtonClick + end + object SpTBXButton3: TSpTBXButton + Left = 287 + Top = 7 + Width = 75 + Height = 25 + Caption = 'Apply' + Anchors = [akRight, akBottom] + TabOrder = 2 + OnClick = ButtonClick + end + end + object TitlePanel: TSpTBXLabel + Left = 0 + Top = 0 + Width = 370 + Height = 28 + Caption = 'Customizer' + Color = clGray + Align = alTop + AutoSize = False + Font.Charset = ANSI_CHARSET + Font.Color = clSilver + Font.Height = -19 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + end + end + object ImageList1: TImageList + Height = 32 + Width = 32 + Left = 112 + Top = 392 + Bitmap = { + 494C010105000900040020002000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000800000004000000001002000000000000080 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000B55A0000B55A0000B55A0000B55A0000B55A0000B55A0000B55A + 0000B55A0000B55A0000B55A0000B55A0000B55A0000B55A0000B55A0000B55A + 0000B55A0000B55A0000B55A0000B55A0000B55A0000B55A0000B55A00000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000B55A0000F7ADA500F7ADA500F7ADA500F7ADA500F7ADA500F7AD + A500F7ADA500F7ADA500F7ADA500F7ADA500F7ADA500F7ADA500F7ADA500F7AD + A500F7ADA500F7ADA500F7ADA500F7ADA500F7ADA500F7ADA500B55A00000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000CE630000FFC6C600FFC6C600FFC6C600FFC6C60084848400FFC6 + C600FFC6C600FFC6C600FFC6C600FFC6C60084848400FFC6C600FFC6C600FFC6 + C600FFC6C600FFC6C60084848400FFC6C600FFC6C600FFC6C600CE6300000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000E7730000FFDEDE0084848400FFDEDE00FFDEDE0084848400FFDE + DE00FFDEDE0084848400FFDEDE00FFDEDE0084848400FFDEDE00FFDEDE008484 + 8400FFDEDE00FFDEDE0084848400FFDEDE00FFDEDE0084848400E77300000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000E7730000E7730000E7730000E7730000E7730000E7730000E773 + 0000E7730000E7730000E7730000E7730000E7730000E7730000E7730000E773 + 0000E7730000E7730000E7730000E7730000E7730000E7730000E77300000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000B55A0000B55A0000B55A0000B55A0000B55A + 0000B55A0000B55A0000B55A0000B55A0000B55A0000B55A0000B55A0000B55A + 0000B55A0000B55A000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000B55A0000FFDEDE00F7ADA500F7ADA500F7AD + A500F7ADA500F7ADA500F7ADA500F7ADA500F7ADA500F7ADA500F7ADA500F7AD + A500B55A00000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000B55A0000FFDEDE00FFC6C600FFC6C600FFC6 + C600FFC6C6002D2D2D0058534E009C9C9C00FFC6C600FFC6C600F7ADA500B55A + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000B55A0000FFDEDE00FFC6C600B55A0000B55A + 0000B55A000058534E00373C3E005160610052636B00F7ADA500B55A00000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000B55A0000FFDEDE00FFC6C600CE6300000000 + 0000B55A0000D6D6D60054777B00428CDE0018556F008A5B5200000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000B55A0000FFDEDE00FFC6C600CE630000B55A + 0000FFC6C600FFC6C60054777B0029799A008D787F00D47719008A5B52000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000B55A0000FFDEDE00FFC6C600B55A0000FFC6 + C600FFC6C600FFC6C600848484007C707800F9C08600F8B26600D47719008A5B + 5200000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000B55A0000FFDEDE00FFC6C600FFC6C600FFC6 + C600FFC6C600F7ADA500B55A000085787C00FBCA9500F9C08600F8B26600D477 + 19008A5B52000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000B55A0000FFDEDE00FFC6C600FFC6C600FFC6 + C600F7ADA500B55A00000000000000000000AD7B7300FBD3A900F9C08600F8B2 + 6600D47719008A5B520000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000B55A0000FFDEDE00FFC6C600FFC6C600F7AD + A500B55A000000000000000000000000000000000000AD7B7300FBD3A900F9C0 + 8600F8B26600D47719008A5B5200000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000B55A0000FFDEDE00FFC6C600F7ADA500B55A + 0000000000000000000000000000000000000000000000000000AD7B7300FBD3 + A900F9C08600F8B26600D47719008A5B52000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000B55A0000FFDEDE00F7ADA500B55A00000000 + 000000000000000000000000000000000000000000000000000000000000AD7B + 7300FBCA9500B9858500299CEF004ABDFF000A62A00000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000B55A0000FFDEDE00B55A0000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000AD7B7300299CEF004ABDFF00299CEF00021EAA0000009A00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000B55A0000B55A000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000004ABDFF00299CEF000936C9001029D6000316AC000018C6000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000B55A00000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000018C6006D8AFD00106BFF000018C600000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000018C6000018C60000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000AD7B7B00B5848400B5848400B5848400B584 + 8400B5848400B5848400B5848400B5848400B5848400B5848400B5848400B584 + 8400B5848400B5848400B5848400B5848400B5848400B5848400000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000948C8C00948C8C00948C8C00948C8C00948C8C00948C8C000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000087BAD00087BAD000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000087BAD00087BAD00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000AD7B7B00EFDEC600F7E7C600F7DEBD00F7DE + B500F7D6B500F7D6AD00F7D6A500EFCE9C00EFCE9C00EFCE9400EFCE9400EFCE + 9400EFCE9400EFCE9400EFCE9400EFCE9400EFCE9400B58C7B00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000E7C6AD00A57B6300A57B6300A57B6300A57B6300A57B6300A57B6300A57B + 6300A57B6300A57B6300A57B6300A57B6300A57B6300A57B6300000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000009C9C + 9C009C9C9C009C9C9C00A5A5A500ADADAD00A5A5A500A5A5A5009C9C9C00948C + 8C00948C8C000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000218CB50063C6E70031A5CE00087B + AD00000000000000000000000000000000000000000000000000000000000000 + 0000107BAD0021ADD60029BDE700107BAD000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000AD7B7B00EFDEC600F7E7CE00F7DEC600F7DE + BD00F7D6B500F7D6AD00F7D6AD00EFCEA500EFCE9C00EFCE9C00EFCE9400EFCE + 9400EFCE9400EFCE9400EFCE9400EFCE9400EFCE9400B58C7B00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFDED600F7CEBD00F7CEBD00F7CEBD00F7CEBD00F7CEBD00F7CEBD00F7CE + BD00F7CEBD00F7CEBD00F7CEBD00F7CEBD00F7CEBD00DEAD8C00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000009C9C9C00948C8C00B5AD + AD00CECECE00D6D6D600C6C6C600BDBDBD00BDBDBD00C6BDBD00CEC6C600CEC6 + C600B5ADAD00948C8C00948C8C00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000001884B50084DEF70073EFFF0042B5 + D600087BAD000000000000000000000000000000000000000000000000001084 + B50039C6E700FFFFFF0031C6EF00087BAD000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000AD7B7B00F7DECE00F7E7CE00F7DEC600F7DE + C600F7DEBD00F7D6B500F7D6AD00F7D6AD00EFCEA500EFCE9C00EFCE9C00EFCE + 9400EFCE9400EFCE9400EFCE9400EFCE9400EFCE9400B58C7B00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFDED600F7CEBD008C6B5200F7CEBD00F7CEBD008C6B5200F7CEBD00F7CE + BD008C6B5200F7CEBD00F7CEBD008C6B5200F7CEBD00DEAD8C00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000009C9C9C00A5A5A500D6D6D600E7E7 + E700B5B5B5008C8484008C847B009C9484009C948400948C7B00847B73009C94 + 9400D6C6C600D6C6C600AD9C9C00948C8C000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000087BAD0052B5D6006BE7FF0073E7 + FF0042BDDE00087BAD00000000000000000000000000000000001884B5004ACE + EF00FFFFFF0042E7FF00189CC600087BAD000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000AD7B7B00F7E7CE00F7E7D600F7E7CE00F7DE + C600F7DEBD00F7DEBD00F7D6B500F7D6AD00F7D6AD00EFCEA500EFCE9C00EFCE + 9C00EFCE9400EFCE9400EFCE9400EFCE9400EFCE9400B58C7B00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000E7C6AD00E7C6AD00E7C6AD00E7C6AD00E7C6AD00E7C6AD00E7C6AD00E7C6 + AD00E7C6AD00E7C6AD00E7C6AD00E7C6AD00E7C6AD00E7C6AD00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000009C9C9C00ADADAD00EFEFEF00D6D6D6008C8C + 8400A59C8C00D6D6BD00FFF7E700CECEF700849CF700FFF7E700E7E7CE00ADAD + 94007B736B00B5A5A500E7CECE00B5A5A500948C8C0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000087BAD0073DEF7005AE7 + FF007BEFFF0052C6E700087BAD000000000000000000218CB5006BDEF700FFFF + FF0042E7FF0031C6EF00107BAD00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000AD7B7B00F7E7D600F7EFDE00F7E7D600F7E7 + CE00F7DEC600F7DEC600F7DEBD00F7D6B500F7D6AD00F7D6AD00EFCEA500EFCE + 9C00EFCE9C00EFCE9400EFCE9400EFCE9400EFCE9400B58C7B00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000E7C6AD00A57B6300A57B6300A57B + 6300000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000009C9C9C00A5A5A500EFEFEF00D6D6D6008C8C8400CEC6 + B500FFFFEF00FFF7E700FFE7C600D6BDBD00AD9CBD00FFE7CE00FFF7EF00FFFF + FF00E7E7CE00847B6B00AD949400EFCECE00AD9C9C00948C8C00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000087BAD0063C6E70052E7 + FF0063E7FF007BEFFF0063CEE7001084B500188CBD0073DEF700FFFFFF005AE7 + FF004AE7FF0021ADD600087BAD00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000AD847B00F7E7DE00F7EFDE00F7E7D600F7E7 + CE00F7E7CE00F7DEC600F7DEC600F7DEBD00F7D6B500F7D6AD00F7D6AD00EFCE + A500EFCE9C00EFCE9C00EFCE9400EFCE9400EFCE9400B58C7B00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFDED600F7CEBD00F7CEBD00DEAD + 8C0000000000B5848400B5848400B5848400B5848400B5848400B5848400B584 + 8400B5848400B5848400B5848400B5848400B5848400B5848400000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000009C9C9C00D6DED60042944A00427B4200D6D6BD00FFFF + EF00FFE7C600F7D6A500F7C69400F7C68400F7C68400EFBD8400F7D6AD00FFF7 + DE00FFFFFF00F7F7E700847B6B00BDA5A500E7C6C600948C8C00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000399CC60063E7 + FF004ADEFF0063E7FF0084EFFF0073DEF7007BE7F700FFFFFF007BEFFF006BE7 + FF0052DEFF00108CB50000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000AD847B00F7EFE700F7EFE700292921005A52 + 42005A5242005A5242005A5242005A524200F7DEBD00F7D6B500F7D6AD00F7D6 + AD00EFCEA500EFCE9C00EFCE9C00EFCE9400EFCE9400B58C7B00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFDED600F7CEBD008C6B5200DEAD + 8C0000000000C6A59C00FFEFD600F7E7C600F7DEBD00F7DEB500F7D6AD00F7D6 + A500EFCE9C00EFCE9400EFCE9400EFCE9400F7D69C00B5848400000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009C9C9C00B5B5B5006BA56B0031AD4A00219C39009CC69400FFF7 + CE00FFEFC600FFE7BD00F7DEB500F7D6AD00F7C69400F7C68C00F7CE9C00F7DE + B500FFF7CE00FFFFFF00E7DECE00736B6300E7C6C600BDADAD00948C8C000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000107BAD0063CE + E70042DEFF004ADEFF0063E7FF0084EFFF0094EFFF009CEFFF008CEFFF007BEF + FF004AC6E700087BAD0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000B58C7B00F7EFE700FFF7EF0018181800DECE + CE008494EF000842FF00394AAD00524A4200F7DEBD00F7DEBD00F7D6B500F7D6 + AD00F7D6AD00EFCEA500EFCE9C00EFCE9C00EFCE9400B58C7B00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFDED600F7CEBD00F7CEBD00DEAD + 8C0000000000C6A59C00FFEFD600F7E7CE00F7DEC600F7DEBD00F7D6B500F7D6 + A500EFCE9C00EFCE9C00EFCE9400EFCE9400EFCE9C00B5848400000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009C9C9C0084B58400219C39005AE78C0052DE8400218C2900B5D6 + 9C00FFFFD600FFFFD600FFFFD600FFF7CE00FFE7B500F7D6A500F7C69400F7CE + 9C00F7CE9C00FFE7C600FFFFFF00A59C8C00A58C8C00E7C6C600948C8C000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000087B + AD004ADEFF0039DEFF0052DEFF0063E7FF007BEFFF0094EFFF009CEFFF0084EF + FF00087BAD000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000B58C8400F7EFEF00FFF7EF00292929007384 + D6004263F700A5ADE7001039E7004A424A00F7DEC600F7DEBD00F7DEBD00F7D6 + B500F7D6AD00F7D6AD00EFCEA500EFCE9C00EFCE9400B58C7B00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFDED600F7CEBD00F7CEBD00DEAD + 8C0000000000C6ADA500FFEFE700F7E7D600F7E7CE00F7DEC600F7DEBD00F7D6 + B500F7D6AD00EFCE9C00EFCE9C00EFCE9400EFCE9C00B5848400000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00009C9C9C0052845200108C210042D66B0052DE7B005AE78C0052DE7B00298C + 3100DEEFBD00FFFFD600FFFFD600FFFFDE00FFFFD600FFEFC600F7D6A500F7C6 + 9400EFBD8400F7C68C00FFF7E700DEDEC6007B736300EFC6C600A59C9C00A59C + 9C00000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000087BAD001084B50021B5 + DE0021D6FF0029D6FF0042DEFF0052DEFF006BE7FF0084EFFF0094EFFF0094EF + FF0042ADCE00087BAD0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000BD8C8400F7F7F700FFFFF700181818009494 + B500C6C6CE00DECECE004A63CE00214AD600F7DECE00F7DEC600F7DEC600F7DE + BD00F7D6B500F7D6AD00F7D6AD00EFCEA500EFCE9C00B58C7B00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFDED600F7CEBD008C6B5200DEAD + 8C0000000000C6ADA500FFF7E700F7E7D600F7E7CE00F7E7C600F7DEC600F7DE + B500F7D6B500F7D6AD00EFCE9C00EFCE9C00EFCE9400B5848400000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00009C9C9C00108C180029BD420039CE5A0042CE63004AD67B005AE78C004AD6 + 7B0031943900DEEFBD00FFFFD600E7E7C600CEC6B500FFFFD600FFF7CE00FFDE + A500F7C68C00EFB57B00FFE7C600FFFFE7007B736300E7BDBD00B5A5A500A59C + 9C00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000073AD002994C60052CEEF0042DE + FF0021D6FF0018CEFF0029D6FF0042DEFF0052DEFF006BE7FF0084EFFF009CEF + FF009CEFFF0063C6E700188CB500000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000BD948400F7F7F700FFFFFF00424242004242 + 4200424242004242390042424A001842D600738CEF0084848400F7DEC600F7DE + BD00F7DEBD00F7D6B500F7D6AD00F7D6AD00EFCEA500B58C7B00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFDED600F7CEBD00F7CEBD00DEAD + 8C0000000000CEB5AD00FFFFF700FFEFE700F7E7D600F7E7D600F7E7CE00F7DE + C600F7DEBD00F7D6B500F7D6AD00EFCE9C00EFCE9C00B5848400000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000730800109C180018A5290029BD420031C6520042CE630029A5420029A5 + 4200188C2900398C3900E7EFC6008C847B0063636B0073736B009C9C8C00948C + 7B009C846B00EFB57B00D6BDB500ADBDF700847B7300E7BDBD00BDADAD00A59C + 9C00000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000087BAD001884B50063BDDE008CE7FF0073E7FF0052DE + FF0039DEFF0021D6FF0018D6FF0029D6FF0042DEFF005AE7FF006BE7FF0084EF + FF009CEFFF009CF7FF007BE7F70031A5CE00087BAD0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000C6948400F7F7F700FFFFFF00F7F7F700F7EF + EF00F7EFE700F7EFE700F7E7DE00DED6D600426BF7004A6BEF009CA5DE00F7DE + C600F7DEBD00F7DEBD00F7D6B500F7D6AD00EFCEA500B58C7B00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFDED600F7CEBD00F7CEBD00DEAD + 8C0000000000D6B5AD00FFFFFF00FFF7EF00FFEFE700F7E7D600F7E7CE00F7E7 + C600F7DEC600F7DEBD00F7D6AD00F7D6A500F7D6A500B5848400000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000007308004A8C52002184290018AD310029BD420031C65200298C2900B5D6 + B500BDD6AD00B5D69C00DEEFBD008C8C8400737373002121290052524A005252 + 4A00635A4A00EFBD8400BDADB500738CEF00847B7300E7BDBD00BDADAD00A59C + 9C00000000000000000000000000000000000000000000000000000000000000 + 000000000000087BAD0042A5C600ADE7F700CEFFFF00ADF7FF008CE7FF006BE7 + FF0052DEFF0039DEFF0021D6FF0018D6FF0029D6FF0042DEFF005AE7FF0073E7 + FF008CE7FF009CEFFF0094EFFF0084EFFF0052C6E700087BAD00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000C69C8400F7F7F700FFFFFF00FFFFFF00FFFF + FF00FFF7F700FFF7EF00F7EFE700F7EFE700F7E7DE0094A5EF00637BEF00F7E7 + CE00F7DEC600F7DEBD00F7DEBD00F7D6B500F7D6AD00B58C7B00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFDED600F7CEBD008C6B5200DEAD + 8C0000000000D6BDB500FFFFFF00FFF7F700FFF7EF00FFEFDE00F7E7D600F7E7 + CE00F7E7C600F7DEC600F7DEBD00F7D6B500F7D6AD00B5848400000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00009C9C9C00ADADAD0073AD7300109C180021B5390021B5390042944200FFFF + FF00FFFFFF00FFFFE700FFFFD600E7E7C600ADAD9400424242006B6B6300FFF7 + CE00FFDEAD00EFBD8400F7DEB500FFF7DE00847B6B00E7C6C600B5A5A500A59C + 9C00000000000000000000000000000000000000000000000000000000000000 + 0000107BAD008CCEE700DEFFFF00DEFFFF00D6FFFF00CEFFFF00B5F7FF009CEF + FF0084EFFF0063E7FF0039DEFF0018D6FF0018D6FF0031DEFF004ADEFF0063E7 + FF0073E7FF0094EFFF009CEFFF008CEFFF0084EFFF0063E7FF00087BAD000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000C69C8400F7F7F700FFFFFF00848484008484 + 840084848400848484008484840084848400F7EFE700F7EFDE00F7E7D600F7E7 + CE00F7E7CE00F7DEC600F7DEBD00F7DEBD00DEC6A5009C847B00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFDED600F7CEBD00F7CEBD00DEAD + 8C0000000000D6BDB500FFFFFF00FFFFFF00FFF7F700FFF7EF00FFEFE700F7E7 + D600F7E7CE00F7DEC600F7DEBD00F7DEB500F7DEB500B5848400000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00009C9C9C009C9C9C00B5D6B500088C100010AD210018AD3100298C3100F7FF + F700FFFFFF00FFFFFF00FFFFE700FFFFDE00FFFFDE00D6D6BD00424242006B6B + 6300F7DEB500F7CE9C00FFEFD600D6D6BD008C7B7B00EFC6C600A59C9C00A59C + 9C00000000000000000000000000000000000000000000000000000000000000 + 000000000000087BAD00087BAD00087BAD00087BAD00087BAD00087BAD00087B + AD00087BAD0073BDDE0073E7FF0029D6FF0018D6FF0018D6FF0021ADD600087B + AD00087BAD00087BAD00087BAD00087BAD00087BAD00087BAD00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000CE9C8C00FFF7F700FFFFFF00080808008C8C + 8C00ADB5B500848CAD005A637B0042424200F7EFE700F7EFE700F7EFDE00F7E7 + D600F7E7CE00F7E7CE00EFD6BD00CEBDAD00B5AD94009C847B00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFDED600F7CEBD00F7CEBD00DEAD + 8C0000000000DEBDB500FFFFFF00FFFFFF00FFFFFF00FFF7F700FFEFE700FFEF + DE00F7E7D600F7E7CE00F7DEC600F7DEC600F7D6B500B5848400000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000094949400D6D6D600298C2900109C180010AD2100108C1800ADCE + AD00FFFFFF00FFFFFF00FFFFFF00FFFFF700FFFFDE00FFFFDE00E7E7C6004A4A + 4200524A4200E7CEAD00FFFFE700A5A58C00B59C9C00E7C6C600A59C9C000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000087BAD008CE7FF004ADEFF0031DEFF0018CEFF000884B5000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000CEA58C00FFF7F700FFFFFF0018181800EFEF + EF00CED6F700295AFF00526BBD005A5A5A00F7F7EF00F7EFE700F7EFE700F7EF + DE00F7EFDE00E7DECE00CEBDAD00BDB5A500B5AD9C009C847B00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFDED600F7CEBD008C6B5200DEAD + 8C0000000000DEC6B500FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFF7F700FFEF + E700FFEFDE00FFEFDE00FFEFD600E7DEC600C6BDAD00B5848400000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000094949400B5ADAD0084B58400088C100010AD2100109C1800298C + 3100E7EFDE00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFEF00FFFFEF00E7E7 + C60052525200BDBDB500E7E7C6008C848400EFC6C600B5A5A500A59C9C000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000087BAD009CE7FF0063E7FF004ADEFF0029CEF700087BAD000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000D6A58C00FFF7F700FFFFFF00292929007B94 + DE003163FF00849CFF001039E7004A4A5200FFF7F700FFF7EF00FFF7E700EFDE + D600B5847300AD847300AD7B7300AD7B7300AD7B7300AD847300000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFDED600F7CEBD00F7CEBD00DEAD + 8C0000000000E7C6B500FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFF7 + EF00FFF7EF00F7E7D600C6A59400B5948C00B58C8400B5848400000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000094949400CECECE0042944A000894180010AD2100109C + 1800218C29007BB57B00CEE7CE00F7FFF700FFFFFF00FFFFFF00FFFFFF00FFFF + EF00FFF7DE00E7EFC60094948C00CEB5B500DEC6C600948C8C00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000087BAD009CDEF70084EFFF0063E7FF0039C6E700087BAD000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000DEAD8C00FFF7F700FFFFFF00181818009CA5 + C600CED6EF00FFFFFF004A6BE700314AC600FFFFF700FFF7F700FFF7EF00E7CE + C600B5847300E7B58400E7AD6B00EFA55200EFA53900B5848400000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFDED600F7CEBD00F7CEBD00DEAD + 8C0000000000E7C6B500FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFF700E7CECE00BD8C7300EFB57300EFA54A00C6846B00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000949494009C9C9C00D6DED600398C4200088C1000109C + 180008A51800089418000884100018842100218431004A9C4A00FFFFFF00FFFF + EF00E7E7C600A59C9400C6ADAD00E7C6C600A59C9C0094949400000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000087BAD009CD6E7009CEFFF007BEFFF0039B5DE00087BAD000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000DEAD8C00FFF7F700FFFFFF00292929004242 + 42004242420042424200313952001039E7009CB5FF00FFFFFF00FFFFF700E7CE + C600B5847300EFC68C00F7BD6B00FFB55200B584840000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFDED600F7CEBD008C6B5200DEAD + 8C0000000000EFCEBD00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00E7D6CE00C6947B00FFC67300CE94730000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000094949400A5A5A500D6DED6007BAD8400398C + 390018842100108C1800188C2900298C31004294520094BD8C00E7EFDE00C6C6 + B500A59C9C00CEBDBD00E7C6C600AD9C9C009494940000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000087BAD00087BAD00C6F7FF0094EFFF00087BAD00087BAD000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000DEAD8C00FFF7F700FFFFFF00EFEFEF00EFEF + EF00EFEFEF00EFEFEF00EFEFEF00CED6EF003163FF006B8CFF00C6CEFF00E7D6 + CE00B5847300EFC68C00F7BD6B00B58484000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFDED600F7CEBD00F7CEBD00DEAD + 8C0000000000E7C6B500FFF7F700FFF7EF00FFF7EF00FFF7EF00FFF7EF00FFF7 + EF00FFF7EF00E7CECE00C6947B00CE9C84000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000949494009C9C9C00CECECE00E7E7 + E700CECECE00BDBDB500BDB5AD00CEBDAD00CEBDAD00BDB5AD00B5ADAD00C6B5 + B500DEC6C600D6BDBD00A59C9C00949494000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000087BAD00DEFFFF00ADF7FF00087BAD00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000DEAD8C00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EFEFFF006B8CFF00426BFF00E7D6 + D600B5847300EFC68C00B5848400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000E7C6AD00E7C6AD00E7C6AD00DEAD + 8C0000000000E7C6B500EFCEB500EFCEB500EFCEB500EFCEB500E7C6B500E7C6 + B500EFCEB500D6BDB500BD847B00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000009494940094949400A5A5 + A500C6C6C600D6D6D600CECECE00C6C6C600C6C6C600C6C6C600CEC6C600C6BD + BD00A5A5A5009494940094949400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000087BAD00F7FFFF00C6F7FF00087BAD00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000DEAD8C00E7CEBD00EFD6BD00EFD6BD00EFCE + C600E7CEBD00E7CEBD00E7CEBD00E7CEBD00DEC6BD00DEC6BD00DEC6BD00CEAD + A500B5847300B584840000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000009494 + 940094949400949494009C9C9C00A5A5A500A5A5A500A59C9C00949494009494 + 9400949494000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000087BAD009CCEE70073BDDE00087BAD00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000DEA58400D6A58400D6A58400D6A58400D6A5 + 8400D69C7B00CE9C7B00CE947B00C6947B00C6947B00C68C7B00BD8C7300B584 + 7300B58484000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000948C8C00948C8C00948C8C00948C8C00948C8C00948C8C000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000087BAD00087BAD0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000080000000400000000100010000000000000400000000000000000000 + 000000000000000000000000FFFFFF00FFFFFFFF000000000000000000000000 + FFFFFFFF000000000000000000000000FFFFFFFF000000000000000000000000 + FFFFFFFF000000000000000000000000FFFFFFFF000000000000000000000000 + F800001F000000000000000000000000F800001F000000000000000000000000 + F800001F000000000000000000000000F800001F000000000000000000000000 + F800001F000000000000000000000000FFFFFFFF000000000000000000000000 + FE0003FF000000000000000000000000FE0007FF000000000000000000000000 + FE000FFF000000000000000000000000FE001FFF000000000000000000000000 + FE103FFF000000000000000000000000FE001FFF000000000000000000000000 + FE000FFF000000000000000000000000FE0007FF000000000000000000000000 + FE0303FF000000000000000000000000FE0781FF000000000000000000000000 + FE0FC0FF000000000000000000000000FE1FE07F000000000000000000000000 + FE3FF03F000000000000000000000000FE7FF81F000000000000000000000000 + FEFFFC3F000000000000000000000000FFFFFE7F000000000000000000000000 + FFFFFFFF000000000000000000000000FFFFFFFF000000000000000000000000 + FFFFFFFF000000000000000000000000FFFFFFFF000000000000000000000000 + FFFFFFFF000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00003FFFFFFFFFFFF81FFFFF9FF9FF + FE00003FFFF0003FFFE007FFFF0FF0FFFE00003FFFF0003FFF8001FFFF07E0FF + FE00003FFFF0003FFF0000FFFF03C0FFFE00003FFFF0003FFE00007FFF8181FF + FE00003FFF0FFFFFFC00003FFF8001FFFE00003FFF08003FFC00003FFFC003FF + FE00003FFF08003FF800001FFFC003FFFE00003FFF08003FF800001FFFE007FF + FE00003FFF08003FF000000FFF8003FFFE00003FFF08003FF000000FFF0001FF + FE00003FFF08003FF000000FFC00007FFE00003FFF08003FF000000FF800003F + FE00003FFF08003FF000000FF000001FFE00003FFF08003FF000000FF800003F + FE00003FFF08003FF800001FFFF81FFFFE00003FFF08003FF800001FFFF81FFF + FE00003FFF08003FFC00003FFFF81FFFFE00003FFF08003FFC00003FFFF81FFF + FE00007FFF08007FFE00007FFFF81FFFFE0000FFFF0800FFFF0000FFFFFC3FFF + FE0001FFFF0801FFFF8001FFFFFC3FFFFE0003FFFFFFFFFFFFE007FFFFFC3FFF + FE0007FFFFFFFFFFFFF81FFFFFFE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 + 000000000000} + end +end diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/Unit2.pas b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/Unit2.pas new file mode 100644 index 0000000..cabfa6a --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/Unit2.pas @@ -0,0 +1,78 @@ +unit Unit2; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, ImgList, ExtCtrls, + { gettext } + gnugettext, + { TB2K } + TB2Item, TB2Dock, TB2Toolbar, SpTBXItem, SpTBXControls, SpTBXDkPanels; + +type + TForm2 = class(TForm) + SpTBXDock1: TSpTBXDock; + SpTBXToolbar1: TSpTBXToolbar; + SpTBXButton1: TSpTBXButton; + SpTBXButton2: TSpTBXButton; + SpTBXButton3: TSpTBXButton; + ImageList1: TImageList; + tProperties: TSpTBXItem; + tPageSetup: TSpTBXItem; + tHistory: TSpTBXItem; + tFavorites: TSpTBXItem; + tCustomize: TSpTBXItem; + ClientPanel: TPanel; + LeftPanel: TPanel; + ButtonsPanel: TPanel; + TitlePanel: TSpTBXLabel; + procedure SideBarClick(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure ButtonClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + Form2: TForm2; + +implementation + +uses + Unit1; + +{$R *.dfm} + +procedure TForm2.ButtonClick(Sender: TObject); +begin + Close; +end; + +procedure TForm2.SideBarClick(Sender: TObject); +var + Item: TSpTBXItem; +begin + if Sender is TSpTBXItem then begin + Item := Sender as TSpTBXItem; + Item.Checked := True; + TitlePanel.Caption := Item.Caption; + ClientPanel.Visible := Item = tCustomize; + end; +end; + +procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); +begin + // We need to close the customizer form manually here + Form1.SpTBXCustomizer1.Close; +end; + +procedure TForm2.FormCreate(Sender: TObject); +begin + gnugettext.TranslateComponent(Self); +end; + +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/advanced.txt b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/advanced.txt new file mode 100644 index 0000000..bed4456 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/advanced.txt @@ -0,0 +1,55 @@ + +Advanced Techniques: + +1) How can I embed the customizer? + +You can embed the customizer to another control, but the form of this control cannot be modal or the drag & drop will not work. +You also need to close the customizer explicitly by calling the Close method. + +SpTBXCustomizer1.ShowEmbedded(Panel1); + +2) How can I store more options related to the items customizations? + +To load and store your custom data use the OnLoad and OnSave events: + +procedure TForm1.SpTBXCustomizer1Save(Sender: TObject; + LayoutName: String; ExtraOptions: TStringList); +begin + // Save the Form's font size + ExtraOptions.Values['FontSize'] := IntToStr(Font.Size); +end; + +procedure TForm1.SpTBXCustomizer1Load(Sender: +TObject; LayoutName: String; ExtraOptions: TStringList); +var + S: string; +begin + // Restore the Form's font size + S := ExtraOptions.Values['FontSize']; + if S <> '' then + Font.Size := StrToInt(S); +end; + +3) How can I store more options related to a specific layout? + +The layout is just the position and visibility of the toolbars and dockable panels, but you can store more options related to a layout. +To load and store your custom data use the OnLayoutLoad and OnLayoutSave events: + +procedure TForm1.SpTBXCustomizer1LayoutSave(Sender: +TObject; + LayoutName: String; ExtraOptions: TStringList); +begin + // Save the Form's WindowState + ExtraOptions.Values['MyOption'] := IntToStr(Ord(WindowState)); +end; + +procedure TForm1.SpTBXCustomizer1LayoutLoad(Sender: +TObject; LayoutName: String; ExtraOptions: TStringList); +var + S: string; +begin + // Restore the Form's WindowState + S := ExtraOptions.Values['MyOption']; + if S <> '' then + WindowState := TWindowState(StrToInt(S)); +end; \ No newline at end of file diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/faq.txt b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/faq.txt new file mode 100644 index 0000000..d6adc52 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/faq.txt @@ -0,0 +1,33 @@ + +TSpTBXCustomizer FAQ: + +1) What is it? + +TSpTBXCustomizer is a SpTBXLib toolbar customization component. +It allows you to save the toolbars and dockable panels layout and customize the toolbars items. + +2) How do I start using it? + +Double click the TSpTBXCustomizer or use the Items property to add your custom commands. +Use the ImageList property to hook the images to the commands, and the Menubar property to fill the shortcuts list. +To show the customizer at runtime use the Show method. + +3) How do I load and save the items customizations? + +You can load and save to the Registry or to an Ini file, call the Load method from the Form.OnShow event, and the Save method from the Form.OnDestroy event: + +SpTBXCustomizer1.Load('C:\Options.ini'); + +SpTBXCustomizer1.Save('C:\Options.ini'); + +SpTBXCustomizer1.Load(HKEY_CURRENT_USER, +'Software\Silverpointdev\CustomizerDemo'); + +SpTBXCustomizer1.Save(HKEY_CURRENT_USER, +'Software\Silverpointdev\CustomizerDemo'); + +4) How do I load a specific layout? + +Once the toolbar layouts are loaded you can access the available layouts through the Layouts property. +To load a specific layout use the LoadLayout method. +To save the current layout use the SaveLayout method. \ No newline at end of file diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/gnugettext.pas b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/gnugettext.pas new file mode 100644 index 0000000..2a86dbc --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/gnugettext.pas @@ -0,0 +1,3067 @@ +{*------------------------------------------------------------------------------ + GNU gettext translation system for Delphi, Kylix, C++ Builder and others. + All parts of the translation system are kept in this unit. + + @author Lars B. Dybdahl and others + @version $LastChangedRevision$ + @see http://dybdahl.dk/dxgettext/ +-------------------------------------------------------------------------------} +unit gnugettext; +(**************************************************************) +(* *) +(* (C) Copyright by Lars B. Dybdahl and others *) +(* E-mail: Lars@dybdahl.dk, phone +45 70201241 *) +(* *) +(* Contributors: Peter Thornqvist, Troy Wolbrink, *) +(* Frank Andreas de Groot, Igor Siticov, *) +(* Jacques Garcia Vazquez, Igor Gitman *) +(* *) +(* See http://dybdahl.dk/dxgettext/ for more information *) +(* *) +(**************************************************************) + +// Information about this file: +// $LastChangedDate$ +// $LastChangedRevision$ +// $HeadURL$ + +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// The names of any contributor may not be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +interface + +// If the conditional define DXGETTEXTDEBUG is defined, debugging log is activated. +// Use DefaultInstance.DebugLogToFile() to write the log to a file. +{ $define DXGETTEXTDEBUG} + +{$ifdef VER100} + // Delphi 3 + {$DEFINE DELPHI5OROLDER} + {$DEFINE DELPHI6OROLDER} + {$DEFINE DELPHI2007OROLDER} +{$endif} +{$ifdef VER110} + // C++ Builder 3 + {$DEFINE DELPHI5OROLDER} + {$DEFINE DELPHI6OROLDER} + {$DEFINE DELPHI2007OROLDER} +{$endif} +{$ifdef VER120} + // Delphi 4 + {$DEFINE DELPHI5OROLDER} + {$DEFINE DELPHI6OROLDER} + {$DEFINE DELPHI2007OROLDER} +{$endif} +{$ifdef VER125} + // C++ Builder 4 + {$DEFINE DELPHI5OROLDER} + {$DEFINE DELPHI6OROLDER} + {$DEFINE DELPHI2007OROLDER} +{$endif} +{$ifdef VER130} + // Delphi 5 + {$DEFINE DELPHI5OROLDER} + {$DEFINE DELPHI6OROLDER} + {$DEFINE DELPHI2007OROLDER} + {$ifdef WIN32} + {$DEFINE MSWINDOWS} + {$endif} +{$endif} +{$ifdef VER135} + // C++ Builder 5 + {$DEFINE DELPHI5OROLDER} + {$DEFINE DELPHI6OROLDER} + {$DEFINE DELPHI2007OROLDER} + {$ifdef WIN32} + {$DEFINE MSWINDOWS} + {$endif} +{$endif} +{$ifdef VER140} + // Delphi 6 + {$DEFINE DELPHI2007OROLDER} +{$ifdef MSWINDOWS} + {$DEFINE DELPHI6OROLDER} +{$endif} +{$endif} +{$ifdef VER150} + // Delphi 7 + {$DEFINE DELPHI2007OROLDER} +{$endif} +{$ifdef VER160} + // Delphi 8 + {$DEFINE DELPHI2007OROLDER} +{$endif} +{$ifdef VER170} + // Delphi 2005 + {$DEFINE DELPHI2007OROLDER} +{$endif} +{$ifdef VER180} + // Delphi 2006 + {$DEFINE DELPHI2007OROLDER} +{$endif} +{$ifdef VER190} + // Delphi 2007 + {$DEFINE DELPHI2007OROLDER} +{$endif} +{$ifdef VER200} + // Delphi 2009 with Unicode +{$endif} + +uses +{$ifdef DELPHI5OROLDER} + gnugettextD5, +{$endif} +{$ifdef MSWINDOWS} + Windows, +{$else} + Libc, +{$ifdef FPC} + CWString, +{$endif} +{$endif} + Classes, StrUtils, SysUtils, TypInfo; + +(*****************************************************************************) +(* *) +(* MAIN API *) +(* *) +(*****************************************************************************) + +type + {$IFNDEF UNICODE} + UnicodeString=WideString; + RawUtf8String=AnsiString; + {$ELSE} + RawUtf8String=RawByteString; + {$ENDIF} + DomainString=string; + LanguageString=string; + ComponentNameString=string; + FilenameString=string; + MsgIdString=UnicodeString; + TranslatedUnicodeString=UnicodeString; + +// Main GNU gettext functions. See documentation for instructions on how to use them. +function _(const szMsgId: MsgIdString): TranslatedUnicodeString; +function gettext(const szMsgId: MsgIdString): TranslatedUnicodeString; +function dgettext(const szDomain: DomainString; const szMsgId: MsgIdString): TranslatedUnicodeString; +function dngettext(const szDomain: DomainString; const singular,plural: MsgIdString; Number:longint): TranslatedUnicodeString; +function ngettext(const singular,plural: MsgIdString; Number:longint): TranslatedUnicodeString; +procedure textdomain(const szDomain: DomainString); +function getcurrenttextdomain: DomainString; +procedure bindtextdomain(const szDomain: DomainString; const szDirectory: FilenameString); + +// Set language to use +procedure UseLanguage(LanguageCode: LanguageString); +function GetCurrentLanguage:LanguageString; + +// Translates a component (form, frame etc.) to the currently selected language. +// Put TranslateComponent(self) in the OnCreate event of all your forms. +// See the manual for documentation on these functions +type + TTranslator=procedure (obj:TObject) of object; + +procedure TP_Ignore(AnObject:TObject; const name:ComponentNameString); +procedure TP_IgnoreClass (IgnClass:TClass); +procedure TP_IgnoreClassProperty (IgnClass:TClass;const propertyname:ComponentNameString); +procedure TP_GlobalIgnoreClass (IgnClass:TClass); +procedure TP_GlobalIgnoreClassProperty (IgnClass:TClass;const propertyname:ComponentNameString); +procedure TP_GlobalHandleClass (HClass:TClass;Handler:TTranslator); +procedure TranslateComponent(AnObject: TComponent; const TextDomain:DomainString=''); +procedure RetranslateComponent(AnObject: TComponent; const TextDomain:DomainString=''); + +// Add more domains that resourcestrings can be extracted from. If a translation +// is not found in the default domain, this domain will be searched, too. +// This is useful for adding mo files for certain runtime libraries and 3rd +// party component libraries +procedure AddDomainForResourceString (const domain:DomainString); +procedure RemoveDomainForResourceString (const domain:DomainString); + +// Unicode-enabled way to get resourcestrings, automatically translated +// Use like this: ws:=LoadResStringW(@NameOfResourceString); +function LoadResString(ResStringRec: PResStringRec): widestring; +function LoadResStringW(ResStringRec: PResStringRec): UnicodeString; + +// This returns an empty string if not translated or translator name is not specified. +function GetTranslatorNameAndEmail:TranslatedUnicodeString; + + +(*****************************************************************************) +(* *) +(* ADVANCED FUNCTIONALITY *) +(* *) +(*****************************************************************************) + +const + DefaultTextDomain = 'default'; + +var + ExecutableFilename:FilenameString; // This is set to paramstr(0) or the name of the DLL you are creating. + +const + PreferExternal=false; // Set to true, to prefer external *.mo over embedded translation + +const + // Subversion source code version control version information + VCSVersion='$LastChangedRevision$'; + +type + EGnuGettext=class(Exception); + EGGProgrammingError=class(EGnuGettext); + EGGComponentError=class(EGnuGettext); + EGGIOError=class(EGnuGettext); + EGGAnsi2WideConvError=class(EGnuGettext); + +// This function will turn resourcestring hooks on or off, eventually with BPL file support. +// Please do not activate BPL file support when the package is in design mode. +const AutoCreateHooks=true; +procedure HookIntoResourceStrings (enabled:boolean=true; SupportPackages:boolean=false); + + + + +(*****************************************************************************) +(* *) +(* CLASS based implementation. *) +(* Use TGnuGettextInstance to have more than one language *) +(* in your application at the same time *) +(* *) +(*****************************************************************************) + +{$ifdef MSWINDOWS} +{$ifndef DELPHI6OROLDER} +{$WARN UNSAFE_TYPE OFF} +{$WARN UNSAFE_CODE OFF} +{$WARN UNSAFE_CAST OFF} +{$endif} +{$endif} + +type + TOnDebugLine = Procedure (Sender: TObject; const Line: String; var Discard: Boolean) of Object; // Set Discard to false if output should still go to ordinary debug log + TGetPluralForm=function (Number:Longint):Integer; + TDebugLogger=procedure (line: ansistring) of object; + +{*------------------------------------------------------------------------------ + Handles .mo files, in separate files or inside the exe file. + Don't use this class. It's for internal use. +-------------------------------------------------------------------------------} + TMoFile= + class /// Threadsafe. Only constructor and destructor are writing to memory + private + doswap: boolean; + public + Users:Integer; /// Reference count. If it reaches zero, this object should be destroyed. + constructor Create (filename:FilenameString;Offset,Size:int64); + destructor Destroy; override; + function gettext(const msgid: RawUtf8String;var found:boolean): RawUtf8String; // uses mo file and utf-8 + property isSwappedArchitecture:boolean read doswap; + private + N, O, T: Cardinal; /// Values defined at http://www.linuxselfhelp.com/gnu/gettext/html_chapter/gettext_6.html + startindex,startstep:integer; + {$ifdef mswindows} + mo: THandle; + momapping: THandle; + {$endif} + momemoryHandle:PAnsiChar; + momemory: PAnsiChar; + function autoswap32(i: cardinal): cardinal; + function CardinalInMem(baseptr: PAnsiChar; Offset: Cardinal): Cardinal; + end; + +{*------------------------------------------------------------------------------ + Handles all issues regarding a specific domain. + Don't use this class. It's for internal use. +-------------------------------------------------------------------------------} + TDomain= + class + private + Enabled:boolean; + vDirectory: FilenameString; + procedure setDirectory(const dir: FilenameString); + public + DebugLogger:TDebugLogger; + Domain: DomainString; + property Directory: FilenameString read vDirectory write setDirectory; + constructor Create; + destructor Destroy; override; + // Set parameters + procedure SetLanguageCode (const langcode:LanguageString); + procedure SetFilename (const filename:FilenameString); // Bind this domain to a specific file + // Get information + procedure GetListOfLanguages(list:TStrings); + function GetTranslationProperty(Propertyname: ComponentNameString): TranslatedUnicodeString; + function gettext(const msgid: RawUtf8String): RawUtf8String; // uses mo file and utf-8 + private + mofile:TMoFile; + SpecificFilename:FilenameString; + curlang: LanguageString; + OpenHasFailedBefore: boolean; + procedure OpenMoFile; + procedure CloseMoFile; + end; + +{*------------------------------------------------------------------------------ + Helper class for invoking events. +-------------------------------------------------------------------------------} + TExecutable= + class + procedure Execute; virtual; abstract; + end; + +{*------------------------------------------------------------------------------ + The main translation engine. +-------------------------------------------------------------------------------} + TGnuGettextInstance= + class + private + fOnDebugLine:TOnDebugLine; + CreatorThread:Cardinal; /// Only this thread can use LoadResString + public + Enabled:Boolean; /// Set this to false to disable translations + DesignTimeCodePage:Integer; /// See MultiByteToWideChar() in Win32 API for documentation + constructor Create; + destructor Destroy; override; + procedure UseLanguage(LanguageCode: LanguageString); + procedure GetListOfLanguages (const domain:DomainString; list:TStrings); // Puts list of language codes, for which there are translations in the specified domain, into list + {$ifdef DELPHI5OROLDER} + function gettext(const szMsgId: MsgIdString): TranslatedUnicodeString; virtual; + function ngettext(const singular,plural:MsgIdString;Number:longint):TranslatedUnicodeString; virtual; + {$endif} + {$ifndef DELPHI5OROLDER} + {$ifndef UNICODE} + function gettext(const szMsgId: ansistring): TranslatedUnicodeString; overload; virtual; + function ngettext(const singular,plural:ansistring;Number:longint):TranslatedUnicodeString; overload; virtual; + {$endif} + function gettext(const szMsgId: MsgIdString): TranslatedUnicodeString; overload; virtual; + function ngettext(const singular,plural:MsgIdString;Number:longint):TranslatedUnicodeString; overload; virtual; + {$endif} + function GetCurrentLanguage:LanguageString; + function GetTranslationProperty (const Propertyname:ComponentNameString):TranslatedUnicodeString; + function GetTranslatorNameAndEmail:TranslatedUnicodeString; + + // Form translation tools, these are not threadsafe. All TP_ procs must be called just before TranslateProperites() + procedure TP_Ignore(AnObject:TObject; const name:ComponentNameString); + procedure TP_IgnoreClass (IgnClass:TClass); + procedure TP_IgnoreClassProperty (IgnClass:TClass;propertyname:ComponentNameString); + procedure TP_GlobalIgnoreClass (IgnClass:TClass); + procedure TP_GlobalIgnoreClassProperty (IgnClass:TClass;propertyname:ComponentNameString); + procedure TP_GlobalHandleClass (HClass:TClass;Handler:TTranslator); + procedure TranslateProperties(AnObject: TObject; textdomain:DomainString=''); + procedure TranslateComponent(AnObject: TComponent; const TextDomain:DomainString=''); + procedure RetranslateComponent(AnObject: TComponent; const TextDomain:DomainString=''); + + // Multi-domain functions + {$ifdef DELPHI5OROLDER} + function dgettext(const szDomain: DomainString; const szMsgId: MsgIdString): TranslatedUnicodeString; virtual; + function dngettext(const szDomain: DomainString; const singular,plural:MsgIdString;Number:longint):TranslatedUnicodeString; virtual; + {$endif} + {$ifndef DELPHI5OROLDER} + {$ifndef UNICODE} + function dgettext(const szDomain: DomainString; const szMsgId: ansistring): TranslatedUnicodeString; overload; virtual; + function dngettext(const szDomain: DomainString; const singular,plural:ansistring;Number:longint):TranslatedUnicodeString; overload; virtual; + {$endif} + function dgettext(const szDomain: DomainString; const szMsgId: MsgIdString): TranslatedUnicodeString; overload; virtual; + function dngettext(const szDomain: DomainString; const singular,plural:MsgIdString;Number:longint):TranslatedUnicodeString; overload; virtual; + {$endif} + procedure textdomain(const szDomain: DomainString); + function getcurrenttextdomain: DomainString; + procedure bindtextdomain(const szDomain: DomainString; const szDirectory: FilenameString); + procedure bindtextdomainToFile (const szDomain: DomainString; const filename: FilenameString); // Also works with files embedded in exe file + + // Windows API functions + function LoadResString(ResStringRec: PResStringRec): UnicodeString; + + // Output all log info to this file. This may only be called once. + procedure DebugLogToFile (const filename:FilenameString; append:boolean=false); + procedure DebugLogPause (PauseEnabled:boolean); + property OnDebugLine: TOnDebugLine read fOnDebugLine write fOnDebugLine; // If set, all debug output goes here + {$ifndef UNICODE} + // Conversion according to design-time character set + function ansi2wideDTCP (const s:AnsiString):MsgIdString; // Convert using Design Time Code Page + {$endif} + protected + procedure TranslateStrings (sl:TStrings;const TextDomain:DomainString); + + // Override these three, if you want to inherited from this class + // to create a new class that handles other domain and language dependent + // issues + procedure WhenNewLanguage (const LanguageID:LanguageString); virtual; // Override to know when language changes + procedure WhenNewDomain (const TextDomain:DomainString); virtual; // Override to know when text domain changes. Directory is purely informational + procedure WhenNewDomainDirectory (const TextDomain:DomainString;const Directory:FilenameString); virtual; // Override to know when any text domain's directory changes. It won't be called if a domain is fixed to a specific file. + private + curlang: LanguageString; + curGetPluralForm:TGetPluralForm; + curmsgdomain: DomainString; + savefileCS: TMultiReadExclusiveWriteSynchronizer; + savefile: TextFile; + savememory: TStringList; + DefaultDomainDirectory:FilenameString; + domainlist: TStringList; /// List of domain names. Objects are TDomain. + TP_IgnoreList:TStringList; /// Temporary list, reset each time TranslateProperties is called + TP_ClassHandling:TList; /// Items are TClassMode. If a is derived from b, a comes first + TP_GlobalClassHandling:TList; /// Items are TClassMode. If a is derived from b, a comes first + TP_Retranslator:TExecutable; /// Cast this to TTP_Retranslator + {$ifdef DXGETTEXTDEBUG} + DebugLogCS:TMultiReadExclusiveWriteSynchronizer; + DebugLog:TStream; + DebugLogOutputPaused:Boolean; + {$endif} + function TP_CreateRetranslator:TExecutable; // Must be freed by caller! + procedure FreeTP_ClassHandlingItems; + {$ifdef DXGETTEXTDEBUG} + procedure DebugWriteln(line: ansistring); + {$endif} + procedure TranslateProperty(AnObject: TObject; PropInfo: PPropInfo; + TodoList: TStrings; const TextDomain:DomainString); + function Getdomain(const domain:DomainString; const DefaultDomainDirectory:FilenameString; const CurLang: LanguageString): TDomain; // Translates a single property of an object + end; + +const + LOCALE_SISO639LANGNAME = $59; // Used by Lazarus software development tool + LOCALE_SISO3166CTRYNAME = $5A; // Used by Lazarus software development tool + +var + DefaultInstance:TGnuGettextInstance; /// Default instance of the main API for singlethreaded applications. + +implementation + +{$ifndef MSWINDOWS} +{$ifndef LINUX} + 'This version of gnugettext.pas is only meant to be compiled with Kylix 3,' + 'Delphi 6, Delphi 7 and later versions. If you use other versions, please' + 'get the gnugettext.pas version from the Delphi 5 directory.' +{$endif} +{$endif} + +(**************************************************************************) +// Some comments on the implementation: +// This unit should be independent of other units where possible. +// It should have a small footprint in any way. +(**************************************************************************) +// TMultiReadExclusiveWriteSynchronizer is used instead of TCriticalSection +// because it makes this unit independent of the SyncObjs unit +(**************************************************************************) + +{$B-,R+,I+,Q+} +{$ifdef DELPHI5OROLDER} +uses + FileCtrl; +{$endif} + +type + TTP_RetranslatorItem= + class + obj:TObject; + Propname:ComponentNameString; + OldValue:TranslatedUnicodeString; + end; + TTP_Retranslator= + class (TExecutable) + TextDomain:DomainString; + Instance:TGnuGettextInstance; + constructor Create; + destructor Destroy; override; + procedure Remember (obj:TObject; PropName:ComponentNameString; OldValue:TranslatedUnicodeString); + procedure Execute; override; + private + list:TList; + end; + TEmbeddedFileInfo= + class + offset,size:int64; + end; + TFileLocator= + class // This class finds files even when embedded inside executable + constructor Create; + destructor Destroy; override; + procedure Analyze; // List files embedded inside executable + function FileExists (filename:FilenameString):boolean; + function GetMoFile (filename:FilenameString;DebugLogger:TDebugLogger):TMoFile; + procedure ReleaseMoFile (mofile:TMoFile); + private + basedirectory:FilenameString; + filelist:TStringList; //Objects are TEmbeddedFileInfo. Filenames are relative to .exe file + MoFilesCS:TMultiReadExclusiveWriteSynchronizer; + MoFiles:TStringList; // Objects are filenames+offset, objects are TMoFile + function ReadInt64 (str:TStream):int64; + end; + TGnuGettextComponentMarker= + class (TComponent) + public + LastLanguage:LanguageString; + Retranslator:TExecutable; + destructor Destroy; override; + end; + TClassMode= + class + HClass:TClass; + SpecialHandler:TTranslator; + PropertiesToIgnore:TStringList; // This is ignored if Handler is set + constructor Create; + destructor Destroy; override; + end; + TRStrinfo = record + strlength, stroffset: cardinal; + end; + TStrInfoArr = array[0..10000000] of TRStrinfo; + PStrInfoArr = ^TStrInfoArr; + TCharArray5=array[0..4] of ansichar; + THook= // Replaces a runtime library procedure with a custom procedure + class + public + constructor Create (OldProcedure, NewProcedure: pointer; FollowJump:boolean=false); + destructor Destroy; override; // Restores unhooked state + procedure Reset (FollowJump:boolean=false); // Disables and picks up patch points again + procedure Disable; + procedure Enable; + private + oldproc,newproc:Pointer; + Patch:TCharArray5; + Original:TCharArray5; + PatchPosition:PAnsiChar; + procedure Shutdown; // Same as destroy, except that object is not destroyed + end; + +var + // System information + Win32PlatformIsUnicode:boolean=False; + + // Information about files embedded inside .exe file + FileLocator:TFileLocator; + + // Hooks into runtime library functions + ResourceStringDomainListCS:TMultiReadExclusiveWriteSynchronizer; + ResourceStringDomainList:TStringList; + HookLoadResString:THook; + HookLoadStr:THook; + HookFmtLoadStr:THook; + +function GGGetEnvironmentVariable(const Name:widestring):widestring; +var + Len: integer; + W : WideString; +begin + Result := ''; + SetLength(W,1); + Len := Windows.GetEnvironmentVariableW(PWideChar(Name), PWideChar(W), 1); + if Len > 0 then begin + SetLength(Result, Len - 1); + Windows.GetEnvironmentVariableW(PWideChar(Name), PWideChar(Result), Len); + end; +end; + +function StripCRRawMsgId (s:RawUtf8String):RawUtf8String; +var + i:integer; +begin + i:=1; + while i<=length(s) do begin + if s[i]=#13 then delete (s,i,1) else inc (i); + end; + Result:=s; +end; + +function EnsureLineBreakInTranslatedString (s:RawUtf8String):RawUtf8String; +{$ifdef MSWINDOWS} +var + i:integer; +{$endif} +begin + {$ifdef MSWINDOWS} + Assert (sLinebreak=ansistring(#13#10)); + i:=1; + while i<=length(s) do begin + if (s[i]=#10) and (MidStr(s,i-1,1)<>#13) then begin + insert (#13,s,i); + inc (i,2); + end else + inc (i); + end; + {$endif} + Result:=s; +end; + +function IsWriteProp(Info: PPropInfo): Boolean; +begin + Result := Assigned(Info) and (Info^.SetProc <> nil); +end; + +function ResourceStringGettext(MsgId: MsgIdString): TranslatedUnicodeString; +var + i:integer; +begin + if (MsgID='') or (ResourceStringDomainListCS=nil) then begin + // This only happens during very complicated program startups that fail, + // or when Msgid='' + Result:=MsgId; + exit; + end; + ResourceStringDomainListCS.BeginRead; + try + for i:=0 to ResourceStringDomainList.Count-1 do begin + Result:=dgettext(ResourceStringDomainList.Strings[i], MsgId); + if Result<>MsgId then + break; + end; + finally + ResourceStringDomainListCS.EndRead; + end; +end; + +function gettext(const szMsgId: MsgIdString): TranslatedUnicodeString; +begin + Result:=DefaultInstance.gettext(szMsgId); +end; + +{*------------------------------------------------------------------------------ + This is the main translation procedure used in programs. It takes a parameter, + looks it up in the translation dictionary, and returns the translation. + If no translation is found, the parameter is returned. + + @param szMsgId The text, that should be displayed if no translation is found. +-------------------------------------------------------------------------------} +function _(const szMsgId: MsgIdString): TranslatedUnicodeString; +begin + Result:=DefaultInstance.gettext(szMsgId); +end; + +{*------------------------------------------------------------------------------ + Translates a text, using a specified translation domain. + If no translation is found, the parameter is returned. + + @param szDomain Which translation domain that should be searched for a translation. + @param szMsgId The text, that should be displayed if no translation is found. +-------------------------------------------------------------------------------} +function dgettext(const szDomain: DomainString; const szMsgId: MsgIdString): TranslatedUnicodeString; +begin + Result:=DefaultInstance.dgettext(szDomain, szMsgId); +end; + +function dngettext(const szDomain: DomainString; const singular,plural: MsgIdString; Number:longint): TranslatedUnicodeString; +begin + Result:=DefaultInstance.dngettext(szDomain,singular,plural,Number); +end; + +function ngettext(const singular,plural: MsgIdString; Number:longint): TranslatedUnicodeString; +begin + Result:=DefaultInstance.ngettext(singular,plural,Number); +end; + +procedure textdomain(const szDomain: Domainstring); +begin + DefaultInstance.textdomain(szDomain); +end; + +procedure SetGettextEnabled (enabled:boolean); +begin + DefaultInstance.Enabled:=enabled; +end; + +function getcurrenttextdomain: DomainString; +begin + Result:=DefaultInstance.getcurrenttextdomain; +end; + +procedure bindtextdomain(const szDomain: DomainString; const szDirectory: FilenameString); +begin + DefaultInstance.bindtextdomain(szDomain, szDirectory); +end; + +procedure TP_Ignore(AnObject:TObject; const name:FilenameString); +begin + DefaultInstance.TP_Ignore(AnObject, name); +end; + +procedure TP_GlobalIgnoreClass (IgnClass:TClass); +begin + DefaultInstance.TP_GlobalIgnoreClass(IgnClass); +end; + +procedure TP_IgnoreClass (IgnClass:TClass); +begin + DefaultInstance.TP_IgnoreClass(IgnClass); +end; + +procedure TP_IgnoreClassProperty (IgnClass:TClass;const propertyname:ComponentNameString); +begin + DefaultInstance.TP_IgnoreClassProperty(IgnClass,propertyname); +end; + +procedure TP_GlobalIgnoreClassProperty (IgnClass:TClass;const propertyname:ComponentNameString); +begin + DefaultInstance.TP_GlobalIgnoreClassProperty(IgnClass,propertyname); +end; + +procedure TP_GlobalHandleClass (HClass:TClass;Handler:TTranslator); +begin + DefaultInstance.TP_GlobalHandleClass (HClass, Handler); +end; + +procedure TranslateComponent(AnObject: TComponent; const TextDomain:DomainString=''); +begin + DefaultInstance.TranslateComponent(AnObject, TextDomain); +end; + +procedure RetranslateComponent(AnObject: TComponent; const TextDomain:DomainString=''); +begin + DefaultInstance.RetranslateComponent(AnObject, TextDomain); +end; + +{$ifdef MSWINDOWS} + +// These constants are only used in Windows 95 +// Thanks to Frank Andreas de Groot for this table +const + IDAfrikaans = $0436; IDAlbanian = $041C; + IDArabicAlgeria = $1401; IDArabicBahrain = $3C01; + IDArabicEgypt = $0C01; IDArabicIraq = $0801; + IDArabicJordan = $2C01; IDArabicKuwait = $3401; + IDArabicLebanon = $3001; IDArabicLibya = $1001; + IDArabicMorocco = $1801; IDArabicOman = $2001; + IDArabicQatar = $4001; IDArabic = $0401; + IDArabicSyria = $2801; IDArabicTunisia = $1C01; + IDArabicUAE = $3801; IDArabicYemen = $2401; + IDArmenian = $042B; IDAssamese = $044D; + IDAzeriCyrillic = $082C; IDAzeriLatin = $042C; + IDBasque = $042D; IDByelorussian = $0423; + IDBengali = $0445; IDBulgarian = $0402; + IDBurmese = $0455; IDCatalan = $0403; + IDChineseHongKong = $0C04; IDChineseMacao = $1404; + IDSimplifiedChinese = $0804; IDChineseSingapore = $1004; + IDTraditionalChinese = $0404; IDCroatian = $041A; + IDCzech = $0405; IDDanish = $0406; + IDBelgianDutch = $0813; IDDutch = $0413; + IDEnglishAUS = $0C09; IDEnglishBelize = $2809; + IDEnglishCanadian = $1009; IDEnglishCaribbean = $2409; + IDEnglishIreland = $1809; IDEnglishJamaica = $2009; + IDEnglishNewZealand = $1409; IDEnglishPhilippines = $3409; + IDEnglishSouthAfrica = $1C09; IDEnglishTrinidad = $2C09; + IDEnglishUK = $0809; IDEnglishUS = $0409; + IDEnglishZimbabwe = $3009; IDEstonian = $0425; + IDFaeroese = $0438; IDFarsi = $0429; + IDFinnish = $040B; IDBelgianFrench = $080C; + IDFrenchCameroon = $2C0C; IDFrenchCanadian = $0C0C; + IDFrenchCotedIvoire = $300C; IDFrench = $040C; + IDFrenchLuxembourg = $140C; IDFrenchMali = $340C; + IDFrenchMonaco = $180C; IDFrenchReunion = $200C; + IDFrenchSenegal = $280C; IDSwissFrench = $100C; + IDFrenchWestIndies = $1C0C; IDFrenchZaire = $240C; + IDFrisianNetherlands = $0462; IDGaelicIreland = $083C; + IDGaelicScotland = $043C; IDGalician = $0456; + IDGeorgian = $0437; IDGermanAustria = $0C07; + IDGerman = $0407; IDGermanLiechtenstein = $1407; + IDGermanLuxembourg = $1007; IDSwissGerman = $0807; + IDGreek = $0408; IDGujarati = $0447; + IDHebrew = $040D; IDHindi = $0439; + IDHungarian = $040E; IDIcelandic = $040F; + IDIndonesian = $0421; IDItalian = $0410; + IDSwissItalian = $0810; IDJapanese = $0411; + IDKannada = $044B; IDKashmiri = $0460; + IDKazakh = $043F; IDKhmer = $0453; + IDKirghiz = $0440; IDKonkani = $0457; + IDKorean = $0412; IDLao = $0454; + IDLatvian = $0426; IDLithuanian = $0427; + IDMacedonian = $042F; IDMalaysian = $043E; + IDMalayBruneiDarussalam = $083E; IDMalayalam = $044C; + IDMaltese = $043A; IDManipuri = $0458; + IDMarathi = $044E; IDMongolian = $0450; + IDNepali = $0461; IDNorwegianBokmol = $0414; + IDNorwegianNynorsk = $0814; IDOriya = $0448; + IDPolish = $0415; IDBrazilianPortuguese = $0416; + IDPortuguese = $0816; IDPunjabi = $0446; + IDRhaetoRomanic = $0417; IDRomanianMoldova = $0818; + IDRomanian = $0418; IDRussianMoldova = $0819; + IDRussian = $0419; IDSamiLappish = $043B; + IDSanskrit = $044F; IDSerbianCyrillic = $0C1A; + IDSerbianLatin = $081A; IDSesotho = $0430; + IDSindhi = $0459; IDSlovak = $041B; + IDSlovenian = $0424; IDSorbian = $042E; + IDSpanishArgentina = $2C0A; IDSpanishBolivia = $400A; + IDSpanishChile = $340A; IDSpanishColombia = $240A; + IDSpanishCostaRica = $140A; IDSpanishDominicanRepublic = $1C0A; + IDSpanishEcuador = $300A; IDSpanishElSalvador = $440A; + IDSpanishGuatemala = $100A; IDSpanishHonduras = $480A; + IDMexicanSpanish = $080A; IDSpanishNicaragua = $4C0A; + IDSpanishPanama = $180A; IDSpanishParaguay = $3C0A; + IDSpanishPeru = $280A; IDSpanishPuertoRico = $500A; + IDSpanishModernSort = $0C0A; IDSpanish = $040A; + IDSpanishUruguay = $380A; IDSpanishVenezuela = $200A; + IDSutu = $0430; IDSwahili = $0441; + IDSwedishFinland = $081D; IDSwedish = $041D; + IDTajik = $0428; IDTamil = $0449; + IDTatar = $0444; IDTelugu = $044A; + IDThai = $041E; IDTibetan = $0451; + IDTsonga = $0431; IDTswana = $0432; + IDTurkish = $041F; IDTurkmen = $0442; + IDUkrainian = $0422; IDUrdu = $0420; + IDUzbekCyrillic = $0843; IDUzbekLatin = $0443; + IDVenda = $0433; IDVietnamese = $042A; + IDWelsh = $0452; IDXhosa = $0434; + IDZulu = $0435; + +function GetWindowsLanguage: WideString; +var + langid: Cardinal; + langcode: WideString; + CountryName: array[0..4] of widechar; + LanguageName: array[0..4] of widechar; + works: boolean; +begin + // The return value of GetLocaleInfo is compared with 3 = 2 characters and a zero + works := 3 = GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME, LanguageName, SizeOf(LanguageName)); + works := works and (3 = GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SISO3166CTRYNAME, CountryName, SizeOf(CountryName))); + if works then begin + // Windows 98, Me, NT4, 2000, XP and newer + LangCode := PWideChar(@(LanguageName[0])); + if lowercase(LangCode)='no' then LangCode:='nb'; + LangCode:=LangCode + '_' + PWideChar(@CountryName[0]); + end else begin + // This part should only happen on Windows 95. + langid := GetThreadLocale; + case langid of + IDBelgianDutch: langcode := 'nl_BE'; + IDBelgianFrench: langcode := 'fr_BE'; + IDBrazilianPortuguese: langcode := 'pt_BR'; + IDDanish: langcode := 'da_DK'; + IDDutch: langcode := 'nl_NL'; + IDEnglishUK: langcode := 'en_GB'; + IDEnglishUS: langcode := 'en_US'; + IDFinnish: langcode := 'fi_FI'; + IDFrench: langcode := 'fr_FR'; + IDFrenchCanadian: langcode := 'fr_CA'; + IDGerman: langcode := 'de_DE'; + IDGermanLuxembourg: langcode := 'de_LU'; + IDGreek: langcode := 'el_GR'; + IDIcelandic: langcode := 'is_IS'; + IDItalian: langcode := 'it_IT'; + IDKorean: langcode := 'ko_KO'; + IDNorwegianBokmol: langcode := 'nb_NO'; + IDNorwegianNynorsk: langcode := 'nn_NO'; + IDPolish: langcode := 'pl_PL'; + IDPortuguese: langcode := 'pt_PT'; + IDRussian: langcode := 'ru_RU'; + IDSpanish, IDSpanishModernSort: langcode := 'es_ES'; + IDSwedish: langcode := 'sv_SE'; + IDSwedishFinland: langcode := 'sv_FI'; + else + langcode := 'C'; + end; + end; + Result := langcode; +end; +{$endif} + +{$ifndef UNICODE} +function LoadResStringA(ResStringRec: PResStringRec): ansistring; +begin + Result:=DefaultInstance.LoadResString(ResStringRec); +end; +{$endif} + +function GetTranslatorNameAndEmail:TranslatedUnicodeString; +begin + Result:=DefaultInstance.GetTranslatorNameAndEmail; +end; + +procedure UseLanguage(LanguageCode: LanguageString); +begin + DefaultInstance.UseLanguage(LanguageCode); +end; + +type + PStrData = ^TStrData; + TStrData = record + Ident: Integer; + Str: String; + end; + +function SysUtilsEnumStringModules(Instance: Longint; Data: Pointer): Boolean; +{$IFDEF MSWINDOWS} +var + Buffer: array [0..1023] of Char; // WideChar in Delphi 2008, AnsiChar before that +begin + with PStrData(Data)^ do begin + SetString(Str, Buffer, + LoadString(Instance, Ident, @Buffer[0], sizeof(Buffer))); + Result := Str = ''; + end; +end; +{$ENDIF} +{$IFDEF LINUX} +var + rs:TResStringRec; + Module:HModule; +begin + Module:=Instance; + rs.Module:=@Module; + with PStrData(Data)^ do begin + rs.Identifier:=Ident; + Str:=System.LoadResString(@rs); + Result:=Str=''; + end; +end; +{$ENDIF} + +function SysUtilsFindStringResource(Ident: Integer): string; +var + StrData: TStrData; +begin + StrData.Ident := Ident; + StrData.Str := ''; + EnumResourceModules(SysUtilsEnumStringModules, @StrData); + Result := StrData.Str; +end; + +function SysUtilsLoadStr(Ident: Integer): string; +begin + {$ifdef DXGETTEXTDEBUG} + DefaultInstance.DebugWriteln ('Sysutils.LoadRes('+IntToStr(ident)+') called'); + {$endif} + Result := ResourceStringGettext(SysUtilsFindStringResource(Ident)); +end; + +function SysUtilsFmtLoadStr(Ident: Integer; const Args: array of const): string; +begin + {$ifdef DXGETTEXTDEBUG} + DefaultInstance.DebugWriteln ('Sysutils.FmtLoadRes('+IntToStr(ident)+',Args) called'); + {$endif} + FmtStr(Result, ResourceStringGettext(SysUtilsFindStringResource(Ident)),Args); +end; + +function LoadResString(ResStringRec: PResStringRec): widestring; +begin + Result:=DefaultInstance.LoadResString(ResStringRec); +end; + +function LoadResStringW(ResStringRec: PResStringRec): UnicodeString; +begin + Result:=DefaultInstance.LoadResString(ResStringRec); +end; + + + +function GetCurrentLanguage:LanguageString; +begin + Result:=DefaultInstance.GetCurrentLanguage; +end; + +{ TDomain } + +procedure TDomain.CloseMoFile; +begin + if mofile<>nil then begin + FileLocator.ReleaseMoFile(mofile); + mofile:=nil; + end; + OpenHasFailedBefore:=False; +end; + +destructor TDomain.Destroy; +begin + CloseMoFile; + inherited; +end; + +{$ifdef mswindows} +function GetLastWinError:widestring; +var + errcode:Cardinal; +begin + SetLength (Result,2000); + errcode:=GetLastError(); + Windows.FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM,nil,errcode,0,PWideChar(Result),2000,nil); + Result:=PWideChar(Result); +end; +{$endif} + +procedure TDomain.OpenMoFile; +var + filename: FilenameString; +begin + // Check if it is already open + if mofile<>nil then + exit; + + // Check if it has been attempted to open the file before + if OpenHasFailedBefore then + exit; + + if SpecificFilename<>'' then begin + filename:=SpecificFilename; + {$ifdef DXGETTEXTDEBUG} + DebugLogger ('Domain '+domain+' is bound to specific file '+filename); + {$endif} + end else begin + filename := Directory + curlang + PathDelim + 'LC_MESSAGES' + PathDelim + domain + '.mo'; + if (not FileLocator.FileExists(filename)) and (not fileexists(filename)) then begin + {$ifdef DXGETTEXTDEBUG} + DebugLogger ('Domain '+domain+': File does not exist, neither embedded or in file system: '+filename); + {$endif} + filename := Directory + MidStr(curlang, 1, 2) + PathDelim + 'LC_MESSAGES' + PathDelim + domain + '.mo'; + {$ifdef DXGETTEXTDEBUG} + DebugLogger ('Domain '+domain+' will attempt to use this file: '+filename); + {$endif} + end else begin + {$ifdef DXGETTEXTDEBUG} + if FileLocator.FileExists(filename) then + DebugLogger ('Domain '+domain+' will attempt to use this embedded file: '+filename) + else + DebugLogger ('Domain '+domain+' will attempt to use this file that was found on the file system: '+filename); + {$endif} + end; + end; + if (not FileLocator.FileExists(filename)) and (not fileexists(filename)) then begin + {$ifdef DXGETTEXTDEBUG} + DebugLogger ('Domain '+domain+' failed to locate the file: '+filename); + {$endif} + OpenHasFailedBefore:=True; + exit; + end; + {$ifdef DXGETTEXTDEBUG} + DebugLogger ('Domain '+domain+' now accesses the file.'); + {$endif} + mofile:=FileLocator.GetMoFile(filename, DebugLogger); + + {$ifdef DXGETTEXTDEBUG} + if mofile.isSwappedArchitecture then + DebugLogger ('.mo file is swapped (comes from another CPU architecture)'); + {$endif} + + // Check, that the contents of the file is utf-8 + if pos('CHARSET=UTF-8',uppercase(GetTranslationProperty('Content-Type')))=0 then begin + CloseMoFile; + {$ifdef DXGETTEXTDEBUG} + DebugLogger ('The translation for the language code '+curlang+' (in '+filename+') does not have charset=utf-8 in its Content-Type. Translations are turned off.'); + {$endif} + {$ifdef MSWINDOWS} + MessageBoxW(0,PWideChar(widestring('The translation for the language code '+curlang+' (in '+filename+') does not have charset=utf-8 in its Content-Type. Translations are turned off.')),'Localization problem',MB_OK); + {$else} + writeln (stderr,'The translation for the language code '+curlang+' (in '+filename+') does not have charset=utf-8 in its Content-Type. Translations are turned off.'); + {$endif} + Enabled:=False; + end; +end; + +{$IFDEF UNICODE} +function utf8decode (s:RawByteString):UnicodeString; inline; +begin + Result:=UTF8ToWideString(s); +end; +{$endif} + +function TDomain.GetTranslationProperty( + Propertyname: ComponentNameString): TranslatedUnicodeString; +var + sl:TStringList; + i:integer; + s:string; +begin + Propertyname:=uppercase(Propertyname)+': '; + sl:=TStringList.Create; + try + sl.Text:=utf8decode(gettext('')); + for i:=0 to sl.Count-1 do begin + s:=sl.Strings[i]; + if uppercase(MidStr(s,1,length(Propertyname)))=Propertyname then begin + Result:=trim(MidStr(s,length(PropertyName)+1,maxint)); + + {$ifdef DXGETTEXTDEBUG} + DebugLogger ('GetTranslationProperty('+PropertyName+') returns '''+Result+'''.'); + {$endif} + exit; + end; + end; + finally + FreeAndNil (sl); + end; + Result:=''; + {$ifdef DXGETTEXTDEBUG} + DebugLogger ('GetTranslationProperty('+PropertyName+') did not find any value. An empty string is returned.'); + {$endif} +end; + +procedure TDomain.setDirectory(const dir: FilenameString); +begin + vDirectory := IncludeTrailingPathDelimiter(dir); + SpecificFilename:=''; + CloseMoFile; +end; + +procedure AddDomainForResourceString (const domain:DomainString); +begin + {$ifdef DXGETTEXTDEBUG} + DefaultInstance.DebugWriteln ('Extra domain for resourcestring: '+domain); + {$endif} + ResourceStringDomainListCS.BeginWrite; + try + if ResourceStringDomainList.IndexOf(domain)=-1 then + ResourceStringDomainList.Add (domain); + finally + ResourceStringDomainListCS.EndWrite; + end; +end; + +procedure RemoveDomainForResourceString (const domain:DomainString); +var + i:integer; +begin + {$ifdef DXGETTEXTDEBUG} + DefaultInstance.DebugWriteln ('Remove domain for resourcestring: '+domain); + {$endif} + ResourceStringDomainListCS.BeginWrite; + try + i:=ResourceStringDomainList.IndexOf(domain); + if i<>-1 then + ResourceStringDomainList.Delete (i); + finally + ResourceStringDomainListCS.EndWrite; + end; +end; + +procedure TDomain.SetLanguageCode(const langcode: LanguageString); +begin + CloseMoFile; + curlang:=langcode; +end; + +function GetPluralForm2EN(Number: Integer): Integer; +begin + Number:=abs(Number); + if Number=1 then Result:=0 else Result:=1; +end; + +function GetPluralForm1(Number: Integer): Integer; +begin + Result:=0; +end; + +function GetPluralForm2FR(Number: Integer): Integer; +begin + Number:=abs(Number); + if (Number=1) or (Number=0) then Result:=0 else Result:=1; +end; + +function GetPluralForm3LV(Number: Integer): Integer; +begin + Number:=abs(Number); + if (Number mod 10=1) and (Number mod 100<>11) then + Result:=0 + else + if Number<>0 then Result:=1 + else Result:=2; +end; + +function GetPluralForm3GA(Number: Integer): Integer; +begin + Number:=abs(Number); + if Number=1 then Result:=0 + else if Number=2 then Result:=1 + else Result:=2; +end; + +function GetPluralForm3LT(Number: Integer): Integer; +var + n1,n2:byte; +begin + Number:=abs(Number); + n1:=Number mod 10; + n2:=Number mod 100; + if (n1=1) and (n2<>11) then + Result:=0 + else + if (n1>=2) and ((n2<10) or (n2>=20)) then Result:=1 + else Result:=2; +end; + +function GetPluralForm3PL(Number: Integer): Integer; +var + n1,n2:byte; +begin + Number:=abs(Number); + n1:=Number mod 10; + n2:=Number mod 100; + + if Number=1 then Result:=0 + else if (n1>=2) and (n1<=4) and ((n2<10) or (n2>=20)) then Result:=1 + else Result:=2; +end; + +function GetPluralForm3RU(Number: Integer): Integer; +var + n1,n2:byte; +begin + Number:=abs(Number); + n1:=Number mod 10; + n2:=Number mod 100; + if (n1=1) and (n2<>11) then + Result:=0 + else + if (n1>=2) and (n1<=4) and ((n2<10) or (n2>=20)) then Result:=1 + else Result:=2; +end; + +function GetPluralForm3SK(Number: Integer): Integer; +begin + Number:=abs(Number); + if number=1 then Result:=0 + else if (number<5) and (number<>0) then Result:=1 + else Result:=2; +end; + +function GetPluralForm4SL(Number: Integer): Integer; +var + n2:byte; +begin + Number:=abs(Number); + n2:=Number mod 100; + if n2=1 then Result:=0 + else + if n2=2 then Result:=1 + else + if (n2=3) or (n2=4) then Result:=2 + else + Result:=3; +end; + +procedure TDomain.GetListOfLanguages(list: TStrings); +var + sr:TSearchRec; + more:boolean; + filename, path:FilenameString; + langcode:LanguageString; + i, j:integer; +begin + list.Clear; + + // Iterate through filesystem + more:=FindFirst (Directory+'*',faAnyFile,sr)=0; + try + while more do begin + if (sr.Attr and faDirectory<>0) and (sr.name<>'.') and (sr.name<>'..') then begin + filename := Directory + sr.Name + PathDelim + 'LC_MESSAGES' + PathDelim + domain + '.mo'; + if fileexists(filename) then begin + langcode:=lowercase(sr.name); + if list.IndexOf(langcode)=-1 then + list.Add(langcode); + end; + end; + more:=FindNext (sr)=0; + end; + finally + FindClose (sr); + end; + + // Iterate through embedded files + for i:=0 to FileLocator.filelist.Count-1 do begin + filename:=FileLocator.basedirectory+FileLocator.filelist.Strings[i]; + path:=Directory; + {$ifdef MSWINDOWS} + path:=uppercase(path); + filename:=uppercase(filename); + {$endif} + j:=length(path); + if MidStr(filename,1,j)=path then begin + path:=PathDelim + 'LC_MESSAGES' + PathDelim + domain + '.mo'; + {$ifdef MSWINDOWS} + path:=uppercase(path); + {$endif} + if MidStr(filename,length(filename)-length(path)+1,length(path))=path then begin + langcode:=lowercase(MidStr(filename,j+1,length(filename)-length(path)-j)); + langcode:=LeftStr(langcode,3)+uppercase(MidStr(langcode,4,maxint)); + if list.IndexOf(langcode)=-1 then + list.Add(langcode); + end; + end; + end; +end; + +procedure TDomain.SetFilename(const filename: FilenameString); +begin + CloseMoFile; + vDirectory := ''; + SpecificFilename:=filename; +end; + +function TDomain.gettext(const msgid: RawUtf8String): RawUtf8String; +var + found:boolean; +begin + if not Enabled then begin + Result:=msgid; + exit; + end; + if (mofile=nil) and (not OpenHasFailedBefore) then + OpenMoFile; + if mofile=nil then begin + {$ifdef DXGETTEXTDEBUG} + DebugLogger('.mo file is not open. Not translating "'+msgid+'"'); + {$endif} + Result := msgid; + end else begin + Result:=mofile.gettext(msgid,found); + {$ifdef DXGETTEXTDEBUG} + if found then + DebugLogger ('Found in .mo ('+Domain+'): "'+utf8encode(msgid)+'"->"'+utf8encode(Result)+'"') + else + DebugLogger ('Translation not found in .mo file ('+Domain+') : "'+utf8encode(msgid)+'"'); + {$endif} + end; +end; + +constructor TDomain.Create; +begin + inherited Create; + Enabled:=True; +end; + +{ TGnuGettextInstance } + +procedure TGnuGettextInstance.bindtextdomain(const szDomain:DomainString; + const szDirectory: FilenameString); +var + dir:FilenameString; +begin + dir:=IncludeTrailingPathDelimiter(szDirectory); + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('Text domain "'+szDomain+'" is now located at "'+dir+'"'); + {$endif} + getdomain(szDomain,DefaultDomainDirectory,CurLang).Directory := dir; + WhenNewDomainDirectory (szDomain, szDirectory); +end; + +constructor TGnuGettextInstance.Create; +begin + CreatorThread:=GetCurrentThreadId; + {$ifdef MSWindows} + DesignTimeCodePage:=CP_ACP; + {$endif} + {$ifdef DXGETTEXTDEBUG} + DebugLogCS:=TMultiReadExclusiveWriteSynchronizer.Create; + DebugLog:=TMemoryStream.Create; + DebugWriteln('Debug log started '+DateTimeToStr(Now)); + DebugWriteln('GNU gettext module version: '+VCSVersion); + DebugWriteln(''); + {$endif} + curGetPluralForm:=GetPluralForm2EN; + Enabled:=True; + curmsgdomain:=DefaultTextDomain; + savefileCS := TMultiReadExclusiveWriteSynchronizer.Create; + domainlist := TStringList.Create; + TP_IgnoreList:=TStringList.Create; + TP_IgnoreList.Sorted:=True; + TP_GlobalClassHandling:=TList.Create; + TP_ClassHandling:=TList.Create; + + // Set some settings + DefaultDomainDirectory := IncludeTrailingPathDelimiter(extractfilepath(ExecutableFilename))+'locale'; + + UseLanguage(''); + + bindtextdomain(DefaultTextDomain, DefaultDomainDirectory); + textdomain(DefaultTextDomain); + + // Add default properties to ignore + TP_GlobalIgnoreClassProperty(TComponent,'Name'); + TP_GlobalIgnoreClassProperty(TCollection,'PropName'); +end; + +destructor TGnuGettextInstance.Destroy; +begin + if savememory <> nil then begin + savefileCS.BeginWrite; + try + CloseFile(savefile); + finally + savefileCS.EndWrite; + end; + FreeAndNil(savememory); + end; + FreeAndNil (savefileCS); + FreeAndNil (TP_IgnoreList); + while TP_GlobalClassHandling.Count<>0 do begin + TObject(TP_GlobalClassHandling.Items[0]).Free; + TP_GlobalClassHandling.Delete(0); + end; + FreeAndNil (TP_GlobalClassHandling); + FreeTP_ClassHandlingItems; + FreeAndNil (TP_ClassHandling); + while domainlist.Count <> 0 do begin + domainlist.Objects[0].Free; + domainlist.Delete(0); + end; + FreeAndNil(domainlist); + {$ifdef DXGETTEXTDEBUG} + FreeAndNil (DebugLog); + FreeAndNil (DebugLogCS); + {$endif} + inherited; +end; + +{$ifndef DELPHI5OROLDER} +{$ifndef UNICODE} +function TGnuGettextInstance.dgettext(const szDomain: DomainString; const szMsgId: ansistring): TranslatedUnicodeString; +begin + Result:=dgettext(szDomain, ansi2wideDTCP(szMsgId)); +end; +{$endif} +{$endif} + +function TGnuGettextInstance.dgettext(const szDomain: DomainString; + const szMsgId: MsgIdString): TranslatedUnicodeString; +begin + if not Enabled then begin + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('Translation has been disabled. Text is not being translated: '+szMsgid); + {$endif} + Result:=szMsgId; + end else begin + Result:=UTF8Decode(EnsureLineBreakInTranslatedString(getdomain(szDomain,DefaultDomainDirectory,CurLang).gettext(StripCRRawMsgId(utf8encode(szMsgId))))); + + {$ifdef DXGETTEXTDEBUG} + if (szMsgId<>'') and (Result='') then + DebugWriteln (Format('Error: Translation of %s was an empty string. This may never occur.',[szMsgId])); + {$endif} + end; +end; + +function TGnuGettextInstance.GetCurrentLanguage: LanguageString; +begin + Result:=curlang; +end; + +function TGnuGettextInstance.getcurrenttextdomain: DomainString; +begin + Result := curmsgdomain; +end; + +{$ifndef DELPHI5OROLDER} +{$ifndef UNICODE} +function TGnuGettextInstance.gettext( + const szMsgId: ansistring): TranslatedUnicodeString; +begin + Result := dgettext(curmsgdomain, szMsgId); +end; +{$endif} +{$endif} + +function TGnuGettextInstance.gettext( + const szMsgId: MsgIdString): TranslatedUnicodeString; +begin + Result := dgettext(curmsgdomain, szMsgId); +end; + +procedure TGnuGettextInstance.textdomain(const szDomain: DomainString); +begin + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('Changed text domain to "'+szDomain+'"'); + {$endif} + curmsgdomain := szDomain; + WhenNewDomain (szDomain); +end; + +function TGnuGettextInstance.TP_CreateRetranslator : TExecutable; +var + ttpr:TTP_Retranslator; +begin + ttpr:=TTP_Retranslator.Create; + ttpr.Instance:=self; + TP_Retranslator:=ttpr; + Result:=ttpr; + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('A retranslator was created.'); + {$endif} +end; + +procedure TGnuGettextInstance.TP_GlobalHandleClass(HClass: TClass; + Handler: TTranslator); +var + cm:TClassMode; + i:integer; +begin + for i:=0 to TP_GlobalClassHandling.Count-1 do begin + cm:=TObject(TP_GlobalClassHandling.Items[i]) as TClassMode; + if cm.HClass=HClass then + raise EGGProgrammingError.Create ('You cannot set a handler for a class that has already been assigned otherwise.'); + if HClass.InheritsFrom(cm.HClass) then begin + // This is the place to insert this class + cm:=TClassMode.Create; + cm.HClass:=HClass; + cm.SpecialHandler:=Handler; + TP_GlobalClassHandling.Insert(i,cm); + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('A handler was set for class '+HClass.ClassName+'.'); + {$endif} + exit; + end; + end; + cm:=TClassMode.Create; + cm.HClass:=HClass; + cm.SpecialHandler:=Handler; + TP_GlobalClassHandling.Add(cm); + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('A handler was set for class '+HClass.ClassName+'.'); + {$endif} +end; + +procedure TGnuGettextInstance.TP_GlobalIgnoreClass(IgnClass: TClass); +var + cm:TClassMode; + i:integer; +begin + for i:=0 to TP_GlobalClassHandling.Count-1 do begin + cm:=TObject(TP_GlobalClassHandling.Items[i]) as TClassMode; + if cm.HClass=IgnClass then + raise EGGProgrammingError.Create ('You cannot add a class to the ignore list that is already on that list: '+IgnClass.ClassName+'. You should keep all TP_Global functions in one place in your source code.'); + if IgnClass.InheritsFrom(cm.HClass) then begin + // This is the place to insert this class + cm:=TClassMode.Create; + cm.HClass:=IgnClass; + TP_GlobalClassHandling.Insert(i,cm); + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('Globally, class '+IgnClass.ClassName+' is being ignored.'); + {$endif} + exit; + end; + end; + cm:=TClassMode.Create; + cm.HClass:=IgnClass; + TP_GlobalClassHandling.Add(cm); + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('Globally, class '+IgnClass.ClassName+' is being ignored.'); + {$endif} +end; + +procedure TGnuGettextInstance.TP_GlobalIgnoreClassProperty( + IgnClass: TClass; propertyname: ComponentNameString); +var + cm:TClassMode; + i,idx:integer; +begin + propertyname:=uppercase(propertyname); + for i:=0 to TP_GlobalClassHandling.Count-1 do begin + cm:=TObject(TP_GlobalClassHandling.Items[i]) as TClassMode; + if cm.HClass=IgnClass then begin + if Assigned(cm.SpecialHandler) then + raise EGGProgrammingError.Create ('You cannot ignore a class property for a class that has a handler set.'); + if not cm.PropertiesToIgnore.Find(propertyname,idx) then + cm.PropertiesToIgnore.Add(propertyname); + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('Globally, the '+propertyname+' property of class '+IgnClass.ClassName+' is being ignored.'); + {$endif} + exit; + end; + if IgnClass.InheritsFrom(cm.HClass) then begin + // This is the place to insert this class + cm:=TClassMode.Create; + cm.HClass:=IgnClass; + cm.PropertiesToIgnore.Add(propertyname); + TP_GlobalClassHandling.Insert(i,cm); + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('Globally, the '+propertyname+' property of class '+IgnClass.ClassName+' is being ignored.'); + {$endif} + exit; + end; + end; + cm:=TClassMode.Create; + cm.HClass:=IgnClass; + cm.PropertiesToIgnore.Add(propertyname); + TP_GlobalClassHandling.Add(cm); + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('Globally, the '+propertyname+' property of class '+IgnClass.ClassName+' is being ignored.'); + {$endif} +end; + +procedure TGnuGettextInstance.TP_Ignore(AnObject: TObject; + const name: ComponentNameString); +begin + TP_IgnoreList.Add(uppercase(name)); + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('On object with class name '+AnObject.ClassName+', ignore is set on '+name); + {$endif} +end; + +procedure TGnuGettextInstance.TranslateComponent(AnObject: TComponent; + const TextDomain: DomainString); +var + comp:TGnuGettextComponentMarker; +begin + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('======================================================================'); + DebugWriteln ('TranslateComponent() was called for a component with name '+AnObject.Name+'.'); + {$endif} + comp:=AnObject.FindComponent('GNUgettextMarker') as TGnuGettextComponentMarker; + if comp=nil then begin + comp:=TGnuGettextComponentMarker.Create (nil); + comp.Name:='GNUgettextMarker'; + comp.Retranslator:=TP_CreateRetranslator; + TranslateProperties (AnObject, TextDomain); + AnObject.InsertComponent(comp); + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('This is the first time, that this component has been translated. A retranslator component has been created for this component.'); + {$endif} + end else begin + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('This is not the first time, that this component has been translated.'); + {$endif} + if comp.LastLanguage<>curlang then begin + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('ERROR: TranslateComponent() was called twice with different languages. This indicates an attempt to switch language at runtime, but by using TranslateComponent every time. This API has changed - please use RetranslateComponent() instead.'); + {$endif} + {$ifdef mswindows} + MessageBox (0,'This application tried to switch the language, but in an incorrect way. The programmer needs to replace a call to TranslateComponent with a call to RetranslateComponent(). The programmer should see the changelog of gnugettext.pas for more information.','Error',MB_OK); + {$else} + writeln (stderr,'This application tried to switch the language, but in an incorrect way. The programmer needs to replace a call to TranslateComponent with a call to RetranslateComponent(). The programmer should see the changelog of gnugettext.pas for more information.'); + {$endif} + end else begin + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('ERROR: TranslateComponent has been called twice, but with the same language chosen. This is a mistake, but in order to prevent that the application breaks, no exception is raised.'); + {$endif} + end; + end; + comp.LastLanguage:=curlang; + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('======================================================================'); + {$endif} +end; + +procedure TGnuGettextInstance.TranslateProperty (AnObject:TObject; PropInfo:PPropInfo; TodoList:TStrings; const TextDomain:DomainString); +var + {$ifdef DELPHI5OROLDER} + ws: string; + old: string; + {$endif} + {$ifndef DELPHI5OROLDER} + ppi:PPropInfo; + ws: TranslatedUnicodeString; + old: TranslatedUnicodeString; + {$endif} + compmarker:TComponent; + obj:TObject; + Propname:ComponentNameString; +begin + PropName:=string(PropInfo^.Name); + try + // Translate certain types of properties + case PropInfo^.PropType^.Kind of + {$IFDEF UNICODE} + // All dfm files returning tkUString + tkString, tkLString, tkWString, tkUString: + {$ELSE} + tkString, tkLString, tkWString: + {$ENDIF} + begin + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('Translating '+AnObject.ClassName+'.'+PropName); + {$endif} + {$ifdef DELPHI5OROLDER} + old := GetStrProp(AnObject, PropName); + {$else} + case PropInfo^.PropType^.Kind of + tkString, tkLString : + old := GetStrProp(AnObject, PropName); + tkWString : + old := GetWideStrProp(AnObject, PropName); + {$IFDEF UNICODE} + tkUString : + old := GetUnicodeStrProp(AnObject, PropName); + {$ENDIF} + else + raise Exception.Create ('Internal error: Illegal property type. This problem needs to be solved by a programmer, try to find a workaround.'); + end; + {$endif} + {$ifdef DXGETTEXTDEBUG} + if old='' then + DebugWriteln ('(Empty, not translated)') + else + DebugWriteln ('Old value: "'+old+'"'); + {$endif} + if (old <> '') and (IsWriteProp(PropInfo)) then begin + if TP_Retranslator<>nil then + (TP_Retranslator as TTP_Retranslator).Remember(AnObject, PropName, old); + ws := dgettext(textdomain,old); + if ws <> old then begin + {$ifdef DELPHI5OROLDER} + SetStrProp(AnObject, PropName, ws); + {$endif} + {$ifndef DELPHI5OROLDER} + ppi:=GetPropInfo(AnObject, Propname); + if ppi<>nil then begin + SetWideStrProp(AnObject, ppi, ws); + end else begin + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('ERROR: Property disappeared: '+Propname+' for object of type '+AnObject.ClassName); + {$endif} + end; + {$endif} + end; + end; + end { case item }; + tkClass: + begin + obj:=GetObjectProp(AnObject, PropName); + if obj<>nil then begin + if obj is TComponent then begin + compmarker := TComponent(obj).FindComponent('GNUgettextMarker'); + if Assigned(compmarker) then + exit; + end; + TodoList.AddObject ('',obj); + end; + end { case item }; + end { case }; + except + on E:Exception do + raise EGGComponentError.Create ('Property cannot be translated.'+sLineBreak+ + 'Add TP_GlobalIgnoreClassProperty('+AnObject.ClassName+','''+PropName+''') to your source code or use'+sLineBreak+ + 'TP_Ignore (self,''.'+PropName+''') to prevent this message.'+sLineBreak+ + 'Reason: '+e.Message); + end; +end; + +procedure TGnuGettextInstance.TranslateProperties(AnObject: TObject; textdomain:DomainString=''); +var + TodoList:TStringList; // List of Name/TObject's that is to be processed + DoneList:TStringList; // List of hex codes representing pointers to objects that have been done + i, j, Count: integer; + PropList: PPropList; + UPropName: ComponentNameString; + PropInfo: PPropInfo; + compmarker, + comp:TComponent; + cm, + currentcm:TClassMode; // currentcm is nil or contains special information about how to handle the current object + ObjectPropertyIgnoreList:TStringList; + objid:string; + Name:ComponentNameString; + {$ifdef DELPHI5OROLDER} + Data:PTypeData; + {$endif} +begin + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('----------------------------------------------------------------------'); + DebugWriteln ('TranslateProperties() was called for an object of class '+AnObject.ClassName+' with domain "'+textdomain+'".'); + {$endif} + if textdomain='' then + textdomain:=curmsgdomain; + if TP_Retranslator<>nil then + (TP_Retranslator as TTP_Retranslator).TextDomain:=textdomain; + {$ifdef FPC} + DoneList:=TCSStringList.Create; + TodoList:=TCSStringList.Create; + ObjectPropertyIgnoreList:=TCSStringList.Create; + {$else} + DoneList:=TStringList.Create; + TodoList:=TStringList.Create; + ObjectPropertyIgnoreList:=TStringList.Create; + {$endif} + try + TodoList.AddObject('', AnObject); + DoneList.Sorted:=True; + ObjectPropertyIgnoreList.Sorted:=True; + {$ifndef DELPHI5OROLDER} + ObjectPropertyIgnoreList.Duplicates:=dupIgnore; + ObjectPropertyIgnoreList.CaseSensitive:=False; + DoneList.Duplicates:=dupError; + DoneList.CaseSensitive:=True; + {$endif} + + while TodoList.Count<>0 do begin + AnObject:=TodoList.Objects[0]; + Name:=TodoList.Strings[0]; + TodoList.Delete(0); + if (AnObject<>nil) and (AnObject is TPersistent) then begin + // Make sure each object is only translated once + Assert (sizeof(integer)=sizeof(TObject)); + objid:=IntToHex(integer(AnObject),8); + if DoneList.Find(objid,i) then begin + continue; + end else begin + DoneList.Add(objid); + end; + + ObjectPropertyIgnoreList.Clear; + + // Find out if there is special handling of this object + currentcm:=nil; + // First check the local handling instructions + for j:=0 to TP_ClassHandling.Count-1 do begin + cm:=TObject(TP_ClassHandling.Items[j]) as TClassMode; + if AnObject.InheritsFrom(cm.HClass) then begin + if cm.PropertiesToIgnore.Count<>0 then begin + ObjectPropertyIgnoreList.AddStrings(cm.PropertiesToIgnore); + end else begin + // Ignore the entire class + currentcm:=cm; + break; + end; + end; + end; + // Then check the global handling instructions + if currentcm=nil then + for j:=0 to TP_GlobalClassHandling.Count-1 do begin + cm:=TObject(TP_GlobalClassHandling.Items[j]) as TClassMode; + if AnObject.InheritsFrom(cm.HClass) then begin + if cm.PropertiesToIgnore.Count<>0 then begin + ObjectPropertyIgnoreList.AddStrings(cm.PropertiesToIgnore); + end else begin + // Ignore the entire class + currentcm:=cm; + break; + end; + end; + end; + if currentcm<>nil then begin + ObjectPropertyIgnoreList.Clear; + // Ignore or use special handler + if Assigned(currentcm.SpecialHandler) then begin + currentcm.SpecialHandler (AnObject); + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('Special handler activated for '+AnObject.ClassName); + {$endif} + end else begin + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('Ignoring object '+AnObject.ClassName); + {$endif} + end; + continue; + end; + + {$ifdef DELPHI5OROLDER} + if AnObject.ClassInfo=nil then begin + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('ClassInfo=nil encountered for class '+AnObject.ClassName+'. Translation of that component has stopped. You should ignore this object.'); + {$endif} + continue; + end; + Data := GetTypeData(AnObject.Classinfo); + Count := Data^.PropCount; + GetMem(PropList, Count * Sizeof(PPropInfo)); + {$endif} + {$ifndef DELPHI5OROLDER} + Count := GetPropList(AnObject, PropList); + {$endif} + try + {$ifdef DELPHI5OROLDER} + GetPropInfos(AnObject.ClassInfo, PropList); + {$endif} + for j := 0 to Count - 1 do begin + PropInfo := PropList[j]; + {$IFDEF UNICODE} + if not (PropInfo^.PropType^.Kind in [tkString, tkLString, tkWString, tkClass, tkUString]) then + {$ELSE} + if not (PropInfo^.PropType^.Kind in [tkString, tkLString, tkWString, tkClass]) then + {$ENDIF} + continue; + UPropName:=uppercase(string(PropInfo^.Name)); + // Ignore properties that are meant to be ignored + if ((currentcm=nil) or (not currentcm.PropertiesToIgnore.Find(UPropName,i))) and + (not TP_IgnoreList.Find(Name+'.'+UPropName,i)) and + (not ObjectPropertyIgnoreList.Find(UPropName,i)) then begin + TranslateProperty (AnObject,PropInfo,TodoList,TextDomain); + end; // if + end; // for + finally + {$ifdef DELPHI5OROLDER} + FreeMem(PropList, Data^.PropCount * Sizeof(PPropInfo)); + {$endif} + {$ifndef DELPHI5OROLDER} + if Count<>0 then + FreeMem (PropList); + {$endif} + end; + if AnObject is TStrings then begin + if ((AnObject as TStrings).Text<>'') and (TP_Retranslator<>nil) then + (TP_Retranslator as TTP_Retranslator).Remember(AnObject, 'Text', (AnObject as TStrings).Text); + TranslateStrings (AnObject as TStrings,TextDomain); + end; + // Check for TCollection + if AnObject is TCollection then begin + for i := 0 to (AnObject as TCollection).Count - 1 do begin + // Only add the object if it's not totally ignored already + if not Assigned(currentcm) or not AnObject.InheritsFrom(currentcm.HClass) then + TodoList.AddObject('',(AnObject as TCollection).Items[i]); + end; + end; + if AnObject is TComponent then begin + for i := 0 to TComponent(AnObject).ComponentCount - 1 do begin + comp:=TComponent(AnObject).Components[i]; + if (not TP_IgnoreList.Find(uppercase(comp.Name),j)) then begin + // Only add the object if it's not totally ignored or translated already + if not Assigned(currentcm) or not AnObject.InheritsFrom(currentcm.HClass) then begin + compmarker := comp.FindComponent('GNUgettextMarker'); + if not Assigned(compmarker) then + TodoList.AddObject(uppercase(comp.Name),comp); + end; + end; + end; + end; + end { if AnObject<>nil }; + end { while todolist.count<>0 }; + finally + FreeAndNil (todolist); + FreeAndNil (ObjectPropertyIgnoreList); + FreeAndNil (DoneList); + end; + FreeTP_ClassHandlingItems; + TP_IgnoreList.Clear; + TP_Retranslator:=nil; + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('----------------------------------------------------------------------'); + {$endif} +end; + +procedure TGnuGettextInstance.UseLanguage(LanguageCode: LanguageString); +var + i,p:integer; + dom:TDomain; + l2:string; +begin + {$ifdef DXGETTEXTDEBUG} + DebugWriteln('UseLanguage('''+LanguageCode+'''); called'); + {$endif} + + if LanguageCode='' then begin + LanguageCode:=GGGetEnvironmentVariable('LANG'); + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('LANG env variable is '''+LanguageCode+'''.'); + {$endif} + {$ifdef MSWINDOWS} + if LanguageCode='' then begin + LanguageCode:=GetWindowsLanguage; + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('Found Windows language code to be '''+LanguageCode+'''.'); + {$endif} + end; + {$endif} + p:=pos('.',LanguageCode); + if p<>0 then + LanguageCode:=LeftStr(LanguageCode,p-1); + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('Language code that will be set is '''+LanguageCode+'''.'); + {$endif} + end; + + curlang := LanguageCode; + for i:=0 to domainlist.Count-1 do begin + dom:=domainlist.Objects[i] as TDomain; + dom.SetLanguageCode (curlang); + end; + + l2:=lowercase(LeftStr(curlang,2)); + if (l2='en') or (l2='de') then curGetPluralForm:=GetPluralForm2EN else + if (l2='hu') or (l2='ko') or (l2='zh') or (l2='ja') or (l2='tr') then curGetPluralForm:=GetPluralForm1 else + if (l2='fr') or (l2='fa') or (lowercase(curlang)='pt_br') then curGetPluralForm:=GetPluralForm2FR else + if (l2='lv') then curGetPluralForm:=GetPluralForm3LV else + if (l2='ga') then curGetPluralForm:=GetPluralForm3GA else + if (l2='lt') then curGetPluralForm:=GetPluralForm3LT else + if (l2='ru') or (l2='uk') or (l2='hr') then curGetPluralForm:=GetPluralForm3RU else + if (l2='cs') or (l2='sk') then curGetPluralForm:=GetPluralForm3SK else + if (l2='pl') then curGetPluralForm:=GetPluralForm3PL else + if (l2='sl') then curGetPluralForm:=GetPluralForm4SL else begin + curGetPluralForm:=GetPluralForm2EN; + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('Plural form for the language was not found. English plurality system assumed.'); + {$endif} + end; + + WhenNewLanguage (curlang); + + {$ifdef DXGETTEXTDEBUG} + DebugWriteln(''); + {$endif} +end; + +procedure TGnuGettextInstance.TranslateStrings(sl: TStrings;const TextDomain:DomainString); +var + line: string; + i: integer; + s:TStringList; +begin + if sl.Count > 0 then begin + sl.BeginUpdate; + try + s:=TStringList.Create; + try + s.Assign (sl); + for i:=0 to s.Count-1 do begin + line:=s.Strings[i]; + if line<>'' then + s.Strings[i]:=dgettext(TextDomain,line); + end; + sl.Assign(s); + finally + FreeAndNil (s); + end; + finally + sl.EndUpdate; + end; + end; +end; + +function TGnuGettextInstance.GetTranslatorNameAndEmail: TranslatedUnicodeString; +begin + Result:=GetTranslationProperty('LAST-TRANSLATOR'); +end; + +function TGnuGettextInstance.GetTranslationProperty( + const Propertyname: ComponentNameString): TranslatedUnicodeString; +begin + Result:=getdomain(curmsgdomain,DefaultDomainDirectory,CurLang).GetTranslationProperty (Propertyname); +end; + +function TGnuGettextInstance.dngettext(const szDomain: DomainString; const singular, plural: MsgIdString; + Number: Integer): TranslatedUnicodeString; +var + org:MsgIdString; + trans:TranslatedUnicodeString; + idx:integer; + p:integer; +begin + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('dngettext translation (domain '+szDomain+', number is '+IntTostr(Number)+') of '+singular+'/'+plural); + {$endif} + org:=singular+#0+plural; + trans:=dgettext(szDomain,org); + if org=trans then begin + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('Translation was equal to english version. English plural forms assumed.'); + {$endif} + idx:=GetPluralForm2EN(Number) + end else + idx:=curGetPluralForm(Number); + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('Index '+IntToStr(idx)+' will be used'); + {$endif} + while true do begin + p:=pos(#0,trans); + if p=0 then begin + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('Last translation used: '+utf8encode(trans)); + {$endif} + Result:=trans; + exit; + end; + if idx=0 then begin + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('Translation found: '+utf8encode(trans)); + {$endif} + Result:=LeftStr(trans,p-1); + exit; + end; + delete (trans,1,p); + dec (idx); + end; +end; + +{$ifndef DELPHI5OROLDER} +{$ifndef UNICODE} +function TGnuGettextInstance.ngettext(const singular, plural: ansistring; + Number: Integer): TranslatedUnicodeString; +begin + Result := dngettext(curmsgdomain, singular, plural, Number); +end; +{$endif} +{$endif} + +function TGnuGettextInstance.ngettext(const singular, plural: MsgIdString; + Number: Integer): TranslatedUnicodeString; +begin + Result := dngettext(curmsgdomain, singular, plural, Number); +end; + +procedure TGnuGettextInstance.WhenNewDomain(const TextDomain: DomainString); +begin + // This is meant to be empty. +end; + +procedure TGnuGettextInstance.WhenNewLanguage(const LanguageID: LanguageString); +begin + // This is meant to be empty. +end; + +procedure TGnuGettextInstance.WhenNewDomainDirectory(const TextDomain:DomainString; const Directory: FilenameString); +begin + // This is meant to be empty. +end; + +procedure TGnuGettextInstance.GetListOfLanguages(const domain: DomainString; + list: TStrings); +begin + getdomain(Domain,DefaultDomainDirectory,CurLang).GetListOfLanguages(list); +end; + +procedure TGnuGettextInstance.bindtextdomainToFile(const szDomain:DomainString; const filename: FilenameString); +begin + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('Text domain "'+szDomain+'" is now bound to file named "'+filename+'"'); + {$endif} + getdomain(szDomain,DefaultDomainDirectory,CurLang).SetFilename (filename); +end; + +procedure TGnuGettextInstance.DebugLogPause(PauseEnabled: boolean); +begin + {$ifdef DXGETTEXTDEBUG} + DebugLogOutputPaused:=PauseEnabled; + {$endif} +end; + +procedure TGnuGettextInstance.DebugLogToFile(const filename: FilenameString; append:boolean=false); +{$ifdef DXGETTEXTDEBUG} +var + fs:TFileStream; + marker:ansistring; +{$endif} +begin + {$ifdef DXGETTEXTDEBUG} + // Create the file if needed + if (not fileexists(filename)) or (not append) then + fileclose (filecreate (filename)); + + // Open file + fs:=TFileStream.Create (filename,fmOpenWrite or fmShareDenyWrite); + if append then + fs.Seek(0,soFromEnd); + + // Write header if appending + if fs.Position<>0 then begin + marker:=sLineBreak+'==========================================================================='+sLineBreak; + fs.WriteBuffer(marker[1],length(marker)); + end; + + // Copy the memorystream contents to the file + DebugLog.Seek(0,soFromBeginning); + fs.CopyFrom(DebugLog,0); + + // Make DebugLog point to the filestream + FreeAndNil (DebugLog); + DebugLog:=fs; + {$endif} +end; + +{$ifdef DXGETTEXTDEBUG} +procedure TGnuGettextInstance.DebugWriteln(line: ansistring); +Var + Discard: Boolean; +begin + Assert (DebugLogCS<>nil); + Assert (DebugLog<>nil); + + DebugLogCS.BeginWrite; + try + if DebugLogOutputPaused then + exit; + + if Assigned (fOnDebugLine) then begin + Discard := True; + fOnDebugLine (Self, Line, Discard); + If Discard then Exit; + end; + + line:=line+sLineBreak; + + // Ensure that memory usage doesn't get too big. + if (DebugLog is TMemoryStream) and (DebugLog.Position>1000000) then begin + line:=sLineBreak+sLineBreak+sLineBreak+sLineBreak+sLineBreak+ + 'Debug log halted because memory usage grew too much.'+sLineBreak+ + 'Specify a filename to store the debug log in or disable debug loggin in gnugettext.pas.'+ + sLineBreak+sLineBreak+sLineBreak+sLineBreak+sLineBreak; + DebugLogOutputPaused:=True; + end; + DebugLog.WriteBuffer(line[1],length(line)); + finally + DebugLogCS.EndWrite; + end; +end; +{$endif} + +function TGnuGettextInstance.Getdomain(const domain:DomainString; const DefaultDomainDirectory:FilenameString; const CurLang: LanguageString): TDomain; +// Retrieves the TDomain object for the specified domain. +// Creates one, if none there, yet. +var + idx: integer; +begin + idx := domainlist.IndexOf(Domain); + if idx = -1 then begin + Result := TDomain.Create; + {$ifdef DXGETTEXTDEBUG} + Result.DebugLogger:=DebugWriteln; + {$endif} + Result.Domain := Domain; + Result.Directory := DefaultDomainDirectory; + Result.SetLanguageCode(curlang); + domainlist.AddObject(Domain, Result); + end else begin + Result := domainlist.Objects[idx] as TDomain; + end; +end; + +function TGnuGettextInstance.LoadResString( + ResStringRec: PResStringRec): UnicodeString; +{$ifdef MSWINDOWS} +var + Len: Integer; + {$IFDEF UNICODE} + Buffer: array [0..1023] of widechar; + {$else} + Buffer: array [0..1023] of ansichar; + {$endif} +{$endif} +{$ifdef LINUX } +const + ResStringTableLen = 16; +type + ResStringTable = array [0..ResStringTableLen-1] of LongWord; +var + Handle: TResourceHandle; + Tab: ^ResStringTable; + ResMod: HMODULE; +{$endif } +begin + if ResStringRec=nil then + exit; + if ResStringRec.Identifier>=64*1024 then begin + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('LoadResString was given an invalid ResStringRec.Identifier'); + {$endif} + Result:='ERROR'; + exit; + end else begin + {$ifdef LINUX} + // This works with Unicode if the Linux has utf-8 character set + // Result:=System.LoadResString(ResStringRec); + ResMod:=FindResourceHInstance(ResStringRec^.Module^); + Handle:=FindResource(ResMod, + PAnsiChar(ResStringRec^.Identifier div ResStringTableLen), PAnsiChar(6)); // RT_STRING + Tab:=Pointer(LoadResource(ResMod, Handle)); + if Tab=nil then + Result:='' + else + Result:=PWideChar(PAnsiChar(Tab)+Tab[ResStringRec^.Identifier mod ResStringTableLen]); + {$endif} + {$ifdef MSWINDOWS} + if not Win32PlatformIsUnicode then begin + SetString(Result, Buffer, + LoadString(FindResourceHInstance(ResStringRec.Module^), + ResStringRec.Identifier, Buffer, SizeOf(Buffer))) + end else begin + Result := ''; + Len := 0; + While Length(Result)<=Len+1 do begin + if Length(Result) = 0 then + SetLength(Result, 1024) + else + SetLength(Result, Length(Result) * 2); + Len := LoadStringW(FindResourceHInstance(ResStringRec.Module^), + ResStringRec.Identifier, PWideChar(Result), Length(Result)); + end; + SetLength(Result, Len); + end; + {$endif} + end; + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('Loaded resourcestring: '+utf8encode(Result)); + {$endif} + if CreatorThread<>GetCurrentThreadId then begin + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('LoadResString was called from an invalid thread. Resourcestring was not translated.'); + {$endif} + end else + Result:=ResourceStringGettext(Result); +end; + +procedure TGnuGettextInstance.RetranslateComponent(AnObject: TComponent; + const TextDomain: DomainString); +var + comp:TGnuGettextComponentMarker; +begin + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('======================================================================'); + DebugWriteln ('RetranslateComponent() was called for a component with name '+AnObject.Name+'.'); + {$endif} + comp:=AnObject.FindComponent('GNUgettextMarker') as TGnuGettextComponentMarker; + if comp=nil then begin + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('Retranslate was called on an object that has not been translated before. An Exception is being raised.'); + {$endif} + raise EGGProgrammingError.Create ('Retranslate was called on an object that has not been translated before. Please use TranslateComponent() before RetranslateComponent().'); + end else begin + if comp.LastLanguage<>curlang then begin + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('The retranslator is being executed.'); + {$endif} + comp.Retranslator.Execute; + end else begin + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('The language has not changed. The retranslator is not executed.'); + {$endif} + end; + end; + comp.LastLanguage:=curlang; + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('======================================================================'); + {$endif} +end; + +procedure TGnuGettextInstance.TP_IgnoreClass(IgnClass: TClass); +var + cm:TClassMode; + i:integer; +begin + for i:=0 to TP_ClassHandling.Count-1 do begin + cm:=TObject(TP_ClassHandling.Items[i]) as TClassMode; + if cm.HClass=IgnClass then + raise EGGProgrammingError.Create ('You cannot add a class to the ignore list that is already on that list: '+IgnClass.ClassName+'.'); + if IgnClass.InheritsFrom(cm.HClass) then begin + // This is the place to insert this class + cm:=TClassMode.Create; + cm.HClass:=IgnClass; + TP_ClassHandling.Insert(i,cm); + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('Locally, class '+IgnClass.ClassName+' is being ignored.'); + {$endif} + exit; + end; + end; + cm:=TClassMode.Create; + cm.HClass:=IgnClass; + TP_ClassHandling.Add(cm); + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('Locally, class '+IgnClass.ClassName+' is being ignored.'); + {$endif} +end; + +procedure TGnuGettextInstance.TP_IgnoreClassProperty(IgnClass: TClass; + propertyname: ComponentNameString); +var + cm:TClassMode; + i:integer; +begin + propertyname:=uppercase(propertyname); + for i:=0 to TP_ClassHandling.Count-1 do begin + cm:=TObject(TP_ClassHandling.Items[i]) as TClassMode; + if cm.HClass=IgnClass then begin + if Assigned(cm.SpecialHandler) then + raise EGGProgrammingError.Create ('You cannot ignore a class property for a class that has a handler set.'); + cm.PropertiesToIgnore.Add(propertyname); + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('Globally, the '+propertyname+' property of class '+IgnClass.ClassName+' is being ignored.'); + {$endif} + exit; + end; + if IgnClass.InheritsFrom(cm.HClass) then begin + // This is the place to insert this class + cm:=TClassMode.Create; + cm.HClass:=IgnClass; + cm.PropertiesToIgnore.Add(propertyname); + TP_ClassHandling.Insert(i,cm); + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('Locally, the '+propertyname+' property of class '+IgnClass.ClassName+' is being ignored.'); + {$endif} + exit; + end; + end; + cm:=TClassMode.Create; + cm.HClass:=IgnClass; + cm.PropertiesToIgnore.Add(propertyname); + TP_GlobalClassHandling.Add(cm); + {$ifdef DXGETTEXTDEBUG} + DebugWriteln ('Locally, the '+propertyname+' property of class '+IgnClass.ClassName+' is being ignored.'); + {$endif} +end; + +procedure TGnuGettextInstance.FreeTP_ClassHandlingItems; +begin + while TP_ClassHandling.Count<>0 do begin + TObject(TP_ClassHandling.Items[0]).Free; + TP_ClassHandling.Delete(0); + end; +end; + +{$ifndef UNICODE} +function TGnuGettextInstance.ansi2wideDTCP(const s: ansistring): MsgIdString; +{$ifdef MSWindows} +var + len:integer; +{$endif} +begin +{$ifdef MSWindows} + if DesignTimeCodePage=CP_ACP then begin + // No design-time codepage specified. Using runtime codepage instead. +{$endif} + Result:=s; +{$ifdef MSWindows} + end else begin + len:=length(s); + if len=0 then + Result:='' + else begin + SetLength (Result,len); + len:=MultiByteToWideChar(DesignTimeCodePage,0,pansichar(s),len,pwidechar(Result),len); + if len=0 then + raise EGGAnsi2WideConvError.Create ('Cannot convert string to widestring:'+sLineBreak+s); + SetLength (Result,len); + end; + end; +{$endif} +end; +{$endif} + +{$ifndef DELPHI5OROLDER} +{$ifndef UNICODE} +function TGnuGettextInstance.dngettext(const szDomain: DomainString; const singular, + plural: ansistring; Number: Integer): TranslatedUnicodeString; +begin + Result:=dngettext (szDomain, ansi2wideDTCP(singular), ansi2wideDTCP(plural), Number); +end; +{$endif} +{$endif} + +{ TClassMode } + +constructor TClassMode.Create; +begin + PropertiesToIgnore:=TStringList.Create; + PropertiesToIgnore.Sorted:=True; + PropertiesToIgnore.Duplicates:=dupError; + {$ifndef DELPHI5OROLDER} + PropertiesToIgnore.CaseSensitive:=False; + {$endif} +end; + +destructor TClassMode.Destroy; +begin + FreeAndNil (PropertiesToIgnore); + inherited; +end; + +{ TFileLocator } + +procedure TFileLocator.Analyze; +var + s:ansistring; + i:integer; + offset:int64; + fs:TFileStream; + fi:TEmbeddedFileInfo; + filename:FilenameString; +begin + s:='6637DB2E-62E1-4A60-AC19-C23867046A89'#0#0#0#0#0#0#0#0; + s:=MidStr(s,length(s)-7,8); + offset:=0; + for i:=8 downto 1 do + offset:=offset shl 8+ord(s[i]); + if offset=0 then + exit; + BaseDirectory:=ExtractFilePath(ExecutableFilename); + try + fs:=TFileStream.Create(ExecutableFilename,fmOpenRead or fmShareDenyNone); + try + while true do begin + fs.Seek(offset,soFromBeginning); + offset:=ReadInt64(fs); + if offset=0 then + exit; + fi:=TEmbeddedFileInfo.Create; + try + fi.Offset:=ReadInt64(fs); + fi.Size:=ReadInt64(fs); + SetLength (filename, offset-fs.position); + fs.ReadBuffer (filename[1],offset-fs.position); + filename:=trim(filename); + if PreferExternal and sysutils.fileexists(basedirectory+filename) then begin + // Disregard the internal version and use the external version instead + FreeAndNil (fi); + end else + filelist.AddObject(filename,fi); + except + FreeAndNil (fi); + raise; + end; + end; + finally + FreeAndNil (fs); + end; + except + {$ifdef DXGETTEXTDEBUG} + raise; + {$endif} + end; +end; + +constructor TFileLocator.Create; +begin + MoFilesCS:=TMultiReadExclusiveWriteSynchronizer.Create; + MoFiles:=TStringList.Create; + filelist:=TStringList.Create; + {$ifdef LINUX} + filelist.Duplicates:=dupError; + filelist.CaseSensitive:=True; + {$endif} + MoFiles.Sorted:=True; + {$ifndef DELPHI5OROLDER} + MoFiles.Duplicates:=dupError; + MoFiles.CaseSensitive:=False; + {$ifdef MSWINDOWS} + filelist.Duplicates:=dupError; + filelist.CaseSensitive:=False; + {$endif} + {$endif} + filelist.Sorted:=True; +end; + +destructor TFileLocator.Destroy; +begin + while filelist.count<>0 do begin + filelist.Objects[0].Free; + filelist.Delete (0); + end; + FreeAndNil (filelist); + FreeAndNil (MoFiles); + FreeAndNil (MoFilesCS); + inherited; +end; + +function TFileLocator.FileExists(filename: FilenameString): boolean; +var + idx:integer; +begin + if LeftStr(filename,length(basedirectory))=basedirectory then begin + // Cut off basedirectory if the file is located beneath that base directory + filename:=MidStr(filename,length(basedirectory)+1,maxint); + end; + Result:=filelist.Find(filename,idx); +end; + +function TFileLocator.GetMoFile(filename: FilenameString; DebugLogger:TDebugLogger): TMoFile; +var + fi:TEmbeddedFileInfo; + idx:integer; + idxname:FilenameString; + Offset, Size: Int64; + realfilename:FilenameString; +begin + // Find real filename + offset:=0; + size:=0; + realfilename:=filename; + if LeftStr(filename,length(basedirectory))=basedirectory then begin + filename:=MidStr(filename,length(basedirectory)+1,maxint); + idx:=filelist.IndexOf(filename); + if idx<>-1 then begin + fi:=filelist.Objects[idx] as TEmbeddedFileInfo; + realfilename:=ExecutableFilename; + offset:=fi.offset; + size:=fi.size; + {$ifdef DXGETTEXTDEBUG} + DebugLogger ('Instead of '+filename+', using '+realfilename+' from offset '+IntTostr(offset)+', size '+IntToStr(size)); + {$endif} + end; + end; + + + {$ifdef DXGETTEXTDEBUG} + DebugLogger ('Reading .mo data from file '''+filename+''''); + {$endif} + + // Find TMoFile object + MoFilesCS.BeginWrite; + try + idxname:=realfilename+' //\\ '+IntToStr(offset); + if MoFiles.Find(idxname, idx) then begin + Result:=MoFiles.Objects[idx] as TMoFile; + end else begin + Result:=TMoFile.Create (realfilename, Offset, Size); + MoFiles.AddObject(idxname, Result); + end; + Inc (Result.Users); + finally + MoFilesCS.EndWrite; + end; +end; + +function TFileLocator.ReadInt64(str: TStream): int64; +begin + Assert (sizeof(Result)=8); + str.ReadBuffer(Result,8); +end; + +procedure TFileLocator.ReleaseMoFile(mofile: TMoFile); +var + i:integer; +begin + Assert (mofile<>nil); + + MoFilesCS.BeginWrite; + try + dec (mofile.Users); + if mofile.Users<=0 then begin + i:=MoFiles.Count-1; + while i>=0 do begin + if MoFiles.Objects[i]=mofile then begin + MoFiles.Delete(i); + FreeAndNil (mofile); + break; + end; + dec (i); + end; + end; + finally + MoFilesCS.EndWrite; + end; +end; + +{ TTP_Retranslator } + +constructor TTP_Retranslator.Create; +begin + list:=TList.Create; +end; + +destructor TTP_Retranslator.Destroy; +var + i:integer; +begin + for i:=0 to list.Count-1 do + TObject(list.Items[i]).Free; + FreeAndNil (list); + inherited; +end; + +procedure TTP_Retranslator.Execute; +var + i:integer; + sl:TStrings; + item:TTP_RetranslatorItem; + newvalue:TranslatedUnicodeString; + comp:TGnuGettextComponentMarker; + {$ifndef DELPHI5OROLDER} + ppi:PPropInfo; + {$endif} +begin + for i:=0 to list.Count-1 do begin + item:=TObject(list.items[i]) as TTP_RetranslatorItem; + if item.obj is TComponent then begin + comp:=TComponent(item.obj).FindComponent('GNUgettextMarker') as TGnuGettextComponentMarker; + if Assigned(comp) and (self<>comp.Retranslator) then begin + comp.Retranslator.Execute; + Continue; + end; + end; + if item.obj is TStrings then begin + // Since we don't know the order of items in sl, and don't have + // the original .Objects[] anywhere, we cannot anticipate anything + // about the current sl.Strings[] and sl.Objects[] values. We therefore + // have to discard both values. We can, however, set the original .Strings[] + // value into the list and retranslate that. + sl:=TStringList.Create; + try + sl.Text:=item.OldValue; + Instance.TranslateStrings(sl,textdomain); + (item.obj as TStrings).BeginUpdate; + try + (item.obj as TStrings).Text:=sl.Text; + finally + (item.obj as TStrings).EndUpdate; + end; + finally + FreeAndNil (sl); + end; + end else begin + newValue:=instance.dgettext(textdomain,item.OldValue); + {$ifdef DELPHI5OROLDER} + SetStrProp(item.obj, item.PropName, newValue); + {$endif} + {$ifndef DELPHI5OROLDER} + ppi:=GetPropInfo(item.obj, item.Propname); + if ppi<>nil then begin + SetWideStrProp(item.obj, ppi, newValue); + end else begin + {$ifdef DXGETTEXTDEBUG} + Instance.DebugWriteln ('ERROR: On retranslation, property disappeared: '+item.Propname+' for object of type '+item.obj.ClassName); + {$endif} + end; + {$endif} + end; + end; +end; + +procedure TTP_Retranslator.Remember(obj: TObject; PropName: ComponentNameString; + OldValue: TranslatedUnicodeString); +var + item:TTP_RetranslatorItem; +begin + item:=TTP_RetranslatorItem.Create; + item.obj:=obj; + item.Propname:=Propname; + item.OldValue:=OldValue; + list.Add(item); +end; + +{ TGnuGettextComponentMarker } + +destructor TGnuGettextComponentMarker.Destroy; +begin + FreeAndNil (Retranslator); + inherited; +end; + +{ THook } + +constructor THook.Create(OldProcedure, NewProcedure: pointer; FollowJump:boolean=false); +{ Idea and original code from Igor Siticov } +{ Modified by Jacques Garcia Vazquez and Lars Dybdahl } +begin + {$ifndef CPU386} + raise Exception.Create ('This procedure only works on Intel i386 compatible processors.'); + {$endif} + + oldproc:=OldProcedure; + newproc:=NewProcedure; + + Reset (FollowJump); +end; + +destructor THook.Destroy; +begin + Shutdown; + inherited; +end; + +procedure THook.Disable; +begin + Assert (PatchPosition<>nil,'Patch position in THook was nil when Disable was called'); + PatchPosition[0]:=Original[0]; + PatchPosition[1]:=Original[1]; + PatchPosition[2]:=Original[2]; + PatchPosition[3]:=Original[3]; + PatchPosition[4]:=Original[4]; +end; + +procedure THook.Enable; +begin + Assert (PatchPosition<>nil,'Patch position in THook was nil when Enable was called'); + PatchPosition[0]:=Patch[0]; + PatchPosition[1]:=Patch[1]; + PatchPosition[2]:=Patch[2]; + PatchPosition[3]:=Patch[3]; + PatchPosition[4]:=Patch[4]; +end; + +procedure THook.Reset(FollowJump: boolean); +var + offset:integer; + {$ifdef LINUX} + p:pointer; + pagesize:integer; + {$endif} + {$ifdef MSWindows} + ov: cardinal; + {$endif} +begin + if PatchPosition<>nil then + Shutdown; + + patchPosition := OldProc; + if FollowJump and (Word(OldProc^) = $25FF) then begin + // This finds the correct procedure if a virtual jump has been inserted + // at the procedure address + Inc(Integer(patchPosition), 2); // skip the jump + patchPosition := pansiChar(Pointer(pointer(patchPosition)^)^); + end; + offset:=integer(NewProc)-integer(pointer(patchPosition))-5; + + Patch[0] := ansichar($E9); + Patch[1] := ansichar(offset and 255); + Patch[2] := ansichar((offset shr 8) and 255); + Patch[3] := ansichar((offset shr 16) and 255); + Patch[4] := ansichar((offset shr 24) and 255); + + Original[0]:=PatchPosition[0]; + Original[1]:=PatchPosition[1]; + Original[2]:=PatchPosition[2]; + Original[3]:=PatchPosition[3]; + Original[4]:=PatchPosition[4]; + + {$ifdef MSWINDOWS} + if not VirtualProtect(Pointer(PatchPosition), 5, PAGE_EXECUTE_READWRITE, @ov) then + RaiseLastOSError; + {$endif} + {$ifdef LINUX} + pageSize:=sysconf (_SC_PAGE_SIZE); + p:=pointer(PatchPosition); + p:=pointer((integer(p) + PAGESIZE-1) and not (PAGESIZE-1) - pageSize); + if mprotect (p, pageSize, PROT_READ + PROT_WRITE + PROT_EXEC) <> 0 then + RaiseLastOSError; + {$endif} +end; + +procedure THook.Shutdown; +begin + Disable; + PatchPosition:=nil; +end; + +procedure HookIntoResourceStrings (enabled:boolean=true; SupportPackages:boolean=false); +begin + HookLoadResString.Reset (SupportPackages); + HookLoadStr.Reset (SupportPackages); + HookFmtLoadStr.Reset (SupportPackages); + if enabled then begin + HookLoadResString.Enable; + HookLoadStr.Enable; + HookFmtLoadStr.Enable; + end; +end; + +{ TMoFile } + +function TMoFile.autoswap32(i: cardinal): cardinal; +var + cnv1, cnv2: + record + case integer of + 0: (arr: array[0..3] of byte); + 1: (int: cardinal); + end; +begin + if doswap then begin + cnv1.int := i; + cnv2.arr[0] := cnv1.arr[3]; + cnv2.arr[1] := cnv1.arr[2]; + cnv2.arr[2] := cnv1.arr[1]; + cnv2.arr[3] := cnv1.arr[0]; + Result := cnv2.int; + end else + Result := i; +end; + +function TMoFile.CardinalInMem(baseptr: PansiChar; Offset: Cardinal): Cardinal; +var pc:^Cardinal; +begin + inc (baseptr,offset); + pc:=Pointer(baseptr); + Result:=pc^; + if doswap then + autoswap32(Result); +end; + +constructor TMoFile.Create(filename: FilenameString; Offset,Size:int64); +var + i:cardinal; + nn:integer; + {$ifdef linux} + mofile:TFileStream; + {$endif} +begin + if sizeof(i) <> 4 then + raise EGGProgrammingError.Create('TDomain in gnugettext is written for an architecture that has 32 bit integers.'); + + {$ifdef mswindows} + // Map the mo file into memory and let the operating system decide how to cache + mo:=createfile (PChar(filename),GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING,0,0); + if mo=INVALID_HANDLE_VALUE then + raise EGGIOError.Create ('Cannot open file '+filename); + momapping:=CreateFileMapping (mo, nil, PAGE_READONLY, 0, 0, nil); + if momapping=0 then + raise EGGIOError.Create ('Cannot create memory map on file '+filename); + momemoryHandle:=MapViewOfFile (momapping,FILE_MAP_READ,0,0,0); + if momemoryHandle=nil then begin + raise EGGIOError.Create ('Cannot map file '+filename+' into memory. Reason: '+GetLastWinError); + end; + momemory:=momemoryHandle+offset; + {$endif} + {$ifdef linux} + // Read the whole file into memory + mofile:=TFileStream.Create (filename, fmOpenRead or fmShareDenyNone); + try + if size=0 then + size:=mofile.Size; + Getmem (momemoryHandle,size); + momemory:=momemoryHandle; + mofile.Seek(offset,soFromBeginning); + mofile.ReadBuffer(momemory^,size); + finally + FreeAndNil (mofile); + end; + {$endif} + + // Check the magic number + doswap:=False; + i:=CardinalInMem(momemory,0); + if (i <> $950412DE) and (i <> $DE120495) then + raise EGGIOError.Create('This file is not a valid GNU gettext mo file: ' + filename); + doswap := (i = $DE120495); + + + // Find the positions in the file according to the file format spec + CardinalInMem(momemory,4); // Read the version number, but don't use it for anything. + N:=CardinalInMem(momemory,8); // Get string count + O:=CardinalInMem(momemory,12); // Get offset of original strings + T:=CardinalInMem(momemory,16); // Get offset of translated strings + + // Calculate start conditions for a binary search + nn := N; + startindex := 1; + while nn <> 0 do begin + nn := nn shr 1; + startindex := startindex shl 1; + end; + startindex := startindex shr 1; + startstep := startindex shr 1; +end; + +destructor TMoFile.Destroy; +begin + {$ifdef mswindows} + UnMapViewOfFile (momemoryHandle); + CloseHandle (momapping); + CloseHandle (mo); + {$endif} + {$ifdef linux} + FreeMem (momemoryHandle); + {$endif} + inherited; +end; + +function TMoFile.gettext(const msgid: RawUtf8String;var found:boolean): RawUtf8String; +var + i, step: cardinal; + offset, pos: cardinal; + CompareResult:integer; + msgidptr,a,b:PAnsiChar; + abidx:integer; + size, msgidsize:integer; +begin + found:=false; + msgidptr:=PAnsiChar(msgid); + msgidsize:=length(msgid); + + // Do binary search + i:=startindex; + step:=startstep; + while true do begin + // Get string for index i + pos:=O+8*(i-1); + offset:=CardinalInMem (momemory,pos+4); + size:=CardinalInMem (momemory,pos); + a:=msgidptr; + b:=momemory+offset; + abidx:=size; + if msgidsize0 do begin + CompareResult:=integer(byte(a^))-integer(byte(b^)); + if CompareResult<>0 then + break; + dec (abidx); + inc (a); + inc (b); + end; + if CompareResult=0 then + CompareResult:=msgidsize-size; + if CompareResult=0 then begin // msgid=s + // Found the msgid + pos:=T+8*(i-1); + offset:=CardinalInMem (momemory,pos+4); + size:=CardinalInMem (momemory,pos); + SetString (Result,momemory+offset,size); + found:=True; + break; + end; + if step=0 then begin + // Not found + Result:=msgid; + break; + end; + if CompareResult<0 then begin // msgids + i := i + step; + if i > N then + i := N; + step := step shr 1; + end; + end; +end; + +var + param0:string; + +initialization + {$ifdef DXGETTEXTDEBUG} + {$ifdef MSWINDOWS} + MessageBox (0,'gnugettext.pas debugging is enabled. Turn it off before releasing this piece of software.','Information',MB_OK); + {$endif} + {$ifdef LINUX} + writeln (stderr,'gnugettext.pas debugging is enabled. Turn it off before releasing this piece of software.'); + {$endif} + {$endif} + {$ifdef FPC} + {$ifdef LINUX} + SetLocale(LC_ALL, ''); + SetCWidestringManager; + {$endif LINUX} + {$endif FPC} + if IsLibrary then begin + // Get DLL/shared object filename + SetLength (ExecutableFilename,300); + {$ifdef MSWINDOWS} + SetLength (ExecutableFilename,GetModuleFileName(FindClassHInstance(TGnuGettextInstance), PChar(ExecutableFilename), length(ExecutableFilename))); + {$else} + SetLength (ExecutableFilename,GetModuleFileName(0, PAnsiChar(ExecutableFilename), length(ExecutableFilename))); + {$endif} + end else + ExecutableFilename:=Paramstr(0); + FileLocator:=TFileLocator.Create; + FileLocator.Analyze; + ResourceStringDomainList:=TStringList.Create; + ResourceStringDomainList.Add(DefaultTextDomain); + ResourceStringDomainListCS:=TMultiReadExclusiveWriteSynchronizer.Create; + DefaultInstance:=TGnuGettextInstance.Create; + {$ifdef MSWINDOWS} + Win32PlatformIsUnicode := (Win32Platform = VER_PLATFORM_WIN32_NT); + {$endif} + + // replace Borlands LoadResString with gettext enabled version: + {$ifdef UNICODE} + HookLoadResString:=THook.Create (@system.LoadResString, @LoadResStringW); + {$else} + HookLoadResString:=THook.Create (@system.LoadResString, @LoadResStringA); + {$endif} + HookLoadStr:=THook.Create (@sysutils.LoadStr, @SysUtilsLoadStr); + HookFmtLoadStr:=THook.Create (@sysutils.FmtLoadStr, @SysUtilsFmtLoadStr); + param0:=lowercase(extractfilename(paramstr(0))); + if (param0<>'delphi32.exe') and (param0<>'kylix') and (param0<>'bds.exe') then + HookIntoResourceStrings (AutoCreateHooks,false); + param0:=''; + +finalization + FreeAndNil (DefaultInstance); + FreeAndNil (ResourceStringDomainListCS); + FreeAndNil (ResourceStringDomainList); + FreeAndNil (HookFmtLoadStr); + FreeAndNil (HookLoadStr); + FreeAndNil (HookLoadResString); + FreeAndNil (FileLocator); + +end. + diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/langcodes.txt b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/langcodes.txt new file mode 100644 index 0000000..789face --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/langcodes.txt @@ -0,0 +1,15 @@ +[de] German +[en] English +[es] Spanish +[fi] Finnish +[fr] French +[ja] Japanese +[ko] Korean +[nl] Dutch +[pt_BR] Brazilian Portuguese +[ru] Russian +[sr_Cyrillic] Serbian Cyrillic +[sr_Latin] Serbian Latin +[sv] Swedish +[tr] Turkish +[zh_CN] Chinese \ No newline at end of file diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/de/LC_MESSAGES/default.mo b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/de/LC_MESSAGES/default.mo new file mode 100644 index 0000000000000000000000000000000000000000..79cd84eb1f5dbb9dfa1ada2be45e5dc170c4554c GIT binary patch literal 3353 zcmZvdU5r~t6@Z5j`m=4Jgi@gVWT0SLlIwc6*(PzDQm@zBq`Ubc-UeEDxwgmlt*_@= zbMM_`x4;8PfK>WYMAe5N9tiLNLP!WyM5LlF5(r)pQXUXeQIUYBN`Mfp$^(4o-tpQM zj6CzroSA#(%sFSqFCEzbbwz1W-$z~Dr&I{z{WO%ny+x_(;NRgb@HNO!U58M3GrS%i zfbW2JczG4x%J_(vx8MzoAM@{Y$i6Ko`<(Xtq?d|Umdz0-0R9ge7uP{m%k!%|L^P^+*)y_foNs=RF zQa(&=Qss=|*E^`w(xP(@RnEilin2mm^L@eHzJDBw|0IW{1SQn%p6`VpquxoCypkgE z6(33-E>fkuo4Qo=czfU>-~T9-`zkqbA5~(1nEDV^;w0t%5=DF@CP!slX>^i2QWyTeDy?3GY%PinZQ{nEj0$Fv9q7#@i94ZFm6Il(sLDpTjgE9CJ`-+5gD{H{ zJCmKA$T(G%cGNS)$L)*_L)V+F@p@TwAu< zO=C0TOi#VR_GU8KR?R%kl5w_Y9n0NXV=x)iLpf^r<|VWTsSbgZL)l# z&V^}a)HxT~j5e7Vmqpln-t?VGhw6MZ7|u2=M_r5>>1=3pRz^Ifqth&OnV!VqHo2hM z;g%^HU0PrEySa0ON3)33&|z9vZ4v9DvztNFnIg`?YM7b2UaHlWgW9p6c3dysS6^OcO>o|9 zMWSGS$>LJ5bX+ej)sNhJsJ2+EEo|VRVAF**jYFbR*PFv+9HzQGF?ivDtQb{O89kJx zY0}TCJ@eqg=~Jg$GXoc^wS^|p=kUSi_5^z}b1AzAZ$vSgIt`7BxG;rZ~JSR$uH%h+E)3iIZhNsG^ zm6-!u1jlqF4%~WO>hgN?bYS|sSBDt2Vhl-a_uhy3UJ(K2+Iex3c6aEaerDyV@cn_? z{mJe(_uh*OiBn}{nnRb^Xr$J2F2mOBv54#_)nT4a{mz52d-aVkMy}e4Tz8il{r_Cc z^RfGEzi%f97 z&dgFWDxR1y@9SP<^hS}2hjl*IJ#Jp3lM>9>SiO_$ju}K&EaW~)LbzFv4~utZZ_4P9 o-7%FYl~X#5, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Customizer Demo\n" +"POT-Creation-Date: 2005-08-09 16:55\n" +"PO-Revision-Date: 2005-12-29 22:43+0100\n" +"Last-Translator: Thomas Speck \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: dxgettext 1.2\n" +"Language-Team: \n" + +#. Form1..SpTBXDock1..tbStandard..Caption +#: Unit1.dfm:29 +msgid "Standard" +msgstr "Standard" + +#. Form1..SpTBXDock1..tbStandard..tNew..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mNew..CaptionW +#. Form1..TntActionList1..aNew..Caption +#: Unit1.dfm:37 +#: Unit1.dfm:159 +#: Unit1.dfm:1559 +msgid "New" +msgstr "Neu" + +#. Form1..SpTBXDock1..tbStandard..tOpen..CaptionW +#: Unit1.dfm:41 +msgid "Open" +msgstr "Öffnen" + +#. Form1..SpTBXDock1..tbStandard..tSave..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mSave..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayoutSave..CaptionW +#. Form1..TntActionList1..aSave..Caption +#: Unit1.dfm:45 +#: Unit1.dfm:167 +#: Unit1.dfm:318 +#: Unit1.dfm:1573 +msgid "Save" +msgstr "Speichern" + +#. Form1..SpTBXDock1..tbStandard..tCut..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCut..CaptionW +#. Form1..TntActionList1..aCut..Caption +#: Unit1.dfm:51 +#: Unit1.dfm:184 +#: Unit1.dfm:1585 +msgid "Cut" +msgstr "Ausschneiden" + +#. Form1..SpTBXDock1..tbStandard..tCopy..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCopy..CaptionW +#. Form1..TntActionList1..aCopy..Caption +#: Unit1.dfm:55 +#: Unit1.dfm:188 +#: Unit1.dfm:1592 +msgid "Copy" +msgstr "Kopieren" + +#. Form1..SpTBXDock1..tbStandard..tPaste..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mPaste..CaptionW +#. Form1..TntActionList1..aPaste..Caption +#: Unit1.dfm:60 +#: Unit1.dfm:192 +#: Unit1.dfm:1599 +msgid "Paste" +msgstr "Einfügen" + +#. Form1..SpTBXDock1..tbStandard..tFind..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mFind..CaptionW +#. Form1..TntActionList1..aFind..Caption +#: Unit1.dfm:67 +#: Unit1.dfm:206 +#: Unit1.dfm:1612 +msgid "Find" +msgstr "Suchen" + +#. Form1..SpTBXDock1..tbStandard..tThemes..CaptionW +#: Unit1.dfm:73 +msgid "Themes" +msgstr "Themen" + +#. Form1..SpTBXDock1..tbFormat..Caption +#. Form1..TntActionList1..aBold..Category +#. Form1..TntActionList1..aItalic..Category +#. Form1..TntActionList1..aUnderline..Category +#. Form1..TntActionList1..aLeftJustify..Category +#. Form1..TntActionList1..aRightJustify..Category +#. Form1..TntActionList1..aCentered..Category +#. Form1..TntActionList1..aBullets..Category +#. Form1..TntActionList1..aNumberedBullets..Category +#: Unit1.dfm:99 +#: Unit1.dfm:1618 +#: Unit1.dfm:1625 +#: Unit1.dfm:1632 +#: Unit1.dfm:1639 +#: Unit1.dfm:1645 +#: Unit1.dfm:1651 +#: Unit1.dfm:1657 +#: Unit1.dfm:1663 +msgid "Format" +msgstr "Format" + +#. Form1..SpTBXDock1..tbFormat..tFont..Caption +#: Unit1.dfm:106 +msgid "Font Name" +msgstr "Schriftname" + +#. Form1..SpTBXDock1..tbFormat..tFontSize..Caption +#: Unit1.dfm:116 +msgid "Font Size" +msgstr "Schriftgröße" + +#. Form1..SpTBXDock1..tbFormat..tBold..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBold..CaptionW +#. Form1..TntActionList1..aBold..Caption +#: Unit1.dfm:132 +#: Unit1.dfm:213 +#: Unit1.dfm:1619 +msgid "Bold" +msgstr "Fett" + +#. Form1..SpTBXDock1..tbFormat..tItalic..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mItalic..CaptionW +#. Form1..TntActionList1..aItalic..Caption +#: Unit1.dfm:136 +#: Unit1.dfm:217 +#: Unit1.dfm:1626 +msgid "Italic" +msgstr "Kursiv" + +#. Form1..SpTBXDock1..tbFormat..tUnderline..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mUnderline..CaptionW +#. Form1..TntActionList1..aUnderline..Caption +#: Unit1.dfm:140 +#: Unit1.dfm:221 +#: Unit1.dfm:1633 +msgid "Underline" +msgstr "Unterstrichen" + +#. Form1..SpTBXDock1..tbMenuBar..Caption +#: Unit1.dfm:146 +msgid "Menu" +msgstr "Menü" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..CaptionW +#: Unit1.dfm:156 +msgid "&File" +msgstr "&Datei" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mOpen..CaptionW +#. Form1..TntActionList1..aOpen..Caption +#: Unit1.dfm:163 +#: Unit1.dfm:1566 +msgid "Open..." +msgstr "Öffnen..." + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mPrint..CaptionW +#. Form1..TntActionList1..aPrint..Caption +#. Form1..SpTBXCustomizer1..cPrint..CaptionW +#: Unit1.dfm:171 +#: Unit1.dfm:1670 +#: Unit1.dfm:1744 +msgid "Print" +msgstr "Drucken" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mExit..CaptionW +#. Form1..TntActionList1..aExit..Caption +#. Form1..SpTBXCustomizer1..cExit..CaptionW +#: Unit1.dfm:177 +#: Unit1.dfm:1580 +#: Unit1.dfm:1776 +msgid "Exit" +msgstr "Beenden" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..CaptionW +#: Unit1.dfm:181 +msgid "&Edit" +msgstr "B&earbeiten" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mSelectAll..CaptionW +#. Form1..TntActionList1..aSelectAll..Caption +#. Form1..SpTBXCustomizer1..cSelectAll..CaptionW +#: Unit1.dfm:198 +#: Unit1.dfm:1606 +#: Unit1.dfm:1772 +msgid "Select All" +msgstr "Alles markieren" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..CaptionW +#: Unit1.dfm:210 +msgid "&Format" +msgstr "&Format" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mLeftJustify..CaptionW +#. Form1..TntActionList1..aLeftJustify..Caption +#. Form1..SpTBXCustomizer1..cLeftJustify..CaptionW +#: Unit1.dfm:227 +#: Unit1.dfm:1640 +#: Unit1.dfm:1748 +msgid "Left Justify" +msgstr "Links ausrichten" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mCentered..CaptionW +#. Form1..TntActionList1..aCentered..Caption +#. Form1..SpTBXCustomizer1..cCentered..CaptionW +#: Unit1.dfm:231 +#: Unit1.dfm:1652 +#: Unit1.dfm:1752 +msgid "Centered" +msgstr "Zentriert" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mRightJustify..CaptionW +#. Form1..TntActionList1..aRightJustify..Caption +#. Form1..SpTBXCustomizer1..cRightJustify..CaptionW +#: Unit1.dfm:235 +#: Unit1.dfm:1646 +#: Unit1.dfm:1756 +msgid "Right Justify" +msgstr "Rechts ausrichten" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBullets..CaptionW +#. Form1..TntActionList1..aBullets..Caption +#. Form1..SpTBXCustomizer1..cBullets..CaptionW +#: Unit1.dfm:241 +#: Unit1.dfm:1658 +#: Unit1.dfm:1760 +msgid "Bullets" +msgstr "Aufzählungszeichen" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mNumberedBullets..CaptionW +#. Form1..TntActionList1..aNumberedBullets..Caption +#. Form1..SpTBXCustomizer1..cNumBullets..CaptionW +#: Unit1.dfm:245 +#: Unit1.dfm:1664 +#: Unit1.dfm:1764 +msgid "Numbered Bullets" +msgstr "Sortierte Aufzählungszeichen" + +#. Form1..SpTBXDock1..tbMenuBar..mView..CaptionW +#: Unit1.dfm:249 +msgid "&View" +msgstr "&Ansicht" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..CaptionW +#: Unit1.dfm:251 +msgid "&Sidebar" +msgstr "&Navigationsbereich einrichten" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mCommandsLog..CaptionW +#: Unit1.dfm:254 +msgid "&Commands Log" +msgstr "&Kommandoprotokoll" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mOptions..CaptionW +#: Unit1.dfm:258 +msgid "&Options" +msgstr "&Optionen" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mmHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mmmHelp..CaptionW +#: Unit1.dfm:262 +#: Unit1.dfm:286 +#: Unit1.dfm:288 +msgid "&Help" +msgstr "&Hilfe" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..CaptionW +#: Unit1.dfm:266 +msgid "&Toolbars" +msgstr "&Toolbars" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mStandardToolbar..CaptionW +#: Unit1.dfm:269 +msgid "&Standard Toolbar" +msgstr "&Standardleiste" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..tLayoutsToolbar..CaptionW +#: Unit1.dfm:273 +msgid "&Layouts Toolbar" +msgstr "&Layoutleiste" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mFormattingToolbar..CaptionW +#: Unit1.dfm:277 +msgid "&Formatting Toolbar" +msgstr "&Formatleiste" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mNavigationToolbar..CaptionW +#: Unit1.dfm:281 +msgid "&Navigation Toolbar" +msgstr "&Navigationsleiste" + +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mAbout..CaptionW +#: Unit1.dfm:291 +msgid "&About" +msgstr "&Info" + +#. Form1..SpTBXDock1..tbLayouts..Caption +#. Form1..SpTBXDock1..tbLayouts..Layouts..SpTBXLabelItem1..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayouts..Caption +#: Unit1.dfm:298 +#: Unit1.dfm:305 +#: Unit1.dfm:308 +msgid "Layouts" +msgstr "Layouts" + +#. Form1..SpTBXMultiDock1..dpLog..Caption +#: Unit1.dfm:332 +msgid "Commands Log" +msgstr "Kommandoprotokoll" + +#. Form1..SpTBXMultiDock1..dpOptions..Caption +#: Unit1.dfm:352 +msgid "Customizer Options" +msgstr "Anpassungsoptionen" + +#. Form1..SpTBXMultiDock2..dpHelp..Caption +#: Unit1.dfm:368 +msgid "Help" +msgstr "Hilfe" + +#. Form1..SpTBXMultiDock2..dpHelp..SpTBXLabel1..Caption +#: Unit1.dfm:380 +msgid "Right click the toolbars to start playing" +msgstr "Rechtsklick auf die Leiste, um das Abspielen zu beginnen" + +#. Form1..SpTBXDock2..tbNavigation..Caption +#. Form1..TntActionList1..aBack..Category +#. Form1..TntActionList1..aForward..Category +#. Form1..TntActionList1..aStop..Category +#. Form1..TntActionList1..aRefresh..Category +#. Form1..TntActionList1..aSearch..Category +#. Form1..TntActionList1..aFavs..Category +#: Unit1.dfm:402 +#: Unit1.dfm:1675 +#: Unit1.dfm:1681 +#: Unit1.dfm:1687 +#: Unit1.dfm:1693 +#: Unit1.dfm:1699 +#: Unit1.dfm:1705 +msgid "Navigation" +msgstr "Navigation" + +#. Form1..SpTBXDock2..tbNavigation..tBack..CaptionW +#. Form1..TntActionList1..aBack..Caption +#: Unit1.dfm:409 +#: Unit1.dfm:1676 +msgid "Back" +msgstr "Zurück" + +#. Form1..SpTBXDock2..tbNavigation..tForward..CaptionW +#. Form1..TntActionList1..aForward..Caption +#: Unit1.dfm:413 +#: Unit1.dfm:1682 +msgid "Forward" +msgstr "Vor" + +#. Form1..SpTBXDock2..tbNavigation..tRefresh..CaptionW +#. Form1..TntActionList1..aRefresh..Caption +#: Unit1.dfm:417 +#: Unit1.dfm:1694 +msgid "Refresh" +msgstr "Aktualisieren" + +#. Form1..SpTBXDock2..tbNavigation..tStop..CaptionW +#. Form1..TntActionList1..aStop..Caption +#: Unit1.dfm:421 +#: Unit1.dfm:1688 +msgid "Stop" +msgstr "Stop" + +#. Form1..SpTBXDock2..tbNavigation..tSearch..CaptionW +#. Form1..TntActionList1..aSearch..Caption +#: Unit1.dfm:425 +#: Unit1.dfm:1700 +msgid "Search" +msgstr "Suchen" + +#. Form1..TntActionList1..aNew..Category +#. Form1..TntActionList1..aOpen..Category +#. Form1..TntActionList1..aSave..Category +#. Form1..TntActionList1..aExit..Category +#. Form1..TntActionList1..aPrint..Category +#: Unit1.dfm:1558 +#: Unit1.dfm:1565 +#: Unit1.dfm:1572 +#: Unit1.dfm:1579 +#: Unit1.dfm:1669 +msgid "Files" +msgstr "Dateien" + +#. Form1..TntActionList1..aCut..Category +#. Form1..TntActionList1..aCopy..Category +#. Form1..TntActionList1..aPaste..Category +#. Form1..TntActionList1..aSelectAll..Category +#. Form1..TntActionList1..aFind..Category +#: Unit1.dfm:1584 +#: Unit1.dfm:1591 +#: Unit1.dfm:1598 +#: Unit1.dfm:1605 +#: Unit1.dfm:1611 +msgid "Edit" +msgstr "Bearbeiten" + +#. Form1..TntActionList1..aFavs..Caption +#. Form1..SpTBXCustomizer1..cFavs..CaptionW +#: Unit1.dfm:1706 +#: Unit1.dfm:1768 +msgid "Favs" +msgstr "Favoriten" + +#. Form1..TntActionList1..aCustomize..Category +#. Form1..TntActionList1..aEmbeddedCustomize..Category +#: Unit1.dfm:1711 +#: Unit1.dfm:1716 +msgid "Customization" +msgstr "Anpassung" + +#. Form1..TntActionList1..aCustomize..Caption +#. Form1..SpTBXPopupMenu1..pCustomize..CaptionW +#: Unit1.dfm:1712 +#: Unit1.dfm:1731 +msgid "Customize..." +msgstr "Anpassen..." + +#. Form1..TntActionList1..aEmbeddedCustomize..Caption +#. Form1..SpTBXPopupMenu1..pEmbeddedCustomize..CaptionW +#: Unit1.dfm:1717 +#: Unit1.dfm:1735 +msgid "Embedded Customize..." +msgstr "Eingebettetes Anpassen..." + +#. Form2..Caption +#: Unit2.dfm:7 +msgid "Options" +msgstr "Optionen" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tProperties..CaptionW +#: Unit2.dfm:49 +msgid "Properties" +msgstr "Eigenschaften" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tPageSetup..CaptionW +#: Unit2.dfm:58 +msgid "Page Setup" +msgstr "Druckereinstellungen" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tHistory..CaptionW +#: Unit2.dfm:67 +msgid "History" +msgstr "Chronik" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tFavorites..CaptionW +#: Unit2.dfm:76 +msgid "Favorites" +msgstr "Favoriten" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tCustomize..CaptionW +#. Form2..LeftPanel..TitlePanel..Caption +#: Unit2.dfm:85 +#: Unit2.dfm:168 +msgid "Customizer" +msgstr "Anpassungsprogramm" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton1..Caption +#: Unit2.dfm:122 +msgid "OK" +msgstr "OK" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton2..Caption +#: Unit2.dfm:137 +msgid "Cancel" +msgstr "Abbrechen" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton3..Caption +#: Unit2.dfm:152 +msgid "Apply" +msgstr "Übernehmen" + +#: Unit1.pas:235 +msgid "Save Layout" +msgstr "Speichere Layout" + +#: Unit1.pas:235 +msgid "Save current layout as:" +msgstr "Speichere aktuelles Layout als:" + +#: Unit1.pas:248 +msgid "Executed" +msgstr "Ausgeführt" + diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/default.po b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/default.po new file mode 100644 index 0000000..f9c44d4 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/default.po @@ -0,0 +1,497 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Customizer Demo\n" +"POT-Creation-Date: 2005-08-09 16:55\n" +"PO-Revision-Date: 2005-08-09 16:55\n" +"Last-Translator: Somebody \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: dxgettext 1.2\n" + +#. Form1..SpTBXDock1..tbStandard..Caption +#: Unit1.dfm:29 +msgid "Standard" +msgstr "" + +#. Form1..SpTBXDock1..tbStandard..tNew..CaptionW +#: Unit1.dfm:37 +#. Form1..SpTBXDock1..tbMenuBar..mFile..mNew..CaptionW +#: Unit1.dfm:159 +#. Form1..TntActionList1..aNew..Caption +#: Unit1.dfm:1559 +msgid "New" +msgstr "" + +#. Form1..SpTBXDock1..tbStandard..tOpen..CaptionW +#: Unit1.dfm:41 +msgid "Open" +msgstr "" + +#. Form1..SpTBXDock1..tbStandard..tSave..CaptionW +#: Unit1.dfm:45 +#. Form1..SpTBXDock1..tbMenuBar..mFile..mSave..CaptionW +#: Unit1.dfm:167 +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayoutSave..CaptionW +#: Unit1.dfm:318 +#. Form1..TntActionList1..aSave..Caption +#: Unit1.dfm:1573 +msgid "Save" +msgstr "" + +#. Form1..SpTBXDock1..tbStandard..tCut..CaptionW +#: Unit1.dfm:51 +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCut..CaptionW +#: Unit1.dfm:184 +#. Form1..TntActionList1..aCut..Caption +#: Unit1.dfm:1585 +msgid "Cut" +msgstr "" + +#. Form1..SpTBXDock1..tbStandard..tCopy..CaptionW +#: Unit1.dfm:55 +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCopy..CaptionW +#: Unit1.dfm:188 +#. Form1..TntActionList1..aCopy..Caption +#: Unit1.dfm:1592 +msgid "Copy" +msgstr "" + +#. Form1..SpTBXDock1..tbStandard..tPaste..CaptionW +#: Unit1.dfm:60 +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mPaste..CaptionW +#: Unit1.dfm:192 +#. Form1..TntActionList1..aPaste..Caption +#: Unit1.dfm:1599 +msgid "Paste" +msgstr "" + +#. Form1..SpTBXDock1..tbStandard..tFind..CaptionW +#: Unit1.dfm:67 +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mFind..CaptionW +#: Unit1.dfm:206 +#. Form1..TntActionList1..aFind..Caption +#: Unit1.dfm:1612 +msgid "Find" +msgstr "" + +#. Form1..SpTBXDock1..tbStandard..tThemes..CaptionW +#: Unit1.dfm:73 +msgid "Themes" +msgstr "" + +#. Form1..SpTBXDock1..tbFormat..Caption +#: Unit1.dfm:99 +#. Form1..TntActionList1..aBold..Category +#: Unit1.dfm:1618 +#. Form1..TntActionList1..aItalic..Category +#: Unit1.dfm:1625 +#. Form1..TntActionList1..aUnderline..Category +#: Unit1.dfm:1632 +#. Form1..TntActionList1..aLeftJustify..Category +#: Unit1.dfm:1639 +#. Form1..TntActionList1..aRightJustify..Category +#: Unit1.dfm:1645 +#. Form1..TntActionList1..aCentered..Category +#: Unit1.dfm:1651 +#. Form1..TntActionList1..aBullets..Category +#: Unit1.dfm:1657 +#. Form1..TntActionList1..aNumberedBullets..Category +#: Unit1.dfm:1663 +msgid "Format" +msgstr "" + +#. Form1..SpTBXDock1..tbFormat..tFont..Caption +#: Unit1.dfm:106 +msgid "Font Name" +msgstr "" + +#. Form1..SpTBXDock1..tbFormat..tFontSize..Caption +#: Unit1.dfm:116 +msgid "Font Size" +msgstr "" + +#. Form1..SpTBXDock1..tbFormat..tBold..CaptionW +#: Unit1.dfm:132 +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBold..CaptionW +#: Unit1.dfm:213 +#. Form1..TntActionList1..aBold..Caption +#: Unit1.dfm:1619 +msgid "Bold" +msgstr "" + +#. Form1..SpTBXDock1..tbFormat..tItalic..CaptionW +#: Unit1.dfm:136 +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mItalic..CaptionW +#: Unit1.dfm:217 +#. Form1..TntActionList1..aItalic..Caption +#: Unit1.dfm:1626 +msgid "Italic" +msgstr "" + +#. Form1..SpTBXDock1..tbFormat..tUnderline..CaptionW +#: Unit1.dfm:140 +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mUnderline..CaptionW +#: Unit1.dfm:221 +#. Form1..TntActionList1..aUnderline..Caption +#: Unit1.dfm:1633 +msgid "Underline" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..Caption +#: Unit1.dfm:146 +msgid "Menu" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..CaptionW +#: Unit1.dfm:156 +msgid "&File" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mOpen..CaptionW +#: Unit1.dfm:163 +#. Form1..TntActionList1..aOpen..Caption +#: Unit1.dfm:1566 +msgid "Open..." +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mPrint..CaptionW +#: Unit1.dfm:171 +#. Form1..TntActionList1..aPrint..Caption +#: Unit1.dfm:1670 +#. Form1..SpTBXCustomizer1..cPrint..CaptionW +#: Unit1.dfm:1744 +msgid "Print" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mExit..CaptionW +#: Unit1.dfm:177 +#. Form1..TntActionList1..aExit..Caption +#: Unit1.dfm:1580 +#. Form1..SpTBXCustomizer1..cExit..CaptionW +#: Unit1.dfm:1776 +msgid "Exit" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..CaptionW +#: Unit1.dfm:181 +msgid "&Edit" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mSelectAll..CaptionW +#: Unit1.dfm:198 +#. Form1..TntActionList1..aSelectAll..Caption +#: Unit1.dfm:1606 +#. Form1..SpTBXCustomizer1..cSelectAll..CaptionW +#: Unit1.dfm:1772 +msgid "Select All" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..CaptionW +#: Unit1.dfm:210 +msgid "&Format" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mLeftJustify..CaptionW +#: Unit1.dfm:227 +#. Form1..TntActionList1..aLeftJustify..Caption +#: Unit1.dfm:1640 +#. Form1..SpTBXCustomizer1..cLeftJustify..CaptionW +#: Unit1.dfm:1748 +msgid "Left Justify" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mCentered..CaptionW +#: Unit1.dfm:231 +#. Form1..TntActionList1..aCentered..Caption +#: Unit1.dfm:1652 +#. Form1..SpTBXCustomizer1..cCentered..CaptionW +#: Unit1.dfm:1752 +msgid "Centered" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mRightJustify..CaptionW +#: Unit1.dfm:235 +#. Form1..TntActionList1..aRightJustify..Caption +#: Unit1.dfm:1646 +#. Form1..SpTBXCustomizer1..cRightJustify..CaptionW +#: Unit1.dfm:1756 +msgid "Right Justify" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBullets..CaptionW +#: Unit1.dfm:241 +#. Form1..TntActionList1..aBullets..Caption +#: Unit1.dfm:1658 +#. Form1..SpTBXCustomizer1..cBullets..CaptionW +#: Unit1.dfm:1760 +msgid "Bullets" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mNumberedBullets..CaptionW +#: Unit1.dfm:245 +#. Form1..TntActionList1..aNumberedBullets..Caption +#: Unit1.dfm:1664 +#. Form1..SpTBXCustomizer1..cNumBullets..CaptionW +#: Unit1.dfm:1764 +msgid "Numbered Bullets" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..mView..CaptionW +#: Unit1.dfm:249 +msgid "&View" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..CaptionW +#: Unit1.dfm:251 +msgid "&Sidebar" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mCommandsLog..CaptionW +#: Unit1.dfm:254 +msgid "&Commands Log" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mOptions..CaptionW +#: Unit1.dfm:258 +msgid "&Options" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mmHelp..CaptionW +#: Unit1.dfm:262 +#. Form1..SpTBXDock1..tbMenuBar..mHelp..CaptionW +#: Unit1.dfm:286 +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mmmHelp..CaptionW +#: Unit1.dfm:288 +msgid "&Help" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..CaptionW +#: Unit1.dfm:266 +msgid "&Toolbars" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mStandardToolbar..CaptionW +#: Unit1.dfm:269 +msgid "&Standard Toolbar" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..tLayoutsToolbar..CaptionW +#: Unit1.dfm:273 +msgid "&Layouts Toolbar" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mFormattingToolbar..CaptionW +#: Unit1.dfm:277 +msgid "&Formatting Toolbar" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mNavigationToolbar..CaptionW +#: Unit1.dfm:281 +msgid "&Navigation Toolbar" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mAbout..CaptionW +#: Unit1.dfm:291 +msgid "&About" +msgstr "" + +#. Form1..SpTBXDock1..tbLayouts..Caption +#: Unit1.dfm:298 +#. Form1..SpTBXDock1..tbLayouts..Layouts..SpTBXLabelItem1..CaptionW +#: Unit1.dfm:305 +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayouts..Caption +#: Unit1.dfm:308 +msgid "Layouts" +msgstr "" + +#. Form1..SpTBXMultiDock1..dpLog..Caption +#: Unit1.dfm:332 +msgid "Commands Log" +msgstr "" + +#. Form1..SpTBXMultiDock1..dpOptions..Caption +#: Unit1.dfm:352 +msgid "Customizer Options" +msgstr "" + +#. Form1..SpTBXMultiDock2..dpHelp..Caption +#: Unit1.dfm:368 +msgid "Help" +msgstr "" + +#. Form1..SpTBXMultiDock2..dpHelp..SpTBXLabel1..Caption +#: Unit1.dfm:380 +msgid "Right click the toolbars to start playing" +msgstr "" + +#. Form1..SpTBXDock2..tbNavigation..Caption +#: Unit1.dfm:402 +#. Form1..TntActionList1..aBack..Category +#: Unit1.dfm:1675 +#. Form1..TntActionList1..aForward..Category +#: Unit1.dfm:1681 +#. Form1..TntActionList1..aStop..Category +#: Unit1.dfm:1687 +#. Form1..TntActionList1..aRefresh..Category +#: Unit1.dfm:1693 +#. Form1..TntActionList1..aSearch..Category +#: Unit1.dfm:1699 +#. Form1..TntActionList1..aFavs..Category +#: Unit1.dfm:1705 +msgid "Navigation" +msgstr "" + +#. Form1..SpTBXDock2..tbNavigation..tBack..CaptionW +#: Unit1.dfm:409 +#. Form1..TntActionList1..aBack..Caption +#: Unit1.dfm:1676 +msgid "Back" +msgstr "" + +#. Form1..SpTBXDock2..tbNavigation..tForward..CaptionW +#: Unit1.dfm:413 +#. Form1..TntActionList1..aForward..Caption +#: Unit1.dfm:1682 +msgid "Forward" +msgstr "" + +#. Form1..SpTBXDock2..tbNavigation..tRefresh..CaptionW +#: Unit1.dfm:417 +#. Form1..TntActionList1..aRefresh..Caption +#: Unit1.dfm:1694 +msgid "Refresh" +msgstr "" + +#. Form1..SpTBXDock2..tbNavigation..tStop..CaptionW +#: Unit1.dfm:421 +#. Form1..TntActionList1..aStop..Caption +#: Unit1.dfm:1688 +msgid "Stop" +msgstr "" + +#. Form1..SpTBXDock2..tbNavigation..tSearch..CaptionW +#: Unit1.dfm:425 +#. Form1..TntActionList1..aSearch..Caption +#: Unit1.dfm:1700 +msgid "Search" +msgstr "" + +#. Form1..TntActionList1..aNew..Category +#: Unit1.dfm:1558 +#. Form1..TntActionList1..aOpen..Category +#: Unit1.dfm:1565 +#. Form1..TntActionList1..aSave..Category +#: Unit1.dfm:1572 +#. Form1..TntActionList1..aExit..Category +#: Unit1.dfm:1579 +#. Form1..TntActionList1..aPrint..Category +#: Unit1.dfm:1669 +msgid "Files" +msgstr "" + +#. Form1..TntActionList1..aCut..Category +#: Unit1.dfm:1584 +#. Form1..TntActionList1..aCopy..Category +#: Unit1.dfm:1591 +#. Form1..TntActionList1..aPaste..Category +#: Unit1.dfm:1598 +#. Form1..TntActionList1..aSelectAll..Category +#: Unit1.dfm:1605 +#. Form1..TntActionList1..aFind..Category +#: Unit1.dfm:1611 +msgid "Edit" +msgstr "" + +#. Form1..TntActionList1..aFavs..Caption +#: Unit1.dfm:1706 +#. Form1..SpTBXCustomizer1..cFavs..CaptionW +#: Unit1.dfm:1768 +msgid "Favs" +msgstr "" + +#. Form1..TntActionList1..aCustomize..Category +#: Unit1.dfm:1711 +#. Form1..TntActionList1..aEmbeddedCustomize..Category +#: Unit1.dfm:1716 +msgid "Customization" +msgstr "" + +#. Form1..TntActionList1..aCustomize..Caption +#: Unit1.dfm:1712 +#. Form1..SpTBXPopupMenu1..pCustomize..CaptionW +#: Unit1.dfm:1731 +msgid "Customize..." +msgstr "" + +#. Form1..TntActionList1..aEmbeddedCustomize..Caption +#: Unit1.dfm:1717 +#. Form1..SpTBXPopupMenu1..pEmbeddedCustomize..CaptionW +#: Unit1.dfm:1735 +msgid "Embedded Customize..." +msgstr "" + +#. Form2..Caption +#: Unit2.dfm:7 +msgid "Options" +msgstr "" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tProperties..CaptionW +#: Unit2.dfm:49 +msgid "Properties" +msgstr "" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tPageSetup..CaptionW +#: Unit2.dfm:58 +msgid "Page Setup" +msgstr "" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tHistory..CaptionW +#: Unit2.dfm:67 +msgid "History" +msgstr "" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tFavorites..CaptionW +#: Unit2.dfm:76 +msgid "Favorites" +msgstr "" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tCustomize..CaptionW +#: Unit2.dfm:85 +#. Form2..LeftPanel..TitlePanel..Caption +#: Unit2.dfm:168 +msgid "Customizer" +msgstr "" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton1..Caption +#: Unit2.dfm:122 +msgid "OK" +msgstr "" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton2..Caption +#: Unit2.dfm:137 +msgid "Cancel" +msgstr "" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton3..Caption +#: Unit2.dfm:152 +msgid "Apply" +msgstr "" + +#: Unit1.pas:235 +msgid "Save Layout" +msgstr "" + +#: Unit1.pas:235 +msgid "Save current layout as:" +msgstr "" + +#: Unit1.pas:248 +msgid "Executed" +msgstr "" + diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/es/LC_MESSAGES/default.mo b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/es/LC_MESSAGES/default.mo new file mode 100644 index 0000000000000000000000000000000000000000..5980c53e14815d1fe45c886c5555f5545c2e1a57 GIT binary patch literal 3364 zcmZvcO^h5z6@V*_N#ey2FbNnFNGE|I24*u}+p#ktf!Wzv+hFf5-iZ}{E;Ze?vz6`X zZmPT2JBvU9BoI<^0V4Ur!HFWIh>Jmp2rdzO08WV_ML7f^fsjCnf(R#+6W{Bu@r+SQ z{pzc#u6p(Ay;t>@L;Igrlpb;yvb0Yr4deY(lz+cRsaxRN@O|*VkWbyhpzt8P6&`{g zf=B%LJp2It6Mno0Z=?TJ&jI`({VjL^ejAFuA9_9o#e|=DUV*aD&mfS?}ew}M_?CL=YXPj0QuC2O6G4v`Ts2_ z{`nrf^(LjBgrfha42nOWfwJ!lkYDOW&p$zl`zuiN{2hK6z6oXBJ~pMP4nvuDFRbzi z%Df(wb>D!ZKlJ@A-*-^<+x7gu=acXb#-E0={&{#5UW2#8*Wvr&oA3yH2gyXRpj^X~EgPx$dR6n$ODk<}{vIQ$xX2<|}9 z`%5VP`z;hdyaeTZZ$OF9+feM^M-s^VgHY_a1IqXjNSah{L>qRHd1O)^r6K!ExfhXG zi2eYPeNQ5ycT(=BA$FfYBu^xFq&!kXEx`tI9QgtwZ`(b{Z28noM{JbxNu-O2&&3aN z)=BBncmUxjRcvH@5ot-om!qEIyVJ-ge81@_IV|O4$Y+rIkdGo##9tCKiPJGe%3)-o zYVr2K&-(VKq1;z_D;`ATjrbh$MMUBu<>4AteoOA0l76EzNXtSsy6I@7lPC|)r$g1~ zMV7H;8yo7>jkNSC7B(3M{WOgS+Ns7_6KAS%UXRg{Pls3ZwjJuirpa_{HIsg>8tXPP z)#CMn4YiA=bG%+AU9#q~>SS3wR*O2^Qj2LEsl_smO_8gvPC^r_u1N~xOr&nGy_;rZ z)h+WP9ogN=hU+~uKR-Y1xS3`!v960Rs>An20~19i3MQ(m#l0O9mIYh(c5u+L-cFq@ zOfD@d+$D7qspT{&f)zb7b!*-3N~`iCxXhtd<+`&LJKb2FD|Bo_BrJ67x8EFmcK1m(^-!lB$wZPR_HYhbCAzMVYBJofk%}Ihz#JX=Yqu zvG=0ca3+5z{I!AZ{ zCXpI}&f99;XcumR*n~yUiDNZM02*ng`kQ8iJ&z@kaj{Lr)bt6aHqS-POUC77PkR~- z7c7}kI=8mkZ+4xj;@n))g=q&1t=7qA>vXgAP;l(Q_Q{jXX=X~+2%9_{gqzysrg-GB z{&Ms5be^c&Fs|84!ZgBP?cnsl7ITj`&zQuxdY@=#XbRC49GhRjjAU36wr1bx5k_!D zL*qgnL{$o2G((ccrF4Tvn98M1xiFHnaw9wV*lwqj>zZTs*cDrR*Gw|6xsorl~ZtuEQUYeuHkx0?xaznzX!QgnLc>nG-(TPCfM8EL}p z*{v;=U3p#VBj2$7%uFX&WTqdbjvG@SP!w=CCQ9X3H+AA$@8X$tF0e`HxTjbtDtqK> zDIG3BY~AF6AU^)7pydOE+sa(ruv~IXqxyQJ_pYV>l^{rwiM9ObRKcnr3aexPRA{v{ z8?^eZ5Vux2nFgBp1a|kEr8SONPu`I0@mwhlNiy+ykdz~W8R30$EtA7`295(%b^V_B z@N)q+?67p~lp15BpGQHai7t6yl3n&aQ}UWl8QhS}{^t#YvNUZ^++RIMayD^YO5}Ri(|E~n S)s0hqGr}?J<-qB&#P)x$!rn{( literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/es/LC_MESSAGES/default.po b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/es/LC_MESSAGES/default.po new file mode 100644 index 0000000..18306a4 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/es/LC_MESSAGES/default.po @@ -0,0 +1,498 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Customizer Demo\n" +"POT-Creation-Date: 2005-08-09 16:55\n" +"PO-Revision-Date: 2005-08-09 17:23-0300\n" +"Last-Translator: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: dxgettext 1.2\n" +"Language-Team: \n" + +#. Form1..SpTBXDock1..tbStandard..Caption +#: Unit1.dfm:29 +msgid "Standard" +msgstr "Estándar" + +#. Form1..SpTBXDock1..tbStandard..tNew..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mNew..CaptionW +#. Form1..TntActionList1..aNew..Caption +#: Unit1.dfm:37 +#: Unit1.dfm:159 +#: Unit1.dfm:1559 +msgid "New" +msgstr "Nuevo" + +#. Form1..SpTBXDock1..tbStandard..tOpen..CaptionW +#: Unit1.dfm:41 +msgid "Open" +msgstr "Abrir" + +#. Form1..SpTBXDock1..tbStandard..tSave..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mSave..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayoutSave..CaptionW +#. Form1..TntActionList1..aSave..Caption +#: Unit1.dfm:45 +#: Unit1.dfm:167 +#: Unit1.dfm:318 +#: Unit1.dfm:1573 +msgid "Save" +msgstr "Guardar" + +#. Form1..SpTBXDock1..tbStandard..tCut..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCut..CaptionW +#. Form1..TntActionList1..aCut..Caption +#: Unit1.dfm:51 +#: Unit1.dfm:184 +#: Unit1.dfm:1585 +msgid "Cut" +msgstr "Cortar" + +#. Form1..SpTBXDock1..tbStandard..tCopy..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCopy..CaptionW +#. Form1..TntActionList1..aCopy..Caption +#: Unit1.dfm:55 +#: Unit1.dfm:188 +#: Unit1.dfm:1592 +msgid "Copy" +msgstr "Copiar" + +#. Form1..SpTBXDock1..tbStandard..tPaste..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mPaste..CaptionW +#. Form1..TntActionList1..aPaste..Caption +#: Unit1.dfm:60 +#: Unit1.dfm:192 +#: Unit1.dfm:1599 +msgid "Paste" +msgstr "Pegar" + +#. Form1..SpTBXDock1..tbStandard..tFind..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mFind..CaptionW +#. Form1..TntActionList1..aFind..Caption +#: Unit1.dfm:67 +#: Unit1.dfm:206 +#: Unit1.dfm:1612 +msgid "Find" +msgstr "Buscar" + +#. Form1..SpTBXDock1..tbStandard..tThemes..CaptionW +#: Unit1.dfm:73 +msgid "Themes" +msgstr "Temas" + +#. Form1..SpTBXDock1..tbFormat..Caption +#. Form1..TntActionList1..aBold..Category +#. Form1..TntActionList1..aItalic..Category +#. Form1..TntActionList1..aUnderline..Category +#. Form1..TntActionList1..aLeftJustify..Category +#. Form1..TntActionList1..aRightJustify..Category +#. Form1..TntActionList1..aCentered..Category +#. Form1..TntActionList1..aBullets..Category +#. Form1..TntActionList1..aNumberedBullets..Category +#: Unit1.dfm:99 +#: Unit1.dfm:1618 +#: Unit1.dfm:1625 +#: Unit1.dfm:1632 +#: Unit1.dfm:1639 +#: Unit1.dfm:1645 +#: Unit1.dfm:1651 +#: Unit1.dfm:1657 +#: Unit1.dfm:1663 +msgid "Format" +msgstr "Formato" + +#. Form1..SpTBXDock1..tbFormat..tFont..Caption +#: Unit1.dfm:106 +msgid "Font Name" +msgstr "Fuente" + +#. Form1..SpTBXDock1..tbFormat..tFontSize..Caption +#: Unit1.dfm:116 +msgid "Font Size" +msgstr "Tamaño" + +#. Form1..SpTBXDock1..tbFormat..tBold..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBold..CaptionW +#. Form1..TntActionList1..aBold..Caption +#: Unit1.dfm:132 +#: Unit1.dfm:213 +#: Unit1.dfm:1619 +msgid "Bold" +msgstr "Negrita" + +#. Form1..SpTBXDock1..tbFormat..tItalic..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mItalic..CaptionW +#. Form1..TntActionList1..aItalic..Caption +#: Unit1.dfm:136 +#: Unit1.dfm:217 +#: Unit1.dfm:1626 +msgid "Italic" +msgstr "Italica" + +#. Form1..SpTBXDock1..tbFormat..tUnderline..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mUnderline..CaptionW +#. Form1..TntActionList1..aUnderline..Caption +#: Unit1.dfm:140 +#: Unit1.dfm:221 +#: Unit1.dfm:1633 +msgid "Underline" +msgstr "Subrayado" + +#. Form1..SpTBXDock1..tbMenuBar..Caption +#: Unit1.dfm:146 +msgid "Menu" +msgstr "Menu" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..CaptionW +#: Unit1.dfm:156 +msgid "&File" +msgstr "&Archivo" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mOpen..CaptionW +#. Form1..TntActionList1..aOpen..Caption +#: Unit1.dfm:163 +#: Unit1.dfm:1566 +msgid "Open..." +msgstr "Abrir..." + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mPrint..CaptionW +#. Form1..TntActionList1..aPrint..Caption +#. Form1..SpTBXCustomizer1..cPrint..CaptionW +#: Unit1.dfm:171 +#: Unit1.dfm:1670 +#: Unit1.dfm:1744 +msgid "Print" +msgstr "Imprimir" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mExit..CaptionW +#. Form1..TntActionList1..aExit..Caption +#. Form1..SpTBXCustomizer1..cExit..CaptionW +#: Unit1.dfm:177 +#: Unit1.dfm:1580 +#: Unit1.dfm:1776 +msgid "Exit" +msgstr "Salir" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..CaptionW +#: Unit1.dfm:181 +msgid "&Edit" +msgstr "&Editar" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mSelectAll..CaptionW +#. Form1..TntActionList1..aSelectAll..Caption +#. Form1..SpTBXCustomizer1..cSelectAll..CaptionW +#: Unit1.dfm:198 +#: Unit1.dfm:1606 +#: Unit1.dfm:1772 +msgid "Select All" +msgstr "Seleccionar todo" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..CaptionW +#: Unit1.dfm:210 +msgid "&Format" +msgstr "&Formato" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mLeftJustify..CaptionW +#. Form1..TntActionList1..aLeftJustify..Caption +#. Form1..SpTBXCustomizer1..cLeftJustify..CaptionW +#: Unit1.dfm:227 +#: Unit1.dfm:1640 +#: Unit1.dfm:1748 +msgid "Left Justify" +msgstr "Justificar texto a la izquierda" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mCentered..CaptionW +#. Form1..TntActionList1..aCentered..Caption +#. Form1..SpTBXCustomizer1..cCentered..CaptionW +#: Unit1.dfm:231 +#: Unit1.dfm:1652 +#: Unit1.dfm:1752 +msgid "Centered" +msgstr "Centrado" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mRightJustify..CaptionW +#. Form1..TntActionList1..aRightJustify..Caption +#. Form1..SpTBXCustomizer1..cRightJustify..CaptionW +#: Unit1.dfm:235 +#: Unit1.dfm:1646 +#: Unit1.dfm:1756 +msgid "Right Justify" +msgstr "Justificar texto a la derecha" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBullets..CaptionW +#. Form1..TntActionList1..aBullets..Caption +#. Form1..SpTBXCustomizer1..cBullets..CaptionW +#: Unit1.dfm:241 +#: Unit1.dfm:1658 +#: Unit1.dfm:1760 +msgid "Bullets" +msgstr "Viñetas" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mNumberedBullets..CaptionW +#. Form1..TntActionList1..aNumberedBullets..Caption +#. Form1..SpTBXCustomizer1..cNumBullets..CaptionW +#: Unit1.dfm:245 +#: Unit1.dfm:1664 +#: Unit1.dfm:1764 +msgid "Numbered Bullets" +msgstr "Viñetas numeradas" + +#. Form1..SpTBXDock1..tbMenuBar..mView..CaptionW +#: Unit1.dfm:249 +msgid "&View" +msgstr "&Vista" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..CaptionW +#: Unit1.dfm:251 +msgid "&Sidebar" +msgstr "&Barras laterales" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mCommandsLog..CaptionW +#: Unit1.dfm:254 +msgid "&Commands Log" +msgstr "Registro de &comandos" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mOptions..CaptionW +#: Unit1.dfm:258 +msgid "&Options" +msgstr "&Opciones" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mmHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mmmHelp..CaptionW +#: Unit1.dfm:262 +#: Unit1.dfm:286 +#: Unit1.dfm:288 +msgid "&Help" +msgstr "A&yuda" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..CaptionW +#: Unit1.dfm:266 +msgid "&Toolbars" +msgstr "&Barra de herramientas" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mStandardToolbar..CaptionW +#: Unit1.dfm:269 +msgid "&Standard Toolbar" +msgstr "Barra &estándar" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..tLayoutsToolbar..CaptionW +#: Unit1.dfm:273 +msgid "&Layouts Toolbar" +msgstr "Barra de &disposición" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mFormattingToolbar..CaptionW +#: Unit1.dfm:277 +msgid "&Formatting Toolbar" +msgstr "Barra de &formato" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mNavigationToolbar..CaptionW +#: Unit1.dfm:281 +msgid "&Navigation Toolbar" +msgstr "Barra de &navegación" + +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mAbout..CaptionW +#: Unit1.dfm:291 +msgid "&About" +msgstr "&Acerca de..." + +#. Form1..SpTBXDock1..tbLayouts..Caption +#. Form1..SpTBXDock1..tbLayouts..Layouts..SpTBXLabelItem1..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayouts..Caption +#: Unit1.dfm:298 +#: Unit1.dfm:305 +#: Unit1.dfm:308 +msgid "Layouts" +msgstr "Disposición" + +#. Form1..SpTBXMultiDock1..dpLog..Caption +#: Unit1.dfm:332 +msgid "Commands Log" +msgstr "Registro de comandos" + +#. Form1..SpTBXMultiDock1..dpOptions..Caption +#: Unit1.dfm:352 +msgid "Customizer Options" +msgstr "Opciones de personalizador" + +#. Form1..SpTBXMultiDock2..dpHelp..Caption +#: Unit1.dfm:368 +msgid "Help" +msgstr "Ayuda" + +#. Form1..SpTBXMultiDock2..dpHelp..SpTBXLabel1..Caption +#: Unit1.dfm:380 +msgid "Right click the toolbars to start playing" +msgstr "Click derecho en las barras de herramientas para comenzar" + +#. Form1..SpTBXDock2..tbNavigation..Caption +#. Form1..TntActionList1..aBack..Category +#. Form1..TntActionList1..aForward..Category +#. Form1..TntActionList1..aStop..Category +#. Form1..TntActionList1..aRefresh..Category +#. Form1..TntActionList1..aSearch..Category +#. Form1..TntActionList1..aFavs..Category +#: Unit1.dfm:402 +#: Unit1.dfm:1675 +#: Unit1.dfm:1681 +#: Unit1.dfm:1687 +#: Unit1.dfm:1693 +#: Unit1.dfm:1699 +#: Unit1.dfm:1705 +msgid "Navigation" +msgstr "Navegación" + +#. Form1..SpTBXDock2..tbNavigation..tBack..CaptionW +#. Form1..TntActionList1..aBack..Caption +#: Unit1.dfm:409 +#: Unit1.dfm:1676 +msgid "Back" +msgstr "Atrás" + +#. Form1..SpTBXDock2..tbNavigation..tForward..CaptionW +#. Form1..TntActionList1..aForward..Caption +#: Unit1.dfm:413 +#: Unit1.dfm:1682 +msgid "Forward" +msgstr "Adelante" + +#. Form1..SpTBXDock2..tbNavigation..tRefresh..CaptionW +#. Form1..TntActionList1..aRefresh..Caption +#: Unit1.dfm:417 +#: Unit1.dfm:1694 +msgid "Refresh" +msgstr "Actualizar" + +#. Form1..SpTBXDock2..tbNavigation..tStop..CaptionW +#. Form1..TntActionList1..aStop..Caption +#: Unit1.dfm:421 +#: Unit1.dfm:1688 +msgid "Stop" +msgstr "Detener" + +#. Form1..SpTBXDock2..tbNavigation..tSearch..CaptionW +#. Form1..TntActionList1..aSearch..Caption +#: Unit1.dfm:425 +#: Unit1.dfm:1700 +msgid "Search" +msgstr "Buscar" + +#. Form1..TntActionList1..aNew..Category +#. Form1..TntActionList1..aOpen..Category +#. Form1..TntActionList1..aSave..Category +#. Form1..TntActionList1..aExit..Category +#. Form1..TntActionList1..aPrint..Category +#: Unit1.dfm:1558 +#: Unit1.dfm:1565 +#: Unit1.dfm:1572 +#: Unit1.dfm:1579 +#: Unit1.dfm:1669 +msgid "Files" +msgstr "Archivos" + +#. Form1..TntActionList1..aCut..Category +#. Form1..TntActionList1..aCopy..Category +#. Form1..TntActionList1..aPaste..Category +#. Form1..TntActionList1..aSelectAll..Category +#. Form1..TntActionList1..aFind..Category +#: Unit1.dfm:1584 +#: Unit1.dfm:1591 +#: Unit1.dfm:1598 +#: Unit1.dfm:1605 +#: Unit1.dfm:1611 +msgid "Edit" +msgstr "Editar" + +#. Form1..TntActionList1..aFavs..Caption +#. Form1..SpTBXCustomizer1..cFavs..CaptionW +#: Unit1.dfm:1706 +#: Unit1.dfm:1768 +msgid "Favs" +msgstr "Favoritos" + +#. Form1..TntActionList1..aCustomize..Category +#. Form1..TntActionList1..aEmbeddedCustomize..Category +#: Unit1.dfm:1711 +#: Unit1.dfm:1716 +msgid "Customization" +msgstr "Personalización de barra de herramientas" + +#. Form1..TntActionList1..aCustomize..Caption +#. Form1..SpTBXPopupMenu1..pCustomize..CaptionW +#: Unit1.dfm:1712 +#: Unit1.dfm:1731 +msgid "Customize..." +msgstr "Personalizar..." + +#. Form1..TntActionList1..aEmbeddedCustomize..Caption +#. Form1..SpTBXPopupMenu1..pEmbeddedCustomize..CaptionW +#: Unit1.dfm:1717 +#: Unit1.dfm:1735 +msgid "Embedded Customize..." +msgstr "Personalizar incrustado..." + +#. Form2..Caption +#: Unit2.dfm:7 +msgid "Options" +msgstr "Opciones" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tProperties..CaptionW +#: Unit2.dfm:49 +msgid "Properties" +msgstr "Propiedades" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tPageSetup..CaptionW +#: Unit2.dfm:58 +msgid "Page Setup" +msgstr "Configurar página" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tHistory..CaptionW +#: Unit2.dfm:67 +msgid "History" +msgstr "Historial" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tFavorites..CaptionW +#: Unit2.dfm:76 +msgid "Favorites" +msgstr "Favoritos" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tCustomize..CaptionW +#. Form2..LeftPanel..TitlePanel..Caption +#: Unit2.dfm:85 +#: Unit2.dfm:168 +msgid "Customizer" +msgstr "Personalizador" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton1..Caption +#: Unit2.dfm:122 +msgid "OK" +msgstr "Aceptar" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton2..Caption +#: Unit2.dfm:137 +msgid "Cancel" +msgstr "Cancelar" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton3..Caption +#: Unit2.dfm:152 +msgid "Apply" +msgstr "Aplicar" + +#: Unit1.pas:235 +msgid "Save Layout" +msgstr "Guardar disposición" + +#: Unit1.pas:235 +msgid "Save current layout as:" +msgstr "Guardar disposición como:" + +#: Unit1.pas:248 +msgid "Executed" +msgstr "Ejecutado" + diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/fi/LC_MESSAGES/default.mo b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/fi/LC_MESSAGES/default.mo new file mode 100644 index 0000000000000000000000000000000000000000..0728e5a4e517ce073c6b8dd0b0610d84abe51f20 GIT binary patch literal 3276 zcmZXVU5F${9l%R-CYLoDJVv)*#UKVByeK4r5JU-vpk$TvArC(2Q{W&`@Ie$61W^M1{yjA}duP%A z`c+le{OkYKHCGND_^zV0k=v2Q*DIxAdVr4h_cthYBm4(^6Z|*iQ8%(EyanC_55c#= z+rs)Zd<*mAVZ99xGJiO53%-?k0&j+2gre{3f!~5+!lQwYK{@Af$fKU16Mav^Tj0;2 z?0*r8otMMzX@eS=Q?d=!fPKZK&^$B;)o6Zi`#_3#@g`d<$G zBb0jm3*=F+(TSdeC>4Ki4ZIzS9Y>+W>loxwbAgLc&RvJ1=V2)O;;?SRJcpv^0+c%V z3KV<34dr*=hw{58;Je|IQ0nB@Vf`|c{Vze$^LuzJyaL7UzlHbzf@1$`Q1(qRk@y{k z$KV}M?EMrJ|33#m2y-ase-Fz3A3(|HQ&99j8~7aLQNN_4OsZTq;XE>pjNAPT#4l+d zKt!kLiIBs{2}JxEw>ueNvO124U6M0t_l=+yVGR)fQYQ)_GKN7|thVs42U2zhT+WR#&u!-E zUEk#1V((dVJ~zdVI%~IgCWnq@U5rX1zhfdl%6P#bD!k5p)KB%0T2LE$V5%+}Sw9+g z%RDDN5t}HDNEc1DVRYWz0jcTwXg*EVxBwWqzUu6l9`>BeVw0yf6I0zTTkB`y`liVX zs;4>0MjkDio|{@<>(pDhsq$Q3)ZR3s*+%0;y)jpB+!M{5Y@Rs5p88ocu%ckH~f9Z)aT>6R&18w`Kj*r|S=x%;ckU;)~nHi>_#9dKNRX z?UJLJqUW*GoBw-R)tI9^>~+7A{bfR@HteA6>ok$`H+5p&bvrxzPUFg0-McjO zdzaKwU`HpKJY;Iw?(pqcU#hgMY{9WS;gec7d0Bd`mQ2BvS3|Ym=_S{<&Z?C%(WNho zFwj!*qcyLIQ+SQV8I?D-ec9M5UgNke+tC40Z>(*jtUhOtS?i83vs6nq-_=>L?V8Cr z=v)`Ru+?X7vnaE@tK-Ba4pT;XV3#pjfA12`S4kLs`Bps5oEm4utBx+Tjs}>`eav;I zHn|xRG)=Oj&Xt_V6<~5_W4^BIV#r-EKcFzAlgM0~zH3542uM$-OsOBO)_OK0KV=z{ z>UC@#j9ynJIh&Zup!t-<>8Ni~t@!~lu3jZ#CM)dG`>Vq2$_etzEYnv9RbHe9Co9=7 x;X(;1tICsTnl#, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Customizer Demo\n" +"POT-Creation-Date: 2005-08-09 16:55\n" +"PO-Revision-Date: 2006-02-03 00:41-0300\n" +"Last-Translator: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: dxgettext 1.2\n" +"Language-Team: \n" + +#. Form1..SpTBXDock1..tbStandard..Caption +#: Unit1.dfm:29 +msgid "Standard" +msgstr "Vakio" + +#. Form1..SpTBXDock1..tbStandard..tNew..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mNew..CaptionW +#. Form1..TntActionList1..aNew..Caption +#: Unit1.dfm:37 +#: Unit1.dfm:159 +#: Unit1.dfm:1559 +msgid "New" +msgstr "Uusi" + +#. Form1..SpTBXDock1..tbStandard..tOpen..CaptionW +#: Unit1.dfm:41 +msgid "Open" +msgstr "Avaa" + +#. Form1..SpTBXDock1..tbStandard..tSave..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mSave..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayoutSave..CaptionW +#. Form1..TntActionList1..aSave..Caption +#: Unit1.dfm:45 +#: Unit1.dfm:167 +#: Unit1.dfm:318 +#: Unit1.dfm:1573 +msgid "Save" +msgstr "Tallenna" + +#. Form1..SpTBXDock1..tbStandard..tCut..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCut..CaptionW +#. Form1..TntActionList1..aCut..Caption +#: Unit1.dfm:51 +#: Unit1.dfm:184 +#: Unit1.dfm:1585 +msgid "Cut" +msgstr "Leikkaa" + +#. Form1..SpTBXDock1..tbStandard..tCopy..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCopy..CaptionW +#. Form1..TntActionList1..aCopy..Caption +#: Unit1.dfm:55 +#: Unit1.dfm:188 +#: Unit1.dfm:1592 +msgid "Copy" +msgstr "Kopioi" + +#. Form1..SpTBXDock1..tbStandard..tPaste..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mPaste..CaptionW +#. Form1..TntActionList1..aPaste..Caption +#: Unit1.dfm:60 +#: Unit1.dfm:192 +#: Unit1.dfm:1599 +msgid "Paste" +msgstr "Liitä" + +#. Form1..SpTBXDock1..tbStandard..tFind..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mFind..CaptionW +#. Form1..TntActionList1..aFind..Caption +#: Unit1.dfm:67 +#: Unit1.dfm:206 +#: Unit1.dfm:1612 +msgid "Find" +msgstr "Etsi" + +#. Form1..SpTBXDock1..tbStandard..tThemes..CaptionW +#: Unit1.dfm:73 +msgid "Themes" +msgstr "Teemat" + +#. Form1..SpTBXDock1..tbFormat..Caption +#. Form1..TntActionList1..aBold..Category +#. Form1..TntActionList1..aItalic..Category +#. Form1..TntActionList1..aUnderline..Category +#. Form1..TntActionList1..aLeftJustify..Category +#. Form1..TntActionList1..aRightJustify..Category +#. Form1..TntActionList1..aCentered..Category +#. Form1..TntActionList1..aBullets..Category +#. Form1..TntActionList1..aNumberedBullets..Category +#: Unit1.dfm:99 +#: Unit1.dfm:1618 +#: Unit1.dfm:1625 +#: Unit1.dfm:1632 +#: Unit1.dfm:1639 +#: Unit1.dfm:1645 +#: Unit1.dfm:1651 +#: Unit1.dfm:1657 +#: Unit1.dfm:1663 +msgid "Format" +msgstr "Muotoilu" + +#. Form1..SpTBXDock1..tbFormat..tFont..Caption +#: Unit1.dfm:106 +msgid "Font Name" +msgstr "Fontin nimi" + +#. Form1..SpTBXDock1..tbFormat..tFontSize..Caption +#: Unit1.dfm:116 +msgid "Font Size" +msgstr "Fontin koko" + +#. Form1..SpTBXDock1..tbFormat..tBold..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBold..CaptionW +#. Form1..TntActionList1..aBold..Caption +#: Unit1.dfm:132 +#: Unit1.dfm:213 +#: Unit1.dfm:1619 +msgid "Bold" +msgstr "Lihavoitu" + +#. Form1..SpTBXDock1..tbFormat..tItalic..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mItalic..CaptionW +#. Form1..TntActionList1..aItalic..Caption +#: Unit1.dfm:136 +#: Unit1.dfm:217 +#: Unit1.dfm:1626 +msgid "Italic" +msgstr "Keno" + +#. Form1..SpTBXDock1..tbFormat..tUnderline..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mUnderline..CaptionW +#. Form1..TntActionList1..aUnderline..Caption +#: Unit1.dfm:140 +#: Unit1.dfm:221 +#: Unit1.dfm:1633 +msgid "Underline" +msgstr "Alleviivattu" + +#. Form1..SpTBXDock1..tbMenuBar..Caption +#: Unit1.dfm:146 +msgid "Menu" +msgstr "Valikko" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..CaptionW +#: Unit1.dfm:156 +msgid "&File" +msgstr "&Tiedosto" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mOpen..CaptionW +#. Form1..TntActionList1..aOpen..Caption +#: Unit1.dfm:163 +#: Unit1.dfm:1566 +msgid "Open..." +msgstr "Avaa..." + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mPrint..CaptionW +#. Form1..TntActionList1..aPrint..Caption +#. Form1..SpTBXCustomizer1..cPrint..CaptionW +#: Unit1.dfm:171 +#: Unit1.dfm:1670 +#: Unit1.dfm:1744 +msgid "Print" +msgstr "Tulosta" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mExit..CaptionW +#. Form1..TntActionList1..aExit..Caption +#. Form1..SpTBXCustomizer1..cExit..CaptionW +#: Unit1.dfm:177 +#: Unit1.dfm:1580 +#: Unit1.dfm:1776 +msgid "Exit" +msgstr "Poistu" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..CaptionW +#: Unit1.dfm:181 +msgid "&Edit" +msgstr "&Muokkaa" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mSelectAll..CaptionW +#. Form1..TntActionList1..aSelectAll..Caption +#. Form1..SpTBXCustomizer1..cSelectAll..CaptionW +#: Unit1.dfm:198 +#: Unit1.dfm:1606 +#: Unit1.dfm:1772 +msgid "Select All" +msgstr "Valitse kaikki" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..CaptionW +#: Unit1.dfm:210 +msgid "&Format" +msgstr "&Muotoile" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mLeftJustify..CaptionW +#. Form1..TntActionList1..aLeftJustify..Caption +#. Form1..SpTBXCustomizer1..cLeftJustify..CaptionW +#: Unit1.dfm:227 +#: Unit1.dfm:1640 +#: Unit1.dfm:1748 +msgid "Left Justify" +msgstr "Tasaa vasemmalle" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mCentered..CaptionW +#. Form1..TntActionList1..aCentered..Caption +#. Form1..SpTBXCustomizer1..cCentered..CaptionW +#: Unit1.dfm:231 +#: Unit1.dfm:1652 +#: Unit1.dfm:1752 +msgid "Centered" +msgstr "Keskitetty" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mRightJustify..CaptionW +#. Form1..TntActionList1..aRightJustify..Caption +#. Form1..SpTBXCustomizer1..cRightJustify..CaptionW +#: Unit1.dfm:235 +#: Unit1.dfm:1646 +#: Unit1.dfm:1756 +msgid "Right Justify" +msgstr "Tasaa oikealle" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBullets..CaptionW +#. Form1..TntActionList1..aBullets..Caption +#. Form1..SpTBXCustomizer1..cBullets..CaptionW +#: Unit1.dfm:241 +#: Unit1.dfm:1658 +#: Unit1.dfm:1760 +msgid "Bullets" +msgstr "luettelomerkit" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mNumberedBullets..CaptionW +#. Form1..TntActionList1..aNumberedBullets..Caption +#. Form1..SpTBXCustomizer1..cNumBullets..CaptionW +#: Unit1.dfm:245 +#: Unit1.dfm:1664 +#: Unit1.dfm:1764 +msgid "Numbered Bullets" +msgstr "Numeroidut luettelomerkit" + +#. Form1..SpTBXDock1..tbMenuBar..mView..CaptionW +#: Unit1.dfm:249 +msgid "&View" +msgstr "&Näytä" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..CaptionW +#: Unit1.dfm:251 +msgid "&Sidebar" +msgstr "Sivupalkki" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mCommandsLog..CaptionW +#: Unit1.dfm:254 +msgid "&Commands Log" +msgstr "&Komentoloki" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mOptions..CaptionW +#: Unit1.dfm:258 +msgid "&Options" +msgstr "&Asetukset" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mmHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mmmHelp..CaptionW +#: Unit1.dfm:262 +#: Unit1.dfm:286 +#: Unit1.dfm:288 +msgid "&Help" +msgstr "&Ohje" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..CaptionW +#: Unit1.dfm:266 +msgid "&Toolbars" +msgstr "&Työkalurivit" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mStandardToolbar..CaptionW +#: Unit1.dfm:269 +msgid "&Standard Toolbar" +msgstr "&Vakio työkalurivi" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..tLayoutsToolbar..CaptionW +#: Unit1.dfm:273 +msgid "&Layouts Toolbar" +msgstr "&Asettelu työkalurivi" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mFormattingToolbar..CaptionW +#: Unit1.dfm:277 +msgid "&Formatting Toolbar" +msgstr "&Muotoilu työkalurivi" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mNavigationToolbar..CaptionW +#: Unit1.dfm:281 +msgid "&Navigation Toolbar" +msgstr "&Navigointi työkalurivi" + +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mAbout..CaptionW +#: Unit1.dfm:291 +msgid "&About" +msgstr "&Tietoja" + +#. Form1..SpTBXDock1..tbLayouts..Caption +#. Form1..SpTBXDock1..tbLayouts..Layouts..SpTBXLabelItem1..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayouts..Caption +#: Unit1.dfm:298 +#: Unit1.dfm:305 +#: Unit1.dfm:308 +msgid "Layouts" +msgstr "Asettelut" + +#. Form1..SpTBXMultiDock1..dpLog..Caption +#: Unit1.dfm:332 +msgid "Commands Log" +msgstr "Komentoloki" + +#. Form1..SpTBXMultiDock1..dpOptions..Caption +#: Unit1.dfm:352 +msgid "Customizer Options" +msgstr "Mukautuksen asetukset" + +#. Form1..SpTBXMultiDock2..dpHelp..Caption +#: Unit1.dfm:368 +msgid "Help" +msgstr "Ohje" + +#. Form1..SpTBXMultiDock2..dpHelp..SpTBXLabel1..Caption +#: Unit1.dfm:380 +msgid "Right click the toolbars to start playing" +msgstr "Aloita pelaaminen oikeaklikkaamalla työkalurivejä" + +#. Form1..SpTBXDock2..tbNavigation..Caption +#. Form1..TntActionList1..aBack..Category +#. Form1..TntActionList1..aForward..Category +#. Form1..TntActionList1..aStop..Category +#. Form1..TntActionList1..aRefresh..Category +#. Form1..TntActionList1..aSearch..Category +#. Form1..TntActionList1..aFavs..Category +#: Unit1.dfm:402 +#: Unit1.dfm:1675 +#: Unit1.dfm:1681 +#: Unit1.dfm:1687 +#: Unit1.dfm:1693 +#: Unit1.dfm:1699 +#: Unit1.dfm:1705 +msgid "Navigation" +msgstr "Navigointi" + +#. Form1..SpTBXDock2..tbNavigation..tBack..CaptionW +#. Form1..TntActionList1..aBack..Caption +#: Unit1.dfm:409 +#: Unit1.dfm:1676 +msgid "Back" +msgstr "Takaisin" + +#. Form1..SpTBXDock2..tbNavigation..tForward..CaptionW +#. Form1..TntActionList1..aForward..Caption +#: Unit1.dfm:413 +#: Unit1.dfm:1682 +msgid "Forward" +msgstr "Eteenpäin" + +#. Form1..SpTBXDock2..tbNavigation..tRefresh..CaptionW +#. Form1..TntActionList1..aRefresh..Caption +#: Unit1.dfm:417 +#: Unit1.dfm:1694 +msgid "Refresh" +msgstr "Päivitä" + +#. Form1..SpTBXDock2..tbNavigation..tStop..CaptionW +#. Form1..TntActionList1..aStop..Caption +#: Unit1.dfm:421 +#: Unit1.dfm:1688 +msgid "Stop" +msgstr "Lopeta" + +#. Form1..SpTBXDock2..tbNavigation..tSearch..CaptionW +#. Form1..TntActionList1..aSearch..Caption +#: Unit1.dfm:425 +#: Unit1.dfm:1700 +msgid "Search" +msgstr "Etsi" + +#. Form1..TntActionList1..aNew..Category +#. Form1..TntActionList1..aOpen..Category +#. Form1..TntActionList1..aSave..Category +#. Form1..TntActionList1..aExit..Category +#. Form1..TntActionList1..aPrint..Category +#: Unit1.dfm:1558 +#: Unit1.dfm:1565 +#: Unit1.dfm:1572 +#: Unit1.dfm:1579 +#: Unit1.dfm:1669 +msgid "Files" +msgstr "Tiedostot" + +#. Form1..TntActionList1..aCut..Category +#. Form1..TntActionList1..aCopy..Category +#. Form1..TntActionList1..aPaste..Category +#. Form1..TntActionList1..aSelectAll..Category +#. Form1..TntActionList1..aFind..Category +#: Unit1.dfm:1584 +#: Unit1.dfm:1591 +#: Unit1.dfm:1598 +#: Unit1.dfm:1605 +#: Unit1.dfm:1611 +msgid "Edit" +msgstr "Muokkaa" + +#. Form1..TntActionList1..aFavs..Caption +#. Form1..SpTBXCustomizer1..cFavs..CaptionW +#: Unit1.dfm:1706 +#: Unit1.dfm:1768 +msgid "Favs" +msgstr "Kirjanmerkit" + +#. Form1..TntActionList1..aCustomize..Category +#. Form1..TntActionList1..aEmbeddedCustomize..Category +#: Unit1.dfm:1711 +#: Unit1.dfm:1716 +msgid "Customization" +msgstr "Mukautus" + +#. Form1..TntActionList1..aCustomize..Caption +#. Form1..SpTBXPopupMenu1..pCustomize..CaptionW +#: Unit1.dfm:1712 +#: Unit1.dfm:1731 +msgid "Customize..." +msgstr "Mukauta..." + +#. Form1..TntActionList1..aEmbeddedCustomize..Caption +#. Form1..SpTBXPopupMenu1..pEmbeddedCustomize..CaptionW +#: Unit1.dfm:1717 +#: Unit1.dfm:1735 +msgid "Embedded Customize..." +msgstr "Liitetty mukautus" + +#. Form2..Caption +#: Unit2.dfm:7 +msgid "Options" +msgstr "Asetukset" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tProperties..CaptionW +#: Unit2.dfm:49 +msgid "Properties" +msgstr "Ominaisuudet" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tPageSetup..CaptionW +#: Unit2.dfm:58 +msgid "Page Setup" +msgstr "Sivun asetukset" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tHistory..CaptionW +#: Unit2.dfm:67 +msgid "History" +msgstr "Historia" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tFavorites..CaptionW +#: Unit2.dfm:76 +msgid "Favorites" +msgstr "Kirjanmerkit" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tCustomize..CaptionW +#. Form2..LeftPanel..TitlePanel..Caption +#: Unit2.dfm:85 +#: Unit2.dfm:168 +msgid "Customizer" +msgstr "Mukauttaja" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton1..Caption +#: Unit2.dfm:122 +msgid "OK" +msgstr "OK" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton2..Caption +#: Unit2.dfm:137 +msgid "Cancel" +msgstr "Peruuta" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton3..Caption +#: Unit2.dfm:152 +msgid "Apply" +msgstr "Käytä" + +#: Unit1.pas:235 +msgid "Save Layout" +msgstr "Tallenna asettelu" + +#: Unit1.pas:235 +msgid "Save current layout as:" +msgstr "Tallenna nykyinen asettelu nimellä:" + +#: Unit1.pas:248 +msgid "Executed" +msgstr "Suoritettu" + diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/fr/LC_MESSAGES/default.mo b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/fr/LC_MESSAGES/default.mo new file mode 100644 index 0000000000000000000000000000000000000000..a93a540e6d33758c6da3ca175ff421ec86c31205 GIT binary patch literal 3276 zcmZXVUyPhp6~HeAtuCk(5CkdS3QUVQ+u6dFc3ITf*=@VnZinu)A<_hHXYR~g`Th*| z`@Zciv5AJ5D3KSmKB&By5Lsd*kQfsQ4=^FV7$1xYAwh%22Yn;akQhnycfPsPnZnJS z`@4V6ckemp-gDg*QKZDo6 z=b`Ao0>#eXgz-1w4E;aC>)@Z^mGC_%`u~Qq&VNFG2b+jJJE6?)f@0T=p?_4$v{5h2G zUW8)buLEBVi1LF7G<?$fptU z;|s_Q$i0ZHH!gc=h+X#}@@~jolCn60Y6KpDUqR$8)5vtWW2z%IO1T|bLT*FEPq~xh zvP@$Zk$B@yS?bjLLtC&fv=71ikUK;F%Yior%H6sP`643sU5eaSiK)c1hDiAwGFP^g zx*vWiv@1}~L+;i*B4>X$@>N96Ps+jw>N8O8&Ozx{>gUoTSCvK@$0q4y`gqz?m6eWT z?1+mjb?Rdyy^^_0db*XS(K+K)<(Q2Is&d?Hu|_r-UNal6XL6S&ld+Qn>1V34?mD*o zcs*xB<2w_bur5kxoIS7VgF&>VmQ4F`wUkC3wNylr%`??7N!v!MVUyf?+fkR<-be>q zs!?Ql8oMV;8!q+i?Ck8MY+Zv`l+Leg+IEq%_{t`sIAS(Z?{b?-i;BQVopjWZ zG|BaviS4Mh?w*uZ88L7k_f#3AV-Ab_mRikCAyIpwCL1>h?1lnW^YTX*& z?t{p-b6t-jH9l$@=|HvmHpZUQNyqxgC1Ps&O;oF^o$49uGw#WP9v`9gdfCS5O!H)` z+VHkK(dx3v?Sei~tIbzyhpM&1dhX!D{5(3Y+B4Sz+8jaHN_UJugmV_2(n_P@ENywgTl+{xM)=Rvm21Xje3*E7r9Ju`J zMp`hYE(LXE6VnRZR1X!7Bl02V%Zw-YCEd%YV^H66z0p`pW7RT_M`@h$>xJ7eI9G;# zl=9;FDC?y$9shddddYBG8{IPn3w|{J(_+IKo`fPM{AnJ%;sGc&yz>Fmj{ujp>w1MJ zX`;O@9+2;n48#y4y;^0&#Wdtq@NT$`zq|{k>&@_2c<0r`rjAc}@Khrzk4}^OZ5>%H z{}w#!<*d#MuZx7i%P!dT^Ahu1nb!X~EPU%dK>ntsJRxZW8B@azD g+?MAB@5rvn15@{Y_@W$Nt3P}}UYYf@7{yurAF@`-)&Kwi literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/fr/LC_MESSAGES/default.po b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/fr/LC_MESSAGES/default.po new file mode 100644 index 0000000..e32c8d8 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/fr/LC_MESSAGES/default.po @@ -0,0 +1,498 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Customizer Demo\n" +"POT-Creation-Date: 2005-08-09 16:55\n" +"PO-Revision-Date: 2005-10-06 19:10-0300\n" +"Last-Translator: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: dxgettext 1.2\n" +"Language-Team: \n" + +#. Form1..SpTBXDock1..tbStandard..Caption +#: Unit1.dfm:29 +msgid "Standard" +msgstr "Standard" + +#. Form1..SpTBXDock1..tbStandard..tNew..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mNew..CaptionW +#. Form1..TntActionList1..aNew..Caption +#: Unit1.dfm:37 +#: Unit1.dfm:159 +#: Unit1.dfm:1559 +msgid "New" +msgstr "Nouveau" + +#. Form1..SpTBXDock1..tbStandard..tOpen..CaptionW +#: Unit1.dfm:41 +msgid "Open" +msgstr "Ouvrir" + +#. Form1..SpTBXDock1..tbStandard..tSave..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mSave..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayoutSave..CaptionW +#. Form1..TntActionList1..aSave..Caption +#: Unit1.dfm:45 +#: Unit1.dfm:167 +#: Unit1.dfm:318 +#: Unit1.dfm:1573 +msgid "Save" +msgstr "Enregistrer" + +#. Form1..SpTBXDock1..tbStandard..tCut..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCut..CaptionW +#. Form1..TntActionList1..aCut..Caption +#: Unit1.dfm:51 +#: Unit1.dfm:184 +#: Unit1.dfm:1585 +msgid "Cut" +msgstr "Couper" + +#. Form1..SpTBXDock1..tbStandard..tCopy..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCopy..CaptionW +#. Form1..TntActionList1..aCopy..Caption +#: Unit1.dfm:55 +#: Unit1.dfm:188 +#: Unit1.dfm:1592 +msgid "Copy" +msgstr "Copier" + +#. Form1..SpTBXDock1..tbStandard..tPaste..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mPaste..CaptionW +#. Form1..TntActionList1..aPaste..Caption +#: Unit1.dfm:60 +#: Unit1.dfm:192 +#: Unit1.dfm:1599 +msgid "Paste" +msgstr "Coller" + +#. Form1..SpTBXDock1..tbStandard..tFind..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mFind..CaptionW +#. Form1..TntActionList1..aFind..Caption +#: Unit1.dfm:67 +#: Unit1.dfm:206 +#: Unit1.dfm:1612 +msgid "Find" +msgstr "Chercher" + +#. Form1..SpTBXDock1..tbStandard..tThemes..CaptionW +#: Unit1.dfm:73 +msgid "Themes" +msgstr "Thèmes" + +#. Form1..SpTBXDock1..tbFormat..Caption +#. Form1..TntActionList1..aBold..Category +#. Form1..TntActionList1..aItalic..Category +#. Form1..TntActionList1..aUnderline..Category +#. Form1..TntActionList1..aLeftJustify..Category +#. Form1..TntActionList1..aRightJustify..Category +#. Form1..TntActionList1..aCentered..Category +#. Form1..TntActionList1..aBullets..Category +#. Form1..TntActionList1..aNumberedBullets..Category +#: Unit1.dfm:99 +#: Unit1.dfm:1618 +#: Unit1.dfm:1625 +#: Unit1.dfm:1632 +#: Unit1.dfm:1639 +#: Unit1.dfm:1645 +#: Unit1.dfm:1651 +#: Unit1.dfm:1657 +#: Unit1.dfm:1663 +msgid "Format" +msgstr "Format" + +#. Form1..SpTBXDock1..tbFormat..tFont..Caption +#: Unit1.dfm:106 +msgid "Font Name" +msgstr "Nom" + +#. Form1..SpTBXDock1..tbFormat..tFontSize..Caption +#: Unit1.dfm:116 +msgid "Font Size" +msgstr "Taille" + +#. Form1..SpTBXDock1..tbFormat..tBold..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBold..CaptionW +#. Form1..TntActionList1..aBold..Caption +#: Unit1.dfm:132 +#: Unit1.dfm:213 +#: Unit1.dfm:1619 +msgid "Bold" +msgstr "Gras" + +#. Form1..SpTBXDock1..tbFormat..tItalic..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mItalic..CaptionW +#. Form1..TntActionList1..aItalic..Caption +#: Unit1.dfm:136 +#: Unit1.dfm:217 +#: Unit1.dfm:1626 +msgid "Italic" +msgstr "Italique" + +#. Form1..SpTBXDock1..tbFormat..tUnderline..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mUnderline..CaptionW +#. Form1..TntActionList1..aUnderline..Caption +#: Unit1.dfm:140 +#: Unit1.dfm:221 +#: Unit1.dfm:1633 +msgid "Underline" +msgstr "Souligné" + +#. Form1..SpTBXDock1..tbMenuBar..Caption +#: Unit1.dfm:146 +msgid "Menu" +msgstr "Menu" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..CaptionW +#: Unit1.dfm:156 +msgid "&File" +msgstr "&Fichier" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mOpen..CaptionW +#. Form1..TntActionList1..aOpen..Caption +#: Unit1.dfm:163 +#: Unit1.dfm:1566 +msgid "Open..." +msgstr "Ouvrir..." + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mPrint..CaptionW +#. Form1..TntActionList1..aPrint..Caption +#. Form1..SpTBXCustomizer1..cPrint..CaptionW +#: Unit1.dfm:171 +#: Unit1.dfm:1670 +#: Unit1.dfm:1744 +msgid "Print" +msgstr "Imprimer" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mExit..CaptionW +#. Form1..TntActionList1..aExit..Caption +#. Form1..SpTBXCustomizer1..cExit..CaptionW +#: Unit1.dfm:177 +#: Unit1.dfm:1580 +#: Unit1.dfm:1776 +msgid "Exit" +msgstr "Quitter" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..CaptionW +#: Unit1.dfm:181 +msgid "&Edit" +msgstr "&Édition" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mSelectAll..CaptionW +#. Form1..TntActionList1..aSelectAll..Caption +#. Form1..SpTBXCustomizer1..cSelectAll..CaptionW +#: Unit1.dfm:198 +#: Unit1.dfm:1606 +#: Unit1.dfm:1772 +msgid "Select All" +msgstr "Tout sélectionner" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..CaptionW +#: Unit1.dfm:210 +msgid "&Format" +msgstr "&Format" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mLeftJustify..CaptionW +#. Form1..TntActionList1..aLeftJustify..Caption +#. Form1..SpTBXCustomizer1..cLeftJustify..CaptionW +#: Unit1.dfm:227 +#: Unit1.dfm:1640 +#: Unit1.dfm:1748 +msgid "Left Justify" +msgstr "Aligné a gauche" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mCentered..CaptionW +#. Form1..TntActionList1..aCentered..Caption +#. Form1..SpTBXCustomizer1..cCentered..CaptionW +#: Unit1.dfm:231 +#: Unit1.dfm:1652 +#: Unit1.dfm:1752 +msgid "Centered" +msgstr "Centré" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mRightJustify..CaptionW +#. Form1..TntActionList1..aRightJustify..Caption +#. Form1..SpTBXCustomizer1..cRightJustify..CaptionW +#: Unit1.dfm:235 +#: Unit1.dfm:1646 +#: Unit1.dfm:1756 +msgid "Right Justify" +msgstr "Aligné a droite" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBullets..CaptionW +#. Form1..TntActionList1..aBullets..Caption +#. Form1..SpTBXCustomizer1..cBullets..CaptionW +#: Unit1.dfm:241 +#: Unit1.dfm:1658 +#: Unit1.dfm:1760 +msgid "Bullets" +msgstr "Puces" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mNumberedBullets..CaptionW +#. Form1..TntActionList1..aNumberedBullets..Caption +#. Form1..SpTBXCustomizer1..cNumBullets..CaptionW +#: Unit1.dfm:245 +#: Unit1.dfm:1664 +#: Unit1.dfm:1764 +msgid "Numbered Bullets" +msgstr "Numérotation" + +#. Form1..SpTBXDock1..tbMenuBar..mView..CaptionW +#: Unit1.dfm:249 +msgid "&View" +msgstr "&Affichage" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..CaptionW +#: Unit1.dfm:251 +msgid "&Sidebar" +msgstr "Barre &latérale" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mCommandsLog..CaptionW +#: Unit1.dfm:254 +msgid "&Commands Log" +msgstr "Log Commandes" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mOptions..CaptionW +#: Unit1.dfm:258 +msgid "&Options" +msgstr "&Options" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mmHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mmmHelp..CaptionW +#: Unit1.dfm:262 +#: Unit1.dfm:286 +#: Unit1.dfm:288 +msgid "&Help" +msgstr "&Aide" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..CaptionW +#: Unit1.dfm:266 +msgid "&Toolbars" +msgstr "&Barres d'outils" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mStandardToolbar..CaptionW +#: Unit1.dfm:269 +msgid "&Standard Toolbar" +msgstr "Barre d'outil &Standard" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..tLayoutsToolbar..CaptionW +#: Unit1.dfm:273 +msgid "&Layouts Toolbar" +msgstr "Barre d'outil &Disposition" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mFormattingToolbar..CaptionW +#: Unit1.dfm:277 +msgid "&Formatting Toolbar" +msgstr "Barre d'outil &Format" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mNavigationToolbar..CaptionW +#: Unit1.dfm:281 +msgid "&Navigation Toolbar" +msgstr "Barre d'outil &Navigation" + +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mAbout..CaptionW +#: Unit1.dfm:291 +msgid "&About" +msgstr "À &propos..." + +#. Form1..SpTBXDock1..tbLayouts..Caption +#. Form1..SpTBXDock1..tbLayouts..Layouts..SpTBXLabelItem1..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayouts..Caption +#: Unit1.dfm:298 +#: Unit1.dfm:305 +#: Unit1.dfm:308 +msgid "Layouts" +msgstr "Disposition" + +#. Form1..SpTBXMultiDock1..dpLog..Caption +#: Unit1.dfm:332 +msgid "Commands Log" +msgstr "Log commandes" + +#. Form1..SpTBXMultiDock1..dpOptions..Caption +#: Unit1.dfm:352 +msgid "Customizer Options" +msgstr "Options de personnalisation" + +#. Form1..SpTBXMultiDock2..dpHelp..Caption +#: Unit1.dfm:368 +msgid "Help" +msgstr "Aide" + +#. Form1..SpTBXMultiDock2..dpHelp..SpTBXLabel1..Caption +#: Unit1.dfm:380 +msgid "Right click the toolbars to start playing" +msgstr "Cliquer avec le bouton droit sur une barre d'outil pour la personnaliser" + +#. Form1..SpTBXDock2..tbNavigation..Caption +#. Form1..TntActionList1..aBack..Category +#. Form1..TntActionList1..aForward..Category +#. Form1..TntActionList1..aStop..Category +#. Form1..TntActionList1..aRefresh..Category +#. Form1..TntActionList1..aSearch..Category +#. Form1..TntActionList1..aFavs..Category +#: Unit1.dfm:402 +#: Unit1.dfm:1675 +#: Unit1.dfm:1681 +#: Unit1.dfm:1687 +#: Unit1.dfm:1693 +#: Unit1.dfm:1699 +#: Unit1.dfm:1705 +msgid "Navigation" +msgstr "Navigation" + +#. Form1..SpTBXDock2..tbNavigation..tBack..CaptionW +#. Form1..TntActionList1..aBack..Caption +#: Unit1.dfm:409 +#: Unit1.dfm:1676 +msgid "Back" +msgstr "Précédent" + +#. Form1..SpTBXDock2..tbNavigation..tForward..CaptionW +#. Form1..TntActionList1..aForward..Caption +#: Unit1.dfm:413 +#: Unit1.dfm:1682 +msgid "Forward" +msgstr "Suivant" + +#. Form1..SpTBXDock2..tbNavigation..tRefresh..CaptionW +#. Form1..TntActionList1..aRefresh..Caption +#: Unit1.dfm:417 +#: Unit1.dfm:1694 +msgid "Refresh" +msgstr "Rafraîchir" + +#. Form1..SpTBXDock2..tbNavigation..tStop..CaptionW +#. Form1..TntActionList1..aStop..Caption +#: Unit1.dfm:421 +#: Unit1.dfm:1688 +msgid "Stop" +msgstr "Arrêter" + +#. Form1..SpTBXDock2..tbNavigation..tSearch..CaptionW +#. Form1..TntActionList1..aSearch..Caption +#: Unit1.dfm:425 +#: Unit1.dfm:1700 +msgid "Search" +msgstr "Chercher" + +#. Form1..TntActionList1..aNew..Category +#. Form1..TntActionList1..aOpen..Category +#. Form1..TntActionList1..aSave..Category +#. Form1..TntActionList1..aExit..Category +#. Form1..TntActionList1..aPrint..Category +#: Unit1.dfm:1558 +#: Unit1.dfm:1565 +#: Unit1.dfm:1572 +#: Unit1.dfm:1579 +#: Unit1.dfm:1669 +msgid "Files" +msgstr "Fichiers" + +#. Form1..TntActionList1..aCut..Category +#. Form1..TntActionList1..aCopy..Category +#. Form1..TntActionList1..aPaste..Category +#. Form1..TntActionList1..aSelectAll..Category +#. Form1..TntActionList1..aFind..Category +#: Unit1.dfm:1584 +#: Unit1.dfm:1591 +#: Unit1.dfm:1598 +#: Unit1.dfm:1605 +#: Unit1.dfm:1611 +msgid "Edit" +msgstr "Édition" + +#. Form1..TntActionList1..aFavs..Caption +#. Form1..SpTBXCustomizer1..cFavs..CaptionW +#: Unit1.dfm:1706 +#: Unit1.dfm:1768 +msgid "Favs" +msgstr "Favoris" + +#. Form1..TntActionList1..aCustomize..Category +#. Form1..TntActionList1..aEmbeddedCustomize..Category +#: Unit1.dfm:1711 +#: Unit1.dfm:1716 +msgid "Customization" +msgstr "Personnalisation" + +#. Form1..TntActionList1..aCustomize..Caption +#. Form1..SpTBXPopupMenu1..pCustomize..CaptionW +#: Unit1.dfm:1712 +#: Unit1.dfm:1731 +msgid "Customize..." +msgstr "Personnaliser..." + +#. Form1..TntActionList1..aEmbeddedCustomize..Caption +#. Form1..SpTBXPopupMenu1..pEmbeddedCustomize..CaptionW +#: Unit1.dfm:1717 +#: Unit1.dfm:1735 +msgid "Embedded Customize..." +msgstr "" + +#. Form2..Caption +#: Unit2.dfm:7 +msgid "Options" +msgstr "Options" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tProperties..CaptionW +#: Unit2.dfm:49 +msgid "Properties" +msgstr "Propriétés" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tPageSetup..CaptionW +#: Unit2.dfm:58 +msgid "Page Setup" +msgstr "Configurer l'impression" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tHistory..CaptionW +#: Unit2.dfm:67 +msgid "History" +msgstr "Historique" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tFavorites..CaptionW +#: Unit2.dfm:76 +msgid "Favorites" +msgstr "Favoris" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tCustomize..CaptionW +#. Form2..LeftPanel..TitlePanel..Caption +#: Unit2.dfm:85 +#: Unit2.dfm:168 +msgid "Customizer" +msgstr "Personnalisation" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton1..Caption +#: Unit2.dfm:122 +msgid "OK" +msgstr "OK" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton2..Caption +#: Unit2.dfm:137 +msgid "Cancel" +msgstr "Annuler" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton3..Caption +#: Unit2.dfm:152 +msgid "Apply" +msgstr "Appliquer" + +#: Unit1.pas:235 +msgid "Save Layout" +msgstr "Enregistrer disposition" + +#: Unit1.pas:235 +msgid "Save current layout as:" +msgstr "Enregistrer disposition sous:" + +#: Unit1.pas:248 +msgid "Executed" +msgstr "Exécuté" + diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/ignore.po b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/ignore.po new file mode 100644 index 0000000..eec136a --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/ignore.po @@ -0,0 +1,62 @@ +#. Form1..SpTBXTabControl1..SpTBXTabItem2..CaptionW +#: Unit1.dfm:445 +#. Form1..SpTBXTabControl1..SpTBXTabSheet2..Caption +#: Unit1.dfm:452 +msgid "Advanced Techniques.txt" +msgstr "" + +#. Form1..SpTBXTabControl1..SpTBXTabItem1..CaptionW +#: Unit1.dfm:441 +#. Form1..SpTBXTabControl1..SpTBXTabSheet1..Caption +#: Unit1.dfm:471 +msgid "FAQ.txt" +msgstr "" + +# Doesn't look like text +#. Form1..Caption +#: Unit1.dfm:6 +msgid "Form1" +msgstr "" + +# Seems like a Font.Name extract +#. Form1..Font.Name +#: Unit1.dfm:11 +#. Form1..SpTBXMultiDock2..dpHelp..SpTBXLabel1..LinkFont.Name +#: Unit1.dfm:387 +#. Form2..Font.Name +#: Unit2.dfm:14 +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton1..LinkFont.Name +#: Unit2.dfm:129 +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton2..LinkFont.Name +#: Unit2.dfm:144 +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton3..LinkFont.Name +#: Unit2.dfm:159 +#. Form2..LeftPanel..TitlePanel..LinkFont.Name +#: Unit2.dfm:182 +msgid "MS Shell Dlg 2" +msgstr "" + +# Doesn't look like text +#. Form1..SpTBXTabControl1..SpTBXTabSheet1..TabItem +#: Unit1.dfm:473 +msgid "SpTBXTabItem1" +msgstr "" + +# Doesn't look like text +#. Form1..SpTBXTabControl1..SpTBXTabSheet2..TabItem +#: Unit1.dfm:454 +msgid "SpTBXTabItem2" +msgstr "" + +# Doesn't look like text +#. Form2..SpTBXDock1..SpTBXToolbar1..Caption +#: Unit2.dfm:32 +msgid "SpTBXToolbar1" +msgstr "" + +# Seems like a Font.Name extract +#. Form2..LeftPanel..TitlePanel..Font.Name +#: Unit2.dfm:175 +msgid "Tahoma" +msgstr "" + diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/ja/LC_MESSAGES/default.mo b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/ja/LC_MESSAGES/default.mo new file mode 100644 index 0000000000000000000000000000000000000000..0118be8e911c503f6c38d63c3fb25ae55f560b25 GIT binary patch literal 3479 zcmZvce{ft?6~~XZA_PRO_ybURpe!44!zT3SLd9gep_Mc#&9>_Jhx4*~lRUb==Iz@w z!9m&gAPq@lf+bB#+CthS4K16NLQP3qs{8|g`Qs0rah!2RZr*M(qmDY`jN|x+-}Clv zH?_U<&i&kb-nr+Vd(M6DPwUo>5n2TDWyrRV6X{@LEjqNne}d>1@E_o(z<+~y=oToM zcYvP+*MXk{?@{_X@H3dNSNaHeE9T!<>;OND`9APA@HvqE9Z(zwIfO%s6Cm$%48%h- z=-A(z;2q!vknP_GInEE1{&!#v<{yFUz`ufPKz7FVYr)Thw}I^MKBf1A99KZiH-Q}A z<7(cd-ao1MGzi!90}u~&pkx2fsCgRX_xsiS#~{bu4|?YWInD`?<2wm*{!W1?30(x) z?h=THexdjw$m@Osa(sVO{Ik-RKs@wMbexy}fVJSQI4t{X0B;93fnNl}pmz?C{dRzO zD2a~kdq95wBariBgLi(6=pe}UlTdyEoCSG)1>|#lsOEoA^Cghu`4@OMxCX}efnNdn z9&J^88szmt&3iyRG>DGl7*jl|coO8io(4Y+E-3v6Ap89lh%MS`xXW$ zh1WR$cS6{|2DuBe0mApV()<`8g|r^R{}GOj+txB@8|Z^P3V8y;|F-)ftJ{OCCLAlb zuS3ER?=FJ(Kq@VQ!6OhH#mgb6kbJH{2)_E;HSefZnm#B*O`M>=Pb zFPu&$^;A5owWPbq7l|9tH5&=5y| zh-(#B-r`8Fh~+G78Ro5BXmd?_o+BFr&E^JswYKx)NVY>BQKA@ejJ*- z)NMBqr`bn4EInbwNF|b5M5m>F2WK!k`)H>~<*1rbYDH#Ra|jPd*D5J#dy3jJBIR{_ z%F20m>0Lr=7gjDqyY#FjXqRcEEcEG&Ff9Y|?iQV<$ad3iqpQ2RX?YeyQ2R8iTWD6f z;#mx|tfiZlmPzP+xC_*-_Xw}k%F&m{v7Bk5JQ|E}H8edNqIRL1v2GwCVwTpJNKoYh zV35vGv|A(*&z@9VmF-`8AA#mS5A z<&jlG>5NL}vZs*F1k9u}?)PoyrEl^&`-HS-r87{mYvDJ8(m5pU^H?bD1?imfLMZ!b z<*-h}$+b6rUmNQ#cu^qEvRyl3nLAQkJiJOFofp_8$51wk*3$CSTxojI@7r5TEBQA{ zugp<#;F7e5$eljz7RISGf1r453dfT9VeC?n&Pk5Oz63Y4bg|%0&qH0!lU7btS@#OI z!|05(-<9@N&Ly815me80YzJ+aA~ohN*8Q~%nugNjm!KQ_r)3ZcEfyC<*7J*wDiu2@@;s- zE7pKJigdA!nyUiYi|UHd%Jb)?{XA^cr6BjMnPTA`Djq(%bmb8A*If^C7iQhFFUb5P z-b_hnNIElKa&LB5;N#r#>GC!hF&hm9P39iSb0~P9f zRp#fH=L+uptF(L`+L7 qR+&~Rl0PEz??SzjzgQeRu09EJ^GAyXu2(, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Customizer Demo\n" +"POT-Creation-Date: 2005-08-09 16:55\n" +"PO-Revision-Date: 2008-09-13 07:16+0900\n" +"Last-Translator: TIMEFUL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: dxgettext 1.2\n" +"Language-Team: \n" + +#. Form1..SpTBXDock1..tbStandard..Caption +#: Unit1.dfm:29 +msgid "Standard" +msgstr "標準" + +#. Form1..SpTBXDock1..tbStandard..tNew..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mNew..CaptionW +#. Form1..TntActionList1..aNew..Caption +#: Unit1.dfm:37 +#: Unit1.dfm:159 +#: Unit1.dfm:1559 +msgid "New" +msgstr "æ–°è¦" + +#. Form1..SpTBXDock1..tbStandard..tOpen..CaptionW +#: Unit1.dfm:41 +msgid "Open" +msgstr "é–‹ã" + +#. Form1..SpTBXDock1..tbStandard..tSave..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mSave..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayoutSave..CaptionW +#. Form1..TntActionList1..aSave..Caption +#: Unit1.dfm:45 +#: Unit1.dfm:167 +#: Unit1.dfm:318 +#: Unit1.dfm:1573 +msgid "Save" +msgstr "ä¿å­˜" + +#. Form1..SpTBXDock1..tbStandard..tCut..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCut..CaptionW +#. Form1..TntActionList1..aCut..Caption +#: Unit1.dfm:51 +#: Unit1.dfm:184 +#: Unit1.dfm:1585 +msgid "Cut" +msgstr "切りå–り" + +#. Form1..SpTBXDock1..tbStandard..tCopy..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCopy..CaptionW +#. Form1..TntActionList1..aCopy..Caption +#: Unit1.dfm:55 +#: Unit1.dfm:188 +#: Unit1.dfm:1592 +msgid "Copy" +msgstr "コピー" + +#. Form1..SpTBXDock1..tbStandard..tPaste..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mPaste..CaptionW +#. Form1..TntActionList1..aPaste..Caption +#: Unit1.dfm:60 +#: Unit1.dfm:192 +#: Unit1.dfm:1599 +msgid "Paste" +msgstr "貼り付ã‘" + +#. Form1..SpTBXDock1..tbStandard..tFind..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mFind..CaptionW +#. Form1..TntActionList1..aFind..Caption +#: Unit1.dfm:67 +#: Unit1.dfm:206 +#: Unit1.dfm:1612 +msgid "Find" +msgstr "検索" + +#. Form1..SpTBXDock1..tbStandard..tThemes..CaptionW +#: Unit1.dfm:73 +msgid "Themes" +msgstr "テーマ" + +#. Form1..SpTBXDock1..tbFormat..Caption +#. Form1..TntActionList1..aBold..Category +#. Form1..TntActionList1..aItalic..Category +#. Form1..TntActionList1..aUnderline..Category +#. Form1..TntActionList1..aLeftJustify..Category +#. Form1..TntActionList1..aRightJustify..Category +#. Form1..TntActionList1..aCentered..Category +#. Form1..TntActionList1..aBullets..Category +#. Form1..TntActionList1..aNumberedBullets..Category +#: Unit1.dfm:99 +#: Unit1.dfm:1618 +#: Unit1.dfm:1625 +#: Unit1.dfm:1632 +#: Unit1.dfm:1639 +#: Unit1.dfm:1645 +#: Unit1.dfm:1651 +#: Unit1.dfm:1657 +#: Unit1.dfm:1663 +msgid "Format" +msgstr "書å¼" + +#. Form1..SpTBXDock1..tbFormat..tFont..Caption +#: Unit1.dfm:106 +msgid "Font Name" +msgstr "フォントå" + +#. Form1..SpTBXDock1..tbFormat..tFontSize..Caption +#: Unit1.dfm:116 +msgid "Font Size" +msgstr "フォントサイズ" + +#. Form1..SpTBXDock1..tbFormat..tBold..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBold..CaptionW +#. Form1..TntActionList1..aBold..Caption +#: Unit1.dfm:132 +#: Unit1.dfm:213 +#: Unit1.dfm:1619 +msgid "Bold" +msgstr "太字" + +#. Form1..SpTBXDock1..tbFormat..tItalic..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mItalic..CaptionW +#. Form1..TntActionList1..aItalic..Caption +#: Unit1.dfm:136 +#: Unit1.dfm:217 +#: Unit1.dfm:1626 +msgid "Italic" +msgstr "斜体" + +#. Form1..SpTBXDock1..tbFormat..tUnderline..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mUnderline..CaptionW +#. Form1..TntActionList1..aUnderline..Caption +#: Unit1.dfm:140 +#: Unit1.dfm:221 +#: Unit1.dfm:1633 +msgid "Underline" +msgstr "下線" + +#. Form1..SpTBXDock1..tbMenuBar..Caption +#: Unit1.dfm:146 +msgid "Menu" +msgstr "メニュー" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..CaptionW +#: Unit1.dfm:156 +msgid "&File" +msgstr "ファイル(&F)" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mOpen..CaptionW +#. Form1..TntActionList1..aOpen..Caption +#: Unit1.dfm:163 +#: Unit1.dfm:1566 +msgid "Open..." +msgstr "é–‹ã..." + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mPrint..CaptionW +#. Form1..TntActionList1..aPrint..Caption +#. Form1..SpTBXCustomizer1..cPrint..CaptionW +#: Unit1.dfm:171 +#: Unit1.dfm:1670 +#: Unit1.dfm:1744 +msgid "Print" +msgstr "å°åˆ·" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mExit..CaptionW +#. Form1..TntActionList1..aExit..Caption +#. Form1..SpTBXCustomizer1..cExit..CaptionW +#: Unit1.dfm:177 +#: Unit1.dfm:1580 +#: Unit1.dfm:1776 +msgid "Exit" +msgstr "終了" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..CaptionW +#: Unit1.dfm:181 +msgid "&Edit" +msgstr "編集(&E)" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mSelectAll..CaptionW +#. Form1..TntActionList1..aSelectAll..Caption +#. Form1..SpTBXCustomizer1..cSelectAll..CaptionW +#: Unit1.dfm:198 +#: Unit1.dfm:1606 +#: Unit1.dfm:1772 +msgid "Select All" +msgstr "ã™ã¹ã¦é¸æŠž" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..CaptionW +#: Unit1.dfm:210 +msgid "&Format" +msgstr "書å¼(&F)" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mLeftJustify..CaptionW +#. Form1..TntActionList1..aLeftJustify..Caption +#. Form1..SpTBXCustomizer1..cLeftJustify..CaptionW +#: Unit1.dfm:227 +#: Unit1.dfm:1640 +#: Unit1.dfm:1748 +msgid "Left Justify" +msgstr "左寄ã›" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mCentered..CaptionW +#. Form1..TntActionList1..aCentered..Caption +#. Form1..SpTBXCustomizer1..cCentered..CaptionW +#: Unit1.dfm:231 +#: Unit1.dfm:1652 +#: Unit1.dfm:1752 +msgid "Centered" +msgstr "中央" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mRightJustify..CaptionW +#. Form1..TntActionList1..aRightJustify..Caption +#. Form1..SpTBXCustomizer1..cRightJustify..CaptionW +#: Unit1.dfm:235 +#: Unit1.dfm:1646 +#: Unit1.dfm:1756 +msgid "Right Justify" +msgstr "å³å¯„ã›" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBullets..CaptionW +#. Form1..TntActionList1..aBullets..Caption +#. Form1..SpTBXCustomizer1..cBullets..CaptionW +#: Unit1.dfm:241 +#: Unit1.dfm:1658 +#: Unit1.dfm:1760 +msgid "Bullets" +msgstr "ç®‡æ¡æ›¸ã" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mNumberedBullets..CaptionW +#. Form1..TntActionList1..aNumberedBullets..Caption +#. Form1..SpTBXCustomizer1..cNumBullets..CaptionW +#: Unit1.dfm:245 +#: Unit1.dfm:1664 +#: Unit1.dfm:1764 +msgid "Numbered Bullets" +msgstr "段è½ç•ªå·" + +#. Form1..SpTBXDock1..tbMenuBar..mView..CaptionW +#: Unit1.dfm:249 +msgid "&View" +msgstr "表示(&V)" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..CaptionW +#: Unit1.dfm:251 +msgid "&Sidebar" +msgstr "サイドãƒãƒ¼(&S)" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mCommandsLog..CaptionW +#: Unit1.dfm:254 +msgid "&Commands Log" +msgstr "コマンドログ(&C)" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mOptions..CaptionW +#: Unit1.dfm:258 +msgid "&Options" +msgstr "オプション(&O)" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mmHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mmmHelp..CaptionW +#: Unit1.dfm:262 +#: Unit1.dfm:286 +#: Unit1.dfm:288 +msgid "&Help" +msgstr "ヘルプ(&H)" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..CaptionW +#: Unit1.dfm:266 +msgid "&Toolbars" +msgstr "ツールãƒãƒ¼(&T)" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mStandardToolbar..CaptionW +#: Unit1.dfm:269 +msgid "&Standard Toolbar" +msgstr "標準ãƒãƒ¼(&S)" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..tLayoutsToolbar..CaptionW +#: Unit1.dfm:273 +msgid "&Layouts Toolbar" +msgstr "レイアウトãƒãƒ¼(&L)" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mFormattingToolbar..CaptionW +#: Unit1.dfm:277 +msgid "&Formatting Toolbar" +msgstr "書å¼ãƒãƒ¼(&F)" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mNavigationToolbar..CaptionW +#: Unit1.dfm:281 +msgid "&Navigation Toolbar" +msgstr "ナビゲーションãƒãƒ¼(&N)" + +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mAbout..CaptionW +#: Unit1.dfm:291 +msgid "&About" +msgstr "情報(&A)" + +#. Form1..SpTBXDock1..tbLayouts..Caption +#. Form1..SpTBXDock1..tbLayouts..Layouts..SpTBXLabelItem1..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayouts..Caption +#: Unit1.dfm:298 +#: Unit1.dfm:305 +#: Unit1.dfm:308 +msgid "Layouts" +msgstr "レイアウト" + +#. Form1..SpTBXMultiDock1..dpLog..Caption +#: Unit1.dfm:332 +msgid "Commands Log" +msgstr "コマンド ログ" + +#. Form1..SpTBXMultiDock1..dpOptions..Caption +#: Unit1.dfm:352 +msgid "Customizer Options" +msgstr "カスタマイザ オプション" + +#. Form1..SpTBXMultiDock2..dpHelp..Caption +#: Unit1.dfm:368 +msgid "Help" +msgstr "ヘルプ" + +#. Form1..SpTBXMultiDock2..dpHelp..SpTBXLabel1..Caption +#: Unit1.dfm:380 +msgid "Right click the toolbars to start playing" +msgstr "ãƒãƒ¼ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã§é–‹å§‹ã—ã¾ã™" + +#. Form1..SpTBXDock2..tbNavigation..Caption +#. Form1..TntActionList1..aBack..Category +#. Form1..TntActionList1..aForward..Category +#. Form1..TntActionList1..aStop..Category +#. Form1..TntActionList1..aRefresh..Category +#. Form1..TntActionList1..aSearch..Category +#. Form1..TntActionList1..aFavs..Category +#: Unit1.dfm:402 +#: Unit1.dfm:1675 +#: Unit1.dfm:1681 +#: Unit1.dfm:1687 +#: Unit1.dfm:1693 +#: Unit1.dfm:1699 +#: Unit1.dfm:1705 +msgid "Navigation" +msgstr "ナビゲーション" + +#. Form1..SpTBXDock2..tbNavigation..tBack..CaptionW +#. Form1..TntActionList1..aBack..Caption +#: Unit1.dfm:409 +#: Unit1.dfm:1676 +msgid "Back" +msgstr "戻る" + +#. Form1..SpTBXDock2..tbNavigation..tForward..CaptionW +#. Form1..TntActionList1..aForward..Caption +#: Unit1.dfm:413 +#: Unit1.dfm:1682 +msgid "Forward" +msgstr "進む" + +#. Form1..SpTBXDock2..tbNavigation..tRefresh..CaptionW +#. Form1..TntActionList1..aRefresh..Caption +#: Unit1.dfm:417 +#: Unit1.dfm:1694 +msgid "Refresh" +msgstr "リフレッシュ" + +#. Form1..SpTBXDock2..tbNavigation..tStop..CaptionW +#. Form1..TntActionList1..aStop..Caption +#: Unit1.dfm:421 +#: Unit1.dfm:1688 +msgid "Stop" +msgstr "åœæ­¢" + +#. Form1..SpTBXDock2..tbNavigation..tSearch..CaptionW +#. Form1..TntActionList1..aSearch..Caption +#: Unit1.dfm:425 +#: Unit1.dfm:1700 +msgid "Search" +msgstr "検索" + +#. Form1..TntActionList1..aNew..Category +#. Form1..TntActionList1..aOpen..Category +#. Form1..TntActionList1..aSave..Category +#. Form1..TntActionList1..aExit..Category +#. Form1..TntActionList1..aPrint..Category +#: Unit1.dfm:1558 +#: Unit1.dfm:1565 +#: Unit1.dfm:1572 +#: Unit1.dfm:1579 +#: Unit1.dfm:1669 +msgid "Files" +msgstr "ファイル" + +#. Form1..TntActionList1..aCut..Category +#. Form1..TntActionList1..aCopy..Category +#. Form1..TntActionList1..aPaste..Category +#. Form1..TntActionList1..aSelectAll..Category +#. Form1..TntActionList1..aFind..Category +#: Unit1.dfm:1584 +#: Unit1.dfm:1591 +#: Unit1.dfm:1598 +#: Unit1.dfm:1605 +#: Unit1.dfm:1611 +msgid "Edit" +msgstr "編集" + +#. Form1..TntActionList1..aFavs..Caption +#. Form1..SpTBXCustomizer1..cFavs..CaptionW +#: Unit1.dfm:1706 +#: Unit1.dfm:1768 +msgid "Favs" +msgstr "ãŠæ°—ã«å…¥ã‚Š" + +#. Form1..TntActionList1..aCustomize..Category +#. Form1..TntActionList1..aEmbeddedCustomize..Category +#: Unit1.dfm:1711 +#: Unit1.dfm:1716 +msgid "Customization" +msgstr "カスタマイゼーション" + +#. Form1..TntActionList1..aCustomize..Caption +#. Form1..SpTBXPopupMenu1..pCustomize..CaptionW +#: Unit1.dfm:1712 +#: Unit1.dfm:1731 +msgid "Customize..." +msgstr "カスタマイズ..." + +#. Form1..TntActionList1..aEmbeddedCustomize..Caption +#. Form1..SpTBXPopupMenu1..pEmbeddedCustomize..CaptionW +#: Unit1.dfm:1717 +#: Unit1.dfm:1735 +msgid "Embedded Customize..." +msgstr "カスタマイズ 埋ã‚è¾¼ã¿..." + +#. Form2..Caption +#: Unit2.dfm:7 +msgid "Options" +msgstr "オプション" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tProperties..CaptionW +#: Unit2.dfm:49 +msgid "Properties" +msgstr "プロパティ" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tPageSetup..CaptionW +#: Unit2.dfm:58 +msgid "Page Setup" +msgstr "プリンタã®è¨­å®š" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tHistory..CaptionW +#: Unit2.dfm:67 +msgid "History" +msgstr "履歴" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tFavorites..CaptionW +#: Unit2.dfm:76 +msgid "Favorites" +msgstr "ãŠæ°—ã«å…¥ã‚Š" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tCustomize..CaptionW +#. Form2..LeftPanel..TitlePanel..Caption +#: Unit2.dfm:85 +#: Unit2.dfm:168 +msgid "Customizer" +msgstr "カスタマイザ" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton1..Caption +#: Unit2.dfm:122 +msgid "OK" +msgstr "OK" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton2..Caption +#: Unit2.dfm:137 +msgid "Cancel" +msgstr "キャンセル" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton3..Caption +#: Unit2.dfm:152 +msgid "Apply" +msgstr "é©ç”¨" + +#: Unit1.pas:235 +msgid "Save Layout" +msgstr "レイアウトä¿å­˜" + +#: Unit1.pas:235 +msgid "Save current layout as:" +msgstr "レイアウトã«åå‰ã‚’付ã‘ã¦ä¿å­˜" + +#: Unit1.pas:248 +msgid "Executed" +msgstr "実行完了" + diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/ko/LC_MESSAGES/default.mo b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/ko/LC_MESSAGES/default.mo new file mode 100644 index 0000000000000000000000000000000000000000..12c822e6ca4f22fd14823efd03500088eb528c4f GIT binary patch literal 1792 zcmZvbO;B4^6vvOXSdI0I`dPnT{dk5&Vn9)hbwN`Qv=xS=On3T7F3HpIlD<4za5^Ib zZL!TLbjlR4iE#wMmPLjFrZcD;H@a}#blj*5-8gwS3*EWt_&+aqWTAK7xxf2A@7#0F zy?Obyapx>yJOg_K7Q2b470mCzgz?tRM7Mwj*Z`&!EpQjKqx4DeR_JlXbIN}K+zJ1J z;wK>ITU7cAh=(EN&^7nWT>~R>^y%WZHc{~c^v+=kKw%1$L`{&&J9rEDcnQQWQ&AmPahVUyl(iW79eh`&PzGU)_G3@a|u6v<>qDS}*H zD$bOnPSZ+IXU1~0sQIqI%1aEKFzf_*`Mb=Vld(ss+cDB+oDPXWM|*8J=a_?|^akqm zyiPq?VR=(97zFF>^cp!wP_J!T4)uvaTjWyIXC_nIyQ9W&K~Z7Y@f462aYt)Urzz@W zvJ^{+A@p~|N(eh`TAV2JHX;Jui9o-wb2xEWi=d6n5E{3&gJLM->+OjJBDOHNfxtn- z5n-(*6lx8G+5(}MwB{GWt*wX&^oippC-|R`7sJmZ{JBubcL?nVVzy!B(gw~S)_jM% z4|i_CSV&m>GM z8P?hcOviUL@T#zcU9XcENeYK^Y0beFv|%NOjid;~gfWCBNS0>ZtLuKfy@_fcR^;-G zU+=&&pO=L#zut-E+^jrT@RsgJlk(#+cX`^ccQuim+mNT`{CZClRm)?txFn0y?&qs= zani3xn+RE}m9k&&$MXE5`{^aBZfsQ7@+7}pk*D)`zaht0Nfzha!j?PE!KwpQon-lI zc2+A$KCRW>U-d$~c1X?^<)tmo`fpQID^AI?i?!1wbb(!ExlobCNs{wh^72>pXpN6s zLe+^W?3D}aRGXibg$l`wUITS_XR05M+|7A;an+stjEf^uo, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Customizer Demo\n" +"POT-Creation-Date: 2005-08-09 16:55\n" +"PO-Revision-Date: 2005-08-09 17:45-0300\n" +"Last-Translator: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: dxgettext 1.2\n" +"Language-Team: \n" + +#. Form1..SpTBXDock1..tbStandard..Caption +#: Unit1.dfm:29 +msgid "Standard" +msgstr "" + +#. Form1..SpTBXDock1..tbStandard..tNew..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mNew..CaptionW +#. Form1..TntActionList1..aNew..Caption +#: Unit1.dfm:37 +#: Unit1.dfm:159 +#: Unit1.dfm:1559 +msgid "New" +msgstr "새로운" + +#. Form1..SpTBXDock1..tbStandard..tOpen..CaptionW +#: Unit1.dfm:41 +msgid "Open" +msgstr "열기" + +#. Form1..SpTBXDock1..tbStandard..tSave..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mSave..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayoutSave..CaptionW +#. Form1..TntActionList1..aSave..Caption +#: Unit1.dfm:45 +#: Unit1.dfm:167 +#: Unit1.dfm:318 +#: Unit1.dfm:1573 +msgid "Save" +msgstr "저장" + +#. Form1..SpTBXDock1..tbStandard..tCut..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCut..CaptionW +#. Form1..TntActionList1..aCut..Caption +#: Unit1.dfm:51 +#: Unit1.dfm:184 +#: Unit1.dfm:1585 +msgid "Cut" +msgstr "잘ë¼ë‚´ê¸°" + +#. Form1..SpTBXDock1..tbStandard..tCopy..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCopy..CaptionW +#. Form1..TntActionList1..aCopy..Caption +#: Unit1.dfm:55 +#: Unit1.dfm:188 +#: Unit1.dfm:1592 +msgid "Copy" +msgstr "복사" + +#. Form1..SpTBXDock1..tbStandard..tPaste..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mPaste..CaptionW +#. Form1..TntActionList1..aPaste..Caption +#: Unit1.dfm:60 +#: Unit1.dfm:192 +#: Unit1.dfm:1599 +msgid "Paste" +msgstr "붙여넣기" + +#. Form1..SpTBXDock1..tbStandard..tFind..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mFind..CaptionW +#. Form1..TntActionList1..aFind..Caption +#: Unit1.dfm:67 +#: Unit1.dfm:206 +#: Unit1.dfm:1612 +msgid "Find" +msgstr "찾기" + +#. Form1..SpTBXDock1..tbStandard..tThemes..CaptionW +#: Unit1.dfm:73 +msgid "Themes" +msgstr "테마" + +#. Form1..SpTBXDock1..tbFormat..Caption +#. Form1..TntActionList1..aBold..Category +#. Form1..TntActionList1..aItalic..Category +#. Form1..TntActionList1..aUnderline..Category +#. Form1..TntActionList1..aLeftJustify..Category +#. Form1..TntActionList1..aRightJustify..Category +#. Form1..TntActionList1..aCentered..Category +#. Form1..TntActionList1..aBullets..Category +#. Form1..TntActionList1..aNumberedBullets..Category +#: Unit1.dfm:99 +#: Unit1.dfm:1618 +#: Unit1.dfm:1625 +#: Unit1.dfm:1632 +#: Unit1.dfm:1639 +#: Unit1.dfm:1645 +#: Unit1.dfm:1651 +#: Unit1.dfm:1657 +#: Unit1.dfm:1663 +msgid "Format" +msgstr "형ì‹" + +#. Form1..SpTBXDock1..tbFormat..tFont..Caption +#: Unit1.dfm:106 +msgid "Font Name" +msgstr "" + +#. Form1..SpTBXDock1..tbFormat..tFontSize..Caption +#: Unit1.dfm:116 +msgid "Font Size" +msgstr "ê¸€ìž í¬ê¸°" + +#. Form1..SpTBXDock1..tbFormat..tBold..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBold..CaptionW +#. Form1..TntActionList1..aBold..Caption +#: Unit1.dfm:132 +#: Unit1.dfm:213 +#: Unit1.dfm:1619 +msgid "Bold" +msgstr "굵게" + +#. Form1..SpTBXDock1..tbFormat..tItalic..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mItalic..CaptionW +#. Form1..TntActionList1..aItalic..Caption +#: Unit1.dfm:136 +#: Unit1.dfm:217 +#: Unit1.dfm:1626 +msgid "Italic" +msgstr "기울임" + +#. Form1..SpTBXDock1..tbFormat..tUnderline..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mUnderline..CaptionW +#. Form1..TntActionList1..aUnderline..Caption +#: Unit1.dfm:140 +#: Unit1.dfm:221 +#: Unit1.dfm:1633 +msgid "Underline" +msgstr "밑줄" + +#. Form1..SpTBXDock1..tbMenuBar..Caption +#: Unit1.dfm:146 +msgid "Menu" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..CaptionW +#: Unit1.dfm:156 +msgid "&File" +msgstr "파ì¼(&F)" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mOpen..CaptionW +#. Form1..TntActionList1..aOpen..Caption +#: Unit1.dfm:163 +#: Unit1.dfm:1566 +msgid "Open..." +msgstr "열기(&O)" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mPrint..CaptionW +#. Form1..TntActionList1..aPrint..Caption +#. Form1..SpTBXCustomizer1..cPrint..CaptionW +#: Unit1.dfm:171 +#: Unit1.dfm:1670 +#: Unit1.dfm:1744 +msgid "Print" +msgstr "ì¸ì‡„" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mExit..CaptionW +#. Form1..TntActionList1..aExit..Caption +#. Form1..SpTBXCustomizer1..cExit..CaptionW +#: Unit1.dfm:177 +#: Unit1.dfm:1580 +#: Unit1.dfm:1776 +msgid "Exit" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..CaptionW +#: Unit1.dfm:181 +msgid "&Edit" +msgstr "편집(&E)" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mSelectAll..CaptionW +#. Form1..TntActionList1..aSelectAll..Caption +#. Form1..SpTBXCustomizer1..cSelectAll..CaptionW +#: Unit1.dfm:198 +#: Unit1.dfm:1606 +#: Unit1.dfm:1772 +msgid "Select All" +msgstr "ëª¨ë‘ ì„ íƒ(A)" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..CaptionW +#: Unit1.dfm:210 +msgid "&Format" +msgstr "형ì‹(&F)" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mLeftJustify..CaptionW +#. Form1..TntActionList1..aLeftJustify..Caption +#. Form1..SpTBXCustomizer1..cLeftJustify..CaptionW +#: Unit1.dfm:227 +#: Unit1.dfm:1640 +#: Unit1.dfm:1748 +msgid "Left Justify" +msgstr "왼쪽으로 ì •ë ¬" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mCentered..CaptionW +#. Form1..TntActionList1..aCentered..Caption +#. Form1..SpTBXCustomizer1..cCentered..CaptionW +#: Unit1.dfm:231 +#: Unit1.dfm:1652 +#: Unit1.dfm:1752 +msgid "Centered" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mRightJustify..CaptionW +#. Form1..TntActionList1..aRightJustify..Caption +#. Form1..SpTBXCustomizer1..cRightJustify..CaptionW +#: Unit1.dfm:235 +#: Unit1.dfm:1646 +#: Unit1.dfm:1756 +msgid "Right Justify" +msgstr "오른쪽으로 ì •ë ¬" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBullets..CaptionW +#. Form1..TntActionList1..aBullets..Caption +#. Form1..SpTBXCustomizer1..cBullets..CaptionW +#: Unit1.dfm:241 +#: Unit1.dfm:1658 +#: Unit1.dfm:1760 +msgid "Bullets" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mNumberedBullets..CaptionW +#. Form1..TntActionList1..aNumberedBullets..Caption +#. Form1..SpTBXCustomizer1..cNumBullets..CaptionW +#: Unit1.dfm:245 +#: Unit1.dfm:1664 +#: Unit1.dfm:1764 +msgid "Numbered Bullets" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..mView..CaptionW +#: Unit1.dfm:249 +msgid "&View" +msgstr "보기(&V)" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..CaptionW +#: Unit1.dfm:251 +msgid "&Sidebar" +msgstr "가장ìžë¦¬ì¤„(&S)" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mCommandsLog..CaptionW +#: Unit1.dfm:254 +msgid "&Commands Log" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mOptions..CaptionW +#: Unit1.dfm:258 +msgid "&Options" +msgstr "옵션(&O)" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mmHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mmmHelp..CaptionW +#: Unit1.dfm:262 +#: Unit1.dfm:286 +#: Unit1.dfm:288 +msgid "&Help" +msgstr "ë„움ë§(&H)" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..CaptionW +#: Unit1.dfm:266 +msgid "&Toolbars" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mStandardToolbar..CaptionW +#: Unit1.dfm:269 +msgid "&Standard Toolbar" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..tLayoutsToolbar..CaptionW +#: Unit1.dfm:273 +msgid "&Layouts Toolbar" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mFormattingToolbar..CaptionW +#: Unit1.dfm:277 +msgid "&Formatting Toolbar" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mNavigationToolbar..CaptionW +#: Unit1.dfm:281 +msgid "&Navigation Toolbar" +msgstr "" + +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mAbout..CaptionW +#: Unit1.dfm:291 +msgid "&About" +msgstr "ì •ë³´(&A)" + +#. Form1..SpTBXDock1..tbLayouts..Caption +#. Form1..SpTBXDock1..tbLayouts..Layouts..SpTBXLabelItem1..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayouts..Caption +#: Unit1.dfm:298 +#: Unit1.dfm:305 +#: Unit1.dfm:308 +msgid "Layouts" +msgstr "" + +#. Form1..SpTBXMultiDock1..dpLog..Caption +#: Unit1.dfm:332 +msgid "Commands Log" +msgstr "" + +#. Form1..SpTBXMultiDock1..dpOptions..Caption +#: Unit1.dfm:352 +msgid "Customizer Options" +msgstr "" + +#. Form1..SpTBXMultiDock2..dpHelp..Caption +#: Unit1.dfm:368 +msgid "Help" +msgstr "ë„움ë§" + +#. Form1..SpTBXMultiDock2..dpHelp..SpTBXLabel1..Caption +#: Unit1.dfm:380 +msgid "Right click the toolbars to start playing" +msgstr "" + +#. Form1..SpTBXDock2..tbNavigation..Caption +#. Form1..TntActionList1..aBack..Category +#. Form1..TntActionList1..aForward..Category +#. Form1..TntActionList1..aStop..Category +#. Form1..TntActionList1..aRefresh..Category +#. Form1..TntActionList1..aSearch..Category +#. Form1..TntActionList1..aFavs..Category +#: Unit1.dfm:402 +#: Unit1.dfm:1675 +#: Unit1.dfm:1681 +#: Unit1.dfm:1687 +#: Unit1.dfm:1693 +#: Unit1.dfm:1699 +#: Unit1.dfm:1705 +msgid "Navigation" +msgstr "" + +#. Form1..SpTBXDock2..tbNavigation..tBack..CaptionW +#. Form1..TntActionList1..aBack..Caption +#: Unit1.dfm:409 +#: Unit1.dfm:1676 +msgid "Back" +msgstr "뒤로" + +#. Form1..SpTBXDock2..tbNavigation..tForward..CaptionW +#. Form1..TntActionList1..aForward..Caption +#: Unit1.dfm:413 +#: Unit1.dfm:1682 +msgid "Forward" +msgstr "앞으로" + +#. Form1..SpTBXDock2..tbNavigation..tRefresh..CaptionW +#. Form1..TntActionList1..aRefresh..Caption +#: Unit1.dfm:417 +#: Unit1.dfm:1694 +msgid "Refresh" +msgstr "새로고침" + +#. Form1..SpTBXDock2..tbNavigation..tStop..CaptionW +#. Form1..TntActionList1..aStop..Caption +#: Unit1.dfm:421 +#: Unit1.dfm:1688 +msgid "Stop" +msgstr "멈추기" + +#. Form1..SpTBXDock2..tbNavigation..tSearch..CaptionW +#. Form1..TntActionList1..aSearch..Caption +#: Unit1.dfm:425 +#: Unit1.dfm:1700 +msgid "Search" +msgstr "검색" + +#. Form1..TntActionList1..aNew..Category +#. Form1..TntActionList1..aOpen..Category +#. Form1..TntActionList1..aSave..Category +#. Form1..TntActionList1..aExit..Category +#. Form1..TntActionList1..aPrint..Category +#: Unit1.dfm:1558 +#: Unit1.dfm:1565 +#: Unit1.dfm:1572 +#: Unit1.dfm:1579 +#: Unit1.dfm:1669 +msgid "Files" +msgstr "파ì¼" + +#. Form1..TntActionList1..aCut..Category +#. Form1..TntActionList1..aCopy..Category +#. Form1..TntActionList1..aPaste..Category +#. Form1..TntActionList1..aSelectAll..Category +#. Form1..TntActionList1..aFind..Category +#: Unit1.dfm:1584 +#: Unit1.dfm:1591 +#: Unit1.dfm:1598 +#: Unit1.dfm:1605 +#: Unit1.dfm:1611 +msgid "Edit" +msgstr "편집" + +#. Form1..TntActionList1..aFavs..Caption +#. Form1..SpTBXCustomizer1..cFavs..CaptionW +#: Unit1.dfm:1706 +#: Unit1.dfm:1768 +msgid "Favs" +msgstr "" + +#. Form1..TntActionList1..aCustomize..Category +#. Form1..TntActionList1..aEmbeddedCustomize..Category +#: Unit1.dfm:1711 +#: Unit1.dfm:1716 +msgid "Customization" +msgstr "" + +#. Form1..TntActionList1..aCustomize..Caption +#. Form1..SpTBXPopupMenu1..pCustomize..CaptionW +#: Unit1.dfm:1712 +#: Unit1.dfm:1731 +msgid "Customize..." +msgstr "" + +#. Form1..TntActionList1..aEmbeddedCustomize..Caption +#. Form1..SpTBXPopupMenu1..pEmbeddedCustomize..CaptionW +#: Unit1.dfm:1717 +#: Unit1.dfm:1735 +msgid "Embedded Customize..." +msgstr "" + +#. Form2..Caption +#: Unit2.dfm:7 +msgid "Options" +msgstr "옵션" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tProperties..CaptionW +#: Unit2.dfm:49 +msgid "Properties" +msgstr "" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tPageSetup..CaptionW +#: Unit2.dfm:58 +msgid "Page Setup" +msgstr "" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tHistory..CaptionW +#: Unit2.dfm:67 +msgid "History" +msgstr "히스토리" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tFavorites..CaptionW +#: Unit2.dfm:76 +msgid "Favorites" +msgstr "" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tCustomize..CaptionW +#. Form2..LeftPanel..TitlePanel..Caption +#: Unit2.dfm:85 +#: Unit2.dfm:168 +msgid "Customizer" +msgstr "" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton1..Caption +#: Unit2.dfm:122 +msgid "OK" +msgstr "확ì¸" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton2..Caption +#: Unit2.dfm:137 +msgid "Cancel" +msgstr "취소" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton3..Caption +#: Unit2.dfm:152 +msgid "Apply" +msgstr "" + +#: Unit1.pas:235 +msgid "Save Layout" +msgstr "" + +#: Unit1.pas:235 +msgid "Save current layout as:" +msgstr "" + +#: Unit1.pas:248 +msgid "Executed" +msgstr "" + diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/nl/LC_MESSAGES/default.mo b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/nl/LC_MESSAGES/default.mo new file mode 100644 index 0000000000000000000000000000000000000000..350e6f726cff22d0bf72455d5edfa4f995d3bf5a GIT binary patch literal 3243 zcmZvcO^h5z6@Uw3^0N*EOu~=(NdaN(5PCDa_WEZX13TmKdhvQ^;~j4xT&SIXJKH-w z-L3APwKoV35kC@2xByXz1Q&iHK_oZ?2`NHCLGi*dGtB=6kHCMx+n^fL^@ren@GhwK?)UoRQ2h%0{4`Ym9`W;*f4}Vc zD8#h+6yz~mbZURs&r_)HulxDup!)qqSe+B9pU*<|@7qx0_dFye<|k0sy##s8&pdwx z^}F9f_3zJ~uXz36A&>btoyO%g_#nKK!>YY`co?3BZ-;GIodc@fEy!a=bh>^I>if?? zjn9+tj@KFU6x98{hVmZx9Mt#Ur{k4*5vm_Qg?g@EKwbX_sCoGd)cSc9>bl$5T)#UE zRevv3KaWG*|0HCoIS18F2Ws3dL$%-a??3Ii3-$b^pFasT{!e*+!|T5X-+}%|Q2qEd zR6l+PkHSAe9`heM-Cv#3`3%(f+y_;E6sn&O`1wOn_gnD#7F7EyP``WBzu)xwK2$qH zsPP;_UH1jA|1zxN?dQ)yt&{ISUH3dx`!7KC<3*@(e97y71J(W?p~mGEsONYUYW!Y< z55mJZt#%fm>d(XXz%{6LW3Mlu+WS1z^0zAYIo9(Gr&c264C#N-eGO$YnThLft)}-is--XeaOM~!2=WZUE2dl8@V6R zb85~ft;679MB}Ar($+$n)u`??X4=joXOQ>mgcj5=Z}WT?{1Ea1pUuUhk`5Y7FEk&hvoCvE3yRQ01Zaa!k%rLA;annpVvja(8Ib~PQC zMkkEWU5sL(PxFz}S;aC+2DX=`@s`U?Ko{L! znn$G+I-(<7+9#p8m?ouNb0euo8_^Rws^SQ)b7)hA?ox!G`My~xT^#j|52RU@?b3dn zGeq0_=87a^GmWTOBQk4a+~eqW5|Zv^)6FEQIz8p&JnL>Cc0X4YL%idoO2q@+(X z$;$|TugZ2V#g4fe4R)rR*0VlN4Q;t2wyZN=FtA1G^3rCp+ou-HhTD^>v$gm2xIfNw z(qmafX;@b*nhkMze+R_UFYQtsn@IsMNHf#hkrDn}OG3%xC{b6_U6uwbVX!HALG>(7 zvys~iGD>IGyS<>DOO@x~f-7aw&NrJ2LGw(|JZtApEiNpuCb%klks6pTIU6)j2F-ap zcVcnwRM0%pY|g9_prDt#q=+3^S+p}(R<3lWd(X`_XWAr|a|ONqjIBz!Q9eu{qU4^8B^l#o)|zotoR0Jm@6-G$dY&_RLmP&U_+RmPGP;pYX;&O0{L@X6JDu8H`C= z&=WVp3DfBA33ts`d3vnAqb+G%mwZUh8!aIvR9&N+jhq`!XdmPKmWxr;_w+H5d_cMm zyqMJ0L7mnPiD*0??bct{dD5FYwKy5Ee@i58gr=8D=86JEPxA4=Y)VNP7W`K@Hl>HF zg;`3HaZKeV)$PrzQ8x>7*WV$oG5?;+X%@Zw16{G?5;e%z(}^Tn-Tn>g+E=@mrn$Xk z{pBRe^g^`6M`>AJ{vo*=svz^`@l?+; zx#MnBkCyW^C5d=c&{JqB1vTU14HWITMCBwqvMI7xWSia@P zi&=|gTwVE*aCryj|J`-+#Z`|IXIBzp9dm&+YU{BZs;^7iVLq-#od`YNxGFl_t3<7{ z, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Customizer Demo\n" +"POT-Creation-Date: 2005-08-09 16:55\n" +"PO-Revision-Date: 2009-04-02 13:16-0300\n" +"Last-Translator: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: dxgettext 1.2\n" +"Language-Team: \n" + +#. Form1..SpTBXDock1..tbStandard..Caption +#: Unit1.dfm:29 +msgid "Standard" +msgstr "Standaard" + +#. Form1..SpTBXDock1..tbStandard..tNew..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mNew..CaptionW +#. Form1..TntActionList1..aNew..Caption +#: Unit1.dfm:37 +#: Unit1.dfm:159 +#: Unit1.dfm:1559 +msgid "New" +msgstr "Nieuw" + +#. Form1..SpTBXDock1..tbStandard..tOpen..CaptionW +#: Unit1.dfm:41 +msgid "Open" +msgstr "Open" + +#. Form1..SpTBXDock1..tbStandard..tSave..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mSave..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayoutSave..CaptionW +#. Form1..TntActionList1..aSave..Caption +#: Unit1.dfm:45 +#: Unit1.dfm:167 +#: Unit1.dfm:318 +#: Unit1.dfm:1573 +msgid "Save" +msgstr "Opslaan" + +#. Form1..SpTBXDock1..tbStandard..tCut..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCut..CaptionW +#. Form1..TntActionList1..aCut..Caption +#: Unit1.dfm:51 +#: Unit1.dfm:184 +#: Unit1.dfm:1585 +msgid "Cut" +msgstr "Knippen" + +#. Form1..SpTBXDock1..tbStandard..tCopy..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCopy..CaptionW +#. Form1..TntActionList1..aCopy..Caption +#: Unit1.dfm:55 +#: Unit1.dfm:188 +#: Unit1.dfm:1592 +msgid "Copy" +msgstr "Kopiëren" + +#. Form1..SpTBXDock1..tbStandard..tPaste..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mPaste..CaptionW +#. Form1..TntActionList1..aPaste..Caption +#: Unit1.dfm:60 +#: Unit1.dfm:192 +#: Unit1.dfm:1599 +msgid "Paste" +msgstr "Plakken" + +#. Form1..SpTBXDock1..tbStandard..tFind..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mFind..CaptionW +#. Form1..TntActionList1..aFind..Caption +#: Unit1.dfm:67 +#: Unit1.dfm:206 +#: Unit1.dfm:1612 +msgid "Find" +msgstr "Zoeken" + +#. Form1..SpTBXDock1..tbStandard..tThemes..CaptionW +#: Unit1.dfm:73 +msgid "Themes" +msgstr "Thema's" + +#. Form1..SpTBXDock1..tbFormat..Caption +#. Form1..TntActionList1..aBold..Category +#. Form1..TntActionList1..aItalic..Category +#. Form1..TntActionList1..aUnderline..Category +#. Form1..TntActionList1..aLeftJustify..Category +#. Form1..TntActionList1..aRightJustify..Category +#. Form1..TntActionList1..aCentered..Category +#. Form1..TntActionList1..aBullets..Category +#. Form1..TntActionList1..aNumberedBullets..Category +#: Unit1.dfm:99 +#: Unit1.dfm:1618 +#: Unit1.dfm:1625 +#: Unit1.dfm:1632 +#: Unit1.dfm:1639 +#: Unit1.dfm:1645 +#: Unit1.dfm:1651 +#: Unit1.dfm:1657 +#: Unit1.dfm:1663 +msgid "Format" +msgstr "Opmaak" + +#. Form1..SpTBXDock1..tbFormat..tFont..Caption +#: Unit1.dfm:106 +msgid "Font Name" +msgstr "Font Naam" + +#. Form1..SpTBXDock1..tbFormat..tFontSize..Caption +#: Unit1.dfm:116 +msgid "Font Size" +msgstr "Font Grootte" + +#. Form1..SpTBXDock1..tbFormat..tBold..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBold..CaptionW +#. Form1..TntActionList1..aBold..Caption +#: Unit1.dfm:132 +#: Unit1.dfm:213 +#: Unit1.dfm:1619 +msgid "Bold" +msgstr "Vet" + +#. Form1..SpTBXDock1..tbFormat..tItalic..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mItalic..CaptionW +#. Form1..TntActionList1..aItalic..Caption +#: Unit1.dfm:136 +#: Unit1.dfm:217 +#: Unit1.dfm:1626 +msgid "Italic" +msgstr "Cursief" + +#. Form1..SpTBXDock1..tbFormat..tUnderline..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mUnderline..CaptionW +#. Form1..TntActionList1..aUnderline..Caption +#: Unit1.dfm:140 +#: Unit1.dfm:221 +#: Unit1.dfm:1633 +msgid "Underline" +msgstr "Onderstreept" + +#. Form1..SpTBXDock1..tbMenuBar..Caption +#: Unit1.dfm:146 +msgid "Menu" +msgstr "Menu" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..CaptionW +#: Unit1.dfm:156 +msgid "&File" +msgstr "&Bestand" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mOpen..CaptionW +#. Form1..TntActionList1..aOpen..Caption +#: Unit1.dfm:163 +#: Unit1.dfm:1566 +msgid "Open..." +msgstr "Open..." + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mPrint..CaptionW +#. Form1..TntActionList1..aPrint..Caption +#. Form1..SpTBXCustomizer1..cPrint..CaptionW +#: Unit1.dfm:171 +#: Unit1.dfm:1670 +#: Unit1.dfm:1744 +msgid "Print" +msgstr "Afdrukken" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mExit..CaptionW +#. Form1..TntActionList1..aExit..Caption +#. Form1..SpTBXCustomizer1..cExit..CaptionW +#: Unit1.dfm:177 +#: Unit1.dfm:1580 +#: Unit1.dfm:1776 +msgid "Exit" +msgstr "Afsluiten" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..CaptionW +#: Unit1.dfm:181 +msgid "&Edit" +msgstr "Be&werken" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mSelectAll..CaptionW +#. Form1..TntActionList1..aSelectAll..Caption +#. Form1..SpTBXCustomizer1..cSelectAll..CaptionW +#: Unit1.dfm:198 +#: Unit1.dfm:1606 +#: Unit1.dfm:1772 +msgid "Select All" +msgstr "Alles Selecteren" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..CaptionW +#: Unit1.dfm:210 +msgid "&Format" +msgstr "&Opmaak" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mLeftJustify..CaptionW +#. Form1..TntActionList1..aLeftJustify..Caption +#. Form1..SpTBXCustomizer1..cLeftJustify..CaptionW +#: Unit1.dfm:227 +#: Unit1.dfm:1640 +#: Unit1.dfm:1748 +msgid "Left Justify" +msgstr "Links Uitlijnen" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mCentered..CaptionW +#. Form1..TntActionList1..aCentered..Caption +#. Form1..SpTBXCustomizer1..cCentered..CaptionW +#: Unit1.dfm:231 +#: Unit1.dfm:1652 +#: Unit1.dfm:1752 +msgid "Centered" +msgstr "Centreren" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mRightJustify..CaptionW +#. Form1..TntActionList1..aRightJustify..Caption +#. Form1..SpTBXCustomizer1..cRightJustify..CaptionW +#: Unit1.dfm:235 +#: Unit1.dfm:1646 +#: Unit1.dfm:1756 +msgid "Right Justify" +msgstr "Rechts Uitlijnen" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBullets..CaptionW +#. Form1..TntActionList1..aBullets..Caption +#. Form1..SpTBXCustomizer1..cBullets..CaptionW +#: Unit1.dfm:241 +#: Unit1.dfm:1658 +#: Unit1.dfm:1760 +msgid "Bullets" +msgstr "Opsommingstekens" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mNumberedBullets..CaptionW +#. Form1..TntActionList1..aNumberedBullets..Caption +#. Form1..SpTBXCustomizer1..cNumBullets..CaptionW +#: Unit1.dfm:245 +#: Unit1.dfm:1664 +#: Unit1.dfm:1764 +msgid "Numbered Bullets" +msgstr "Nummering" + +#. Form1..SpTBXDock1..tbMenuBar..mView..CaptionW +#: Unit1.dfm:249 +msgid "&View" +msgstr "Beel&d" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..CaptionW +#: Unit1.dfm:251 +msgid "&Sidebar" +msgstr "&Zijbalk" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mCommandsLog..CaptionW +#: Unit1.dfm:254 +msgid "&Commands Log" +msgstr "&Commando's Log" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mOptions..CaptionW +#: Unit1.dfm:258 +msgid "&Options" +msgstr "&Opties" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mmHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mmmHelp..CaptionW +#: Unit1.dfm:262 +#: Unit1.dfm:286 +#: Unit1.dfm:288 +msgid "&Help" +msgstr "&Help" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..CaptionW +#: Unit1.dfm:266 +msgid "&Toolbars" +msgstr "&Werkbalken" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mStandardToolbar..CaptionW +#: Unit1.dfm:269 +msgid "&Standard Toolbar" +msgstr "&Standaard Werkbalk" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..tLayoutsToolbar..CaptionW +#: Unit1.dfm:273 +msgid "&Layouts Toolbar" +msgstr "&Weergave Werkbalk" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mFormattingToolbar..CaptionW +#: Unit1.dfm:277 +msgid "&Formatting Toolbar" +msgstr "&Opmaak Werkbalk" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mNavigationToolbar..CaptionW +#: Unit1.dfm:281 +msgid "&Navigation Toolbar" +msgstr "&Navigatie Werkbalk" + +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mAbout..CaptionW +#: Unit1.dfm:291 +msgid "&About" +msgstr "&Over" + +#. Form1..SpTBXDock1..tbLayouts..Caption +#. Form1..SpTBXDock1..tbLayouts..Layouts..SpTBXLabelItem1..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayouts..Caption +#: Unit1.dfm:298 +#: Unit1.dfm:305 +#: Unit1.dfm:308 +msgid "Layouts" +msgstr "Weergaven" + +#. Form1..SpTBXMultiDock1..dpLog..Caption +#: Unit1.dfm:332 +msgid "Commands Log" +msgstr "Opdrachtenlog" + +#. Form1..SpTBXMultiDock1..dpOptions..Caption +#: Unit1.dfm:352 +msgid "Customizer Options" +msgstr "Opties voor Aanpassingen" + +#. Form1..SpTBXMultiDock2..dpHelp..Caption +#: Unit1.dfm:368 +msgid "Help" +msgstr "Help" + +#. Form1..SpTBXMultiDock2..dpHelp..SpTBXLabel1..Caption +#: Unit1.dfm:380 +msgid "Right click the toolbars to start playing" +msgstr "Rechtsklik op de werkbalk om af te spelen" + +#. Form1..SpTBXDock2..tbNavigation..Caption +#. Form1..TntActionList1..aBack..Category +#. Form1..TntActionList1..aForward..Category +#. Form1..TntActionList1..aStop..Category +#. Form1..TntActionList1..aRefresh..Category +#. Form1..TntActionList1..aSearch..Category +#. Form1..TntActionList1..aFavs..Category +#: Unit1.dfm:402 +#: Unit1.dfm:1675 +#: Unit1.dfm:1681 +#: Unit1.dfm:1687 +#: Unit1.dfm:1693 +#: Unit1.dfm:1699 +#: Unit1.dfm:1705 +msgid "Navigation" +msgstr "Navigatie" + +#. Form1..SpTBXDock2..tbNavigation..tBack..CaptionW +#. Form1..TntActionList1..aBack..Caption +#: Unit1.dfm:409 +#: Unit1.dfm:1676 +msgid "Back" +msgstr "Terug" + +#. Form1..SpTBXDock2..tbNavigation..tForward..CaptionW +#. Form1..TntActionList1..aForward..Caption +#: Unit1.dfm:413 +#: Unit1.dfm:1682 +msgid "Forward" +msgstr "Vooruit" + +#. Form1..SpTBXDock2..tbNavigation..tRefresh..CaptionW +#. Form1..TntActionList1..aRefresh..Caption +#: Unit1.dfm:417 +#: Unit1.dfm:1694 +msgid "Refresh" +msgstr "Vernieuwen" + +#. Form1..SpTBXDock2..tbNavigation..tStop..CaptionW +#. Form1..TntActionList1..aStop..Caption +#: Unit1.dfm:421 +#: Unit1.dfm:1688 +msgid "Stop" +msgstr "Stoppen" + +#. Form1..SpTBXDock2..tbNavigation..tSearch..CaptionW +#. Form1..TntActionList1..aSearch..Caption +#: Unit1.dfm:425 +#: Unit1.dfm:1700 +msgid "Search" +msgstr "Zoeken" + +#. Form1..TntActionList1..aNew..Category +#. Form1..TntActionList1..aOpen..Category +#. Form1..TntActionList1..aSave..Category +#. Form1..TntActionList1..aExit..Category +#. Form1..TntActionList1..aPrint..Category +#: Unit1.dfm:1558 +#: Unit1.dfm:1565 +#: Unit1.dfm:1572 +#: Unit1.dfm:1579 +#: Unit1.dfm:1669 +msgid "Files" +msgstr "Bestanden" + +#. Form1..TntActionList1..aCut..Category +#. Form1..TntActionList1..aCopy..Category +#. Form1..TntActionList1..aPaste..Category +#. Form1..TntActionList1..aSelectAll..Category +#. Form1..TntActionList1..aFind..Category +#: Unit1.dfm:1584 +#: Unit1.dfm:1591 +#: Unit1.dfm:1598 +#: Unit1.dfm:1605 +#: Unit1.dfm:1611 +msgid "Edit" +msgstr "Bewerken" + +#. Form1..TntActionList1..aFavs..Caption +#. Form1..SpTBXCustomizer1..cFavs..CaptionW +#: Unit1.dfm:1706 +#: Unit1.dfm:1768 +msgid "Favs" +msgstr "Favs" + +#. Form1..TntActionList1..aCustomize..Category +#. Form1..TntActionList1..aEmbeddedCustomize..Category +#: Unit1.dfm:1711 +#: Unit1.dfm:1716 +msgid "Customization" +msgstr "Aanpassingen" + +#. Form1..TntActionList1..aCustomize..Caption +#. Form1..SpTBXPopupMenu1..pCustomize..CaptionW +#: Unit1.dfm:1712 +#: Unit1.dfm:1731 +msgid "Customize..." +msgstr "Aanpassen..." + +#. Form1..TntActionList1..aEmbeddedCustomize..Caption +#. Form1..SpTBXPopupMenu1..pEmbeddedCustomize..CaptionW +#: Unit1.dfm:1717 +#: Unit1.dfm:1735 +msgid "Embedded Customize..." +msgstr "Geïntegreerd Aanpassen..." + +#. Form2..Caption +#: Unit2.dfm:7 +msgid "Options" +msgstr "Opties" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tProperties..CaptionW +#: Unit2.dfm:49 +msgid "Properties" +msgstr "Eigenschappen" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tPageSetup..CaptionW +#: Unit2.dfm:58 +msgid "Page Setup" +msgstr "Pagina Instellingen" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tHistory..CaptionW +#: Unit2.dfm:67 +msgid "History" +msgstr "Geschiedenis" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tFavorites..CaptionW +#: Unit2.dfm:76 +msgid "Favorites" +msgstr "Favorieten" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tCustomize..CaptionW +#. Form2..LeftPanel..TitlePanel..Caption +#: Unit2.dfm:85 +#: Unit2.dfm:168 +msgid "Customizer" +msgstr "Aanpassen" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton1..Caption +#: Unit2.dfm:122 +msgid "OK" +msgstr "OK" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton2..Caption +#: Unit2.dfm:137 +msgid "Cancel" +msgstr "Annuleren" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton3..Caption +#: Unit2.dfm:152 +msgid "Apply" +msgstr "Toepassen" + +#: Unit1.pas:235 +msgid "Save Layout" +msgstr "Weergave Opslaan" + +#: Unit1.pas:235 +msgid "Save current layout as:" +msgstr "Huidige weergave opslaan als:" + +#: Unit1.pas:248 +msgid "Executed" +msgstr "Uitgevoerd" + diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/pt_BR/LC_MESSAGES/default.mo b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/pt_BR/LC_MESSAGES/default.mo new file mode 100644 index 0000000000000000000000000000000000000000..015377d8e1c4775ef641f3b6900fc33471251ba9 GIT binary patch literal 3365 zcmZvdTZm*w8GuV&*JRvW+$3IBP0Fa9o89S|&1QBx7q_RUCmDBc?sOI}AXfLO>8ah* zr#f{`&(1`Y;Dd@N1Vr2yNkRwG%;w<~oR{uN#a{|Wi2!wd?Kz<0o- z@FsXHj@RIg^zVz~ZFmj+Pe*p)yXaql*TOGCS?{Zn--Keqw<0e=+2^~EpL(83*84s@ z0$+rp|1&6d{vwY52F}ob4IYJW!nZ+LO!N=ITi~@&*1Ii^-wDO8YV6NLvG2jyUx?oy ziTosFY4usiPj#te{qwQ!p?tp>`(J`$_g7$fPAGO>f@0ruQ2cip5)$41KQ*8d{T(RZ zzW~KQUxxL!DD{mv{u2hppFfAP@9!X=)N7ERdY$Us@b6I8Il?Bg?@dtV-2+9h39pA| zB0mFVo`bUPlaXJ8vd&Yn{~gFrJxwM1ehp=0x=VHGXIe;?nV(dQ&B`#lwV)s)};(iH=-t+PM4OD?t4J`9ZXN)|5b>yGzn*9290)TTpKSuuO8kxz%$%#Q1u!uf1Ewmy`8 zt}2@@vE}5=f(=bbraEz5l+HPOQ8kCdbWbgq-UYSb(?l(d($p5YYMHEOQ`NFrVS`Q7 zRkpYMa8I>HdEp1{iPDBEJzJ~Qrk!x0sVCO8@I`s}_MmH%#3p*OR5`i5YkQ-DE!(>| zXvysO;0l{diwbv1oh53?XN6uf13PYQx+kPn`Vm~@(5iIZqYgX6o?0$U>Ut_VQmxpn zLVtoYxUD_4YO|4=dQ`39nY9t-adbU#$@&?!KD1d`$tfr2*)V;pH*GN*stuDDR&4~A z71VxcL*cOZtlbJW-&SW`e|x&=xYxs|3%c00x)?`1r=j!0ghCHfvqvtdO|xUmN{_7{ zw|k=y2#-dI)X*kxs7-4^ZyThxSLkM%s!0OS@I%$vwgc>WEK6)iT_&db^Qcyrlj=De za9y*Jy)-vsMb$b>!{I8>;QB z=Mx;;&?mdDnE6!o5u4dCHYnNc+d|gTv$Z+w&H5waTkTjgXy_TPmhT2jMEj&w@H(+t z?lrf}bEPD$<<2(4<0H4@Cl{Kb1rvfPwZ}PX_Al>0=T-B3Wt5l$Ul(0I^tt2fiv(&q zi{!NZIH|Heyy`oT1DDjKQN6NZk|2v$%IUf6x@6gYfU}HPx$C+vaP>(&OgraOF?!AR zxoBRkl0qi&By4;H_$JQ)8*tgfRY$*aa$W?-w+(X0XQkr!drYtUuNs(c?pm_BKt3psh)Ra|5+U8)zzVDa-YaLz5k51`QsxSm^FD;u0(FllN3BG zL@OTujB0j+1Vifas}f^Nc5k`a0BMZ3lp48OhT-h#VDTY zfF+3wmW))b)M1j&Os@G`2!LCqz3%#gMA2h4uZM;lby<&4YVP778o6oG9rhgq, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Customizer Demo\n" +"POT-Creation-Date: 2005-08-09 16:55\n" +"PO-Revision-Date: 2007-12-27 19:22-0300\n" +"Last-Translator: Mauricio Magnani \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: dxgettext 1.2\n" +"Language-Team: \n" + +#. Form1..SpTBXDock1..tbStandard..Caption +#: Unit1.dfm:29 +msgid "Standard" +msgstr "Padrão" + +#. Form1..SpTBXDock1..tbStandard..tNew..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mNew..CaptionW +#. Form1..TntActionList1..aNew..Caption +#: Unit1.dfm:37 +#: Unit1.dfm:159 +#: Unit1.dfm:1559 +msgid "New" +msgstr "Novo" + +#. Form1..SpTBXDock1..tbStandard..tOpen..CaptionW +#: Unit1.dfm:41 +msgid "Open" +msgstr "Abrir" + +#. Form1..SpTBXDock1..tbStandard..tSave..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mSave..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayoutSave..CaptionW +#. Form1..TntActionList1..aSave..Caption +#: Unit1.dfm:45 +#: Unit1.dfm:167 +#: Unit1.dfm:318 +#: Unit1.dfm:1573 +msgid "Save" +msgstr "Salvar" + +#. Form1..SpTBXDock1..tbStandard..tCut..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCut..CaptionW +#. Form1..TntActionList1..aCut..Caption +#: Unit1.dfm:51 +#: Unit1.dfm:184 +#: Unit1.dfm:1585 +msgid "Cut" +msgstr "Recortar" + +#. Form1..SpTBXDock1..tbStandard..tCopy..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCopy..CaptionW +#. Form1..TntActionList1..aCopy..Caption +#: Unit1.dfm:55 +#: Unit1.dfm:188 +#: Unit1.dfm:1592 +msgid "Copy" +msgstr "Copiar" + +#. Form1..SpTBXDock1..tbStandard..tPaste..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mPaste..CaptionW +#. Form1..TntActionList1..aPaste..Caption +#: Unit1.dfm:60 +#: Unit1.dfm:192 +#: Unit1.dfm:1599 +msgid "Paste" +msgstr "Colar" + +#. Form1..SpTBXDock1..tbStandard..tFind..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mFind..CaptionW +#. Form1..TntActionList1..aFind..Caption +#: Unit1.dfm:67 +#: Unit1.dfm:206 +#: Unit1.dfm:1612 +msgid "Find" +msgstr "Localizar" + +#. Form1..SpTBXDock1..tbStandard..tThemes..CaptionW +#: Unit1.dfm:73 +msgid "Themes" +msgstr "Temas" + +#. Form1..SpTBXDock1..tbFormat..Caption +#. Form1..TntActionList1..aBold..Category +#. Form1..TntActionList1..aItalic..Category +#. Form1..TntActionList1..aUnderline..Category +#. Form1..TntActionList1..aLeftJustify..Category +#. Form1..TntActionList1..aRightJustify..Category +#. Form1..TntActionList1..aCentered..Category +#. Form1..TntActionList1..aBullets..Category +#. Form1..TntActionList1..aNumberedBullets..Category +#: Unit1.dfm:99 +#: Unit1.dfm:1618 +#: Unit1.dfm:1625 +#: Unit1.dfm:1632 +#: Unit1.dfm:1639 +#: Unit1.dfm:1645 +#: Unit1.dfm:1651 +#: Unit1.dfm:1657 +#: Unit1.dfm:1663 +msgid "Format" +msgstr "Formatação" + +#. Form1..SpTBXDock1..tbFormat..tFont..Caption +#: Unit1.dfm:106 +msgid "Font Name" +msgstr "Fonte" + +#. Form1..SpTBXDock1..tbFormat..tFontSize..Caption +#: Unit1.dfm:116 +msgid "Font Size" +msgstr "Tamanho" + +#. Form1..SpTBXDock1..tbFormat..tBold..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBold..CaptionW +#. Form1..TntActionList1..aBold..Caption +#: Unit1.dfm:132 +#: Unit1.dfm:213 +#: Unit1.dfm:1619 +msgid "Bold" +msgstr "Negrito" + +#. Form1..SpTBXDock1..tbFormat..tItalic..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mItalic..CaptionW +#. Form1..TntActionList1..aItalic..Caption +#: Unit1.dfm:136 +#: Unit1.dfm:217 +#: Unit1.dfm:1626 +msgid "Italic" +msgstr "Itálico" + +#. Form1..SpTBXDock1..tbFormat..tUnderline..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mUnderline..CaptionW +#. Form1..TntActionList1..aUnderline..Caption +#: Unit1.dfm:140 +#: Unit1.dfm:221 +#: Unit1.dfm:1633 +msgid "Underline" +msgstr "Sublinhado" + +#. Form1..SpTBXDock1..tbMenuBar..Caption +#: Unit1.dfm:146 +msgid "Menu" +msgstr "Menu" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..CaptionW +#: Unit1.dfm:156 +msgid "&File" +msgstr "&Arquivo" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mOpen..CaptionW +#. Form1..TntActionList1..aOpen..Caption +#: Unit1.dfm:163 +#: Unit1.dfm:1566 +msgid "Open..." +msgstr "Abrir..." + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mPrint..CaptionW +#. Form1..TntActionList1..aPrint..Caption +#. Form1..SpTBXCustomizer1..cPrint..CaptionW +#: Unit1.dfm:171 +#: Unit1.dfm:1670 +#: Unit1.dfm:1744 +msgid "Print" +msgstr "Imprimir" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mExit..CaptionW +#. Form1..TntActionList1..aExit..Caption +#. Form1..SpTBXCustomizer1..cExit..CaptionW +#: Unit1.dfm:177 +#: Unit1.dfm:1580 +#: Unit1.dfm:1776 +msgid "Exit" +msgstr "Sair" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..CaptionW +#: Unit1.dfm:181 +msgid "&Edit" +msgstr "&Editar" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mSelectAll..CaptionW +#. Form1..TntActionList1..aSelectAll..Caption +#. Form1..SpTBXCustomizer1..cSelectAll..CaptionW +#: Unit1.dfm:198 +#: Unit1.dfm:1606 +#: Unit1.dfm:1772 +msgid "Select All" +msgstr "Selecionar Tudo" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..CaptionW +#: Unit1.dfm:210 +msgid "&Format" +msgstr "&Formatar" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mLeftJustify..CaptionW +#. Form1..TntActionList1..aLeftJustify..Caption +#. Form1..SpTBXCustomizer1..cLeftJustify..CaptionW +#: Unit1.dfm:227 +#: Unit1.dfm:1640 +#: Unit1.dfm:1748 +msgid "Left Justify" +msgstr "Alinhar à esquerda" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mCentered..CaptionW +#. Form1..TntActionList1..aCentered..Caption +#. Form1..SpTBXCustomizer1..cCentered..CaptionW +#: Unit1.dfm:231 +#: Unit1.dfm:1652 +#: Unit1.dfm:1752 +msgid "Centered" +msgstr "Centralizar" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mRightJustify..CaptionW +#. Form1..TntActionList1..aRightJustify..Caption +#. Form1..SpTBXCustomizer1..cRightJustify..CaptionW +#: Unit1.dfm:235 +#: Unit1.dfm:1646 +#: Unit1.dfm:1756 +msgid "Right Justify" +msgstr "Alinhar à direita" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBullets..CaptionW +#. Form1..TntActionList1..aBullets..Caption +#. Form1..SpTBXCustomizer1..cBullets..CaptionW +#: Unit1.dfm:241 +#: Unit1.dfm:1658 +#: Unit1.dfm:1760 +msgid "Bullets" +msgstr "Marcadores" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mNumberedBullets..CaptionW +#. Form1..TntActionList1..aNumberedBullets..Caption +#. Form1..SpTBXCustomizer1..cNumBullets..CaptionW +#: Unit1.dfm:245 +#: Unit1.dfm:1664 +#: Unit1.dfm:1764 +msgid "Numbered Bullets" +msgstr "Numeração" + +#. Form1..SpTBXDock1..tbMenuBar..mView..CaptionW +#: Unit1.dfm:249 +msgid "&View" +msgstr "&Exibir" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..CaptionW +#: Unit1.dfm:251 +msgid "&Sidebar" +msgstr "Barra &Lateral" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mCommandsLog..CaptionW +#: Unit1.dfm:254 +msgid "&Commands Log" +msgstr "Registro de &Comandos" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mOptions..CaptionW +#: Unit1.dfm:258 +msgid "&Options" +msgstr "&Opções" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mmHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mmmHelp..CaptionW +#: Unit1.dfm:262 +#: Unit1.dfm:286 +#: Unit1.dfm:288 +msgid "&Help" +msgstr "Aj&uda" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..CaptionW +#: Unit1.dfm:266 +msgid "&Toolbars" +msgstr "&Barras de Ferramentas" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mStandardToolbar..CaptionW +#: Unit1.dfm:269 +msgid "&Standard Toolbar" +msgstr "Barra &Padrão" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..tLayoutsToolbar..CaptionW +#: Unit1.dfm:273 +msgid "&Layouts Toolbar" +msgstr "Barra de &Disposições" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mFormattingToolbar..CaptionW +#: Unit1.dfm:277 +msgid "&Formatting Toolbar" +msgstr "Barra de &Formatação" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mNavigationToolbar..CaptionW +#: Unit1.dfm:281 +msgid "&Navigation Toolbar" +msgstr "Barra de &Navegação" + +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mAbout..CaptionW +#: Unit1.dfm:291 +msgid "&About" +msgstr "&Sobre" + +# Though unusual, Disposição is a good translation in this case. Some editors keep the English term, others may prefer Arranjo, Ãrea de Trabalho or even Leiaute (Houaiss, c1965) +#. Form1..SpTBXDock1..tbLayouts..Caption +#. Form1..SpTBXDock1..tbLayouts..Layouts..SpTBXLabelItem1..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayouts..Caption +#: Unit1.dfm:298 +#: Unit1.dfm:305 +#: Unit1.dfm:308 +msgid "Layouts" +msgstr "Disposições" + +#. Form1..SpTBXMultiDock1..dpLog..Caption +#: Unit1.dfm:332 +msgid "Commands Log" +msgstr "Registro de Comandos" + +#. Form1..SpTBXMultiDock1..dpOptions..Caption +#: Unit1.dfm:352 +msgid "Customizer Options" +msgstr "Opções de Personalização" + +#. Form1..SpTBXMultiDock2..dpHelp..Caption +#: Unit1.dfm:368 +msgid "Help" +msgstr "Ajuda" + +#. Form1..SpTBXMultiDock2..dpHelp..SpTBXLabel1..Caption +#: Unit1.dfm:380 +msgid "Right click the toolbars to start playing" +msgstr "Clique nas barras com o botão direito para inciar animação" + +#. Form1..SpTBXDock2..tbNavigation..Caption +#. Form1..TntActionList1..aBack..Category +#. Form1..TntActionList1..aForward..Category +#. Form1..TntActionList1..aStop..Category +#. Form1..TntActionList1..aRefresh..Category +#. Form1..TntActionList1..aSearch..Category +#. Form1..TntActionList1..aFavs..Category +#: Unit1.dfm:402 +#: Unit1.dfm:1675 +#: Unit1.dfm:1681 +#: Unit1.dfm:1687 +#: Unit1.dfm:1693 +#: Unit1.dfm:1699 +#: Unit1.dfm:1705 +msgid "Navigation" +msgstr "Navegação" + +#. Form1..SpTBXDock2..tbNavigation..tBack..CaptionW +#. Form1..TntActionList1..aBack..Caption +#: Unit1.dfm:409 +#: Unit1.dfm:1676 +msgid "Back" +msgstr "Voltar" + +#. Form1..SpTBXDock2..tbNavigation..tForward..CaptionW +#. Form1..TntActionList1..aForward..Caption +#: Unit1.dfm:413 +#: Unit1.dfm:1682 +msgid "Forward" +msgstr "Avançar" + +#. Form1..SpTBXDock2..tbNavigation..tRefresh..CaptionW +#. Form1..TntActionList1..aRefresh..Caption +#: Unit1.dfm:417 +#: Unit1.dfm:1694 +msgid "Refresh" +msgstr "Atualizar" + +#. Form1..SpTBXDock2..tbNavigation..tStop..CaptionW +#. Form1..TntActionList1..aStop..Caption +#: Unit1.dfm:421 +#: Unit1.dfm:1688 +msgid "Stop" +msgstr "Parar" + +#. Form1..SpTBXDock2..tbNavigation..tSearch..CaptionW +#. Form1..TntActionList1..aSearch..Caption +#: Unit1.dfm:425 +#: Unit1.dfm:1700 +msgid "Search" +msgstr "Pesquisar" + +#. Form1..TntActionList1..aNew..Category +#. Form1..TntActionList1..aOpen..Category +#. Form1..TntActionList1..aSave..Category +#. Form1..TntActionList1..aExit..Category +#. Form1..TntActionList1..aPrint..Category +#: Unit1.dfm:1558 +#: Unit1.dfm:1565 +#: Unit1.dfm:1572 +#: Unit1.dfm:1579 +#: Unit1.dfm:1669 +msgid "Files" +msgstr "Arquivos" + +#. Form1..TntActionList1..aCut..Category +#. Form1..TntActionList1..aCopy..Category +#. Form1..TntActionList1..aPaste..Category +#. Form1..TntActionList1..aSelectAll..Category +#. Form1..TntActionList1..aFind..Category +#: Unit1.dfm:1584 +#: Unit1.dfm:1591 +#: Unit1.dfm:1598 +#: Unit1.dfm:1605 +#: Unit1.dfm:1611 +msgid "Edit" +msgstr "Editar" + +#. Form1..TntActionList1..aFavs..Caption +#. Form1..SpTBXCustomizer1..cFavs..CaptionW +#: Unit1.dfm:1706 +#: Unit1.dfm:1768 +msgid "Favs" +msgstr "Favoritos" + +#. Form1..TntActionList1..aCustomize..Category +#. Form1..TntActionList1..aEmbeddedCustomize..Category +#: Unit1.dfm:1711 +#: Unit1.dfm:1716 +msgid "Customization" +msgstr "Personalização" + +#. Form1..TntActionList1..aCustomize..Caption +#. Form1..SpTBXPopupMenu1..pCustomize..CaptionW +#: Unit1.dfm:1712 +#: Unit1.dfm:1731 +msgid "Customize..." +msgstr "Personalizar..." + +#. Form1..TntActionList1..aEmbeddedCustomize..Caption +#. Form1..SpTBXPopupMenu1..pEmbeddedCustomize..CaptionW +#: Unit1.dfm:1717 +#: Unit1.dfm:1735 +msgid "Embedded Customize..." +msgstr "Personalizar encaixado..." + +#. Form2..Caption +#: Unit2.dfm:7 +msgid "Options" +msgstr "Opções" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tProperties..CaptionW +#: Unit2.dfm:49 +msgid "Properties" +msgstr "Propriedades" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tPageSetup..CaptionW +#: Unit2.dfm:58 +msgid "Page Setup" +msgstr "Configurar página" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tHistory..CaptionW +#: Unit2.dfm:67 +msgid "History" +msgstr "Histórico" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tFavorites..CaptionW +#: Unit2.dfm:76 +msgid "Favorites" +msgstr "Favoritos" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tCustomize..CaptionW +#. Form2..LeftPanel..TitlePanel..Caption +#: Unit2.dfm:85 +#: Unit2.dfm:168 +msgid "Customizer" +msgstr "Personalização" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton1..Caption +#: Unit2.dfm:122 +msgid "OK" +msgstr "OK" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton2..Caption +#: Unit2.dfm:137 +msgid "Cancel" +msgstr "Cancelar" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton3..Caption +#: Unit2.dfm:152 +msgid "Apply" +msgstr "Aplicar" + +#: Unit1.pas:235 +msgid "Save Layout" +msgstr "Salvar disposição" + +#: Unit1.pas:235 +msgid "Save current layout as:" +msgstr "Salvar disposição atual como:" + +#: Unit1.pas:248 +msgid "Executed" +msgstr "Executado" + diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/ru/LC_MESSAGES/default.mo b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/ru/LC_MESSAGES/default.mo new file mode 100644 index 0000000000000000000000000000000000000000..89827b907ce0cee5b36de39fb6a8035b70379806 GIT binary patch literal 3891 zcmZ{kTWnlM8Gxq{+SE;fh5{wDWT3G0!n$kc?$Q=}vuP6&$Bo?z1XMcSo!F<@o6erK z<04S(l%!Qmq7;xq+oS}FK!pd_$tG(jb`TE`UeGxYRH{JSUU)zt!V~HP;``^!dhMjl z?woIC&OiVBw>f`YyXt$2mZRTI-~Jw@JXl=CgZ8iYDRncv25*P|f&A6YEDG1aTi{yw zA-K-1cft=c-{{tJa5eKUI}XD;m>+<*!f!y)chvFQP)zua<0&ZToQC|>k9ml`pTjk< z0Y(0oQ0)A*TmK#GVE$LQ7XAai7m6~GUj;u5Z-t_7y<5Kzid|_p-vY(H&%1e_d;hrO zlMvPFE0Dh$<{|o@b@K|8_v3E1iOW0iez+QEMPE0(4Q_!Sg;{9*fTDL8@>eAuB0mP@{nw$y zXA0hOlTy?0Bh0_cqSVpPpqzIVirian{%3d(^MAq*z%?B5F?ctW`q}Kb3*N>287Ov* z!xTIL#h(jM^0^54tC+`~@DEVpdd=~_Q0nY9ocuVv2a4P_DEs@Nxeie$JBapwEbUY5<&-@j~H{ALh6#st( z#r{7*LaeSqIqw}P=ig3{KLhWAQYVi>(bo%Q-vAW(VR$dBL-FhT5EbeTH^1n370SN1 z;WO~>Q14WfVa65bv%K5*AlApJs%u~I?m3pXB*-EM8 zl?ye!yE39uxq{Ey4!>x4R)UfzGt1B~kLaOFr8w*bD)odZR#j@ZH-U~?d%52m^GCeU zuaw(sd#f_9snnofFn04`$bnu^Xv;Xg2tDnaan)O`7AI7nmp`ETD#e28s~3wVtf{P5 z&YPmjnsR6YQ&1~x&sM4vDqF9Gm6HFQwP9&yIy*btlVI6Ux2($&3+sHYG;9h5Q_w9{ zc608a$=5@U%pD{^JG`+<;D@FrBOZiHp5=ntQ7MPI-z%A9H0VDkBO6CBj?>D9?g<|| zg9)`W^oo97xj?GjW`C%6;e)?_LhUi-x@t#M^%I%?I_BZJZiQs;7uDXXDcgs5+45(= z8!>v&g!QT#@M@t^1A$)-c~+_>2z~6`XZ8oCHmdgdBcts@lUW|44(M>y=rGB6je)L( zUJ&YP(VL(a)Sx$J>_aEkC*yoQ2uP1ch|CxSp%%*f^ zYdW({cWv(3v%{4-p8z{IJfCdO^*Ek32QBBfYgPC+hZ_Ae}4cD+S`! zqqh$GVaJ!!kDIayl5+|NM@%TXbXR9LW|T+jq%A#Uyb?yJRCGp1SK>p_Vswt@OmvxF zLq(_J$#^PSWT_dS(5Yx1fy=yJh|aU;H7h#H>I}2jS)Yq8*^%r(E}mLBLyH_SYc(`E zAQhdp$Ih^pX!!xVCZj7zU7}xz8l06#o@Uo9<8w$H5qsGE8so&=Mm!ZCijOH-VoM{s z6i@3^bdlM4gpSHlxMEG0O^g@diDet2CL5a3g7}QUVF>{<{EueY{u1xbBhG=%sApozG~8GDQzd40rJ1Uz~f4Wh}# zaOv>GU|!DIAc{RJm*l#xT#aAE39J#73-R+z&c%l%lu2l{4UUb2Q`=P0OYt!z8schl z^z!`kwk0kpv$4HV%Z#;TmarrlmP9Q?i&l3uM`SqW6bHO1rdTzLwhV7r(%5XvElK&J zjW7QEl#R{!c?vJ0lGsM5<3l=rp|vhif8ADeQlF&tiipG~CAllBab@`vEC~^LY*G)R zp5b+cn$#0HeZi)QViNOTwFy3+6w1mHCM#4|QYNR9lEc#06|wcB?J=$T;VW!QXdX+B zC25d~TAJDbzx%a7v0Q9-Q&7wHB+SkDh{VyR5E)E#2}by6E8AyTr^I9%Bf@wldQ+0O zT>N^^`FO>36_FBZp`4VA-y~9Y%Y2y9vcQQIlBEPld zgT0G4ENOY)GJ|v4pOhQ7YiHA8u15ol{@+&dU?!S(v0f@ZE(jkRK0QhNG>M&zPf}H= jUHRd$RV~Y0XchgCJ(pXBd_F!JpXA_qoIXq%, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Customizer Demo\n" +"POT-Creation-Date: 2005-08-09 16:55\n" +"PO-Revision-Date: 2006-02-13 21:45-0300\n" +"Last-Translator: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: dxgettext 1.2\n" +"Language-Team: \n" + +#. Form1..SpTBXDock1..tbStandard..Caption +#: Unit1.dfm:29 +msgid "Standard" +msgstr "Стандартное" + +#. Form1..SpTBXDock1..tbStandard..tNew..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mNew..CaptionW +#. Form1..TntActionList1..aNew..Caption +#: Unit1.dfm:37 +#: Unit1.dfm:159 +#: Unit1.dfm:1559 +msgid "New" +msgstr "Ðовый" + +#. Form1..SpTBXDock1..tbStandard..tOpen..CaptionW +#: Unit1.dfm:41 +msgid "Open" +msgstr "Открыть" + +#. Form1..SpTBXDock1..tbStandard..tSave..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mSave..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayoutSave..CaptionW +#. Form1..TntActionList1..aSave..Caption +#: Unit1.dfm:45 +#: Unit1.dfm:167 +#: Unit1.dfm:318 +#: Unit1.dfm:1573 +msgid "Save" +msgstr "Сохранить" + +#. Form1..SpTBXDock1..tbStandard..tCut..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCut..CaptionW +#. Form1..TntActionList1..aCut..Caption +#: Unit1.dfm:51 +#: Unit1.dfm:184 +#: Unit1.dfm:1585 +msgid "Cut" +msgstr "Вырезать" + +#. Form1..SpTBXDock1..tbStandard..tCopy..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCopy..CaptionW +#. Form1..TntActionList1..aCopy..Caption +#: Unit1.dfm:55 +#: Unit1.dfm:188 +#: Unit1.dfm:1592 +msgid "Copy" +msgstr "Копировать" + +#. Form1..SpTBXDock1..tbStandard..tPaste..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mPaste..CaptionW +#. Form1..TntActionList1..aPaste..Caption +#: Unit1.dfm:60 +#: Unit1.dfm:192 +#: Unit1.dfm:1599 +msgid "Paste" +msgstr "Ð’Ñтавить" + +#. Form1..SpTBXDock1..tbStandard..tFind..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mFind..CaptionW +#. Form1..TntActionList1..aFind..Caption +#: Unit1.dfm:67 +#: Unit1.dfm:206 +#: Unit1.dfm:1612 +msgid "Find" +msgstr "ПоиÑк" + +#. Form1..SpTBXDock1..tbStandard..tThemes..CaptionW +#: Unit1.dfm:73 +msgid "Themes" +msgstr "Темы" + +#. Form1..SpTBXDock1..tbFormat..Caption +#. Form1..TntActionList1..aBold..Category +#. Form1..TntActionList1..aItalic..Category +#. Form1..TntActionList1..aUnderline..Category +#. Form1..TntActionList1..aLeftJustify..Category +#. Form1..TntActionList1..aRightJustify..Category +#. Form1..TntActionList1..aCentered..Category +#. Form1..TntActionList1..aBullets..Category +#. Form1..TntActionList1..aNumberedBullets..Category +#: Unit1.dfm:99 +#: Unit1.dfm:1618 +#: Unit1.dfm:1625 +#: Unit1.dfm:1632 +#: Unit1.dfm:1639 +#: Unit1.dfm:1645 +#: Unit1.dfm:1651 +#: Unit1.dfm:1657 +#: Unit1.dfm:1663 +msgid "Format" +msgstr "Формат" + +#. Form1..SpTBXDock1..tbFormat..tFont..Caption +#: Unit1.dfm:106 +msgid "Font Name" +msgstr "Шрифт" + +#. Form1..SpTBXDock1..tbFormat..tFontSize..Caption +#: Unit1.dfm:116 +msgid "Font Size" +msgstr "Размер шрифта" + +#. Form1..SpTBXDock1..tbFormat..tBold..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBold..CaptionW +#. Form1..TntActionList1..aBold..Caption +#: Unit1.dfm:132 +#: Unit1.dfm:213 +#: Unit1.dfm:1619 +msgid "Bold" +msgstr "Полужирный" + +#. Form1..SpTBXDock1..tbFormat..tItalic..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mItalic..CaptionW +#. Form1..TntActionList1..aItalic..Caption +#: Unit1.dfm:136 +#: Unit1.dfm:217 +#: Unit1.dfm:1626 +msgid "Italic" +msgstr "КурÑив" + +#. Form1..SpTBXDock1..tbFormat..tUnderline..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mUnderline..CaptionW +#. Form1..TntActionList1..aUnderline..Caption +#: Unit1.dfm:140 +#: Unit1.dfm:221 +#: Unit1.dfm:1633 +msgid "Underline" +msgstr "Подчёркнутый" + +#. Form1..SpTBXDock1..tbMenuBar..Caption +#: Unit1.dfm:146 +msgid "Menu" +msgstr "Меню" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..CaptionW +#: Unit1.dfm:156 +msgid "&File" +msgstr "&Файл" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mOpen..CaptionW +#. Form1..TntActionList1..aOpen..Caption +#: Unit1.dfm:163 +#: Unit1.dfm:1566 +msgid "Open..." +msgstr "Открыть..." + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mPrint..CaptionW +#. Form1..TntActionList1..aPrint..Caption +#. Form1..SpTBXCustomizer1..cPrint..CaptionW +#: Unit1.dfm:171 +#: Unit1.dfm:1670 +#: Unit1.dfm:1744 +msgid "Print" +msgstr "Печать" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mExit..CaptionW +#. Form1..TntActionList1..aExit..Caption +#. Form1..SpTBXCustomizer1..cExit..CaptionW +#: Unit1.dfm:177 +#: Unit1.dfm:1580 +#: Unit1.dfm:1776 +msgid "Exit" +msgstr "Выйти" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..CaptionW +#: Unit1.dfm:181 +msgid "&Edit" +msgstr "&Правка" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mSelectAll..CaptionW +#. Form1..TntActionList1..aSelectAll..Caption +#. Form1..SpTBXCustomizer1..cSelectAll..CaptionW +#: Unit1.dfm:198 +#: Unit1.dfm:1606 +#: Unit1.dfm:1772 +msgid "Select All" +msgstr "Выделить вÑÑ‘" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..CaptionW +#: Unit1.dfm:210 +msgid "&Format" +msgstr "&Формат" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mLeftJustify..CaptionW +#. Form1..TntActionList1..aLeftJustify..Caption +#. Form1..SpTBXCustomizer1..cLeftJustify..CaptionW +#: Unit1.dfm:227 +#: Unit1.dfm:1640 +#: Unit1.dfm:1748 +msgid "Left Justify" +msgstr "По ширине" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mCentered..CaptionW +#. Form1..TntActionList1..aCentered..Caption +#. Form1..SpTBXCustomizer1..cCentered..CaptionW +#: Unit1.dfm:231 +#: Unit1.dfm:1652 +#: Unit1.dfm:1752 +msgid "Centered" +msgstr "По центру" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mRightJustify..CaptionW +#. Form1..TntActionList1..aRightJustify..Caption +#. Form1..SpTBXCustomizer1..cRightJustify..CaptionW +#: Unit1.dfm:235 +#: Unit1.dfm:1646 +#: Unit1.dfm:1756 +msgid "Right Justify" +msgstr "По ширине" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBullets..CaptionW +#. Form1..TntActionList1..aBullets..Caption +#. Form1..SpTBXCustomizer1..cBullets..CaptionW +#: Unit1.dfm:241 +#: Unit1.dfm:1658 +#: Unit1.dfm:1760 +msgid "Bullets" +msgstr "СпиÑок" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mNumberedBullets..CaptionW +#. Form1..TntActionList1..aNumberedBullets..Caption +#. Form1..SpTBXCustomizer1..cNumBullets..CaptionW +#: Unit1.dfm:245 +#: Unit1.dfm:1664 +#: Unit1.dfm:1764 +msgid "Numbered Bullets" +msgstr "Ðумерованный ÑпиÑок" + +#. Form1..SpTBXDock1..tbMenuBar..mView..CaptionW +#: Unit1.dfm:249 +msgid "&View" +msgstr "&Вид" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..CaptionW +#: Unit1.dfm:251 +msgid "&Sidebar" +msgstr "Панель &задач" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mCommandsLog..CaptionW +#: Unit1.dfm:254 +msgid "&Commands Log" +msgstr "ИÑÑ‚Ð¾Ñ€Ð¸Ñ &команд" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mOptions..CaptionW +#: Unit1.dfm:258 +msgid "&Options" +msgstr "&Параметры" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mmHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mmmHelp..CaptionW +#: Unit1.dfm:262 +#: Unit1.dfm:286 +#: Unit1.dfm:288 +msgid "&Help" +msgstr "&Справка" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..CaptionW +#: Unit1.dfm:266 +msgid "&Toolbars" +msgstr "Панели &инÑтрументов" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mStandardToolbar..CaptionW +#: Unit1.dfm:269 +msgid "&Standard Toolbar" +msgstr "&СтандартнаÑ" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..tLayoutsToolbar..CaptionW +#: Unit1.dfm:273 +msgid "&Layouts Toolbar" +msgstr "&РаÑположение" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mFormattingToolbar..CaptionW +#: Unit1.dfm:277 +msgid "&Formatting Toolbar" +msgstr "&Форматирование" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mNavigationToolbar..CaptionW +#: Unit1.dfm:281 +msgid "&Navigation Toolbar" +msgstr "&ÐавигациÑ" + +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mAbout..CaptionW +#: Unit1.dfm:291 +msgid "&About" +msgstr "&О программе" + +#. Form1..SpTBXDock1..tbLayouts..Caption +#. Form1..SpTBXDock1..tbLayouts..Layouts..SpTBXLabelItem1..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayouts..Caption +#: Unit1.dfm:298 +#: Unit1.dfm:305 +#: Unit1.dfm:308 +msgid "Layouts" +msgstr "РаÑположениÑ" + +#. Form1..SpTBXMultiDock1..dpLog..Caption +#: Unit1.dfm:332 +msgid "Commands Log" +msgstr "ИÑÑ‚Ð¾Ñ€Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´" + +#. Form1..SpTBXMultiDock1..dpOptions..Caption +#: Unit1.dfm:352 +msgid "Customizer Options" +msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð½Ð°Ñтройки" + +#. Form1..SpTBXMultiDock2..dpHelp..Caption +#: Unit1.dfm:368 +msgid "Help" +msgstr "Справка" + +#. Form1..SpTBXMultiDock2..dpHelp..SpTBXLabel1..Caption +#: Unit1.dfm:380 +msgid "Right click the toolbars to start playing" +msgstr "ИÑпользуйте контекÑтное меню панелей инÑтрументов" + +#. Form1..SpTBXDock2..tbNavigation..Caption +#. Form1..TntActionList1..aBack..Category +#. Form1..TntActionList1..aForward..Category +#. Form1..TntActionList1..aStop..Category +#. Form1..TntActionList1..aRefresh..Category +#. Form1..TntActionList1..aSearch..Category +#. Form1..TntActionList1..aFavs..Category +#: Unit1.dfm:402 +#: Unit1.dfm:1675 +#: Unit1.dfm:1681 +#: Unit1.dfm:1687 +#: Unit1.dfm:1693 +#: Unit1.dfm:1699 +#: Unit1.dfm:1705 +msgid "Navigation" +msgstr "ÐавигациÑ" + +#. Form1..SpTBXDock2..tbNavigation..tBack..CaptionW +#. Form1..TntActionList1..aBack..Caption +#: Unit1.dfm:409 +#: Unit1.dfm:1676 +msgid "Back" +msgstr "Ðазад" + +#. Form1..SpTBXDock2..tbNavigation..tForward..CaptionW +#. Form1..TntActionList1..aForward..Caption +#: Unit1.dfm:413 +#: Unit1.dfm:1682 +msgid "Forward" +msgstr "Вперёд" + +#. Form1..SpTBXDock2..tbNavigation..tRefresh..CaptionW +#. Form1..TntActionList1..aRefresh..Caption +#: Unit1.dfm:417 +#: Unit1.dfm:1694 +msgid "Refresh" +msgstr "Обновить" + +#. Form1..SpTBXDock2..tbNavigation..tStop..CaptionW +#. Form1..TntActionList1..aStop..Caption +#: Unit1.dfm:421 +#: Unit1.dfm:1688 +msgid "Stop" +msgstr "Стоп" + +#. Form1..SpTBXDock2..tbNavigation..tSearch..CaptionW +#. Form1..TntActionList1..aSearch..Caption +#: Unit1.dfm:425 +#: Unit1.dfm:1700 +msgid "Search" +msgstr "ПоиÑк" + +#. Form1..TntActionList1..aNew..Category +#. Form1..TntActionList1..aOpen..Category +#. Form1..TntActionList1..aSave..Category +#. Form1..TntActionList1..aExit..Category +#. Form1..TntActionList1..aPrint..Category +#: Unit1.dfm:1558 +#: Unit1.dfm:1565 +#: Unit1.dfm:1572 +#: Unit1.dfm:1579 +#: Unit1.dfm:1669 +msgid "Files" +msgstr " файлы" + +#. Form1..TntActionList1..aCut..Category +#. Form1..TntActionList1..aCopy..Category +#. Form1..TntActionList1..aPaste..Category +#. Form1..TntActionList1..aSelectAll..Category +#. Form1..TntActionList1..aFind..Category +#: Unit1.dfm:1584 +#: Unit1.dfm:1591 +#: Unit1.dfm:1598 +#: Unit1.dfm:1605 +#: Unit1.dfm:1611 +msgid "Edit" +msgstr "Правка" + +#. Form1..TntActionList1..aFavs..Caption +#. Form1..SpTBXCustomizer1..cFavs..CaptionW +#: Unit1.dfm:1706 +#: Unit1.dfm:1768 +msgid "Favs" +msgstr "Избранное" + +#. Form1..TntActionList1..aCustomize..Category +#. Form1..TntActionList1..aEmbeddedCustomize..Category +#: Unit1.dfm:1711 +#: Unit1.dfm:1716 +msgid "Customization" +msgstr "ÐаÑтройка" + +#. Form1..TntActionList1..aCustomize..Caption +#. Form1..SpTBXPopupMenu1..pCustomize..CaptionW +#: Unit1.dfm:1712 +#: Unit1.dfm:1731 +msgid "Customize..." +msgstr "ÐаÑтройка..." + +#. Form1..TntActionList1..aEmbeddedCustomize..Caption +#. Form1..SpTBXPopupMenu1..pEmbeddedCustomize..CaptionW +#: Unit1.dfm:1717 +#: Unit1.dfm:1735 +msgid "Embedded Customize..." +msgstr "Ð’ÑÑ‚Ñ€Ð¾ÐµÐ½Ð½Ð°Ñ Ð½Ð°Ñтройка..." + +#. Form2..Caption +#: Unit2.dfm:7 +msgid "Options" +msgstr "Параметры" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tProperties..CaptionW +#: Unit2.dfm:49 +msgid "Properties" +msgstr "СвойÑтва" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tPageSetup..CaptionW +#: Unit2.dfm:58 +msgid "Page Setup" +msgstr "Параметры Ñтраницы" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tHistory..CaptionW +#: Unit2.dfm:67 +msgid "History" +msgstr "ИÑториÑ" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tFavorites..CaptionW +#: Unit2.dfm:76 +msgid "Favorites" +msgstr "Избранное" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tCustomize..CaptionW +#. Form2..LeftPanel..TitlePanel..Caption +#: Unit2.dfm:85 +#: Unit2.dfm:168 +msgid "Customizer" +msgstr "ÐаÑтройщик" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton1..Caption +#: Unit2.dfm:122 +msgid "OK" +msgstr "OK" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton2..Caption +#: Unit2.dfm:137 +msgid "Cancel" +msgstr "Отмена" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton3..Caption +#: Unit2.dfm:152 +msgid "Apply" +msgstr "Применить" + +#: Unit1.pas:235 +msgid "Save Layout" +msgstr "Сохранить раÑположение" + +#: Unit1.pas:235 +msgid "Save current layout as:" +msgstr "Сохранить текущее раÑположение как..." + +#: Unit1.pas:248 +msgid "Executed" +msgstr "выполнено" + diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/sr_Cyrillic/LC_MESSAGES/default.mo b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/sr_Cyrillic/LC_MESSAGES/default.mo new file mode 100644 index 0000000000000000000000000000000000000000..3098e82d0b72fb37820d025164ea8a5d333d44fa GIT binary patch literal 3917 zcmai!TWlOx8OIM0n%0y;QwlUdJKPp0u#W8}jk|3q@n(|-awB#lP@l%TC-x+JV|MJ= zL6lse=>tTNwyH@;sx;+Ni3iuof{7CcArKW$vmhQ22viHM!?592?;Rq)U7O;E}tzXIM4Z-UZyS32JdWmh&GZ-lb%{&YN?u5U~E zX^3j`Fyu93bkcty9oL}N52fQrpzMAWIzOT8oQ1OQ0#y9I14)TlfRbB;yyizKUx3;d zL)rJ6lrN_9e}cT`Z*+>wzu_8qBhE_SAbbnl2;T+s(D?zScMS5H3Z3Mqpw>SR6`x~p zeQ;Ac|1ez5_yAP?zYKff8MqPt1WNCJ zp!BXJS!>~HsJs-Q*7rf39ibMS5Ok#u|#zMt`#bbJ+R-_N1W{dGG35>%Z2 z0jJ^Z2ubcFo$NRZ*TWw|+5H!&y7?EBUAJD@q69k-ueKIE@#QGAs{J)07kEigm7oAv-rH75VNpAUBpC`b3G2J^JL zXo`bsr2Q25SVto?F2KjLGwPtcT4J@+MWb)dVex;B~3W3|c1Wb(C2#jlnc z-j3S1$rMTfb6bP5rLTn*Un9pTsE&K1wOV=14^8GlTdteT4u1w6jn4Ege<~RFqo7vp z%$B`_-Z? zo4lHlkW3IP7d#9@)OWzRn=*`t;h?<%xxJzEBynrIIaqZB=e_ zVcHfaBaSRg6QHgBR4oi5+t3#s;Zk2MnXR>I#z!PDITvBC~4}^Kjj3hh+Ds% zTW`chlXbJlZ$#GY34>}xU#r_N3b1#t-5=VlkehW7?K_jAxgvZ8#yy#{jfLz%C;DJo6BX>E&x7ibu&6) zE7kZtK+pqzd>|Q$+NWpa?gM;3{#@zaWZ2#T;{XIJfP~yq_Km^tMyyAo(Hf*%%q0z0`p^lu??YCjJP%YL<#4G0w zjRjH9XR_OD)rQGArRi}SNtZX!H;5V4@k!E_9kqT1BTRhGi?6kg#7ptT){#s+7hh=| zH<|c}_-fpY=jj*X%U*n$^(!o1jW5LuCcYriX6qD-^YL8kblhaivwY3Qi|%U)jmWo- znfPh8Eh2m@p7Y`#&}CX*ikH{p1ti-Vo_41!wa&O*na;KaHeS?_a`$h&!41ysUH1&0)@^*VEQ+p!I^ z*}j11O`T$#owyudl0!=dy!zDg6%}5Hl|C;r>=DTH9~<)Ns3%WENJGn+q=Tr6^Q@8Z?<)m zDj*@Qe6FjW*Ba&ZwvJPhlvezG7dT?D##yR>&$o`W9&=G9Fq)XdM>L-!_6tN<@n_|_ zVOpU?isEtENp{UDW1h-VQ75bMDKtagjV7<3icQ5dJ})OGnpD@4k)N%5UI# z6e;>FUBmYin868nqeX(4Xp+&~KdMYO!}-uPl;H9|=Q>f0LWOSVaZYi+lP+QXEa&2- z9QPZkxg-MToej9}oF#PZGIj*vEggot}9%%N>dR7n<36 A, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Customizer Demo\n" +"POT-Creation-Date: 2005-08-09 16:55\n" +"PO-Revision-Date: 2005-08-22 17:41-0300\n" +"Last-Translator: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: dxgettext 1.2\n" +"Language-Team: \n" + +#. Form1..SpTBXDock1..tbStandard..Caption +#: Unit1.dfm:29 +msgid "Standard" +msgstr "Стандардно" + +#. Form1..SpTBXDock1..tbStandard..tNew..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mNew..CaptionW +#. Form1..TntActionList1..aNew..Caption +#: Unit1.dfm:37 +#: Unit1.dfm:159 +#: Unit1.dfm:1559 +msgid "New" +msgstr "Ðово" + +#. Form1..SpTBXDock1..tbStandard..tOpen..CaptionW +#: Unit1.dfm:41 +msgid "Open" +msgstr "Отвори" + +#. Form1..SpTBXDock1..tbStandard..tSave..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mSave..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayoutSave..CaptionW +#. Form1..TntActionList1..aSave..Caption +#: Unit1.dfm:45 +#: Unit1.dfm:167 +#: Unit1.dfm:318 +#: Unit1.dfm:1573 +msgid "Save" +msgstr "Сачувај" + +#. Form1..SpTBXDock1..tbStandard..tCut..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCut..CaptionW +#. Form1..TntActionList1..aCut..Caption +#: Unit1.dfm:51 +#: Unit1.dfm:184 +#: Unit1.dfm:1585 +msgid "Cut" +msgstr "ИÑеци" + +#. Form1..SpTBXDock1..tbStandard..tCopy..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCopy..CaptionW +#. Form1..TntActionList1..aCopy..Caption +#: Unit1.dfm:55 +#: Unit1.dfm:188 +#: Unit1.dfm:1592 +msgid "Copy" +msgstr "Копирај" + +#. Form1..SpTBXDock1..tbStandard..tPaste..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mPaste..CaptionW +#. Form1..TntActionList1..aPaste..Caption +#: Unit1.dfm:60 +#: Unit1.dfm:192 +#: Unit1.dfm:1599 +msgid "Paste" +msgstr "Ðалепи" + +#. Form1..SpTBXDock1..tbStandard..tFind..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mFind..CaptionW +#. Form1..TntActionList1..aFind..Caption +#: Unit1.dfm:67 +#: Unit1.dfm:206 +#: Unit1.dfm:1612 +msgid "Find" +msgstr "Ðађи" + +#. Form1..SpTBXDock1..tbStandard..tThemes..CaptionW +#: Unit1.dfm:73 +msgid "Themes" +msgstr "Тема" + +#. Form1..SpTBXDock1..tbFormat..Caption +#. Form1..TntActionList1..aBold..Category +#. Form1..TntActionList1..aItalic..Category +#. Form1..TntActionList1..aUnderline..Category +#. Form1..TntActionList1..aLeftJustify..Category +#. Form1..TntActionList1..aRightJustify..Category +#. Form1..TntActionList1..aCentered..Category +#. Form1..TntActionList1..aBullets..Category +#. Form1..TntActionList1..aNumberedBullets..Category +#: Unit1.dfm:99 +#: Unit1.dfm:1618 +#: Unit1.dfm:1625 +#: Unit1.dfm:1632 +#: Unit1.dfm:1639 +#: Unit1.dfm:1645 +#: Unit1.dfm:1651 +#: Unit1.dfm:1657 +#: Unit1.dfm:1663 +msgid "Format" +msgstr "Формат" + +#. Form1..SpTBXDock1..tbFormat..tFont..Caption +#: Unit1.dfm:106 +msgid "Font Name" +msgstr "Име фонта" + +#. Form1..SpTBXDock1..tbFormat..tFontSize..Caption +#: Unit1.dfm:116 +msgid "Font Size" +msgstr "Величина фонта" + +#. Form1..SpTBXDock1..tbFormat..tBold..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBold..CaptionW +#. Form1..TntActionList1..aBold..Caption +#: Unit1.dfm:132 +#: Unit1.dfm:213 +#: Unit1.dfm:1619 +msgid "Bold" +msgstr "Подебљано" + +#. Form1..SpTBXDock1..tbFormat..tItalic..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mItalic..CaptionW +#. Form1..TntActionList1..aItalic..Caption +#: Unit1.dfm:136 +#: Unit1.dfm:217 +#: Unit1.dfm:1626 +msgid "Italic" +msgstr "КоÑо" + +#. Form1..SpTBXDock1..tbFormat..tUnderline..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mUnderline..CaptionW +#. Form1..TntActionList1..aUnderline..Caption +#: Unit1.dfm:140 +#: Unit1.dfm:221 +#: Unit1.dfm:1633 +msgid "Underline" +msgstr "Подвучено" + +#. Form1..SpTBXDock1..tbMenuBar..Caption +#: Unit1.dfm:146 +msgid "Menu" +msgstr "Мени" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..CaptionW +#: Unit1.dfm:156 +msgid "&File" +msgstr "&Фајл" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mOpen..CaptionW +#. Form1..TntActionList1..aOpen..Caption +#: Unit1.dfm:163 +#: Unit1.dfm:1566 +msgid "Open..." +msgstr "Отвори..." + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mPrint..CaptionW +#. Form1..TntActionList1..aPrint..Caption +#. Form1..SpTBXCustomizer1..cPrint..CaptionW +#: Unit1.dfm:171 +#: Unit1.dfm:1670 +#: Unit1.dfm:1744 +msgid "Print" +msgstr "Штампај" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mExit..CaptionW +#. Form1..TntActionList1..aExit..Caption +#. Form1..SpTBXCustomizer1..cExit..CaptionW +#: Unit1.dfm:177 +#: Unit1.dfm:1580 +#: Unit1.dfm:1776 +msgid "Exit" +msgstr "Изађи" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..CaptionW +#: Unit1.dfm:181 +msgid "&Edit" +msgstr "Ур&еђивање" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mSelectAll..CaptionW +#. Form1..TntActionList1..aSelectAll..Caption +#. Form1..SpTBXCustomizer1..cSelectAll..CaptionW +#: Unit1.dfm:198 +#: Unit1.dfm:1606 +#: Unit1.dfm:1772 +msgid "Select All" +msgstr "Селектуј Ñве" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..CaptionW +#: Unit1.dfm:210 +msgid "&Format" +msgstr "&Формат" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mLeftJustify..CaptionW +#. Form1..TntActionList1..aLeftJustify..Caption +#. Form1..SpTBXCustomizer1..cLeftJustify..CaptionW +#: Unit1.dfm:227 +#: Unit1.dfm:1640 +#: Unit1.dfm:1748 +msgid "Left Justify" +msgstr "Поравнато лево" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mCentered..CaptionW +#. Form1..TntActionList1..aCentered..Caption +#. Form1..SpTBXCustomizer1..cCentered..CaptionW +#: Unit1.dfm:231 +#: Unit1.dfm:1652 +#: Unit1.dfm:1752 +msgid "Centered" +msgstr "Центрирано" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mRightJustify..CaptionW +#. Form1..TntActionList1..aRightJustify..Caption +#. Form1..SpTBXCustomizer1..cRightJustify..CaptionW +#: Unit1.dfm:235 +#: Unit1.dfm:1646 +#: Unit1.dfm:1756 +msgid "Right Justify" +msgstr "Поравнато деÑно" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBullets..CaptionW +#. Form1..TntActionList1..aBullets..Caption +#. Form1..SpTBXCustomizer1..cBullets..CaptionW +#: Unit1.dfm:241 +#: Unit1.dfm:1658 +#: Unit1.dfm:1760 +msgid "Bullets" +msgstr "Тачке" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mNumberedBullets..CaptionW +#. Form1..TntActionList1..aNumberedBullets..Caption +#. Form1..SpTBXCustomizer1..cNumBullets..CaptionW +#: Unit1.dfm:245 +#: Unit1.dfm:1664 +#: Unit1.dfm:1764 +msgid "Numbered Bullets" +msgstr "Бројеви" + +#. Form1..SpTBXDock1..tbMenuBar..mView..CaptionW +#: Unit1.dfm:249 +msgid "&View" +msgstr "&Изглед" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..CaptionW +#: Unit1.dfm:251 +msgid "&Sidebar" +msgstr "&Помоћни панели" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mCommandsLog..CaptionW +#: Unit1.dfm:254 +msgid "&Commands Log" +msgstr "&Дневник команди" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mOptions..CaptionW +#: Unit1.dfm:258 +msgid "&Options" +msgstr "&Опције" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mmHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mmmHelp..CaptionW +#: Unit1.dfm:262 +#: Unit1.dfm:286 +#: Unit1.dfm:288 +msgid "&Help" +msgstr "&Помоћ" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..CaptionW +#: Unit1.dfm:266 +msgid "&Toolbars" +msgstr "&Палете алата" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mStandardToolbar..CaptionW +#: Unit1.dfm:269 +msgid "&Standard Toolbar" +msgstr "&Стандардна палета" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..tLayoutsToolbar..CaptionW +#: Unit1.dfm:273 +msgid "&Layouts Toolbar" +msgstr "Па&лета изгледа" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mFormattingToolbar..CaptionW +#: Unit1.dfm:277 +msgid "&Formatting Toolbar" +msgstr "Палета за &форматирање" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mNavigationToolbar..CaptionW +#: Unit1.dfm:281 +msgid "&Navigation Toolbar" +msgstr "&Ðавигациона палета" + +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mAbout..CaptionW +#: Unit1.dfm:291 +msgid "&About" +msgstr "О прогр&аму" + +#. Form1..SpTBXDock1..tbLayouts..Caption +#. Form1..SpTBXDock1..tbLayouts..Layouts..SpTBXLabelItem1..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayouts..Caption +#: Unit1.dfm:298 +#: Unit1.dfm:305 +#: Unit1.dfm:308 +msgid "Layouts" +msgstr "Изгледи" + +#. Form1..SpTBXMultiDock1..dpLog..Caption +#: Unit1.dfm:332 +msgid "Commands Log" +msgstr "Дневник команди" + +#. Form1..SpTBXMultiDock1..dpOptions..Caption +#: Unit1.dfm:352 +msgid "Customizer Options" +msgstr "Опције алата за прилагођавање" + +#. Form1..SpTBXMultiDock2..dpHelp..Caption +#: Unit1.dfm:368 +msgid "Help" +msgstr "Помоћ" + +#. Form1..SpTBXMultiDock2..dpHelp..SpTBXLabel1..Caption +#: Unit1.dfm:380 +msgid "Right click the toolbars to start playing" +msgstr "Кликните деÑним таÑтером на палете алата да биÑте почели Ñа игром" + +#. Form1..SpTBXDock2..tbNavigation..Caption +#. Form1..TntActionList1..aBack..Category +#. Form1..TntActionList1..aForward..Category +#. Form1..TntActionList1..aStop..Category +#. Form1..TntActionList1..aRefresh..Category +#. Form1..TntActionList1..aSearch..Category +#. Form1..TntActionList1..aFavs..Category +#: Unit1.dfm:402 +#: Unit1.dfm:1675 +#: Unit1.dfm:1681 +#: Unit1.dfm:1687 +#: Unit1.dfm:1693 +#: Unit1.dfm:1699 +#: Unit1.dfm:1705 +msgid "Navigation" +msgstr "Ðавигација" + +#. Form1..SpTBXDock2..tbNavigation..tBack..CaptionW +#. Form1..TntActionList1..aBack..Caption +#: Unit1.dfm:409 +#: Unit1.dfm:1676 +msgid "Back" +msgstr "Ðазад" + +#. Form1..SpTBXDock2..tbNavigation..tForward..CaptionW +#. Form1..TntActionList1..aForward..Caption +#: Unit1.dfm:413 +#: Unit1.dfm:1682 +msgid "Forward" +msgstr "Ðапред" + +#. Form1..SpTBXDock2..tbNavigation..tRefresh..CaptionW +#. Form1..TntActionList1..aRefresh..Caption +#: Unit1.dfm:417 +#: Unit1.dfm:1694 +msgid "Refresh" +msgstr "ОÑвежи" + +#. Form1..SpTBXDock2..tbNavigation..tStop..CaptionW +#. Form1..TntActionList1..aStop..Caption +#: Unit1.dfm:421 +#: Unit1.dfm:1688 +msgid "Stop" +msgstr "Стани" + +#. Form1..SpTBXDock2..tbNavigation..tSearch..CaptionW +#. Form1..TntActionList1..aSearch..Caption +#: Unit1.dfm:425 +#: Unit1.dfm:1700 +msgid "Search" +msgstr "Тражи" + +#. Form1..TntActionList1..aNew..Category +#. Form1..TntActionList1..aOpen..Category +#. Form1..TntActionList1..aSave..Category +#. Form1..TntActionList1..aExit..Category +#. Form1..TntActionList1..aPrint..Category +#: Unit1.dfm:1558 +#: Unit1.dfm:1565 +#: Unit1.dfm:1572 +#: Unit1.dfm:1579 +#: Unit1.dfm:1669 +msgid "Files" +msgstr "Фајлови" + +#. Form1..TntActionList1..aCut..Category +#. Form1..TntActionList1..aCopy..Category +#. Form1..TntActionList1..aPaste..Category +#. Form1..TntActionList1..aSelectAll..Category +#. Form1..TntActionList1..aFind..Category +#: Unit1.dfm:1584 +#: Unit1.dfm:1591 +#: Unit1.dfm:1598 +#: Unit1.dfm:1605 +#: Unit1.dfm:1611 +msgid "Edit" +msgstr "Уређивање" + +#. Form1..TntActionList1..aFavs..Caption +#. Form1..SpTBXCustomizer1..cFavs..CaptionW +#: Unit1.dfm:1706 +#: Unit1.dfm:1768 +msgid "Favs" +msgstr "Омиљено" + +#. Form1..TntActionList1..aCustomize..Category +#. Form1..TntActionList1..aEmbeddedCustomize..Category +#: Unit1.dfm:1711 +#: Unit1.dfm:1716 +msgid "Customization" +msgstr "Прилагођавање" + +#. Form1..TntActionList1..aCustomize..Caption +#. Form1..SpTBXPopupMenu1..pCustomize..CaptionW +#: Unit1.dfm:1712 +#: Unit1.dfm:1731 +msgid "Customize..." +msgstr "Прилагоди..." + +#. Form1..TntActionList1..aEmbeddedCustomize..Caption +#. Form1..SpTBXPopupMenu1..pEmbeddedCustomize..CaptionW +#: Unit1.dfm:1717 +#: Unit1.dfm:1735 +msgid "Embedded Customize..." +msgstr "Прилагоди (угњеждено)..." + +#. Form2..Caption +#: Unit2.dfm:7 +msgid "Options" +msgstr "Опције" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tProperties..CaptionW +#: Unit2.dfm:49 +msgid "Properties" +msgstr "СвојÑтва" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tPageSetup..CaptionW +#: Unit2.dfm:58 +msgid "Page Setup" +msgstr "Подешавање Ñтране" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tHistory..CaptionW +#: Unit2.dfm:67 +msgid "History" +msgstr "ИÑторија" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tFavorites..CaptionW +#: Unit2.dfm:76 +msgid "Favorites" +msgstr "Омиљено" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tCustomize..CaptionW +#. Form2..LeftPanel..TitlePanel..Caption +#: Unit2.dfm:85 +#: Unit2.dfm:168 +msgid "Customizer" +msgstr "Ðлат за прилагођавање" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton1..Caption +#: Unit2.dfm:122 +msgid "OK" +msgstr "У реду" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton2..Caption +#: Unit2.dfm:137 +msgid "Cancel" +msgstr "Поништи" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton3..Caption +#: Unit2.dfm:152 +msgid "Apply" +msgstr "Примени" + +#: Unit1.pas:235 +msgid "Save Layout" +msgstr "Сачувај изглед" + +#: Unit1.pas:235 +msgid "Save current layout as:" +msgstr "Сачувај тренутни изглед као:" + +#: Unit1.pas:248 +msgid "Executed" +msgstr "Извршено" + diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/sr_Latin/LC_MESSAGES/default.mo b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/sr_Latin/LC_MESSAGES/default.mo new file mode 100644 index 0000000000000000000000000000000000000000..5752d36b9e370d9dcc25dbe461d3af565ad06061 GIT binary patch literal 3320 zcmZvcU5I2y6~~Xd=3|UTSB)`7x8g@To7j_{&2DzLcM~(y)0>PtGd=F~E{aH~?pxDS z-S^(Q+*{qdGm<RK0rm&{aWcqTY?V^i~lK#)r_L{Ppc3H-Ucx-wFN;#3wglkh~4N z89WTW7rZNs&w=lTd_0Ud!CN4IKClD62l4>C6?_7uzNZ3rL7MROz-K}3^Gy(+JdcL@ zUIcFgzXx*tPeI!GvoQV}a0c@0;9>Ah@NFQKas46i{ot)2^&JW0vmouN2KgjN`_2Y= zG0Z<2_*oFD7b$hevlo=`O86m5~ST<1xr6c+W9O<`5Anp5o;A>(04G^FF9S!61Z}2F13!J6CW8gc$li&xy23Yz5Qf~*uCkYy^ zAAy|z63F;`8NBx`B2RT#LJIMSw0&?90 zAoZL9d2TBp?SDMXCxJtd`kw&t$ydbu-4)afk@vGp6G5$PAJuid! z9!7`%vwRelK2yI!eIM!xRN6Nwv*^GjIgZMAgm;+bp)q6$te`%C`e{_YZTFxaET1?a zFjg!dM{S@o2k0lyd{Ua|+>gpUgga$njB24z91Z=`;3?FP1i2b`N8pFRdr?1z`oS>9 zxbaMw@AF~oPViXhp9Sv={ZE3-SH2YwqVkRS6zU_Wyf-Xo#wgE|XK|8pWufDSUMdZj zBsz@>wc>hGX+{=f=WJ}yx;)X8N_w02RNJ|@qjRY|X5vgLD|#C`is|s09@(Du)}_<2 zRz|sy%7%?h`SXUyhB}X?Yl2=Zx@65|S;(?@TNZV9Ad4=JWN{eB#uw7iY1hQkFsV1W ziR6E5Z@6q*8pFc7#O{i4|LVUx&~rVI^Rq>CW=g?CaTJxn^#PC=&@z< z3IcRak6doODcD1UaIsAzIpC%BC|Gxd2n4#Lee@ft<0olLoX-(tm~dp8^#YaS=WU(vYy-2 zqjj0dy@kCO%w}$iExBNOThmR)QWr)Il;1MSk59ZnM-^V@US+Y~MlQ&P9+|RHW9!HL z?l8}BJPM1D8cG*+*)TfqZUM3BdbJS8GD!e*Tqf-;lfa&fX=L))rZm;{v9!7zRWF&m zK=#z9r;)2Alen4nR=e8BO?l4MCGAaJ9jnz&RBNZIwbN?;!TO04SW~@VMwSY0STc_# z^Y!D$@2kz%YBMVcP_>=ww1_oMrLI*W=l45hM^no(*8YT$UI ztz672X73q0(rKU9S@+|~WkycmLTR<5Rb{hGPYYwXYTYGn?f z)_c1HB!Wxr{xxsQ8=uoeCpS8I-es8RQ&+5eZtodA_BY6p<*iu2wsbbTVbR!wu~q+X zez`DR#&H_P>uS~Pu!o54|0pu4JIYO#cSiaCHAv`b#9dm6jr)|ZcX$SFM29)QoEWu< zq|tH-VcXlah}T#SPsW}^r`&!Psf_v~}EGBb3N|7uoHY3MJgX;MV<8ZXB zISelHLSfsB3hIW^@_fDm#*apMkUW6>YvcIgvLoCEs$!E_+5fiJNro_Qj9kC)BQ33B z1m_R#zhnyddOo&;6mO%7AlgKEzCO82)Fc@~5~xV44qic{GPk!2|5c%t?O`PzlD*yG zh?|9u8mHk@_IP849vL^DPy_Aif*VYO_|6Rcu&-d?^_K>QF)6LI@zyZYMni0h(f, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Customizer Demo\n" +"POT-Creation-Date: 2005-08-09 16:55\n" +"PO-Revision-Date: 2005-08-19 11:44+0100\n" +"Last-Translator: Marko Binic \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: dxgettext 1.2\n" +"Language-Team: \n" + +#. Form1..SpTBXDock1..tbStandard..Caption +#: Unit1.dfm:29 +msgid "Standard" +msgstr "Standardno" + +#. Form1..SpTBXDock1..tbStandard..tNew..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mNew..CaptionW +#. Form1..TntActionList1..aNew..Caption +#: Unit1.dfm:37 +#: Unit1.dfm:159 +#: Unit1.dfm:1559 +msgid "New" +msgstr "Novo" + +#. Form1..SpTBXDock1..tbStandard..tOpen..CaptionW +#: Unit1.dfm:41 +msgid "Open" +msgstr "Otvori" + +#. Form1..SpTBXDock1..tbStandard..tSave..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mSave..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayoutSave..CaptionW +#. Form1..TntActionList1..aSave..Caption +#: Unit1.dfm:45 +#: Unit1.dfm:167 +#: Unit1.dfm:318 +#: Unit1.dfm:1573 +msgid "Save" +msgstr "SaÄuvaj" + +#. Form1..SpTBXDock1..tbStandard..tCut..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCut..CaptionW +#. Form1..TntActionList1..aCut..Caption +#: Unit1.dfm:51 +#: Unit1.dfm:184 +#: Unit1.dfm:1585 +msgid "Cut" +msgstr "Iseci" + +#. Form1..SpTBXDock1..tbStandard..tCopy..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCopy..CaptionW +#. Form1..TntActionList1..aCopy..Caption +#: Unit1.dfm:55 +#: Unit1.dfm:188 +#: Unit1.dfm:1592 +msgid "Copy" +msgstr "Kopiraj" + +#. Form1..SpTBXDock1..tbStandard..tPaste..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mPaste..CaptionW +#. Form1..TntActionList1..aPaste..Caption +#: Unit1.dfm:60 +#: Unit1.dfm:192 +#: Unit1.dfm:1599 +msgid "Paste" +msgstr "Nalepi" + +#. Form1..SpTBXDock1..tbStandard..tFind..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mFind..CaptionW +#. Form1..TntActionList1..aFind..Caption +#: Unit1.dfm:67 +#: Unit1.dfm:206 +#: Unit1.dfm:1612 +msgid "Find" +msgstr "NaÄ‘i" + +#. Form1..SpTBXDock1..tbStandard..tThemes..CaptionW +#: Unit1.dfm:73 +msgid "Themes" +msgstr "Teme" + +#. Form1..SpTBXDock1..tbFormat..Caption +#. Form1..TntActionList1..aBold..Category +#. Form1..TntActionList1..aItalic..Category +#. Form1..TntActionList1..aUnderline..Category +#. Form1..TntActionList1..aLeftJustify..Category +#. Form1..TntActionList1..aRightJustify..Category +#. Form1..TntActionList1..aCentered..Category +#. Form1..TntActionList1..aBullets..Category +#. Form1..TntActionList1..aNumberedBullets..Category +#: Unit1.dfm:99 +#: Unit1.dfm:1618 +#: Unit1.dfm:1625 +#: Unit1.dfm:1632 +#: Unit1.dfm:1639 +#: Unit1.dfm:1645 +#: Unit1.dfm:1651 +#: Unit1.dfm:1657 +#: Unit1.dfm:1663 +msgid "Format" +msgstr "Format" + +#. Form1..SpTBXDock1..tbFormat..tFont..Caption +#: Unit1.dfm:106 +msgid "Font Name" +msgstr "Ime fonta" + +#. Form1..SpTBXDock1..tbFormat..tFontSize..Caption +#: Unit1.dfm:116 +msgid "Font Size" +msgstr "VeliÄina fonta" + +#. Form1..SpTBXDock1..tbFormat..tBold..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBold..CaptionW +#. Form1..TntActionList1..aBold..Caption +#: Unit1.dfm:132 +#: Unit1.dfm:213 +#: Unit1.dfm:1619 +msgid "Bold" +msgstr "Podebljano" + +#. Form1..SpTBXDock1..tbFormat..tItalic..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mItalic..CaptionW +#. Form1..TntActionList1..aItalic..Caption +#: Unit1.dfm:136 +#: Unit1.dfm:217 +#: Unit1.dfm:1626 +msgid "Italic" +msgstr "Koso" + +#. Form1..SpTBXDock1..tbFormat..tUnderline..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mUnderline..CaptionW +#. Form1..TntActionList1..aUnderline..Caption +#: Unit1.dfm:140 +#: Unit1.dfm:221 +#: Unit1.dfm:1633 +msgid "Underline" +msgstr "PodvuÄeno" + +#. Form1..SpTBXDock1..tbMenuBar..Caption +#: Unit1.dfm:146 +msgid "Menu" +msgstr "Meni" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..CaptionW +#: Unit1.dfm:156 +msgid "&File" +msgstr "&Fajl" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mOpen..CaptionW +#. Form1..TntActionList1..aOpen..Caption +#: Unit1.dfm:163 +#: Unit1.dfm:1566 +msgid "Open..." +msgstr "Otvori..." + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mPrint..CaptionW +#. Form1..TntActionList1..aPrint..Caption +#. Form1..SpTBXCustomizer1..cPrint..CaptionW +#: Unit1.dfm:171 +#: Unit1.dfm:1670 +#: Unit1.dfm:1744 +msgid "Print" +msgstr "Å tampaj" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mExit..CaptionW +#. Form1..TntActionList1..aExit..Caption +#. Form1..SpTBXCustomizer1..cExit..CaptionW +#: Unit1.dfm:177 +#: Unit1.dfm:1580 +#: Unit1.dfm:1776 +msgid "Exit" +msgstr "IzaÄ‘i" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..CaptionW +#: Unit1.dfm:181 +msgid "&Edit" +msgstr "Ur&eÄ‘ivanje" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mSelectAll..CaptionW +#. Form1..TntActionList1..aSelectAll..Caption +#. Form1..SpTBXCustomizer1..cSelectAll..CaptionW +#: Unit1.dfm:198 +#: Unit1.dfm:1606 +#: Unit1.dfm:1772 +msgid "Select All" +msgstr "Selektuj sve" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..CaptionW +#: Unit1.dfm:210 +msgid "&Format" +msgstr "&Format" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mLeftJustify..CaptionW +#. Form1..TntActionList1..aLeftJustify..Caption +#. Form1..SpTBXCustomizer1..cLeftJustify..CaptionW +#: Unit1.dfm:227 +#: Unit1.dfm:1640 +#: Unit1.dfm:1748 +msgid "Left Justify" +msgstr "Poravnato levo" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mCentered..CaptionW +#. Form1..TntActionList1..aCentered..Caption +#. Form1..SpTBXCustomizer1..cCentered..CaptionW +#: Unit1.dfm:231 +#: Unit1.dfm:1652 +#: Unit1.dfm:1752 +msgid "Centered" +msgstr "Centrirano" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mRightJustify..CaptionW +#. Form1..TntActionList1..aRightJustify..Caption +#. Form1..SpTBXCustomizer1..cRightJustify..CaptionW +#: Unit1.dfm:235 +#: Unit1.dfm:1646 +#: Unit1.dfm:1756 +msgid "Right Justify" +msgstr "Poravnato Desno" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBullets..CaptionW +#. Form1..TntActionList1..aBullets..Caption +#. Form1..SpTBXCustomizer1..cBullets..CaptionW +#: Unit1.dfm:241 +#: Unit1.dfm:1658 +#: Unit1.dfm:1760 +msgid "Bullets" +msgstr "TaÄke" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mNumberedBullets..CaptionW +#. Form1..TntActionList1..aNumberedBullets..Caption +#. Form1..SpTBXCustomizer1..cNumBullets..CaptionW +#: Unit1.dfm:245 +#: Unit1.dfm:1664 +#: Unit1.dfm:1764 +msgid "Numbered Bullets" +msgstr "Brojevi" + +#. Form1..SpTBXDock1..tbMenuBar..mView..CaptionW +#: Unit1.dfm:249 +msgid "&View" +msgstr "&Izgled" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..CaptionW +#: Unit1.dfm:251 +msgid "&Sidebar" +msgstr "&Pomoćni paneli" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mCommandsLog..CaptionW +#: Unit1.dfm:254 +msgid "&Commands Log" +msgstr "&Dnevnik komandi" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mOptions..CaptionW +#: Unit1.dfm:258 +msgid "&Options" +msgstr "&Opcije" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mmHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mmmHelp..CaptionW +#: Unit1.dfm:262 +#: Unit1.dfm:286 +#: Unit1.dfm:288 +msgid "&Help" +msgstr "&Pomoć" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..CaptionW +#: Unit1.dfm:266 +msgid "&Toolbars" +msgstr "&Palete alata" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mStandardToolbar..CaptionW +#: Unit1.dfm:269 +msgid "&Standard Toolbar" +msgstr "&Standardna paleta" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..tLayoutsToolbar..CaptionW +#: Unit1.dfm:273 +msgid "&Layouts Toolbar" +msgstr "Pa&leta izgleda" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mFormattingToolbar..CaptionW +#: Unit1.dfm:277 +msgid "&Formatting Toolbar" +msgstr "Paleta za &formatiranje" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mNavigationToolbar..CaptionW +#: Unit1.dfm:281 +msgid "&Navigation Toolbar" +msgstr "&Navigaciona paleta" + +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mAbout..CaptionW +#: Unit1.dfm:291 +msgid "&About" +msgstr "O progr&amu" + +#. Form1..SpTBXDock1..tbLayouts..Caption +#. Form1..SpTBXDock1..tbLayouts..Layouts..SpTBXLabelItem1..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayouts..Caption +#: Unit1.dfm:298 +#: Unit1.dfm:305 +#: Unit1.dfm:308 +msgid "Layouts" +msgstr "Izgledi" + +#. Form1..SpTBXMultiDock1..dpLog..Caption +#: Unit1.dfm:332 +msgid "Commands Log" +msgstr "Dnevnik komandi" + +#. Form1..SpTBXMultiDock1..dpOptions..Caption +#: Unit1.dfm:352 +msgid "Customizer Options" +msgstr "Opcije alata za prilagoÄ‘avanje" + +#. Form1..SpTBXMultiDock2..dpHelp..Caption +#: Unit1.dfm:368 +msgid "Help" +msgstr "Pomoć" + +#. Form1..SpTBXMultiDock2..dpHelp..SpTBXLabel1..Caption +#: Unit1.dfm:380 +msgid "Right click the toolbars to start playing" +msgstr "Kliknite desnim tasterom na palete alata da biste poÄeli sa igrom" + +#. Form1..SpTBXDock2..tbNavigation..Caption +#. Form1..TntActionList1..aBack..Category +#. Form1..TntActionList1..aForward..Category +#. Form1..TntActionList1..aStop..Category +#. Form1..TntActionList1..aRefresh..Category +#. Form1..TntActionList1..aSearch..Category +#. Form1..TntActionList1..aFavs..Category +#: Unit1.dfm:402 +#: Unit1.dfm:1675 +#: Unit1.dfm:1681 +#: Unit1.dfm:1687 +#: Unit1.dfm:1693 +#: Unit1.dfm:1699 +#: Unit1.dfm:1705 +msgid "Navigation" +msgstr "Navigacija" + +#. Form1..SpTBXDock2..tbNavigation..tBack..CaptionW +#. Form1..TntActionList1..aBack..Caption +#: Unit1.dfm:409 +#: Unit1.dfm:1676 +msgid "Back" +msgstr "Nazad" + +#. Form1..SpTBXDock2..tbNavigation..tForward..CaptionW +#. Form1..TntActionList1..aForward..Caption +#: Unit1.dfm:413 +#: Unit1.dfm:1682 +msgid "Forward" +msgstr "Napred" + +#. Form1..SpTBXDock2..tbNavigation..tRefresh..CaptionW +#. Form1..TntActionList1..aRefresh..Caption +#: Unit1.dfm:417 +#: Unit1.dfm:1694 +msgid "Refresh" +msgstr "Osveži" + +#. Form1..SpTBXDock2..tbNavigation..tStop..CaptionW +#. Form1..TntActionList1..aStop..Caption +#: Unit1.dfm:421 +#: Unit1.dfm:1688 +msgid "Stop" +msgstr "Stani" + +#. Form1..SpTBXDock2..tbNavigation..tSearch..CaptionW +#. Form1..TntActionList1..aSearch..Caption +#: Unit1.dfm:425 +#: Unit1.dfm:1700 +msgid "Search" +msgstr "Traži" + +#. Form1..TntActionList1..aNew..Category +#. Form1..TntActionList1..aOpen..Category +#. Form1..TntActionList1..aSave..Category +#. Form1..TntActionList1..aExit..Category +#. Form1..TntActionList1..aPrint..Category +#: Unit1.dfm:1558 +#: Unit1.dfm:1565 +#: Unit1.dfm:1572 +#: Unit1.dfm:1579 +#: Unit1.dfm:1669 +msgid "Files" +msgstr "Fajlovi" + +#. Form1..TntActionList1..aCut..Category +#. Form1..TntActionList1..aCopy..Category +#. Form1..TntActionList1..aPaste..Category +#. Form1..TntActionList1..aSelectAll..Category +#. Form1..TntActionList1..aFind..Category +#: Unit1.dfm:1584 +#: Unit1.dfm:1591 +#: Unit1.dfm:1598 +#: Unit1.dfm:1605 +#: Unit1.dfm:1611 +msgid "Edit" +msgstr "UreÄ‘ivanje" + +#. Form1..TntActionList1..aFavs..Caption +#. Form1..SpTBXCustomizer1..cFavs..CaptionW +#: Unit1.dfm:1706 +#: Unit1.dfm:1768 +msgid "Favs" +msgstr "Omiljeno" + +#. Form1..TntActionList1..aCustomize..Category +#. Form1..TntActionList1..aEmbeddedCustomize..Category +#: Unit1.dfm:1711 +#: Unit1.dfm:1716 +msgid "Customization" +msgstr "PrilagoÄ‘avanje" + +#. Form1..TntActionList1..aCustomize..Caption +#. Form1..SpTBXPopupMenu1..pCustomize..CaptionW +#: Unit1.dfm:1712 +#: Unit1.dfm:1731 +msgid "Customize..." +msgstr "Prilagodi..." + +#. Form1..TntActionList1..aEmbeddedCustomize..Caption +#. Form1..SpTBXPopupMenu1..pEmbeddedCustomize..CaptionW +#: Unit1.dfm:1717 +#: Unit1.dfm:1735 +msgid "Embedded Customize..." +msgstr "Prilagodi (ugnježdeno)..." + +#. Form2..Caption +#: Unit2.dfm:7 +msgid "Options" +msgstr "Opcije" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tProperties..CaptionW +#: Unit2.dfm:49 +msgid "Properties" +msgstr "Svojstva" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tPageSetup..CaptionW +#: Unit2.dfm:58 +msgid "Page Setup" +msgstr "PodeÅ¡avanje strane" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tHistory..CaptionW +#: Unit2.dfm:67 +msgid "History" +msgstr "Istorija" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tFavorites..CaptionW +#: Unit2.dfm:76 +msgid "Favorites" +msgstr "Omiljeno" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tCustomize..CaptionW +#. Form2..LeftPanel..TitlePanel..Caption +#: Unit2.dfm:85 +#: Unit2.dfm:168 +msgid "Customizer" +msgstr "Alat za prilagoÄ‘avanje" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton1..Caption +#: Unit2.dfm:122 +msgid "OK" +msgstr "U redu" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton2..Caption +#: Unit2.dfm:137 +msgid "Cancel" +msgstr "PoniÅ¡ti" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton3..Caption +#: Unit2.dfm:152 +msgid "Apply" +msgstr "Primeni" + +#: Unit1.pas:235 +msgid "Save Layout" +msgstr "SaÄuvaj izgled" + +#: Unit1.pas:235 +msgid "Save current layout as:" +msgstr "SaÄuvaj trenutni izgled kao:" + +#: Unit1.pas:248 +msgid "Executed" +msgstr "IzvrÅ¡eno" + diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/sv/LC_MESSAGES/default.mo b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/sv/LC_MESSAGES/default.mo new file mode 100644 index 0000000000000000000000000000000000000000..9f1a3ab1908e746407fc6c105baa4be41f082c75 GIT binary patch literal 3241 zcmZXVU5r~t6@aG@Lc5d{0u*S04u7UUc^tkd@%6n| zbH~m)5g_qEC4Qt<2&h1nkZ8mMNR?VO0wECK2jB&P5E2qU5`W@_{}&KXeCK)`Z((%L zd~?Qg&zw1P&h>AOANic3wUDjj?Bk&FI7AW@a3iEeE@v9p2lTiG7DCn!<_s0T1 z2r;cb40%+CPV8R_dIsh9%R&Dr6u&(_(63(I&z*{>7ye$XAfjrprk z?0pL2f_gIOUxE^!FGIvx9 zJ+J-hs%O z#EwQ@kE|dPzgfGRf!IBPNZ!cZNPBn+bp}?D_aW~`!ktXqy7|M5Q36b_D zWVsyi?Sc1&@q3`utK_`glidA#kw+29b7>DwQRa`_)k)DSjZQZ7s?y8`1CvID-pqQc z(u!i{*5bs{XKr9bE9v93r`uVUbc|D#vo^_9Wz&qYQOu{$nNi#`KF-ql+;%Q{p(?v^ zWXqR#JsTPq&DR9GEV>xm%c_y*$ylwLZeOitNu*YXNn(AWnkMbqL^W;dt+SDOiSNxU zAFJlD@Yx`~Qu=U1vx|$1bHyDR>X~;(Gf1`(@3plsn_Ssz)nZI@f8`BaRiq+v?@b)HpWjkR_op*aaV;vs!hA+^#?dZ zyf;=`HXW*YMAbPWb8d)x99_>svb~|UbDNf(oN{)a^QLF@uJyxQoi~NI>b#3nPoL%1 z`51q9?4Gm5zS@a<`}0kwS{JAK+V5NKr#D_O(1kb7>pU@IazX8yku5tt^?o|;4xQtA zG>b?LZHl_uwZ?V#L1MdJH&ft(~gYPV1!y>MJX(sqWZOEC%LF`29q6>7-s- zsV~>=t1Z=P3!4O}+IA)_62q<3^_KBIHid48OGQC8KSU+S)T3PvXNE35SnOtlM;5l$ zw_0;2mlkUaO)`Kr)%G~YCvOk@{X{HIAJpA_;|l8^zR+H)o|>&K&6B~NG4+!Te;1i0_Vy<%_jY(lM{y##Mmc9@*!;A~kVp#W2Yk5S4xHz{RV znO$pm?SD*Pj0>Y=uJG)UsCJz2E$JJzX35K8+V=^b8`T(f+}M{z?!?vqJJ&{*$MQp? zJVGkDI2{@(fG|{tT--?FJl7QXjexADopG-halsM=F(I!~9!VHlJ)G_v zJ_PDQo<|f9yPlm~Cs$@ZOtrpz28_-p*EDgN=ZQ`A-sHN|)P(L!+UdAAxhCI)++eEg wZ+sPGN~gmSpqyqOh9VpAWso3l8P~@FZ4wf2mO`^EXj}fArk@6mLAcd_0RZ~CApigX literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/sv/LC_MESSAGES/default.po b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/sv/LC_MESSAGES/default.po new file mode 100644 index 0000000..cc2e970 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/sv/LC_MESSAGES/default.po @@ -0,0 +1,498 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Customizer Demo\n" +"POT-Creation-Date: 2005-08-09 16:55\n" +"PO-Revision-Date: 2008-04-17 15:20+0100\n" +"Last-Translator: Mattias Andersson \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: dxgettext 1.2\n" +"Language-Team: \n" + +#. Form1..SpTBXDock1..tbStandard..Caption +#: Unit1.dfm:29 +msgid "Standard" +msgstr "Standard" + +#. Form1..SpTBXDock1..tbStandard..tNew..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mNew..CaptionW +#. Form1..TntActionList1..aNew..Caption +#: Unit1.dfm:37 +#: Unit1.dfm:159 +#: Unit1.dfm:1559 +msgid "New" +msgstr "Nytt" + +#. Form1..SpTBXDock1..tbStandard..tOpen..CaptionW +#: Unit1.dfm:41 +msgid "Open" +msgstr "Öppna" + +#. Form1..SpTBXDock1..tbStandard..tSave..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mSave..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayoutSave..CaptionW +#. Form1..TntActionList1..aSave..Caption +#: Unit1.dfm:45 +#: Unit1.dfm:167 +#: Unit1.dfm:318 +#: Unit1.dfm:1573 +msgid "Save" +msgstr "Spara" + +#. Form1..SpTBXDock1..tbStandard..tCut..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCut..CaptionW +#. Form1..TntActionList1..aCut..Caption +#: Unit1.dfm:51 +#: Unit1.dfm:184 +#: Unit1.dfm:1585 +msgid "Cut" +msgstr "Klipp ut" + +#. Form1..SpTBXDock1..tbStandard..tCopy..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCopy..CaptionW +#. Form1..TntActionList1..aCopy..Caption +#: Unit1.dfm:55 +#: Unit1.dfm:188 +#: Unit1.dfm:1592 +msgid "Copy" +msgstr "Kopiera" + +#. Form1..SpTBXDock1..tbStandard..tPaste..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mPaste..CaptionW +#. Form1..TntActionList1..aPaste..Caption +#: Unit1.dfm:60 +#: Unit1.dfm:192 +#: Unit1.dfm:1599 +msgid "Paste" +msgstr "Klistra in" + +#. Form1..SpTBXDock1..tbStandard..tFind..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mFind..CaptionW +#. Form1..TntActionList1..aFind..Caption +#: Unit1.dfm:67 +#: Unit1.dfm:206 +#: Unit1.dfm:1612 +msgid "Find" +msgstr "Sök" + +#. Form1..SpTBXDock1..tbStandard..tThemes..CaptionW +#: Unit1.dfm:73 +msgid "Themes" +msgstr "Teman" + +#. Form1..SpTBXDock1..tbFormat..Caption +#. Form1..TntActionList1..aBold..Category +#. Form1..TntActionList1..aItalic..Category +#. Form1..TntActionList1..aUnderline..Category +#. Form1..TntActionList1..aLeftJustify..Category +#. Form1..TntActionList1..aRightJustify..Category +#. Form1..TntActionList1..aCentered..Category +#. Form1..TntActionList1..aBullets..Category +#. Form1..TntActionList1..aNumberedBullets..Category +#: Unit1.dfm:99 +#: Unit1.dfm:1618 +#: Unit1.dfm:1625 +#: Unit1.dfm:1632 +#: Unit1.dfm:1639 +#: Unit1.dfm:1645 +#: Unit1.dfm:1651 +#: Unit1.dfm:1657 +#: Unit1.dfm:1663 +msgid "Format" +msgstr "Formatera" + +#. Form1..SpTBXDock1..tbFormat..tFont..Caption +#: Unit1.dfm:106 +msgid "Font Name" +msgstr "Teckensnitt" + +#. Form1..SpTBXDock1..tbFormat..tFontSize..Caption +#: Unit1.dfm:116 +msgid "Font Size" +msgstr "Storlek" + +#. Form1..SpTBXDock1..tbFormat..tBold..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBold..CaptionW +#. Form1..TntActionList1..aBold..Caption +#: Unit1.dfm:132 +#: Unit1.dfm:213 +#: Unit1.dfm:1619 +msgid "Bold" +msgstr "Fet" + +#. Form1..SpTBXDock1..tbFormat..tItalic..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mItalic..CaptionW +#. Form1..TntActionList1..aItalic..Caption +#: Unit1.dfm:136 +#: Unit1.dfm:217 +#: Unit1.dfm:1626 +msgid "Italic" +msgstr "Kursiv" + +#. Form1..SpTBXDock1..tbFormat..tUnderline..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mUnderline..CaptionW +#. Form1..TntActionList1..aUnderline..Caption +#: Unit1.dfm:140 +#: Unit1.dfm:221 +#: Unit1.dfm:1633 +msgid "Underline" +msgstr "Understreck" + +#. Form1..SpTBXDock1..tbMenuBar..Caption +#: Unit1.dfm:146 +msgid "Menu" +msgstr "Meny" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..CaptionW +#: Unit1.dfm:156 +msgid "&File" +msgstr "&Arkiv" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mOpen..CaptionW +#. Form1..TntActionList1..aOpen..Caption +#: Unit1.dfm:163 +#: Unit1.dfm:1566 +msgid "Open..." +msgstr "Öppna..." + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mPrint..CaptionW +#. Form1..TntActionList1..aPrint..Caption +#. Form1..SpTBXCustomizer1..cPrint..CaptionW +#: Unit1.dfm:171 +#: Unit1.dfm:1670 +#: Unit1.dfm:1744 +msgid "Print" +msgstr "Skriv ut" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mExit..CaptionW +#. Form1..TntActionList1..aExit..Caption +#. Form1..SpTBXCustomizer1..cExit..CaptionW +#: Unit1.dfm:177 +#: Unit1.dfm:1580 +#: Unit1.dfm:1776 +msgid "Exit" +msgstr "Avsluta" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..CaptionW +#: Unit1.dfm:181 +msgid "&Edit" +msgstr "&Redigera" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mSelectAll..CaptionW +#. Form1..TntActionList1..aSelectAll..Caption +#. Form1..SpTBXCustomizer1..cSelectAll..CaptionW +#: Unit1.dfm:198 +#: Unit1.dfm:1606 +#: Unit1.dfm:1772 +msgid "Select All" +msgstr "Markera allt" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..CaptionW +#: Unit1.dfm:210 +msgid "&Format" +msgstr "&Formatera" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mLeftJustify..CaptionW +#. Form1..TntActionList1..aLeftJustify..Caption +#. Form1..SpTBXCustomizer1..cLeftJustify..CaptionW +#: Unit1.dfm:227 +#: Unit1.dfm:1640 +#: Unit1.dfm:1748 +msgid "Left Justify" +msgstr "Vänsterjustera" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mCentered..CaptionW +#. Form1..TntActionList1..aCentered..Caption +#. Form1..SpTBXCustomizer1..cCentered..CaptionW +#: Unit1.dfm:231 +#: Unit1.dfm:1652 +#: Unit1.dfm:1752 +msgid "Centered" +msgstr "Centrera" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mRightJustify..CaptionW +#. Form1..TntActionList1..aRightJustify..Caption +#. Form1..SpTBXCustomizer1..cRightJustify..CaptionW +#: Unit1.dfm:235 +#: Unit1.dfm:1646 +#: Unit1.dfm:1756 +msgid "Right Justify" +msgstr "Högerjustera" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBullets..CaptionW +#. Form1..TntActionList1..aBullets..Caption +#. Form1..SpTBXCustomizer1..cBullets..CaptionW +#: Unit1.dfm:241 +#: Unit1.dfm:1658 +#: Unit1.dfm:1760 +msgid "Bullets" +msgstr "Punktlista" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mNumberedBullets..CaptionW +#. Form1..TntActionList1..aNumberedBullets..Caption +#. Form1..SpTBXCustomizer1..cNumBullets..CaptionW +#: Unit1.dfm:245 +#: Unit1.dfm:1664 +#: Unit1.dfm:1764 +msgid "Numbered Bullets" +msgstr "Numrerad lista" + +#. Form1..SpTBXDock1..tbMenuBar..mView..CaptionW +#: Unit1.dfm:249 +msgid "&View" +msgstr "&Visa" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..CaptionW +#: Unit1.dfm:251 +msgid "&Sidebar" +msgstr "&Sidpanel" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mCommandsLog..CaptionW +#: Unit1.dfm:254 +msgid "&Commands Log" +msgstr "&Kommandohistorik" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mOptions..CaptionW +#: Unit1.dfm:258 +msgid "&Options" +msgstr "&Alternativ" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mmHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mmmHelp..CaptionW +#: Unit1.dfm:262 +#: Unit1.dfm:286 +#: Unit1.dfm:288 +msgid "&Help" +msgstr "&Hjälp" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..CaptionW +#: Unit1.dfm:266 +msgid "&Toolbars" +msgstr "&Verktygsfält" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mStandardToolbar..CaptionW +#: Unit1.dfm:269 +msgid "&Standard Toolbar" +msgstr "&Standardfält" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..tLayoutsToolbar..CaptionW +#: Unit1.dfm:273 +msgid "&Layouts Toolbar" +msgstr "&Layoutfält" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mFormattingToolbar..CaptionW +#: Unit1.dfm:277 +msgid "&Formatting Toolbar" +msgstr "&Anpassa Verktygsfält" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mNavigationToolbar..CaptionW +#: Unit1.dfm:281 +msgid "&Navigation Toolbar" +msgstr "&Navigationsfält" + +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mAbout..CaptionW +#: Unit1.dfm:291 +msgid "&About" +msgstr "&Om" + +#. Form1..SpTBXDock1..tbLayouts..Caption +#. Form1..SpTBXDock1..tbLayouts..Layouts..SpTBXLabelItem1..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayouts..Caption +#: Unit1.dfm:298 +#: Unit1.dfm:305 +#: Unit1.dfm:308 +msgid "Layouts" +msgstr "Layouter" + +#. Form1..SpTBXMultiDock1..dpLog..Caption +#: Unit1.dfm:332 +msgid "Commands Log" +msgstr "Kommandohistorik" + +#. Form1..SpTBXMultiDock1..dpOptions..Caption +#: Unit1.dfm:352 +msgid "Customizer Options" +msgstr "Alternativ" + +#. Form1..SpTBXMultiDock2..dpHelp..Caption +#: Unit1.dfm:368 +msgid "Help" +msgstr "Hjälp" + +#. Form1..SpTBXMultiDock2..dpHelp..SpTBXLabel1..Caption +#: Unit1.dfm:380 +msgid "Right click the toolbars to start playing" +msgstr "Högerklicka pÃ¥ verktygsfälten för att komma igÃ¥ng" + +#. Form1..SpTBXDock2..tbNavigation..Caption +#. Form1..TntActionList1..aBack..Category +#. Form1..TntActionList1..aForward..Category +#. Form1..TntActionList1..aStop..Category +#. Form1..TntActionList1..aRefresh..Category +#. Form1..TntActionList1..aSearch..Category +#. Form1..TntActionList1..aFavs..Category +#: Unit1.dfm:402 +#: Unit1.dfm:1675 +#: Unit1.dfm:1681 +#: Unit1.dfm:1687 +#: Unit1.dfm:1693 +#: Unit1.dfm:1699 +#: Unit1.dfm:1705 +msgid "Navigation" +msgstr "Navigation" + +#. Form1..SpTBXDock2..tbNavigation..tBack..CaptionW +#. Form1..TntActionList1..aBack..Caption +#: Unit1.dfm:409 +#: Unit1.dfm:1676 +msgid "Back" +msgstr "Tillbaka" + +#. Form1..SpTBXDock2..tbNavigation..tForward..CaptionW +#. Form1..TntActionList1..aForward..Caption +#: Unit1.dfm:413 +#: Unit1.dfm:1682 +msgid "Forward" +msgstr "FramÃ¥t" + +#. Form1..SpTBXDock2..tbNavigation..tRefresh..CaptionW +#. Form1..TntActionList1..aRefresh..Caption +#: Unit1.dfm:417 +#: Unit1.dfm:1694 +msgid "Refresh" +msgstr "Uppdatera" + +#. Form1..SpTBXDock2..tbNavigation..tStop..CaptionW +#. Form1..TntActionList1..aStop..Caption +#: Unit1.dfm:421 +#: Unit1.dfm:1688 +msgid "Stop" +msgstr "Avbryt" + +#. Form1..SpTBXDock2..tbNavigation..tSearch..CaptionW +#. Form1..TntActionList1..aSearch..Caption +#: Unit1.dfm:425 +#: Unit1.dfm:1700 +msgid "Search" +msgstr "Sök" + +#. Form1..TntActionList1..aNew..Category +#. Form1..TntActionList1..aOpen..Category +#. Form1..TntActionList1..aSave..Category +#. Form1..TntActionList1..aExit..Category +#. Form1..TntActionList1..aPrint..Category +#: Unit1.dfm:1558 +#: Unit1.dfm:1565 +#: Unit1.dfm:1572 +#: Unit1.dfm:1579 +#: Unit1.dfm:1669 +msgid "Files" +msgstr "Arkiv" + +#. Form1..TntActionList1..aCut..Category +#. Form1..TntActionList1..aCopy..Category +#. Form1..TntActionList1..aPaste..Category +#. Form1..TntActionList1..aSelectAll..Category +#. Form1..TntActionList1..aFind..Category +#: Unit1.dfm:1584 +#: Unit1.dfm:1591 +#: Unit1.dfm:1598 +#: Unit1.dfm:1605 +#: Unit1.dfm:1611 +msgid "Edit" +msgstr "Redigera" + +#. Form1..TntActionList1..aFavs..Caption +#. Form1..SpTBXCustomizer1..cFavs..CaptionW +#: Unit1.dfm:1706 +#: Unit1.dfm:1768 +msgid "Favs" +msgstr "Favoriter" + +#. Form1..TntActionList1..aCustomize..Category +#. Form1..TntActionList1..aEmbeddedCustomize..Category +#: Unit1.dfm:1711 +#: Unit1.dfm:1716 +msgid "Customization" +msgstr "Anpassning" + +#. Form1..TntActionList1..aCustomize..Caption +#. Form1..SpTBXPopupMenu1..pCustomize..CaptionW +#: Unit1.dfm:1712 +#: Unit1.dfm:1731 +msgid "Customize..." +msgstr "Anpassa..." + +#. Form1..TntActionList1..aEmbeddedCustomize..Caption +#. Form1..SpTBXPopupMenu1..pEmbeddedCustomize..CaptionW +#: Unit1.dfm:1717 +#: Unit1.dfm:1735 +msgid "Embedded Customize..." +msgstr "Inbyggd Anpassning..." + +#. Form2..Caption +#: Unit2.dfm:7 +msgid "Options" +msgstr "Alternativ" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tProperties..CaptionW +#: Unit2.dfm:49 +msgid "Properties" +msgstr "Egenskaper" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tPageSetup..CaptionW +#: Unit2.dfm:58 +msgid "Page Setup" +msgstr "Sidlayout" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tHistory..CaptionW +#: Unit2.dfm:67 +msgid "History" +msgstr "Historik" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tFavorites..CaptionW +#: Unit2.dfm:76 +msgid "Favorites" +msgstr "Favoriter" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tCustomize..CaptionW +#. Form2..LeftPanel..TitlePanel..Caption +#: Unit2.dfm:85 +#: Unit2.dfm:168 +msgid "Customizer" +msgstr "Anpassa" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton1..Caption +#: Unit2.dfm:122 +msgid "OK" +msgstr "OK" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton2..Caption +#: Unit2.dfm:137 +msgid "Cancel" +msgstr "Avbryt" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton3..Caption +#: Unit2.dfm:152 +msgid "Apply" +msgstr "Verkställ" + +#: Unit1.pas:235 +msgid "Save Layout" +msgstr "Spara Layout" + +#: Unit1.pas:235 +msgid "Save current layout as:" +msgstr "Spara nuvarande layout som:" + +#: Unit1.pas:248 +msgid "Executed" +msgstr "Exekverat" + diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/tr/LC_MESSAGES/default.mo b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/tr/LC_MESSAGES/default.mo new file mode 100644 index 0000000000000000000000000000000000000000..00b901f09a69556ddac1d28d2e3792aa5c625c85 GIT binary patch literal 3365 zcmZXVPi$jH8NjEoY+F-W*g}Cq>CgplOR<|Q-EQh`|0Iq#yCk~_8}Et~E)#p=O#S{? z?>%SZp!UF_IRFHr9+~}+QU(S`Xn5ZJh*C%4d+=lMUyz?V%B1incs)D@ zZ-uw}`7-=C=R-P~LwB zN`Afz^>s>pAIkdYn3O!f1esEQgtGosD1N*S?}C5#?~k%c?B3#e0!m&Uh2rl5{0w{? ziry58zfVKa`$H&x{nU?t0mbgKQ0)C0ioO@2)LY-rzXoq%{8!I+psf2Z6n_dBk#o2U zik>1o4$DydxC9A7S(`;Ii(wT$ z>F0k3Z)W@ol=Jut6g%%ie(Ikz;{SDQmiYn{{Wn9|cN?Tk@;jmer;#!;dLE%e>hnkH zL-vS28u=u03K4yy=WaR@*Zqj(RlZ?)9v(u?!XolD-#65)T!k90YvVIuOg2ja&O4<&=7h3Nv)igadCPz?q;f3jlF9dl=0U}@tdG&0JWxu~V153preWlriYGnJblq@xR%LW9F6A|J2FmH zaoII(zIi#rph=qJHC``^t~h&DO?Ns$PtBM{Tg}8lQ_XaPz-Fncny6s|RkcxO6WdgW ze6Plxo~m}!EDqgP?!)^dTP~N!gXBP0kG!jri#+&RxN4hC+tedf`R3ZDZFDnC);3Ad zS+fx*F0-lhXh@f|QB$3bqfB2kp&j;?-Inz7Jc6qPt@6~JbNHF`)cMQ=uAzJ))q-8i z^w){Ot@YFe8+Fw*|tgt&fckM-7~6>ulZXYX@$D>(9X=syH)Uq{6V;uyxk?H9mP@@8%6L(a7-G=ycIcnM@aFMtgKf%({`DW>g zO;W0-GCqw&&)P69EG^bc)x_rKT$(kRt>}{z6Q@cOQ>BRq_2dJUQ>R!{x@0$;C>Sr{ zJ*!UZ$*Ic3JYDlCwoQav$I8W>Kcq95-CCedfC*$f+xt;bntTu^Sr;Uk3$=P%U8 zPED343RO;=fJ^mW2Ol!KncYW*T=bA`teYgY*~6FXXG>G#bz*1DCZ$@`h?^v`qNi3} zR`_OV&PFyFI?&u~*-Uil$?{43i&|aIvsAYxtmp!tpJ}%TdwfKyI3I`Pd9J@71^xZO zPJdq&XZ!nGHsH&hjnf`WW?X;Qg?#ae>F?_Pc6YTq*y-xwbYP>VOI+Z3G2itH6*}1a z;M!bedCpju4$eoPb&_O9)y4`yPXD}nc_{}b{N z*lRnPOG4W|G?tI%;Ct$H7>ORn9N3;~P(x~-8XaX8H^cru2`7o7*G72d^dUX{ZE+f# zgFQkENUQ2^5B4}Wd>!5(5=wr9#pPUwCp-Co{4+itgHNi4xSgQ zydR#~9FB($<%8$tR%s8t70=Xi92h-oNCx`2SEv$ykZQ$ptXwN5kxXJwoXr!e-%oel zgeFweBpi{1jdGOhHoY~JOU, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Customizer Demo\n" +"POT-Creation-Date: 2005-08-09 16:55\n" +"PO-Revision-Date: 2008-05-07 18:01+0200\n" +"Last-Translator: Zylar \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: dxgettext 1.2\n" +"Language-Team: \n" + +#. Form1..SpTBXDock1..tbStandard..Caption +#: Unit1.dfm:29 +msgid "Standard" +msgstr "Standart" + +#. Form1..SpTBXDock1..tbStandard..tNew..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mNew..CaptionW +#. Form1..TntActionList1..aNew..Caption +#: Unit1.dfm:37 +#: Unit1.dfm:159 +#: Unit1.dfm:1559 +msgid "New" +msgstr "Yeni" + +#. Form1..SpTBXDock1..tbStandard..tOpen..CaptionW +#: Unit1.dfm:41 +msgid "Open" +msgstr "Aç" + +#. Form1..SpTBXDock1..tbStandard..tSave..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mSave..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayoutSave..CaptionW +#. Form1..TntActionList1..aSave..Caption +#: Unit1.dfm:45 +#: Unit1.dfm:167 +#: Unit1.dfm:318 +#: Unit1.dfm:1573 +msgid "Save" +msgstr "Kaydet" + +#. Form1..SpTBXDock1..tbStandard..tCut..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCut..CaptionW +#. Form1..TntActionList1..aCut..Caption +#: Unit1.dfm:51 +#: Unit1.dfm:184 +#: Unit1.dfm:1585 +msgid "Cut" +msgstr "Kes" + +#. Form1..SpTBXDock1..tbStandard..tCopy..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCopy..CaptionW +#. Form1..TntActionList1..aCopy..Caption +#: Unit1.dfm:55 +#: Unit1.dfm:188 +#: Unit1.dfm:1592 +msgid "Copy" +msgstr "Kopyala" + +#. Form1..SpTBXDock1..tbStandard..tPaste..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mPaste..CaptionW +#. Form1..TntActionList1..aPaste..Caption +#: Unit1.dfm:60 +#: Unit1.dfm:192 +#: Unit1.dfm:1599 +msgid "Paste" +msgstr "Yapıştır" + +#. Form1..SpTBXDock1..tbStandard..tFind..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mFind..CaptionW +#. Form1..TntActionList1..aFind..Caption +#: Unit1.dfm:67 +#: Unit1.dfm:206 +#: Unit1.dfm:1612 +msgid "Find" +msgstr "Ara" + +#. Form1..SpTBXDock1..tbStandard..tThemes..CaptionW +#: Unit1.dfm:73 +msgid "Themes" +msgstr "Temalar" + +#. Form1..SpTBXDock1..tbFormat..Caption +#. Form1..TntActionList1..aBold..Category +#. Form1..TntActionList1..aItalic..Category +#. Form1..TntActionList1..aUnderline..Category +#. Form1..TntActionList1..aLeftJustify..Category +#. Form1..TntActionList1..aRightJustify..Category +#. Form1..TntActionList1..aCentered..Category +#. Form1..TntActionList1..aBullets..Category +#. Form1..TntActionList1..aNumberedBullets..Category +#: Unit1.dfm:99 +#: Unit1.dfm:1618 +#: Unit1.dfm:1625 +#: Unit1.dfm:1632 +#: Unit1.dfm:1639 +#: Unit1.dfm:1645 +#: Unit1.dfm:1651 +#: Unit1.dfm:1657 +#: Unit1.dfm:1663 +msgid "Format" +msgstr "Biçim" + +#. Form1..SpTBXDock1..tbFormat..tFont..Caption +#: Unit1.dfm:106 +msgid "Font Name" +msgstr "Yazı Tipi Adı" + +#. Form1..SpTBXDock1..tbFormat..tFontSize..Caption +#: Unit1.dfm:116 +msgid "Font Size" +msgstr "Yazı Tipi Boyutu" + +#. Form1..SpTBXDock1..tbFormat..tBold..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBold..CaptionW +#. Form1..TntActionList1..aBold..Caption +#: Unit1.dfm:132 +#: Unit1.dfm:213 +#: Unit1.dfm:1619 +msgid "Bold" +msgstr "Kalın" + +#. Form1..SpTBXDock1..tbFormat..tItalic..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mItalic..CaptionW +#. Form1..TntActionList1..aItalic..Caption +#: Unit1.dfm:136 +#: Unit1.dfm:217 +#: Unit1.dfm:1626 +msgid "Italic" +msgstr "İtalik" + +#. Form1..SpTBXDock1..tbFormat..tUnderline..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mUnderline..CaptionW +#. Form1..TntActionList1..aUnderline..Caption +#: Unit1.dfm:140 +#: Unit1.dfm:221 +#: Unit1.dfm:1633 +msgid "Underline" +msgstr "Altı Çizgili" + +#. Form1..SpTBXDock1..tbMenuBar..Caption +#: Unit1.dfm:146 +msgid "Menu" +msgstr "Menü" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..CaptionW +#: Unit1.dfm:156 +msgid "&File" +msgstr "&Dosya" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mOpen..CaptionW +#. Form1..TntActionList1..aOpen..Caption +#: Unit1.dfm:163 +#: Unit1.dfm:1566 +msgid "Open..." +msgstr "Aç..." + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mPrint..CaptionW +#. Form1..TntActionList1..aPrint..Caption +#. Form1..SpTBXCustomizer1..cPrint..CaptionW +#: Unit1.dfm:171 +#: Unit1.dfm:1670 +#: Unit1.dfm:1744 +msgid "Print" +msgstr "Yazdır" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mExit..CaptionW +#. Form1..TntActionList1..aExit..Caption +#. Form1..SpTBXCustomizer1..cExit..CaptionW +#: Unit1.dfm:177 +#: Unit1.dfm:1580 +#: Unit1.dfm:1776 +msgid "Exit" +msgstr "Çıkış" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..CaptionW +#: Unit1.dfm:181 +msgid "&Edit" +msgstr "&Düzelt" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mSelectAll..CaptionW +#. Form1..TntActionList1..aSelectAll..Caption +#. Form1..SpTBXCustomizer1..cSelectAll..CaptionW +#: Unit1.dfm:198 +#: Unit1.dfm:1606 +#: Unit1.dfm:1772 +msgid "Select All" +msgstr "Hepsini Seç" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..CaptionW +#: Unit1.dfm:210 +msgid "&Format" +msgstr "&Biçim" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mLeftJustify..CaptionW +#. Form1..TntActionList1..aLeftJustify..Caption +#. Form1..SpTBXCustomizer1..cLeftJustify..CaptionW +#: Unit1.dfm:227 +#: Unit1.dfm:1640 +#: Unit1.dfm:1748 +msgid "Left Justify" +msgstr "Sola Dayalı" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mCentered..CaptionW +#. Form1..TntActionList1..aCentered..Caption +#. Form1..SpTBXCustomizer1..cCentered..CaptionW +#: Unit1.dfm:231 +#: Unit1.dfm:1652 +#: Unit1.dfm:1752 +msgid "Centered" +msgstr "Ortalanmış" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mRightJustify..CaptionW +#. Form1..TntActionList1..aRightJustify..Caption +#. Form1..SpTBXCustomizer1..cRightJustify..CaptionW +#: Unit1.dfm:235 +#: Unit1.dfm:1646 +#: Unit1.dfm:1756 +msgid "Right Justify" +msgstr "SaÄŸa Dayalı" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBullets..CaptionW +#. Form1..TntActionList1..aBullets..Caption +#. Form1..SpTBXCustomizer1..cBullets..CaptionW +#: Unit1.dfm:241 +#: Unit1.dfm:1658 +#: Unit1.dfm:1760 +msgid "Bullets" +msgstr "Simgeler" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mNumberedBullets..CaptionW +#. Form1..TntActionList1..aNumberedBullets..Caption +#. Form1..SpTBXCustomizer1..cNumBullets..CaptionW +#: Unit1.dfm:245 +#: Unit1.dfm:1664 +#: Unit1.dfm:1764 +msgid "Numbered Bullets" +msgstr "Numaralandırılmış Simgeler" + +#. Form1..SpTBXDock1..tbMenuBar..mView..CaptionW +#: Unit1.dfm:249 +msgid "&View" +msgstr "&Görünüm" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..CaptionW +#: Unit1.dfm:251 +msgid "&Sidebar" +msgstr "&Kenar Paneli" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mCommandsLog..CaptionW +#: Unit1.dfm:254 +msgid "&Commands Log" +msgstr "&Komut Günlüğü" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mOptions..CaptionW +#: Unit1.dfm:258 +msgid "&Options" +msgstr "&Seçenekler" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mmHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mmmHelp..CaptionW +#: Unit1.dfm:262 +#: Unit1.dfm:286 +#: Unit1.dfm:288 +msgid "&Help" +msgstr "&Yardım" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..CaptionW +#: Unit1.dfm:266 +msgid "&Toolbars" +msgstr "&Araç Çubukları" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mStandardToolbar..CaptionW +#: Unit1.dfm:269 +msgid "&Standard Toolbar" +msgstr "&Standart Araç ÇubuÄŸu" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..tLayoutsToolbar..CaptionW +#: Unit1.dfm:273 +msgid "&Layouts Toolbar" +msgstr "&Araç ÇubuÄŸu Düzeni" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mFormattingToolbar..CaptionW +#: Unit1.dfm:277 +msgid "&Formatting Toolbar" +msgstr "&Araç ÇubuÄŸu Biçimlendiriliyor" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mNavigationToolbar..CaptionW +#: Unit1.dfm:281 +msgid "&Navigation Toolbar" +msgstr "&Gezinim Araç ÇubuÄŸu" + +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mAbout..CaptionW +#: Unit1.dfm:291 +msgid "&About" +msgstr "&Hakkında" + +#. Form1..SpTBXDock1..tbLayouts..Caption +#. Form1..SpTBXDock1..tbLayouts..Layouts..SpTBXLabelItem1..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayouts..Caption +#: Unit1.dfm:298 +#: Unit1.dfm:305 +#: Unit1.dfm:308 +msgid "Layouts" +msgstr "Düzenler" + +#. Form1..SpTBXMultiDock1..dpLog..Caption +#: Unit1.dfm:332 +msgid "Commands Log" +msgstr "Komut Günlüğü" + +#. Form1..SpTBXMultiDock1..dpOptions..Caption +#: Unit1.dfm:352 +msgid "Customizer Options" +msgstr "Seçenek Düzenleyicisi" + +#. Form1..SpTBXMultiDock2..dpHelp..Caption +#: Unit1.dfm:368 +msgid "Help" +msgstr "Yardım" + +#. Form1..SpTBXMultiDock2..dpHelp..SpTBXLabel1..Caption +#: Unit1.dfm:380 +msgid "Right click the toolbars to start playing" +msgstr "Çalmaya baÅŸlamak için araç çubuÄŸuna mouse ile saÄŸ tıklayın" + +#. Form1..SpTBXDock2..tbNavigation..Caption +#. Form1..TntActionList1..aBack..Category +#. Form1..TntActionList1..aForward..Category +#. Form1..TntActionList1..aStop..Category +#. Form1..TntActionList1..aRefresh..Category +#. Form1..TntActionList1..aSearch..Category +#. Form1..TntActionList1..aFavs..Category +#: Unit1.dfm:402 +#: Unit1.dfm:1675 +#: Unit1.dfm:1681 +#: Unit1.dfm:1687 +#: Unit1.dfm:1693 +#: Unit1.dfm:1699 +#: Unit1.dfm:1705 +msgid "Navigation" +msgstr "Gezinim" + +#. Form1..SpTBXDock2..tbNavigation..tBack..CaptionW +#. Form1..TntActionList1..aBack..Caption +#: Unit1.dfm:409 +#: Unit1.dfm:1676 +msgid "Back" +msgstr "Geri" + +#. Form1..SpTBXDock2..tbNavigation..tForward..CaptionW +#. Form1..TntActionList1..aForward..Caption +#: Unit1.dfm:413 +#: Unit1.dfm:1682 +msgid "Forward" +msgstr "İleri" + +#. Form1..SpTBXDock2..tbNavigation..tRefresh..CaptionW +#. Form1..TntActionList1..aRefresh..Caption +#: Unit1.dfm:417 +#: Unit1.dfm:1694 +msgid "Refresh" +msgstr "Yenile" + +#. Form1..SpTBXDock2..tbNavigation..tStop..CaptionW +#. Form1..TntActionList1..aStop..Caption +#: Unit1.dfm:421 +#: Unit1.dfm:1688 +msgid "Stop" +msgstr "Dur" + +#. Form1..SpTBXDock2..tbNavigation..tSearch..CaptionW +#. Form1..TntActionList1..aSearch..Caption +#: Unit1.dfm:425 +#: Unit1.dfm:1700 +msgid "Search" +msgstr "Ara" + +#. Form1..TntActionList1..aNew..Category +#. Form1..TntActionList1..aOpen..Category +#. Form1..TntActionList1..aSave..Category +#. Form1..TntActionList1..aExit..Category +#. Form1..TntActionList1..aPrint..Category +#: Unit1.dfm:1558 +#: Unit1.dfm:1565 +#: Unit1.dfm:1572 +#: Unit1.dfm:1579 +#: Unit1.dfm:1669 +msgid "Files" +msgstr "Dosyalar" + +#. Form1..TntActionList1..aCut..Category +#. Form1..TntActionList1..aCopy..Category +#. Form1..TntActionList1..aPaste..Category +#. Form1..TntActionList1..aSelectAll..Category +#. Form1..TntActionList1..aFind..Category +#: Unit1.dfm:1584 +#: Unit1.dfm:1591 +#: Unit1.dfm:1598 +#: Unit1.dfm:1605 +#: Unit1.dfm:1611 +msgid "Edit" +msgstr "Düzelt" + +#. Form1..TntActionList1..aFavs..Caption +#. Form1..SpTBXCustomizer1..cFavs..CaptionW +#: Unit1.dfm:1706 +#: Unit1.dfm:1768 +msgid "Favs" +msgstr "Favs" + +#. Form1..TntActionList1..aCustomize..Category +#. Form1..TntActionList1..aEmbeddedCustomize..Category +#: Unit1.dfm:1711 +#: Unit1.dfm:1716 +msgid "Customization" +msgstr "ÖzelleÅŸtirmek" + +#. Form1..TntActionList1..aCustomize..Caption +#. Form1..SpTBXPopupMenu1..pCustomize..CaptionW +#: Unit1.dfm:1712 +#: Unit1.dfm:1731 +msgid "Customize..." +msgstr "ÖzelleÅŸtir..." + +#. Form1..TntActionList1..aEmbeddedCustomize..Caption +#. Form1..SpTBXPopupMenu1..pEmbeddedCustomize..CaptionW +#: Unit1.dfm:1717 +#: Unit1.dfm:1735 +msgid "Embedded Customize..." +msgstr "Gömülü BileÅŸenleri ÖzelleÅŸtir" + +#. Form2..Caption +#: Unit2.dfm:7 +msgid "Options" +msgstr "Seçenekler" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tProperties..CaptionW +#: Unit2.dfm:49 +msgid "Properties" +msgstr "Özellikler" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tPageSetup..CaptionW +#: Unit2.dfm:58 +msgid "Page Setup" +msgstr "Sayfa Düzeni" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tHistory..CaptionW +#: Unit2.dfm:67 +msgid "History" +msgstr "GeçmiÅŸ" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tFavorites..CaptionW +#: Unit2.dfm:76 +msgid "Favorites" +msgstr "Favoriler" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tCustomize..CaptionW +#. Form2..LeftPanel..TitlePanel..Caption +#: Unit2.dfm:85 +#: Unit2.dfm:168 +msgid "Customizer" +msgstr "ÖzelleÅŸtir" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton1..Caption +#: Unit2.dfm:122 +msgid "OK" +msgstr "Tamam" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton2..Caption +#: Unit2.dfm:137 +msgid "Cancel" +msgstr "Vazgeç" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton3..Caption +#: Unit2.dfm:152 +msgid "Apply" +msgstr "Uygula" + +#: Unit1.pas:235 +msgid "Save Layout" +msgstr "Düzeni Kaydet" + +#: Unit1.pas:235 +msgid "Save current layout as:" +msgstr "Geçerli düzeni kaydet:" + +#: Unit1.pas:248 +msgid "Executed" +msgstr "Çalıştırıldı" + diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/zh_CN/LC_MESSAGES/default.mo b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/zh_CN/LC_MESSAGES/default.mo new file mode 100644 index 0000000000000000000000000000000000000000..493e91f8d536e26ba657a73c4473e698b2b8abe3 GIT binary patch literal 3197 zcmZvcYit}>6~_-Wq^&8?hF1xX4ux*kly%oh+$2s*u{Y}^;MgX1QV^nIynAC$Gdr`I zolWdY1@nj>Z5^lNsn&to*f^w#|ZvlJ53mI$Y&tC-cMwL_Bu=$|NH>adhlQ1hrs`UcxXM0%zMB) z!42R?!Hr_C1Mh{tRqS!_F6iG9c7yjpKMdXtJ_~ZZA>k; z-NJ8x2uybHy0ysh8|!5!cy!8piyeh1{ZNe~aYnApD$ zC@m=kn8RcJ}G=ksDw7id1OFb zli(~H!6rx@q%yvO1zH-62Qhyb!to8r#~=+5?rUX)u|R6H6~g}`d^S8DFM}QfLy#?y zCm{Ua_Ib$K@z5HDbL8?f*a2>bd`|R; z@DoDrA@}zSkWYz?zh8VtLI3N;c0agT){KW`y$R&+mH#Uqh46pGmmyz;@b|}KXBokL z=5Kc!>!GG@H|tX<=B84nlgt>cZV!dxNei|X%T}0OFJ-b8(6^i(qsw*eZquXC9%ZK~ z)N1x4My6_RGmlt3rf<1U)z+S7Jwu^RE2)B)JAG_uddaGf#D&vAOC6=AblUExW;1b^ znq50d%~{)4euiSElTbFrl;bN;CFxzc$J}&3#j+XSOQ>35N*a|=!OQVJmB{+oGTw&dLMS3XRsI;X0 z>(riBPB3wmm3lhN9%XbYKbxiwGvh1j@GQs2?536HTgZ36I^?NLFYUK_daIk3wFHtn zZ1}y(@XIHj!NM>S(p{K)Rf;;zBPy7Ta{lFYBI|iLAj1wWhhb(KsZ*I=q8G4L!Z(_1 zn<`fT3pY(&h=z;~I7#K%mcz-qPs25`HyJsoybSJ7WA!{dW0y*~H686;k(j4~laA~% zebs1ejz$|I(e07w4x|3j#)by?ME0vA76+)hY>PxU!^@~|XpBZ9(Jj$vO)FXy>GDh` zW1BdaMx$om-hJ`v-t~3Sni!52bw#@R)7Z*aef}e9+q9gWMxxjBGRlAaKvzp-d)1G_ z9a3H-?j+nKzMe*7d$;A+d^56JIm#>VlkDqJKF2cZ>oy||rzeYpi*zY7g(OHHdp*B! zJREAOCH>-ZesQXBc3R&$8xF;4skn5ewDMv&6tAVinW6mRjc}+1%U724(%71%zB#Rr z-7LIPw&~oge(smy&>jTL{Ybwyu;%Ah*sd&d~UohjTHCjHv6eD3nQ$|XHDs)uh-Y3QP!eJMXbQeE+te-CpxXVN1V_3)5%iuCmt z^s#Al=k^Q1+mo*rMrKMAFQCu?J+wfDQ#VRy$0{(&z2#C0BP*mY2Z@)Vr)KmVJcE{F zv(eJ6m(f=4FzMridh9ArW}FKx_nObCFn%eYn<~C~MPHd;T|Pmjv2i_mS{e_BIlYJ! zPS0Tn95DB#I5CT=sW5UeF zd=qisYjZt*;r4;$bI&0WJ+!FDUSB;mi&D^&+nu8Pt@HZwIf0a;=LYriNz`4|%P#rc r!atUf?uqf@wMksy3&>Nh3h5t=7cNgyKDW3!iCDSk_3%%M3%BV1Ox#r! literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/zh_CN/LC_MESSAGES/default.po b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/zh_CN/LC_MESSAGES/default.po new file mode 100644 index 0000000..52185f3 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/locale/zh_CN/LC_MESSAGES/default.po @@ -0,0 +1,431 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Customizer Demo\n" +"POT-Creation-Date: 2005-08-09 16:55\n" +"PO-Revision-Date: 2007-02-08 15:00-0300\n" +"Last-Translator: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: dxgettext 1.2\n" +"Language-Team: \n" + +#. Form1..SpTBXDock1..tbStandard..Caption +#: Unit1.dfm:29 +msgid "Standard" +msgstr "标准" + +#. Form1..SpTBXDock1..tbStandard..tNew..CaptionW +#: Unit1.dfm:37 +#: Unit1.dfm:159 +#: Unit1.dfm:1559 +msgid "New" +msgstr "新建" + +#. Form1..SpTBXDock1..tbStandard..tOpen..CaptionW +#: Unit1.dfm:41 +msgid "Open" +msgstr "打开" + +#. Form1..SpTBXDock1..tbStandard..tSave..CaptionW +#: Unit1.dfm:45 +#: Unit1.dfm:167 +#: Unit1.dfm:318 +#: Unit1.dfm:1573 +msgid "Save" +msgstr "ä¿å­˜" + +#. Form1..SpTBXDock1..tbStandard..tCut..CaptionW +#: Unit1.dfm:51 +#: Unit1.dfm:184 +#: Unit1.dfm:1585 +msgid "Cut" +msgstr "剪切" + +#. Form1..SpTBXDock1..tbStandard..tCopy..CaptionW +#: Unit1.dfm:55 +#: Unit1.dfm:188 +#: Unit1.dfm:1592 +msgid "Copy" +msgstr "å¤åˆ¶" + +#. Form1..SpTBXDock1..tbStandard..tPaste..CaptionW +#: Unit1.dfm:60 +#: Unit1.dfm:192 +#: Unit1.dfm:1599 +msgid "Paste" +msgstr "粘贴" + +#. Form1..SpTBXDock1..tbStandard..tFind..CaptionW +#: Unit1.dfm:67 +#: Unit1.dfm:206 +#: Unit1.dfm:1612 +msgid "Find" +msgstr "查找" + +#. Form1..SpTBXDock1..tbStandard..tThemes..CaptionW +#: Unit1.dfm:73 +msgid "Themes" +msgstr "主题" + +#. Form1..SpTBXDock1..tbFormat..Caption +#. Form1..TntActionList1..aLeftJustify..Category +#. Form1..TntActionList1..aNumberedBullets..Category +#: Unit1.dfm:99 +#: Unit1.dfm:1618 +#: Unit1.dfm:1625 +#: Unit1.dfm:1632 +#: Unit1.dfm:1639 +#: Unit1.dfm:1645 +#: Unit1.dfm:1651 +#: Unit1.dfm:1657 +#: Unit1.dfm:1663 +msgid "Format" +msgstr "æ ¼å¼" + +#. Form1..SpTBXDock1..tbFormat..tFont..Caption +#: Unit1.dfm:106 +msgid "Font Name" +msgstr "字体" + +#. Form1..SpTBXDock1..tbFormat..tFontSize..Caption +#: Unit1.dfm:116 +msgid "Font Size" +msgstr "字体大å°" + +#. Form1..SpTBXDock1..tbFormat..tBold..CaptionW +#: Unit1.dfm:132 +#: Unit1.dfm:213 +#: Unit1.dfm:1619 +msgid "Bold" +msgstr "粗体" + +#. Form1..SpTBXDock1..tbFormat..tItalic..CaptionW +#: Unit1.dfm:136 +#: Unit1.dfm:217 +#: Unit1.dfm:1626 +msgid "Italic" +msgstr "斜体" + +#. Form1..SpTBXDock1..tbFormat..tUnderline..CaptionW +#: Unit1.dfm:140 +#: Unit1.dfm:221 +#: Unit1.dfm:1633 +msgid "Underline" +msgstr "下划线" + +#. Form1..SpTBXDock1..tbMenuBar..Caption +#: Unit1.dfm:146 +msgid "Menu" +msgstr "èœå•" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..CaptionW +#: Unit1.dfm:156 +msgid "&File" +msgstr "文件(&F)" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mOpen..CaptionW +#: Unit1.dfm:163 +#: Unit1.dfm:1566 +msgid "Open..." +msgstr "打开..." + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mPrint..CaptionW +#: Unit1.dfm:171 +#: Unit1.dfm:1670 +#: Unit1.dfm:1744 +msgid "Print" +msgstr "打å°" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mExit..CaptionW +#: Unit1.dfm:177 +#: Unit1.dfm:1580 +#: Unit1.dfm:1776 +msgid "Exit" +msgstr "退出" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..CaptionW +#: Unit1.dfm:181 +msgid "&Edit" +msgstr "编辑(&E)" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mSelectAll..CaptionW +#: Unit1.dfm:198 +#: Unit1.dfm:1606 +#: Unit1.dfm:1772 +msgid "Select All" +msgstr "全选" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..CaptionW +#: Unit1.dfm:210 +msgid "&Format" +msgstr "æ ¼å¼(&F)" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mLeftJustify..CaptionW +#: Unit1.dfm:227 +#: Unit1.dfm:1640 +#: Unit1.dfm:1748 +msgid "Left Justify" +msgstr "文本两端对é½" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mCentered..CaptionW +#: Unit1.dfm:231 +#: Unit1.dfm:1652 +#: Unit1.dfm:1752 +msgid "Centered" +msgstr "居中" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mRightJustify..CaptionW +#: Unit1.dfm:235 +#: Unit1.dfm:1646 +#: Unit1.dfm:1756 +msgid "Right Justify" +msgstr "文本两端对é½" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBullets..CaptionW +#: Unit1.dfm:241 +#: Unit1.dfm:1658 +#: Unit1.dfm:1760 +msgid "Bullets" +msgstr "项目符å·" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mNumberedBullets..CaptionW +#: Unit1.dfm:245 +#: Unit1.dfm:1664 +#: Unit1.dfm:1764 +msgid "Numbered Bullets" +msgstr "æ•°å­—ç¼–å·" + +#. Form1..SpTBXDock1..tbMenuBar..mView..CaptionW +#: Unit1.dfm:249 +msgid "&View" +msgstr "查看(&V)" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..CaptionW +#: Unit1.dfm:251 +msgid "&Sidebar" +msgstr "ä¾§è¾¹æ (&S)" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mCommandsLog..CaptionW +#: Unit1.dfm:254 +msgid "&Commands Log" +msgstr "命令日志(&C)" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mOptions..CaptionW +#: Unit1.dfm:258 +msgid "&Options" +msgstr "选项(&O)" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mmHelp..CaptionW +#: Unit1.dfm:262 +#: Unit1.dfm:286 +#: Unit1.dfm:288 +msgid "&Help" +msgstr "帮助(&H)" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..CaptionW +#: Unit1.dfm:266 +msgid "&Toolbars" +msgstr "工具æ (&T)" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mStandardToolbar..CaptionW +#: Unit1.dfm:269 +msgid "&Standard Toolbar" +msgstr "标准工具æ (&S)" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..tLayoutsToolbar..CaptionW +#: Unit1.dfm:273 +msgid "&Layouts Toolbar" +msgstr "布局工具æ (&L)" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mFormattingToolbar..CaptionW +#: Unit1.dfm:277 +msgid "&Formatting Toolbar" +msgstr "æ ¼å¼å·¥å…·æ (&F)" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mNavigationToolbar..CaptionW +#: Unit1.dfm:281 +msgid "&Navigation Toolbar" +msgstr "导航工具æ (&N)" + +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mAbout..CaptionW +#: Unit1.dfm:291 +msgid "&About" +msgstr "关于(&A)" + +#. Form1..SpTBXDock1..tbLayouts..Caption +#: Unit1.dfm:298 +#: Unit1.dfm:305 +#: Unit1.dfm:308 +msgid "Layouts" +msgstr "布局" + +#. Form1..SpTBXMultiDock1..dpLog..Caption +#: Unit1.dfm:332 +msgid "Commands Log" +msgstr "命令日志" + +#. Form1..SpTBXMultiDock1..dpOptions..Caption +#: Unit1.dfm:352 +msgid "Customizer Options" +msgstr "自定义选项" + +#. Form1..SpTBXMultiDock2..dpHelp..Caption +#: Unit1.dfm:368 +msgid "Help" +msgstr "帮助" + +#. Form1..SpTBXMultiDock2..dpHelp..SpTBXLabel1..Caption +#: Unit1.dfm:380 +msgid "Right click the toolbars to customize them" +msgstr "在工具æ ä¸Šå•击å³é”®è¿›è¡Œè‡ªå®šä¹‰" + +#. Form1..SpTBXDock2..tbNavigation..Caption +#. Form1..TntActionList1..aRefresh..Category +#: Unit1.dfm:402 +#: Unit1.dfm:1675 +#: Unit1.dfm:1681 +#: Unit1.dfm:1687 +#: Unit1.dfm:1693 +#: Unit1.dfm:1699 +#: Unit1.dfm:1705 +msgid "Navigation" +msgstr "导航" + +#. Form1..SpTBXDock2..tbNavigation..tBack..CaptionW +#: Unit1.dfm:409 +#: Unit1.dfm:1676 +msgid "Back" +msgstr "åŽé€€" + +#. Form1..SpTBXDock2..tbNavigation..tForward..CaptionW +#: Unit1.dfm:413 +#: Unit1.dfm:1682 +msgid "Forward" +msgstr "å‰è¿›" + +#. Form1..SpTBXDock2..tbNavigation..tRefresh..CaptionW +#: Unit1.dfm:417 +#: Unit1.dfm:1694 +msgid "Refresh" +msgstr "刷新" + +#. Form1..SpTBXDock2..tbNavigation..tStop..CaptionW +#: Unit1.dfm:421 +#: Unit1.dfm:1688 +msgid "Stop" +msgstr "åœæ­¢" + +#. Form1..SpTBXDock2..tbNavigation..tSearch..CaptionW +#: Unit1.dfm:425 +#: Unit1.dfm:1700 +msgid "Search" +msgstr "æœç´¢" + +#. Form1..TntActionList1..aNew..Category +#. Form1..TntActionList1..aPrint..Category +#: Unit1.dfm:1558 +#: Unit1.dfm:1565 +#: Unit1.dfm:1572 +#: Unit1.dfm:1579 +#: Unit1.dfm:1669 +msgid "Files" +msgstr " 文件" + +#. Form1..TntActionList1..aCut..Category +#. Form1..TntActionList1..aFind..Category +#: Unit1.dfm:1584 +#: Unit1.dfm:1591 +#: Unit1.dfm:1598 +#: Unit1.dfm:1605 +#: Unit1.dfm:1611 +msgid "Edit" +msgstr "编辑" + +#. Form1..TntActionList1..aFavs..Caption +#: Unit1.dfm:1706 +#: Unit1.dfm:1768 +msgid "Favs" +msgstr "æ”¶è—" + +#. Form1..TntActionList1..aCustomize..Category +#: Unit1.dfm:1711 +#: Unit1.dfm:1716 +msgid "Customization" +msgstr "自定义" + +#. Form1..TntActionList1..aCustomize..Caption +#: Unit1.dfm:1712 +#: Unit1.dfm:1731 +msgid "Customize..." +msgstr "自定义..." + +#. Form1..TntActionList1..aEmbeddedCustomize..Caption +#: Unit1.dfm:1717 +#: Unit1.dfm:1735 +msgid "Embedded Customize..." +msgstr "嵌入å¼è‡ªå®šä¹‰..." + +#. Form2..Caption +#: Unit2.dfm:7 +msgid "Options" +msgstr "选项" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tProperties..CaptionW +#: Unit2.dfm:49 +msgid "Properties" +msgstr "属性" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tPageSetup..CaptionW +#: Unit2.dfm:58 +msgid "Page Setup" +msgstr "页é¢è®¾ç½®" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tHistory..CaptionW +#: Unit2.dfm:67 +msgid "History" +msgstr "历å²" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tFavorites..CaptionW +#: Unit2.dfm:76 +msgid "Favorites" +msgstr "æ”¶è—" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tCustomize..CaptionW +#: Unit2.dfm:85 +#: Unit2.dfm:168 +msgid "Customizer" +msgstr "自定义" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton1..Caption +#: Unit2.dfm:122 +msgid "OK" +msgstr "确定" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton2..Caption +#: Unit2.dfm:137 +msgid "Cancel" +msgstr "å–æ¶ˆ" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton3..Caption +#: Unit2.dfm:152 +msgid "Apply" +msgstr "应用" + +#: Unit1.pas:235 +msgid "Save Layout" +msgstr "ä¿å­˜å¸ƒå±€" + +#: Unit1.pas:235 +msgid "Save current layout as:" +msgstr "将当å‰å¸ƒå±€ä¿å­˜ä¸ºï¼š" + +#: Unit1.pas:248 +msgid "Executed" +msgstr "被执行" + diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/translations.txt b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/translations.txt new file mode 100644 index 0000000..116bb46 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Demos/Customizer/translations.txt @@ -0,0 +1,27 @@ + +The Customizer Demo uses dxgettext (http://dybdahl.dk/dxgettext/) to translate the strings to various languages. +Unfortunately the translations are not complete: + +de (German): 100% translated (Thomas Speck) +es (Spanish): 100% translated (Robert Lee) +fi (Finnish): 100% translated (Tapio Saarikumpu) +fr (French): 100% translated (Bob Baudewyns) +ja (Japanese): 100% translated (Minoru Yoshida) +ko (Korean): 60% translated +nl (Dutch): 100% translated (Alfred Vink) +pt_BR (Brazilian): 100% translated (Mauricio Magnani) +ru (Russian): 100% translated (Alexey Naumov) +sr_Cyrillic (Serbian): 100% translated (Marko Binic) +sr_Latin (Serbian): 100% translated (Marko Binic) +sv (Swedish): 100% translated (Mattias Andersson) +tr (Turkish): 100% translated (Zylar) +zh_CN (Chinese): 100% translated (Beta Xiong) + +You can edit the translations with Notepad, just open the corresponding po file of the language. +For example to edit the Chinese translation open the \locale\zh_CN\LC_MESSAGES\default.po file with Notepad and edit the msgstr entries. +You can also use a PoEdit (http://poedit.sourceforge.net) to edit the files. + +To create a new translation for a different language use the default.po file template located in the locale directory. + +If you improve one of the translations please send it to me, my mail address is on: +http://www.silverpointdevelopment.com/sptbxlib/support.htm \ No newline at end of file diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/FormPopupMenu.dpr b/official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/FormPopupMenu.dpr new file mode 100644 index 0000000..be00fa9 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/FormPopupMenu.dpr @@ -0,0 +1,17 @@ +program FormPopupMenu; + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}, + Unit2 in 'Unit2.pas' {Form2}, + Unit3 in 'Unit3.pas' {Form3}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.CreateForm(TForm2, Form2); + Application.CreateForm(TForm3, Form3); + Application.Run; +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/Unit1.dfm b/official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/Unit1.dfm new file mode 100644 index 0000000..e026cd8 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/Unit1.dfm @@ -0,0 +1,200 @@ +object Form1: TForm1 + Left = 312 + Top = 215 + Caption = 'Form1' + ClientHeight = 387 + ClientWidth = 531 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Shell Dlg 2' + Font.Style = [] + OldCreateOrder = False + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object SpTBXTitleBar1: TSpTBXTitleBar + Left = 0 + Top = 0 + Width = 531 + Height = 387 + Caption = 'Form1' + DesignSize = ( + 531 + 387) + object SpTBXSubmenuItem2: TSpTBXSubmenuItem + Caption = 'Skins' + Options = [tboDropdownArrow] + OnDrawItem = SpTBXSubmenuItem2DrawItem + LinkSubitems = SpTBXSubmenuItem3 + end + object SpTBXStatusBar1: TSpTBXStatusBar + Left = 4 + Top = 360 + Width = 523 + Height = 23 + object SpTBXLabelItem1: TSpTBXLabelItem + Caption = 'Panel 1' + end + object SpTBXSeparatorItem2: TSpTBXSeparatorItem + end + object SpTBXLabelItem2: TSpTBXLabelItem + Caption = 'Panel 2' + end + end + object SpTBXDock2: TSpTBXDock + Left = 4 + Top = 26 + Width = 523 + Height = 23 + object SpTBXToolbar2: TSpTBXToolbar + Left = 0 + Top = 0 + CloseButton = False + DockPos = -8 + FullSize = True + MenuBar = True + ProcessShortCuts = True + ShrinkMode = tbsmWrap + Stretch = True + TabOrder = 0 + Caption = 'SpTBXToolbar2' + object SpTBXSubmenuItem1: TSpTBXSubmenuItem + Tag = 100 + Caption = '&File' + object SpTBXItem1: TSpTBXItem + Caption = '&New' + end + object SpTBXItem2: TSpTBXItem + Caption = '&Open' + end + object SpTBXSeparatorItem1: TSpTBXSeparatorItem + end + object SpTBXItem3: TSpTBXItem + Caption = '&Exit' + end + end + object SpTBXSubmenuItem3: TSpTBXSubmenuItem + Caption = '&Skins' + object SpTBXSkinGroupItem1: TSpTBXSkinGroupItem + end + end + end + end + object SpTBXMultiDock1: TSpTBXMultiDock + Left = 4 + Top = 49 + Width = 178 + Height = 311 + object SpTBXDockablePanel1: TSpTBXDockablePanel + Left = 0 + Top = 0 + Width = 178 + Height = 311 + Caption = 'Form Popup Options' + DockPos = 0 + TabOrder = 0 + Options.Close = False + object SpTBXRadioGroup1: TSpTBXRadioGroup + Left = 7 + Top = 56 + Width = 161 + Height = 97 + Caption = 'BorderStyle' + TabOrder = 1 + OnClick = SpTBXRadioGroup1Click + ItemIndex = 3 + Items.Strings = ( + 'pbsFrame' + 'pbsSizeable' + 'pbsSizeableBottom' + 'pbsSizeableRightBottom') + end + object SpTBXCheckBox1: TSpTBXCheckBox + Left = 11 + Top = 32 + Width = 69 + Height = 21 + Caption = 'Set focus' + TabOrder = 2 + OnClick = SpTBXCheckBox1Click + end + end + end + object SpTBXGroupBox1: TSpTBXGroupBox + Left = 192 + Top = 64 + Width = 329 + Height = 73 + Caption = 'Calendar Popup' + Anchors = [akLeft, akTop, akRight] + TabOrder = 4 + object SpTBXButtonEdit1: TSpTBXButtonEdit + Left = 16 + Top = 33 + Width = 121 + Height = 21 + TabOrder = 0 + EditButton.Left = 97 + EditButton.Top = 0 + EditButton.Width = 20 + EditButton.Height = 17 + EditButton.Align = alRight + EditButton.DropDownMenu = SpTBXFormPopupMenu1 + end + object SpTBXButton1: TSpTBXButton + Left = 184 + Top = 32 + Width = 121 + Height = 25 + Caption = 'Date' + TabOrder = 1 + DropDownMenu = SpTBXFormPopupMenu1 + end + end + object SpTBXGroupBox2: TSpTBXGroupBox + Left = 192 + Top = 168 + Width = 329 + Height = 81 + Caption = 'Treeview Popup' + Anchors = [akLeft, akTop, akRight] + TabOrder = 5 + object SpTBXButtonEdit2: TSpTBXButtonEdit + Left = 16 + Top = 33 + Width = 121 + Height = 21 + TabOrder = 0 + EditButton.Left = 97 + EditButton.Top = 0 + EditButton.Width = 20 + EditButton.Height = 17 + EditButton.Align = alRight + EditButton.DropDownMenu = SpTBXFormPopupMenu2 + end + object SpTBXButton2: TSpTBXButton + Left = 184 + Top = 32 + Width = 121 + Height = 25 + Caption = 'Colors' + TabOrder = 1 + DropDownMenu = SpTBXFormPopupMenu2 + end + end + end + object SpTBXFormPopupMenu1: TSpTBXFormPopupMenu + BorderStyle = pbsSizeableRightBottom + OnBeforeClosePopup = SpTBXFormPopupMenu1BeforeClosePopup + Left = 200 + Top = 304 + end + object SpTBXFormPopupMenu2: TSpTBXFormPopupMenu + BorderStyle = pbsSizeableRightBottom + OnBeforeClosePopup = SpTBXFormPopupMenu2BeforeClosePopup + Left = 240 + Top = 304 + end +end diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/Unit1.pas b/official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/Unit1.pas new file mode 100644 index 0000000..07f5a3c --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/Unit1.pas @@ -0,0 +1,123 @@ +unit Unit1; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, ExtCtrls, ImgList, Menus, ComCtrls, + TB2Dock, TB2Toolbar, TB2Item, TB2ExtItems, + SpTBXSkins, SpTBXItem, SpTBXControls, SpTBXEditors, SpTBXFormPopupMenu, + SpTBXDkPanels; + +type + TForm1 = class(TForm) + SpTBXDock2: TSpTBXDock; + SpTBXToolbar2: TSpTBXToolbar; + SpTBXSubmenuItem1: TSpTBXSubmenuItem; + SpTBXStatusBar1: TSpTBXStatusBar; + SpTBXTitleBar1: TSpTBXTitleBar; + SpTBXSubmenuItem2: TSpTBXSubmenuItem; + SpTBXItem1: TSpTBXItem; + SpTBXItem2: TSpTBXItem; + SpTBXSeparatorItem1: TSpTBXSeparatorItem; + SpTBXItem3: TSpTBXItem; + SpTBXMultiDock1: TSpTBXMultiDock; + SpTBXDockablePanel1: TSpTBXDockablePanel; + SpTBXRadioGroup1: TSpTBXRadioGroup; + SpTBXCheckBox1: TSpTBXCheckBox; + SpTBXGroupBox1: TSpTBXGroupBox; + SpTBXGroupBox2: TSpTBXGroupBox; + SpTBXButtonEdit1: TSpTBXButtonEdit; + SpTBXButton1: TSpTBXButton; + SpTBXButtonEdit2: TSpTBXButtonEdit; + SpTBXButton2: TSpTBXButton; + SpTBXFormPopupMenu1: TSpTBXFormPopupMenu; + SpTBXFormPopupMenu2: TSpTBXFormPopupMenu; + SpTBXSubmenuItem3: TSpTBXSubmenuItem; + SpTBXSkinGroupItem1: TSpTBXSkinGroupItem; + SpTBXLabelItem1: TSpTBXLabelItem; + SpTBXSeparatorItem2: TSpTBXSeparatorItem; + SpTBXLabelItem2: TSpTBXLabelItem; + procedure SpTBXSubmenuItem2DrawItem(Sender: TObject; ACanvas: TCanvas; + ARect: TRect; ItemInfo: TSpTBXMenuItemInfo; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); + procedure SpTBXCheckBox1Click(Sender: TObject); + procedure SpTBXRadioGroup1Click(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure SpTBXFormPopupMenu1BeforeClosePopup(Sender: TObject; + Selected: Boolean); + procedure SpTBXFormPopupMenu2BeforeClosePopup(Sender: TObject; + Selected: Boolean); + private + { Private declarations } + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +{$R *.dfm} + +uses + Unit2, Unit3; + +{ TForm1 } + +procedure TForm1.FormShow(Sender: TObject); +begin + SpTBXFormPopupMenu1.PopupForm := Form2; + SpTBXFormPopupMenu2.PopupForm := Form3; +end; + +procedure TForm1.SpTBXCheckBox1Click(Sender: TObject); +begin + SpTBXFormPopupMenu1.PopupFocus := SpTBXCheckBox1.Checked; + SpTBXFormPopupMenu2.PopupFocus := SpTBXCheckBox1.Checked; +end; + +procedure TForm1.SpTBXRadioGroup1Click(Sender: TObject); +var + I: Integer; +begin + I := SpTBXRadioGroup1.ItemIndex; + if I > -1 then begin + SpTBXFormPopupMenu1.BorderStyle := TSpTBXPopupBorderStyleType(I); + SpTBXFormPopupMenu2.BorderStyle := TSpTBXPopupBorderStyleType(I); + end; +end; + +procedure TForm1.SpTBXSubmenuItem2DrawItem(Sender: TObject; + ACanvas: TCanvas; ARect: TRect; ItemInfo: TSpTBXMenuItemInfo; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + // Don't draw the items background + if (PaintStage = pstPrePaint) and (CurrentSkin.SkinName = 'Default') then + PaintDefault := False; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Popups } + +procedure TForm1.SpTBXFormPopupMenu1BeforeClosePopup(Sender: TObject; + Selected: Boolean); +begin + if Selected then begin + SpTBXButton1.Caption := DateTimeToStr(Form2.MonthCalendar1.Date); + SpTBXButtonEdit1.Text := DateTimeToStr(Form2.MonthCalendar1.Date); + end; +end; + +procedure TForm1.SpTBXFormPopupMenu2BeforeClosePopup(Sender: TObject; + Selected: Boolean); +begin + if Selected then begin + SpTBXButton2.Caption := Form3.TreeView1.Selected.Text; + SpTBXButtonEdit2.Text := Form3.TreeView1.Selected.Text; + end; +end; + +end. + diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/Unit2.dfm b/official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/Unit2.dfm new file mode 100644 index 0000000..4828692 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/Unit2.dfm @@ -0,0 +1,27 @@ +object Form2: TForm2 + Left = 0 + Top = 0 + Caption = 'Form2' + ClientHeight = 166 + ClientWidth = 180 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + OldCreateOrder = False + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object MonthCalendar1: TMonthCalendar + Left = 0 + Top = 0 + Width = 180 + Height = 166 + Align = alClient + AutoSize = True + Date = 38924.819285115740000000 + TabOrder = 0 + end +end diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/Unit2.pas b/official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/Unit2.pas new file mode 100644 index 0000000..89faf97 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/Unit2.pas @@ -0,0 +1,50 @@ +unit Unit2; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, ComCtrls, CommCtrl, ExtCtrls, SpTBXFormPopupMenu; + +type + TForm2 = class(TForm) + MonthCalendar1: TMonthCalendar; + procedure FormCreate(Sender: TObject); + private + { Private declarations } + FOldWndProc: TWndMethod; + procedure NewWndProc(var Message: TMessage); + public + { Public declarations } + end; + +var + Form2: TForm2; + +implementation + +{$R *.dfm} + +procedure TForm2.FormCreate(Sender: TObject); +begin + // We can't use the MonthCalendar.OnClick event because + // it gets fired even when clicking on the Prev/Next month + // buttons. We have to subclass it and handle the + // MCN_SELECT notification + MonthCalendar1.DoubleBuffered := True; + FOldWndProc := MonthCalendar1.WindowProc; + MonthCalendar1.WindowProc := NewWndProc; +end; + +procedure TForm2.NewWndProc(var Message: TMessage); +begin + FOldWndProc(Message); // default WndProc + if Message.Msg = CN_NOTIFY then + if TWMNotify(Message).NMHdr^.code = MCN_SELECT then begin + // Inform the ActiveFormPopupMenu that a selection was made. + if Assigned(ActiveFormPopupMenu) then + ActiveFormPopupMenu.ClosePopup(True); + end; +end; + +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/Unit3.dfm b/official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/Unit3.dfm new file mode 100644 index 0000000..21fa118 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/Unit3.dfm @@ -0,0 +1,36 @@ +object Form3: TForm3 + Left = 0 + Top = 0 + Caption = 'Form3' + ClientHeight = 105 + ClientWidth = 174 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + OldCreateOrder = False + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object TreeView1: TTreeView + Left = 0 + Top = 0 + Width = 174 + Height = 105 + Align = alClient + BorderStyle = bsNone + HideSelection = False + HotTrack = True + Images = ImageList1 + Indent = 19 + StateImages = ImageList1 + TabOrder = 0 + OnMouseUp = TreeView1MouseUp + end + object ImageList1: TImageList + Left = 48 + Top = 64 + end +end diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/Unit3.pas b/official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/Unit3.pas new file mode 100644 index 0000000..584a423 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Demos/FormPopupMenu/Unit3.pas @@ -0,0 +1,102 @@ +unit Unit3; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, ComCtrls, ImgList, SpTBXFormPopupMenu; + +type + TForm3 = class(TForm) + TreeView1: TTreeView; + ImageList1: TImageList; + procedure FormCreate(Sender: TObject); + procedure TreeView1MouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + private + { Private declarations } + public + { Public declarations } + function AddIcon(Fill: TColor; Circular: Boolean = False): Integer; + procedure CreateNodesProc(const S: string); + end; + +var + Form3: TForm3; + +implementation + +{$R *.dfm} + +function TForm3.AddIcon(Fill: TColor; Circular: Boolean = False): Integer; +var + B: TBitmap; + R: TRect; +begin + B := TBitmap.Create; + try + B.Width := 16; + B.Height := 16; + B.Canvas.Brush.Color := Fill; + R := Rect(0, 0, B.Width, B.Height); + InflateRect(R, -1, -1); + if Circular then + B.Canvas.Ellipse(R) + else + B.Canvas.Rectangle(R); + Result := ImageList1.Add(B, nil); + finally + B.Free; + end; +end; + +procedure TForm3.CreateNodesProc(const S: string); +var + ParentNode: TTreeNode; + C: TColor; +begin + // Add the color node + C := StringToColor(S); + ParentNode := TreeView1.Items.GetFirstNode; + if C < 0 then + ParentNode := ParentNode.getNextSibling; + with TreeView1.Items.AddChildObject(ParentNode, S, Pointer(C)) do begin + ImageIndex := AddIcon(C); + SelectedIndex := ImageIndex; + end; +end; + +procedure TForm3.FormCreate(Sender: TObject); +var + I: Integer; +begin + I := AddIcon(clWhite, True); + // Add the parent nodes to the TreeView + with TreeView1.Items.Add(nil, 'Standard Colors') do begin + ImageIndex := I; + SelectedIndex := ImageIndex; + end; + with TreeView1.Items.Add(nil, 'System Colors') do begin + ImageIndex := I; + SelectedIndex := ImageIndex; + end; + // Add the color nodes + GetColorValues(CreateNodesProc); +end; + +procedure TForm3.TreeView1MouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +var + Node: TTreeNode; +begin + if Button = mbLeft then begin + Node := TreeView1.GetNodeAt(X, Y); + if Assigned(Node) and Node.Selected and (Node.Level > 0) then begin + // Inform the ActiveFormPopupMenu that a selection was made. + if Assigned(ActiveFormPopupMenu) then + ActiveFormPopupMenu.ClosePopup(True); + end; + end; +end; + +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Overview/Overview.dpr b/official/2.2.2+2.4.2/SpTBXLib/Demos/Overview/Overview.dpr new file mode 100644 index 0000000..5ead0c3 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Demos/Overview/Overview.dpr @@ -0,0 +1,13 @@ +program Overview; + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Overview/Skins/WMP11.skn b/official/2.2.2+2.4.2/SpTBXLib/Demos/Overview/Skins/WMP11.skn new file mode 100644 index 0000000..2cf772c --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Demos/Overview/Skins/WMP11.skn @@ -0,0 +1,380 @@ +; =============================================================================================================== +; +; Syntax: +; [Component] +; State.Part = Value +; +; Component can be: +; Single state components: Dock, DockablePanel, DockablePanelTitleBar, Gutter, MenuBar, OpenToolbarItem, +; Panel, Popup, Separator, Splitter, StatusBar, StatusBarGrip, TabBackground, +; TabToolbar, Toolbar, ToolbarGrip, Window, WindowTitleBar +; Multiple state componentes: MenuBarItem, MenuItem, ToolbarItem, Button, CheckBox, EditButton, EditFrame, +; Header, Label, ListItem, ProgressBar, RadioButton, Tab, TrackBar, TrackBarButton +; +; State can be: Normal, Disabled, HotTrack, Pushed, Checked, CheckedAndHotTrack +; +; Part can be: Body, Borders, TextColor +; +; =============================================================================================================== +; +; Value syntax: +; +; Body = GradientType, GradientColor1, GradientColor2, GradientColor3, GradientColor4 +; Body represents the controls client area, GradientType can be one of the +; following values: +; 0 (Solid, uses Color1) +; 1 (Vertical Gradient, uses 2 colors) +; 2 (Horizontal Gradient, uses 2 colors) +; 3 (Vertical Glass Gradient, uses 4 colors) +; 4 (Horizontal Glass Gradient, uses 4 colors) +; 5 (Vertical Mirror Gradient, uses 4 colors) +; 6 (Horizontal Mirror Gradient, uses 4 colors) +; 7 (Vertical Top Mirror Gradient, uses 4 colors) +; 8 (Horizontal Top Mirror Gradient, uses 4 colors) +; 9 (Vertical 9 Pixel Mirror Gradient, uses 4 colors) +; 10 (Horizontal 9 Pixel Mirror Gradient, uses 4 colors) +; +; Example, this will draw a white/gray vertical gradient on the buttons normal state: +; [Button] +; Normal.Body = 1, clWhite, $DCD8D0 +; +; +; Borders = BorderType, TopLeftColor, BottomRightColor, Internal TopLeftColor, Internal BottomRightColor +; Borders represents the controls borders, BorderType can be one of the +; following values: +; 0 (Rectangle border) +; 1 (Rounded border) +; 2 (Double rounded) +; +; Example, this will draw a white/black rounded beveled border on the buttons normal state: +; [Button] +; Normal.Borders = 1, clWhite, clBlack +; +; =============================================================================================================== +; +; Notes: +; +; 1) Colors must be in Delphi notation, for example: clWhite or $FFFFFF are valid +; 2) clNone is used as the empty fill color +; 3) Non used colors can be omited + + +[Skin] +Name=WMP11 +Author = Ricardo Cardona +ColorBtnFace=clSilver +OfficeStatusBar=0 +OfficeIcons=0 +TitleBarBorderSize=4 + +[Dock] +Normal.Body=0, clBlack, clNone, clNone, clNone +Normal.Borders=0, clNone, clNone, clNone, clNone +Normal.TextColor=clWhite + +[DockablePanel] +Normal.Body=1, $007F665C, $007F665C, clNone, clNone +Normal.Borders=0, clBlack, clBlack, clNone, clNone +Normal.TextColor=clWhite + +[DockablePanelTitleBar] +Normal.Body=3, $00130F0D, $00080606, $00423630, $0082695F +Normal.Borders=1, $00765E56, clBlack, clNone, clNone +Normal.TextColor=clWhite + +[MenuBar] +Normal.Body=1, clSilver, $000E0B0A, clNone, clNone +Normal.Borders=2, $00B0B0B0, $00B0B0B0, clNone, clNone +Normal.TextColor=clWhite + +[Panel] +Normal.Body=0, $007F665C, clBlack, clNone, clNone +Normal.Borders=2, clGray, clGray, $00ADA492, clGray +Normal.TextColor=clWhite + +[Popup] +Normal.Body=0, $007F665C, clNone, clNone, clNone +Normal.Borders=0, clSilver, clSilver, clNone, clNone +Normal.TextColor=clWhite + +[Separator] +Normal.Body=0, clBlack, $007F665C, clNone, clNone +Normal.Borders=0, clNone, clNone, clNone, clNone +Normal.TextColor=clNone + +[Splitter] +Normal.Body=2, $007F665C, $007F665C, clNone, clNone +Normal.Borders=0, clNone, clNone, clNone, clNone +Normal.TextColor=clNone + +[StatusBar] +Normal.Body=1, $00131211, $00744C42, clNone, clNone +Normal.Borders=0, clNone, clNone, clNone, clNone +Normal.TextColor=clWhite + +[StatusBarGrip] +Normal.Body=1, clBlack, $007F665C, clNone, clNone +Normal.Borders=0, clNone, clNone, clNone, clNone +Normal.TextColor=clWhite + +[TabBackground] +Normal.Body=3, clBlack, clBlack, clBlack, $007F665C +Normal.Borders=0, clGray, clGray, clNone, clNone +Normal.TextColor=clNone + +[Toolbar] +Normal.Body=1, clBlack, $007F665C, clNone, clNone +Normal.Borders=2, clNone, clNone, clNone, clNone +Normal.TextColor=clWhite + +[ToolbarGrip] +Normal.Body=1, clBlack, $007F665C, clNone, clNone +Normal.Borders=0, clNone, clNone, clNone, clNone +Normal.TextColor=clWhite + +[Window] +Normal.Body=1, clBlack, $007F665C, clNone, clNone +Normal.Borders=0, clGray, clGray, clSilver, $007F665C +Normal.TextColor=clWhite + +[WindowTitleBar] +Normal.Body=1, clBlack, $007F665C, clNone, clNone +Normal.Borders=0, clNone, clNone, clNone, clNone +Normal.TextColor=clWhite + +[MenuBarItem] +Normal.Body=0, clNone, clNone, clNone, clNone +Normal.Borders=0, clNone, clNone, clNone, clNone +Normal.TextColor=clWhite +Disabled.Body=0, clNone, clNone, clNone, clNone +Disabled.Borders=0, clNone, clNone, clNone, clNone +Disabled.TextColor=clSilver +HotTrack.Body=5, $00D1D1D1, $00ADA492, $00603518, clBlack +HotTrack.Borders=1, $00909090, $00909090, clNone, clNone +HotTrack.TextColor=clWhite +Pushed.Body=1, clBlack, $00603518, clNone, clNone +Pushed.Borders=1, clGray, clGray, $00ADA492, $00E8E19D +Pushed.TextColor=clWhite +Checked.Body=3, clWhite, clBlack, clBlack, $00765F55 +Checked.Borders=1, clGray, clGray, $00B0D4DF, clSilver +Checked.TextColor=clWhite +CheckedAndHotTrack.Body=3, clBlack, $00603518, $00ADA492, clWhite +CheckedAndHotTrack.Borders=1, clGray, clGray, $00ADA492, $00E8E19D +CheckedAndHotTrack.TextColor=clWhite + +[MenuItem] +Normal.Body=0, clNone, clNone, clNone, clNone +Normal.Borders=0, clNone, clNone, clNone, clNone +Normal.TextColor=clWhite +Disabled.Body=0, clNone, clNone, clNone, clNone +Disabled.Borders=0, clNone, clNone, clNone, clNone +Disabled.TextColor=clSilver +HotTrack.Body=5, clWhite, $00ADA492, $00603518, clBlack +HotTrack.Borders=1, $00909090, $00909090, clNone, clNone +HotTrack.TextColor=clWhite +Pushed.Body=1, clSilver, clWhite, clNone, clNone +Pushed.Borders=1, $00909090, $00909090, clNone, clNone +Pushed.TextColor=clWhite +Checked.Body=5, clBlack, $00765F55, $00765F55, clBlack +Checked.Borders=1, clGray, clGray, $00B0D4DF, $00F0FDFF +Checked.TextColor=clWhite +CheckedAndHotTrack.Body=5, clBlack, $00603518, $00ADA492, clWhite +CheckedAndHotTrack.Borders=1, clGray, clGray, $00ADA492, $00E8E19D +CheckedAndHotTrack.TextColor=clWhite + +[ToolbarItem] +Normal.Body=0, clNone, clNone, clNone, clNone +Normal.Borders=0, clNone, clNone, clNone, clNone +Normal.TextColor=clWhite +Disabled.Body=0, clNone, $00392E2B, $005A4A44, $00866E65 +Disabled.Borders=0, clNone, clNone, clNone, clNone +Disabled.TextColor=clSilver +HotTrack.Body=5, clWhite, $00ADA492, $00603518, clBlack +HotTrack.Borders=1, $00909090, $00909090, clNone, clNone +HotTrack.TextColor=clWhite +Pushed.Body=5, clGray, clBlack, clBlack, clGray +Pushed.Borders=1, $00909090, $00909090, clNone, clNone +Pushed.TextColor=clWhite +Checked.Body=5, clGray, clBlack, clBlack, clGray +Checked.Borders=1, clGray, clGray, $00B0D4DF, $00F0FDFF +Checked.TextColor=clWhite +CheckedAndHotTrack.Body=5, clBlack, $00603518, $00ADA492, clWhite +CheckedAndHotTrack.Borders=1, clGray, clGray, $00ADA492, $00E8E19D +CheckedAndHotTrack.TextColor=clWhite + +[Button] +Normal.Body=3, clWhite, clBlack, clBlack, $00765F55 +Normal.Borders=1, $00909090, $00909090, $00909090, $00909090 +Normal.TextColor=clWhite +Disabled.Body=1, clBlack, $009E9E9E, clNone, clNone +Disabled.Borders=1, $00909090, $00909090, clNone, clNone +Disabled.TextColor=clSilver +HotTrack.Body=5, clWhite, $00ADA492, $00603518, clBlack +HotTrack.Borders=1, $00909090, $00909090, clNone, clNone +HotTrack.TextColor=clWhite +Pushed.Body=5, clBlack, $00603518, $00ADA492, clWhite +Pushed.Borders=1, $00909090, $00909090, clNone, clNone +Pushed.TextColor=clWhite +Checked.Body=5, $00765F55, clBlack, clBlack, $00765F55 +Checked.Borders=1, clGray, clGray, $00B0D4DF, $00F0FDFF +Checked.TextColor=clWhite +CheckedAndHotTrack.Body=5, clBlack, $00550000, $007B7B7B, clWhite +CheckedAndHotTrack.Borders=1, clGray, clGray, $00ADA492, $00E8E19D +CheckedAndHotTrack.TextColor=clWhite + +[CheckBox] +Normal.Body=0, clBlack, clNone, clNone, clNone +Normal.Borders=0, clGray, clGray, clNone, clNone +Normal.TextColor=clWhite +Disabled.Body=0, clNone, clNone, clNone, clNone +Disabled.Borders=0, $0099A8AC, $0099A8AC, clNone, clNone +Disabled.TextColor=clSilver +HotTrack.Body=5, clWhite, $00ADA492, $00603518, clBlack +HotTrack.Borders=1, $00909090, $00909090, $000E0B0A, $00090706 +HotTrack.TextColor=clWhite +Pushed.Body=5, $00E8E19D, $00603518, $00ADA492, clWhite +Pushed.Borders=1, $00E8E19D, $00603518, $00ADA492, clWhite +Pushed.TextColor=clWhite +Checked.Body=0, $00010101, $00F0FDFF, clNone, clNone +Checked.Borders=1, clGray, clGray, clBlack, clBlack +Checked.TextColor=clWhite +CheckedAndHotTrack.Body=5, clWhite, $00ADA492, $00603518, clBlack +CheckedAndHotTrack.Borders=0, clGray, clGray, $00ADA492, $00E8E19D +CheckedAndHotTrack.TextColor=clWhite + +[EditButton] +Normal.Body=5, clWhite, clBlack, clBlack, $00765F55 +Normal.Borders=0, clNone, clNone, clNone, clNone +Normal.TextColor=clWhite +HotTrack.Body=5, clWhite, $00ADA492, $00603518, clBlack +HotTrack.Borders=1, $00909090, $00909090, clNone, clNone +HotTrack.TextColor=clWhite +Pushed.Body=5, $00E8E19D, $00603518, $00ADA492, clWhite +Pushed.Borders=1, $00909090, $00909090, clNone, clNone +Pushed.TextColor=clNone +Checked.Body=5, $00D2F9FF, $00F0FDFF, clNone, clNone +Checked.Borders=1, clGray, clGray, $00B0D4DF, $00F0FDFF +Checked.TextColor=clNone +CheckedAndHotTrack.Body=5, clWhite, $00E8E19D, clNone, clNone +CheckedAndHotTrack.Borders=1, clGray, clGray, $00ADA492, $00E8E19D +CheckedAndHotTrack.TextColor=clNone + +[EditFrame] +Normal.Body=0, clNone, clNone, clNone, clNone +Normal.Borders=1, clNone, clNone, $00D0D0D0, $00D0D0D0 +Normal.TextColor=clNone +Disabled.Body=0, clNone, clNone, clNone, clNone +Disabled.Borders=1, clNone, clNone, $0099A8AC, $0099A8AC +Disabled.TextColor=clNone +HotTrack.Body=0, clNone, clNone, clNone, clNone +HotTrack.Borders=1, clNone, clNone, $00909090, $00909090 +HotTrack.TextColor=clNone + +[Label] +Normal.Body=0, clNone, clNone, clNone, clNone +Normal.Borders=0, clNone, clNone, clNone, clNone +Normal.TextColor=clWhite +Disabled.Body=0, clNone, clNone, clNone, clNone +Disabled.Borders=0, clNone, clNone, clNone, clNone +Disabled.TextColor=clSilver +HotTrack.Body=0, clNone, clNone, clNone, clNone +HotTrack.Borders=0, clNone, clNone, clNone, clNone +HotTrack.TextColor=clWhite +Pushed.Body=0, clNone, clNone, clNone, clNone +Pushed.Borders=0, clNone, clNone, clNone, clNone +Pushed.TextColor=clWhite + +[ListItem] +Normal.Body=0, $00765F55, clNone, clNone, clNone +Normal.Borders=0, clNone, clNone, clNone, clNone +Normal.TextColor=clNone +Disabled.Body=0, $00765F55, clNone, clNone, clNone +Disabled.Borders=0, clNone, clNone, clNone, clNone +Disabled.TextColor=clSilver +HotTrack.Body=0, $00765F55, $00E5E2DB, clNone, clNone +HotTrack.Borders=1, $00909090, $00909090, clNone, clNone +HotTrack.TextColor=clWhite +Pushed.Body=0, $00765F55, clWhite, clNone, clNone +Pushed.Borders=1, $00909090, $00909090, clNone, clNone +Pushed.TextColor=clNone +Checked.Body=0, $00765F55, $00F0FDFF, clNone, clNone +Checked.Borders=1, clGray, clGray, $00B0D4DF, $00F0FDFF +Checked.TextColor=clNone +CheckedAndHotTrack.Body=0, $00765F55, $00E8E19D, clNone, clNone +CheckedAndHotTrack.Borders=1, clGray, clGray, $00ADA492, $00E8E19D +CheckedAndHotTrack.TextColor=clNone + +[ProgressBar] +Normal.Body=2, $007F665C, $007F665C, clNone, clNone +Normal.Borders=2, $005E4B44, $00765F55, clNone, clNone +Normal.TextColor=clNone +HotTrack.Body=3, $00FFC584, $00CD410F, $00FF966E, $00866E65 +HotTrack.Borders=2, $005E4B44, $00765F55, clNone, clNone +HotTrack.TextColor=clNone + +[RadioButton] +Normal.Body=0, clNone, clNone, clNone, clNone +Normal.Borders=0, clGray, clGray, clNone, clNone +Normal.TextColor=clWhite +Disabled.Body=0, clNone, clNone, clNone, clNone +Disabled.Borders=0, $0099A8AC, $0099A8AC, clNone, clNone +Disabled.TextColor=clSilver +HotTrack.Body=5, clWhite, $00ADA492, $00603518, clBlack +HotTrack.Borders=1, clWhite, clWhite, clWhite, clWhite +HotTrack.TextColor=clWhite +Pushed.Body=0, clNone, clWhite, clNone, clNone +Pushed.Borders=1, $00909090, $00909090, clNone, clNone +Pushed.TextColor=clWhite +Checked.Body=0, clNone, $00F0FDFF, clNone, clNone +Checked.Borders=1, clGray, clGray, $00B0D4DF, $00F0FDFF +Checked.TextColor=clWhite +CheckedAndHotTrack.Body=5, $00E8E19D, $00603518, $00ADA492, clBlack +CheckedAndHotTrack.Borders=1, clWhite, clWhite, clWhite, clWhite +CheckedAndHotTrack.TextColor=clWhite + +[Tab] +Normal.Body=0, clNone, clNone, clNone, clNone +Normal.Borders=0, clNone, clNone, clNone, clNone +Normal.TextColor=clSilver +HotTrack.Body=5, clWhite, $00ADA492, $00603518, clBlack +HotTrack.Borders=1, $00A0A0A0, $00A0A0A0, clNone, clNone +HotTrack.TextColor=clWhite +Pushed.Body=0, clNone, clWhite, clNone, clNone +Pushed.Borders=1, $00909090, $00909090, clNone, clNone +Pushed.TextColor=clWhite +Checked.Body=3, clWhite, clBlack, clBlack, clBlack +Checked.Borders=1, $00ADA492, $00ADA492, $00603518, clBlack +Checked.TextColor=clWhite +CheckedAndHotTrack.Body=5, clWhite, $00ADA492, $00603518, clBlack +CheckedAndHotTrack.Borders=1, clGray, clGray, $00ADA492, $00E8E19D +CheckedAndHotTrack.TextColor=clWhite + +[TrackBar] +Normal.Body=3, $00FFC584, $00CD410F, $00FF966E, $00866E65 +Normal.Borders=2, $005E4B44, $00765F55, clNone, clNone +Normal.TextColor=clNone +HotTrack.Body=1, clWhite, clBlack, clNone, clNone +HotTrack.Borders=2, clNone, clNone, clNone, clNone +HotTrack.TextColor=clNone + +[TrackBarButton] +Normal.Body=3, clWhite, clBlack, clBlack, $00765F55 +Normal.Borders=2, $00909090, $00909090, clNone, clNone +Normal.TextColor=clNone +HotTrack.Body=5, clWhite, $00ADA492, $00603518, $00E8E19D +HotTrack.Borders=0, clNone, clNone, clNone, clNone +HotTrack.TextColor=clNone +Pushed.Body=5, $00765F55, clBlack, clBlack, clWhite +Pushed.Borders=2, clGray, clGray, $00F0D4DF, clNone +Pushed.TextColor=clNone + +[Header] +Normal.Body=3, clWhite, clBlack, clBlack, $00765F55 +Normal.Borders=0, $00D0D0D0, $00909090, clNone, clNone +Normal.TextColor=clWhite +HotTrack.Body=5, clWhite, $00ADA492, $00603518, clBlack +HotTrack.Borders=0, $00909090, $00909090, clNone, clNone +HotTrack.TextColor=clWhite +Pushed.Body=5, $00E8E19D, $00603518, $00ADA492, clWhite +Pushed.Borders=0, $00909090, $00909090, clNone, clNone +Pushed.TextColor=clWhite \ No newline at end of file diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Overview/Unit1.dfm b/official/2.2.2+2.4.2/SpTBXLib/Demos/Overview/Unit1.dfm new file mode 100644 index 0000000..1d2b7b8 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Demos/Overview/Unit1.dfm @@ -0,0 +1,1901 @@ +object Form1: TForm1 + Left = 279 + Top = 147 + Caption = 'SpTBXLib Demo' + ClientHeight = 555 + ClientWidth = 716 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Shell Dlg 2' + Font.Style = [] + OldCreateOrder = False + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object SpTBXSplitter1: TSpTBXSplitter + Left = 273 + Top = 72 + Height = 457 + Cursor = crSizeWE + end + object SpTBXSplitter2: TSpTBXSplitter + Left = 575 + Top = 72 + Height = 457 + Cursor = crSizeWE + Align = alRight + end + object SpTBXMultiDock1: TSpTBXMultiDock + Left = 0 + Top = 72 + Width = 273 + Height = 457 + object SpTBXDockablePanel1: TSpTBXDockablePanel + Left = 0 + Top = 0 + Width = 273 + Height = 303 + Caption = 'Options Panel' + DockPos = 0 + TabOrder = 0 + object SpTBXSubmenuItem1: TSpTBXSubmenuItem + Options = [tboDropdownArrow] + CustomHeight = 15 + LinkSubitems = subSkins + end + object SpTBXTabControl2: TSpTBXTabControl + Left = 0 + Top = 19 + Width = 269 + Height = 280 + Align = alClient + OnResize = SpTBXTabControl2Resize + ActiveTabIndex = 0 + HiddenItems = <> + object SpTBXTabItem1: TSpTBXTabItem + Caption = 'Controls' + Checked = True + end + object SpTBXTabItem6: TSpTBXTabItem + Caption = 'Editors' + end + object SpTBXTabItem3: TSpTBXTabItem + Caption = 'Misc' + end + object SpTBXTabSheet3: TSpTBXTabSheet + Left = 0 + Top = 23 + Width = 269 + Height = 257 + Caption = 'Misc' + ImageIndex = -1 + DesignSize = ( + 269 + 257) + TabItem = 'SpTBXTabItem3' + object SpTBXGroupBox5: TSpTBXGroupBox + Left = 8 + Top = 8 + Width = 252 + Height = 177 + Caption = 'Links' + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + object SpTBXLabel2: TSpTBXLabel + Left = 8 + Top = 24 + Width = 151 + Height = 19 + Caption = 'Go to Silverpoint Development' + LinkText = 'http://www.silverpointdevelopment.com' + end + object SpTBXLabel3: TSpTBXLabel + Left = 8 + Top = 48 + Width = 156 + Height = 19 + Caption = 'Go to Toolbar2000 newsgroups' + LinkText = 'news://news.jrsoftware.org' + end + object SpTBXLabel4: TSpTBXLabel + Left = 8 + Top = 72 + Width = 128 + Height = 19 + Caption = 'Open the Windows folder' + end + object SpTBXLabel7: TSpTBXLabel + Left = 8 + Top = 144 + Width = 105 + Height = 19 + Cursor = crHandPoint + Caption = 'View the sourcecode' + LinkText = 'notepad.exe' + end + object SpTBXLabel5: TSpTBXLabel + Left = 8 + Top = 96 + Width = 106 + Height = 19 + Caption = 'Open it with the tree' + end + object SpTBXLabel6: TSpTBXLabel + Left = 8 + Top = 120 + Width = 74 + Height = 19 + Caption = 'Open WinAmp' + end + end + end + object SpTBXTabSheet6: TSpTBXTabSheet + Left = 0 + Top = 23 + Width = 269 + Height = 257 + Caption = 'Editors' + ImageIndex = -1 + DesignSize = ( + 269 + 257) + TabItem = 'SpTBXTabItem6' + object SpTBXPanel2: TSpTBXPanel + Left = 8 + Top = 112 + Width = 252 + Height = 124 + Anchors = [akLeft, akTop, akRight, akBottom] + TabOrder = 4 + HotTrack = True + object Memo2: TMemo + Left = 2 + Top = 22 + Width = 248 + Height = 100 + Align = alClient + BorderStyle = bsNone + Lines.Strings = ( + 'To add hottrack borders to your controls:' + '1) Drop a TSpTBXPanel and set HotTrack to true' + '2) Drop a control inside' + '3) Set the control Align to alClient' + '4) Set the control BorderStyle to bsNone' + '4) Change the skin to other than Default') + TabOrder = 0 + end + object Panel2: TPanel + Left = 2 + Top = 2 + Width = 248 + Height = 20 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object SpTBXSpeedButton1: TSpTBXSpeedButton + Left = 0 + Top = 0 + Width = 81 + Height = 20 + Caption = 'Column 1' + Align = alLeft + OnDraw = SpTBXSpeedButton1Draw + end + object SpTBXSpeedButton2: TSpTBXSpeedButton + Left = 81 + Top = 0 + Width = 96 + Height = 20 + Caption = 'Column 2' + Align = alLeft + OnDraw = SpTBXSpeedButton1Draw + end + object SpTBXSpeedButton3: TSpTBXSpeedButton + Left = 177 + Top = 0 + Width = 71 + Height = 20 + Caption = 'Column 3' + Align = alClient + OnDraw = SpTBXSpeedButton1Draw + end + end + end + object SpTBXButtonEdit1: TSpTBXButtonEdit + Left = 8 + Top = 48 + Width = 121 + Height = 21 + TabOrder = 2 + Text = 'SpTBXButtonEdit' + EditButton.Left = 97 + EditButton.Top = 0 + EditButton.Width = 20 + EditButton.Height = 17 + EditButton.Caption = '...' + EditButton.Align = alRight + end + object SpTBXComboBox2: TSpTBXComboBox + Left = 136 + Top = 16 + Width = 121 + Height = 21 + ItemHeight = 13 + TabOrder = 1 + Text = 'SpTBXComboBox' + end + object SpTBXEdit1: TSpTBXEdit + Left = 8 + Top = 16 + Width = 121 + Height = 21 + TabOrder = 0 + Text = 'SpTBXEdit' + end + object SpTBXSpinEdit1: TSpTBXSpinEdit + Left = 136 + Top = 48 + Width = 121 + Height = 21 + TabOrder = 3 + SpinButton.Left = 100 + SpinButton.Top = 0 + SpinButton.Width = 17 + SpinButton.Height = 17 + SpinButton.Align = alRight + end + object SpTBXColorEdit1: TSpTBXColorEdit + Left = 8 + Top = 80 + Width = 121 + Height = 21 + TabOrder = 5 + SelectedColor = clBlack + end + object SpTBXFontComboBox1: TSpTBXFontComboBox + Left = 136 + Top = 80 + Width = 121 + Height = 21 + ItemHeight = 23 + ItemIndex = 0 + TabOrder = 6 + Text = 'Arial' + SelectedFont = 'Arial' + end + end + object SpTBXTabSheet1: TSpTBXTabSheet + Left = 0 + Top = 23 + Width = 269 + Height = 257 + Caption = 'Controls' + ImageIndex = -1 + DesignSize = ( + 269 + 257) + TabItem = 'SpTBXTabItem1' + object progressAnimate: TSpTBXButton + Left = 80 + Top = 98 + Width = 65 + Height = 25 + Caption = 'Animate' + TabOrder = 5 + OnClick = progressAnimateClick + end + object progressInc: TSpTBXButton + Left = 48 + Top = 98 + Width = 33 + Height = 25 + Caption = '+' + TabOrder = 4 + OnClick = progressIncClick + Repeating = True + end + object SpTBXGroupBox6: TSpTBXGroupBox + Left = 8 + Top = 52 + Width = 252 + Height = 17 + Caption = 'ProgressBar' + Anchors = [akLeft, akTop, akRight] + TabOrder = 2 + Borders = False + end + object SpTBXGroupBox1: TSpTBXGroupBox + Left = 8 + Top = 8 + Width = 252 + Height = 17 + Caption = 'Button' + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + Borders = False + end + object SpTBXGroupBox2: TSpTBXGroupBox + Left = 8 + Top = 130 + Width = 252 + Height = 17 + Caption = 'Trackbar' + Anchors = [akLeft, akTop, akRight] + TabOrder = 8 + Borders = False + end + object SpTBXButton1: TSpTBXButton + Left = 110 + Top = 24 + Width = 75 + Height = 25 + Caption = 'Button' + TabOrder = 1 + end + object progressDec: TSpTBXButton + Left = 16 + Top = 98 + Width = 33 + Height = 25 + Caption = '-' + TabOrder = 3 + OnClick = progressDecClick + Repeating = True + end + object progressFiles: TSpTBXCheckBox + Left = 160 + Top = 102 + Width = 85 + Height = 21 + Caption = 'File progress' + TabOrder = 6 + OnClick = progressFilesClick + end + object SpTBXProgressBar1: TSpTBXProgressBar + Left = 80 + Top = 71 + Width = 150 + Height = 17 + Caption = '30%' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Shell Dlg 2' + Font.Style = [fsBold] + ParentFont = False + Position = 30 + OnProgressChange = SpTBXProgressBar1ProgressChange + end + object SpTBXTrackBar1: TSpTBXTrackBar + Left = 72 + Top = 147 + Width = 150 + Height = 45 + TabOrder = 9 + end + object trackTickmarks: TSpTBXRadioGroup + Left = 13 + Top = 194 + Width = 241 + Height = 49 + Caption = 'Tickmarks' + Anchors = [akLeft, akTop, akRight] + TabOrder = 10 + TabStop = True + OnClick = TrackbarTickMarksRadioClick + Columns = 4 + ItemIndex = 0 + Items.Strings = ( + 'Bottom' + 'Top' + 'Both' + 'Center') + end + end + end + end + object SpTBXDockablePanel2: TSpTBXDockablePanel + Left = 0 + Top = 303 + Width = 273 + Height = 154 + Caption = 'Skins Options' + DockPos = 303 + TabOrder = 1 + DesignSize = ( + 269 + 150) + object rgSkinType: TSpTBXRadioGroup + Left = 8 + Top = 32 + Width = 252 + Height = 105 + Caption = 'Skin Type' + Anchors = [akLeft, akTop, akRight] + TabOrder = 1 + TabStop = True + OnClick = rgSkinTypeClick + ItemIndex = 2 + Items.Strings = ( + '&None' + '&Windows' + '&Skins') + end + object skinButton: TSpTBXSpeedButton + Left = 70 + Top = 111 + Width = 86 + Height = 18 + Caption = 'Load Skin ...' + OnClick = skinButtonClick + end + end + end + object SpTBXDock1: TSpTBXDock + Left = 0 + Top = 0 + Width = 716 + Height = 72 + object SpTBXToolbar1: TSpTBXToolbar + Left = 0 + Top = 0 + ShrinkMode = tbsmNone + Stretch = True + TabOrder = 0 + Caption = 'SpTBXToolbar1' + object SpTBXLabelItem4: TSpTBXLabelItem + Caption = 'Options:' + end + object subLang: TSpTBXSubmenuItem + Caption = 'Languages' + Options = [tboDropdownArrow] + end + object subSkins: TSpTBXSubmenuItem + Caption = 'Skins' + Options = [tboDropdownArrow] + object SpTBXSkinGroupItem1: TSpTBXSkinGroupItem + end + end + object subColor: TSpTBXSubmenuItem + Caption = 'Color' + Options = [tboDropdownArrow, tboToolbarStyle] + ToolBoxPopup = True + object SpTBXColorPalette1: TSpTBXColorPalette + end + object SpTBXSeparatorItem1: TSpTBXSeparatorItem + end + object SpTBXItem5: TSpTBXItem + Caption = 'More Colors...' + end + end + object SpTBXSeparatorItem8: TSpTBXSeparatorItem + end + object SpTBXItem2: TSpTBXItem + Caption = 'Options Panel' + Control = SpTBXDockablePanel1 + end + object SpTBXItem7: TSpTBXItem + Caption = 'TabControl' + Control = SpTBXTabControl1 + end + end + object SpTBXToolbar3: TSpTBXToolbar + Left = 0 + Top = 23 + DockPos = 0 + DockRow = 1 + ShrinkMode = tbsmNone + Stretch = True + TabOrder = 1 + Caption = 'SpTBXToolbar3' + DesignSize = ( + 706 + 22) + object SpTBXLabelItem3: TSpTBXLabelItem + Caption = '&Address:' + Control = SpTBXComboBox1 + end + object TBControlItem3: TTBControlItem + Control = SpTBXComboBox1 + end + object SpTBXSeparatorItem6: TSpTBXSeparatorItem + Blank = True + end + object SpTBXItem1: TSpTBXItem + Caption = 'Go' + DisplayMode = nbdmImageAndText + ImageIndex = 1 + Images = ImageList1 + end + object SpTBXComboBox1: TSpTBXComboBox + Left = 53 + Top = 0 + Width = 605 + Height = 21 + Anchors = [akLeft, akTop, akRight] + ItemHeight = 13 + TabOrder = 0 + Text = + 'The AccelChar (Alt+A) of the Address label will focus the ComboB' + + 'ox control' + end + end + object SpTBXToolbar2: TSpTBXToolbar + Left = 0 + Top = 49 + DockPos = 8 + DockRow = 2 + ShrinkMode = tbsmNone + Stretch = True + TabOrder = 2 + Caption = 'SpTBXToolbar2' + object SpTBXItem3: TSpTBXItem + Caption = 'Custom Sized Item (Width = 200)' + CustomWidth = 200 + end + object SpTBXSeparatorItem7: TSpTBXSeparatorItem + end + object SpTBXItem4: TSpTBXItem + Caption = 'Anchored Item' + Anchored = True + CustomWidth = 497 + end + end + end + object SpTBXMultiDock3: TSpTBXMultiDock + Left = 580 + Top = 72 + Width = 136 + Height = 457 + Position = dpxRight + object DP1: TSpTBXDockablePanel + Left = 0 + Top = 0 + Width = 136 + Height = 159 + Caption = 'Panel1' + DockPos = 0 + TabOrder = 0 + Images = ImageList1 + Options.Close = False + Options.Minimize = True + Options.Maximize = True + object SpTBXLabel1: TSpTBXLabel + Left = 8 + Top = 32 + Width = 0 + Height = 33 + Caption = 'Panel Properties:' + Wrapping = twWrap + Underline = True + UnderlineColor = clBlue + end + object SpTBXLabel8: TSpTBXLabel + Left = 8 + Top = 48 + Width = 58 + Height = 19 + Caption = '- Resizable' + end + object SpTBXLabel9: TSpTBXLabel + Left = 8 + Top = 64 + Width = 74 + Height = 19 + Caption = '- Can minimize' + end + object SpTBXLabel10: TSpTBXLabel + Left = 8 + Top = 80 + Width = 78 + Height = 19 + Caption = '- Can maximize' + end + end + object DP2: TSpTBXDockablePanel + Left = 0 + Top = 159 + Width = 136 + Height = 134 + Caption = 'Panel2' + DockPos = 159 + TabOrder = 1 + Images = ImageList1 + Options.ButtonBorders = False + Options.Close = False + Options.Minimize = True + Options.MinimizeImageIndex = 5 + Options.MaximizeImageIndex = 8 + Options.RestoreImageIndex = 6 + object SpTBXLabel11: TSpTBXLabel + Left = 8 + Top = 32 + Width = 0 + Height = 33 + Caption = 'Panel Properties:' + Wrapping = twWrap + Underline = True + UnderlineColor = clBlue + end + object SpTBXLabel12: TSpTBXLabel + Left = 8 + Top = 48 + Width = 58 + Height = 19 + Caption = '- Resizable' + end + object SpTBXLabel13: TSpTBXLabel + Left = 8 + Top = 64 + Width = 74 + Height = 19 + Caption = '- Can minimize' + end + end + object DP3: TSpTBXDockablePanel + Left = 0 + Top = 293 + Width = 136 + Height = 164 + Caption = 'Panel3' + DockPos = 293 + TabOrder = 2 + Images = ImageList1 + Options.ButtonBorders = False + Options.Close = False + Options.Minimize = True + Options.MinimizeImageIndex = 5 + Options.MaximizeImageIndex = 8 + Options.RestoreImageIndex = 6 + object SpTBXLabel15: TSpTBXLabel + Left = 8 + Top = 32 + Width = 0 + Height = 33 + Caption = 'Panel Properties:' + Wrapping = twWrap + Underline = True + UnderlineColor = clBlue + end + object SpTBXLabel16: TSpTBXLabel + Left = 8 + Top = 48 + Width = 58 + Height = 19 + Caption = '- Resizable' + end + object SpTBXLabel17: TSpTBXLabel + Left = 8 + Top = 64 + Width = 74 + Height = 19 + Caption = '- Can minimize' + end + end + end + object Panel1: TPanel + Left = 278 + Top = 72 + Width = 297 + Height = 457 + Align = alClient + BevelOuter = bvNone + TabOrder = 2 + object Image1: TImage + Left = 16 + Top = 248 + Width = 100 + Height = 72 + AutoSize = True + Picture.Data = { + 07544269746D617096540000424D965400000000000036000000280000006400 + 000048000000010018000000000060540000C40E0000C40E0000000000000000 + 0000CAE0DCCAE0DCC8DFDCC7DFDBC6DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDB + C5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DE + DBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5 + DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDB + C5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DE + DBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5 + DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDB + C5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DE + DBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5 + DEDBC5DEDBC5DEDBC4DEDBC2DCD9CACFD0B0B4B5B3BABAE4EEEFE0EDEFDFECEF + DFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFEC + EFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDF + ECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEF + DFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFEC + EFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDF + ECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEF + DFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFEC + EFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDF + ECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDEECEEDAE9EBC5C6C1C3C5C0 + C2C5C0C0C4C0BEC3BFBEC3BFBEC3BFBEC3BFBEC3BFBEC3BFBEC3BFBEC3BFBFC5 + C1DFE6E7DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DBE2E2DFE5E5DF + E5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5 + DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5 + E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DF + E5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5 + DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE6E7DDE4E5DFE6E8DFE6E8DFE6 + E8DFE6E8DFE6E8DFE6E8DFE6E8DFE6E8DFE6E8DFE6E8DFE6E8C1C6C3BEC3BFBE + C3BFBEC3BFBEC3BFBEC3BFBEC3BFBEC3BFBEC3BFBEC3BFBEC3BFBEC3BFBEC3BF + BACCC9B4CBC6B7B3A8B7B3A8B7B3A8B7B3A8B7B3A8B7B3A8B7B3A8B7B3A8B7B3 + A8B7B3A8B7B3A8B7B3A8BAB7ADFFFEFD92887F91877EA1968BA0968BCBBDB0B9 + ADA1A69B90968C82B2A69A9F948AAFA398A99E93FFEEDDFFEEDDFFEEDDFFEEDD + FFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEE + DDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFF + EEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDD + FFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFFA + F5FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFBEBAB1B7B3A8B7B3A8B7B3A8B7B3A8B7B3A8B7B3A8B7B3A8B7B3A8 + B7B3A8B7B3A8B7B3A8B7B3A8BBCDC4B1CBC1B8B4A9B8B4A9B8B4A9B8B4A9B8B4 + A9B8B4A9B8B4A9B8B4A9B8B4A9B8B4A9B8B4A9B8B4A9BBB7ADFFFEFEFFFAF5FF + FAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5 + FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFA + F5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FF + FAF5FFFAF5FFFAF5FFFAF5F9F4EFEFEBE5EFEBE5EFEBE5EFEBE5EFEBE5EFEBE5 + EFEBE5EFEBE5EFEBE5EFEBE5EFEBE5EFEBE5EFEBE5EFEBE5EFEBE5EFEBE5EFEB + E5EFEBE5F8F4EFFFFAF5FFFDFCFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBEBBB1B8B4A9B8B4A9B8B4A9B8B4A9 + B8B4A9B8B4A9B8B4A9B8B4A9B8B4A9B8B4A9B8B4A9B8B4A9E1E6E4EFF3F3B9B5 + AAB9B5AAB9B5AAB9B5AAB9B5AAB9B5AAB9B5AAB9B5AAB9B5AAB9B5AAB9B5AAB9 + B5AABCB8AEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F3F2EFF3F4EFF3F4 + EFF3F4EFF3F4EFF3F4EFF3F4EFF3F4EFF3F4EFF3F4EFF3F4EFF3F4EFF3F4EFF3 + F4EFF3F4EFF3F4EFF3F4EFF3F4EFF3F4EDEEEEFFFFFFFFFFFFFAFAFAFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBCB2 + B9B5AAB9B5AAB9B5AAB9B5AAB9B5AAB9B5AAB9B5AAB9B5AAB9B5AAB9B5AAB9B5 + AAB9B5AAE6EAE9F7FAFABAB7ACBAB7ACBAB7ACBAB7ACBAB7ACBAB7ACBAB7ACBA + B7ACBAB7ACBAB7ACBAB7ACBAB7ACBDB9B0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF2F3F2EEF3F4EAE8CBEBECDBCED2D3DBE0E1D6DBDCD6DBDCD1D6D7D3D7 + D8D4D8D9D6DADBD4D8D9ECF1F2EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4ECEEEEFF + FFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFC0BDB4BAB7ACBAB7ACBAB7ACBAB7ACBAB7ACBAB7ACBAB7 + ACBAB7ACBAB7ACBAB7ACBAB7ACBAB7ACE6EAE9F7FAFAB9B7ACB9B7ACB9B7ACB9 + B7ACB9B7ACB9B7ACB9B7ACB9B7ACB9B7ACB9B7ACB9B7ACB9B7ACBCBAB0FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F3F2EEF3F4C9B598E0D2BBC8CDCDC0C4 + C5C1C5C6C9CECEC4C8C9C2C6C6CED3D3CBCFD0CBCFD0EBF0F1EEF3F4EEF3F4EE + F3F4EEF3F4EEF3F4ECEEEEFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBDB4B9B7ACB9B7ACB9B7 + ACB9B7ACB9B7ACB9B7ACB9B7ACB9B7ACB9B7ACB9B7ACB9B7ACB9B7ACE6EAEAF7 + FAFABAB8ADBAB8ADBAB8ADBAB8ADBAB8ADBAB8ADBAB8ADBAB8ADBAB8ADBAB8AD + BAB8ADBAB8ADBDBBB1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F3F2EEF3 + F4EBEFF0ECF1F1EBF0F1EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4EE + F3F4EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4ECEEEEFFFFFFFFFFFFFAFAFA + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFC0BEB5BAB8ADBAB8ADBAB8ADBAB8ADBAB8ADBAB8ADBAB8ADBAB8ADBAB8ADBA + B8ADBAB8ADBAB8ADE6EAEAF7FAFABCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAF + BCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBEBCB2FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF2F3F2EEF3F4EAEBEBE1E4E4ABAFB0AEB2B2B3B7B7B4B8B9B5 + B9BAA5A8A9B7BBBCBDC1C2EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4 + ECEEEEFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFC1BFB6BCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBC + BAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAFE6EAEAF7FAFABCBAAFBCBAAF + BCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBEBD + B3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F3F2EEF3F4E9EDEEEBEFF0EE + F3F4EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4 + EEF3F4EEF3F4EEF3F4EEF3F4ECEEEEFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2C0B7BCBAAFBC + BAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAF + E6EBEAF7FAFABEBCB1BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1BEBC + B1BEBCB1BEBCB1BEBCB1C0BEB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 + F3F2EFF3F4E3E1DCDBDBD8CBCFD0CFD2D3C1C5C6C6CACBE5EAEAEFF3F4EEF3F4 + EEF3F4EFF3F4EEF3F4EFF3F4EEF3F4EFF3F4EFF3F4EFF3F4EDEEEEFFFFFFFFFF + FFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFC3C1B8BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1 + BEBCB1BEBCB1BEBCB1BEBCB1E7EBEAF7FAFABEBCB1BEBCB1BEBCB1BEBCB1BEBC + B1BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1C0BFB5FFFFFFF0F0F0D5 + D5D5D5D5D5D8D8D8CDCDCDD0D0D0E4E4E4D5D5D5EBEBEBD0D0D0C9C9C9D6D6D6 + D2D2D2D4D4D4E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF3F3F2F1F4F5E2E1DCE1E2DEDFE2E3DFE2E3E9EDED + DEE1E2EFF2F3F0F4F5F0F4F5F0F4F5F1F4F5F0F4F5F0F4F5F1F4F5F0F4F5F0F4 + F5F1F4F5EDEEEEFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C2B8BEBCB1BEBCB1BEBCB1BEBCB1 + BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1E7EBEAF7FAFAC0BE + B3C0BEB3C0BEB3C0BEB3C0BEB3C0BEB3C0BEB3C0BEB3C0BEB3C0BEB3C0BEB3C0 + BEB3C1C0B6FFFFFFFAFAFAE4E4E4D6D6D6E3E3E3D0D0D0DBDBDBE1E1E1E3E3E3 + E5E5E5D6D6D6D1D1D1DADADAE5E5E5EEEEEEF2F2F2FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F2F3F6F6E7E5DF + E8E7E3EAEDEEE2E5E6E4E6E7F1F4F5F3F6F6F3F5F6F3F5F6F3F5F6F3F5F6F3F5 + F6F3F5F6F3F5F6F3F5F6F3F5F6F3F6F6EDEFEEFFFFFFFFFFFFFAFAFAFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4C3B9 + C0BEB3C0BEB3C0BEB3C0BEB3C0BEB3C0BEB3C0BEB3C0BEB3C0BEB3C0BEB3C0BE + B3C0BEB3E7EBEAF7FAFAC1BFB4C1BFB4C1BFB4C1BFB4C1BFB4C1BFB4C1BFB4C1 + BFB4C1BFB4C1BFB4C1BFB4C1BFB4C3C1B7FFFFFFF3F3F3D7D7D7DDDDDDE3E3E3 + E0E0E0D9D9D9DADADAE5E5E5EFEFEFD8D8D8DEDEDEE2E2E2D7D7D7FDFDFDFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF3F3F2F5F7F7BFCBB1CACCBECDCECFD7D8D9CFD0D0EDEEEFF5F7F7F5F7 + F7F5F7F7F5F7F7F5F7F7F5F7F7F5F7F7F5F7F7F5F7F7F5F7F7F5F7F7EDEFEEFF + FFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFC6C4BBC1BFB4C1BFB4C1BFB4C1BFB4C1BFB4C1BFB4C1BF + B4C1BFB4C1BFB4C1BFB4C1BFB4C1BFB4E7EBEBF7FAFAC2C0B5C2C0B5C2C0B5C2 + C0B5C2C0B5C2C0B5C2C0B5C2C0B5C2C0B5C2C0B5C2C0B5C2C0B5C4C2B8FFFFFF + F1F1F1CFCFCFCDCDCDBFBFBFCECECEDCDCDCCCCCCCC5C5C5C3C3C3CACACAD8D8 + D8D3D3D3C8C8C8C4C4C4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F4F3F8F8F9F7F8F8F8F9F8F7F8F9F8F8 + F9F7F8F9F8F8F9F8F8F9F8F8F8F8F8F9F7F8F8F7F8F8F8F8F8F7F8F9F8F8F9F8 + F8F8F8F8F9F8F8F9EEEFEEFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7C5BCC2C0B5C2C0B5C2C0 + B5C2C0B5C2C0B5C2C0B5C2C0B5C2C0B5C2C0B5C2C0B5C2C0B5C2C0B5E7EBEBF7 + FAFAC3C1B7C3C1B7C3C1B7C3C1B7C3C1B7C3C1B7C3C1B7C3C1B7C3C1B7C3C1B7 + C3C1B7C3C1B7C4C3BAFEFEFEBFBFBFC7C7C7CFCFCFC5C5C5E8E8E8C7C7C7C7C7 + C7CDCDCDC5C5C5DCDCDCD3D3D3C2C2C2D8D8D8D7D7D7D5D5D5C4C4C4C9C9C9C1 + C1C1CACACAFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F4F3FAF9 + FACACACAACACACA1A1A1DADADAFAF9FAFAFAFAFAFAFAFAFAFAFAF9FAFAFAFAFA + FAFAFAF9FAFAFAFAFAFAFAFAF9FAFAF9FAFAF9FAEEEFEEFFFFFFFFFFFFFAFAFA + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFC7C5BDC3C1B7C3C1B7C3C1B7C3C1B7C3C1B7C3C1B7C3C1B7C3C1B7C3C1B7C3 + C1B7C3C1B7C3C1B7E7EBEBF7FAFAC4C2B8C4C2B8C4C2B8C4C2B8C4C2B8C4C2B8 + C4C2B8C4C2B8C4C2B8C4C2B8C4C2B8C4C2B8C5C4BAFFFFFFF1F1F1E9E9E9D6D6 + D6DFDFDFDDDDDDD9D9D9D0D0D0E8E8E8D0D0D0D5D5D5DCDCDCD9D9D9E3E3E3EC + ECECD1D1D1F1F1F1CECECEDFDFDFCBCBCBF2F2F2E4E4E4DEDEDEECECECDBDBDB + DADADAD9D9D9E7E7E7D5D5D5E0E0E0E9E9E9E0E0E0DEDEDEE0E0E0FFFFFFFFFF + FFFFFFFFFFFFFFF4F4F3FCFBFAE9E7E8DCDADBDBDADAEEEDEDFCFBFAFCFBFBFC + FBFBFCFBFBFCFBFBFCFBFBFCFBFAFCFBFAFCFAFBFCFBFBFCFBFBFCFBFBFCFBFB + EEEFEEFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFC8C6BEC4C2B8C4C2B8C4C2B8C4C2B8C4C2B8C4 + C2B8C4C2B8C4C2B8C4C2B8C4C2B8C4C2B8C4C2B8E8ECEBF7FAFAC5C3B8C5C3B8 + C5C3B8C5C3B8C5C3B8C5C3B8C5C3B8C5C3B8C5C3B8C5C3B8C5C3B8C5C3B8C6C4 + BBFFFFFFFAFAFABFBFBFE1E1E1D4D4D4DCDCDCD7D7D7E7E7E7DADADAD7D7D7DA + DADADCDCDCECECECF2F2F2F7F7F7F1F1F1F5F5F5ECECECEFEFEFE4E4E4F4F4F4 + DADADAE7E7E7E9E9E9E7E7E7ECECECEEEEEEF6F6F6F2F2F2EAEAEAEDEDEDE6E6 + E6EAEAEAE0E0E0FFFFFFFFFFFFFFFFFFFFFFFFF5F4F3FDFBFBFDFBFBFDFBFBFD + FBFCFDFBFBFDFBFBFDFBFBFDFBFCFDFBFBFDFBFBFDFBFBFDFBFBFDFCFBFDFCFB + FDFBFBFDFBFBFDFBFBFDFBFBEEEFEFFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9C7BEC5C3B8C5 + C3B8C5C3B8C5C3B8C5C3B8C5C3B8C5C3B8C5C3B8C5C3B8C5C3B8C5C3B8C5C3B8 + E8ECEBF7FAFAC6C4BAC6C4BAC6C4BAC6C4BAC6C4BAC6C4BAC6C4BAC6C4BAC6C4 + BAC6C4BAC6C4BAC6C4BAC7C5BCFFFFFFEEEEEEB8B8B8CBCBCBD0D0D0B8B8B8CE + CECEEAEAEADADADADBDBDBD9D9D9E4E4E4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 + F4F3EDEBEBDBD9D9DEDCDCE8E6E6E1E5E4DBE4E4DAE4E4D8E3E4D7E3E3D6E3E3 + D5E2E3D4E2E3D3E2E3D2E1E3D1E1E2D0E1E2CFE0E2CEE0E2EAF2F3FFFFFFFFFF + FFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFCAC8BFC6C4BAC6C4BAC6C4BAC6C4BAC6C4BAC6C4BAC6C4BAC6C4BA + C6C4BAC6C4BAC6C4BAC6C4BAE8ECECF7FAFAC7C5BBC7C5BBC7C5BBC7C5BBC7C5 + BBC7C5BBC7C5BBC7C5BBC7C5BBC7C5BBC7C5BBC7C5BBC8C7BEFFFFFFBBBBBBCC + CCCCCACACAD8D8D8C4C4C4DCDCDCC9C9C9CDCDCDBCBCBCCACACACDCDCDDFDFDF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFEAEEF3BFCBDDB1BED0B5C2D3BDCADCDCE4EAEBF0F0 + E9F0F0E8EFF0E6EFF0E4EFEFE3EEEFE1EEEFE0EDEFDEECEFDCECEFDBEBEED9EB + EED7EAEEEEF6F8FFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBC9C1C7C5BBC7C5BBC7C5BBC7C5BB + C7C5BBC7C5BBC7C5BBC7C5BBC7C5BBC7C5BBC7C5BBC7C5BBE8ECECF7FAFAC8C6 + BCC8C6BCC8C6BCC8C6BCC8C6BCC8C6BCC8C6BCC8C6BCC8C6BCC8C6BCC8C6BCC8 + C6BCC9C7BEFFFEFEE8E4DFE5E1DDECE8E3E9E4E0F2EDE8F0EBE6ECE8E3EDE8E4 + E6E2DEEDE9E4F3EEE9E9E5E0ECE8E3F0EBE6EFEAE6E7E3DEECE8E3E7E3DFEBE7 + E2EBE7E2EBE7E2F5F0EBF0EBE7EAE6E1E5E1DCE7E3DEEBE6E2F0ECE7EBE6E2EE + EAE5FFF9F3FFF9F3FFF9F3FFF9F3FFF9F3FFF9F3FFF9F3FBF6F2EDEDEEEDEDEE + EDEDEEEDEDEEF7F4F0FCF6F1FBF6F1FBF6F1FBF6F1FAF6F0FAF6F0FAF6F0FAF6 + F0F9F6F0F9F6F0F9F5F0F8F5F0F8F5F0FCF7F2FFF9F3FFFDFBFAFAFAFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCAC2 + C8C6BCC8C6BCC8C6BCC8C6BCC8C6BCC8C6BCC8C6BCC8C6BCC8C6BCC8C6BCC8C6 + BCC8C6BCE8ECECF7FAFAC9C7BDC9C7BDC9C7BDC9C7BDC9C7BDC9C7BDC9C7BDC9 + C7BDC9C7BDC9C7BDC9C7BDC9C7BDCAC8BFFFFEFDCDC0B2AA9F93B2A69AD3C5B7 + D3C5B7B6AA9EB2A69AB2A69AACA095C4B7AAD2C4B6BBAEA2BBAFA2B5A89CB5A9 + 9DABA094AEA296A0958ABEB1A4A79C91B6AA9ED9CBBCC8BBADB5A99DB5A99DBD + B0A3AFA398C7BAADA0958BD8CABBFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDD + FFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEE + DDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFF + EEDDFFFAF5FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFCDCBC3C9C7BDC9C7BDC9C7BDC9C7BDC9C7BDC9C7BDC9C7 + BDC9C7BDC9C7BDC9C7BDC9C7BDC9C7BDE8ECECF7FAFACBC9BFCBC9BFCBC9BFCB + C9BFCBC9BFCBC9BFCBC9BFCBC9BFCBC9BFCBC9BFCBC9BFCBC9BFCBC9C1FFFEFE + FFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFE + FEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFF + FEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFE + FFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFDFDFCF9F9 + F9F8F9F8F8F9F8F8F9F9F8F9F9F8F9F9F8F9F9F9F9F9F8F9F9F8F9F9FAFBFAFF + FEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFAFAFAFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCECCC4CBC9BFCBC9BFCBC9 + BFCBC9BFCBC9BFCBC9BFCBC9BFCBC9BFCBC9BFCBC9BFCBC9BFCBC9BFE8EDECF7 + FAFACCCAC0CCCAC0CCCAC0CCCAC0CCCAC0CCCAC0CCCAC0CCCAC0CCCAC0CCCAC0 + CCCAC0CCCAC0CCCBC2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF9F9F9E9EAEAE4E5E5E4E5E5E4E5E5E4E5E5E4E5E5E4E5E5E4 + E5E5E4E5E5E4E5E5E1E3E4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFA + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFCFCDC5CCCAC0CCCAC0CCCAC0CCCAC0CCCAC0CCCAC0CCCAC0CCCAC0CCCAC0CC + CAC0CCCAC0CCCAC0E9EDECF7FAFACDCBC1CDCBC1CDCBC1CDCBC1CDCBC1CDCBC1 + CDCBC1CDCBC1CDCBC1CDCBC1CDCBC1CDCBC1CDCBC2FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F6F6F6F6F6F6F6F6F6BC + BCBCC4C4C4C9C9C9BBBBBBDEDEDEF6F6F6F6F6F6E4E5E5FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFCFCEC5CDCBC1CDCBC1CDCBC1CDCBC1CDCBC1CD + CBC1CDCBC1CDCBC1CDCBC1CDCBC1CDCBC1CDCBC1E9EDEDF7FAFACECCC2CECCC2 + CECCC2CECCC2CECCC2CECCC2CECCC2CECCC2CECCC2CECCC2CECCC2CECCC2CECC + C4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 + F8F8F6F6F6F6F6F6F6F6F6EDEDEDF3F3F3F6F6F6F6F6F6F3F3F3F6F6F6F6F6F6 + E5E5E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0CFC6CECCC2CE + CCC2CECCC2CECCC2CECCC2CECCC2CECCC2CECCC2CECCC2CECCC2CECCC2CECCC2 + E9EDEDF7FAFACECDC3CECDC3CECDC3CECDC3CECDC3CECDC3CECDC3CECDC3CECD + C3CECDC3CECDC3CECDC3CECDC4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF8F8F8F7F7F7F7F7F7F7F7F7C9C9C9C7C7C7C4C4C4 + E4E4E4F7F7F7F7F7F7F7F7F7E5E5E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFD0CFC7CECDC3CECDC3CECDC3CECDC3CECDC3CECDC3CECDC3CECDC3 + CECDC3CECDC3CECDC3CECDC3E9EDEDF7FAFACFCEC4CFCEC4CFCEC4CFCEC4CFCE + C4CFCEC4CFCEC4CFCEC4CFCEC4CFCEC4CFCEC4CFCEC4CFCEC5FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F6F6F6F6F6F6 + F6F6F6E8E8E8F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1D0C8CFCEC4CFCEC4CFCEC4CFCEC4 + CFCEC4CFCEC4CFCEC4CFCEC4CFCEC4CFCEC4CFCEC4CFCEC4E9EDEDF7FAFAD0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF8F8F8F7F7F7F7F7F7F7F7F7D3D3D3CFCFCFE0E0E0F7F7F7F7F7F7F7F7 + F7F7F7F7E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D1C9 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5E9EDEDF7FAFAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F6F6F6F6F6F6F6F6F6F6F6F6F6F6 + F6F2F2F2F6F6F6F6F6F6F6F6F6F6F6F6E7E6E6FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFD2D1C9D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5E9EDEDF7FAFAD0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F7F7 + F7F7F7F7F7F7F7E7E7E7EFEFEFD8D8D8F2F2F2F7F7F7F7F7F7F7F7F7E7E7E7FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D1C9D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5E9EDEDF7 + FAFAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF8F8F8F6F6F6F6F6F6F6F6F6DBDBDBDBDBDBDEDEDEECECECF6 + F6F6F6F6F6F6F6F6E8E7E7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFA + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFD2D1C9D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5E9EDEDF7FAFAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F7F7F7F7F7F7F7F7F7F1 + F1F1DBDBDBDEDEDEEEEEEEF7F7F7F7F7F7F7F7F7E8E7E7FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFD2D1C9D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5E9EDEDF7FAFAD0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 + F8F8F7F7F7F7F7F7F7F7F7B3B3B39C9C9CA6A6A6D4D4D4F7F7F7F7F7F7F7F7F7 + E9E7E7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D1C9D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + E9EDEDF7FAFAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF8F8F8F6F6F6F6F6F6F6F6F6E4E4E4F4F4F4EBEBEB + EDEDEDF6F6F6F6F6F6F6F6F6E5E5E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFD2D1C9D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5E9EDEDF7FAFAD0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F7F7F7F7F7F7 + F7F7F7ABABABB8B8B8A4A4A4BDBDBDF7F7F7F7F7F7F7F7F7E9E8E8FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D1C9D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5E9EDEDF7FAFAD0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC6FFFFFFF3F3F3C2C2C2CDCDCDD0D0D0CECECEC8C8C8E6E6E6CBCBCB + C4C4C4C2C2C2CECECECECECEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF8F7F7F1DCA3F5E8B2E9C37DE8BF78E8BF78E8BF78E8BF78E8BF78E8BF + 78E9C483E0E0DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D1C9 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5E9EDEDF7FAFAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6FFFFFFF0F0F0DCDCDCCDCDCDE1E1E1 + D0D0D0CDCDCDD9D9D9CFCFCFEEEEEECBCBCBD9D9D9E4E4E4FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8E9C775EDD790E3A73AE8B967E8B5 + 5CE9B760E8B459E2A232E2A232E4A942E4E4E4FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFD2D1C9D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5E9EDEDF7FAFAD0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6FFFFFF + F7F7F7DDDDDDD3D3D3DBDBDBE0E0E0D8D8D8E6E6E6D4D4D4E4E4E4D8D8D8EAEA + EAF7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F0DA + B6F2E0C4EBCB94ECCD97EDD09DEDD09EEBCB93EACA90EACA90EBCD98E6E5C4FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D1C9D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5C0D1CAB1 + CAC1D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC6FFFFFFF6F6F6CBCBCBE2E2E2D3D3D3DBDBDBD2D2D2E8E8 + E8CECECEDBDBDBE8E8E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F4 + F4FEFEFEFFFFFFF8F8F8F7F7F7F7F7F7F7F7F7BBBBBBB8B8B8B6B6B6CDCDCDF7 + F7F7F7F7F7F7F7F7D2C39BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6 + F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9 + F9D2D1C8D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5B2C9BE94B7AAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6FFFFFFF1F1F1CFCFCFCDCD + CDBFBFBFCECECEDCDCDCBABABAD2D2D2DCDCDCCDCDCDD3D3D3FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF5F5F5BEBEBEFAFAFAFFFFFFF8F8F8F6F6F6F6F6F6F6F6F6EE + EEEEF6F6F6EAEAEAF2F2F2F6F6F6F6F6F6F6F6F6CECBC9FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFEDEDECD3CEC3CDC7BAB8AF9BC9C2B4CCC7B9E1DFD9ECEB + EAECEBEAECEBEAECEBEAECEBEAD1D0C7D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5B1C9BE93B7AAD0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C6FFFFFFF1F1F1DADADACDCDCDC3C3C3CECECED8D8D8CCCCCCC8C8C8C7C7C7C1 + C1C1D8D8D8D3D3D3C8C8C8C7C7C7FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5E2E2E2FFFFFFFFFFFFF7 + F7F7F6F6F6F6F6F6F6F6F6C7C7C7B0B0B0BEBEBEE9E9E9F6F6F6F6F6F6F6F6F6 + ABC0BAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBEBEADFDED8E6E6E3E5E4 + E0E5E5E1E3E2DDE5E4E0E9E9E7E9E9E7E9E9E7E9E9E7E9E9E7D1D0C7D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + B1C9BE93B7AAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC6FFFFFFF3F3F3BDBDBDD6D6D6D0D0D0C7C7C7D6 + D6D6EBEBEBDEDEDEDADADAFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1E0E0E0E7E7E7E3E3E3 + F0F0F0F1F1F1F1F1F1F1F1F1B5C1BDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFEDECEBD2CEC3D1CCC1C8C2B4CFCABFCAC4B6D7D3CACFCABECBC5B8D0CCC0C6 + C0B1E6E6E2D1D0C7D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5B1C9BE93B7AAD0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6FFFFFFF8F8F8C1 + C1C1D6D6D6D4D4D4C4C4C4D9D9D9E0E0E0D0D0D0DADADAF3F3F3F4F4F4FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8E3E3E3E7E7E7 + DADADAE0E0E0E6E6E6ECECECD6D6D6D1D1D1C9C9C9DFDFDFF6F6F6FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFECECEBDBD8D0E4E3DFDDDBD3E6E5E1E2E1DBE2 + E0DBDEDCD5DCDAD2E4E3DEE3E2DDE8E8E5D1D0C7D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5B2C9BE94B7AAD0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC6FFFFFFEDEDEDB1B1B1C6C6C6CBCBCBB1B1B1CACACAEAEAEAD2D2D2 + CECECED5D5D5DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF6F6F6BEBEBEBEBEBEB1B1B1BDBDBDCBCBCBE4E4E4DBDBDBE0E0E0E5E5 + E5E1E1E1F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBEBEAD5D1C8D0 + CBC1CDC8BCCAC4B6D1CDC3C8C2B4CBC5B8E8E7E5E9E9E8E9E9E8E9E9E8D1D0C7 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5B2C9BE94B7AAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6FFFEFED9D2CBD3CCC6D4CDC6D1CAC4 + CCC6C0D6CFC8ECE4DCD8D1CACAC4BED3CCC5CBC4BEE9E1D9D6CFC9D7D0C9D6CF + C8DED7CFDED6CFCBC5BFD0C9C3D8D1CADAD3CBFFF5EBFFF5EBFFF5EBFFF5EBFF + F5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EB + FFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5 + EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFF + F5EBFFFCF9EDECEBDAD7CFE2E0DAE0DED7D9D5CCE2E0DBE2E0DBD8D5CBEAEAE7 + EBEBE8EBEBE8EBEBE8D1D0C7D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5B2C9BE94B7AAD0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6FFFEFE + C8BEB4C9BFB5D5CABFD4C9BEC0B6ADCBC1B7D9CDC2DBD0C4C2B8AFCDC3B8CFC5 + BAD8CDC2CDC2B8D2C7BCD5CABFD9CEC3D5CABFC9BFB5D6CBC0D2C7BCD9CEC3FF + F1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3 + FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1 + E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FF + F1E3FFF1E3FFF1E3FFF1E3FFF1E3FFFBF7EBEBEAD8D5CDCFCABFD5D1C8D1CCC2 + D7D3CBCAC5B8E9E9E7E9E9E7E9E9E7E9E9E7E9E9E7D1D0C7D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5B2C9BE94 + B7AAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECEA + D9D6CDDDDBD4CFCABED1CDC1DDDAD3D0CBBFEAEAE7EAEAE7EAEAE7EAEAE7EAEA + E7D1D0C7D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5B2C9BE94B7AAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6EEEEEED7D7D7E2E2E2DEDE + DEDBDBDBE4E4E4DFDFDFE0E0E0E9E9E9DCDCDCD9D9D9E6E6E6DEDEDEDFDFDFD6 + D6D6DDDDDDD2D2D2CBCBCBEEEEEEE0E0E0F4F4F4DCDCDCEBEBEBDEDEDEDEDEDE + D4D4D4DBDBDBD7D7D7DFDFDFE0E0E0EAEAEAE8E8E8D3D3D3D8D8D8EAEAEADBDB + DBE3E3E3E4E4E4D8D8D8D9D9D9DEDEDEDADADADADADAD7D7D7DCDCDCD5D5D5E4 + E4E4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFECECEBDDDBD5D4D1C7D2CEC4D9D6CEEAEAE9EAEAE9EAEA + E9EAEAE9EAEAE9EAEAE9EAEAE9D1D0C7D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5B1C9BE93B7AAD0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C6EFEFEFEDEDEDDADADAE8E8E8EBEBEBEBEBEBF0F0F0F6F6F6F2F2F2F5F5F5E4 + E4E4EDEDEDEFEFEFF2F2F2F3F3F3E9E9E9F2F2F2EDEDEDE9E9E9ECECECE9E9E9 + E1E1E1EFEFEFEFEFEFECECECEDEDEDF0F0F0EEEEEEE7E7E7F1F1F1F1F1F1F2F2 + F2E7E7E7E7E7E7ECECECE7E7E7EDEDEDE8E8E8E2E2E2F3F3F3ECECECF2F2F2E1 + E1E1EDEDEDF0F0F0EBEBEBF2F2F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECEAD5D2C8D8D4CBD6D2 + C8DBD8D0EAE9E7EAE9E7EAE9E7EAE9E7EAE9E7EAE9E7EAE9E7D1D0C7D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + B1CABF93B8ABD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC6FAFAFAFAFAFAD5D5D5FAFAFAFAFAFAFAFAFAFA + FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA + FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA + FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA + FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA + FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA + FAF8F9F8F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9 + F9F9F9F9F9D2D1C8D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5B2CAC095B9ACD0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6D3D3D371717173 + 73739999999A9A9AA3A3A37979799D9D9D9595957979798686868787879A9A9A + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D1C9D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5B2C9BE94B7AAD0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC6AEAEAE6F6F6FADADADADADAD626262777777565656898989989898 + 8888889F9F9F737373B6B6B6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D1C9 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5B2C9BE94B7AAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9F8F8F8FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFD2D1C9D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5B1C9BE93B7AAD0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6FEFEFE + E4E4E4E3E3E3E2E2E2F0F0F0F8F8F8EAEAEAE4E4E4E7E7E7E7E7E7EAEAEAE0E0 + E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D1C9D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5B1C9BE93 + B7AAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5EBEAE7E7E7E4EBEAE7EBEAE7EBEAE7E8E8E5E5E5E1E9E9 + E6E2E2DFE8E7E4E7E7E4E7E7E4EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EB + EAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7 + EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEA + E7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EB + EAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7 + EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEA + E7D1D0C7D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5B1C9BE93B7AAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5B2C9BE94B7AAD0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5C5C4BAC6C5BBD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5CBCAC0C0BFB5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + B2C9BE94B7AAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5A5A49C7877719F9F97 + 91918A8E8D867D7D77B6B5AD7A79738F8F88888881908F88545450A3A29A6F6F + 69A7A69E898982888881888881888781AEADA5BDBDB36D6C678C8C859E9D9579 + 7872ADACA4797973A8A79F7776708E8D869998916E6E6899989145444193938C + 93928B8888818888818E8D867B7A748888818E8D86A7A69E8A8982D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5B2C9BE94B7AAD0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5A5A49C4F4F4B7776716565605454505A5A5661615C3A393764645F4241 + 3E7C7B7559585441403D71706B62625D5757533D3D3A4D4D49484844BEBDB4B1 + B0A775746E52514D5756524A4A465B5B5661605B5655514D4D4964645F4C4C48 + 73726C61605B5454504A49464545413A3A374645424646424A494653534F3F3F + 3C72716C8D8C85D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5B2C9BE94B7AAD0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5A09F9871716B9A9992919089676762C0BF + B6BCBBB2BAB9B0C3C2B9B8B7AEBAB9B0B0AFA6CAC9C0B1B0A8CBCAC08C8B84B6 + B5ACBEBEB474746EC2C1B7B8B7AE5D5C5875756FC8C7BEB5B4ABB9B8AFC5C4BB + C3C2B8B1B0A8908F88A6A59DB0AFA7C9C8BFB0AFA6C1C0B7B3B2AABCBBB2BAB9 + B0C3C2B8BABAB1BBBAB1BAB9B096958EA1A098D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5B2C9BE94B7AAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5B8CEC49FBFB3D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5BDCFC7AE + C8BED0D4CECDD1CCCED2CDCED2CDCDD2CDCDD1CCCED2CDCED2CDCDD1CCCDD2CD + CDD2CCCDD2CDCDD2CDCCD1CCCDD2CDCDD2CDCDD2CCCDD2CDC5CEC7C4CDC6C4CD + C6C4CDC6C4CDC6C4CDC6C4CDC6C4CDC6C4CDC6C4CDC6C4CDC6C4CDC6C4CDC6C4 + CDC6C4CDC6C4CDC6C4CDC6C4CDC6C4CDC6C4CDC6C4CDC6C4CDC6C4CDC6C4CDC6 + C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CD + C6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3 + CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6 + C2CDC6C2CDC6C2CDC6C2CDC6C2CDC6C2CDC6C2CDC6C2CDC6C9D1CCC8CFCAC9D1 + CCC9D1CCC9D1CCC2CDC6C2CDC6C2CDC6C2CDC6C2CDC6C2CDC6C2CDC6C2CDC6C2 + CDC6C2CDC6C2CDC6BACFCAB6CCC8DBE0E0C0C4C4E0E6E6E2E8E8D5DADAC0C4C4 + E2E9EAE1E5E6E4B39CE0B19EE1E8E8CDD1D1DAE1E2A7AFB0A4AEC0C5E0D080BD + 8DDCE7E8E4E3DDEDD3C6EFEFEFCDCDCDCFCFCFCECECECACACAD8D8D8C9C9C9B9 + B9B9CECECEC9C9C9D7D7D7C9C9C9CFCFCFCDCDCDC5C5C5C4C4C4C7C7C7CACACA + D0D0D0C8C8C8C5C5C5D2D2D2C2C2C2CFCFCFC1C1C1D4D4D4DADADACBCBCBF9F9 + F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1CA + C0A1C1B6CBDADDA9BDA9CAD2D2B0C0C3CCDFE2DAD0BDCDC8C1E2E2E2FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5E5E6E7E9E9D1D3D2 + E6EAE9E4E8E7E3E6E5CCCFCEE7ECEBE5E7E6F1D9CEE3BAAAEAEFEEE1E5E4E4E9 + E9CCAD9FC9C5C2DBE5E7C2DDD7D7E1E3E4E7E1EBDDD4EAEEEDE3E7E6EFF3F2E3 + E7E6E8ECEAE9EDECE9EDECE7EBEAEFF3F2E5EAE8F0F4F3EDF1F0E9EDECE7EBE9 + EFF3F1EDF1F0E7ECEAE6EAE8EFF4F2E8EDEBE1E6E4EEF2F0DDE1E0E5E9E7E8EC + EAF0F4F3E7ECEAE8EDEBF5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5 + F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8 + F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9 + F8F5F9F8F5F9F8F5F9F8BBD2C8ACC9BED3E4E7B7CEC3CCD8DAC4D6D8D5E8EBD7 + D4C2CBD4CFF5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8 + F5F9F8D2E4E4EBEEEDE9ECEBE9ECEBE9ECEBE9ECEBE8ECEBE8ECEBE8ECEBE8EC + EBE7ECEBE7ECEBE7ECEBE7ECEBE7ECEBE7EBEBE6EBEBE6EBEBE6EBEBE4EAE9E3 + EAE9E3E9E9E3E9E9E3E9E9E2E9E9E2E9E9E1E9E9E1E9E9CADEE2CADDE2E1E9E9 + DBE3E2D3D9D9DBE4E8D3DCE7DBE4E7E0E9E9DFE9E9DFE8E8DFE8E8DFE8E8DEE8 + E8DEE8E8DEE8E8DDE8E8DDE8E8DDE8E8DDE8E8DDE8E8DCE8E8DCE8E8DCE8E8DC + E7E8DBE7E8DBE7E8DBE7E8DBE7E8DAE7E8DAE7E8DAE7E8DAE7E8DAE7E8D9E7E8 + D9E7E8D9E7E8D9E7E8D8E7E8D8E6E8D8E7E8D8E6E8D8E6E8D7E6E8D7E6E8D7E6 + E8D7E6E8D7E6E8D6E6E8D6E6E8D6E6E7D5E6E7D5E6E7D5E6E8D5E6E8D7E7E9D7 + E7E9D6E7E9D6E6E9D6E6E9D3E5E7D3E5E7D3E5E7D3E5E7D2E5E7D2E5E7D2E4E7 + D2E4E7D1E4E7D1E4E7D1E4E7CFE3E6C7DBDFDFDEDDA8A7A6DCDBDAF4F4F29F9E + 9DBBBAB9F4F4F2B6B6B5B9B9B8DCDDDCF2F3F2A4A5A4E4E5E4DADBDAA9A9A9B3 + B4B3BBBCBBABACABC8C9C9F0F2F2C6C8C8B7B8B8BBBDBCEFF2F1B4B6B5A2A4A3 + D9DCDBBBDDE7B4C5C3DCE6E8AEC0C7C6BBB8DBDFF1A7B1F5D5DAEDECF1F1EBF1 + F1EBF0F0EBF0F1EAF0F1EAF0F1EAF0F0EAF0F0E9F0F0E9F0F0E8F0F0E8F0F0E8 + F0F0E7F0F0E7F0F0E7EFF0E6EFF0E6EFF0E6EFF0E6EFF0E5EFF0E5EFF0E4EFF0 + E4EEF0E4EFF0E4EEF0E3EEF0E3EEF0E3EEF0E2EEF0E2EEF0E2EEF0E2EEF0E1ED + F0E1EDF0E1EDF0E0EDEFE0EDEFE0EDEFE0EDEFDFEDEFDFEDEFDFECEFDEEDEFDE + ECEFDEECEFDDECEFDDECEFDCECEFDCECEFDCECEFDBECEFDBEBEFDBEBEFDAEBEF + DAEBEEDAEBEFDAEBEFDAEBEED9EBEED9EBEED8EBEED3DFE1C5C7D3CAD8DCF2F2 + F0EFEFEDF0F1EFF0F1EFF0F1EEEFF0EDF0F1EEF0F1EFEFF1EFEFF1EFEFF1EFEF + F1EFEFF0EFEEF0EEEEF0EFECEEEDEEF0EFECEFEDEDF0EEEDF0EEEDF0EEEDF0EE + EAEEECECEFEEEBEFEEEAEDECEBEFEEE4E9E8E0CDC3E9EDEDC7D7E0DBE1E1E9EF + EED6DCEFE9EFEEE9EEEEE9EEEDE8EEEEE8EEEEE8EEEEE7EEEDE7EEEDE7EEEDE6 + EEEDE6EDEDE6EDEDE6EDEDE5EDEDE5EDEDE5EDEDE4EDEDE4EDEDE4EDEDE4EDED + E3ECEDE3EDEDE3ECEDE3ECEDE2ECEDE2ECEDE2ECEDE2ECEDE1ECEDE1ECEDE1EC + ECE1EBECE1EBEDE0EBEDE0EBECE0EBECDFEBECDFEBECDFEBECDEEBECDEEBECDE + EBECDDEAECDDEAECDDEAECDDEAECDCEAECDCEAECDCEAECDCEAECDBEAECDBEAEC + DBEAECDAE9ECDAE9ECDAE9ECDAE9ECD9E9ECD9E9EBD9E9ECD8E9EBD8E9EBD8E8 + EBD1DDDED8E8EBCFDFE25884A0709CA398C0B696BCB38CB2AB94B9B292B6AF94 + BAB28EB8AE95BBB392B8B08BB2AB94B8B199BAB493B9B18AB2AA92BBB18DBDB0 + 97BBB393B8B18CB5AC95B9B292BBB18DB8AE91B7AF8FB7AF91B7AF8DBEB18EBF + B18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18E + BFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB1 + 8EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBF + B18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18E + BFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB1 + 8EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBF + B18EBFB193BFB289B2A696BBAF87B0A386A6C56D8EB46D95A48EAB9AA4C9C09F + C4BB9CC4B99BC3B99CC4B99EC5BB9AC3B8A5C8BF9BC4B99BC3B8A0C5BB9EC5BA + 9DC5BA9AC3B89DC5BA91BEB1A2C7BE99C2B7A1C6BC9CC2B89FC7BC99BFB69CC4 + B99EC3BA9CC4B990BEB191BEB191BEB191BEB191BEB191BEB191BEB190BEB190 + BEB190BEB190BEB190BEB190BEB190BEB190BEB190BEB190BEB190BEB190BEB1 + 90BEB190BEB190BEB190BEB190BEB190BEB190BEB190BEB190BEB190BEB190BE + B190BEB190BEB190BEB190BEB190BEB190BEB190BEB190BEB190BEB190BDB190 + BDB190BDB190BDB190BDB190BDB190BDB190BDB190BDB190BDB190BDB190BDB1 + 90BDB190BDB190BDB190BDB190BDB190BDB190BDB190BDB190BDB190BDB190BD + B190BDB190BDB190BDB190BDB190BDB19EC6BA9FC4B8B0CEC5ADCCC3A8C1D980 + 9CC0} + Visible = False + end + object SpTBXTabControl1: TSpTBXTabControl + Left = 0 + Top = 0 + Width = 297 + Height = 457 + Align = alClient + ActiveTabIndex = -1 + Images = ImageList1 + HiddenItems = <> + object SpTBXRightAlignSpacerItem1: TSpTBXRightAlignSpacerItem + CustomWidth = 210 + end + object SpTBXSubmenuItem2: TSpTBXSubmenuItem + Options = [tboDropdownArrow] + LinkSubitems = subLang + end + object tabLeft: TSpTBXItem + Action = Action1 + ImageIndex = 3 + end + object tabRight: TSpTBXItem + Action = Action2 + ImageIndex = 4 + end + object tabClose: TSpTBXItem + ImageIndex = 2 + OnClick = tabCloseClick + end + end + end + object SpTBXStatusBar1: TSpTBXStatusBar + Left = 0 + Top = 529 + Width = 716 + Height = 26 + ParentShowHint = False + ShowHint = True + object TBControlItem2: TTBControlItem + Control = SpTBXProgressBar2 + end + object SpTBXSeparatorItem2: TSpTBXSeparatorItem + end + object hintLabel: TSpTBXLabelItem + Caption = 'Custom painted hint' + OnDrawHint = hintLabelDrawHint + end + object SpTBXSeparatorItem4: TSpTBXSeparatorItem + end + object SpTBXLabelItem6: TSpTBXLabelItem + Caption = 'C:\Mozilla' + ImageIndex = 0 + Images = ImageList1 + end + object SpTBXSeparatorItem3: TSpTBXSeparatorItem + end + object subLang2: TSpTBXSubmenuItem + Caption = 'Languages' + Options = [tboDropdownArrow] + LinkSubitems = subLang + end + object SpTBXSeparatorItem5: TSpTBXSeparatorItem + end + object SpTBXSpinEditItem1: TSpTBXSpinEditItem + end + object SpTBXProgressBar2: TSpTBXProgressBar + Left = 0 + Top = 1 + Width = 140 + Height = 19 + Caption = '30%' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Shell Dlg 2' + Font.Style = [fsBold] + ParentFont = False + Position = 30 + end + end + object LangListBox: TSpTBXListBox + Left = 336 + Top = 424 + Width = 177 + Height = 81 + ItemHeight = 16 + Items.Strings = ( + 'English' + 'Espa'#241'ol' + #54620#44397#50612 + #26085#26412#35486 + #20013#22269#30340 + #1506#1489#1512#1497#1514 + #1593#1585#1576#1609 + #1056#1091#1089#1089#1082#1080#1081 + #917#955#955#951#957#953#954#940) + TabOrder = 5 + Visible = False + end + object ActionList1: TActionList + OnUpdate = ActionList1Update + Left = 376 + Top = 352 + object Action1: TAction + OnExecute = Action1Execute + end + object Action2: TAction + OnExecute = Action2Execute + end + end + object ImageList1: TImageList + Left = 408 + Top = 352 + Bitmap = { + 494C01010A000E00040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000003000000001002000000000000030 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 0000B7CEC400C5DED600C3DAD100C5DBD200C4DAD100C2DAD200C7E2DA000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000B7CEC400BCD1C500C6D8CE00CBDBD300CBDBD300C6D8CE00BDD2C700B8D0 + C500000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF0084B58400107310001873 + 18001873180018731800187B1800187B1800107B1000107B1000087B0800087B + 0800007B0000007300007BB57B00FFFFFF00000000000000000000000000BFD5 + CA00C8D9CF00DDE7E100E7EEEA00EEF3F000EBF1EE00E0E9E400CCDBD300B7CD + C00000000000000000000000000000000000000000000000000000000000B8CE + C100D4E2DB00E9F1EE00F0F6F400F0F6F500EFF5F300EDF3F100E4EDE900D0DF + D700BACFC3000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF0010841000218C21002994 + 2900319431003194310029942900299C2900219C210018A5180018A5180010A5 + 100008A5080000940000006B0000FFFFFF000000000000000000BBD0C400DBE6 + E000F7F9F800FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FDFEFD00E7EE + EA00C2D4CA000000000000000000000000000000000000000000BACFC300E0EA + E500F7FAFA00F6F9F800F7FAFA00F7FAFA00F6F9F800F4F8F700F1F6F500EEF4 + F200D8E5DF00BBD0C50000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00188C180029942900399C + 3900399C3900399C3900FFFFFF00A5D6A5004AA54A004AA54A004AA54A0029A5 + 290018A51800009C0000007B0000FFFFFF0000000000BCD1C600DDE7E100FDFE + FD00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00F1F5F300C3D5CB00000000000000000000000000B8CDC100E3ECE700FBFC + FC00FBFCFC00FBFCFC00FDFEFE001C674B00FDFEFE00FBFCFC00F8FBFA00F3F8 + F700EFF5F300D8E4DE00B9CFC300000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF0021942100399C390042A5 + 420042A5420042A54200FFFFFF00FFFFFF00A5D6A5004AA54A004AA54A0039A5 + 390021A5210008A50800087B0800FFFFFF00C2DAD200D1DFD800FBFCFC00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00ECF2EF00B9CEC20000000000BED5CB00D3E1D900FDFEFD00FEFF + FE00FEFFFE00FFFFFF001C674B001C674B001C674B00FFFFFF00FDFEFE00FAFC + FC00F4F8F700EDF3F100C9DAD100BBD6CC000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF0029942900429C42004AA5 + 4A0052A552004AA54A00FFFFFF00FFFFFF00FFFFFF00A5D6A5004AA54A0039A5 + 390021A5210010A5100008840800FFFFFF00BFD5C900EBF1EE00FFFFFF00FFFF + FF001C674B001C674B00FFFFFF00FFFFFF00FFFFFF001C674B001C674B00FFFF + FF00FEFFFE00FDFEFE00D1DFD700BED8CE00BCD1C600EEF3F000FFFFFF00FFFF + FF00FFFFFF001C674B001C674B00FFFFFF001C674B001C674B00FFFFFF00FDFE + FE00F9FBFB00F3F8F700DDE8E300BAD2C9000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00319C31004AA54A0052A5 + 52004AA54A004AA54A00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A5D6A50039A5 + 390021A5210018A5180010841000FFFFFF00C7D8CE00F9FBFA00FFFFFF00FFFF + FF00FFFFFF001C674B001C674B00FFFFFF001C674B001C674B00FFFFFF00FFFF + FF00FEFFFE00FBFCFC00E4EDE900BBD3CA00C4D6CC00FBFCFC00FFFFFF00FFFF + FF001C674B001C674B00FFFFFF00FFFFFF00FFFFFF001C674B001C674B00FEFF + FE00FBFCFC00F6F9F800E7EFEC00BCD3C8000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00429C420052A552004AA5 + 4A004AA54A004AA54A00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A5D6 + A500219C2100219C210018841800FFFFFF00CDDCD300FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF001C674B001C674B001C674B00FFFFFF00FFFFFF00FFFF + FF00FDFEFE00FAFCFC00EAF1EE00BCD2C900CCDBD300FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF001C674B00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FCFDFD00F9FBFB00EBF1EF00BED5CA000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF0042A5420052A5520052A5 + 52004AA54A004AA54A00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A5D6 + A500219C2100219C2100217B2100FFFFFF00CCDBD300FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF001C674B00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FCFDFD00F9FBFB00EBF1EF00BED5CA00CDDCD300FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF001C674B001C674B001C674B00FFFFFF00FFFFFF00FFFF + FF00FDFEFE00FAFCFC00EAF1EE00BCD2C9000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF0052A552005AAD5A005AAD + 5A0052A552004AA54A00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A5D6A5003194 + 31002994290029942900217B2100FFFFFF00C4D6CC00FBFCFC00FFFFFF00FFFF + FF001C674B001C674B00FFFFFF00FFFFFF00FFFFFF001C674B001C674B00FEFF + FE00FBFCFC00F6F9F800E7EFEC00BCD3C800C7D8CE00F9FBFA00FFFFFF00FFFF + FF00FFFFFF001C674B001C674B00FFFFFF001C674B001C674B00FFFFFF00FFFF + FF00FEFFFE00FBFCFC00E4EDE900BBD3CA000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF0052A552006BB56B006BB5 + 6B005AAD5A0052AD5200FFFFFF00FFFFFF00FFFFFF00A5D6A500399C39003194 + 31002994290029942900217B2100FFFFFF00BCD1C600EEF3F000FFFFFF00FFFF + FF00FFFFFF001C674B001C674B00FFFFFF001C674B001C674B00FFFFFF00FDFE + FE00F9FBFB00F3F8F700DDE8E300BAD2C900BFD5C900EBF1EE00FFFFFF00FFFF + FF001C674B001C674B00FFFFFF00FFFFFF00FFFFFF001C674B001C674B00FFFF + FF00FEFFFE00FDFEFE00D1DFD700BED8CE000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF005AAD5A007BBD7B0073BD + 730063AD63005AAD5A00FFFFFF00FFFFFF00A5D6A500429C4200429C4200399C + 39003194310031943100217B2100FFFFFF00BED5CB00D3E1D900FDFEFD00FEFF + FE00FEFFFE00FFFFFF001C674B001C674B001C674B00FFFFFF00FDFEFE00FAFC + FC00F4F8F700EDF3F100C9DAD100BBD6CC00C2DAD200D1DFD800FBFCFC00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00ECF2EF00B9CEC200000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF006BB56B008CC68C007BBD + 7B006BB56B0063B56300FFFFFF00A5D6A5005AAD5A0052A552004AA54A0042A5 + 4200399C390031943100217B2100FFFFFF0000000000B8CDC100E3ECE700FBFC + FC00FBFCFC00FBFCFC00FDFEFE001C674B00FDFEFE00FBFCFC00F8FBFA00F3F8 + F700EFF5F300D8E4DE00B9CFC3000000000000000000BCD1C600DDE7E100FDFE + FD00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00F1F5F300C3D5CB0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF0073BD73009CCE9C008CC6 + 8C007BBD7B0073BD73006BB56B0063B5630063AD63005AAD5A0052AD52004AA5 + 4A0042A542003194310018731800FFFFFF000000000000000000BACFC300E0EA + E500F7FAFA00F6F9F800F7FAFA00F7FAFA00F6F9F800F4F8F700F1F6F500EEF4 + F200D8E5DF00BBD0C50000000000000000000000000000000000BBD0C400DBE6 + E000F7F9F800FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FDFEFD00E7EE + EA00C2D4CA000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00B5DEB50073BD730063B5 + 63005AAD5A0052A5520052A552004AA54A004AA54A0042A54200429C4200399C + 390031943100218C21008CBD8C00FFFFFF00000000000000000000000000B8CE + C100D4E2DB00E9F1EE00F0F6F400F0F6F500EFF5F300EDF3F100E4EDE900D0DF + D700BACFC300000000000000000000000000000000000000000000000000BFD5 + CA00C8D9CF00DDE7E100E7EEEA00EEF3F000EBF1EE00E0E9E400CCDBD300B7CD + C000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 0000B7CEC400BCD1C500C6D8CE00CBDBD300CBDBD300C6D8CE00BDD2C700B8D0 + C500000000000000000000000000000000000000000000000000000000000000 + 0000B7CEC400C5DED600C3DAD100C5DBD200C4DAD100C2DAD200C7E2DA000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 0000B8BDBD000000870000007600110000006565650000000000000000000000 + 000000000000000000000000000000000000FFFFFF0084B58400107310001873 + 18001873180018731800187B1800187B1800107B1000107B1000087B0800087B + 0800007B0000007300007BB57B00FFFFFF00FFFFFF0052ADFF0018529400185A + 9C00185A9C00185A9C00185AA500185AA500185A9C00185A9C00185294001852 + 940018528C00184A84004AADFF00FFFFFF00FFFFFF0084B58400107310001873 + 18001873180018731800187B1800187B1800107B1000107B1000087B0800087B + 0800007B0000007300007BB57B00FFFFFF000000000000000000B8BDBD003232 + 32000000A9000000FF000000DD00000043005454540000000000000000000000 + 000000000000000000000000000000000000FFFFFF0010841000218C21002994 + 2900319431003194310029942900299C2900219C210018A5180018A5180010A5 + 100008A5080000940000006B0000FFFFFF00FFFFFF00185AA500186BBD001873 + CE001873CE001873CE001873CE001873CE001873CE001873CE001873CE00186B + C600186BBD00185AA500104A7B00FFFFFF00FFFFFF0010841000218C21002994 + 2900319431003194310029942900299C2900219C210018A5180018A5180010A5 + 100008A5080000940000006B0000FFFFFF000000000000000000767676000000 + 43000000FF000000FF0000008700003298002121210000000000000000000000 + 000000000000000000000000000000000000FFFFFF00188C180029942900399C + 3900399C3900399C390039A53900A5D6A500FFFFFF0021AD210018AD180010B5 + 100008AD0800009C0000007B0000FFFFFF00FFFFFF001863AD001873CE00187B + DE00187BDE00187BE7001884E700188CF700188CF700188CF700188CF700187B + DE00186BC6001863AD0018528C00FFFFFF00FFFFFF00188C180029942900399C + 3900399C3900399C390039A539004AA54A00A5D6A500FFFFFF004AA54A0031A5 + 310018A51800009C0000007B0000FFFFFF000000000088898900B8BDBE000000 + 4300000087000000EE000000FF000000CC000000320076767600000000000000 + 000000000000000000000000000000000000FFFFFF0021942100399C390042A5 + 42004AA54A0042A5420042A54200FFFFFF00FFFFFF00FFFFFF0021B5210018B5 + 180010AD100008A50800087B0800FFFFFF00FFFFFF00186BC600187BDE001884 + EF00FFFFFF0084C6FF00188CF700188CF700188CF700188CF70084C6FF00FFFF + FF001873CE00186BBD0018529400FFFFFF00FFFFFF0021942100399C390042A5 + 420042A5420042A542004AA54A00A5D6A500FFFFFF00FFFFFF004AA54A0039A5 + 390021A5210008A50800087B0800FFFFFF000000000000000000001100000000 + A9000000FF000000FF000000FF000000DD001111110000002100545454007676 + 76003200980000323200A0A2A20000000000FFFFFF0029942900429C42004AA5 + 4A0052A552004AA54A0042A5420042AD4200FFFFFF00FFFFFF00FFFFFF0018B5 + 180010AD100010A5100008840800FFFFFF00FFFFFF001873CE001884E700188C + F700188CFF00FFFFFF0084C6FF00188CF700188CF70084C6FF00FFFFFF001884 + E7001873D600186BC600185A9C00FFFFFF00FFFFFF0029942900429C42004AA5 + 4A0052A552004AA54A00A5D6A500FFFFFF00FFFFFF00FFFFFF004AA54A0039A5 + 390021A5210010A5100008840800FFFFFF0000000000B9BEBF00110000000000 + 87000000FF000000CC000000EE0000008700000087000000FF000000BA000000 + 870000006500767676000021000065656500FFFFFF00319C31004AA54A0052A5 + 520052A552004AA54A004AA54A0042A5420039AD3900FFFFFF00FFFFFF00FFFF + FF0018AD180018A5180010841000FFFFFF00FFFFFF00187BDE00188CF700188C + FF00188CF700188CF700FFFFFF0084C6FF0084C6FF00FFFFFF00188CF7001884 + E7001873D6001873CE00185AA500FFFFFF00FFFFFF00319C31004AA54A0052A5 + 52004AA54A00A5D6A500FFFFFF00FFFFFF00FFFFFF00FFFFFF004AA54A0039A5 + 390021A5210018A5180010841000FFFFFF000000000021212100000021000000 + A9000000FF0000004300000087000000FF000000FF0000007600000043000000 + 430076767600323265000000A90000006500FFFFFF00429C420052A55200FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00219C210018841800FFFFFF00FFFFFF001884E700188CFF00188C + F700188CF700188CF700188CF700FFFFFF0084C6FF00188CF7001884EF00187B + DE001873CE001873CE001863AD00FFFFFF00FFFFFF00429C420052A552004AA5 + 4A00A5D6A500FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0042A5420031A5 + 3100219C2100219C210018841800FFFFFF000000000088888800000098000000 + FF000000EE00000076000000EE000000FF000000EE0000003200110000005454 + 54000000EE000000FF000000DD0032326500FFFFFF0042A542005AAD5A00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00219C2100217B2100FFFFFF00FFFFFF001884EF00188CFF00188C + FF00188CF700188CF70084C6FF00FFFFFF00FFFFFF0084C6FF001884E7001873 + D6001873CE001873CE001863AD00FFFFFF00FFFFFF0042A5420052A5520052A5 + 5200A5D6A500FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00399C3900299C + 2900219C2100219C2100217B2100FFFFFF000000000011000000000043000032 + CC000000FF00000098000000FF000000FF000000EE00000076000000A9000000 + CC000000FF000000FF000000A90021212100FFFFFF0052A5520063AD630063AD + 63005AAD5A0052A552004AA54A00429C4200399C3900FFFFFF00FFFFFF00FFFF + FF00299C290029942900217B2100FFFFFF00FFFFFF00188CFF002194FF002194 + FF00188CFF0084C6FF00FFFFFF001884F7001884EF00FFFFFF0084C6FF001873 + CE001873CE001873CE001863AD00FFFFFF00FFFFFF0052A552005AAD5A005AAD + 5A0052A55200A5D6A500FFFFFF00FFFFFF00FFFFFF00FFFFFF00399C39003194 + 31002994290029942900217B2100FFFFFF000000000088898900000000000000 + A9000000FF000000EE0000007600000054000032CC000000A9000000EE000000 + EE000000BA0000006500BABEBE0000000000FFFFFF0052A552006BB56B006BB5 + 6B005AAD5A0052A552004AA54A00429C4200FFFFFF00FFFFFF00FFFFFF002994 + 29002994290029942900217B2100FFFFFF00FFFFFF00188CFF0039A5FF0039A5 + FF0084C6FF00FFFFFF00188CFF00188CFF001884EF001884E700FFFFFF0084C6 + FF001873CE001873CE001863AD00FFFFFF00FFFFFF0052A552006BB56B006BB5 + 6B005AAD5A0052AD5200A5D6A500FFFFFF00FFFFFF00FFFFFF00399C39003194 + 31002994290029942900217B2100FFFFFF000000000000000000000000000000 + 54000000FF000000BA000032CC000000A900000076003200CC00545454002121 + 21000000A900000000000000000000000000FFFFFF005AAD5A007BBD7B0073BD + 730063AD63005AAD5A0052A55200FFFFFF00FFFFFF00FFFFFF00319C3100319C + 31003194310031943100217B2100FFFFFF00FFFFFF002194FF0052ADFF004AAD + FF00FFFFFF002194FF002194FF001894FF00188CF7001884EF001884E700FFFF + FF001873CE001873CE001863AD00FFFFFF00FFFFFF005AAD5A007BBD7B0073BD + 730063AD63005AAD5A005AAD5A00A5D6A500FFFFFF00FFFFFF00429C4200399C + 39003194310031943100217B2100FFFFFF0000000000A0A2A200000000000000 + 54000000A90000005400000076000032FF000000760000005400212121000000 + 110000000000000000000000000000000000FFFFFF006BB56B008CC68C007BBD + 7B006BB56B0063B5630063AD6300B5DEB500FFFFFF004AA54A004AA54A0042A5 + 4200399C390031943100217B2100FFFFFF00FFFFFF0039A5FF006BBDFF0052AD + FF0039A5FF00319CFF00299CFF00299CFF002194FF00188CFF001884F7001884 + EF00187BDE001873CE001863AD00FFFFFF00FFFFFF006BB56B008CC68C007BBD + 7B006BB56B0063B5630063AD630063AD6300A5D6A500FFFFFF004AA54A0042A5 + 4200399C390031943100217B2100FFFFFF000000000000000000000000003232 + 3200000043000000CC000000A9000000DD00000065000000430000004300BBBF + BF0000000000000000000000000000000000FFFFFF0073BD73009CCE9C008CC6 + 8C007BBD7B0073BD73006BB56B0063B5630063AD63005AAD5A0052AD52004AA5 + 4A0042A542003194310018731800FFFFFF00FFFFFF004AADFF0084C6FF006BBD + FF0052ADFF004AADFF0039A5FF00319CFF00299CFF002194FF001894FF00188C + F7001884EF001873CE00185A9C00FFFFFF00FFFFFF0073BD73009CCE9C008CC6 + 8C007BBD7B0073BD73006BB56B0063B5630063AD63005AAD5A0052AD52004AA5 + 4A0042A542003194310018731800FFFFFF000000000000000000000000000000 + 00008888880021212100000043003232320089898900BDC0C100000000000000 + 000000000000000000000000000000000000FFFFFF00B5DEB50073BD730063B5 + 63005AAD5A0052A5520052A552004AA54A004AA54A0042A54200429C4200399C + 390031943100218C21008CBD8C00FFFFFF00FFFFFF00ADDEFF004AADFF00319C + FF002194FF00188CFF00188CFF00188CF700188CF7001884EF001884E700187B + DE001873CE00186BBD0063B5FF00FFFFFF00FFFFFF00B5DEB50073BD730063B5 + 63005AAD5A0052A5520052A552004AA54A004AA54A0042A54200429C4200399C + 390031943100218C21008CBD8C00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0000000000424D3E000000000000003E000000 + 2800000040000000300000000100010000000000800100000000000000000000 + 000000000000000000000000FFFFFF00FFFFFFFF00000000FFFFFFFF00000000 + FFFFFFFF00000000F00FF03F00000000F7EFF7BF00000000F7EFF7BF00000000 + F7EFF78F00000000F7EFF02F00000000F7EFF02F00000000F00FFDEF00000000 + F00FFC0F00000000FFFFFC0F00000000FFFFFFFF00000000FFFFFFFF00000000 + FFFFFFFF00000000FFFFFFFF000000008001F01FF00FFFFF0000E00FE007FFFF + 0000C007C003FFFF000080038001FFFF000000010000F81F000000000000F81F + 000000000000FFFF000000000000FFFF000000000000FFFF000000000000FFFF + 000000000000FFFF000000000001FFFF000080018003FFFF0000C003C007FFFF + 0000E007E00FFFFF8001F00FF01FFFFFFFFF800180018001F07F000000000000 + C07F000000000000C07F000000000000003F0000000000008001000000000000 + 0000000000000000800000000000000000000000000000008000000000000000 + 00010000000000008007000000000000800F000000000000E00F000000000000 + F03F000000000000FFFF80018001800100000000000000000000000000000000 + 000000000000} + end + object Timer1: TTimer + Enabled = False + Interval = 50 + OnTimer = Timer1Timer + Left = 344 + Top = 384 + end + object OpenDialog1: TOpenDialog + Filter = 'Skin files|*.skn' + Left = 344 + Top = 352 + end +end diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Overview/Unit1.pas b/official/2.2.2+2.4.2/SpTBXLib/Demos/Overview/Unit1.pas new file mode 100644 index 0000000..1dcf388 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Demos/Overview/Unit1.pas @@ -0,0 +1,431 @@ +unit Unit1; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, + Dialogs, ExtCtrls, StdCtrls, ActnList, ImgList, ExtDlgs, ComCtrls, + // TB2K + TB2Item, TB2Toolbar, TB2Dock, TB2ExtItems, + // SpTBXLib + SpTBXSkins, SpTBXItem, SpTBXDkPanels, SpTBXTabs, SpTBXEditors, SpTBXControls, + SpTBXExtEditors; + +type + TForm1 = class(TForm) + SpTBXDock1: TSpTBXDock; + SpTBXMultiDock1: TSpTBXMultiDock; + SpTBXMultiDock3: TSpTBXMultiDock; + SpTBXDockablePanel1: TSpTBXDockablePanel; + SpTBXToolbar1: TSpTBXToolbar; + Panel1: TPanel; + SpTBXTabControl1: TSpTBXTabControl; + SpTBXRightAlignSpacerItem1: TSpTBXRightAlignSpacerItem; + tabClose: TSpTBXItem; + SpTBXSubmenuItem1: TSpTBXSubmenuItem; + SpTBXSubmenuItem2: TSpTBXSubmenuItem; + SpTBXItem2: TSpTBXItem; + tabRight: TSpTBXItem; + tabLeft: TSpTBXItem; + SpTBXToolbar3: TSpTBXToolbar; + SpTBXLabelItem3: TSpTBXLabelItem; + SpTBXItem7: TSpTBXItem; + subColor: TSpTBXSubmenuItem; + SpTBXLabelItem4: TSpTBXLabelItem; + subLang: TSpTBXSubmenuItem; + subSkins: TSpTBXSubmenuItem; + SpTBXSkinGroupItem1: TSpTBXSkinGroupItem; + SpTBXTabControl2: TSpTBXTabControl; + SpTBXTabItem1: TSpTBXTabItem; + SpTBXTabSheet1: TSpTBXTabSheet; + ActionList1: TActionList; + Action1: TAction; + Action2: TAction; + SpTBXButton1: TSpTBXButton; + SpTBXStatusBar1: TSpTBXStatusBar; + SpTBXSeparatorItem2: TSpTBXSeparatorItem; + hintLabel: TSpTBXLabelItem; + SpTBXSeparatorItem3: TSpTBXSeparatorItem; + ImageList1: TImageList; + SpTBXLabelItem6: TSpTBXLabelItem; + SpTBXSeparatorItem4: TSpTBXSeparatorItem; + subLang2: TSpTBXSubmenuItem; + Image1: TImage; + SpTBXSeparatorItem5: TSpTBXSeparatorItem; + SpTBXSeparatorItem8: TSpTBXSeparatorItem; + SpTBXTabItem3: TSpTBXTabItem; + SpTBXTabSheet3: TSpTBXTabSheet; + SpTBXGroupBox5: TSpTBXGroupBox; + SpTBXLabel2: TSpTBXLabel; + SpTBXLabel3: TSpTBXLabel; + SpTBXLabel4: TSpTBXLabel; + SpTBXLabel7: TSpTBXLabel; + SpTBXLabel5: TSpTBXLabel; + SpTBXToolbar2: TSpTBXToolbar; + SpTBXItem1: TSpTBXItem; + SpTBXSeparatorItem6: TSpTBXSeparatorItem; + SpTBXItem3: TSpTBXItem; + SpTBXItem4: TSpTBXItem; + SpTBXSeparatorItem7: TSpTBXSeparatorItem; + SpTBXLabel6: TSpTBXLabel; + DP1: TSpTBXDockablePanel; + DP2: TSpTBXDockablePanel; + DP3: TSpTBXDockablePanel; + SpTBXLabel1: TSpTBXLabel; + SpTBXLabel8: TSpTBXLabel; + SpTBXLabel9: TSpTBXLabel; + SpTBXLabel10: TSpTBXLabel; + SpTBXLabel11: TSpTBXLabel; + SpTBXLabel12: TSpTBXLabel; + SpTBXLabel13: TSpTBXLabel; + SpTBXLabel15: TSpTBXLabel; + SpTBXLabel16: TSpTBXLabel; + SpTBXLabel17: TSpTBXLabel; + Timer1: TTimer; + SpTBXGroupBox6: TSpTBXGroupBox; + progressDec: TSpTBXButton; + progressInc: TSpTBXButton; + progressAnimate: TSpTBXButton; + SpTBXProgressBar1: TSpTBXProgressBar; + progressFiles: TSpTBXCheckBox; + SpTBXProgressBar2: TSpTBXProgressBar; + TBControlItem2: TTBControlItem; + SpTBXTrackBar1: TSpTBXTrackBar; + SpTBXComboBox1: TSpTBXComboBox; + TBControlItem3: TTBControlItem; + SpTBXPanel2: TSpTBXPanel; + Memo2: TMemo; + SpTBXSplitter1: TSpTBXSplitter; + SpTBXSplitter2: TSpTBXSplitter; + SpTBXTabItem6: TSpTBXTabItem; + SpTBXTabSheet6: TSpTBXTabSheet; + SpTBXButtonEdit1: TSpTBXButtonEdit; + SpTBXComboBox2: TSpTBXComboBox; + SpTBXEdit1: TSpTBXEdit; + SpTBXSpinEdit1: TSpTBXSpinEdit; + LangListBox: TSpTBXListBox; + rgSkinType: TSpTBXRadioGroup; + SpTBXGroupBox1: TSpTBXGroupBox; + SpTBXGroupBox2: TSpTBXGroupBox; + trackTickmarks: TSpTBXRadioGroup; + skinButton: TSpTBXSpeedButton; + SpTBXDockablePanel2: TSpTBXDockablePanel; + OpenDialog1: TOpenDialog; + SpTBXSeparatorItem1: TSpTBXSeparatorItem; + SpTBXColorPalette1: TSpTBXColorPalette; + SpTBXItem5: TSpTBXItem; + SpTBXSpinEditItem1: TSpTBXSpinEditItem; + Panel2: TPanel; + SpTBXSpeedButton1: TSpTBXSpeedButton; + SpTBXSpeedButton2: TSpTBXSpeedButton; + SpTBXSpeedButton3: TSpTBXSpeedButton; + SpTBXColorEdit1: TSpTBXColorEdit; + SpTBXFontComboBox1: TSpTBXFontComboBox; + procedure FormShow(Sender: TObject); + procedure tabCloseClick(Sender: TObject); + procedure ActionList1Update(Action: TBasicAction; + var Handled: Boolean); + procedure Action1Execute(Sender: TObject); + procedure Action2Execute(Sender: TObject); + procedure SpTBXTabControl2Resize(Sender: TObject); + procedure rgSkinTypeClick(Sender: TObject); + procedure hintLabelDrawHint(Sender: TObject; + AHintBitmap: TBitmap; var AHint: WideString; + var PaintDefault: Boolean); + procedure progressDecClick(Sender: TObject); + procedure progressIncClick(Sender: TObject); + procedure progressAnimateClick(Sender: TObject); + procedure Timer1Timer(Sender: TObject); + procedure SpTBXProgressBar1ProgressChange(Sender: TObject; + NewPosition: Integer); + procedure progressFilesClick(Sender: TObject); + procedure TrackbarTickMarksRadioClick(Sender: TObject); + procedure skinButtonClick(Sender: TObject); + procedure SpTBXSpeedButton1Draw(Sender: TObject; ACanvas: TCanvas; + ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); + private + { Private declarations } + procedure LangClick(Sender: TObject); + public + AppPath: String; + end; + +var + Form1: TForm1; + +implementation + +uses + Registry; + +{$R *.dfm} + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Utility functions } + +function SpGetWindowsDir: String; +var + Z: Cardinal; +begin + Z := GetWindowsDirectory(nil, 0); + if Z > 0 then begin + SetLength(Result, Z); + GetWindowsDirectory(PChar(Result), Z); + Result := IncludeTrailingPathDelimiter(Result); + end + else + Result := ''; +end; + +function SpGetWinAmpDir: String; +var + Registry: TRegistry; +begin + Registry := TRegistry.Create; + try + Registry.RootKey := HKEY_CURRENT_USER; + // False because we do not want to create it if it doesn't exist + Registry.OpenKey('\Software\Winamp', False); + Result := Registry.ReadString(''); + if Length(Result) > 0 then + Result := IncludeTrailingPathDelimiter(Result); + finally + Registry.Free; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Form } + +procedure TForm1.FormShow(Sender: TObject); +var + A: TSpTBXItem; + D: String; + I: Integer; +begin + // Set skin type to sknTBX + SkinManager.ChangeControlSkinType(Self, sknSkin); + + // Add the Languages to the Languages menu item and TabControl + for I := 0 to LangListBox.Items.Count - 1 do begin + A := TSpTBXItem.Create(nil); + try + A.Caption := LangListBox.Items[I]; + A.GroupIndex := 100; + A.AutoCheck := True; + A.Tag := I; + A.OnClick := LangClick; + subLang.Add(A); + with SpTBXTabControl1.Add(LangListBox.Items[I]) do + Tag := I; + except + A.Free; + end; + end; + + // Select the first Language + subLang.Items[0].Click; + SpTBXTabControl1.ActiveTabIndex := 0; + SpTBXTabControl2.ActiveTabIndex := 0; + + // Load default button Skin + AppPath := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)); + + // Initialize the link labels + D := SpGetWindowsDir; + if Length(D) > 0 then begin + SpTBXLabel4.LinkText := D; + SpTBXLabel5.LinkText := 'explorer.exe'; + SpTBXLabel5.LinkTextParams := '/e, ' + D; + end; + D := SpGetWinAmpDir; + if Length(D) > 0 then + SpTBXLabel6.LinkText := D + 'winamp.exe'; + if FileExists(AppPath + 'unit1.pas') then + SpTBXLabel7.LinkTextParams := '"' + AppPath + 'unit1.pas' + '"'; +end; + +procedure TForm1.LangClick(Sender: TObject); +var + A: TSpTBXItem; +begin + A := Sender as TSpTBXItem; + subLang.Caption := A.Caption; + subLang2.Caption := A.Caption; + SpTBXTabControl1.ActiveTabIndex := subLang.IndexOf(A); +end; + +procedure TForm1.tabCloseClick(Sender: TObject); +begin + SpTBXTabControl1.Visible := False; +end; + +procedure TForm1.ActionList1Update(Action: TBasicAction; var Handled: Boolean); +var + L, R: Boolean; +begin + SpTBXTabControl1.ScrollState(L, R); + Action1.Enabled := L; + Action2.Enabled := R; +end; + +procedure TForm1.Action1Execute(Sender: TObject); +begin + SpTBXTabControl1.ScrollLeft; +end; + +procedure TForm1.Action2Execute(Sender: TObject); +begin + SpTBXTabControl1.ScrollRight; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Options Panel } + +procedure TForm1.rgSkinTypeClick(Sender: TObject); +begin + SkinManager.ChangeControlSkinType(Self, TSpTBXSkinType(rgSkinType.ItemIndex)); +end; + +procedure TForm1.skinButtonClick(Sender: TObject); +var + S: string; + I: Integer; +begin + S := AppPath + 'Skins'; + if DirectoryExists(S) then + OpenDialog1.InitialDir := S; + + if OpenDialog1.Execute then + if FileExists(OpenDialog1.FileName) then begin + // Load the skin file and add it to the SkinList + I := SkinManager.SkinsList.AddSkinFromFile(OpenDialog1.FileName); + if I > -1 then begin + // Set the new skin + SkinManager.SetSkin(SkinManager.SkinsList[I]); + // Recreate the SkinGroupItem + SpTBXSkinGroupItem1.Recreate; + end; + end; +end; + +procedure TForm1.SpTBXTabControl2Resize(Sender: TObject); +begin + SpTBXButton1.Left := (SpTBXTabControl2.Width - SpTBXButton1.Width) div 2; + SpTBXProgressBar1.Left := (SpTBXTabControl2.Width - SpTBXProgressBar1.Width) div 2; + SpTBXTrackBar1.Left := (SpTBXTabControl2.Width - SpTBXTrackBar1.Width) div 2; +end; + +procedure TForm1.SpTBXSpeedButton1Draw(Sender: TObject; ACanvas: TCanvas; + ARect: TRect; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +var + SB: TSpTBXSpeedButton; +begin + if PaintStage = pstPrePaint then begin + PaintDefault := False; + SB := TSpTBXSpeedButton(Sender); + SpDrawXPHeader(ACanvas, ARect, SB.MouseInControl, SB.Pushed, sknSkin); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ StatusBar } + +procedure TForm1.hintLabelDrawHint(Sender: TObject; + AHintBitmap: TBitmap; var AHint: WideString; var PaintDefault: Boolean); +var + R, GR, TR: TRect; + WS: WideString; +begin + PaintDefault := False; + AHintBitmap.Width := Image1.Picture.Bitmap.Width + 115; + AHintBitmap.Height := Image1.Picture.Bitmap.Height + 30; + with AHintBitmap.Canvas do begin + Brush.Color := clInfoBk; + Font.Color := clInfoText; + R := Rect(0, 0, AHintBitmap.Width, AHintBitmap.Height); + FillRect(R); + + GR := Bounds(5, 5, Image1.Picture.Bitmap.Width, Image1.Picture.Bitmap.Height); + Draw(GR.Left, GR.Top, Image1.Picture.Bitmap); + + WS := 'Language: ' + subLang.Caption + #13#10 + + 'Skin: ' + SkinManager.CurrentSkinName + #13#10 + + 'Time: ' + TimeToStr(Now); + TR := Rect(GR.Right + 5, 10, R.Right, R.Bottom); + SpDrawXPText(AHintBitmap.Canvas, WS, TR, DT_WORDBREAK); + + Font.Color := clBlue; + Font.Style := [fsUnderline]; + TR := Rect(GR.Left, GR.Bottom + 5, R.Right, R.Bottom); + WS := 'http://www.silverpointdevelopment.com'; + SpDrawXPText(AHintBitmap.Canvas, WS, TR, DT_WORDBREAK); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ ProgressBar } + +procedure TForm1.progressDecClick(Sender: TObject); +begin + SpTBXProgressBar1.StepIt(-10); + SpTBXProgressBar2.StepIt(-10); +end; + +procedure TForm1.progressIncClick(Sender: TObject); +begin + SpTBXProgressBar1.StepIt(10); + SpTBXProgressBar2.StepIt(10); +end; + +procedure TForm1.progressAnimateClick(Sender: TObject); +begin + SpTBXProgressBar1.Position := 0; + SpTBXProgressBar2.Position := 0; + Timer1.Enabled := True; +end; + +procedure TForm1.Timer1Timer(Sender: TObject); +begin + SpTBXProgressBar1.StepIt; + SpTBXProgressBar2.StepIt; + if SpTBXProgressBar1.Position >= SpTBXProgressBar1.Max then + Timer1.Enabled := False; +end; + +procedure TForm1.SpTBXProgressBar1ProgressChange(Sender: TObject; + NewPosition: Integer); +var + I: Integer; + WS: WideString; +begin + if progressFiles.Checked then begin + I := (NewPosition div 10) - 1; + if I < 0 then I := 0; + if I > LangListBox.Items.Count - 1 then I := LangListBox.Items.Count - 1; + WS := 'C:\Lang\' + LangListBox.Items[I] + '.txt'; + SpTBXProgressBar1.Caption := WS; + SpTBXProgressBar2.Caption := WS; + end; +end; + +procedure TForm1.ProgressFilesClick(Sender: TObject); +begin + if progressFiles.Checked then + SpTBXProgressBar1.CaptionType := pctDefault + else + SpTBXProgressBar1.CaptionType := pctPercentage; + SpTBXProgressBar2.CaptionType := SpTBXProgressBar1.CaptionType; + SpTBXProgressBar1ProgressChange(SpTBXProgressBar1, SpTBXProgressBar1.Position); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TrackBar } + +procedure TForm1.TrackbarTickMarksRadioClick(Sender: TObject); +begin + SpTBXTrackBar1.TickMarks := TSpTBXTickMark(trackTickmarks.ItemIndex); +end; + +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/Demos/Overview/hint.bmp b/official/2.2.2+2.4.2/SpTBXLib/Demos/Overview/hint.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3d32889374993e8296f61a903c26949cad1bccbd GIT binary patch literal 21654 zcmeHPX?GmenP&dLe4d{$pXbBmgfmPAPT&wG943J=B#<-ULk=@1fH8&`C&Nra61-w; z%QCi+EibaXXl-r1srP-~wDi7Kch}NY-Rjn2NnYmZE~#kTimKX3wqdCA=<2QazO~$^ z-}~OJZ$I_?sh1vW9RG;)@A3C0{+`9(-#qqrNFRIbb>y4>mj7!gkT}zEz@CcRQZZ{X zX89f)F&Otkng zPm%S9k8NEIddo&zH+g{yuPXzFdFL+qWcfrIv{n9|oBMQLfdL<2OVx zsTdUde6~KnTC0|8^Y;Ok%8E+fFA9xvcXr3N&5!E5(2)G-{cc z7i@h#?^jH@Qkt7u`Y&{oZcU-H343i;f(c;6P4X!k!VkO)9e4ZI1pK@dbLuGT8^3p`-ZDzwLyu??>D+EGy$^b;r>x+@?DgyeEL zkQ0l=GMNnId_E6lAP|T~qmVg{t5&PxT!>kKtJ>mXF`pufIhy6N`2tZWf*dGo3x6Gp zi)^`#{*~FJ6fHgsc)v2}#zbK<$WgLdtu{M5n@A+UPdc5BL?S#n<#HLGmP{tI*(?lh z-@YwIgQR?LwXn3LbIF`;t;g$|4M%)_Kg*S&+#GFjWi_isiw}b$!ysN6_2Z&28x<(t z+}xbc=R@t&>2zMNHy)3>-END;VltVWPABLJg+g|_-E1~X;zG=5e!h0|=JL`_BsZ7v zSC{K)19dI3>bdpwD<$+?JAP%eOo|pC20T~r8Bv%`sylb?fFhgC2D-oxNs^FpfI6Il zHxOks8o?M`3qcHwA%YnU2GA&FtkKFGxLR3W!R7t^{TDA@gb(BNt3!~R1<1=QZE~d% zEj|o*uHZAGu$Wc6Um<8CG^J80)Wk?6f~W=3kb)f01r4fasZ>Jjf)m2`VCizX5WW!T zP)U)6D2GzRvREwQD%54%6De|$HZumUZmq6RMKT_(U&FC1PH(NQejU)P+*4go1NpaQfkEiHklg@py2B9wup z`T2Pmz!gqaftqagJ%d59hXK!()vOW)Dm5O20xA>=_z4^d0^9}#1PO2z_z5`K@MZ2>39eX% z!L5_=I9VuU@rH3rYK?!W6t0|h zooMl4K$c4IE1N|v3cF2oU!1am%&BOJkz5RnkCCMPGMgn$}%-^{dLNOLuvDC z%VVL!RG1GNT3OH4uH!I{xF+rD0b~K1;meqFwy6d#bRG^n z)!Q=dENu?i<1&dB9|k;EE{9G64D~tWhlks@Z!Iq`uXnE?tf8T-%PXrZt*#@2Z9AT{8GqG=+Z|7*zPHfUL-aOLw@#Eb9LQw^>>E`tO-WUkOT zM<0Vf(3J2UU9>gmmGMe&*!tN?;>v50P<#W1?eHtF+b98BGi+%sjzmo}SLlynWXe+{ z2>E=W^;S~2^82h3if>%w%4711XbYzgNxlr9zjWd&(*rGG{-AU`0!j|-a~M<@3~s1>TWYvqobo;U0uDsy_iN5xWc@c zU@QpV*Fk>r5DRVSlnQka>qi1bg7E*AE5U{O`uZ@_*wfRa(P#uEMUnzVg76Tz!hiy+ z517-#yeK9`v1Ef@4W>!ag@zs)9Kw5Ut$^OuT>SC^IYOB}CUqa(1IqlTbUM}g#D~Zg z)}1jI3a&8a4!R&<>KNTZ#8@!49n;7{@e!{m+lTDzvE0?iN#$GQ_-mB>b#m+%*-QTb z5Z9mDa0dG!as`LS@(sGpXok>j#_|^Y3IP`H2^n+mFc3<&wF0=RL?^0gGvhj0@_fPi z&$0gVjH`oo9s?N9=|X;k5$hImr4Kk|PJ@&lJ_h3`I|3>E2aC%*UHIw(hGwXDpbo;; zlEdE(3qV+xgxuT?Vk!plYGPsnjxEHipy|uj7r+Z+;%oCG7_duWV8o$4DZe4blIIE? zn|s!sRVo!2<0~czY<=5rqQR<}R;%TG16&DB9=~1&H*Oy0cwLUxXR&N4;J!H0Pz{72vlj~gBy28~#46qJ4X`fBez2gA^*BmzY)Po(qtOfH*%fF;UiY!g># z2hmJp-5G%$FAM>l9E>$UVDn3^uC6wpZix(+77m0;jQ+5|jkZQmjvF+s4`NG9&}#~~ z4R+(0~oCuT!VpHu6yDEw}{RWBc;B=a`A-Bb4)>4_sjL$LacOWY{>r2k~To#?*VS-IGye(X{ zy7(inDV6BRj3*JBLOc(642fvS@6y4knz0>Rp;v?N4xtf8!-qhDaDj-5FpGv8{VT+I z#9L%RiI9ufg*b+&f~#PIun!x)(S!|}2HXL6+gXHk z*yAP$jL4GsDIvBeV$)LrThMEc%-~x+SdYCI61i%te}!pV#CE(h%7s$nK$DG-iw+^; zD&8Ntu)!(XL=Xr88VG2xkRtpd7Y9zE$F-ml?Hb?c!x%CSw}J+_xSYQV z&&8=^uITBYJv`-_3EI&h(p0e(Qn_;KIuw0UdadZUqkD-1A1g0>D^h&_VezeKK3M|SVty=Tv!GiT16J$v@@<;(l_?K^kwTxVw|gik;HbpQVS&`bQpA00D^ zYZGntuLcJPckS9W&^UJP+_`t}-W@x396WgN^y$+F4jkz2?got*&ptXNNPLs+;A-rXU4)<~GHgR>Or|YA=ySux;IDY)l(a%2p_~X43;{(6jx99WE(O~}Z*yjgcdg?)QGPbLX#Ke)+{Go_PHE z=YR6-vp?2q#$>}+Km6d`pa1Onmv{X9x#ymF_0=73y#DHrfBzW_aQRPv`s|+f--ZUa zeeNgEJpJ^Ok3ar{XP$oQnP;BD>5DJE@S`97)BC&M{_MzKHZS;n8_|FsL{aWqV2Oqp^G{|A_ ztJhxn@WWl$eK0=Or&J7C%xaTS0b@91@0D}ILsuPk9qwSz%ST6UtlwFoQpwaR8E$^6 z^XSD3r|*M}%`e#|t~P(@w=`GbHFxVqzojq#fL~kVvkls{{wc2~;PwVRfCmudfV+Mg zow*L zCZMoVpj0Yx3IQ`tNckm2?8n4%23CJyhUE+_jX{GsE_@LJ23YdIq!uQ8Fy)2eQfu#e z3pFyQ{-R;R6-`{%Tz3Y8!+MiDm5ur}9=kzUV%zX>)A<5c%L1VwelLZ<9_&Ki?ei8( zOukr{i+FRY8+4h&W;BAL+ymVXi!qij8WXd#*ria+Fo`LeV{^qqxmHC=mS}7)0MN6C zCQp+UY-*dUG&EGXHV3&_q6;)xp0AQDgJ1sPs+B}0oyT^{5)EVILcg$lb6cSf+WQ^a z5K)wSP3~~iJQJQKnb|3$Ys$CzbAtrIa4c0~1YlF40Fd@IFic?`1Wn}tY7JS60x;$Q zoXM;+k%bV;WkZojj37htVvHza3N;0gB#$IX^1#YdGvXwruJjOjA{vWczkYpmY*am|?(6TfI~kVn2;0SJIwOLJU>N0zGy$gmY2_%S^JDg3ZryfA-+Nd`v<|M3)&=ZF1i}m#N@XmzkTV>wRx6kuuFRDi;K~)q9OQB{DrF9nzLj!` zW9uoVlPjD6n!{#Y{E`VrW09%M5fqvB)HfQ~X4Ciu2dd1?#LGx24q!=+<5A>T9tDmq zU>k1(d6wmYDQN+@5}RY$dRk($O~{nk21*$QVAFM!fYdsYOo>N=E(wU!B>^$I#3M?T z1VpG(gkq3}DW(pR2_%w8eW~m#f4=Zu*X7gtiBprKM@ITiDo0LC44qVs990Znbj=X?Lzn*l0GOigB>(^b literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/LICENSE.txt b/official/2.2.2+2.4.2/SpTBXLib/LICENSE.txt new file mode 100644 index 0000000..79e0329 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/LICENSE.txt @@ -0,0 +1,9 @@ +Use and/or distribution of the files requires compliance with the +SpTBXLib License, found in SpTBXLib-LICENSE.txt or at: + + http://www.silverpointdevelopment.com/sptbxlib/SpTBXLib-LICENSE.htm + +Alternatively, at your option, the files may be used and/or distributed under +the terms of the Mozilla Public License Version 1.1, found in MPL-LICENSE.txt or at: + + http://www.mozilla.org/MPL \ No newline at end of file diff --git a/official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXColorPickerForm.dcu b/official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXColorPickerForm.dcu new file mode 100644 index 0000000000000000000000000000000000000000..21beb9dce94091cf63b3d8de7123a83ac713fa92 GIT binary patch literal 20785 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 O?`oM0OTp=vIsXS38C{S7 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXControls.dcu b/official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXControls.dcu new file mode 100644 index 0000000000000000000000000000000000000000..0386cd34ba898f6e0263d937f4bba3bd5c43a3f3 GIT binary patch literal 176659 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

W|4-NZz$VwE_n`*^2M%!fXRwWJ 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 z zC(J6%)GF<|RStMpqg8xFjEIe>Y!2<;JY?6S!|6B-83}K->(NH_n4~vX&IMrzoq>1m zkrv*mbyL30gm|(x7uOxrJOO|7ziN6QG7nvmO?c5}DM?PuJ>ts)oi>jI+y-#$2*a z-kr6WdP^Bs14PGZOB_2Ucr@i*({BX_)NArCsmbDfJ1X`{`_r(o;hPwJQLl2;%> z;UA2J<=?|lDh9*`HzIs;B)AD`~%TM>Vronu7n6 zsbyT}5Y;j&|M}Fi-T|dbS*!l}RMLITxTYhHlu`N5r&jDeWU5$f^*^6#KDPPg7h}5IF5|7qeCa{XC_ zcVxjhdF^xWzk2mJPVZN!-`(S;eD8>YsvcfEPCmR~oMr{>Mo|5@DX;edbQVCLGocJ3dCI`Kt0uJal~Q04Hi!eu)Q^8^lVt5{NH* zmKBst_R&^oGTF1OP`m7>J3eKyKTT!-l*#@y9wN_w?%AH{&wTEgIq=a*^3|+vd93b+ zpz&Y7iw?LQ-y?@2&oV<$-;bm}9(mE(-z9$|LBoP?$kz@n9yiY4>G^bMs9^1&=I`_m z4h>BodP)Owx=pEvca46E9wYKbT20^99{V(M_`|&*6KQqK=eTP-hH$dA{c`Pd#T7T- z^smoCGyI!tJ}yNFKX=T90O>q{Kxq*i*TC`7e3;Xbb9+-j|DnCt%6NGC9K3bk zJTBtw+}-LfrZP<5-Q`^SS9xLE+sJAe6+#z$?Z@QqOSd3Le{A@bC*zv$x<;v?Db9D4W~{f87O#i}8IU zywk2-1uq+C`y&M}7e@;AGeaBIzl{`}>pP~6C*Y@D1#dw~Km9W{yu}-iO&=<&9Sw?A z4P9B)^;s0-bfn;uwY#;hg6H5Q0y+ff@%^r1nK@V4>4>~em*Zrl;JLN4NL%`Cj!3~t zkmEHbN2KhzE(zKq1nPdP*A<+k5$v0wcw4OVf9Ez69?tb@s!1{~Yoz29Kxk(D4x~?4*VBtPsTm)wbgeRKM>H&G}5n z06iTDIAKxJB4vlWtsR6)ZVq7N0EUR&^-yte%`OupkV z4X5wEvAn#hD^U9{U^@e53aObP-4UsWO!JJWFIQ-Sz z?)i@5M9XN*R1+&AFGdbg+LYeh@qU=*tCdA-UpPJY->IO_nxTRa>g+F|B4@hW4{w2g z%;h5$9tiP6L!a^A)9Qe*2kr|l#0&yU*gZExr5*!yMb@^TBW-LpbrqajI|q4@Hifm8 zX*#&8;Qj7`7ff1MK;rmfP|hV%@MnM>gV$^D64)E_<7A}$H9#%;++P0!zXWFBkZ*NA zf{#i^o&~4>+&p>wkQ0z?33=Pd?lRP4S9VQ4hPQ;uBFeU}(KDR>d_!I4-eW~L= zu@8&25Q{%N3>2MGF$5b2P_f^`~5c#_Hg*YU7ue4*g*-Ioduc@i9Q`3=hq z3p!u_LdCJW4_!M{^p?M~5X@|JzYR`xGczZ9MkC9X-}6!{Ec2(CfnJH6-h1yNCm|lt z`T2XVhBN2%m$*Ycf6uF}ehRGmCf?9wYX0qdPnK{hBvE(RQ__rQ$Xh3 zwuc<}!!fdP#~Y;YrFX~^Kl?R#?X{!i$SZ#&Z=Eer(1Bm<)!`>`FEsBkt;^D)GDTeU}pd?U40y|+^FllQadE}8qSS`7js*R}5 zJ@O>lZ@EQK6RJgiw-Xn)1gfV9G)2|F_O-8Br8I$B6dSqfcB?<(7APjQy6ZxLz68J+ z8BHLwq^WqX`~+{TU9)BlsolMMH>rK;$Wa1=6)@;)QEcR@#f)mu05XRXMwNSs;Q@XD zyM6n1gJ=ve^+JI>R7Sv^(TTX2))DBHo=7(-Mk2GoH)0)yiD|*2qnKW5BkHsgoso>F zh)qgVwi2C|jHrlBN>s5DO)9B~O-2-aL@{j|J$dpZH)(B*51K&BJn2m{O27R5$EUKGiU%e_tuT~tQE(f~?BGaAE!jgi+z zSH1|kB6c{s%0v39z>mm03on`xZJE*Y7Im)I%P{>NiIq9q+qh*)eiE!jK9Xk@mh zmZhPk|A{Pt1qK7N8^cmQ_y!I$9M+%F1m~fZq{OP*YJJvLYH8KIxV@N7T zBFTb?1q<^%egFm3Xpv&F2x7q|iy)x5h3GI**~D6i_I}2oVonx%27+XZLMNkd!CL6s zh{Dve5KU%V3)V{18jFDYNK;aKEaDlLv5cBnEsE2fk6BD0GJ!FH2*Z!58VrSr)uI@n zI8j@)a0);Wf5$+>l*<*)B`;f~p3YSU#yIZKQ$J!K1Bs#DB}5MpBXA z+|%Ehw&sM|>Rr<}xaNe^tiT&=7q??J{MW#mw_(q?=52SI8rhCnG34*;s>EyhM(rfq zsC|NIcTtxA=VjnXk!eHA=SJ}27I0{r=Kp!Y=wf)w!nbsM3*egv-?ZZHqLY!bPxSFQ z@ePp7Bt&OoA|Z{XJ^P>YHbX&!m{ z^l7#l0#Mu?p#SXzUCabs@KwN?nYK8ij91-#AqcZ{x+?s@*+_&_eVm)>JmejC+?W{+UR0pZK?*snpk}Y zU}Us^{|-PLIdKPIlZAVN5xV}dI{x$c!M1}tLVy!?0MXOuVEbu0*vcng z5lm*mYEf(yhQg{6#5j>I`htM94uu7)JEJiawKjRh++H3=UJ)B3FQwb^`YBSo6YU_T z_j2_0lOH9qgNTixYqbNonVICvbWS9+g9SUB9i%7Hcq9W?w~d?4X3mSi%EMwsn~5@5 zZ6 zl$~yZ+&xAMGany@8)#u-t+995Bwr8GF&RExGVl$EC(guKNWGX0pGFmYgV9Y)7czVv zLF_R=dSa~LKsMixiCHFApR48-F55hjFM_U!jZascC#DR;#}*SCLpLV22-_L^f^W40 z455i-botsGL)6?*3?Hye?C=50#Kr_HtFYh~Cf05QabFWNUxY1)efhV}POyiGwa-qw zzgf06_E>8ZUBv35n`>E&yyiY&`1x&Owdk8~zG>uEHYXN$EW_JbB)b34=9bCo6qX&! zFiv5?GN;fz?O&heI~%;GkPqK)P)owFuOXPE>lfEI#vU=r zf{C@}l`$)n2^@wf42X%f5QWDJ#T;+}e63)Zgy?l`GY7oidqFwix^?E=_n6TVb3hUJ zzyoWA5dce>KrM=mg6mq+Ps?@K>gpR41I>(1hQ-;G5j&X?0a%+rEt-^~na;`Z%)v^7 zbqqxlI1EKG?-MD;*ilUSk^;>vZWtL&pvB;S*Cp2&am8FuFewTA0mfr;~qpFp(A_(5i()91D8SI_}dLU{8J(6SR#tW{Lqo zSp;n%akX^?m*81qeA5X4Bqq+p1q-ewwKS|zhc_vq>Ck!ghz719@Q5d{2}sUEpk(J^ zK8q1w53m{+!p?)vGaAuQ84FO0qLN$>^I3}oJWRkaJVcd!e$kZ8oS4N!%eW(S~X0+UgMK{0`rHLW&g^h_Y5Xl_@8Z5D9;j2@L>EUh%S zRm^>lEV_X$X8=kjkgez@N1Lf(aWS!0!`R}32(%Lgj(nFB-wy>qa$mOqty!_TlL8*` z{Llm-4>2>eS`&tjON+iPY;}Y^8Q%FXAWZ~+{mI;q&G22&e(c@9n)f7NRT2_E(9hgv z$US}66{`yx@8n{{Xwg9y#HYVJ-ncFNY>;LTgg|HL=MH8q+u~E3- z5TlQ|(}Ei}XWuip|NP(ATZx)LEsBi^#T2(>qT(^E#VuJ)%iO<2$xoVc7*MSEXlG+!(eifYg+=dsn`NXjRwJ0_wCMxciv>U zNx$G@44vHqA~wbXXZQSnqGHx3S3Z6HKg26pHmvo@mE>6KlPk%wisdPn{=q!!PeA zwbYsM&4SgU*eLk1m9AxL6XSALx)!XRF5J}MPbSq`S%5fZejdZ3y1JUwo;h=dy;-oB z#8f90Jqg_y(M_yfbep^o22AWQ@>;Ml@_yJp#p>&>GELS|FoG;GIm%vd2MRa6-OKvz8k|}gN=N3JYDS;$J%Kndf$~6 z#c&z>!r1q^p53n~2P>W)t;5}BNVAcyG zY5~R&rFn`$8QfPS3iYD;YwxU~rXsa}KK2^!giWj##YRC`8(niBO2;ZGT@gDRU2(^# zPkGZ{Z1RfO7`lcD_=t%cOfe(05`_^nfs813te9YG?($-SlQrl8Q4<>z^oAaV+-I;k z6NX}QC60oL1-j2ZEGA!8x)!XRuCUXz#Z?eT+yYXkFtZyg3k%lHqShw5xMLhnbP*d% zmuG@}@XYO-HJyL_VTjXos9!w{*`&EE#i;P%*}oa{(&`RiIFaH9@4aIHtrRUl3q|^6 zA>#eKMf5W&A^J=g{ZfF_`e#i}<3~H-YYr+#FM|)7WG#iabbJfon+M;trQJoR^)DS* z^YPfW5PYU1Oa63<+;RhaXnyV6(o*=)d@;>C;p6gapOGRj@K39kox2Vj=N8kH9O}zX z&okSwY3*)FXw=)pkBI0`pRF-=y8rfX;wR&5pAUcW#TUg8Vzny_fVkN``scR|yV{8g zKrM=me451o#a%Jpz!eso81CjaR*oj+ZUPy1A=1SVHMg;Bo^wfK?k1Z+>r==vDvA5u zXZJiKsuY72x4bqieRhIMfe!_M@x_g)_@GJ*QE_8xBl^4F{Z3dvfvC6*z4g{AW1wPy z;x;rXP~3)!z{ehYOkfRjPuwoTu!wfL=bn2KVYMhW3L{!qXW6J&x1lp;%n<2*_OqWA z>55n_ij5{+VVlbL@HS53mQ#)<=OkidIGK$JIEkCk_?(b?Exy^F9kc0V64E(Ay1|D5 zY8qO)1oP0)3**E$9GDBtZavIhL}=k+TPGJ-Fi}^tB|%r~mRICzwj}6k-2sbT&6WgR zts7#otJ%W4{$M{`(E0k#v!wQwPX_T(Ky!aAM-RSfxvH{y)2o7AEm$pzji%ex+USb= z*x~4kSUX+oty!FIwe)kIfBMs(sA$&hY)r}%6AjI6vi^*@@vM=JE_j%U9fqz28$;J- z8S72mTF~`DA7cMREM)=gdacci`{6FBcGbNjjklG*r9!3G*Ag+kJN^BI80-N&IUFC32 zAZ`G0+VQnM#sf^?a3f{iRVE=S3)|1(h>BP?Ok7f%`ig~Ua`i>5m1s;LFn5Z>Ojt-D zOl-`AwbHfhY=@z1!N$g(Sz6-kg&*Tz znZ~Xy7_-Q>7Z$&}z`*cJ7UD)2N0l4(fGz@%I+z8wJB!;`Wzm=o- z$ve)SKCvw>&?eCSM0kwu!Z#eS;LM4}1cXEz;TV;~jj&Cn7_7Jv9u8~X)s0z3{?VVo zLeWgq!LW&YZM2k-s>EQ$y|(zp1u;NzubmVq?zQRXnd5%9pKY%#I(EzlKlpACFR{@N zewcYZh$%e!AncEEV~DzQkFkDmzych`4Pk3!3SjkZ{HVKWc?(dBKJ`?xYwzZ+7bO+# zM6aRr|^-@I?}I%2Bf>y?+=plX#Mi#-`3=aI?|1Y>Z-@-b&Yk zjZYW9N3s^>1L7>=%pjiGDxVHk6fF4{+!7&duD>~M6&jS(Bl#B@dMaCEJkC|tx7 z(-pCHy22*PK7_LIn5uD8#YhE&4Hv`|^PVL8PN7&z0)l;{(xfDQ)fww9-Wa65P8TWN zUB#^yHVSG}EPb|=7S2jH*%zESg#C<$Ph!eI%G`|URhB&$Ls@oA ztjeho;yn!rYHlCQi1!$*l26cJ{p+h8!Upo}v5*A<#(U`bwW~{@+IS|&w zTJvy9R1BUba2TTC#wON66mK>0J54g=$SdF*(OMyE#(!{+34TuEobeq3)A;vzJ-;>^ zo@jJDzcz;*F2h4~3v}5DUuZq_6oi8z`Xn0sK1B4JSdBGLVH>TEycHd5)WV0-^xD%q z&%ogFoceV1asy-bJQs!ZnMD5Zl-cdvUieW1EZTL$LM72_FV zhAo;ZMq(4lB<8GRC_07j*sLX&pF0uxSR-l-$+kisK3|18r_QXJl7D5_qenqEs zj#*Gz6dU8KY{|f_!-6uHgJ=P2(If&|^7P1yoUctl5tURxONO3MUlEmz9N5|Xo`Yoi zT7VXP<7fNggM%?%B__P0S6NLAEKQ(=r8x}r%#y|@Q^EqYP)zU*2r&Yg*`%d=trZA- z5&&ZoOgc5G4XjU|q0NLiOHD|b;2Y2%CK-*u&-oO?o2M9DKQUJPeyx~MGLuQGO>uoR zM*v321Zq)ihX;JzX}qanz^yg_8VpomIF4h%0Q*GcD*35=m=jm|=5ohVcRUlWxq zwt(lEKtW$y9ge7Bj?G{lb@1~t#6Rq9{5j!bsv220U^2gQ&(%q6Z4q5bR0pWYoJ-`?>i@y=UMp4|U2?ayib;Sa~j-~RR?`P=&+k)D6sK^hyrNw9A4 zqakwl-QOW!`cf0QYjsaT+HajWLv}{@k#9sc;&&>OAN_bcJtD0mM}ACBzxQYI{)exV zUp&8_+_Gi`t$Y9dcSu|JP2`IevqG}KUPBpTZ{zy&7uemSyzw>P5J{)>s zwWQm|z04AG<;XV?D?A`$UC|)iI3fZV2T@;KBfmiZpuY&i0+|I1-_Fi)_aV+A0PGVTos901V!6fDVkXP8hK;y6-zWFA<;!KL`|$IW+aaG zZjq)<`#5md#ld~a;P{2+)}b)rTI8GPsL8Am5NTUXjPrB(^5rlLCdRZvtX+d5CG4zw z3;cjo8W7>lkhVe48j5E{r$~WX(HO?aeK?n_diq5;n!#|-SZwM=V6}u;j2(gubU!J$ zeHAndZvP0zzh$POEO0IIpN6=%*vR5jmI7IfY{|%qaFHxVOHo?fTnc1MhaoG%MY48j zag!;K9Zp&iE|SF!$p_r;O>?#2T!G`j#pK{h*ey5AHmbOF>YU2N22ozN5ng1_Af17YZ0@`hz<eKCXQYvVAV8=L>|F)ciA%V zy)2U~-p?B5B7s3V9yY?_)H3jj#8l}e0-cQAzd@W!3~|5%t^Qpb=R$!gk8q(Na$l@x zj}__KJ=JQEsI#F`Z8_MX`;)&SX}xXFlvY9`hs z9=XpR5^(n}jFdf`*+)u*i)3*gS{JL4B3bJU&{qsoJ&@LfLym^)3O8GvNnm1QeTywd zCTSQE6K*AqTMgsJ8Qd4MZT>GO)8KD9)Wg?(T=nhyK_>j296a)?|Hkj+;16`_pOadw z@eK>RwFW;Ngukj8q1)5q$XYZ79H_ypx3?k@9MPTl*c%JMYpW1z>H=mGZ*oO&EQQs9 z?gp1feu-mv!wnX&nWjeK5EX7@MTRA6f^l16e)uwGQ)S+uVs|$60cF1!X`n$&6Ud&0 z;3H4B%U~)@o#B9MA!ZrE{j5l25t_iTnArMlj1TZ-e&7JSN3YBLqVzas5NwWQ zVugE0!(xToM;2`D(3=||H2z^RyuJBdeEveXe*|C33!gAC%v`&*=c@qw7{A3A-Yi%x zij9I_{B27)JfZl_S@0RweO36`2$Ak5J6DQypWXEnAo(JE5DDKbSS|WsM_8o$$xlP1 z_T%qe4%pNGVf`X)_{NAsk0qgNy{TlQYm-;JV( z#t*D)2m|N*zJ@6b%o2Vp3EIW`4-t$#hA_A~SuZ1*Sc^EZ@xlZ`ytl-Q$dfj*U@sGG zAuHV608{W#fnlHDieNekv7uPFPr({vTpqfccNB(mc?%eX(`^&0ut3tLaBP4yu`EF9 zL}?0QKE0DD3Aqwdf>;0YK6&x=)1?2%De~rfLuB1g4$(`gIIe&A%X#waKYU1jw*M?S zbo@iI<+)Sj)CZrE56*u|j=cFX`NEA~C%w-PkY|p3$bL-xX&}h2u)`H-xWcYyFSDRP zlMhRBgja{HcScxpbS2y)nMZ$xF$@So4jw*A`ksH0{Op%|2tJvS47lVw z|JtSG3)d_ppPx336ciMYpKSjb+5hsZEw9n^1|9MhWR7CKrWau4&iO^*226vt6 z$sKUtsTol8lMd5&m(|w5Y1PoQs;=xI*cuYjHuot!L^AN5j?~4Lr|-V8yu7L_P>a7V z^Xv(v^Vf3~`1_a0Z!u(ajNjT^Y;yS5Wmg7Z-$%&nkcRj@6TBWXH~S}Pc$@u+L0+HeZYXb06svH<#4#5dH#q)6 z=P<`#%zSFd{}Pb_>1OvOLM%fIZkShBB*^wbDY*3?`e+lP?)Vu z_2dGxT<0`kq&W`F@Z>=;5BSc6SKfv2J}0o=05m^{$N3|J@kGx|;4srU8K_f+v!OT} zn9YIL?2Bc%=|ULJ0Sp57t3(V@C?U!3V=g_a{^GO8Wuva5SSIg ztMFnOZcD^)2Q=t|Inh%DEQ&zILdLNKiY36U3|=J{%kg+3j;BnHQ#@tBqRcrJ$WtB5 zp;!*wD&SRqu^h*!!@A7`PX%zOa83m3lwk;pAz&7USLk9Hjvt=kR8JTQ$a@VAJiq8dzv3gl9dJ z*8|H9@LKV7L08VlzV{XCV2JyW7zhn*LXGon@!HSz=E+o2<3w? zan&iFBXD}eISPsaEDk_%fVG@}(-Z9U44j^EF87>uYM%4XY>y(RI}SKAp`%;6dX(cR zoDQ(l<8XQcPsd7=rvYX(5Qb7fn&NRNGQP6@%csRaWtKDziDklTB0Ie-?rElU%`F!W zeMmYXc|ht3(kXgeAx-vyb^)jgNLRR}$rBvMo!|Eq$P1*E<2)s@>^KG5&C7;EKq`>4 zJms<^mB>CQXM({{aX9tR(*-{0s~aZ(rygo2s5Pt?fKv}OG{MU~Rvm?c%nZa|HLSGs4P9Pk{FZ;`$` zR(i@Uod?(12PiZUc!jh}&XzV_COwoUJ$$+JeUNS?)sISd6=*#T=z)mWN#B?uJ(wvy zI?Cfx(xuX?r4KTtd)(uPNtM^;SrCvC_^^%5qVu~ne)aY^5*#ZK#UzH>S1rYSo(H;Vwv+1X^QPwpNzj9i)A~_c;%}-o4{o@*36X_ z>@=}_jb{rC_ZItbbLfBP(Jn61&IGSaw8~-IxH#=te+|4u+2YYjgd1lJy~#TnFS~q+ zcwGoioP}I}CQqzRcI?HLxxM4L9=4$#+3-qa0oUcfm%g4u);mon&G~?O* z3ePrh-)$G`zIK+Jb+RKjC&wfblZ%T-&W9hxzR7SL|KEA!@+YHtA((i2C8KG_Unq}6 zwn|igF*1lUaeDlijLyZ%&S{Frd7d3gqx8|2r9Q}^*=v;NIC$}K?!{aJu~$5ahr`+1 z?d3%DIZizC$#)@jVnE^jkk`eWi+n`gv7XaOhOzg#*fNeZe_cplZc8rH#g=)$|LW1s zHy*tU^|VDk-uWsbum8#Z&_DYl6w7qRi`v5wnBJSNha%Y^pf0hZS#lHp?8 zMLd^7tV5aYWjk-NeYq!Jg$rvF^$Tl7YKiPAQSn0BWsV~C7Vw}M30{lz`pe+BKzJd( z3SQVg+EbxsIV#XW8$qxMx&!fxHz){R1jBkfa=~~z7o3;vc-~Juq5%+(S9U~tW1+kd zUL4D5+K;^5&g<_fb4TPl&ISIc(|<>KB24m8K#S89d2w0si1pKeujs(MjBQ*NJ^^?c zkJz8vlb45Ux8v<)bH zM;Tc^R(~0k#deef+qo{hEYjkA766vZ$lZq918LmkX;;^II#iFNU7hCWz#(h)bU{@& zRCPgBH>=tJRXtF(0jhei>MqY_)#um@T8kytV!5>#vKAYx#V%`cy|viGi=!M8 z=uo73rFDhDJyOYK^*el$EUECqcQqi%J{X>>)T^L86)po!v;0kfw$+j}N**P3u|qao z?GAulE|+G!CQV3xUYeT*JtsonG%4_bGD{>d!W@P`D71BkPa-IA7GvVC>{b$LSNt5NNqee?tfX<8uQn?KJ zT@KtQNX5Ws3EX~L_=&8!-;vUhW~L_%r3E@^>I{(0EoDu)TXL{RqDE${~%G%Z{8 z$xEfB@LEBS%kdol;J8B0l$WYd5ARE*QfayQk{K>j&XiWf`@_D#cZIwHcmhIR0UBk) zd8xaYQE@NF64F$c0|NN7m$q1vK;CI`0A%!}Y0^}%KtR3)-m@f4%95E~Jklu8%p;Fe z)4)4$1bwp41D>L0Q`td!$`y4%?(ni`W06|N(mIrs$;G7y* zE3Lp=Es=vRja3$%JL77Rg|?Woc&-ra!$uwDfIlh^jJC8? z9fxHY?{V-4Wtau{E}YBbs60?3a|~;ZeMh?Eq)fO2iZm>LrZv$s3~mMukYFk3LjT<8 zJ=g+v18oe9wA3?|X~Z-DZp^ZxMk@@B#4({h!7PgJ?2nB-s|6j6dhtx~Xgb0uC$!UX z)B6Ln)HLV;kz4bDyi=qp@@RNX zPy-<8Vvt|~<+K?6UoMu4Q6kg=d=6{i53B1 zdpD)xMl3y}zC?L=mVlQ-^lps8Qlw_WLZxZf!16Ogn!#Q&9Azxu2+Pnc{e^W|5F%*{ zEF^AtdMV1)qAWQIkl8l+ncFKS|` zTAs*ckW0ZDbaK#v72HL4Am9!LhkjJ9S8Saj$TgbBq>V196% z?7zUmGfv9R{>XZiw@A{}VzvQy&GkQd8a!5VB%6Hevg-)hJ#GmhZ_7&wd0$>m$fxp+ zgajq+Civ3|6#0r=7l#prS;MlX-i7G`@pC@W4aWg%FjL1 z?#^{eGI{2WT&J8)p6^eYq^;LBXg%5{ZL_vT+p6U{RUdibjl7g?DZMG3?k>P<8u`uZ z2U3m$Ten7jd+cD!8JCJoeplwKbGAD>oSn{Y=RRkTd{EAHdNlI8+?0JO74GrK@}>Rd zDY;IcO!l8oIW!hJz5LEOMH(s1luD!qX%p=G@(}j&O9KE4$mFH$&C+#)pa*SA&QA^VFa;LgY9dvo!SgR4A zUaPoWBUWc@z0^(Idd(bnfqTC}g|#2L2B^N0Bh8U=-N6wZ8AZtUmBR|y1)e28d?;HR zbiTGlnwfHTqzju~du2Q*k|~i_4qYY>I$tkJ$-wH@U(1K;EQ!39>l`JK*K?htC35U_ zRO^i`5?Xs#%9)WzMx7d!>l`bQH)i4pzqL7g19pDr+MN%TYWj7oK zq_dLCIdW_p^4JF#i_VT|cd8QUm*AmGnH-e%WOrcGfOJ&q`%E_)|O4hqx9nm)?9{|3Ygnqk&v^?xn9mu>T!mIog17v${4jk-JtGsN*ctoE%GKM7YedQ z>YQ8U%}{70Fa;W%`N}@08XyhMUU`QcmA5Iq$`0j>dcaB2Njpe?-dQeJ$gAa`lA&x- z`jn%nSO-Yl29++ws~lI4qY|B2juhepgdm9RYPi6ty5R2XHlPS zXNB6Po<}t{IHT$~RAYm45Eb9xbjWb%aVj#j?sE32E}5i}J<#fq71<4OBbX>3SgFh4?&Z zKA;?h?%k}|uN+hcptznD_bEq|<51jyoMtLTz}Txc6IgC$Dg{cXx<&25mf1>)Ql_*i zt!OeVY(hSBpyq_K83Fll+OD|NEl9RNSq+7=ilT01#SWN>XBCHf2M$+}vJej?$|59I zqLeFlN>DCS?!rU4ayK1q}# z&JK&&;U4NFN{4b(y%$g0X)w4S8+(;+Am_8ndG!H)@*rXys-n75)*;5LZo}aoqZX;X z>?Bv+!B3*7RgOAdodgkKwpxsR^VBkRhq@H|&Q^CJvOwLV_Mw>yfXFI!k9pcJlK?4% z+7h+Gh$siJPp4Yp{ua`J{0qIK6KM9U2h@Y=dDWY81TEdE?ou(n9_8)(pmjh!3y1+^ zfnB2NaYk*Ax(`pfq0e`aY`1z=l0f%vAaGWaLGEr!>;(4Q0R8r;r%<^bYzK;i>KRrX zps@4mSp;qZ*ctUaO0ya2Pe5T1VO!LrSPwRIDA2YQT9AZ_oVTh9Ebe3*sIyP~Ip%dc zR7LY@BegNwcr8zxsm;*}wC^Hxhx!yAq8PeC);=J!5i9!Dhw!jZeHaf1)bHZ~EF(z} zOVC1NM&yhbKcYKhea3mX$cJ?UmO7Qzowd|yzyWa(>4DlA^-(-{Q@jd9Z!(g;PonQR z3K%k!(x37P3KdFmjrx?IO%!!93bB2YQ@!pYZJRl`)!H z4Ru52s9(F*Nw*m@X_o@%GUz_z+2flOTt8wkBR^}*Xl6BgpB-9Mw~f68H!ZU%HRMvR zopLFuuGC=adC#Cn@lr3w29Y`LaSn|G)0As{TEC{aysj~>*{(uYw=0-BN5WJb=>$_1 z?-AdeU@)^RtAKI{X(Lm;-T_}huxG@`%!;f~R^I4B+ESwz8GR&9rNKs%xhXl1ldr#2@w&+GCx1b2;?les>tZuF+H<+R1R ztJ_9Zt}t2#wBuTytIf6A6?N@$6{gY=GdF?TfK3z_9n?a!3$~olPHCH6TU>pvJ+6|} zvQ*}?@%n^mpUvQMXSB0gd1^&!N2r*$Rwt36_75#Kep*3VVOj>Y?t*t9QAWEn@5YTw5rYZdZvX*Vh^73hYVC%_zTQ z^T@6-TWJfYRN)DE!k#+MY~LIobGl8GX`j0v0?a`OF#`}}V5-0hxy7}O_GLotqVu)Q zv)a?{>0q+6s-v#)ZtRZH>6Dwwjx#%tR+==K@AbLzX+3f};XdmgbSwJ&-vjHPD8nge zokQ2ud`v11xCUIOTm@Kh&{c@3#}U_2*KyYwS1()Z`UNpY{jY(RnD?bzsbm$=K_748m91cE?l zwmTo%GAQ?;yAv@Pz+pUKp1|ZF!@czq=5DjWv;$xpSL#TZCuJ~4!k}~}V35WSFdHd% z|Lj|EsBlLqy#{wT)n+|P*zU%wXNP70zT16pOb>0Lc19ba1(9$LEDSSK=cKYxjn~4w z$BxITOFeOrt}RG{&1IC54H_q12y?s~=66Ht>QuToA-DvJBRzSZP7kII{T?cqH6DZk zvMQCW8AZ?+(#uE$|k4nVLu! zV-m)Zqael@5QHj&4I7|g8x1fl2C%`1tsi8I7V_(WNRHC+IL8*P_EelQot`caa?bY^ z_{KvZ!4!=5*bGsz4>WRkT)H-PN+==C8MrD3K$#NAFdDpVEcmfl$VBA{2Pvr&o--cI>6m@`AT1q$k{1XUdP}_J zu;?>0FxCv6;mz?*^5*F)DyFh16sP3%W_al|zy@B)yDPSsSFH-4%_bC;N9fyXCkv|vBPFB%iKzU;ea>KKhrpS8r@t6Cf{?&AW z>IB`oy$$|V{x<(=f4jfK->EP3olwt6>;nHe0>Yf|vK$0!w|V#Y`~Ca;2mA*?u%muz z029tu_TykqIx;8-Qeo8tQ~{QRZGrki|5pDtf3N?9-w`+xJQ`%m*zq_rJyd4ae@q}J zFg`FTkQ>Mg%nVRA2=V%YFe)Q`xJu*Lu)#bF^%+o?4`WsC>+-GlZGsluqMi2!0X+wh zWiT~1z;ErZ4S{r~G6Powo+z~-dV{Ksbj-?kU z6ASvgIwYV9iv#H#7-sgak?C^Jk!)yVo zI)apaEPj`7E1m32BTi+PZ;x-E?|^T>cS5(^7NE{*Pf+46{}?|N51ESaQ_!rBoInKS z!7fw^M%$#5e*9OM}-(CJ-fGvRts(@+L1%raq1qYgWJ_4zF$H)no7~>O>R@}2c0sB5%tjF~m@qS~2BFsb zH^Iz9VR1g?>Y8C3KrDux&EQ8kKUdR%;uLzIA8(;-#0n&c;eqOcN?BvYfF8)U_y_#Q z{j&pe0{MaU!41K!!M-3HboAUkVC#brS&lIB4>CA%%so8P2 zgAt}HfMI|sg9?j;@W>c_-vSFiAmR6otkrqm;OKV751)DjXT(d#Y zZP246cx1%!5obo69pOl)0^l%mU63g1LoH*iX0eW`$rML0kAS`U)Yt&=uot8{6*wCh z47h?B!5rq!EKqLK6BZQv6yvg)Rt5iL_H` zXVT85m1LABS~{;Yc^Q16C58-jTK zh6SPyunDi-7wjLgZ^VHSED&PLW;$W;(g3b=BS%mJ@Gk5k(AHpYa0e6Fq+~WREzNQi zq6U+hNwx*z2ok_a+ZWtJHDFhqw!#D)1aDQ+UFqKRV0uRS|6kYDgf@~TY1xyRBfCpY z+seOJ%1lW^d3M#?ZdR~bMz9*z3x*N2hjFtyco{=!zz4wyst#W8!O%MBpo0#Au7eL= zS_dBlD_9>ipaDU97!B)X4WomKse=z5(0~qt^+5+8oa`4bGD~uG&p|&gB3?wicoAQ| zOuc6do$G+))y*{&6+O71Z131u2{GL6qrRq#zdj%Je!s39+9wLK-pV8htt zB^9AkR+jBNPVo3fAHg%a<(eb-Y@AG&AXC|t89)rK@nh))9=!x`NA_5`*i3Jp>UDi! zvS%T6TY?ck@L}-W09G7hB)9Q9AOuA^!w4ZZmxYTmr8s6GX9tOK0Kln|0vQ07T7VEa zD3gZWe~o5ia~f2tjLcKnQ<=0peim+Haz{wNDT=!kXSm~Gi} zKa7{-l{n{SS7H!cLnTr6Qo8Z2)8;9N48ki&=?$bad&VXSxB1d?_f?*K~ zlHo?Yg`Y_%FAp);*Ps!l9q-0_@j*N-e+wwbuZ{@#ZM9pm?L=g4y`r) zKtI$wdRN~u=(1CI>PrRqZ1rWmsw>ESEZdH^6q79LyY>W4r5&17G)a(n!H0 zZRA%=KauJ1A^jMOGOjn`oI&peg8*vuAh`0Epyx>HpoP~3rlY5GW-l?AJm3s^YMFYq zb-5<2>)XbLSv8N%OLJh3%$d1iad=tiLe4e~p90Cx*U2Tyfsi^g?|J3-l*|yuvFgi^ zze5bCG93+>j+FERB@<5r{T8-3Wn>p3k_qaT zHaY(ejUp5@&6YVaAIu$V*Q#4G%ultD$1|fVlbJZDRt#k2 zBz{exNGlAzpY_y*s;dej$O2~8h*p;SnsTu zEnqK)-F|4^Src^c**SDSK=+==YuN19v1Zmia;he}qQF`ntTd+J?a%Rx-N5=4EfxpX zl{K^mi8b%-&#>d_iobpVfuVIR<2;7BJE>~14f$KzlM^zs0KJg)yO1$MXbd}T=MjKI z1mO3?xPw0rRvTH~x9b??rRa+rxglv{-SVCpfj$(=V0YH+bI(b*DxRVK{x>NL1WizR{;1%UUb&il=g!T86eN^!>8ymWKVF4*kXAV9^#@ z4CODOP`b5D=u3ZZV4qf|RFM>>DN1bxH)vH(URJn+EB9d;9y#IA(Gl6>FOuzp&5e*gS{ zz;J{U5EGmkxqmJ(iMs42_7jKbR87kX=JokyRbodD87a|>ycd#vs z78S(4$Dr37!*QK0C+ie~-G3C-<$w@hhW|t27G{R+E~3ZEGEm3)8b)!tNoKwY7kRWv5BgMXaw|Cw7Uy9>y5R--SQ`B|S zIdggegf3a6f^Rx4hp(CB$I!WU3^$APf9)Q-J(sii1mMts+_}?tt{^dT-UZPLHP9Zp z9=HSWWq_YD22gwxgpo}ycNjX1N94+d({-lKz2mwauj^fU6?q#)oLlG4p?bXXhTcw6 z*41pGxd~2 zvr%!S*9$o&R*`tDYtcS-LpRhE((D-d2g4uZ+~dw5(08G%XW#_celN+%puZF z?ek7&&xr zaF*>v64vCbZXw^LqcoHv4xQD#ruW7>M{-QPjNEZn2p&r=Y!M!@98U~+u%MlLRH#|G z2;0X&wnG#YhmWK}{T-BY-@Ed1(#BB`#`lU@31vUe@N1~-A-#vl*_q5ek)&gD*!UK> z%ehQhDS~;VK};Ykkli%L&E$CyWztKNKNQqfM{CowAIP6lIdCI9moF2-E!)I5_3K#G4Wk1{0FskcAIfGBT>zm%Bh z#|kN*F64~KV!`F5ovh1rI;BO!H7x#yl#P?s)Y~s%d7j)!HB&7q(jXBdRY<{I$P`kI z)VXB5Ax0U^u|%iyR6BK%>ZH1<%TzBlNL{6dsduZNVy?fBbGsV-D;#Kpnd{UI^$xy4 zI{4Nm)8o|F$2e@4!oLrSs7h`1o5=q~V#;ry8On~j?kef1mR2@Cin_|(M}C^#1l}U9 zvhoZJ@hmFv=DW(|8Mt^el#Q4lQ}Qu<+lfKJEQUjA*^kjIeeCZlUqvFXB1L6=eNXv^ z=$`Vg{+{x0_zEKHjXUW(Z2FyeE-t#;e}7ozKmWfzeM|&{y_O7 ziC!rmM~BMC>(}@*C|Am7{t&Ngyzm|L&p`hP=zjwJPyR^x_SGk^R_~O5#CfBy{i*V` zHdX%O-z)T&f7FZ;ohd^Fr-tNN@Z=*H!&+GeY@ds$&t)_N< z;5W#JPa;iK(^~jX2`%+UepCIa|Au_{BytAwncCU*&$-=3yRBaQjeo)I4%!`clJmRV zzC`;{ZT`gXsb8hwz(D;x+E+i14B<#${da$;e(ev``l>%+`6=Y5>M-xmSbh%qd&oaR z{vPs=>R0|;{fqBv(w(%XX=$zeslTOt^9d3*qit$g?KjVI+MlC&t+cwH)zUxo^V-JW z`Z;a%cYa1Y{>B6SYF|Z8pyx!Jr2HDU>uA@tpZiU2w$N;$ VdB)9iG|$m&YpDp7uFCiF{{srcX1o9Z literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXDkPanels.dcu b/official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXDkPanels.dcu new file mode 100644 index 0000000000000000000000000000000000000000..b36365fbbedc688c2391b919f581faf4a218a3e4 GIT binary patch literal 111320 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

e2KyjYWHsNWbDyhN!$?JF7}3ND~r zqb7_pGQoMixaakv*C`1&2lPD!iDM+wy7P1aKTvdlaPb{awdh-N+(RbQy6YSPIaGAW z0k2nZ=}$fird5C0|B7%Yhv80MRPIDlkKW_0UYp{76XdE*zqiUfuV+sDXkxB4tFYSj z?i#o_q$MGeufVg-bAhPgC_Rm6Q#uXT$n30W_&U&q1Pt}_yrR#z%)&!efowxoo|HzoIlCC(B?gTn`f

V?PYM?`*6F!j&9niGW31A|(9NZ>>;XGNe*{q?m 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 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXEditors.dcu b/official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXEditors.dcu new file mode 100644 index 0000000000000000000000000000000000000000..8cee5001408803b448d888ff373132b23d2a68ce GIT binary patch literal 128057 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 TG^@jcx4Hi?KMGUU=v?j(Wm-&v literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXFormPopupMenu.dcu b/official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXFormPopupMenu.dcu new file mode 100644 index 0000000000000000000000000000000000000000..7362bf721ce80d2e5e265026e2e6913e3379ff82 GIT binary patch literal 39976 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 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXItem.dcu b/official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXItem.dcu new file mode 100644 index 0000000000000000000000000000000000000000..d8fce1c0b3d04ad09adfb6ddcc329405809b5613 GIT binary patch literal 333820 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�qOjV`eoSq@POz$Z%7$S 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

vnVQPhJ6=509=EGsiJYAe>581BL$tm(~ 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≀NfB>m~;J+l1L6FSOocSt^w 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 UzAfePx%k!R{;ye7J~PAr4;W^ShX4Qo literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXLibDsgn_d12.dcp b/official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXLibDsgn_d12.dcp new file mode 100644 index 0000000000000000000000000000000000000000..91560fa0d66a091c40f7bfa7c27643a10df6f343 GIT binary patch literal 11608 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 TNWeY9Y#<~X4wG{>GW`DmDKh}q literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXLibDsgn_d12.dcu b/official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXLibDsgn_d12.dcu new file mode 100644 index 0000000000000000000000000000000000000000..6280c937dee6ee854d8f4b4ac3f79effa8fabe29 GIT binary patch literal 4942 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

B>5 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ƑtE4*xVAM!=IDzz9KQ| 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 z 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 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXLib_d12.dcp b/official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXLib_d12.dcp new file mode 100644 index 0000000000000000000000000000000000000000..cb4b28f1950f365c17acc445f31a0724aeb87ef1 GIT binary patch literal 1098222 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

n$6RTN7X~0S~D^%Md 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

7G8&_QzFB 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�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 z zfxtMEXC$jgKyYEOI9NffwZS@MwFkXN$O=n?A`O3!$L^J`4)R6}Bfjl+m;zx16;D%& zhQvb>JW#0|QsD(k&5(~-jvN^b9)vgGM||s$nG)q2N(`ljvO|2>fmCB54Sg_bD*=A^ z*t&qd3pl!flk^P?rH3*@E}{j7+Cv_a861iZ6;Ph-q0W$0<0VpvMUz29xuN|b-_Oxj zg#qTlR~;&!q+bFOaDR@nN)6F#j(9L}P3hD5_J7g`zwD5om1kurK#^)SR+xN{BGqba znh+I*L1WiAK^3yKN2|t(TN#lZR!wtQJHk69x@){^uxIB=7}Sdxi(MmTu2Umnu1h05 zbR#6suZd`)nz$y)QmF|8j1d?FH3sRiqsYjJrid8k`l>(j>`9YYLiuO^WClR8nd|(mzL^lLZU)@pbqbdgF8?i$i3?0ha!{ zCQIRY!{TA-aE?I!uxMB|oF`ENP$fWc`0f)#EFCTqgKAhmY#1(4Ua0_-iKZUb4I76m z6iCCojR?f2t3~wycmx=RYs6{8Xu~sHr_i=x-*AIy_F>nse|Vo1cEHmMx*sDAHd^rx zQ+BIQc}}HH#kH=}{?j(y;q~{!?Gf%-Z-HI#M6>2w^RKl?Tzr_dTm&YD)5C?~4uMHf z^TWJ9V_+6wkTn&=sthE*kG>1Bh9m@n8fyQ{75f~r88_m z6KNhvvYJITFvTEhIO9j?3L6oI*HVg7F`^xDjmU7i1E79H&e3cm_7TOOp=MAloGb^} z(kvG9NR}=3I7Y-%hi$!Ugn!CES)LN#Ro*q-&CiwQ>T?;!>>6QX0^bPElAI2oE`F=h zS#)$_Kc!PqT)vUSNOeTbfyt5Lh=v1GBc%~7fsv8;NPR^2XXxLfBiWJMNPeUMw$exi z;c8z{gAoO-G7@JIrABIF`(uKO!iyrdLAZKFW~zU26iKGAS*BBVr2YkE9EEDIq!b`) zpG`Ik@S`re2$#Cy(nyoht0M-|rj5$VKb7Nh^Hggk&jj*M6GO~lhI}Z^j zrOXB9z$u^T-y_k1Q*L69qMD?c1P`&t4-qfKDMg;BYNW8siHmmAn&k$=M()02+yB#9?MYkR5(??vwzqBXFWJPc`Cp; zA#(7tJ@plGZRWgV%rjQJ>bTvxEt+x7=x3wMKSmm;v>L5WYtWjsE0U%1i3^BP2aYpv4RFU$?j~*Oe1Zu|Qp&Abr`DxS{TW&eI{>%VqxEWi z+6k#4hI-cOWD2?(`o)MDA|HvAb|C>2WMr3zW}QhfT#Z<8lWg=^CT+iR&O`0tx#%-o3Lf^)|wXnDV6!|pZiG6D$LQn2nJGsekbKkOy>5JcX zbkgh2$;gxD6W6lsrTn$^weuG!yB?8Ftdr=ZIv4R5zZL4-q-OD35vabCG=LN6gu2dU z-WA~$-^oeDAqM>cT&d2>bn&rd==>x=t<&g&j2fb^UKi$^DAUTOi;-*5*>v$Pkmv#_ z#^TYX$#vqM$4nQ<65s+Q*9G!jfORGwU09dVm338JLl-*JI%~k98@DhUK;x!7uRl*S zxxo3-dCh2ktVm&d!nzWNGi1S+tCG2?tqPdhNcIpv!%1LbNX|hbCGkIa~j5`C3)gAk~4aS z8t5xOVyed98t8z+a7j59@?xwD0{#j`jHjAp%d zRx~M|EIm}Lwbo=W11~d_zMl5ktOB*FcD8Z0dA4=7eKvn|1vc+14AI;T0OJ*PWYWuzL#VLoR)*I?*A>Et-)I_Eye3@mUi zan6ssMa-ktQQN3&Og$DKYcb9?aR$zX&V|qMen}VJH2O5&_Nlg{fHr~a2nxKr;zIYjgZlIFr1dO)8) z`j-gTJ#5E&qE)XNY07|?IB)UM711#rL1Q^d-&ZoOTrVHel*gT>3^RDv+ zLha{^SeOM{9^~(GLkwk^NW~l@vnMt_u%>VdGV+mo6scxBPu1d3||rRm60NZibrLPASXig zd<&!wDy4FiHL+FHEyt*LG&YtRFOH|KSWR)0;#XJ>uASd!oV>%}%3r~T>*ocdqEYdv zlkH6vj9S=Yw0N|-RQbu@qB6)vc~(2Cx!Td}c;Z^zV!Rcf4&TnMme!TqYL*HOeKn(6 z&e4&h9W_uc_0VxsBdKW`-5-_UESmuf>ZV^Ir_H0S3+7*8X}~<%fyIeoacX9Bz6+rX z7S4l*y$6yDnhW|1h6~mU9vnHelFruAnxSrJ7;MC49Zg@zTnHOthP0tzC>nTU!ZADN zk-t#55HiFKSwo5OcMJ|v#Woroja`UeNMFcbaFQxSaFMzMgf6%#w0$%>O7$TzN_Bx$ zFkbLbF4{*^tde9$UC_vP!Al|?qXo2yiVIPkiS&^q2hPN{NByL&bJS+ABh>+-yO0S| zLxqj(U899@$wZLCyGJQ!Oa`;TY6uaZ2gbBN8m91Gc4D_N8X>xOw2I@qQ4XwwDMrfr zz)Sly#21uI1*t)9h!c;0v}&jsBA*YSB!i>ki`=2w7*drU&5nvt&nacr3$6=>PpK#4 ztd$-l;eH2gFumx92k}MqW$oqogdK+{{$C8o8>9Yfse3MVQkJ5oC=~|lxP9C)?i}}z zyFNdOn$cCrIBpuZjr+#K!LLP%iP{l5 zM=CWaFR3r3FJ&*GkkG*@49(AvAcYiD_XwsE{@hP%W&<4w?pzETDO8GuYqImGv;mg3 zzv6Y^&yS-Zt%mkZEBAYoA$5uSz1g50D_^W%G#PD1<0U_W=Pz+>lgHpSgitwBs2&;A zggmN9^5oaZgMguBFpeXs7}66*#~>Wz!jufAG5eT$TzOH4w##yn4s3Io-R*27A3i7)EJ@)#}!C~dR#lM8`qB;$0c8*#>8-p-83#GFb*4Yj_;EON#sVItskex z(qqLj^LS^RcTsprztmt$IjOPISb3~7u3y?`Q}{H)c^8}iBSxaKW7hGX(mF(TtUd17 zX;B-Wg-8<69BWgp&5gCj+G8DR81iGZK+$9b9x0U{tAgbEoUFJxrXTl?x0vBI$7)yP zCfDajvFg|yi;Ty{8%F0P@1@cu`yW%aYL0Ojap_F@rCus4;dtz0?gWikD2INS4AbTl z5vIexhiOR0i-3i=Cg6WXnMzQx=?o^9bLMgDc+OZc)-VJWUedB9N9DNbQ!0I&A7`#= zJd8RAf@)mHesfbHm)b1X)CerRBtuap1Y{IC(;e%ksH^5n7f!X{*aNz zuVEAUaoxqDv4os8QLKe=*`;oCVy1w_@iKI)qS7~TQr!goEJh0jERLHl1}-X$ol92Y zD??rPMeYYi?#Ii_MH}ZKzzqZ~qv(?Sk^-_-Xm;$JhmbrjwJ&up2`&pSOE1eVJHEz> zT6tUq56d5JDR5nOQiPT9Hrg%v!PG@uwQ(_9OH1Rhz0#w zWMD!hmx>ULB!2oOJ?RdC{GnZNKjwzW}Yrq<|cG$9M1uaCCEgMyhyicfMsTuvO=o&_@ zx8gCAh@qvET~=OJUCv)FUPjfz^iYZd>>5k~{*_B;ywDa({}q+buQCWdLDwh>>)aU8WJ2i{ijwB7@xF=$!dvE|GE2-a)M?byZ=p z-l^U9p)O%?!a}3a02eQnA&CtU%9lu7>x%el_*&|k=6dCZZ4%c%Ks1^$_=s*RUvL?) zf2j$pm#})TWJBEKb`N;%4NojI;wuw9m2Q(beKBR7jTT~od(#qH2jZfHe0)eVtA zh}InMVVI2&BGmf$am#k>a+I2mz~#{8Fi`FafWT${r2S@eDq*YH1a_A_b}xUAZNErf zPF%@Z#J5_vink3jwi)eWXFbjYCSVXfDOh0na`p25Wx*BE70DIl71fm_iBH2g3-C%2 zl7X)f{+tyPe+?nHMNA4&xN2h^X!UZC+57(G(4iYV`5#cW9A}MB_p5NQ@8nZtDGy7a zSK$h;2-tma$}7@I`J{5PGFh8!Om-%9-|N2@9xG9oth`cZRZDp#!?e$_Z=O1}@RiJ! z!q=GZ!~wLg@J#}f&?GX6P4W|Du<oXR4Ex_0ZBygCMJk)^YYJm#rqJsl_tA z%`)8-G4Yf%bmc4I8#g6QLWYXzTQ=F5LDWoap1*J6T@7FDT=iT_T+>dJCOQ**vy^em zC~ynY~WsIUjN$mI=x<67jN2_5WBJmx1?N6UoBlNz>QWYP{B1RXt9ax&DKrXihDK80!EY=M@X*8uF289sISEsF+pF`H3usZ z>oq4^w4*F_F~|le#Te6+H=b+0Yk_MS0=)pk*CfZtGy>OxfBF|N;J~%y_3{nT8}%FQ z8z(N}hF9oXjs?$?*70lUYlSXQBp?AwsSA`Tu?e*5X*8i#7OY0!{Ixo<6s{Go?K5hN zeLL*S`v%GgCu9?f3H~?WB2Yjy5dh_ckU$AMl@o`1A}3Uq@+|+3?T+}N`k}&Ub-L%p z-yoJA2?f_pSSR8qsaxRA*Q-}$%u`NZ_k@CYJQLmt6{D)@8=lY*H9V1>(0+pyL?#jw zsfpY~e7F{o0H{B3T zN++$8KD2jcCcr|W+7omcQrv8%7~2yvvyJ>Z6L!vVaE_B$`DUd#3RV|~$ju5M?r&fN z0^GmkHq%tx^9^iOXqK7v42_%9Cr>~du{pXKKKb9Ez1-|(mZ3M}&?s>G;l)keE15*M zop*S1w3}1o=BCz8L|Q=C#ofVHo{~)arhO~{0s3amsiOlBRD#=g=#pTHo;DX!z6N6u z+~7{^2yV!3=x%s!L~a;nt+U!Y;(LmFna_WUFoGM_S;al|Q~qMd*J251Q%DH{WIm^C zlilF`nsUN)ga2!kwFYwZH|Um}3uyCoH-eCv`TQ49T?a_`YpByB`Zcn^4zCcrehC?# z8;L*ujJd5pJ&6Y2b0fffBM?J}9|JdO?$mQ-up*uSA?RKu@PIGq~;{Di~x;6_rJHz}N?Uv-3dF$vAskNfu6_fq!akQ_a| znI+RUX`wLsNeilkZ8CWBe?zRMNgI=ICl=?Vf6_rb?ny5yjek=3360SFljaQ<<8sqC zI_V+i*koeT%K^zr(I+&|~5{;+*3n-~6P)B4zsJCnXmDuY3Ne zr!ZNbY)-Z@uHjkumcXx3O^a-xvk$VAwX#L7h1j3;S;Cg2rC9Hwf zNOLmq6Ivl{LW=NMCm2@)-~$SiUTjU|(mXA%Z#EDFY>uqY2*)uF3q zuF9f0bhXUYSkf%zS^AnSc}iK2&r%>4lU+-(3zW$6JQgo#YzXhQa6fc8Z)vB5)A{Mr zba}eMLWeDE@*KD1EDej}CUv)|o6=jxTjpCe#*nhq$&Fc3mIeWF0Q+5_*#%k@A$g@O zxH}Qnm9{uD$^D9pdXLSa`pIn?pwOyMUkzh<<}K;lvoeWs8KU6-(73V^lez z4NKFa=mIK6SN{gFb}amxf}5f*X?!NVxj!ScX_=>vJf%0~Hx)Mxj9{d|+MD{DW`9 zXFJhXy{mY#5q%{2_?P3$xa$DMR=JsHH-?CAIrqGKnvbcENjAb0-KtGVtjg)eZMi*g zzvU1<31CJ;<16tk!!6-dVJbYGz;7|p+kx5GY@8(`K?xMyQr$|DcA{HyfGGmSx0C?W z9H;=8;Xu_b?X4^&RtjDPm~uZxxDD;{TajDQTg@q+Rb$mz%~p%mYUQ@g%NdoH7HG;I zu|}no*+zL&HpjcwII4im1zvrJz&lQ-8MT*#P%X!OvtMmg{CeV1x4r=8Gu*!kN zTO-g62Is9hftFhifcs1&v;G|BW5OxfRBnnlEk_&UoQ_Smn0K2pC3mZOtHS}cTRas~ zoV!&7t#OObA*EY2AOaP5^8iFDm=2Dw0d3vlO-Z_dRE5afw>qH78H<8^gj3=vWfxF& z0W|?4cxf4@j!@Z@VoKiy3rKjAKy699KOU|*RP0OlzT=dAd2x)<2q7_jF;pF}*)6yluIiy<55K zv1eIk<>I*7KCb1Z8L?!#%(yG$D~I%I7pPJBD5updCz2>QB3?Vuo0@FZ`i5QMw-iaW{gy%T@tU!)7D=rSu8i@{Cd zinpt`Jzc=t1$+dQ;T2$O zW}?K{x-Fa$&4?-7PuNe1fY}Y0@)>R)PV&A77Z|r61|LbBT>qm+0jM6RANU`bpM;+# zo@N${i*cq$g4EK@m}Zh)AVq*4lr#Yb09gWhA~QKEZR?D8CNh)%0W6S$Hf$vIgI?qi z_e=mtiL`Zq-v>XsC7yy)&17@gM88Ah zsRL-XS!`CD&1SbbY!b#N{T)>B*#fqZjZKpMww5hCYp{pzW$rcZ#qL+`J08dxr-C9# z*s?Yy0ZCiVrlL4fwhU-FTjl7VAZ0n5hB0f2r)VqNbOe+D7}&V2Y?I9L?->}6k)p04 zzK+dAVBOZV@n+2=v|($5%A2hnrGxBk+j$!E@n_|a+PDLm1~;?L*~lHGJ!_96i^}(W z_bm=96KbRQ#Iv$lI{^{^P6B!ivu^U&%z7DWoeePdAYsl~?`)_Ggb8qgVm(%;Q%COE z{GIsy_I(d7N_3-%%f73>vmR@ZmuEK1yu9#8I7F{iuhp-kOni7YMs8p>JR9!<2?Bzk zB)dSGsgNNwHd~&}Qp#hq_1XQ|_H6EVXq0GRRGzIIl6ZIccLaCxze5k7oUMV_KnnuS z6Ld{Lan@oNK9oD1^ZEtPVsJTk;vRCYGMi_uPJPz>I`q1_-dI;{YPXHs_V=;99J_Lk zcZVA;O76tj2rM}#a{8RfCjyt{S&`{i`W+fk$sNNTBNld?cf7cRu1q>eK(I2B?+*4? zqnFU!Y1^ewOG~a*->N;pezmdQX<_wU@hJUW>pSzjb-uM)-^2wW=wiHg{EO6hg!ZZ| zni|O`t zvfCcmA5i~id7OK!c;Y)4XB zKnnUM@2VK0rf=acGnmp{!9C$U-hJ8qz?|%%|eu0BDX08y;R0(_K^(XM@#bX$*kIYjrY;#RW-c^fXS##?b%X0ziQfivZ7 zuGGC@EXA?gth><*9ta;$$w!=NC*5U_D&)80=6dD^neHLV=d3+%FW4ijB*gb(=%%hJ$Ul}LQvkl+EKdtihnP`LMZM9PyQot<-If$nW3-lUXFQs?&Zm~ z-}BrnGD7HHiCq7^(7kdOs1Oji7rs~R0(B;-@q21Q?xpUf(R}ZdA0bWhi{EQ;PMdQ~ zCuq=-x+mID1&v|u*R0|_p~Ley@>ukQ=ZZgXugPBqU-HzD($l!dCpV8iK|nwOfKZK` zAfS0q)TN1uRs>CSU!sOCWdP#)lKVn-47hqP&PIf-dkN+W?$?fEX34~!%-gySj|7EkR#{Q-@R zO==i+_WlL=xOR{VX?9p!BInc zO)-4(-yz!kgCZWNLuXchAaf`jPDj+?dML!EWbb#;@3`NQ_c65RJ#;)vJhRQa7c+~F zCFhcbm6DZ8Tj-EE0dfo zX@(sx3SdDensQ_uS%;g1S&%v+c!-A(FO{?vK$Ow54j-}E9AS{+$Ou|QPB}tOzfTmv z#VK3dkItzd>CRtrExDHrD_nNw9Yu#_uKScp*coxgoB@`uAVpbsG#p`uMktwW2X9U= z$E_}R9I~hCr)qa|fxnnt^y9`N?{n@AfsRA%?owo4#S8Cy-frac^C)W`mht(!F(xoh z@+EW9IX0M4%%$c^4{Hxyk33HIcj52I%#(~SMSRLR)m;12I<-ZrxeTLciLRT|&*d3f zApK12r-CAZW(JmtsmC){A=f?UnX55EXs%AKe=aoF=mPr$1VCwa0mU&gB6{vBaobn-W09hWL%g@#3^bh$12o{|y%n1mH;fS7a0QDgO?*b6sL-9lXL(u?AEr|ns z<+%pB66HfNM`+CL<5%_$xFjSqHCJJ%lq96*ga}K_>W7+#-cLxE{G5E=x)}8O*xEyB zPBrgb3@k>L^vhYmb{gNZN} z3fvFLptDZZN@OLr2?Gp$MoY!shp`nk3!$M9p@+$bnTM`py(q`zLosU)QxCZpSW>8Q z5@+{i7CJ(pS#TYrnL_5Fj)~9@pn{ZegTLVs{U%}{iKU0_hk{2&%CPFg7V4GYk&5}6 zC_`%x#gC+q6pze=)E`P8$>3`tF_=g`;y)6CU?so(hq_04ge#n+KqZ8aYS>2VNczJaUp47akYz0gW6by~!nUfk$q}?V)e%k&hvM z`sN=684{vz<5A!fI)*{Rqwe4+LJ{=P19MS=cutv9;f#^-P!TGeW~bF@bH<4va;lsf zC$XBH+H_LP#HxC%eQbQJ8H9Ffcv>D?ALIQ1^m^*Y z@h6=p&1LUqbIZBI27|`Ow#WX*xhJ&L7k2sP_ZJFF&M*H8xoLh(YgTHP+vRobzvR85 zJ1JOiVnG(jaTAOCiO6Mjxm=N_bR$cSOvCnA$JEr**YnuGIYx54k4>Co<{S&D>_gnF zoeVwZJ&8O?;OHM8uTwOiDxR61*@&^nPJAJB(~d6S>;kSq*hhql<8k3}@o^asR$=Y(fMIu`Y;p3l5Y4 zj1ad7daEE7GZxeu3$oe&B)TcZv#l{oc#r={oI*H34m@FFspym3)BIEMv)r@tv(B^3 zym(Q!m}FX}C`9B*`bnCC5RiY8`2oz5cNEkd(HQU~PqaAr3Irqo6bDgfl0`UCW|;!@iN)5C%oT;K~0A3D!|FrT{>DDZ&){1ZW z8-|U*#{QO-$+gip_tZ{K{;7j=oFpv&wD{CTKmmYY4W0{=9Rg{i*&F zGS!FFN;iciG&26MPQ(Z2X9edg!7qs)q---w_IJ` zUyiMMe)4lP;!&7ziftK-KFgh$hk+!XWf-1(R$&P*JgbtMeO7o@BOnK$-US+6pv59? z6Iy;&e|C6{2MqxPxQoxSDD}iVmgnwQlEC4>gjNXT^Qw9Me0-i;U9c|lHPE|9GasB6 zXsC98K}X&iNaf8d=0zN!pBHOT4+Qga(DdjV-C&Yvs7HlB^}J!;2N6<^V3;?~(~6C4 zUPdxS^BRV-mRK}jo{zh;?vlIVt}W;n4U4U1IfBWVeD(w%Y#7$HdhS$EzYW@vR!NUQ!JWk7Tm8y0qZ;e zhyOwgSe6Bv(D~n2-#6ZecT;=Gerl;43*3|Kp#_Jh?rD2W&(kYjZ`$j6p? zEmRm%B{dTZnT6<48k=SoLZ8sC$IOEBSdm?GvC#OwPCPx$g?$Q9U1*Y1TQKxCsYBmi z=rC{oqHq}W9?>xDMZ9QTbS&~c;$ei8EZP<&9N<`#4kKxj#rR@wv9{P+v@P)|lx$Hp z3do#loUu7|ot?v5oE0 z{3ZR8lH;>uVCQ7>J4YSY6aoWZFgI&>=D%B}Ru}oILT8p8WNT$)(g%8s=^w)Ue1Y z;$1QlYQ&VjxI_;n=}|p*Kc^+UF#Ac-eK?EpEP9uN zXpW+*I_!{4tryotn}*&j6^4IN_}M9#Mrcv7q+W`93Z5cbKnmm&Q8s(!RtEq>D(ibBVGry4+fAuj)7Bo80dz)y3%HN}YOhAuQk&i96Y4w8 zknpq9&?dB$ga%QTW-^G_AD}qP-tdx#ja!mSUgoBje9TQR`I(y`+kzZUOExsFEajf- zmW5uu*XGr)d3{k|@bzc3`r2M9F7saUU&_B1e6X-;kzjF1JvN4Md)hs<=bGizGH<1} z682`j`4{aq2lF=cW~el+9v4I1^mTZ=4Dr#|=kY_Ao`5IrNq9aRLYam<{O7Xgf#-Nk z7dpmK?oL{ghR=@{n}37_nXnLjv!3>+c3NO4dLoP(rOI0O?0d9FkJCcAr?95oQHMMs z{yX=c$l=j!JfY6c_#G|#oq*%(yvJn_8sT)Es>&aMUoS!DAmt%l-?fubMNy!MP!0Wn@MNq z^CFA5OyAh^3OVuTRpO36ry+ceD2e9{#?@j{cz7kWO;8I@h6A9(2$NN!n4C~XN!!enyG zYNn-T1gWSl3s;;gS`IV=)QuqT8?Y-85d8?+z5V6RvWlsz#pRaz6{RuwSyn1+CPXLt{sp~GH=)TFY-lB039rOoq+euSxYkl@#+S~Q#h2D&ay~do zws|AAq5FX2ET{$g71;~J3)2e&S`DZ{lV2#rEzEKCRuk|C(wiAPb+W%%+cC2=Sx6Dj zN^m8%f?UT63pYKBtx(=J5qAO)%?fC^99xkDr9lS^<)m+V#YWkgU1_bPSdM2`(#*}R zWSE;@aZ%nBA*lvg&SMfGQ`}M#M?? zig(}J@g_L13DCq;-1j!UDJECCnkHAUDqa06s&LZP5UX&~)$kY8^uRqyiBhk6Uu2ow z9DUWRc?zak)vgv9wM3|K)wGJ+VbHobR#WSyKx7N&0gxESYH8IJ@NY)8DvY^GdGEjv zZq)qO$ljf+E}%X}z%8~Y0O}WFTl-AO>S~ihL{}@T)z#W+i;@!qu)o?Sd9l?F=kQJe zi?7xxP!jJD^G~7c&ayDgRoM&W3(X7d3&APWgB-$AKSq6q?1c{2X?($r^>eH0H9ByR z!GVL++w$AiTTeiE3WcACK<*0PJjD_Q1-MsAc&VDnh*sq2DPrj8%)E zJ^L@3FZ2vG5XxKQubCKXCRDs8S!3<4d`+>|UbDY+yfVDDzjh*p<#j7@^yJoTr;w%c zHRD=n&He-EASv=S=P4SJt-03RY^p?e*tsd3a!tSHp(Lvi(6Sa;qmh7@nAL}@Ax88O zk7mt@a48sdY0XbO+O;gKHosP2r2U`#8(5oVE&iv}ZN=Cvh{2QpCya;tnIgI44(htpZpwnVoiJW2>7#*C*RTT_;$2Mdx7U!J<6dbWm(lPt~rm{ z$+SyrL6%D)N=t36u@>$EQAUpu+FBF%;$0xo1(F1`*Lc1R0i89Wk9Fh%pV$}l#eGHp z{(ALoA<)@SZ)T2C;mUoccR40CPa)(!rLV})5}_Jg`Bbl7zT%f(V4xJi_#%dAcrT4FO=x#%$*sYp?UR9JeI;MTSMza;%4HwT6+|1R zjnD=!==nbSz4cv?Eh<-iIhG++U+~x$5MTG@KcSwq?kg~Q-B&zxTcl)9$H&u>dGfW0 zMEX+qQvcHMQb33d0I4F>A`SAF+CxA5;DfR>yv*Z4Nt$$%k-sc#iJ24$eQhtLT8OqI z5wb3zAfTu8QmKVWdR}H>X9MXQC41z%>s#Q6qK{sq#K z#Vfa@ME#}5FWc3#m<=SYfm|~&)J$jxS!iXbjZo1m@hb;IorKC?DPFl5>LFC~O8bf{ z3GFM>EAy+!tMsePtJ3T6W@J;cW&e^2oE8J|tSzPgRp?cE-N%CaDNRNMvA$w`sELJD zzBawy_Y2=B-&o)H-UJzEh$3>l^1O;NG)8C$+zEyz35~x>y~1O?h%ANZ)66475#(PL zUzJ{A_JytcOou>ubSj6r=5R06SBnuZ5?fzm0*S)8MwfcE1)AV1FHcEjf)ccD@e6JN!BV zZZ`Igyso~ky{^A*yyp9TZyRreTk;?--$c%5UU%LWgEAJGf?~hG{8gk3Zm#_;nPI4`9$A!ULlbKUTRRj-Z0yz_^X4(TODdDSz6Z@n`)xe;!^% zf5~rV-WKw%`uF`EzhGUmE?w8H>(^cD?sY49)cs9AZ(X=9TUV_c)-CJKb^p5UG`gy~ zzvUOL%h%QG#&s*W*@UU?&#Y(PRNl1Sh~6sS8sEACodD#cbbJUGJo(>|2>-f+#Y@lD zLetoKJ1E`$j1BrRD^zUTwq4BMP2c3Yhn&>9mvemNq}TnN6CfwE9^{-5=S0ZCZGZR{ z*JGR$C#STY;G867Uum887Nw}X%Io{<8S?7MQqFhQ`ELYoL~mF}Bzt3e<9-u)gO$iY zBv1}CHzb>R##9%$yJLy(@Q)1p_@;1G(ys^EhGD3|A?l;~y{x=Oq z*e62dP3%qL4Xa@BH^n!NH~hDevEjJ$yHU1zru4w4t2d8h&<*1{_T zW#(!EVWvogMC%d_4glP;NHv574>*jpOM(tkOCUwo+{|s}|FGi2+po77X=DK;;F=q7%y{}%1C4*-_6 zHdD-mIYCYe;D==17Jl`^T$Xk6m~DE3^nkaN227DnERw-uk}T>vdkT)0!gRPYX9~rX z-wf~Jg)49tH}RA%+%iQ7o91}kEDati9PyT9%g0bZp^7c#R*<0~LbY4Etq4P-gc`TZ zTXBXa2(@iFwo(ku(AT$>V@RI-B3rSo0s&C~B}Ok3n%YWlRT)|%G{05YDzO1;WlJ4y zFpqumC~ql)P0EVOmL}*5wm6U$%G*DH9V++QmNY02s)OMmPlxiYZwZ3Jpebk#`hvJ= z9%-*{@pZ`T#uh(FUZS8bsE0@|LI`w-VSg(Uj0S}SHn%*W%h=iwMN7B&qX?H9yQ2qr{7iIb>2}n zrNY9!1TxA^Og;SX1>buqbY(lt@};@$XTn%hto&a0z5jdpj%LTRV-HnBig#9QaxT#( zO4av)?}Ojh*{ulr@6+GM-wBUdKS7(M$BZHgf_A5I=t0wLLP`j4g!V(tkmVijo`9I>_pw7U5f-BUJ^coTieABdB_0lch%q(el!`W_Xm=6> z@^%zEC_&a(@OE4~x_6fMx%ch&+Fj$WHf-P9XHB+tC&faibr@tBFf+_y71O}hF_rH! zI(w-^iGO%|PP zr$DA}hh23Uij*k(PIIS3S~~!=cFJ9_y;C9i&K+CG9-@syRUPKXE;Rf}bfC_V3&zQ9 z;7dYa4Y7$s3NX4uv)MmM2MCOwDnnE3}9}Qs+1sOJ^kH^vw3>kW>G&8S;>dXi%?;7N4-i6-nQ;zE1 zIo@U7Wf4jJU6aa3|1SD2hR(J{S!s9|c*lF+CPpJbt_twpcgWB5&ihXEo-;x#U>_JF z2pk6+Ni_7TXw{EAMDGo~DQY|-?~3pEOtBdJ^YjBW$&7r^vDpO&3z)%Bx;f!RaFBYu z_oDaZ_f!G-VLf-a_+9H$dgV&?KKg-whHAOs3^Y@{*Sy!h7cqjE2!{8z_o4TaGf18h zpdW~o=!Dqc%ZP4bpyR!q=$7|BFy%g{lJR0X##sti3PO}ZY&X73U3qHvPiQSR^gg2#ABC?EV6j22L(Gw%(%w!O>;8!L z>1?==Wjr9}igs}<1vzG?sO7t=UAc_T&#QKwjO-$^b~m!?K7+#7?s|3$yT#qoZh6-O z9eZ@U-XG-xH>B}WWQN@!GAO$1BQ7JtNBR7vK`~1!fuE_ zEAqCu8z#^O0j1ptfp+A3c{fU+1LLUTZj3-D%A&j*C(wmLDea>Apa=V*kT~_Kdvxvu z#T92Imquh2Dp?v8vmse!4@x5ovXn%)`Q0STiWFtV{%&(O!_X{6#0#UZ40HA=Ktb71 zREcmhoJN81_e6Vn##*3|vamc{VrZFARoED=5ULJW30H?r;aV4{lWZ+0=5T{(Isp5W ztprdk)?;FNRKpf-F^O&RbBDcQU)Ue!ou%^RpM{8UI2w+Hv08-+#tpQc$HH_2eL5^; zT%xlGSO}NG@Cx_j%tJw6`JRd)YWiyTmrC@R+9lEVbr){=L9na4)l=s?uhO^WQ1Edv>+Mbb6`(6gVL@<#I z2m00|Y~FkphUeIeB6J*8tG#C-p>#-_goc>dEM&CzoX0}c#CZVdD3N}Qt!dX#07A7N z@!KWfAjGpLJ~2G_aai65oW4Vt&>prK!!7L<{)7_W-V?KGLMJ>3=Y2r*Xb!Nn{6TU^ zv9W~PDc__Y)E`VA9HhVegZ6{&gZ=}0P=u3za1v1gf&n)vxgdlg9v0S1U-t*t5mXF+ zhVJPefzw~`f9s31b7lzkYnVTi9z{mE-97zv-jD3uM zOnj8Gl!rc+Py7a4(T}pDBsum`&ggN_hkz$ODj1%CKdpi$KB^d=`KUZ}|CUlfcS@;Q zTTf8sClA0{{FtYRD^6V1FZ=tMo`33T%YN3|lKt#NN7i?e*N69(WkSJ0 zOQsea@cNAOi3^VN`aCBN+A_WHK;9=iGK5g7zMq{?^!=)Y$q_WkFRy1xH> zpziy>d)0lCBL^z_5Y$W133Z?9lLJMc?kG5QM*&%n9vJ&(e%kY-*VOmZ9#h|+9N79k z_S*XX;lSQEbG+xXUPs>-y{^75j=K7OcHrncbKvRwo8ySs*Z0Lqf8WIufxf%Fp}xQD z3HAN;L7?wH9R&OSQ%|t(pAP(e|9lYc;~n|w@h3+jeP8uP`@TAo>YF$o?VC7=^!?8V znZCd2N%#F-Z>I0>4zhj!a3a)Z>zW3 z_xA^R{KM^qd!o|!567#0nj;|MQ|Z$mftT?}Zv~&@d3+GcPagQ>=|d=d{p9OEg79gg z70DN$THnlPNZo$lxf9L4sorMae>~VnY^}cEeAzS8+v&T~!|Q+Y62*m~0c#eu5-n*#;@)&2iSnWyRh{Diju z^OO4i^S#>s*#mw5^8*e3_5G{8n*LSzt-@~|wDkim{tf;AL|Pg9zdUa3|LUX-!L0qS z53K!vebU(fw+HwKU3vt7;RvXPBOsfO9Jlq`h=z~7f9=XopB!=bf79#i|K_-(|CDY?0?dOzf^xuPrCo; zk#zqr4^sUz2kHKqBia5d@k7 z);M{v-#1Mvy^pAp0tJ)4Kaxf?+h~o0}QY8!X%lL_m`&B(lCKxG7T@20n*TI zlypmNYSV3W(`~BJrYlvnsZH0YQR6nQsB}e}+PF=((WXD6MU5-fs8no25?)S7c&m-U8#+-%nhO?1+C_S^#NzFEEHkB@ zUZygoB`A0s!>QV|Y1G41=T z6~TefnDz?buK@lE;HzQ~fro=0?P(p)ukl)k(ya1OnwJfw4dVZ&*l5~F2M8WYE0s^A zX=G(AZCF;HNV~L*jnU&!+F^yAPV3O2aA#1sb12-ov}+POlQtU7E~Gv6P?FbrIjvH@ zoHoKPr(KQ4%k^k>JuMG*Z`vgVunIL`V`>(wu}HV0`NV0oN`=NJn>25!Oq#tCtI!;i zSR6g*O{O;>9A1vkspWEo=6F2bRwdwVZvx&9CgSa4B2x6GuvSe}%tI=#s!fxwI;6=~ zw`sCjucllX(%dEYYR044kY*D~p*bIi$6mF12oHI$#<^UzS95VW+p9SfkGD+;z?(^6 zqZ(79JgRA10pv+~c#@F9lOzvmhLhN^W+FvCpjms9YFN{D6FWeU!jAJm*)#g1s6@7U;-PHVLC7z%t`qg9V-e$I|-E=qU|N2`x(rlav@iJ`X`c24s< zOFRlPrP&})Xf`O5nhoj+%|mPw;iBdV<)Y>#HlcY5@RtC$ONhYZqUNB4s2M0H&C4Sy zZ_2c$PM+30z^-W?SIuZ%P_AiSVAnO5;j<*9S!68FYSzZG8I38HO=~Q%a#Xq(dR-Np zp02D-Z<5!hCq%PVc*wEosWB`y{rNSSUdfW4DcjR)6nnatSr8oQpHkPRe_5_g*DS+_ zeHoy&%jCxNj!d1`+Mb>*x2OMr9ZYY7zbHL9nvJGol+dXTr6($f(-Y;x>6PqI`a|q! z`eQ2OeJowAJ`V7S^zF)t^g(tU;aK{k`2VOpmi{v7!twN#>Qm`!|FY8^%)5=V14XT`tOL-E1-Be9fw>%^=kTh`EvStb_Io* zM!1@8#eXZ{TjVS0Ta>HmEr@GjGwIJ$(rYN>EDCu&U8h_FGf^3Js_S4TDq}aB#sAs# z9yvDSvHf5wE@QPiA!D_YoUu-h%lHCI&iF3ED{?|c8%B|gjwe7aH6vZwl#woPLh@9C z=Vgp|kyf9vPBCVzQ=2l@#TzqTXQqsIm_DOIV)hI(sar>eEITslSZ&5rDxf!JB&l07 zlH|6G()jj_kE_} zIYSvK>fwxX`9Q`K@dq+qWy2Y7upxwl85>pjJ4{)tR7Wz_sE%f=k&b0_sL&XWXT-}V zGUAov8Q)?j5XOijooYNokxynQ(y5G<%E^qC>{LbzJDIUt8qe5=|NGc!QI0biSWe1F zV`qsN29*qz3cq^CTYi5elmYE_qX11_agf@is%nrhKX2#2|%y`9_ zsbek#k4V*v6hla{7pZ$QpJ77?dl7~+br6wiG!xcr=0iC>s`Hs?`2RFJk8lmdGLxiP z5W5ayQCUjNY-SI;ju4gA!`5bvP{T{j!ZzG2Nz!CVF`BFtwkhj2mYVf2%gQnnM|oKk z5}7fJ^IDOmR$0VrEnXYNYa3qMvz||aqH|`I$gZpswI}N~#gny~R6c?;)x1Ye>>5fKLK^n!p=X zXR>7FY?dsY%_?VSvbM8x0vo@3q{6QrNt0Q*Y$B_aO$ji5;z)%bIFc>^d>-J70*s$I zQsGCAq)S<=*=2+)0*s$KQsKvrq^rns8d=T=Fn-%eg%EmM~TP4M2 zuV+!&*(@%b7d`>tWPpv;%0nK-Hgwvo0%hL_GZ?a z6SW2~JX&+I)~H>0D6Kga1Z!Nw#&b53dODi}4WN?F+-mj7T(5F6cRxFs`)T}tn~mkdQaPQAR*9dJ%cY=ZXLCoqNOCT>T$#u% zmnL(q@D=4cmE4EfOfGMHv$<;3 z_1q4^jLMVc*gRQ^&0Ec)^7>d@9>6+PLSCA(DlaW2IWJ9Kl~=^p<~4u~RcaoEM7Aj} zQKcbF%nLyv4+Qe^wy>i0t761Jm=ax=tsg(saip+4VUY-<*jF} zdD*NzZ-lHjXP#C)oTpWK^R%)vZ*4RirbjP5Mu`dBJb)YzjxO+O=?gYqMp$Hk;LIce6%ql;p*z*Q&+*S-Vkg)!xP05%3@1 zcggMALAF=>5a4eEwpLPFwWp);b|{A4Vi0#dh8@s$knj#_)09Knw3tzCntVuG#13oC z1U{l&tsK>^mX8rulIpk?n@qKmbX;p-ClJO6D@ipD@VM5>PHIOe(J5`ba#|ZNp8>C@ z!Rs0AXW1!)vjY2^R+i6cwQNE=0y{osQd_P}X}$84_60Vj{SE$~ie{7AxVtJJCBena`4rS_Q+@}PM3bMU+Wc(Uk>A2<^Y3Pk{JYhT{70BQ|I>JXP2EVul2onv zvfKs&t@*oH8$x^j2<73-S5&TiMe*dXmYw;lnJ51?=0fNNN3eK?^W){={4{ou@=J;t z#pj{?2UMe=Kbrpx-k-t$=Ma7(kLLdr|KF7l=XdDVc()wQ-zXo;->4kR*RrGeaHE_O zg*uHwokgL}pipN~sB`%vWJ^xu<9uU&j5L)W6El(Dz$Ou<5H65pl2jM-u~rJ~OZg+u zqkmk^Hz-%~4bpVJA?9-alk5t@G{P(j1+K57P*FNXiq+xrw*2iZO1GWGA|&WUH_)k7 zsk#xe#5d{I$r{}{B}=zXy-C->GzeJ;c{&IUqcZS~xRKJRThH{mY-SSR3VZq}&tDoHx2RaYoGb%jd1t}v!u*T9^*`$n{~aa6ZaKCIiQjOskm?6B@=G&`Z|XjlUUt-DP=rMpcT(;b8$=`o>u z>TBqHle%(wN>{F&*OjZU=pIvD(S4Im>fU8j2T9|eS(N@o7K;$4e^Hg7_bT8eS-)9M)x&JpZ&oMk?_jGCHtEfoNUhOp zWsQD>ne>m5kSg?$25t_t;~K#VeG;=E*byB1Bvma*5Q-Mg+&042soM4NvQr9+y4jk)wa%%k^GW%ugg;MOO}y&y8AFJgOfFlksnvJoOapkE^&)UQ!S^=s4z z^;R~Da6rGG9o9caHE=|~K{=-1B_G#+T769a3_GHKl^xT+itkt13H_Uy$bSqJ#zA3R zk0EtTf1Mt&GC;9#=IBi_8>h#Z-a;^o47@h@cJ!0W*cp8X&1cT)*UJ<7^~!|4o1N9~ zW9J2D7eMzS=w1S67xf+N62b+&Nn%&@9pq}A)^C)r>NhIWdN@B3q6{4eCDdT7AyZB@ zm?S0Da7JdahH04@4ILyYlOav97}8=Y3~92(P{iy8Gl3ljMRpj_*9{mdpneVIa-*SK zX)~0o+YC*t(eNs3HN4Gw4I@;IdkyR4A;UUl*sxB$*RY)pAq*po8eSxM9y8phK5BSM zK5qD$>bT(zb`&X(8UBd>@5;vv?;ofq^N5PQsP?+ zw#$x!ZdQxnDDVR21#Caw_XD<{wH1s|q1p>@;uPGwaMfIUftooHTnL_m4$7#vAWa!6 zNQ>E9kR}fm6tUp~Gl35jtX2*dtd>WKV^|;slIn1QBpoS`Vh$DP*kObt2uBNGiWGE^ z)AM*in(9PB8vgHNClF2*Pz_p77i^Hv7Hm+?6l_qRDHvg=3tSRAOOMHdr>IR#6{O4O z3(}RTf@j!N!5i{a0mJ`s2`|t{=L^n6vx@~5zECm^W~K|CV3!MCR9`NrmDsg{vFP~A z1+&rWs|Cgw`D(#z3?k!T6&9?O0c({3gNN~Q!NFxf#$&cXqsX%b;|jYD*6|lxh;uN7 z4fKl3)ezJyxey!K3OhDJ3~LKh)J6wp1V?gZ)s2v8iqm&86U6`hvC`^kvUYI7IC@f-QlnER&g{zg5g{$RL zgar>j@}#T9PNO_$5YCFk=L+NHiNbj09Oz9TOrn^myQxC>3<}{hD1?GRxD4zyNz!zo zB3&(1Vy+fq&RV#IT`wF_Fd>UFu9IVp>y%jID{QUtfTUV$oRCQQaRM7iCVsCF9Rf-!DkP6U^+L)C8V!2eI<`)S2v9D(|^ z9yB&a%Lk0-qLqWj%h7DFacwLgcaCWMNjC`pHemZBQj zQBY!>oR0ycnXeb&mOczfU9f|=Ak8?%nV5lfa zYO*L^nk>SSR}l>IB3`?=o=0`QXfwM|l&QK%T*4a(5U%HuE&+TQ;RK@fBigmpR*OV0V1hK_XIK}ZSPJAZdGoe_^l8br9tMIw1cqLm~ zyi%1~%q^!)#j6!#@jBU9T*HjT4YH~DIkl71m>lb*eR(P8P%MRy>k~;n!K5 zE_;g8mEPiXwX=8%ZZ>-K(qpK&V;g$_{vJKr6mB5wZmDZN%luaeNm`x>CrYV82 zbgHb9)k_;Swwxm82-cC3Wlo!oiXeRZ@~PT7o^>C5m*o zM2R_6vW6Wl$z-D?SobdBb%py)RL8-^i4wJH3@Ol@#!F=RWQi=DDv@JOmZY##B^%gy ziI1Hw8KJg%revLRwq%|9T**xMI&UrK$9$ zG%3%tkLeLCrl&}Q+Od%4FeNIrrn}S*(}S$h^dMkQvs#2kgjQ1r39-!tNtxo6Hq*VV z9l>ehvULIM0oY~AWG>Tg*@dWHlMZ#H8ZzPVqKQig7iXvrm^QG3rVXl5LGKU}9!A1L zCd|1JjtER#p`kho%wxbjE-+63a}1a#fHj6NPT(ZfNv!goGC{eXu6wS1{kxWEAW6`HD$+4 zo3iDrrfN1ziFK;$rqxPR>1sKyG)j6t$=kH5v_)A}`W0p=jm5B4+8f6lr6&_qj?z_$ z%wFn9lI^9}lUQx(kz~2C^kTBoSUQ``8cQuHN^R*x3f}ZLvDQ*fx~)`^+e#m0?eq!j ztdv4FbJ1s#%2O)Kp3-#ITiQXNd+|9`DoaD9E7{)C&1|@IgnZQpN@e9Bzy|>yEiF=w zmTqGQN(b2?ipH1*nsmJXNNEZ?Qd%S(E;Zx7nH?2b;*7s^yfl%Wpgb^3DUFxMOXHQX zQY#xrI7vj{+W`19z-LMyQ=Kk-jGZZcmYpj7Iy);;okR2lqR*9njZGj-mU`DfWlWWp z%9lz@l?$b%F&9cPH7R|GT@eMJE`=KdGMym;Sad5*RL_HjCIkjwqdQ;g3 zCAAC-8)YLbuk7>krn1lDKa53v*_#a@X)McBOl6sBOId?#DZ86l%04AK%2rA7jxx+x zYs;|lytb?z)1tC-G9vLX(W9}955KKtg>qY2p}M`SQfV)Hi?x*e9+>fW+HGEbQiinxr6e7G!LK2R2~3=?Yy=y9;jj8VyYsBDdV zsO&LzMBp6--Z9`EEwi#?2*=A_q-;){{6%OD_McoLv3_{=Y7-D*w51wd|*tK2$)P9V1?d6$rZ+WJ2uzXN`upBb( zEk6Q5X3JO0*O8m*O;tigd3=diWg7H?tMTWz#DmxYz92IL+wE~0# zu&PFYS^;V!-x9P>1@<_K*IvBtB}ABP70^5tg=`oTm;)j$4z#KcR;01ficHlZa71#e zh*yqO#LGu2pwug{azkJYj=;qERq1%eW_AK$tfGT_k>eEx`DBGbIazTh8?S(?RAA#A zs|u%Br85=l+35-$J6mBUA~?BfWJ z0Ijz2ZRS8|tUMP(I;^cSNp7u7QratFlvU=&w^tUi_DZw5y>dHqBD7XE;JZQHT6w$T zth^oZy8zz>`2B$25BOt9`xw3-$M@s-{w(l53%uum_Z;9q1pJ49zX3cf$yL6E@3)ZG zZ-Dbhyki5M6A#u_i4NIL4;Pgb2hS@h)UaNZ3=YPll^ri{?2wLCZd0AC+=l;M>?FeJ zN>rUU-dLUn$EMDrMmTe*^5tITEB1vsh-W;9OO z#a69kQB}Dtu8LzP0GtePGQbG{uM*(30H*?+3h-KhHxU?f_$tidt1ySJTE{e1R+cBQ z^}sd)TVJ)A84*kb)~PD0(iD4DT8yPCO}1ARF-Mh|*Ll@yrLk(Y+*;MJ5j5MX;^nrg z+gN+mZ7Nrl7t=14r)q<;w`#NOsVZT6tGoz<@^IDj)G!WIC8-ZqB`Jrh9+XF`UQvx! zHA?JI)n$nt#zS?uY6c@il_r`Usq#|0JX)2gK30_|AFaX$9E9UlA6A{H@>0fQ$at&@ z_GVSCYP_lt|0`9eD3wlix=N8xS8ZWutG38zs~%)$svcII6NQ>U)MS++O;)9`iK;F( zRrMw*lk-*S%7v=MHHs_!Da1o%sUzob52^;>oU;S$1h6$W5M3ev*MSygPEoE`eVav@8M|Hu*Fcmx7Q5W5 zptqvTc*L2x&=bs9lQUyY&WtrVGuGtHzoQbRnsFS!922w293!Qg)0qZg6GEyPix_6i zA{sJCj8GcKSk3Yy}49vF_$V8=2E%BjKSZG-BM;IJIo#!2<9``YH9A+ zk9kd_*{ZnAzm;9)am<8>ra~nV}TTnQYjcsXBlR@i%H#s}70S!-zd>-pr1e zH>-|{LL4(=6O9>zI1(L4IAKQ1!Hu&xW;bq5WG4mIDHQb#ih3GFJ%gg274#-RZvsV| zG^eYkL~a+5+eHz339*;VT6Wp2Rb4Tki`Jop)8>uptLBYztYwRG-TV{PG$hNe(&IWk zVl5LAn>HVfR>xY7Mk`nGCMQ_haW#T@EC#W7T&1@JdYd*+#Q<+A26$80F^GrisyP8u zJbFx}*rGwh+D(ojnwPY)6E!lFaWjEVoLFrLV7Dd)r zx>*)sVQYy6iyt_wm1lwD48dr5>NRZ7GgUPU^)@~WZ{}1E;GZY^ayO1vLq@V;P+Zm zWS6Ccc@Xwm8rDFW4Ov>`1D2MU1K{nTV0F~8S~+A{Egu%2N5J_Jiz%8NrSBxwF?jBe zfxvOg2(9p(0OlA{j9Kc~nB{ThgymQG|0{OV5*70V;!jyt$Dc<0Y0KU0l;tZ3FXH<} zWx~SL6P8i0e^Oxat;sRwJAv9QRK6h z(~A0>JOT()#Hz`rtUiH(+LEK||S zj0K*OS%`mw#jOcldT42mDQl$Wc9IR>(gwN z^-Y$AREW;AV%}-Rywi$#CxXQadkBlV))d)cO;PODhgqW)od+t@iX9_XbS+pRRthQ1 zWld3etbB>8*Q%3;tvaRGs*%~Sbq4DtlnlFftZ==FWH|GpI%CCNGi#>moB-i$i)zBE zWs_E|YRWo7t4QaqP-<2vH7k^wwToS{ewdxNzQbm$9Yha@Ra7{tB3-klvsr}e1jc3o z8#W8ruvx&inMK)t%i?SR!)ar~NQ2G)3AS{WjIhc!LalnOO_5V=ij-oXjc{YYHZZoU!hr<`rDO(~tEk1DsLv_Yh z$j;g}o?nLO3EM`(n&khIB>v$v;YS+~`6l zJw5jQoh~os`6nVW$CB06-S2Z%yXIJ$rRddxJgQyY&Y>O@vahSh<@*celF-`c=|q7= z0V%WYxCWA}ZMW0+%eODS>y~R=eeS{C)FRx9c?S>yxP8Tce89b&e_6V^nq1xa*S@&b zt>yqO+UXAOggb$MxAZscAZpKjI{GztqFLm=g{q`yn4<}*wjSS|U-)8Ww_M#nw5!Jz z`|Ov0;*M?VAL{GkSw~m9I>n2lPrSqjibbNkOa+zAP4%sH)kL&gZieuBTpt^m`7d{j zeZOZ=6u>et;Boi41Wm>47_jv?2L`TveNQ?HXAxgNJoJxV@J@2B9`18et#Cf$%^cb0 zb2$fH#_ae%x>L+IG=kXL!Oei*P!qd5l%En&%8pl1|8TLh?Oo*B3X%E?@0ZvXUwYD?dMM^u^f?p=?f$_PM0W~0mWpi+ZKqC(Xbvw71G-0>WQsvx9~ zf9BsO{YVy{&pC|T|9bp0Yuzhs{k>ifn#OG|-vAodw-Ww*3V6gyfY{la{wKzr9FROO zP0O&?^>Y$`tQC^k7rKzx&L`x4V}+ z`nr42LFNc7cMQi3+gA=j?U)$CJYn3Zkyw zV%uqLZE2~m}cL;t8p|0 zfcd^(eziM((COY$S8c1YG&k>v{^B{wtp-!un(Wn0mL1<8{@G9Y_if^Pg1(h4o}L~O z!H-_;+s;Ma3}M&UYaDg<_zxqWb+_4@b~e;lTDH_T)$ZKks4Fngv$}pqGv_v;dB@J? zZS_0q5N)a9AcZQ~u`U4287eT(DvJT*|LjcjvN+XX1!ck>GzWWT+^Qdiw# zu{QTm8J0J@`nvoQ{nkZ$n>(@9(Y%ExwAgI+8o?(kjTX!}$SZrJh z-Es@>ZtH(}^K0&S^n2ToZ=m0Yih8B-Ta|9=#sVU*9Eo-(I{NlGdpuqKhBo{B3m@u^ z-d1g+QNBBN+m`ye7XG@trNy-$HI1>f^VK7loiI7X0L0CKSY%Ue;{@YHqZIbYqu z-gy$kVLyFqWs5t$c}D}JeFtj5uOSiz#A0i4+=kZ5t0dXp*A<@l#V=S_b;q>S4!EnP zZ~laPd4tQf$1i++r)$6+*H8-;P+NZ+Z|>bP_^fT-%5hgv({CK|1e(9WaL+f~$<4hO z?YR6gMv&GUJn-&)-OF2o@QNR`f5)AOPV4F$ghA8^HQs0a(7q3L$25SA)YCsY04lCQ zj1?|eJ=UJVT9_4yj(rNMrkK9vUO zd}<__FRkc>ws715m1%EosYjpUYD``0+~cZga6(^v@{QlLbjNIK+FHk}TR}nVYPVH4 zCA_fyL+%7IWD=<+ci)G9c1sD`J1TI{C90XE*x9A{1;=%{(&GQRRAF50PS{Z^6p8iL zt##FJgSqaTT6WaV)hhymwr!TWt@i4J)HC7{ajT=IW=p-T zwfQ?#z~z86+tJ$rI7dX|L3FNt4}W|4mv|ze*jk&K>zhbPpy2`sgUb)T@g<*o8Bu^- zXbkC2K#Ywn${rH=-JkpO$2j9QOC9=MZGE*pj?%{gtFC|0(>?s_&d)!|6WM)e%GN#Z zzOEPlb^m{(1MaB3)iwOU1b%OG1u|%CwKuh)7q_4te*PLpi$nlxgg%CDs?+@$uq420 z{V;2dt>)Hk1SS3&TOBQLQE>?+kc^`g5egA&3KBB~hy`FAvnqfY$O73~0mA^yZ4Z~f z($MN)?hW*)$3NPwZXq+KzYp#7;g61f6W^8|*nIc_pTX#Y19=d(5QBXmAT|G(y9=Ui zayh$PzI)|wzD8|+x2GHJ7^>x84|VD!|fo#y(_p6Yh5yCD+2K%oAO;v*#H#&^`4h+K0+V!vH2MUJ)acXbX8 zx}queM#4h;F^EJ131NAeFL94MhEzzi;bKj9bZMdS*P|D2cgJ@I%y=}s-u(aiwHt#$ zlgGU~&=@{K6}+5dq4fdDOGrvT45!}yeXf@t9eCXx*9p_eiRr1^O_BJl>F1wa^qK5$ zmfGe$9xv*D$n~4_^IrEYA(cnwGjGkFPTnYgLp2k}Tc8#bv%fw4KY3puAGGm5Q$7hI zA4gx8Ykz%r9A%^ypc?1E;Bxwo%#@S78J5;V$EF`!}F0#K+o<>Ti%} zc#M`hI=5E_y0^A9Lxwh}g#KR2(UbAzYwiRfV8B9OAyC#6+gG@6g08K`514_&IfZl6 zC!gAfat53#RL*6#+MQO|vU&Hb3>bfFcam-6A76F=hP+U6e~N1zv%i4a5tYOT$bsE! z$8FsTB+UIZ_xv^6*`4U;&JX)u>J}BoO6c+W)@D05BfBZHIZ%z=a+}>ld97%%)o$tU z92)SCe7Y}xrVP_YVhUrKpDQb2f{EH{kF%%WO*2kDrVzbqhoz=|D-fHiC<`hN8BqR| zos=>qz-v%vd@yzOYwl#=+UqRV8hf=Ly^+u%>e_8ESekeD-}BOr5544G4!muSx)!pS z&k{y_OKtxU2D+ia!T!G4D`$JUZ@w`LKAfC+Zg(MsMN41?#}|V zE_iha_x`e0ac-fei{;CFHP2F397 zV?zAEdmzG~_0Wj?Dj}^8MS{_cl3?(~pgrhu4O}3MFfsav48iG7Zpg(S9a^0KBBa&f zxnRWZA4Yjzqqt3Bas8cpnq1xlD$M8qCbU~Z(MWx8%evm@!R+B}LI~q?4uM9Z zX^IZ3Hi{M<+`gX%EttP%!z(Y7-1C~I*|N{V#68@4OHB~xPC*z zCfD8}_yBmVN%zlBh#_5QJ~c&!RpMNf)!Dhn?V}N4IU$8Li8&tHxNZrAVpA15n<9rA;o~$Kv7{j08w1!Hc?DUC?}#!%>wQ(8jVCkaqdes&!R{n zaC@Hf8)EB^lqZjUd6&4RNlSq1 zfP6*tUx z)w>1dUqxv`E0BO9!QUuButA|fqM7mvTTkhN)i@VP$x|sVLi;AgM(yJR;dxTpe*89Q zt*dWn6Ga94G@=5DHc(7xodqHUv(bo#kXoF(>V233S9kvObK%0KM(&TSk5m(ZNEbzh zDMB!TNMz&frns(_-ihWHFk^Vq58nNV(QjU&gL2t%_`mc&n+~Ix+Eg`c1rB@e_gBB+ht=+q#p;H8Nip&AEm?m=I@Z;Yb1`wmKk2ib{-1vyeN+~X z_Nlub9mSyQ@3KLY+HYD4tHV)|<8^P2fHbGIXy)$f+D>>G5%EYMSP#wd_)eQ%=v z{w45g2rnxlQGpjAEzoNTJyL<7LtQ;yfmF8u5;~GVs()_={moF|H4t7}LD4T|30{9Y*NSN^f2g-{~Z8&CpLqY7zVfRw*3ZX=XPg#@Ya zYS=-Tb6P5-MFEqv)a?{MXGF}4M-5R^ME7f31PxQId$5Rq2cd0-Y;L3bWHgXZJ4)k|B1hh}Du&7-rAZmT+MRbyZW6Fl!ZROyJZ~_BYIAP{G&|VuLw9xSbHfMg^qxD?N<*AUf&PHc?85X%RYfl6XJ5spp1PlHDcY$uq~IZ*F)Vk)?mzUCWs;j=d3T7m7 z39Ls>ArflCpf4e{0e3oYovyAglRG_3!G<{Wo)D!9G`7&Sw36`5gs-=yUu61oicF@G z3eNllJ}IpKkYYjg2OM4udBMNC)#vo?_H^>at7TX(8SHg>f0zGEG0kM0SlAw@sybEd zmOFduu#ENZA9EhVp|Zo;DZs^gaLnu`Ux<8+xpRea*X_ zFvQ;Zn6rpf3nxc2d7-fH+4aCAZnq+@zi6arWso@(xqCO%R zwe@?4DT9v@vZD24|2X=ALD%0EPGqjV_oHfTm@s@;Rr#OfTOz@CdEoKR;E>H|_a zPdJIZbaUw#!Qwl63aYF32-!tF0thk}JZ-+|pD6PHgS;vq6lL+lAUh%54-+`aFVQ)f zzeOTlF()j6nh$A_4@DFk6iAi_C_Sp(inX3^f9$UE5D_;I4)?f>l*li3kms;m61$pH z=ifix|HtF*<=q3VScmcT!2Q{@`476#YUWs1z!N4OyzV*RoAohkHOBWl1+d9 zq+8wDgSs3hC3}rTgl|$j^t}uM!uEp(SKn{;+sCo;gSWYMu*inM{#X2YJbdr$V zJz(wc>8hcE&o#js%!nQjBh%Uk182_{0K;;!qt{IfUbLSJZHU_y+&x6Vmv-DXO6v^V zfFS$*ftDAx1HcjZdKYavC95ik;?8{RQ#9=kr^K5**+t6!J*i~5&x>xwOqUjbv9XkA zHn5HGHr{|Y56c29tZ$L2&vl9#TWS1`f$u+Z|4(Vlf(Hfloh)hY4%-d?vojuP2LarDXJFsB(yzBl4?0y;Swf1A(s+TV< z4!2Wp*@2K_f{Mg#pHHtWh5Y|_pzx~6W z51F*V10Y(3n77`W5qBS~urP$JaNK)&HxM}Y5zYs~acHVW10=eY=You0-4wTR9|(x`5$g|vlnA6H+gsYKK(K5RrA7Q z*tv%aBkT%x^xuo!D|w~_6k`-$?^wC}cXzsP>h$qA?BJ&nobP0KjW$*#wzQDvmo^{; zwoG)daB$o?E&TP-OMgQ3av*kd^l>enC`w4*hY@e9aMP8iY2t&uM^)`q{>Z_qpScMQ4Mv&()LvmygDY5?F61 zWIil$#G#%qzQlPMsKdm`+4I{~80j!djl2t#orzH8v614{Iz~Q+{B*0i4ti6 zw!y98?)MEppndL_M9wjQvcgj|=-gm_;ktVT=gimd_F;!GMv}eY&m9loz_$KDJ{bIg z^Fe5VvEg3ANeP9B{RRgJPSPA`fXVIZ`V*yGPOSKsHy(Vszb{mPe( zOuKq0ap+p@5m0bv-iRu;(#*&HIAO0ABJ?kx%`Luuu4=Y{dWI0My~{Jmhx3%bzA+7V z$PF^)CMZO?7eXd6;>1L!sFg3>TJmRfjArlFo?-9q8s~8T(BQ{^e0Q`v9>%(WVf94!1uRf$Dn`b%BIxsUc#6YmWu324p6OIy$sd`?RDU-ww#dh9cZ5I`0jKqYuzuf zY5&w#YcqDN%qZP9jU)^$RD2JUc?Ca{~mMZP* z!dP#s77TM~W7i?RN$c0yYj_SREvON(WIrf_w*oFc;;hLM}ku4`_EnLtU*HSE+t(wftg_JE5+2Cw6c_Ms$op`T8%gLDyE@ zv}I>C_788dwASzgB;7ah{nbH4N8Ofsm8$e}*eh0D-MkY=1R5;Zdc})>6Hi~q_e42b z?3^&?KbhkaD1dM9{pu996LNt#Y~s*E5>Jkiu))s&RUTy6yc-S=OM`=Cn7}{$OE8vo z&+K)CgLZu7A0GKtrz@7moPj7Q{H)G0l!f+C(`g;JMEHPChYvb;CvicDn(qdLEY0uYnG0 zhBM4dx?4;HiMUT+9N4OE4s28B`B@jE6g2l2q*Jvp9a|kAb%q6vk{~aEjpdw~`bCJK zSRuzogPUa*>ldf6--pQa3ZdHQQ!ee;nf!fe2!+n&xv#0vj~lT zp}_t5Mxf%`uh;Y5WyWUZ&cXeLA}%JZargSA6r6J`MeNl)M{4u13uyxTUhI23oLt{h z3g9RA9)ft^MbIvsr$09mN3gOo7fzG5t835~#NN6vcIW~iCGr^z{;3X{W@scAQTf8e z(sp%eQzn|w? zwDi=?z5V@IHVdYWtjQv9j4d>Ni^;!G96}^=myS%tzXg?2i?SCio%>o(AJ6suCv@%) zNw{^51e9BWP;PSro6v6o$@sB(rIao)6EX;4^7&Wdh)bdAA~(hxWm?@ompgZa z1}O|KkprPg$X!Bd{~oGq%Mx=I%l_og7daOORWAX#9PLY_wS?ZOUw~Az*X8OG(-Ry$ zhdK?)v2dx${9cn_%7u6j&2S04M;?SlbMUhrx*kV7_zb#m%R@L`xm33;P^N$sYT<$+ z=eVt>e}E6|?`c*=wq(MX3*QzX*eeXt#bJjfIE%KWuqX~rU0QMnb`!()vAWA|TEur~|BzzHq+4A(H)J55J8sA`*td8F{+$X$+n^7&L=F~`C@k``u7PaR27{UTNB^BW^=Y1=&NLl= z7HRyJ*8U~tP3`0FpZh{%vA=@J8wKl}I}gK+uZ2{dKe1zgdWsjDo&4;J24Y;i(C;6VmKI0Z>wBE!f=eVEQch7MXS!v!kDGcinEI!I$7{T!6loWqS0&a;6B^@IAQ_A9W% zNx8a$9P}?<_P_t|yoBB-G7U&=PKzyW9B^UeE?%m6W9$<2qEKS|bZ=08kzE5}tw5v` z&H*lYZ$y=3S)Avkm@7+Y%wpbw<<(#@mLRZs6Cd;9>@LBoSg6->FE3x`Go$5-?!f1m z!uobEz(9CXey$sKo)EiWhI;!#8l`DzwLzv5KjX@G-UeA-qUh!h z_)$u)-Z&>aig3|_w937ZofT3DaUv{O_Jw9nA<1~n36&;zh-73fG_?<k0?hQ?7`vRq$ON92r=L1x({e}YUfV}Sh zQycMxt!B(kgBCJf=27BZDL_utb7Vh~=pOzVy4eP|RB-p1P!oco_ps0+cfa{WgEw#p zVi7$_k>wjsDv~0Oti*3f7c3U*$EwD83 z)e>6sLOqyoZb4gEQnfAQ>=cAhX>+^4`POP)0eWN5AI+hQs=phlaYAA^u312l%q8Ta z^tW|N>)mhA1)WpaeC7Y(tlY6E#s8ZZZ6P0v;COM35P98E=r%#)@9*GPXmTv_T#Djf z$bJ@7me7bJn=7>9BW~7vKf4#+W3e-g7Di8g0*TrV{F-5t;6NO2JCVnnaK`)&D^BaZ zwp2v!rD1gDj#n*6DDof_Mksg<--47PYy1#Owp#iKaS6TW%EqEhg&td6kg26ovXjSh zK}t&~9&O8|)6twxr~(Pz0L2@@5=hZP+)^YJS;>Y8{e8GVBAbdK)Wnd-_W)r#F_lv& z*+toast@errc^L>X{VCdhC%cLkz78J-9;g6klFlxHoru6xXmMoisP5ALF~LGh>}HK zf(cK`w}A?m&VEB7PU`evODJr3zW04@k0>wNq7p{Yg8S4-RQrWNvS>q|%V#kMMP#!m zq(qK^AP4gtzmaD`A!)%rH#mj2U5IeeM3E*RcSRgz=j9}BtZBmKKzxTA-&D?JR-otY zE4Uj9O)PBdIj@YR)UAJW0qtmC%tUEeI?F_kGioRfXEbc*JZCazF{<;OS&M2H)DgdO zhqmx?CW1?B;)))M;CU}PT9NCG&cXyY6GU{&WiM6+z6pzX5i^oI7sKbLmkA%|MBndv zAurjY%?mjMmfHTec|_g`64HeKe_IQUywzrY&UAEsU(_@Ne>|_iBJ@1( z*_>BlDftsO{Az<>=Z)-d4re7u+=_w(MyFS>aD$>z*M z!DHKEt?2*em}*>{JnAqwNK<)y-uJdV{7XZNj!$ArNTMc+kyf3<+)u(V>0O*z^4$JC zH@fXuT9#yv-%t>-E{&Oof0GIQmW)_@^P94Znn%_BVj3&%L*%me__rf0s+QpO3EVmu zmT=Jla-N$tZ!rl3&Jt2CqRlSaL*|!CB#S&959y9enbR+7M~G9X3s|ngl8o$?3t^ZjabN#f*qMTyY-GOnM=F^)r&r3E#ob3?zZYN7rXtnj5d(^?l5 zB`J)r_p1&UJkaE~Xcj!vK@3E<2dzh@_$0e{b4XbnXO85G`^M{c1_ z5_1%-xL?ubn>*s>cj|NojyL*GflvtqCU3Km?VM0agI9siU3UH=MqaZEP4-?#4h{WK{8j66u#+s`qr-q<`K?_NcaX^L0-?v7aF+hdmi}^UWB2-uiRO*pdshF z7AR;4)=~=^l7tgpsGuRZg8U{?&*IGSyn>328Jy<&h{6*Hf>4I2kcbi!LJlFfIU>1G zG(l7&i0UF$LvWiV=Wt_0l0hUvFh>xKSX_~PFa;-@9+B*PR6%^9W*)MOk<*Rb%tNpQ z$;F#_ND@wXq1q3@733G{|9(z2axV{{2x3`6wuO-@O9(80&q<~&AlU$-AiTH` z1U}!x#%V7kgb-XoK2z{5)_Ws%0h_SrIOz{YWIKEh6Gz<0$@&MEd1U!65sr0BL~>#m z2}f9{Q3tuLB$aE2U0=`@N<*ZiGxU__aDAx$*EkKEv-kyx>Qm%}e$K%@7hgB-NM#zY(fE3M29!tOXBM$jCIPoiSz_|3scl0J;SY$te z@Mya9j|d!z(yYSIz+vAmU4@08YqsCs+E9((N(G7HPpJ$Qz!{i`)vV)4bmvWdT}xAa z4SxJN@LSZtEFTw`Id8{m;=H?jO-|2%s|yipZu0)81te6O6#$Fd)8`^@@kdHLP4f_b zoTCqEHu%9YA!+6!H~AxFp2j-Vi_@-1lja929BjvL_i}KCAFSqJehnO9XZykNnq}V3 zLAntTz_-6=nzeIQ)d2c$5(oU(ez>Gb035fUcfucw%O?@_TYprHW;sRqtzAUS_#sfwBl9JI-8j7zmG5yHm7TPzVwzM=}cmJ@(px3wYqnllf%*q zuXQH*bYiyug47^2PGir82kto_otj@y+-BiK9{Jpk?;Mm?{1rq_&Z{Sm#Hoz`c-S{8 zjR)%~nEsjbTN4gRD;~1VB#+J2Q!wR!T=#tAuyi6ZJ#ZUpn5D)!cqgs+*(1^lrFtg$ zcw)ByR@g8!A?3!lJB~`n64Td&)p&?G$*JAHZ1cur(uyZQ?Py~5&7$3en!nsi(vkUXNKowG&&fSkmwnF(X@$-{lYDqy8w%iYTK{=(jb= zacRYOKxK5U4FxcG`hR>OR(n!9IKOluGX_rRUv7K;E2pFt+qTRkADCCV5L8a_%lE(1 zby^w@)_e#8r*(Vlksq9qR=f#XLvuABg2br|9sIX@&q{j}({B!wI!EK3fRlRk-w*uZ zoV226>r8TQV)p7#p$9QJy)XXyGfz)Qo?x2}#&b$_&s4QdN-I>`W|CcVZ90guCZ^*zY=ozf_i52&IF-0hJ^H|TX~iR;(w>-&pSTU)!z-{jo%HWNZ@3_}C8j6% z>4Z>trunU3UX)g>am*yQCT7PA3L$C#<0CPTUy>T<*H_5=o->l>{@lZtr4^q7nc8{v z6@tpSv3z2(jAur?uSu+>fWF6@}YplI?T#6@tX6WPal1gI6U>V)lB$a$sD7 z+cCsh!cj-ofAy{zsbYQ+LQ?Q-t>3X${D17deOO)Bc`ta*KAWR+4(FQ>0RqAyLKcdl zI*M?FY80>qF|LV?EE5qfY5mozh!6 z;r8l|NkS*wDKjB0sY$Dh>6BjR4Shmd^%^%Q^Ly9c``v5reLip|^VigV>=#(S{af$) ze&6-^K#3Ip+;*(lmIMhZ7=Pgh=l}DL(qtw<0tl|R{^Gy+A9t0=?}97INsvH-<$>q- zdfc7{vnd(#xPoHy^8Vi|@I+2LvmLAFreq+*_uk)Z{)FFC7ygi^@%XWqTy7=gi9G)H z!m~~0ZKm6P7;)xJqOpKx^BFf=rs;R-md5G8IU488iD%jce1%N6n8$^&Eki(w=P=A; zS`2#OIc-pbA{DPL{k>~Sag}>qiG6L_EOe>M^|e5vpp6!JUvjx>-%jk)w__v3>rLRQ zO#8CSAq3PUe8y@Detowrf!C;MDFnZ?Dbbn&vEvF1s_)#ZkEreEU+#Yq3RHO_-&k3A z_S1)pEV^l*ei?v)vF{xY{;oqopQND6hzjg&iuc@M+%>7C(-;(q=mS4<_=&Pzzl90O z``QmArmrS^$OLiQGJ<^XB>XgZ3C)p=@L|pg{DuT)$%!&EC!o>0-kJjOVv9(-o)2JG zH){OP;{_ve7M^~8yT*M6vi8?&3UwWf64-uN!4@l9Vs#rxX*hwx*x zW}j|x3QSGG>HZ5>Q`*m7@v}(5SB;dQq`g@4x!QS}$~xhRyp6Jcq!8D_T}_#Puk%DU z=^1Z85YqKr!mDi- zrC**(MD2PaYHw@8XISt+bt)%B-XcV$Tu$AfpAMs;AbIozBmG)~;_1JD7ar*ssS)AV zcdZ@BVO%|(d2Nmo7y0*RzW7wXomueBK z*QIBvuf{9jA0rlYFhP3EepuhATSHNP>G;>5Z4|Ap)_n%3T378pJv@%z6tslsnSMNa zd8MECk5Zdx@I>Ab^*oAgVAz>{fkOrDZ-e$l^(<<*nT+cJqtYRsv(QGrid}ML^hY%) zGoFc@!fOvo%v0{^Q4%UL_$7SSqxcf;M*NWUcoW{XXFqeXe+a*wQO~{M-iqx*-`Au3 z_^^HjyiBaW>p{$2VE)vNWI7x0bpPJOcv# zuKK{~j~n{cIyvnN*2McHcyByv=XKSp)W3qY)(h4WW+i~HgW?bRJk24LMHGolu_86j zL{blLtxoMw<4=e7u7(Ry409A2iu+0Vkw!{r3u1Wds67TB`YP=TB(#QBDxEQA{eV;P ztec)FhEs^)Z!$DCIRrOeMZ3S&i zDYYk(1`=!GEHbY?U!!%W&iZur&uV(=l^=nz&+Pj96tBh9m+d90P%DDH58c0oovPBg zYsN-A()W3=w<%w;vj=2-U!$U4XGVRb(z}1@g-_z^24Ao8Q9GZtkSSlcbMlGP62x}~ ze3z9^<>%XFK7DdV(+_>6vCEX`o(0{QLVb@VGm(9k?$=*Lqmv{1BrLc1 zE6rAn3Lm=c*&AzjZvne!RMvZ?&g8H>~wK1+40orx`7Jtx7k zp_-U)fZ6S#VzlWmF^ev+o0;FAQDtXydkxg(o;!+zo7)?8Iu;Y#bc@3Qq^6JK)N7(S zcPbV1e>pV~NqV+DRMI!ilD>(C?QTRANe>(yt4()V5Z^>e>rGH1mQ1>Lz})E(Hl2mo zG!~)c2y^MSfW#$l@~7PX3lOF}LF9;q4ECeO1q@&_EL6lF`YhTEYr~qWyJL^xDx6!lD0@RS|7gO;qP^8UjE)Z zM@20EJ6M|4+sYSNB`wXhoMy19fm$=o^gBFJo^bH~6Jm51(|AKITettD7_FziDAGSg zq}{5s@bX2f%}lvqStX%mZH-}KwL*gu*1%bHG-I0%wNdO}L+okwti9^E5`}F9(KdJ@ zm2WDw1>!IG*{5bUt&@3UrR8pl_3MarME!L$pTT-l$!^@gWjF5SNgnS*q_{nA+*Ak@ z_csvtggRXKMb%R8Y!(<&YfSZFHqw}G49M|fw$NeB{%wt)kJ6%44t}eq==8OLfno8i zr6uG|M~D%hG#jOt?bJh~a8vl{W6y)x_fCyD5sKf#U#%$+SHR(Czw$@Okv`55-PE87By26uF#P`qO zt1pPYan@3`Q^5L@b_0}?yJcY`4P?g`agz+0=i5^{I%H=@qGt>4b!bO ze7T7TYVkzMC@89J=dlL1c_K9k{PbaGu^-B5Q=|_O>E(hyedC}dPM1V^5XQK(3RiI)&K?_iB@)&z9PcH>Fji2OZ`e#S zp<@RDy{4y47L&&R2l%E6j^^WQVLqq13O>3Dkl20%wz-0~0!Op1^`6C>ofpnDU}H+c+t^~$JE z4pTC|iDWDn9D2iAb>w0cGnAK^)S1cRo&dVGg7}ufw^=}LzolNl4%C*5QPqAC=GybG zq+gDNsPr3CD5^h4R7vmW?NNDaJpe)dAUu7}GAiVG=5^YN_@w6& zv95r%)BF3`S+UY;VO`F_DyA5T^*@3&<(*aRUAgIco83(fR9$0IXQv`xheO=c;2!oy z?HXf|m5{=VctOm<>CVG}DOJ#SuB}Q?@uwPx^NdP4~XX?e!H)Wu_-h zIhOZ=Kym$yLp523h~W=Z)D$Z<=_+c>M-*; zr#!%Cv9gHv--32x-&1y4qpcc6H_Eh5!;@(BtL}*L55PE+y)t0oN~{Ro&dq4twnvPA z2*$;nI)0zBa*`RH-GTL1KqCF0K)SZ?p*`W=L*b_ z)LG-!RRXzwW43gr6pBoD{b!@~Kxuf|9IedooO29YiQ4!_b3HuNXt8=OmR zcHvt!=Ae~f>4qjdR#`FUIHup$z`oa4p<0{onVg!5iQb+3r0j{!fwXroqy_tpktkEa zP&c9VHp0sOcVNA|mx75gt26!fHM2hk>6q_ta;Kj>jw&W~w&ag>@r|rh-2Wb&Q%*&l z^|GEhoizw6U%HP$l=nb6=c5HfO9gULHZf%;H9@J}W=ov^0i4Ue@7OslmGU$ty^T4Y z9fWg%?tcaCrthVkw5^I>o5@1#VtU=k)z(+UUSw%L|1baHmjiD9muNbF)SS*A&9QLP zCx}Ne>8Iy~Ol+O5T>*Kyznc~%EaaB?T75bPjngltF$Z$-Yjb+W?Amw0pY*R|8q-4W z%evb)d<)g(WyCe?CsV`{7bX;p zWyc{J>h3XZ2K_HnHt=< z+2F==G`KB6J#IEQ8@2wPC+YiPkZ=3H@`l$!ZK>q08fiP%khg~RR}P@@U7|i|m!r}* zA~~Y6-QiD>oQep6M-+l*|H_agZp;SP+O^= zt72NcPFrbF{lt2#n8YP*KLpa|z+qGq3#nA6RjSkVOsiKD2d(6B{46-T17zG-IE|`D z<`{X1P0Xn~0#;6Y9s;U(QbKe2apzq8Sm41pYoJKgJZ( z?>OVD32IJ=76B55ii?zWu>!iAs*MREi!>-r#aZSL7oP8ZX(Dj;jf0bBE0|P#^86v? zSxPWZqSol6WJYFVQtnScIukg96j@lYjW64roU=C`;213(gq#-b^&`r{Zy>_O0L_J1 zBBY8r!aTYeB5OW)L+TRV{f*SUwZLyvmvG0-j5|5HgfYQ=2f3mbxQ#o*b(*B@KO&-? zz_*b-mU!~4L{MTTIKm9YfW%nG{eM6_u|hHK+ai+IY3<|wG)JNLptdxL8yzVX{|xr} z!lTG@3puGd#~hi}L?x7(?E?_C6{6#^@<>zhqT`y+LrUhKIs5QWAnh%@WY1%JU$Dfa zx;1S}El9;G7bWk!D{rQeF+~!m^!e zfC-(IN@RgFO8uw8*^{YYw@`Y)Z0!pD`USKJXCZ0y(*Cav@DB%nofNjvTNEB+ zMvGfu=0l_Wt|IkOe+SyzL8@RDR#(E`cHzP^I2Cb0>_ej3JI>^mEr}Aj_0313{|nGh z2UA|uEepT5CZrX~6`ZeukAixuzEe}E{Y~0c6x9AAZ7jlehrvtQ3LSm)wmzl&R*iD{ zNz{ZRn8Bi>Tl#*dM*}t3Ja}~|eeMd-jkh1x6k>Z-|B&{!IsSAMQ(JA%^o!Lt^_$u{ zAu1Y@JH^R$Hdd{4G~Kvcc?)Ts57Kg*HL3E@ab* z#$&D<{WUoKAzC-Ga)PFyf(8z1B$l1pQmv!4FE$4LZ!jf7Uy-y!AupiAv@MZ^m^NEw zMo+94Fx{jEmd!Y42DHcpGu7g%0J31Kb15ovndko>bqC zu?EteJft0z-NQ_ptve7-Li)mayai5~y$R-6IBZwfl~8ef^V~s~>&0k7Ju^5c_We=} zqZ~uF=7AWb()I63hIgMk|flH#QdjV_SGi zjM^*asJ)V7)V?FASI{9@95J0*8nK7L-5b72BesRwGGfm%n`OG#q9`7jr<_iK?{fGU zYPE%qYV$m^SgL}~Vm04i1kG4jc%N1td6%%=`&{G*EWNNEfwntTS~dB3#4#0)qf%I+ zz(xh@BJC>ES}Y(7Eu6TtNdGyI&V@hwhS$Q$vv(+a;g7BxoUa}Zp6MUJUKlY#U(rtJ ze(U1bpM9W4aRj?2fP0PxuUvfwC!WzgeCi!?Z0Qd~ulwFASEpLr>+0%1_m#)z%;dkg5 zROkSWfK=fuK8YTkHsybMXz&v4F@gm)D0WqzN93E~6z2XdxfSHOe?<2+^tHUZm3Or2 z$rt!%sNvN%u zcDQJVVYXd`)OH6rR*PqB#%lOSMj6xPWTe0=P@ppse&a2R0A_8nX$@7{ME5Faha(r>u;!Fkn#-*9)dfV=6{bJV;nIa;WQ0$0 zRGIpn&MTBBxYx_rUiVqVbUT90GFh`kbP;!%)nWme37{lYu9!vp_p~=~iQ~&OI7z$rE+Dqm2sta3$llZL zy>*T(Q+u(m%ncyM?Fg;R*<#$o%G@r;WUZNvW1B)7NlNQI`MgoRYpJdufRJJCAZ4LYv_&~ev6t?C-Y{q6^zv(?Czxe z_yjm7qHo(dEeBw~5Cm%vvu5hcoF{AhKs*zrt*BOIEpvUOZYmG)^UsMv{>cl2SHx!B zPl9+c+L4pEm52wJI8&?pSQn;I&-GvE8ayv(e*v^>Q94tZUEimK;m@>|?3J#JlFa6p z{_Xd^wG;g&&1|omR`Yret9ew=uiM>t3%#^b`!XVk#W3q@p_j)t(UFfctEGupSPgUR z6;Rg4K7qDt;iR@Z#Wa?*8~4xPIxH#eQ_1!;GT=oVQ~w&)SI`9dpdTRJZmKbIj-NK{_Be%U5-&- zn~hY=3HhsN?4pX5lQS(m^;_WF%+FcEoR)z>&S2;X=ahDYl ze+k5$@!zuNhg2hkzU@q$z3^~ZRHyJZz5>ovyv)vteHnbum!i$~s&s=*UsZ1vDs(qT zq2KOmTr?&1XOI7fkN)Fu{5PpD_nV6?evdg#VL!2+60Cl#vlu%F^#>$$R`c4R4}tr3 zoJJoDwd3BP%gkt;*Dx5R`IHurO~+rP`4kJAsVGu>lbLh_*i5l@W0zskp90%_{L63D zTDYuEiL_sEjCpnQj(N2{mHIB+2S&wz0?ey%9BQ>N|GzoZI>C|aH9K?Ubg9=B(x4d{ zY{xI<(ZKxz`gdG2r=R>W*7eEZrjxWY9H~7gwG^Ly<=ViD6x&I}<}dnbrgzbZ`qd-x zllt)sqe7fa)*#Mq4^}P=6wkw$*@CmBoEtw2{Srk>bZo{_BIYaXfgO+eZ<{HXH|PVk;CG2sl7J>KjkN8 zBD7|43=xbJ{h>VqW1NCP(=iN$rkL@C6E`_fBS z`e}w!rP-B!R>Yolykq?%+T3#!lvyl#A-gW16yC`wQ|cBu=bdxY_G2JjD+=04trBD z4^O-BmypM`>)!R8#`$sj`JaD`D_hK8_N{rIj48@w#FdKR)>2n+*Yo5pw=xxR-Hf(5!bB z>2n`(`RKa8)q;){#Wxdixjz4ezje6-cO%#5A09m9deqmUzbl6nc&Ge0-!Af@NBQxi zg?bPfp$KhL?jU%EgNr(xceD}7G*GjQ@^=``4`J`#Mc5pN#X6q7XuU=Un2mX0?irZI z02-L7;YKp<{sNXFI5@AQ4o?ZhDkH+yT1}WgKJ}wTfx6GA zxbw0yLRR4#GRm?w14zY+n_XWX!iw{G)R#Bckl*V@Xk%1!60w|tYjnttc~f;gRU#-h z85ET7`2pagegW8GK-gNWudA+0!veC+kf=7oo4NorloFr^1}M4DD0&t40xGZT^}E$c z^r0>VYyXT2XedzwRMb-qIaA$2$N;ufGqMn7Bhn>?Iv3idh6D=#;4YQ-(U63ypUiNx zFW|Zgv(-IBj1LOtF8@={a*FGYM_PoIHGEN@-tp76W>%^rCTv~%!5T3Bkbrt z-6Tce!`+xWS%71xMqp!crUCMG#dS3ya<9YyCim%HqzjYX)gpdU+t8$(aVj0fB2d%; zs$vi<6xauZs*zAX{_&6Bhq0Vdd^;|H@74<7Ty-a9mx|RL1E%##eah{Ej=KkZbAWyR z3q81!B`{0f(l4T03U(NGui?5heC>6k9P7pRxLfT}KL=A-0m2$MEYucHw$A+#>StfyT^Fc!6J>2oZ=x}+2uP;^NfsIjB84$nXf?0?eMp~C++7SV5NETg zBoCS;iQ3%Fh<$Ar&%H7@bcHa7OpF&(nT+unkHQn^un7WDuL*i0eL79kgakTbg2YeQ zxxm0ejHXwv4y8~LMXZlHuqnodd#?1K9weLVA|5^wRkG29BmRDd`Uv-Y`l^Wks0EZ} zPyqS+vUYlm)I4UwHZT*)FdxBwE{#qTpyMV85ni@}j08Vs0bOH|ai2O7oiH)z(}o#? zGa*`=JZS>NPjEjO6xO;kIg=kZ;ouu#sHNvayr)bY5-`d*Tx?1`q!D|o2?O02!}OTx z^sv!+JYj*}VyIutLDNJ$rT4Un5#r7q}Z~F;c$dfUPhr^z22<4pXl~UK5eN;y|x58r6%J zXbJnO1AE_rrOQ_cd%=NSV=OXCUy3E?hiSzTTZN= z|5qK@ZN@@@9#L6I)9Vi40|v4=2;2=5hvvG&7}*#E>@^ccmLS7?#)yeHy`L4JhWGi4 zXuyOaSVM*&42_J2AXq%*;-|UX^9z7x(YfH2YibnHT?>_%>_!$=MK4&*-Vdwpcp`g zXE#0S7~_)%JjwLXGq;|Bxop-3M%ir-r=5~yYzEsyGF4C)niy)aJ*);wGlOilhh(C_ z_Gn?4#rBX46hzo&1sS%7)j(-ykZgNM_6eF$Cu7+5kc<;OZ@Ut$F5+rw(6^fAu6Vet0EK= z!i6i5diVUpT1>qJI{5B3;Lp;W@T#E3CBvAPkuFg~@Q-Lt_&x{6c>r_)zbSh_#od2SG{)X)%SD$|1(3AqU5 z79-;wG<%|LKQ*Sq09pcQn?d_J#8qANe%iN}5%PdTqFRWyYvh^q#ZLqB=QLxw!;nG^ zA`S{5^gG)K-Q`e!2Yp568Nz%ti{(y`aY>mO;V^AAn-DP|3M7QS+@>!!0O3sl;b+9Y z4lQjIQiqTbhgfIc>k$^?uu#YIms02Y+pcJy9KLNpcnODxJ1qBt5qT1Tat8Q2#EBSv za;^zsRZ^I7R~Nqfelx-n9JWuN@<+%<8$#+hB&>&+h4l9+0O}b~r~|}&gUj`U5rj5y zXcVFFy38xr5W^3r07)_=1c=B^&Dn!bJdf}uXSkTM!}mYGhVW)1yb(M7Q|GBPJ7{VK z3D_>7nZp(aL~K{d5hhhim^Q|QwUb0*#Y&%DoEDIFhTwh&^ZG>M*cI_~GJs|%t<7*F zCOEnnQe=e~O>v`2;JO)CX5t*paid;F4#}?;wED<`fxD;8ex!gt*A;MMj25k-PlDMN9zS( zi~#{GCh6xEC_LOG!f$an2oSE#h7zE)O#p5)AoFTemq3j(Dq!w4d>u~YvT!0NI5?;U zYfk`RWo6@jk^9#%F~@*_wmL*@9p4Wniz&CJ?7?)-55ZU4i``$uG@Lz{dR+ux?-Rk( z92_}4Xz40|xiKkXxXYNL40j*^_u5^7n_*lKOk$~l*2)0*Y(WX>GRuH40Hlb1RsoRD zT`qCIfpt)Z#2j~Bx{xJZrG&c2r~+~Q>zk_U;#vu1);xz4Vt&$?jYoKeTcme^!^75x z0HA^!xAs$xE;1%yq@({l!VBC$h2a;L<-B64S!0dW+7rV9;0PhLn}xkBpv;cO9A6L+m{R5VgS>UI-&%H2((8Wot~ z)Vwvj3gK1mHqlx6IozwAn1+sCe<>AVh=YRiaSH%^6Cx2Y1CYdd{`AWi2e5wNQe9^s z3d3}@X14@`0W8`Q#+hqJ)-_ld)8!1pbD)~_#|y6owSFAiBC0Azq3(GFl+cn!Yno+zFGjg`r^ss@tsmK|!KG`k;+JFqec?*Si{bEODDu zz>;t~!$Q`PpEIC5F-lluKqq5^7VDLvC5aN!0Hxl=P#@b0s_Xk&?1{uAF#^`jFt4_L zj~b+}+SeuOq}22<5DqpKv0gQR|9g$JK2a~>dl^qtA;1fxRdxM912-fZByb;tBX%2B zb^TELBAG}^U!?eppv9zBT|ckEn-WbDyx#%WEL?^+Cz>UAn&CW+XR8(%ZREZZGMio|w@VI#27htW-pup^4%T79@B`n#JPTp(N+3j5BEFd{}c zsF=D!eU}#ZOoaTk`^D60jxur|khFseyC@R4y`P50F%G05o{vBjHT#3W4{zT|dCIkAasPZ{L2g=yTr)Yc$%%_e*sdsMZZH8>D+~tG)o2mxg6J03g|e+2 zZ89SJ%Fz~MOv3}wNh?PfUA9e-yu9RG40^!8Tn%Q2QTF8}X}w6K7qdl-wJirpt415J z@!n519%Y7QIY?SFLKzoWLB?{Bb8J2^j)g$ng zFw`<)pd6%SBP5`lakk|kY1IgHRSe6p9CXU8NPs37YF!R$HBowU>KJLWMxdp%cm&RR zM&?;KYGB|#X}w2UHv(CbF{ZVG7_AFOO$?G3dZdLTJq^u_%dlwUTt8}II9V#v@``f_ zsm%hFmRFoBN9}f~vAp73HR@!jb$P|PXw+p#>eKtqHKT4u+E+N7i$*<+wc1iB0Ozt% zuLG=EQUE&_j`|pEXko0Ke9}?#QjE2(oqWoH>}RBXNyNE)ly+kEJaeug4KP;n;*c(B z{fO*2Mp+y$;H0%9;I1*w>2?7uEglJ{Ynb8I0S{2;>d{RG8;%fQ&b6ZvhRJRapwiM2 zoS;#LnNAQu&NZVk2HIU9z?~~cw-|0ZKmbZhM{s{`Ge{b_fs$5^keTC*vX9$|AFynKnE>*J>@4mmjj0`HQ zKQb_A$t5-vXWl>aejxP{UpC;f@wcTJe=A0q-8tLcPb#k(!CHAvDkI*Gi@qIEp5s)W z4$Dch8HI@0#JZy09d^cON7R z5y~6+ifmpwZjId;(oNO-r&G&Co>7%0f8L7SU=~7+a)hg50`&aeK6f!V!?HDT) zu0hNQYm|KRIiW;}5u}yQU8T?45vuh0Me*FB;wgwy)p$LhV^A)L?&fd|su+>oF-R~b zhhtD@f^s_s^$g7A7&I^{zhjVOY);3ZiD5Y$gJvrzvt!W0pzMx88)I@f2JH;W>lk!0 zG`C~W#kib~K{vzlItD!q&F2{OGBTfI(8tI;jzP)ccqc^FP#;HCvCc^FP-V8jkJJPfBd zFv?J?hvD=E#_UMlT6Q`Dw-{;I_H;cM?O%5K0k;|J@GzW?z_h2dd1 zeSt~FT0IP>CosiGyN4n90=kuO$BEVRO!5bG>@;Jo9){!$pcdX`lx3Vk&PtvDa5E-O zTG+Aebq8*iaTz@k$r%uy$Q;9Y{RvS^-T)}?F-9LCfsh;kAm$m7!}wodkYuP!mcO2D ziwtub>XPxVqn8+MGt`|Pz%oNK+38LnV8y^|gZHd5M`m5jFs%}WAu)Di4_Ra8gKf!j zGFVpy%`A)*o2?WQ!S^{hgIx@JrrupuF04StWwWVvg-x{1IJ^DaBI4WRaNQOaHd9wQ z*`ixUSdzP6#|p=`fsrktEzJ^oV1&t*P`#kuF@m(ryhju2;|F}@A~$ErNG=h%NxSBA zPLb{kqI)?kA$J{Fg@nj%2^BCVhb81ULAfoV5Cd~rLNP|=w}eUme5TG8(L(yghm*f&k`DCWPVF%%!$ov z3Eg6BE=%Y(qwI67R!eA{aTzTfX=YSdI1>z)EgZ=XLQ9%tj6A92FodQUW-)UlTL^QU zcNip@Inp$!VI4BeY34YMqPvW?nK@32XojJg%p9j#G;83sk$FMcD(JZ2ONfCPr`b}0 zs;GH)ig=!eHoJbxjlIHi;?o5&c|=RT6!0AF=)T7Rfes4b`O5?X=Q$8N-nAzi@SRE< zt{0>r+I_6=w{AnwA_rObVz(n~$p{m>!L(aZ#g5$Z3R-_&=HM{hMRoDzehD%q%##&{ z=Hj%LMiIBize=*1OR1Szi|J8+F5!Z726Z`6t4bq=Q0 zd^yuLngw8!0W=|JWcNn92;AbpkT$g{rLen#Y`bknWZN;^Czu{EF5`~j0Rh@!kQe)B zv5|zPdIQ5EY}X7kx7HO19o&b=GDCf7^z#EFFh2t!@nL}xiihGe|t1e3s5*95SRfmHZnlLP`U zBt^E?8-ch#MsJ{stJkBYcAU~`B(}joYHfW<=_%-#uk_W6#=by}y^b0??Ni9M0U;?U zmU3FxO^nHNbhVj*xeVtPM%fMLBcc!~fkq137@PO#YCA)799`{Xkj)T3YDSH{3SA7d z7~;oF5Js79E66a!k6S=J43Z7;$4m^`Krdt15I-sQuZJ0w-MqeOVzQdo zBaDH?gmo?RY71$uQBT1rV{=>CV~pGT(bZf0O$N){Iq`U#;bcxo*Jd~;9>?v_?B@1_ z1uE^WaLznVTA-4>@0@y^vO^68oHLJi7;3fmKWWxEy)35fNZoe*lmmH}ktj93Hp4mJ zIKw!Yea5vJ&dJ7EhQaI;yD-gbGn~_nbBs33e8bsrPB-3jU=5c*nsC&UKhIdJOCTBA zI&y)Ld5*3wGSKcjNT#+eyw*<~h2$!ociDS63O6^XTe*hVAL->KeoM zcyx80KVVA-zQ*T7ip5}tPIQwolAQyTya54b&KARTGY60iTMo7jm^SdQC@uRs&ij&L z+{Y62d|^YhS>JN7uS0uP0gAjyE5r}Prz<9Y}V^Ig1hN!*(RkT(g?4uke}&<01` z*Mg8HgzQQo=pb>8K7}+R#Qg|agGB7>z>$&EwF`90(A$Eb0uBn}Jgf8!4*}W$@G~I9 z0CD9K9yaJkc!<$Q28>4UrP^&g%E)nL`ut2mM2<(EdUt`65u`YMTh|GlMY}2(!MQv@CF^4p2NP4!4}U1LCs-f}o!P`$3TDRU;^q z#Ct`=mS(Vdx(!r*_iYh8z`?dNe87BeQa~;<#CCXX=>S#LYaDDjowhClhdI!(3w&1q zZW;jVxhnb6N=&beFv_d91>EVWxjGLHB`Q&4^?_rQfiVpzcU!y-WarS%A$)@lcg)0R zI@Bbq0rV|Kd-Yz8Dcz5_9|0xo<=YIx1(#X}$Ebow8c127#u*i|R3jH-{g1Q|7ST>H zHfUf)x2L+^(()kmNT-wslMFAEyEoPKOB%Z5krG|iDMrFIztoSrfN`@TD^UJOxsJPI z;AD6CPK9unr;RX+yF6PV+~vDQpu9E|IzUqsGaM8pi%5Pa%7x=6bE4|aGALwuqKXiA z1!9g70rQ2S*A-V2-Vvf`?iu0Q7A5>POan~1GL5< z*{PMhV^r;R#;{W>dB%F9-egb)r`GBuZ!y&F)JncGblYZ}&8fBe$PXBn!KszpWTa$= zp;o8%l$mjQa&{T%TwSs{%I?EtEK!}axW7(6xxfUOwjl<9a(%cVV0xavB(E_u`z6agwo)B_pS6+~ffBl9AInZf3Bdh2bB5(ve{; zjJ5iQPWQNtk#@Jw=_0o~v3j04{p3!@T9=F@9~s6#7o!Yg09DlK8h0}+gDHS7BnKIl zx`)xm&<=>?8KX+~GQ_@AC9OUI*T=YwOI4C*ES9QL440RxB%c_R{U*k+DWKj}vj~An zGbY3NY@nspD5Q6Q(Kh=7$Qvdvke3;0wLSoR%>;^{U<@+Ywx;%36AE32877@>_?!vR z*={n-cDljl505a;a=amfOFYWR4CfpC&RzRsjJMcQNP9>EBSp6uXjvtUNhmrB!6?b# z0$GU!1KBvkq}9Z738UxF1mm2`iB(ScB*Sg%i3ulmim{m%6ziNH+%Z1T46Su#l{QYb znRZr-G1(v+k)xHG5h*@i#~P9CAoO@8`7n1mSlVnoCG5KyBS?#OOBur{%o<;(h?{Zna94{VW51# zQZnz*Pwz6uVwOqv9eNgbJz11g%Vo1nvhVbsrGRl6%reQ+)8T%G+srbj!56Ya4YSN? z?8O*rHOri~UWpy4n;1@0ubh#FL1av>JB__6#yZS0r@fbOfY~f_8hmvOHncFzGN-*) z&seKj<}~&i7-=`loW@?#iPiJWY3?;K)@qhX#vaDDW=2V7nbXE=VOVCfOtSS*soNMW znPrl#hbrC95W86>S$M#8GA^T8CfRzzEbC&pY?fIqy>1gDnPrlJhiH2kli4hj3_YZ` zm(fnMOfvU?>|>;xrh2V%qXj^C0lt&^G$|Hww7$%>5+~w&S`7OR-O(YWw_1O zl1)7wJI2^dwpIqa@0Rhwxu-ha(XOcTxvWGXp35?x7R4)Bs_{zJj&hmovL0a{;oNDe zusdp;J5@Wn(saA1IB+^4;=qfjkK)g%8}#QGX4ohB&wk9nUrFm1lBx-WO>tPX!+0#z zm_@+aOA?Sf4B6MAJs=8Vv1ByOA^r~I4NwZBMWeeM##giIFJZMSv~o1V;q=;;5jAhu z+E&^Cnl(U;UMzTMN!svN(G>QaHArN_Mu`Zz$3b)_qm<%}gb1JKa9XJ0ByBW{&;<^q zucc&dw2SaX4wtUGG#>fd6-ypV42hEh)<<2DK^qN%X_;ZRwT(H!vSJ2XFKbz>q!o)* z4#taBMjTrHy{_Uk!ltmb?=vdHTEVuk)YlA1&guMhMp?RS>#+m$ahndD{`^(D@%&Z& zE=_!+wQn)hLq*Gb!zSzfRY2T!W6n>4pokeVQC~t3^aT$XK~Gp}b(>*R^$8ue!?1{v zS4K7G$@4q)4TMG_b{Xx}s|SOo>zj2-_Ytzo(Attdt|bh+Ti>q33K)h(XCrRCo~y2H zJy&MyXX_ES-n;mXZ)Cq~TJyU?Mi|`=$i zD>{zrmThCTB2vmt%FhzP;r3V$WgIjycx;DX6!C3`giu3#frXvLn=JVo(c`jA2LUs0k21;hJ6s*}a=%CKg&XGtTDS z95-QzvxQ+9yqm`?&^Crzy_*vzO8f+Ki;)(e<)j1H$w1j>dECT7!!8qpom9r7LZ?iO z9%(n@GPonsoVgC~VK@!G(w-#e%z3W`3KN)C*ywbW=_ zt$sUFx5Ax1R+^E9&tP~iPA6-Cu@2A0>1JJafZ20#dRo^QY-nM4E>2%-n6XyR#p!9? zWTf45aXMNfPOP41PCsjuu~yGT^0F{?j4{eG9HA0OJ{D^0EyiW^AS5SCco4T4ZqSO+ z3$&7ph3Ll_Cx$MBOO6!{ToV!i0~Y|2TZQgmlEckm3n0mp0%(ds#xMkk)swoz5OWX$ z$m&K-n;?Ei6d=icLXz$>NHVG=-$`#KGYoUu)RGsaqh}dyGpQvPN{7xd)HzN>q zKe%UnppABZ&ul@*NP(|kjCS9{LB&+``n`u=z{>&F8|O#pXoL6`k38enKYk_|<6oyT zN~aq*lrMkRUN{G0V~Wl=FrWy=tGIVl0}vM-X!yr@I_s4Yf0-fq1tY?^HbgfuIdOeZ`x4;%O5 zL=_pr4;T@*AVgUJc4bg+F{Q)xeP+???ELA0D z!V8Qr%XW&JRbo4Z-w13h)HSCIxyfc5tD<@G5Qhi#yEwH<0zjgg05Jw+JbFM(P1Uq* zqQn3ujc(o;Y@E{peB)9M_TB;S#&jZj1zCZ zi#N*AMRqD$AHQ&#lkd}DL3vdhRi0Fxi zTqFLQ(TnpBs}H%(wNkpCah*Umv?<|dTtKK^)hXfryU(6&L*crT9+$G~dB#=dx~ZsV zfvuq*zArw)58Bt_2N8Ft=cX6O!g|Z;VxfCFSF&&goa+wx%z_Z%Y|3n;*PgvC81y8hIX+5j|bi4XmF#SY6ruL!K zmHsC_jeag0&uH~%Ukc}%gfm`>#ZIM zrn_>J%3}xd+&Ff^T2Ol4VvwUY+f_XpOn2s`G=?jUu}Lsq!QL_CzDR=+-cmglOn)dh zotaMaeQx5t-c)@nnEsjEAItr#_$X0*JD5I|`y(C;=!;9q$8amxrB~ADpghLx>!~a2 zRpY_*g*+T$>#6A1v#<=^NG8eB1T75@H;z3fvMG&CsCq7mM;36q*USBjRTFu$-8m3u zi8!5}shSL?FYYA)`uLTF>AfUjqG~FbZpTWRocy6+TFP_t)zLY#69zme8d~$H$ z(%?lrJCLfH38s%_WO(x0m8*jT#>5bHS=zJ?X_W4+nhmB;?Dacyx{^M=G1y);7fe64 z_pi0NF74aqs(aabvJ4tKW;r#IhN}5&O*%7)K7%LHo~T*~ra!oM?J*H9VojG+Exxx8 zQ#Z5^{Z&iB^e^l^M*V&tYPf>ngIedt63em1lw$-H(Dr?>)Vwp z*(#$mPwg|qf?>0AHJHA-M-8-|gm%Nzw;4LX_tNecEAI!>9ea$~e5pr^`MBBjcEEC& zt6U4F+xN(oyLC=it_Rb}98}L=>hC|V9ocOaQ(ht;rz$st>EnC-On)pud^ujZm0Nc? z!rZ!#R&Hk-4YcZ@t1X|-ARUH|9kp5>T30t*`5>5nDo2`(T);J=+G&mpgI7fD&tz5& zRPJQ6WGu=(*`-}459|Kre$BW#c3kRka*BEiWfIl=U_PNh4v zm$bqxq8UcxtPPQ&9nf}ubn*O%d}n1rC}&r#=bX+)z8Nk#82k*;-56}C^oMc|5YpG$ z2?g!DhRRTAFPVW@wZj!c`x~+yqy0Tm84KlX1BL>4xn4VXKup)mD@#IIY(Ps1I}c6? zMUuy#AHE`toM&Hr6^2i!vOJXjSNY3Ue(*;l$}s3k1M#z$`iF2-V({YbfvQmYdj1IX zN1KTISkkPC;?G)69Dht#y$*SM@TwV^KKlQ{FC-79ubn%1RQ&(3x^#N|Kq8dBvB$Wn ze*9EpUpi11%3@wyO3Hq+gOs>Fcc4C$v#ZlLKyxVP*rF#FN{fz*Y7Nm4(bkchSHDbPn9{wh7NS?sbADO zF>(4&l;C>!-$j zEcEU0#Y^~qMhEKP^^AWWtr*BX{7I2%7vNAlLo|9DGeFv(hbu0J(m%I1t;t%sh>K*n z&SW%wDz1gnAKfcq`$h3+a30RSis9TQhLl>%?Lwk1bywWX-Kj}mV@MO1@z958*6h$e ze{~4w4X?CUjN~3moK#{?km%CQ6{De?ex3DW(ZPxYBrC@DTq%(N{ca)=XI;guP`Y_< zr9q~WxSdDb3ne};ueiPEtm6xl=*vsVCeAww=pPDIjOQK?q||HIGKsVoR7`|&dQQ@3 zqU5xyr0HNYvUbWRLs=#%wZ2j2!W`Fy^m$B$SSQ>D*UG2%tdO3av{xXbLM!EW_FOvF zi@`+ROqEaXxi)rONMDk>oWb$(ySe*iDKpGocC36R_wZu*D%Z@=aQSTR0ZuUK_J;N- zfk<>$`CKUH+>ZPmwFd3cO8R!NrTktfeKucf(BphhzFD$-eh; z7|grcUZoHjQdPdVhYG1jooBEPl`nW_F>g3@*4*ax4#dLC8!0!?sItpcqGT`jwx zyJI)dt+x8ORJOLq4`FKv65UFkFIx{~nMbxI+q5X>$~JSG46J3IN-|xx6-xK*CHsEj z8ZuF~9m=vSWlLY~>M>UKAa^IDrCE%6at#?N+sWO{$={)D=!QY6BSV(e4B-Zq?dCRJ zY)t&VifG$-UnQJnMNDfRx`*DH>2(`TA?KQ3S6M+gi<4(3)h3cKq>9CbA;(NoTbVzc zW%kBOWvlp2Wub7EPTcXG`G}5ah3WdTSU8J6Z~Zo7XIWMf&N2yY{Wwc!8!IahXK~FP z-c##Gs0;auZEb&DIOhbQMubAMK1(SIAlYQj zM~lZQSN7M3bK12|HbFGFxW6HsekMmp!XIk0q}sAMeS7J~v7_eX)W^~n^v{^;=cXu;VcF{t@voup?loD(6zraoNckw!iCZE+R&9jtrt6%v^c>=Slj-taF#L0 zs+d0aMfEU~1KhN~J6kKY@cdl*!UgUkG7;79?+Is_%CQjXyE9(SzB{98e{Z%PUt)T) zi+;)DipTc%?Lnz0yTpXC*qfUzp9=P;_Rb{kHO$7eQ`*0$ zIi4I76sgi%*~}s-MV(hn4a|w(uF~7#ES`|`Ez}nVr{+ftwv~?W;Uk;#(NsDSPJc4v zAZv>$b%~aq&J3pT2qb=JyNH(sMTPiaQq(VVHx#PanL!CvUpl$BvX!1162^$2cbF(u zrBmVbb9-0$BY1{TtGOStDoO#T(?eMHKzd@Ocf#opxIiDb9<;>h{0GX{0ZWiFS!@avJ*tA!v9~ag-(~uhqG+8vByk1lPM41 zYX+v%<0T8>EQ`JNNQ_MUsV(;2ELq$`H;OKWG{J7lm$4yI)U3-TOW|}&zM7TOwC*ff z4riGbk~S`IltLYBUP9eE5%!T(Dn47 z)ndH9RJ^_S&)7V?zEJ!iobJt6i+h8cYUjJ*Dq@N0(%C0oFib=9M3U&?GMp_Nj}PZ=Z)Sn#-BmOezZpsQ z3NrD-l7#zaJ9`h84HmP$?Tc*Jxxu`D!tsz_Dx3k$fw$y5P zVZ7ZKOvc9}S=Q|2&&&#GEu_Ijd?J!_*-T4N{!YInJ{ifmZ$Km3^XTu7PeroKAIS+b zhyUH!ooqd@^@Cg+Z?P1k9pM>7?Jxy`aZS`c;I7@$#_pw_ymKZ>D7Xqhp&TJ+`@iD)Q_ zs+%cpJG8Yb8Y8SA&u9ZkyBN!(CDAO^Ttc;$M9ZUlsOHiqv1nB^XEm3wt)XZlnzNN_ zyRrsv_@i~vEUnytv=&6`qv?7r`Ny+on1Odk8=~ohIdawjw(drfd&vY1FZQtQM4EDE zf`n~-5NVF$V7VwZZM`>R6L?ay=e8p)lx3OHXWhfJ6=|aiNwoUlVxtwiL^dPs(e#0g zblNVG^+;##N~Kjp0bYxAWvf&Ys`Y-PJ9n!x=TKH7J=t2732I%5^hV*mQ&Nv-Y^EmG zoc3Cd^hNVdD4OurrAR7wT{Y~0#Ylg)x@tgLF}Uret{V9H$UyG8Y5-gBMK0$qbuog^ zMXqHlb|NoK$|B?g$k^}#L&Vhk@URQ85s=5)x8_?1xp}zAQO-eAd`^WkS&l~ zke!g5kUfy=kSWMD$YIF)kYkXmkmHamkW-M$koO>$AQvGQAy*(5AlD)1A-5s#LGD7% zLHdhS_bg-yBd=6E1$hl}2l6tcyI6G(K$bwJA(N2(knNBu$UewE$Vtdv$h(j| zkPDFAkV}wVkSma#koO_mA$K6#APY)VcMD_{WHV$EvI(*UG6~rU*#LPNvL5m#WF6!< zWCC&;vI=q@vK(?5vIKGsG6uN~8G_t}^h5efQT~uINH=5^pYf-Hd?hKxauL53j5A^nh3kOhz{kZ#B|$lXGe2jmW9K?TYmG6cB| zSq`}cSqHfZnS@-2Y=&HeY=^uL*$uf0*$24-IRLo~ISjc3ISRQ5IS#o1c?WVHau)I) zIOJ`}+mMrxw;=CA zjzP{rjzTU$jzF$M-h|wR9EJ>4qWmGtAumHFAO|2DAk&a7ko}OIkSWL>$UevvWH00Z zWDn#pWH;m}WEbQ(WGCblWIN*rS6Kk_>-@C zlt;Zslu{+&J)_pBPX%944k-bp!dt4GiiedK>1Q>l)ToD*Y9*`$y}zioDnYf{dswYi zij^9rR()KlRG;!5$In6ahSI2iPtWj?<{ohxts^Ib|$Eu%D zPJ-X3L=je|)Pkp2i7Q8xYF`DuI}WXa>T&OJ#8j`36~1a)*b#hlM5zhHl_!9x#J{cTqv{#()`00KVhJjz)M};XN5#QI%1Jdq zKLrBb6KYM_qsl?VPzF8XKvX~;f+lhGqsk#~rCN%VmZ{JOAp!ioLJjNx1=JU`zbemp ztC7AMrBvV`@lB)nTTp#UeF|Zxy~V*wwM=~ic~Gn#g04?1k0MWxD93-O6bHOV)kA?G zLdpU@DhcISFbJ*U_~IZ+gZ?c;TxH%Tz+H-;%e<9HQ5+=}_WHbD#S28SSHOBoTYP?~M%cm;EK?SwpAZk{H_bfD{w8X)ASc$4}uTS8R zQlV#<%H5(d)hwhU=%w7CbSq`SClDWLT&$c{yxto181gcVG{h0NNP!YYx;~D4q*`*} zr58{dacEnt97ZaTPxuf2q8y14-w9dfJwth`A_iY&FyK}2SF{$T7CI99QS)C_`dK+@ z{Y^RQn<+vg!{=qCs4fSgXa$n)gDOW+ksb|D1^6W>QHcmZufE_t=&QtyvI>-^;tQ)N zNF@7{0^?Jv)mq;{#TPh)YSDQ571a3W`eC3Oq;A z6&&(@8(k1py|_2-{RCts;;Teng_Xxq{fm_&-YCAILaOzl=?VTL(2deZT@~e*4=JQC z!lI&91Olk?z^jK)?9fC#p*$KusK{e#43xuERl-7=f3f`pouzMrs>n4;+Y_SVQb{rc zIt}_ch;pFPDOIU!3mXklFIBB6YOy0O`YTw2z=ypDk%pjJiLXnMYX{MYw8n85dKM$p z&>5`7s?v%M;FNLYM05M1I6kYpc~pl^T`SB~biYevu3YE}?TnJwzoBBCfc4I7l^-x`BA$IR17Njp(@Y zih2yq_BfR>a;y@vT0P-?)JtVa|9LS)=}pY%Q!zB4l~5a?d@=GBKOx3r=-ex*fd@~E zcq)`=uoX3%a`}krQ)=J!27Iayt)duJEr_&I?LdoDi_u1?OsPGJ*iatFz0~?j1z!hP zN)hK7)T9&MvLLlm(kY0tM2$olA_r7o0KKt@nQ9pF--jVWl<-B=Dk;4_`X-2>Pl4VP zBen5rbaRv{iV>||J%;w~gO10M;;_yeXU3~mM&zK@GsIPNLC6c#6zGZ(19^xp5amt( z3RY2C$1D2wp$e9YET%?-@sIwGQI$G@vS20kh6p_f6~xEh4unvprmQFnR2C~p+DZI{ z#{Do9KaO6KdfUSSbrKDom@t+GUQ*(J>#cs&TZ^hj8FvVksT3-sX9vC%U)MgY^?K0( zAY+uL^~Rz#JIcsP6yHJE1YR}%u+m%cuuLr#m7es{n}=TU4x<}DV?_3%qM);(;yr|) zeBMLii&FIXr_co)e)t^nt4we|hbDn+5778anjBTVdXv%`t8o6~GxqetZ9!6)3 zM*1j9gvx;$S0yl?q;#t%eHdxgF9l!2Z?$M_KIH{eKe8KY&@796aoBd$%ua|jG=kTM zY8wtHY83jB{e!qs#wQR1>>+Ojnh>#9BR@(}CrE4XV#un%Un|iio8zPpVW>&SrDDYC zMalwdRFoj{5Ao?82D-OH;;+;+MVA638Z`zGe5ZzepVykF7u^8TO9K~K3REiSVg$4J z301A4F~qAw8uS_Ktc#hXJcq zXxM1ziQLyZK|^P1(#AkiiLa@?qB$CP+fURDp|*+|Rt%e~7+pZA)TxxguBH}Lfz%26 zE>MXs_6Yt`tTrN#sdGPr(xguBX&)Hq_xLZt9)yhpR&SKPr{TW%;VEB0tyGVy)o5Fd z>f_!Tv388 ztjHw{OwjIx_b6h19Cag(8VA1v!z<-s0K+v6;EljgHy`v?iZVv4jgu)*BTxrnv{d6K z*rM=bs5h#{H^?#g0u@N%qsmv5gJ?5H(N?O-;J}c082TTCnSr(gf1sE!=o8{-M{)J2 zuMup;0kT!e??KIiRsr>sw-u$K&GjqK^xzc$x2K~IV#4#;euz72bO2&m{nRxQ1$Ys_ z<=QN8E2EIR`wrfM==Qxb4$AOJxvdN>_$KChggW6E`b=2yXuwA zs0&7Cy|Nl}jg)z>#^SDqa^+Ag{!~-B^3kp$*J@?(Zx)MOx8E1|>OhIB;Gnk?U#5Qs zV!7NkakT6)_W@Vx_@j^c54aYOyFS`i>AG_w{#v@yb^nB~UKy@-4Yw-4I(%q-NWtR; zN@oObH1sO#g(bn3VDGU_{At(It8_(NURPQP9ru5zJAyak29)%NdgzDC%HoGMJuY?E zb4?jmdI@$->GIEfpf7@F42G2k&t|NvY&GHvA|uxecJ?Lx{n56v$%w1ibxZMksyw}( z-gsa9Zu~)fH$GLKia?9oNGvt+8gbuIdOi1w*2{(|a9Z&f zO_A!e%4l>dx)2>bd6WJ=r?j0Mp&#xk<0nVyvw3A9I@jEOa*Y1Epmd(R6Ty=a%gR!0 zJ=PK*h|iU_eYo?(x1g|VMQMq5@4xr6eJus2Zqv7`O5gr#Emfz+DfGUQ-hZoQwWaCQ z$f*hX!y5i@r={zZzjeBGniSnqysqM1&z92Tt=s1g76eB^qoKZN&-*$L`Luuq@1l3p zyXE!o3+;>TYxcMM16n|VC*&#jBs|@o9#6`1%`@qlp{(6i#ywN&nve2(7uh)zQG%`l zVAjgU%5Rld9hixzK|CJO>sc?GF27q|UojK$2JoCl%ClL%g8CiApq%hA56gRiYAwC{(2iQC-DR9fc}hm8h;l6<1}o zRAseZEz)A`?>W5h{QtA7zS7I@oZoZ4&vTyhaqqd#IBF(?8h^$jstOS2Lcf;58Pyzh zaFjSVs?!B$R&y?tCrq3N1!;k^s5vT8PD!QnsJtqlN>AX(^6T3swN*5b7D_ST1M82 z&13IO*G%&^E~x5E3yzc{?Z}~_Dl@g2`pj=ojF2jVUTvxB>V~?-Kk!d{n;)oZN@N&T zT{`TPQ5d1ZXqH8u3#l6F`rMm}GmzY)9Z60{cK+#Ppn6g2Mo7!6bvyF&0!51;gcH%0 zlw4RPv+|Ae`jnGf*A!m#Hx%{~QC(<_6$2MhJ*b*$&#XNAINM{2iSqGoT}!N)6&Asw znR#B6))N#filPgMwaRmsD*J43)<9K?LP0OJSK5sBUK=&^#ep~yYo;|F7ggP=Ga4s6 z>pCu`%BZs%mpD`f)TnG+RnZzLb{xu(Rmb?KHmS{OD_WoKNvN4N^;}$~Q45-T!vHP1 zrRNf=oI0m*i?Xw3+R<@IRbHLfctqGxB$86K)FEw6>(K>tS3*Y^=tF2Q16nAps%xL7 zh55dO@~08-0m<$1931N0+(>0am}^x-D>-iFM-=87Q50y!eV$9JA_m8fi)wy@Knbu1 zHtt##GZY*(N82%Q1ZSc%H?#TKp~^{>x>dbsYo;TfgJVv14pjpU*o>+R_E^bfR6|va z!ev#jT0iR`a&@i!>E=vmezf-HiF$KeHPfk{%c{ESTbx@rX98@@=2W*@zol!@O!g! z4mP2x>d%UEo;d~nUgrp7H_xX(45;Pm@Qh{~CWDfzp+`BicU@KBgCDLwj7Z*q*MT&Q zO0KRF)THPQ)sy~Ce4c&TdOi|aj4=~BdZidm1b9Y@W+ev)F%K9}_h2kau7%p$l-whl zI;F9URBhF>I;MLQ#EG;aU`&`4QiBXc8}c;CpH&@oTsIV?iEBg9m^5i1hlzNG+(BK{ zfoeC%EOfwJQ;ZkYi#n-O=p7R`hLG{fRNiTjNqB)gPx7wnRh`lade=n85HY4rB2t`J za$VIx<<_8WUR6DH*3d95D!Es1IW@SRs;|z0!_e&^9giC6^i>0OS|{q=6M4g>@!BLI zofXU~kh@7fP`#eA9G_a&RCSm7tBJOu zh_VF{=PQ_@P(B~Uk=1_9GvfRN<|S}4aej3`(*gHY%tJ`$T5TM`rUo@NT~wc%crk>K z#!o7_0Ax3mM^GKo)O9g^dZKH%Gqy}&$iJrKf{@>mJfse58oIdtdg9ekHa?glkbhmt zg&@z6Jgkmrn!1GkW};`fH$Iv!A^!&E7|63EkEky-EnQN7JJB~(j8CR0X_yY+)pXFD7YYTF?C!s1ozWQE{3%8q=0dCLi3=z(q|?{ zhN`h`ib-Be!}K#sE{+f-3XxDJHErFsK0l!l8^#w?Qt~0h|AIfwix77dBB{R8JnL@s zg$a$=G~#t)Nk)ioDY+y@OJEucMNO?R1kX#3VG+qFR*ahfe#sDzyJpinD9{|%l0Kgu<0bq}Z z0GQno0M=EZc_fpn0l;z!02oLS0GlWQmN0e!D;TJNRg6r)8ipTW9U~3^8{`4N*mwaj zHa-AsiVT41@B?5W0st6-AONF21i&y412C2&01V$tz?YzffG&Rda|tSx#APrN2I2+ za6?T(8+TEFw)@$Ab&@{m&~!f14BVPkVYOp2=r{#`rS;BBOC6Ju=QMm$>zmi;r~(3? z#ttT>eRd69p=Hl%9^uV4P5`A?iY)t9i>sy8yVdgQ{i?t=Eh6uj@0ctGjvUVU)O-;_ zQAc%@_!OVkULggWnUmnO&uf-0m*v&;>h-Fb7I}8w!8iG9?Tt2J@mQOSg6s7|$24i= z>>wKp(WUrOaw+cVn5K1{gTK*|w_}>IaZbLit*>-e0w3ZZ5+9Nu3LlCe*n-H#dw4JJ z<74~{Qf~1b?8Z8#IUDEV@0J5A!IjiXexeAl-Qb=f;-FKc8~-R{JRFqK@|I;JH(=jAh6dH!Mb5waB{=i|Ezy#>u;Y%#ugz1Y`rdKh&6md|MmO9~Vn+dvr} z;e!az8qd*2tGhU0EfwGk+Ky@6z>&l63b^iF71tXR1^FUGn>>)12U-6`*7iy05HAP$+ zNW;V! z`h)u7t7?uq#>EV2hIiss8%VP}_Mebq^k?`dVshAz*1^CKWO+9Wo#WddJZxa+_zs21 z^F(#XO62$_YURfL6ADew|8 zB?N7Qfq^OVPGas5wGRfiro@-nCiRZ@kfe+xozPX7pF1AMR4_MXUM9&svhqU$i&W;z zY>Ru(UwUwcg)sMgkit}WqB=Bv-t!S+swiF#45rHpA7sX+&bxFC;aOi7tLEB5$K&^= zw%Tlx;p;pI)301_k~S6e1mTz%y(>DgTHmhR&Q5pt52)a zhldZ{wa0az4SBXO7@Lb7(|2)h!+Y04#64hmK7;$7g=_I1-Gf*++udHbYrQRdk1eFg z5By-Uu@O3oQ}9P@tp^DHeH`-eZucE=Pq0uBkYXe%^Nz-mTtMyUZ zBYwzdP=#O8aYO!5thu5G0pb9%flhImk1zfuUCo`K*Et&5&`}Z76w`@(@1F77FQ}Hv?Jdv zgulXblC~=r4sE0Wlw*12ab=*oqRrz8 zhd7YNayFtZPrD)dAr6eRuezMRJn>5UZTf9Y721SuB-kf{^WBBmqGF}7ncC}^e#gc| zwIzLZ;?*daiwmU%uWRT@Y=#B0H!*F;^t(nbrtRqp`um9&qr%)WhqTn5v|#C&e$U9o zwS8StUzz9{HRg;I5lEQO(gNk5V`+v2{soSKv;#5j>O+lx9}6^a|I)~%v~RkR(PeJV zU#{L@$o+wVOKXQZg~@HcTPUM(|Ior+Yezbb$z$$$!rt4hr@eu{WBMZeHR{=J9%?-j3;CnYoO%q?7fLi5ugcNwF+#c1-`8=dxPCd%ZVe zlW|U4!T9_)W-h0_*M;?oiM+99sw@uC|9@iS@>)r_*Ec2{xc5|+I;KB0as{njsOXy$ zPTX+12la1_Tv6)~s`}Q13)h({p#GhKD`}lVP5&_A#s#LKs-Q+Y-l58WhQl81qb{Y- zPSlLgrnodz6-h?({+}DUvi3=r*5@Yb#*Qh0g#NveyVnNwJ$=@AIsfE&M$P}i%vH2G zom(H6xH9HVZYeUKCVi-DYgz?5<1dX|O&ipugueN~)Irw{{hGDT8Hs^ zySZK3W45TFZEK&k8l9wb>wLO^5EWtqMkN)hsqItTrnaGVppE{D=Nj6y5Q2els-R{q zZD4V@Go&CbZBy$-kpI=fHMLz~sCOD)R$QC6-lwgEJj8(s)Zsx}nSP<+^?+q`8qND3 zaRQ_b)4+bzLI}P1YXkS74e3fkc`?3T+nl6z>myc>DLilRTI-W8r|8Nq4JnZ)?V~n} zME(=cJ!*T)ZudW<)2JtHK^QIim+Q;fO(&(?);?+dNclhOxhHK=h`1h>^U#66v2krI zL%puM<+!Kk8A4ye-WW9Izu35Et=C0rN@UEN*vfCcV1)dwjeF5LU5@46@^D?+%*Ns#E2uuHp%p*Er$sAyTN(1|*)E^R4V zG}F?we>yN-SntvapaOJhy}W+EK3pGx!lMBVy2HJmSZ}VkK=AlO)7UUPdb;aPn(HN` zL~(UIM@eSaABnZ28|z^8YEDA*XW|^#X>`Eh(4V#(UE-WNhi(AQ2urF<5#!dmbRAEZ zc7rb6EioP_goH2_7*t)A7_ZKwy9R?jBJ7fBlIOg-0kZCzreP^{f)LiSWwWk1_2`iT z?m*Wx!*jAu6nyJ(N+5_M-zGAd!){MkA|`~HIf?|ZrwrN~0%2*QNl z7&rB3QyYaCo7xxvo7y-4o7x0Gk4+!I0Gk3pjZy$qBMm^=uK_6V4PX-cdcZUmhyZMA zvjCJO2S5Sx0BmXt0BmZD0BmYY0BmaS0NB))0qa3{5#`%S~Aa4{l>KmPnmyOF!jrYbsFsapCKu8GAY3e#5DBNuf zOguI>LU&`d;UPAR2V-rpIC>5ti6C(iAuI?;7CjXfBE(z@5g`BuofZ)!Vq!2nImE-R zHHvjwbwegLPR0nV84o&zN8wdp^@`i z=tK-Ua1v5NMQ8~R!V?y_UHxF%}b}+aXh-#u+QjHXYX% z?(|--u$7~@FZ66@Q(?xa>j({Ex@guE5`ndN5njE58NM)wT>qx%-{RTv|{Pr?cTFuL;qjP3#eqq_*e=q>>;y6*rO-DLnq z_dNiky8^)It^zQ+YkG+^>OrrV@Hx=tZT*w}WlN$qe$tD?bo9^q6c{x3v))O}i@u{T zgF(x8^dr_&`WJl!3_9UOAD}R=7(GKU=#Q>GLQGHpst;~UW&_W?>f2lWE%u18r+*WN zqG0TpU(5~LV7iUxZj#xk<9hnoL|{wW?o;}2`hnhu)Sy=beRkVJ=?(R7`X)F$V1CoP zw;g7fB?U%!+>qRM?RoYbR0mj#3t^LHZ&#-KQtx+fW}+`pfORv zx|)kklo1H0Jn@O*_5+Fly-7f{gCmlOdx)SpSMWn~QUGX98UW3?20(Le0MMLU05m59 zfaYWY(3~6qnv(}Wa|!@xP7wgjDFL84WdJni9std$0KS2Td=viN&~6bmg#OgPeN)ZV zCuE<4Gzbe?(x4^)8q@+ngB~VaX1tcsnYc2fwr{r^+oFoLYTb#~?ZAF?--Wkyxb8#_ zg4b>PPJHKPC%;qNDebt-Y8&@D5is<&``hA)iG3$`I&`Tz^6~ylvm?-0pOIFFu!9Z{P+K@tue->nr*k2!qqiw~78ve)n#-I0FS4 zK^a_oF0;|dkydDS#}#bvmPvgShS7u{WicDL(L~zU^;LFzyNbPMl4%SI!z*M^ErsEJ zdq|vsmpnqq7H=hJ4E=2f6eQ3k+b+yh`SDgg9o6@YH60nkr%06M1u zKsPi2>lko=O$;~yEX5-Lt^Nc+Q?~(VvS$EVp#wnGUjV3F7XUl)3V@yH0bnQk0N9BE z0CwUH06Q@Rz)p++uoDW=Lv}&~fSnKkuoEKS8?d1OSO`1dn@~pp?1Kvc```w^K6n7I z4?e)RU@ZaPhP4!ZX1r$=5q(C#se9zZ8-!dGFV{r(Vtd6sI|wxnn8m($x%Vdfa5ssI zi?u!HLFMT6s1GSNE(!5Xtiq|+b4g4ZwLO_h3|N5SwUp#uPHr8U;I!qrv9=;t84@ZX`Qn0L;5eIudG65MewkOVk z%i#^N7Gl8!WX05>i?}@AFA`A*n1CGG!b@BMTJ8onujcZoB^wC^u_4k?F#h0%PVWfD02>LdB`VOKPr&3j0}&O5)v7fE{F)#3+Tj6N&PX&XvRjF=Y`i zW`KeE-H8fzlv5T{B)J#M;s_FGWLc~+8*?u@{CFu6=Hp(x`*1^{Dk70SQrLUE3PiH1 zSeo|HL{}9Pdv+P)Q3q{Y=Ct|RoHrNDMf0Qii2}cf9We~$z`*Q? zuf%i_GzSJ_^hF#I^D1`5doUQTT@mk)V$Vy*bmi%*y%w7NCv@Da_+-Qfs?dI4HF7<% zZG1C{`vX~XC?MKT;z(J1HV#cb^Vf9TK%xWenldE4Sv1xn#aG-yg0btqV09f_}0G2%o zfMve|z_OCCnWFjIvt*hE@iEag+sMpyU9s?0EnNK>+~GF9KlM?*Opu zWdIcS9sq5v0HC5(04#eA09C95VA&f0C{Pmst!V+EDh~iy_9p-=dm8}D{tSR+?*L%g zUjVS|T>vcmD*%?g2Y_Yo17O()09f`n0QzePfMp*6zKz)eef=HG7J%LF%cXsYp!N6f(uZ zpwmL8GBFWT*pvo?{tKJJ)VEOpV#EOmmH0-!=f~+ZF(Q z`v5@SJ_69UPXP378-Tuj2B2>{0QBt(0Dap9pl@FRUqY_{zKrewdQ z0ibUK0Q7ATfW8d@(6?c8#EkQexH)I;nxoXCN%Ig699E{xPv(l>f80KPK7Kon;`$Vq zhT*#hRXeU94?yu|?%LcoS3!l3hsUGi;z`tux0Y|r&*mCP=ZOmhCjMJ<$Lv22oCM)D z7`P0!jsD~KN#Z04!f4>|B}Tjh9yrb)7m%zOM=K~!@>p;}YYMQr6|h*==aIjixFW3Z zBRDMU3n-?GxDxDg4;+^DMHH%d;wSbFHcmz+nA1xrM2NUDtX>ox=JY$1WJJ1okC)W5 zh>ba&-d6WgxC(5e9pNyi-=jti3Rg2%&0T+#EdkAs#MEIw9f%3Ns+oJlG|Y8#9Lx&# zVrI?BfVd_mn>0A+TLbNjcMF>48>!{LWDikV<~q{E(!FKAm7=tC#|!gtVCnv7&Pi+* zdP1f8W{o9jxx!I--6C5@)+lX0pUim##Z22a7o_AdGxE=<>x=nC8c($@%y0?3ku}?EqjvI{_Hb zE&v9!8-M}r0boFT0T|Fe00y)Sz<|aJfYb*802)3Bz<>?`(7<5;26O~~0euO;fQ|w% zpkn|G=r{laIsw3dP69BXuK*a(DF6m^8i1 zFG?3l+ITz;5tv5aUFmz8$^if;l4!>98PQK;>Gx#h@Lc%-XwV@GLxLi z&W>gsbECN!h3-o|DT~nPw4T&pOUk}z|?kx`pDo>N$g7k3vmV(~`2 zB?1=PZ;j<4kUD!LR>T_f3M}5)7c8C&-^DAj64sp=uuFKNVi7N@7YW@rk*C8_KS_|> zVX<4P$P?ORw+!$uBZN-N;N+HsPK(3x3L$jNVaXBWvN$axFc{BHiyX*bxTsQYi_20u zOVWULS-clAaUP4?G6J`$Y`r4n+-Hve>FAW4O7~w0dSL@TlXK7hL11&o*G> zl?gmulbz!WCkbXms$jCV=48v!UA6lLF#pOVZcU8W>SH@oL41#OXuY-7Cl%uh6JHeg ztpNxH8#6j&m(rFB5)E22w!E!iE84txgI{@N$=dwK841NpS(=liyba>hctCdT$j~4t zT5`0}tXSG8@~b8PMNfg|rHbXzQXD&8EhTcGo|e0@R_%X%azrsr$>!#OTZqs zXYDsr`KdP+w{1yVJJ!$Hq40gA`2S@UdU`}ZW@YWK!|=8(PHWm)wbrcle+o*Oe5`uw{O=e34DDi!|fV*Q~^!Vv?zM z1e}2?HPxF%v`SW|wMNtbn}wY9u~UHao|<)p68|O{rjg|bWB4s}DBz+P+8+O)Q*ZeBQ^$6N%?4mo9{Rj|I$iL`7DBkUD&?O3~GSrr+-Qp@>~VFht| zRIq?G&N9s*<{ju7BJ?R#&>FF(tk2elo=4|X!gXuJc4@QQ6ZQwYeKIiF!0l0zjQOiC zNTTd1avTYIZ7%zj{nq|u@7nuz=cHRtO`W#xkak@oujJA$G1u0APVIGV%`g26+F{;W zTXSxgeJ#FrBhcgZTWYU4dZ+Yp%&z@Dh0j`j&VNbasrYHvt?PQNp{EzLD=3xU7O-8} zMEi~X#qOAtQC{5_B%kw%$v>bXRIPtVg{oWQled$9M9hQL!-|Vi3afO)4E-hj%Lp@H z@X6ZWMY69}%`7f5%w4-OuI}>dvfvioLG2lnG#7}~;4aPxw{haQkAtR1`aSC#bc61sYXM)uicTbL>o@T^W}2Ve)y>LAeMv55h-KGUwRqMdV9( zliIH%9_1OfCD6Io=-vl(aL1n1e&wS?wk09Cf#eaA7rU(e25ixl?P@YNS(ypXj$~Q; zb+lpH=9&yn4rHJ9R}nL9%VOm9G4|fE zL3?j)WXH<(s=bB z>_KX^j4f!tw@Z_uv8QQk+Z6Wj*wbR32sKE?*0hm#WV<9;*7jiQ*nIXV$#S;34R7k( z?RFO>okvl;Oq239-$!(lpkNEzJ>)2&<}#BMZT^oKqm=G!4I8a?qmyicf_G9gop59v zU57A}o{{IGb8+h3vMn*0oV=P$O=c#uXyp84f@*tjdq#bGwmyad3S$qV-pR3mMrD?b z%QuWmYVIo%(1pWy$4{i>=M8ipAS4?T9eA@4!x9KWlbngYd{gXfDBTe{R_KhF&ee=hB-}*7%cYe(G zi$CW32S4Wfg&*_%@)vx#9*a_rXTyI*&T;2c>*2XPn&2L)^#B!?U_k;MAwv$Gc zCTUu&OqFKZGu@e6Eyb_0sYBNO3?{Z3lo_o%bwAaZO0QA-Vv=S<n7SM zq1#cqaUI5%I}UxxOpYe0gR;{!EUSxS>lsHrx6q<7`!ILEcqfnN0jhPD#mP-m8LNxJ z3fc;Tdz|N3`!F`q#8)hh(&U%PQl}&?y9=EFhs0yRVA{N(-Qzoz1sCNmd}3!W_e{bX!5H81VhcbdN9UT0r(Fg(nX z2G>zp$CPu5x~7b#uV5C>jRiy%7}c0+V$yz?%8v!XspwQ}DlwIuN=>B^Gc#47(bt%a zf=o?ir;2DjctcaqQzaU(jmhrh-PjSCDwCr*`8s+3$x)%;&B@-RW~%zhshFx!noV}w zQl9cp)oEBgAk8pxOq1tnvVbxTrmiJiAb*;q;WX|ZiRwcko{>urEn7SrKc$}ICVGGo^oL46<`)7G!Zc1Eal8pZK^jF#G)9@3AN8ob%j_k#`1I9ui@HcN?Vf%ZJ3P~m)Rf}KAZ$()r>k?Fh0Ddl;$ZRF_2$Yi z6_%c;?6um5QDyL#O<|%t>JNDCmN3|pY z(SPd}42$aHZovva%WmY+Tf{yp_Xe7a5gdoxXMoj;GA+3DPLhg$DuIy2p+)+O;@I?(>-$DG3N_~ErUy_D9Q3Pu4vM&)#|j@S=kwolzW>VO4vj_Kvtyd zmF?;LoH*~>=x#^+NuCtDJuS|6x7iU;7ke(xj5Hg-EoE^Ix0L7Q`8$CW=51PZ#OBlU zt&{#qS(rq$x9J#s3JYZ-I%=#0f}<=nd_MXR!t6Pd$GURbBXJA?=4FrwTJK=lEULSZr+z-Ual4d; z!5t>+0Pa53UC+xJcW{k@4OP#icg>m6T6&|p(b~vwSD6uQBbCv4?gHOnz%ZeCo)-Fc z6kbMo!?WY1>yNXFHO-o^Ho$FY6sS8RcrLZ`A6-H15nP(ttDT^BAB7iYyVxrz)oo6m`m>Hih zTCBew=r=X{#5`^K&CYh1=Y_iKezuOG)BW68VCI~*V#Uao^gHubyiSQ8;578>m}9S3dFDcM$vMI4n~%(Yy7MKnP!it5=Hxm0Bmh2r zfRx7pojwN>JFO@{6kiu`Gq0DtnYr9thS>nJ2@yYg{#l-@%sHH;MN(&lOXKRhq-B}K z@mrx_<+=J?bM9d-K-pE`Y|RD9S%u>P-)PW74H|IMR;|Z2YiM>{{-I0im@69)2=1$$ zw*NoU)Y+QzI15X~rP5NE3dFt4MF`t-ow*h>6)$u2wslKMamVh;QT52drX=#?a~yOd zqdV79>QU#{ImL#1vw0L{1&-10Xl|f-qE}2rXM(Xw%E953omZb6DXN&u>2dnNUbBM4 z=5HymV*ZXN`y;P-*$g=dyahl17?nhULk3S0Oz7lPWaqCl;Mw!bl63N3V5&{tBB&ca|} zxG-AijXiJ7lVYz$&{di=>znav1Ydk1+c;Xd^xvEeRWGz`7%h;q`^hk~XMvf6;^cvvJoot~qCLC{={u%7)JFqfQj+(Uqcf28%9Nn$me&bb!0IVRjp0 zPz78e46KT)>bfE6Xfc9Vx0K6h@zNEACqul#6@xQNP7P+OhAT%2XuzeB@hviLxbhT> zs3JTC8!ByUk=l?pz1~MwzKrXE1#Y-B7w91Y1zH(S+9(Ww1IzK{1QaQ~?6E^(gUgr8(dF2(*N&BAXgR_>6hfo>b7T?+{wXlA zEVCs1b`(3ioLe5?D`(i6=9WV%y{+iM>zU%>@*>E>geXjD`EHplEGo;5<>s<$Wwg@! zQ1FQB(e=t^ghFt=SE1s1M z^Jd8_uLM?d1ZV)}>yTT|3l>iAMZ^n+)uv{v@qYzVm2 z^339ODBdH&y^!~D<(08L>iE%$#%*^yu_)_PgN;_4ZWq>QZ!E-+;`!Yn_fYu*G)Ty; zn51H8a6^^5bkk=pL`K-zuY>5EyWlRmU5s!OQE}4;EWC{H5%K75-F{EhMy%8m_(ua?tweRykSan#J+iP z$%rV)U8{lB*d!|CUX@q<@WjdES@khbk_Eh?fZ^54)im>7Q$knls};8-;qF&6gn4`l zL!lNzJM`Q+37MIeS$0f;qF7| z=>H}Kxcu;R)?q8s=!eq&_#sRIeoxMGzwy9|@kqbf4{hdorr-L9 z7v||wY1$wBYp;`-|GIDl)`DxHweVVGt;^QA-48tyy?%K6U|;h>j0Z<+eJWw^LuxIJ zL&m`*=I!1GY0bXoSaV{&iPP~a1aB0o58d>x`PQ85QRR65CVmX+MLzL0Jmx{elB6s@ zu|YAN-9Q519R+z0AU)H>ykmq6jb^X;> z-5u`vWyg_giZoi`aZh2)_t)OoZd~$sS#%%$Iz8h(rRT{L-AHbZHv8VdmUp|bUEKDw zPyzb&dqT_;#x*$Z(i8KfJ!O2`6|*n8=#PML&w!~)9R5FsKjm?=W=SC&?TgZ$OO`;C zesi7}rBm?S;S`RJ4bUrhp5b}?B5{$rNMp18|4?(3J>zQzO;38=y%E}sZVonmThH6# zUT`nLQoEvGh?(b_((HKXIp7UBySUOj@^snq_0wi-_139if9?;&}4y&ZT7+?-|4#*Yc)^|7M4P9uTKfcq?P7Cn=--$6+K`g5QgxIN1u zBt2U7uP4`An|E?gcAX{zRix4l+_9pSDU;}W90BgBzsXtoZyVV&+BKe3=~BI@kMafcBv6cU$**I${pNAdx#C@VJD8g;l{-FVxN%Jias z67S0g@fQAog&fkadqaWCUifbAMq)!luFytw1C!J=6fz7hiIrx012?15;o%K&8ciD6 zh;76n=rBVN*>LZBk6xHNws9#3j_9Lruz#ryJH9%JmcfgrRO)RTi#fG<1sF?lOcZzquPBW*K^OtjlgOowzK)&Iv#Fjvg2pk<&I-u!q(D;e1Tio-1 z+8dYMeK_zdaJB!B(YcAO+*W6gUJ)Ak4UhDnBB?k-0w7Yst$~qAnq34 zL)zS_QNsiwZNO8fXh8&Q>@*zM)(3YoEFRruq_|B=EVPr{x!OtXq<5}&-pN3Pc3KoK z3^u)^U>mXU&I6?zL9h&x(=al!^GM_+E=SgO+B*UxFL$1ZjI!d?cSO}Gl6i@KEeFJI~$>;OQxDk#@Nxq8j(I@R*@3wYbd!haQLHO{E!q|OYgc-5eiW&4@ z$k$W;09Cp4-R=rRa1#5q&mierU*6{=2UqvGaJz)7utpM9TZqy0)%HCstak?8{OD`@ zo_%zQRAyv={RU^yixMuJx_3RebQ-|5NgiX;4_6QuV{;g1VHPk#*~E4e_<;KNP{YJ- zl+iKD^%|X$-AyneNxzNVE8<(|s`hT0@z?bGvU|%s8Tx(O%`s1&e#O1Q7)p%0qul5^ zbD11&I4Z1~iM<-hgL_HsH&BY$9OO8bI*Dcf;DhjZ<_WsmG2r+fcWj>^tiG_q%Zu>XcY5@artdG{sQ2QND} zBKLq2miGhl+YE*q-6gK>*Y;cckNZ#io&DhqatZEJHShP?q#oQ)%XK+&P&#NIxR0Vo zalhkuM4>_-BjGdoIxf5)-%lVNnGKaN($o+g*)QxDk(Qq+eSH6siR1g({ilzv{C?o0 zET~kY`BErIn=$GA5W}1OApYD87UhuqA`SlA{bwe~?spjG_Fq0?mtlTC%&@Q@`G`TK z4ha;HK#&dCB3yr$lB(|iy)i^tacbaU4j^dl{}KtF@Jv~z^@v7x>&Qq7GEX3(L6tx| zzNhm@a<^P&DCF`9Wpq9R6&a(W^QnfIQCP3@q0@NiHeNga+Flhn!k ze9$>)GH;98vxnnc>Ck!TIrJSq5Ya!-9DX7m$As`B;-1~&|0HfxdR+4GnJ{!1J?v1r z;lr0PbjLu;I;d|Ht$>eL(d?2qw6ooE;xMSAy>1dXhagwDC>z9|{=hH-(o>xDA)5$t zhpyww@#AstIDcZtf-HBMKkczP^eO8s4$B7Q%^kjtVK|2V_z>(c=r8%JCyF^zOwAl( zln?8N0y*vvYljl!?eyC^bTW^d{dy>bcw|5FX@3@l0TRIlj$}gjk$mKzL+5yp0!P84 z&{1c6Wj%BhWU)iI&BDRp;L`EOoptgke_m=| ztgNp`SA@?;FGp#X!ZrPlj@XH%=)YxLhJGD>1Lf%P*ZhIg=xO>i$7BWiMf)+&9i^4P zpucC{D*LU|ZwX%$`)%a=;D2LX+x9n^utf##`f1hrK+YbtA6sH3YZGBV_8$9>pFekY z$msyFHP zby}nZG|YL!60n~pbiaVUcASO--isJs3A@$NtnN6aI}>>5g9dV)-my%Ar)5IlY4G&^ zlcPco8BCQ@_MZmeth3Ou(*|J#D%@=h=$SZ=Tni|0Afl3cC;jo9v)h>Gd=j)1xDLaFk)& z=5Qc(fwN9LSc;%gMI1L}QK|$cM>H%#KcXG3&eCVp{=91<)diZf+GkhH&_18J z**ck`_~*&Gq!@2MPk+Q9V?&gJ>zuCFT{0p%kAuJ9`S@~O9M|j8=V8h+jN5i}^(xD5 z=Y`L6A2I(C3mUae@qT~b6#Zh(|L(u`}~gK^SP}3F63Q=qhxzPI`ZnDmzjKUe$QSKAJ;me z`$v$uaJTJOp#x;q61rdc=)!?1=>_x)b%p+pi+yvE$E#c=ys~x6>UMiUO@xUUr^sWz zdeOLO!(u1o?e7a10zj(5HOG5l@3`3&e>SPc~f7&$1n=!pM5Wze^FO9|Ji%aoKU`3Am={gs^(Q)-Mq@z%{%XP z^SAh_`L}?-_1-Z5@~EOO2HLTzdxIA`S*c2qx|0DXUY*i zR-utjc|khWDI}axn}6+HBmLUD0{?Naeftkf-1zn zC0Abc?v?)Jk9R)%l21C;g`{JBL^|dpQd9XJlH98IxRkN+acth;YTDuQPrm!4%H(@m zx;WxK<8P#I;=iPP&qzV#+E0AO=cO&aF8zTnFa6bfUMeWz398^q(oaw&(h|52mia$*Eux&tEAWWq!s>E`sRC|Lhj&B>56VBt>BvJ z3O|$%-bc~}(F)6?PGgzm1q%x$S`55oG3Z3g`nzPgc()U6#*I$8!^!gwi|yTMS$lVl zL%R{ugBWhhSKmGO?<0B<7d3gE-@+^XmZf*ua{L|`(?QT7&>_%4(BUy10euPj5_AM~ zbWF!U$3e$I$3Q16-&(|{7Lt|~?#i+P{KfYx{J#OseT%!b%yAjZobuN4-S-Us=f;WT zkw^iF6j1KGW%Io_rc0>K9YiI|%=;axQ?`8TGw!o5-CJh(ie*MuvHa!xy(O!AZ;pev z5cC15JRp@8QhBtX={OFrK;pmc{n^5ly<=JBUo5M-j^+FB9m_xDJC^_c{(}Fnl*ngX z&tlZ~Ek<1*rR!OK<$XZ38P^MWeu%V(NazhsI2zLmE6;1Jyi#Mey(_Fg^DbBsdXW>Y zyiNiwS(n~L>+!pt=pD{sHRzmH1MjpRy*sR5e|L>(w{=D5wXUc=))n4sJ$Uz7SwUs1 zjrUt^I@$W0??K#R^jm)j{Na1Z`pY_Q#}c;g@)7H}YEj90uN_b0BN-Zrzax#o0nPg@Hq!08$ zuV_)IrAn0wT2vHNs_B(lw0O(CMN2JOyi%Jg{)+cf;VQj=rIsqE&v)&8&OR?Qnc(mF z=jrD&G_&`2ueJ8tYp=cb+WVX#qB*usNVWnZtbk;l5MgEhDol*LVE(;QUw*ecnE$@g zhtFXC5)iWw`E?}h*8D=(w){eA2hp?HcIM+68}5GX%y%oh@Y$We znbfs6KhL#4KTq11pXc76KU>+G-=XZo=ODF$XUWf&M)I>=hw>|2$_V{)7!Us8zoYrs z7IPBE(ewn!oCKMZ`QK2E=l?`GfzK%-G0S!u3LAyuPUqjDjOK4v&g7RD+j1H%aynP@ z@zz=rI0p~CNz(QF1xi}MsvKBJRzbNdqoCZKRq$&i10Qd}=2e)qz5>5gQQ&t43jFSh zg8LL-LBA3x*sN3+Y_{R|fNStfTy25NKCi&#s42Khsl{g=KFtNIrn&~~tp$^9Z3UC@ z|A&+|d{!2$dd~%|7A%zHf`zVNLA_g%3l6)Ly&wmf_Tjnl{rG*{g9UcSzJfcH{rDWj z=TO0_Sy0bN!BpvR!Bp2s!T%_S@i|_=dU66kYI*`pPx7y)@bwhFo-U}%vE}5A7R-`H z3%nDQGX+a*_z$;(@X1!r;ccPUsA!h$dVxzy^Zp3`e?@V6mn_H`$jk7qk$m1Yt_<%Z zO2E4$2dD~fwyn~e?W*uDQL4RY2$$f+tr2g5QtQQYp;TnE;f4%8RZ6qB%GTM?Y; z&3l)$)O(k!(|eb@(;ILoZQgo^(uaR+eco*jWhwnL=$%Cx81_oiChsa2e8LuQse7xp zRNCVGv$7SRT_|?VvhVi#rF~w%YqximvJanwgq~$TgrX5t9rE@lBlsLcF@!$uEs#!l z3tT6>3zg&Ejmjx19oU3FM0+nOSDwL!w6y+8&6iB;#K>1MQ1uDRcD^OgC z;z|@(pm-WDo{8dW6j!5oCW>ncnHp;gZMNFNY-Jwa+FH+%%|NyS*$QMckZpw+mK@vC zLL}u2?@~Gox7&h*%(2N3C=6t{uuzc;Z&Uhs@gRzaP&@VqNV2CD6)4vW7bwmm zMlhoYBZT5C6lWAIP;z;(7sWml`%vsH!blaZDknoP%9ARK@>~@~FDsQruPf6CU2dCM zgpmTe8t9oo*YM(66wgEPJQUX!O;zfPHj`GHi#$?mk;m0sv{7j;`iazB^s3T|Pg_x4 zIl8zM)k}-+Q&tj@S+-!&WLLOovO_MKEQLY4j}sXLY6wIIi!Ld{MVIh*vmJlnpG`%p zZgUMZY$=-K+EFw|+5s+Gie6K8qaEhRUi4reda%DJ&#}K~hO)QlPGw(FlX8g2!jGWp z2q1@x^4v#?W-B8_9m-*Rj*>9g^B3VREY7))7nLi=if&g$^@qa7L#qUbZ#fSl0>7TaZr$|#vAx~$q+rFZBimMakRun&>tSo-QwX*mZ%F^Pu zlpx79%N7P{87$=DGNrGW4Z&b>o-|aP=Nc}~a|{>HPzH-{Q-+FLlr6>O5Yx7e%eA9; zvTIlIWXI0p$m5aR5Wk`7qQeK6W*C6F}E@hf;isbZ7ai#fQR-E```IwZsK9A(} zd0e@^ON!5T34cRCAN>>X!N=QdmH4HwX}&tLshK`Wn(4b&srId+4%YZwQmxNruk{rw zHNFMPJYOAFo`zhu#bf-n|xK$R$rB4tFKPk#t}P!*a^fgU%3tc?ejhL9EFQ0IqF;OI_CSN`LR3GP$Ay-sDnFHKTTb7@D>(KG1i8DEn!>RY3n^*v=n$Z!sC>b-#1_+IeM zRj&H(l`i`>y3hH(p`Yo;HOy1!ScCR$jQQB>paQEGYPdH!sv z-k~`9$2=*|Ae%{|7T^Te>2mr-z~|0w_WxZ zD`Efb?x24F{~u8Lh)50|#lo5bB18THWf0;I^Wse?-h$#SDBgtPt^RU=?YsN~G&H;Y z9%--N*$bQ}u%1C0&39FZ$QnF8enx zu?@6b^RJSw`G2Hb^S_G!W6ycrzYo6y;ot30vPw43vgO4iLELkS4EcvOjvSfz? zf1H+-U_uggzc+2Y%~zCl%$` zc9lrdu97>I-6eP0_HtVLN<7m35|3+N$^FV9-VjGEwvm!-<#0*1?MTV1WSvJ#a-?G= zIqu^n-JTOAkGqbR98ivyyd)hhNwedRW;^~0+m#dOsB)bCIa$J@u~Q|b?$afu(&>_J zgVIUF z-n6YK&33OW&GxJ)J)o>8{gHb`=_|@ge1gKo zkQ!b9ZnZI1BJ>8e1cRw%O(dVyZQo?9pS)asSiX3dGS!dBMk>UuA#tf z$}m2g0(FGm5-4XP6`;;U29L47ZZ*>x_PNCIFv^a&&xxg{|W<(no0u8RTvR~Mo zWv|<>2L3FimHk<9;&U~C33oMc+9_QP%#-lf4i|ozuromrYUH$~Kc?mX^7s&N7$1vn;N3mVL^;wCrj8|7m3f zwaT%r#9POLAhfb9M+ugdDRNnw{T{5G;j&U`u{tt;{3sDD$|smCaDLmDNex%9bfR@YzXS zKvn@V?<&KVxvU)Da_sak&H-(}N5efG!PPNk^rKJM zq&o(Rs;cg5j|@e-W4#A$P@pe8>C0=t*zw zkINxBnz6g*-+R&*#G`bd*vR-@<_CM(IeM#d)&*z-Ew<88txDM_fvb{?{PH- zqut^DU~lWIXFnElwgh`)a_q#D?}Z#4(II&q{_4r<><@QEv{sA1z4Di#Y?WI&(c~&sF8~ z3daV5@vb%RQ)!{rs7dY#4)uahe|N7O{TtN@{)^=Gt^Kihu)j~Djas6ztkqnn znu%IXlN^gjBf|<63c>1o;&QYx0#ebTE)wiLQ+0#f6N$>KC9l4Q>K+Mb=$2{8RUeCm zL;Z3$jeE%15S4>#*`Kbu)>vb2Fc!P|qqS2)j^+*FI4k#P@{puwiCcCZ?_vuLQSb1D zRRhOEo;udH5#-`>&2-PZp}e{TS)Fb1Ng-EVJ?Ha_ZT~V5%BmwZHx2g(NePV9gx3Bp z#(6@M%>QuLbz+d%urh>;eQ)fI-uLbA+zCbrys-BHzeYjDN;x`}W(-=yAT z)h!3{mT07pm;{%Lkx>5tW+Z2H=|=lZH6P~ZK`AFI2%T`GjM5lUa)_CRNQ^D<)Azq5kd{zP{nNp)8=8_zfSMzo_Xv~2e?Uu&@4JUYOTIo*i3)0Pkw`{y@u9IDn|H> zwdK+wIXX-WLbNB?CI6nPOARd(=J6k`hy=g3o%!Q^$v)7_zf!sR)&l;CE#Q$yX(p^0n(0(KuZybux$v*icv|8T_ z$JqxS6K>fw6V(mjrf?e;lmly?d}3qcdPU0LDG`+pE_%K_n>_TPXL$uU&lY zPa#(X)4eaUPJa2(*c+h=2%wrK42OzoIba4H?qa5Pkw&7#0J8%AOn_X~f~yum%`l`P z`P7tC15hseyJL7j{*q^)K9sR8xDXx|^3^=s_v?^rU66nK5Pi$jXmATA)E_|v3o)M^ z%(C^6;yl$AsgtFOS*Kok*AEvBhKh|+!<~w*{)t4+;EIJa|KMv-s^|eRV^Uur2A*|6 zeZ2pP#59Sc*S(e~j$S#J#L4K2EsO*a0EN2AD)5z9;cJL}<>J6R-Xn2T>6Q$|->0u0 zUdsnN4MqT`h~=U)9`0pM(M_XL-`~9`+>6EYsh$k68lCuJ=HEl^D)IfhYcI5ga>Q5F zg#Y@(@-Kv3n8GY>IzMvHgJ3|jCK_Q3;PBLM>;FDI*pt)I*oFldrnVp)??6C9ZZMS7 z*!DnEb9?LjMGIOxI-1)%wmfW`jTy)sWy4TB9_hb!?r1OOR8uq<;=!cb_svN#6DnZ7 zB{u)+=XNT15`XMq+Q8o_6)1y@&Hdn=R+Zg;n~w>B(nR(k&tm%B^{NH&W{}OoX zLn8e1i(9h)8Q$Mm)BOpICf7Pe8pjENi7SS)sxjDKKNOEpXmf%py_U*lFtrEem#HdX zs$u~%q>>Sk5#$wu6q_JXid=bM`^!YytQO<*E2{dCsUfpKW;jr*9F223_)h}fGzJjy zM3@$eUlYh@1gX&~m*cer8frDyEeHLEK!r(YK-$--uEJCo=~}x?9_YpL+k`*4vVTjk z5+e+T#j6%a!=Z5hc>4_Cali!e5&vpE6lsc zxm0f&RXtXppFk8NN>i?lDom3NootD84aJsGO`ee*7rdR9tMZe7;vvzxK;1RSZ76T< z4?;`b8>xb#NapdWK}&B0>wkX;S)pqzOh~99Lu*H*%3|M#%mg5yHlueY)Q}^h0PAt8 z(WOBfRhrLJ1=bi<8dQ)w`~sE2C+VfCHK_606A6s8NbZYNQz%-Ji3)f9Rkf9I!Qr0n zZSrxZ*}?2mBNe z8bMSfnnyJC0YpZFN_ms(Xo7%*rX{FiXG2pa=F1y?)}StQ-cY%a$eEo1OhPs1Rp>o7 zVU0u4SS0$^mpTL35|Fuk3=!nz#TTxqU&(+6HeR@5o;8|jZ?P&twQMf3LcKKEcMJ64 zr8czV(o{o*yuk<5Kp%WzL`)5(X61-VY964vBy)zG-va3ACaTxxJ=$tDWmIDvD6N7^ zG=Zv3bNB9WEDTrjA*!IrTkC~d&YL+<+XK@M_VWdsZIS~Q<(GPBU&R&-W~8kAi;?e6 zK`clE(-e&iu(GHBa`DG%+2VC_l$D*nKIbBpVUPsQ@!`QnwM^ie-#Pp|;=|_tZi2F= z&#vuX(39H%k3gObiIfN{uKnuf2M}?xz?Bs|TKe@C$ju7cuuEcv!%zHd7=>8NqRe_& z;r!oCUoHwYHWQ-T?nEHm*-w38us!!by4AdJVxd4FgFq3R{CHT7ou*ls(G^t}kOvyt zzi;*z5SoVyZG<$f^Sr#iw>N@KoZQ_+4n;Q~G~`hL_Dk_Ke<9n_&8~s=T^$kR#ror~ z&{&!XTf+Wt5of7yHSI2=pZoC#Y-`E~zClKSL3;i<5dnRZgXOOBGCV9c&bL%Q|0(QJ zbGu^oU6hx_>}E7#HM6i!a&^TP4+Iex%%^YIUDI3+vg~aWm6+U^G4_9zgoD#CF;*k3 zE9BdCD^+cjC4NU zO}voGO`$_$8=K#1ifRv$GsPSTq$qWXEr=ig_p`ydsA~wv`+@_PZvN)2A*ri(5wchR z_SxWWB%R2u{B7g<&XB801^wrQPi{jFmbXwhlna*p_?K8LRNhPPi{1=Xs0gw@#<_w( zQb$8{D7NN@ZRIau(PMv;Qka})`)ckX(OQPO*2KcWe|z-)JIHUc##P9S^-`F+^MRlK z5>~1bN7IgIupfzhiWC`@DzFixi8-m@O(N~;>gCJzDRerNrG0C`)=~a76=gEDw66&w z7kh;YFrJ*dn0@Psy%4G~GB8X+eU?f+8W{6n{dOuz2a7fEG|=T8di6qhg(s*Q8(&Vn zvmaA;?YF56YUYKL@;^svRuSCNKSc;36WJ0wrFaO%$V#^Mg(yWxIb;aP<^kKIQsK+X z@7@X*$G)@V5}o9b!#Bf3zRI;>ZJ?{$*%FEN@iZ(JcFfk^X+M~g9m@HbJRC#nK%_N$ z=l`<<0yKq#y^#>%VTafiCSSLCf2ulSxGNGe@6^BnBfnPV4fBnw#kMklW>avI$mVhCxu>%1a4Q zZU(f*^mfOZjPnP|pnzOc1!3 zWjI>?4b{@rOsHj<+SjR?=AXG*CEbB6#3&(XKrILs&m} zFf^?U7&yJA$ol>_sfujQP_+=5p#BgEFcg*lkc2slB&qd(ja5lu=6@&Q%35{~oTDm> z!dTVvHL~3M7S&p0>cnY#JKO+^LM{+MbCBF~s4MrCBs|rq=`U1OXznS_dAn%u^{XUx z&2%ILJ-n8LP4pnEVD&I_!p$nos2^k0qHvbZp-n9Ht$ak4#frA`InU ze)gT8hjRK?clWWWj!ZdOMPSvH`;&N!`A97dur;xSCWFP9vWmq$^Qnq-LCRyt9(*=X zI_1{eT%WaCTWf4tgbw_=&rrwwrhd^P%jBYk`L|SG6ki?g(o;i_m+zMXU!18RcvQLS zfLn+oNuw{FV&#^Sbb=US@}-+PfkJKx?11X}tst4Ju@ZHEr(&9ltlyY^?3`K4e8w6` z5E@Tb%{Bo%B~?llf*kf>y!gYK;D*UV!qIWpt4tFbEshtA>ZzeetHhm!?&(xQbDT@Y z;sZL~XJ^ojR7r|6D2Qg*$4CQ-9#?f8MO159wwGaJgCohPF=MibaFfl{JNu(akV^>3 z%vu-Zs~09-urB&M=iEwYQko8~!huyC6*CiQA6gy8IK~W$E+7-}lKp6vLfJ)B<>979 zDQ&qsQ!X*`l#naFI@U*9 z!SpYG@E8lrsm=1o&vYQ;!3k*dv*`IVpAJdg1C$wfLjJ8kl-@nCjJCPE@uf!(t%!hb zJ`X9uzcKG2L{v{yc9M|J?tzZTz+*(s)jiM4Y3 zt^a&iw;P*{4%}B;9gLDC>+zIYXjc9YHhG>hn4E@DGZeT@6^qB}kywpAOF(k#To4V| z6sgArB3v=~A=T@91g##nh${;+S<;mrE(Um}uXkdrCd&9RFx3q8e&^*-dTeb!HT~>=#=nG>oxv!DP3r~a>n>gSLK`j@ z;eyVR_K&qL;s?3UWZ)b(OOPaDH$UFl$cT~sZUwQB89Qi;0lLd2le zU8g#qE|l7rD)s*%i_E;Z5ur*b5*_|z)zg3M@md=ru!|1wxL6iJRBurRtEy^^HTMm~ zho8@ylg1!=XIg*5sg(Vq6R zAi!0DXpbFbT_zrRT(R?ehX>Xy3C6Kp_qV1!7E4y{eCGU3p=?#>s_iyG;a%PQt}GcE zWl##aII5pPVv}EBcq;O06CFR$wOW0Z{=>1a?A45#Mwmr+Y@_t>TX+3J!?P&|!wJbx zx9pzMqZt;i0d=j>;~_GghrZtZCGyA!T9+f8H-LrZ{PGp9P*!|BR`=#!T;jt;sqVDp zU)E^r?Z5JkNkeGMBvkv?aNK>SM>PooHU_)a;Pgbhq;&VdvOjCmFcZe96v4E_Y|XQ8 z{-_6uZ|XDkj&9lu*Za zZT#OP%n`V-@Q7~g1(K5ogp0zqx|0Z0o}fGd;_3Gf5h`)8focmz5y-_V36Q7@0)+cH zjVT0497qmfvV0f_ZIZC#JvmN??6H4xKKZ%iG8$2n$E2@0h3P~;pZArFko3rA=chmN z+d0MxGGA8li@c+Ij1}Z!Sj8=K7yhRB}C_;lo1`z_~g8qzeSp{%a!VZx~0 z&@lXfow&t5N!99X)T&8EiyG^ZBmPt}2HaVR8#UVqqqSY(caH4rDVTx4M=*0NGbrDsXA}La56*HM7RHtqP z*!~ap#Is(*m!KoBkOARAXg;PRh>e@%778uSWZvGdoau zg^JZJ2d69JdP!vXB$a2XgGv<-I`M3X>b^8<)+Y=zn5|^Ts(;ZSnlX{%U}ut_CXhPB z8mN^V6duSicli-Qsso`Rp)P%H>-B&|dvG6+N@cQI#x})^|!qp!Mm6(dK1sK3a zOg(wHP5{%=N*z%HKQ7GADeTK>AD~1ZvExRW_sXX~g8c=U@r}`6iBO`G*K*XqChwfM z%oyXf69mZ|h{cygWwvg7_|g+cG)?P_)n!m!8(vPnE^xYRPX3&&3vErUJSxP26FZr$ z$~v`|dPReK&k}80YrpNYkB2-Y1D=jyLQE$iyjC2e{Ab(3YI9XPZVlowkx2ByC*Ek* z76XIms@eSqiKMzPL#<|S;;PH*g!8M`PC(0Mp|)w(o!VwVRDWZ}r``$WSQ~xX*4?7b zL(QUa_y(Ft#bQQ&jm%2j6W_B$MeJ&JW@;gmTEzC+yI*g5Ka?4d#hH&l>%4~>c4#Y? z5Jcb9XzuL)c`WovZF8ef()IydeTY)CQwI-S6fQd%;0K#N`%#h-dgQq~${l7(wZ9ML zkTjI!Vhbfi@{&k}462vQd@uFlrNzHVC9ZnT@DRie`5B3paMVbji(K_(zc*CO>PdP& zFGSk=(UU*>isl-1jcYCf67D0FC#=&@Fs?LV4(_CC)n9Av+1$k4tH)U#<4o7CV63_T z?+^a_G_~Uib${FSvd1bD%U@G-%E^BviA>n#YSmw*>df|m))>p1$lV9OcHn3TNhUZz zRQ_;L*pMSj#dgliI4N@0$)Hf`70ROahG`B5mZs}-ln&12kJ;&%Z z)+}qCzkpR8rYeuIiaqq`?r3d)VA0}bZS@P;cMpAUYHhE_<0wt+QAt+P-i)VHK!;ID zC(MGy9gJH(`Ftjo9)~=9$LMW%@`nUmQopGAXJFkWJ1PIe5~uoepdknOoD(bhvO?~~ zJv}iDF1}yf@Z1kW68A||XM9>T9a*OK)_a@TqoWeW0~?moKNh_naCaYp_ru;j=Kj`ho81*;T6tdSL}*2xWEc1M$@x;&`aM z4p|!9OYRLn$Q~Y>JUAF#$1tS^4A$@@hy@0OF?z%ht5#QMwo4)&t-e)zHndKA6qNB> zI6gHH)(*Xh)WGap^loqgfS?%}VH7`hLlpVBo!p(8A|p6we1b6JCG<=YJCN0tdGn38 zq())JZt?hyu!ErcKI;(qgk;u(4YTJYQA#_m81SdaZ>$eyqTC?nk1vke`x{VY%?%N2 z8KMh=19U%J*X6C_H(kc>S;87v$76cq+VLCX0EnrS%$SY@nO-;WA(=6L^U15b<58Vq z-Ho*9;w=WMZ{wTVSY3xWh#1clU;>zCJS%|}UCk+y0MXfV^r>cmw8cUC3lZWKjN8CKz+@ZFl z7MIpXbF+aOyz=0I2cjFQtJ#`ZhX;eZxF3p*L(7s7U|p}CtKE#o{9xB^EtEIRp39sc zR}WkK*lvuS*hG0JW~XLMaR}UocE_9ea`#uAx*b}eopx&vtu}CWi*BSD<}G^+k+^M` zeQOd2t|8bUjw1^1g4ROsLF>4pu!B?tFI^07{_wo+3*E|#X8 z>G(qfz36j`<(?Sh>Ken8pj+~6Xl}a^H76m*h54t{t+@vD);#sg)>zf%Z%<8t>mext zF2FeAa{=gS#hx(Edf4?I!?2Iz;yCxj)|~YXnVQ+5nIUC!mjK_&7;bPgb z25Ed8?cI@Ddpw{dI^pVD`TN-FaGEUhccgk=#aeA>G+QK}Pm^UIRy zP2I=U(T-;^j-RM4oT|DWs&BIlhpTJ#juDhO4t2AhR6&An1WkkqB(fd{H5hljc*&tm`1tqk*s zDP=z_kLYt18?xl;iwjvl5@SFNw5AYL_0N!LfMYh=P-?;1P1l!O_DIX zH{Mgl8U1x z#!Ad18b;{`;+mwsf((=2xv5j1Xx7!3nE3=lLxa{Bz8k!1Le!mf983fj_v?Mo8TTa9 zim{z~r%>GSqNe|svB;8fc+q^rPl?}{6c#-wxgA|6QwTbzTh zy?CS#F)_cnN;hxmp=|XGJu%m09#M$Jd?;ID>H4xhCjU@VEjH$z8qe@l|ETl&)Hqro zhXTQ=!N3i8l1R!kq)5^QhpvJ$54_<9WFgbk^>$-o;bf~eVFl1`P||~ejCJw~f+u3T=qOtANERvB zOh~#NH7qyU^=sC#4M`kMI6j*Z8q?9$nVv8pI@~iR-k(tAS5HUPppzQFyYtihI9*c{ z_q$XCW1lp4ME$@|XeB}lqYQQNSqr^y;6-KQjJq_auPfomQ8M|bH- z^Ky(gmJ#EApKCZJ95RTlG>0!5%g$*)=urVxd68QZu2!@sdF+)9OMNPuBsq`2#32JR z#D=>oRLRIB-3qXdH$|u;*g&aSL2(k7blYQYVp!q7H>RBYK>(GB`oaks+axY(T%VM3 zTL0rK!Pw)=-`$36Da*7C(G65vC~3USG@|uRx7iPksSj~3#*HTNh#kZj(Hn@$?-`2= z<=}YAuFgQ_Ry_}={x#MPg!T7919k233+gGq=&UD!#u!bDw@kQR5g9M1W?VN6{BMk1 z1plQB-BNH*9n`HesYRdKG-!M_atW;y(X4A7{g1eVin_@g1|}zU=IXGpkt;QbD7?K2 zsAGr^GeWn_W>I8ZUln-hua7bVPf8$Xg>j+*E?ojqkb|dYq>2+r@k&nML!7{EV@jow zG2Xi79TXA)!in9)iOsPRBZlG*uRp0gRLzN`P`GjROsa4#>%%%enM=dN_PDNaNTZtq zL*A53Bpt)$D&yqFy0y&+`Nkr|NlaxVZW)V&?m`%`F&&zY<7B6BvOGg&?x?!VuqUh; z(Xp%$O3_ZLbZ{jnob;*;ySsX0P(2sSM3}@CIqpTl6bje2dtEj956o@0*&cZA(O=rT zYV;qGb9B`he&(tN-}qHyT3yz3)fj*1=@C?_#~`SD5|xG@Jn@36@%Kq)(s%9d8sM$O zNZs4x>rs3auP!}Fb^4o0NAcD8ZqhSUt-p};ocfiX^8}@OsjJ5P2BCvgBJML%M@CU% zdUr@?dRI-t^E2Brx+)7AA7Cvp*!oN7K4Y^jY5Pm{+cw+Q;YvT=Y@`3)79I_0sBiq( z{AG(f7c~)X1;b_Lr&XroZC>b~`UY4pv5&eoz+RW%f!JaBQ!Q!g5~dsFdPy zdbJXYzW&Qw{?8R^n}H&}Ge+q*d8r)~yH=}Qe)FfLe|m=_yH@kmCXjFNQaebZw6_;U zXLylgy7mr|;A%3L18Md&`@X?1M=xFQOjjSig&wq=4y&F%W$wZ&=RDK3=Tmu@rbbW< zaeqU{J@1?~A@qsB5IbJad+OaYp6S|CY?gV&FmL@+$*u2=dZuenyK+7V2ibgLkY|Ff zb?=|{Oet0$YJ{ldko2kl6!m9&$FocSKJk;^c{}%%XS(`OR|1mJJGlAv50sOhDdO37 zPLEM}K3wvRH2cJY@4lUT!edYyF=UNLcg*3ODKJaJ*Iq`$yFE5B!#?pb&^YFq zuD%jN6@|kXrPY1Xwv;Yv*X)`i)AARAyT>Hf0LvQCE@l03WbE9Jzjg@Qv z@J+A%uxAQ>fj~27w!AP3@`|??`Ro(-fWnApdbSzC+CRKC=X$_?$TKBhZEsx27>)ST z51y}p6i>gMd(bmoeI(n6Vsv)CvFC|O`+m=qEQ1_!oKg6D|C7OKkOCC;d8T`GDdae7 z>-+Na6KC4@dZw6PErXt_F$1Hrz`y^YYRK`uw{v$3ixP6ENJdX?`Pqyb`!17Sjg;y? zzB;GYKJgo%w9}|pBaQn%{mGxqv+wZSI-zP-b&oC0UT>dR_vZ1%HTvUoyEEXd^rzcK z@Kro7Hk#2z_F;T4X+7T993vOiY`4KCl2*0aEjl2p6AjzYFyZ-qQM=SG?1=oODDOlo z)pktfE9|-j^Q&T_$x0?6Hz!L~&_0zvQ>$($^}ygMD2X0Gx4r6k+*aWrJMXdC9(}LE z-gdCw5w|>9y7%Z$Ftcm z1S0;if1UG^XE4(y+iex;_57&;Kp%2dIO{1z0-|}ZR-~)1E+!UAMY{S*t||C-TZKz| zEf;;ARgtbf!%E+#R=70php$)4D_q)s94rn<6%KNnsJWC=nO5bdpRI-qci`RzN$YW! zJ6n2#p&0!wm8UiI*le3Gm8UJk|KIw4xvK@Qh#G+Fr>~EdJJ~rIpx>6Btj?a9-8Hq; z&{Ne2_3aIH{ei*@GmA&kQ+ECJ3aOrD1VDMCyTZ*E5a=!jv87^5hg2coQ-yr4YpV7} z1FLUU-{?VN{NkyLU!43z?gZJcR53rCY(a8Q1j#$z_>zSp2C4%i;pkLz!cbCgBnIs9cj|ke6gac+BOO_xZE)uw`TK9-WY38YCuh5OzQQ_8~ z(3xbj{bW{!yPl=7=@189d}QjROkTk58%%-5%O~-vi@)=VCwW+V+_|Ek{6&#O26IBl zZPkgEIbuVS4rzODw~mMn1TG2!+ADK3rD_BaYfy(>AhDq?p~DanzvZzWN|o%BOan

zB#Ym*8T~GX%|NLEbGtB?qGh_Gkj zo{gry86EpZeO7>MbqcbY|0S{$K=#1hdk&0A_5kLvI+;PXek`(vge{SEfb0(zSw|e} z346179yxv^*`dSyM-M~cgrxw(=di9lb_?A;n z9aC@0Q8g_xBaC|%=Cj!sYursIKP1CFkRjLp!uC9i40_;W`;ZqpRFWdt#cYk6*(0 z()(IEQ1Lj{!&bad6<14%Ce4qx)yU-X^>PuJq5R69%k3T1{=omBlcS=O+FR53bTM^O zJ(r|jK7d}<+Xp9Dd+8DZB`Bkp+5DO;y|+z^EMGS)b2kmjI_->Q0N!cNbhK~1r^d2eM&(6SF|0+d2MRE1(Vq# zq*vcv3Psc0(v%PB>8pPAgXHgq{QK+~l2v}Q=@>U$30|Pw6vdIWO1YK|#J5K-mAjA| zWDy{~I?fZGy(3ucUC2L=2-6T$dc-R)!8+M5l zwF*Z>^$9yecfEMa7u6TTCt5a#VJu)aeV_Q`^_;6YPp0Kwqp5s4bm*0VM;yXGHq2*;&3Ap#Q(i^4{rLYXtGj~b`Plu+w>Kxx|X2)&*xQpd8ypBNM0{oHgz^EL`kZ| z)|l~vCCTv#$T2+Oo;{MOyGA8SM0cB@`;lbkF~-eLV(@V=*g4@r3j_03S~COUv`cVG z>ZR06sYE#p$_FQG#{SeIJD*KNY`-9;=dRVT*^nLi)@T2E=dlU36DU98)dNy50@Ac9 zC_IeRj3qxZ!U%g!yGM<%`nog{@c<}~PFPj#v=G)4FA(yWpryS)R>byrEh8-`#;3N3 z?AJi{@`T4R<4oeZ;C1_v5XGw!VJ_S473s@l{Em>!QiIe5ytpUQkE$<76;6>aD6Vi2 zk11+0>78qer;dm$+rOSen z`cgP}BaMh#x#tt1`s>osqlg0h~4a3k179+m=s&8_jA~j)2 zYm(iPnmkaR&VRX)x%5ZMon#K|?^8nO^)>XZKz?Xf+e6 zyaY{}+B{nN$hNgtz#4U}aahzyq`w2w;pBtgnt}|Ru1Ug2L1v3%o*nD5X`qaLh?K@G z73$eeOV(1sAkk96fQ*{$4MZa4DR9~CxO4kP6A#U`gY37B{5FybWUxjMb-8 zh~Zu^JmE-l8wM66y>=v^Rhk*F04^Z$x>U}-vt2cPKVR;mdfJhZ$vMh1aTKbR5a7-7 zi7Z-Sum2RyUe}BTvNOYe4kB+8A}3CDodz2d68-BC{j4K5e=N~K`YtYV+Hx*x+5#?7 zj(!1A@7e3+QW)zXJ2-$!9btGEg1=hsQQ<=Rm&$W>dE{=e*r1u_gs0N5yhuI zQT)Evd6){vqx8iCy`jqI$qU&1tuT+%-W?PswQH49{!Phx{H57JljgTf}wL2L7o?BHaYWE&+>_>S@>aSI=ka<|ERa; z;6%ap>;G8n^f)A&cDyB~BdD=0&)sa*0yzva(#GrrNNjs9l_#|gcvv>1Znkns-I_@eN*F?LK{ZU7dbXqVc_{X#}_z zUxh}RHH}QwqaAI4xJZ=SA+ZiYta@jTVZuNSIA;M7SrADaWln^NO;nx+l@-aU^o>h} zMVdtAd!RDttZ*1q#DtM1O+*5Zv+RhF>$)#Y~oyRBjVGL~Eq03?`(xMawYL z$R}9UkPtj^9YAtgEHuneNc_)1{B6$b#u4V?t4V6&0w-cHdsjUz&f3h;&_D&ifNorzgnYp_w}(=<541VHhm^Ysm1hES2cqSquQzDut1WkP>l$55Lyrt3j0!Uv-6c>j#CUH*-(t6^{ zOj?iq)JTn}?*jESX{uFl19c|&SwTI?6yoaEj$@txMW1x9l_ElFP2P>9ii?8cSn4(C z;ESMHEu}IFHe}ZXO+964)`4+<{3Q@=mCCGw8oGXk1a%f@;a<|N8;^`01I3`Uz)I23 z^#epPS5Qoh1uReV(-7?j)nVyvD^<^=boKQrn2#-(b8PP`B2`=uU>jvrPNuy^Krq$Q z)|zhMedu0OqxMSz#Pu8Cx>Fi-ZkH?;E%CVu54}J^LX>_29Dh&#J2vA};24Ur8K?i} zl}~R<`4H*?i!U|KraLO{ykuqCb9QQgJvF97yd&p#K2ST!mkss zpFyIpG){XNzW_Ep`kgt>kH1ZXxcmfME=%91G=YhYzMD@-69}sM@@}Nc-%&!ep9SrV z^g9!KAaM-jTt)+bOi;Ay#rj?qqWT=DR-`|cK()fjUfBeq(~0OwK~%q>!NoM>GX4#; zYSUk!T*er^2c=O#$=YFS4&w;OElnpkYN6)FjT`(1PCs6$0{JH4ij#N=4ZhEyxqeP? z(S0kIR}H7No5rMrAA?ai{ZRx?CPqZ(s-R<4ru7{?MCe~ZXiNIPTP2o^eyW(%d0mjz zCnpyVTSoN^iwGV9!QJUg_PEW08S=$$BA4MM2Ti7_yAVOny!4NN;z;`BJq{B^OjnWJ zc2L0RO+^tQi>gJE@o7*zkv@HoG$uusAFL1*tzAY0X6W+wK<;e%vk5xX7f(0M#+ibg zwaXx9?(#FBcrAUhm7-ylV@qdkDvIVVe;*WcU8yLtkfB*nw3<4-L5qAJy`PJ8_#F_O zh5@w7i1TiOvRhYEXrz}4lGbjU-uXo|zYCi6u2o4$^7q4Gs!SzKt`sEoR0201Vl5*2 zAA#Ho*UoW7R4)u5SJ6Q?2WspjbXah(>S1}C{!TQK`3GP!=%R(*WK5aERv*u0zF^G2?spBiJ-P^lghD6?K1v8D8iDL-Ya*qQrPtyIG1Wf z*`!P0Ix4s(QxxR@4ex{`_WuL+)ft{Wzc4X3`ru!XZC@62wVzaB(WyGJplf(VC6PS~ zvaK1?9%)Rn%n@G~WKFl4RkC<*CeccR=>;>cO~AD_6E%sBZTYPWbl?4+wr=2y(~i5h z{6=TFi)VFMtoI^Yp$ch*BAZV(GW>O)#MchK!x_$Gd~uMa=XO$x0o_#yeyYnc887^q)ZgAY0L3uJ$N3D6X8bMIqx0(oI`yi4C+}jZ8KVU!(W_)+Mc|f2-@Mm4YT{nlj zA`?9`mWY!tD3y&^z2L1T^i8}IUiV6@{|l^-W!#n6D-&;Wbe)2@>DN|Ob1-&HeHAT{ z|8I~V&A8vvGn=_*_Jp1}4Ccam78J~rY1Pm(1MhR-eK~{TV9S6dbZtmbSA#&4-YnTo z33ia-ri-X1vZmxF)U`#>H2r#;sxEUvE*&H*+;gm6hT_T{f=n{eEGan`=+q{sv+D-v zh$TD&be6goCUkLWxl1GB{W*)x+kF$yWFl2U^ z?k@-)YG%hY=eX_-S;L=!>NQAiagheSGe2=PB~>oDf$B@3nwyz0mkl~+m-Ew#v_(n# z9Wl!Si_ui68ZvPwKzv%}xaOUelDJ7^1M!zZygpHKtCoF&_;h~RB8irhCOdx)`YRy( zIQp(kNuLX!l>RHAKbR=LRrA$?zM85{DZe+d}!*pnNJbVKKDo zJ18iRJu3}Xcp6kMK;CgYcwb7YTwVj!*FZJRlQ1i-wmqDZD)%62L`|W{8=&g*%-G{K zkD53b#G=5@z_tpy$(CHuHRiF8gKD*>ZqEUeDHw?!p!Hy9N}AAsk>*c9v(`cL-YK#+6LGs$ARMjyeV zk5htfvQ4OZPhb4rG7)|g0w41{V%0~&qgmpq$TzJQq%BwTry#ti3!P_#D9HvK6W(%X zX##pU>e-ZTiN0MG_9n`?6kQrb)4O0fC>C%!#|ti18bF9K+{{|`W_t3s+| zi=+OEPkk96B{?D6WzR!aB}o-|dJFc`q*1w_II8z`*)^#rD~bcf;Os5dmgQta!_sDv zc(^Cr#eQ&+xW0v<$;j%QXkZKCl{mu~fko?RVHnCw~On+N^VQTSJ?_s!nvin7`_VU47_`eA-IEC7C&ze>aX8{T7UtX00;t zVf}NNlHRn_92A7rT)Jt|x26Jr2eRQTUxNQJ!`)eHtV%O=j^!cu3F6lMruw+AAs6{X&+lFw z$*N$tRBQBHB$BXW-cmip$k!k*W3^;kvoMIyekqnTwFA@#vu9W}g_TfG8EPvb zMmfMPMO6qEWA#EE3;hD;qu{eGyI_yQG|CCVMYW)84O%qeVVXu~{RPn7mwlF=05VZ_ z@u7w{MmQN)qg~*1B>Osfx-mJ~%*zqDOD@B5q>hsMXa>&EpA7m| z`XJ0wASRVtm2p)VKJ>9eS)~h_-o2UTIl8`Z?%umLv4d>fjxPcM0xAeF+W!Y?>eB?P>ecEtVfdWO` zEb+?*1A*^-CwFJ%R;G)VuW;KD^+t%{Y>s zwjI|gM0G*3cQ$Nx*zP=$O>~Y6pj*6NQ$}^&#q6{%Vbv1V9#M^60?=@kwLd8UdFUst zdi=3F_67sUGs!uThPLt!>Ig zsC+X%HXHj3I}?GU+&b60!?uwFs|lnb&uU16ffa7y26j%Xt8%ha7uep^olGYeL=B@) zFZ#fQI=_!qUKEvXbX0xC2UUAnFE5MgZ1al%2ohu?e^o$o%@A~kP(uuLO`vkDPvjG5 zD+68EK-KD|!G^cdxDynX=BI@bGXjcTBX_Npy9wvfaW*WTI!1jSk}%mi#*Pae0+YEw z?j4{(!lNF9%h7S5l_hX)JzGn#JRPQBF%>Y0!D0j{&>`$EY`g?4yS0Cf91X`8v*)WB zyikWjK%anSwgqEr4Y*<*2LS^Dmu|rLO_&OSaka0BMB|M^tf!?WP^AE+t4RdvLz#|& zP}6kG;(lgogeliC>@VCM5jfZ4e!Nfz4`&i^QUb7A05jMF4t=&R6d&``HOC_q%pr@oswLMO#|hwyc)FLy{QBEUssJP}HScQL|S z1vZ-#*3y#%X=9LW0^-tM9)eZQHo_M69ikE|E=!{g#p98F0H%&Iz)k_k;sDi1fS8_@ zL*nidh)j-PhK%|dwXA-(s2?jhXjsXBdj&9uNn&_|fej1y76#fUK%B+ zMJ|ORhXo*4d%{vY!3@+LVK(GP1S(y9G#7OR`*SG}IV$R~h%bZ@lvDrjX~617Im!Kh8_)~_Nu7$P)jjBcx-&4k9dtRDp>+ml7KP|&H1AYpDXZL9Iso$`4bG`6^H^8Lf7B<(+ubn zz#ZJ%|K)mMmmRV)LyYYb5-5ZRo9VZ_cmnZ~9G$VAI?9%&P7 zw*T6EJ-}cyHQ0>I7CuoRPYkZTW@%%8k(pCX0)LbcBC&UR9us%H5O;*MBYHsx4uTD225hqcNowghR9D$~Afkm;>Y0P^+pzOV_x z)v|653YP*AsEvoNh^;@j< zJOD%e5F@`;)SGs~*YaqX*WZ*k5)LM^bR*d@@#X0*YTfm0`Mch-ND+F|#zTeK@cyF@?a#%jUa zT=btcNViwCqgT3VGZpBS96jnkp-Q$-Aaix3=AJtUB(pu%mt(#N6K{LTVEq012g&4$Fr zH5UCF85>Ln9DDF9if2N^)%{7Qy6B@mPj(zbJ`&hXNLep*zk zX)!HJ07L~tj0yzafNUf%lhHpTs@3JqK%ki+&guwq<@7^&B3|$^7Uy&XSeOyDjK&3l z$gw^^L<``@H($TbJmy7#^B50C2{UyQqjXsy@)D022^YXK45Zqt0_fqnU;ell)__IF z7_VyrkYjyv4xj~l8R)tWvOZG)ko_bBrIk`t1=FeW7$4>Wz;%uRoC1&`9xg$xJIo}_ z5VaFkV?h)km?I&4dLRDYrbR;BG5yc*cF zG!?L=$*0wsmZs4HwloE_%7lH%v65rNfw^YfL>D-69NJ{FW3q8+j+PuXpeqGBV@YIS zXn=m+k8&1ej2g+U(VZrc>Dpv)+uY?0m*Ji1)sZs=(wro8@PwDwTWbJU>tKkh%>lS0 zp7W~kHWL^*o*E6vy-cNjNNTyywVyeemu+d8`?7p#$CPq-nQZ1Q+VGmm#>fy7HgHmB z;S*{Z0Xz~g!z}>asC3#dqjsLCWll;H1bd1!3~{}v&2OQ{I*=jZi=8$h9l1a?3sg4W zbOELTqzV991t6mZ&%cEqq)ZD~RHCj;)a9y&8~U0B%q#W4EESkMV8n9Ep8x>p-5@}n z0#uLy;{4v*0@w-x%QwQ*TZBYxA5bd=sxS#kC3g(Kpa!g(Xn9lzq|P5>^Gz0*9P3jz z1Ukt;VF985R`gNRPR8EqCtV8qa5Q=%+4aBGNjjoim`rg5w#x{ z^{SKC!U0HomC3P5M}UGJ22g*}7>z9gQ2-fqgcc|On8k$Issl}=3_u^FxJ>|yI7Qu1 z^sVsuN=9^tj^#v?VyhY5odWB%(iK~?d5r2V9ciU1kgbg7Zh@rHB!^`BWt{WJnHKlz zC{E9UI>knFpFou)&@!)mXBgG}IzEA_8GnJ%KPd33ti}Kd!_>+8en>}gsuom`^?O91 zRLe1pVjrV(SVwR=2E;IjB|J{GO}Yd2pXEM_s4KqZMG7~+&b_?EZn`y!ZyZk9w6zqYf3H8?FAj2U$7 zW57`jh!|6+g|&L~SvaRNT5VO1nwb^*+|3T#hBHhJX9bAVZMbd&$b;8;yd@xc#s`(S z{{?JgeIe~$F9=w!;gKSNdZ?3`+eLxOHxg4FFsP-a1sS=^0*L*$aCJJ)nKr}-UKO|; z7VsJ_ErMDGZV}QbT@xtUE@+oR0La2kJOW%d0kpdu0OaCAAOX?>6m?-Cg*N4$aKDTf zCk@DWdz2h|0ioGp=Ej`@G?9$T@I)do(aTJo83H5mXC+Z3je1$srBziswPRr8c`@H3 zz-HCN-ZXS@WBT+;rgd&lzb~I1gk8nRt1|Tn$S+q=uREB zcX%(37oMUnqZcy;cf@tqQff5c>+l!wTMmdt}i`KK!lF<0;q3f9kv5p4LghW5)Av;W&z7h46You zcR9YZw6hd=HQH_!ZSt*cC^&N1-s7!Sl&&zeY7?#U46U@#OR!p5y3){Ssc7U)Y-C~< zEDajkb&7U5{1nmTA7A0}EiGMYXtF|UV%((c_OeaNO0CYcNjd0co0OndSv3I<_EI`3 zgSjwSluO*>P*nx13X7_2tfYpk=LET0MEExOVpsi6zB_!-qRQC zwsl_Sy@mwPnt0p7yy&o~w`)_Re6+snvr741KfbGjmE%8T;24dWbjbuSbH$Abc2sY;y&xgmCNQpsa8tMq zzfVKkNW;YiRiM2Bs5*9_4A&O^%93CE1Sk_5*jPLo#KAk`YPh(d65KDaF8blC_HdkW zHr!r77Y+&#dvj6aP&5{al7NQm3+Ita6EK!l{#dx5-KQ~MUl=iiw5}SiE`Z@-0n&b{ zintkWBfu>k5f}&EgCIcS9fYF-WLo2ZHC#df!(#%M&DTQXFc@wifbVeu#ZURrvZ-R z2}cD6*FF$Ku`M+l{U#l!GCm`)*}(GqO)TR9_a`88|6lgrKc@98%M<(ZecxX;{u=-K8XGWRz<_y} zhj~y_?v!gEHAQW^Q|>KS7q#V1yQf@T?&)u*+^=|DynSx9C*#q2G>pcrrZXOmSL0UG z8b-rty%CXEg+xS4G(SqUPAS{1Gbz99YLInr>8^yOhMDm}fdgz$8> zRq1-r3({woq!4AUMS3;l1=$ZS$-ptvB6}|21>FxX>A)`9qPrUIg6uag$>0=YEwamC z7esB%w>HcdBi5a7QQZ*hf?T{p&e&tauvO*8P#2X9FIGylD%}+6qK^7von))dO9EX~ zv%Xj@)vESloQoRTi#7C%8qMHnh7U{ce5!0*#75rs^(%YIbLr2&$ly7H-SB}LJ$zd` zLQ}>9H&Z4o*DnEq=HFFa6f-Wgh-fpY`2botXTLbmI7TGO<`u_7o zHwWs~7SYQC^@A48ErI%Bi|F=1{isEEXP|!EBE2`Xwy0h?P|vig{1SnB zwpHoX1NB_1&My_H=UdfYHBeu=sPV10>8|N4&jKuZMEoy)#%_^D_#+!A}eY*XN zw=as5d`<%AIxGGkak00?PTl|U1oy2+6za{=4lTZ#f&05(raVH%@1EZRKfj)<_dfdC z=U;sC>)oW5E-RrJc^uKp^rRN^4SPz~}P2Zpt_JnA4 zufJ*^E}uA9A4Kyujrv7u49Y-+3lUYeq@5W`T11vgHNWgSDk+J!3S?OFDek-vfIJ z6N~=+J9ss3E4I$WFmA!u{x0s@enEbs^@E;fAH2v?E7BW z1^@NblgEdh4U0Z?d&6*Hun6d)`8Jo@eY)RyYSDwY*Fz1|JAdO(wVplR={&ROUwxHo z7e}O6y{TWh!GT{;-~g5NE>W6YxTwK;u+}MB^~jx~TpTxS$}z*_`2K&ce-HX*%DgBq zcN(nv#O>@L#RWMNVYySa>XUcYffCQ(AG2EdPV1fhZL0qKtQr$t&va_9*w~e7Pt%=l z>uoC&&5&keR}R>*1|KIoJ=WXe1FG5_mupp@&UboWWoV$6%PGl@=CFo?GgqbrT~>>9 z`mFlvucGD~*gXw*`mOqZa(nHj1}R-B@K~oPmGI)yPLU)Sa6yW^a z>y`0)rn@_5thdDnm!t4v?WbyI=oL-vymGV0ZJps)G_@<$o;IAbR{ihXuBT={uN;)R zJR!=O)@#l=tN!NgOq$AmDU+v%&WKh2;C3D_2*R3wIC+Dgy3)|TGx~~C;z}jr{B*|| zyR#-_Y6hv880;W6)zmkg^LN&SMqaG>wBn54J^J6m<;l;mn0%3<)}B26B3O1N?(~FL zZo{$e6`e_|9=Jp0tSR~?Ijd4|rmVLG;AGfW?(9*Wmp>iloVrzi?e_Ms1i|NLz=-EF zebJe=-WEiYAU7NxZB~A!C!Gs-de|#XUyZ-#or`yRhN~@Kt@})$b!M!0#gwol_QjOj zwKwC;TJ<+>*IqNABtClZSH70{K1FNz@<{4yUp&F7IIlBzXHRfcjjG>J+u+RKX{a#q z>yJ)n+LHBEVxKFgVo89fCtAU(`)}`V^Q0^zKhT!%)bsU=7F6-`;7se$r}={>ds@+| z|LW}xU%S?Eoe>qMo@{HSI~iR+G~DDg-4coYD$Isfw(6s|OLY14x2CP!X(vOU-1g*G z(pIfEY+}Gn+2i~#|I}B|)^5_o6^7Ry&ZefWK0sa;X0^&qUZBN@6yI`_SBJJaBD%J2 z)x$3+vQ_=L>yOt5wP_s*ZQ~~GwpdU@^bkZ>EU$BD3K7#bZ}P$|4$VdHxqyC7+q$dD z^(8u_ZQm*^@a!i7WwsSoz%6P_WjNr)teU27N7G@F;5P^No<}r90ykYYcIE*tCudD1AoJw z%9VYV*3af0I}WY-(90QL&g=un(M_>iOYB#2CVP(KTj%1{d#X%-Q&Z=gs`T*tB!w8H zd5Lw~QM+k1X-RXtk6CxrZ?(_sw_%$@dG%?&>^QON@86`i^XIrn^u$ANAe+N6eZC%k z(EP1VT@QvXJ4U3;aXfjPax`9|pcdcD&oD5tKA)O=o>Q}hxZ~8SXKoV^VFNYX`sxF5 zn+jg?V(0RjAB~!R?Oc2xX711zmxgq{RQ%en1&8#-Zw*bdzpwdpea3NiM?bE81*ECs zE4$=>KgtBaXF+T?#DEy+3xz5zre6L8Z*_>a8@Ak^XNKI>U4&=1?o5adgYAZW z?iV;d_rP{)S8X@11Xub57Pma`*6mi?4H4-J?cVsj`RwtLU9;T~48KtQ#RtY`de!cJ zr7mB2@O$=n*Y0_>E??eCeBN6>)3@wi+wD`Xxp-ZBu6lOY6WhAoXS*Rrd|nqXK0E0p zyZ*Gb&$fRj}spXeHsGZtoZ8vP0T^SFi9QF+W3Uw{@j?_u!9{Y2*Ozfar4Nn7l0 zQCjB5`Wmy%-%;gqNBgV4%Bn^f0LbilW|N3nfa`ShKsM*i&+`E4K z_|%%bW4NzeNOwnEV_kfSuOP#0epUF<`M3C(I##V2+YLLPXz)sfmwd00F(_KIFBymD z7+n3rAFH=y&Dr#C-=vkR_2|08_mZEnK!6S@QPp2Q7SXMFoBrM%ZP9$c_|PFWbLYH` zTbJ(cdDDwr4JV#Ptp%GNe+6ltyDfVDJx!7fu5%jM&-Cx(HQxEFF#06TyFfhAL)K;6 z4ZHczk0``?{tJ<8OnlbjFIkn|Yq6?UYw2#oJNJ*Qf@m$<^xwWi3kXmD0R*QCui{A_ z-x{eszVX%k+^4^us#;cT`mXv0RhvHl3a!6& z<W>W^<9oX4tV!=^94lJw1o!k1|L zn(%kp{~cl-bZpvgI8O4sKYRY`#U$7@DRw)yY&UGHUgMJd>|6A?T-LE?H-s+w7gOsU z+qXEnN6&qBpZGjo>)5f~aAxeh<@2|r=K(Sk{PXj-`Crf}wbuErbBbceuI+|b&==gU zf5x6kknh-g$#V+1phqu!AfHuQ?AU+FbIJ{sSdC;y)po=0i$yF$#wj@nD&dZzTNzaBvh=uKS1Tz|=9&+}E7Q9rGl zPi*>s^-?*TpJX9zT|R|3C4J!t%AG#x)@l7qtpvN~#%<$!`O_UF>f-k|&8IJkx0yyR zdPl@hSIlQNeek9FXuTJEieIg;-|&k4!f0-f%5!GXu7C8hR@gq_C*MUR_2>$lU%A|e zJ5Rmr2vpi^u)pAWBhk(=ypr%FAeGpW~*I)`kY!Y4bP|cnpX4l;>WArGe&fBrC#Z2I3EG}J0R*lopyhN%? zx%J!A8;{C-C;7c! zPchQ8s^3m}xeDoOnrxdX^0tG5DRtpih126+QeCuv=I;2veRN6SZ~y+S2L4t9|NqrM zS`|6di7K=$nG}=3EVShTqkuWUG+-7m2bcj|23!PO0bBsw1WW_&0_uQuz!YEuFbODj z2yF>K4KNNE1e^z)1&jg40Hc6OzzE+2zUgT13UyQ03HAq0jq#zzGq#nMP z?_vKQ@nd{H-z7MNN#4OLDDCH8=igVpf>N_!mW;en=n}ekr}7Q{b>n-2iFfg4-mJXA z+xRZ2UwA|4H+S(<$enYP9!ZnnGsO5zNpDLZQwzrTsitHWz5@DwV7hn{Z!&!ebT<5R zvH#7cX~oFOhWJNrK7G&7#yV?+(`?B~r!2`xY>!Ddn*o6@8grcfOe z!Wb_Yr7I~T+8h%GfH9dA8@15SzlJ&r@Mei56BG+tbb)6t-!Jqy&HP8g1TYdmCOLpN z3KIB^3ggN@Le3;8$`2vOnDRrxiBTKkA&}I?k3%X2LkkL{B0b>;gkI;=k%J^An&Sg}xNQB{;yxB$yQH->5JOshT}CNx)N2 zP|_U50qFlL7=hQNN5Z>8zs=0Q$M;ITkoQf{Q7!O6A1VDdP_SY2Eo=nH7EQpDb=Y_d@HR!k z$V$9ZVD=1bKk#I)7Gca{=7)tINI>=>06O?y^bVuXOVTvjSNN~6@e_!r(hFS)Mk88i zN?;RSGeI8koP=f|!?}Gq0O_AudIR;Gyvse2Q^CnoE1a2%Rn4JQ6 z_27SK4A2GZ=#jn&N}6j#HH0>7{4~Z^f}Hf%CVVV?9e+PkKHxuvrY9B5R2bG*g)i}4 zN}m*o8^YKQOSXT@_fwx}Zuck>G;l%D1&Yak&pZ32cZ7b} zwab*^(WC`TrqEsHTwv;NqB1%H5hi$}G6cZ|U`8cDXbziAazS(>*bkwTqbMU$$ZV$Z z{{ZhWN&kW$w_(cOQa(YhU>u@<$lL;I3DRHjJs4U6&ItqABfJAun$0}g`6`Tf0K=#V zm`0Fd7{h4e&42B3N=~#0gP8y)1#LUogeG~WFo9si=-<>|OO9`%KV))mA^i=gkXj$b zM7BYpJWPKK98l{or^bH|JYWveIHq%t@D=D_jCa5g2hg`(VVr*r4%Y=mzs0}yH<;Vt z31}uS4zI`Lb&^R5kAz{!)eGk$@lf4=P^Yi4Fr$O(?~6gfT^Ib0}Vdmt4-%%byJ;3~Ch zHF-2?TNL05uS^qX6ng3G7-uYMF7)ax;4P+p3!DbV*2YYmMu;Zp zFme(sjustSa%>XWs13a`OJwSplG2+dD(Qzix8R>k=|#?oG3{sCBDXhyg>L|w5y*L9 z$~jQp101vgjFDPKuUR(hoTkEXe4;8Lg5taKfdcF9MciI7JuwN9ot3w;<7L_}>McG<)?` zK#T(G<)}rX#RAgyll7vW3H^1!vL|6vF2(V$`2p&)OL-sjmggZ7|2`z>fh&j3$-<>! znp?1xZ}K0Wmpr1p@=eIbgDW}jDgF`cj7REq=t=NG3w0)hS5ET`DJJ(6bV)jn>!y9vJm3kY@>^{ig}H3z1r#k zax~kov?RDLC4@URGwZ@=p8vyAgJl!G4i-Uk4RZo5Qp@nPpncy=OQj-x2jklV{4~OZ zX^b@7v_JvNBh>j2mi|bhaKj<=OHM2pz0k2k7_vx`lYejMBUn&B#&Mh$V8H>dpp<%q z*WmnzUf+#iUPqhS68 zk6AFle;HDc?I9Gvcsk4>9#f_lF?Ktp;5-+$(c@}CC){D#l*kvYy|918FqxH&+z3Fjt{Avz?JSL%)d+DK`Gx0tDMA@ z@69OsWK!i!+}gdesJHv^#9Y>9ReZ>_a*i-K=2U#qW&Pf|Dd9*tBE)Co-i9fqat?0$ z-n>{6cSThSOI69Ec$IA>N(DRjs?xTyWZJN5I8a%&xgDF17!~Z^GpL(ZH;zmm*u0Ky z$DTXl)2X0(?^N_ko6?!wrmQP~lNv3F|J;ztX9Wg0|P4gWond&5jl(-;f#3eDR%y;Zr{Q2 zaJq10uH(1S&hDj!RC}ep+;M^*V4z$X9sVXPV?hu}D+{PqMjaPEY$+58vj|)Rdg^j; z3qr|!Vy<>rEkR4%vSit?99k0cC#anf)`&I(YM(W)_VC=IkdQxTC3&^i!DWP!x9r{W zZhLpUYa@||(T9=gyxK2tSz%NADRnn5-(6JIXM$KmygDc@n$UlaVOTxT4M;%%c z@>H(g-VuDwuO>mi7N=6 z-pxT>CS@!`8SCxq9U2K=1l2maK5FKcg@*aeylFYIB;09tl1fV`Uw|6M6s{<&+v1Ld zdy(*El&k_j&T}OpPnZ?p_JEn-xw23b{wUDQitTQ-oowlvoYQlen=h+af_JDnLkO-&E+y)3k9Yj#K1v_iP z|A_{+(ZFjww~Yq=2H72CUzfNYVPp7oxF-Aps9m7G#B;l#XycLJL;ek(+e2QZ{66w; z^4vc1R?1hAf5dZDjVBJ3!vgW4I0lgXy5l*PZCz?XLE;c>|I>PSR-o0UUBp9p-0pf849`C@vg2xQykCFc}&mF^5zJqKX*{|?i9oZ)s))S!) zj_(TGiLl?DkiP&$0~BB7xdtenA$yAKdjfYVq|6EV2SA(w@jlO;q5Ox)w!wpZfL}Tg z6Y^7JMPxq|I8i)yCgh(1VGtLX|1pS3*v3crr5q#@^6#NY1?|^)PDRxpA!|kU8$4%4 z_IHuhko_ipcLCYoLDr4z$2{j2k0s7_cF!vwO1nzUw5{sqpe^WHAIPhpD4bXH+1eai zT3-E>=g8rGo9D>KeTU})VgbIL3yG^8G54ltX>fJ0GUy&!lsVJcy^!eb3H5IFmitTo zg33F%S@@QqHm?ObXFB7ZiO!?W1b>&2f*^9%6!v(*Elc*qQnzt{?7PPb|=Iko4 z!Xo@`++I*^JO{@t+fbGl*X$uG%fnNbQRaYG5)*`3hUeY}#tBCv#UMcGtNOl9@ZTqWWaIQ}v;+GXa7VskRmEUlnp12BnIah<4E z(c8MCKn`(5{ESxMRY=zZxF-5Ye{15Z=!O1z1#VSrXy4_`RFsm!aztq;dV9LvN@Nvr zO*}$t{Svn(&UMy07v)|sSr_9}x-M44LogW-xQeK2KcjGEU0jq5owI}4!9{r-+Sm|% zojMV3AXrf`jzc`RE;jIVcy@17JnUShvQ2SA+(X$g&uxfHgxQ7(ECMrX;kLvS&fcHe z4cd}($61C5Qy9-}v8vTQo3P9=#BCs{Sbeq&|FsSmRZzzTZbw`nET|I-w=1q&MVsiz zu!(mlmfDLdZ{m(IWoV*kgYLniDmb{Bn0KwXR$Ud>wrj_=>xy-$-9=S$aCHob+8ybs z_Eq}B1G58j0}BI1RWWlX;;uB~TIpWx)(6r9EJkaH2FWe?q<|EXqLMBxN?EC>8jV~- z+>$~r&wv+IO$v7^Zb}XBskf+_jog`dARS@yC9#UY0NNz0b!nIS_Kb_nQN1_ zrGP8oHgqiw6u`%ZpGig}5_YW(RFHKTIfJw>&AO@s2go`toQhC(&Xsi+-5c(+fwsXp zJM^o8{aSBPbxE96O84jb@e9k6;FdHg*;Q1#1WrS6g`ZGH6o#(MK*SzIVbX?#pWu}Q zujG+bC=Av^Ar^i(SrUAbSE_>!Yb(XQ_)%m@@Iwh2q=13=q%8?QV=M^)bZZ87B7bzKcdAohx{%(WE?@4-co}xPK;G)oi-?iA4>B@C2b;Z4D?;^VWnuCi;D`t<& z=ThD4?wUJ-f&=dosWmRmOAV;?bt5+~MSCJJow&b7W}cAZQpr_Rzoc++N$all`hq8f zPf7`C6Zkh2E+L(EulI$58Tl=AA|;(Tlf*NH__G9_SUZz2PgqO}eaI*~%9#=~E}9yq zeRb8Gk>5stb?KCt>M*8bFvaqkl1^Dvrb`P-+I29Ik-rJ%X({8{Bg!<4ZUK~7cy%cw zzX=|T(mFM}D5WJsPf>ka;nLDpU)#XZ03P2^cTvg=X58ScPKCvC%UXe=prr28EKBuWu-9aJ_5I#6dy_vRSuIV3@WVDs33oW zvL(stS|@pzq`YK+yzlZ{9%Y}RtRN*^+f-JNmZTWUuzoK|Yk?>h8~1JQxy zfz5&A0q>wlW?9AqiXRi~Ly0R%d*0Gmim)qESxWU6)sOJ7D&>1CV`;*!N-I(Z*sn|6 zij?i$9$O^r8fJU}*l)l^OVzPcYPo`k9t~U(1gyawd~D*@rI6d-wcm3X^gJxma=!s9 ztdIHb7u8RV+@`ebT{^WA+_Ln(UFY@`}7BSL8#vsD4M{ zwk6MaXuPO?7m=J)xxa_HpGn-VbbMbNpT|!bBZ!lVifReFQkW{=lej%ev!sGW^>c;W zmvrmaconsu7`dvn>zoaw1DQZk{X*gnq^0o{lsq+YhtiD2;9lu!3wQ%~?uUJyNM(vK z*h8i-;G6YTeFwfH-@(W+9yQ^Z=|OKFsAFGwcw=~P_!tppS(V@qW&cQUBsvlsDUFmz zqRf0md0sB7ii4wsVc0($7!D36hf~A)aC-RX6xbkbgow4$2`#8}&^6KG9L8Ky)*5P}WAvYA??P<$0#zkeu~J`9mIL zVL9*HrbfduVasYi&xPbDzfOg-vej3n!dW>ix1n%==fd)zP+PNdUMc&Eqf!2ZM|MtL zQdWKC(LJJ`lV{~Js1Yp8%7042%*m%{Fmn&dh}<@OOjHq>uw@Dx=Fs3W6-MRUh)zOB zF~SLSZj|RDa*!7V6vpK6aD!^bMPXWmhGKHSkTWJ&_hNDye6gf76L_SW zmm}D(MI0%oeCxy_iD$+Hh$ba2A*ZKirX$!2gBO--z5^;x$w_$wxM03S$&=779gBQAomLvc#I-| zr>6`69Di2MvE7wrc~#{tTuGjLkbIy&*nBWMIX5|vr#2Qz%8N=yp=h?vU^PUIG3?Z= zs)C6t%aI4E2k8e}4~T|UGQWSg*4SIOLWDz=I6!;F$}h#ey>uu4%2Z5=g;!x5b03OFEYL87_Eb|ly36IoTPicg6u zF^G^-@H3r~a4a9m+aN|ba|B|Qa5YGK035=ZV|i7<&vQyb9rB+7hj69_oR4rPU}}Xx zu)VrmQSj@UlF&diLEsS1oB$Ul+^O7<=YX3OxCXYM@Z+75aE9He6mU~`HU(~n1aDK$ z6u)u= zeqTW-iA_xG6=S9Zlm!>cf=WP{hlwI22q;;?%)n)4fI%P-R0@O%!G-Ps^B#VyURfbb zSP3bfsa0C*LrR?Olg%nKrg>9JT~zD#lB4djx??a!Ed8?zg?X{j{Ad7%9-WwLTm`%4>?Nv5ts!*BZ4i+Yd?Lm=aM=(Fp_v5hXp5oj4=&PQZ3D{#ErOg^MXsV<8xr znkDroVNn5CGQxs{vSLnq=LwsFp+|xJhQcM4i1EN%onjLrrRdmBEi0=SsV&U*Qzc+b zQUx7mnL>qcVv9~$9aK6*PqU;(x?el2(Dcqj2XYjTsSb)5Snb2^?VPwzn2(0WIeC@014J)xoxFp2)EDrY9osi zC0O2XE8LD!H_WylkL2VbNWBZGf5*t}Dkp}y_JD5@YX4mXSW3eX0f*m{xP9f+5JmDw z5?58u3^62sjL=GHGtMLV6Nx)iL}R=?Cl5n)HDz|RM5?PP$4Uq~_vBU; zCmLkir!X27;{K7u!FmvD>=X73cDN6V|Ea{CD&^oxFei_rn{5V-Y^BX`rc_YpXJ+n9 z@dZkOjRy;pdN4SZqsBx-n_(G7`g3fh8483k7(~M=Fn7Q344c6H3C|e} zWx`kus$mb9KgB+pVTLdoRz5c{e}=6zLj>>9u$5+5RsS)z(g6O6gL4};NB2ez{9(56zFwv9@bzl%& zm4IO?DH~3JL3mXLp90aW7#hGJ(pmwgM3_~>DKH4SR)HxKX3cO03?8P}fT<9sVrXlx z&_i~7=U>P8(nBUMwm^53e1;zZWHSN3O3UXIe7s19fKSA zcX@6Hcr04G09dK^0I)pm17MH23h*Je#{oX#xkG@jW1}138`$3l_$JTQ06xYH2KWTi z7T{BCWdnSh=S~5>gNm!M&)hYMGrH5+|w;rB7+$G^75MTo|m``)YW5Ps@ z5u=J$FrOmEF!7EVqsCoeFrT8>wS(QqjH!0o6s@%TObK<*jMsJ8F$d{9;%OaXAY6?Z z4}2A3m@wi^5}LrQiyOBHlQbrbWneJt62=q4q!5J%(FAtTlExGgn0G1Y9WkeFJOe2L z&9t#GwM9-SW85Mqlmme0$pgUMECImX6ae63mI2^ciU80^2>>pn41j*F0HAZL0O-*g z06atm00OQ9K&lM@IDkz62(kr$S-%Z{sl5Y$`Me8&NxTPunY#~w=~@NA96bQQ#5@GR zY&-(M6g&pNysH6Vvef}F!%hG&tr`HBOQ!&jV159YHEr!%G*v_Z%nt(qCWQ)sNudE? zD!2hK6+8f#3SIzA1s?#Wf*$}=Apn4>5Cp(fm;u042mxR!gaJN=`vt&Mm;=C6hyY+J zL;)}rVgQ&5^8lC%@%9sX&rNUZjyh7dylu%Ab;KO*zHncIMTe>O0*qq4eWxR9Ik29( zyj@#e2E6&>>F~jphEoN2F{8t3j;%F&N!xNZ24({Df#!>9vM9ePp?WQImYVg%e&$jK zqf|NFo=_Jj@WL6D)9rEftfNgkbe6hS2Ij_7<5haYUTAlF7CdczrM^QtM6ldm_Z*Y0 z6x(%$rb)5A&W=d5pEw(osI*txPwD&tB@Wt;+iUFx)7eEy8(QVoiKHEGL9kukzSq7F zl1;{|+CE8>;Gq4~taYS1vK`AEhaJZq%a%>c6crq{*W24n227v z%XDN45!0Y)7cEpxhd_k!7Kx)r25LWL(oJd8f@zTiqk<4nY16W)Xeyb?pl+C~>Kt(l zA)%>m)uTp8f-q!im`)_xtC}+{sPqcY;12j2>`h<9lrt68Al`Qb9P}o@5O|IB62*lO zs}}04bZ&I2-LpNho_b$g_zpJg=1q%g$w7}UapB!-`S-5n-@lgs@LK-kYxz&F<)2>5 z|JJqq7uWK?`CL9Nyoa77pr*1ZtLD{pb;Ysf@M25-&>*prth#M8*j2mF?zb;EmK-aN zLj%1TPGGdN>PD+fcjO#t;T@FFIFwB}#;vZdf}aoE6jnky&#Ab`jB`B)HjiT!+=N!i zEXwLC9q*~yf{r5tO-SNJa;-Vm-P`V}dv+o&{4Q$HNEgnBmIl_N&Zsfr=XkNE179+& zsJrT>mY7(?1%d0hEISpU!%||xH=qwPkyUk1O@j9yVm2?B(!y5(7nyk>&beYh)XuCL zQ45Sm(X^&6w^BuxDw!(kDKn*2)26y;i#Xyir40l5iFMN^gRo`>w@lj%?wWQO+%xSm zST*f2cxc);P~3lH+EUA{)QaJ|=eV^NE++g0GnnXd?j?80z2Xi}lqSw3deunAy|0FB zVcV$_yTJ07AjyfTO@0$xs6=JQBpSGYMHHAh&`EQ41esRf!-k^Um^K55J`ciGbq&Ppc;$`)9jFV$7KU#h#?v&83&JfJ z0pZWoiUYi$iVI8~IMG~XO5Rde*}(0pi3yGMYhQJowV20=C zGSnrnIbhCG!iPj$wvcYj^?O7aG|vEI17^mYXEh4+H;NNk{{hIjc}FBw#*zPPz=XL- ze7Lf?L@LSxl+7#nA9~5LWJdl|Xt!*>co(L2XS!#4W_zoBHQ}GLlJrnvXw#p2aP*)w zX$>9+=N_)IhS$(_ZpU0VH_WGS_F4x{pHO4FIEb=Nt?ii)%|~XnW22clK<3!YUUMCw zj=N*Fqli;7DI7*wvRUoymH8PCeM)jxydUtocv-AoudXgF2+TkfzD zcBNw#Dk6pl9Ug+~9Y-DBi-Zp+8Mv*EJuIjG4k&NCquOx*frX3^?kvXQtR-uV> z&{43=x`TLWv@iWD3=@$SEJcP3b?tWTbp^X;mTQO(_(uHO*A@IMSR!I=%&Y5rP(+yUx1v#90@7JcXFn3q-Or z+qu$N?`+^Y0TvGH9&3J|nlD?|tW|1p6^RY&ruEoB4^EWI*rV=4D&m?=9FghlS}zZn z9Csi{*~Rf!x6Nxiv(<>-p0&+ZZzfKyCrp*rQ|p zEkUIe3!V}35G_Ho98 zY8Wh#x`x9a0WdmX5#*^grllup(l~-Au-9g_n5N^jjYp=KvdtFMX4o;ND2_0#4| zcWi1~+Oac;IBs*0dA)!==BPNLT2iZM$<8f|@39MKKfwfNl8v_Ru*D z%cIcAqP-cD(}R4~erT^birSG@*W8`ePUiZ`_HFyIz2PWnWo@x@sWa_5c7>Uov&4DX zzGk1JL=lO|MIuUx5-_og#5{GOgtKL9_Bi3nR49;cH_$F?)pZikCT1pZ@D-!BX>SCQ zteF&%Z`gP3IwdxdNM9rtD6s|1;zc5Jk;qbF8%23)n4|f>M5wBL-%)5LRL3$I<)K}5 zcpNnDx?=$`Cq<-13ueHfeGOx_<=AoTJ4zNzpCh}$L5I#OjxsSlwnrUV#|n+ZF@`to z$U9bvtY#M-8i+O=YcL*;UOTKHE+uCBjsr)9DxAPf0*=Ueuo^-!wPSFqP9K7;755GT zTndU;7=BG_bBa!{yBUZpe9V$r0OT74W2P{ zoHdk1Q*0;d%n@)dI91qVn|r-$v+Jx&>)EGaX+r~Pt%iFOXZL)73ZNg5US|gmA) zS#73sk|zB;8lQERo!L&+9d^&T=`r(Y6#3HaYN??0It6wBeE)oq&l(kju zw3*n_8jO1do8m0Yu%dh)&)^!%x~&+OV`eX8O`6j~h?>@Dq3X;oYMR&SwL-AEc8Vf{ zvmtyL>(Hqdap!tAJv$z?FW7g|C-$Ehc*GoJe>2XAGwwVw2*?xfkTdE`IQ^{IfE6R^ z14#%(QII8^K|=YRVdt!K&NE3#1s$Q)HQTw2r8Mn7 z8n2Bf0#O#k>^qxh={DVSzWPWckPDQ93C1ExEDo_GpW@e?ptB?Av9pG31BhdGZ1ULI zCclBfre~fstFu6V4V{ZL1~@g@nW2P=M3$IoNJKgtOy62(XfQ|eyF2HAOm^m}Z=TL5 z9tG$y?x}(HPG&n-26IDa>>&a*g%4nO7Xd+(H;4#>l2|*|TzjthE`3s+dO{{gr~;E` zncB}Ff+(?UnWQLmmayQgP?FTK+PTKcDuk%wNNBxtgCVx)ufg>f(@?AC5}Q)HYNJ2> z6Rc8nkEA@}_xq-2rgs?mKKomxzq;#yK-zUk&8J;i*HJTnOaQ;~$(~EHu8jN)(&k;K z6Ll)!z98YLFMn{6XfQlhB#hvZ>%=8?xB2!*8Ub~}Gm#6Pk;oivn6%+A6?f#SBPlkM z9@<8+LBGd1zegmh4NV-oH26o3-uh~8uiJOUnbA32?!@IeM_)YSZo54;49tmZow>o9 z+uNjzxT9D6AnhCYY%r3BD+I4G%e;o4DxSJ#;Y1>!4N&&Xg>ZH zn%M<+hGk>Iw@K}8D^okkA7cj^DYb$t6mV2&x39a>v(*#u(`u&n}PTX#qB%DcHZP=|=->dc3RAX6251T524 zED8}!nOVFl&rg(t&oQE8O#OhY zWxh+D`r$?5H%OHEu4fnddB!SEmXYdOz$woJC3PJ5%y-pCdhd#0JZQOE}%;8IBD%w?gx1V81Kbz1O|pt@ZkQ zt^HwdP0)AZ(P4<|VC;S$k_h?(Tj{6qm_qyi0x4UDWbyrtD$&8qJ|L@J@6myVKZZ z*um`&Qde^mzOCES6YO1w5{mud!Texks4-a~?jlID-GA{OH0kZG^jrN|ncn^SxF=%!{~Cr7>`tCP7tgf1QwJ{9lj+&-sSAIAiZk7*p5xxiP;-;J zDO6LS14v8PQoPI^r@JZdXC|5H&d5K89;rt&J>i~(o_tTCr`)sIeOv|KbQec+_U95^PG?vevCt=r$Mdxd)DC{ zcX7Cxj*kR;0&EDI{v#tZAJdbO{~5|cJ-Ozq$etiyqk#+eBt{Pd%Tp{yq<4^c=?`IZ z3q83&K2Tt^3q8x{FxWJQo`&!)+#<=H>7B<+o9*AhY-?`GT#i@6)7CrJ8|j_z{j)KO zqnPlOk)?-OS;1;Pz;m4u<@6upTZ35?lLb`ci!bT&5t&H%GIw1c7!v zgbxJK6x6)uVJ+^#%hNv3K4TQ_qy3&bZXjdP@SHI-Z?nVEX}z9agPqn86{n{;fA1{x zX0>BrgGgk0AxAS4=}jZ+Zf1yay4OPtW_lNUy@U-x*>N;k7yfI^wYgqTFl3;WalZGg zuil>@s`#6OM0FQ?kFkt~`|^EDeH++XVyjfT_prCAi_N}zUt7Pm-_svqqD6`STCdo* z(C6)s*)cuVL8Bpl;1H5mYJ8#w^rCob=KjN4!t(3zH>~^AW8BAwM-re3a zpo_>hjgxvx-AbZeD;xYobB7~|?&q*Ex8JW}LuA{#F}OE~m#>&c%?-Pz&THtFp^#IRoM(a=aulBF8eZe9wfG!W#2X!_A3+!)({moLZ3n1L@&oz^4 zXgp72R0QuWOvokbLy_?jy#{ZAvL)bmF;!LXax=TzzXv0>dW%%E42e!qfmy;9lA<@_ zE#V4kY%qcQb=AQs>QlAf?cJGf_K7wxiQAd?a3D4qAEXeT7F}4l>Mb)#SL|?KGv1hY z-W&I(aI+-iT_sf5y8&f2uea`b*GQbOciCG+gJo}pva`6IlJ_nF`5M`9#2c7sJTy$_ zr<X;#Fgvbrh^`{etXb@s$U=0_b&KRN%2e7%l0lETZa4?rZ zh{gb2f6^GjO$c?6?tOU~!bgbUV03VP&`-$_67j)+10xznA~Bd83=)18B(cFNdv_2W z{6ktQqJ#gEZN#y_j>5Xs~(X7#fNV8GM!Dli{P$BGexk3pwDZxawe-R{W@EXkE+ z$vMJjVL^nCT+KusnAW+$GMe+xjHSnX<3WC#v{WBVFyTEz zNovH3PSXt_HcjZ(+tQHRw~x5k&#r2ehjlhAX`&4c#X*o7T3`c%Om1lLGMOQ^VPLa_ zV~L?0CFf8@AIeiQf-0q8qP{D!O5d{H7*rlOm(oYN-B3vEX9x9T4Vk}z* zVhgC9p%QV3p>}boj87Xl&@X)`#x#-}!fb{uV|^If!{wzv#cV5~5*?T=Jj4YtjO{8| zWZ3oeHH`NEhT7Z6KLOmw&880kt3xZS->W1}o6qVC`NFl^|YoP56R*k*+@IzPZu- zlqOKUX4=i(KT_Jm#$ER@zq)`MIQzrN(T)4L@r8hIVg(lhb{NB5k}vDa`wG5g-#k7@ zf|u03-y-{8_U$u@DveXwx90nkE~sM7w=#Oj@INKL)bOQ7LZkK3=v0j%>qOk}8HP_N zaq1I?|B`r#!>7~^=Vv#1e)=0=jM7h(ySSIMKOAI;84YqD;+0~UWoIdSf;&s>nN1wYU^1u1_QqE3Z{N3$2gftx z5k?m!I&nlD!KEjRsETG*N7hE>Sz%m5-`ykL5xVj8b9&(Sj{F~_7T?HUHNnq+f}DTk z=f4jS97(cTDPlQ``%yprGpH*%5}N+wPf;8jNfSG6ZG=wBEl@f!l4IZYSfoq}x2eeU zXEe+c9bf!dW`sZg8JN%qKz{lI7)x_Y=g;Uh$@)laI>#E!Q}x}E!;!NQ!{`!K-yb;| zsgIlhfm=Fs=J9Z3DfoM>1da(a3=VP9vD2fGSd}alTI2p+Y7Gb?VqDpkS z_(wE=hS6o}9OoS^Qp?(Cfo*?yM|UR5Oq5mn8yd~YHpHEY(G<4p5ReD90^5Ouz+u2Y zk&_)Lp*ebS@V7SRy&t+Czh4vnceIcmtuRJ47I5Z9-RzD*esq&zx2W|ZeBBPq?vfEy zMmI(`M}PhYsJt=yf6=gPjQ;#{fX&f;MpdOsJ2-Cq$8P|;hbwe+pP5b{yMuw?A)`4W ztsRY8{hFU5@?#Ba{V^z1{{^Z>sM@IJcl$klKYNU=lius2et!Vjre8&J!#_I~A6pp9 zk2QNJ8eC8z)xn2YFoZ#Wb>eWM!J0iK(R6>>-{z$GAUcuF`g4Aj65NX4O0eKx^J`AD zzKob)&A;v6^H==`ezy~?7yX<5EucJgj?_*7$`27THC=WCfr~aT5POy%zahw7xjv2<9 zam$I{J+?eno2WckXS~Cck;xG2PMB)C$Gl^6jOXlFgkWH7b}WiR;z)#%j8QT;HiKjv zPnH)Nn;$!yY&>L}IF!-uH+ObYlLwP$*xg}^briEXJ9aeIc3;20bpPP~>HW%hoHY|4 zOAw4=5K;`WFs2hsVNB8&i3Ms^$8xzamSIHsu`IzXhAq#8U!v?X#&DTsOYH9o`@2d- zdpNVcc9CF%Umd$J<%Rpp_t)<4-aop(&MItBYsWa^-Wc0rh;2f&-FM&j-N)CPpm*&) z9gBx!xleaT>B?vY_dw|asAqhaRoSB|GboFbzr4Vi7 zZrm@8j>pF9jP!(RE}@N6mOZ1It7vfJzSv1-Xy`=wHrltctcH69+#!Ui-}f+tme z8|(H3_w;yvyga@+zCV68?q_rXs;Hp{zVR7`2vNl#WNCIbG*0(Z>Go<{z#Eti=z-FM zSw=WVH6su>KAw@uP-Eli@hB^b5swtI=boh1Y7Omr0^vX^5NCu5;*lNCp%JzQ6vr!p zQ*2DTCn^&M6Z@0uLw!2MD0O04geVIvyGRw+$2TAuGqv6E{lLM*@x;mGesE)|HWhl9 zdzfXEIjXn|`IlI>K-puwyTEBv$lMs$0!3C(B95o%r6I7w5UWI~q0>x*O{urwA=@VW z6Lh(0bE3lN)~R9$s)+A#4W;*OoovpGt4BA zbfpX3MoTRUDq1SkqT-4xDpj;p*)9Hxihpq%6%`eQt|(}!O;^}b%kA&`oO54iCTY4q zKY#elWbQfN^E}Ua&N;2euOPcof@F~7Xv5@kcks<=#lCm{V*`f(jU zuBksJ=*LZj++>Mw(WAX$Sw)r~2G@?v^6BYZ?9mq773B~n-w#tq>&na6#P$A)gB5l^ zEKi^!S}{53Bid$i&-^?{gJFB5@w58vf%}#ZrnmU$M-O34#kqymKMh&vDpi zvY*|RwG?r=V&}p!1YKswr?M)8Fx-u#xT_Tx7Wyg!mEp<-tUR+82HD@$3v1Zl;e|`t z-_r|uOQTU^AXtv>ZfP(aybzqg;dO4kyCL$~%Bv9jY%qw^S!Wi7s~;pSMk|*w5@VH+ z5t`dwxfk3a7HZc)oae-ZAAFF?AkL-MRE<}aFKS^KUQOR;E4%2=cx8x%g{ee|MQ+d? zEP)WgVAPNLHGwT^zF;6YK!tz3vLskW9Tv!D0T*Dq*TRc1{SRrfg2Rl|D1CPYcd~~u zA~G7>6+9X|5!^+3*%^cEM3CpGEdBf%ZXSI*uRLgO#+a z;Svh8WKlB;_4=YQ92Wi{DZyTKm=QQa-z8PYh=9OPX`G;-ma0=M9v3TPuu*jc2aM0M zfN?74<5eeduLa1Q!ubN4T^O&TV?FH0c?P>cLR_u7S#_)G690J}4=t9n98Q>IRhLzlSIZ zyLxZ+{_2C(C9Gq$<1dXG?bUPHLGyB8an6ehp@kUW@9OF8g5x7@VPv1U2uh`EmW(oOq4a+c#B8GjLW55n%l^L==}U(R*hkN5`={(yMX z{usg^L-=EOehkk~& zC@yte&ch?VnjKw|*zCA20e;IWw>WmJaK-CFjw*4rqe|*_R9Qog7K_~NIFT){b_Da} z0mlYGs~An!!5P$`T#W=XppvvPJhW{JBUi{-tJ4HAO);YRd> zj)Zj3@ua-Z@e}!w;|Ujn4?7&<5dwM?e0?#WRi_!W@_7EKb6YJ0#0F+%bF>QRDcW!{?e~xq!ZM z0!MWwAkcN7@pu!Dw{U-KmeZ1R({ZPK3!g0KopP?T5-;!(+}KL$bM7G-1I`&@xwBLX zID6#<&R+cf8vZ^fmph-sWrR5OS}D{xt>RLrSE_MV$V=I0xm4?H!>J0P(J6_I&NjK( z*@peCOcz~Fht%zKh~3U=xy#ukhnyQ|<4o9T6T{B6@)qY>af|a~@-Qbb3Ie0fmGX8F z7~?^^5VQ+HyAia{$@Fv3X|?W$%!i$&;(lkTeAwA9A9U`J4>@-TN1UaUrDM(~BviWN z$j(XU4C`s<9_hIAEAmP9`5~Tvj^96*&p6vkq42ZL+2T3pZ0W3Xt9;)1jN9UmTP{Gd z3FlgA!uh0p(>b0i-E@|V_%)G-U#G43b-qBl;LNh)7ryMS9c@eEo^sa)tJ}3fDsgQP z%Uw~6?53|0`daGRF=tNPvdlGG>~hVPYF)Ff%Uqw7yYQ*SXPpZL8@Gg9erwp}m!dAe z7;^Q=VSJ+a>~w9|A;jy(Touw`*9XNh*Unt|u1R9@Z6FkkK;=??%JIrj^hh)zFdGV=gQ|?J4!3#mh-Op;sw`y>AY)+eBSkb@x1F5 z`2s$o6#f;xpj>06seq zz60Sq5dJ8_AC<@4KNrT_e?VM~MczehD}~)|N!;yjm-o8cg?;X?QP6(3BppOP4!NuG zyInqn5B^H~-Kb*h6BiG=mzN^DM*uql>5jQk_bV;O-4)_VcSX)gu%UYWcE=Q zsax&}X@Tc%vD_2Lwl46T$&rJe?p!?X%av<9Cv&YqPZz8lecf{JD!|tk8xm}>iMQNt zyS%`Iuce+H#A%sF6l*;=%IH}vH+mN1c`g2~m76_GkQPL@c>3klo;_rZx^O{ox5r^! z=lP_x&hvA*8=o#uIjkhUtRYXFvKq##AEF+#Y0nZliqC*&iLk}9!-YC9?D5-ndRAG- zJpIy`=NWmY=Q(*8pIx3>%L-KKy`GEKy`H5Od9UY8w)Kd|og*Fb?8=dkcn;F9%k=9O z{c6qyWP7fB&~r04=b)!V#N*ODq}Z8<*mDvd1NrhXPi^)H$W9=+FyRU0%GW*T;dOax z^YE)V55J;$@@3C>o_N+%BT1J%VM#vAzXl}fgy*m%oy8X**Cg?>r=>tX;n_)FHwyr+ zwIS?~1CQtEtILV7gHD9m-FOVT<(s5Lj1{n4kX7iAa|?G`BxoVO&?DLlJ(9cdeyhFk ze%V*}gsrUbn?hOPMLAF?3xUECi=1CLH(Peomyf>aQKUyJJ=*dMYbX|9KKd#zd}fXi zZ<<>;Qw$c?!8_-ZWNP$^W3-Pq)cuX8za zccCvAzxLRv``SDkbQtZZo%UgJPsFTWmD4}Ei4kZ7ZzE^3O^$4F8qcxR`?Bh zZ{eS?;r1nYd*KayUbXHnv|I24U;7GiHQK(yeQ0%s=PgJO&X#uJ3rWVaLF)qj!q;fw zt!#0$(4HeBZH~OZ@FG>dgM|+9P@zLQRQMJ7P~o%E(ZX7b^-y8AMLt@1Hd{V|FX>2O zO^$rH@Jx<$xDZzHVBs}b#lj6#(~lR5;)z1ha-wjie7x|z@<|FV#qL{CI*s7d2tHM~ zSU$tiXMr9^@Oa^D`E23c@;M5|!3g9ZOGTCog)`*yg-hg1JQzzx*ib82t|Is{Qe5Li zCP3smh+GHli9+}|JopxZv%I1u%R5uP1xa$fjCQ^k9w=PreD4g|j*pvyU4qXmiUFVl zK>NH6a*6i|YD#6^B3rq)ND6xAi$QOvyukZG>jLkOXPgvyD^tIG$&qlaC8xeN+H{N|Y2wRpbcN5b}VIAHY5%Sukb>8RX5I$jV zmZj1kuN&~r7Poj|V!gAa0q^(Zo!;*WyS+aWcY1#$Zy`#<^tH>|m@Vw`9?6#Xdyi*J zyS?KmMEW}DeTKS%LtdA7*z1yxc;96^>Rn+y>W#}sy<4qEy!Xk6ykC$Hd%ub2Z_3BG zFvq>Kq?6uRIVZfc#FO5|@+lsC8Zw@NjHkWxw1{j^J|$9{0A(=kPi2T~4*< zg4Zuy^7_Tg-W~LK)$5TaydLqI*JGXVR>@a^yoS$pLc>df(rw)^goeH0`J0Uv#4$R)m+LKzP#M^L$MmOR%tM_Ay4Cltro zfNHVES8WaY;&Kf>OMPI2;Q)}B!?!H+&6I2LY2?9}v=>?s+>D?Wd{+B5z(4bJ`4)@a zzQt0P?3qQF61VtV(iYz;dDOQ`8umSI9rnE} z5BRoQ5P+}kz73@)`kg+HIOg+6JAFTs$9&JryNRqz*y|I;eLm5$&*zo*`sT^|DYz1Q zerHLCeY0{7`DTfSeT(HIzU35r)K?@O^A(B5IqHPZCZ5E*)=v1^<&*fF;=!j8dQqB}Fi>0ene;B4pfNbloDC z6>T6$dC@)M+@gD=@}ew@JeR&|ijX6e4WiQ=_314TJG;i5J2=?UHI%KiBKX%A}-#ml=tz+{dnAu$Ad*Xs2Ut9@`#6v zJkpUOkM&SdgM1jDBlsLGLOpc}$ACUov{*h~bf<8FvpESir@-c9(OUTwKBqbI43KAv z(7b>g=g4zFod^0HggKAT1&+J~Z8`QlAbzl9I};`xAhtN2g&eOQ!z z{^eBL1Ad1X@Q=vl{#py1-nt-O5ES(H$+iBjY}_5YKU;3}pBANBzda9+p*%z!rC-|f4G&X3ab7s>1VXknFgVep9hzbr-l0gF7~ z$321r{;)+3`?qJyTl^cS#~=2K(x_jwjQYLuu>W3pyPw-VKkS|#cF+H^Jm!bacKbIV z7j^snt8jbjhoO?e}!=9NWSGCl5hGS z!{5iOxdB$8@&g#O1>&+jFeJDG;8!X50yZ&#*I)*aq6ERdz#jbFBbVW*Gos58Jr~jC zf!Xq0d=>;|3qc|#2$;#j$0IKdc!XsE_yw@dwShXRCGat^Iq)@WOW=EQEk4cov;S+}-fb6aRI+@F-szx$JdcxU`A6&3e(#D)_+;d@Q-74cB=pY9LdA@qtJ zqsgK00EqVGH4hGjBjH5;{=V<_<#o1hq_@m}`_5N?+?Q7ui}i;?gRj2zU^tS~nHUal zJ@eQrk=&+Ge=?lJ&%T^Bu|)5xhit6IDxmDCx;TlJwwsh;47v?4bfygG}N={RTGa@;cd-G z5gP0XzeW*Wm0D9G99Cm)nfP>s`oi_0{{F_1o^YJ_{EsQRF5DMOgd4(|7&j@pNTu5l z?h6g~BV&WT{o%yl5Z5OHirln*Y2APJ*}Dd#J;*T6AO%IF+GH{s84UMQVMe6o&B^-y zP%?S_>CLkvj^&(CQ*;m#jb7alKOM<#9_(Sz?1nJ^kz1Dthc>gYoW_yp5c{R6z8;Z7 z;fo}tO_h>ze~Chz%R3XJ3Ux}#IM|jm33$SqdA1u7&+;_w=e7*Z?8|G5MNv-@2mj*V z7qPF5g?ih=NuIa0&pog@Vq4xGiYCKcm5jEuybJO5{fT?O^l$HqxK)7|!&RYy@MV%p zT3*YQ@Z(+o67RFFiK+_w{SyaYjpTC@p`k@jzWAUJu`gc(icN{w08tLDc`=Oi6r?io zEKe)5O&g@&A|d0-iZV9(&QSNOefe#~3oj*4{PD{9R|x^NH;fL3sH!me?TmSCA`uz| z{nrkDCeYKHhi20}$n=hfHPOM|*tR4Jp)a?y9j#{g^;5UwXGiqD@UOj#cl3#!Olvd# zSp3Vr>=h05&CgwWPoKD=uDz>c1^b=bu%@-Wfqq8pXe68LePtVAOe9~w@C8Ib}+zb8D}F@y|!tKgqp5$iqgSzq6} zs~y9 zcYQiH7RhgKShK#dy|$x~6^(-)n^)aayRx~VwzKi8#M4P(wJTSu%Kq}h2xRG++G|@H z7sxLM`@9f&RegQ!%KDDx_cpF?t3^ylO)6!-OA=w zcXj-RLcJ8avbFv_YnoRzw65uDqa2a65nBgT(=)_-jgNeH!69UaE32V?)w*(2hPKd9 zUH?%0yZfV&{I=RoXr!^d)0({gWKXZ8D48`OsZ)8nu&k!2&)&JF1zHI8_fTsp`03Ft z5&N2!^}1q?Lv?*NhFTFF>V%d4#M^{>A~ptE(cIbD*wOhEVO$KevTk^2C^py-+cvmF zJZFix7;a@=rRl^n1m=*Nj)7VXv7hH#)B>vphR!L7JWlL*UM`KItJ&g-qL5Kq(25BlO zjAT^9>Q>gTe9vMErL;1N&)V4<4<|y@JFdDsd>5?S%4l-vxd%S;*}j6#j!n_NA=Y9)x2xv` zXoi~Trf7d}TO!u;yVA46D4IwgrqGuRVru7nkOhu%* z1~&-d>1+!pk`NY|soqbKkfF9t0IMf|3x{N+J0?1fsnDSv-mr?D^~WZ2zkoh2npOq7-D?@X)LDXjDDb z5VeBU$A$-oP7wcMgJed;Qxs|Cd^=)^At%XEW&pQ`2Vz^pMPeoezk6M5H#f*_b4-DkNYxUJ#* z+K7})HpGTE_J=Jm{`}8<*>_ae{CNz)1wBbPBk%>`EyfrA;?I4~X8s&b@b=REvtRs& zn(>vP#j%G$D$Oi2BfA?eI{Hda^SV=}U=(D~+fhQdEg4ij9G&Fv;5n#w-}C{*5ElRV4pJ5R)zdX$WtP_JpY>hew9~ zObAo8&UM03ZBtsCgCgHyR21*Om1wT4P(No*b=^e?3XKU+D&!gzQp9b>2=ici zF~yroRk6+J>+ebhhCW}lq#d?O5?G)oNvg3kx@Nh-`3Y1ALn{L=zviv6N zW?30hc;jFQHoW%(6hXbH7SYrnLyt2U*-kOkF{Q;&MeBg0!hEdz%>*EzY8UpV#bEFk zX~6`-$0&w6eNGx_6lp$A5iVl{4XZyvp|ET^T&WGwhA5HyWE!J7CFWBUQ>3M&Dhd&r z2QX4heum3Yy+!IYkQET5u0vHvjgmeBm6icqAR=ZY&qmfNR zMHFr-G|ZO_ZJI^mayYCO%RcLRKNb7(Z1m1lVH)7yvap=DZ=oKW!dkb66D+LpugAXw ze}HxWEZ`$EKG)RexHhD%*;JGw|X!QO5hhj~ZR4ZdEwfEGhIx>*S zHi~j;YM=>?aPI@8180TVOZd{n+uF^FsgL!?5+1_p^$Jsa6v}mc3v~{|P%??oGdz4U zSIK~9^qYnz1t|@YD~X)m-n1+*sxv6kSfZ_i=&xXASd*|&tX^__n9>=$mxA?zhD*X- ziuX~tUULnu%6f{?n}a5u>WuVIyk4_YyY~o1>r$c~8#~nziq-X{#Zr$tY9>sE$ky}07xeijOUQc+nJY$9`ZpsfSRBw=a z5B6&_TOVU~7q=tm@pt^%5R?2M6H@&}5@ z4fS`%;@ij*&kOaplhxTl4<=s+({a@GvL54|#M@M7xQeLGOpskq^WwM$*f{fU%Bjhx zpgP9^%@n7XHFQs7gxk214W2&lc$qBkB3YzRe_agIN(1+i+GjdX_o@s7Q9-+Xu zrrNp+N~)W_hN_ROGUSd5g8AF5i}`PoU(Y(va%YSqeoy30I_3JR?eC9a>>uuJAf1}} zNTN=2QgDguC=w$;%JC2>23Ev4o>WG@6BztqtiCAtoe$Cwz9-ol55eQUs}dt_Qw!yD z-i0KS)RQ3lzNWFEuH$P|NlkQ>#`7|bDi!3aj=Kq|(_?)i%}+i^^ism9YaF9+y_Pb3 zSNwwrMUTq8qW54$;?<3E9Rwi&f?gns6QHnVp2PxK&#HuKthKRxLN zwZ4UsUKtKyW(CwSw!bS8if@Ycuz3R!h6P<)^YcAl=*#Owf3Y=`eD}MLy%WRiy2NmD z)3;hmpTRUCIaGi9z_zYPeoueh&|nkBTz~m+XfgFnED5>QyzI8E|K5M19E|QBaUutOaB@x2{(dq9dx@IHqzO|8Y(3=T6r6{oo8XK8$A?3A zM#LUg5Ab_`B(H+Af2>S)V=|13!Y$z+h^I>lf*^I#p@C5RcNFSjwGQ*!m}ea1;h&hb zzmC|{VT`%?yB`iM)skx2eV&pQFr{>C3Sj~1W#j{su+0MznsKAmBxH(JALe^g;1Ac_ zGuG3a+Z0O-urk2BH(PsRGkDuy`1U1A(jQBP*~BOFp|Ydhrz0Y7J#XK=?%OCU{t$S3 z!?)3`^9QDH#*1h(L)m**cLyqPrubwSabQK*I;{ML;oyw+hYxuE`)L@GBsDAFcV23V z6l_bjghrwRXb`=x?K?5V0-}RF;3fq~+kj4BIpYSNPPNT{+j6qAKF zA_l7@SV~s;D4;5XIIF^8crq|IEX$nRBEsEfW@PkDt0_K3C#V)QW?zzlIk!G{W=N!T zCd(+Q(992=WY6Y0ib&D0dBDDc5RM8{+Rt2dUZrX4tVZ;CzM+j#tjmK~lC6@)*@V&u zX%3qz5UIG8?U<pOp7TQ`yiU{93Yp710OEXN1lB71*Se0gTeDQeID;i6z5h1BA<#k zhObgEl?zM4y!)?F5ao*nbtU1G>tv2mq?)e^r8<3`0wvNlCAp*T+h2&x!b2v#nB-mf z)@>i39BFC*gw$IivC(y{=Vmd%-Zm*~tO&2FCs!-Egn*Tk0a2}pL%5gqi+rhp{DV45 zRX#sR( z7e;dP(4SbRLP5lP!+#%MXE5(7k~cZ31{8wK|DO2j-9Tnsdu-cf;z_kxor@(VcW(dk zjmX=l$eBd{USAPGOjF&_iINfjI1RKGd9$(n9#f< zdXmD(f--bn7`2`|NyjNdvq_DEy*&7v6fE|}X%zCw@UL%+JnTPE_4QCaGKYt)d-_pdHqjX3(${ytK4o(-j6Hrw{BP?W zz$kDqHpE(WYl1tHR8y0`JMg)em_^c!-$y30r+gn^-oN$<|TNkDyspaL6WN^}1f#p{l{8V_?;hwWz6#h)OA-pUOKlPB|IJI z_4#}>k^D5#P6t2(3gDvzNY5E4=s7z`m~=IR2w%&5By&7y@c2(59`%ClobT9-=~}86 zUJTE%)1IE$q)W1MG#(!A|F<8a#%M7VW}CMy7n^EZ)_1gZyr&sem^QRLnJ-jD@{*ee zDgB3kI`n9yfPS@v2C=xB_~3J~!9KT6MhV{dwfFuUR$rs81k;oaB_?JcK}trKEZG>* zwSoz6fysyH+0hZl+~;_NY^?>T$PD2k%? z%6B}~+~?Ot(YA0gHGF>c!&@T(Fzz9fOWh2c4e5*y^@r<1iMRdjL-|ZDWyp{D*9uD<|ijqMK1hU zSAE1rBB--6ONhIzBTgf*wQYALqVacBmS14`=&55Hm+mEmlhP>Fn?QF{U_h5dQDBAg zcN6K?phzBEkD2R8EHV0E#aI5==Sxl8h{b}@-Pdl9_4K0TPzhQp>hB66O!Jm>ukF_(O^-sTr*?a>evRXvIcVq%` zS5qO(mbIgpQX36SN*Qf@IL`6SJ+Z+O0(xoY4N5Rcd;H{+kJ2(mS_By@b#Bu|$tMLx z`Fy9FK(i;Iq&5*{!091uDaR_sq>QzBxo|&f=jFE!!v-?hR8;EX>jQ*Qs-cSEO9WJT zk`Gd}Vp`N_=AE-q1A~kaM5(DNgvxGJeJv)vK1i`jF{`o7wBHt|R|us~HatYgRB2;o z%&rU=ICKC-c-2JLw}&t(IckWJsLWse1VyK)jz=5q#6ChP4NMhVng4i{qLk{WM#0jm zev9IALXam2h{-df{>%4Ysff(wL8*-?LkaHr^`;Q~8Ac%uo?4W939QtzG_bls{^JBv zvY!Uh9E?v8YUU(-ky+Kv*he^}bknE-r%#c5l8}nwO+%uopls0dP>mt?<^~WN}X=48KU#~Iefdf*ui7%K0#-y)hn@?%6t%6_~*fAJQ%q}E=(&)LY zoE_H!>(VL-qBPbt2%UbxASg%}Q`s2EFw0&=2*u=?sIW6zdi3hmHOE+Is^wv5(fDM5Xa@B#O0&rn&%=`bsd_fG2ffVzGUSk2J)2BttNAlYPQ`gv%_>*Wr^t?)6io5F zqf?~)JTE@I+-m;z0^$_%ixEYjPc}9TLNw`n%Uc5`s9g-jRJ5UjfKpk5cr!oec7vw3cuBS z@&91j#9$i?f|!`_y%xKO%Vc(pM&-sK`4Iw7W|Y&GBECfE$t-De@*W)jz_E({FA{7r ziA|QCOZ+h5CsU&d&(!!3;C)KPRr_3C7x)xl>)ZDqiM&Or3Yh>^f7|*uvwbjVw7!M5 zvnVF#!^BE)0(ecO5#4YSLzPE<-MK7MWNKAfT`kjUz+&D|{iDIm?mV zgD*w=9dUiv7cXkQw&naz`y)N!TpGbK5{A>Gh9jeqTz1B9Ln3!^L~0vq2K}C)*t4%@ zM{?-bneG8Q_E}KB$_|_6!TqLFfb79=u+-Yx*O#Qp=ANNzBTs!RlFv?P)8qViwS*%g zUz#9lJz*T;7|>S9)m;dh2KsLQ$v(08Ll)1$4*SAq28H-GB#v&0J&T*dm0$(ENZ5c7%hZSQR!03ktma{ zdOAs=CrV1X(wVkQCnfLxl*+BLjtAeVR`=!D`ongvF=1M#LlXH=$Ji_%RW+;}k{G}z zmvgnL@zc*Ch|+wQSvOVF5vL)B2~X4*k|n`)S~=}>;a**zqti=e9_LWa>2TyWg*CR63d@Ui#k7d~dW ztCD>$E|2p3_e`5REddb!|0SdQrp<^pH~#%Ix_#RG*f>QJjHZ#AH}JZ7O7wXfv5!Q~zPwX_fQF zl)Rx{CvfMq38))&Qz_g%9ST^yiBoUE+di?Mw82iRzcU`>XVj{y^yY7jWEx&J9TC-2 zxJJXI>uJ$+Na#Mdo^V>$)Of5xPdY8rHEUzY z1s&5`!E(d89EkyAXeKE7thsIGYvR832RoN~31GFxL*0^YR9+5%+;k+nERwf#+r ztj_9jvZgwz--*HKu9`Mo(-4Reo~*Cym^MwdvQxhWPdvXkciKEs z=c^PJ?=-MTg)k0NxwK|&OtM#Hx{Rh@2lT#LHCDuf`*qVVJbk7>UpFH<+{V0X+KN?I z;M4_5okrwM)A-+vTw`3|>DzgX|IE!%Ye!s#)3*_6l=Qa5Nli7VG*=#w(pqGSJkzfj zMk1-AOy$g_i9$;tdYzhn#|Hsu0uAJ>6>pTO6i5!o)^{Z@;cWwZLu3-e6pM7 zTKOs{_Y8tdXzwd#$_&v=!X0mdG&Nlk8Y>$)WBQgmkOvS^GP3=7zomT zrrFMEXAv`!Z0M?&Rn;Pc8cBibJU*j5eT&HUjO(l(|Z!OcG6hPJ^$~W4MX)ZNxZHMN5V3wm6Ipu{mf6OXn2H zvNHWK^)zOnKAlnjrhF-G5^ewj37o;vi!rmSJQ*E6^f$%oq&7@nXAp_`d2D%|t_2_}i-H-~_?U0QHVm_3&g?sw zL{dv;8s(gM^l74I+8MGOlNIVl7GBtCi*CxK1xlRB``$O!ikSm9-bz0gPhZqap}+dg z(&yaxFnK9E`GcCAXJxUCgtMiQf zTrbb7whWdsn6|45z76W~o zk_ux5GSy;>iTFyasA3G)IvB<&N5+8GLg=E#9|Juf%!XL2GOsY#fLWVG)pz8#s;or&SMO?MxM(9@w3^BuqTG zNL`s_7uLoXEzMLPc-=OUQ8pq>HT|n=05V|DCvH>0jdscf60C$-@lNHenn;-V)0Awc z959k=r==OwX;V%seb-1LXx!$&sBfMY^#)wE@OK*Q4Nj9GuP%I`fQ?~1ODW^L*c%Tq zStjeJ#Z$MJ1}D$FoEA$VM0=gEE!1?vlu0_0i9~#)Y7x+VbXSNrCC~2;8L6sNR>Dnh ztzgpM^Z&$j63RnWjP@iMBHN(aOy)4g|9{BPG?`AFq12v(N(g6w|L zo_$d$zis)fk@&2tC7GP*DA$v2Ulm64+q&G!Bh^WWu@jHxF`W|KjexXG>zDF- z%5fpb2;I){upm5t`SIWjNL-E!J4SFZ2ZAp1AWJ#!=NMtL4hX!$19Qsr5y)@tKso-f2+B!)f~scar?P4FRe7zm-4AuQ!H zGa@=eN%qb&cBcg3*&Loz?j*QA%S@z19w*N8aKla7RBPHpSr*~54`2WBOM7j`XtmaU zG0T!=iQakW@fUXM@rEYA;vanai@$ksmu;SMmSvKr#h`ahbUyd;m~FQCh=JC^pCER& zb1irM)meS{MfXnIJkv1+4aaEB&5B>YvE4S?r5sn#Vi^_J`G-4RasB{QMs4$yqr4h| zrC*SHH0#x2+w3yK`I^kuk`dhdp|}3WYtFVmyoi@>&r?nsPHrn1hp&9Sc0eAm%~p?X znBa;PXSDBaD4msMalQuPQQJJ_6i6mCBRd+e`$?`PY+H<%9wOBY@!8hrX5VHyv|&oi zSj;-vGn8*}KKjQO-67jNx5iGqe^z@g?EseH!S}KAtq(dt!8=E?nblq9yMQQQv&3CO(0qe5Ly=j2X);1-5 zD670UExN81?|Eub5aFzHS7NKy8rT{?qHNaAujN>T*YVE*1Joi63;n{75EUAPn9w6^ z7S`Z*FG4nv<#HP+@CANGVy#NTnUTZ_Aq*lBkf4h`%YBKh8TLOgLYq`Vg#b1|l9&); z(hMSbJ)WZ=HHZ+CR7I%-4Wjj{6uoaiF-1swVyj}8X_|})w?ZXV08;G`Bnd%cLIS@! zAlQBQi`?ZUwlX`*l2ocmauL-5IOT?5)X0p}>$N>Scs(5=YAga8R>r8Mmf7Z0w=@Z@ zC0vGtX=f|7*jmeMcJ(1uTP?5=Nz@zkw7_NyH8o|WLJMsH6xVF>^$RU@wPm))cq_IR zfmgN8a~rP9)*`wsa|-E9;7CKbAD8R08I(GlVMoh!Hu#@y9l-l}Ekaq=nm$2T`AS(H zUT{hJFA@ZcSSG2K0go%KrCH4sES2Vh)=&ruEH9N>aUgLkp8`a{#pg=1>Ip3L%<*)@ zQ>Ty^*NeA3+uEI-Qv$9zq#eKyNM*Slam+RmO`$xi0%eIdY$+8{B``mWV7zWx;cqL= zYD2*DuF|Y_Vp*!N6d$`~ziIDz|C~Jdc6gCsxYpuACZBrCv#l3$SSIuNdPMzDzef;O zfnE#oR`VtHY@Ra%>E51a4Ko>PFX5CHNv_fDv)`YmzqAIMEB$sY~w)OKlqEIHO!AM|-9u%$M zNfZ<%T!io?Bz*JWK)9D)n!yNCPuqdlGhjlJNq;X$mPk2v=pNEDa@H~{=S|KwBz#ex zX~pX=l*zxdCv;;(mchhX32ipGsjH=Ds$q{3)~+j zRB!3CtzXV6rD`Z*u3S-+PzEv7EwP{=>g8|i#8%yYQY}b;rNvsR=0=>9%Xh%#O7?OK zvC#zv;Tx|g0>9KV2lvG^v~_F?#Z}oV%bslwD78n+B}-J6-Ov_fIeUqIRx*ep!mgD(&&P(wxrlK%5l=1c!^=pm=>uFH2@V+j^^jDu9+dQ~OLWIo@)} zJe`g)+MapyCGYJ8TAtZ=h*2QzIG#0_X;s zDr@roa%;z62v@Ao`-EUC$PuV4FF;nPQYifg1xh`0V8ckFhBhWj_3UR`cjvGMpvt0G z2F9Yy(K^^a+B&FC_E7Fz2I1@$zb2hpE-*>l6!ox1h>cKd+ei}4(N&2(0keDc{l97y zcH#~9sEB#BX!=`2REZN}S#B*X7g-7K#WD$PknQW{FWAYRl27o2E=v>Xo+1sH4QDO&tSn)0`<$r;8cyoXu@ripIF` z5{=R6J(PH~S<2iUwDB7+#Y70&a9?zU!d3Y*aiA+9SIk!ITt*go%1i(#ePkLO(lkVQ z=(J6m2Xt3&G7o7SC=VNKlji}YFugpOuHMj0j&kh-mB)s%vEBXo7I*eK%Z;)eykxeI zY=BgjRe`@DctBz;tJip1oYQk4>#{QsM&-uqb4-^c=#+665POrQwxUB!y1``Rn&qJs z9wNP{1g{Ro80M9-d~M;7+Phemjn$ypg78^aDJ};K^`QS|J{KY_LaEU$D}e`bAnUp+ zm+6iZqg;liEt2WIkmSgI_S9P=O& zJCxs5^jmWu@nC^NYPwcJ*Nws5W1DNKM&pEO85ZT8q|aLyQ4cj7e0kRd&NF zIZ5z7Nbt;ra^ zRF<#p$iwpzQpORLk?A%cT^ZOx!Ut%?r59XY8ZvVs&x7V@p>4}6WjVE&o28#G!TPaT z3ox=s@KyLIpPtC(oKV@C?qD*pHSH}S?rXsPHJ6z?nk;tS3{#IMT0nPPrE9t^#za@0 zI3<$zfTY_pmTe}A0i{ax1=7(4mFOhxGQ&;;crhis4#P6+=&{0|0$w zLYDKYDuwBWDLrfE9Y`d=ItWl}S#1yi>W3qpQY|Qpxo&gcWNPT9B_=}$c>bsN1QDz6Y+Vr z-al>`p;FDYXvLa~Mm(8gvzjr;wY)wjlkh4BbRXt@m?ZpX!0f7J-Xn1nE3|4hD+f*e zyQmJI@DQi+4r$zi84BFMjn_R>Zi(e*!7?j5almfQp3$h&JV_SKaI7NzZP6HJsZZTOL8>U1x(u&WVcd`&(?#l#m9(;3li1Xa zn&dXrs;}mM`swEEEmo>lcD-6b)2LQ3ejzl$6o2_R<6uX%GIbJ}IH0JpHJkMPDewtp zzYDFw#07pR#~>r^WQtB}#7#YgnYeP@8qxh4=#FMT70gW`thWjf9oL9Xp%dL1*bka} zvxDTasKP=Mb~x$k1W;Bz0#-_;E=Yp+(S{T1i8o|pj}06zXdI`|QL3}>DEJ=9?o8E@ zl-e;^Gx!S=8bgz3V%D2_xRVrj0?bZjAI?4?n)3LH+N_a5@kVJrn`EMsWyslmRKK!3 z)FV;pn??$m88P4LX>dB9U7<4qDN?3!#uJ3y8sVvO5apKzQ4YQhx)a&gC7m!UrIZ{L zpmC~)I>4AFSCtuWhZ>BV_3$DHL}Jd7PxW0%nWGX*E$tluyht{oL=$u>4Jd*#4SWZZ z=I0dYf@ao0?X(EThLd;&`L;n)!4n`{mh;{88e=doa0HoofpYGYQ_Tyq)1q;mqH*xq zWMX*;ESKig@NSFwr^*TB~#R<>`vaRD$ZXp*r)-*ue+WOJqRf ztK9j`he+l+X*gp=ypMr*G-p++>cp}fn%alo`UNsaV;W`CrHE$A<}+bL{7DesnNyTX z9E&3=adKexs>I(v$I4Dl(RE6_e1&7yyPj=5fOvUmSGl>?v+y-j->TX*3x`+CUOmAL{DzzGY}*q(u%(=WgX7* zKftPoa%Fd>VoW>5NBTYheeciNFB&Q(NMcBsp;Cf1bX1n7yeoqj3tK?L;8$J$$}I7VSVmCi89>I8QJJcq z_LMrbxgIth!x;adl(hzMeSpkrpiu2trf6y~=1g(AJsL)~&gA6gJfihuAZWK(%WRFk z5$)|f2>ZO|u`-SGg~A(fDET@cBxuwmn4M@CWSatLMOw< z+oYsdX6ECOkGSdiB}9itSoCZ>`Vk!(;nDQ$D&;fi)D~$~^9EU@b()Y<)Bq|P^J!y} z@^g^#X3hc{cdC6plM>!2pSHwPj>WWoVKuB@{IU#7p|~v*Lx4zlrXc(h7KH^Uw}(Jv zEUGw_Cl;etZ^f281^KsY@|#BO<{C^-DU+L9A-p^H&Q#ekmt~Y)o!`tc&To>fJ*2TU z4bwBRO=3-r)U^#9=jJx27pjRRXdl;TPgx|XXX%N@XThU3_o4J$85fZ(hC;YFokD<2 zr!<+A!BHk#n(68QlIk;%syjE$Sr^J|m^&K8duP>A;C-ap^BOBuc-jzE>Q}ilvv^lbOIk=^} zXOO+PKfNkfNYj{ z+kvMiCHpjyU8a$pqOpRk)?smbOdS3R90HlQcNh-{KCVo{#Nd(=5(^qkM!kHkDIWM>88OGxvi_=#9AyOoxklJ5hR{ z_IYp_6@zJg8kUR=%kY>vHY~&2S>Mz;$lpgo-Il+M_hfvxVUmJed|4($%OH>K_3rkf z?u=@(n$|$f4OErYIM^P6lzYYQeBDWbF=4KkG8#fnf?uicjKa`c9j2-yQYX3e3S8Ot zfsIG1XPLUIf?S1tnz&Q+0hun4qPqAkh+7`l6zS`P zCcqSJO<&eg#~H-_DX>2!&eBJQX>E&Owkl3xzdZ+d;@IGi(AChY>G2;=nZuk z27VD9BJHE2*`E~<0s|M*=8{*f8J3C8X<|)LQBp4|BYBQPo(a*Nn<|ghAP*Efq0yhh z#H8J|Mhw0Q2Kjm8Q)Ku{X&D5=TN=YDsuCu^(=L)Do)3a&S>Elbc~aMiNU7vU*nMjE zH$`m$j|`T13>=o`eJqs&rasgKBMUW%fW~18wHY~R#_WS&u=5+iPGh5G<{@y|`Nmw9X-PccY^P7H7UB>5kP{Acn$kSe~RezH~4 zQH^@lYO#{4Kvt33|CwIJrEV!Q zEZSM`yuNu{%F3oiyAplT4ts_sT?@7|;w4zNG3|xXh#QvF3PAm;G(t;ilMsinB^o`` z=uD%h%-*nVW26NEM6>eWiwRm2P0IINjg)Dxi$+R!5Q)&M|8RYCApf=lqKS@iEX^!J zP$O!p8yZoy#j*fp&l-{cZ;%h>`|=K~G||`g=c6X9geS=ABI+cYGthPltA`d!^WPgz z#Hbnd65fwYF4N@6tS{r0@g&C$$kCinyJ}2wnA%A}J(0c+(xH6M zl%$!_h-#!wot;LSty!3Fy5_}IDn}UMZu(2*$x6JGmofduDh_+W5`JI&L1_VNLCu2{gcQth-PFX& zY^Yh1t~d!LL#UN;n(RV0$N56Vy>sOuY|v5XvE1KB=S?7@IR8 zuCIgZYB=7h6-_F|DS3KjCtD^&NwB|jN(<2ZBK-BUEM!HgrJlC+#<8egPkVafLaAvT z0lHzDSgJ{s*<{um-oQhG{S|^mt!vYY$k?khyVk7{Ho0_KRx`gJh*;Rri|w?Qkmrz6 z4IDUQr*tFAE%o_L?F-2MQIMLF;Tf% z*-ti0fj&uNKCCe}y)#kEugaMiJCMU;R#$4_GMl84$y_rH3;Rw`Ib*#el?wIt`!y<= zy&Qco-~y3L*5#Rq9MXuG{4gy?4gAHVp`Oi=1on2YO&I?JmEN?{Qj4kR%;$CfH%l!? zG+{F9g}pe8Z!>-cGPn!U^g`M_rBTUTNb2jysE}@g%-n(pA2IttaF`7TJ&hg7*?dpFU$xDdeLQ_emWY$McC?)n z1+**IBrjDopGM4Pd_y6ny1F5Ldc5G?vOPG)*7LY!j`+>B=rd{q7KZf`kHQwH| zGL#%r2_d?~vKR47)%g4-bvHZWUO0rPWoneSiPc`Lj2kYHBnF3ps#Q^*rq;ofQ%Ar& zehQdI72^QLut<*hCoUnrS&6SG%&`9*pet8hSr1{`mkKLDois>$A2!#%Fkot7NoO0Ju@52z4trt>QTaASp`BlZ zYh+p4sp0~uI7-A$?htr@fyY#EJ_?Z^7lA+xCs^bzB{InCNlJyZU{ey^L$RaQk8gqf z#O7i(jon-&tb#a?L2CTtF2F4q!KhG4t6Wy$g$jmR=D$EFn1FpMs%Vmy3Chb^nxH>O zl7RAlHH|yHjaY@ps~Nn}-$-!w8^?CkBzAL?u?kPz$so=CW&`|?0_XPR)lhEJ`=kZT zoZNspnX8x+9xETVG>v9UHHdC_=tn{@D`@w>>URk9y-lW@hG60_9{`a=ch-Td!;FJW zmc~@rs7aUv1K@}PsIVCiM?8}wSm&~OdsL0L^NOaR0I-$0scjrn0r}jxqI?nQsc};^ zJ+4Ml<5%x8MzpJu5kH|s8)~uF?Pj(3q!JaRolES!odV8kOH7H#9R9(T(J{&{Si*=V z%xM)_5!vABJmc0;f8I3jwGfCE8w{_Ur>$XB8+fpj^vAv1v$J#>($G zAoz%zQcmFdxo35bT@=BcqUd$^gJJ zoFAaZeO?6`6k4>JEA)aIS5X8ad@;jZCD5F=Ffx}^D9@PPGM?9zkeXS>ej*%lG}@PD z?UQF#SUx7mdmZyVO=+ufC>~3h9S#rDh(4cLSRb2j0+0p<(vw=fXH5D?cj1bSa~Fb`){Spf?|(G~!1 zrU8fytPAnj3&1T6U{fe?Zv(!;Aw*{dl=;>9_9lL*7^tIJkN}4fpR2`7O|5Y{p-q(K zV~EPvqHIlur5#Fn3ek2gy2u!YENjf!j!-P3hNIhk_hOu&t zV$ZG|XVG)DXjkeE2%@piOMDh+prXvHF$6v8Bl{K9pwzfh_l^=6fSU67x;2xP!9p4gR~+atO&R4371mJ2K$-QXQw%a}RKpgfVKuVL z7<52`lCz`hxS7Rn(PABlH8v~*mHb*p0snm}NSyEJ_G({Tnnp~KP+CLkAAE_uk7ozzgC z^u7563osLUN`tw<%e>1RlFeAhP^UGNH`D&z9prYLXUH=eGM~*F({ww@{-qWVmGfCG znpV@{Nm1MrVJ7jo7U$t}X+{GK7UkGrOf=3JajARGft!o{-h?}^;fmDW!Mv9b`SW3a z9bqr1*q}SzCglhgJ}$ZJxBJk@;BH>h@Xl0U1|vm|zUsfK_>q@2w5S+~9ASim?A~S~ z$$UvTKpK$UM3EG7giml>Io*P%!meqsJk@E)5o8X`599}Qafe*>&SoJK?(5}=Sd;~ivPcT@S z26Lxv#3S5(`4+>KYdFk6Yz_5Cdoe+#zsnPT)6KliKW>wG{f%BJL4j z{*dFlyyb@G+@d9LraCZMie_)XkYcr#!kf`c(UOI{K|``GEm@&CS&DcA-erbV-CC+V z)rYeP&+&`|jrL}p2FzjJoJDw=qm~&_Ar-}kiayI;vFTKaw3>|-arpL-qlFC?cT@;L z2fLFDwT}0JG@hQRkEdad!i<>D@_I0rP4p3BmX3f4j%tX!+QFVpu|$$EvvrJ!nKlhm z0GA`798M(M9397g;b^~(HFN=l<gsx}nj1hFcPWE<8ziBXbp0Xv@ z%VrMvgcPHPd~DZ1dFt2_gerAHGOh$LWAK6*Zn)$E z@EI{CAEUp!sdF_;8%AHYWj>>nMfyAsxwF4=OZ5*6B#l zJFKB3Bhv;Qq>wwJ13N<-TNAi}i>Ni}K$P224OGyT3>$T`LdSvYF%6f;RtUIccbhQB zHH@eXS-{SwKx|soJfXpIdE*Dlnua>5q4HV>>-%F#rizt1L-q^PY8uX_;8qWZ6Qh*V zRcYYU8W>j}lII#8!7M)th2U*z@G~0R%6x%HLn6kY?P<`nsnFJ~T-}{%&~Xilc~`25 z>I4R4xF-#LPD4Xv4NVg?fUix1pV#2k>2niC3Dy9--a~gRShW;k`vsR2D_%gASiB-WW%3cV&0pEozSqT7z$QV zTVERZx(1dA%qDR_byFJfrUrDi4k|6dP=4=EOK?j|kil;Ui+()?Ok~zu$dRN@CCzIG zcF=^))v&714oF;wuwR&^(_o6n4pbryW!F%e!w%d~8qTfZOzt|cTXih#g-^px;;bXZ zh$%%tOOer42mU@C4^@?D_)LyE;2+T8>=!2Vv?Q6`bR@bzEm66eh&v4>|Chb@k7+N- z?nE!w*VjMrHU4#t4P3wm8w?mQU)*WW8~T0S(|or*YInvn?b-2Ym>qYTnYqc({iUbf zYDXbEL~%4kAsXj}D4rKbA#aI>Xjz459j*6;)p)gj5>FutPs=KfLbR;H)36Fr{M3ww zyz%V&oH91>{nFpzyUBlVh487WbL!NoQ&p#`PSw4am&Hei9r_eoG`zuWb|$6w_kJ{p zgH+oiHg;~Ft7E=+ZPS2NDr16sL=*NVQS*(bSEuiwdVLpE!8TQAlj`MnGhe5dqrX=H zHq^$#Q`>sqMbpviIs`u4#`iSw>@6iX4*A)_5nHJ`h$C%c%Qdr~WOuGmp4dT$vuzS{ zlY~qf9i9+zU6QScCn4Mu#rMno zz6;!P8z(W`tM9yrHy^PtnTQqOGi`k5Bh(Cc5XrZJ+@C!GHrvLUNN8*#*tb4_{$@uf z7I|&7^~wo-j zTW{eeX&Xv4rWXSP`@Kdt?XL1|Jb8MrH&`IZFoKOX0iD|2P}%nkF4`X!+IS=I*FETa zwQfQe+i1#uL%Q#sGW=#6Z++^14M|yNR9kH-8ylI_@lSCc9gAe~D~`k?pq0q^3Q%y3tD%IYv=xQ&<_r&D*R*Rbpb5+f&~)>fA$dvvw{J93Ocj+jjrsN^Yohw!U;3fSimbM&;Mtvj7cVY;`DecJ z_FF_Vy1*#*+Z6a7#%-?{JZO)%Sz!llBJ50P+3*%{?^e1=iHB_*wl>Ya3gmnH-RzLE zjl6m906xbMt7xr_?qYhozEj)*Z(!v|J50OBZK@|ciTkVuCr_YBK5{00=aQjM+h`pt zBl(z+zo)Q@owbo#W`DjbaBoLgwa(iZ)6J&|Krj(tQq@}op)R^TaMSv<-Cb(0+Kcwb zJblro#`l?;SFpIYH*vYwK>oqEaLU*wGZ9(a^0YZ-dNWrX8*S3o3)in1CVFe#U`Pv{ zK3eEtLJZM0r?xQ?xNkQ1?JK=2#81EhWSdgo9-adC-6q+3?H4YDRv{Qqk-weCgoc1+6_v%MS0VwCppIckmQU=;?VPzu8flX@ zjaYk;aedc@wA*U4xi-0Y)naYBrJHooHr=&%rvG|v2hYp=HN{igP?U!mGuEPLuKav_ zT>EIpq))Szp8|JL=K?MLUiIU9W^EVH?Ly*=g^!#>pP;XK(^h5hT8w|naes$(Oq-~) zeZuh`^A+9jI9+Krc}?4NJha)~@I7H%r`mM4y$(0LPgfil+LX8a2~WG9(rv<4*5-V}33Wxf+$Mc;FMGoo zbw!(bik5~pNqoZ}bw!(P)85|8KJA!VX;VIBfWi5;Uuv~Ydu@I}bi*$NgKc3Y&nMyvp>8&U9iluYt^oX@00n)`kHcnpc-5`yZWr}jJM0Zv9@Q0 zHoDjB>a#ws-Ol;cs+;mZ4n6%b?0WaQUH!>>)}ytOVD*@3ek}Cs^u@=AO|`Y~r``E` z*6@0B(bP??d&92I+((?&>Xh=mtL}Ff?CRZLQoa4`(Zj11FJ*hb(p|Kx+544tdvQeB zfBYAIKbUEL5LU%KoGTTvbt!Hwd<746Zg+3m)v5aw-&|8LnK!$)?pf2TJvPf#=-#%g zq5Blo+AOkc`R<*2_VSzCOqMm%y=zzh=lhg+_qvUksEgetyZY+AnA~`Pi?Y5O`iZN@ z*3mhyLaFYuU7frSH`Yq58j@?334DA!Er%0)$Glh3JnqjvU%tFN2;(Cvrc zyZ$)()fZv^**^;ntC^n~o@T!<_*7NtuGrO|x_9X`4^#QiU(ltqYFB^u-UX3|n%Dhb9>sZSS6{x5oWpNo#895c z*ER{Cmc06`h~#Y8)lWTx4;`4bzhw6C#zjD431fJ(C1ClkE(tn29O^%P4z90%;g)IBd+X*WV|>S4SCOp_^)vV8+3M^xZ?Suc#P`nLP?BYb`pUf--+eWkxWB(6 zyB*IoxVQTiIfbv+LGKi0#i7pMTMqQQJFc>k93Q-smpu;kpFA(CtII{#H|d(paot!~{QZnDVA0mn0!`A@NEIyETwIUqzB~@Oio}wAH-O$XI?bGmEdz ze+|!$J$$3Nnr29Pm@FoTp0gENcUYRwe=r{stF<~OhaKvp=V^u8teTf6n!G}C#PQ78 z_$dvx?{VFb$S2P^)adg_)aG(i7`GgCJkt(8CCrU`O3epps8*^Z&pXsF-dmifZVD2U zcR!eU@r^fU-h#z`h;JG{MbmJ^9O@VDUB;7_7O#rcNm6&j9nW0S-qyxPT%x>3 zK}U|n^Ynr1xw>@?lFE30-;sQt#=G_uT%Q9HpLfcRltX>#-imEqY;N7FWIQ$;3l8-w z&&}h%XXpCPJ6T8idF(v)f47HYdmO#L#_7cL~=ZHQ+d1dfK_`$Udxko zEIm)hxXI*(C^5&f!iK<@UFJ}ke_ zvEq2<9^)y&*<(a3uiLTec&5wj>AdX4)hx5*$T`%XejdSF_p2#;_U*^`y>m%2{QjNE zb^F@$m~SZR$@{`g>{I)?LrvaW?7N<$AU>fN+2be==^N~CUA^_ZX3sm+Z#)NU8p=0? zB*y<>H&n&G;drK#<#wY|tabCDZk8ytL87E@${)uh(d3J8MpVJ@?k3R_g z#MMY^_7sZbZKdZ~QQvqv~zD^(*9s;-CBE|j?sLwok@6XJ$5|PCw03^T|0>mttZd3 zF}(TcBo+Mb%*^$6^Cq%tJ$;@%^|L)tCF_|({a^3Y|E+pmEt4L?^wFAyop-Yan4t-z zc?$E!%U4@i5d5PJiFNDwN9_{s6p$8W>Q}z{9=rb#Prv&WwRvv2YOR0NQu(9!G`Ie@ zu&hTcTQ3~ym+r4Kh{V=;Z{Tu2yB$GX9)v#g_`Nqjc=C*oJ$3tadJ$LJdihanhg%}G zTISj9oUk@NYWI1IThkAC^@!v{I4fGO9cec9Q-^NXEsl4R$m-{RyjE_P&@|q-Z~9~T zhpk#!O*}9EW@%r)?ypZCX9TPU`6FBi&rnQrJYF$pox)?4-KN`%;WUii(hM86I*RnOaKe^?)$7auJiOK5Q_bjm4U78yOyanjaLf`rETg;2D zxU7ESUS(d}%e!pbX;(s4-+6-3XCA-ta_nvOGwJu+pBel*lk|hTSUmn<<^ia`tbUD} z;A(bzTYZH12Q$-GC*jGr)t|zHsh@d|zEytIm6X-b{(}nr2+r@#RJ&3iSs}6wEt~m| zTA@^Hg=Ka%-<1^-Cqxh_?H>Ik1C zZ_bj@FXJ{F74p$tE8Vs9^a|lKkI7f^xli4)H7~#OR<=2qUic^PrXPP*{VD2;X}ovf z>+gPW%RapGPONKLe#&)mC)bS&YkgS!~t(riLn zqdNUqx`%OTUB-nbs{FmDsF;+eI^Mos@I?d>TxC~eE? zz@1fT(>x4FJ5*oR4$WJUPsrcYY&(Nb+Lcw`olKvgeCUx%GA=|i)!f;0Zn%@Lo~WIt zk2Nb&Syo4yBHg{3{Z!MhMDw^?+WRrYH?2D|_)1J(f#0nY)C0nY%>08at6R-xkr z& z0`vhI07HOUz&XGUz!+e|i1Gn10keP?fH}ZAU>@)sun2etxC3|!SOPo&tNwt%V9Zs}Apai%Nr~p<01ArC45a1r*9AFu60k8z90`3B40Cxaa0Ji~ifLnlh zz)ip%z#?D?umHFZxB++xmuML5wHfB20R5^0IUP102_cwK!XeI4=4l10TsX)AdluZ>LvbLVRuBk;yu&M zrTIbeA@AfZ`u_IsFmK`eD29KB*w2sgJ-mx|34I7T|BiPI@}MyKfxQ={-fuA@w~6oP zC&9LC^OHFYuz^MeaU+ zkhh>6T&RZ)<@7h9&|~aDK9^vDZUxZjQ76!d4+RHGVbBO|vwA=SqUN#h zgESlTY)O3O$ z6`&7;g?Zh96plRX^h+%e)#)n zADBJTrIGJJB{Ayp&81J06wpy0wHxmh{lWx#rwJ_#jR+#|u<_Im_#Xs*7%kxCy}*3{ zPSCI3fqGGieZ2pNf+&g;&@k~EB|Q3pfO?P=Ucqa8Nl&AwM-N*HRl*(#ll<#w3&_t; zLdS1_|Es)N?+5%WwUBWTBf~8AnW=n|kJ^&t7=;9bXsvb$B9$@5e-$~&s`LrM-|>B@ zCvP$WBYa$Bbs}2;Dw`hl>Y-M)34U0Nw@?b%ls>^?9Oe7t&FWwIq{Bub)7E(w$RyNk9vUgOL6Oq>wadFXDg}_yX(zjbbDEgvmnIhwONtUpMnFTIM=VUJ-qVGALz7d4=FH#S$c%G1P7a&`p_$BMD*a( zwp7vY>tzjMrAkXtAJ|5GOr!0PTPlJYX4m^m=g=V_}R& zFh-1n3;|l-iQYms^bJttrH{Jj5cL6ozVB!yw}WT zvO$ajlF|!10jtG-8Fr~3vw;o23?s&j3Qx-=0>ta7<~@p!?-p=J3>EFr};N9d(s?Da|WaVH>Ws> z7NofrG4MwZL7ky*aRPE7Re<7o*?$FdgOQ4tZpG8NqQAeXL!PMuVs$tP&<7Xk;j4{G`&Q%dDfvs3e$Y0-g&ixW8fV-lt5VgeHuCQI~RET-7- znxX3RCM=C61eXyXNg`dtwqk_f7yW%w5dV~a5e#7)r@_dGz5)}78IVV>d;ys;YokYg zoHWE%dJqNT(Ws|29JSRWbbV&C(4Wa-O*C}~-Jx$lP%rv3ECVdGNfe+8^b6?R!YVY4 zHba#lwh2A`1)CAnljvGD{*=mVr_j0dt1!WZ*AzZvF!ZSwCp?uWwn zIWEP2^6xqB0`EoUID@8Nizn<;8Z%zx%B^YsTn3oeehu&G;6mcJeE`e4$q2xLo{Ivc z^;`^KQO_j+R6V$H+>)OA^nsO2y7~WdY~zmm`R^P%xcG?pol6IIG-CRFt<3pGMFP=L zqrWC|(ggon-N_wI^RHbvx%xE!zew)=&*L$Fj>jiR9QqIUcv-Wo$!Vh617o4H*ty+_ zH^(`|?=SM(d{A7{%^Nq2yT(=A@Wofb1n%$SLSD<68=4=^^V^!7VCd->J{_@2yo39p zuP4$I?^*Au^i+G!dX(N&ugEzXnjdAsYLBn*3z|jEx@JRD&{!qG!To5zC)&H-SM8hk zZ~IS1;-irN6thp$Q#V6Su1g7F2v87 zRCA)Y0wGF%gM^%6UNy&h%Y70>BK)>FF{lpWTV^6R&sQ`Df}ZL$&#&`&-mN*%9BPU} zRa~}T+VSZ!2bbh8_(g+iC>hFzBSX#LGX{(~riLWHsGm2U7?n;>AQ;F64#!iIM&h-= zr}-s*m2oWbRsN8#@ji(+;uQ=vK4H(>H)NlLV$;AR?R7*%2fo~$cWgK|9b1lV$Btvy zQIV@a=uMmob*1b9ht_Fz`Xr;CTLQ~v=ZSUNNMMA&cAb7H1ptitj4;mZ9>%{pS5pVNbd;=Bnirf~z zZ@&zrD0K(JVGXInMsAzmwtM7)oF2)EZ-ZBfkJ(SDawP~AMMeBPx69`#SD7#IX%sx_ z;7a_0bS5pE%jOevxa-i8vQ_Orpvsgn%o4(ZG29vJtaUaz&rI{uJZ0YF%X}O~jybq8 zZ!o2#O=-?{>{xYP_MCYX{}Rzuka-_869Tu#pA44xV*wIX`I=lNbQJ^m5amzucxQ=E znijb#zvkWc=EPqI*&!ddn@9xeyqm(FP!TSLZS9U$tCMs-X@=(x`JDKhAUNWej2)eB zr{eTDea?_m>(2*#(yYiG@$)o%r5AXv2HM{S*Auj>PkNE(PLS|>_%`7g8uiHKlRn0C zXFR^`<$!TD*aEhoEie)tnIGvGl}A0J_^Owl(`t4#Wx?&v>*<)Fux)a?C-Ff}XV4!FM)W(X&t?_h+ zB~jqq8e;wm#Pn$7ZVzESATt1~$LrrU8+y)2IG-l1pX*k^=ab;$(}aoAM}mOTi0?iy zKCgmLK(pLEPuKv+RA5a!=R=<$y#_U^5D}O3HL@R_r_M^ZHIUc8hFl>{-D#yvQC?VMrtD!&1U1|ds=|3^$Xv5;$~&O62wYfm;mqsb0%ZgWunAm5a|w(? zRe&skvLG;2a#yc8u@sdst$DD?Lv5hYf|x_H45<=)hEX1bvNJPJ!|)~PyakVvjM z32)tB&?tH`UTMu%cUVh>rZuW{t2;JRV2!h=NmC905X?ye&!sg5{cGT*YE}uOV&=I3 zM&!9gVBQ3;Wz9x+f^f^4CCxf;dVyQgoVu1NEdz8JX=t8hP1sdreJH1Ki`18LnwZ3! zxOL68ppGt$76O$(jO=qB`ptWHy)j9&a2uMa?|39OS{+RXlrhg(Owv2Jf=24M_NRTd zk@?Zn(S?9CW(C4%` zuF(nxK@zNjEW{+Uk=xS5Y;oI$YkwprS@hhtW_=_-a)yY_!R=@QJ;|PM?^18JZ%!cr zqyCuWaB$7>p}3dab3M_X!=9s_h2EItG;t-(o)B=)2Uf>&5YJ`e%9@H0bVma_W4mLU ztkL&0`@*`Y=wf7QDRMCsllnxCCP>3@OzJmsRZUg69BYitk8iL^W?xhCutB(wS@TGv z2p+*FG-rYxVcrg{A83dsCJh?7eNB8KIk7mQPHYn95LwbF!7Fgc>nc&&5vJZ1qz#MQ zq2|~Xc5gV4S_A8vFDCh6P&A<)S=o`1daS8w!s9V%ROD)!^jOFESLsWq#~MW&74d-r zQ8+Hc;lQz|}Rof}7GVF?>o$dqK}#Xd>D@ zw>qqdB1-N;Ak|~bd;w<2x~8g@r40V z(1PL;_>T)5rQ#zjB6^TkNRP&(m+-kCVOzjQ6h!nXgOEkqLxD30J}o}QAflH^LIG(n z!%X6X@%Un%VT7O-UuA*4MCv8dUWL6x-SMdu zSV^R2(Xl=$a0+IM9Hse?x`njYU=J~O;A1DSf=I0+?R9*(28QeZKk%_%58$8!;(rX`Z7P1rUym$3X7ZZ5p{+0r{Ey=mhT zLZUO(xzL&JTytNz(@IvU@FdQH5OwFpFppqbh`Fm|@zMgN#-z7kZH2rTBjloR?yeJZ z5$IDOzYN0)WR#Gqu;V@^qzd!~kY9yu1v0^-=Pe26fu*q|DQpP@Rv5^i#{0yC4{4p3 z6%NKrgvtV0MT>lm=az&M8&Xz~mQ!NV+X9yr_9mFoTM<@;HS|x9)~5|Dq)VrBk%c8e6~WR7m@!Q_UdOvt{^nL@u3w;#WGl^LC&8OI0P`$%%Tq4 zLY4;YHn3S3k)Ow_9EF(l4T0MhF0?V}7esDHxYU-+G3gftZdYg^?Uw|uBy@-|>6=*M z30jfn?s{K!SoJUYEB>lKFXGLx4H$Nxn;BtRp}{^24IFQ3wFa%EwSvnpW9=sxz~xu) z7Fj_;;8z8%Dp(QtmcZ=`G6KH_8!WiRqW%&1)r56diF!c|tLGg0 zbsrM$1lUFNkl(<{PAG_E3QvSnA=H^tmeB$o8dUjI$dQUqL7YMd_)V<&(3v8HIur7Q zIsgo|EzXl^JswC&sX z#l~00JE($MZHKm_CnkLdHd^Z&w^Et`jgv*%@0&QScA;DDIqTcBXo6f=4vJ+hawL!g3%CRrlzHSxYPFs9POWLqJa6{E>Yex0`VzGE zPJ-fZkRgQ(MxIL{`nPDd1#L%Xg4WavNcewXrPA6?eS zo)#(V+BJ|2!z5`-yh3`)g9-MHd1Qfx8=4KoN3r2Wjsq>KSkSKPwv81#?E*;47tr$< zwzHs*YM|F`tt@5CS@Vi{)x2juHJ_Oq<^=pm+%_oYiDF0Vlh)07^M<)#u9^*9QkSPI zK|8}8P*|zVU6eVEy({7}#Y>1|6Ig-_%T%$lb^}t+@?04yS*rRTC|=;XJ;YZiUP1gt z>@~r`O&qF-W7}6nT%q_r;veU^eZ)N!KS2B?o;yJPbpefgs4eP_dK1z^Y(0@ypi+;t zn<({Vm?)$aDW#^}Ldq*JOyJ`qKF8qmi06(G4^aFB@mFDu5D!xP6!A~O1cAd2$$5tO zYcMvzhX{X;`0KDJ09cD$0ARs!34m2a1K_hf*C8fob)W_KJkJ>bzQA)5z!!PW3h*VK zlL6l3IX5~TTf&Gb^00-);?&+$WvV*0KjoPYOqZvt(1NVcUCW#V|$YSCWq6DsUQ_-mv@P$_>DK1X=roToc zDUe_vnG%U0B{?13f@sxcg0-pRse|dW>G*@hgM|ldj!%n=qAD(l%i@Z-C2or)n4y&9 zvT!;JeWP1y_hwG z6(nIF0WrI7@J0W={7EXjy;U%yh)#DATl5QoK5AU-^%0c8YEG@+F^x||V zbj(^|O_X&h2`d>2ETNc5k)w@Ma`x0fa~OIr@bIQkV0HFKl(r%IkTxT76i{b9Y{yj) zcSN^t3o_3dxdMW@;LhysEM9AkMTA%s=OEGxSVX|3hWA&)8wG2ghy2(jY>IImUX+dn z1(dr8I_wg*P$#_W9Ns9XI}fhd8Em6@@VatQ*hN`X5_SeuXr0nZaOPE!_E695iuq6@ zl*K#rkX}Y(t)qEg7P%5yB@@a}>Yi8@wMfPOpe#zE6-uj!dtw-A*dOeP!RZ{ORmF;! zMB1w+t|I!TqoLK%M(8qRAvILRIss%@ol+4+?M2zNx=JuWJhi$GT^UuuHlYI@_^WWj>2`FdQ)Hxm8jBR&E>f}BmjJNBx9Uo| z6D@62X=LP4-eWT->&iOo6!n93^n(CfO1pJ&>y9-SRA&xQ^t-Kc&%q}ADVGpUR zfZzMrIO?hhd?0W>-M+4hQyFaRbcvuuqJ?xpT@0fAELJ7JnSl%Ic7h7w!n%;I2;9$M zsiIq?T1KGNAUe;_i(FWzomFOK8a;Emh;9v|=Nm>YqN{`gGs=T(I8XFZ-JGrg`d<*Z zIo;fBfzsx6QJodt04wyUEZOzlzn2?udB+7jyx`oNOIYN7CbqL1j{%+{3{67Obi+qYKH4!D{e0=$?#E zE>4!GcKK6URHbzh!-`?muxzZ_gZOe`qgUIPl77v?rF9EI&*bvt3T!JGG`uq&s~BCH zmSh>-E}x<)G^@+Ztj?rq5tc>TI&oalHF`Vxls->iVW>D%9oip?kELl@wgQSdnh;mP z1&c5OSbXIGOjxb}n6X9ykxE2)#IdX*fYsCnk~5TCKpe{{0$4>A0kC@71i+$c3jk}S z9RMtmb^!*lpaAe<6#;-H&>jF*J{15gc&Y$c*X-*){1RA4v>(3N1aC1A?&9=(4V$*P zA*{jSbLWqBX=~1x?&6I6neM>4Z9BGI+Hzf-z@O`iHg;NYuB+=VbeFn@u0wxdE!ax7 z1KZnVLI|-zq;*}{wnc#p-Jwll`;SWypW8h45+z^i&TUl+G;{|05d}K*9($Ht*&h9w z`P?jZS-T=#c#NlOwM!XVA#bZspLP`{R@q6Get%G%Sf99<$dQvfs5f{P5m_T#2)OgX z)PxjVr)XHO^&~(l1@pvYPM;VFjBZdcs!xstM++33*OM=@NWqw%{FR#&jO*z*Zi|8m z{pm;jO)e{R?M`0L1IA8iSOZjOvO=S zLMliJbJ&(~lA5^Ah`#bvm|pC`pFy9lXZg#!luUdIxC%v7S*zBS+=G6 z>jv6l5vG~GY{^)X{ipqB{Uu(jg;ReW0<9S@j0R_P@^Jcmy2N*oym=^b-FRtiuycy} z$)o8ys&Y)IrjAwPoE(*RT^$25>`zX7AJUf%0pp@{Asu(E+P0k~euJvFX9ybO@)lFj zz9AxKMo6Cl=yM+`x|nWO@{pafo}xaaT_=jTt1Z7`KfbW*TP3G|tnt6pS-MgBg7}fxIokE#n32vCSS0|>agOI4Q7)WrAF*8M zPhYW|*O4!1#fUR|(8ebk2I9D7T(vYThe}~`XS#%$ah7B)83U%2X~nc>34H+)l zT~#4-1q{C zd~U3FO7Kp^%r*0c+1)kQmF)7dkx9eji1{ueQdaVq$%FBOF-#*JkUS@T8$3DyzsXY0 zCw?%2fT1(f`2#1^WraU?*%9-v`9oB{5GuR?BbDh4Q>EzWH;u>&YPr@KA&N+65^O19 z&I}_Rxzf%LT;Lk*OgmyaTKnQ53mWk;92>`_4Jl;HI_o{jf!g4Sr@(eH#H6VG1CS;G z{}3?M`Gb!m%L;0#n3ha=(}qbam8760YQx2DI4e4jOsaG#NM0F+>M7?CnP+`ZNXPrJ%#6%Zs z;7I7aG-aiA^b?=CXxX(?E&G-{mfApFqG8Bmwb{3??0Z(chM_qhSi?6%Ws)8XsAU#XU=E;2n(FArL|Q(RSDG|h$snzg zg3e5ml%uo@G?_tKBb8s6IwZWc1nw{L?jYgPWN0Vki8vx{ns>T3Sf`Q_Qc7Bo7Nr73 z=cPD{suH`15SMc3Lmd{YEo6&3s*bcX>nu{aS?N^SqzqY1R-2IcLfUGk?@8OuKt+!j+L898s&vTc%FU!*U@3_*?on0N!H2Tc zkWe9OVK66qt9^8}hc5o)Mz=<*RI0%oVWV-uoM9d?@^bAr5m^NH;O;ubBF(@SX$REk z2J?b>5xx0{6y!FC%!gey%AkP5ig_JAvS`Vj+d+cIBUDdxD07LGPuW{FVhf)m^RE5eu60O`JT4dQ;A`wf zxu}1LUPr4_TA8ZeouQ*4stc?V^Zm^;xs#~n3S=h%F?+%%c(XpGu5wpV|1$W{3YS*5 zi{9;_+E7!RNLLiO7m=Rr%6ApJN^rnlxg(>DIU&=wf^)7n+Pl?{Cc%U@&oZolyxzqu zZl-I!tE|io#s`ywi-SvpJA;RwE0<-KDV12)yOwQv=T5&mh$_IIt|3z%!d0ljjuL=soJq7HHcUwYi$=KYqggmu>%wjn-iaGKvQEA%i7g$yqwEJ>jIQbS?HIoE0o0 zmU-X|UFZQaBF%-(f~C1^%UC3$Q?S}uz>J=;SSjiORSFc#md7-?Ml45`3(J9W)ZggW z4n%QkW}vlBGdW>PyIQE_0ThGktXgDjj<}+wrWE?!*svhjuqed3XsIx(hBxdq(+?~@ zqTROaSvsr%s=>|`Nw5nYd>0n*$U@7L3*bXt7?-7XLc@|1e+kV&W>R&W^quzA4MvoI zV%g>Q$yH1F>IM^%PLZ@iYtU26L65I5+P5)6M-OMy5h~JWjauie3G3X=NECGeW}d_& zf`m25Tnj<#vNa#v3Lej#%!Kq76hkQyJuL=9){M0@Gj}5#Wqu^EZ$Wk!C2C!@u3NJ+ z5$&%*xOwY)q_%nM`%MsI*MO+g>~t^9)Mn!PmtfB+PO&6A{7nFtVqU&hdYqa#ZCwHD z9GK^=1#8i|g-i+38uqD3+Cb8-HAyu~TT@iCv~>+B3lvn5cgq^l{w~x+T-L#1%ewB% zVn;ux9lRrTfmLeNnq;&6s33+cMS1fD2q<+ngJmTk=$l~T2iC|)XzHyb+FocqpmXO{BQG&9H8)komi90x4rrc+?3-~JbDAPHDl~!PZ z<-V}(Q-aoRwI5KxfWToZpfVDxy+#R&JzzhkfCqt-R$!5l1ng(j)wnt(N9{5DC5tvF zx{N8K!vgJQ>@?kA{(uJ;k#oC&QdjH+`=)){-aOB@NARZaHMHTO<4{gG7o8W~k_F~u z6%@NLsx`Z8p@Q7R&_9TOcA_z`DJRR zh-1wkX{JOSbFDy>0(0m{F~%THJmYu?_cF32sH`NtN86F4^b`V1!2I9^be9#!0;O?9 z%#6E^G_hH8;BB}h{W`AW7I7hW+wtMggLKRB;m<*UUB{xb%u2~n&Z^_sapE|2WGU-D z0xMM9zN6+ibF31wRHm2^ToFM)K@-WT-nYF493`sGF_!=ei{qKB?N1?J4wZ_H6bp^yQTZ zD{zi#Hisg>ipq{cX1dVImU*%6!|sS{4n5+ix87UpODo4pjAe^cW!3IX_XfNAndwfl z#AK@*QyvAj5r{M0?BE^& ztq#lGN8Pn<2RFZ$L8iUZYw zqk-drpl8mL@Z?z5H7e_}yV1?;jN~f1w|dIGi+$V5+JG_`8r&GnGrA2b!hp(0T?NV_ zxk9dDGmvm?5{cy6YJzPdwYog61=kMgP)44ZEAHC0V#vE)VOPYJbfsMtfi`I&*M4td zx*ozwu?F2bLeYsuc4su|lEpuQ;-aoBPoxP~VR|`4q#0_E?dJf?u9{ZB+PLDf!UuUcmLA_2 zuW4<-R9*XQL{(i|dN1M!fRlhVS5Ev6;IXSi|4V?UfWOROLH{jO6?eD`dU7sk-AhbkTEzbY;s(I)0!r>8<0K*e$B0{T`I@fZ zEAIMuQUAtOXrDFk0qgGWm^@_HG>aM%P zY}Ik$&MI0PSuKMNWovt^7;>T&lfy&+29>M`_sfC<~kr_)pK zxdb6$efab>^Bqv)x-vJA99SQ$4OToSp1LnWS$A;5=dwrYoukNZPpmhA+mj`B4e$Di zqmABeoN>{n;A#RqfY@|orDca!zP|OoMn5xN;oe2uh|c%PN=@wV>+Jsf@=4Jo*6=0K*FZbM2~*&Nv#DUFxM^)wP! zd!@n4!Lawlf9juS+KrLkwon8;Hic3AL{V#fTYU+p+N0hisjt+#-+R=XqNFkc3#~x9 z6;PXfLKwvS*63AmG*=zkeLy!(DXzs~9VujeC_hvf+8!zo74@HlU=7sexWB-T@C-sf zQaV6cWbx92U4D&D3bcK6#p__Y%=B!4KIZ$@`nLNH`p)|lC9W*`mq|pf3NxOeHcj_s zpww#LJ{0R#VoH`;Yq9T`nfVp!DQe$o-x;#k`&J3J)K~7SAOl(w<>mTz`u6*l(e#_MA-Txt!yx*7KmUOS7%R2R_;_;?N9Ntp$OeD8GXa*i{Kj)6U*E~0LSN|TCw>4dHjbrHLI^3=EJt88228tX7qq~Z9+>mWX<`q_>W!x=?>u;i(EPrT`&^P#No7pO%`N@gH3sCa&nJeL)vq0IMh zPE;ov6LPTWA30Li;HlXi-1F>vYM!Kb#k=a=Ve{K1uIGJ|COXRWOXRF+=BB(w{l~!1 z-LLv8Bj=;>fOX70mKTrdlB)tu;WifC9rg9kvF1$lL(wqMq^}HW*-}4S3uRHqC1%qu zh77|i!^Pp~2(*LjrG6{RUcA^+slD9Cli`bqFhbFeC_;q*%Q(Cv^P&s{!61o(a+7B^tRBd6ssq$FrNMJ*wdg>WMeEdR(SgiW z^n!5n18Ii4q@1yVm4V%X5=&^<;3SO?tPKZx z>75&jVLI6NMg6<}Um?Av2Y!_Zmj~RQUEW7$BH4j&5n^TF*9bx7{5l)%1091t&${Qz z4V6RG?V*JH*zwrX_~v+Y;x{P6+Caebn-nMvL_FW7rYL|#6_JGJ+jJ<~6f)-d&%||y zNgVh57s|0S5cm8Rjne8s!jqo4dxvw@7~cPMZ^koEj71+;^Ck76gous3)zSnzmo1({O@t2l@6uw(T522&m_rTGTQ z)of^{%@0a;G=*=FxEBn^` z>!Uv6y@s)KG8iD1G-I9&o?*TT63aX$bZQ}kC*=u|m>a;J0w1P)1q{lRCqhLP2Lqmn zCkAC^JXy~ik!}v|fiQ)~acJCbB7EVC_|yKJzvzz=!4~RU^lWk3iiZER<7Yuym1PZJQp6>o3NvMmSHdsJ(nIF9(vtg1;r*wusv9jGf&-|JgKm(esCDmCFbb<5c3-Jbt<~-4fu9Oo7WkRyr+1sAnOZEG=dAE z`I*@4TzHj9o1@=D?;6Q@VkMG!Mj0$8XBrV0-tyE%R|NC&EeYc`EZA?BcMf3NsX6T);;=N8M?a0)LOYH!+}w{ z|4O$(@vsc+IbmoewlKapp2s$&x#nrD%!)qi$i_%CFdvAIRY?l&VrZY>+0ez%0R_$x zIBW%uT7hEhv$N(v&_;ehJH!^^|8 zu-8%~g1`z$3=SxIZde6T6Dy0f@mU()HIQjs9kx2C!^wDBfGa>R+rtI@@1ZYl4r>Dn zLwOu1q&!?5&g(yo9M$0fOAb=<5%gHl(?+f~9A?Q8Nfqbxd4(FSQ+|5u>u@Wokj zf|9L1*_UF`1&aE70pB8vsw7Or7xl$_Mg5ED$1z`Zc}FR z_wD$0@svRYiEAWH)>rhcQx*jDp9POqWLa!_sePH5n)VG0k)n^9d3~%r##SRW--X{W z;tpiTw#MpX*72iYI#eJrxv; z9P@3N6^U*Hao1p*H~m`>WEY2;WfC1!sIUKo>W92V;F`;jl0QC11J{RZA6eYq-kEaG zKzPvau?L2*0LS>ELkrPSfY4FX?&bdY%;N%u9Vm)DS4BL zeKY05-$(8ylFg)v(e!9`v@lv8t&Ls=*QVB|Hm0mhGMOYxkJ4kwicF1=8}(39b~HD- zK3dejj*_X|`SI99fDvqs28p161Mr>EFk=#-gfgC7J{XO%gn3G+;fZCevsprdvR;mA z11T0=kkJ-a)H)al1#*GQK$^7TMl>2&3M^7?H!vMzDiOK^;lO%eBd`~^2rM;mkwAEC zS;nlR1mb}Nj#<(;Xo-$xWK8lNa9l%%JbTuN&iU4x&wU0e%pVjA1aSiq9;d+7B04q} zA4`no$D)(-lM)_GIG8@1K43Fb4Cx03@_i-7R+!|gBxrVw9&}zG!`uM_M<#?EXXpoT zo&6pyCtGXL@7#?1{>{k0ycziyHzRAToOKztZflI5pDvG8$Ih7}?r>~_Aq%90`WQVc zy~z@`D8V}J9`}uJlYsKLf?!~Lw@I%5Gsu+0h+D&m!%Gz~tQRo(VM;}JUu5a)mA6}5D9^|1FBrZ+-D_X}`Cr%jEDK)n;F*lKzNU>+R z&nUr%gw~4ToDu>P(RRWgP*cuL{28760+>+KR%YzDFm~yYaAgu#mtnHDV6rY)NtdLi z6{HC%X%vgo{%=9-{kvM^bkEWxl; zC-)~~P7Ilgpgc(mAv<1}jN?K(cNwI z6HX_WSn4wU)+bARnVR5ovNW3yXBp<-5Jzc>c6`t)jnIGFO!?y`_;*dvV2{i<9|fRC zLguujJonU`whvI5$}owPsq7W}F7;)4(r8ZG4+7uRDl6^Z6SwHp8jGw`voB1kQ}jg8 z3NFbXlL!?34@9;y^?x+M2BR)e#n#Zvip{{z)F!EPZR!XQFr7`+r!J>DrnjhJ);Eph~QN``mGu-hf?>b%fJ)A`b(h~S-r*~Q5B|H#_ zq%gZrU1mvpBt{a?7FDQ`lhbJgtCW^PfXzLKPy0f2uCVhUIjhdD&K}^!DsawZrq`zN zv`45G3O*=2$js(v7sCgXmGguS2`*0;rjICqmvBtih<|2!d)g2>z7C!^X^c%5r#JE3 z+5bn}x4=hrReMiPGAENsGOuLvpruVBAYh3k5K3xkGf9RrZC>O7q!wXFCc~5@lgvzL z;uQ;3tf|E-RlKD_EmdsM;uWuWi?`I`Cs$L8f{HCF-o{(BSh1xQ1ue(#zxF=QnUhEL z-tTLF8RqQ0_J6It_S$Q&{WyEhktVk-EUlPbF|T4l#d*rxjuHnK9$k2W@h<+h8U6b&25JOI{6(Bvv4{CHDjH#~WO=kBhg!xzUZ&s8=SLhXUdqj)%r$Cdo?7#_#**g@ot zm7M?!R$c*^okpp~%AJcE7Z0Hcwlfb_d0enV!Niabifl*WGbntu68DZ#Pr*AkgY0xi zU*$HY>7$iHEQbUbVL4|iXR@3#m8J5(v*my1$^TZ^=1>bmtSzi8eQUJMmD9G{XcLyw zMs3v7&*ER|(BqYBnO1`InYAdw9{Q+O3l`CvgdKR7aA?sWB~&f)E%Gl4;uXIUEMuP| z;|eZ1y=WZo1dgy`TS$?+Fc6+ubbiq`Qq*qbpMgQ0U$mV+9$IvC(J>^A^2fuAjxQQR z?v6rufW3Ix?BJq9iw>jEIdIrPUW6X;k|QjZ3KI49#k&{pV*K{9&;9K4AhoxpWAP#S zH?X*4@nPl55&F`Il%vX*+OqAQx!%QZ($E-8S*$$?F7^F z?C}B-?_W$W30|T~Sd`Z=t`x#M9fxZ;ix(v?;#Em&RaR9oUYEqn2vGFZ#W-`1f8BW1 zX$Jl+t~xB7r*Uy!Ray}lv$Y7UeN}$e^KhF0Do?Kv<+4mSWrpyA~OS; zI~<>tMjekz+wr&4QR1>#YWF&}lHw0Jp0OQu{8T*Z_@i{lF;9?=I(7(nDovM;InuI7 z;Ny-GaSUMR9ly7YIra(CamR7`NJ~d@TDpDAfi^ns2&PNt9lPk;Sh{!~A0Qq}w;y+e zGNdv3IPU1nKt^8%=niJsjysOhH+=bhu!AmWM=^XH zcZ}Lm0@vk32lSYhjmNZXe49rf2eYBDgV|toDjNX!xafFnDVpkvqa-KIdAn$JK5W0@ z7=tWFJM=G5j4t_Hho5<7yV1R1@fs z+897j;O`XvPV;OWRkPrfnm`BC&LH_L{>Jfl&bi)VS!g-$oMpS{oRx9GIZMRBVCj#39$+(vWKyug+}6zgwm4t{R)g zRlCDgF79yc5~Q837Lo}^zwozE+U;71#-kl zd2EMW9`TT?RyvHogRWNTh-<6MH6R=X@R+OIcEVL|KkC{bjp6SE{!Y1Sz{Y}uU-)xK zXCbX+p=aDxX*=ht6vtibrE~ZjcRh~h$HjB5KjQmUK|1eR58qmQ)%6W~n)?M?n!8kx zuDU{kWOc7Evba3C?xkXud#NSMy}$s?z^N4{8hP6S}Y}&YPVonhTAH9ZoI+kzD`<(Kc9PX#xnO} zq}_t&Tcm1t3({IL{DkDP1l)LQ3&T#poi8=IZ;)0}@MaT zg(USTwjOu5pR*M$6n46?6^vi1+2wZGcDqZYL+)~Mr@LI*nXy&H%P^v8!R(DFBhSyt3Auo#R|`Oy1m+yn;}*3 z4|uZ$o}moe0?%nm!w`tGxmL?OPoq^@<{83yHqQxB@_C?Ni^UIgzb9V`;Fh~a&w86{ zp|H|3!`9)MA+Gd%L+Zd^$Wuc{B_p03G2)qRmHIqeU0}Y=a}aMRd#t#d)^j0U+~ToX z?OQzCt$5sTm9~4oZ+dfZ;{eY)i+UNPcbixx6Y^OZ?1p5gOLXK1PaoV#W!*<$pA_EjdR{J5(RV%*X zH!t5;SZOVvXcg3AT~E?SeFt=S#=85C*cm;tXj^-ue|q1H!hva@%NL zIW8;CN|#3IV_)7@3x3RCe;!^w$a4q>^Bfub^D3o7_&bQd!+Fd)j^yQtNAjvOq+@yO zOW@m%=gqQ=<;}vso24=QoykMPyDVq(uoRXj2xs$dlE(3OE)P~XU^$=X5HI98?C0|q zOBeIj7XctG|31;0|5H2OqQQWYKU0u$^O?oE^DP#4{w&FxKNm-qS<*}-&CK^mrTHGq zY@Rd^N%QiHqy_m!mI|I!g`}$d9H}}VTSz>~ha?}U{GbZ(q(&q)=8MuwT)Wc2lRA;q ziKMki3i6~7l0y0OrAYpKOCL`fMA9IVhLALpzkVU=uqFQnaa;Zkwk`R&>C!g(*p<&? z_PzPniih)`wH?my5Tw2N2wnH*pBHS0@;lPSL-`9b@aU(H9T`YFnt`-{6_0)NvCE3I z<5r|yq(_8w`||@L(hiGAi`eiuYLkxS*HBNxJ_7zc(ij&K`v;a2`DN0n{4&ew{4{|E z(lhxU@oc`wc0T_R`&rWVIegeItD3#)GHcy_1<1fII8i z(iZQqw4IXS6CwEy)L@5qqcrOMqqLLDvkUTI8C%$m>hJQ-k@k8&Mb!I1y&u&3y*1K) z@16MfgVH|lC#3`4Pg)LoYlzPw@HynYnjszbu3v~q;i$J>JmRgl9rgMJ=?Hxs^R9Ox zWcK<1MqC@h*|hdLILvW!&o#&v`wz zaqn}|xcA56xED4u?yV5;ts1649~X&%tM-bwNW9`rNLRdT1$=>*Nh^4cM6?#*bY+1k zS_?KySp`qx?;8&8h;MYk1HPYWe+8a`C!FsB+yI_{BxL{U>w_ui7T(Cr%Sx`gC zr3D4H*#!mSJbH9l765QT!78bufO&zc0`%{KBB{Ed$g-?}&02j09-FV=YZCr!jRn8V z=_vT4*imr7iiBKIYNU^~goVzGrL0haLyGXnK4A3~xTGP@c%;B4jzGLEobfg=-d6B2 zX?sBpjf|rOIpS!+&!n9N&rw*ntDs!mS5R)-Ur=s8Q1FoDK*6)pfdW6S=qT{PofbsW z@i>?+?Wd1}9Ptnk4;8#19WG$b_DDgF?N~uh#?gWt;Yh(o=@|Zw;%}@VO;`#RCko2M z@q!0z;{|a07Yg>L+b@j%Y2MW6LU>W49KfLub)PF+MECg_qK$s|9XMj0(3B+fvZXE}SDS z0R8O3k4p;*AD2oCD>9_&!sjrC;-I|C)>zn)A+9WpU>T7p{`F7v72Q8>G>~o}7`w58>YrNjnPfleQJ!ha>k7 zf%YM!J(RNz|L!P!80imNMhm})f4?a0EMzu-g(l0cLWi`Q9&r>9Qtd5VBJJak`|-HH z@Mh^iAsgTh7S6I9Dx4)8EZi&|!rw7Yb-WOlrl8OmufhpPdaBT2J5iXBPT}tiRTwib zaKciPaJF!kG>*S>lw4vtUntrxKo1uR%cS!Fxk$+iEtd*Ck4wkw4daI1ye;8qJ^ z@o=j}aH~ZQTUybNrK}>*;#G_yI8!VUxr>%cxka^-x2T4av37*NGHGT}37%X6eOiLm z7EAu;UQDyped_%;ef?GE=Pg1G{rvJ8e|IDijm4!iw|>?l-aIg)y!@`V=uoUHbeBH6 zd>|Ni4OZS{=@$8qcmuL0v%Pu4-J!0;f86|+ANJT+N0guRe&w;ff9c7rjYfMz!T!Ho zzc?hZCXx?ofA*|MGP`RuC;&Jooiuzw60Z z9gTH2ef)~MCj&nn8;cycwIXa?9_)>W;wTq()=?!oW7CxZQ5p|>d`UqM?Q3x$-Ns|G%8!JbfEu(#Jg z+!Y!iK7Tf3*M@qcu~2PLAKvlWX`{cg8cPrmi;_kJrUQ!9=KPe$Jo5Sv4KtRToSw z`uZO}Y6;tF0&zxi>06uT;K|3IemMG(0dOW#Un~|Jsq2lsz4!CQVMh(G-Ev~uJ92*g z!11uBCZ&0-jft|boe9obpV8Sk=ib;|U;fH1U`61lbM%&v+y+*p_WF_jATsNwgbc3!LkN0f1i?fTE1iyCu3s*FbTCX`{`2WoIbpFr)Ei2K zn8ewPm?zxY{K9Tol>|sANAq6K&;S>mzv0-l1+@K1VSrGSzXaM8=9pm>Elt zts&YUrrt?y9!{?hF;f5sRvmp~xfK+qCi*ewR|tyNq(P}Um(|zZ-5Tn7@1?KYhIXS$ zYwebUC$ixlvcK0)9DX@$Ncq&_-z^E-&^Z&4{vj^D&=6&6u-3xvHnFcpS(<`

xzf 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�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 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXMDIMRU.dcu b/official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXMDIMRU.dcu new file mode 100644 index 0000000000000000000000000000000000000000..8b48746bf61f2b06c57342e67efcc7e5d58b7b53 GIT binary patch literal 27785 zcmdUX4|r77weLCm{GDO)*CZw>p-BqdKp_$!76dH$Gl5tV@)rm-$dF8u!TckcQR5X0 zLcFA7dZjH^yu?c1qfgq>C*Goh(ho$SX~l{bYqZ$n6$>IQvBoA|GI_tX&pDHsB((Rv z?|a|Zi{H*Zd#$zCT6?Xv*Iwt(xKI${x*7!`@6oT{_Uxso?+a{Fd22=Pnxg!|qO!_B z-&Y?K)WxkynVEN%xA@v>+;@gxGh1Elk3E=mn^3EkceH!mO@biQX%#CsY;@OnUtIk8 zYjyV3o?3Ugx6RXB|G`r|pVw)*EiH|1SM%pz>~Ys=h0R`fy}Qk}yYA&WwVhL~{89C< z>mn+fJvA-XL;}^z6>UEEJ-ts1)<>HBGo71!uEzFH?~JOizsZ6vb9mZq+jV^7#ujbrQ<8Es?Y27oc4B4eY3k3ju7gV0@%mhPDYcR z_j$Y=sFr)~cdx872y!9)ZhomR&1vTfz1Fp@wLW4+i>tQG-EP=y&Fc@9*6T|vG0JOf zyYojszP&zjsj>V5PqVABvE%ak){}K|UW2R6v;V7E^^VY0U%+bXY$X&3MDWK;eV^Ay zab^W=ElsO)+S*(lvktu(fP_Lrg@Ge?Psi#=9w$M6^rk<{^^=ya#$`?|G^@L1;K$1_ zg8-IJ#we$~{*H{y+v{x{x564m@FB4ywyxEGa)W}e$mK02^-Y0X9dNwf^ZlfnS`A@c z*vu`5!D>%)ZOgswuveYDe06bt;p-Q^R;MgqzH;T)_@%nKB&RH=$Oz{Zqu1JsGG}?^ ziVBX1t}xh?G`ecsP3~szk3V@qt&doqms@dHxwE2RWnN|Z>CJ!4s-MI`MTNyhIcxqm z0V2v*-&MYRq`OlK*D87n(2rpY%1)IGy`sE;nUn713y$j9zg z>ebcD?}BAsq*)|B&)3!ln^iO*aBB-|r}TgJAN4m?HaCEe=^bM-t)o67sPBrF=K9FO zquc9k%T}+rtGuFWh4cF15248F@}Q-1SFX9G?dm}oE6-X?w^N*3uVb9IVr99rC=a7a z7+JRM&gB4ib8V5kz1>ys{&}CXic2-eB`xiwAz}nJtfUyJkA_Y~?q**hvSnV2ui1NQ z-T!)7k*q*tD7SV8LoNnAi#EjO|tbM10QUTO0TDp^NDiahiz5kE$}qDi(O6bC#nvvsMnF; zdE&ivaLxVLKs>>?`3ACA92LbaUQbzroX3Thi82^ZV2@zB;|auuglUegD7Ie_@nmCUUf=*$qN4^?Kax zr~lUz74rGt z>mqRuwU&7(eMs<|N2h0Ur+R9*pU)6dZ)q)aH?`d3{^hsY-wAUeotUBIAA`J3saOHk zUw`QPKd86y%S;5t;17OwTb*><{Ol{8eQW9`)wDx8PC;y&)?0pi1%bM(&DGlAsiDBb z2W&SQ|gN+gM4B)o($ z&f{MbcFK6HksJ-0v*YD+4y&7M-yqbN!lrZc(V@!zmWUE2-~nylCR|z=uBGPgGIuK-t@*e#9P%!aeIb;L5()R! z$~I5Er}+{Qgy|V1AZK1CbeK~JZ3GOm9$eo35s`#N1W5AT_jqdDM2M5_3Q>ePJ(y~S z2^HqiGWRAQial<1_7JdPmPRHjanUK5>#DiCz72;+?Ia=!^IMQ8zs0wq(Vgq7t8=%x zYaK)w7MSG?E%%y>i6rEgLk(plHxq3b%hhNIr$~;b2{(mKfLACx-$aPyP(*mqd@JF@ zyjs|NkC`c#jbjRr(zYxjMA(MJA`4n-eC=g~i47HJC|+*BP5miVvxXB73wsX&ec* z#d;!`GM0cGe~;VZw2o-h@){g5&HvP0{UUB!jX}~s<-dpkFa{JbB!SEQ=Vevp^-*Im z_Y)A+z^F2ChmpRh$otE(-fomV`5sqeOTBUWC>_2U!p zyM@j)&e&hR`z1TVBnS;!`ydcF)^MLf#TVxtX{uzxrabHZ6na$T&ZV-G?q4D*Dsm02 z3G!0>-0xx4p`c9Mt2NiVGj3gW3lYFGH`2EdRoXZzu8ZLjPBw?g#w^vS z1?NtnPO;lvThW3;fG^pQHjn6%!v%%bDf05~uTqM}395t}6F9(8oNE)SkF8R3x4SlRf{ENlE9;gKinJWv?3qQVw!bzp!9?E2Hsj|~u`LM$ZSnxx4{4=Q#cEcfUwv+)GL^yRK!m-EXtwcF~5fv@<^^N?N1~<@O zA)4`vFiLNF^wPe7D8^eW^t4<^BsY&!$q4OYLMDzwnxVatunFU^{6H-s+!x2;!o$9d zh!FN;g6HI}2mV|iZ-T>vHu=b1zqaBd9Ag$~F7RMZ_ecMid@JyY9LYxw_;`(dOUSY>k|oIR!P&xV{6=0HPS7P$RK@c zFp&_5ZkY_W=IT+ixtiK<`Qp9bsn56(<=7{4bBOwed_zNJK2eTl;xQV)bVkW|E0K+! z4P(ggK&+-Xk1}@q0wNr(KgSSKVkpkbLE*QQ=;qvLJ=kS5(_Nd_*wT*sY)S$2)F78; zP5T?OaC{WG?juc{M0!IL5Cz}p*ziR}`L|4vOHTvZT|_qfZ^*XpYI9rKYTa!l;ciT+ z$qs$>w?z={df{8YW;NNPFZbk{?2uO?YcMkWPl2|!COh=W@{ceKc|iOuXn79eHz+Rv z8S+r>8iv-<4o;ucWC!mZdmumL2I>rk!CR=a7=+&TTqN4jo1Ci{h8G*VB|!Mrw2rQG zfP@`Z=cSsNW;!xA1%gPQJ8i9 z#G7-f4mE=$Y3QIGru zxH>3^Y#>8ebss4e#B3xZOo(aBusj;{mzl7zBJG1qzYyMtk($fWfi__ zttyzzwwRbFV+fPbbO%lg_Z=flnIf5G-+0I z;I9z>QWhpaO;d39<8y;ozMiU;xi|Rm$^|2pfpekBIW+=r<>*zLv3wXS?xd6&1wqz1 z2iLR%JgZmAh&BVZ9cca_N5H>lWmQNMSA!&0NLBG{8?V$!ijXQ6qSqa%dJ&%b(eoD! z=h{)vY8eYcIX@t26_B3?`9{`h>8X_!NNVOve zdzw7=Be_BqHIN!*C>wk|3+Ut@nmXw<8#C-iX+ohVvS{o-`3@n?&TBS)&qcc1LuA~c zriwWLHtIEZXN>wI#7v{Hcy|7zmxT)wf^n4*j1azR&TLj^CQe;@(F-8#{1lQ7RrYqdF&>vZGn=jY^*+*3&slphkda9JyM0+WLcIl8MclLy)8-1h@UTH#&*GP?f9uGC6nkrMF58k)y z;2onNLng1pF;ef3FD9Sm=kJkRN!$vt#wu zf0JAI-3z#ViMZuxW7vh|O)H(+Q^g_#eCl8--^4KY9eS#b$2L8C!WdagqSr)%(01YX z(8XivGI~sf7%6mDq>vhG!^|Xv?h1W0b|~(S9skT13W{2?89nI^4 z(YY>czv-s!uu96Y8z?k)bN1^-&*)J0{5dWxx1AVYUl@!o_}HH5W2%@IlkBhMT(btjV?wFFqHJVa;nNgk$y_rt_{GkZi2 zlb!B-x%4j&BkYav3;SVFAgB}53g$>BHjq|#JI&6yN|d=Xp}S& zIp(tz7{$6P&cwBGmYKKCQWF$9z&1YB8kI<@n~W#N}<^Z^_%CFP8QYiOdK}glE?Y zX30sV1f2mci|Yh-0$0=olzqqp+lbjyVa%-h70h&E)?_hr@NX48_w#R0Fqc016YflV zv{|Tml4Xp!^A+e{bec}c!18P{`kXAJHgB}DnkooP7~K_kG$IRk*DMos+&s8hL5`@O zmr+0ONEhzwlM~-lrwg+j1tE12n6FyDN9^Rfm5t1bDhNO0fnVN$Oljfu0<&lbBENNy z*li**?W6TPP?ri7amOBUr-gNdo|ngDL0`!6yG;Bos!_`xV?siTBF0Eao+fIJX5P;L z7nrSxS;`)<$HZl6mNIrBUyg#@E!|q7f}UUR5%-#ehCx=vO9i$1Mc8Bej>Uo~U65zJ zBf}sO1$Y8NrMH{BiP?7?XM4nbeD10d*bDar^eW22o&|Qlg|!#($1N7_0&oXRTxQ~p zDkri~j4D39M?7fJ8YdvVf+OS*H_sspIVq%iCG=U2K5U{xt+(H>-cb`3X1&9P^^Ti3 z!zgRBq=G(CziL_~O}Y%L=&*`XK-C4L%_VD`^B1<#X6YSV|JnFCp?8!ai zRf|Lq8q6+CS2<0u){6vhMQOiDX*gt^O)A*R^nsv5`r!~e9AYc5@(rfyuV zB@()cqirTS)XoPCJ4aYEqsG)O$Z403awTFc68mWNLD(~@_{bhH-omOz*+7^J9Ft^W zbYKkA05`;ODHhHKoN+?a#0ai#nuUx3GW?(=q7;pG?KF#MQpjmZ=q%1-hK05Tk2pdW za^!3inH4kMGj>5Wf@oNCQGmdcSr$2pY2&m(sOd%+4QNe7rSB25Eh^0l1iMhI^H>|w zhC*U(p-E`O+J>`I!76>2huR9kB@fBB^H8%FVDZKmt>7=`$a};keBy?YEHavjVuBpt zGM4B|aNt<+oMV#Kn1}wu<3?d=DB%Co^|&Xwq=+^S zYN;y;p*4iam0BPOBXnVmge|z-!UXI5v}O_o{TsW`X8?PJWBxJzO!$DB8)ZU_wLBJP z7(uY$)}lg}O-p_O?Ntl;573LkFn8iakJ$O@Cqh_@l*1N}ZG?Zfn^9q|Z3{&QqQW}U zFoFq2sD;LjBm|E%i@C{Q!oc}Qvf%hv4BT$x!Pdf*Fsn&?oyW%PCBteHq;pUsjKcOE ziG%%uxg5iZOe_mlBDWL)q3|2D&=@7yhiH>c@6h#j4;uAJihLU5Z0o{ z9y68xk4wu}ZGXe7Z+qq1C0gB%$`SwD^WN~E;3NO9o)z~J*ce^wYM+1VVcHd9IHoIa zj{n4#%_D+0ic{A9E8Xe}+g@?_PptcTRrQJTRR)K5{MW$zlrea7%lp^O>+SD8sF|1R zz7Fcu{yzUF{z3n*{BQYBbLvI+F7QQe`A^Yj0|Nte7bgYX+y1--i>^g&-vXJP$GkQ|O_$y2%I{DS|!rJW<*MW)jJYsHW?(N6C(dOkMd8$u-M!cdri+yj+JGQo(77KT6d*yYq&Sr<-sW125x$Tk^ zwVl-5c1elqq-<;Q+(RcRSTrhC*xfuXVl~^~j$A&YSm{|1A#XOXYtG zzUI4f`3)dLIGw;S$mu!4Iit5-61_KVyM#IyN_cIgN$0;2-R5X1>buSn^fup@R&$=6 z$9zeroo~(py4(3?i2?k~`CAsX%Q+IF)dSUIG>UqzXvF_pORtMpmIRgZ&NUVC&In~N zc?^Sjy`$6r2(3$2!*C^hMhRyNyZSFyzw8iTT(ayS@c!l3!{YvJ|6ih>R~n#w-K2u` zbzKGP{qYzG{#a|D{MNiU5<_5f^MKLP>s@&doX)$CQ=fpW>JxOIFn-_p-|2E*@Ah3s z=&D>VzZ&)Y()D$dluwCcLS0wx`pOrmHsaVSe?r$ol#(i6pqL$nQHrXZcWe~!0swy1 z|0od$S^FO)x{#qk#b?dy4eCHp$mU?v+P)+{D%mJB5OSl!hyQ~Us@vZkzyDRf|AE)h zLehZ2`z=1*;{657rLiFnns?0Le#30R9p^`8f#;&0TRL*v!%st$Pq}T~?cOOIRx)Dk z-QXs6>Zg_lMDhpUROI>{MStz89Q0p1G(q@_YEw)=?lewgGd*cd2o_m;_Z4%RvoE4=OD+QxQu~t1+KpF*^0we2N9yU`ehv(Z2ZYdhi1&8=P4#8JUkcu zJE6RD{oAOA`{MnN{sft3(RYr~6wOlhRF_4d`QJ43w*Zs;oR$O4^V`}9mcjV3msBth z>D;pPbLF@58Ow@&ADRBz`pTz&9T~wYaBAT6*wB`?y7-uXm{rz%u*6YfaBFxcbX%Jfb7=2i^vYsG()OkO=EX)Zebjr z)}wa4Y%XirNYP+aXA2&S)opw62rUmK(VPBlFX3wBJG6aAgB7+l=AA-f#q(2}5Kv3n-rFc13Im>$$H&i^f{OT+av zN~Vq26`{MIjtUB@ZmcA@`3=KFJ&)skl0y4{PWkT2>s)`sf|XXW8uk3Djdhda`4MW& zJIymLmEWfxK8C+y&_dtEsM~ox)I8VxrzScmPw|6N2mKZ_ekvh%t)AE0RW#TI*@L9> zw}3KqMs!eK&bMkvzQ1w`=DiCOoHi65&FQdY`Y8NSvXqr${K#owrH_;@$Sd}}98`Q4 zBv~|89)e%1kZ*#zakZ?~g{ybkIfwunu~gyOef7rLrH*R1h5ND6Fc}nAki4(R(Cw8m zx{Wcab8u8W+|-b6Z-?sktDxz&y*Aq8?gbqV_~buS^ew5mBIU1nCbp&+X5pG zMh9=8C|XMXeKayROeBa(RKvp)nXo!2Xw-gwE+#&>PmRzsY#Uru?F6zcLGyY`jem4@ z@r_BhDrS%y+l!~;s7HPRF3Wg;o8Zs@kJ{b|G{VThbvXxNMGEe3Q#^64w*34UNCa3xVC3d)o39Jrc&x@+n;#Xe zVMg33`c4Gb@dK~}nYn~(6D{Qr=2Cc$xJ3C2#n+{->T6xq9~;WzoF#1!k7^4)J;O_n z&mOFMkyeg`#Cb1z`x^`WZ{A@I{c!0u|M!CagzvDVkIg;gFM|H&l2*%C65+le=F%vp z0-5Cd!4)0jE4p+9)q&v|(<4{RW!&~CQFtfq;5}FBM7jU%Mc*NPy?I@{H^nUCd-}o5 z|GTZv@9N1Q)4405u;EN0Kocv8u)kR%*^kLK| zr;6v%`s8Twce)s-iwU}zsEcpuVzMs&Mi(dR;uKv>)x~rjUs>zo+q(FQF219Sr*wQ1 zt&6|V#b4^;tGf7_F21gdZ|L}-d!_@QYJlx5u+_yQ8DftVjnACtJ1zix0n#p_U4XeP z+KG06!981=CH}m?(GP4tbR9tJ|9{i-1{ORpM$a2taFzqF^r1l}G~gB_9bMXT(GiVL zgKkBHtF=n+6Klv>)q5gppBG0GYt3X#j^B)lxPB@EA05 z_YCy2(XQfp0Bs0u7)=CBL9?O7qb13cMSYe7?~bAAbguDbDZ>$=2x5eiD#oBiDAD2> zOr22sQiPkaKTd+=GhOt6DbzoVQ4=n+fyZYMVc~ilxa+$3xh@8D(GBD@v>9kwXdbjC zv`uIW(R^qfXq(YCfng{5F0>-FZnR!7t3+Rg)&;x^{h%)H1z5zT8z2R}4J`sK1}z>f z2`vRJ4Q)2sr@FWVT@IQPtq`pm?I_szz+xZz{b(JyK7f8R`h)1VqCbSb6MeUQs{^mY zVY3CWnT~y*;fTjL9yUxui-#Tm{+=JVvu+Tv3n6s?8V;ciqgg>Pe$UTw;4M5fmY7#_hQ9t+0GWqGm#DKY`>Dqrq6WDR#cXe%nFr6_J;&EGt#jT@b{+!5bY>b zUSc^?D*Nzubde615-aUvsq6ro&JMCzwu>dO-E6L-Ln&r1WwKbUB%;kiv$K!vEJjT= z!Hw*mne6^#Af_6~1a?+Q1~LxA=uvPiz*EI4#lf~DJ9aDS;u7eYCMSrymB~_$9LtKN zSXL?}GN+7Prc80{r6%q1l_hLmV9nhfeY+2fNr@ng}B7&Xx# zn#$&SKHWvXgLA zsY=tL*=-KCcnX_7-;t$8I&$EkBxx3q(T-BJjP=5=AI?M<>8J*+C`GbO(sbtI>rHfc z)cN?RJDE+Bra;D2Oe;{a?h zHBqFFOmP6FsJ2W&!${UCEk=ws3y=@m3+i-s2G%sROF&+wxJ_ln32b>Bz9>&%J7L5yQ%u1! zreLDMDcLcE>EJX3;l#-&W#HOCPIg3STug+PY9hHkQ?z7!b8OHgI8wBk_(GTro{8D! z^3sVBE6HHX6WGrZSeYFp3GBIO-YrjM6$x;HF>jT@Xq_WVTYwLMli4omR`%RtRu;!D zs8ay}9wxG^RH)_R^WCKoHw7|M+49Nkx%uq5+W|~wt6-dDhYMP#Xm&@FMwUz;zkY|K zLyHtUv_w%%5nnM{`DPg$hOWQa{Qa^np2cJN9mBV3r-3Au<-Y3`m)R|DXXRBw*9W%F_YOkkbh+PXYHtVCSj@{Awyo zkRw@QBx#!g&0^(9=$j5blEKLVO_EhF(`EUZ8mp?L-xRi%^O?`m<#b0R=>ljZS~UJf zgPUEQ3m$ehi)2UZYz=r%VVQDaYf^JQy399GHdm()vGLo63Mq_a8K3slvBSjd`8@@0}f1sr9}$%o|kYN%?rmJ+4rbf!^cQSU?E_^$(Oc0JFt`dab zMX$wU?9_GmnvKoG^MU~Xo!;1!niaS#N$xH7jII(M>I`;DGeawkDYMgNF^=zq9s=`D!sC?2^sZha3jIX>*cwH40n zND5-I8<1EgB!T*MP^Ymj%|o~}2Gc=U91~K2`xId{jWsDgr3%0VRhY)Aw6nNOWWo%F zyDcUxVGeSTlT|U=9o?)?ikD}|2j!j009nlmP>)_|n`W=H@3Zf>AFv;^56JjIFzqrQ zKEhTVLJ=IhS0Au-+Pmz#NsUTY$_jylp-Nei4PWZ2aup(AGo~V1DnZ{wuxd!{0n8x_ zRgiOl=DM-rIx!cu!S4O2BZl}p93UT7d$M@)@eIvyFl5zL1G+yqzx!!N!fNPGuU!CpXM4IfTVKsK`ub_S5-NTGvm(z9&U zwxhOg`(gWKMq6|<+sY#BIrc1~-O4s&Fn|LPzw#<1NGH%afJ|Y+Ru)TU?LunsNFCCU z)S(TND*(^RRqUPNPd< zm?_c>1-|cR7bFK*4x^7oFG^Vi7MAe8ISSs|%#gArr*-iGc_UjIR*MKC?2<|qWKSp3 zTeq}R+J(&6Bkh$c6?}hPBvtc;ZF2_nUtcdC7Vnef49=7 zY_;`B_p8G^QxdBOa7`Jr2mif?w6Im`1bfQUO)63=W_LpHXy#rb{Ra9G&5;Liu}hkv zRgpPPNy+KJ z-m}tx<=cx=kCLJuS9fVM^!>=h zV?cXRVGLvDeq}Gt;9*QWpzLG^WLyqN2XSdrFk?VEgq(LlajIGR908_5&}jR#4pJ>1 zo?TDQiI?Nm4YYuGxz^}5lQQvgmfRz6Rq*@$csV>l_sE^3eY{*LS0Qir$X&!R1sC09 zfiyrpu+2^yOp{$m>>jy}SWlC8k#T2m1Csg3cnyTfmM<-aeoJ7~E_owCisVM>D&=OQ z}2PAqwXG@@`tdL3sdQ@DIy9w8n$-S$Qul;Sf&4lkyo1 z&&hoVPRyju(kow<9>qG2%V)G4TR(da37}WLD(_Wy>V=<|{icN`7`m`cGHwi}~Q6wqZ2-Js&U7E7p=pHt@ zqolQvt(5W!*~$(AFHz3%-P%WLS7Nn?k!C4H3H$3Pk`GK!t#n|k^(!X{ z=LRj#eIzCPt^yWTHrY1Ydx^}=XZe&f#Fhp=oXs;RQxUhzir^5sl^$iEvR^p>qN_Bg zTiJ`t3t$e`-GCqD>I@Kzot$t!IrO+Pr0+%f2YV^g)FVH{J`S(HzDeu4pgdx9-!i(h z+|mQe66trq4k^QY)gltRU{hzS*{Y&Kg%~vjKRTYK+Kj<8b%yFxBUB1-HA`KHBh{(S zq7q?->cPQ24OPHy&8E-Refpy$CrkY{bqm$+QkSDXMhZLCL)uSh>{K5&x_Fh+WD*H? z@se=~j|Z2!M0y2uo6tYY`!tnYwjXL>LO1k;CcBUcPO81?8598@f&D&pmtMtPx=%gF zUc$Wn>YqsNLA6^u@|1aTn3p9q?ss#iJJ5%O0k%LtT`ux%f0UAq%xitxDsyL7}!u+pLx9hxBv$c~s5uwhnBE zkCE0Z@hhzh+C}ZSei!=BMg3RvIHmgWrRJWeh&S`y|d>G_gQS1wwL3~_0 z$rZY+brS!rU^b);Yq!(vt*Ck!7P?p4uN}goBVkv%`Y9m~Y3JA{=nrdqXn0h+h^Hvn z$C@f*qh8dip!^~Gk)L2rzm}yxNkskHQ`8M;KOkR`+Lxt0xEj`mZ5JgKC{h2PL?P-w zG`enX-JRruBt1*tMLMSGGZ1}Q`qM;`r9WeIJ={$`eJ}R}F9h}xb*b*wJ$jSAp9YmE z58Mdce)byXy3xM{@lE<{+d(eqF#YY+t9fYc0y>7W>TbQ8$Lel9mh|4M@3bA~LdkX|~xYd7gyWLWJ8J z=u2(GT)e13{3cX;_`hA*&f8)%+9UBaZ!c=Z zBqH9Ai$id%gP$C>bGCSUp}ohR#!07XSj{;E^kv&s+puj0P3XgAKL#k!aMtv3RFS>f zKAVu|ff@pm!XGh1)2i)<>^~!i4%wcg>Je=0E_;(bn@d_*q2xrIkcL1`!v9u z#4-sNv+Y^fQ7?l@8fs7-{S12%pI=JUIh>ZsHvZe zzRB+9d^|+3*-o|lCJyispobUx*yY$VRPrCPcM$T7{ktM+sS;h7!_t&Yb%v5D&rp`) zXU9tgVUCccBXHG6^CA_ zWU@*nKTxTxLGMMs1O3y1A|;6hN);yyxRh(Ua81~xOtm*D#SWiRtNN602R5NKp?Q?Y zfO`VCCmbH-3BZ2<_zwX8q0pf`vp%tvZB-KOyOgK(UCQqQyOiA$E+S-H^~ksqmB3b| zR0(w9kFZ;5h3+U3qV0Q?1?oO!vA$1P8|YEK8Q9Mkt{zh6%LkSD=nDdejfEe@!jEI& zCsBq8bL3tu`V1D`t26}8pq*8o%E13n>YS3UUsaZ?SCxuDzp_U~70d!xl@10-hZH!c zT#y6!T{9xJRTx$xRZ)$!D{8u+s0#u%b%8#tlmtYzBrvS318$vtSZT(%IS`>fj1%t# z^e+TrRA|tOyO)GF1XSAkch`lCR#A=w4V zZuK_1ORWpI(LCx_mX#{B#x|+TaaL{&py46QgTf~Daa{k5nz~iZX7;TrT)kDTWcJPK zE~al*Bcy;&6=fhqIj~v9OSjE9-vM)~n6*z0bQzlLRCQ$2$++FG2<$}Ltv*Ex_CUeC zP;jrhG_X%yieq@GzE52j=uw{z>_t8w2gsb_2Ga`dpMwI z-^7y((r#{ymWx7Vt)8T93B+jM3Z!W37eKo-?RI^d)}T()d{Q8d{$y$E5o590+6p~K zYgKc!j{@0fh1&W#09R@EtJT_1kPd7tP^EQXPigR?ARq|{NCC{FO%AxV>47E!N8>nF aRiCCZpOzljr0ofGXsIB^(^~u$T>l5ncAKmK literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXReg.dcu b/official/2.2.2+2.4.2/SpTBXLib/Lib/D12/SpTBXReg.dcu new file mode 100644 index 0000000000000000000000000000000000000000..3070270daec47653621c60e270c144d4d04926ad GIT binary patch literal 11462 zcmb_gdw3K@wy&=043lBwK z^6d*Oo}kYrQ+}T8%XPYKA1=+w$KH`3*F?N`u2=FGf>C5QSepC+xd9=h7%a{u@*D@S z$RQTjOFrkeTPHb&ReGH6fb4tfhvdhVf3ucT-XYm!`<%Mp$hJUkp#y+okJ}&c1#JPR z$1NY8a@}BxMY6-=lS^b>(Loi{uCzE?UR)05B)3ggs7kC=8>;l4pycwOTM(xx*Kn*% z4$PGN^~D~$e4Yy8xxnhN1bj}na)F{L9JNRexma?!N*ismmwNlJ0i8;meyb_t-A)_0 ztGdUaVKl3X?2BIS*sF-8jm`j_1Vyy^g7UowH}oimS+ZLR)H5`xpw#UT`s4v-W@NgK zD8_A0zEENqVD(hqL3Q>Y>g?ABDD*4u7yVDRrcmhfNlnEr-=(LXPEleD)FjPtx*^F; z-3z_@6=R{_?^N8foqF$xvX)hsmjqKf9th_U=1?!IGc<=$MLtpZO;e7j|>!DSsw%%!5=C#>}K{1!RS@x9ZnS5IAxbf%PL3W4JZTBqpgH>oS z6EbZ$Ox9vggBR-79a#Br>mDUJ+|GqK?7H;3KWwlniLmyZuwtO(wNCy|sz%IF;&hxQ zSoSL&OP^C>IXK%>Zu7X8AMH-C*^RJR0zQw64Q_(n0PHYW8UOQtS1wedBo}Be&Y%5HNNR+(rQWl6rqdl5107&s$WC>@$p%)8 zv{Gmcw@*FvR=9N}>l!m?miZ)az0;;8tGq#(1u?6cD{)FLkD^LUP~+eaogok^Ni#gK z|CGoLuux`sB)cUb1?1(HA8H)&*2~bo{N%5cXuAs*oK)wMmwY`Us9ejlrKh&k?hJT* zEnmG+XS2tsW2q1wUKtHW*}_z@TuLf^9Dj-EV$I z8Fhsa%BZ|SQe^*=AcwLCA7~8Jff!wxB6~(meiC*JYY}Y-`)|*6#6rUotZR_nL5e-( z$j*Wtk&jNHTv)foo}fEmxUuY4kk89yRA(3!#nLF$;3)QVcU-q4aR9`YqwUVe?p2Ib zmuj6@H-0Hpb7V&?)@jsc!axb^TLlzO9tcDH#S+`+ucgw_S4dfQ%H4LkF%=XX#&UIV zzwg^$McM2LkgpOy6gc>!&MVCv%?w5SDzvBPzzml92rRd>QMLsGGQ5ZDzDoY|bC$VC zIi!xtzNRwj)gUsK+7nbEj^{)h@#(iWuXDs{y{Hqg?ivgeo;wP!#et@%@HjOQ&rNXk z?%t)DpkBn+9Cd)r!c$AO-fy!D8pz9zW%3g zz8*6L4!l{p-I1Vq5?&*vqtkPhMDAf2&-$VFLB}H}=Ew|L>;#d;puw&S!iTI)HO!k_OC-OBSaORAGy%ZN(p9AWn&C0Ws2#Y-sw&=Q|zBHCn)tf_>R#yLhJ9rW|zJsq=pAJ(&0M zm+g9{22)60`5L_P)PlE4b?milRvmyQ>>w$>+Y_h6XhW;eCHDqNuV$%E8|v#vFW_a^5CrcJpN^V&_wP;JT z0uIGax+&yD?GW^t*U|W6D=oaPs1|+EGaFlWJY>=9YJg-#^TI7WRTi(y35DV_OYPhB zRB`Z!sp~G;?1{`Xy8G#ioNiazQX7EhuGqd?A9H{tVZn;wJV-5ftOkawd1cF_v)B2G zV%Cz$kgZ3`Vz{Tp^|EbIk*9IlOHsMHryO)F|N22*|5cLR=_v{Z0v>m;`AJ+2N1B*iED>4tiq zyil#HN8lfQ82SSb&FYgNG|6Y!l)pd^jf36yT>FAUOB0*e8~!x>RXt4%F+JQJ%WbiJ z1=19^&G(pYi-SMjS9y}JD3%T;Saehxrmv_lJbUY{H8#7M&A$2)W;3R3*%Yb%`9qh! zWmDj$cmMJlx36Z4qJnYVbGrR7eBzVfdG58v>vU7q)8ubuy4M^${NeNKxgzW>bsh-s z-ygK(>53eTwM=@LFF1OZ2E8v%JfEpAI1SsoYx%wU4nV6)!(UIkVQqK^h!Fh#toRLg zfO<(+vK%vKvF-o|XCBW!$Srg4sq!_Jm4|f8k%9}?*I#F|$Ei7P3{X2BA4{{g`q?H- z;l#%#H0Y~eN6$Nquk!(Cz#WHY;<~iMx9bB&3h>z-Pw@`SiWd8}A4j+A9U=vf9JmMz zSM^XmUBdSZcDUBg8DVhKmc)hnJcr@trZYQj_TenXijwk*s%pA@XuSc@Zv3BhzBf_t z9fmue-1!h+R?wBYOEX&YK=B!USw-N}sxpfB)&xe>lMd~0{&&`VeQO#Z`N%UlWRs)l zcEvIuWu@%NE@1WP+w#I6h(udn#09$&TH!0T6AQ#yV7B>`BMgBKUTY+LbO+5%fzpqz|KC0HFnfv0tVO7NEv6=|VYB(?{t-F{OuX zS=zyenN+tY_6YzY^<0006G>6)Hf_idEwal2W;YmM1o%z?eY1Mfg&EXC6W9c5GT1f> z8R9S)WkY|Kk>7~G4*hL5m%NAs;2H7T@6}fOA83@H^7^$SM z3>jhY@p#63V>dylWW@wjd6LBUp-hx3Qm;EO!Wp8lZlf?=bHP?Z`)rH@D@)`0`}-e! zrhr;>?VmEA(*NUMBgo)$@m2qKWyy#z#;_~lu!DL+pfWM^vf^jv7(tWfDW z)(ZU{xR9}bZv9JwjxFB@Sq`n<2wgZ9A$?Elk-SP9UNhSjTK+!tQ_c3wY3+}DI5#j3i2qz@ zX$keU`i!b?xhYi2S+Jt9rDsAGb6ceufMp%CLe-ja3OBY@Hij(swN>8NUwUdzT3T+4GH4RtcJQ~KHTgivU{J=7T*0TOk*mX5$kRTPPa zdcL!29n`4L%x=AKU*U`?pKvqpsrUdxX+sLZo>)9PxVN=Gkgz*bK&ZU{enM}mzVT!T zfbnRwJe+|%)YNvOw?FLIvhSAF1<&+MCpRQ7{`N%?BgkXF0phSC3-ZEm5mM`#%Z7uD zORUHPe=byqBt*|1mgapf=>7_@=tY6K!JKasGgVrWDRRch88c_%Ig`YhWX_~=CY>|7 z!7Pqsb7mrErgG*c&P?M>0cT1$Gm|s3I8(_Pb<)~OGUsz-0cRF+#?F~~&bT<^%}Ooiny=^P|mN2;2!~gRZAunhfAF+u2zMVOgS1c6)l-p zN;I!Vw0SUc>1r6c399cGd(wC{jO@D_MlM|qBh%ph{EKrExEe;DzZyn9 zy&6VRjaMNj3$KQe=dXs569bH>?~?G8|I&8zzO}Fs+|>#DvbM*=aQZ$zAI(Be*v08T zE{_F%Hj>d|lpdj%j>=I0Q2J#&tPAJJL3J%C2v!?F-woX0eUpdmE5rMTzE>m|(F1hw z{?`rBzX~E!P(Ac5gf|rB-7F3X*}$KH)_BZGL)e-HKGZ=k*APAo9m66R*^SCzJP%~R zJ4FAX#w})V*P&yFd&Qu6w=#bR&(}3W^eIJl@HH^NL!OtRNTZN!6wF2;)+mfJ3aLgR-YASQ3h72+r4ep(Mq#f}*k=?D7==fS!lOoE zMYb6(U_v*^1w%%mW32finT&6W7cP=9_|CDyMibtYiXB zw_}NujEZ{4gl8oJ7cT%en{u)E9x?`KA`TL>E@v&KGZrkEm=!P&G#=juL$sUo#CV}9 z7C>{vI#LI8pdGQTRMjXaH^!Jo)f^l_-3ZC^Q3CK@x>;6NOd4J`T@Q@N9u+2Rwg) z=T&%u@a%`@5Ii5ia~z&-c+SEz4!U0ingdjTCmNnScnZn&LY`>C3rs>GP8Q1HnTsdl zyG_FP6YxUzdv`3=5WY9z!zSTJhQhCg{>ab^4253}y};0)7z)1{`V&L@7z)1{+Q-l+ z%wS41JPI>Gj4Gf+6U3;38dX4vCa6&b351!VL=z+sW-3J$P@)M^RKW<<6eXHq1ZF+b zQ~@QLAWaoitEMQ?1l5G~s8t1&Xo6ZQFhi-DgpW43d9*+c?$z&sO zB2G1o`P`5hn^Xm}TZLn>h;J0LaW=jg--yK?Y&Kw{IM&o9CL3ZC&x(fM;Hh}3IQDA( zf}`pDPuv;1#(=93UW%;;G5RgufY7(%W8?5{c%#Fg0g1ij&+SHpftcuTJFIy#>Z%au ziq&F`SSxl=w5tPy;`hhk!wWKq-=BIFcN2`!sXP&h_{R)#ksuMp;Arv|GWU`gd=MYU zC-GT)9{QqqkW9kUaUm|n6h}-Zgyaunwo2fJnpad$-U_DgX;~?Eir4$??A|o0H{hILOIE9Wnp81ld zvebd=sqT1u2+v;veow+#H1tV$!wW#B;|2UN0o7qpu3x~V`~@#YRjwi~)^;v~q_OK3HyY7OKC(4*}Jaso6?1N{aNS}QYY7#Hyal;n_yRI-4Q zeDc0ZBq&aI)WQ|7GYxG%-Zqw*aM$5@=jozctH#7>X49u33BaBv%&op{cqo*~R!G^CO=UIC$ z8PD2tNw3z9(%O?WIvrLR)Cs8(??y>bDWrkiPgaqq$PV%;hQDZd*$eS<_Z{vh~#1j?S`$H4pJB!*DF z8{#-iMlk*&=>-Swru74RikK$mh||S|$k?def&?)`oFo>4 z*Aa~rrj-H)GQ_#e@^~;cNvvUfJ{T<&Tj(g^O)o>81sDRBf>T^O^&(k15qT%~l6gi! zoM#ZkxwtPzEGLE-u`Q~vm+Xw{%Md$^$eTD$oM;#)uI|eb*P3#~w}4(SO%hA7AxGSe gp*4;`b2n=|RXd>sBZ0_6T6~koghVsRkOu@S;*d;+K*+?*j6$zb zxPg{} z{XU<+Z8+zwwf5R;t-bczd#}CEnF};6XUjbnt@PHfU-;NS*7r24tFEKIq_J*QYkTD6 zfy?gHw2M1(i;AwQ3&%Q}f>*_nMIC|2yIr#`)S4Z2Ya`L%YE9ExG8)=jo5Ib(x@c!> zd#L6|OMlzqh#2=Fdqrz#1?aSpttxyy-L$wCw<_{?@4fre7H4Uov$?fB&{o;^_7yFu zCE;*eFwp+#m+ua?q*k^^gP~w&+FdQXT2kw4mahypMW4R-)8B+r$^&hYVC2QELm_*8 zXDoOf-DOIOBJZ^^ppRaa6$*`0um!pXGy_a=p$48qe@Kl<^dc&dz)wgn=QkDppKwI$UbZiO3k-u<`SJ6h~iQ|m*Q%?df{ zTE7vjX(4SwcJG?jDBn4%g6*NG@HprE#SjpH#;o064mrw#ZNX@esnQuE0GHLga#zS! z+1^B$mNb8Hd!&^rIk_=)R*Q?Czyz)xSh@TbNLD3SzIbx0HDoUhcdTWGY0Quwe>hgZ zI3)NNH#gS?Th9CV#|uIkjIR$1Oa0^?TYpFv2}I`{zVNb{Fcb+()?{P8Q`=aB+6Yz} zh+bY$bSZdH-AsY2eRAF_Avc4-mIVIJ_kQ)FtSG^@qFe$`k@Axpt_{)6-W`kFp|rYS)YK|MQ3GbPd?_FHB3BajI#Bt; z|CauMQsGOx7ld-=d)p(i&R{~QDWB5zsw^lP^2UK%{|#0pPSgEZVw6=1IErD z5wKQVMGbtvPG-Zh1*)2OFCnb z6^@*Bwh&u|YX0s1_RB+=h^|7sn$D1SP081<`${Mi-N6KV{KTJr+TyIQ3Wv(W?a}?7 zw})HO>+6GS5TX%^n)cuJcAzDtY;jGk(7;jUFRm^2v5%)$l`ktVF7?(`Ug>q;_~%)n zG*lhz;eVis{N8FdtGf=NyU8qYT3P+F>YCE3 zO8<mRd1Spaye%a(boKvGv(H{9J z6BnAlln#FHJC}!CsC<#I(+*O^iRZY=Zak4ImehKSuQ*8fY(V_Q^%ZgJKZYi8)wHxk zf>AQ%#CuBLf$=*7*Rw6NOPgPhKQ8X88v9`=y)r_S-qjt^wHsf~zBe>pYUEuLh3|6r zn=`w3@Z8`{qoWpYANtn9mb7}d0ES_9BL~qHgFKG+5H7HY3vnty&M9Stl3X;~?| zeTD&`)*IfxZv%NZ78ntDHy3e|IlRrG;J0irLsm&y?Xue9$~tdZWp%Z;R@5E`A`;4I zky=u|j3UVa?&x@^t0}LaF&Umdew2=0E#pH;Fx1-a4@6gRM@#j#HyaNa1SrapIt1gc z=d4{&y^MU|X{v>W4u5C32@|ExU?kGMF!kr5EWmu>=2%-$OtjDZc4K?U5sL&n=gjW> zd}~*7q0cV+$`6{Foj#Nggn~3eh8&B1%ZmMeijf#~B<2s7%$*R*0LEKeT<0yhVnKD; z0A#?}%0n}k#Hi#)kZi?TusynO!FSI?am;5hS&p>19{Lv0;;9N0Z~t)PyBL7!w(sA+ z_x%TtBRWv%x*K&rZ@FAtq*VqS!`5h50p?+A8ATZ56m zg|@$d)ls~9P(oSA_5H|5l<%~U@+l*k==w)7LF7NU*1DNWfg<}D+EZ?Vgi)#(7@_=c z38z{sQdAWVG}F2SGxy+Yr$)U_DCKeSQV=>ASiS#r$lnn%!!RAqO5PxlYR*Uz&BE%# zB*5=ah3F?lTxd~3RDR&ps5c1}H=DHnTLjH9#RX~P`tXM`WQeAq$hGI+n!XzPQao~v zX!#d@xD|6p69L&X*!&8CCz`+<>sp%vlsWn}A#+T~+F$_9kFNP!!i+UxATqV*eu7Uj z!9{nj#n=*wcCI~;jK-X%mHK;aupOn}B=mSw>BXI`G8X(Hx#YrFuyZX>gdIr%ke~U8__3JAtuvPi9FsHdDIt;^t`!5qzDrL0pCY( zM-dN@KU>sw6n%v2m)$t+zaGC3s|yApIt+gwk8bf;8(fV}lwl%3z!@R}vm*-C-y`dr zJxY$6?*oom0VazL(bhJe6{IzEV5}|0L`h%2_v@i7OuRb-O;PHX16eU?MD1I^TLS`y=Dw&f}#%Oi-v2KW691x31<2+?-y9gw&opj(lSi zR_?$BqGxsg=Zm3qu&NKkqcNd);{2cfLW$Yho**V1vJL}N(+c?Eo)5o^X;v98Ov9Z> zrNAvBQ{MiM@u4%3HKbW-eJ4@_m>$ry4ej5$8vUu04U|U1Re5V?BzoH~27Vt(ZwVND zctVZTKznmF1pV=g=e!zX>e9AwB)B;HZ+{NCDBD^Ld}|xhqW9t%wl`Ie#CPjz*$z_Q zUw*f0KH70XXP{$6YZK=`9O!CT1Xlj3=?6%mmj>Fe3q&rv?9s1wl#; zUx29@ExjF6LAp#=>afqVMO1(wf>zqV45~ z41d!DUxm$xMO}1lTk!QY$L8rjCZd;p6KaGqq_N;|aE+fn z99u&6k~#ieux%(qpz6a+$rSF&W<)ay`Te_h>}auLWNQCljrSo4gF8~3$#d?yvRHzY zDB}r~twe#dv{4kjjf62wO%P0S+k*EH*pOQ!2mUhwCQ<}<5X@le54Wv_rw6wZ)UB$j z3OB8~GofrldmCUsN}!^3)@FiWhe9~j>$VL&kU=~Y3ENfppZ+c8DiQ|O{H<$(ZK4Oy z01gWU6Qt+vo4Z1(9W8TaFK>-bT(Bt{D-h}Y3$N-t4|+>RWHxrTJmNpj1g>iew3AA+ z36Z5#B1J>t_Pa>lRJeItplKBv?E-pOyaN3jz2jmUMTH0Rk~-WJrnbs< zj0dgPVVjIM$O!crp`fD)^aldP{SQkY?20r+?}cQDR5As@k;++L+}^Yz+!^`W!C&_v z42Y*IV6GEao-q{wSWeP^e9iIq(bV$k`V-Rvn3l!SMZ)66h;Eo;1)IzMJ@Y17{KYBy z&;R{AG+!JL4?@26Acn__gm^8K=I&1!MBz`1R82#rBYcVjQ2?VJCZaH`HBRo0d z+=_q|aTjI4A7Z!sBjgCIqIpWpp8I4dHL!|jHUCBrDS=h>;f^(Q>kOqDV1b{1S4@M5mM5E^m5XBLXt^j1(m?j z{2F1)&OHPR9Ud};Bbjbz6}sEB`%*12ZYS=9fM(9{uU00m*O z8$bglyH+~V8mlE>>z^;!PtFjBbUi(BDrQA-fQ&`Yr`EKQo}v!H?(D~cM`0xsEgD1w z^2n>8PsG8*68AE2O~KTLHT5fkt7#W9G>+^qQt=F}lWt^W%CkRr*b;w%%oYPSRsHhP+rwpd|mKQfv)qBf0 zk>ny!HPX<)$UvFfWu*;^*X?NDMOVm{OFL$v(k?S!NN~SJ~(-6TlZp zj&TG;MwC*83c*a$!Iz;WHH|FsnA%afjwA4B3^Kuh(}O}XPQGW9;uJ%oWtz7FZ>|yflyjQB*-Nq zXU~7^^QNFfJdoRD@NHeN^SaiiVC2(D6H?)#39vVgYheXz_O`*@+M^Ff_Fay}Qm`b3 zkkX!a*4{s0J(^I8dKLq;GbW^lTv23)S1%8vd!IwZC|ZGKX|Qu9JvpK{6VM*}D(;(t zDKt3CUM9K<0b0*_{A226aY)r?w=F;tCJvw)iIlti{S`0vHU;fIOrfDAdP@D;4&>d# z6dTg~l=!2kuA2{Ooa9x2n-1L>NdSCj(xSIuT7^INPJKTf!3?J)TEbPIbUz^ouLt#H8!POMhj4{_Hi!9ZkV8d@4px=J@0c3!Oss zL@ZXwY~CU??K`GodyMwxXg{)PuIc2>I!#-)eim}W zb^f|5D$%`*s~320*0jgcwAr_7+S8ZX^K*RO>V{?h8h?Yoq`35o1+_H|)ny=|uz(Xr zWAn$D2(WwPt*rz0C4tS!&x&I?OaS+5ft!#&DG8UrzfVx*=4Z#L7GPJyTMHJi3*;I3 znQ=s5A4&#Zh%$+E=Zwp`w)Khuml9yL|pi8597fAONs6Kb61;9Dq?Q0?eN8 zCYTD;Kv19q!U63}2vLaQIB-rBDlIV=GHP%ULPR5TB@8a9toIfB%~g!`m5KoCE3Uo5 zC}l9qF{4c)8nS1BproOy%3E&~HpCxe;7lbA1yUoc+G+U+X*Rwd-LeJVmG1&fx-P(* z1Q40JD8wZG5n*e`Az^(aCz!zYROboUQ zpgrFOU_<+=_VD!t{+R$f@|~!wsSJw}0MGjDTWQ;f@fZaRVCLixvLaQJ2&+K?PZeNCema3ENDA_E1>BiGj^H&N!S;Hbb6Xzhq%=Cp zO&54qej4GGDCY^NTSCJfu@2DA7SPQ645Fpzffy@` zAh`%DvmO@-OpdSxP30J~ptF^#x>R5%2yA^|d3=5VY_Y)R=4VoMz)GEfDif$PgdO7W z1pz$19|?q2AS%L9<_N@5fe<|^;>YP3rvF5MMURTew+%1gb#7ku5WE z{9KT@xbt_Egqzo*+<#vgd;MOHDkukFCnhx!!2cxRh$;l9#VmmD37~yiX1#F^md5x^ zn&zH%eae<;*iN9svsJP7KpoaLs|ho!??-oRordiub*z>$q`cD^k!9~+c=L7JrXfG9 zD0m5_u(7ruzjV(uWT6wWn3I6{ikBY0?E7XU)(BBmvgOh1=ifW+?0Cs|&74^BVzsvx zOfv2|e$)NuoMlwt!?9BwbHq|PUf@rf_QCN*xBlRgto(7M1|^o%LRJ{Ze&Sno4?3-v zO|xD&3ruf0x%I^#os$!%P2kn_+@`<&=)SD4!t$`t7?hcfGM9h7>N^jgGojAlFPMup z6C}9c>A|X`ELQS<~snH{WSvpNq{hlBj2*1ZEeR2TCoF>-nHV+$Eb9=LSQ)# zc&313R138=%K`AC!A+MxPP7idU^dgZEDo*=%dO&zfE@-WEG6EJIjdQ(RoMSjV7wtzzs30HjQ3WOuy)fA<4IGsHP zANzY}J-I{hjz%l$eN}*^3YaxN3#9Bx)X@aaC2)4(&geF^VK@@f{l%1KL~Au2uleJ4 z)q$vA(L@~Z!@KWU@)W~`c>`<1G4k;5yuQ-*7*fpgXy%9^SSS*3*--S8KkuD7b_ACQijNz<(tre-IXhD@~||Hr+r zX{xPwg+zQ&CY<*~_5K7+e1Uf4d^%CeyJ23z8wr|79Lg=GLyXoGFU*q7D7D% zgy(&yp;TLL-=gJN>cMJ@xxf}jQ$bc;2Uhg)p%6tH27fg}%X8*zHE5y1)?@ijUtkTL z6OKT7*w&Km$?k}JgVPUcgAs&d2Rv?oxkr}7T3QHn$m0Ttk|+cLpxB5ZwR*;y z;bNx|7?-wny{pUBQ~+Nk`$`EZltaS6N$)o8?QEEUBpeH4I`UGA35lYPp~)%5lCgv>PmcqhbgEDs zkB$Ix{=$$3<2V2ZSMa5m}ec&$Wl>=|PX1D>8w$c+#YV z!tR^4&Ptz=-n6p7t%4>ws>PbEX%E?8{X7YRn#g(Xtc`C!LA+J1I{#0 zQnL&tw8UV7Qw#G$P-j72x|E7$E~xNvhtXyP;XnopHzxZ&3M=2|=_2>%Ll|F&Q;i;x zV7dX1wS=PH^7lO{#F_25!(%B0tg#;+O;N4Uxpi&&>h!H$>DQ)jU7sFHXD>|9x8sh9 z*Jw*@eX79_eR zJEF_%n(VB}=7o^Tya+7`hCJjMR~B2ndTrd3Rp03wfl>Cjb?d9?zaGVy?!bTDu03iW zX-wDuz?dC|)e<~rg#k`5<~7oo(9qeKXRWM4+pTfrxj3a>Nrxf2vbE?kH0`)E^)%)~_xouVjBt;jQBk~3tz zNCSyORPp5vot65a}-QA8vf zaH0tgjw1hf_v&wIGg8Q0a#D$bgM*AiSqr9f9rIYKaIG3(j}r^VFfE6{f{yXXT2mN< z8Bt?G%`h7cM)QT)WN9G?$`5AETBZGfgpL#NJz!l|L zO6Y2qrV$OBR@YHQJugUWm6W_0-_vfU!lvr;9L1~Y00VO|>C&hPOM|7T!tD`NfGZX^ z{L&3uh&;V#!aJ8~k64LydOb1+@|YEP0+LpOV~|Wr&(6G5913Z|6r5@_JcCI+PKlaL zI5c$`UF{xAIb9(Ld7>MFEubs#C3Ma9SZk?Mx^q3&1$^Vd0M9oCSg+M}_*&N(lD_xt z1;5tvN0k)gX@aCylWDS(1hv*uJb)@pV}y$!L*e#y|V|^DWvM45o>kspW|g z)#5R;5FsosTSd6D^&4o|yI;R0Ps8id3G!(p+VKfaZF1j1Tqx!qR?Bdul|rdDcd5^r1ZK622J(WcF0FmBF7v!A=_b$Pq9* zVb!WoYolL2)YC(Se5j>|`SPKJ9_Hm`s)>HQ?93z}^C(CHGA~aOka_0jWn*>P#IO0u zZ2^ea<`CBYi_?lc09V!m0fs#8xEA#^8X#htLA3-z{vu9Q!c>P6KpX*`TVt8mqQOS7 z=smMvZ_xhgws?{Z>NL$LM;H|AY?ia0Ejm*^m9XXod07&t>__JGNN7o|8G3qyDECWr zM)CB)|2<>5wmzEqK<3t;XFim<^~uafU^WDf_)C=V!aFB@`)3-?V9*#<*V$A?Yoe(` zc`0R)sJI`@vja{IGcA;+X&@>T zYXuI}C=HiQ=Mo}N69gF)&X{1(x}2W-JvJBzcY}Q%8>|PugBalIaCL%);)BzHoJmP7 zjcv|-9$RS%jdsqRa)h~hhaB9l-flR(Atm(s(#_v`82MF`%cJy_DwBly6f#MtQ494W zrkEEwxu;vuV2XkWjdP04lvG3Yc{?9}M!SpKPQ|d~`Y|EHUQ;JtL#AYtdoa&IFLH(> zQ}Hk}FRgS%tbLUVZ>~IR=`0}7$q=CFCO6Ni@@$jIr_?msW9cMr10G9=uCV)Zy29R_ zO&ptH?~u5IQJ0ImorIlDbUO&kciRcecMp2f$d8P$buZ6)m9jJ}LE-g3TVAJinC%S{ zUa3hpB70j&2MkS(7$!<*Luj)OAaL1{hENJ)#z@N?X;7-e*V@?`?nF(+e>?NvWY;{k zX=POyh(uKdxS2zBk^#?8svM6nV7zh-i6OJ~9Uf~l+YT9%W}cH_=$bg1c<5_N!uQR# zfN2wa4+}_Pi+@c(q#K)Ok&BXKN+2YE&GuSA-@Z}8^d!s`{+H5FTRBYTvL~5~r6Xrz zbJ5Kqh&hLD`kM;ICyIGN2OZ6)<73*V|F12EIWfgUd;lbTJuG#6jP+sd^Hj4GO6k1#>|J9+PE&#F|U2Nj*jcELX1&fYXDeOi=7L&Q7QRTqg&1YFqa-HtiuUgyp%-SNZ?v&xizA#PvOY~N<*BfLs+^|2S@V4 zn5ttw7N4cNCZ|gV*ddFcx4oa6=avw|lJQZ?U4u<+ELBy&IeWn40!V(Q05zU{$m1kH zCysaEab~~VTcP_tPrBHKGX|r59=CwRN28rhE6;KBJ5ow6P5ZlcP8K$l@ZQxoaEgo7 zEx}GZL0j9CpvSaxGUewj;-o{`s#Dl3<*|V;BQY~_N^4G#9x_Z~q}=QVC~hUgYa0FH z^bFc$-Y54yi2a@9rZ&&-4jE$^n%U*RGK-JKOvS^zJf}MDLXR}n6X)ycsURY zPoBIqxyLV_F$mHApUf#>FVD1#ASd|<6nvrr)!u{E6?#9pd?P+KCC>e`dqIb*E^vq2f-L}U58$1RsnltarI6uBUaK7zuhcet`e^{e$+`x_~v;3TrJ~&Bw?Z@ z{}0J1H_#gW#!)bsZ|sSKhqY_dxLYQSil#Y!pWy>7Xv<@XHiHSxO^FRc+OMM2BqlV} z_PKek;#f3X+`JNRG7!KtjTIAip3u_zJzB{L3uoLNFi_!}d~`~x7IjbFZgvV!ikD6l zp|y88^V3TG`1TDQ<;7;?otW=!{p*ns zILbi(5(y6$k2^=7lGUEv{VqRk@-mK)$JP-nV)=LZkG@<+t8}nAV zcE{L?WTfa_;w&JfSvzxUo%ZSoX%f2?zLUeRm(qbivXMQ}HNIeX!hAiUt0N~Xgi&V= z+n^^K0 z+g6A2TvSXPrGXTCVH-8?Mpc+L+R5R8*=40@Vgy4s@;?|s;}wfDg3$bXFU{Yr-TXhS zbVODGmAA-mb?mQ&UsguY8}Le3G=OU99T2S|$7SqXkxenoBT0ol3iU=Y zzKR0chcaz5wS}pa>IL5@4YJtk;9PE%kpTqIb=ENtzRV}zaRy*f-m#_v)6qfGDJJ8K z2;l#VjPp~q&70oeg$Yuyt%a=Tz#YO!sWa}~EQjm`~I zlOQcZpCw*pTg;}>Ak17tI$)n>p4Yxs5Rh#+N9@Um2Y- ze!D~Ix@G;`DJ|)Te4)K~J zr1}OjDs^HPm|Z6?g^z*KJ#~`XRBa>t(vVkuSw__NDAhL$erdKs-WRU#0af3K(4fAN zQy+#_%jsy_66>b-Uow2^C1*TZVXupZ@@*K7DSLGfnt|H9hLUbCxuDjQT+K_v1ta=? zq=>#@A)*n5-4?28O;SZJ1QvPno2$Xj65jPUL9D7`)b*;W%XDyD@{fniW~$~@E8IFk zBTEtZe~2Sbtj-A&*Y^}xc{nycBGPAzBJ{;9NFOA&Pr$!N;Yur3lHM%qam95MyHHe) z+og#(Tep}QQyk04q0kP);u}JVp*>Qh9J`&0S`y3B{zF2Gf!BD&YZMjZf`o|Mnn`(k z6I4tyngdO~4Qo1{e4vJV%#nL9iJbq1s#!tROh~K-qftUNR?{9Ov%WyF9x-B?zlMZ% zT1DI+N%UvTieYm8vJd2T40&WH!oxQxvR5kRBSMK{E;>2buO{}_It?!diL8g{67%&ggSjxuC_-cU&%S9kPOqwJ#3;kx5WeSu%eKRm!Mog9is_fRLp0LYKHQ*Fb&^VStXREL zIuEs6L$%D`=01gyag=16<-lpU<1L)ia1Ri7zu_z7;8>FIr=pN%b6dguJ;i+LsG?J{ zung}ma%NM?944+;C32lSW&|Z4y|7Nk%lsx5;w=b9*(W3afEPpX%^rh0BWS+xkrHe4 z=1O|00*34$p~l-2rJ~t0e-Q++;-A5&YXxRH6Yg(x!a7l zX3Zy{8x!*}E?yX_9IJD1Ys2`3<6)^{CFUrBjaRb?OXvtm8cZBaU@_T%kQ2L;@zr#{ zNr$P>VV=|h_xH@ifd%6m6#!7`F}{ONc^mV(dz5Wulu;{U%0!8r)CpP}XT}-RNrM(- zps;($GqkHu7FoDV(dr}w^(mC_^g-{tzlh$P6P0?$NN>xuFR1su33?~1N?l3K zn*L=~N%wvazIKLVi^{1R`~I2kJE8jlrTd6QPNaz2Tnqrr8GZ9Q()_l>kQLvLhb{>@ z>wS67%1AMP;RvdsmHA7-^cE>SBBvT3R{(I!j1JzykdsuL5fNFw2aOHh`1JA^IWZL9 zHL!Kogc%c{%lHX0%$X*E@t3Vkll95Zyz>LC8I$!sV^Py*UfEVMqrQZ>H8V2txU=}> z_qFT5W52;;znMn^^VmNM5BfAIQf08_e-e)a)=7D86BC)ErEl3lJL^zh8d3AxX0Y!o z#=%%1DPMX8u6+a0KJW!9+(H%Rr6gA9%;UG7_F@iuNct1}jCGM1@t88l~fw-5WdBvMHVEm$DY+5i1@g!r>e&BpNah|fd zFTtlwQmV#<_g-TTe%ewdl`4;Pr0kcvrsmE22Q zzJX423N9ZjF8T49o#G-r%lzF}D0>@mEZJmcNbyK~nHL&nQlnTVQec2^rYXN-E57~7 zEkj?=mS2#uMsc44cY)VEd&Ly4ra&1!}LdnRRiP`tJn8kE@Y`zE` zQz=J&fSZ}}C6g4x!jTp*7>*+Ce^3SPgbJu_&sFS9(=H`n(h~4?;_!n6eUn#!U^q)L zH2Jq;D6(O4MR^CY+w#xYU82~TrW}eL{Mz)IC3OlIQYW^vw^>aNG$LtQshFC&iis&% zPri?N3vtWdw#CHFoVD0OCTvjLOtDUJtBjaFU%)mQxRYurPw+%iyH|2qSumj#rvXDj)eQ8BD4Y&nt7U82 z+q@+fpXx&dKTZqP`*5=blRuescTyR8^BmxBYIq6loROVHR3hIlQFXxxTS&Zt@Bt zwB|B&TkONT7&QN3pMh*XVpx#KaB`~r$px6JoWk|1Gp;zmKiI z4172^KtDTWAf_?gE#d0@8TwTvZ6J?u_gLwmqkN^C266uH>^vvoPL^qQdZ`_69KLNU z)37=}qVR%B=3YR4P++H^bhT~ue)Fayq|f$sj{ z>G%#bK8_Fp@cT{-DiYjuIW|49^1Pg+)9$G%$g@vM)9l;suPT_CkDGg}xS7Q_rDH7C zt~BkEG;KReJ>Fv7n5I>xX^&}E$hFjB?Mc%XrfH9}5)Bq>Z<-cJ)1KhRg%;~wX*iIf z?Vz&0ika)<($Y#F)jJ^VSuEC5!_(6U$RE1^W;+DVOTh5UxxhHHkwaD(exHX{aX@%- zG14hSCVu%&yn2gQsjhDa+EuX4GDD#=DkD^zd>fju(=e(@Y?Du$f14p|s?4^4Xfni| z%S6u%Pj`uLRmsZTo^6&36lx58GDKD{N~5qF^Z<_n=5J`6w?*N$=~D zg6?_SEMAF*i~-9XaUtbML7G6wN~Zed@O0z!03oc{NmK}#!XdDIn`NN_tF<}79T@c# z+(~D+>5L#D&@@XFLY#UwZ0y=*S*lQDSb>^OUW*$PZj613LL5F;&4+dkDvWsDni(iG z4BV>FIIV$jho6o@ZjvN|-Bz1$HSLr~z*mEd4X z%zW%JDjbb^%fob@0;Qg?STJNJq9}U<)Z{Th-KJ1@69lEWw*z<2Lg4ODIJf+07^hT7 zlm=k$QdqH)rb0^qzFUEfV;sP2SqjX364SH*htsuPC(461=Y4R$vP~7*%)8T^pSrBt z^t5s{#3Hb`;U*7osa?aOV_mL#{9D<|aA5DUvPjK|7pG$a= z{87&O@J>YEkH=azVb4+G&U47UY=j%jILj;>mS?J%9n;h{s5p=@j*2{|;Fa%n@SlILj97SW3jKxYb=a z+mr<**FBK?KrXI)zs>SHMJe9&nT5{YXl2|(xeuA>4kXgeCOSLQJ(Bx~iS7@HbaRN# z!E}%2K5C+SJCW{uqH{9c&vSonqI*x$2`|~3Vl8jAIv5vl;?Z-@~BKJr(EaFtUKWd8w*+~gyPN^JHe+(I8qoVnS9qS=p2)XY>lSK4XS zPF@RK3g!xmrMca@xZNz1XgJ+FToiA&9&Wc3g-BP6D9kgcSs!3Y(iECMgF!!*z{uMe znIVz0>}(5{woA0};oQR}dyY|5Dh&+7?-C9E*WACF2*)cz9z=z$j5hx$_ahVOBuOgT z=%u%<KgF;-JwtR@`LhIMceK@6T=XSsE14$(;w0KCPa)jprmZ+2 zUF#9=^A$EnVk!O^`)WkB5me_Ys%%L`;f(jRh@uA+GZe+7@>6Xcfz*8)NM|Wh5t4Xv zgf!ZHK+Tn?qD)M66Qvz^Acy+!1&U&VL6I!+z@togiK2}2;;lW1G4L!?6f26c1~0Q- z11~a_S5bWlRHxBx-~f|X8sw+hMI#yB%b~F5Q{)Lz@=5l?g$kEWp-^q}+cif<4uz%$ zi8l2n=X;_zEs>~%-gI2_rlkf~)9DWC8Lx7s0fkOgZUj_*j%89FrU0YiE)cj@g>$P8 zM`;G)+r^5mR`@K1S6k*7_IjD*T1DcD=P8ImC1Ya>n<23A;_lTR5vz8_ z0j9cJQDu+VNU&;Wj-Np4+$U*f<(|^_G5bBq1I~e*_j2Ice2)o+DmiYH9ecE^OB8xE z=iEv0LJz4z>7tP6vIg<9#9vkLh@#CBwDHbs(7%{7!^HeiRX{T5LkV$79>~cz5&v8f zwB|&x${{L z^_g1klWE#X=s7*Uu>dJwL6m=v3-=9A=M4eb1%RtUpnqQC5;}e51Rg?PlsGZ4>@T*L zH#(n3Z5uXK;Tr|drPY6m(W{8Q^iH!x(eoj|z<~+mw!h}m`-h9(y@Xt=ck_XmZ`O4_QR^0%=-Z!40qlEk#jKvWN~aPKK9 z>TRSKH4Ck{2VP|SVTqq*-dzFOVwLWUWQE~uf0e|-g8c_EGXGjOm*>SaD>s+B+>{PQ z(U;I-A91;UETPLqVw``hp&IS=vBJ1`YR+2)D6}7wsN)hdX63Q1we zRG}P52P!AhKxsLHW=8$PrqMw=jE2D!J4K=r8tr4zXlW8xM87g>tQcUj2IiWf&{(9K zl8R*0027Q+1Y;^ANtse2TFpe`716j+whV~OGLb^hBtxhkK4b} zKq>nG^%1M>Q>e_uyrRWM-`qd(ITJ0EM9Q~!Vsw0QqGb$xyFsE7eEYye4uVT0ZkC;# z0|Cz})?M#S{D`b0hpnZG%AKH;ORE*DFYg)NGvd?%N!?VTIS(K&H?4am-kE7{c4*oZ ze2t@`xe32?jEAXsXy-H;9tyNoO=YxJKg4y?7cOqPR{;2P7dJhJ^rTEx+CH+)M|E12 zX0c$FoMN4D`Bcgcw#!Q~d_wz>Qhr|I=men$ADc|GW{aB)bu)%;rT{hGnw`j^N(;EP zm+adnSu3a}t#75=GKHva7L`+_mwpbZ`0nh}-cA18R)vp9B3Ze&?TSn6&_lCj#?$|_ zu>(z@3;l!t)W`H)_$IYD%Mei?%{S$8nazkVQ8OdB2LGo%t8f04zVZ2d(`#^pgk@83J#T^|(O#JwL!UyjK zN-e`!CS(3XuX-^g;bZnmAFyY6Wd14nL-j1SXp2!kNYB(X|3wy$rob$hnh%><5t3Pn zS3#MMGmiMh6_zIcA$eBEcw>+YiI>FK82piVF0NkI;%ZDEgXd?{Tan~J^wD=NgwJmA zhu&Ei^&n(Q_JvWuSI&NrBK?45lb?Vm=Ei5=`9ZzS$3)^J9@$xay8RTNaZeJ$G1_O* zSqAO|CM@M5yHC2Nu@%QWpf$Gt!PC3VCUjq8@`Yubrn3(1jz zFQPkv$&&~i3Sz=3@>(UY8|3v~d3{D+2jrCsQ3bj3I!|63<#mm`-Yc*B(1)!-MegX*sUBmh3ieocOdSq$1Wu@8}4Rj4(B zdgB_!d6Mn?>;dElLC}r#EuyLAT3ex4qV!6CgaYX=ao$vSJ?kNCB6?{YPi>rxPvnj% z6lf4hg%>1Wn9-{`)rZ%2ts7-G5I}#Ys;4##MiJHuZR+U^uzo^A4wJ2Xx2?1>NS3*f;o`g=s)#SAoAxw zOh5UN^fMpHY?FWEB7v*?9T4@~ALiftNcfG9WTtX*#3?(n%!t*7>4!j4@k1ZuG zNl%3I-)Ls#Os_!y%m12Ib|R-)Du0lKEqh9=63=EfuJCs9k>I#GCO^fF{ z@NlpH@qeb}8>hASYYZ&fsF=7IrtJS)ozjN+Y{D zBw+<>`p+DateVJi0zDJaivG-Ko0gc|lw7(m;hWf)$1L~J-2nabU-S<@?&fEGzI}I{ z-oNfMYb=`q{LhA+QR~kv>prt20%O)WZ|S?gzPmyH;7L+#CH_|#JHBwv&W07MAyM=2 z%;p}?Uhii%Gpno(6M)-6(UieG-lOJ+LG!~0#H!R_wSoes?)|_oZwA%PQ9tXTYr}oa zbK}mejopx_*Lz5BILaX1d#JbJU3vR%Z^MAR9e8RJ`13=ouGf1|Zy1!AgS`zW^cHa=;!pS(_*dyWr&7q@q(@lu)0NyyY~#} zANAfa#rXjK(?8V*^{Z!Yd@Gi>0||&>R>Uv^%Huu**o-{!3$3<4L?&2w0G`sh9E@m*pja{_m z`aK6h3{#QUdGJT+t_a`JQodDd0osRa6Q07rgaL`3k}~dRwD6-u%?gyDKmxxkx zj-l_$rpel{*`{f8c4j@%;5_+K)PcXWBkmm=06dbiV>9v{dY^Qg9`BIu9g>DZBwZnM_4PCi9`j~cvTpajGiPUyci@*6C;^BwcJYxSRNvBl zL&wRfvB{9|NkZvwus}*MfsWdGVguz0cG2LCd%z1eS*z4WwpYx&) zrDbsUZq^sO3m4lj+Ld(+{VuV7y}R&wd-qA}jmuS0y-(H7bsw2{3WNez+&Gu2>Gf`U zawd$4%7n}fn^3c;_M+J48=iyC1KnJcAK}aXMy|hE3nluuiFxx1nmGOqxYGN{=pFkpgrCX)^)w3MZYBajlRI` z*B3bPXZP!=vds`wohSF9!S_WokL0ejO46Yt6IMEnd)G=$-QNcrYTffJv65cz1}OI= zJxldA@D+wxmxNd+5HyVG-a%RO5sxw`fWm~hF;grSm3DUxXj!+sjCziFGqbZcK8HJQ zfQ{tqe%&`v`4sz(d+eovVKwTKiRvH`iqeK4!VsO@NTxf(Bpkq z_ipPRuv)x>LJa>(%SxeX4~9(dL8(TMw|}K(>-u1ETr+54^S*0RRrmHwYAVNda>F=R z4okawj~WC+g1{ITJ#Y{q>{B#8aA}y>{IE#^6UNJz^}Pt@7%+D^MY633qht{{AZ~Q; zxg9}6k9m5#1~6#Fru23V;`;aAuE%K<>+zkSUf$)_W7+!B0=OwxK;eTHi!ywmKfk*Y zEpa>CcFt>ab}|hHjzx=mW4G%=#Aw;oBM4CKN#IY3HE_MYg9g`L-+t5mE5PVT+11B(XUAN}URW1PIrhT*X!*LXGqu>%m6l%b z{V4WKq3`iR-(aC{f1z)n(DzFBb5=u(BSmJa1Wb;=aBMW_5q|agZkFIdOSFO{jFlJ_ z&+GN>f$t45{!xn&p1gZ5@;-di8M=2LG$E1pm>BLuTXuK7tKC$j@6Mnpr+=lkVtAM) zxV^sn!9y|Re(`XRcaQGf-s9azWwLI$3s#0rY+e{=U*WD-hYxw+wp~5m?Fcc` zr&~I|6wN!iFE$mHw0R#d^zJdJ?msd{_ded^z5hrWkig(p_ug-#n}^x_lXUOH-8-EZ zd7tUZH1xE0dmnbL>&n%l8R(g8W>%R!P#@}z-7kC${StHITj)R&IY-tlM{!3j_jqrY zBtcVIVwk#4w_^O8zV0s;Yy&So`BE&%Z8%N$J!~T*?6>WLP=)(mJr4a|)p|0)+7{RL z;E}m{!^5_Q`wLYl?wN38GBoLN5TSQJ;>MA&ASvwYnV@_3f6`y*9R!Rk8Lz`y-tC3n zqslJj_9N5vh6im8+jZYjL=f9Pn{Qv?t1`;>EV5&oZ&Ni{8V>0W8`zaQ^>U07M|;ZM zY#SHZW)T~P+UiD_`VhS1ApUYhpwYbp8+YD#O?MZ%!41^!ZMGVqwE87wx(+9n%5tD|$mtPYGHI{b;qo%dV88SGs}J$1>C& zZ#`4|(94~Iy4tNzfND%+3L!M0amTE2>k~1uFkcVGSWB}-}D+P&u> z#eU2Thk7tSS(@D|V+AQc0Yi*X9sv`|G3!mN2B;5X^vc;SjX_F<&R8Bq~ZuPq86#UnAA4t zF9;nlX%+-{U4qEEz-hEN zojqdW90ag`aCz~lH;C1@^!m4q5@(@=YWR4UI4ZkDwwNUB<4MAqyDM*@J0fup131Jcp;Y^ba~!FGd^F>;OZ-6#t@L%yxRc1AaW^(my#^&U)Pd?V~5S zxbH-7L%*@y7+nAU@Mpuri-4OB_b-q{zok)0Ot%fKXhooeifc7!?&#fnSSw6*3~h!m z0ZN+YOk(e*Tn;IMxPV4Fjb0nyik{hha`?uHYW_cnxl`%+D5;muL{W%76QWOtj)O{d zkI-NDW&<-)d*Lg**qWYC`V;v)ke;uMluZT@WT^ifs(*64{)uF-Gl@3GkDjN$EJ+Pp zd7$D*TMbEDoiBnS<+ms_F4hmwN^(%|a;h>EE`D!rbaLed_6=`EC-gR8i6}yz-Y}#J z+y`P_I$X3E9suFZ!BQlJ$UaGkLH1_97{ZQBf~Od9Ro)1cq1PYT2L{da`Si15+6V({uXNswQIG@aVKZcLv@R&D^OCz)D6B5 zwCD!roFkf%%(c-#>aVK_m6*(-TIcXWjII>mML_3eEGuuQwi)FWTDiA@dHj*TOLYfdFY3SXpizBy2*O=Ha%fG-9wfeC+Op# zYstwAWA1pZN6zaWvfVgMpgt{%dBoj`qL?BtBJ%FP*pkKEatblgOS|{<>4Uu&PoX%i zzgb5YtG^iJb|dxM4+>Q4~$AdsWK&sGdDso6|jHk41ZZhvvKnj6QRCksI?~xm4`2VQDEd z1`3CzCO214slC_N&*36ou-`yBX<G!i`o}v`1suW8uEY9|N4~;=fNxW!!5r?pX!(w=^ zcL4Z4iHD4)@_m>B?ez|h>1{YD41YWDLfQtTO%)q)?MeNa<;cbQ?~UsFH@p>_-hI+> zBSv;t7iCDfC|fYcG{W|zc6SYFS-0;tyz2&31DV)Sm6Gx*cu0T5PL}jBh^<_Jb~>hD zlWiuNKVtlGkEUtBaT@T{5UFm+^Bg9}OpV`Th0{BQlGdSA>1`Kc~!*degP8~vk zi5=Wn4!J!e0s{IW_9L+PB}u{LJEs&C?A?X-DOpdv{K;W9>Rq3lw6HYUg(OiNC}hb2 z)cMKbC&|kd+@4s!kwV-6OuO9yRBhYH_(^)p!Fb*(4Y_Ii)sNx6!K z6Y=bY-)?)Ur@}4VPq;?+oN~06#t=2imXdflzmo%vK#D;oeM|)y}$97wyE?O#K#*6jOvE6pL#+`HQ z*lw!{b@bS7r$7zPIX3JY81{XzlGoaY{A{-MUAb)1YP}&>Rov^_hZQY`a;88kv&Y+~ zdtd4C?(e0FggSz{5${=D(yHCt7#ZqZ~SB_$vlfc$gcqCi3b$%MQ+03?vEGx~V zq*aBJ*U2riP^pxQ=?gp&+r2!iK@PNt3F1 z*G4M^CBtbHpuOWSXKna41<8gf2^A#rKn3@5Yu-<-={;maA2QA_pn?avK_Bk*ZGnb` z-lOy5*e%F2W51@y`*^SKR)B5jGlmsz?eXr=y|?#xpXqJ5m*=)J@~`jmu;O)kgC|)o zQ~4ytKPY@7&igcapDFa_MO(v}3H%dSB&j`6h^3M`Gm)eJL@C=88?Tk?!VLOL|$2lDA z{?$r3k}p=FsedI`XzJ0YtTCzUagfW}@DBHmT(bz&0Zgq8wb!xQ8(8hc)`lRPuzAws z-Q4RV%@g`2M7foBSZ?p_rJc^CuEiUnJ>D%k@2B>7xApdRFctMN@Dd?vBf+SHZjAEH z{k^@|AR6Yn;(cW!!KkNhY~!1UdmGk0$+K#)NRZJtYr~_gZ;n~tq+YwTXCrwesl2fY zH&Sa%kX57Z=-KFJif4K@)-wfSz(C;(@gB0hXJaE%Jl?bMDx!$%KUiUq2?K1rhA4#% zHZ~LS9aO)F7eadKI?_jE*U6D9U5u5n?B1^ZVzBJ(dY5iQx@E8TsJ7Spv4%{Xdz1GV z?}Ok#)hCuC*m3$q8;%{-eTcFHh5Hujz7Jr}!j~5MYq1RQqn-4w{z9DF!G?2ef8k#L z;zdaRh~aVB)wH!M2W!j(z2)1<6u=3Gol}aU?9I1*tLlJ~HXl#A+FQ2G$~qp;`v(yAuyMl}pAlOJ+k6nN5MR zy3dIU4MpVYTCf#~GJ`E8&#)z;vcd_;FUmzw4s(c?mDoSUlys=jN^>*bO{J$2oR~nu z_WX;yN4socAuIXbg+7-Q4e{=mi!`iUcv-I8df5KJk!LDT=ZgKzIU$R%dc@{qb@!VgWt*_mQ z;{WLAX=e+jGKT>F6kEN*h-A|6>g8?GZp{$?2F1V%ddTzkk zW9jw|*t?&zS7&X!4n29;`@yhpf7Zql+_I%cT2a||bnCOdj8%374X)ZiSwgzvfO(#d zyeK?Rp3Sk5A}Kvvv?j}&mU$XbL+`pe1*aO9FH zH8Um6-HmAQ3~I!>fU~iBR}KoQoji<>8;4^lzd{c~hTxFD*GI=fu?4}ZQJw?YFQhB5 zA;A!RDW-V2g}bvhKZX)${a2uIAzJk1Lf_CQhwu7i*ybJJK7_sOcO~Fm>P6oDh2BFF za0q!24s8I-G+m!bDAw^D+P2<39~%JA`1NY1zQ}HSU1oxN8=f(ApQ4x3Rtab_Z7&yt z3cKDSDw(KChkdVPZLCEzi(2%CKGwz@v(YM)z4tjcyckW>JKcqy_G%oO>U0*)u3ofA zUwWcWU+S(~IOjz!$<}p>SWoLdWnC6M4Kfv$+bdAK+*#9hQw>Jt|^xu(K5;R4KHnd}5g@>TI0y(J&=9)9 zPe?*Fj&X%;l;E1YkeXbfhSWGZsY#71BA>+PlGBk&G<&^xs(cdt>HBl&G4UMuRVfO#IIdzc$Is5Uxl~# zRoZx``4}{9NT1h4k~ryXZoyu`nWf$UG$XErSQ);)W{|SPsZFX6PBQE&&KnobI)Bc0 z&8<{8BB}1DCC6#w$&b5kSviOI5t?Rh+|^RVq0%)h`*s@Dx$U+PE7mi6xu+aqxPFZkuzw(4uN{A?B%ARD)o0CL* zPLH+r4?;NkK?nygYQHiIv&!b~_uc|y^&BPRCBfmYfalQ>6zuv7o=1rQt4E2nX9chK zzx*^^A+^Eti2d#T`Q9NNE0xLC}5Q?we8v-F1GrOc92GP4+~e}RHwN67g-I?}pUWhLn33h`P#KkVoH9&}RMTF5Gz^LsS)UK2_PZLZ?% zHJDwDASOGB-OHWJL~ADy+dP)T>En5-DXU-X&G)~2F@yy0!)#Wj-7Jwvvgu89>x>(B zm(qZCDgEO1#cj%r$KRot*&rDx6aUA%`un!aksD|k&!zjQRp@B{>M!v@*@6Iv`GIw9 z&HDp7tGcHBKqU)nQ=pL2_xCoGj1Q>f21!146Vk5!*Y_qD_yMPv@dMHg)`Xgj6y+<| z9BY1_Ae?N?$!lrg1>a&6_psSIh>t#GD>iOEU=U_9k zE$Nw}EbYM4gx}Q2-j`~eW=%x1|BYxyleQla#~@+bB_anr{|+K0tf)>wnh#AA_5n0G zlA_5?s6nm#UJ_LACBe%yMnD4L0Q>0ZV@>bS#J(-HtMM{#uG^Eb*Uf`ooB$rtDPIdp@N3{Da}8yUc=NaE_#z3>)gId;bF4{uy!QO=+etvihiI~e*w7m1CC>d8UcJmW0 zTo8}FiZ4yYIT{9jTsZ;sbz!|m`XX?I^_GPs(!{-`CTK7s(Yw)j@1W1X!hnmefKxDc z^uLhA3X55U6h%ln(zzHj71K7U@lPqVLqIe2i}w=kpSUnGht~HTsC+ru`+}t_@|no1 zhZ|lNCs-ZRZ)4HzP1OEy!z()=y1Wr{UTb(0nc8rlQ2s7C_`1^<;lRqn>({W3ihupF zH?g?%@P9sgt$_}Eponifp2e@><&!uG@hro!Sd?0TUO9;ai5!LvPfX0r5&gfJ3JD1V zaS)fdaDV8HhPUsGjofH>3)>X21TApw)&6g)SD<1kts?DG5pGpoT>U;udBFp*a8Z8G z0KfWY2;}T(4&)eSFoK#L`Bx3xPs*ZIMmQ1Z0_exk_Fk|6htud{9?7P=&5l^6V6eY= zQaHGeUvg#_Gk3=HH<6m)ved{^YW5FVz^5bNG=ki{Qz&n$ zP#1*^f+RW6f9%G`ilKI&6{}7c59}1^1w`LpptWOIfrvbf!%8W&>uDTHgGa>QDFCOe zzT@9hm7CS2Rf5X(QHigsJkq~-hoagVcKE(VEz<_g#ODgn=o8}QVZUte)&hdVO9?U z+<&{#jFawr;7$vUWr5xJ{{vYOe*f)WnBaTj{r&#%eewT~{o(ua{e%7Cd*iP?_$xAB zYuOXHFXpj5fqS!EJFq8kZ%mUrtd1?z3o*gL0g?x${=d7j>iFEj{@YbhWQQ{7Y5@El zxQtU;Y|Kd3JrNcQj-aYI_^iZq(`D;*9C`MKPuS@MP2Y2uwz2PubCOANB$5yF??e21 z8Q(ppO_TA*2()uQoQ9(Wnox{5&&R)vU|TZIBUEk zv}Bx|Pk#&PazAcV5`sC@B;!=joyg=%CaGLBxe+lS!edmlkEV*&AO91=_`a3qrGqAf z?y~Y+F1h*#2?yIl*e5wAs>(xfUiVp1wVm^ocOlv?6m$4mPYqv>^KdHLu2Yu#sb^Km zjQ#hXr#Jy=a7!I`rFG2`oQN!eZ5@(B+Wab|<%f;|KS>FGMv{)m?YqQ(3jlXZiE~o_ z-71}jy4y&cGy3oLCeC^L?+zx;1?l*tb@rSeYJ2p@msA{V5)JTE+)etisZysbNI?$| zzW)zs-eSA*oYDWhIG2Tt61QQC3+ZF%Ltb7wh<7eXdjx$C34QHA-$O!Q^Y=Z(^|hGR z_mI%nO!hqTW2AHKBuBq?k|SR`$x*MJfspy+zu~+vcfWcsLDka+iRFb=xBcAj`}X zz80P!Wa2cm1A%qrZAN%+n1_8Wyf@6$u*PHIISB7{^W3k6CpMuIr@cFP65+kZ*^PkW z)Unt;Pn-@~oVlj2Qe*LKEZBwnP*ud?K$97vOq!dWUqT=bM)T9D9Ah8b{-Y3F;yfOd zG4sszi;1ScP2j*3xRIKI)DY1Wv=W8$5YIQf0{MsY%l)Ut;N4FP&aXb-@R~2#^df=9 za4Hs=pKo{rU|hXTEo0LP^qbh-2KWU6o7xpEJHP#W!@D^4`Z6E+zWeffs{2DgaNTF8 zXPR|h|eI!=CEwq~f4IofgL(p{<3irh;4R`(2*lCF#hsIGk_agKObkJI!(USxuUL?fj^>it8&@ zf3;LsVir;~_Vinf9Puv!NC%J2@_=74b9rmhOT61+Rs>g7(TSfYjSkZ`?510+MfaZG zm@M9di_;D%+@{xebKL8|er@u$J=m`aY%DXO#%9+L=e=Khn$#z=YlsX@hBCVbPMG4K z#Zx3K%lWIG_uG1Q!POM}LGw*cx_7b@kCd}=JkQaAv+x(IipD@rHOGaI1BVs{ zh|2Wv&JMmw<%%0&%tARy6Q_+7y;UCXe-gb(QT|QPm|p*+*M#Yx)rP;SEkOEa>Sg=S znf!MDJM`cSUU2#w&r`tyYaD&i^ORJOlujn4Yd9m_f95eE9Zp|sbU%L#_9Y|J|$SFEcM_X@$%{Ma1@_Q#O%n@4`; zdFqFrr|v1RCxdq-gForN=Zm=AYZN4n#-#Cg{b%~92tHndpU@pN471p<-Yu9OYq_yY zB}jgWGJpCTAP_IXwX^h>0B&6SQUSok`_DIAN4@1cb{+OW#JXZr4%~~;CTu* zC-w85r~V;%=5f(kdDj1U9buOrF0kjtenQQ&BN6E}o|H@^azIEoLx_q>Kk)vQ<}GG> zp0|}vG<~YAsQ~?Z3h*<# zIR$@@TKCKsRn7vm@?yL4bHMKEKl7q02JE*;_iuWOt4`LyP9m6A284(ZwnK;Y_gmZ_F}Jk@pkfb_m9#y1g&YO zKdT2?+e4NtY6spdg+m${Q$MZfwvRR-%+l-`g@+gR6duFhj6fX z@eA-IMwg`Y*Cto=--(xdggSQm$~B2Z!L{oRzqs-|-ZA(^UhF$5s+J-y_rq_ERLgyfxzg<~|vSE{-S3K8+te zG}VE$_P-dulV;jJ+(yJ8sY)Z9m2U>zXZe^$?~YTc{_~y}z3ClnYh=6|;a@PzBcu~` zh9k3kx$|9Ok^7OX$s+%d(lz+N4}B~P>2tq-ayCVlYJuEW8kY)zvA4rpSHZ%pWZh6_eUUmU0_pD) zyf=_K>P2aiPDSnx#FX^i#22Zj{=eHT=`BW!9v1JU`s^Qwitn_IiLqvN+*FVF_x4;` zwZf1kB_*#EtrO>foT{5|*GQsDo|o=xv!evg{ccFE0|kbh3FJ#&uB-^=>|jNMUV z{wHN~{hfo+A9qh+c2F;Wj~L8$NkVq&`(k0iS?#|<4D}m7@jx3!7nfJ0q{HMsyLVO zOGJzRTTFh2*1P(Dcx3kJ+&$5F0w{L+o|Jx#`%sfxX*>Em=fq7^D#~}kkRn(9@{YLj z{J(zU+UYEss$4rAa?4v)9 zNl)0<4&mga^n_#WAT&uMzeR;dHh0OTC)k>J@P|Di(febZcyw^_v8L;!xzc5_XK1I- z-h(4Yxzl#cCo%K3GZ&*i+9x%kEJ5Rg~q0n0G zG3PTrsJ(0QGgvl2N)0!zynVp))xV7~yz zIoRDWkHCB#<}YBZ7QBldhHc{8tRi1=3d4siua}~Clsa(oQ&9cwa~FQ*#yEdbbf71l zJdK_67X7ieSBH@urQ><@58-+S+Vl<3!}DkyK1xzTq7O=VknDG!K~gu?9w6jP7fnQa z?2{&v^ttl_;nz7rBS%;}g|sf!?J8QOKq?`c7xHFU%OST@xUmJrNg1H5r} zO+Q`bcpYa8c>2lM3ub|6aK>YRADG7K?daY8Z7)08UNuh>f3!dLiX-;g{B_)`{Ry3` z#{~f|Pn{pYhEFWOVNs40h%h>iP#{F@?*;q*fH-TX*5eBRS*oz7q>uJ5S8^` zOHpqRS(E3PB|{r-Mpl-zR_lHRSwVZTh}3W1^1}VCJ!DO-koKDwyxvPxYJH1jMCO~2 zHC2TVq$%VPZG&fsgJkCU9C{NfwL4(W5wbx$lM_>qUQyZ{_w(r1}Ge{6N53<&q-puMkhKxtgv_%!UC&quj0uDUgl)% z*<>#-5ebVIKa8;WGYDxx2A;xu1p*#y`wW)M#Di@Rq@OhzHk&vOGxTD9OhZsk?0{HQ zHGOR_I@+vz4Uj}HIbyF^k_gOmE_s%nyT~pw+9JgkIx&OURI5K$Q{7{CZd~9HfR~u= zW1UoS%7aT_yqEX}cYFDvkT<|i2eAu*Gagr7cUcb)HoSP{Sr@<7`I4jImE8d^@qkzQ z+g?OLt#SxiolL%sR!^SCO(KzRocxKn4O#TZ-{o!z?qu>!jwhw?$e)PQR#<=hE$*h3 z^Wy$2L91;D|LL@*Up1~1c<8Hb!oJ_vV5$(y- z<^hQ~0TS_Cj`#|9)0OIE@Tn*lV&0kz`WiW|2B8u!x8_SBZAx(A_2@>p7C#Rx47u}M;sB7&D_L_6Chz; z^86F-=9fH^k8?zI2ax~?F6a8=U*qo2@T?!>h}urp1W0g+*&qK3cazXeCNFbDeFu>M z2`+#8&ZFn2tPk>Izt9bdt?$5D)=wbc?Q z01dtI&u|BB{eIFyvBW$9_?6%LxdT^zKh9B57K@n(kZAaGjCd_J>#xwy;bcT~LVj4}~f~+X~Mn&PpHRti(=?H4Uc;o~M=j+r&mDjt>3a z8~yKl%z`ga(am1#MW@teM9YOyG?c*AccWsyMqmuKjwtG&-etqwb0zV{9 z=R&O&{I?PhNOY~0M}fM1f^Xc3In0`$p9ccPczyXN#a*;mwQuJDJ89-4t=2|}*gn8k z$h&+G29tj})VZg~H!0uF+pW6;amz7r3eOzA`!qIet;Zp#!Z8m4PwW8cbcdzAx4dZ; zlGCP?D$1!3+CX!Ei`4sn5NB?z10p6BaHrp_xK-z0Ne?&jx3=4?EX^K32?hjUn(?RMFZuN*%kS_XV&7hdG}`5L*5@km7*dt!u6gEh7t)HFp{j66SN*m*pqu z`d|KN{AUl}fBMM3Vbv>DE!;FV-yXVwg*z@>fDh?n+=#t);TUh4w|8D0M0;>@AmK3o zt5m{^nXXm$vmcH9nbqtU2-mul@E)S%^Tc1}>CsU*nr)jNk*Za9Gv+@CVe&(uS&fb< zvhBXqerq}3-|Pg8o~^|NM!d<8DfS|Rc$2}MTJhkyq?{q%>0zfoIKsX(v={Fr&6a+s=1V;y<_f9xn`2!&W6SR6QMXNs&N$|40 zhgK5^wD$6?K$9F6EpC2ZgXq8q43vx>2Hkt&gk;MeUOKDp_3k?mhod7O>Li>h+A(z^ z&YZ8kuc#L7g>stno%pl8`i>99hOiNYK^yUx0kIYh7|xC!yCxOTU#i2d5S~@!U)mwU zJB@<=8K;ljz*8I6p}d!u;81DlN)zAJ@N0X_@q)DPQ8kI`{8gg+kvJzJE+g)G2Kr{@rx&2xc6YR!F&9tk@oDi;>~;#Z z>zpQy@{aNA5#e&Lwfz%nEvouTS&y&z$a0Kev~Fhx=VG z0rK=~1QwTpal$^-@9pZr>l^w}z@~?Sh*ODxBX73(I*$41F zwd>EKTHz|fturt8;PmAKJ7-9QRDG=J7pYg8cQuGlKt4eiHCzouVUob+pV#{SAwIq7NI-G}Qq<*noPq7dei*oP5mdm_BQ z80-J3KonQ2>GbY?z^AV~RAs|UYXryPQ$L*>~`%e%yWhex2#petr{BK znsx@}Uc&{qOZ&K8^%_1+H!|VP)N%n*jcmB{H1Ge{#>mqueMTV)Q;348su6{=OjB=W zj500HVN?R4QsCCWSqt2o7^7C3XGSj&dO@RJ?Ud06cb|65?)DmSIOE!Jm~%z~?u2$L z%mYRe?xc1C=Cj5S+(RJakaoW@4EHdy9Dx}I%?2E*JxjIcsPXLJBk!kdzYig9z1KWluzw8#wbumk;xd$=!eRv zJD}QIVXTZg0>_Opq%wwTjG7sZpn4;yN~L_8aTQ@#wG0^5K8{?jeyCiwki+DzTwFob zz5;&|b{9-5%m$1cQtkCH9WcW%i!h;ZmR+qj#*y*3R?agdV=x;qS7F9s zCSW#UCSj&vW?*JvwqWL9rjXV=Y&+6hge}9?V3y!shH=5|g9*W8!eqnb!4$$oVai}C zVFrOa1Tzh@0J8$K>L@m5P`eqe1U19nKBzSd|179A`(dcHiNdXhON}{1nghva1;ys! zod>lR(ERfN%_FT&lp)2*9q<&W_I6mid3iBi(5((|;^lhS4KR%`O)$+cEikPxZ7{Rx zUi)@>xv_x!7PJbUS1MtZru&vB=*3?XFKA+L1FZr6h-rOsBvI^5hCKAka5 z_ZpeHAGXfg({s7qm7Zl3>c#d#J;(GHu;UT_KMdd)~Hm;O^VKL7X|A| z&u7hw;h0w&g+c7WU@3)~~i&EIK znZ`cOmZe+SsuZ-h=~*nqO3BSKSs^oq^!wNauYE|*W#{i@F%&S5MG)m{>|QUsSj^6s zvh(Gv*0_zG&tdll`PYjtVtCnSG7wV2J_|qr06Kdh7l6NDwXB5IA(wiVVH&q%T`FM@ zdfBJ)>3b=MwJ;>+XBTr=D{}+ulkC$uh@8VN7O~HgtDJQLr5&ZoV@0fs<+E=1^O&E- zSQhI^xg)&rpO3JIyzC4358|FMw)Bfstu6f+>y}QzoPa53F)70|LH6)TI8Ez3LVq8o z8m1H`%v$A>tW6H09F)R&)|!@JEXg_~e9B>J8Nj#0oP;SxMk40|qbV(7Z%R9b`kvu6 z%|J2+8(>xJqHqqf697fnke&lXFM9+9ju@?J6;$BXw0zbnXR$6h40jRhmd~;t`P0bI z&zjPX-o!p;!j79ZNF#fJ8)QT57^;!O`s6c6D+g(1u{g>CMr=jCM5qE|DD5uZ{%J&{ zPqQukHdGZPO(85J1O;18BO2whQRS;Zx)Vs`KFV4=5rkQ(5w(C^Yn)&SBg`)AAOj9; zrJCK%hFO?5yPJ)$2oTY15%zg1l+k2_?M;TCwHqgmcB6t|M8r+$v&M{ZlKsBdK4Tmu zs$m?_SsYz*2Bk_!x3Mkh7|e0g6a#M6Wd`LnMMS=_2yi2qa10&bD$F>mwlDG=E*h&w z1xv~qY|+So?Piac!09%&MaJ7kDf_C<9xq~Fy`6onntlBw|6gw3=F!9KPrYnV&SgV# z1^a3~`;$@xh>V4Jy59)7a*($ld1oN+4CGy8L|uQ%CYaZ#bA|VX<+7;DZ?w89Sjbfj z^E&)tV<6@KCj3ET%Jp?)-t{Rqg|KDUgT@Ao-F+)@I~zflh@-BfaseAdy{-ZlhZ&V4 zMxOg5!ZXOt#$hHnUc{((9|!zLY?2itEDQa)8s;dQl;6*P^nJo3W*YejKW^ewAWh4U z!?h_mrA_c-yYO;NKgG4;i?Szq+4q<6=H(P+r?TwMo6;j$b%$wAp?+5Q8NkTg33CtN zBF}mE>uio?7@O{V`?8k9rev>u(~Y`g5bIHb=t5o$E^dU89|Bb&(PY6Q!1c0ek`zI? z%ZVW=%(|UnK+D;TEJCT{6|i06Yz6JNA}=x%nPenIh#)ca4YPX~EuP~LJI4{Dg!w!rurrKq&rxvD z32t}L=2brtFVuAcdhps*oebT z#OU&VGZi-EEeE%SkyjQtfVk6YZNUkv;5v%~sU=sDr{EGRoVbQKP_+Ik(h%vOT;5X1 z>s($BD(_X9h9a^>`FCs@$Os-p{u#!CH;i~;5G%+QF;p(0r*1+TEMjb`kH#ps_#c4QJsqytND-0Fb8+``c#}O~c7QDqqFHiePGwwI{#XD-otA<@}jB?z^ zP25NK;aYj*aNIfH36%MEIf$#XZxooI3fQ?ky3c`5R&2QZMWhL`kRxn&`6G6hIUc(F`OJroOJSLg5)A*h zQ;85Y!s_)iY|aN}*OnVpRH1pa~io=nF9qnkT_X!d(SBVzl`yQ0G&; zFnNv(`|4C+(lP_KA9d1MZ=lrP=BIicHTwKV5jP9z=9+kZ*hNrIa_xN_=Q!m7Kec}@ z+OEJD@!w+~!Tk2an{WL)a4FpaW_MSxX%Cr`tkx^c65LA=04}dEU9h{n5o5~#AlfFw zSoAaKF+nKTLC3a~V=VjcWfwB+c1X2vLNh{5zZGUOnD|?0UuY`Jex3dAS?t?c>|3SG zC1(HtISk+_=t^W&vyfZ?XP9M@l+A%Nmz@cf>4V=D88wDM2x1u2|Em1g(kks07fbflw3ka>Az&O2Ey_vmGoYe)N6EDCB>qI z&QNaCE}>F)2Nd>n2Fu21lZ_EQ;Rv(uyN%v}n?(Z|FjYnZ?iv)SCJ-?O0=J@GRJ8%* z)*C2dO@R!!z3iEa9cMMlXF{tvqFIMmjL}s5QN&LKa_mtQ=})ulqm)EBs|)OM>VRg5 zkYZAf;7pMt%8bcChJ2N3Sp{bQ275LimGv9*frpHhKo)y4i#-v>@`cWxr8N?rbp$T3 z?|jO@A_sf=Eb4kI>Kb9+_ZqGsGeW@(dk8(|+0Ua;7mUIn=88eLJzG0t)CR*wW3Ysj z(Z*mt`&Q6Cfet^ZgyFp%#%e2a-DYX8t-%T`mz2QhFcqMO-*WG>%T0eiGIN6(pJW38 zOb;kAwB@41=nCefa_kD`vS}#!GfD(2G9u@&(TfaFx?U=sm*s)sE%laz&LG4pWN(mD zkd*VVkqlO2Z3pwupg)yElIIWxT!$%V&ywXgy*X%wi0Q7_XIH1nKZ^1vQ#mFnM`YI~ z8KZF09KR(!*BIaBo(ifaJi=l7h|D8oHP8E4EbRI>ZGim zbh15OHj>qccdU$>~la$#@K4N$~hnJ$VQH0nfP9ReGJ z80b?0jp+sKS+~)Wu0TBLMtgdOomN5{vB=t<4h5wEmS}Tvx*HnBXA43{zt}GdMWEuidh_tJD8p&7ESZ*w08QppjCRlF`Ld+ zr3p}6)7{LT&h@25RQ72S*>2_nVJ8JoWAT`S8d07N)7=C2c6za)WhizrrPb|AS`a3O z+ggThhha_7qgxz0rqRZ}#pa8KD}w=7M_=L#&tx0E47c5vkzrraPz0ortwEy)&fn=6 zh{JZ3yJ}1qCcYUUoY!CyB6t}xbg{>qGkn_BJFys;&vcbBufp(8!qN~oUX`7YR16Oh z{>x&Y!m?^9I=3MV=2Tw9$@OkAO!yS0vRo-2LFcfn=Ej;szEa?J1CBhAR0g0DXs9yP ztz!%bO1a)FDTleGT&zoFVZxP*uwrH?xh$9!V(c=|b5W8kpy(_^iXciU7DjcZD_)R0 zM=JVP7R-=>(kGcA=~C78a^-$t7pM^wL`Sx6B?}={l7Wt7V3wDKR5Gw&5tJU4PAYDx znBB)dgW4CNez~AQQ1K&1kokk(VZV=jPGN2J7^cAVs{kD;qykh271Cjp+lUI%9ZI!S zj76tX(4tsHKI{xLUAZSu*6hnCk zjaJOcjk`cK6`?BXjGS4O@c{D5VJemoZ--43j7VptT;+E6c`2gb1v(-xK(l_y^f2a< zC*jUO{Gj{e-0eoJ42+c-$|=z4asAWmeuP%@w8E%=6+2EpB_Awv5tMMVKUO|Pv_xxW zQ2QxxAJ|s{4g0TM{&bd!hd0Kz1M_iuy902!3sdo z45}UyDn*l5u-pj6C<45kl}e>7*FZB+mq9i<*1L{^q;6CjJ}R6-%|)(a24RRs^Fnh8 zBjq5P6=Y{&DU2y@G2jG4=aPb1epUsRCbj{CNebfYU}5@7J8o5CilQKfA8CAP*Y`1U zt6vf!`d49x-9AP@{c-a6L5(o-IQH+$!+4sK@O~djP$KOPZVe$Vw;zp)o{U;j=TfBy z++MJA1T2RxhdL0otC(L2OLt&}8_W-;JfY@Fxe+gXSzz(7f-Y>b3ur<=lECC%@wbd%R3cV6J5rD94X302ShwS+JSzhVC8(Y zje*t7+ulI&Sr&E!z;==!sTLS+l*8a|KjJ8$GdepkOeh%ZC_4^+u^EGEq(BrYV9cZJ zC@5gXCy@eNF9{N>9_YH#-%2mw`<(O)L3v79*daOwUo~oa6!uZrCyKxukbr*Bhz!-h zEd{ZtQ3N;1Q|kO)z_9fPnr1+_p{222Oq`RO^L3Q40Ih+abSuhG1)eNNIuMsgiG(Kc zO9b^PK?{W;=t$V<>Rs%ZdJ=5~?sMl-EG8*M2muF!77$hRQ>z3-(a{@7MBT;CC}&W2 z$^~MJW9{HZAcifxV@f$_eiVMh`j;*d_jR(DfAi0y_r<>^9_sk^xqA{xeRNZTx=f2RVW!u@Wz9t6h6*~ig9Sjc-2Nffht@%v z)rnXxNVVelXe3G-BS9F=p|UKDf|z%(J23)aWWjivYutk|_897nF#+8G)M8oh-l6Dk z8@i#_NJxx$hGeT-DwlFmxO-42B37wXuH?EuffnFW2)*%65RQ^LzB?JC2-0Pa=yF`& z`QBlWJIKm8#j;Ru9ReA2WJPEjAqYwIOK2XbGUy6fVAngTW*8(+ahnSr)Ql*e1E>P# z_u_|6D0$ta{!jZlara>$$ z1y-QLp-m7%-IGS!2zLCz2Ywo`?&57hDcr-3Dfgn&aJ_+(O_z%C<6568OJE#o=CjCZ z*#T~is1?Y+)SrVg-nl;&#Lq$=B)IrbISY3=I4uHO=r1&YWqFrqyu>0U%Z0WF)F1$; z7k&}6_<70!ODv_x&tS#S-&D}d01ZKF7%_Mkff|v2C8aftz1T47kG3$fl*n~I#A*gs zi|+u5&ap|M=(jXlgH@<#d2l_oB()*^g4YWa z1^odDLK}jR1@FVg7dZjn4R|Sp^`p?V81l>qhoH77lYw-?;3Bdy#Hw!PQNdZv?U%sT z$Ou`orz2GbJug1SF{`K*1h<`KrH=BR)xDoIR`8UeH zW&B&ozcu_@%fEH}ThG4@{M*F8&HUTKzpeb+#=q_S+rht`{M*I9-TWKl-yZ($<=;O3 zjXT)WHrtHDz=OVpl8(pD8l>{S21F`&-e${`^M7Qsb;_T9(PnE_RGjneQo=9WY*&?I zI7VIR3_m`q+Y*ND@kY08A^hOugKk?##=Q?^du*){_3=W#Z8)F(^|s%(Rp@@cJzy(5 zr2pYeq`Q;h&*(6enr%B?SaI4E+Y9wh`;k>Az<;++-xoKWHr@8)tulN0O8I*ECc$3X zqVG?(oi@q#@_eaXh3}`b3g0U;r5f4)eXi6+_N%j{J_`MLh`z67()XXT>HB&fh5z$< zSs~ePtd>Q|{+Gq_GP2)XD8~WMpzW8#(uTaCXwHPQN9|Sn)VNxy+Pt=Ro3);Ub-Am# zlX*S2lpU@i-0O{6lQw;@J2#X!mzTI@;PBkxT7uizhTNd7930E7&y({zCgT0J>J?5fs4j!ZV8HIgHn^=LR$8ni{(I@`jrlSz3>o|ZS{ZP{1c zL{%wc&16-w7Q(M#Wo518uVrmy)vxNrO;$5ry8==R;`Wfg zmGzR<#`*}{4se|O9V|gsCrhd})z-!8Dq1VrD+UOso7I*LQmuNan59GH>|;}+hp z9A}}j5ppEh#=%jFon$rTZRMTiW0c|myGpP@mYE;Tug@Q+*h6gmmdRTtD0rAnQt$}d zxMlN}?6N6>jk0MKoH53IG_L1aAW(azf&5||F=E$00IDs3qO|coa$p##Qjsa;% z>IVJR<#{6M6kcbN9h$@C@Hs+`Oh>jO&#@o^IvkyjE=OhQ)zaD0<M@EsL^W{K0HP5JPAN0npaW--gSIip ztYgGE>Kt=kb&flm)5=`Ko;nJ+>ac)iu0hwVtJU4(si#!N9YbkD#;m77LsL&6a&y{n z+Asipl_07rhr2n zFH!isqh0EdMp3p2=ajQ2teEzan|Jsre8I8kXpkDECaGC!ky@oTsZ;91s+es7 z*%-{W=!jE$uAnYdy{K!}>+&^HEmj?4u5tIayNOtD-7)A+@P>B?It+Pcyqd3BLzmkI zNOli-WN!q*-ZM+LHR@A$eFH&?MCs zm0YEv(#+BUO;K!R($eA0!vmVC*ea#v!&`9bimgUkJiKvukP1*Q4N?O%z(NBw!UCO} zV1b;?ut2pISfE-fEH~sKEHAUQ!}3EK!oo{XQbgb*WB{$%9&$ z*}8y+m-4z{MVKuH3(sEmz{+8^URb%zh8S8tv&CT*Fk1pv5wj&>6+<+_DgkrCDrL4I zSmh9i63)IWwsC32*&XQSJjk8Bff&(!T#5&Jgd-UkA>N&qvgJIvS#FVg^6Crf3pWe5 z3ZWGEw;j{cf)tX=-qDq;FJ_llNOLke7HMvl3 zmAfzojcAhFHV1HHQD;$K(R9&v(TJuH$SyYl6fc_LAeBI}+ze2nXtv0HXaoz#0BLdy zK*^#xfVvzKI_{!WDUZpaqS`}^#hZScA}ykP>xCoK3JcI{QIKV+R-TaOlxR`Yp+vF0 zvc57|We)&#Sz40vPyn}LTaua&wH$I0bOrD_K+$k;5M&jwAwc|!ZADr=w0@|GpzDBd z02)+mtJ2h==|fS1ZUEj6XjrwaONm4AvSe8e!8Z{S13W{wZAfKBV@1PEBq*dou9pW9;#F+*^3tJb zbX+0+YLFY{1$q3?!lABcEIJfjjc!Co3BOTpkQadOmuwC4Sjhmvnt(hGSWvPx%8=k% z*llZ;n+lo>qKBpqtsY92jcFNvTZ^2T-&k0N##~3!m3^eWVoZzZwpO|F(9EHYL&?%{ zB3_4Fr;IB;XP-0fEYvcK^NI_L$2I1*b;)H)eepoCFFGDgl#J7e+bvfXcNUKn&lg9d z4H#}{^cW|WkI7M`wm3UF867B@FX1AgNA8sqa#9|U2cdBYu{KWPs7KCL))5VTpjR$b zYKk+X6VYTz+2L``@Z0+2!QxPKDmqxwaJc<&$Kg(Z-ELc4u2kxZlf|y+)o8qAGzcmr zk^BtO@j|ac_TvN_K!!_zfm%sqGexjL6k!W6P-{TWQ)US^ghGXoGT!qWL>U$dHVjEx z3s{C^8b`jQ9blMd_awOZBJXX9ySQGNN z90M#@w~fmKRjWtr)n(ON6f%kaJAn|$ya{=pAX8wb7C<2WCgnm(aT@$w6CKxzpr)Y} z$8V`D)($62d(nz@P&#V~X9gVK3>>_4H!W+2@wlBL&B`-!HtJdeB}=Y9f;kTc|5+I)w;t&t*aD(216F}y zR&FK8B3N|@kSfKtAooVMqalLg#HGB2T2xE6MY+3#k5w!3s_auTm2Ra+=~LoLLK##x z2zgark$XVcqs+E~{zYA2)npQ%Vrd$gsvH9DIuaQL?lERtl?w^70gfsJ`yO}O*5&ns zM{hf5dO)LS=fP<1Vs0$2^OnV1>M7nfq;?15op9SW*A{k`bx>lOvMqO(jcd31 zZAkYZsqT}|&^ybMA8D-^CJdLNDYL*h39Uex$Xz6u59OLDAJ2d8Y$yTX!9hsoPvrcJ2+pJbhku+#RQ=y3} z?3I-mS~{w_s-}-jY0#%zl+g;Ua{0*W5lo>$tX8E{nNYX$CN(js;X%rt*vH`<}f5+2db`C z)gM8pI&Jx%&2^IzpV?|k2rmGgJLPzX`wyLbaJ4f<%MVYI15o{eO3xGl1t}4sb zQG#tM>q;S#gRZ!)R1#zhGlp6~AZ<65I)d1pTS_w^&>**zBtc}S-I-TCr{zK)cg`K@ zA(-ZrofE*yhidM0)ztG*R&$o2f3KpDA-y}ZBfqYCq&h;}tT|it6<0K{5}3#wiHOcT zM#=b`nzJ5B7oZC}N8u<^Y(8h1mYF}N6)U!obMVL(pwLk>oeQK^mpQSl1gn8NgjTL`wj!880f!^6W`&ZjbJjXHsuwg#vei0UoErqIch))OngvafY;}NPElb&U z)H^q-GHbReyun%T%tSbJ^m=6UStQ-$oUNXvuqNaM%bCKLqi-U17}+v;2-RXOIIRbQrcsF?GoM30zrz&VT=$b>VhcB@NTr{0|Q3RNWL z>`MFZ0#U;xoAo(0txRjc;tw@_Wc z(KJ51P!X-cV$zgyuM)`!r#)?m&}l+C=h@P2DjRi{xi-8lzAniIWn0Vv3tcp|YfZE1 z5>4!eJzL&(U#(1u2tS{h(QI+vx!}}Pm+DhPYNnb8tsaD;0Gf+VJ7=7;&N=6V+MG6& zhT2?p&U;4`%4ghJtJbM5Uu7h8fQx&IF^$AlLEJjEQN*zB-w>i-N(IqVg8p0!fLWBB)FyQVmetZRcvRijTdZ(rU0QGw)#G!RW!VgHtXW&f=&|p;&0U zY_)uzkX>q5Xqg;7wJ)?mj*vPMvb)jznd)?Cte~E27}RRhq505CC^Nhs-VVFcv(xk3 zz|K~+uuwvFmqWBni<)$!mU-%8`gGoGURi!?p_r_zQC?aLt5xk(>nSnRFg#C=s9Kr1 zNscnLJJaVuVQSUNNX>y3IHfwZ%a?he+k+m_sJ0&1JW!WapVgNY&zjF#$Xdk23Cz`~ zcA)pg)TrL9QxEJ+>rI>Xpt+jV`2#d}S|U%gDreEW%H@TpMQzU7F3_;#jQA~TD^jr5 zZWHQ&I;hqXR;xOgMH4JhXF}>!yO5EEnp8!zQ3w?vsSbNq#TrOp$cq|vsCC)XK%grv}wCUopc2c8^*S(-(x7wFed$8_c{lSKVH9o|TsoOb?FxjfgPXWA?KrbAk|k5C5H`CCRX<7Ok6L5`L2S`gxr)|{5- zin?kLVbrtY;dC8Q$JGh7Rqxfi(`XIJ=j-uJQDjU%3n$AK{WiBWt}f*D6wV!RjXCi2ZbV2YprRkiPgvunYK-JA;(1y7vR;jpyAW%eVx9+%)A53N4AdS)wI@x zC_D-wolTBftzOI1p`z5m(V)?)eX|zTkz2dgqm61;wF#|^yd7FxOK3@LP^%*YN#1p78);Keoo75_zB)qg2I7b|ra^-zu`1I2ISnF% z+MFV6{6zxzhqP&lT7C#IP7v-ia+uW`D3v8`i;vrddLvO|Ns}>%=jnxdR4>z;An8p| zGu3Vt$lIDr_aU@}O1O?%7XtA$N`76db+uBA4b860`acnDLmS9xP!?pAVhgY70Akl? za~ip{wd?JH%wT)4Nv8VQ_4q-O1T-_QSFS=-Ib3?ZGC&R=9GVQIkWMYvmp_<4o&N?^ zEl>X!N|eel=Hv^=a9wpxxF_9=)`+ zGsiQhGqJk`w5Z;oga|*Xw^7?R>6K}3QYKA$xBjm*Of=~+y(8`F;kO9AS^qa-wd>GR zn)D7~b&}PrcToz>dMl#B(Sj83AnaDXhsf8d$MsDl-%C{M)Q9yE0O0J>2lR%t1jcn+ zHy{ZfGOADOGy0sqpeHGA3^DC#TG{|LOpl(IR+tt|t4ym+dz&)o(eD)2AmR4vWeBQC z`z68R`n$rqF06B$dyv4);k!sT7}OJKbAj>f%KX97ky1N$KQZv@cI-iKJ4Rp!VUOxE z_Snd_vn<51N|uK*)TYgGZX?({cg^a3g^S!prPml`xT%k)$)%_wVsG<`h`0@DcE%7c zU@pc$Z>r`*nyb{s%V1Ai=3JeZw#w6_97DV`m1&vWZb%y@(lw`zrj4bIo72uXt``p( zBO)M?wv@J#ww|_uz&y-KqsFL?jf!T<#t0d$Mw`)P#1LbQIz@BZRN7*iY_u4i#=LQr zTBtc~Fm2G7AZJ@zJgtfT8n$X{=Q)O4Qv`2E=04Xn!8=fjiL_;7hEnTB*Wma$F=#L`xcO(UDrFqXE#87r+3x4s2EHYu^* zv;k;h!>H&zG!_yeEfUu78jSez81?5do|w-ym$R62m3PgFv{q^Z7rLjb(p~GWcQ?AP zIu)d{J7m?RxhoM?$cr(R7UlM0+Q+Hqt*7Ootri3KQQljisLRvoUyZCs26BgThjXKO zWsJ~dV-$NSZSHZNFDZT0ob@ZTDPt(r%L#LOd|! z5+UFnj472yjZuqb3~DV(ah&55jVSGP*M^x=++E4(&|=7L*_-f^0$jsLj&vF^S1qqq z+^FMr!l>uvw%VzIL*WCrqVu8cD7P7&AGO!I(a14|jV5l78tW3(d)%1x4Ey>Dn|T)# zzE4nZLv+uG?~^;uHXd)@xSv3%Mxedg#e4d)(awWbj1JSL{dCMcjV^Al8{ORApu!=` z4RDO?^0{I>%Pm|=U&`s>7_y72@|I4}17$koZ}9i{NBmq3qdl-u&pft@LcR%KlfTbD z?%yV!%tPC)xMa6I4V^g8B^V|TOhGKu>Q1<2Oe+vT^d>wl4HB@>)$5A7hukCXCXXu( z+v$a_n5)Ot=ORv!-ED3krB;YYS6y*8jSn*zAyzR)gakJ6MWd(1)9PvSw0klsi>PbN zHRz`OtL!v%kEpBDUFgY6Lm!U18eK7Sbm{dJQqoaZ6Na4`_W}~Ndo)j`C)*QEgHVaO znq5}1G#bS{Wt8~NeqRk0pwiU<*0H-~cecA0qgE}YS;PCvH28I$>ggsPt)u*FT`ev# z!qG5RPq-L+T^)pP4t+GjH4tTLU2U!|1W?|MgjolwQHmSrX@cu3-Q5y#S|jSvY!ZAL z7`>i8PmG7OAoVt+-{sm2%ju!?!t{ppUf#?-t{#b)sMl5JUUv6!Sf4A-?NL{PvxVr5 zEiy6EtgA-;CRD0fm*#bOJH12RVegi2;}%yzoqRib$E<6}TO)rJrCD)Jd1gFwo^2lu z`a_Z7$W}!3=yg*@G`e@1k_d*O++>qRFiN|-%N+x|^z!nRfjLIqecWB+o&%eJ7+_$M zLKAKc{hlO|h)3dxfc(BVlkO1aA&1*x;Wh2Ao6jkm$u>K)2A<(k>*7JjFvmzocC z+|3WoNUhBy%1>;U=@Hzv;*I($eGNYFCv+3y92e&uAyJ^8ziQR?PoItwgGsCM*$3 zhQ>mIOX8k&Z>>)bj31ahFqJ)%J)gapjm>P(a@aG04juBf5t|KqMDuNUHa*)O(b(-E zc`BeoVC^Pp%-aig=p?osGNY61?4s^Ro5MbDH!5Nq_PD$;f(?7d!60#Rj(TF=K5rBC zj!{pZH|nkQHhSBf>FIclcXLS1jnbJg??a5kOt403zMlc1EAJsX~@-geHd%bp~a zas>^aho+CB@hf@rH+lyMcNLWz_YMlD26nEI{{qY+>U`BZ?p+8ig*HR+17im|-I^Wa*=~F4)6*_N}*mq*SJheioA6S* zvLOm;5L!bq@_e<3Gom~NwxQ`~-hmP2M`)r3UpwTW1jV`0H{hG|ZI*49EtjvBk0^hQ z&_-WJjXAwJvHUtpt;aXw8}rpuE?rEUH^!NsSjRtx}!k0vHgajdl z_(|Ue5?(^W!@PHl`0n9)ov+P5<9(?3jzJ^qA$goxe?N76s&A0n(+HXM&mnZefOs3<1Dc`;Oa2xAG&z>x*yOt4ioYYU6xb@7CGdvd7nq~+ZTRIt zW*|F|7bpzOQ`2nv?SW`u0n4K{+I8{;LaFeYK+JIzT(*0gh&F`sZvrd23GC!eV7I>q z*6sLXG^;N#QPl1D6Es&SFoiQ8GdR&PSF}*ETp6lrtlE-@p{;UH6)jPnngi{DWpcCx zIsz+HmsUVJ0;8NMTLWWUPId&cgB`)EraLd#85}p=g~2X!8MQkw9`FS#gAKvvU~h0W zI31b|tyAN62l}vnJBStB4a%rH&=c4qD#lFs5JHkNiOoJ>*J({+O(-KqjT^3uXqhgL%QiU^W(W z;e|&y027YFU>OysGFS_0R0?MuoHfE(4`(f5*1$2r3EdE^r?i`~kkbL`b_E+;VDM(s z(@4lISjcXo1X=;@4mJyCC!8(9*#&1CVfJDjyj?iPgB?Vv-r!_#Iye`c4=w~dDP$OH z;$4*ENDAJKMRa&4gHr&_n8-1KV|jb1RHI0K4)J>}&pbSRmS+K;I2C9VYw>fzgyozM zCN1YeaFEKd8q5w22}fpVnBuPn3q#RRS!jfyTBs&8N>EoQGgJuAnB|GWbJg;c!81-N z`>^g`7@Dx0(a@yjEW;51^ogcWUuXnts&(Pc@Iv}ldUs}D<}~3ng<3*wp&85B8k!Z( zworR$jyDSsT7lAT>W1ym?*>ETp^4B^crz^Yc%e^H$N&!!8h&GXd-}rvRoB;tHkX}u zO0sodN!GRXb?=pI%hreGv20&`__e~QMB&v?g>e{#(GU%z5HGLGXoy0*SVKKT0hd=L zDpgpAs6dCuoO_k28}-0XsJ`3MXND1yS~7Nk{2NQiw&cFEX>$P=&C% za82qEawy!8Iu!;IN1bjH<3zZ8_@pREyHZ8EBLPj!Hcz0$?XPYxrImOQ^M?0UMug$0MVXjHA9Nr<1dgM}&y!fWWIeQ#j z5C`J57?aY|c-JJvl6WAN#fn%J55)|nmK5VsLdvROR?0~^6)Z^y(zXiLr6XyFz!Wxw zZpFL`-XpDo3i3#DR|TKC1M=TL15B)mQ0Vz>{0(G%1Qj^R}WtCJB zTjH6hHkpb_s)|QqS4>IA(uq`6Nr&RGcp+A$rqq)1Y${O`z0LxInqt(s%b-&+=`1p+ zBW9d0X)b*!4#k3V*LlW1{-``k&aU%lQSWJZTi%vjMm7IiGz_(~1f-<2EtRE)RB^VP z>IW2Y=rdW>n(5?Jo0%8omqTeCNgYY+EIXUdo>OgR{}M;tWQ$8#sU+2<182i|;k4QIdSfgrq|V>UNx4i&VVz;^4F!5#**NSIkz6Nb)k}6&Y&~PwB}tsHJaNQcjlaW zml0W~Ermm5P0iMolXva7@~+G*Dj$ucj~wO0$6>XIE?FEkM0WOUZZzkbSBr=Wn2M5Q z@~(or=ss|(RY6pen4MMEH-dACIkl0Dk&m=H>ppb5LR+DH=qNM}sg2}c;;7X}@>Ts# z=Wgb_^Skq>^Qa082VU2JMh_WDU8=y2YxqdHdZdh0Anm#)AnMAvZmEl#z5D7ubawB6FiCfqqT zU3#t?*FB|DbRDsMxq)l!f?+i5=7L0^{@0)pJF}Vt*DdJUS)S-+2rD&S5JJ{%|(vW1ZuG7C?(N!wcldJq2CmE<}^u+Fj#?nXSwo zvY2OB!wRb8>}-CvI$LApV~}NvmY6-8jZ#91+2h&M+4gLVkR-s)?DcGX2IZ6lwL9CJ z?ay9e;X5&dPLKk(J3E-YoJ~^j6u=?4Dbgv0pjWe7DoAnClsxT<9zd%ql5Zn%?OaAB z@6VQ@Y7L8RO(d$HOXsMc*%X|hq5fS|KNWT=Hq?I+FqQCDtgkMwvn9m-LQ4N#d`?h@Ya;7| zhwX`9cfeD;(ADlUVBZQVr^)>eCB{jI^nKa#Y~LTyQQ1^7gC94%Lh>=Y8Pi z33Yvj7O1vebAh>C6^PF5Qm&V2X{PDcjeU7!mky~9dQMl>0K?nl6@0+so|BM>A-GV?nuf=uyq zEdKs{X+BE4-26V{#VDB^sFiv3#imwP7t6dOcYop7+w}4N1jVR59IHuErfaCu(+5I| z60HN-B3T3s=F=)j$8a(#`*J=@YSiaj57BajHkh2V`HT5&3%=_b^Jnwt^PTzbLzo>( zxB&vm%&SP39quVm0u98wgx>VxKAktBiKz?Js^&+&T?#as7XsdZIzb+xkQ-XgvkybA%&ldImxWCJ) z9D~5GKb~R>7Z!|N4fp9QmDwW&T5PcBQ{Iok>!7MHFrp05P={!$*sZ{TJ#y0}F9br$ z*X~P-mt4p#afhP{ur0S_6S;x-qq7j7AS2XIXPKGexC+){QA5U{z>Tj*n_e1u?k zR22t6$JAa97ES>U7VcH#j3HW_-_n#9ItzL$f|M7!3l|H+1)~*}O(&f?2!FG{<7}7a zkZEL9K~my}R1k*?0#Ry6^>V>Q(P~Ua4^rGDvc7PFbUO=P6=^S=0ZGAFG|qY~T(S9F zXJN$rF5aKC&PpT0k&ng(*&p>A*R3H}I8LJPKP#@p>u8d4ala5-OubGI5Z${NUknlu zz`-_|fFRDdMG25`%q?w2t!EeMO;N?WqK>!4@nU=NY%!xUsvsRP(h$dG^&X=qOF7Oi zUM$`$<|tR$#pYrU$hJ!F1KfF)o>!5>#lfQ1Q&0mDvP)oYvADRuShS*H?m%R3u@BBA zTEjkZ^U&*Tu|!}2Vs97k*`i!+F{XcxCRvAGrHGz=aJF#h>6*^U*C6y zGDutX?rTKB2^X1d1{_h&mlDgw^Sw*DVW={gL59I zo+FhW^~605s_uX%=GpS3JsHooCyzu9JY`Rl!UR<@9DUJmflNa0*ddH91Rk@prif!t zorOswB89nUC7<>ju{z3lDjqF6aK7!)di4y-dyL*&mg@u09rMei3+9y-kT5*1%reje5by$ zAB_SQ5bh`3UOn@@-mlTyCF+fNAs$c+QH+cg_x7#$hS-4wIT{ZF@&5So3Cl*VM)HUcq-qx!v_%dT)`$ z*oq-~7gDagBkvsu>^luy-_Vy@iZ934a%-iv=Gy7nJtb0v60}fr?A6+U?jtqT41k`{ zlGo*<1r*t5#3@xx8ENpWR%vcyWVO}t@+_}Iua)^%UV-@|Z;tu*UMtRIVPg&#q{ybg zji2lYSecZpuO4Po2s%7Vt-lmF4D2kI-{`ImSFJW=B=4g$j4j`>uj3O)g*-qP0R;f= zM*!!I&6*-Y9{Cz9bdY5Rk!!vtqRKcDt10=atP+n=jcuR6s=4e_CpT4eK~;rVpt-g! zcjeQNi-o8^9A2P#M8F^P^C2Oe45z}G@GzX>M)WOw>|+~i$LtDN2j`k^aRS;KXarnA zH})4KTeAGkrt2CWPgHk*!QLU zNfn6uQ#i`2x%7F#-cms~!li9!0z*Wz`n~>)itv8H@AhYHXlhqJQk`Bm34aplwFDqkp}hk_-5J)r^8oa9PL0xlYVtV^7`0%AL7H!@D3%q?Wg{6=Fh*1 z6l^%*x$WPjG`IbA|B1h-f;E8qDp>UI`%9GdyuXGZN04$rXaPY^{cVW!s`cd$JovEM z0*%Uk`N5Aq_%7D!YJNBK>wYiukNn%rZ}xwToLBJ5$&np&=LiC+?y+)GtbkBE0z%XTjvQjUB6YqW3uQjIFB2e7UJ zuB9VZeYkGYpm3KDy+B|+$hhQUV=BLNyUxo&xrHvF!71>6c5B%fIR4idCsc^>CAxuo zN(sf6a!YLroCNKk%Q+)P3PHD*c9!x>yGzBT($c|FWeE(7{?(=0QhljO@$uH8%g

wm*sFF0xdDt5f^GbK)6_qah+(nfPQ&5g8S5vNSJZC2+a3@@yq*>|3ZU8 zEU+yXS!d%T?nsApk0EsT5x7u+tw4`}I9LNJzhq!5kOnd&>Or6!h^dtyxSwQ=B7kKw z%-sU{pnJ6%J&(qpW}c2HBJK(XT7l!hHAOrOoCR*E^>Z@_jCCMR#u{q{Ia2AI)67-OZt;=tGeC>h-S4@UMG#jU4>_g&n0@2?z3 zj&TF=bfbvd17*goP#P87em`Vrow-Mp#wqTRcW?oy@hZ}M6*=WrF`%lU_Hilu6c^U_ zSC5&96AC!MMf4k7Ge3P5Y1`3h2X9{(5;#)BywNAXCd{t#%X43mj%1Qi(q55xf*2gWr`FFCU6fws)9*?F$Xdc z2asTal7wb(Q9ngM7C@TOGlb@0XdvrAeUQb0gJ3yWg)M?_ZMUgl(42jsw+j#9BuiwgJvzFd*+hwKkC%GN@A^q=kGDa?aVP6H_>txI^2* z5hO@_%yyAU+@}~vgXj zmGNRh?pK91bOHH7ZilRq!>3KWLOV=Cmn7)djB7@ATKn}IzWq>d^J=rl0`@7O8{!94 zT3*})me+=ib47&2T52u5cFhPk6f_4*4R;J36S}`vUb`otv{qTu;?g^S!?pUFQK06} z3*a=@^y^ju<=3O|8qxIcGvszrFqszKjqZ@P#q~ZSy4m#RWZldB)Abl^ zhGAI*X^rG)s2>WlsaSt~2Ug}V=LWV&t1GV{|i z#&pEpVa+!XDX;?Fr7UgB$MTt6RKW(oeX6P*`9Ll`0tdv*W7Is7%Txz6gf`{2T%iDY z#IF)iK-@a9i*iG5fqEoh7}lYYnattz&G3(pbyLhmHkIN4q$3 zs15NUE3CMcL)Fj;iN26`L#HZm5NeY)7bxmL=!{ahK(1Ab6NS(@5&AL@iR#j0Ma4n(4l-Q-vPasqikDoERRC* z&md$DRbIfdXB87bJEleN2r5@7`4Vak?IUI$px;u)0j<{~b`SqG>DLhsgE-&0%Z!!K zi_kE11@t-un+F&O`Zy&)Ygg*G)F3<#XCj5jZloC5kHqvpM&Vc?=`ws5#@6;LSWN$I zbP9KPgs-+q(5WD@_+CR90m~w{Ltt?>J>Chc3(lqRLAXqt@!`{OJA4*C4|iCZV2|+s zqjy=M{L7pKlUfN=MPW4u!`vYo=qS&}tRRx?E1!nH6boA=4QQAQ<2w>Fjo0&8iJ)eX zn;~+8ssMz1kaTq45pq5b<6E5u&4^2+k=!k!G4hcN>>xfCRVh-5c&UbX5Vs=%5e>o` ziAI7dkd4SHkdMSDlnaq7k+_J?=tl5T+a7gIzC!V1n~ zqB!{itqxF6KZIY2q?vX(=H{7Opv0~t_Ypq2OA1`Wlu40jH<2-D`_v-H=7}-NM}_GA z#M{X6ePla2fU%P=pd9#UK6=0;l}XoNG#$;t#7Tuj$k7D2RT0gcOs0_OlRTR(91k@yW^!?oew=rK~CmH9?|Be{{0(gavc71 zWQN$qi9Z8{{5|;DjUkh9MR_2LG9v;C0E!bo0)KbohVfyI3dLUAV1|+yMK4h^GfD{F zfn}7^#43W5FEZcC*aEQ!Fq=}E*Z_IB;bvs7go3!;&_2~aH9qBGPbC057@9j~TBS7c zd1y*zR$$d0akTJh9Z3(LgKvaSmq_`i_^%dxPd}BJ$QX0ulwSO4@@bNxDMB+a>yl<@ zhR_0RyyO_VP3XbX^3yy+3xw95)}Iy`x=(29>G4yna3h`Lr&~|H$@~MxE|bRXrx#BL zPb(6tYaIY&jfc$a1liQ};%Oe1NZ2*hP0(O&s>Z~Kl(pdI2}4dvW@59x zd9>LkFuB>-Y;B&YU=v`SblL*-NJ2~7+T7mU*(_`pHybLwxY?wz8Bp_^Ez&9r_AUY( zusmcpMKj8lVpSNSuvvXVWxTt2_~6$WeRs3L{NiSZ1Xh_!T}ty1x-~XQmn5gB>&Dy9!W`?^vx^(MebV->>G#Q$?z_BI-(7hKEq z!qhf>$Iv$YiE?N9vF6V7pWy#D`2VEzO(UJ5Z@QUKhNhcI!_ZXal(wn%#LzMcM&-%` zt20-o=9Drp9h-4;IzO#6OxYP_YSNK zlAhW#Xd+@}DrCq`ZE)GCuPWIo*94b=qvWPuzU|rjBtP{P)9%z)xcb!pHtbIA>y-M` ztzOAbZE)9>d9gdtBB0E^@h1 zGrwi1n?L00=AS4>M6zr&&Cj@&`J0-S`S+D$m2?VH+x%Oaw)uZ4XXeOrG?I?l$92um zKG5ua+(Z1Hc`%_|n)f15XlS0+T$!g0BN#s)n&*{~`Dej4GzoWQ@(81{57-pRRnCroKLO>X`z#mj$Haq-_$f;_sw9&U}=xF~Nk#CV%Y=6|F_ z@x<`N`5$Q#{LeL-f7B#-3zy<8hBW^hrVRg{Imv%RN#V)z-_WG_7fJ?C7S9$E%<=z7 zy(P~(xNRQa+PuTC&A+Ma@XwVZ|GSgB{C5re{2!Z&d`73_$=M}mpPT}Z%X2mU`&3#D zXjO++N4!mUg!pyDZ}5MoG5v`N%UQKjc5h zUGeXFG|x3R{QTrKKd-yyzogu%qwwy43WBDLuVmC{Ay1 z>FMt%)#>jTs?$G&|5MQZ8a_RL2U=-HNlmwAl*8#?Ug=i$bVt)~nrhQ;8cwF)8TFr!fR+XRaqe3r>O-oCK{f2^t*h%*zi9dvCdCe4Kmc z9(`-3tDj8F@Ob;o$WN3c94!q~nZM-fGl@y1L{5dA&df`LC8E2Saq0#$&dKhKQ*$}<1;fS6Zz-2} z26(!7hBGgno;}?NY244eqtROa4R=5DZN+H$wn=OGl`@+772sbfyyc|@!32xXAY0xs zMJ*q4vgMDInB|WE|3VS)#PGx|FINyOX<0F3Eh}8k^5w~G%SWc1AYC6!70G`*`Yjjw~;}1%VCAGS{{&8=977Q`=I0qBO~AST3I^ z9n14)=sH~_*RyRN^q3a(8~CQdvDz#g)vgNM+$cq>!dO!=boIH^*Qx|q;+L7Ze8J$)_0V+wTU;5HL3GN z_H?_}4Ncm*VaQrHxLqrHE1rGp?{HabV1nC+14?E>DOz2VT+wj;(0h7v%J;THU*zy|=Ec=>OK7PPs$w40qPXB%l_W zz4c_08(X*aK;dX@9X+SF#W{o4mVTn>Z8uLqgY8o=3<__1_RL^;ORz0)g6(KRiQ1m; zp}=FdO)g{mz9wV)TP0@e8(y;viz6(VNM>(_wbxOrH)+tTMN4h7rrOB3U zNz=B4bZ55B$rIbAa%TGvcuKm-Gh1OoY1@(prA5xU?S;qiTz6sfO?GTP&A_$-ctsi5 zzO8idT-qWuCmPzmi0ggNqOd~o@wM$GcWpaCIoY1GcM|>}hPoZY;}JP6m2nKl2^h!r(u8tC&YAr$3{d3UZZUN17OrRioT-CcUfAE_ zF6@7(^z2@p(t*RB+fxL=>D!-UCZQSForWv>Ja=W^QwDfO$eRZL)oTwK?(E;=?(Dx% z#*C!7x6c}kjup=6_$`HZcu-Ut!NFv>943R;@!Oo&@e{@6_;V%Tz*KBc6Lg3M*&%X4 z$A^lHC+7H26L;)U#DqhmNn)Kh;czHPJSm4mv*mb(O^c7yjxTd*$A46Ej%Oato~_^r zPH+VW=2W{ZvA6ae4zB2M7>bT>EBlV0DF+nJ@^RVm6|U@%(JUR$S2TO?)g5nhb;qA7 zO$YjO(_z&sEe9+2V+Y3_JDw>gj%S)vmDC2Q4bmA%=PIcKQpfS0(sjJ2xgedfZ4A=D zF{>Fk-d1{e`i{3Xmul!CSVPB#a^?8EX5@HIImDv2220wy8;3=?c6?d6bzrVz(P@Qg zZj8Ugymw4bjvcegy<=I?3hya;;g^4iE+hyZ&MJ5eyx=ieg%!mrYyeJ8C|+TEV$vke!}&I^n`LQR3^BN za6Vz^3HW!@o^U&<^n|LOAU&Xj2~f*~aPb+XL(Zj8)@h&MRdyqMp1VQO@ZzT&FJ>l` z8zD0RiV|iZ0LwzRl0aCMD)MC_Xgsh8wMiAi%SvB9-jpWc7X5ja#x90@623Zs`X~08dbQMxkYdmL-!Cm7dW@PE2~n#iS3Fgo-ACCZ+e4 zEeTy4<%bkANHHy~D_JQ*@wX+MR+Q)i$(EPaxjf<)qz}1WmAfx(XiCyc3|1Ql(r3f=r^i!oO{nSvE{s#U(!N*kfKsv_2LK;~#HHqVD(pyShdf~+T;7IxnLqqxvt|k3S zb0ncfw#aFab1XflnR`ci+tihwb6x3gm5%fe%7t1yJ!#1>kd`L<(h@h2KBrugcoerJ x8m=Uf8E0&NI%*s29DJ>t<8PNWAcT2LY1^X%JunMttU`G4Q< z`~N<}Z%E#~p1ttY`rKF z0MKY#(MrMcuCA77Tcim+WkpkGbw;jXR^9$h&h>JMGl5)ieHbm6nILOwO>As5II~=q^TMXyj%fBw zHgo0bwlEt(uo_m~)+kCIRvD3hWXx3%wy$C#;l+QAKtv{K{@J250+{;5@c;G$Kx}ze^yOLq zHW?hmQ)g#*HS&CN$B#!xGX;n8rly6F<}ZBkud}1WRhyN!tu{I(>XJFLvb`-L(^N|? z47YSSQ_^L1!?CFk{B^z6*p!B$R^2AL2M>!|+M3$0?Lvz+r`9jTu=;5`0 znG((6WA(g6<#Vem%j-k`#xwz`T3B8aI_Kp3Q=<8GtI+ke?JaGw`gZXvw)Uen(cHy# zS60leuC16;J-2dUXx{Oi8t;;q-rv=8}K;+_@U{i*NsBN@G({LD(A6 zw8b@7Hq?a{vasf0y&}CiW7>%3?E1wuq0VquWY)@PThq3mT=#l38)zZ^tV?Ilt2_XC zn}-7>YlzY-mWSJ-k*4WQkx+Cvu#2nbRnA{rJHM`CPWimqp~~ymp@vx?)P?F7hAJ19 zFMggpg5Xip-rW^BbNP&!=q;g=5z$*&_4C?eEzPS#*F@T4b9*N*YtE>zXkXOIZ~XY5VRlRjWn?8-zxXe=*Tcftl!gwe5>aI9 zT)odrUSxEpExao78p%bD+(IhB_)Txl1>KR()tnGIo5PKfKao7fkuzZ&|HX?)u*)A3 zQCMFa>Fk2AXt*+I-|E}{8oh64v>=i4KGK`B>Su+!S{loR2~F$FS&5W6k=71a)>!1a z*l#Xaa7%MKTED$BR?!_hKj-<|(W>RGFr2GU#;~bt&jEQ>OJz$9CX}tqZ+`%NRngws zit&L~Z;YMyA1K;RD3kW)uJ6shwt3hW&!5)6Vc%uZtVV5{V4GKc;g9{IcQlVO%vcre z-EFZOkSUt)VumTS^Iw=8C=*@#?~B$Rjb@8K%c|R&BG=7tPXEcTzUUUAGSV7}MYb|q zrYISeLBSm;xY_r`Dc4p)q(E2K+(>im_@P((qrr9z_f_rJM4r8&>$PYp1W>98#bGk1 z1EIhzjY8E9u_sP2*_6&Ts9BQ3`OdWyfopZ4m7U#yMA>?XuzR=pezUK5s2pW{=3<{>qhsK0;-CSo}{gl5|=#R1Yrs=-nww9_Vj<=6ABj*fCl z4RdO$+E0z3uqBPqbo8Rd$A>(wWQ{{j;%96DA1T(lz^o?>6VuS9Ev9+E=L}cNSM!$ON0M z58yvwl`ivLV=SYZQ9I)4B$5pCb*mgS3z^&P@9rwkzDBHryb6Ugp4qG*P4u# zBo{j~Cb)DVLQZpcLs@MYbGn>4|9i$)e}J;>E;07`>Faa;3D)09Xx7-|gh8<+X?|x*w59C;0WLWWfE{&^WLJZe zER90wI?l>n|3!$aw*je)T+`ARArO;6KM}4DrPUK-{RBy_-dY&Bx*OI+w7Tybpt@SR zE)v72MzOQPjVq&_m_?g133BzD0adnlFKdm=>TYh1bVi!82y`hOhlHw34vA+w8%nxL ziYyx|+$syFmgX@7{774c)fgX6!f8%|d-Zq$>8@V2ef8N1Owpqpay2Bl1{*3_)!x|M zwUCqoXK_;SI+?EIr+tzx(KW?0k3()pdZ;aoR%%*90=-CK@tL8jwH@<+TXZccbQ2ON zRJ1yHs>1hO=Vkx_^@zSHfkHz>2kT~1Y-x~3N%LJ2FvqAeL7+MO9#dhH>{O)<%3r%R zp&;$aeV>#OCMQ+YnCl;_T+RtcTDrf|#<@m^&`VW**G_8h8P2ws6OVHczm%Z-sEd?3 zgI(kr7a+}|PIuLklxxJL(-3L;2IU-S61h-pfn}5Z`WlJ3Wo~=@^CO>IC_H%Cb1b>N zqr0Of($-x{yldn+UB16lYPzN-qo{Z`GQkfhZ)=4A+;!m_&u?;fo+4yQ-a2=6mrAdT zA%xNN(HNA>MTz8H-KG0Tl0PQdRWzKa_Ra$Gv^x+H4W`O0Cy)gW35O-PVr9c2(>1za z^+S&4LggLAxn$=y22cs5&R3!KScFw{cXqXR{`m(D#aI$hT`q+Od1U^<_thg6xMR)1 z_uZpLtM>KYMo^k9MLx+|y7apW?NP)$Tyg29VWP}1zzlZh8zmCWFvi_DhRE#2q$L?M zG=6i?PG^#Ck9*|Rlru{gLK1TvQZ(R$OF0=VTZH8)x+vJ2T z7RkkjBDfG^07sqAd;5NW^s+o8u)+Wc!Gog(d(6Xzdd8am0~ z{GY$NLZum8=;(uw!#@nQH4!SZKD4rJPIG=eECMYV0x9hxdHRogu7t-a99NNW!kOV~^YaFDyB*Y8h9To!@zEKrBsV$Iptu!C*W8 zj!eMcWniVLJOT@gh4a)YkAD-Z)cnS-@5UTA{d0~Z=uL8uco5L35hh_PTnr#pBPiR zju@9M6YV{Y%%!$taaD%e%!#x_m&Zmh-Q_w|)QIt|LR4GG&gFB!kz(j#E_>HG6x*8W z+vy_x862^Uo81}iSl-eof>QyEGFZ;)w;O*(8y7~PuTNV7r|Bi<* z0Bu%FY*o19@E3k|VKmU#IuFsS-^9bWA?QT2^6{E$8=}E71^UCV^_vibl{wUca!&1I zFJiJ#WiR+z=NHfv3PJr7C6^KusGrr@-L?GJH6`0H>50GDC_>KttEOE>(W<%|mv^;< ze{;hX7t?Nv%w>p-wbD(!>B=21LQ55MWUcQEw;_;EPf>6wLotRm3uhC&Mb^Q_Ryke2 zgi1%V^-~p=j**v{lqs5}Zh087*!P)${*9ZY3EDU&+0p4MTV3&zXj1mWgABe}~Pi5K_~>NraJ!x+Hcf)*%^D z$?8>6h6ou$hJa!mh&3t`pIy9Y15BKF7QrR%<{hQ-8= z(b{^}ug=ej=3N?D-G$JB32U~_{wF^KsB8(hwnvGF9%9K*5$lxkiZs#0Q!9U2wD5Dl z)z3PwTJ17r*VoTdG9cygqVv8FWvrjIs3mgky(9njKIVz~S;R5{TPEBJSn}X2kHD@w z(|>YF$(Nf8RgxM&(p9?o&=*!>#&Z@@CIJ&KnEeGbfSV!~h+;}Qi{v6Vxe@_xxKxu! z8sjFZ315|cHW6dp2x{W;$Tcvu(j#Pz&LPeto%H|COTuAZB!Zz1brVv`7MV(%M@;Ai z9q5Zl8kr!3Y?ss|MC6mi5hRXs=L8YrH?E8{jUu(!O@)gliE`f0O3pwv(rHNt3~C~*U-yKK5-lSh=Nr8JwaViM1Evmmi;c?5y``C?}3 zIs+j1A5te(+V(Yf-tAQrWUL8ytyG8-vQBJgMJ*-u40plRUGU2~V~A!;$qSNmP_x%K zQWJX0<)IBv3Yp&qj{(a);lt+xBI;I$*mGk{_%luWzY!5FW{=IX%J$H8k;d*=l z`LB`4c6AV|yK2#+GH8k68T$`nIIJ8P7`@8&Yunx;i8|*X%|#@rElL5pJ0ou=DO`Ax z%>AE(5$R^WlcZFUv!UZ%k~|G2NQ;+8BCUTW)gw~_cH8S<280)KkN|BUrR7jF_xnl8 zR9@5HNE+d;DfW3Ax%T>f5?Y8`LTHCqldzl{310)!ev*c}S&BI0Ur5L)b5XuoaPr0^ z1Bl!9t>M*Nk&UKm>M6pJ{=NGQVAW0=yAO>HWs}e|*njki)PFx6<`MM}W z`-I6HilW{aeqx_lM?Sk|Q4sd0Ad5wS3`vb4!LY*`OeTL`3+@;^6pq_ndqhiUUJ`E# zDrd$lO~jdnrb$fU7?+X>|A5>3Vh_54L^hnGfjGi0WeX%)TxB{&lIoeZ7h++9Ey+%2 z#AF_E zq>2<#e>BlF_DGVlq-rsw9cjumDPn6012TsxId1hk4QbL#w6YF-J-d=>oz&XPUzUqa~VGL0i;y5rO9p284bwYow{7 zwH;>##KshT_F2p|eu!K(Ep0X7>sUgF&_NqP#G;ntU;)~*hRC6+CS!hK!f0tIS(z)) zxb=be-xKN~NX`}RJ*3dd5ESVr-s?g;8~K-{P?-eUH0r-GnclNV7Pj|3BngMQZaK{N zN*dN1j-;H724l;*R&gnq_QQc2gv3Z2M%JvPhHN9zo+~s_^!!t#*}ko&xuea$2M7yFPgQG|{yj~2g(?%RaL*a> zS!i)_uCQ)pOPh#6u?1C!F-`mfJM)4Eo+F>Cw}u^(V&7chpf zIbSedcliD9)!=Xu4(Qa@U0OX)Zsb0Yj(yy0!;;LtaC1Y2U`GAj0A|q)aF$l9Ya^dC z5%Q&~u(bM1pWlzTpy8lA@N>_8xEh`8P3BZ9#J-x@M%i?8;-HHn{B*&$uMr|N;{4^c zAAc)7np@Yw(16^_fd!iU)6o}2^C1@z_AXaBu@tv!9+uzX*1s0rvoxB;=Q-_+b~LU$ z%9IgIQOhoP44QU=w9&RusxD>fchn=ZOs;^d5^e8Xy}s<1e`zlAW`<+exw`Mr8SU`u zJ&hqqWz}7wRUNU_k7u8sCIzoWh$qtYcZ!n92CfOWVY9sRn|s>Zob9ZVm)&>yt1z#I zwMrH)jonFH)5gI-HU+#rv6Xd%WfaJUo!z>+V|i^jhUvPkI_1W$Wa+6795^$YquN~Q zZY3JLu}PklrJ^x{GD3=@>TAqT~YMt)g!+k|GVSU3jMxZL)Ks5U{d8R9-mmPV*B zcBKf@f!S#fz4d4_0^h7NYbPpp&ujm3L=R9^jEK%0S{8Ur_ocV-*r8w$m76WQzw_=J zFg}i^BuzFmqJ3>GRH0`H8d;Vc)m!n)TVX;S94K~~H?)4v+y6c-8LXX^DHq2T809P@ z?DRx#0><5wFA$(cfZg|4_mYqFE6ye4j6rxPFLMepV+O$p%{h;V2}uwl{KTCZD1-_% zO(j;19fwe8X#tiNPxQR(Cdp=o6 zP`;~6iF)RiHUFKYa5yf)J>rSI;^gcBk)nvD?pT6K5*p8dWcdAaL?w1MP&MIBIC5R% z2}o=U0$SQ6j|qe%cBF&|Sw0Vh9wcIWFB0P>d)JpzZ~snm8J(zcgYwr#VG{WdmvyBQ zvK__f{MOm8pYJ44eFfo#f+w~(2{bW+F!h4Df6#-3Y&f4sI+b$UgJjp!7iQ~rOMtPI z=Lk?EzyW|h3e~3aw!J`%YTINOxIHf>XQL}Ac>SIjWv3l%gqeMnG>6Gk)xmTnLKJ@_ zSt+U`E2MNrkqA=#>jtr+Y`NEn(5h@huD{OOsk>L%MzvCs!%;@i3vxyjGLNy1pg7DqNxRb+SGhu4N z(lG2yPzVtz{4VJpIV;-@`FkXPPU@-7j#BiYlUcYz66vJ3dnbWdFFR+i@wXi)i+)}W zXdYknOi!*wXw$17EF2PyV!1dF7BNDw5-Zun$N5UMbCkfbLx_MePxqvSxYM<1OCsy2 zZ$Fu3taTE)C{dg%yn?K>T~CHYkzy2dT?r)4RLbcYRr~&w?K|}lb((0gIfGfFb29CU zuD0C&K|kus%8?@4XBvTtvsrz6G}mHb?ZD5U7i%1vrMQ=Eoo{Y zAl84-CmHp6X2GjhYGo1>F~1s>-9fT4-IDCl>74{9Wfg!1MrUpR`dQMIw=YW;8!FE+ zSuHsv-w2MEw6A`i>6xliN%(py?uIDyrM1}}FhXHAP>+>;(GaanG#p}2@>>L{F4mxG z8Yo=IaaVaGk*Xs!63qn=e5o$1i!pR=Bu3498Y73GbN;@CDAnp3CHw08q$t;4Q`EHn z13{|mKn-}{n>A!)In)%5{8Q>RKaOU1wOoT3-l|9w&nSH~ciGv|(_Kke0(4*@rgk1q z5a60xSrO&%G^pl=XOqthlCKz(zZ3I9O=Y$83bElNc4o`6U%G>} zV&`5~tCzLDi{dv&vnT^@#|R-NQHUZhPH=wDnmff!s>7*4ToY;UJh&UZNKRhWyjX-#i-4^Je;%)l{X&q1GsDzJVt~ zu^5s6Otn&L;>&6k;+9ZqrgoWBl2~iswzu-5XlAS{CTs+97kpz@pPsplAoik0o3sCQ zV|2Y<+}MM(t^-FOI+^XId+t4COm;HBuhz!DOexWhGIqz?#Z^@%8gOfY~VWm)Hsu+;!t z!6UMw(JGd=v^G`$dS!twSGE8-%CjcoyiqA9Aia7_Hp5C&)OxD9Um3|�|wxhU1nK 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 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/MPL-LICENSE.txt b/official/2.2.2+2.4.2/SpTBXLib/MPL-LICENSE.txt new file mode 100644 index 0000000..04d4a55 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/MPL-LICENSE.txt @@ -0,0 +1,469 @@ + MOZILLA PUBLIC LICENSE + Version 1.1 + + --------------- + +1. Definitions. + + 1.0.1. "Commercial Use" means distribution or otherwise making the + Covered Code available to a third party. + + 1.1. "Contributor" means each entity that creates or contributes to + the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original + Code, prior Modifications used by a Contributor, and the Modifications + made by that particular Contributor. + + 1.3. "Covered Code" means the Original Code or Modifications or the + combination of the Original Code and Modifications, in each case + including portions thereof. + + 1.4. "Electronic Distribution Mechanism" means a mechanism generally + accepted in the software development community for the electronic + transfer of data. + + 1.5. "Executable" means Covered Code in any form other than Source + Code. + + 1.6. "Initial Developer" means the individual or entity identified + as the Initial Developer in the Source Code notice required by Exhibit + A. + + 1.7. "Larger Work" means a work which combines Covered Code or + portions thereof with code not governed by the terms of this License. + + 1.8. "License" means this document. + + 1.8.1. "Licensable" means having the right to grant, to the maximum + extent possible, whether at the time of the initial grant or + subsequently acquired, any and all of the rights conveyed herein. + + 1.9. "Modifications" means any addition to or deletion from the + substance or structure of either the Original Code or any previous + Modifications. When Covered Code is released as a series of files, a + Modification is: + A. Any addition to or deletion from the contents of a file + containing Original Code or previous Modifications. + + B. Any new file that contains any part of the Original Code or + previous Modifications. + + 1.10. "Original Code" means Source Code of computer software code + which is described in the Source Code notice required by Exhibit A as + Original Code, and which, at the time of its release under this + License is not already Covered Code governed by this License. + + 1.10.1. "Patent Claims" means any patent claim(s), now owned or + hereafter acquired, including without limitation, method, process, + and apparatus claims, in any patent Licensable by grantor. + + 1.11. "Source Code" means the preferred form of the Covered Code for + making modifications to it, including all modules it contains, plus + any associated interface definition files, scripts used to control + compilation and installation of an Executable, or source code + differential comparisons against either the Original Code or another + well known, available Covered Code of the Contributor's choice. The + Source Code can be in a compressed or archival form, provided the + appropriate decompression or de-archiving software is widely available + for no charge. + + 1.12. "You" (or "Your") means an individual or a legal entity + exercising rights under, and complying with all of the terms of, this + License or a future version of this License issued under Section 6.1. + For legal entities, "You" includes any entity which controls, is + controlled by, or is under common control with You. For purposes of + this definition, "control" means (a) the power, direct or indirect, + to cause the direction or management of such entity, whether by + contract or otherwise, or (b) ownership of more than fifty percent + (50%) of the outstanding shares or beneficial ownership of such + entity. + +2. Source Code License. + + 2.1. The Initial Developer Grant. + The Initial Developer hereby grants You a world-wide, royalty-free, + non-exclusive license, subject to third party intellectual property + claims: + (a) under intellectual property rights (other than patent or + trademark) Licensable by Initial Developer to use, reproduce, + modify, display, perform, sublicense and distribute the Original + Code (or portions thereof) with or without Modifications, and/or + as part of a Larger Work; and + + (b) under Patents Claims infringed by the making, using or + selling of Original Code, to make, have made, use, practice, + sell, and offer for sale, and/or otherwise dispose of the + Original Code (or portions thereof). + + (c) the licenses granted in this Section 2.1(a) and (b) are + effective on the date Initial Developer first distributes + Original Code under the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is + granted: 1) for code that You delete from the Original Code; 2) + separate from the Original Code; or 3) for infringements caused + by: i) the modification of the Original Code or ii) the + combination of the Original Code with other software or devices. + + 2.2. Contributor Grant. + Subject to third party intellectual property claims, each Contributor + hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or + trademark) Licensable by Contributor, to use, reproduce, modify, + display, perform, sublicense and distribute the Modifications + created by such Contributor (or portions thereof) either on an + unmodified basis, with other Modifications, as Covered Code + and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using, or + selling of Modifications made by that Contributor either alone + and/or in combination with its Contributor Version (or portions + of such combination), to make, use, sell, offer for sale, have + made, and/or otherwise dispose of: 1) Modifications made by that + Contributor (or portions thereof); and 2) the combination of + Modifications made by that Contributor with its Contributor + Version (or portions of such combination). + + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are + effective on the date Contributor first makes Commercial Use of + the Covered Code. + + (d) Notwithstanding Section 2.2(b) above, no patent license is + granted: 1) for any code that Contributor has deleted from the + Contributor Version; 2) separate from the Contributor Version; + 3) for infringements caused by: i) third party modifications of + Contributor Version or ii) the combination of Modifications made + by that Contributor with other software (except as part of the + Contributor Version) or other devices; or 4) under Patent Claims + infringed by Covered Code in the absence of Modifications made by + that Contributor. + +3. Distribution Obligations. + + 3.1. Application of License. + The Modifications which You create or to which You contribute are + governed by the terms of this License, including without limitation + Section 2.2. The Source Code version of Covered Code may be + distributed only under the terms of this License or a future version + of this License released under Section 6.1, and You must include a + copy of this License with every copy of the Source Code You + distribute. You may not offer or impose any terms on any Source Code + version that alters or restricts the applicable version of this + License or the recipients' rights hereunder. However, You may include + an additional document offering the additional rights described in + Section 3.5. + + 3.2. Availability of Source Code. + Any Modification which You create or to which You contribute must be + made available in Source Code form under the terms of this License + either on the same media as an Executable version or via an accepted + Electronic Distribution Mechanism to anyone to whom you made an + Executable version available; and if made available via Electronic + Distribution Mechanism, must remain available for at least twelve (12) + months after the date it initially became available, or at least six + (6) months after a subsequent version of that particular Modification + has been made available to such recipients. You are responsible for + ensuring that the Source Code version remains available even if the + Electronic Distribution Mechanism is maintained by a third party. + + 3.3. Description of Modifications. + You must cause all Covered Code to which You contribute to contain a + file documenting the changes You made to create that Covered Code and + the date of any change. You must include a prominent statement that + the Modification is derived, directly or indirectly, from Original + Code provided by the Initial Developer and including the name of the + Initial Developer in (a) the Source Code, and (b) in any notice in an + Executable version or related documentation in which You describe the + origin or ownership of the Covered Code. + + 3.4. Intellectual Property Matters + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party's + intellectual property rights is required to exercise the rights + granted by such Contributor under Sections 2.1 or 2.2, + Contributor must include a text file with the Source Code + distribution titled "LEGAL" which describes the claim and the + party making the claim in sufficient detail that a recipient will + know whom to contact. If Contributor obtains such knowledge after + the Modification is made available as described in Section 3.2, + Contributor shall promptly modify the LEGAL file in all copies + Contributor makes available thereafter and shall take other steps + (such as notifying appropriate mailing lists or newsgroups) + reasonably calculated to inform those who received the Covered + Code that new knowledge has been obtained. + + (b) Contributor APIs. + If Contributor's Modifications include an application programming + interface and Contributor has knowledge of patent licenses which + are reasonably necessary to implement that API, Contributor must + also include this information in the LEGAL file. + + (c) Representations. + Contributor represents that, except as disclosed pursuant to + Section 3.4(a) above, Contributor believes that Contributor's + Modifications are Contributor's original creation(s) and/or + Contributor has sufficient rights to grant the rights conveyed by + this License. + + 3.5. Required Notices. + You must duplicate the notice in Exhibit A in each file of the Source + Code. If it is not possible to put such notice in a particular Source + Code file due to its structure, then You must include such notice in a + location (such as a relevant directory) where a user would be likely + to look for such a notice. If You created one or more Modification(s) + You may add your name as a Contributor to the notice described in + Exhibit A. You must also duplicate this License in any documentation + for the Source Code where You describe recipients' rights or ownership + rights relating to Covered Code. You may choose to offer, and to + charge a fee for, warranty, support, indemnity or liability + obligations to one or more recipients of Covered Code. However, You + may do so only on Your own behalf, and not on behalf of the Initial + Developer or any Contributor. You must make it absolutely clear than + any such warranty, support, indemnity or liability obligation is + offered by You alone, and You hereby agree to indemnify the Initial + Developer and every Contributor for any liability incurred by the + Initial Developer or such Contributor as a result of warranty, + support, indemnity or liability terms You offer. + + 3.6. Distribution of Executable Versions. + You may distribute Covered Code in Executable form only if the + requirements of Section 3.1-3.5 have been met for that Covered Code, + and if You include a notice stating that the Source Code version of + the Covered Code is available under the terms of this License, + including a description of how and where You have fulfilled the + obligations of Section 3.2. The notice must be conspicuously included + in any notice in an Executable version, related documentation or + collateral in which You describe recipients' rights relating to the + Covered Code. You may distribute the Executable version of Covered + Code or ownership rights under a license of Your choice, which may + contain terms different from this License, provided that You are in + compliance with the terms of this License and that the license for the + Executable version does not attempt to limit or alter the recipient's + rights in the Source Code version from the rights set forth in this + License. If You distribute the Executable version under a different + license You must make it absolutely clear that any terms which differ + from this License are offered by You alone, not by the Initial + Developer or any Contributor. You hereby agree to indemnify the + Initial Developer and every Contributor for any liability incurred by + the Initial Developer or such Contributor as a result of any such + terms You offer. + + 3.7. Larger Works. + You may create a Larger Work by combining Covered Code with other code + not governed by the terms of this License and distribute the Larger + Work as a single product. In such a case, You must make sure the + requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this + License with respect to some or all of the Covered Code due to + statute, judicial order, or regulation then You must: (a) comply with + the terms of this License to the maximum extent possible; and (b) + describe the limitations and the code they affect. Such description + must be included in the LEGAL file described in Section 3.4 and must + be included with all distributions of the Source Code. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. + +5. Application of this License. + + This License applies to code to which the Initial Developer has + attached the notice in Exhibit A and to related Covered Code. + +6. Versions of the License. + + 6.1. New Versions. + Netscape Communications Corporation ("Netscape") may publish revised + and/or new versions of the License from time to time. Each version + will be given a distinguishing version number. + + 6.2. Effect of New Versions. + Once Covered Code has been published under a particular version of the + License, You may always continue to use it under the terms of that + version. You may also choose to use such Covered Code under the terms + of any subsequent version of the License published by Netscape. No one + other than Netscape has the right to modify the terms applicable to + Covered Code created under this License. + + 6.3. Derivative Works. + If You create or use a modified version of this License (which you may + only do in order to apply it to code which is not already Covered Code + governed by this License), You must (a) rename Your license so that + the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", + "MPL", "NPL" or any confusingly similar phrase do not appear in your + license (except to note that your license differs from this License) + and (b) otherwise make it clear that Your version of the license + contains terms which differ from the Mozilla Public License and + Netscape Public License. (Filling in the name of the Initial + Developer, Original Code or Contributor in the notice described in + Exhibit A shall not of themselves be deemed to be modifications of + this License.) + +7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF + DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE + IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, + YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE + COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER + OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF + ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. TERMINATION. + + 8.1. This License and the rights granted hereunder will terminate + automatically if You fail to comply with terms herein and fail to cure + such breach within 30 days of becoming aware of the breach. All + sublicenses to the Covered Code which are properly granted shall + survive any termination of this License. Provisions which, by their + nature, must remain in effect beyond the termination of this License + shall survive. + + 8.2. If You initiate litigation by asserting a patent infringement + claim (excluding declatory judgment actions) against Initial Developer + or a Contributor (the Initial Developer or Contributor against whom + You file such action is referred to as "Participant") alleging that: + + (a) such Participant's Contributor Version directly or indirectly + infringes any patent, then any and all rights granted by such + Participant to You under Sections 2.1 and/or 2.2 of this License + shall, upon 60 days notice from Participant terminate prospectively, + unless if within 60 days after receipt of notice You either: (i) + agree in writing to pay Participant a mutually agreeable reasonable + royalty for Your past and future use of Modifications made by such + Participant, or (ii) withdraw Your litigation claim with respect to + the Contributor Version against such Participant. If within 60 days + of notice, a reasonable royalty and payment arrangement are not + mutually agreed upon in writing by the parties or the litigation claim + is not withdrawn, the rights granted by Participant to You under + Sections 2.1 and/or 2.2 automatically terminate at the expiration of + the 60 day notice period specified above. + + (b) any software, hardware, or device, other than such Participant's + Contributor Version, directly or indirectly infringes any patent, then + any rights granted to You by such Participant under Sections 2.1(b) + and 2.2(b) are revoked effective as of the date You first made, used, + sold, distributed, or had made, Modifications made by that + Participant. + + 8.3. If You assert a patent infringement claim against Participant + alleging that such Participant's Contributor Version directly or + indirectly infringes any patent where such claim is resolved (such as + by license or settlement) prior to the initiation of patent + infringement litigation, then the reasonable value of the licenses + granted by such Participant under Sections 2.1 or 2.2 shall be taken + into account in determining the amount or value of any payment or + license. + + 8.4. In the event of termination under Sections 8.1 or 8.2 above, + all end user license agreements (excluding distributors and resellers) + which have been validly granted by You or any distributor hereunder + prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT + (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL + DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, + OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR + ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY + CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, + WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER + COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN + INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF + LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY + RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW + PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE + EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO + THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. + + The Covered Code is a "commercial item," as that term is defined in + 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer + software" and "commercial computer software documentation," as such + terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 + C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), + all U.S. Government End Users acquire Covered Code with only those + rights set forth herein. + +11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. This License shall be governed by + California law provisions (except to the extent applicable law, if + any, provides otherwise), excluding its conflict-of-law provisions. + With respect to disputes in which at least one party is a citizen of, + or an entity chartered or registered to do business in the United + States of America, any litigation relating to this License shall be + subject to the jurisdiction of the Federal Courts of the Northern + District of California, with venue lying in Santa Clara County, + California, with the losing party responsible for costs, including + without limitation, court costs and reasonable attorneys' fees and + expenses. The application of the United Nations Convention on + Contracts for the International Sale of Goods is expressly excluded. + Any law or regulation which provides that the language of a contract + shall be construed against the drafter shall not apply to this + License. + +12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is + responsible for claims and damages arising, directly or indirectly, + out of its utilization of rights under this License and You agree to + work with Initial Developer and Contributors to distribute such + responsibility on an equitable basis. Nothing herein is intended or + shall be deemed to constitute any admission of liability. + +13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as + "Multiple-Licensed". "Multiple-Licensed" means that the Initial + Developer permits you to utilize portions of the Covered Code under + Your choice of the NPL or the alternative licenses, if any, specified + by the Initial Developer in the file described in Exhibit A. + +EXHIBIT A -Mozilla Public License. + + ``The contents of this file are subject to the Mozilla Public License + Version 1.1 (the "License"); you may not use this file except in + compliance with the License. You may obtain a copy of the License at + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + License for the specific language governing rights and limitations + under the License. + + The Original Code is ______________________________________. + + The Initial Developer of the Original Code is ________________________. + Portions created by ______________________ are Copyright (C) ______ + _______________________. All Rights Reserved. + + Contributor(s): ______________________________________. + + Alternatively, the contents of this file may be used under the terms + of the _____ license (the "[___] License"), in which case the + provisions of [______] License are applicable instead of those + above. If you wish to allow use of your version of this file only + under the terms of the [____] License and not to allow others to use + your version of this file under the MPL, indicate your decision by + deleting the provisions above and replace them with the notice and + other provisions required by the [___] License. If you do not delete + the provisions above, a recipient may use your version of this file + under either the MPL or the [___] License." + + [NOTE: The text of this Exhibit A may differ slightly from the text of + the notices in the Source Code files of the Original Code. You should + use the text of this Exhibit A rather than the text found in the + Original Code Source Code for Your Modifications.] \ No newline at end of file diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/BuildPackages_D12.groupproj b/official/2.2.2+2.4.2/SpTBXLib/Packages/BuildPackages_D12.groupproj new file mode 100644 index 0000000..42f6ce1 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Packages/BuildPackages_D12.groupproj @@ -0,0 +1,48 @@ + + + {AC99A436-DF99-402F-B9A7-1589C5A8F86D} + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d10.bdsproj b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d10.bdsproj new file mode 100644 index 0000000..3549e3d --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d10.bdsproj @@ -0,0 +1,175 @@ + + + + + + + + + + + + SpTBXLibDsgn_d10.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 1333788672 + Toolbar2000 -- SpTBXLib Design Package + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + True + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d10.dpk b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d10.dpk new file mode 100644 index 0000000..7d622d0 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d10.dpk @@ -0,0 +1,42 @@ +package SpTBXLibDsgn_d10; + +{$R *.res} +{$R '..\Source\SpTBXReg.dcr'} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $4F800000} +{$DESCRIPTION 'Toolbar2000 -- SpTBXLib Design Package'} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + TntUnicodeVcl, + TntUnicodeVcl_Design, + tb2k_d10, + tb2kdsgn_d10, + SpTBXLib_d10, + dclstd, + vcl; + +contains + SpTBXReg in '..\Source\SpTBXReg.pas'; + +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d10.res b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d10.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d11.bdsproj b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d11.bdsproj new file mode 100644 index 0000000..a1e48d5 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d11.bdsproj @@ -0,0 +1,175 @@ + + + + + + + + + + + + SpTBXLibDsgn_d11.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 1333788672 + Toolbar2000 -- SpTBXLib Design Package + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + True + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d11.dpk b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d11.dpk new file mode 100644 index 0000000..51307da --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d11.dpk @@ -0,0 +1,42 @@ +package SpTBXLibDsgn_d11; + +{$R *.res} +{$R '..\Source\SpTBXReg.dcr'} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $4F800000} +{$DESCRIPTION 'Toolbar2000 -- SpTBXLib Design Package'} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + TntUnicodeVcl, + TntUnicodeVcl_Design, + tb2k_d11, + tb2kdsgn_d11, + SpTBXLib_d11, + dclstd, + vcl; + +contains + SpTBXReg in '..\Source\SpTBXReg.pas'; + +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d11.res b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d11.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d12.bpi b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d12.bpi new file mode 100644 index 0000000000000000000000000000000000000000..840e749eb60b9e27cbe9051406be650029baba19 GIT binary patch literal 2148 zcmb_eO-~a+7@k(Ggy08)Ktu_e>an4VK@T3bbOAS^Na*r$AZcd1!**mlyX;P(5KXw* zM9#*82e1Awe}JC3IP-S5+fo)v;vTl0XWr*|KWDOk?xCLNbP7%6a=T@>;aACS*)tY* zHi(_`aDZBq=oF1<#PMo$b{z**?96T{bGbRx8bauNB!x7DS|jN6eCV+1Mn#~*ovd8*qrmP<2gb2Sf?OMT7y>%mb3+JhmR-Ld*^GCx zC~10WV>7gy>cGWDz}-4MA%5T1Qj;%Pl)HW;7MG+KpNQ35#(md`2-BSn8PmG!HM|mG zjnGp})ArXfBOThK4$Z)3q!oiYC-qR`iL^8p6;1R)!tJ=i&31hjl`i|S(B5!e$HY;} z(0rjHC#YRou-huGUXrIq0&26~4KQzS=#1}m``0LTTsukvLelH@Dh+sO1#`3FV==AO z$PBRZaj?m0rzn6Gd+Q5wMF$5#?@(-0X1Pa^8dwQ6ozciCWGtY#l5Y|EnL^Lhvd7J) zPi&P6YY{s=!JN7*dvM?%jz`BqmOC7C2elS}IvrD&DI18W0C6%ViUx?n5dSJ~pMZp8 zk^xcab!-!zS)|!+jVeoAA~M|1aR*8OXop4S0#rPyjccGdKZs(1iy<)^oInCeA*vwwvQJQ) zuppdB`6FwPBvAl~S8BHDW#{vqgLwITCp6_9Xgu!=m_w!e1{{y&9 By1f7Z literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d12.dcu b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d12.dcu new file mode 100644 index 0000000000000000000000000000000000000000..a4694a2b0abc6d738aeda356f6f6181bd8b4b9cf GIT binary patch literal 4942 zcmeHJjcXiL5Z~W3y_>sU+oZ;_ij^uVr)aRDDQT&ik4u`AOTG3kX_Ttn+k3feZ*TY9 z+oVYmDbf~EDQ#_w6&pV&A|fh9q=<<4g@}lVNGnBDL|PFM5fPE<>?WtR=3V{(voQDe zc7AVW-pst2S)*yq8!y$gy?ef1d*bYpr!>*jlC9*rhSOF)RV_OA7FM>NKYja=h_=pa zzL?Qc@J9aRC*mz@Y1x`}$2?PR4MCe_v87;oFF(?{wqcfio~&+Qg`zTx$V%z-zEx{9 z8OcsoeOcBtt(fSw9K*JD8ouQ^=eAYeGi8*y{f^~_?2e3KmW-lIyGG&onT^jB7uUWF zI(F?Fbp-fKsknQEzsZzTvy&yTxGk1baCcN8W>-h7ZqT=EHDJi_<^))V<0~aZbCZ>R zXT(*R5bd^&YE>%t)4-VRTLZ465Qst$jrqRoC@qMxfRtTS@*4&WwS9s1AV|vH)a{n*o0qZ- z+f}RQJhdu$ub?{rf?n4vE7dO;kj|Kr%f>mr=hpFE#&ahub&4$+%& zFqG9{d4})Z2!|#mM+~kcS%1=&!Jhibz#a%pSJ_2fMm0Q}5|EPBQr+tk0D_cJOJMzV z0p;pM*)F(B36c8j=rOt}-K{ofCC4iaINmp7A<;l7bsq zFCMX+TS?1tsjdV=cPp66!8BRB~t6Z|w^*$aVv-Kdc5K=Gb)IBQAQd-^jmxLm? z_so&u)41-js_&Mqok~xPlAmua1+ytnZ@~aJng~7=W(L;3KZaU)lD!ZaDVTQEFVrxX zjGOk%ds|}-Uz>cHAL~TS3hSnNuS;)F*di@u3N+ka~pfe(T;#224f)|Ts24;CoXjVL!d%0(` zKacX?S#3KkG<#3;6z`=#!2C1sfq4(id*FZOfs?^`-wA)uUi^A4_)y*>w8Q~HI3RR1 z5F$F35}GHljGz;)AY4hfim-xk4dGfH*AtS28wocNS_rogS_!LktR}R#V=ZAF;Wk1C zp^K2x(M#wX#s)%~u#u1iPAneldAYnIQFX5p+JWO~riG76qgoA`bgd>E<2~QB7Buo*WPU2a@@liZS zc%JYA;l*~mM0iEV3Bs#{*9a$dyiRyS$D4$=2yYYKP2zpR2ZRp^9}zw#d_wq?@EPHA z!YRTRgfoOM311PuA$&{tj&N4T_k87lDL`Il}v3+YeYM4<+YQkhpC@wfN7KH!yvDBGX8E}4VEK$ zwM2X3un-*Hc;e{vD&q0Pv6 + + {0CD140C3-3ADC-4BF2-8A9C-6B5FAA587036} + SpTBXLibDsgn_d12.dpk + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + true + All + 4F800000 + 1 + SpTBXLibDsgn_d12.bpl + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;$(DCC_UnitAlias) + x86 + Toolbar2000 -- SpTBXLib Design Package + true + false + true + false + true + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + + + + + + + + + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + + + + + Delphi.Personality.12 + Package + + + + SpTBXLibDsgn_d12.dpk + + + False + True + False + + + True + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + + diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d12.hpp b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d12.hpp new file mode 100644 index 0000000..919f007 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d12.hpp @@ -0,0 +1,106 @@ +// CodeGear C++Builder +// Copyright (c) 1995, 2008 by CodeGear +// All rights reserved + +// (DO NOT EDIT: machine generated header) 'Sptbxlibdsgn_d12.pas' rev: 20.00 + +#ifndef Sptbxlibdsgn_d12HPP +#define Sptbxlibdsgn_d12HPP + +#pragma delphiheader begin +#pragma option push +#pragma option -w- // All warnings off +#pragma option -Vx // Zero-length empty class member functions +#pragma pack(push,8) +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit + +//-- user supplied ----------------------------------------------------------- + +namespace Sptbxlibdsgn_d12 +{ +//-- type declarations ------------------------------------------------------- +//-- var, const, procedure --------------------------------------------------- + +} /* namespace Sptbxlibdsgn_d12 */ +using namespace Sptbxlibdsgn_d12; +#pragma pack(pop) +#pragma option pop + +#pragma delphiheader end. +//-- end unit ---------------------------------------------------------------- +#endif // Sptbxlibdsgn_d12HPP diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d12.lib b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d12.lib new file mode 100644 index 0000000000000000000000000000000000000000..ca76999acc2157399f2cb8425b382caae3bef2e4 GIT binary patch literal 20480 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 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d7.dpk b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d7.dpk new file mode 100644 index 0000000..e3a57af --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d7.dpk @@ -0,0 +1,42 @@ +package SpTBXLibDsgn_d7; + +{$R *.res} +{$R '..\Source\SpTBXReg.dcr'} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $4F800000} +{$DESCRIPTION 'Toolbar2000 -- SpTBXLib Design Package'} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + TntUnicodeVcl_R70, + TntUnicodeVcl_D70, + tb2k_d7, + tb2kdsgn_d7, + SpTBXLib_d7, + dclstd, + vcl; + +contains + SpTBXReg in '..\Source\SpTBXReg.pas'; + +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d7.res b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d7.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d9.dpk b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d9.dpk new file mode 100644 index 0000000..282eb87 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d9.dpk @@ -0,0 +1,42 @@ +package SpTBXLibDsgn_d9; + +{$R *.res} +{$R '..\Source\SpTBXReg.dcr'} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $4F800000} +{$DESCRIPTION 'Toolbar2000 -- SpTBXLib Design Package'} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + TntUnicodeVcl_R90, + TntUnicodeVcl_D90, + tb2k_d9, + tb2kdsgn_d9, + SpTBXLib_d9, + dclstd, + vcl; + +contains + SpTBXReg in '..\Source\SpTBXReg.pas'; + +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d9.res b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLibDsgn_d9.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d10.bdsproj b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d10.bdsproj new file mode 100644 index 0000000..1f6ec4f --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d10.bdsproj @@ -0,0 +1,175 @@ + + + + + + + + + + + + SpTBXLib_d10.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 1337982976 + Toolbar2000 -- SpTBXLib + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d10.dpk b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d10.dpk new file mode 100644 index 0000000..2033886 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d10.dpk @@ -0,0 +1,50 @@ +package SpTBXLib_d10; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $4FC00000} +{$DESCRIPTION 'Toolbar2000 -- SpTBXLib'} +{$RUNONLY} +{$IMPLICITBUILD ON} + +requires + vcl, + tb2k_d10, + TntUnicodeVcl, + rtl; + +contains + SpTBXItem in '..\Source\SpTBXItem.pas', + SpTBXControls in '..\Source\SpTBXControls.pas', + SpTBXTabs in '..\Source\SpTBXTabs.pas', + SpTBXDkPanels in '..\Source\SpTBXDkPanels.pas', + SpTBXEditors in '..\Source\SpTBXEditors.pas', + SpTBXExtEditors in '..\Source\SpTBXExtEditors.pas', + SpTBXColorPickerForm in '..\Source\SpTBXColorPickerForm.pas', + SpTBXMDIMRU in '..\Source\SpTBXMDIMRU.pas', + SpTBXFormPopupMenu in '..\Source\SpTBXFormPopupMenu.pas', + SpTBXCustomizer in '..\Source\SpTBXCustomizer.pas', + SpTBXCustomizerForm in '..\Source\SpTBXCustomizerForm.pas', + SpTBXSkins in '..\Source\SpTBXSkins.pas', + SpTBXDefaultSkins in '..\Source\SpTBXDefaultSkins.pas'; + +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d10.res b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d10.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d11.bdsproj b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d11.bdsproj new file mode 100644 index 0000000..a04ffdd --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d11.bdsproj @@ -0,0 +1,175 @@ + + + + + + + + + + + + SpTBXLib_d11.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 1337982976 + Toolbar2000 -- SpTBXLib + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d11.dpk b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d11.dpk new file mode 100644 index 0000000..88083c9 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d11.dpk @@ -0,0 +1,50 @@ +package SpTBXLib_d11; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $4FC00000} +{$DESCRIPTION 'Toolbar2000 -- SpTBXLib'} +{$RUNONLY} +{$IMPLICITBUILD ON} + +requires + vcl, + tb2k_d11, + TntUnicodeVcl, + rtl; + +contains + SpTBXItem in '..\Source\SpTBXItem.pas', + SpTBXControls in '..\Source\SpTBXControls.pas', + SpTBXTabs in '..\Source\SpTBXTabs.pas', + SpTBXDkPanels in '..\Source\SpTBXDkPanels.pas', + SpTBXEditors in '..\Source\SpTBXEditors.pas', + SpTBXExtEditors in '..\Source\SpTBXExtEditors.pas', + SpTBXColorPickerForm in '..\Source\SpTBXColorPickerForm.pas', + SpTBXMDIMRU in '..\Source\SpTBXMDIMRU.pas', + SpTBXFormPopupMenu in '..\Source\SpTBXFormPopupMenu.pas', + SpTBXCustomizer in '..\Source\SpTBXCustomizer.pas', + SpTBXCustomizerForm in '..\Source\SpTBXCustomizerForm.pas', + SpTBXSkins in '..\Source\SpTBXSkins.pas', + SpTBXDefaultSkins in '..\Source\SpTBXDefaultSkins.pas'; + +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d11.res b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d11.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d12.bpi b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d12.bpi new file mode 100644 index 0000000000000000000000000000000000000000..74d289c478bbcfc19e3afae758d36504569718a8 GIT binary patch literal 189092 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 WUs&TS=>bGyT)I!||9z^}`u_pP2k46c literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d12.dcu b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d12.dcu new file mode 100644 index 0000000000000000000000000000000000000000..36f52852827c7a44e6b9fa4883bd70fdda6150b5 GIT binary patch literal 3441 zcmeHJ-D@0G6u)Ph?w)KmZLA>-AxJ1CEG2|AI3f%-+4bd%LqU zADr4-M-kv}%_^p97rhsX)9YrAtO?-l-* zqivVlW7Qd%M{{?v-Ew^G*cf4<`PHgm6+%ccI>l|%;%lbhj{R`iy+>JCqSH1P0X&{D zY1u5Ylw;;^{5kt&@j%nFU|UTej{E#fxp=8xyhd4j(BrhaLT5mjbZp@{R#nz%#$?T0 z{k6_WlryHy8jNTVbTZF{zK7HDS^8{*%B>TPQPxv#aj3U2s$_geNVtT4l<3l&58i zTYC`ZSdmwSx2mdur##awajGscziQK0bLW(V@IozHVil&Wke2(v(~hkqOi*E`WS1&J zC~=`O;c^v>&Eu~kgo6H*6WH$`P9@r&WR~0`QBX2MQ_udfaQ~X#3r{*uS%u?d ziP3UO`3;ozou`((@Z_K+6uFVIFJ(=~K2L0dZIW1P07m_$ZwQ}sYSh?LtTt+F6DXv{ z4z=l`#=pd+yUA&&OHY%tOmEPFL_@v(+gi@vViyVVMV>^vG(uz1rk4Ba-h_Gr zXqU|I0N1tH&Yu&B1|zcmbliX7*!ZhpPY93r{|53)lDher@RnUYBG$c*B^ii*^t177 z1^x#saMz#1Z-ITV`|+XgsN5&f4TKFH+7LoIyohkT2BQdL2qzF;Mi@tkBP0-}bVwr1 zAfymx5i$sKI%E+RW3Ys98sQAWS%hVToDO+}0zwJl9D;>lBe)2j4g%pkLJeUJ;Vp!> zb-0M|&P}+4@Gio82=D9g0m6qmTtT>sa1G%)!Y2ry>hKxDx(;6;e1&iW;cFdkB7CF6 zw+P=Me2;Jo;Wok@9quChi0~7_&j`OD{5lH52qOrC2tx>62!}@DcZB;%=tFoR1_KB& zJ^Dz4jY#ydZ?#Ay`XqRWMxvUg9l%cQikAPO<0DNgkgMe5-rg>vkz}_tGd + + {1EB74E79-E290-4976-B63E-8E6B50611D5F} + SpTBXLib_d12.dpk + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + true + All + $(BDSCOMMONDIR)\DCP + SpTBXLib_d12.bpl + 4FC00000 + 1 + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;$(DCC_UnitAlias) + x86 + Toolbar2000 -- SpTBXLib + true + false + true + false + true + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + + + + + + + + + + + + + + + + + + + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + + + + + Delphi.Personality.12 + Package + + + + SpTBXLib_d12.dpk + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + + diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d12.hpp b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d12.hpp new file mode 100644 index 0000000..c8b71bd --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d12.hpp @@ -0,0 +1,82 @@ +// CodeGear C++Builder +// Copyright (c) 1995, 2008 by CodeGear +// All rights reserved + +// (DO NOT EDIT: machine generated header) 'Sptbxlib_d12.pas' rev: 20.00 + +#ifndef Sptbxlib_d12HPP +#define Sptbxlib_d12HPP + +#pragma delphiheader begin +#pragma option push +#pragma option -w- // All warnings off +#pragma option -Vx // Zero-length empty class member functions +#pragma pack(push,8) +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit + +//-- user supplied ----------------------------------------------------------- + +namespace Sptbxlib_d12 +{ +//-- type declarations ------------------------------------------------------- +//-- var, const, procedure --------------------------------------------------- + +} /* namespace Sptbxlib_d12 */ +using namespace Sptbxlib_d12; +#pragma pack(pop) +#pragma option pop + +#pragma delphiheader end. +//-- end unit ---------------------------------------------------------------- +#endif // Sptbxlib_d12HPP diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d12.lib b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d12.lib new file mode 100644 index 0000000000000000000000000000000000000000..318a587e16c0cf8d6ca2ffe6ad0b3426f4766299 GIT binary patch literal 1070592 zcmd>n34D~r`TrzYU_}s6RJ;%+-l#b^Jwpx-B@)T9;E}{7*|3Wt8#fyaR&COFgf3KD zt;JS;#&(m~(?zW{*ke7>+A3^4x`uqLilYQRfnP;AP z=9y>adFFU`9>&TGt6O}fOUr|efwrbt^~K@l){|NS zt*m>0#(px+@{V;M$U4}5<-w+wPRptU~GG|697a8d#5_A>VAs2oMj&U{~; zmwqYd;dK>D>7IV+o~<9je#%&G9#gM8!<4J>Z1@Q6*?!~s)%@XX{{ytE11B){!{Kb- z!Q8<-mOPOiT~gf=Th`v7C`>CUOo@+I*6gOXmEq>Ll~idZET{7h)O8_aJ;Rrh9%h@4 zB@5UICHd_w`Nh+-$%*AmXWi2&8xLhOq@*l)Je%xXo>(Z@tQ97K!knZRCaXjwtz(sv z6g!qg%Y)?IKOr4aw;kr4&U@rO6}RsWZ9WyZhRC$nw`hzx@H4;7P-=ZJUiDQ8<(<7XSrTi8Z$s6kwYz^z(zA{ zJgEF-^|7dGR_7@8Eq6E44k^b5J;&pRoTHxBO-{uHEVqCqPhr!t6N06KsaDKx?(Py` z$qx~E=I%BPmb{jIE4%#X24khsw$@N(FcwgHS<;4LW&GSK zINoG1%OWdVBF(|(SSv+ViWO(aj8q*9#DW}w<($I0q0;E7zYg569NiAf02JLQ_d~~Xs}f1SY|B%V^iXe(aL}{cXyJzmsbx@*p;_rpUmZT zA;6L^uxA|0Yb5+%Xl#B4WAg&n!T*y5B=^*L>>z}Y?6l^3Xbm}SZlecR5~MfJI_iy> z^nah`T+X^*nmT^wM z9359yr*T$G+38uZYJ}RXQoV?EmvdgfBq5pv%D3TVPPjSH6uvA#PQ4mhX<^+b@GP^# zcbc9FV|_r_OuO?{*eIG}%C(*TwoAj-E@0zIXfZ@dWtj8W9&Qioj{@!7Ria0ed2q8x znd}gqrfP%()JBD|;9gj*z$!g7H@^1lyb?ty4(KJbTU*1+n|%?*tDaS+te7bARRyE1 zVfekxF;?zQVL>F&Fee&WSsjapo0s#z3EXp?kouUFx>KnRtP1)f8E8~wL!&ad5=%FD zd5Q{f)fjFHV!?v)7;Pn}H7_TTAPQ3+jkJ_UE^VG2jYcl54qwLI)o3_Y7%OBEcP5a! zGT7WUA0dOvKy*14ODLkX1T4Z)b-9Dchbig&=EexSE@OtiV0(<)D#~ilL_Uh_gH9A- zVVAix#0SDukg`y){$dE>Vh0JBLN*AtWR7C3&NA;sfrfBoD0yejnytNzEy*H#WjWED zXh4Z_WR6uuB4IYsov_xdmnzNr+&p!fRMeen!wQrLqq>ZkdKmW!cOL%NIXIKV@>I8= zWg5{XQpr`B+OjZE*)y%m-3nG@`p+%KX-fl`XN=3jQr(2GuQGn~3kyNVEZ+ z4IyQ2DlHE6pcGhRb2nnPZ0(3lZAveDM6Sl_mhx!e(gopW-b>h&A&h^P%G9R3-Q=g| zxJnDQDcIF5rA@)+24i??p&ly?V_}>SU9E0e5MCZae@=3?poiI^5;Cf#GSG~5lInES zx#C+x zlG)3^WuQJ*fw8LET*qrK7om+rRuXq`ANI38T?IEo&8k}UJ(iOxP;xIRUri(6!0H9T z=H)S7$W`oc%UgsfLV2+e`R*Gd%b6%8a%PI&A3oBHHxT_md z-nFa>FJp!n6d7}OuSxB3uv$h<$6L74&UjVX7^DdGfGWDJnzR&}6b$ZFg6y)I$W~`8 zi7uzZkZ3cI$Ft-@(kb+go2aqj$4Z4r6=;5qX8`Ki-

tC9l;{Rs4z~9l4p6c)DOwaUp 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

  • WIfIxa?c=g zfBDaF(unhIk-A(sLp2_{Ei2QoZc#CmTAwrAGYoTsNS&PL4C{)D&O}U6V#+^^i2rjE zXwiXlhwL)3=8QaQpNDZgoXIX5#xA?_pX;*kxHlN)9UKo4PJTDIa}Be?oo|?9-GzoZ z&Rt@dY>u`@CV^go(wha$h#gX|7|KH@lk*bC$c+FmG|U z8|JO<4#T|7-DQ}w-DbnQ-Q8oDbKJd#IoEX!bDrB`m|t)Y80Ht{7(q2ylvjqxI zVpsUf7US|okPLwlBO!0_mmM7th1V}40Jaoyc1o-%l^8jPTGUdmvaWP5;@njpah`Xt zh&cb|PBqL?BGpSc=c>X)>ZoweJ8^##vIRd|7p+tNANlAP(YBXk=isV5NFG8m+4D$4 z!%05pfqdeB{(R&U|F4`CM!W^&6MqX#Hons%pZNPApZIQ&Pkax^C;lJZlaCSqBbaRb zZ7|vR4lvpHufb&F?|{k1cY(>qf8(Z%_`6`T@%O-Fi-k?JR$3v?o@A_(Xnpt=Y$rod4KMX=QzKaw9Smf1?D!HMSo zJTHDEFE=ojU%uPgcoT9sS=hahgWWIUJZnReKHrAk;>XyE$#+HwQEeTNHm5bBMqCs7 zbXvJnJ^yad`P`0?a}&chhmQoZiz;e31#vG@xR=3+@WJetw(OS!%xb)!)qG0jR`@`b z_OyAPgH;kUmgv|a^K5jA8tZ|tWO%PteNYBj;l0UfS9{%Lb&K}4Y*>l>O!bdmk$_dPCJ&Az_{lFj~^UIwt-FV~NMDhG<5std+ z9KAwRkT@3!vsfvNOBWu%F&Opy$$x@gD`i(UvHvG&c{=xO|@xt}7cp@|$TE`%<7 z2L46FjR*_Fm(h?>TRRo|7}EhW7O~^upCaEgFd@KHB3(p6Oo3*2JVG+@)I?848p5!Y zFyJN-V9k?))I5UJalSnqBw}A>n49fMbRuxvTM_Fv8u8cchYhpAe#$Vn+K_e5w0~ik z!`xSy7Q)RN_OBTML1viiGHgG>+)wE{2H!rA;fVA}^qouJg@(B$eL0;k(3xPEZ|=zg-bSzymDvO>sUXf*5o-C5qsvQQf%K@pIFUkRY3o=`fZ=Y}Dq=?SI7G*ooJ2JXFPg~W`fh{O6(144$B(5_8iY0HYH)?1tgT z&B|Ko<3`K^aR;I+@tlLV#fVvqkmzwCGXst4e{RRkM+$B(@Xs6YRGy8Mx$8}bH8%-+ zpkY2_pKh25_o|3lbTg$m&_PqpW)Mum5&mpnj(a>_}9%9SZl&D_R}?u-r+6 zTVBZnst^*2jcL6Q#otlCe95tMV`rg;>ltOeD=XwxOhrcniCD`-FKl$%ip|I&Uexd= z6X+&PE_(PSye7k|s>9_%Jm~T2YNG8^-7eiiX9zWwR}AWO86*Zi+(X6r%|KBEp-JF z8;IY)EM#;tyrWaqcUeSUFnY2z5SRpVCj|rH9f?VW`?mvEhr)$<(ZOgPf{FAUSx7(7 z+5@49@PT;Uha!5K8lBdp!YXT02)|&J)l>Hw=C07Ot?2Nr(SEIiYVtK`d+RARA>ZG- zMtJ_GfJ1PFyx6#8xB-n@&v)It2KfYH;+-PmDuU926>ifdw+{0Via0Taj zM%oh%^DVoUd;}}FhwUW!2w2G5_6LUfj{O(JrhCyD7I7};y!=)g)5qIsOh<2}u^4t>2DDZ^1yG>&og2(BeoglyXoDCXc}RdUvC;~n2$8gG|X=_&7rdx z&PVqc=6OxX;Jv1A8s?5Bn?B^y-1L%RKHBt4WYzQ*D%A8l!~ABGixg{14D;7(A*Ect z7JB@5)`n5!+6Z6oGR();#td`y+OMKTYacVr$Jat@`K`53#yq@sya+Jx@s{QF)Y{ zvaZmI6c za(gGp`VWuQe|RKbHzF?xPKfxixvou#IFdmsLJrR@qioxvQ+QrL1y${cHJtD_SqihRTU4 zQ899U@!>IrSrvt{22bZjC$omJael$0lHpAlzwI*qXL&x04{sVBe)fS=t?*W~gjL#< zmEl(OWqqA19=Ooj*q5YNRU_tibO@}(l9e{{@G_LV<=I4dlNDZ<2ybPYqK8u;I;+|N zTFA_|W-;@p1Jzp-)$72iM~ui@Iy8FDv8}NStm>Do@bd)Slm%+H_D5(UY`69Tw#&ks z;I+bbfSzY%FATQA&(=Gk(czct`uWWb)`y=B#p?!%XkRcniEZ8CAVjM@8M76sfyH4p z_i$fuThd6;!vXl%fzK!FGzfYuFNVd|h6UyHz-iGIi&p}%fNzzzWx+j^x3oCDT+78;c3p`Zyiz^Z<>Y)9f0 zE4=G)b6L0zVX~~jR`oh7{4`N?FoPl^*gDdxlo4C4SqH7^=D_=bSzF7tc{SOZm>RUg z2LrF`n&e^G+9QB$Cx)zvn12r@CKkr)#G1vzzKp#0>WFi(eWPJU?XS>zg3eD3GiHO| z#cc4W7#C1`?2qX?0$& zg|mTy>K4isKB5j}5H&Lxs6LRGStv^Y#g|wWA!}e+_4d)Pujm6YFTCBVE=i07*X3YF0rmDM5Hx9h6XdFl*QAmi6I3&wa_{Rh?PKDY>k47WER&KS_2`m$au}yGE*ZM zsmECLV!X`?yPBmB2NyqI*u8-~tj6H{90;|W>9oVy2ZhbWX>#_o;_QDG4)&+P*&*#1 zRvS4r*Akjj@3z9Bq8BPc7=pb<-*Ogcc9tnAA0U$WjHvzG6yp8qKr%iNAj z<|Z)O3He-}ggq2KIat)#ACV2aiyC_2DWeOmC4;PL#m$dxi=KRJTT#PfXgHrg$8-Nq zIH=X(WZfP;X?Ac@)v{PMd@}nRb73IweI|@xhkr&sf-F_Tv|gKAMn|{lTT64HBvbBE zif+4FGF4k!R2#4)Q;H0%#Ctp1@O3tQHS{e* z+H{=0hYWK~x`}-C-wZRj?>%In{s`Hp4;p4c`fs4!kDyE~Z|V;=&@@nz@^0Z=s!4gP z6!3;5>kcZxu9?IG!Om*7>WV4(WeIf~L1K!w<NwKTVIXbiQ^%JEvW)Ov9@VYAHT!U#IE>l*Z2k5 ztQkekAMksA#JP-W)+o8@Hv7j!@-7m$%h!&GGoAC#W!dx30pVP(=O1eCISb9SeoF;T zn^hO`iX|U?FPqjl#wP_Ec1KT1RzowRW*4iv-AnKkfaQvP^h^*Q+MhiyDU~--+$o|> z4)ZD{WwZ_kf%;RJ_NXWyHNTgn*Ot9TZO^=DV*I_v6olh7hOn`rx6>_!tYeRhI9J(~ zhWUFJGnBVSd;CSF9gxtSR5IpE1nu@!-SdHrABy+dHx7 zdNuJPF{|G=>viH5`sb5~TWms&;{M-3`(F&R2hW|1 zvL_qyzuL1olSBV}In9Mek=cG=e+}4kALHv9@_-*mWZog1D}5BGN!=^fWAJP%w>1Ml^|NNr-e#G7AX}rnD9;;CJZ~>Gb7HGHnai5-LdpdW#?irp>ykm zbCs;mG{|V5K*aEB!&)rN)M7K}S)%hL3|Y}S*y;gY;tfzW_OmuCP2)QR@PRf&q6M%34szi*qt;mxQgoiz0|wB%^JSN4VA0xJBhoyWnE*!8LjJTz2B*- zM2JS%Mz5;YNiVVmvObu+ds{oM?abh3cT+Pd%PG?|?goi97YZ9|hn?Jq9BrSAI=cTt zAMp7fc7)jCtS}61@ITfzIuF;&|=LZqyjrD3bJB#Qq=bd)cUl zh%<)T^WFBNvQgg<4)$)rL+dx~u-cMiN;!F3@6R9uz)nO7HbMr;tscA#!OJkd6yl{6 zFT?p#jF%C38Ohy=lJ(Gqi%bXAZyE_^=I{B@Jn$Tx3K$`Vb^AoLVlPz@=W5~}TfkL$ z&KLC9+J$y z>iI=}Qji)Jx3c%}w2C{Xm(;fhW6@;g-twIc8QEbJVmYZbLWux0NLsn-#X+Ma(ZfOon%zc=uIJD;S>G zcNu1wAM&i-7r5mTb!WiDjLVvP+&K)38s@!Rq+eh^Pv_Tk{tM1N?BRbQjkV$j>0*%2 zzM*`Dl5<=7Qtnw^<&hMQ|8Zt%u|82qY&J9r7ro$sT!J8%khejof(j8-oExNQ4@4DQ z4?$VHxCD;O4jYJSX7YBHxRrc12Lf>(*GT!?54zk%Z(h&W@Z);ixlYMA@e(3XcN&i3N4*_XcBFk86uKQ?RU9}?a6G&Tq@ zk53lPI7u87azCY9<;iEBhoh%Q*5K-y@k7;-$VbzZumeqf5k~+hF=dx>1b`C1FVD=3 zmlJ@>zj1e6uzYuGU-Jl5vSLNSOMEmQLf|0;9#es@$iNN+b|8?-TR^_bhxN8ELXz)G zOP=cu^9SvoVCmsjD^glm^wW0(uLrh#`|ziUU@0d_8C;wdj4*_UWOzwV zc*sH}kVz1^$$Eg1srD3uLqwc$_6RyD*@}mSGm))OjcCK(Jyd;c1oD6MxUE3Rg=N9g zq8GLu-YjI?6Vbsa?D$CiCWbG$#fJ-brB1fvgf^*^h;Zv4!=Uie-Mx21_8c zw0=`oHo?+F9w0-Bu_5c`(n6-q&GW_}GtFf4pm46!Xgf%>eJsrnuzJP#>gX66y~P@@ zlzv>Jk1v*O!cre2ONWC$>R=2$q=1+RiA8BST6<^wTxEDkstXU5SL_y;I0_h7|y*pocq{U8fHI=u0_x&>=b=ui%A3~KFP`JqD_ z^RuE39@-dEQElaiIx1T_Di731E#%%R*&k-zAlX+_t?EHu!O6<4(Dgwsln~hdN`!Y< z;q8g=t|T|}+)ND0Znn7H1dF{LYN4gnEoNPbmu*Q-wpoe0X6so7o*>&|neFvNzebZ+ zTQ70vY_G-kh;GOU@-6hL3j+&vW$pTJv_IJvg)=BN;_9S zz!kPvhZ8h_mSIDS8oo}BUtOA0fSZ#C3P{P`wAq{Cy#WkP-#ilqJS{u)*<|GtXkl6S zU_~bOi9~oE>?9K5=aZF>AUJ@*=wsoLMEFH3ygCtnIa!^O%O^e8nRUZt!)I94!#dY1 zD}ASiA1He_llKYQJw&y8m2CHrocwdL=+x|%GUyCElh97B21=kH^CCMn`an)^9k{nB*a2kPBoIOUcC6__I@chg399lwO-uRubvi$$^Cq2rjQtd` zYkT8$EtChbwP2jZYj0%O0=_oV`97Uj>AcTaBm)<#2sl$E7c)0aMjzxbvQMGJ1S6Z6 zVPqX(WF7S#U}UdKMpoCJs5_XbI{_o>I6fom=$4Tw)-a!}K^H99RTd*dKW~-Py**j^ zVh$sFQL?y~C5u}pW4yt=PO>=cvV+BKm4d$(w9GoiGZs*H{P_yZ;u)O_%;HkVEwK|j zk&L^j;X_IJgR-l@L7hdxXm(sSyFoTPmx57|m9QR2gjXf8QO+@)#cxoRN2H0t>SU5u zQ=Qm_G^$F3pRlBDRwDdlGPy)Tk#8U`#daGRMyAskl^#2pgrP)-EGskq8yQCK)3{K2 zo=sNA*UJ^0TD9sKrKsU&vb`nQ?d`;goJ1ojl1*-$0*`Jr7GqwgzL;pNk`ON^8Y2<{ ze66KyOJ>xsOElgfA)Ze(-b{#0``ae_U;R_4 zYm!<@z#y~jZ(~%^AUI~fMrSvjLl|yUQ}jt=xf4rYLZ^}rROZEL$TK#r3i_nK%dnT| zG}CE^({u(M@Qzs1JODS<0j}v`zOJLQlMaS{Z0*?`(qI-C(v8BoUJE9>AeY37lXbh4 zV3MqJ=}{`-&EbP$bNH_UJ12!J!-u3z0BrLQ=e5EV;c>_-2Rb#3Z4C_4y(dyK7PoaV#E()Ne}J+Ek^tkcOD=XG3Z`K)-&8<_@j}0 z_j^nP@*7}det6UUg%SUE`(+xhZ!zMpxH}oU-!M;d57BpwnzJC_(x({lc9AmkooOE7 za3a7yR=d>r!0ZYJC+%hVl>4O-7T?CfSQYzzmyQk}tP3z^{K(PaHhSA~^_hEeUz^K2 zp!Uc7F}LH2xry_h>j^TFJchnz#ce2(?BRyX1e_<)-cdM;0)R}Y^p2W8Ol(Kbp^iZi zWVz2tKI+^S70XE z5qLG@1Mi9^IguAK=W%b;NSQXwPWQw5C5fr zIyWe6!tUYLbC3ZT_uitPzN2#M^ZIKop+sJNxFuNsT5xJn<2_(}9pM8VmAi@>$H6Nx z)fI~#e!IuM#FwuCt3`)wUDarR=G4K36u z-1a)f-b|tgZyjjwrSBudY)T9GC~pmfX%KuELrs*t2Ey7PzMUqsgVHcg9n^Ft!kW$n z2-qr|YXSGsOl04LCFTcB*b4ff>29g+!dB39IUKNUg~6b-pRr=>LC@eG^i<6ZMz__C zkJl9nn0&)X+W=7%WrlX^aLHGT46HA=d31?$P7+dNLvq=v_$G8?r*p&kD%9J)o(-Q1 zpGcMEIoPt3_Bt=4Mp*L7%`~g71Q~mlIgo%FJ7NW|f;B|v+p>HwDmKfJ3f zyjKV8g;rHg5(w5i6+5yjC2?>bP4PBXVBh-XDr;)UGN6ah8+l0@MyfH}T53(CkpN)& z1-6X^6fF4^JI{g|-%+`}sBt?~tv@nw86ieHxVsFvc5aUq|N$&=T30HVf<> z+~WuN6mn{grt{!S4@QKvK#q8Q&b{NxP{SM1Ue?mWvZcYPFwkEbD!XK=VOX<{&ah?` z&X`vIhAdb1T}aJ&*tf&6a7@D0y0fTN@j6Rlq8FN2HZeFE`ArO!^_XlmYmE<%P!-6% z&jhR-(JwGC$It=`E77(P?}E)}M9oB$vZ%lWj``$Ws}kH%AyK1&HamTU4dR|bBXiVh znQ#nUE3Gw=B&2J#qOfd5@Osp0MX2lx*IQep=mR~R)jZ<_^(Z?6LxbF!_>@kf236~d zT*HcBB%>m0g)>uE_k~!eafAUQl88LR0={@Ci-*410;JQZV1SQCDe`#OG0*%4@b_Ay4xqm3N*V z4^n-J7a_eWB3@T4iW+vHev+Tvf!#oIGNlW`c*p7qoI8Popq1MZ5qQ_yQlXo1r z+JU((S-D9@CWBv49EO@D^bnTrZQibnW}W-_-DZ}8e2_+i=ahq7GBI5X@hf-yGPZc_ zx&1TSlc{p&lFHuA#2vS&)>~BxWk5`KZP7T>Q8`8AH1oIxNDZpuP=(zH|RWTn1gMHJ}3fW_Fv&}19fnEIDK4faQ`QkzMo;M z=;MMW%>_+*55xY*)ygN5VFvRYm_>l(s_QpVGp@Jno2`S&)`%yGe}f+IDhsx@C}{n% z-pQ|mh8)9kYUmoPM}_qpi50m6qJ{TGh1D5|-_-vpA7EX9WL^QC*KfvgV(HNps?hr7 zWDkZG4BbLaEUa${X4T3F*1wL~r)#0mcdG$YziF7>0vadmQ((48BZoX27>wH3XXArOYjnw)TINuNDx z;W}HtB(S66QCzi-50>h)Nng?xEae^*DhNrxgX@d6G{tzDO6^na3cf-PdRnCBb64P0pt~i!SH9Nm z#cSPO8U<1(f>kA$w5zhj$wh5sRS#SBx|1MoOUc$Nu%)$-61ePX%G0pS%&N|T`4fBo zL7L-vxkx}RQ^yAb;|nXww&;@rRaPJ{K2%Y**?;#MrH-}f7P1n{aXh0%mFNq#GtoxQ zJ$~6rBG#$A!nK(Dt{$jd8_yFwnzYs~1J>QkDCS;8F*h7>Znjq#<_~S?2T!x1AN-O1 zBc4azz~f-Xm^?He6&P4wDpqVxBE71`8;<})|;oSp%a)otrZ z46=V(XMYwz#b*Hwt?6~bB6JsEOK;89f(D`OT!V6t{I4ViC&nGarX=j&Y&=T@va z@LJE;RT1Yl`&)dq@hXpV-`;J*VX}c1$`;|^!AV68PoaUwwiY#TX}14zlFUTKKdj~r zJTULQ0vTE>Nu5mZaB;MB1CB6v6R$RZ+7vYccu4PXNp$cA$XVS0x1L;6Toa^4uFhR0 zgH?#G#{Tc4Vz6xJ`4aFVS}*Z3>?v1|t!K$oMm=A`0#3A^>{YGjOH}K%DtVQbO*kWp zL9FBfJxrA8P}X_v_i2VTdb&v7& zdwj)3CLQ(*hWQMcb3u9lUZJmxzY3G}xU=sZBfc?xRm8aZ*YK>5(J+jkM#CxEq;|J(OP@G8sY;Qcl1pU z^KAi~NWqMLbjHkXI(7duU9&ssRoPR8uTt`CRZBzUSWv$u&^kb72ycFCPl?~WNvbbr z)&xGIFDIbZ#nSG2G7gSC>Zl$;j~4np8m}wCF>C5j^n&VMj$OQrxY_h*< z*$?-zAGXuC6J3B^mAK=6fG)8AMw}O*3(`a36RA+1GxxJ_E-_w7jQ=Y!PR-1#q;ynE zM2Sqi`~xUXcu9LI#C~p!=6?o8%YBS?gG2LS^A zod|>u@B;gHK%jj{FQ1>^>-ym<6q;hRC)}oITNc0sc zR@AI&+}gM1Sk18{j!w(r$?058>pbVy%xO}Ft5{k&P68ckWp69T#bO@+;S{w$DXASD zbm4rmwfWGrcg!cZlnz+L4M+-ON~zsY+3vp)X)-VwU-!^le8}qHzL9fZQ3P>BcwBIh zY@X(NeUwEq%#O-;b9}T^!89+YG0)|zmOX{K3*Mu%e>*(7(_~cn8#sw`M0#<75Cn>% zhLr$O0Tn@O+jE1Ie@Vz(5rTL(G3Yqs%8+mC4?NWaWZkT z61v5sl3ik_q6!?oin7{J>3ERV)L<6YWV+TVDnG@2C2Bk8=L^3uFqY#N@XXLR)A!>>mh^)Wr(xeKNS5A&he9YzM}qlWpXk8st^ zye6CsxZtA^^o>D&P2&vn$4!_KVA2-JbMDa8zjp>mKF5MrH45S`DRnHUMNw+5Hd~%K zq?TXr1W-rarf??(+H8ua_LZYxFI+0;Bp3uuTv>q77WHtsHUf-#98^G3Lvsd5&Z=67 z{5@@75*lG$TI;2rkFv8Wbq46~2$%*Qg~;+KZHK2=TeDL6oq8r(Kx<-Eb?>P=^dlc^ zGQhOJ+qK_6@=oQixsPWV;-Bzfz)yHsPNOQT=W zrTKZzow`fqS+MLAP|eA@t={5IDkb)og`3quy1;Ag*xqPE7nOzgWP*6QKGt(fxD5># zxSFTnMS7%$|EusoVcN0<8)^8nVr@|4FTZo*mM|?|fu{C=gMZ=X3YddB`8b^i%&DL~ z6*&GQ!(f609gP+T-_uetd8#@O$idt>wjsPW~D5t<`~SP0OAvo=!Jz}5g{f5ZHlt)&i3m2pm$U*lA{8f?S<9;eD@=zAWF z#$F$B?&C??`Sx!RCQ=^@XMx5b6`7nq52)$01Nyh|Jmrefr&a@F@?%Sq=q{z;h}U&s z3gE5{06H*AWpmKxV%_GI;bS#wRzcvg=T5Umb<7-&!98AS?rTm%x?^(bEGGdb_nLhG z!ablzv|hzhqNi?vO?rn%CL3_>0WT_-?D}92qj%;VQn!ZD$iuo-{;h$s<1DiCktC#v zM9nlJ=_dNX(*r!#vA}+auRkQgL8uO>F}(wFGL=pNkvb#asp*#VZVaOG*99fVTVegS z{z&h8@9ikXSrQ?>iysf+%*Jm%ev9$D2fsS}8t~%|+N1b=8$W5}(R#HsXKTG&-mlks zk<@6n4quN|m1sRv8YZ-!Di@%wC#~4P5uP$@8kC| zemulXhRHc$Hhw04-^GtoLNk7U#ZS(-B*5vR2j7%kyMHKxt!oRX;b?JAcuy}Jy3lO+ zKcgtZTh|ujSJEZj+nwV(rT=N?_)g`1y>onS`qrf{gC$dw@Q8|&h#kQW76PcS* zlNwprI^lx9*SHtbxrEN;bg%}ialb%k937Bf4Hxb;?o>L{=@@i=MCT`To}=>uoegv# zD%7~I)7ebtO*(JUfn;3cz6-~O3~^mrM4U((cF>XZsE9K&eFGf`E7j>I==@v6G15q3 zq#>-_&{POVT9x1B(X`?PN)-YV-lak7t@{0e+M(99A#`S@Q!%y?@D^6Gl1P;K1lteu z3G7`>l^?fQ=wDlqA1iqZ-G;-VJ(l;@K2aAacQ®Mm9P`NnS6c`kH)XS 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⪼EDUn; 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 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d7.dpk b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d7.dpk new file mode 100644 index 0000000..5189670 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d7.dpk @@ -0,0 +1,50 @@ +package SpTBXLib_d7; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $4FC00000} +{$DESCRIPTION 'Toolbar2000 -- SpTBXLib'} +{$RUNONLY} +{$IMPLICITBUILD ON} + +requires + vcl, + tb2k_d7, + TntUnicodeVcl_R70, + rtl; + +contains + SpTBXItem in '..\Source\SpTBXItem.pas', + SpTBXControls in '..\Source\SpTBXControls.pas', + SpTBXTabs in '..\Source\SpTBXTabs.pas', + SpTBXDkPanels in '..\Source\SpTBXDkPanels.pas', + SpTBXEditors in '..\Source\SpTBXEditors.pas', + SpTBXExtEditors in '..\Source\SpTBXExtEditors.pas', + SpTBXColorPickerForm in '..\Source\SpTBXColorPickerForm.pas', + SpTBXMDIMRU in '..\Source\SpTBXMDIMRU.pas', + SpTBXFormPopupMenu in '..\Source\SpTBXFormPopupMenu.pas', + SpTBXCustomizer in '..\Source\SpTBXCustomizer.pas', + SpTBXCustomizerForm in '..\Source\SpTBXCustomizerForm.pas', + SpTBXSkins in '..\Source\SpTBXSkins.pas', + SpTBXDefaultSkins in '..\Source\SpTBXDefaultSkins.pas'; + +end. \ No newline at end of file diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d7.res b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d7.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d9.dpk b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d9.dpk new file mode 100644 index 0000000..8b8047f --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d9.dpk @@ -0,0 +1,50 @@ +package SpTBXLib_d9; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $4FC00000} +{$DESCRIPTION 'Toolbar2000 -- SpTBXLib'} +{$RUNONLY} +{$IMPLICITBUILD ON} + +requires + vcl, + tb2k_d9, + TntUnicodeVcl_R90, + rtl; + +contains + SpTBXItem in '..\Source\SpTBXItem.pas', + SpTBXControls in '..\Source\SpTBXControls.pas', + SpTBXTabs in '..\Source\SpTBXTabs.pas', + SpTBXDkPanels in '..\Source\SpTBXDkPanels.pas', + SpTBXEditors in '..\Source\SpTBXEditors.pas', + SpTBXExtEditors in '..\Source\SpTBXExtEditors.pas', + SpTBXColorPickerForm in '..\Source\SpTBXColorPickerForm.pas', + SpTBXMDIMRU in '..\Source\SpTBXMDIMRU.pas', + SpTBXFormPopupMenu in '..\Source\SpTBXFormPopupMenu.pas', + SpTBXCustomizer in '..\Source\SpTBXCustomizer.pas', + SpTBXCustomizerForm in '..\Source\SpTBXCustomizerForm.pas', + SpTBXSkins in '..\Source\SpTBXSkins.pas', + SpTBXDefaultSkins in '..\Source\SpTBXDefaultSkins.pas'; + +end. \ No newline at end of file diff --git a/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d9.res b/official/2.2.2+2.4.2/SpTBXLib/Packages/SpTBXLib_d9.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Readme.txt b/official/2.2.2+2.4.2/SpTBXLib/Readme.txt new file mode 100644 index 0000000..1a8fe1d --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Readme.txt @@ -0,0 +1,63 @@ +[SpTBXLib] + +SpTBXLib is an add on package for TB2K components, it adds the following features: +- Skins +- Unicode support for items captions and hints properties. +- Custom painting events. +- Custom item size. +- Anchored items. +- Right aligned items. +- Accel char handling. +- Button, Label, Checkbox, RadioButton, with unicode support. +- TabControl with toolbar items support. +- DockablePanel with unicode toolbar items support. +- Panel and GroupBox with transparency and unicode support. +- Titlebar and Form Popup components with unicode support. + +For more info go to: +http://www.silverpointdevelopment.com + +[License] + +Use and/or distribution of the files requires compliance with the +SpTBXLib License, found in SpTBXLib-LICENSE.txt or at: + + http://www.silverpointdevelopment.com/sptbxlib/SpTBXLib-LICENSE.htm + +Alternatively, at your option, the files may be used and/or distributed under +the terms of the Mozilla Public License Version 1.1, found in MPL-LICENSE.txt or at: + + http://www.mozilla.org/MPL + + +[Installation] + +Requirements: +- Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org +- Troy Wolbrink's TNT Unicode Controls (not needed for Delphi/C++Builder 2009) + http://www.tntware.com/delphicontrols/unicode/ + Mirror: http://www.silverpointdevelopment.com/sptbxlib/TntUnicodeControls.zip + +To install SpTBXLib manually: +- If you have a previous version of SpTBXLib installed in the IDE remove it from Component->Install Packages, select SpTBXLib from the list and press the Remove button. +- Add the SpTBXLib 'Source' directory to Tools->Environment Options->Library->Library Path. +- Open the SpTBXLibDsgn_*.dpk design package corresponding to the IDE version, press Compile and then press Install, close the package window (don't save the changes). + +To install SpTBXLib with Silverpoint MultiInstaller (http://www.silverpointdevelopment.com/multiinstaller/index.htm): +- Create a new folder for the installation. +- Download all the component zips to a folder: SpTBXLib + TNT + TB2K +- Download the MultiInstaller and the Setup.Ini, extract them to the folder: + +The installation folder will end up with this files: +C:\MyInstall + |- SpTBXLib.zip + |- TntUnicodeControls.zip + |- tb2k-2.2.2.zip + |- MultiInstaller.exe + |- Setup.ini + +You are ready to install the component packages, just run the MultiInstaller, select the destination folder, and all the components will be unziped, patched, compiled and installed on the Delphi IDE. + +For more info go to: +http://www.silverpointdevelopment.com/sptbxlib/support/index.htm \ No newline at end of file diff --git a/official/2.2.2+2.4.2/SpTBXLib/Registration.txt b/official/2.2.2+2.4.2/SpTBXLib/Registration.txt new file mode 100644 index 0000000..0627a0e --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Registration.txt @@ -0,0 +1,27 @@ +REGISTRATION AND DONATIONS + +Registration is required only if you choose the SpTBXLib License +wich allows you to not include an acknowledgement in your +application's about box or help file, and also allows you to keep the +modifications you've made to SpTBXLib without having to make them public. + +The cost of a single developer license is US$100. This license permits +usage of SpTBXLib in applications created/maintained by only a single +developer. +A site license costs US$200, and permits usage of SpTBXLib in applications +created/maintained by any number of developers at your organization. +Payments are accepted via PayPal and Kagi: + http://www.silverpointdevelopment.com/sptbxlib/registration.htm + +No registration is required if you choose to use SpTBXLib under the +Mozilla Public License Version 1.1 +However, if you wish to express your appreciation for the time I +spend on developing, documenting and supporting it, I do accept and +appreciate donations. +Donations are accepted via PayPal and Kagi: + http://www.silverpointdevelopment.com/sptbxlib/registration.htm + +Thank you for your support. + +Robert Lee +http://www.silverpointdevelopment.com \ No newline at end of file diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXColorPickerForm.dcu b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXColorPickerForm.dcu new file mode 100644 index 0000000000000000000000000000000000000000..a74a09083962db9d582a300da3f4d1c32037bc46 GIT binary patch literal 23643 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 + object SpTBXTabItem1: TSpTBXTabItem + Caption = 'Palette' + Checked = True + end + object SpTBXTabItem2: TSpTBXTabItem + Caption = 'Swatches' + end + object SpTBXTabItem3: TSpTBXTabItem + Caption = 'Eye Dropper' + end + object SpTBXTabSheet3: TSpTBXTabSheet + Left = 0 + Top = 23 + Width = 213 + Height = 144 + Caption = 'Eye Dropper' + ImageIndex = -1 + DesignSize = ( + 213 + 144) + TabItem = 'SpTBXTabItem3' + object imgColorPicker: TImage + Left = 2 + Top = 0 + Width = 207 + Height = 140 + Align = alClient + Visible = False + end + object btnColorPicker: TSpTBXSpeedButton + Left = 48 + Top = 59 + Width = 113 + Height = 22 + Caption = 'Click && Drag' + Anchors = [] + DragMode = dmAutomatic + OnEndDrag = btnColorPickerEndDrag + OnStartDrag = btnColorPickerStartDrag + end + end + object SpTBXTabSheet2: TSpTBXTabSheet + Left = 0 + Top = 23 + Width = 213 + Height = 144 + Caption = 'Swatches' + ImageIndex = -1 + DesignSize = ( + 213 + 144) + TabItem = 'SpTBXTabItem2' + object SpTBXColorListBox1: TSpTBXColorListBox + Left = 5 + Top = 5 + Width = 200 + Height = 132 + Style = [clbsSystemColors, clbsIncludeNone, clbsIncludeDefault, clbsPrettyNames, clbsNoneAsTransparent] + Anchors = [akLeft, akTop, akRight, akBottom] + IntegralHeight = True + ItemHeight = 16 + TabOrder = 0 + OnClick = SpTBXColorListBox1Click + Selected = clActiveBorder + end + end + object SpTBXTabSheet1: TSpTBXTabSheet + Left = 0 + Top = 23 + Width = 213 + Height = 144 + Caption = 'Palette' + ImageIndex = -1 + TabItem = 'SpTBXTabItem1' + object imgPalette: TImage + Left = 5 + Top = 4 + Width = 200 + Height = 137 + Cursor = crHandPoint + AutoSize = True + Picture.Data = { + 07544269746D61704E410100424D4E410100000000003600000028000000C800 + 000089000000010018000000000018410100130B0000130B0000000000000000 + 0000010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101080942 + 080942080942080942080C42080F42081142081342071642071843071A43071C + 43071E43072043072243062444062644062844062A44062C45052D45052F4505 + 3145053345043446043646043846043946043946043946043946033B46033C46 + 033E47023F4702414702424701444702434602424403424203414003403E043F + 3C043F3A053E38053D36053C33063C31063B2E073A2C07392908382608382308 + 372009361C0935180A34140A340F0A33080B32010B31000B30000C30000C2F00 + 0C2F000C2F000C2E000D2E000D2D000D2C000D2C000F2C00112C00132C00152C + 00162C00182C001A2B001C2B001D2B001F2B00212B00232B00252B00262B0028 + 2B002A2B002C2B002D2B002F2B00312B00332A00342A00362A00372A00392A00 + 3A2A003C2A003D2A003F29004029004229004128004027003F26003F25003E24 + 003D22003C21003B20003A1F00391E00381C00371B0036190035180034160033 + 1500321300311100300F002F0E002E0B002D09002C07002C05002B03002A0100 + 29000228000427000527000726000825000A25000A25000D2500102500132500 + 1624001824001A24001D24001F23002123002323002523002722002922002B22 + 002D22002F21003121003221003421003621003720003920003A20003C20003E + 20003F1F00411F00421F00431F00451E00461D00461D00461C00451B00451A00 + 451A004519004518004518004517004416004415004414004414004413014412 + 02431102431103431004430F04430E05430E06430D06430C07420C07420B0842 + 0A08420A08420909420809420809420101010101010C0C5C0C0C5C0C0C5C0C0C + 5C0C115C0C155C0C195C0B1C5D0B1F5D0B225D0B255E0A285E0A2A5E092D5E09 + 305F09335F083660083860073B60073E61064061064362054562044862044A63 + 034C63024E63025164025164025164025164015364005564005765005965005B + 65005D66005F66005E64005D61005C5F005B5D015A5A02595703585504575205 + 564F06554C0854490953460A52420B513F0C4F3B0D4E370D4D340E4C300F4B2B + 104A2611492111471B1246131245091344001443001442001442001442001441 + 00154000153F00163E00163D00193D001B3D001E3D00203D00223D00243D0027 + 3E00293E002B3E002E3E00303E00333E00353E00373E003A3E003C3E003E3E00 + 413E00433E00453E00483E004A3E004C3E004E3E00503E00523E00543E00563E + 00593E005A3E005C3E005B3D005A3C00593A0058390057370056360055350054 + 3300523200513000502E004F2D004E2B004C29004B28004A2600482400472200 + 462000441E00431C00421A004118003F16003E14003D12003C0F003B0D023A0A + 0539080738050937020B37020B36021136021636011A36011E36002135002435 + 002735002A35002D34003034003234003634003833003B33003D330040320042 + 32004532004732004932004B31004E3100503100523100543100563100583000 + 5A30005C30005D2F005F2E005F2D005F2C005F2B005F2A005F29005E28005E26 + 005E25005E24005E23005E22005E21015E1F025D1E035D1D045D1C055D1B055D + 1A065D18075D17085D16095D15095C140A5C130A5C120B5C100B5C0F0B5C0E0C + 5C0D0C5C0C0C5C010101010101100E74100E74100E74100E74101475101A750F + 1F750F23760F27760E2B760E2F770D33770D36780C3A780B3D790A41790A447A + 09487A084B7B074F7B06527C04557D03587D025B7E015E7E00617F00647F0067 + 80006780006780006780006A80006C81006F8100718200748200778300798300 + 788000777D00757A00747700737400727100706D026F6A046E66066C63086B5F + 0A695B0C68570D67530F654E10644A116246136140145F3B155E35165C2F175B + 281859201958171956071A55001B54001B54001B54001C52001C51001D50001D + 4F001E4D00214D00244D00274E002A4E002C4E002F4E00324E00354E00384E00 + 3B4F003E4F00414F00444F00474F004A4F004D4F005050005350005650005950 + 005B50005E50006150006350006651006951006B51006E510071510073510075 + 5100745000734E00724C00704B006F49006D47006C46006B4400694200684000 + 663E00653C00633A006138006036005E34005D32005B3000592E00582B005629 + 005427005325005122005020004E1D004D1B004C19004A160349140648110A46 + 0E0D460E0D460D15460D1B460C20460B25450A2945092D450831450735440639 + 44053C44044043034343024743004A42004D4200504200534200564100594100 + 5C41005F41006140006440006640006940006C40006E4000704000733F00753E + 00773D00773B00773A0077390077370077360077340077330077310077300076 + 2F00762D00762B01762A02762803762704762505762406762207752108751F09 + 751D0A751C0A751A0B75190B75170C75160C75140D74130D74120E74100E7401 + 0101010101130E8B130E8B130E8B130E8B13178B131E8C12248C12298D112E8D + 11338E10388E0F3C8F0E418F0E45900D49910B4E910A5292085693075A93055E + 94036295026695006996006D97007197007498007899007B99007B99007B9900 + 7B99007E9A00829B00859B00889C008B9D008E9D00919E00909A008E97008D93 + 008B9000898C00888800868400858000837C038177068073097E6E0C7C6A0E7A + 6511795F13775A14755516744F1772491970431A6E3C1B6C341D6B2B1E69211F + 6712206600216400216400216400216200226100235F00245E00245C00285C00 + 2B5C002F5C00325C00365D00395D003D5D00405D00435D00475E004A5E004E5E + 00525E00555F00595F005C5F00605F006360006660006A60006D600070600074 + 61007761007A61007D61008061008361008762008962008C62008B6000895E00 + 885C00865A008459008357008155008053007E50007C4E007A4C00784A007748 + 007545007343007140006F3E006D3C006B3900693600673400653100632F0061 + 2C005F29005E27005C24005B2100591F00581C0556190A54160E54160E541518 + 54151F54142654132C53133153123653113B52103F520E43520D47510C4B510A + 5051085450065750055B50035F4F01634F00664F00694F006D4E00704E00734E + 00764E00794E007D4D00804D00824D00854D00884D008B4B008E4A008E48008E + 46008D45008D43008D41008D40008D3E008D3C008D3A008D39008D37008D3500 + 8D33018C31028C2F038C2E048C2C058C2A068C28078C26088C24098C220A8C20 + 0B8B1E0B8B1D0C8B1B0C8B190D8B170D8B150E8B130E8B010101010101160CA1 + 160CA1160CA1160CA11618A21521A21529A3142FA41335A4123BA51140A51046 + A60F4BA70E50A80D55A80B5AA9095FAA0664AB0468AC016DAD0072AD0076AE00 + 7AAF007FB00083B10087B2008BB2008FB3008FB3008FB3008FB30093B40097B5 + 009AB6009EB600A2B700A5B800A9B900A7B500A5B000A3AC00A2A800A0A4009E + 9F009C9A009A9600989100968C01948705928109907C0D8E76118C70138A6A16 + 886518865E1A84571C824F1E7F481F7D3F217B3522792A23771A247500257300 + 257300257300267100277000286E00296C002A6A002E6A00326A00366B003A6B + 003E6B00426B00466B004A6C004E6C00526C00566D005B6D005F6D00626E0067 + 6E006B6E006F6F00736F00776F007B6F007F70008270008670008A70008E7100 + 9171009571009871009C72009F7200A37200A170009F6E009D6C009C6A009A67 + 00986500966300946100925E00905C008E59008C5700895400875100854F0083 + 4C008049007E46007C4400794100773E00753B007338007135006E32006D2F00 + 6B2C0069290067260065230463200A621C0F621C0F611C1B611B24611A2C611A + 3360193960183E6016445F15495F144E5E13525E12575E105C5D0E615D0C655D + 0A695C076E5C05725C02765C007A5B007E5B00825B00855B00895A008C5A0090 + 5A00935A00975A009A5A009E5900A15700A45600A45400A45200A45000A44E00 + A44C00A34A00A34800A34600A34400A34200A34000A33E00A33C00A33900A337 + 00A33500A33301A33102A22E04A22C05A22A05A22807A22507A22308A22109A2 + 1F0AA21D0AA21B0BA2180CA2160CA10101010101011807B71807B71807B71807 + B71718B81723B9162DB91534BA143BBB1342BB1248BC114FBD0F54BE0D5ABF0B + 60BF0866C1056BC20271C20076C3007CC50081C60086C6008BC80090C90095CA + 0099CA009ECB00A2CC00A2CC00A2CC00A2CC00A7CD00ABCE00AFCF00B4D000B8 + D100BCD200C0D300BECE00BCC900BAC500B8C000B5BB00B3B600B1B000AFAB00 + ADA500AAA000A89A00A69404A38E0AA1870F9E80139C79169A7319976C1C9564 + 1E925B209053228E49248B3E2589322786222884002982002982002982002B80 + 002C7E002D7C002E79002F77003377003878003D78004178004679004A79004F + 7900547900587A005D7A00617A00667B006B7B006F7C00747C00797C007D7D00 + 827D00867E008B7E008F7E00937F00987F009C7F00A08000A48000A88000AC81 + 00B18100B48100B88100B67F00B47D00B27A00B07800AE7500AC7300A97000A7 + 6E00A56B00A26800A065009E62009B6000995D00965A009356009154008E5000 + 8C4D00894A008646008443008140007F3D007C39007A3600783300762F00742C + 0072290370250B6E21116E21116D211F6D20296D1F326C1E396C1D406C1C466B + 1B4C6B1A526B19586A175D6A16626A146869126D691072680D76680A7C680780 + 67048567018967008E67009266009666009A66009E6600A36600A66500AA6500 + AE6500B26500B66300B96100B95F00B95D00B95A00B95800B95600B95400B952 + 00B94F00B94D00B94B00B94800B94600B94300B94100B93F00B93C00B83A00B8 + 3700B83400B83200B82F00B82D01B82A02B82802B82503B82304B82005B81E05 + B81B06B81807B70101010101011900CD1900CD1900CD1900CD1817CE1825CE17 + 31CF1639D01541D11349D11250D21057D30E5ED40B64D5086AD60472D70178D9 + 007EDA0084DB008ADC0090DD0095DE009BE000A1E100A6E200ABE300B0E400B5 + E500B5E500B5E500B5E500BBE600BFE700C4E900C9EA00CEEB00D2EC00D7ED00 + D4E700D2E200CFDD00CDD700CAD200C8CC00C5C600C3C000C0B900BEB300BBAC + 00B8A600B69F03B3970BB09011AD8815AB8119A8791CA5701FA36722A05E249D + 53269A4728983A2A95292B93072D90002D90002D90002E8E002F8B0030890032 + 86003384003884003E84004385004885004D85005286005786005C8600618700 + 6687006B88007188007689007B8900808A00868A008B8B00908B00958B009A8C + 009F8C00A38D00A88D00AD8D00B28E00B68E00BB8F00BF8F00C48F00C89000CD + 9000CA8D00C88B00C68800C38500C18300BF8000BC7D00B97A00B77700B47400 + B27100AF6E00AC6A00A96700A66400A36000A15D009E5A009B5600985200954F + 00924B008F47008C4400894000873C008439008235008031007D2E047B2A0D79 + 251379251378252378242E78233877224077214777204E761F55761E5B761C61 + 751B6775196D75177374157974137E731083730D8973098E7204937201987200 + 9E7200A27100A77100AB7100B07100B57000B97000BD7000C17000C67000CA6D + 00CE6B00CE6900CE6700CE6400CE6200CE6000CE5D00CE5B00CE5800CE5600CE + 5300CE5000CE4E00CE4B00CE4800CE4600CE4300CE4000CE3D00CE3A00CE3700 + CE3400CD3100CD2E00CD2C00CD2900CD2600CD2300CD2000CD1D00CD1900CD01 + 01010101011A00E21A00E21A00E21A00E21916E31827E41734E5163EE51547E6 + 134FE71158E80F60E90C67EA086EEB0475EC007DEE0084EF008AF00091F20098 + F3009EF400A4F600AAF700B1F800B7FA00BCFB00C2FC00C7FD00C7FD00C7FD00 + C7FD00CEFF00D3FF00D8FF00DDFF00E3FF00E8FF00EDFF00EAFF00E7FA00E4F4 + 00E2EE00DFE800DCE100D9DB00D6D400D3CD00D1C600CEBE00CBB700C8AF00C5 + A704C29F0DBE9713BC8F18B9861CB67C20B27323AF6826AC5D28A9502AA6422C + A3302EA10F309E00309E00309E00319B003398003496003593003690003D9000 + 4391004991004E91005492005992005F93006593006A94007094007594007C95 + 008196008796008C97009397009898009D9800A39900A99900AE9A00B39A00B8 + 9B00BD9B00C39B00C89C00CD9C00D29D00D79D00DC9D00E09E00DE9B00DB9800 + D99500D69200D48F00D18C00CE8900CB8600C88300C57F00C27C00BF7800BC75 + 00B97100B66E00B26A00B06600AC6200A95F00A55A00A256009F53009C4F0099 + 4A00964600934200903E008D3A008B3600883206862E10832917832917832827 + 82283382273E82264681254E81245681225D80216480206B801E717F1C777F1A + 7E7F18847E158A7E12907E0E967D0A9C7D05A17D00A77C00AD7C00B27C00B77B + 00BC7B00C17B00C67B00CB7B00D07A00D47A00D97A00DE7700E27500E27300E2 + 7000E26E00E36B00E36900E36600E36300E36100E35E00E35B00E35800E35500 + E35200E34F00E34C00E34900E34600E34300E34000E33C00E23900E23600E233 + 00E22F00E22C00E22900E22500E22200E21E00E21A00E20101010101012A3DE5 + 2A3DE52A3DE52A3DE52B45E62B4CE72B54E82C5BE92C62EA2C68EB2C70EC2D76 + ED2D7CEE2D82EF2D88F02D8FF12D94F22D9AF32D9FF42DA5F52DAAF72CAFF82C + B5F92BBAFA2ABFFB2AC4FC29C9FD28CEFE28CEFE28CEFE28CEFE27D3FF26D8FF + 24DCFF23E1FF21E6FF1FEAFF1DEEFF21ECFF24EAFB27E7F629E5F12CE2EB2EE0 + E530DDE032DBDA34D8D436D6CE37D3C839D1C13ACEBB3CCCB43DC9AD3EC6A63F + C4A040C19942BF9143BC8944B98145B67845B36F46B16647AE5C48AB5049A944 + 49A94449A94449A6354AA41E4AA1004B9F004C9C00519D00569D005C9D00619E + 00669E006B9F00719F0076A0007BA00080A00085A1008BA10090A20095A2009A + A3009FA300A4A400A9A400ADA500B3A500B7A600BCA600C0A600C5A700CAA700 + CEA800D3A800D7A800DCA900E0A900E4A900E2A700DFA400DDA100DB9E00D89C + 00D69900D39600D19300CE9000CC8C00C98900C68600C48300C17F00BE7C00BB + 7800B87500B57200B26E00AF6A00AC660CA96318A65F1FA35B25A0572A9D532E + 9A4F32974B3595473892433A8F3F3C8D3B3E8D3B3E8D3B478D3B4E8C3B568C3B + 5D8C3B638C3B698C3B708C3B768C3B7B8C3B818B3B878B3B8D8B3B928B3B978B + 3B9C8B3BA18B3AA68B3AAB8B3AB08B3AB58B3ABA8A3ABE8A3AC38A39C78A39CC + 8A39D08A39D58A39D98A38DD8A38E18838E58538E58339E68139E67E39E67C3A + E6793AE6763AE6743AE6713BE66E3BE66B3BE6693BE6663BE6633BE6603CE65D + 3CE65A3CE6573CE6543CE6503CE64D3CE64A3CE6463CE6433CE6403CE63C3CE6 + 393CE6353CE6323CE52E3DE52A3DE5010101010101405FE9405FE9405FE9405F + E94164EA426AEB4370EC4476EC457BED4680EE4786EF488BF04990F14A95F24B + 9AF34C9FF44DA4F54DA9F64EADF74FB2F850B7F950BBF951BFFA51C4FB52C9FC + 52CDFD53D1FE53D5FF53D5FF53D5FF53D5FF54D9FF54DDFF54E1FF55E4FF55E9 + FF55EDFF56F0FF56EEFF57ECFC58EAF858E8F359E6EE59E4EA5AE2E55AE0E05B + DEDB5CDCD65CD9D05CD7CB5DD5C65DD3C05ED1BB5ECEB55ECCB05FCAAA5FC8A4 + 60C69E60C39760C19060BE8A61BC8261BA7B61B77461B56C61B56C61B56C62B3 + 6362B05A62AE5062AC4562A93967AA376CAA3671AB3476AB337AAB317FAC2F83 + AC2D88AD2B8DAD2991AD2796AE249BAE219FAF1DA3AF1AA8B016ADB010B1B109 + B5B100B9B100BEB200C2B200C5B200C9B300CDB300D1B400D5B400D9B400DCB5 + 00E1B500E4B500E8B600E6B300E4B000E2AE00E0AB00DEA900DBA600D9A308D7 + A015D59E1DD29B23D09829CE952DCB9231C98F35C68C39C4893CC2863EBF8341 + BD7F44BA7C46B77949B4754BB2724DAF6E4FAC6A51A96752A66354A45F55A15C + 579E58589C545999505B99505B99516199516699526D9952729953789A547D9A + 54829A55879A558C9A56919A57959A579B9A589F9A58A49A59A89A59AD9A5AB2 + 9A5AB69B5BBA9B5BBF9B5CC39B5CC79B5DCB9B5DCE9B5ED29B5ED69B5FDA9B5F + DD9B60E29B60E59961E99761E99561E99261E99061E98D61E98B61E98861E986 + 60E98360E98160E97E60E97B60E97960E97660E97360E97160E96E60E96B60E9 + 6860E96460E96160E95E5FE95B5FE9585FE9545FE9515FE94E5FE94A5FE9475F + E9435FE9405FE90101010101015A7DED5A7DED5A7DED5A7DED5C81EE5D86EF5F + 8BF0608FF06194F16398F2649CF365A0F466A4F468A8F569ACF66AB0F76BB4F7 + 6CB8F86DBCF96EBFFA6FC3FA70C6FB71CAFC72CEFD73D2FD74D5FE75D8FF76DC + FF76DCFF76DCFF76DCFF76DFFF77E2FF78E5FF79E9FF79ECFF7AF0FF7BF3FF7B + F1FF7BEFFD7BEEF97BECF57CEAF17CE8ED7CE7E97CE5E57CE3E17CE1DD7CE0D9 + 7CDED47CDCD07CDACC7CD8C77CD7C27CD5BF7CD3BA7CD1B57CCFB07CCEAB7CCC + A67CCAA17CC89C7CC6967CC4917CC28B7CC28B7CC28B7CC0857CBE7F7CBC787C + BA727CB86B80B86A84B96A89B9698CB96890BA6894BA6798BB679CBB66A0BB65 + A4BC64A7BC64ACBC63AFBD62B3BD62B6BD61BABE60BDBE5FC1BE5EC4BF5EC8BF + 5DCCC05CCFC05BD2C05AD5C059D9C159DCC158DFC157E2C256E6C255E9C254EC + C353EAC055E9BE56E7BC58E5B959E3B75BE1B45CDFB25DDEB05EDCAD60DAAA61 + D8A862D6A564D4A365D2A066D09D67CE9B68CC9869CA956AC7936BC5906CC38D + 6DC18A6DBE876EBC846FBA8170B77D71B57A72B27772B07473AE7074AB6D75A9 + 6975A96975A96A7AA96B7FA96C84A96D89AA6E8DAA6F91AA6F96AA709AAA719E + AB72A2AB73A6AB74AAAB74AEAB75B2AB76B6AC77B9AC77BDAC78C1AC79C4AC7A + C8AD7BCCAD7BCFAD7CD2AD7DD6AD7DD9AD7EDCAE7FE0AE7FE3AE80E6AE81EAAC + 81EDAA81EDA881EDA681EDA381EDA181ED9F81ED9C81ED9A80ED9880ED9580ED + 9380ED9080ED8E80ED8B80ED8980ED877FED847FED817FED7F7FED7C7FED797F + ED767EED737EED707EED6D7EED6A7EED677EED647DED617DED5E7DED5A7DED01 + 01010101017999F27999F27999F27999F27A9DF27BA0F37DA4F47EA7F47FABF5 + 81AEF582B1F683B4F784B7F785BAF886BDF888C1F989C4F98AC6FA8BC9FB8CCC + FB8DCFFC8ED2FC8FD5FD90D8FE91DBFE92DDFF93E0FF94E3FF94E3FF94E3FF94 + E3FF95E5FF96E8FF97EAFF97EDFF98F0FF99F3FF9AF5FF9AF4FF9AF3FD9AF1FA + 9AF0F79AEFF49AEDF19AECEE9AEAEB9AE9E799E8E499E6E199E5DD99E3DA99E2 + D699E0D399DFCF99DECC98DCC898DBC598D9C198D8BD98D6B998D5B598D3B197 + D2AD97D0A997CFA597CFA597CFA597CDA197CB9D96CA9896C89496C78F99C78F + 9CC78EA0C88EA4C88EA7C88DAAC98DADC98DB0C98CB3C98CB6CA8CB9CA8BBCCA + 8BBFCB8AC2CB8AC5CB8AC8CC89CACC89CDCC89D0CC88D3CD88D6CD87D9CD87DB + CD87DECE86E0CE86E3CE85E6CF85E8CF85EBCF84EECF84F0D083EFCE84EDCC84 + ECC985EAC785E9C586E7C386E6C187E4BF87E3BD87E1BB88E0B988DEB689DCB4 + 89DBB28AD9B08AD7AD8AD6AB8BD4A98BD2A68BD1A48CCFA28CCD9F8CCB9D8DC9 + 9A8DC7988DC6958EC4938EC2908EC08D8FBE8B8FBC888FBA8590BA8590BA8693 + BA8797BB889BBB899FBB8AA2BB8BA6BC8BA9BC8CACBC8DB0BC8EB3BC8FB6BD90 + BABD91BDBD91C0BD92C3BE93C6BE94C9BE95CCBE95CFBF96D2BF97D5BF98D8BF + 99DBBF99DDC09AE0C09BE3C09CE6C09CE8C09DEBC19EEEBF9EF1BD9EF1BB9EF1 + B99EF1B79EF1B59EF1B39EF1B19DF1AF9DF1AD9DF1AB9DF1A99DF1A69DF1A49C + F1A29CF1A09CF19E9CF19B9CF1999CF1979BF2949BF2929BF2909BF28D9BF28B + 9BF2889AF2869AF2839AF2819AF27E9AF27B9AF27999F20101010101019AB5F6 + 9AB5F69AB5F69AB5F69BB7F79CBAF79DBCF79EBEF89FC0F8A0C3F8A1C6F9A2C8 + F9A3CAFAA4CCFAA5CEFBA6D1FBA7D3FBA8D5FCA9D7FCAADAFDABDCFDACDEFDAD + E0FEAEE2FEAFE4FFAFE6FFB0E8FFB1EAFFB1EAFFB1EAFFB1EAFFB2ECFFB3EEFF + B4F0FFB5F2FFB6F4FFB6F6FFB7F8FFB7F7FFB7F6FEB7F5FCB7F4F9B6F3F7B6F2 + F5B6F1F2B6F0F0B6EFEDB6EEEBB6EDE9B5ECE6B5EBE4B5EAE1B5E8DEB5E7DCB5 + E6D9B4E5D7B4E4D4B4E3D1B4E2CFB4E1CCB3E0C9B3DFC7B3DEC4B3DDC1B3DBBE + B3DBBEB3DBBEB2DABBB2D9B8B2D8B5B2D7B2B2D6AFB4D6AFB6D6AFB8D6AFBBD7 + AFBDD7AEBFD7AEC2D7AEC4D8AEC7D8AEC9D8ADCBD8ADCDD8ADCFD9ADD1D9ADD3 + D9ACD6D9ACD8DAACDADAACDCDAABDEDAABE0DAABE2DBABE4DBABE6DBABE9DBAA + EBDCAAEDDCAAEFDCAAF1DCA9F2DCA9F4DDA9F3DBA9F2D9A9F1D8A9F0D6A9EFD4 + A9EED3AAECD1AAEBCFAAEACEAAE9CCAAE8CAAAE6C8AAE5C7AAE4C5AAE3C3AAE1 + C1AAE0C0AADFBEAADEBCABDCBAABDBB8ABDAB6ABD8B5ABD7B3ABD6B1ABD4AFAB + D3ADABD2ABABD0A9ABCFA7ABCDA5ABCCA3ABCCA3ABCCA4AECCA4B1CDA5B3CDA6 + B6CDA7B8CDA8BBCEA9BECEA9C0CEAAC3CEABC5CFACC8CFACCACFADCCCFAECFCF + AED1D0AFD4D0B0D6D0B1D8D0B1DBD0B2DDD1B3DFD1B4E1D1B4E3D1B5E5D2B6E8 + D2B7EAD2B7ECD2B8EED2B9F1D3B9F3D1BAF5CFBAF5CEB9F5CCB9F5CBB9F5C9B9 + F5C7B9F5C6B9F5C4B9F5C2B8F5C1B8F5BFB8F5BDB8F5BBB8F5BAB8F5B8B8F5B6 + B7F5B4B7F6B3B7F6B1B7F6AFB7F6ADB7F6ABB6F6A9B6F6A7B6F6A6B6F6A4B6F6 + A2B6F6A0B5F69EB5F69CB5F69AB5F6010101010101BBCFFABBCFFABBCFFABBCF + FABCD0FABDD2FABDD3FBBED5FBBFD6FBC0D8FBC1DAFCC1DBFCC2DDFCC3DEFCC4 + DFFCC4E1FDC5E2FDC6E3FDC6E5FEC7E6FEC8E8FEC8E9FEC9EAFFCAECFFCAEDFF + CBEEFFCCEFFFCCF1FFCCF1FFCCF1FFCCF1FFCDF3FFCEF4FFCFF5FFCFF7FFD0F8 + FFD1F9FFD1FAFFD1FAFFD1F9FED1F8FDD1F8FBD0F7FAD0F6F8D0F6F6D0F5F5D0 + F4F3D0F4F2D0F3F0CFF2EFCFF2EDCFF1EBCFF0EACFF0E8CFEFE6CFEEE5CEEDE3 + CEEDE1CEECE0CEEBDECEEBDCCEEADACDE9D9CDE8D7CDE8D5CDE8D5CDE8D5CDE7 + D3CDE6D2CDE6D0CCE5CECCE4CCCEE4CCCFE4CCD1E5CCD2E5CCD4E5CCD5E5CCD7 + E5CBD9E5CBDAE6CBDBE6CBDDE6CBDEE6CBE0E6CBE1E6CBE2E6CBE4E7CBE5E7CA + E6E7CAE8E7CAE9E7CAEAE7CAECE7CAEDE7CAEEE8CAF0E8CAF2E8C9F3E8C9F4E8 + C9F6E8C9F7E9C9F8E9C9F7E8C9F7E6C9F6E5C9F5E4C9F4E3C9F3E2C9F3E0C9F2 + DFC8F1DEC8F0DDC8F0DCC8EFDBC8EED9C8EDD8C8ECD7C8EBD6C8EBD4C8EAD3C8 + E9D2C8E8D1C8E7CFC8E6CEC8E6CDC8E5CCC8E4CAC7E3C9C7E2C8C7E1C6C7E0C5 + C7DFC4C7DFC3C7DEC1C7DEC1C7DEC2C9DEC2CADEC3CCDEC3CEDFC4CFDFC5D1DF + C5D3DFC6D5DFC7D7DFC7D8E0C8DAE0C8DBE0C9DDE0C9DEE0CAE0E0CAE2E1CBE3 + E1CCE5E1CCE6E1CDE8E1CDE9E1CEEBE2CEECE2CFEDE2D0F0E2D0F1E2D1F3E2D1 + F4E3D2F5E3D2F7E2D3F8E0D3F8DFD2F9DED2F9DDD2F9DCD2F9DBD2F9D9D2F9D8 + D2F9D7D2F9D6D1F9D5D1F9D3D1F9D2D1F9D1D1F9D0D1F9CFD1F9CDD1F9CCD1F9 + CBD0F9C9D0F9C8D0F9C7D0F9C6D0F9C4D0F9C3D0FAC2D0FAC0CFFABFCFFABECF + FABCCFFABBCFFA010101010101DDE8FDDDE8FDDDE8FDDDE8FDDDE8FDDEE9FDDE + EAFDDEEAFDDFEBFDDFECFDE0ECFEE0EDFEE0EEFEE1EEFEE1EFFEE2F0FEE2F0FE + E2F1FEE3F2FFE3F3FFE4F4FFE4F4FFE4F5FFE5F6FFE5F6FFE6F7FFE6F8FFE6F8 + FFE6F8FFE6F8FFE6F8FFE7F9FFE7FAFFE7FAFFE8FBFFE8FBFFE9FCFFE9FDFFE9 + FCFFE9FCFFE9FCFEE9FBFDE9FBFCE8FBFCE8FAFBE8FAFAE8FAF9E8F9F8E8F9F8 + E8F9F7E8F8F6E8F8F5E8F8F4E8F7F4E7F7F3E7F7F2E7F6F1E7F6F0E7F6F0E7F5 + EFE7F5EEE7F5EDE7F4ECE7F4ECE7F4EBE7F4EBE7F4EBE6F3EAE6F3E9E6F3E8E6 + F2E7E6F2E7E7F2E7E8F2E7E8F2E7E9F2E7EAF2E6EAF2E6EBF2E6ECF2E6ECF3E6 + EDF3E6EEF3E6EEF3E6EFF3E6F0F3E6F0F3E6F2F3E6F2F3E6F3F3E6F4F3E6F4F3 + E6F5F3E6F6F4E6F6F4E6F7F4E6F8F4E5F8F4E5F9F4E5FAF4E5FAF4E5FBF4E5FC + F4E5FBF4E5FBF3E5FBF2E5FAF2E5FAF1E5F9F0E5F9F0E5F8EFE5F8EFE5F8EEE5 + F7EDE5F7EDE4F6ECE4F6EBE4F6EBE4F5EAE4F5EAE4F4E9E4F4E8E4F4E8E4F3E7 + E4F3E6E4F2E6E4F2E5E4F2E4E4F1E4E4F1E3E3F0E3E3F0E2E3EFE1E3EFE1E3EF + E0E3EFE0E3EFE0E4EFE1E5EFE1E5EFE1E6EFE1E7EFE2E8EFE2E9EFE2E9EFE3EA + F0E3EBF0E3ECF0E4EDF0E4EDF0E4EEF0E5EFF0E5F0F0E5F1F0E6F2F0E6F3F1E6 + F3F1E7F4F1E7F5F1E7F6F1E8F7F1E8F7F1E8F8F1E8F9F1E9FAF1E9FAF1E9FBF1 + EAFCF0EAFCF0E9FCEFE9FCEEE9FCEEE9FCEDE9FCECE9FCECE9FCEBE9FCEBE9FC + EAE9FCE9E9FCE9E9FCE8E9FCE7E9FCE7E9FCE6E9FCE5E8FCE5E8FCE4E8FCE4E8 + FDE3E8FDE2E8FDE2E8FDE1E8FDE0E8FDE0E8FDDFE8FDDEE8FDDEE8FDDDE8FD01 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101FF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0000000000000000 + 00000000000000000000000000000000000000000000FF0099FF0099FF0099FF + 0099FF0099FF0099FF0099FF0099FF0099010101FF3399FF3399FF3399FF3399 + FF3399FF3399FF3399FF3399FF3399010101FF6699FF6699FF6699FF6699FF66 + 99FF6699FF6699FF6699FF6699010101FF9999FF9999FF9999FF9999FF9999FF + 9999FF9999FF9999FF9999010101FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99 + FFCC99FFCC99FFCC99010101FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF + 99FFFF99FFFF99010101FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF + 00CCFF00CC010101FF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CC + FF33CC010101FF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66 + CC010101FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CC01 + 0101FFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC010101 + FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCC010101FF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF010101FF33FFFF + 33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FF010101FF66FFFF66FF + FF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FF010101FF99FFFF99FFFF99 + FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FF010101FFCCFFFFCCFFFFCCFFFF + CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF010101FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF010101010101FF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FF00000000000000000000000000000000 + 0000000000000000000000000000FF0099FF0099FF0099FF0099FF0099FF0099 + FF0099FF0099FF0099010101FF3399FF3399FF3399FF3399FF3399FF3399FF33 + 99FF3399FF3399010101FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF + 6699FF6699010101FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999 + FF9999010101FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC + 99010101FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF9901 + 0101FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CC010101 + FF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CC010101FF66 + CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CC010101FF99CCFF + 99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CC010101FFCCCCFFCCCC + FFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC010101FFFFCCFFFFCCFFFF + CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCC010101FF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FF010101FF33FFFF33FFFF33FFFF33FF + FF33FFFF33FFFF33FFFF33FFFF33FF010101FF66FFFF66FFFF66FFFF66FFFF66 + FFFF66FFFF66FFFF66FFFF66FF010101FF99FFFF99FFFF99FFFF99FFFF99FFFF + 99FFFF99FFFF99FFFF99FF010101FFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF + FFCCFFFFCCFFFFCCFF010101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFF010101010101FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FF000000000000000000000000000000000000000000000000 + 000000000000FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF00 + 99010101FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF339901 + 0101FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699010101 + FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999010101FFCC + 99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99010101FFFF99FF + FF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99010101FF00CCFF00CC + FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CC010101FF33CCFF33CCFF33 + CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CC010101FF66CCFF66CCFF66CCFF + 66CCFF66CCFF66CCFF66CCFF66CCFF66CC010101FF99CCFF99CCFF99CCFF99CC + FF99CCFF99CCFF99CCFF99CCFF99CC010101FFCCCCFFCCCCFFCCCCFFCCCCFFCC + CCFFCCCCFFCCCCFFCCCCFFCCCC010101FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF + FFCCFFFFCCFFFFCCFFFFCC010101FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FF010101FF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33 + FFFF33FFFF33FF010101FF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF + 66FFFF66FF010101FF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FF + FF99FF010101FFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCC + FF010101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 + 0101010101FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + 000000000000000000000000000000000000000000000000000000000000FF00 + 99FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099010101FF3399FF + 3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399010101FF6699FF6699 + FF6699FF6699FF6699FF6699FF6699FF6699FF6699010101FF9999FF9999FF99 + 99FF9999FF9999FF9999FF9999FF9999FF9999010101FFCC99FFCC99FFCC99FF + CC99FFCC99FFCC99FFCC99FFCC99FFCC99010101FFFF99FFFF99FFFF99FFFF99 + FFFF99FFFF99FFFF99FFFF99FFFF99010101FF00CCFF00CCFF00CCFF00CCFF00 + CCFF00CCFF00CCFF00CCFF00CC010101FF33CCFF33CCFF33CCFF33CCFF33CCFF + 33CCFF33CCFF33CCFF33CC010101FF66CCFF66CCFF66CCFF66CCFF66CCFF66CC + FF66CCFF66CCFF66CC010101FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99 + CCFF99CCFF99CC010101FFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFF + CCCCFFCCCC010101FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCC + FFFFCC010101FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FF010101FF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FF01 + 0101FF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FF010101 + FF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FF010101FFCC + FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF010101FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF010101010101FF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0000000000000000 + 00000000000000000000000000000000000000000000FF0099FF0099FF0099FF + 0099FF0099FF0099FF0099FF0099FF0099010101FF3399FF3399FF3399FF3399 + FF3399FF3399FF3399FF3399FF3399010101FF6699FF6699FF6699FF6699FF66 + 99FF6699FF6699FF6699FF6699010101FF9999FF9999FF9999FF9999FF9999FF + 9999FF9999FF9999FF9999010101FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99 + FFCC99FFCC99FFCC99010101FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF + 99FFFF99FFFF99010101FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF + 00CCFF00CC010101FF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CC + FF33CC010101FF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66 + CC010101FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CC01 + 0101FFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC010101 + FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCC010101FF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF010101FF33FFFF + 33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FF010101FF66FFFF66FF + FF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FF010101FF99FFFF99FFFF99 + FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FF010101FFCCFFFFCCFFFFCCFFFF + CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF010101FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF010101010101FF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FF00000000000000000000000000000000 + 0000000000000000000000000000FF0099FF0099FF0099FF0099FF0099FF0099 + FF0099FF0099FF0099010101FF3399FF3399FF3399FF3399FF3399FF3399FF33 + 99FF3399FF3399010101FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF + 6699FF6699010101FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999 + FF9999010101FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC + 99010101FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF9901 + 0101FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CC010101 + FF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CC010101FF66 + CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CC010101FF99CCFF + 99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CC010101FFCCCCFFCCCC + FFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC010101FFFFCCFFFFCCFFFF + CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCC010101FF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FF010101FF33FFFF33FFFF33FFFF33FF + FF33FFFF33FFFF33FFFF33FFFF33FF010101FF66FFFF66FFFF66FFFF66FFFF66 + FFFF66FFFF66FFFF66FFFF66FF010101FF99FFFF99FFFF99FFFF99FFFF99FFFF + 99FFFF99FFFF99FFFF99FF010101FFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF + FFCCFFFFCCFFFFCCFF010101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFF010101010101FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FF000000000000000000000000000000000000000000000000 + 000000000000FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF00 + 99010101FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF339901 + 0101FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699010101 + FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999010101FFCC + 99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99010101FFFF99FF + FF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99010101FF00CCFF00CC + FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CC010101FF33CCFF33CCFF33 + CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CC010101FF66CCFF66CCFF66CCFF + 66CCFF66CCFF66CCFF66CCFF66CCFF66CC010101FF99CCFF99CCFF99CCFF99CC + FF99CCFF99CCFF99CCFF99CCFF99CC010101FFCCCCFFCCCCFFCCCCFFCCCCFFCC + CCFFCCCCFFCCCCFFCCCCFFCCCC010101FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF + FFCCFFFFCCFFFFCCFFFFCC010101FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FF010101FF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33 + FFFF33FFFF33FF010101FF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF + 66FFFF66FF010101FF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FF + FF99FF010101FFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCC + FF010101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 + 0101010101FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + 000000000000000000000000000000000000000000000000000000000000FF00 + 99FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099010101FF3399FF + 3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399010101FF6699FF6699 + FF6699FF6699FF6699FF6699FF6699FF6699FF6699010101FF9999FF9999FF99 + 99FF9999FF9999FF9999FF9999FF9999FF9999010101FFCC99FFCC99FFCC99FF + CC99FFCC99FFCC99FFCC99FFCC99FFCC99010101FFFF99FFFF99FFFF99FFFF99 + FFFF99FFFF99FFFF99FFFF99FFFF99010101FF00CCFF00CCFF00CCFF00CCFF00 + CCFF00CCFF00CCFF00CCFF00CC010101FF33CCFF33CCFF33CCFF33CCFF33CCFF + 33CCFF33CCFF33CCFF33CC010101FF66CCFF66CCFF66CCFF66CCFF66CCFF66CC + FF66CCFF66CCFF66CC010101FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99 + CCFF99CCFF99CC010101FFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFF + CCCCFFCCCC010101FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCC + FFFFCC010101FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FF010101FF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FF01 + 0101FF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FF010101 + FF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FF010101FFCC + FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF010101FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF010101010101FF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0000000000000000 + 00000000000000000000000000000000000000000000FF0099FF0099FF0099FF + 0099FF0099FF0099FF0099FF0099FF0099010101FF3399FF3399FF3399FF3399 + FF3399FF3399FF3399FF3399FF3399010101FF6699FF6699FF6699FF6699FF66 + 99FF6699FF6699FF6699FF6699010101FF9999FF9999FF9999FF9999FF9999FF + 9999FF9999FF9999FF9999010101FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99 + FFCC99FFCC99FFCC99010101FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF + 99FFFF99FFFF99010101FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF + 00CCFF00CC010101FF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CC + FF33CC010101FF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66 + CC010101FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CC01 + 0101FFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC010101 + FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCC010101FF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF010101FF33FFFF + 33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FF010101FF66FFFF66FF + FF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FF010101FF99FFFF99FFFF99 + FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FF010101FFCCFFFFCCFFFFCCFFFF + CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF010101FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0101010101010101010101010101010101 + 0101010101010101010101010101010100000000000000000000000000000000 + 0000000000000000000000000000010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 01010101010101010101010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00000000000000000000000000000000000000000000000000 + 000000000000CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC00 + 99010101CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC339901 + 0101CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699010101 + CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999010101CCCC + 99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99010101CCFF99CC + FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99010101CC00CCCC00CC + CC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CC010101CC33CCCC33CCCC33 + CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CC010101CC66CCCC66CCCC66CCCC + 66CCCC66CCCC66CCCC66CCCC66CCCC66CC010101CC99CCCC99CCCC99CCCC99CC + CC99CCCC99CCCC99CCCC99CCCC99CC010101CCCCCCCCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCCCCCCCCCCCCCCC010101CCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC + FFCCCCFFCCCCFFCCCCFFCC010101CC00FFCC00FFCC00FFCC00FFCC00FFCC00FF + CC00FFCC00FFCC00FF010101CC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33 + FFCC33FFCC33FF010101CC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC + 66FFCC66FF010101CC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FF + CC99FF010101CCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC + FF010101CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFF01 + 0101010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + 000000000000000000000000000000000000000000000000000000000000CC00 + 99CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099010101CC3399CC + 3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399010101CC6699CC6699 + CC6699CC6699CC6699CC6699CC6699CC6699CC6699010101CC9999CC9999CC99 + 99CC9999CC9999CC9999CC9999CC9999CC9999010101CCCC99CCCC99CCCC99CC + CC99CCCC99CCCC99CCCC99CCCC99CCCC99010101CCFF99CCFF99CCFF99CCFF99 + CCFF99CCFF99CCFF99CCFF99CCFF99010101CC00CCCC00CCCC00CCCC00CCCC00 + CCCC00CCCC00CCCC00CCCC00CC010101CC33CCCC33CCCC33CCCC33CCCC33CCCC + 33CCCC33CCCC33CCCC33CC010101CC66CCCC66CCCC66CCCC66CCCC66CCCC66CC + CC66CCCC66CCCC66CC010101CC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99 + CCCC99CCCC99CC010101CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCC010101CCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCC + CCFFCC010101CC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00 + FF010101CC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FF01 + 0101CC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FF010101 + CC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FF010101CCCC + FFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFF010101CCFFFFCC + FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFF010101010101FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF000000000000000000 + 00000000000000000000000000000000000000000000CC0099CC0099CC0099CC + 0099CC0099CC0099CC0099CC0099CC0099010101CC3399CC3399CC3399CC3399 + CC3399CC3399CC3399CC3399CC3399010101CC6699CC6699CC6699CC6699CC66 + 99CC6699CC6699CC6699CC6699010101CC9999CC9999CC9999CC9999CC9999CC + 9999CC9999CC9999CC9999010101CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99 + CCCC99CCCC99CCCC99010101CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF + 99CCFF99CCFF99010101CC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC + 00CCCC00CC010101CC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CC + CC33CC010101CC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66 + CC010101CC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CC01 + 0101CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC010101 + CCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCC010101CC00 + FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FF010101CC33FFCC + 33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FF010101CC66FFCC66FF + CC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FF010101CC99FFCC99FFCC99 + FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FF010101CCCCFFCCCCFFCCCCFFCC + CCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFF010101CCFFFFCCFFFFCCFFFFCCFFFF + CCFFFFCCFFFFCCFFFFCCFFFFCCFFFF010101010101FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF0000000000000000000000000000000000 + 0000000000000000000000000000CC0099CC0099CC0099CC0099CC0099CC0099 + CC0099CC0099CC0099010101CC3399CC3399CC3399CC3399CC3399CC3399CC33 + 99CC3399CC3399010101CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC + 6699CC6699010101CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999 + CC9999010101CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC + 99010101CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF9901 + 0101CC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CC010101 + CC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CC010101CC66 + CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CC010101CC99CCCC + 99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CC010101CCCCCCCCCCCC + CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC010101CCFFCCCCFFCCCCFF + CCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCC010101CC00FFCC00FFCC00FFCC + 00FFCC00FFCC00FFCC00FFCC00FFCC00FF010101CC33FFCC33FFCC33FFCC33FF + CC33FFCC33FFCC33FFCC33FFCC33FF010101CC66FFCC66FFCC66FFCC66FFCC66 + FFCC66FFCC66FFCC66FFCC66FF010101CC99FFCC99FFCC99FFCC99FFCC99FFCC + 99FFCC99FFCC99FFCC99FF010101CCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFF + CCCCFFCCCCFFCCCCFF010101CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF + FFCCFFFFCCFFFF010101010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00000000000000000000000000000000000000000000000000 + 000000000000CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC00 + 99010101CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC339901 + 0101CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699010101 + CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999010101CCCC + 99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99010101CCFF99CC + FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99010101CC00CCCC00CC + CC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CC010101CC33CCCC33CCCC33 + CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CC010101CC66CCCC66CCCC66CCCC + 66CCCC66CCCC66CCCC66CCCC66CCCC66CC010101CC99CCCC99CCCC99CCCC99CC + CC99CCCC99CCCC99CCCC99CCCC99CC010101CCCCCCCCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCCCCCCCCCCCCCCC010101CCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC + FFCCCCFFCCCCFFCCCCFFCC010101CC00FFCC00FFCC00FFCC00FFCC00FFCC00FF + CC00FFCC00FFCC00FF010101CC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33 + FFCC33FFCC33FF010101CC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC + 66FFCC66FF010101CC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FF + CC99FF010101CCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC + FF010101CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFF01 + 0101010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + 000000000000000000000000000000000000000000000000000000000000CC00 + 99CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099010101CC3399CC + 3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399010101CC6699CC6699 + CC6699CC6699CC6699CC6699CC6699CC6699CC6699010101CC9999CC9999CC99 + 99CC9999CC9999CC9999CC9999CC9999CC9999010101CCCC99CCCC99CCCC99CC + CC99CCCC99CCCC99CCCC99CCCC99CCCC99010101CCFF99CCFF99CCFF99CCFF99 + CCFF99CCFF99CCFF99CCFF99CCFF99010101CC00CCCC00CCCC00CCCC00CCCC00 + CCCC00CCCC00CCCC00CCCC00CC010101CC33CCCC33CCCC33CCCC33CCCC33CCCC + 33CCCC33CCCC33CCCC33CC010101CC66CCCC66CCCC66CCCC66CCCC66CCCC66CC + CC66CCCC66CCCC66CC010101CC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99 + CCCC99CCCC99CC010101CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCC010101CCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCC + CCFFCC010101CC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00 + FF010101CC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FF01 + 0101CC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FF010101 + CC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FF010101CCCC + FFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFF010101CCFFFFCC + FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFF010101010101FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF000000000000000000 + 00000000000000000000000000000000000000000000CC0099CC0099CC0099CC + 0099CC0099CC0099CC0099CC0099CC0099010101CC3399CC3399CC3399CC3399 + CC3399CC3399CC3399CC3399CC3399010101CC6699CC6699CC6699CC6699CC66 + 99CC6699CC6699CC6699CC6699010101CC9999CC9999CC9999CC9999CC9999CC + 9999CC9999CC9999CC9999010101CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99 + CCCC99CCCC99CCCC99010101CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF + 99CCFF99CCFF99010101CC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC + 00CCCC00CC010101CC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CC + CC33CC010101CC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66 + CC010101CC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CC01 + 0101CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC010101 + CCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCC010101CC00 + FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FF010101CC33FFCC + 33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FF010101CC66FFCC66FF + CC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FF010101CC99FFCC99FFCC99 + FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FF010101CCCCFFCCCCFFCCCCFFCC + CCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFF010101CCFFFFCCFFFFCCFFFFCCFFFF + CCFFFFCCFFFFCCFFFFCCFFFFCCFFFF010101010101FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF0000000000000000000000000000000000 + 0000000000000000000000000000CC0099CC0099CC0099CC0099CC0099CC0099 + CC0099CC0099CC0099010101CC3399CC3399CC3399CC3399CC3399CC3399CC33 + 99CC3399CC3399010101CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC + 6699CC6699010101CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999 + CC9999010101CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC + 99010101CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF9901 + 0101CC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CC010101 + CC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CC010101CC66 + CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CC010101CC99CCCC + 99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CC010101CCCCCCCCCCCC + CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC010101CCFFCCCCFFCCCCFF + CCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCC010101CC00FFCC00FFCC00FFCC + 00FFCC00FFCC00FFCC00FFCC00FFCC00FF010101CC33FFCC33FFCC33FFCC33FF + CC33FFCC33FFCC33FFCC33FFCC33FF010101CC66FFCC66FFCC66FFCC66FFCC66 + FFCC66FFCC66FFCC66FFCC66FF010101CC99FFCC99FFCC99FFCC99FFCC99FFCC + 99FFCC99FFCC99FFCC99FF010101CCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFF + CCCCFFCCCCFFCCCCFF010101CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF + FFCCFFFFCCFFFF010101010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00000000000000000000000000000000000000000000000000 + 000000000000CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC00 + 99010101CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC339901 + 0101CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699010101 + CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999010101CCCC + 99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99010101CCFF99CC + FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99010101CC00CCCC00CC + CC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CC010101CC33CCCC33CCCC33 + CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CC010101CC66CCCC66CCCC66CCCC + 66CCCC66CCCC66CCCC66CCCC66CCCC66CC010101CC99CCCC99CCCC99CCCC99CC + CC99CCCC99CCCC99CCCC99CCCC99CC010101CCCCCCCCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCCCCCCCCCCCCCCC010101CCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC + FFCCCCFFCCCCFFCCCCFFCC010101CC00FFCC00FFCC00FFCC00FFCC00FFCC00FF + CC00FFCC00FFCC00FF010101CC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33 + FFCC33FFCC33FF010101CC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC + 66FFCC66FF010101CC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FF + CC99FF010101CCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC + FF010101CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFF01 + 0101010101010101010101010101010101010101010101010101010101010101 + 0000000000000000000000000000000000000000000000000000000000000101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 010101010101010101010101010101010101010101010101010101010100FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF0000000000000000 + 0000000000000000000000000000000000000000000099009999009999009999 + 0099990099990099990099990099990099010101993399993399993399993399 + 9933999933999933999933999933990101019966999966999966999966999966 + 9999669999669999669999669901010199999999999999999999999999999999 + 999999999999999999999901010199CC9999CC9999CC9999CC9999CC9999CC99 + 99CC9999CC9999CC9901010199FF9999FF9999FF9999FF9999FF9999FF9999FF + 9999FF9999FF990101019900CC9900CC9900CC9900CC9900CC9900CC9900CC99 + 00CC9900CC0101019933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC + 9933CC0101019966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966 + CC0101019999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC01 + 010199CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC010101 + 99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC0101019900 + FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF0101019933FF99 + 33FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF0101019966FF9966FF + 9966FF9966FF9966FF9966FF9966FF9966FF9966FF0101019999FF9999FF9999 + FF9999FF9999FF9999FF9999FF9999FF9999FF01010199CCFF99CCFF99CCFF99 + CCFF99CCFF99CCFF99CCFF99CCFF99CCFF01010199FFFF99FFFF99FFFF99FFFF + 99FFFF99FFFF99FFFF99FFFF99FFFF01010101010100FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00000000000000000000000000000000 + 0000000000000000000000000000990099990099990099990099990099990099 + 9900999900999900990101019933999933999933999933999933999933999933 + 9999339999339901010199669999669999669999669999669999669999669999 + 6699996699010101999999999999999999999999999999999999999999999999 + 99999901010199CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC + 9901010199FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9901 + 01019900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC010101 + 9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC0101019966 + CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC0101019999CC99 + 99CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC01010199CCCC99CCCC + 99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC01010199FFCC99FFCC99FF + CC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC0101019900FF9900FF9900FF99 + 00FF9900FF9900FF9900FF9900FF9900FF0101019933FF9933FF9933FF9933FF + 9933FF9933FF9933FF9933FF9933FF0101019966FF9966FF9966FF9966FF9966 + FF9966FF9966FF9966FF9966FF0101019999FF9999FF9999FF9999FF9999FF99 + 99FF9999FF9999FF9999FF01010199CCFF99CCFF99CCFF99CCFF99CCFF99CCFF + 99CCFF99CCFF99CCFF01010199FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FF + FF99FFFF99FFFF01010101010100FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF000000000000000000000000000000000000000000000000 + 0000000000009900999900999900999900999900999900999900999900999900 + 9901010199339999339999339999339999339999339999339999339999339901 + 0101996699996699996699996699996699996699996699996699996699010101 + 99999999999999999999999999999999999999999999999999999901010199CC + 9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9901010199FF9999 + FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF990101019900CC9900CC + 9900CC9900CC9900CC9900CC9900CC9900CC9900CC0101019933CC9933CC9933 + CC9933CC9933CC9933CC9933CC9933CC9933CC0101019966CC9966CC9966CC99 + 66CC9966CC9966CC9966CC9966CC9966CC0101019999CC9999CC9999CC9999CC + 9999CC9999CC9999CC9999CC9999CC01010199CCCC99CCCC99CCCC99CCCC99CC + CC99CCCC99CCCC99CCCC99CCCC01010199FFCC99FFCC99FFCC99FFCC99FFCC99 + FFCC99FFCC99FFCC99FFCC0101019900FF9900FF9900FF9900FF9900FF9900FF + 9900FF9900FF9900FF0101019933FF9933FF9933FF9933FF9933FF9933FF9933 + FF9933FF9933FF0101019966FF9966FF9966FF9966FF9966FF9966FF9966FF99 + 66FF9966FF0101019999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF + 9999FF01010199CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CC + FF01010199FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF01 + 010101010100FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 0000000000000000000000000000000000000000000000000000000000009900 + 9999009999009999009999009999009999009999009999009901010199339999 + 3399993399993399993399993399993399993399993399010101996699996699 + 9966999966999966999966999966999966999966990101019999999999999999 + 9999999999999999999999999999999999999901010199CC9999CC9999CC9999 + CC9999CC9999CC9999CC9999CC9999CC9901010199FF9999FF9999FF9999FF99 + 99FF9999FF9999FF9999FF9999FF990101019900CC9900CC9900CC9900CC9900 + CC9900CC9900CC9900CC9900CC0101019933CC9933CC9933CC9933CC9933CC99 + 33CC9933CC9933CC9933CC0101019966CC9966CC9966CC9966CC9966CC9966CC + 9966CC9966CC9966CC0101019999CC9999CC9999CC9999CC9999CC9999CC9999 + CC9999CC9999CC01010199CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99 + CCCC99CCCC01010199FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC + 99FFCC0101019900FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900 + FF0101019933FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF01 + 01019966FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF010101 + 9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF01010199CC + FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF01010199FFFF99 + FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF01010101010100FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF0000000000000000 + 0000000000000000000000000000000000000000000099009999009999009999 + 0099990099990099990099990099990099010101993399993399993399993399 + 9933999933999933999933999933990101019966999966999966999966999966 + 9999669999669999669999669901010199999999999999999999999999999999 + 999999999999999999999901010199CC9999CC9999CC9999CC9999CC9999CC99 + 99CC9999CC9999CC9901010199FF9999FF9999FF9999FF9999FF9999FF9999FF + 9999FF9999FF990101019900CC9900CC9900CC9900CC9900CC9900CC9900CC99 + 00CC9900CC0101019933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC + 9933CC0101019966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966 + CC0101019999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC01 + 010199CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC010101 + 99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC0101019900 + FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF0101019933FF99 + 33FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF0101019966FF9966FF + 9966FF9966FF9966FF9966FF9966FF9966FF9966FF0101019999FF9999FF9999 + FF9999FF9999FF9999FF9999FF9999FF9999FF01010199CCFF99CCFF99CCFF99 + CCFF99CCFF99CCFF99CCFF99CCFF99CCFF01010199FFFF99FFFF99FFFF99FFFF + 99FFFF99FFFF99FFFF99FFFF99FFFF01010101010100FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00000000000000000000000000000000 + 0000000000000000000000000000990099990099990099990099990099990099 + 9900999900999900990101019933999933999933999933999933999933999933 + 9999339999339901010199669999669999669999669999669999669999669999 + 6699996699010101999999999999999999999999999999999999999999999999 + 99999901010199CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC + 9901010199FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9901 + 01019900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC010101 + 9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC0101019966 + CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC0101019999CC99 + 99CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC01010199CCCC99CCCC + 99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC01010199FFCC99FFCC99FF + CC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC0101019900FF9900FF9900FF99 + 00FF9900FF9900FF9900FF9900FF9900FF0101019933FF9933FF9933FF9933FF + 9933FF9933FF9933FF9933FF9933FF0101019966FF9966FF9966FF9966FF9966 + FF9966FF9966FF9966FF9966FF0101019999FF9999FF9999FF9999FF9999FF99 + 99FF9999FF9999FF9999FF01010199CCFF99CCFF99CCFF99CCFF99CCFF99CCFF + 99CCFF99CCFF99CCFF01010199FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FF + FF99FFFF99FFFF01010101010100FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF000000000000000000000000000000000000000000000000 + 0000000000009900999900999900999900999900999900999900999900999900 + 9901010199339999339999339999339999339999339999339999339999339901 + 0101996699996699996699996699996699996699996699996699996699010101 + 99999999999999999999999999999999999999999999999999999901010199CC + 9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9901010199FF9999 + FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF990101019900CC9900CC + 9900CC9900CC9900CC9900CC9900CC9900CC9900CC0101019933CC9933CC9933 + CC9933CC9933CC9933CC9933CC9933CC9933CC0101019966CC9966CC9966CC99 + 66CC9966CC9966CC9966CC9966CC9966CC0101019999CC9999CC9999CC9999CC + 9999CC9999CC9999CC9999CC9999CC01010199CCCC99CCCC99CCCC99CCCC99CC + CC99CCCC99CCCC99CCCC99CCCC01010199FFCC99FFCC99FFCC99FFCC99FFCC99 + FFCC99FFCC99FFCC99FFCC0101019900FF9900FF9900FF9900FF9900FF9900FF + 9900FF9900FF9900FF0101019933FF9933FF9933FF9933FF9933FF9933FF9933 + FF9933FF9933FF0101019966FF9966FF9966FF9966FF9966FF9966FF9966FF99 + 66FF9966FF0101019999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF + 9999FF01010199CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CC + FF01010199FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF01 + 010101010100FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 0000000000000000000000000000000000000000000000000000000000009900 + 9999009999009999009999009999009999009999009999009901010199339999 + 3399993399993399993399993399993399993399993399010101996699996699 + 9966999966999966999966999966999966999966990101019999999999999999 + 9999999999999999999999999999999999999901010199CC9999CC9999CC9999 + CC9999CC9999CC9999CC9999CC9999CC9901010199FF9999FF9999FF9999FF99 + 99FF9999FF9999FF9999FF9999FF990101019900CC9900CC9900CC9900CC9900 + CC9900CC9900CC9900CC9900CC0101019933CC9933CC9933CC9933CC9933CC99 + 33CC9933CC9933CC9933CC0101019966CC9966CC9966CC9966CC9966CC9966CC + 9966CC9966CC9966CC0101019999CC9999CC9999CC9999CC9999CC9999CC9999 + CC9999CC9999CC01010199CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99 + CCCC99CCCC01010199FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC + 99FFCC0101019900FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900 + FF0101019933FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF01 + 01019966FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF010101 + 9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF01010199CC + FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF01010199FFFF99 + FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF01010101010100FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF0000000000000000 + 0000000000000000000000000000000000000000000099009999009999009999 + 0099990099990099990099990099990099010101993399993399993399993399 + 9933999933999933999933999933990101019966999966999966999966999966 + 9999669999669999669999669901010199999999999999999999999999999999 + 999999999999999999999901010199CC9999CC9999CC9999CC9999CC9999CC99 + 99CC9999CC9999CC9901010199FF9999FF9999FF9999FF9999FF9999FF9999FF + 9999FF9999FF990101019900CC9900CC9900CC9900CC9900CC9900CC9900CC99 + 00CC9900CC0101019933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC + 9933CC0101019966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966 + CC0101019999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC01 + 010199CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC010101 + 99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC0101019900 + FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF0101019933FF99 + 33FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF0101019966FF9966FF + 9966FF9966FF9966FF9966FF9966FF9966FF9966FF0101019999FF9999FF9999 + FF9999FF9999FF9999FF9999FF9999FF9999FF01010199CCFF99CCFF99CCFF99 + CCFF99CCFF99CCFF99CCFF99CCFF99CCFF01010199FFFF99FFFF99FFFF99FFFF + 99FFFF99FFFF99FFFF99FFFF99FFFF0101010101010101010101010101010101 + 0101010101010101010101010101010100000000000000000000000000000000 + 0000000000000000000000000000010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 01010101010101010101010101FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000000000000000000000000000000000000000000000000000 + 0000000000006600996600996600996600996600996600996600996600996600 + 9901010166339966339966339966339966339966339966339966339966339901 + 0101666699666699666699666699666699666699666699666699666699010101 + 66999966999966999966999966999966999966999966999966999901010166CC + 9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9901010166FF9966 + FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF990101016600CC6600CC + 6600CC6600CC6600CC6600CC6600CC6600CC6600CC0101016633CC6633CC6633 + CC6633CC6633CC6633CC6633CC6633CC6633CC0101016666CC6666CC6666CC66 + 66CC6666CC6666CC6666CC6666CC6666CC0101016699CC6699CC6699CC6699CC + 6699CC6699CC6699CC6699CC6699CC01010166CCCC66CCCC66CCCC66CCCC66CC + CC66CCCC66CCCC66CCCC66CCCC01010166FFCC66FFCC66FFCC66FFCC66FFCC66 + FFCC66FFCC66FFCC66FFCC0101016600FF6600FF6600FF6600FF6600FF6600FF + 6600FF6600FF6600FF0101016633FF6633FF6633FF6633FF6633FF6633FF6633 + FF6633FF6633FF0101016666FF6666FF6666FF6666FF6666FF6666FF6666FF66 + 66FF6666FF0101016699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF + 6699FF01010166CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CC + FF01010166FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF01 + 0101010101FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + 0000000000000000000000000000000000000000000000000000000000006600 + 9966009966009966009966009966009966009966009966009901010166339966 + 3399663399663399663399663399663399663399663399010101666699666699 + 6666996666996666996666996666996666996666990101016699996699996699 + 9966999966999966999966999966999966999901010166CC9966CC9966CC9966 + CC9966CC9966CC9966CC9966CC9966CC9901010166FF9966FF9966FF9966FF99 + 66FF9966FF9966FF9966FF9966FF990101016600CC6600CC6600CC6600CC6600 + CC6600CC6600CC6600CC6600CC0101016633CC6633CC6633CC6633CC6633CC66 + 33CC6633CC6633CC6633CC0101016666CC6666CC6666CC6666CC6666CC6666CC + 6666CC6666CC6666CC0101016699CC6699CC6699CC6699CC6699CC6699CC6699 + CC6699CC6699CC01010166CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66 + CCCC66CCCC01010166FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC + 66FFCC0101016600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600 + FF0101016633FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF01 + 01016666FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF010101 + 6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF01010166CC + FF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF01010166FFFF66 + FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF010101010101FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00000000000000000000 + 0000000000000000000000000000000000000000000066009966009966009966 + 0099660099660099660099660099660099010101663399663399663399663399 + 6633996633996633996633996633990101016666996666996666996666996666 + 9966669966669966669966669901010166999966999966999966999966999966 + 999966999966999966999901010166CC9966CC9966CC9966CC9966CC9966CC99 + 66CC9966CC9966CC9901010166FF9966FF9966FF9966FF9966FF9966FF9966FF + 9966FF9966FF990101016600CC6600CC6600CC6600CC6600CC6600CC6600CC66 + 00CC6600CC0101016633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC + 6633CC0101016666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666 + CC0101016699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC01 + 010166CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC010101 + 66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC0101016600 + FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF0101016633FF66 + 33FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF0101016666FF6666FF + 6666FF6666FF6666FF6666FF6666FF6666FF6666FF0101016699FF6699FF6699 + FF6699FF6699FF6699FF6699FF6699FF6699FF01010166CCFF66CCFF66CCFF66 + CCFF66CCFF66CCFF66CCFF66CCFF66CCFF01010166FFFF66FFFF66FFFF66FFFF + 66FFFF66FFFF66FFFF66FFFF66FFFF010101010101FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF000000000000000000000000000000000000 + 0000000000000000000000000000660099660099660099660099660099660099 + 6600996600996600990101016633996633996633996633996633996633996633 + 9966339966339901010166669966669966669966669966669966669966669966 + 6699666699010101669999669999669999669999669999669999669999669999 + 66999901010166CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC + 9901010166FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9901 + 01016600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC010101 + 6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC0101016666 + CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC0101016699CC66 + 99CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC01010166CCCC66CCCC + 66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC01010166FFCC66FFCC66FF + CC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC0101016600FF6600FF6600FF66 + 00FF6600FF6600FF6600FF6600FF6600FF0101016633FF6633FF6633FF6633FF + 6633FF6633FF6633FF6633FF6633FF0101016666FF6666FF6666FF6666FF6666 + FF6666FF6666FF6666FF6666FF0101016699FF6699FF6699FF6699FF6699FF66 + 99FF6699FF6699FF6699FF01010166CCFF66CCFF66CCFF66CCFF66CCFF66CCFF + 66CCFF66CCFF66CCFF01010166FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FF + FF66FFFF66FFFF010101010101FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000000000000000000000000000000000000000000000000000 + 0000000000006600996600996600996600996600996600996600996600996600 + 9901010166339966339966339966339966339966339966339966339966339901 + 0101666699666699666699666699666699666699666699666699666699010101 + 66999966999966999966999966999966999966999966999966999901010166CC + 9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9901010166FF9966 + FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF990101016600CC6600CC + 6600CC6600CC6600CC6600CC6600CC6600CC6600CC0101016633CC6633CC6633 + CC6633CC6633CC6633CC6633CC6633CC6633CC0101016666CC6666CC6666CC66 + 66CC6666CC6666CC6666CC6666CC6666CC0101016699CC6699CC6699CC6699CC + 6699CC6699CC6699CC6699CC6699CC01010166CCCC66CCCC66CCCC66CCCC66CC + CC66CCCC66CCCC66CCCC66CCCC01010166FFCC66FFCC66FFCC66FFCC66FFCC66 + FFCC66FFCC66FFCC66FFCC0101016600FF6600FF6600FF6600FF6600FF6600FF + 6600FF6600FF6600FF0101016633FF6633FF6633FF6633FF6633FF6633FF6633 + FF6633FF6633FF0101016666FF6666FF6666FF6666FF6666FF6666FF6666FF66 + 66FF6666FF0101016699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF + 6699FF01010166CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CC + FF01010166FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF01 + 0101010101FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + 0000000000000000000000000000000000000000000000000000000000006600 + 9966009966009966009966009966009966009966009966009901010166339966 + 3399663399663399663399663399663399663399663399010101666699666699 + 6666996666996666996666996666996666996666990101016699996699996699 + 9966999966999966999966999966999966999901010166CC9966CC9966CC9966 + CC9966CC9966CC9966CC9966CC9966CC9901010166FF9966FF9966FF9966FF99 + 66FF9966FF9966FF9966FF9966FF990101016600CC6600CC6600CC6600CC6600 + CC6600CC6600CC6600CC6600CC0101016633CC6633CC6633CC6633CC6633CC66 + 33CC6633CC6633CC6633CC0101016666CC6666CC6666CC6666CC6666CC6666CC + 6666CC6666CC6666CC0101016699CC6699CC6699CC6699CC6699CC6699CC6699 + CC6699CC6699CC01010166CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66 + CCCC66CCCC01010166FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC + 66FFCC0101016600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600 + FF0101016633FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF01 + 01016666FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF010101 + 6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF01010166CC + FF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF01010166FFFF66 + FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF010101010101FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00000000000000000000 + 0000000000000000000000000000000000000000000066009966009966009966 + 0099660099660099660099660099660099010101663399663399663399663399 + 6633996633996633996633996633990101016666996666996666996666996666 + 9966669966669966669966669901010166999966999966999966999966999966 + 999966999966999966999901010166CC9966CC9966CC9966CC9966CC9966CC99 + 66CC9966CC9966CC9901010166FF9966FF9966FF9966FF9966FF9966FF9966FF + 9966FF9966FF990101016600CC6600CC6600CC6600CC6600CC6600CC6600CC66 + 00CC6600CC0101016633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC + 6633CC0101016666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666 + CC0101016699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC01 + 010166CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC010101 + 66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC0101016600 + FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF0101016633FF66 + 33FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF0101016666FF6666FF + 6666FF6666FF6666FF6666FF6666FF6666FF6666FF0101016699FF6699FF6699 + FF6699FF6699FF6699FF6699FF6699FF6699FF01010166CCFF66CCFF66CCFF66 + CCFF66CCFF66CCFF66CCFF66CCFF66CCFF01010166FFFF66FFFF66FFFF66FFFF + 66FFFF66FFFF66FFFF66FFFF66FFFF010101010101FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF000000000000000000000000000000000000 + 0000000000000000000000000000660099660099660099660099660099660099 + 6600996600996600990101016633996633996633996633996633996633996633 + 9966339966339901010166669966669966669966669966669966669966669966 + 6699666699010101669999669999669999669999669999669999669999669999 + 66999901010166CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC + 9901010166FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9901 + 01016600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC010101 + 6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC0101016666 + CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC0101016699CC66 + 99CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC01010166CCCC66CCCC + 66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC01010166FFCC66FFCC66FF + CC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC0101016600FF6600FF6600FF66 + 00FF6600FF6600FF6600FF6600FF6600FF0101016633FF6633FF6633FF6633FF + 6633FF6633FF6633FF6633FF6633FF0101016666FF6666FF6666FF6666FF6666 + FF6666FF6666FF6666FF6666FF0101016699FF6699FF6699FF6699FF6699FF66 + 99FF6699FF6699FF6699FF01010166CCFF66CCFF66CCFF66CCFF66CCFF66CCFF + 66CCFF66CCFF66CCFF01010166FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FF + FF66FFFF66FFFF010101010101FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000000000000000000000000000000000000000000000000000 + 0000000000006600996600996600996600996600996600996600996600996600 + 9901010166339966339966339966339966339966339966339966339966339901 + 0101666699666699666699666699666699666699666699666699666699010101 + 66999966999966999966999966999966999966999966999966999901010166CC + 9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9901010166FF9966 + FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF990101016600CC6600CC + 6600CC6600CC6600CC6600CC6600CC6600CC6600CC0101016633CC6633CC6633 + CC6633CC6633CC6633CC6633CC6633CC6633CC0101016666CC6666CC6666CC66 + 66CC6666CC6666CC6666CC6666CC6666CC0101016699CC6699CC6699CC6699CC + 6699CC6699CC6699CC6699CC6699CC01010166CCCC66CCCC66CCCC66CCCC66CC + CC66CCCC66CCCC66CCCC66CCCC01010166FFCC66FFCC66FFCC66FFCC66FFCC66 + FFCC66FFCC66FFCC66FFCC0101016600FF6600FF6600FF6600FF6600FF6600FF + 6600FF6600FF6600FF0101016633FF6633FF6633FF6633FF6633FF6633FF6633 + FF6633FF6633FF0101016666FF6666FF6666FF6666FF6666FF6666FF6666FF66 + 66FF6666FF0101016699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF + 6699FF01010166CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CC + FF01010166FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF01 + 0101010101010101010101010101010101010101010101010101010101010101 + 0000000000000000000000000000000000000000000000000000000000000101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 010101010101010101010101010101010101010101010101010101010100FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF000000000000000000 + 0000000000000000000000000000000000000000000033009933009933009933 + 0099330099330099330099330099330099010101333399333399333399333399 + 3333993333993333993333993333990101013366993366993366993366993366 + 9933669933669933669933669901010133999933999933999933999933999933 + 999933999933999933999901010133CC9933CC9933CC9933CC9933CC9933CC99 + 33CC9933CC9933CC9901010133FF9933FF9933FF9933FF9933FF9933FF9933FF + 9933FF9933FF990101013300CC3300CC3300CC3300CC3300CC3300CC3300CC33 + 00CC3300CC0101013333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC + 3333CC0101013366CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366 + CC0101013399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC01 + 010133CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC010101 + 33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC0101013300 + FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF0101013333FF33 + 33FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF0101013366FF3366FF + 3366FF3366FF3366FF3366FF3366FF3366FF3366FF0101013399FF3399FF3399 + FF3399FF3399FF3399FF3399FF3399FF3399FF01010133CCFF33CCFF33CCFF33 + CCFF33CCFF33CCFF33CCFF33CCFF33CCFF01010133FFFF33FFFF33FFFF33FFFF + 33FFFF33FFFF33FFFF33FFFF33FFFF01010101010100FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000000000000000000000000000000000 + 0000000000000000000000000000330099330099330099330099330099330099 + 3300993300993300990101013333993333993333993333993333993333993333 + 9933339933339901010133669933669933669933669933669933669933669933 + 6699336699010101339999339999339999339999339999339999339999339999 + 33999901010133CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC + 9901010133FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF9901 + 01013300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC010101 + 3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC0101013366 + CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC0101013399CC33 + 99CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC01010133CCCC33CCCC + 33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC01010133FFCC33FFCC33FF + CC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC0101013300FF3300FF3300FF33 + 00FF3300FF3300FF3300FF3300FF3300FF0101013333FF3333FF3333FF3333FF + 3333FF3333FF3333FF3333FF3333FF0101013366FF3366FF3366FF3366FF3366 + FF3366FF3366FF3366FF3366FF0101013399FF3399FF3399FF3399FF3399FF33 + 99FF3399FF3399FF3399FF01010133CCFF33CCFF33CCFF33CCFF33CCFF33CCFF + 33CCFF33CCFF33CCFF01010133FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FF + FF33FFFF33FFFF01010101010100FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF00000000000000000000000000000000000000000000000000 + 0000000000003300993300993300993300993300993300993300993300993300 + 9901010133339933339933339933339933339933339933339933339933339901 + 0101336699336699336699336699336699336699336699336699336699010101 + 33999933999933999933999933999933999933999933999933999901010133CC + 9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC9901010133FF9933 + FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF990101013300CC3300CC + 3300CC3300CC3300CC3300CC3300CC3300CC3300CC0101013333CC3333CC3333 + CC3333CC3333CC3333CC3333CC3333CC3333CC0101013366CC3366CC3366CC33 + 66CC3366CC3366CC3366CC3366CC3366CC0101013399CC3399CC3399CC3399CC + 3399CC3399CC3399CC3399CC3399CC01010133CCCC33CCCC33CCCC33CCCC33CC + CC33CCCC33CCCC33CCCC33CCCC01010133FFCC33FFCC33FFCC33FFCC33FFCC33 + FFCC33FFCC33FFCC33FFCC0101013300FF3300FF3300FF3300FF3300FF3300FF + 3300FF3300FF3300FF0101013333FF3333FF3333FF3333FF3333FF3333FF3333 + FF3333FF3333FF0101013366FF3366FF3366FF3366FF3366FF3366FF3366FF33 + 66FF3366FF0101013399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF + 3399FF01010133CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CC + FF01010133FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF01 + 010101010100FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 0000000000000000000000000000000000000000000000000000000000003300 + 9933009933009933009933009933009933009933009933009901010133339933 + 3399333399333399333399333399333399333399333399010101336699336699 + 3366993366993366993366993366993366993366990101013399993399993399 + 9933999933999933999933999933999933999901010133CC9933CC9933CC9933 + CC9933CC9933CC9933CC9933CC9933CC9901010133FF9933FF9933FF9933FF99 + 33FF9933FF9933FF9933FF9933FF990101013300CC3300CC3300CC3300CC3300 + CC3300CC3300CC3300CC3300CC0101013333CC3333CC3333CC3333CC3333CC33 + 33CC3333CC3333CC3333CC0101013366CC3366CC3366CC3366CC3366CC3366CC + 3366CC3366CC3366CC0101013399CC3399CC3399CC3399CC3399CC3399CC3399 + CC3399CC3399CC01010133CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33 + CCCC33CCCC01010133FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC + 33FFCC0101013300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300 + FF0101013333FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF01 + 01013366FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF010101 + 3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF01010133CC + FF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF01010133FFFF33 + FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF01010101010100FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF000000000000000000 + 0000000000000000000000000000000000000000000033009933009933009933 + 0099330099330099330099330099330099010101333399333399333399333399 + 3333993333993333993333993333990101013366993366993366993366993366 + 9933669933669933669933669901010133999933999933999933999933999933 + 999933999933999933999901010133CC9933CC9933CC9933CC9933CC9933CC99 + 33CC9933CC9933CC9901010133FF9933FF9933FF9933FF9933FF9933FF9933FF + 9933FF9933FF990101013300CC3300CC3300CC3300CC3300CC3300CC3300CC33 + 00CC3300CC0101013333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC + 3333CC0101013366CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366 + CC0101013399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC01 + 010133CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC010101 + 33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC0101013300 + FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF0101013333FF33 + 33FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF0101013366FF3366FF + 3366FF3366FF3366FF3366FF3366FF3366FF3366FF0101013399FF3399FF3399 + FF3399FF3399FF3399FF3399FF3399FF3399FF01010133CCFF33CCFF33CCFF33 + CCFF33CCFF33CCFF33CCFF33CCFF33CCFF01010133FFFF33FFFF33FFFF33FFFF + 33FFFF33FFFF33FFFF33FFFF33FFFF01010101010100FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000000000000000000000000000000000 + 0000000000000000000000000000330099330099330099330099330099330099 + 3300993300993300990101013333993333993333993333993333993333993333 + 9933339933339901010133669933669933669933669933669933669933669933 + 6699336699010101339999339999339999339999339999339999339999339999 + 33999901010133CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC + 9901010133FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF9901 + 01013300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC010101 + 3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC0101013366 + CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC0101013399CC33 + 99CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC01010133CCCC33CCCC + 33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC01010133FFCC33FFCC33FF + CC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC0101013300FF3300FF3300FF33 + 00FF3300FF3300FF3300FF3300FF3300FF0101013333FF3333FF3333FF3333FF + 3333FF3333FF3333FF3333FF3333FF0101013366FF3366FF3366FF3366FF3366 + FF3366FF3366FF3366FF3366FF0101013399FF3399FF3399FF3399FF3399FF33 + 99FF3399FF3399FF3399FF01010133CCFF33CCFF33CCFF33CCFF33CCFF33CCFF + 33CCFF33CCFF33CCFF01010133FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FF + FF33FFFF33FFFF01010101010100FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF00000000000000000000000000000000000000000000000000 + 0000000000003300993300993300993300993300993300993300993300993300 + 9901010133339933339933339933339933339933339933339933339933339901 + 0101336699336699336699336699336699336699336699336699336699010101 + 33999933999933999933999933999933999933999933999933999901010133CC + 9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC9901010133FF9933 + FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF990101013300CC3300CC + 3300CC3300CC3300CC3300CC3300CC3300CC3300CC0101013333CC3333CC3333 + CC3333CC3333CC3333CC3333CC3333CC3333CC0101013366CC3366CC3366CC33 + 66CC3366CC3366CC3366CC3366CC3366CC0101013399CC3399CC3399CC3399CC + 3399CC3399CC3399CC3399CC3399CC01010133CCCC33CCCC33CCCC33CCCC33CC + CC33CCCC33CCCC33CCCC33CCCC01010133FFCC33FFCC33FFCC33FFCC33FFCC33 + FFCC33FFCC33FFCC33FFCC0101013300FF3300FF3300FF3300FF3300FF3300FF + 3300FF3300FF3300FF0101013333FF3333FF3333FF3333FF3333FF3333FF3333 + FF3333FF3333FF0101013366FF3366FF3366FF3366FF3366FF3366FF3366FF33 + 66FF3366FF0101013399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF + 3399FF01010133CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CC + FF01010133FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF01 + 010101010100FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 0000000000000000000000000000000000000000000000000000000000003300 + 9933009933009933009933009933009933009933009933009901010133339933 + 3399333399333399333399333399333399333399333399010101336699336699 + 3366993366993366993366993366993366993366990101013399993399993399 + 9933999933999933999933999933999933999901010133CC9933CC9933CC9933 + CC9933CC9933CC9933CC9933CC9933CC9901010133FF9933FF9933FF9933FF99 + 33FF9933FF9933FF9933FF9933FF990101013300CC3300CC3300CC3300CC3300 + CC3300CC3300CC3300CC3300CC0101013333CC3333CC3333CC3333CC3333CC33 + 33CC3333CC3333CC3333CC0101013366CC3366CC3366CC3366CC3366CC3366CC + 3366CC3366CC3366CC0101013399CC3399CC3399CC3399CC3399CC3399CC3399 + CC3399CC3399CC01010133CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33 + CCCC33CCCC01010133FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC + 33FFCC0101013300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300 + FF0101013333FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF01 + 01013366FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF010101 + 3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF01010133CC + FF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF01010133FFFF33 + FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF01010101010100FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF000000000000000000 + 0000000000000000000000000000000000000000000033009933009933009933 + 0099330099330099330099330099330099010101333399333399333399333399 + 3333993333993333993333993333990101013366993366993366993366993366 + 9933669933669933669933669901010133999933999933999933999933999933 + 999933999933999933999901010133CC9933CC9933CC9933CC9933CC9933CC99 + 33CC9933CC9933CC9901010133FF9933FF9933FF9933FF9933FF9933FF9933FF + 9933FF9933FF990101013300CC3300CC3300CC3300CC3300CC3300CC3300CC33 + 00CC3300CC0101013333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC + 3333CC0101013366CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366 + CC0101013399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC01 + 010133CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC010101 + 33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC0101013300 + FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF0101013333FF33 + 33FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF0101013366FF3366FF + 3366FF3366FF3366FF3366FF3366FF3366FF3366FF0101013399FF3399FF3399 + FF3399FF3399FF3399FF3399FF3399FF3399FF01010133CCFF33CCFF33CCFF33 + CCFF33CCFF33CCFF33CCFF33CCFF33CCFF01010133FFFF33FFFF33FFFF33FFFF + 33FFFF33FFFF33FFFF33FFFF33FFFF0101010101010101010101010101010101 + 0101010101010101010101010101010100000000000000000000000000000000 + 0000000000000000000000000000010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 010101010101010101010101010000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF000000000000000000000000000000000000000000000000 + 0000000000000000990000990000990000990000990000990000990000990000 + 9901010100339900339900339900339900339900339900339900339900339901 + 0101006699006699006699006699006699006699006699006699006699010101 + 00999900999900999900999900999900999900999900999900999901010100CC + 9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9901010100FF9900 + FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF990101010000CC0000CC + 0000CC0000CC0000CC0000CC0000CC0000CC0000CC0101010033CC0033CC0033 + CC0033CC0033CC0033CC0033CC0033CC0033CC0101010066CC0066CC0066CC00 + 66CC0066CC0066CC0066CC0066CC0066CC0101010099CC0099CC0099CC0099CC + 0099CC0099CC0099CC0099CC0099CC01010100CCCC00CCCC00CCCC00CCCC00CC + CC00CCCC00CCCC00CCCC00CCCC01010100FFCC00FFCC00FFCC00FFCC00FFCC00 + FFCC00FFCC00FFCC00FFCC0101010000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0101010033FF0033FF0033FF0033FF0033FF0033FF0033 + FF0033FF0033FF0101010066FF0066FF0066FF0066FF0066FF0066FF0066FF00 + 66FF0066FF0101010099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF + 0099FF01010100CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CC + FF01010100FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF01 + 01010101010000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000000000000000000000000000000000000000000000000000000000000000 + 9900009900009900009900009900009900009900009900009901010100339900 + 3399003399003399003399003399003399003399003399010101006699006699 + 0066990066990066990066990066990066990066990101010099990099990099 + 9900999900999900999900999900999900999901010100CC9900CC9900CC9900 + CC9900CC9900CC9900CC9900CC9900CC9901010100FF9900FF9900FF9900FF99 + 00FF9900FF9900FF9900FF9900FF990101010000CC0000CC0000CC0000CC0000 + CC0000CC0000CC0000CC0000CC0101010033CC0033CC0033CC0033CC0033CC00 + 33CC0033CC0033CC0033CC0101010066CC0066CC0066CC0066CC0066CC0066CC + 0066CC0066CC0066CC0101010099CC0099CC0099CC0099CC0099CC0099CC0099 + CC0099CC0099CC01010100CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00 + CCCC00CCCC01010100FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC + 00FFCC0101010000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0101010033FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF01 + 01010066FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF010101 + 0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF01010100CC + FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF01010100FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF0101010101010000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000000000000000 + 0000000000000000000000000000000000000000000000009900009900009900 + 0099000099000099000099000099000099010101003399003399003399003399 + 0033990033990033990033990033990101010066990066990066990066990066 + 9900669900669900669900669901010100999900999900999900999900999900 + 999900999900999900999901010100CC9900CC9900CC9900CC9900CC9900CC99 + 00CC9900CC9900CC9901010100FF9900FF9900FF9900FF9900FF9900FF9900FF + 9900FF9900FF990101010000CC0000CC0000CC0000CC0000CC0000CC0000CC00 + 00CC0000CC0101010033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC + 0033CC0101010066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066 + CC0101010099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC01 + 010100CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC010101 + 00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC0101010000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0101010033FF00 + 33FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0101010066FF0066FF + 0066FF0066FF0066FF0066FF0066FF0066FF0066FF0101010099FF0099FF0099 + FF0099FF0099FF0099FF0099FF0099FF0099FF01010100CCFF00CCFF00CCFF00 + CCFF00CCFF00CCFF00CCFF00CCFF00CCFF01010100FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF0101010101010000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF00000000000000000000000000000000 + 0000000000000000000000000000000099000099000099000099000099000099 + 0000990000990000990101010033990033990033990033990033990033990033 + 9900339900339901010100669900669900669900669900669900669900669900 + 6699006699010101009999009999009999009999009999009999009999009999 + 00999901010100CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC + 9901010100FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9901 + 01010000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC010101 + 0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0101010066 + CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0101010099CC00 + 99CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC01010100CCCC00CCCC + 00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC01010100FFCC00FFCC00FF + CC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC0101010000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0101010033FF0033FF0033FF0033FF + 0033FF0033FF0033FF0033FF0033FF0101010066FF0066FF0066FF0066FF0066 + FF0066FF0066FF0066FF0066FF0101010099FF0099FF0099FF0099FF0099FF00 + 99FF0099FF0099FF0099FF01010100CCFF00CCFF00CCFF00CCFF00CCFF00CCFF + 00CCFF00CCFF00CCFF01010100FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF0101010101010000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF000000000000000000000000000000000000000000000000 + 0000000000000000990000990000990000990000990000990000990000990000 + 9901010100339900339900339900339900339900339900339900339900339901 + 0101006699006699006699006699006699006699006699006699006699010101 + 00999900999900999900999900999900999900999900999900999901010100CC + 9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9901010100FF9900 + FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF990101010000CC0000CC + 0000CC0000CC0000CC0000CC0000CC0000CC0000CC0101010033CC0033CC0033 + CC0033CC0033CC0033CC0033CC0033CC0033CC0101010066CC0066CC0066CC00 + 66CC0066CC0066CC0066CC0066CC0066CC0101010099CC0099CC0099CC0099CC + 0099CC0099CC0099CC0099CC0099CC01010100CCCC00CCCC00CCCC00CCCC00CC + CC00CCCC00CCCC00CCCC00CCCC01010100FFCC00FFCC00FFCC00FFCC00FFCC00 + FFCC00FFCC00FFCC00FFCC0101010000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0101010033FF0033FF0033FF0033FF0033FF0033FF0033 + FF0033FF0033FF0101010066FF0066FF0066FF0066FF0066FF0066FF0066FF00 + 66FF0066FF0101010099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF + 0099FF01010100CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CC + FF01010100FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF01 + 01010101010000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000000000000000000000000000000000000000000000000000000000000000 + 9900009900009900009900009900009900009900009900009901010100339900 + 3399003399003399003399003399003399003399003399010101006699006699 + 0066990066990066990066990066990066990066990101010099990099990099 + 9900999900999900999900999900999900999901010100CC9900CC9900CC9900 + CC9900CC9900CC9900CC9900CC9900CC9901010100FF9900FF9900FF9900FF99 + 00FF9900FF9900FF9900FF9900FF990101010000CC0000CC0000CC0000CC0000 + CC0000CC0000CC0000CC0000CC0101010033CC0033CC0033CC0033CC0033CC00 + 33CC0033CC0033CC0033CC0101010066CC0066CC0066CC0066CC0066CC0066CC + 0066CC0066CC0066CC0101010099CC0099CC0099CC0099CC0099CC0099CC0099 + CC0099CC0099CC01010100CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00 + CCCC00CCCC01010100FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC + 00FFCC0101010000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0101010033FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF01 + 01010066FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF010101 + 0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF01010100CC + FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF01010100FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF0101010101010000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000000000000000 + 0000000000000000000000000000000000000000000000009900009900009900 + 0099000099000099000099000099000099010101003399003399003399003399 + 0033990033990033990033990033990101010066990066990066990066990066 + 9900669900669900669900669901010100999900999900999900999900999900 + 999900999900999900999901010100CC9900CC9900CC9900CC9900CC9900CC99 + 00CC9900CC9900CC9901010100FF9900FF9900FF9900FF9900FF9900FF9900FF + 9900FF9900FF990101010000CC0000CC0000CC0000CC0000CC0000CC0000CC00 + 00CC0000CC0101010033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC + 0033CC0101010066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066 + CC0101010099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC01 + 010100CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC010101 + 00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC0101010000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0101010033FF00 + 33FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0101010066FF0066FF + 0066FF0066FF0066FF0066FF0066FF0066FF0066FF0101010099FF0099FF0099 + FF0099FF0099FF0099FF0099FF0099FF0099FF01010100CCFF00CCFF00CCFF00 + CCFF00CCFF00CCFF00CCFF00CCFF00CCFF01010100FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF0101010101010000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF00000000000000000000000000000000 + 0000000000000000000000000000000099000099000099000099000099000099 + 0000990000990000990101010033990033990033990033990033990033990033 + 9900339900339901010100669900669900669900669900669900669900669900 + 6699006699010101009999009999009999009999009999009999009999009999 + 00999901010100CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC + 9901010100FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9901 + 01010000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC010101 + 0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0101010066 + CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0101010099CC00 + 99CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC01010100CCCC00CCCC + 00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC01010100FFCC00FFCC00FF + CC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC0101010000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0101010033FF0033FF0033FF0033FF + 0033FF0033FF0033FF0033FF0033FF0101010066FF0066FF0066FF0066FF0066 + FF0066FF0066FF0066FF0066FF0101010099FF0099FF0099FF0099FF0099FF00 + 99FF0099FF0099FF0099FF01010100CCFF00CCFF00CCFF00CCFF00CCFF00CCFF + 00CCFF00CCFF00CCFF01010100FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF0101010101010000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF000000000000000000000000000000000000000000000000 + 0000000000000000990000990000990000990000990000990000990000990000 + 9901010100339900339900339900339900339900339900339900339900339901 + 0101006699006699006699006699006699006699006699006699006699010101 + 00999900999900999900999900999900999900999900999900999901010100CC + 9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9901010100FF9900 + FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF990101010000CC0000CC + 0000CC0000CC0000CC0000CC0000CC0000CC0000CC0101010033CC0033CC0033 + CC0033CC0033CC0033CC0033CC0033CC0033CC0101010066CC0066CC0066CC00 + 66CC0066CC0066CC0066CC0066CC0066CC0101010099CC0099CC0099CC0099CC + 0099CC0099CC0099CC0099CC0099CC01010100CCCC00CCCC00CCCC00CCCC00CC + CC00CCCC00CCCC00CCCC00CCCC01010100FFCC00FFCC00FFCC00FFCC00FFCC00 + FFCC00FFCC00FFCC00FFCC0101010000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0101010033FF0033FF0033FF0033FF0033FF0033FF0033 + FF0033FF0033FF0101010066FF0066FF0066FF0066FF0066FF0066FF0066FF00 + 66FF0066FF0101010099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF + 0099FF01010100CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CC + FF01010100FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF01 + 0101010101010101010101010101010101010101010101010101010101010101 + 0000000000000000000000000000000000000000000000000000000000000101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 + 00000000000000000000000000000000000000000000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000010101FF3300FF3300FF3300FF3300 + FF3300FF3300FF3300FF3300FF3300010101FF6600FF6600FF6600FF6600FF66 + 00FF6600FF6600FF6600FF6600010101FF9900FF9900FF9900FF9900FF9900FF + 9900FF9900FF9900FF9900010101FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00 + FFCC00FFCC00FFCC00010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00010101FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF + 0033FF0033010101FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333 + FF3333010101FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF66 + 33010101FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF993301 + 0101FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33010101 + FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33010101FF00 + 66FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0066010101FF3366FF + 3366FF3366FF3366FF3366FF3366FF3366FF3366FF3366010101FF6666FF6666 + FF6666FF6666FF6666FF6666FF6666FF6666FF6666010101FF9966FF9966FF99 + 66FF9966FF9966FF9966FF9966FF9966FF9966010101FFCC66FFCC66FFCC66FF + CC66FFCC66FFCC66FFCC66FFCC66FFCC66010101FFFF66FFFF66FFFF66FFFF66 + FFFF66FFFF66FFFF66FFFF66FFFF66010101010101FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 + 0000000000000000000000000000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000010101FF3300FF3300FF3300FF3300FF3300FF3300FF33 + 00FF3300FF3300010101FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF + 6600FF6600010101FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900 + FF9900010101FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC + 00010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF0001 + 0101FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0033010101 + FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333010101FF66 + 33FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6633010101FF9933FF + 9933FF9933FF9933FF9933FF9933FF9933FF9933FF9933010101FFCC33FFCC33 + FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33010101FFFF33FFFF33FFFF + 33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33010101FF0066FF0066FF0066FF + 0066FF0066FF0066FF0066FF0066FF0066010101FF3366FF3366FF3366FF3366 + FF3366FF3366FF3366FF3366FF3366010101FF6666FF6666FF6666FF6666FF66 + 66FF6666FF6666FF6666FF6666010101FF9966FF9966FF9966FF9966FF9966FF + 9966FF9966FF9966FF9966010101FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66 + FFCC66FFCC66FFCC66010101FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF + 66FFFF66FFFF66010101010101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 + 000000000000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00010101FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF330001 + 0101FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600010101 + FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900010101FFCC + 00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00010101FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00010101FF0033FF0033 + FF0033FF0033FF0033FF0033FF0033FF0033FF0033010101FF3333FF3333FF33 + 33FF3333FF3333FF3333FF3333FF3333FF3333010101FF6633FF6633FF6633FF + 6633FF6633FF6633FF6633FF6633FF6633010101FF9933FF9933FF9933FF9933 + FF9933FF9933FF9933FF9933FF9933010101FFCC33FFCC33FFCC33FFCC33FFCC + 33FFCC33FFCC33FFCC33FFCC33010101FFFF33FFFF33FFFF33FFFF33FFFF33FF + FF33FFFF33FFFF33FFFF33010101FF0066FF0066FF0066FF0066FF0066FF0066 + FF0066FF0066FF0066010101FF3366FF3366FF3366FF3366FF3366FF3366FF33 + 66FF3366FF3366010101FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF + 6666FF6666010101FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966 + FF9966010101FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC + 66010101FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF6601 + 0101010101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 000000000000000000000000000000000000000000000000000000000000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000010101FF3300FF + 3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300010101FF6600FF6600 + FF6600FF6600FF6600FF6600FF6600FF6600FF6600010101FF9900FF9900FF99 + 00FF9900FF9900FF9900FF9900FF9900FF9900010101FFCC00FFCC00FFCC00FF + CC00FFCC00FFCC00FFCC00FFCC00FFCC00010101FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00010101FF0033FF0033FF0033FF0033FF00 + 33FF0033FF0033FF0033FF0033010101FF3333FF3333FF3333FF3333FF3333FF + 3333FF3333FF3333FF3333010101FF6633FF6633FF6633FF6633FF6633FF6633 + FF6633FF6633FF6633010101FF9933FF9933FF9933FF9933FF9933FF9933FF99 + 33FF9933FF9933010101FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FF + CC33FFCC33010101FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33 + FFFF33010101FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF00 + 66010101FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF336601 + 0101FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6666010101 + FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966010101FFCC + 66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66010101FFFF66FF + FF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66010101010101FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 + 00000000000000000000000000000000000000000000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000010101FF3300FF3300FF3300FF3300 + FF3300FF3300FF3300FF3300FF3300010101FF6600FF6600FF6600FF6600FF66 + 00FF6600FF6600FF6600FF6600010101FF9900FF9900FF9900FF9900FF9900FF + 9900FF9900FF9900FF9900010101FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00 + FFCC00FFCC00FFCC00010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00010101FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF + 0033FF0033010101FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333 + FF3333010101FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF66 + 33010101FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF993301 + 0101FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33010101 + FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33010101FF00 + 66FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0066010101FF3366FF + 3366FF3366FF3366FF3366FF3366FF3366FF3366FF3366010101FF6666FF6666 + FF6666FF6666FF6666FF6666FF6666FF6666FF6666010101FF9966FF9966FF99 + 66FF9966FF9966FF9966FF9966FF9966FF9966010101FFCC66FFCC66FFCC66FF + CC66FFCC66FFCC66FFCC66FFCC66FFCC66010101FFFF66FFFF66FFFF66FFFF66 + FFFF66FFFF66FFFF66FFFF66FFFF66010101010101FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 + 0000000000000000000000000000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000010101FF3300FF3300FF3300FF3300FF3300FF3300FF33 + 00FF3300FF3300010101FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF + 6600FF6600010101FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900 + FF9900010101FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC + 00010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF0001 + 0101FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0033010101 + FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333010101FF66 + 33FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6633010101FF9933FF + 9933FF9933FF9933FF9933FF9933FF9933FF9933FF9933010101FFCC33FFCC33 + FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33010101FFFF33FFFF33FFFF + 33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33010101FF0066FF0066FF0066FF + 0066FF0066FF0066FF0066FF0066FF0066010101FF3366FF3366FF3366FF3366 + FF3366FF3366FF3366FF3366FF3366010101FF6666FF6666FF6666FF6666FF66 + 66FF6666FF6666FF6666FF6666010101FF9966FF9966FF9966FF9966FF9966FF + 9966FF9966FF9966FF9966010101FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66 + FFCC66FFCC66FFCC66010101FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF + 66FFFF66FFFF66010101010101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 + 000000000000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00010101FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF330001 + 0101FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600010101 + FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900010101FFCC + 00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00010101FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00010101FF0033FF0033 + FF0033FF0033FF0033FF0033FF0033FF0033FF0033010101FF3333FF3333FF33 + 33FF3333FF3333FF3333FF3333FF3333FF3333010101FF6633FF6633FF6633FF + 6633FF6633FF6633FF6633FF6633FF6633010101FF9933FF9933FF9933FF9933 + FF9933FF9933FF9933FF9933FF9933010101FFCC33FFCC33FFCC33FFCC33FFCC + 33FFCC33FFCC33FFCC33FFCC33010101FFFF33FFFF33FFFF33FFFF33FFFF33FF + FF33FFFF33FFFF33FFFF33010101FF0066FF0066FF0066FF0066FF0066FF0066 + FF0066FF0066FF0066010101FF3366FF3366FF3366FF3366FF3366FF3366FF33 + 66FF3366FF3366010101FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF + 6666FF6666010101FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966 + FF9966010101FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC + 66010101FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF6601 + 0101010101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 000000000000000000000000000000000000000000000000000000000000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000010101FF3300FF + 3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300010101FF6600FF6600 + FF6600FF6600FF6600FF6600FF6600FF6600FF6600010101FF9900FF9900FF99 + 00FF9900FF9900FF9900FF9900FF9900FF9900010101FFCC00FFCC00FFCC00FF + CC00FFCC00FFCC00FFCC00FFCC00FFCC00010101FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00010101FF0033FF0033FF0033FF0033FF00 + 33FF0033FF0033FF0033FF0033010101FF3333FF3333FF3333FF3333FF3333FF + 3333FF3333FF3333FF3333010101FF6633FF6633FF6633FF6633FF6633FF6633 + FF6633FF6633FF6633010101FF9933FF9933FF9933FF9933FF9933FF9933FF99 + 33FF9933FF9933010101FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FF + CC33FFCC33010101FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33 + FFFF33010101FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF00 + 66010101FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF336601 + 0101FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6666010101 + FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966010101FFCC + 66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66010101FFFF66FF + FF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66010101010101FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 + 00000000000000000000000000000000000000000000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000010101FF3300FF3300FF3300FF3300 + FF3300FF3300FF3300FF3300FF3300010101FF6600FF6600FF6600FF6600FF66 + 00FF6600FF6600FF6600FF6600010101FF9900FF9900FF9900FF9900FF9900FF + 9900FF9900FF9900FF9900010101FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00 + FFCC00FFCC00FFCC00010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00010101FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF + 0033FF0033010101FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333 + FF3333010101FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF66 + 33010101FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF993301 + 0101FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33010101 + FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33010101FF00 + 66FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0066010101FF3366FF + 3366FF3366FF3366FF3366FF3366FF3366FF3366FF3366010101FF6666FF6666 + FF6666FF6666FF6666FF6666FF6666FF6666FF6666010101FF9966FF9966FF99 + 66FF9966FF9966FF9966FF9966FF9966FF9966010101FFCC66FFCC66FFCC66FF + CC66FFCC66FFCC66FFCC66FFCC66FFCC66010101FFFF66FFFF66FFFF66FFFF66 + FFFF66FFFF66FFFF66FFFF66FFFF660101010101010101010101010101010101 + 0101010101010101010101010101010100000000000000000000000000000000 + 0000000000000000000000000000010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 01010101010101010101010101CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCCCCC000000000000000000000000000000000000000000000000 + 000000000000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC00 + 00010101CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC330001 + 0101CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600010101 + CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900010101CCCC + 00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00010101CCFF00CC + FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00010101CC0033CC0033 + CC0033CC0033CC0033CC0033CC0033CC0033CC0033010101CC3333CC3333CC33 + 33CC3333CC3333CC3333CC3333CC3333CC3333010101CC6633CC6633CC6633CC + 6633CC6633CC6633CC6633CC6633CC6633010101CC9933CC9933CC9933CC9933 + CC9933CC9933CC9933CC9933CC9933010101CCCC33CCCC33CCCC33CCCC33CCCC + 33CCCC33CCCC33CCCC33CCCC33010101CCFF33CCFF33CCFF33CCFF33CCFF33CC + FF33CCFF33CCFF33CCFF33010101CC0066CC0066CC0066CC0066CC0066CC0066 + CC0066CC0066CC0066010101CC3366CC3366CC3366CC3366CC3366CC3366CC33 + 66CC3366CC3366010101CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC + 6666CC6666010101CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966 + CC9966010101CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC + 66010101CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF6601 + 0101010101CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + 000000000000000000000000000000000000000000000000000000000000CC00 + 00CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000010101CC3300CC + 3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300010101CC6600CC6600 + CC6600CC6600CC6600CC6600CC6600CC6600CC6600010101CC9900CC9900CC99 + 00CC9900CC9900CC9900CC9900CC9900CC9900010101CCCC00CCCC00CCCC00CC + CC00CCCC00CCCC00CCCC00CCCC00CCCC00010101CCFF00CCFF00CCFF00CCFF00 + CCFF00CCFF00CCFF00CCFF00CCFF00010101CC0033CC0033CC0033CC0033CC00 + 33CC0033CC0033CC0033CC0033010101CC3333CC3333CC3333CC3333CC3333CC + 3333CC3333CC3333CC3333010101CC6633CC6633CC6633CC6633CC6633CC6633 + CC6633CC6633CC6633010101CC9933CC9933CC9933CC9933CC9933CC9933CC99 + 33CC9933CC9933010101CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CC + CC33CCCC33010101CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33 + CCFF33010101CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC00 + 66010101CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC336601 + 0101CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666010101 + CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966010101CCCC + 66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66010101CCFF66CC + FF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66010101010101CCCCCC + CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC0000000000000000 + 00000000000000000000000000000000000000000000CC0000CC0000CC0000CC + 0000CC0000CC0000CC0000CC0000CC0000010101CC3300CC3300CC3300CC3300 + CC3300CC3300CC3300CC3300CC3300010101CC6600CC6600CC6600CC6600CC66 + 00CC6600CC6600CC6600CC6600010101CC9900CC9900CC9900CC9900CC9900CC + 9900CC9900CC9900CC9900010101CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00 + CCCC00CCCC00CCCC00010101CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF + 00CCFF00CCFF00010101CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC + 0033CC0033010101CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333 + CC3333010101CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC66 + 33010101CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC993301 + 0101CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33010101 + CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33010101CC00 + 66CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066010101CC3366CC + 3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366010101CC6666CC6666 + CC6666CC6666CC6666CC6666CC6666CC6666CC6666010101CC9966CC9966CC99 + 66CC9966CC9966CC9966CC9966CC9966CC9966010101CCCC66CCCC66CCCC66CC + CC66CCCC66CCCC66CCCC66CCCC66CCCC66010101CCFF66CCFF66CCFF66CCFF66 + CCFF66CCFF66CCFF66CCFF66CCFF66010101010101CCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC00000000000000000000000000000000 + 0000000000000000000000000000CC0000CC0000CC0000CC0000CC0000CC0000 + CC0000CC0000CC0000010101CC3300CC3300CC3300CC3300CC3300CC3300CC33 + 00CC3300CC3300010101CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC + 6600CC6600010101CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900 + CC9900010101CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC + 00010101CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF0001 + 0101CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033010101 + CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333010101CC66 + 33CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633010101CC9933CC + 9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933010101CCCC33CCCC33 + CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33010101CCFF33CCFF33CCFF + 33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33010101CC0066CC0066CC0066CC + 0066CC0066CC0066CC0066CC0066CC0066010101CC3366CC3366CC3366CC3366 + CC3366CC3366CC3366CC3366CC3366010101CC6666CC6666CC6666CC6666CC66 + 66CC6666CC6666CC6666CC6666010101CC9966CC9966CC9966CC9966CC9966CC + 9966CC9966CC9966CC9966010101CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66 + CCCC66CCCC66CCCC66010101CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF + 66CCFF66CCFF66010101010101CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCCCCC000000000000000000000000000000000000000000000000 + 000000000000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC00 + 00010101CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC330001 + 0101CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600010101 + CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900010101CCCC + 00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00010101CCFF00CC + FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00010101CC0033CC0033 + CC0033CC0033CC0033CC0033CC0033CC0033CC0033010101CC3333CC3333CC33 + 33CC3333CC3333CC3333CC3333CC3333CC3333010101CC6633CC6633CC6633CC + 6633CC6633CC6633CC6633CC6633CC6633010101CC9933CC9933CC9933CC9933 + CC9933CC9933CC9933CC9933CC9933010101CCCC33CCCC33CCCC33CCCC33CCCC + 33CCCC33CCCC33CCCC33CCCC33010101CCFF33CCFF33CCFF33CCFF33CCFF33CC + FF33CCFF33CCFF33CCFF33010101CC0066CC0066CC0066CC0066CC0066CC0066 + CC0066CC0066CC0066010101CC3366CC3366CC3366CC3366CC3366CC3366CC33 + 66CC3366CC3366010101CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC + 6666CC6666010101CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966 + CC9966010101CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC + 66010101CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF6601 + 0101010101CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + 000000000000000000000000000000000000000000000000000000000000CC00 + 00CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000010101CC3300CC + 3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300010101CC6600CC6600 + CC6600CC6600CC6600CC6600CC6600CC6600CC6600010101CC9900CC9900CC99 + 00CC9900CC9900CC9900CC9900CC9900CC9900010101CCCC00CCCC00CCCC00CC + CC00CCCC00CCCC00CCCC00CCCC00CCCC00010101CCFF00CCFF00CCFF00CCFF00 + CCFF00CCFF00CCFF00CCFF00CCFF00010101CC0033CC0033CC0033CC0033CC00 + 33CC0033CC0033CC0033CC0033010101CC3333CC3333CC3333CC3333CC3333CC + 3333CC3333CC3333CC3333010101CC6633CC6633CC6633CC6633CC6633CC6633 + CC6633CC6633CC6633010101CC9933CC9933CC9933CC9933CC9933CC9933CC99 + 33CC9933CC9933010101CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CC + CC33CCCC33010101CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33 + CCFF33010101CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC00 + 66010101CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC336601 + 0101CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666010101 + CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966010101CCCC + 66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66010101CCFF66CC + FF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66010101010101CCCCCC + CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC0000000000000000 + 00000000000000000000000000000000000000000000CC0000CC0000CC0000CC + 0000CC0000CC0000CC0000CC0000CC0000010101CC3300CC3300CC3300CC3300 + CC3300CC3300CC3300CC3300CC3300010101CC6600CC6600CC6600CC6600CC66 + 00CC6600CC6600CC6600CC6600010101CC9900CC9900CC9900CC9900CC9900CC + 9900CC9900CC9900CC9900010101CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00 + CCCC00CCCC00CCCC00010101CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF + 00CCFF00CCFF00010101CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC + 0033CC0033010101CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333 + CC3333010101CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC66 + 33010101CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC993301 + 0101CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33010101 + CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33010101CC00 + 66CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066010101CC3366CC + 3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366010101CC6666CC6666 + CC6666CC6666CC6666CC6666CC6666CC6666CC6666010101CC9966CC9966CC99 + 66CC9966CC9966CC9966CC9966CC9966CC9966010101CCCC66CCCC66CCCC66CC + CC66CCCC66CCCC66CCCC66CCCC66CCCC66010101CCFF66CCFF66CCFF66CCFF66 + CCFF66CCFF66CCFF66CCFF66CCFF66010101010101CCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC00000000000000000000000000000000 + 0000000000000000000000000000CC0000CC0000CC0000CC0000CC0000CC0000 + CC0000CC0000CC0000010101CC3300CC3300CC3300CC3300CC3300CC3300CC33 + 00CC3300CC3300010101CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC + 6600CC6600010101CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900 + CC9900010101CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC + 00010101CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF0001 + 0101CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033010101 + CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333010101CC66 + 33CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633010101CC9933CC + 9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933010101CCCC33CCCC33 + CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33010101CCFF33CCFF33CCFF + 33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33010101CC0066CC0066CC0066CC + 0066CC0066CC0066CC0066CC0066CC0066010101CC3366CC3366CC3366CC3366 + CC3366CC3366CC3366CC3366CC3366010101CC6666CC6666CC6666CC6666CC66 + 66CC6666CC6666CC6666CC6666010101CC9966CC9966CC9966CC9966CC9966CC + 9966CC9966CC9966CC9966010101CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66 + CCCC66CCCC66CCCC66010101CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF + 66CCFF66CCFF66010101010101CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCCCCC000000000000000000000000000000000000000000000000 + 000000000000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC00 + 00010101CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC330001 + 0101CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600010101 + CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900010101CCCC + 00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00010101CCFF00CC + FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00010101CC0033CC0033 + CC0033CC0033CC0033CC0033CC0033CC0033CC0033010101CC3333CC3333CC33 + 33CC3333CC3333CC3333CC3333CC3333CC3333010101CC6633CC6633CC6633CC + 6633CC6633CC6633CC6633CC6633CC6633010101CC9933CC9933CC9933CC9933 + CC9933CC9933CC9933CC9933CC9933010101CCCC33CCCC33CCCC33CCCC33CCCC + 33CCCC33CCCC33CCCC33CCCC33010101CCFF33CCFF33CCFF33CCFF33CCFF33CC + FF33CCFF33CCFF33CCFF33010101CC0066CC0066CC0066CC0066CC0066CC0066 + CC0066CC0066CC0066010101CC3366CC3366CC3366CC3366CC3366CC3366CC33 + 66CC3366CC3366010101CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC + 6666CC6666010101CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966 + CC9966010101CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC + 66010101CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF6601 + 0101010101010101010101010101010101010101010101010101010101010101 + 0000000000000000000000000000000000000000000000000000000000000101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101999999 + 9999999999999999999999999999999999999999999999990000000000000000 + 0000000000000000000000000000000000000000000099000099000099000099 + 0000990000990000990000990000990000010101993300993300993300993300 + 9933009933009933009933009933000101019966009966009966009966009966 + 0099660099660099660099660001010199990099990099990099990099990099 + 990099990099990099990001010199CC0099CC0099CC0099CC0099CC0099CC00 + 99CC0099CC0099CC0001010199FF0099FF0099FF0099FF0099FF0099FF0099FF + 0099FF0099FF0001010199003399003399003399003399003399003399003399 + 0033990033010101993333993333993333993333993333993333993333993333 + 9933330101019966339966339966339966339966339966339966339966339966 + 3301010199993399993399993399993399993399993399993399993399993301 + 010199CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC33010101 + 99FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF330101019900 + 6699006699006699006699006699006699006699006699006601010199336699 + 3366993366993366993366993366993366993366993366010101996666996666 + 9966669966669966669966669966669966669966660101019999669999669999 + 6699996699996699996699996699996699996601010199CC6699CC6699CC6699 + CC6699CC6699CC6699CC6699CC6699CC6601010199FF6699FF6699FF6699FF66 + 99FF6699FF6699FF6699FF6699FF660101010101019999999999999999999999 + 9999999999999999999999999999999900000000000000000000000000000000 + 0000000000000000000000000000990000990000990000990000990000990000 + 9900009900009900000101019933009933009933009933009933009933009933 + 0099330099330001010199660099660099660099660099660099660099660099 + 6600996600010101999900999900999900999900999900999900999900999900 + 99990001010199CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC + 0001010199FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0001 + 0101990033990033990033990033990033990033990033990033990033010101 + 9933339933339933339933339933339933339933339933339933330101019966 + 3399663399663399663399663399663399663399663399663301010199993399 + 993399993399993399993399993399993399993399993301010199CC3399CC33 + 99CC3399CC3399CC3399CC3399CC3399CC3399CC3301010199FF3399FF3399FF + 3399FF3399FF3399FF3399FF3399FF3399FF3301010199006699006699006699 + 0066990066990066990066990066990066010101993366993366993366993366 + 9933669933669933669933669933660101019966669966669966669966669966 + 6699666699666699666699666601010199996699996699996699996699996699 + 996699996699996699996601010199CC6699CC6699CC6699CC6699CC6699CC66 + 99CC6699CC6699CC6601010199FF6699FF6699FF6699FF6699FF6699FF6699FF + 6699FF6699FF6601010101010199999999999999999999999999999999999999 + 9999999999999999000000000000000000000000000000000000000000000000 + 0000000000009900009900009900009900009900009900009900009900009900 + 0001010199330099330099330099330099330099330099330099330099330001 + 0101996600996600996600996600996600996600996600996600996600010101 + 99990099990099990099990099990099990099990099990099990001010199CC + 0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0001010199FF0099 + FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF00010101990033990033 + 9900339900339900339900339900339900339900330101019933339933339933 + 3399333399333399333399333399333399333301010199663399663399663399 + 6633996633996633996633996633996633010101999933999933999933999933 + 99993399993399993399993399993301010199CC3399CC3399CC3399CC3399CC + 3399CC3399CC3399CC3399CC3301010199FF3399FF3399FF3399FF3399FF3399 + FF3399FF3399FF3399FF33010101990066990066990066990066990066990066 + 9900669900669900660101019933669933669933669933669933669933669933 + 6699336699336601010199666699666699666699666699666699666699666699 + 6666996666010101999966999966999966999966999966999966999966999966 + 99996601010199CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC + 6601010199FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6601 + 0101010101999999999999999999999999999999999999999999999999999999 + 0000000000000000000000000000000000000000000000000000000000009900 + 0099000099000099000099000099000099000099000099000001010199330099 + 3300993300993300993300993300993300993300993300010101996600996600 + 9966009966009966009966009966009966009966000101019999009999009999 + 0099990099990099990099990099990099990001010199CC0099CC0099CC0099 + CC0099CC0099CC0099CC0099CC0099CC0001010199FF0099FF0099FF0099FF00 + 99FF0099FF0099FF0099FF0099FF000101019900339900339900339900339900 + 3399003399003399003399003301010199333399333399333399333399333399 + 3333993333993333993333010101996633996633996633996633996633996633 + 9966339966339966330101019999339999339999339999339999339999339999 + 3399993399993301010199CC3399CC3399CC3399CC3399CC3399CC3399CC3399 + CC3399CC3301010199FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF33 + 99FF330101019900669900669900669900669900669900669900669900669900 + 6601010199336699336699336699336699336699336699336699336699336601 + 0101996666996666996666996666996666996666996666996666996666010101 + 99996699996699996699996699996699996699996699996699996601010199CC + 6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6601010199FF6699 + FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF66010101010101999999 + 9999999999999999999999999999999999999999999999990000000000000000 + 0000000000000000000000000000000000000000000099000099000099000099 + 0000990000990000990000990000990000010101993300993300993300993300 + 9933009933009933009933009933000101019966009966009966009966009966 + 0099660099660099660099660001010199990099990099990099990099990099 + 990099990099990099990001010199CC0099CC0099CC0099CC0099CC0099CC00 + 99CC0099CC0099CC0001010199FF0099FF0099FF0099FF0099FF0099FF0099FF + 0099FF0099FF0001010199003399003399003399003399003399003399003399 + 0033990033010101993333993333993333993333993333993333993333993333 + 9933330101019966339966339966339966339966339966339966339966339966 + 3301010199993399993399993399993399993399993399993399993399993301 + 010199CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC33010101 + 99FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF330101019900 + 6699006699006699006699006699006699006699006699006601010199336699 + 3366993366993366993366993366993366993366993366010101996666996666 + 9966669966669966669966669966669966669966660101019999669999669999 + 6699996699996699996699996699996699996601010199CC6699CC6699CC6699 + CC6699CC6699CC6699CC6699CC6699CC6601010199FF6699FF6699FF6699FF66 + 99FF6699FF6699FF6699FF6699FF660101010101019999999999999999999999 + 9999999999999999999999999999999900000000000000000000000000000000 + 0000000000000000000000000000990000990000990000990000990000990000 + 9900009900009900000101019933009933009933009933009933009933009933 + 0099330099330001010199660099660099660099660099660099660099660099 + 6600996600010101999900999900999900999900999900999900999900999900 + 99990001010199CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC + 0001010199FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0001 + 0101990033990033990033990033990033990033990033990033990033010101 + 9933339933339933339933339933339933339933339933339933330101019966 + 3399663399663399663399663399663399663399663399663301010199993399 + 993399993399993399993399993399993399993399993301010199CC3399CC33 + 99CC3399CC3399CC3399CC3399CC3399CC3399CC3301010199FF3399FF3399FF + 3399FF3399FF3399FF3399FF3399FF3399FF3301010199006699006699006699 + 0066990066990066990066990066990066010101993366993366993366993366 + 9933669933669933669933669933660101019966669966669966669966669966 + 6699666699666699666699666601010199996699996699996699996699996699 + 996699996699996699996601010199CC6699CC6699CC6699CC6699CC6699CC66 + 99CC6699CC6699CC6601010199FF6699FF6699FF6699FF6699FF6699FF6699FF + 6699FF6699FF6601010101010199999999999999999999999999999999999999 + 9999999999999999000000000000000000000000000000000000000000000000 + 0000000000009900009900009900009900009900009900009900009900009900 + 0001010199330099330099330099330099330099330099330099330099330001 + 0101996600996600996600996600996600996600996600996600996600010101 + 99990099990099990099990099990099990099990099990099990001010199CC + 0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0001010199FF0099 + FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF00010101990033990033 + 9900339900339900339900339900339900339900330101019933339933339933 + 3399333399333399333399333399333399333301010199663399663399663399 + 6633996633996633996633996633996633010101999933999933999933999933 + 99993399993399993399993399993301010199CC3399CC3399CC3399CC3399CC + 3399CC3399CC3399CC3399CC3301010199FF3399FF3399FF3399FF3399FF3399 + FF3399FF3399FF3399FF33010101990066990066990066990066990066990066 + 9900669900669900660101019933669933669933669933669933669933669933 + 6699336699336601010199666699666699666699666699666699666699666699 + 6666996666010101999966999966999966999966999966999966999966999966 + 99996601010199CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC + 6601010199FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6601 + 0101010101999999999999999999999999999999999999999999999999999999 + 0000000000000000000000000000000000000000000000000000000000009900 + 0099000099000099000099000099000099000099000099000001010199330099 + 3300993300993300993300993300993300993300993300010101996600996600 + 9966009966009966009966009966009966009966000101019999009999009999 + 0099990099990099990099990099990099990001010199CC0099CC0099CC0099 + CC0099CC0099CC0099CC0099CC0099CC0001010199FF0099FF0099FF0099FF00 + 99FF0099FF0099FF0099FF0099FF000101019900339900339900339900339900 + 3399003399003399003399003301010199333399333399333399333399333399 + 3333993333993333993333010101996633996633996633996633996633996633 + 9966339966339966330101019999339999339999339999339999339999339999 + 3399993399993301010199CC3399CC3399CC3399CC3399CC3399CC3399CC3399 + CC3399CC3301010199FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF33 + 99FF330101019900669900669900669900669900669900669900669900669900 + 6601010199336699336699336699336699336699336699336699336699336601 + 0101996666996666996666996666996666996666996666996666996666010101 + 99996699996699996699996699996699996699996699996699996601010199CC + 6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6601010199FF6699 + FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF66010101010101999999 + 9999999999999999999999999999999999999999999999990000000000000000 + 0000000000000000000000000000000000000000000099000099000099000099 + 0000990000990000990000990000990000010101993300993300993300993300 + 9933009933009933009933009933000101019966009966009966009966009966 + 0099660099660099660099660001010199990099990099990099990099990099 + 990099990099990099990001010199CC0099CC0099CC0099CC0099CC0099CC00 + 99CC0099CC0099CC0001010199FF0099FF0099FF0099FF0099FF0099FF0099FF + 0099FF0099FF0001010199003399003399003399003399003399003399003399 + 0033990033010101993333993333993333993333993333993333993333993333 + 9933330101019966339966339966339966339966339966339966339966339966 + 3301010199993399993399993399993399993399993399993399993399993301 + 010199CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC33010101 + 99FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF330101019900 + 6699006699006699006699006699006699006699006699006601010199336699 + 3366993366993366993366993366993366993366993366010101996666996666 + 9966669966669966669966669966669966669966660101019999669999669999 + 6699996699996699996699996699996699996601010199CC6699CC6699CC6699 + CC6699CC6699CC6699CC6699CC6699CC6601010199FF6699FF6699FF6699FF66 + 99FF6699FF6699FF6699FF6699FF660101010101010101010101010101010101 + 0101010101010101010101010101010100000000000000000000000000000000 + 0000000000000000000000000000010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010166666666666666666666666666666666666666 + 6666666666666666000000000000000000000000000000000000000000000000 + 0000000000006600006600006600006600006600006600006600006600006600 + 0001010166330066330066330066330066330066330066330066330066330001 + 0101666600666600666600666600666600666600666600666600666600010101 + 66990066990066990066990066990066990066990066990066990001010166CC + 0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0001010166FF0066 + FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF00010101660033660033 + 6600336600336600336600336600336600336600330101016633336633336633 + 3366333366333366333366333366333366333301010166663366663366663366 + 6633666633666633666633666633666633010101669933669933669933669933 + 66993366993366993366993366993301010166CC3366CC3366CC3366CC3366CC + 3366CC3366CC3366CC3366CC3301010166FF3366FF3366FF3366FF3366FF3366 + FF3366FF3366FF3366FF33010101660066660066660066660066660066660066 + 6600666600666600660101016633666633666633666633666633666633666633 + 6666336666336601010166666666666666666666666666666666666666666666 + 6666666666010101669966669966669966669966669966669966669966669966 + 66996601010166CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC + 6601010166FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6601 + 0101010101666666666666666666666666666666666666666666666666666666 + 0000000000000000000000000000000000000000000000000000000000006600 + 0066000066000066000066000066000066000066000066000001010166330066 + 3300663300663300663300663300663300663300663300010101666600666600 + 6666006666006666006666006666006666006666000101016699006699006699 + 0066990066990066990066990066990066990001010166CC0066CC0066CC0066 + CC0066CC0066CC0066CC0066CC0066CC0001010166FF0066FF0066FF0066FF00 + 66FF0066FF0066FF0066FF0066FF000101016600336600336600336600336600 + 3366003366003366003366003301010166333366333366333366333366333366 + 3333663333663333663333010101666633666633666633666633666633666633 + 6666336666336666330101016699336699336699336699336699336699336699 + 3366993366993301010166CC3366CC3366CC3366CC3366CC3366CC3366CC3366 + CC3366CC3301010166FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF33 + 66FF330101016600666600666600666600666600666600666600666600666600 + 6601010166336666336666336666336666336666336666336666336666336601 + 0101666666666666666666666666666666666666666666666666666666010101 + 66996666996666996666996666996666996666996666996666996601010166CC + 6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6601010166FF6666 + FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF66010101010101666666 + 6666666666666666666666666666666666666666666666660000000000000000 + 0000000000000000000000000000000000000000000066000066000066000066 + 0000660000660000660000660000660000010101663300663300663300663300 + 6633006633006633006633006633000101016666006666006666006666006666 + 0066660066660066660066660001010166990066990066990066990066990066 + 990066990066990066990001010166CC0066CC0066CC0066CC0066CC0066CC00 + 66CC0066CC0066CC0001010166FF0066FF0066FF0066FF0066FF0066FF0066FF + 0066FF0066FF0001010166003366003366003366003366003366003366003366 + 0033660033010101663333663333663333663333663333663333663333663333 + 6633330101016666336666336666336666336666336666336666336666336666 + 3301010166993366993366993366993366993366993366993366993366993301 + 010166CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC33010101 + 66FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF330101016600 + 6666006666006666006666006666006666006666006666006601010166336666 + 3366663366663366663366663366663366663366663366010101666666666666 + 6666666666666666666666666666666666666666660101016699666699666699 + 6666996666996666996666996666996666996601010166CC6666CC6666CC6666 + CC6666CC6666CC6666CC6666CC6666CC6601010166FF6666FF6666FF6666FF66 + 66FF6666FF6666FF6666FF6666FF660101010101016666666666666666666666 + 6666666666666666666666666666666600000000000000000000000000000000 + 0000000000000000000000000000660000660000660000660000660000660000 + 6600006600006600000101016633006633006633006633006633006633006633 + 0066330066330001010166660066660066660066660066660066660066660066 + 6600666600010101669900669900669900669900669900669900669900669900 + 66990001010166CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC + 0001010166FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0001 + 0101660033660033660033660033660033660033660033660033660033010101 + 6633336633336633336633336633336633336633336633336633330101016666 + 3366663366663366663366663366663366663366663366663301010166993366 + 993366993366993366993366993366993366993366993301010166CC3366CC33 + 66CC3366CC3366CC3366CC3366CC3366CC3366CC3301010166FF3366FF3366FF + 3366FF3366FF3366FF3366FF3366FF3366FF3301010166006666006666006666 + 0066660066660066660066660066660066010101663366663366663366663366 + 6633666633666633666633666633660101016666666666666666666666666666 + 6666666666666666666666666601010166996666996666996666996666996666 + 996666996666996666996601010166CC6666CC6666CC6666CC6666CC6666CC66 + 66CC6666CC6666CC6601010166FF6666FF6666FF6666FF6666FF6666FF6666FF + 6666FF6666FF6601010101010166666666666666666666666666666666666666 + 6666666666666666000000000000000000000000000000000000000000000000 + 0000000000006600006600006600006600006600006600006600006600006600 + 0001010166330066330066330066330066330066330066330066330066330001 + 0101666600666600666600666600666600666600666600666600666600010101 + 66990066990066990066990066990066990066990066990066990001010166CC + 0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0001010166FF0066 + FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF00010101660033660033 + 6600336600336600336600336600336600336600330101016633336633336633 + 3366333366333366333366333366333366333301010166663366663366663366 + 6633666633666633666633666633666633010101669933669933669933669933 + 66993366993366993366993366993301010166CC3366CC3366CC3366CC3366CC + 3366CC3366CC3366CC3366CC3301010166FF3366FF3366FF3366FF3366FF3366 + FF3366FF3366FF3366FF33010101660066660066660066660066660066660066 + 6600666600666600660101016633666633666633666633666633666633666633 + 6666336666336601010166666666666666666666666666666666666666666666 + 6666666666010101669966669966669966669966669966669966669966669966 + 66996601010166CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC + 6601010166FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6601 + 0101010101666666666666666666666666666666666666666666666666666666 + 0000000000000000000000000000000000000000000000000000000000006600 + 0066000066000066000066000066000066000066000066000001010166330066 + 3300663300663300663300663300663300663300663300010101666600666600 + 6666006666006666006666006666006666006666000101016699006699006699 + 0066990066990066990066990066990066990001010166CC0066CC0066CC0066 + CC0066CC0066CC0066CC0066CC0066CC0001010166FF0066FF0066FF0066FF00 + 66FF0066FF0066FF0066FF0066FF000101016600336600336600336600336600 + 3366003366003366003366003301010166333366333366333366333366333366 + 3333663333663333663333010101666633666633666633666633666633666633 + 6666336666336666330101016699336699336699336699336699336699336699 + 3366993366993301010166CC3366CC3366CC3366CC3366CC3366CC3366CC3366 + CC3366CC3301010166FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF33 + 66FF330101016600666600666600666600666600666600666600666600666600 + 6601010166336666336666336666336666336666336666336666336666336601 + 0101666666666666666666666666666666666666666666666666666666010101 + 66996666996666996666996666996666996666996666996666996601010166CC + 6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6601010166FF6666 + FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF66010101010101666666 + 6666666666666666666666666666666666666666666666660000000000000000 + 0000000000000000000000000000000000000000000066000066000066000066 + 0000660000660000660000660000660000010101663300663300663300663300 + 6633006633006633006633006633000101016666006666006666006666006666 + 0066660066660066660066660001010166990066990066990066990066990066 + 990066990066990066990001010166CC0066CC0066CC0066CC0066CC0066CC00 + 66CC0066CC0066CC0001010166FF0066FF0066FF0066FF0066FF0066FF0066FF + 0066FF0066FF0001010166003366003366003366003366003366003366003366 + 0033660033010101663333663333663333663333663333663333663333663333 + 6633330101016666336666336666336666336666336666336666336666336666 + 3301010166993366993366993366993366993366993366993366993366993301 + 010166CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC33010101 + 66FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF330101016600 + 6666006666006666006666006666006666006666006666006601010166336666 + 3366663366663366663366663366663366663366663366010101666666666666 + 6666666666666666666666666666666666666666660101016699666699666699 + 6666996666996666996666996666996666996601010166CC6666CC6666CC6666 + CC6666CC6666CC6666CC6666CC6666CC6601010166FF6666FF6666FF6666FF66 + 66FF6666FF6666FF6666FF6666FF660101010101016666666666666666666666 + 6666666666666666666666666666666600000000000000000000000000000000 + 0000000000000000000000000000660000660000660000660000660000660000 + 6600006600006600000101016633006633006633006633006633006633006633 + 0066330066330001010166660066660066660066660066660066660066660066 + 6600666600010101669900669900669900669900669900669900669900669900 + 66990001010166CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC + 0001010166FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0001 + 0101660033660033660033660033660033660033660033660033660033010101 + 6633336633336633336633336633336633336633336633336633330101016666 + 3366663366663366663366663366663366663366663366663301010166993366 + 993366993366993366993366993366993366993366993301010166CC3366CC33 + 66CC3366CC3366CC3366CC3366CC3366CC3366CC3301010166FF3366FF3366FF + 3366FF3366FF3366FF3366FF3366FF3366FF3301010166006666006666006666 + 0066660066660066660066660066660066010101663366663366663366663366 + 6633666633666633666633666633660101016666666666666666666666666666 + 6666666666666666666666666601010166996666996666996666996666996666 + 996666996666996666996601010166CC6666CC6666CC6666CC6666CC6666CC66 + 66CC6666CC6666CC6601010166FF6666FF6666FF6666FF6666FF6666FF6666FF + 6666FF6666FF6601010101010166666666666666666666666666666666666666 + 6666666666666666000000000000000000000000000000000000000000000000 + 0000000000006600006600006600006600006600006600006600006600006600 + 0001010166330066330066330066330066330066330066330066330066330001 + 0101666600666600666600666600666600666600666600666600666600010101 + 66990066990066990066990066990066990066990066990066990001010166CC + 0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0001010166FF0066 + FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF00010101660033660033 + 6600336600336600336600336600336600336600330101016633336633336633 + 3366333366333366333366333366333366333301010166663366663366663366 + 6633666633666633666633666633666633010101669933669933669933669933 + 66993366993366993366993366993301010166CC3366CC3366CC3366CC3366CC + 3366CC3366CC3366CC3366CC3301010166FF3366FF3366FF3366FF3366FF3366 + FF3366FF3366FF3366FF33010101660066660066660066660066660066660066 + 6600666600666600660101016633666633666633666633666633666633666633 + 6666336666336601010166666666666666666666666666666666666666666666 + 6666666666010101669966669966669966669966669966669966669966669966 + 66996601010166CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC + 6601010166FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6601 + 0101010101010101010101010101010101010101010101010101010101010101 + 0000000000000000000000000000000000000000000000000000000000000101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101333333 + 3333333333333333333333333333333333333333333333330000000000000000 + 0000000000000000000000000000000000000000000033000033000033000033 + 0000330000330000330000330000330000010101333300333300333300333300 + 3333003333003333003333003333000101013366003366003366003366003366 + 0033660033660033660033660001010133990033990033990033990033990033 + 990033990033990033990001010133CC0033CC0033CC0033CC0033CC0033CC00 + 33CC0033CC0033CC0001010133FF0033FF0033FF0033FF0033FF0033FF0033FF + 0033FF0033FF0001010133003333003333003333003333003333003333003333 + 0033330033010101333333333333333333333333333333333333333333333333 + 3333330101013366333366333366333366333366333366333366333366333366 + 3301010133993333993333993333993333993333993333993333993333993301 + 010133CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC33010101 + 33FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF330101013300 + 6633006633006633006633006633006633006633006633006601010133336633 + 3366333366333366333366333366333366333366333366010101336666336666 + 3366663366663366663366663366663366663366660101013399663399663399 + 6633996633996633996633996633996633996601010133CC6633CC6633CC6633 + CC6633CC6633CC6633CC6633CC6633CC6601010133FF6633FF6633FF6633FF66 + 33FF6633FF6633FF6633FF6633FF660101010101013333333333333333333333 + 3333333333333333333333333333333300000000000000000000000000000000 + 0000000000000000000000000000330000330000330000330000330000330000 + 3300003300003300000101013333003333003333003333003333003333003333 + 0033330033330001010133660033660033660033660033660033660033660033 + 6600336600010101339900339900339900339900339900339900339900339900 + 33990001010133CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC + 0001010133FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0001 + 0101330033330033330033330033330033330033330033330033330033010101 + 3333333333333333333333333333333333333333333333333333330101013366 + 3333663333663333663333663333663333663333663333663301010133993333 + 993333993333993333993333993333993333993333993301010133CC3333CC33 + 33CC3333CC3333CC3333CC3333CC3333CC3333CC3301010133FF3333FF3333FF + 3333FF3333FF3333FF3333FF3333FF3333FF3301010133006633006633006633 + 0066330066330066330066330066330066010101333366333366333366333366 + 3333663333663333663333663333660101013366663366663366663366663366 + 6633666633666633666633666601010133996633996633996633996633996633 + 996633996633996633996601010133CC6633CC6633CC6633CC6633CC6633CC66 + 33CC6633CC6633CC6601010133FF6633FF6633FF6633FF6633FF6633FF6633FF + 6633FF6633FF6601010101010133333333333333333333333333333333333333 + 3333333333333333000000000000000000000000000000000000000000000000 + 0000000000003300003300003300003300003300003300003300003300003300 + 0001010133330033330033330033330033330033330033330033330033330001 + 0101336600336600336600336600336600336600336600336600336600010101 + 33990033990033990033990033990033990033990033990033990001010133CC + 0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0001010133FF0033 + FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF00010101330033330033 + 3300333300333300333300333300333300333300330101013333333333333333 + 3333333333333333333333333333333333333301010133663333663333663333 + 6633336633336633336633336633336633010101339933339933339933339933 + 33993333993333993333993333993301010133CC3333CC3333CC3333CC3333CC + 3333CC3333CC3333CC3333CC3301010133FF3333FF3333FF3333FF3333FF3333 + FF3333FF3333FF3333FF33010101330066330066330066330066330066330066 + 3300663300663300660101013333663333663333663333663333663333663333 + 6633336633336601010133666633666633666633666633666633666633666633 + 6666336666010101339966339966339966339966339966339966339966339966 + 33996601010133CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC + 6601010133FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6601 + 0101010101333333333333333333333333333333333333333333333333333333 + 0000000000000000000000000000000000000000000000000000000000003300 + 0033000033000033000033000033000033000033000033000001010133330033 + 3300333300333300333300333300333300333300333300010101336600336600 + 3366003366003366003366003366003366003366000101013399003399003399 + 0033990033990033990033990033990033990001010133CC0033CC0033CC0033 + CC0033CC0033CC0033CC0033CC0033CC0001010133FF0033FF0033FF0033FF00 + 33FF0033FF0033FF0033FF0033FF000101013300333300333300333300333300 + 3333003333003333003333003301010133333333333333333333333333333333 + 3333333333333333333333010101336633336633336633336633336633336633 + 3366333366333366330101013399333399333399333399333399333399333399 + 3333993333993301010133CC3333CC3333CC3333CC3333CC3333CC3333CC3333 + CC3333CC3301010133FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF33 + 33FF330101013300663300663300663300663300663300663300663300663300 + 6601010133336633336633336633336633336633336633336633336633336601 + 0101336666336666336666336666336666336666336666336666336666010101 + 33996633996633996633996633996633996633996633996633996601010133CC + 6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6601010133FF6633 + FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF66010101010101333333 + 3333333333333333333333333333333333333333333333330000000000000000 + 0000000000000000000000000000000000000000000033000033000033000033 + 0000330000330000330000330000330000010101333300333300333300333300 + 3333003333003333003333003333000101013366003366003366003366003366 + 0033660033660033660033660001010133990033990033990033990033990033 + 990033990033990033990001010133CC0033CC0033CC0033CC0033CC0033CC00 + 33CC0033CC0033CC0001010133FF0033FF0033FF0033FF0033FF0033FF0033FF + 0033FF0033FF0001010133003333003333003333003333003333003333003333 + 0033330033010101333333333333333333333333333333333333333333333333 + 3333330101013366333366333366333366333366333366333366333366333366 + 3301010133993333993333993333993333993333993333993333993333993301 + 010133CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC33010101 + 33FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF330101013300 + 6633006633006633006633006633006633006633006633006601010133336633 + 3366333366333366333366333366333366333366333366010101336666336666 + 3366663366663366663366663366663366663366660101013399663399663399 + 6633996633996633996633996633996633996601010133CC6633CC6633CC6633 + CC6633CC6633CC6633CC6633CC6633CC6601010133FF6633FF6633FF6633FF66 + 33FF6633FF6633FF6633FF6633FF660101010101013333333333333333333333 + 3333333333333333333333333333333300000000000000000000000000000000 + 0000000000000000000000000000330000330000330000330000330000330000 + 3300003300003300000101013333003333003333003333003333003333003333 + 0033330033330001010133660033660033660033660033660033660033660033 + 6600336600010101339900339900339900339900339900339900339900339900 + 33990001010133CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC + 0001010133FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0001 + 0101330033330033330033330033330033330033330033330033330033010101 + 3333333333333333333333333333333333333333333333333333330101013366 + 3333663333663333663333663333663333663333663333663301010133993333 + 993333993333993333993333993333993333993333993301010133CC3333CC33 + 33CC3333CC3333CC3333CC3333CC3333CC3333CC3301010133FF3333FF3333FF + 3333FF3333FF3333FF3333FF3333FF3333FF3301010133006633006633006633 + 0066330066330066330066330066330066010101333366333366333366333366 + 3333663333663333663333663333660101013366663366663366663366663366 + 6633666633666633666633666601010133996633996633996633996633996633 + 996633996633996633996601010133CC6633CC6633CC6633CC6633CC6633CC66 + 33CC6633CC6633CC6601010133FF6633FF6633FF6633FF6633FF6633FF6633FF + 6633FF6633FF6601010101010133333333333333333333333333333333333333 + 3333333333333333000000000000000000000000000000000000000000000000 + 0000000000003300003300003300003300003300003300003300003300003300 + 0001010133330033330033330033330033330033330033330033330033330001 + 0101336600336600336600336600336600336600336600336600336600010101 + 33990033990033990033990033990033990033990033990033990001010133CC + 0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0001010133FF0033 + FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF00010101330033330033 + 3300333300333300333300333300333300333300330101013333333333333333 + 3333333333333333333333333333333333333301010133663333663333663333 + 6633336633336633336633336633336633010101339933339933339933339933 + 33993333993333993333993333993301010133CC3333CC3333CC3333CC3333CC + 3333CC3333CC3333CC3333CC3301010133FF3333FF3333FF3333FF3333FF3333 + FF3333FF3333FF3333FF33010101330066330066330066330066330066330066 + 3300663300663300660101013333663333663333663333663333663333663333 + 6633336633336601010133666633666633666633666633666633666633666633 + 6666336666010101339966339966339966339966339966339966339966339966 + 33996601010133CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC + 6601010133FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6601 + 0101010101333333333333333333333333333333333333333333333333333333 + 0000000000000000000000000000000000000000000000000000000000003300 + 0033000033000033000033000033000033000033000033000001010133330033 + 3300333300333300333300333300333300333300333300010101336600336600 + 3366003366003366003366003366003366003366000101013399003399003399 + 0033990033990033990033990033990033990001010133CC0033CC0033CC0033 + CC0033CC0033CC0033CC0033CC0033CC0001010133FF0033FF0033FF0033FF00 + 33FF0033FF0033FF0033FF0033FF000101013300333300333300333300333300 + 3333003333003333003333003301010133333333333333333333333333333333 + 3333333333333333333333010101336633336633336633336633336633336633 + 3366333366333366330101013399333399333399333399333399333399333399 + 3333993333993301010133CC3333CC3333CC3333CC3333CC3333CC3333CC3333 + CC3333CC3301010133FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF33 + 33FF330101013300663300663300663300663300663300663300663300663300 + 6601010133336633336633336633336633336633336633336633336633336601 + 0101336666336666336666336666336666336666336666336666336666010101 + 33996633996633996633996633996633996633996633996633996601010133CC + 6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6601010133FF6633 + FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF66010101010101333333 + 3333333333333333333333333333333333333333333333330000000000000000 + 0000000000000000000000000000000000000000000033000033000033000033 + 0000330000330000330000330000330000010101333300333300333300333300 + 3333003333003333003333003333000101013366003366003366003366003366 + 0033660033660033660033660001010133990033990033990033990033990033 + 990033990033990033990001010133CC0033CC0033CC0033CC0033CC0033CC00 + 33CC0033CC0033CC0001010133FF0033FF0033FF0033FF0033FF0033FF0033FF + 0033FF0033FF0001010133003333003333003333003333003333003333003333 + 0033330033010101333333333333333333333333333333333333333333333333 + 3333330101013366333366333366333366333366333366333366333366333366 + 3301010133993333993333993333993333993333993333993333993333993301 + 010133CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC33010101 + 33FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF330101013300 + 6633006633006633006633006633006633006633006633006601010133336633 + 3366333366333366333366333366333366333366333366010101336666336666 + 3366663366663366663366663366663366663366660101013399663399663399 + 6633996633996633996633996633996633996601010133CC6633CC6633CC6633 + CC6633CC6633CC6633CC6633CC6633CC6601010133FF6633FF6633FF6633FF66 + 33FF6633FF6633FF6633FF6633FF660101010000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000330000330000330000330000330000330000330000330000330001 + 0101006600006600006600006600006600006600006600006600006600010101 + 00990000990000990000990000990000990000990000990000990001010100CC + 0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0001010100FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00010101000033000033 + 0000330000330000330000330000330000330000330101010033330033330033 + 3300333300333300333300333300333300333301010100663300663300663300 + 6633006633006633006633006633006633010101009933009933009933009933 + 00993300993300993300993300993301010100CC3300CC3300CC3300CC3300CC + 3300CC3300CC3300CC3300CC3301010100FF3300FF3300FF3300FF3300FF3300 + FF3300FF3300FF3300FF33010101000066000066000066000066000066000066 + 0000660000660000660101010033660033660033660033660033660033660033 + 6600336600336601010100666600666600666600666600666600666600666600 + 6666006666010101009966009966009966009966009966009966009966009966 + 00996601010100CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC + 6601010100FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6601 + 0101000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000330000 + 3300003300003300003300003300003300003300003300010101006600006600 + 0066000066000066000066000066000066000066000101010099000099000099 + 0000990000990000990000990000990000990001010100CC0000CC0000CC0000 + CC0000CC0000CC0000CC0000CC0000CC0001010100FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF000101010000330000330000330000330000 + 3300003300003300003300003301010100333300333300333300333300333300 + 3333003333003333003333010101006633006633006633006633006633006633 + 0066330066330066330101010099330099330099330099330099330099330099 + 3300993300993301010100CC3300CC3300CC3300CC3300CC3300CC3300CC3300 + CC3300CC3301010100FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF33 + 00FF330101010000660000660000660000660000660000660000660000660000 + 6601010100336600336600336600336600336600336600336600336600336601 + 0101006666006666006666006666006666006666006666006666006666010101 + 00996600996600996600996600996600996600996600996600996601010100CC + 6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6601010100FF6600 + FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF66010101000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000003300003300003300003300 + 0033000033000033000033000033000101010066000066000066000066000066 + 0000660000660000660000660001010100990000990000990000990000990000 + 990000990000990000990001010100CC0000CC0000CC0000CC0000CC0000CC00 + 00CC0000CC0000CC0001010100FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0001010100003300003300003300003300003300003300003300 + 0033000033010101003333003333003333003333003333003333003333003333 + 0033330101010066330066330066330066330066330066330066330066330066 + 3301010100993300993300993300993300993300993300993300993300993301 + 010100CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC33010101 + 00FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF330101010000 + 6600006600006600006600006600006600006600006600006601010100336600 + 3366003366003366003366003366003366003366003366010101006666006666 + 0066660066660066660066660066660066660066660101010099660099660099 + 6600996600996600996600996600996600996601010100CC6600CC6600CC6600 + CC6600CC6600CC6600CC6600CC6600CC6601010100FF6600FF6600FF6600FF66 + 00FF6600FF6600FF6600FF6600FF660101010000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000033000033000033000033000033000033000033 + 0000330000330001010100660000660000660000660000660000660000660000 + 6600006600010101009900009900009900009900009900009900009900009900 + 00990001010100CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC + 0001010100FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0001 + 0101000033000033000033000033000033000033000033000033000033010101 + 0033330033330033330033330033330033330033330033330033330101010066 + 3300663300663300663300663300663300663300663300663301010100993300 + 993300993300993300993300993300993300993300993301010100CC3300CC33 + 00CC3300CC3300CC3300CC3300CC3300CC3300CC3301010100FF3300FF3300FF + 3300FF3300FF3300FF3300FF3300FF3300FF3301010100006600006600006600 + 0066000066000066000066000066000066010101003366003366003366003366 + 0033660033660033660033660033660101010066660066660066660066660066 + 6600666600666600666600666601010100996600996600996600996600996600 + 996600996600996600996601010100CC6600CC6600CC6600CC6600CC6600CC66 + 00CC6600CC6600CC6601010100FF6600FF6600FF6600FF6600FF6600FF6600FF + 6600FF6600FF6601010100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000330000330000330000330000330000330000330000330000330001 + 0101006600006600006600006600006600006600006600006600006600010101 + 00990000990000990000990000990000990000990000990000990001010100CC + 0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0001010100FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00010101000033000033 + 0000330000330000330000330000330000330000330101010033330033330033 + 3300333300333300333300333300333300333301010100663300663300663300 + 6633006633006633006633006633006633010101009933009933009933009933 + 00993300993300993300993300993301010100CC3300CC3300CC3300CC3300CC + 3300CC3300CC3300CC3300CC3301010100FF3300FF3300FF3300FF3300FF3300 + FF3300FF3300FF3300FF33010101000066000066000066000066000066000066 + 0000660000660000660101010033660033660033660033660033660033660033 + 6600336600336601010100666600666600666600666600666600666600666600 + 6666006666010101009966009966009966009966009966009966009966009966 + 00996601010100CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC + 6601010100FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6601 + 0101000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000330000 + 3300003300003300003300003300003300003300003300010101006600006600 + 0066000066000066000066000066000066000066000101010099000099000099 + 0000990000990000990000990000990000990001010100CC0000CC0000CC0000 + CC0000CC0000CC0000CC0000CC0000CC0001010100FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF000101010000330000330000330000330000 + 3300003300003300003300003301010100333300333300333300333300333300 + 3333003333003333003333010101006633006633006633006633006633006633 + 0066330066330066330101010099330099330099330099330099330099330099 + 3300993300993301010100CC3300CC3300CC3300CC3300CC3300CC3300CC3300 + CC3300CC3301010100FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF33 + 00FF330101010000660000660000660000660000660000660000660000660000 + 6601010100336600336600336600336600336600336600336600336600336601 + 0101006666006666006666006666006666006666006666006666006666010101 + 00996600996600996600996600996600996600996600996600996601010100CC + 6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6601010100FF6600 + FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF66010101000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000003300003300003300003300 + 0033000033000033000033000033000101010066000066000066000066000066 + 0000660000660000660000660001010100990000990000990000990000990000 + 990000990000990000990001010100CC0000CC0000CC0000CC0000CC0000CC00 + 00CC0000CC0000CC0001010100FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0001010100003300003300003300003300003300003300003300 + 0033000033010101003333003333003333003333003333003333003333003333 + 0033330101010066330066330066330066330066330066330066330066330066 + 3301010100993300993300993300993300993300993300993300993300993301 + 010100CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC33010101 + 00FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF330101010000 + 6600006600006600006600006600006600006600006600006601010100336600 + 3366003366003366003366003366003366003366003366010101006666006666 + 0066660066660066660066660066660066660066660101010099660099660099 + 6600996600996600996600996600996600996601010100CC6600CC6600CC6600 + CC6600CC6600CC6600CC6600CC6600CC6601010100FF6600FF6600FF6600FF66 + 00FF6600FF6600FF6600FF6600FF660101010000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000033000033000033000033000033000033000033 + 0000330000330001010100660000660000660000660000660000660000660000 + 6600006600010101009900009900009900009900009900009900009900009900 + 00990001010100CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC + 0001010100FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0001 + 0101000033000033000033000033000033000033000033000033000033010101 + 0033330033330033330033330033330033330033330033330033330101010066 + 3300663300663300663300663300663300663300663300663301010100993300 + 993300993300993300993300993300993300993300993301010100CC3300CC33 + 00CC3300CC3300CC3300CC3300CC3300CC3300CC3301010100FF3300FF3300FF + 3300FF3300FF3300FF3300FF3300FF3300FF3301010100006600006600006600 + 0066000066000066000066000066000066010101003366003366003366003366 + 0033660033660033660033660033660101010066660066660066660066660066 + 6600666600666600666600666601010100996600996600996600996600996600 + 996600996600996600996601010100CC6600CC6600CC6600CC6600CC6600CC66 + 00CC6600CC6600CC6601010100FF6600FF6600FF6600FF6600FF6600FF6600FF + 6600FF6600FF6601010100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000330000330000330000330000330000330000330000330000330001 + 0101006600006600006600006600006600006600006600006600006600010101 + 00990000990000990000990000990000990000990000990000990001010100CC + 0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0001010100FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00010101000033000033 + 0000330000330000330000330000330000330000330101010033330033330033 + 3300333300333300333300333300333300333301010100663300663300663300 + 6633006633006633006633006633006633010101009933009933009933009933 + 00993300993300993300993300993301010100CC3300CC3300CC3300CC3300CC + 3300CC3300CC3300CC3300CC3301010100FF3300FF3300FF3300FF3300FF3300 + FF3300FF3300FF3300FF33010101000066000066000066000066000066000066 + 0000660000660000660101010033660033660033660033660033660033660033 + 6600336600336601010100666600666600666600666600666600666600666600 + 6666006666010101009966009966009966009966009966009966009966009966 + 00996601010100CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC + 6601010100FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6601 + 0101000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000001010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101} + OnMouseDown = imgPaletteMouseDown + OnMouseMove = imgPaletteMouseMove + end + end + end + object SpTBXPanel1: TSpTBXPanel + Left = 0 + Top = 0 + Width = 213 + Height = 26 + Caption = 'SpTBXPanel1' + Align = alTop + TabOrder = 1 + OnDrawBackground = SpTBXPanel1DrawBackground + DesignSize = ( + 213 + 26) + object btnColorNone: TSpTBXSpeedButton + Left = 170 + Top = 3 + Width = 20 + Height = 20 + Anchors = [akTop, akRight] + OnClick = btnColorNoneClick + OnMouseEnter = btnColorNoneMouseEnter + OnMouseLeave = btnColorNoneMouseLeave + Images = ImageList1 + ImageIndex = 1 + OnDraw = btnColorDialogDraw + end + object btnColorDialog: TSpTBXSpeedButton + Left = 190 + Top = 3 + Width = 20 + Height = 20 + Anchors = [akTop, akRight] + OnClick = btnColorDialogClick + OnMouseEnter = btnColorDialogMouseEnter + OnMouseLeave = btnColorDialogMouseLeave + Images = ImageList1 + ImageIndex = 0 + OnDraw = btnColorDialogDraw + end + object btnColor: TSpTBXSpeedButton + Left = 2 + Top = 2 + Width = 50 + Height = 22 + OnDraw = btnColorDraw + end + object btnLabel: TSpTBXLabel + Left = 58 + Top = 3 + Width = 47 + Height = 19 + Caption = 'btnLabel' + end + end + object Timer1: TTimer + Interval = 25 + OnTimer = Timer1Timer + Left = 112 + Top = 152 + end + object ImageList1: TImageList + Left = 72 + Top = 152 + Bitmap = { + 494C010102000500040010001000FFFFFFFFFF00FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000001000000001002000000000000010 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000040404000404 + 0400040404000404040004040400040404000404040004040400040404000404 + 0400040404000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000161616001616 + 1600222222001616160016161600222222001616160016161600161616001616 + 160016161600000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFF + FF00FFFFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000033000033 + 3300003333000033330033330000333300003333000033000000330033003300 + 330033003300000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFF + FF00FFFFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000066000033 + 6600006666000066330033660000666600006633000066000000660033006600 + 660033006600000000000000000000000000000000000000000000000000C0C0 + C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0 + C000C0C0C0000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000003399000066 + 9900009999000099660066990000999900009933000099000000990066009900 + 990033009900000000000000000000000000000000000000000000000000C0C0 + C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0 + C000C0C0C0000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000033CC000066 + CC0000CCCC0000CC660066CC0000CCCC0000CC660000CC000000CC006600CC00 + CC006600CC00000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFF + FF00FFFFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000033FF000066 + FF0000FFFF0000FF660099FF0000FFFF0000FF660000FF000000FF009900CC00 + FF006600FF00000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFF + FF00FFFFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000033FF003399 + FF0033FFFF0033FF990099FF3300FFFF3300FF993300FF333300FF339900FF33 + FF006633FF00000000000000000000000000000000000000000000000000C0C0 + C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0 + C000C0C0C0000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000003366FF006699 + FF0066FFFF0066FF9900CCFF6600FFFF6600FF996600FF666600FF66CC00FF66 + FF009966FF00000000000000000000000000000000000000000000000000C0C0 + C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0 + C000C0C0C0000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000807CFF0099CC + FF0099FFFF0099FFCC00CCFF9900FFFF9900FFCC9900FF999900FF99CC00FF99 + FF009999FF00000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFF + FF00FFFFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000009999FF0099CC + FF0099FFFF0099FFCC00CCFF9900FFFF9900FFCCCC00FFCCCC00FF99CC00FF99 + FF00CC99FF00000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFF + FF00FFFFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000CCCCFF00CCCC + FF00CCFFFF00CCFFCC00CCFFCC00FFFFCC00FFCCCC00FFCCCC00FFCCCC00FFCC + FF00CCCCFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000040000000100000000100010000000000800000000000000000000000 + 000000000000000000000000FFFFFF00FFFFFFFF00000000FFFFFFFF00000000 + C007C00300000000C007C00300000000C007C00300000000C007C00300000000 + C007C00300000000C007C00300000000C007C00300000000C007C00300000000 + C007C00300000000C007C00300000000C007C00300000000C007C00300000000 + FFFFFFFF00000000FFFFFFFF00000000} + end + object ColorDialog1: TColorDialog + Options = [cdFullOpen] + Left = 144 + Top = 152 + end +end diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXColorPickerForm.hpp b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXColorPickerForm.hpp new file mode 100644 index 0000000..9e79a40 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXColorPickerForm.hpp @@ -0,0 +1,164 @@ +// CodeGear C++Builder +// Copyright (c) 1995, 2008 by CodeGear +// All rights reserved + +// (DO NOT EDIT: machine generated header) 'Sptbxcolorpickerform.pas' rev: 20.00 + +#ifndef SptbxcolorpickerformHPP +#define SptbxcolorpickerformHPP + +#pragma delphiheader begin +#pragma option push +#pragma option -w- // All warnings off +#pragma option -Vx // Zero-length empty class member functions +#pragma pack(push,8) +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit + +//-- user supplied ----------------------------------------------------------- + +namespace Sptbxcolorpickerform +{ +//-- type declarations ------------------------------------------------------- +class DELPHICLASS TSpTBXColorPickerDragObject; +class PASCALIMPLEMENTATION TSpTBXColorPickerDragObject : public Controls::TDragControlObject +{ + typedef Controls::TDragControlObject inherited; + +protected: + virtual Controls::TCursor __fastcall GetDragCursor(bool Accepted, int X, int Y); +public: + /* TBaseDragControlObject.Create */ inline __fastcall virtual TSpTBXColorPickerDragObject(Controls::TControl* AControl) : Controls::TDragControlObject(AControl) { } + +public: + /* TObject.Destroy */ inline __fastcall virtual ~TSpTBXColorPickerDragObject(void) { } + +}; + + +class DELPHICLASS TSpTBXColorEditPopupMenu; +class PASCALIMPLEMENTATION TSpTBXColorEditPopupMenu : public Sptbxformpopupmenu::TSpTBXFormPopupMenu +{ + typedef Sptbxformpopupmenu::TSpTBXFormPopupMenu inherited; + +protected: + virtual void __fastcall DoGetPopupFormClass(Forms::TCustomFormClass &AFormClass); + virtual bool __fastcall InternalPopup(int X, int Y, bool ForceFocus, Controls::TControl* PopupControl = (Controls::TControl*)(0x0)); + +public: + __fastcall virtual TSpTBXColorEditPopupMenu(Classes::TComponent* AOwner); +public: + /* TSpTBXFormPopupMenu.Destroy */ inline __fastcall virtual ~TSpTBXColorEditPopupMenu(void) { } + +}; + + +class DELPHICLASS TSpTBXColorPickerForm; +class PASCALIMPLEMENTATION TSpTBXColorPickerForm : public Forms::TForm +{ + typedef Forms::TForm inherited; + +__published: + Extctrls::TTimer* Timer1; + Extctrls::TImage* imgColorPicker; + Sptbxtabs::TSpTBXTabControl* SpTBXTabControl1; + Sptbxtabs::TSpTBXTabItem* SpTBXTabItem1; + Sptbxtabs::TSpTBXTabSheet* SpTBXTabSheet1; + Sptbxtabs::TSpTBXTabItem* SpTBXTabItem2; + Sptbxtabs::TSpTBXTabSheet* SpTBXTabSheet2; + Extctrls::TImage* imgPalette; + Sptbxcontrols::TSpTBXSpeedButton* btnColorPicker; + Sptbxtabs::TSpTBXTabItem* SpTBXTabItem3; + Sptbxtabs::TSpTBXTabSheet* SpTBXTabSheet3; + Controls::TImageList* ImageList1; + Sptbxexteditors::TSpTBXColorListBox* SpTBXColorListBox1; + Dialogs::TColorDialog* ColorDialog1; + Sptbxcontrols::TSpTBXPanel* SpTBXPanel1; + Sptbxcontrols::TSpTBXSpeedButton* btnColorNone; + Sptbxcontrols::TSpTBXSpeedButton* btnColorDialog; + Sptbxcontrols::TSpTBXSpeedButton* btnColor; + Sptbxcontrols::TSpTBXLabel* btnLabel; + void __fastcall Timer1Timer(System::TObject* Sender); + void __fastcall imgPaletteMouseMove(System::TObject* Sender, Classes::TShiftState Shift, int X, int Y); + void __fastcall btnColorPickerStartDrag(System::TObject* Sender, Controls::TDragObject* &DragObject); + void __fastcall FormCreate(System::TObject* Sender); + void __fastcall btnColorPickerEndDrag(System::TObject* Sender, System::TObject* Target, int X, int Y); + void __fastcall FormResize(System::TObject* Sender); + void __fastcall SpTBXTabControl1ActiveTabChange(System::TObject* Sender, int TabIndex); + void __fastcall SpTBXColorListBox1Click(System::TObject* Sender); + void __fastcall FormShow(System::TObject* Sender); + void __fastcall FormDestroy(System::TObject* Sender); + void __fastcall btnColorDraw(System::TObject* Sender, Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxitem::TSpTBXPaintStage PaintStage, bool &PaintDefault); + void __fastcall btnColorNoneClick(System::TObject* Sender); + void __fastcall btnColorNoneMouseEnter(System::TObject* Sender); + void __fastcall btnColorDialogClick(System::TObject* Sender); + void __fastcall btnColorDialogMouseEnter(System::TObject* Sender); + void __fastcall btnColorDialogDraw(System::TObject* Sender, Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxitem::TSpTBXPaintStage PaintStage, bool &PaintDefault); + void __fastcall SpTBXPanel1DrawBackground(System::TObject* Sender, Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxitem::TSpTBXPaintStage PaintStage, bool &PaintDefault); + void __fastcall btnColorDialogMouseLeave(System::TObject* Sender); + void __fastcall btnColorNoneMouseLeave(System::TObject* Sender); + void __fastcall imgPaletteMouseDown(System::TObject* Sender, Controls::TMouseButton Button, Classes::TShiftState Shift, int X, int Y); + +protected: + Graphics::TColor FSelectedColor; + Graphics::TColor FPrevLabelColor; + TSpTBXColorPickerDragObject* FColorPickerDragObject; + void __fastcall CenterImages(void); + +public: + Graphics::TColor __fastcall GetSelectedColor(void); + void __fastcall SetSelectedColor(Graphics::TColor AColor); + void __fastcall UpdateColorLabel(Graphics::TColor AColor, int AButtonType = 0xffffffff); + __property Graphics::TColor SelectedColor = {read=FSelectedColor, write=FSelectedColor, nodefault}; +public: + /* TCustomForm.Create */ inline __fastcall virtual TSpTBXColorPickerForm(Classes::TComponent* AOwner) : Forms::TForm(AOwner) { } + /* TCustomForm.CreateNew */ inline __fastcall virtual TSpTBXColorPickerForm(Classes::TComponent* AOwner, int Dummy) : Forms::TForm(AOwner, Dummy) { } + /* TCustomForm.Destroy */ inline __fastcall virtual ~TSpTBXColorPickerForm(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXColorPickerForm(HWND ParentWindow) : Forms::TForm(ParentWindow) { } + +}; + + +//-- var, const, procedure --------------------------------------------------- +static const ShortInt crSpTBXEyeDropper = 0x67; +extern PACKAGE System::ResourceString _SSpTBXTransparentColor; +#define Sptbxcolorpickerform_SSpTBXTransparentColor System::LoadResourceString(&Sptbxcolorpickerform::_SSpTBXTransparentColor) +extern PACKAGE System::ResourceString _SSpTBXColorPicker; +#define Sptbxcolorpickerform_SSpTBXColorPicker System::LoadResourceString(&Sptbxcolorpickerform::_SSpTBXColorPicker) +extern PACKAGE void __fastcall SpScreenShot(const Types::TRect &SourceR, Graphics::TCanvas* DestCanvas, const Types::TRect &DestR); +extern PACKAGE void __fastcall SpScreenShotMagnify(Graphics::TCanvas* DestCanvas, const Types::TRect &DestR, bool DrawCrosshair, /* out */ Graphics::TColor &CenterColor, double ZoomFactor = 2.000000E+02); + +} /* namespace Sptbxcolorpickerform */ +using namespace Sptbxcolorpickerform; +#pragma pack(pop) +#pragma option pop + +#pragma delphiheader end. +//-- end unit ---------------------------------------------------------------- +#endif // SptbxcolorpickerformHPP diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXColorPickerForm.pas b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXColorPickerForm.pas new file mode 100644 index 0000000..fce712b --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXColorPickerForm.pas @@ -0,0 +1,522 @@ +unit SpTBXColorPickerForm; + +{============================================================================== +Version 2.4.2 + +The contents of this file are subject to the SpTBXLib License; you may +not use or distribute this file except in compliance with the +SpTBXLib License. +A copy of the SpTBXLib License may be found in SpTBXLib-LICENSE.txt or at: + http://www.silverpointdevelopment.com/sptbxlib/SpTBXLib-LICENSE.htm + +Alternatively, the contents of this file may be used under the terms of the +Mozilla Public License Version 1.1 (the "MPL v1.1"), in which case the provisions +of the MPL v1.1 are applicable instead of those in the SpTBXLib License. +A copy of the MPL v1.1 may be found in MPL-LICENSE.txt or at: + http://www.mozilla.org/MPL/ + +If you wish to allow use of your version of this file only under the terms of +the MPL v1.1 and not to allow others to use your version of this file under the +SpTBXLib License, indicate your decision by deleting the provisions +above and replace them with the notice and other provisions required by the +MPL v1.1. If you do not delete the provisions above, a recipient may use your +version of this file under either the SpTBXLib License or the MPL v1.1. + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for +the specific language governing rights and limitations under the License. + +The initial developer of this code is Robert Lee. + +Requirements: +For Delphi/C++Builder 2009 or newer: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org +For Delphi/C++Builder 7-2007: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org + - Troy Wolbrink's TNT Unicode Controls + http://www.tntware.com/delphicontrols/unicode/ + +Development notes: + - All the Windows and Delphi bugs fixes are marked with '[Bugfix]'. + - All the theme changes and adjustments are marked with '[Theme-Change]'. + +To Do: + - Rotated caption painting. + +Known Issues: + - + +History: + - + +==============================================================================} + +interface + +{$BOOLEVAL OFF} // Unit depends on short-circuit boolean evaluation + +uses + Windows, Messages, Classes, SysUtils, Controls, Graphics, ImgList, Forms, + Menus, StdCtrls, ExtCtrls, ActnList, Dialogs, + TB2Dock, TB2Toolbar, TB2Item, TB2ExtItems, + SpTBXSkins, SpTBXItem, SpTBXControls, SpTBXEditors, SpTBXFormPopupMenu, + SpTBXExtEditors, SpTBXTabs; + +type + { TSpTBXColorPickerDragObject } + + TSpTBXColorPickerDragObject = class(TDragControlObject) + protected + function GetDragCursor(Accepted: Boolean; X, Y: Integer): TCursor; override; + end; + + { TSpTBXColorEditPopupMenu } + + TSpTBXColorEditPopupMenu = class(TSpTBXFormPopupMenu) + protected + procedure DoGetPopupFormClass(var AFormClass: TCustomFormClass); override; + function InternalPopup(X, Y: Integer; ForceFocus: Boolean; PopupControl: TControl = nil): Boolean; override; + public + constructor Create(AOwner: TComponent); override; + end; + + { TSpTBXColorPickerForm } + + TSpTBXColorPickerForm = class(TForm) + Timer1: TTimer; + imgColorPicker: TImage; + SpTBXTabControl1: TSpTBXTabControl; + SpTBXTabItem1: TSpTBXTabItem; + SpTBXTabSheet1: TSpTBXTabSheet; + SpTBXTabItem2: TSpTBXTabItem; + SpTBXTabSheet2: TSpTBXTabSheet; + imgPalette: TImage; + btnColorPicker: TSpTBXSpeedButton; + SpTBXTabItem3: TSpTBXTabItem; + SpTBXTabSheet3: TSpTBXTabSheet; + ImageList1: TImageList; + SpTBXColorListBox1: TSpTBXColorListBox; + ColorDialog1: TColorDialog; + SpTBXPanel1: TSpTBXPanel; + btnColorNone: TSpTBXSpeedButton; + btnColorDialog: TSpTBXSpeedButton; + btnColor: TSpTBXSpeedButton; + btnLabel: TSpTBXLabel; + procedure Timer1Timer(Sender: TObject); + procedure imgPaletteMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure btnColorPickerStartDrag(Sender: TObject; + var DragObject: TDragObject); + procedure FormCreate(Sender: TObject); + procedure btnColorPickerEndDrag(Sender, Target: TObject; X, Y: Integer); + procedure FormResize(Sender: TObject); + procedure SpTBXTabControl1ActiveTabChange(Sender: TObject; + TabIndex: Integer); + procedure SpTBXColorListBox1Click(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure btnColorDraw(Sender: TObject; ACanvas: TCanvas; + ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); + procedure btnColorNoneClick(Sender: TObject); + procedure btnColorNoneMouseEnter(Sender: TObject); + procedure btnColorDialogClick(Sender: TObject); + procedure btnColorDialogMouseEnter(Sender: TObject); + procedure btnColorDialogDraw(Sender: TObject; ACanvas: TCanvas; + ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); + procedure SpTBXPanel1DrawBackground(Sender: TObject; ACanvas: TCanvas; + ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); + procedure btnColorDialogMouseLeave(Sender: TObject); + procedure btnColorNoneMouseLeave(Sender: TObject); + procedure imgPaletteMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + protected + FSelectedColor: TColor; + FPrevLabelColor: TColor; + FColorPickerDragObject: TSpTBXColorPickerDragObject; + procedure CenterImages; + public + function GetSelectedColor: TColor; + procedure SetSelectedColor(AColor: TColor); + procedure UpdateColorLabel(AColor: TColor; AButtonType: Integer = -1); + property SelectedColor: TColor read FSelectedColor write FSelectedColor; + end; + +{ Helpers } +procedure SpScreenShot(SourceR: TRect; DestCanvas: TCanvas; DestR: TRect); +procedure SpScreenShotMagnify(DestCanvas: TCanvas; DestR: TRect; DrawCrosshair: Boolean; out CenterColor: TColor; ZoomFactor: Double = 200); + +const + crSpTBXEyeDropper = 103; // Cursor ID used for Eye Dropper cursor + +resourcestring + SSpTBXTransparentColor = 'Transparent Color'; + SSpTBXColorPicker = 'Color Picker'; + +implementation + +{$R *.dfm} + +uses + Themes, UxTheme; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Helpers } + +procedure SpScreenShot(SourceR: TRect; DestCanvas: TCanvas; DestR: TRect); +var + DesktopDC: HDC; +begin + DesktopDC := GetDC(0); + try + Windows.StretchBlt( + DestCanvas.Handle, DestR.Left, DestR.Top, DestR.Right - DestR.Left, DestR.Bottom - DestR.Top, + DesktopDC, SourceR.Left, SourceR.Top, SourceR.Right - SourceR.Left, SourceR.Bottom - SourceR.Top, + SRCCOPY); + finally + ReleaseDC(0, DesktopDC); + end; +end; + +procedure SpScreenShotMagnify(DestCanvas: TCanvas; DestR: TRect; DrawCrosshair: Boolean; out CenterColor: TColor; ZoomFactor: Double = 200); +var + W, H, zoomW, zoomH: integer; + CursorP, CenterP: TPoint; + SourceR: TRect; + Multiplier: Double; +begin + GetCursorPos(CursorP); + + W := DestR.Right - DestR.Left; + H := DestR.Bottom - DestR.Top; + + // Get the zoom width and height + if ZoomFactor < 0 then ZoomFactor := 100; + Multiplier := ZoomFactor / 100; + zoomW := Round(W * Multiplier); + zoomH := Round(H * Multiplier); + + // Get the zoomed Rect + SourceR.Left := CursorP.X - (zoomW div 2); + SourceR.Top := CursorP.Y - (zoomH div 2); + SourceR.Right := SourceR.Left + zoomW; + SourceR.Bottom := SourceR.Top + zoomH; + + DestCanvas.Lock; + try + // Draw the screenshot + DestCanvas.FillRect(DestR); + SpScreenShot(SourceR, DestCanvas, DestR); + CenterP := Point(W div 2, H div 2); + CenterColor := DestCanvas.Pixels[CenterP.X, CenterP.Y]; + + // Draw the crosshair + if DrawCrosshair then begin + DestCanvas.MoveTo(CenterP.X - (CenterP.X div 2), CenterP.Y); + DestCanvas.LineTo(CenterP.X + (CenterP.X div 2), CenterP.Y); + DestCanvas.MoveTo(CenterP.X, CenterP.Y - (CenterP.Y div 2)); + DestCanvas.LineTo(CenterP.X, CenterP.Y + (CenterP.Y div 2)); + end; + finally + DestCanvas.Unlock; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXColorPickerDragObject } + +function TSpTBXColorPickerDragObject.GetDragCursor(Accepted: Boolean; X, + Y: Integer): TCursor; +begin + // Make sure we always use crSpTBXEyeDropper + Result := crSpTBXEyeDropper; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXColorEditPopupMenu } + +constructor TSpTBXColorEditPopupMenu.Create(AOwner: TComponent); +begin + inherited; + BorderStyle := pbsSizeableRightBottom; +end; + +procedure TSpTBXColorEditPopupMenu.DoGetPopupFormClass(var AFormClass: TCustomFormClass); +begin + AFormClass := TSpTBXColorPickerForm; + inherited DoGetPopupFormClass(AFormClass); +end; + +function TSpTBXColorEditPopupMenu.InternalPopup(X, Y: Integer; + ForceFocus: Boolean; PopupControl: TControl): Boolean; +begin + if Assigned(PopupControl) and (PopupControl is TSpTBXColorEdit) then + SkinType := TSpTBXColorEdit(PopupControl).SkinType; + Result := inherited InternalPopup(X, Y, ForceFocus, PopupControl); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXColorPickerForm } + +procedure TSpTBXColorPickerForm.FormCreate(Sender: TObject); +begin + SpTBXTabControl1.DoubleBuffered := True; + imgPalette.Cursor := crSpTBXEyeDropper; +end; + +procedure TSpTBXColorPickerForm.FormDestroy(Sender: TObject); +begin + FreeAndNil(FColorPickerDragObject); +end; + +procedure TSpTBXColorPickerForm.FormResize(Sender: TObject); +begin + CenterImages; +end; + +procedure TSpTBXColorPickerForm.FormShow(Sender: TObject); +var + T: TSpTBXSkinType; +begin + if Assigned(ActiveFormPopupMenu) then begin + T := ActiveFormPopupMenu.SkinType; + SkinManager.ChangeControlSkinType(Self, T); + if T <> sknSkin then + SpTBXTabControl1.TabBackgroundColor := clBtnFace; + end; + + UpdateColorLabel(GetSelectedColor); + CenterImages; +end; + +procedure TSpTBXColorPickerForm.CenterImages; +begin + // Center the images + case SpTBXTabControl1.ActiveTabIndex of + 0: begin + imgPalette.Left := (imgPalette.Parent.Width - imgPalette.Width) div 2; + imgPalette.Top := (imgPalette.Parent.Height - imgPalette.Height) div 2; + end; + 2: begin + imgColorPicker.Picture := nil; + end; + end; +end; + +procedure TSpTBXColorPickerForm.btnColorDraw(Sender: TObject; + ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +begin + if PaintStage = pstPrePaint then begin + PaintDefault := False; + InflateRect(ARect, -3, -3); + if btnColor.CaptionGlowColor = clNone then + SpDrawCheckeredBackground(ACanvas, ARect) + else begin + ACanvas.Brush.Color := btnColor.CaptionGlowColor; + ACanvas.FillRect(ARect); + end; + SpDrawRectangle(ACanvas, ARect, 0, clBtnShadow, clBtnHighlight); + end; +end; + +procedure TSpTBXColorPickerForm.btnColorDialogClick(Sender: TObject); +var + EditButton: TSpTBXColorEditButton; + P: TSpTBXFormPopupMenu; +begin + P := ActiveFormPopupMenu; + if Assigned(P) and Assigned(P.PopupComponent) and (P.PopupComponent is TSpTBXColorEditButton) then begin + EditButton := TSpTBXColorEditButton(P.PopupComponent); + Parent.Visible := False; + ColorDialog1.Color := btnColor.CaptionGlowColor; + if ColorDialog1.Execute then + EditButton.SelectedColor := ColorDialog1.Color; + P.ClosePopup(False); + end; +end; + +procedure TSpTBXColorPickerForm.btnColorDialogDraw(Sender: TObject; + ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +// Used by btnColorDialog and btnColorNone +var + B: TSpTBXSpeedButton; + Flags: Integer; + State: TSpTBXSkinStatesType; +begin + if (PaintStage = pstPrePaint) and (Sender is TSpTBXSpeedButton) then begin + PaintDefault := False; + B := Sender as TSpTBXSpeedButton; + if B.MouseInControl then begin + case SpTBXSkinType(SpTBXPanel1.SkinType) of + sknNone: + PaintDefault := True; + sknWindows: + begin + if B.Pushed then Flags := TS_PRESSED + else Flags := TS_HOT; + DrawThemeBackground(ThemeServices.Theme[teToolBar], ACanvas.Handle, TP_BUTTON, Flags, ARect, nil); + end; + sknSkin: + begin + if B.Pushed then State := sknsPushed + else State := sknsHotTrack; + CurrentSkin.PaintBackground(ACanvas, ARect, skncToolbarItem, State, True, True); + end; + end; + end; + end; +end; + +procedure TSpTBXColorPickerForm.btnColorDialogMouseEnter(Sender: TObject); +begin + FPrevLabelColor := btnColor.CaptionGlowColor; + btnLabel.Caption := SSpTBXColorPicker; +end; + +procedure TSpTBXColorPickerForm.btnColorDialogMouseLeave(Sender: TObject); +begin + UpdateColorLabel(FPrevLabelColor); +end; + +procedure TSpTBXColorPickerForm.btnColorNoneClick(Sender: TObject); +begin + SetSelectedColor(clNone); +end; + +procedure TSpTBXColorPickerForm.btnColorNoneMouseEnter(Sender: TObject); +begin + FPrevLabelColor := btnColor.CaptionGlowColor; + UpdateColorLabel(clNone); +end; + +procedure TSpTBXColorPickerForm.btnColorNoneMouseLeave(Sender: TObject); +begin + UpdateColorLabel(FPrevLabelColor); +end; + +procedure TSpTBXColorPickerForm.btnColorPickerStartDrag(Sender: TObject; + var DragObject: TDragObject); +begin + FColorPickerDragObject := TSpTBXColorPickerDragObject.Create(btnColorPicker); + DragObject := FColorPickerDragObject; +end; + +procedure TSpTBXColorPickerForm.btnColorPickerEndDrag(Sender, Target: TObject; X, + Y: Integer); +begin + if Assigned(FColorPickerDragObject) then + if FColorPickerDragObject.Dropped then + SetSelectedColor(btnColor.CaptionGlowColor); + FreeAndNil(FColorPickerDragObject); +end; + +procedure TSpTBXColorPickerForm.imgPaletteMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + SetSelectedColor(btnColor.CaptionGlowColor); +end; + +procedure TSpTBXColorPickerForm.imgPaletteMouseMove(Sender: TObject; Shift: TShiftState; + X, Y: Integer); +var + C: TColor; +begin + C := imgPalette.Picture.Bitmap.Canvas.Pixels[X, Y]; + if C <> $00010101 then + UpdateColorLabel(C); +end; + +procedure TSpTBXColorPickerForm.SpTBXTabControl1ActiveTabChange(Sender: TObject; + TabIndex: Integer); +begin + CenterImages; +end; + +procedure TSpTBXColorPickerForm.SpTBXColorListBox1Click(Sender: TObject); +begin + SetSelectedColor(SpTBXColorListBox1.Selected); +end; + +procedure TSpTBXColorPickerForm.SpTBXPanel1DrawBackground(Sender: TObject; + ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +begin + if PaintStage = pstPrePaint then begin + PaintDefault := False; + SpDrawXPDock(ACanvas, ARect, SpTBXPanel1.SkinType); + SpDrawXPToolbar(ACanvas, ARect, SpTBXPanel1.SkinType, True, False, False, True, False); + end; +end; + +procedure TSpTBXColorPickerForm.Timer1Timer(Sender: TObject); +var + CursorP: TPoint; + Zoom: Double; + C: TColor; +begin + if not IsIconic(Application.Handle) then begin + GetCursorPos(CursorP); + CursorP := ScreenToClient(CursorP); + if btnColorPicker.Dragging and not PtInRect(ClientRect, CursorP) then begin + if not imgColorPicker.Visible then begin + imgColorPicker.Visible := True; + btnColorPicker.Visible := False; + SpTBXTabControl1.InvalidateBackground; + end; + Zoom := 100 / 5; // x5 factor + SpScreenShotMagnify(imgColorPicker.Canvas, Rect(0, 0, imgColorPicker.Width, imgColorPicker.Height), True, C, Zoom); + UpdateColorLabel(C); + end + else + if imgColorPicker.Visible then begin + imgColorPicker.Visible := False; + btnColorPicker.Visible := True; + SpTBXTabControl1.InvalidateBackground; + end; + end; +end; + +function TSpTBXColorPickerForm.GetSelectedColor: TColor; +var + B: TSpTBXColorEditButton; +begin + Result := clNone; + if Assigned(ActiveFormPopupMenu) then + if Assigned(ActiveFormPopupMenu.PopupComponent) and (ActiveFormPopupMenu.PopupComponent is TSpTBXColorEditButton) then begin + B := TSpTBXColorEditButton(ActiveFormPopupMenu.PopupComponent); + Result := B.SelectedColor; + end; +end; + +procedure TSpTBXColorPickerForm.SetSelectedColor(AColor: TColor); +var + B: TSpTBXColorEditButton; +begin + // Inform the ActiveFormPopupMenu that a selection was made. + UpdateColorLabel(AColor); + FSelectedColor := AColor; + if Assigned(ActiveFormPopupMenu) then begin + if Assigned(ActiveFormPopupMenu.PopupComponent) and (ActiveFormPopupMenu.PopupComponent is TSpTBXColorEditButton) then begin + B := TSpTBXColorEditButton(ActiveFormPopupMenu.PopupComponent); + B.SelectedColor := AColor; + end; + ActiveFormPopupMenu.ClosePopup(True); + end; +end; + +procedure TSpTBXColorPickerForm.UpdateColorLabel(AColor: TColor; AButtonType: Integer = -1); +begin + btnColor.CaptionGlowColor := AColor; + if AColor = clNone then + btnLabel.Caption := SSpTBXTransparentColor + else + btnLabel.Caption := SpColorToHTML(AColor); +end; + +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXControls.dcu b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXControls.dcu new file mode 100644 index 0000000000000000000000000000000000000000..fe618becc592a7d83103466e89e36e601f968403 GIT binary patch literal 178847 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 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXControls.hpp b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXControls.hpp new file mode 100644 index 0000000..8a06ffd --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXControls.hpp @@ -0,0 +1,1306 @@ +// CodeGear C++Builder +// Copyright (c) 1995, 2008 by CodeGear +// All rights reserved + +// (DO NOT EDIT: machine generated header) 'Sptbxcontrols.pas' rev: 20.00 + +#ifndef SptbxcontrolsHPP +#define SptbxcontrolsHPP + +#pragma delphiheader begin +#pragma option push +#pragma option -w- // All warnings off +#pragma option -Vx // Zero-length empty class member functions +#pragma pack(push,8) +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit + +//-- user supplied ----------------------------------------------------------- + +namespace Sptbxcontrols +{ +//-- type declarations ------------------------------------------------------- +typedef Classes::TStrings* TTntStrings; + +#pragma option push -b- +enum TSpTBXPanelBorder { pbrRaised, pbrDoubleRaised, pbrSunken, pbrDoubleSunken, pbrBumped, pbrEtched, pbrFramed }; +#pragma option pop + +#pragma option push -b- +enum TSpTBXProgressCaption { pctNone, pctDefault, pctPercentage, pctProgress }; +#pragma option pop + +#pragma option push -b- +enum TSpTBXTickMark { tmxBottomRight, tmxTopLeft, tmxBoth, tmxCenter }; +#pragma option pop + +typedef void __fastcall (__closure *TSpTBXCanResizeEvent)(System::TObject* Sender, int &NewSize, bool &Accept); + +class DELPHICLASS TSpTBXCustomPanel; +class PASCALIMPLEMENTATION TSpTBXCustomPanel : public Sptbxitem::TSpTBXCustomControl +{ + typedef Sptbxitem::TSpTBXCustomControl inherited; + +private: + bool FBorders; + TSpTBXPanelBorder FBorderType; + bool FTBXStyleBackground; + Sptbxskins::TSpTBXSkinType FSkinType; + Sptbxitem::TSpTBXDrawEvent FOnDrawBackground; + void __fastcall SetBorders(const bool Value); + void __fastcall SetBorderType(const TSpTBXPanelBorder Value); + void __fastcall SetTBXStyleBackground(const bool Value); + void __fastcall SetSkinType(const Sptbxskins::TSpTBXSkinType Value); + HIDESBASE MESSAGE void __fastcall CMFontChanged(Messages::TMessage &Message); + MESSAGE void __fastcall CMSpTBXControlsInvalidate(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall WMEraseBkgnd(Messages::TMessage &Message); + MESSAGE void __fastcall WMSpSkinChange(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall WMWindowPosChanged(Messages::TWMWindowPosMsg &Message); + +protected: + Graphics::TBitmap* FBackground; + virtual void __fastcall AdjustClientRect(Types::TRect &Rect); + virtual void __fastcall CreateParams(Controls::TCreateParams &Params); + virtual void __fastcall DrawBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect); + virtual void __fastcall DoDrawBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxitem::TSpTBXPaintStage PaintStage, bool &PaintDefault); + __property bool Borders = {read=FBorders, write=SetBorders, default=1}; + __property TSpTBXPanelBorder BorderType = {read=FBorderType, write=SetBorderType, default=5}; + __property ParentColor = {default=0}; + __property bool TBXStyleBackground = {read=FTBXStyleBackground, write=SetTBXStyleBackground, default=0}; + __property Sptbxitem::TSpTBXDrawEvent OnDrawBackground = {read=FOnDrawBackground, write=FOnDrawBackground}; + +public: + __fastcall virtual TSpTBXCustomPanel(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXCustomPanel(void); + virtual void __fastcall InvalidateBackground(bool InvalidateChildren = true); + +__published: + __property Caption; + __property Hint; + __property Color = {default=536870911}; + __property Sptbxskins::TSpTBXSkinType SkinType = {read=FSkinType, write=SetSkinType, default=2}; +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXCustomPanel(HWND ParentWindow) : Sptbxitem::TSpTBXCustomControl(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXPanel; +class PASCALIMPLEMENTATION TSpTBXPanel : public TSpTBXCustomPanel +{ + typedef TSpTBXCustomPanel inherited; + +private: + bool FHotTracking; + bool FHotTrack; + bool FChildFocused; + void __fastcall SetHotTrack(const bool Value); + void __fastcall SetHotTracking(const bool Value); + HIDESBASE MESSAGE void __fastcall CMMouseEnter(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall CMMouseLeave(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall CMFocusChanged(Controls::TCMFocusChanged &Message); + +protected: + virtual void __fastcall DrawBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect); + +public: + __property bool HotTracking = {read=FHotTracking, nodefault}; + +__published: + __property Align = {default=0}; + __property Anchors = {default=3}; + __property AutoSize = {default=0}; + __property BiDiMode; + __property Constraints; + __property UseDockManager = {default=0}; + __property DockSite = {default=0}; + __property DragCursor = {default=-12}; + __property DragKind = {default=0}; + __property DragMode = {default=0}; + __property Enabled = {default=1}; + __property Font; + __property ParentBiDiMode = {default=1}; + __property ParentColor = {default=0}; + __property ParentFont = {default=1}; + __property ParentShowHint = {default=1}; + __property PopupMenu; + __property ShowHint; + __property TabOrder = {default=-1}; + __property TabStop = {default=0}; + __property Visible = {default=1}; + __property OnCanResize; + __property OnClick; + __property OnConstrainedResize; + __property OnContextPopup; + __property OnDockDrop; + __property OnDockOver; + __property OnDblClick; + __property OnDragDrop; + __property OnDragOver; + __property OnEndDock; + __property OnEndDrag; + __property OnEnter; + __property OnExit; + __property OnGetSiteInfo; + __property OnMouseDown; + __property OnMouseMove; + __property OnMouseUp; + __property OnResize; + __property OnStartDock; + __property OnStartDrag; + __property OnUnDock; + __property Borders = {default=1}; + __property BorderType = {default=5}; + __property bool HotTrack = {read=FHotTrack, write=SetHotTrack, default=0}; + __property TBXStyleBackground = {default=0}; + __property OnDrawBackground; +public: + /* TSpTBXCustomPanel.Create */ inline __fastcall virtual TSpTBXPanel(Classes::TComponent* AOwner) : TSpTBXCustomPanel(AOwner) { } + /* TSpTBXCustomPanel.Destroy */ inline __fastcall virtual ~TSpTBXPanel(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXPanel(HWND ParentWindow) : TSpTBXCustomPanel(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXCustomGroupBox; +class PASCALIMPLEMENTATION TSpTBXCustomGroupBox : public TSpTBXCustomPanel +{ + typedef TSpTBXCustomPanel inherited; + +private: + HIDESBASE MESSAGE void __fastcall CMDialogChar(Messages::TWMKey &Message); + HIDESBASE MESSAGE void __fastcall CMTextChanged(Messages::TMessage &Message); + +protected: + virtual void __fastcall AdjustClientRect(Types::TRect &Rect); + virtual void __fastcall DrawBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect); + +public: + __fastcall virtual TSpTBXCustomGroupBox(Classes::TComponent* AOwner); +public: + /* TSpTBXCustomPanel.Destroy */ inline __fastcall virtual ~TSpTBXCustomGroupBox(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXCustomGroupBox(HWND ParentWindow) : TSpTBXCustomPanel(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXGroupBox; +class PASCALIMPLEMENTATION TSpTBXGroupBox : public TSpTBXCustomGroupBox +{ + typedef TSpTBXCustomGroupBox inherited; + +__published: + __property Align = {default=0}; + __property Anchors = {default=3}; + __property BiDiMode; + __property Color = {default=536870911}; + __property Constraints; + __property UseDockManager = {default=0}; + __property DockSite = {default=0}; + __property DragCursor = {default=-12}; + __property DragKind = {default=0}; + __property DragMode = {default=0}; + __property Enabled = {default=1}; + __property Font; + __property ParentBiDiMode = {default=1}; + __property ParentColor = {default=0}; + __property ParentFont = {default=1}; + __property ParentShowHint = {default=1}; + __property PopupMenu; + __property ShowHint; + __property TabOrder = {default=-1}; + __property TabStop = {default=0}; + __property Visible = {default=1}; + __property OnCanResize; + __property OnClick; + __property OnConstrainedResize; + __property OnContextPopup; + __property OnDockDrop; + __property OnDockOver; + __property OnDblClick; + __property OnDragDrop; + __property OnDragOver; + __property OnEndDock; + __property OnEndDrag; + __property OnEnter; + __property OnExit; + __property OnGetSiteInfo; + __property OnMouseDown; + __property OnMouseMove; + __property OnMouseUp; + __property OnResize; + __property OnStartDock; + __property OnStartDrag; + __property OnUnDock; + __property Borders = {default=1}; + __property BorderType = {default=5}; + __property TBXStyleBackground = {default=0}; + __property OnDrawBackground; +public: + /* TSpTBXCustomGroupBox.Create */ inline __fastcall virtual TSpTBXGroupBox(Classes::TComponent* AOwner) : TSpTBXCustomGroupBox(AOwner) { } + +public: + /* TSpTBXCustomPanel.Destroy */ inline __fastcall virtual ~TSpTBXGroupBox(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXGroupBox(HWND ParentWindow) : TSpTBXCustomGroupBox(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXTextObjectActionLink; +class PASCALIMPLEMENTATION TSpTBXTextObjectActionLink : public Controls::TControlActionLink +{ + typedef Controls::TControlActionLink inherited; + +public: + /* TBasicActionLink.Create */ inline __fastcall virtual TSpTBXTextObjectActionLink(System::TObject* AClient) : Controls::TControlActionLink(AClient) { } + /* TBasicActionLink.Destroy */ inline __fastcall virtual ~TSpTBXTextObjectActionLink(void) { } + +}; + + +class DELPHICLASS TSpTBXTextObject; +class PASCALIMPLEMENTATION TSpTBXTextObject : public Sptbxitem::TSpTBXCustomControl +{ + typedef Sptbxitem::TSpTBXCustomControl inherited; + +private: + Classes::TAlignment FAlignment; + Sptbxskins::TSpGlowDirection FCaptionGlow; + Graphics::TColor FCaptionGlowColor; + Sptbxskins::TSpTextRotationAngle FCaptionRoatationAngle; + bool FChecked; + bool FDisabledIconCorrection; + bool FDrawPushedCaption; + Sptbxskins::TSpGlyphLayout FGlyphLayout; + Imglist::TCustomImageList* FImages; + Imglist::TChangeLink* FImageChangeLink; + Imglist::TImageIndex FImageIndex; + System::WideString FLinkText; + System::WideString FLinkTextParams; + bool FMouseInControl; + bool FPushed; + Sptbxskins::TSpTBXSkinType FSkinType; + bool FSpaceAsClick; + bool FShowAccelChar; + bool FUpdating; + Sptbxitem::TTextWrapping FWrapping; + Sptbxitem::TSpTBXDrawEvent FOnDraw; + Sptbxitem::TSpTBXDrawTextEvent FOnDrawCaption; + Sptbxitem::TSpTBXDrawHintEvent FOnDrawHint; + Sptbxitem::TSpTBXGetImageIndexEvent FOnGetImageIndex; + Classes::TNotifyEvent FOnMouseEnter; + Classes::TNotifyEvent FOnMouseLeave; + void __fastcall ReadLinkFont(Classes::TReader* Reader); + void __fastcall ImageListChange(System::TObject* Sender); + void __fastcall UpdateTracking(bool ForceMouseLeave = false); + void __fastcall SetAlignment(const Classes::TAlignment Value); + void __fastcall SetCaptionGlow(const Sptbxskins::TSpGlowDirection Value); + void __fastcall SetCaptionGlowColor(const Graphics::TColor Value); + void __fastcall SetCaptionRoatationAngle(const Sptbxskins::TSpTextRotationAngle Value); + void __fastcall SetGlyphLayout(const Sptbxskins::TSpGlyphLayout Value); + void __fastcall SetImageIndex(const Imglist::TImageIndex Value); + void __fastcall SetImages(const Imglist::TCustomImageList* Value); + void __fastcall SetSkinType(const Sptbxskins::TSpTBXSkinType Value); + void __fastcall SetShowAccelChar(bool Value); + void __fastcall SetWrapping(Sptbxitem::TTextWrapping Value); + HIDESBASE MESSAGE void __fastcall CMEnabledChanged(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall CMFontChanged(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall CMHintShow(Controls::TCMHintShow &Message); + HIDESBASE MESSAGE void __fastcall CMMouseEnter(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall CMMouseLeave(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall CMTextChanged(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall WMEraseBkgnd(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall WMKillFocus(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall WMSetFocus(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall WMSetCursor(Messages::TWMSetCursor &Message); + MESSAGE void __fastcall WMSpSkinChange(Messages::TMessage &Message); + +protected: + virtual void __fastcall AdjustFont(Graphics::TFont* AFont); + void __fastcall AdjustBounds(void); + virtual void __fastcall DoDrawHint(Graphics::TBitmap* AHintBitmap, System::WideString &AHint, bool &PaintDefault); + virtual bool __fastcall DoDrawItem(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxitem::TSpTBXPaintStage PaintStage); + virtual int __fastcall DoDrawText(Graphics::TCanvas* ACanvas, Types::TRect &ARect, int Flags); + virtual void __fastcall DoGetImageIndex(Imglist::TCustomImageList* &AImageList, int &AImageIndex); + virtual void __fastcall DoInternalGlyphDraw(Graphics::TCanvas* ACanvas, const Types::TRect &AGlyphRect); + virtual Types::TRect __fastcall GetFocusRect(const Types::TRect &R, const Types::TRect &TextR, const Types::TRect &GlyphR); + virtual Types::TRect __fastcall GetTextMargins(); + bool __fastcall IsImageIndexValid(void); + virtual void __fastcall Paint(void); + virtual bool __fastcall CanAutoSize(int &NewWidth, int &NewHeight); + virtual void __fastcall DoAdjustBounds(int &NewWidth, int &NewHeight); + virtual bool __fastcall GetFocused(void); + virtual bool __fastcall GetPushed(void); + virtual void __fastcall DoMouseEnter(void); + virtual void __fastcall DoMouseLeave(void); + DYNAMIC void __fastcall MouseDown(Controls::TMouseButton Button, Classes::TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseMove(Classes::TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseUp(Controls::TMouseButton Button, Classes::TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall KeyDown(System::Word &Key, Classes::TShiftState Shift); + DYNAMIC void __fastcall KeyUp(System::Word &Key, Classes::TShiftState Shift); + DYNAMIC void __fastcall ActionChange(System::TObject* Sender, bool CheckDefaults); + virtual void __fastcall CreateParams(Controls::TCreateParams &Params); + virtual void __fastcall DefineProperties(Classes::TFiler* Filer); + virtual void __fastcall ExecuteLink(void); + DYNAMIC Controls::TControlActionLinkClass __fastcall GetActionLinkClass(void); + virtual bool __fastcall GetChecked(void); + virtual void __fastcall SetChecked(bool Value); + virtual void __fastcall Loaded(void); + virtual void __fastcall Notification(Classes::TComponent* AComponent, Classes::TOperation Operation); + __property Classes::TAlignment Alignment = {read=FAlignment, write=SetAlignment, default=0}; + __property AutoSize = {default=1}; + __property bool Checked = {read=GetChecked, write=SetChecked, default=0}; + __property Sptbxskins::TSpGlowDirection CaptionGlow = {read=FCaptionGlow, write=SetCaptionGlow, default=0}; + __property Graphics::TColor CaptionGlowColor = {read=FCaptionGlowColor, write=SetCaptionGlowColor, default=65535}; + __property Sptbxskins::TSpTextRotationAngle CaptionRoatationAngle = {read=FCaptionRoatationAngle, write=SetCaptionRoatationAngle, default=0}; + __property bool DrawPushedCaption = {read=FDrawPushedCaption, write=FDrawPushedCaption, default=0}; + __property bool DisabledIconCorrection = {read=FDisabledIconCorrection, write=FDisabledIconCorrection, default=1}; + __property Sptbxskins::TSpGlyphLayout GlyphLayout = {read=FGlyphLayout, write=SetGlyphLayout, default=0}; + __property Imglist::TCustomImageList* Images = {read=FImages, write=SetImages}; + __property Imglist::TImageIndex ImageIndex = {read=FImageIndex, write=SetImageIndex, default=-1}; + __property System::WideString LinkText = {read=FLinkText, write=FLinkText}; + __property System::WideString LinkTextParams = {read=FLinkTextParams, write=FLinkTextParams}; + __property Sptbxskins::TSpTBXSkinType SkinType = {read=FSkinType, write=SetSkinType, default=2}; + __property bool ShowAccelChar = {read=FShowAccelChar, write=SetShowAccelChar, default=1}; + __property bool SpaceAsClick = {read=FSpaceAsClick, write=FSpaceAsClick, default=0}; + __property Sptbxitem::TTextWrapping Wrapping = {read=FWrapping, write=SetWrapping, default=0}; + __property Sptbxitem::TSpTBXDrawEvent OnDraw = {read=FOnDraw, write=FOnDraw}; + __property Sptbxitem::TSpTBXDrawTextEvent OnDrawCaption = {read=FOnDrawCaption, write=FOnDrawCaption}; + __property Sptbxitem::TSpTBXDrawHintEvent OnDrawHint = {read=FOnDrawHint, write=FOnDrawHint}; + __property Sptbxitem::TSpTBXGetImageIndexEvent OnGetImageIndex = {read=FOnGetImageIndex, write=FOnGetImageIndex}; + __property Classes::TNotifyEvent OnMouseEnter = {read=FOnMouseEnter, write=FOnMouseEnter}; + __property Classes::TNotifyEvent OnMouseLeave = {read=FOnMouseLeave, write=FOnMouseLeave}; + __property TabStop = {default=1}; + __property ParentColor = {default=0}; + +public: + __fastcall virtual TSpTBXTextObject(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXTextObject(void); + DYNAMIC bool __fastcall CanFocus(void); + DYNAMIC void __fastcall Click(void); + DYNAMIC Classes::TAlignment __fastcall GetControlsAlignment(void); + virtual void __fastcall GetSize(/* out */ Types::TRect &TotalR, /* out */ Types::TRect &TextR, /* out */ Types::TRect &GlyphR); + unsigned __fastcall GetTextFlags(void); + virtual tagSIZE __fastcall GetGlyphSize(); + __property Canvas; + __property bool MouseInControl = {read=FMouseInControl, nodefault}; + __property bool Pushed = {read=GetPushed, nodefault}; + +__published: + __property Caption; + __property Hint; + __property Color = {default=536870911}; +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXTextObject(HWND ParentWindow) : Sptbxitem::TSpTBXCustomControl(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXCustomLabel; +class PASCALIMPLEMENTATION TSpTBXCustomLabel : public TSpTBXTextObject +{ + typedef TSpTBXTextObject inherited; + +private: + Controls::TWinControl* FFocusControl; + bool FUnderline; + Graphics::TColor FUnderlineColor; + void __fastcall SetFocusControl(const Controls::TWinControl* Value); + void __fastcall SetUnderline(const bool Value); + void __fastcall SetUnderlineColor(const Graphics::TColor Value); + HIDESBASE MESSAGE void __fastcall CMDialogChar(Messages::TWMKey &Message); + +protected: + virtual void __fastcall AdjustFont(Graphics::TFont* AFont); + virtual bool __fastcall DoDrawItem(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxitem::TSpTBXPaintStage PaintStage); + virtual void __fastcall Notification(Classes::TComponent* AComponent, Classes::TOperation Operation); + __property Controls::TWinControl* FocusControl = {read=FFocusControl, write=SetFocusControl}; + __property bool Underline = {read=FUnderline, write=SetUnderline, default=0}; + __property Graphics::TColor UnderlineColor = {read=FUnderlineColor, write=SetUnderlineColor, default=-16777200}; + +public: + __fastcall virtual TSpTBXCustomLabel(Classes::TComponent* AOwner); + virtual void __fastcall GetSize(/* out */ Types::TRect &TotalR, /* out */ Types::TRect &TextR, /* out */ Types::TRect &GlyphR); +public: + /* TSpTBXTextObject.Destroy */ inline __fastcall virtual ~TSpTBXCustomLabel(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXCustomLabel(HWND ParentWindow) : TSpTBXTextObject(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXLabel; +class PASCALIMPLEMENTATION TSpTBXLabel : public TSpTBXCustomLabel +{ + typedef TSpTBXCustomLabel inherited; + +__published: + __property Action; + __property Align = {default=0}; + __property Anchors = {default=3}; + __property AutoSize = {default=1}; + __property BiDiMode; + __property Color = {default=536870911}; + __property Constraints; + __property DragCursor = {default=-12}; + __property DragKind = {default=0}; + __property DragMode = {default=0}; + __property Enabled = {default=1}; + __property Font; + __property ParentBiDiMode = {default=1}; + __property ParentColor = {default=0}; + __property ParentFont = {default=1}; + __property ParentShowHint = {default=1}; + __property PopupMenu; + __property ShowAccelChar = {default=1}; + __property ShowHint; + __property Visible = {default=1}; + __property Wrapping = {default=0}; + __property OnClick; + __property OnContextPopup; + __property OnDblClick; + __property OnDragDrop; + __property OnDragOver; + __property OnEndDock; + __property OnEndDrag; + __property OnMouseDown; + __property OnMouseEnter; + __property OnMouseLeave; + __property OnMouseMove; + __property OnMouseUp; + __property OnStartDock; + __property OnStartDrag; + __property Alignment = {default=0}; + __property CaptionGlow = {default=0}; + __property CaptionGlowColor = {default=65535}; + __property FocusControl; + __property GlyphLayout = {default=0}; + __property Images; + __property ImageIndex = {default=-1}; + __property LinkText; + __property LinkTextParams; + __property SkinType = {default=2}; + __property Underline = {default=0}; + __property UnderlineColor = {default=-16777200}; + __property OnDraw; + __property OnDrawCaption; + __property OnDrawHint; + __property OnGetImageIndex; +public: + /* TSpTBXCustomLabel.Create */ inline __fastcall virtual TSpTBXLabel(Classes::TComponent* AOwner) : TSpTBXCustomLabel(AOwner) { } + +public: + /* TSpTBXTextObject.Destroy */ inline __fastcall virtual ~TSpTBXLabel(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXLabel(HWND ParentWindow) : TSpTBXCustomLabel(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXButtonControl; +class PASCALIMPLEMENTATION TSpTBXButtonControl : public TSpTBXTextObject +{ + typedef TSpTBXTextObject inherited; + +private: + bool FAllowAllUp; + int FGroupIndex; + bool FStateChanged; + void __fastcall SetAllowAllUp(const bool Value); + void __fastcall SetGroupIndex(const int Value); + HIDESBASE MESSAGE void __fastcall CMDialogChar(Messages::TWMKey &Message); + MESSAGE void __fastcall CMSPGroupIndexUpdate(Messages::TMessage &Message); + +protected: + virtual bool __fastcall CanUpdateExclusive(void); + virtual void __fastcall SetChecked(bool Value); + void __fastcall UpdateExclusive(void); + __property bool AllowAllUp = {read=FAllowAllUp, write=SetAllowAllUp, default=0}; + __property int GroupIndex = {read=FGroupIndex, write=SetGroupIndex, default=0}; + __property bool StateChanged = {read=FStateChanged, write=FStateChanged, nodefault}; + +public: + __fastcall virtual TSpTBXButtonControl(Classes::TComponent* AOwner); + DYNAMIC bool __fastcall CanFocus(void); +public: + /* TSpTBXTextObject.Destroy */ inline __fastcall virtual ~TSpTBXButtonControl(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXButtonControl(HWND ParentWindow) : TSpTBXTextObject(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXCustomCheckButton; +class PASCALIMPLEMENTATION TSpTBXCustomCheckButton : public TSpTBXButtonControl +{ + typedef TSpTBXButtonControl inherited; + +protected: + virtual void __fastcall Toggle(void); + +public: + virtual tagSIZE __fastcall GetGlyphSize(); + virtual void __fastcall GetSize(/* out */ Types::TRect &TotalR, /* out */ Types::TRect &TextR, /* out */ Types::TRect &GlyphR); +public: + /* TSpTBXButtonControl.Create */ inline __fastcall virtual TSpTBXCustomCheckButton(Classes::TComponent* AOwner) : TSpTBXButtonControl(AOwner) { } + +public: + /* TSpTBXTextObject.Destroy */ inline __fastcall virtual ~TSpTBXCustomCheckButton(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXCustomCheckButton(HWND ParentWindow) : TSpTBXButtonControl(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXCustomCheckBox; +class PASCALIMPLEMENTATION TSpTBXCustomCheckBox : public TSpTBXCustomCheckButton +{ + typedef TSpTBXCustomCheckButton inherited; + +private: + bool FAllowGrayed; + Stdctrls::TCheckBoxState FState; + void __fastcall SetState(const Stdctrls::TCheckBoxState Value); + +protected: + virtual void __fastcall AdjustFont(Graphics::TFont* AFont); + virtual void __fastcall DoInternalGlyphDraw(Graphics::TCanvas* ACanvas, const Types::TRect &AGlyphRect); + virtual bool __fastcall GetChecked(void); + virtual void __fastcall SetChecked(bool Value); + virtual void __fastcall Toggle(void); + __property bool AllowGrayed = {read=FAllowGrayed, write=FAllowGrayed, default=0}; + __property Stdctrls::TCheckBoxState State = {read=FState, write=SetState, default=0}; + +public: + __fastcall virtual TSpTBXCustomCheckBox(Classes::TComponent* AOwner); + DYNAMIC void __fastcall Click(void); +public: + /* TSpTBXTextObject.Destroy */ inline __fastcall virtual ~TSpTBXCustomCheckBox(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXCustomCheckBox(HWND ParentWindow) : TSpTBXCustomCheckButton(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXCheckBox; +class PASCALIMPLEMENTATION TSpTBXCheckBox : public TSpTBXCustomCheckBox +{ + typedef TSpTBXCustomCheckBox inherited; + +__published: + __property Action; + __property Align = {default=0}; + __property Anchors = {default=3}; + __property AutoSize = {default=1}; + __property BiDiMode; + __property Color = {default=536870911}; + __property Constraints; + __property DragCursor = {default=-12}; + __property DragKind = {default=0}; + __property DragMode = {default=0}; + __property Enabled = {default=1}; + __property Font; + __property ParentBiDiMode = {default=1}; + __property ParentColor = {default=0}; + __property ParentFont = {default=1}; + __property ParentShowHint = {default=1}; + __property PopupMenu; + __property ShowAccelChar = {default=1}; + __property ShowHint; + __property TabOrder = {default=-1}; + __property TabStop = {default=1}; + __property Visible = {default=1}; + __property Wrapping = {default=0}; + __property OnClick; + __property OnContextPopup; + __property OnDblClick; + __property OnDragDrop; + __property OnDragOver; + __property OnEndDock; + __property OnEndDrag; + __property OnMouseDown; + __property OnMouseEnter; + __property OnMouseLeave; + __property OnMouseMove; + __property OnMouseUp; + __property OnStartDock; + __property OnStartDrag; + __property Alignment = {default=0}; + __property AllowGrayed = {default=0}; + __property CaptionGlow = {default=0}; + __property CaptionGlowColor = {default=65535}; + __property Checked = {default=0}; + __property State = {default=0}; + __property SkinType = {default=2}; + __property OnDraw; + __property OnDrawCaption; + __property OnDrawHint; + __property OnGetImageIndex; +public: + /* TSpTBXCustomCheckBox.Create */ inline __fastcall virtual TSpTBXCheckBox(Classes::TComponent* AOwner) : TSpTBXCustomCheckBox(AOwner) { } + +public: + /* TSpTBXTextObject.Destroy */ inline __fastcall virtual ~TSpTBXCheckBox(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXCheckBox(HWND ParentWindow) : TSpTBXCustomCheckBox(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXCustomRadioButton; +class PASCALIMPLEMENTATION TSpTBXCustomRadioButton : public TSpTBXCustomCheckButton +{ + typedef TSpTBXCustomCheckButton inherited; + +private: + HIDESBASE MESSAGE void __fastcall CMFocusChanged(Controls::TCMFocusChanged &Message); + +protected: + virtual void __fastcall AdjustFont(Graphics::TFont* AFont); + virtual bool __fastcall CanUpdateExclusive(void); + virtual void __fastcall DoInternalGlyphDraw(Graphics::TCanvas* ACanvas, const Types::TRect &AGlyphRect); + virtual void __fastcall SetChecked(bool Value); + virtual void __fastcall Toggle(void); + __property TabStop = {default=0}; + +public: + __fastcall virtual TSpTBXCustomRadioButton(Classes::TComponent* AOwner); + DYNAMIC void __fastcall Click(void); +public: + /* TSpTBXTextObject.Destroy */ inline __fastcall virtual ~TSpTBXCustomRadioButton(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXCustomRadioButton(HWND ParentWindow) : TSpTBXCustomCheckButton(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXRadioButton; +class PASCALIMPLEMENTATION TSpTBXRadioButton : public TSpTBXCustomRadioButton +{ + typedef TSpTBXCustomRadioButton inherited; + +__published: + __property Action; + __property Align = {default=0}; + __property Anchors = {default=3}; + __property AutoSize = {default=1}; + __property BiDiMode; + __property Color = {default=536870911}; + __property Constraints; + __property DragCursor = {default=-12}; + __property DragKind = {default=0}; + __property DragMode = {default=0}; + __property Enabled = {default=1}; + __property Font; + __property ParentBiDiMode = {default=1}; + __property ParentColor = {default=0}; + __property ParentFont = {default=1}; + __property ParentShowHint = {default=1}; + __property PopupMenu; + __property ShowAccelChar = {default=1}; + __property ShowHint; + __property TabOrder = {default=-1}; + __property TabStop = {default=0}; + __property Visible = {default=1}; + __property Wrapping = {default=0}; + __property OnClick; + __property OnContextPopup; + __property OnDblClick; + __property OnDragDrop; + __property OnDragOver; + __property OnEndDock; + __property OnEndDrag; + __property OnMouseDown; + __property OnMouseEnter; + __property OnMouseLeave; + __property OnMouseMove; + __property OnMouseUp; + __property OnStartDock; + __property OnStartDrag; + __property Alignment = {default=0}; + __property CaptionGlow = {default=0}; + __property CaptionGlowColor = {default=65535}; + __property Checked = {default=0}; + __property GroupIndex = {default=0}; + __property SkinType = {default=2}; + __property OnDraw; + __property OnDrawCaption; + __property OnDrawHint; + __property OnGetImageIndex; +public: + /* TSpTBXCustomRadioButton.Create */ inline __fastcall virtual TSpTBXRadioButton(Classes::TComponent* AOwner) : TSpTBXCustomRadioButton(AOwner) { } + +public: + /* TSpTBXTextObject.Destroy */ inline __fastcall virtual ~TSpTBXRadioButton(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXRadioButton(HWND ParentWindow) : TSpTBXCustomRadioButton(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXCustomRadioGroup; +class PASCALIMPLEMENTATION TSpTBXCustomRadioGroup : public TSpTBXCustomGroupBox +{ + typedef TSpTBXCustomGroupBox inherited; + +private: + Classes::TList* FButtons; + Classes::TStrings* FItems; + int FItemIndex; + int FColumns; + bool FReading; + bool FUpdating; + TSpTBXRadioButton* __fastcall GetButtons(int Index); + void __fastcall ArrangeButtons(void); + void __fastcall ButtonClick(System::TObject* Sender); + void __fastcall ItemsChange(System::TObject* Sender); + void __fastcall SetButtonCount(int Value); + void __fastcall SetColumns(int Value); + void __fastcall SetItemIndex(int Value); + void __fastcall SetItems(Classes::TStrings* Value); + void __fastcall UpdateButtons(void); + HIDESBASE MESSAGE void __fastcall CMEnabledChanged(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall CMFontChanged(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall WMSize(Messages::TWMSize &Message); + +protected: + virtual void __fastcall Loaded(void); + virtual void __fastcall ReadState(Classes::TReader* Reader); + __property int Columns = {read=FColumns, write=SetColumns, default=1}; + __property int ItemIndex = {read=FItemIndex, write=SetItemIndex, default=-1}; + __property Classes::TStrings* Items = {read=FItems, write=SetItems}; + +public: + __fastcall virtual TSpTBXCustomRadioGroup(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXCustomRadioGroup(void); + DYNAMIC void __fastcall GetChildren(Classes::TGetChildProc Proc, Classes::TComponent* Root); + DYNAMIC void __fastcall FlipChildren(bool AllLevels); + virtual void __fastcall InvalidateBackground(bool InvalidateChildren = true); + virtual void __fastcall SetFocus(void); + __property TSpTBXRadioButton* Buttons[int Index] = {read=GetButtons}; +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXCustomRadioGroup(HWND ParentWindow) : TSpTBXCustomGroupBox(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXRadioGroup; +class PASCALIMPLEMENTATION TSpTBXRadioGroup : public TSpTBXCustomRadioGroup +{ + typedef TSpTBXCustomRadioGroup inherited; + +__published: + __property Align = {default=0}; + __property Anchors = {default=3}; + __property BiDiMode; + __property Color = {default=536870911}; + __property Constraints; + __property UseDockManager = {default=0}; + __property DockSite = {default=0}; + __property DragCursor = {default=-12}; + __property DragKind = {default=0}; + __property DragMode = {default=0}; + __property Enabled = {default=1}; + __property Font; + __property ParentBiDiMode = {default=1}; + __property ParentColor = {default=0}; + __property ParentFont = {default=1}; + __property ParentShowHint = {default=1}; + __property PopupMenu; + __property ShowHint; + __property TabOrder = {default=-1}; + __property TabStop = {default=0}; + __property Visible = {default=1}; + __property OnCanResize; + __property OnClick; + __property OnConstrainedResize; + __property OnContextPopup; + __property OnDockDrop; + __property OnDockOver; + __property OnDblClick; + __property OnDragDrop; + __property OnDragOver; + __property OnEndDock; + __property OnEndDrag; + __property OnEnter; + __property OnExit; + __property OnGetSiteInfo; + __property OnMouseDown; + __property OnMouseMove; + __property OnMouseUp; + __property OnResize; + __property OnStartDock; + __property OnStartDrag; + __property OnUnDock; + __property Borders = {default=1}; + __property BorderType = {default=5}; + __property TBXStyleBackground = {default=0}; + __property OnDrawBackground; + __property Columns = {default=1}; + __property ItemIndex = {default=-1}; + __property Items; +public: + /* TSpTBXCustomRadioGroup.Create */ inline __fastcall virtual TSpTBXRadioGroup(Classes::TComponent* AOwner) : TSpTBXCustomRadioGroup(AOwner) { } + /* TSpTBXCustomRadioGroup.Destroy */ inline __fastcall virtual ~TSpTBXRadioGroup(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXRadioGroup(HWND ParentWindow) : TSpTBXCustomRadioGroup(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXCustomButton; +class PASCALIMPLEMENTATION TSpTBXCustomButton : public TSpTBXButtonControl +{ + typedef TSpTBXButtonControl inherited; + +private: + Graphics::TBitmap* FBitmap; + bool FBitmapTransparent; + bool FActive; + bool FCancel; + bool FDefault; + bool FDropDownArrow; + Menus::TPopupMenu* FDropDownMenu; + bool FDropDownMenuVisible; + bool FFlat; + Controls::TModalResult FModalResult; + bool FRepeating; + Extctrls::TTimer* FRepeatTimer; + void __fastcall BitmapChanged(System::TObject* Sender); + void __fastcall RepeatTimerHandler(System::TObject* Sender); + void __fastcall SetBitmap(const Graphics::TBitmap* Value); + void __fastcall SetDefault(const bool Value); + void __fastcall SetDropDownArrow(const bool Value); + void __fastcall SetDropdownMenu(Menus::TPopupMenu* Value); + void __fastcall SetFlat(const bool Value); + HIDESBASE MESSAGE void __fastcall CMDialogKey(Messages::TWMKey &Message); + HIDESBASE MESSAGE void __fastcall CMFocusChanged(Controls::TCMFocusChanged &Message); + MESSAGE void __fastcall CMSPPopupClose(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall WMCancelMode(Messages::TWMNoParams &Message); + +protected: + Controls::TControl* FPopupControl; + virtual void __fastcall CreateWnd(void); + virtual void __fastcall AdjustFont(Graphics::TFont* AFont); + bool __fastcall BitmapValid(void); + virtual bool __fastcall DoDrawDropDownArrow(Graphics::TCanvas* ACanvas, const Types::TRect &ARect); + virtual bool __fastcall DoDrawItem(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxitem::TSpTBXPaintStage PaintStage); + virtual bool __fastcall GetFocused(void); + virtual Types::TRect __fastcall GetFocusRect(const Types::TRect &R, const Types::TRect &TextR, const Types::TRect &GlyphR); + virtual Menus::TPopupMenu* __fastcall GetInternalDropDownMenu(void); + virtual bool __fastcall GetPushed(void); + virtual Types::TRect __fastcall GetTextMargins(); + DYNAMIC void __fastcall MouseDown(Controls::TMouseButton Button, Classes::TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseUp(Controls::TMouseButton Button, Classes::TShiftState Shift, int X, int Y); + virtual void __fastcall Notification(Classes::TComponent* AComponent, Classes::TOperation Operation); + __property Alignment = {default=2}; + __property Graphics::TBitmap* Bitmap = {read=FBitmap, write=SetBitmap}; + __property bool BitmapTransparent = {read=FBitmapTransparent, write=FBitmapTransparent, default=1}; + __property DrawPushedCaption = {default=1}; + __property bool Cancel = {read=FCancel, write=FCancel, default=0}; + __property bool Default = {read=FDefault, write=SetDefault, default=0}; + __property bool DropDownArrow = {read=FDropDownArrow, write=SetDropDownArrow, default=1}; + __property Menus::TPopupMenu* DropDownMenu = {read=FDropDownMenu, write=SetDropdownMenu}; + __property bool Flat = {read=FFlat, write=SetFlat, default=0}; + __property Controls::TModalResult ModalResult = {read=FModalResult, write=FModalResult, default=0}; + __property bool Repeating = {read=FRepeating, write=FRepeating, default=0}; + +public: + __fastcall virtual TSpTBXCustomButton(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXCustomButton(void); + DYNAMIC void __fastcall Click(void); + Types::TRect __fastcall GetSkinStateRect(); + bool __fastcall IsDroppedDown(void); + virtual void __fastcall StopRepeat(void); +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXCustomButton(HWND ParentWindow) : TSpTBXButtonControl(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXButton; +class PASCALIMPLEMENTATION TSpTBXButton : public TSpTBXCustomButton +{ + typedef TSpTBXCustomButton inherited; + +__published: + __property Action; + __property Align = {default=0}; + __property Anchors = {default=3}; + __property BiDiMode; + __property Color = {default=536870911}; + __property Constraints; + __property DragCursor = {default=-12}; + __property DragKind = {default=0}; + __property DragMode = {default=0}; + __property Enabled = {default=1}; + __property Font; + __property ParentBiDiMode = {default=1}; + __property ParentColor = {default=0}; + __property ParentFont = {default=1}; + __property ParentShowHint = {default=1}; + __property PopupMenu; + __property ShowAccelChar = {default=1}; + __property ShowHint; + __property TabOrder = {default=-1}; + __property TabStop = {default=1}; + __property Visible = {default=1}; + __property Wrapping = {default=0}; + __property OnClick; + __property OnContextPopup; + __property OnDragDrop; + __property OnDragOver; + __property OnEndDock; + __property OnEndDrag; + __property OnMouseDown; + __property OnMouseEnter; + __property OnMouseLeave; + __property OnMouseMove; + __property OnMouseUp; + __property OnStartDock; + __property OnStartDrag; + __property Alignment = {default=2}; + __property Bitmap; + __property BitmapTransparent = {default=1}; + __property Cancel = {default=0}; + __property CaptionGlow = {default=0}; + __property CaptionGlowColor = {default=65535}; + __property Checked = {default=0}; + __property Default = {default=0}; + __property DrawPushedCaption = {default=1}; + __property DropDownArrow = {default=1}; + __property DropDownMenu; + __property Flat = {default=0}; + __property GlyphLayout = {default=0}; + __property GroupIndex = {default=0}; + __property Images; + __property ImageIndex = {default=-1}; + __property LinkText; + __property LinkTextParams; + __property ModalResult = {default=0}; + __property SkinType = {default=2}; + __property Repeating = {default=0}; + __property OnDraw; + __property OnDrawCaption; + __property OnDrawHint; + __property OnGetImageIndex; +public: + /* TSpTBXCustomButton.Create */ inline __fastcall virtual TSpTBXButton(Classes::TComponent* AOwner) : TSpTBXCustomButton(AOwner) { } + /* TSpTBXCustomButton.Destroy */ inline __fastcall virtual ~TSpTBXButton(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXButton(HWND ParentWindow) : TSpTBXCustomButton(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXCustomSpeedButton; +class PASCALIMPLEMENTATION TSpTBXCustomSpeedButton : public TSpTBXCustomButton +{ + typedef TSpTBXCustomButton inherited; + +public: + __fastcall virtual TSpTBXCustomSpeedButton(Classes::TComponent* AOwner); + DYNAMIC bool __fastcall CanFocus(void); + DYNAMIC void __fastcall Click(void); +public: + /* TSpTBXCustomButton.Destroy */ inline __fastcall virtual ~TSpTBXCustomSpeedButton(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXCustomSpeedButton(HWND ParentWindow) : TSpTBXCustomButton(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXSpeedButton; +class PASCALIMPLEMENTATION TSpTBXSpeedButton : public TSpTBXCustomSpeedButton +{ + typedef TSpTBXCustomSpeedButton inherited; + +__published: + __property Action; + __property Align = {default=0}; + __property Anchors = {default=3}; + __property BiDiMode; + __property Color = {default=536870911}; + __property Constraints; + __property DragCursor = {default=-12}; + __property DragKind = {default=0}; + __property DragMode = {default=0}; + __property Enabled = {default=1}; + __property Font; + __property ParentBiDiMode = {default=1}; + __property ParentColor = {default=0}; + __property ParentFont = {default=1}; + __property ParentShowHint = {default=1}; + __property PopupMenu; + __property ShowAccelChar = {default=1}; + __property ShowHint; + __property Visible = {default=1}; + __property Wrapping = {default=0}; + __property OnClick; + __property OnContextPopup; + __property OnDragDrop; + __property OnDragOver; + __property OnEndDock; + __property OnEndDrag; + __property OnMouseDown; + __property OnMouseEnter; + __property OnMouseLeave; + __property OnMouseMove; + __property OnMouseUp; + __property OnStartDock; + __property OnStartDrag; + __property Alignment = {default=2}; + __property AllowAllUp = {default=0}; + __property Bitmap; + __property BitmapTransparent = {default=1}; + __property Cancel = {default=0}; + __property CaptionGlow = {default=0}; + __property CaptionGlowColor = {default=65535}; + __property Checked = {default=0}; + __property Default = {default=0}; + __property DrawPushedCaption = {default=1}; + __property DropDownArrow = {default=1}; + __property DropDownMenu; + __property Flat = {default=0}; + __property GlyphLayout = {default=0}; + __property GroupIndex = {default=0}; + __property Images; + __property ImageIndex = {default=-1}; + __property LinkText; + __property LinkTextParams; + __property SkinType = {default=2}; + __property Repeating = {default=0}; + __property OnDraw; + __property OnDrawCaption; + __property OnDrawHint; + __property OnGetImageIndex; +public: + /* TSpTBXCustomSpeedButton.Create */ inline __fastcall virtual TSpTBXSpeedButton(Classes::TComponent* AOwner) : TSpTBXCustomSpeedButton(AOwner) { } + +public: + /* TSpTBXCustomButton.Destroy */ inline __fastcall virtual ~TSpTBXSpeedButton(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXSpeedButton(HWND ParentWindow) : TSpTBXCustomSpeedButton(ParentWindow) { } + +}; + + +typedef void __fastcall (__closure *TSpTBXProgressBarChangeEvent)(System::TObject* Sender, int NewPosition); + +class DELPHICLASS TSpTBXCustomProgressBar; +class PASCALIMPLEMENTATION TSpTBXCustomProgressBar : public TSpTBXTextObject +{ + typedef TSpTBXTextObject inherited; + +private: + int FMin; + int FMax; + int FPosition; + bool FProgressVisible; + bool FSmooth; + bool FVertical; + TSpTBXProgressCaption FCaptionType; + TSpTBXProgressBarChangeEvent FOnProgressChange; + void __fastcall SetMax(const int Value); + void __fastcall SetMin(const int Value); + void __fastcall SetPosition(int Value); + void __fastcall SetSmooth(const bool Value); + void __fastcall SetVertical(const bool Value); + void __fastcall SetCaptionType(const TSpTBXProgressCaption Value); + void __fastcall SetProgressVisible(const bool Value); + +protected: + virtual void __fastcall AdjustFont(Graphics::TFont* AFont); + virtual bool __fastcall DoDrawItem(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxitem::TSpTBXPaintStage PaintStage); + virtual void __fastcall DoProgressChange(void); + virtual Types::TRect __fastcall GetTextMargins(); + __property Alignment = {default=2}; + __property CaptionGlow = {default=1}; + __property TSpTBXProgressCaption CaptionType = {read=FCaptionType, write=SetCaptionType, default=2}; + __property int Max = {read=FMax, write=SetMax, default=100}; + __property int Min = {read=FMin, write=SetMin, default=0}; + __property int Position = {read=FPosition, write=SetPosition, default=0}; + __property bool ProgressVisible = {read=FProgressVisible, write=SetProgressVisible, default=1}; + __property bool Smooth = {read=FSmooth, write=SetSmooth, default=0}; + __property bool Vertical = {read=FVertical, write=SetVertical, default=0}; + __property TSpTBXProgressBarChangeEvent OnProgressChange = {read=FOnProgressChange, write=FOnProgressChange}; + +public: + __fastcall virtual TSpTBXCustomProgressBar(Classes::TComponent* AOwner); + void __fastcall StepIt(int Delta = 0x1); +public: + /* TSpTBXTextObject.Destroy */ inline __fastcall virtual ~TSpTBXCustomProgressBar(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXCustomProgressBar(HWND ParentWindow) : TSpTBXTextObject(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXProgressBar; +class PASCALIMPLEMENTATION TSpTBXProgressBar : public TSpTBXCustomProgressBar +{ + typedef TSpTBXCustomProgressBar inherited; + +__published: + __property Align = {default=0}; + __property Anchors = {default=3}; + __property Color = {default=536870911}; + __property Constraints; + __property DragCursor = {default=-12}; + __property DragKind = {default=0}; + __property DragMode = {default=0}; + __property Enabled = {default=1}; + __property Font; + __property ParentColor = {default=0}; + __property ParentFont = {default=1}; + __property ParentShowHint = {default=1}; + __property PopupMenu; + __property ShowHint; + __property Visible = {default=1}; + __property OnClick; + __property OnContextPopup; + __property OnDblClick; + __property OnDragDrop; + __property OnDragOver; + __property OnEndDock; + __property OnEndDrag; + __property OnMouseDown; + __property OnMouseEnter; + __property OnMouseLeave; + __property OnMouseMove; + __property OnMouseUp; + __property OnStartDock; + __property OnStartDrag; + __property Alignment = {default=2}; + __property CaptionGlow = {default=1}; + __property CaptionGlowColor = {default=65535}; + __property CaptionType = {default=2}; + __property Max = {default=100}; + __property Min = {default=0}; + __property Position = {default=0}; + __property Smooth = {default=0}; + __property Vertical = {default=0}; + __property SkinType = {default=2}; + __property OnDraw; + __property OnDrawCaption; + __property OnDrawHint; + __property OnProgressChange; +public: + /* TSpTBXCustomProgressBar.Create */ inline __fastcall virtual TSpTBXProgressBar(Classes::TComponent* AOwner) : TSpTBXCustomProgressBar(AOwner) { } + +public: + /* TSpTBXTextObject.Destroy */ inline __fastcall virtual ~TSpTBXProgressBar(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXProgressBar(HWND ParentWindow) : TSpTBXCustomProgressBar(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXTrackBar; +class PASCALIMPLEMENTATION TSpTBXTrackBar : public Comctrls::TTrackBar +{ + typedef Comctrls::TTrackBar inherited; + +private: + Sptbxskins::TSpTBXSkinType FSkinType; + TSpTBXTickMark FTickMarks; + Sptbxitem::TSpTBXDrawEvent FOnDrawChannel; + Sptbxitem::TSpTBXDrawPosEvent FOnDrawChannelTicks; + Sptbxitem::TSpTBXDrawEvent FOnDrawThumb; + bool FCanDrawChannelSelection; + void __fastcall SetSkinType(const Sptbxskins::TSpTBXSkinType Value); + HIDESBASE void __fastcall SetTickMarks(const TSpTBXTickMark Value); + MESSAGE void __fastcall CMSpTBXControlsInvalidate(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall CNNotify(Messages::TWMNotify &Message); + HIDESBASE MESSAGE void __fastcall WMEraseBkGnd(Messages::TMessage &Message); + MESSAGE void __fastcall WMSpSkinChange(Messages::TMessage &Message); + +protected: + virtual void __fastcall CreateParams(Controls::TCreateParams &Params); + virtual bool __fastcall DoDrawChannel(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxitem::TSpTBXPaintStage PaintStage); + virtual bool __fastcall DoDrawChannelTicks(Graphics::TCanvas* ACanvas, int X, int Y); + virtual bool __fastcall DoDrawThumb(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxitem::TSpTBXPaintStage PaintStage); + virtual void __fastcall DrawTicks(Graphics::TCanvas* ACanvas); + +public: + __fastcall virtual TSpTBXTrackBar(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXTrackBar(void); + Types::TRect __fastcall ChannelRect(); + bool __fastcall MouseInThumb(void); + void __fastcall InvalidateBackground(void); + +__published: + __property OnMouseDown; + __property OnMouseMove; + __property OnMouseUp; + __property Sptbxskins::TSpTBXSkinType SkinType = {read=FSkinType, write=SetSkinType, default=2}; + __property TSpTBXTickMark TickMarks = {read=FTickMarks, write=SetTickMarks, default=0}; + __property Sptbxitem::TSpTBXDrawEvent OnDrawChannel = {read=FOnDrawChannel, write=FOnDrawChannel}; + __property Sptbxitem::TSpTBXDrawPosEvent OnDrawChannelTicks = {read=FOnDrawChannelTicks, write=FOnDrawChannelTicks}; + __property Sptbxitem::TSpTBXDrawEvent OnDrawThumb = {read=FOnDrawThumb, write=FOnDrawThumb}; +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXTrackBar(HWND ParentWindow) : Comctrls::TTrackBar(ParentWindow) { } + +}; + + +//-- var, const, procedure --------------------------------------------------- +static const ShortInt ConstStatesCount = 0x4; +static const Word ConstInitRepeatPause = 0x190; +static const ShortInt ConstRepeatPause = 0x64; +static const Word CM_SPGROUPINDEXUPDATE = 0xb8ae; +static const Word CM_SPTBXCONTROLSINVALIDATE = 0xbd05; +extern PACKAGE void __fastcall SpDrawXPPanel(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool Enabled, bool TBXStyleBackground, Sptbxskins::TSpTBXSkinType SkinType, TSpTBXPanelBorder Border); +extern PACKAGE void __fastcall SpDrawXPPanelBorder(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, TSpTBXPanelBorder Border); +extern PACKAGE void __fastcall SpDrawXPGroupBox(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, System::WideString ACaption, unsigned TextFlags, bool Enabled, bool TBXStyleBackground, Sptbxskins::TSpTBXSkinType SkinType); +extern PACKAGE void __fastcall SpDrawXPProgressBar(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, int Min, int Max, int Position, Graphics::TBitmap* Back, Graphics::TBitmap* Fore)/* overload */; +extern PACKAGE int __fastcall SpDrawXPProgressBar(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool Vertical, bool Smooth, bool DrawProgress, int Min, int Max, int Position, Sptbxskins::TSpTBXSkinType SkinType)/* overload */; +extern PACKAGE void __fastcall SpDrawXPTrackBar(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, unsigned Part, bool Vertical, bool Pushed, bool ChannelSelection, TSpTBXTickMark TickMark, int Min, int Max, int SelStart, int SelEnd, Sptbxskins::TSpTBXSkinType SkinType); +extern PACKAGE void __fastcall SpInvalidateSpTBXControl(Controls::TWinControl* AControl, bool InvalidateChildren, bool OnlySpTBXControls); + +} /* namespace Sptbxcontrols */ +using namespace Sptbxcontrols; +#pragma pack(pop) +#pragma option pop + +#pragma delphiheader end. +//-- end unit ---------------------------------------------------------------- +#endif // SptbxcontrolsHPP diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXControls.pas b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXControls.pas new file mode 100644 index 0000000..03f5973 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXControls.pas @@ -0,0 +1,4259 @@ +unit SpTBXControls; + +{============================================================================== +Version 2.4.2 + +The contents of this file are subject to the SpTBXLib License; you may +not use or distribute this file except in compliance with the +SpTBXLib License. +A copy of the SpTBXLib License may be found in SpTBXLib-LICENSE.txt or at: + http://www.silverpointdevelopment.com/sptbxlib/SpTBXLib-LICENSE.htm + +Alternatively, the contents of this file may be used under the terms of the +Mozilla Public License Version 1.1 (the "MPL v1.1"), in which case the provisions +of the MPL v1.1 are applicable instead of those in the SpTBXLib License. +A copy of the MPL v1.1 may be found in MPL-LICENSE.txt or at: + http://www.mozilla.org/MPL/ + +If you wish to allow use of your version of this file only under the terms of +the MPL v1.1 and not to allow others to use your version of this file under the +SpTBXLib License, indicate your decision by deleting the provisions +above and replace them with the notice and other provisions required by the +MPL v1.1. If you do not delete the provisions above, a recipient may use your +version of this file under either the SpTBXLib License or the MPL v1.1. + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for +the specific language governing rights and limitations under the License. + +The initial developer of this code is Robert Lee. + +Requirements: +For Delphi/C++Builder 2009 or newer: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org +For Delphi/C++Builder 7-2007: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org + - Troy Wolbrink's TNT Unicode Controls + http://www.tntware.com/delphicontrols/unicode/ + +Development notes: + - All the theme changes and adjustments are marked with '[Theme-Change]'. + - All the compatibility changes are marked with '[Backward-Compatibility]'. + +History: +8 May 2009 - version 2.4.2 + - Added AllowAllUp property to TSpTBXSpeedButton. + +15 March 2009 - version 2.4.1 + - Added GlyphLayout property to TSpTBXButton/TSpTBXSpeedButton. + - Added Flat property to TSpTBXButton/TSpTBXSpeedButton. + - Fixed TSpTBXTrackBar bug, the Frequency property didn't work, + thanks to Alfred Vink for reporting this. + +17 January 2009 - version 2.4 + - No changes. + +28 September 2008 - version 2.3.1 + - Fixed incorrect TSpTBXGroupBox painting, the control was not + repainted when the font was changed, thanks to Yury Plashenkov + for reporting this. + +26 September 2008 - version 2.3 + - Removed LinkFont property from TSpTBXTextObject, having 2 font + properties to control the text state was a bad idea. + +29 July 2008 - version 2.2 + - Fixed incorrect ProgressBar painting on Windows Vista, + thanks to Arvid for reporting this. + +22 June 2008 - version 2.1 + - No changes. + +3 May 2008 - version 2.0 + - No changes. + +2 April 2008 - version 1.9.5 + - Improved the background painting of TSpTBXPanel. + +3 February 2008 - version 1.9.4 + - No changes. + +19 January 2008 - version 1.9.3 + - Fixed incorrect Autosizing of TSpTBXTextControl, thanks + to Alexey Naumov for reporting this. + +26 December 2007 - version 1.9.2 + - Added State parameter to TSpTBXTextControl.OnDrawCaption + - Fixed incorrect Default property handling of TSpTBXButton, + thanks to Karpushin Matvey and Beta Xiong for reporting this. + +1 December 2007 - version 1.9.1 + - Added various painting enhancements made by Jim. + - Fixed incorrect caption color on the controls when + the Font is changed, thanks to Arvid and Zunyite for + reporting this. + - Fixed incorrect nested panel painting (canvas was not locked), + thanks to Jim for reporting this. + +20 November 2007 - version 1.9 + - Removed TBX dependency. + +8 February 2007 - version 1.8.3 + - Added GripHotTrack property to TSpTBXSplitter. + +17 December 2006 - version 1.8.2 + - Added AutoSize property to TSpTBXPanel. + - Fixed incorrect resizing behavior on TSpTBXSplitter when a + DockablePanel was adjacent. + +24 November 2006 - version 1.8.1 + - Improved TSpTBXPanel painting, thanks to Jim Kueneman for + his code donation. + - Fixed incorrect focus behavior on TSpTBXRadioButton when used + on a groupbox, thanks to Andrew for reporting this. + +27 August 2006 - version 1.8 + - Added DropDownArrow property to TSpTBXButton and TSpTBXSpeedButton. + - Fixed incorrect TSpTBXGroupBox painting when changing the + Enabled property, thanks to Tomaz Kunaver for reporting this. + +15 June 2006 - version 1.7 + - Fixed incorrect TSpTBXButton painting when using a bitmap + skin and the DropDownMenu is shown, thanks to Boris Yankov + for reporting this. + +4 May 2006 - version 1.6 + - New component added, TSpTBXRadioGroup. + +12 April 2006 - version 1.5 + - No changes. + +27 February 2006 - version 1.4 + - Added GroupIndex property to TSpTBXButton and TSpTBXSpeedButton. + +10 February 2006 - version 1.3 + - New component added, TSpTBXSpeedButton. + - New component added, TSpTBXSplitter. + - Fixed incorrect TSpTBXButton behavior when trying to close the + DropDownMenu clicking the button, thanks to Alexey Naumov for + reporting this. + +==============================================================================} + +interface + +{$BOOLEVAL OFF} // Unit depends on short-circuit boolean evaluation + +uses + Windows, Messages, Classes, SysUtils, Forms, Controls, Graphics, ImgList, + Menus, StdCtrls, ExtCtrls, ComCtrls, ActnList, + {$IFNDEF UNICODE} + TntClasses, TntControls, + {$ENDIF} + TB2Dock, TB2Toolbar, TB2Item, SpTBXItem, SpTBXSkins; + +{$IFDEF UNICODE} +type + TTntStrings = TStrings; +{$ENDIF} + +const + ConstStatesCount = 4; // Buttons have 4 states (normal, hottrack, pushed, disabled) + ConstInitRepeatPause = 400; // Delay of the first repeated click (ms) + ConstRepeatPause = 100; // Interval of the repeated clicks (ms) + CM_SPGROUPINDEXUPDATE = CM_BASE + 2222; // Message sent to the controls to update its state based on the GroupIndex + CM_SPTBXCONTROLSINVALIDATE = CM_BASE + 3333; // Message sent to SpTBX controls to invalidate the background + +type + TSpTBXTextObject = class; + + TSpTBXPanelBorder = ( + pbrRaised, + pbrDoubleRaised, + pbrSunken, + pbrDoubleSunken, + pbrBumped, + pbrEtched, + pbrFramed + ); + + TSpTBXProgressCaption = ( + pctNone, + pctDefault, + pctPercentage, + pctProgress + ); + + TSpTBXTickMark = ( + tmxBottomRight, + tmxTopLeft, + tmxBoth, + tmxCenter + ); + + TSpTBXCanResizeEvent = procedure(Sender: TObject; var NewSize: Integer; var Accept: Boolean) of object; + + { TSpTBXPanel } + + TSpTBXCustomPanel = class(TSpTBXCustomControl) + private + FBorders: Boolean; + FBorderType: TSpTBXPanelBorder; + FTBXStyleBackground: Boolean; + FSkinType: TSpTBXSkinType; + FOnDrawBackground: TSpTBXDrawEvent; + procedure SetBorders(const Value: Boolean); + procedure SetBorderType(const Value: TSpTBXPanelBorder); + procedure SetTBXStyleBackground(const Value: Boolean); + procedure SetSkinType(const Value: TSpTBXSkinType); + procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED; + procedure CMSpTBXControlsInvalidate(var Message: TMessage); message CM_SPTBXCONTROLSINVALIDATE; + procedure WMEraseBkgnd(var Message: TMessage); message WM_ERASEBKGND; + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + procedure WMWindowPosChanged(var Message: TWMWindowPosChanged); message WM_WINDOWPOSCHANGED; + protected + FBackground: TBitmap; + procedure AdjustClientRect(var Rect: TRect); override; + procedure CreateParams(var Params: TCreateParams); override; + procedure DrawBackground(ACanvas: TCanvas; ARect: TRect); virtual; + procedure DoDrawBackground(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + property Borders: Boolean read FBorders write SetBorders default True; + property BorderType: TSpTBXPanelBorder read FBorderType write SetBorderType default pbrEtched; + property ParentColor default False; + property TBXStyleBackground: Boolean read FTBXStyleBackground write SetTBXStyleBackground default False; + property OnDrawBackground: TSpTBXDrawEvent read FOnDrawBackground write FOnDrawBackground; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure InvalidateBackground(InvalidateChildren: Boolean = True); virtual; + published + property Caption; + property Hint; + property Color default clNone; + property SkinType: TSpTBXSkinType read FSkinType write SetSkinType default sknSkin; + end; + + TSpTBXPanel = class(TSpTBXCustomPanel) + private + FHotTracking: Boolean; + FHotTrack: Boolean; + FChildFocused: Boolean; + procedure SetHotTrack(const Value: Boolean); + procedure SetHotTracking(const Value: Boolean); + procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; + procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; + procedure CMFocusChanged(var Message: TCMFocusChanged); message CM_FOCUSCHANGED; + protected + procedure DrawBackground(ACanvas: TCanvas; ARect: TRect); override; + public + property HotTracking: Boolean read FHotTracking; + published + property Align; + property Anchors; + property AutoSize; + property BiDiMode; + property Constraints; + property UseDockManager; + property DockSite; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property ParentBiDiMode; + property ParentColor; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property TabOrder; + property TabStop; + property Visible; + property OnCanResize; + property OnClick; + property OnConstrainedResize; + property OnContextPopup; + property OnDockDrop; + property OnDockOver; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnGetSiteInfo; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnResize; + property OnStartDock; + property OnStartDrag; + property OnUnDock; + // TSpTBXCustomPanel properties + property Borders; + property BorderType; + property HotTrack: Boolean read FHotTrack write SetHotTrack default False; + property TBXStyleBackground; + property OnDrawBackground; + end; + + { TSpTBXGroupBox } + + TSpTBXCustomGroupBox = class(TSpTBXCustomPanel) + private + procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; + procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED; + protected + procedure AdjustClientRect(var Rect: TRect); override; + procedure DrawBackground(ACanvas: TCanvas; ARect: TRect); override; + public + constructor Create(AOwner: TComponent); override; + end; + + TSpTBXGroupBox = class(TSpTBXCustomGroupBox) + published + property Align; + property Anchors; + property BiDiMode; + property Color; + property Constraints; + property UseDockManager; + property DockSite; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property ParentBiDiMode; + property ParentColor; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property TabOrder; + property TabStop; + property Visible; + property OnCanResize; + property OnClick; + property OnConstrainedResize; + property OnContextPopup; + property OnDockDrop; + property OnDockOver; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnGetSiteInfo; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnResize; + property OnStartDock; + property OnStartDrag; + property OnUnDock; + // TSpTBXCustomPanel properties + property Borders; + property BorderType; + property TBXStyleBackground; + property OnDrawBackground; + end; + + { TSpTBXTextObjectActionLink } + + {$IFNDEF UNICODE} + TSpTBXTextObjectActionLink = class(TControlActionLink) + protected + FUnicodeClient: TSpTBXTextObject; + procedure AssignClient(AClient: TObject); override; + function IsCaptionLinked: Boolean; override; + function IsCheckedLinked: Boolean; override; + function IsHintLinked: Boolean; override; + procedure SetCaption(const Value: String); override; + procedure SetChecked(Value: Boolean); override; + procedure SetHint(const Value: String); override; + procedure SetImageIndex(Value: Integer); override; + end; + {$ELSE} + TSpTBXTextObjectActionLink = class(TControlActionLink); + {$ENDIF} + + { TSpTBXTextObject } + + TSpTBXTextObject = class(TSpTBXCustomControl) + private + FAlignment: TAlignment; + FCaptionGlow: TSpGlowDirection; + FCaptionGlowColor: TColor; + FCaptionRoatationAngle: TSpTextRotationAngle; + FChecked: Boolean; + FDisabledIconCorrection: Boolean; + FDrawPushedCaption: Boolean; + FGlyphLayout: TSpGlyphLayout; + FImages: TCustomImageList; + FImageChangeLink: TChangeLink; + FImageIndex: TImageIndex; + FLinkText: WideString; + FLinkTextParams: WideString; + FMouseInControl: Boolean; + FPushed: Boolean; + FSkinType: TSpTBXSkinType; + FSpaceAsClick: Boolean; + FShowAccelChar: Boolean; + FUpdating: Boolean; + FWrapping: TTextWrapping; + FOnDraw: TSpTBXDrawEvent; + FOnDrawCaption: TSpTBXDrawTextEvent; + FOnDrawHint: TSpTBXDrawHintEvent; + FOnGetImageIndex: TSpTBXGetImageIndexEvent; + FOnMouseEnter: TNotifyEvent; + FOnMouseLeave: TNotifyEvent; + procedure ReadLinkFont(Reader: TReader); // [Backward-Compatibility] + procedure ImageListChange(Sender: TObject); + procedure UpdateTracking(ForceMouseLeave: Boolean = False); + procedure SetAlignment(const Value: TAlignment); + procedure SetCaptionGlow(const Value: TSpGlowDirection); + procedure SetCaptionGlowColor(const Value: TColor); + procedure SetCaptionRoatationAngle(const Value: TSpTextRotationAngle); + procedure SetGlyphLayout(const Value: TSpGlyphLayout); + procedure SetImageIndex(const Value: TImageIndex); + procedure SetImages(const Value: TCustomImageList); + procedure SetSkinType(const Value: TSpTBXSkinType); + procedure SetShowAccelChar(Value: Boolean); + procedure SetWrapping(Value: TTextWrapping); + procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED; + procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED; + procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW; + procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; + procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; + procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED; + procedure WMEraseBkgnd(var Message: TMessage); message WM_ERASEBKGND; + procedure WMKillFocus(var Message: TMessage); message WM_KILLFOCUS; + procedure WMSetFocus(var Message: TMessage); message WM_SETFOCUS; + procedure WMSetCursor(var Message: TWMSetCursor); message WM_SETCURSOR; + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + protected + // Painting + procedure AdjustFont(AFont: TFont); virtual; + procedure AdjustBounds; + procedure DoDrawHint(AHintBitmap: TBitmap; var AHint: Widestring; var PaintDefault: Boolean); virtual; + function DoDrawItem(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage): Boolean; virtual; + function DoDrawText(ACanvas: TCanvas; var ARect: TRect; Flags: Longint): Integer; virtual; + procedure DoGetImageIndex(var AImageList: TCustomImageList; var AImageIndex: Integer); virtual; + procedure DoInternalGlyphDraw(ACanvas: TCanvas; AGlyphRect: TRect); virtual; + function GetFocusRect(R, TextR, GlyphR: TRect): TRect; virtual; + function GetTextMargins: TRect; virtual; + function IsImageIndexValid: Boolean; + procedure Paint; override; + + // Sizing + function CanAutoSize(var NewWidth, NewHeight: Integer): Boolean; override; + procedure DoAdjustBounds(var NewWidth, NewHeight: Integer); virtual; + + // Mouse + function GetFocused: Boolean; virtual; + function GetPushed: Boolean; virtual; + procedure DoMouseEnter; virtual; + procedure DoMouseLeave; virtual; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; + procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + procedure KeyDown(var Key: Word; Shift: TShiftState); override; + procedure KeyUp(var Key: Word; Shift: TShiftState); override; + + // Component + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + procedure CreateParams(var Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + procedure ExecuteLink; virtual; + function GetActionLinkClass: TControlActionLinkClass; override; + function GetChecked: Boolean; virtual; + procedure SetChecked(Value: Boolean); virtual; + procedure Loaded; override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + + property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify; + property AutoSize default True; + property Checked: Boolean read GetChecked write SetChecked default False; + property CaptionGlow: TSpGlowDirection read FCaptionGlow write SetCaptionGlow default gldNone; + property CaptionGlowColor: TColor read FCaptionGlowColor write SetCaptionGlowColor default clYellow; + property CaptionRoatationAngle: TSpTextRotationAngle read FCaptionRoatationAngle write SetCaptionRoatationAngle default tra0; + property DrawPushedCaption: Boolean read FDrawPushedCaption write FDrawPushedCaption default False; + property DisabledIconCorrection: Boolean read FDisabledIconCorrection write FDisabledIconCorrection default True; + property GlyphLayout: TSpGlyphLayout read FGlyphLayout write SetGlyphLayout default ghlGlyphLeft; + property Images: TCustomImageList read FImages write SetImages; + property ImageIndex: TImageIndex read FImageIndex write SetImageIndex default -1; + property LinkText: WideString read FLinkText write FLinkText; + property LinkTextParams: WideString read FLinkTextParams write FLinkTextParams; + property SkinType: TSpTBXSkinType read FSkinType write SetSkinType default sknSkin; + property ShowAccelChar: Boolean read FShowAccelChar write SetShowAccelChar default True; + property SpaceAsClick: Boolean read FSpaceAsClick write FSpaceAsClick default False; + property Wrapping: TTextWrapping read FWrapping write SetWrapping default twNone; + property OnDraw: TSpTBXDrawEvent read FOnDraw write FOnDraw; + property OnDrawCaption: TSpTBXDrawTextEvent read FOnDrawCaption write FOnDrawCaption; + property OnDrawHint: TSpTBXDrawHintEvent read FOnDrawHint write FOnDrawHint; + property OnGetImageIndex: TSpTBXGetImageIndexEvent read FOnGetImageIndex write FOnGetImageIndex; + property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter; + property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave; + property TabStop default True; + property ParentColor default False; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function CanFocus: Boolean; override; + procedure Click; override; + function GetControlsAlignment: TAlignment; override; + procedure GetSize(out TotalR, TextR, GlyphR: TRect); virtual; + function GetTextFlags: Cardinal; + function GetGlyphSize: TSize; virtual; + property Canvas; + property MouseInControl: Boolean read FMouseInControl; + property Pushed: Boolean read GetPushed; + published + property Caption; + property Hint; + property Color default clNone; + end; + + { TSpTBXLabel } + + TSpTBXCustomLabel = class(TSpTBXTextObject) + private + FFocusControl: TWinControl; + FUnderline: Boolean; + FUnderlineColor: TColor; + procedure SetFocusControl(const Value: TWinControl); + procedure SetUnderline(const Value: Boolean); + procedure SetUnderlineColor(const Value: TColor); + procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; + protected + procedure AdjustFont(AFont: TFont); override; + function DoDrawItem(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage): Boolean; override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + property FocusControl: TWinControl read FFocusControl write SetFocusControl; + property Underline: Boolean read FUnderline write SetUnderline default False; + property UnderlineColor: TColor read FUnderlineColor write SetUnderlineColor default clBtnShadow; + public + constructor Create(AOwner: TComponent); override; + procedure GetSize(out TotalR: TRect; out TextR: TRect; out GlyphR: TRect); override; + end; + + TSpTBXLabel = class(TSpTBXCustomLabel) + published + property Action; + property Align; + property Anchors; + property AutoSize; + property BiDiMode; + property Color; + property Constraints; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property ParentBiDiMode; + property ParentColor; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowAccelChar; + property ShowHint; + property Visible; + property Wrapping; + property OnClick; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnMouseDown; + property OnMouseEnter; + property OnMouseLeave; + property OnMouseMove; + property OnMouseUp; + property OnStartDock; + property OnStartDrag; + // TSpTBXCustomLabel properties + property Alignment; + property CaptionGlow; + property CaptionGlowColor; + property FocusControl; + property GlyphLayout; + property Images; + property ImageIndex; + property LinkText; + property LinkTextParams; + property SkinType; + property Underline; + property UnderlineColor; + property OnDraw; + property OnDrawCaption; + property OnDrawHint; + property OnGetImageIndex; + end; + + { TSpTBXButtonControl } + + TSpTBXButtonControl = class(TSpTBXTextObject) + private + FAllowAllUp: Boolean; + FGroupIndex: Integer; + FStateChanged: Boolean; + procedure SetAllowAllUp(const Value: Boolean); + procedure SetGroupIndex(const Value: Integer); + procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; + procedure CMSPGroupIndexUpdate(var Message: TMessage); message CM_SPGROUPINDEXUPDATE; + protected + function CanUpdateExclusive: Boolean; virtual; + procedure SetChecked(Value: Boolean); override; + procedure UpdateExclusive; + property AllowAllUp: Boolean read FAllowAllUp write SetAllowAllUp default False; + property GroupIndex: Integer read FGroupIndex write SetGroupIndex default 0; + property StateChanged: Boolean read FStateChanged write FStateChanged; + public + constructor Create(AOwner: TComponent); override; + function CanFocus: Boolean; override; + end; + + { TSpTBXCheckBox } + + TSpTBXCustomCheckButton = class(TSpTBXButtonControl) + protected + procedure Toggle; virtual; + public + function GetGlyphSize: TSize; override; + procedure GetSize(out TotalR, TextR, GlyphR: TRect); override; + end; + + TSpTBXCustomCheckBox = class(TSpTBXCustomCheckButton) + private + FAllowGrayed: Boolean; + FState: TCheckBoxState; + procedure SetState(const Value: TCheckBoxState); + protected + procedure AdjustFont(AFont: TFont); override; + procedure DoInternalGlyphDraw(ACanvas: TCanvas; AGlyphRect: TRect); override; + function GetChecked: Boolean; override; + procedure SetChecked(Value: Boolean); override; + procedure Toggle; override; + property AllowGrayed: Boolean read FAllowGrayed write FAllowGrayed default False; + property State: TCheckBoxState read FState write SetState default cbUnchecked; + public + constructor Create(AOwner: TComponent); override; + procedure Click; override; + end; + + TSpTBXCheckBox = class(TSpTBXCustomCheckBox) + published + property Action; + property Align; + property Anchors; + property AutoSize; + property BiDiMode; + property Color; + property Constraints; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property ParentBiDiMode; + property ParentColor; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowAccelChar; + property ShowHint; + property TabOrder; + property TabStop; + property Visible; + property Wrapping; + property OnClick; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnMouseDown; + property OnMouseEnter; + property OnMouseLeave; + property OnMouseMove; + property OnMouseUp; + property OnStartDock; + property OnStartDrag; + // TSpTBXCustomCheckBox properties + property Alignment; + property AllowGrayed; + property CaptionGlow; + property CaptionGlowColor; + property Checked; + property State; + property SkinType; + property OnDraw; + property OnDrawCaption; + property OnDrawHint; + property OnGetImageIndex; + end; + + { TSpTBXRadioButton } + + TSpTBXCustomRadioButton = class(TSpTBXCustomCheckButton) + private + procedure CMFocusChanged(var Message: TCMFocusChanged); message CM_FOCUSCHANGED; + protected + procedure AdjustFont(AFont: TFont); override; + function CanUpdateExclusive: Boolean; override; + procedure DoInternalGlyphDraw(ACanvas: TCanvas; AGlyphRect: TRect); override; + procedure SetChecked(Value: Boolean); override; + procedure Toggle; override; + property TabStop default False; + public + constructor Create(AOwner: TComponent); override; + procedure Click; override; + end; + + TSpTBXRadioButton = class(TSpTBXCustomRadioButton) + published + property Action; + property Align; + property Anchors; + property AutoSize; + property BiDiMode; + property Color; + property Constraints; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property ParentBiDiMode; + property ParentColor; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowAccelChar; + property ShowHint; + property TabOrder; + property TabStop; + property Visible; + property Wrapping; + property OnClick; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnMouseDown; + property OnMouseEnter; + property OnMouseLeave; + property OnMouseMove; + property OnMouseUp; + property OnStartDock; + property OnStartDrag; + // TSpTBXCustomRadioButton properties + property Alignment; + property CaptionGlow; + property CaptionGlowColor; + property Checked; + property GroupIndex; + property SkinType; + property OnDraw; + property OnDrawCaption; + property OnDrawHint; + property OnGetImageIndex; + end; + + { TSpTBXRadioGroup } + + TSpTBXCustomRadioGroup = class(TSpTBXCustomGroupBox) + private + FButtons: TList; + FItems: TTntStrings; + FItemIndex: Integer; + FColumns: Integer; + FReading: Boolean; + FUpdating: Boolean; + function GetButtons(Index: Integer): TSpTBXRadioButton; + procedure ArrangeButtons; + procedure ButtonClick(Sender: TObject); + procedure ItemsChange(Sender: TObject); + procedure SetButtonCount(Value: Integer); + procedure SetColumns(Value: Integer); + procedure SetItemIndex(Value: Integer); + procedure SetItems(Value: TTntStrings); + procedure UpdateButtons; + procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED; + procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED; + procedure WMSize(var Message: TWMSize); message WM_SIZE; + protected + procedure Loaded; override; + procedure ReadState(Reader: TReader); override; + property Columns: Integer read FColumns write SetColumns default 1; + property ItemIndex: Integer read FItemIndex write SetItemIndex default -1; + property Items: TTntStrings read FItems write SetItems; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override; + procedure FlipChildren(AllLevels: Boolean); override; + procedure InvalidateBackground(InvalidateChildren: Boolean = True); override; + procedure SetFocus; override; + property Buttons[Index: Integer]: TSpTBXRadioButton read GetButtons; + end; + + TSpTBXRadioGroup = class(TSpTBXCustomRadioGroup) + published + property Align; + property Anchors; + property BiDiMode; + property Color; + property Constraints; + property UseDockManager; + property DockSite; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property ParentBiDiMode; + property ParentColor; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property TabOrder; + property TabStop; + property Visible; + property OnCanResize; + property OnClick; + property OnConstrainedResize; + property OnContextPopup; + property OnDockDrop; + property OnDockOver; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnGetSiteInfo; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnResize; + property OnStartDock; + property OnStartDrag; + property OnUnDock; + // TSpTBXCustomPanel properties + property Borders; + property BorderType; + property TBXStyleBackground; + property OnDrawBackground; + // TSpTBXCustomRadioGroup properties + property Columns; + property ItemIndex; + property Items; + end; + + { TSpTBXButton } + + TSpTBXCustomButton = class(TSpTBXButtonControl) + private + FBitmap: TBitmap; + FBitmapTransparent: Boolean; + FActive: Boolean; + FCancel: Boolean; + FDefault: Boolean; + FDropDownArrow: Boolean; + FDropDownMenu: TPopupMenu; + FDropDownMenuVisible: Boolean; + FFlat: Boolean; + FModalResult: TModalResult; + FRepeating: Boolean; + FRepeatTimer: TTimer; + procedure BitmapChanged(Sender: TObject); + procedure RepeatTimerHandler(Sender: TObject); + procedure SetBitmap(const Value: TBitmap); + procedure SetDefault(const Value: Boolean); + procedure SetDropDownArrow(const Value: Boolean); + procedure SetDropdownMenu(Value: TPopupMenu); + procedure SetFlat(const Value: Boolean); + procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY; + procedure CMFocusChanged(var Message: TCMFocusChanged); message CM_FOCUSCHANGED; + procedure CMSPPopupClose(var Message: TMessage); message CM_SPPOPUPCLOSE; + procedure WMCancelMode(var Message: TWMCancelMode); message WM_CANCELMODE; + protected + FPopupControl: TControl; + procedure CreateWnd; override; + procedure AdjustFont(AFont: TFont); override; + function BitmapValid: boolean; + function DoDrawDropDownArrow(ACanvas: TCanvas; ARect: TRect): Boolean; virtual; + function DoDrawItem(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage): Boolean; override; + function GetFocused: Boolean; override; + function GetFocusRect(R, TextR, GlyphR: TRect): TRect; override; + function GetInternalDropDownMenu: TPopupMenu; virtual; + function GetPushed: Boolean; override; + function GetTextMargins: TRect; override; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + property Alignment default taCenter; + property Bitmap: TBitmap read FBitmap write SetBitmap; + property BitmapTransparent: Boolean read FBitmapTransparent write FBitmapTransparent default True; + property DrawPushedCaption default True; + property Cancel: Boolean read FCancel write FCancel default False; + property Default: Boolean read FDefault write SetDefault default False; + property DropDownArrow: Boolean read FDropDownArrow write SetDropDownArrow default True; + property DropDownMenu: TPopupMenu read FDropDownMenu write SetDropDownMenu; + property Flat: Boolean read FFlat write SetFlat default False; + property ModalResult: TModalResult read FModalResult write FModalResult default 0; + property Repeating: Boolean read FRepeating write FRepeating default False; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Click; override; + function GetSkinStateRect: TRect; + function IsDroppedDown: Boolean; + procedure StopRepeat; virtual; + end; + + TSpTBXButton = class(TSpTBXCustomButton) + published + property Action; + property Align; + property Anchors; + property BiDiMode; + property Color; + property Constraints; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property ParentBiDiMode; + property ParentColor; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowAccelChar; + property ShowHint; + property TabOrder; + property TabStop; + property Visible; + property Wrapping; + property OnClick; + property OnContextPopup; + // property OnDblClick; Buttons don't have OnDblClick events + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnMouseDown; + property OnMouseEnter; + property OnMouseLeave; + property OnMouseMove; + property OnMouseUp; + property OnStartDock; + property OnStartDrag; + // TSpTBXCustomButton properties + property Alignment; + property Bitmap; + property BitmapTransparent; + property Cancel; + property CaptionGlow; + property CaptionGlowColor; + property Checked; + property Default; + property DrawPushedCaption; + property DropDownArrow; + property DropDownMenu; + property Flat; + property GlyphLayout; + property GroupIndex; + property Images; + property ImageIndex; + property LinkText; + property LinkTextParams; + property ModalResult; + property SkinType; + property Repeating; + property OnDraw; + property OnDrawCaption; + property OnDrawHint; + property OnGetImageIndex; + end; + + { TSpTBXSpeedButton } + + TSpTBXCustomSpeedButton = class(TSpTBXCustomButton) + public + constructor Create(AOwner: TComponent); override; + function CanFocus: Boolean; override; + procedure Click; override; + end; + + TSpTBXSpeedButton = class(TSpTBXCustomSpeedButton) + published + property Action; + property Align; + property Anchors; + property BiDiMode; + property Color; + property Constraints; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property ParentBiDiMode; + property ParentColor; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowAccelChar; + property ShowHint; + // property TabOrder; SpeedButtons don't have TabStops + // property TabStop; SpeedButtons don't have TabStops + property Visible; + property Wrapping; + property OnClick; + property OnContextPopup; + // property OnDblClick; SpeedButtons don't have OnDblClick events + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnMouseDown; + property OnMouseEnter; + property OnMouseLeave; + property OnMouseMove; + property OnMouseUp; + property OnStartDock; + property OnStartDrag; + // TSpTBXCustomButton properties + property Alignment; + property AllowAllUp; + property Bitmap; + property BitmapTransparent; + property Cancel; + property CaptionGlow; + property CaptionGlowColor; + property Checked; + property Default; + property DrawPushedCaption; + property DropDownArrow; + property DropDownMenu; + property Flat; + property GlyphLayout; + property GroupIndex; + property Images; + property ImageIndex; + property LinkText; + property LinkTextParams; + property SkinType; + property Repeating; + property OnDraw; + property OnDrawCaption; + property OnDrawHint; + property OnGetImageIndex; + end; + + { TSpTBXProgressBar } + + TSpTBXProgressBarChangeEvent = procedure(Sender: TObject; NewPosition: Integer) of object; + + TSpTBXCustomProgressBar = class(TSpTBXTextObject) + private + FMin: Integer; + FMax: Integer; + FPosition: Integer; + FProgressVisible: Boolean; + FSmooth: Boolean; + FVertical: Boolean; + FCaptionType: TSpTBXProgressCaption; + FOnProgressChange: TSpTBXProgressBarChangeEvent; + procedure SetMax(const Value: integer); + procedure SetMin(const Value: integer); + procedure SetPosition(Value: integer); + procedure SetSmooth(const Value: Boolean); + procedure SetVertical(const Value: Boolean); + procedure SetCaptionType(const Value: TSpTBXProgressCaption); + procedure SetProgressVisible(const Value: Boolean); + protected + procedure AdjustFont(AFont: TFont); override; + function DoDrawItem(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage): Boolean; override; + procedure DoProgressChange; virtual; + function GetTextMargins: TRect; override; + property Alignment default taCenter; + property CaptionGlow default gldAll; + property CaptionType: TSpTBXProgressCaption read FCaptionType write SetCaptionType default pctPercentage; + property Max: Integer read FMax write SetMax default 100; + property Min: Integer read FMin write SetMin default 0; + property Position: Integer read FPosition write SetPosition default 0; + property ProgressVisible: Boolean read FProgressVisible write SetProgressVisible default True; + property Smooth: Boolean read FSmooth write SetSmooth default False; + property Vertical: Boolean read FVertical write SetVertical default False; + property OnProgressChange: TSpTBXProgressBarChangeEvent read FOnProgressChange write FOnProgressChange; + public + constructor Create(AOwner: TComponent); override; + procedure StepIt(Delta: Integer = 1); + end; + + TSpTBXProgressBar = class(TSpTBXCustomProgressBar) + published + property Align; + property Anchors; + property Color; + property Constraints; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property ParentColor; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property Visible; + property OnClick; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnMouseDown; + property OnMouseEnter; + property OnMouseLeave; + property OnMouseMove; + property OnMouseUp; + property OnStartDock; + property OnStartDrag; + // TSpTBXCustomProgressBar properties + property Alignment; + property CaptionGlow; + property CaptionGlowColor; + property CaptionType; + property Max; + property Min; + property Position; + property Smooth; + property Vertical; + property SkinType; + property OnDraw; + property OnDrawCaption; + property OnDrawHint; + property OnProgressChange; + end; + + { TSpTBXTrackBar } + + TSpTBXTrackBar = class(TTrackBar) + private + FSkinType: TSpTBXSkinType; + FTickMarks: TSpTBXTickMark; + FOnDrawChannel: TSpTBXDrawEvent; + FOnDrawChannelTicks: TSpTBXDrawPosEvent; + FOnDrawThumb: TSpTBXDrawEvent; + FCanDrawChannelSelection: Boolean; + procedure SetSkinType(const Value: TSpTBXSkinType); + procedure SetTickMarks(const Value: TSpTBXTickMark); + procedure CMSpTBXControlsInvalidate(var Message: TMessage); message CM_SPTBXCONTROLSINVALIDATE; + procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY; + procedure WMEraseBkGnd(var Message: TMessage); message WM_ERASEBKGND; + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + protected + procedure CreateParams(var Params: TCreateParams); override; + function DoDrawChannel(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage): Boolean; virtual; + function DoDrawChannelTicks(ACanvas: TCanvas; X, Y: Integer): Boolean; virtual; + function DoDrawThumb(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage): Boolean; virtual; + procedure DrawTicks(ACanvas: TCanvas); virtual; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function ChannelRect: TRect; + function MouseInThumb: Boolean; + procedure InvalidateBackground; + published + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property SkinType: TSpTBXSkinType read FSkinType write SetSkinType default sknSkin; + property TickMarks: TSpTBXTickMark read FTickMarks write SetTickMarks default tmxBottomRight; + property OnDrawChannel: TSpTBXDrawEvent read FOnDrawChannel write FOnDrawChannel; + property OnDrawChannelTicks: TSpTBXDrawPosEvent read FOnDrawChannelTicks write FOnDrawChannelTicks; + property OnDrawThumb: TSpTBXDrawEvent read FOnDrawThumb write FOnDrawThumb; + end; + +{ Painting helpers } +procedure SpDrawXPPanel(ACanvas: TCanvas; ARect: TRect; Enabled, TBXStyleBackground: Boolean; SkinType: TSpTBXSkinType; Border: TSpTBXPanelBorder); +procedure SpDrawXPPanelBorder(ACanvas: TCanvas; ARect: TRect; Border: TSpTBXPanelBorder); +procedure SpDrawXPGroupBox(ACanvas: TCanvas; ARect: TRect; ACaption: WideString; TextFlags: Cardinal; Enabled, TBXStyleBackground: Boolean; SkinType: TSpTBXSkinType); +procedure SpDrawXPProgressBar(ACanvas: TCanvas; ARect: TRect; Min, Max, Position: Integer; Back, Fore: TBitmap); overload; +function SpDrawXPProgressBar(ACanvas: TCanvas; ARect: TRect; Vertical, Smooth, DrawProgress: Boolean; Min, Max, Position: Integer; SkinType: TSpTBXSkinType): Integer; overload; +procedure SpDrawXPTrackBar(ACanvas: TCanvas; ARect: TRect; Part: Cardinal; Vertical, Pushed, ChannelSelection: Boolean; TickMark: TSpTBXTickMark; Min, Max, SelStart, SelEnd: Integer; SkinType: TSpTBXSkinType); +procedure SpInvalidateSpTBXControl(AControl: TWinControl; InvalidateChildren, OnlySpTBXControls: Boolean); + +implementation + +uses + Themes, UxTheme, + {$IFNDEF UNICODE} TntActnList, {$ENDIF} + CommCtrl, ShellAPI; +type + TWinControlAccess = class(TWinControl); + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Helpers } + +procedure SpDrawXPPanel(ACanvas: TCanvas; ARect: TRect; Enabled, TBXStyleBackground: Boolean; + SkinType: TSpTBXSkinType; Border: TSpTBXPanelBorder); +var + Flags: Integer; +begin + case SpTBXSkinType(SkinType) of + sknWindows: + begin + if Enabled then Flags := GBS_NORMAL + else Flags := GBS_DISABLED; + DrawThemeBackground(ThemeServices.Theme[teButton], ACanvas.Handle, BP_GROUPBOX, Flags, ARect, nil); + end; + sknNone: + SpDrawXPPanelBorder(ACanvas, ARect, Border); + sknSkin: + CurrentSkin.PaintBackground(ACanvas, ARect, skncPanel, sknsNormal, TBXStyleBackground, True); + end; +end; + +procedure SpDrawXPPanelBorder(ACanvas: TCanvas; ARect: TRect; Border: TSpTBXPanelBorder); +const + Edge: array [TSpTBXPanelBorder] of Cardinal = (BDR_RAISEDINNER, EDGE_RAISED, + BDR_SUNKENOUTER, EDGE_SUNKEN, EDGE_BUMP, EDGE_ETCHED, 0); +begin + if Border = pbrFramed then begin + ACanvas.Brush.Color := clBtnFace; + ACanvas.FrameRect(ARect); + end + else + DrawEdge(ACanvas.Handle, ARect, Edge[Border], BF_RECT); +end; + +procedure SpDrawXPGroupBox(ACanvas: TCanvas; ARect: TRect; ACaption: WideString; + TextFlags: Cardinal; Enabled, TBXStyleBackground: Boolean; SkinType: TSpTBXSkinType); +var + Width, Flags, SaveIndex: Integer; + R: TRect; + CaptionRect: TRect; +begin + Flags := 0; + SkinType := SpTBXSkinType(SkinType); + Width := ARect.Right - ARect.Left; + + if ACaption <> '' then begin + CaptionRect := Rect(0, 0, 1, 1); + + if Enabled then Flags := GBS_NORMAL + else Flags := GBS_DISABLED; + if SkinType = sknWindows then + GetThemeTextExtent(ThemeServices.Theme[teButton], ACanvas.Handle, BP_GROUPBOX, Flags, + PWideChar(ACaption), Length(ACaption), DT_LEFT, nil, CaptionRect) + else + SpDrawXPText(ACanvas, ACaption, CaptionRect, TextFlags or DT_CALCRECT); + + if (TextFlags and DT_RTLREADING) = 0 then + OffsetRect(CaptionRect, 8, 0) + else + OffsetRect(CaptionRect, Width - 8 - CaptionRect.Right, 0); + end + else + CaptionRect := Rect(0, 0, 0, 0); + + R := ARect; + R.Top := (CaptionRect.Bottom - CaptionRect.Top) div 2; + SaveIndex := SaveDC(ACanvas.Handle); + with CaptionRect do + ExcludeClipRect(ACanvas.Handle, Left, Top, Right, Bottom); + try + SpDrawXPPanel(ACanvas, R, Enabled, TBXStyleBackground, SkinType, pbrEtched); + finally + RestoreDC(ACanvas.Handle, SaveIndex); + end; + + if ACaption <> '' then begin + case SkinType of + sknNone: + SpDrawXPText(ACanvas, ACaption, CaptionRect, TextFlags); + sknWindows: + DrawThemeText(ThemeServices.Theme[teButton], ACanvas.Handle, BP_GROUPBOX, Flags, PWideChar(ACaption), -1, TextFlags, 0, CaptionRect); + sknSkin: + begin + if CurrentSkin.Options(skncPanel, sknsNormal).TextColor <> clNone then + ACanvas.Font.Color := CurrentSkin.Options(skncPanel, sknsNormal).TextColor; + SpDrawXPText(ACanvas, ACaption, CaptionRect, TextFlags); + end; + end; + end; +end; + +procedure SpDrawXPProgressBar(ACanvas: TCanvas; ARect: TRect; + Min, Max, Position: Integer; Back, Fore: TBitmap); +var + Percent, Delta: Integer; + DeltaR, R: TRect; +begin + if Position < Min then Position := Min + else if Position > Max then Position := Max; + + // Get the delta + if (Max > Min) and (Position > Min) then begin + Percent := (Position * 100) div (Max - Min); + DeltaR := ARect; + R := Rect(0, 0, Back.Width, Back.Height); + if Back.Height > Back.Width then begin + Delta := (Back.Height * Percent) div 100; + DeltaR.Bottom := DeltaR.Top + Delta; + R.Bottom := R.Top + Delta; + end + else begin + Delta := (Back.Width * Percent) div 100; + DeltaR.Right := DeltaR.Left + Delta; + R.Right := R.Left + Delta; + end; + end + else + Delta := 0; + + ACanvas.Draw(ARect.Left, ARect.Top, Back); + if Delta > 0 then + ACanvas.CopyRect(DeltaR, Fore.Canvas, R); +end; + +function SpDrawXPProgressBar(ACanvas: TCanvas; ARect: TRect; + Vertical, Smooth, DrawProgress: Boolean; Min, Max, Position: Integer; + SkinType: TSpTBXSkinType): Integer; +const + PartID: array [Boolean] of Integer = (PP_BAR, PP_BARVERT); + VistaPartID: array [Boolean] of Integer = (5, 6); // PP_FILL, PP_FILLVERT + ChunkID: array [Boolean] of Integer = (PP_CHUNK, PP_CHUNKVERT); +var + ChunkPaint: Boolean; + I: Integer; + DeltaR, R: TRect; + B: TBitmap; + Percentage: Double; +begin + Result := 0; + ChunkPaint := False; + if Position < Min then Position := Min + else if Position > Max then Position := Max; + SkinType := SpTBXSkinType(SkinType); + + // Get the delta + if (Max > Min) and (Position > Min) then begin + DeltaR := ARect; + case SkinType of + sknWindows: + if not SpIsWinVistaOrUp then + if Vertical then InflateRect(DeltaR, -3, -4) + else InflateRect(DeltaR, -4, -3); + sknNone: InflateRect(DeltaR, -2, -2); + end; + // Cast Position to a Double real type, otherwise Percentage * 100 + // returns a negative value, e.g. 30000000 * 100 + Percentage := Position; + Percentage := (Percentage * 100) / (Max - Min); + Result := Round(Percentage); + if Vertical then + DeltaR.Top := DeltaR.Bottom - (((DeltaR.Bottom - DeltaR.Top) * Result) div 100) + else + DeltaR.Right := DeltaR.Left + (((DeltaR.Right - DeltaR.Left) * Result) div 100); + end + else + DeltaR := Rect(0, 0, 0, 0); + + B := TBitmap.Create; + try + case SkinType of + sknWindows: + begin + DrawThemeBackground(ThemeServices.Theme[teProgress], ACanvas.Handle, PartID[Vertical], 0, ARect, nil); + if DrawProgress and not IsRectEmpty(DeltaR) then begin + if SpIsWinVistaOrUp then + DrawThemeBackground(ThemeServices.Theme[teProgress], ACanvas.Handle, VistaPartID[Vertical], 1, DeltaR, nil) + else begin + // [Theme-Change] + // Another Windows API bug, Windows XP progress bar chunks are 8 x 11, + // but DrawThemeBackground draws 10 x 11 chunks. We must draw the chunks manually. + if Vertical then begin + B.Width := DeltaR.Right - DeltaR.Left; + B.Height := 8; + R := Rect(0, 2, B.Width, B.Height); + end + else begin + B.Width := 8; + B.Height := DeltaR.Bottom - DeltaR.Top; + R := Rect(0, 0, B.Width - 2, B.Height); + end; + DrawThemeBackground(ThemeServices.Theme[teProgress], B.Canvas.Handle, ChunkID[Vertical], 0, R, nil); + ChunkPaint := True; + end; + end; + end; + sknNone: + begin + DrawEdge(ACanvas.Handle, ARect, BDR_SUNKENOUTER, BF_RECT); + if DrawProgress and not IsRectEmpty(DeltaR) then + if Smooth then begin + ACanvas.Brush.Color := clHighlight; + ACanvas.FillRect(DeltaR); + end + else begin + // Chunks are 10 x 13 + if Vertical then begin + B.Width := DeltaR.Right - DeltaR.Left; + B.Height := 10; + R := Rect(0, 2, B.Width, B.Height); + end + else begin + B.Width := 10; + B.Height := DeltaR.Bottom - DeltaR.Top; + R := Rect(0, 0, B.Width - 2, B.Height); + end; + B.Canvas.Brush.Color := clBtnFace; + B.Canvas.FillRect(Rect(0, 0, B.Width, B.Height)); + B.Canvas.Brush.Color := clHighlight; + B.Canvas.FillRect(R); + ChunkPaint := True; + end; + end; + sknSkin: + begin + CurrentSkin.PaintBackground(ACanvas, ARect, skncProgressBar, sknsNormal, True, True); + if DrawProgress and not IsRectEmpty(DeltaR) then begin + B.Width := ARect.Right - ARect.Left; + B.Height := ARect.Bottom - ARect.Top; + R := Rect(0, 0, B.Width, B.Height); + B.Canvas.CopyRect(R, ACanvas, ARect); // B is transparent + + CurrentSkin.PaintBackground(B.Canvas, R, skncProgressBar, sknsHotTrack, True, True); + + if Vertical then + R.Top := R.Bottom - (DeltaR.Bottom - DeltaR.Top) + else + R.Right := DeltaR.Right - DeltaR.Left; + ACanvas.CopyRect(DeltaR, B.Canvas, R); + end; + end; + end; + + if ChunkPaint then begin + if Vertical then begin + ExcludeClipRect(ACanvas.Handle, ARect.Left, ARect.Top, ARect.Right, ARect.Top + 2); + I := DeltaR.Bottom - B.Height; + while I > DeltaR.Top - B.Height do begin + ACanvas.Draw(DeltaR.Left, I, B); + Dec(I, B.Height); + end; + end + else begin + ExcludeClipRect(ACanvas.Handle, ARect.Right - 2, ARect.Top, ARect.Right, ARect.Bottom); + I := DeltaR.Left; + while I < DeltaR.Right do begin + ACanvas.Draw(I, DeltaR.Top, B); + Inc(I, B.Width); + end; + end; + SelectClipRgn(ACanvas.Handle, 0); + end; + finally + B.Free; + end; +end; + +procedure SpDrawXPTrackBar(ACanvas: TCanvas; ARect: TRect; Part: Cardinal; + Vertical, Pushed, ChannelSelection: Boolean; TickMark: TSpTBXTickMark; + Min, Max, SelStart, SelEnd: Integer; SkinType: TSpTBXSkinType); +var + Flags: Integer; + + procedure DrawChannelSelection(ChannelR: TRect); + var + I: Integer; + Step : Single; + begin + if not ChannelSelection then Exit; + I := Max - Min; + if (I > 0) and (SelEnd > SelStart) then begin + if SkinType = sknSkin then + InflateRect(ChannelR, -2, -2) + else + InflateRect(ChannelR, -1, -1); + Step := (ChannelR.Right - ChannelR.Left) / I; + ChannelR.Right := ChannelR.Left + Round(SelEnd * Step); + ChannelR.Left := ChannelR.Left + Round(SelStart * Step); + + if SkinType = sknSkin then + CurrentSkin.PaintBackground(ACanvas, ChannelR, skncTrackBar, sknsHotTrack, True, True) + else begin + ACanvas.Brush.Color := clHighlight; + ACanvas.FillRect(ChannelR); + end; + end; + end; + +begin + SkinType := SpTBXSkinType(SkinType); + case SkinType of + sknWindows: + if Part = TBCD_THUMB then begin + if Pushed then Flags := TUS_HOT + else Flags := TUS_NORMAL; + Case TickMark of + tmxBottomRight: + if Vertical then Part := TKP_THUMBRIGHT + else Part := TKP_THUMBBOTTOM; + tmxTopLeft: + if Vertical then Part := TKP_THUMBLEFT + else Part := TKP_THUMBTOP; + tmxBoth, tmxCenter: + if Vertical then Part := TKP_THUMBVERT + else Part := TKP_THUMB; + end; + DrawThemeBackground(ThemeServices.Theme[teTrackBar], ACanvas.Handle, Part, Flags, ARect, nil); + end + else if Part = TBCD_CHANNEL then begin + if Vertical then Part := TKP_TRACKVERT + else Part := TKP_TRACK; + DrawThemeBackground(ThemeServices.Theme[teTrackBar], ACanvas.Handle, Part, TKS_NORMAL, ARect, nil); + DrawChannelSelection(ARect); + end; + sknNone: + if Part = TBCD_THUMB then begin + ACanvas.Brush.Color := clBtnFace; + ACanvas.FillRect(ARect); + DrawFrameControl(ACanvas.Handle, ARect, DFC_BUTTON, DFCS_BUTTONPUSH); + end + else if Part = TBCD_CHANNEL then begin + ACanvas.Brush.Color := clWindow; + ACanvas.FillRect(ARect); + ExtCtrls.Frame3D(ACanvas, ARect, clBtnShadow, clBtnHighlight, 1); + ExtCtrls.Frame3D(ACanvas, ARect, cl3DDkShadow, clBtnFace, 1); + DrawChannelSelection(ARect); + end; + sknSkin: + if Part = TBCD_THUMB then begin + if Pushed then + CurrentSkin.PaintBackground(ACanvas, ARect, skncTrackBarButton, sknsPushed, True, True) + else + CurrentSkin.PaintBackground(ACanvas, ARect, skncTrackBarButton, sknsNormal, True, True); + end + else if Part = TBCD_CHANNEL then begin + CurrentSkin.PaintBackground(ACanvas, ARect, skncTrackBar, sknsNormal, True, True); + DrawChannelSelection(ARect); + end; + end; +end; + +procedure SpInvalidateSpTBXControl(AControl: TWinControl; InvalidateChildren, OnlySpTBXControls: Boolean); +var + I: Integer; + ChildW: TWinControl; +begin + // Invalidate will not fire WM_ERASEBKGND, because csOpaque is setted + if Assigned(AControl) and not (csDestroying in AControl.ComponentState) and AControl.HandleAllocated then + begin + if InvalidateChildren then begin + if OnlySpTBXControls then begin + RedrawWindow(AControl.Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE); + // Only invalidate SpTBXControls + for I := 0 to AControl.ControlCount - 1 do + if Assigned(AControl.Controls[I]) and (AControl.Controls[I] is TWinControl) then begin + ChildW := AControl.Controls[I] as TWinControl; + if ChildW is TSpTBXTextObject then + RedrawWindow(ChildW.Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE) + else + PostMessage(ChildW.Handle, CM_SPTBXCONTROLSINVALIDATE, ChildW.Width, ChildW.Height); + end; + end + else + RedrawWindow(AControl.Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN); + end + else + RedrawWindow(AControl.Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE); + end; +end; + +procedure ApplyMargins(var R: TRect; const Margins: TRect); overload; +begin + with Margins do begin + Inc(R.Left, Left); Inc(R.Top, Top); + Dec(R.Right, Right); Dec(R.Bottom, Bottom); + end; +end; + +function GetRealAlignment(Control: TControl): TAlignment; +const + ReverseAlignment: array [TAlignment] of TAlignment = (taRightJustify, taLeftJustify, taCenter); +begin + Result := Control.GetControlsAlignment; + if Control.UseRightToLeftAlignment then Result := ReverseAlignment[Result]; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomPanel } + +constructor TSpTBXCustomPanel.Create(AOwner: TComponent); +begin + inherited; + ControlStyle := ControlStyle + [csAcceptsControls]; + + FBackground := TBitmap.Create; + + FBorders := True; + FBorderType := pbrEtched; + FSkinType := sknSkin; + Color := clNone; + ParentColor := False; + SkinManager.AddSkinNotification(Self); +end; + +destructor TSpTBXCustomPanel.Destroy; +begin + FreeAndNil(FBackground); + SkinManager.RemoveSkinNotification(Self); + inherited; +end; + +procedure TSpTBXCustomPanel.CreateParams(var Params: TCreateParams); +begin + inherited CreateParams(Params); + if not (csDesigning in ComponentState) then begin + with Params do + Style := Style or WS_CLIPCHILDREN; + with Params.WindowClass do + Style := Style and not (CS_HREDRAW or CS_VREDRAW); + end; +end; + +procedure TSpTBXCustomPanel.AdjustClientRect(var Rect: TRect); +begin + inherited AdjustClientRect(Rect); + InflateRect(Rect, -2, -2); +end; + +procedure TSpTBXCustomPanel.InvalidateBackground(InvalidateChildren: Boolean); +begin + // Force background repaint + if Assigned(FBackground) then + FBackground.Width := 1; + SpInvalidateSpTBXControl(Self, InvalidateChildren, True); +end; + +procedure TSpTBXCustomPanel.SetBorders(const Value: Boolean); +begin + if FBorders <> Value then begin + FBorders := Value; + InvalidateBackground; + end; +end; + +procedure TSpTBXCustomPanel.SetBorderType(const Value: TSpTBXPanelBorder); +begin + if FBorderType <> Value then begin + FBorderType := Value; + InvalidateBackground; + end; +end; + +procedure TSpTBXCustomPanel.SetSkinType(const Value: TSpTBXSkinType); +begin + if Value <> FSkinType then begin + FSkinType := Value; + InvalidateBackground(False); + end; +end; + +procedure TSpTBXCustomPanel.SetTBXStyleBackground(const Value: Boolean); +begin + if FTBXStyleBackground <> Value then begin + FTBXStyleBackground := Value; + InvalidateBackground; + end; +end; + +procedure TSpTBXCustomPanel.DoDrawBackground(ACanvas: TCanvas; + ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +begin + if Assigned(FOnDrawBackground) then FOnDrawBackground(Self, ACanvas, ARect, + PaintStage, PaintDefault); +end; + +procedure TSpTBXCustomPanel.DrawBackground(ACanvas: TCanvas; ARect: TRect); +begin + SpDrawXPPanel(ACanvas, ARect, True, FTBXStyleBackground, FSkinType, FBorderType); +end; + +procedure TSpTBXCustomPanel.CMFontChanged(var Message: TMessage); +begin + inherited; + InvalidateBackground(False); +end; + +procedure TSpTBXCustomPanel.CMSpTBXControlsInvalidate(var Message: TMessage); +begin + InvalidateBackground; + Message.Result := 1; +end; + +procedure TSpTBXCustomPanel.WMEraseBkgnd(var Message: TMessage); +var + R, R2: TRect; + PaintDefault: Boolean; + ACanvas: TCanvas; +begin + Message.Result := 1; + + if (not DoubleBuffered or (Message.wParam = Message.lParam)) and + not (csDestroying in ComponentState) and Assigned(FBackground) then + begin + ACanvas := TCanvas.Create; + try + ACanvas.Handle := TWMEraseBkgnd(Message).DC; + R := ClientRect; + + if (FBackground.Width = R.Right) and (FBackground.Height = R.Bottom) and not Assigned(FOnDrawBackground) then + ACanvas.Draw(R.Left, R.Top, FBackground) + else begin + FBackground.Width := R.Right; + FBackground.Height := R.Bottom; + + if (Color = clNone) and Assigned(Parent) then begin + // The Panel is a special component, it has the ability + // to paint the parent background on its children controls. + // For that it receives WM_ERASEBKGND messages from its children + // via SpDrawParentBackground. + SpDrawParentBackground(Self, FBackground.Canvas.Handle, R); + // PerformEraseBackground(Self, FBackground.Canvas.Handle); + end + else + Windows.FillRect(FBackground.Canvas.Handle, ClientRect, Brush.Handle); + + // Set the Font after SpDrawParentBackground, DrawThemeParentBackground, + // or PerformEraseBackground. + // The API messes the font, it seems it destroys it. + // For more info see: + // - TCustomActionControl.DrawBackground for more info. + // - Theme Explorer Main.pas TMainForm.ControlMessage + // (http://www.soft-gems.net:8080/browse/Demos) + FBackground.Canvas.Font.Handle := 0; // Reset the font, it gets destroyed + FBackground.Canvas.Font.Color := $010101; // Force a change + FBackground.Canvas.Font.Assign(Self.Font); + + PaintDefault := True; + DoDrawBackground(FBackground.Canvas, R, pstPrePaint, PaintDefault); + if PaintDefault then begin + if not FBorders then begin + R2 := R; + InflateRect(R2, 3, 3); + DrawBackground(FBackground.Canvas, R2); + end + else + DrawBackground(FBackground.Canvas, R); + end; + PaintDefault := True; + DoDrawBackground(FBackground.Canvas, R, pstPostPaint, PaintDefault); + + ACanvas.Draw(R.Left, R.Top, FBackground); + end; + finally + ACanvas.Handle := 0; + ACanvas.Free; + end; + end; +end; + +procedure TSpTBXCustomPanel.WMWindowPosChanged(var Message: TWMWindowPosChanged); +begin + inherited; + InvalidateBackground; +end; + +procedure TSpTBXCustomPanel.WMSpSkinChange(var Message: TMessage); +begin + InvalidateBackground; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXPanel } + +procedure TSpTBXPanel.DrawBackground(ACanvas: TCanvas; ARect: TRect); +begin + if not TBXStyleBackground and FHotTrack then begin + if SpTBXSkinType(SkinType) = sknNone then + SpDrawXPPanelBorder(ACanvas, ARect, pbrDoubleSunken) + else + SpDrawXPEditFrame(ACanvas, ARect, Enabled, FHotTracking, SkinType, True, True); + end + else + inherited; +end; + +procedure TSpTBXPanel.CMFocusChanged(var Message: TCMFocusChanged); +begin + inherited; + if FHotTrack and Assigned(Message.Sender) then begin + FChildFocused := SpFindControl(Self, Message.Sender) > -1; + if FChildFocused <> FHotTracking then + SetHotTracking(FChildFocused); + end; +end; + +procedure TSpTBXPanel.CMMouseEnter(var Message: TMessage); +begin + inherited; + if FHotTrack and not FHotTracking then + SetHotTracking(True); +end; + +procedure TSpTBXPanel.CMMouseLeave(var Message: TMessage); +begin + inherited; + if FHotTrack and FHotTracking and not FChildFocused then + SetHotTracking(False); +end; + +procedure TSpTBXPanel.SetHotTrack(const Value: Boolean); +begin + if FHotTrack <> Value then begin + FHotTrack := Value; + InvalidateBackground(False); + end; +end; + +procedure TSpTBXPanel.SetHotTracking(const Value: Boolean); +begin + if SpTBXSkinType(SkinType) = sknSkin then begin + FHotTracking := Value; + InvalidateBackground(False); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomGroupBox } + +constructor TSpTBXCustomGroupBox.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + ControlStyle := ControlStyle + [csSetCaption]; + Width := 185; + Height := 105; +end; + +procedure TSpTBXCustomGroupBox.AdjustClientRect(var Rect: TRect); +var + R: TRect; + H: Integer; +begin + inherited AdjustClientRect(Rect); + Canvas.Font := Font; + R := Rect; + H := SpDrawXPText(Canvas, '0', R, DT_SINGLELINE or DT_CALCRECT); + Inc(Rect.Top, H); +end; + +procedure TSpTBXCustomGroupBox.CMDialogChar(var Message: TCMDialogChar); +begin + with Message do + if IsAccel(CharCode, Caption) and SpCanFocus(Self) then begin + SelectFirst; + Result := 1; + end + else + inherited; +end; + +procedure TSpTBXCustomGroupBox.CMTextChanged(var Message: TMessage); +begin + inherited; + InvalidateBackground(False); + Realign; +end; + +procedure TSpTBXCustomGroupBox.DrawBackground(ACanvas: TCanvas; ARect: TRect); +var + Flags: Cardinal; +begin + Flags := DT_SINGLELINE; + if UseRightToLeftAlignment then + Flags := Flags or DT_RTLREADING; + SpDrawXPGroupBox(ACanvas, ARect, Caption, Flags, True, TBXStyleBackground, SkinType); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXTextObjectActionLink } + +{$IFNDEF UNICODE} +procedure TSpTBXTextObjectActionLink.AssignClient(AClient: TObject); +begin + inherited AssignClient(AClient); + FUnicodeClient := AClient as TSpTBXTextObject; +end; + +function TSpTBXTextObjectActionLink.IsCheckedLinked: Boolean; +begin + Result := inherited IsCheckedLinked and + (FUnicodeClient.Checked = (Action as TCustomAction).Checked); +end; + +function TSpTBXTextObjectActionLink.IsCaptionLinked: Boolean; +begin + if (Action is TCustomAction) and Supports(Action, ITntAction) then + Result := FUnicodeClient.Caption = TntActnList.TntAction_GetCaption(Action as TCustomAction) + else + Result := inherited IsCaptionLinked; +end; + +function TSpTBXTextObjectActionLink.IsHintLinked: Boolean; +begin + if (Action is TCustomAction) and Supports(Action, ITntAction) then + Result := FUnicodeClient.Hint = TntActnList.TntAction_GetHint(Action as TCustomAction) + else + Result := inherited IsHintLinked; +end; + +procedure TSpTBXTextObjectActionLink.SetCaption(const Value: String); +begin + if IsCaptionLinked then + if (Action is TCustomAction) and Supports(Action, ITntAction) then + FUnicodeClient.Caption := TntActnList.TntAction_GetNewCaption(Action as TCustomAction, Value) + else + FUnicodeClient.Caption := Value; +end; + +procedure TSpTBXTextObjectActionLink.SetChecked(Value: Boolean); +begin + if IsCheckedLinked then FUnicodeClient.Checked := Value; +end; + +procedure TSpTBXTextObjectActionLink.SetHint(const Value: String); +begin + if IsHintLinked then + if (Action is TCustomAction) and Supports(Action, ITntAction) then + FUnicodeClient.Hint := TntActnList.TntAction_GetNewHint(Action as TCustomAction, Value) + else + FUnicodeClient.Hint := Value; +end; + +procedure TSpTBXTextObjectActionLink.SetImageIndex(Value: Integer); +begin + if IsImageIndexLinked then FUnicodeClient.ImageIndex := Value; +end; +{$ENDIF} + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXTextObject } + +constructor TSpTBXTextObject.Create(AOwner: TComponent); +begin + inherited; + ControlStyle := ControlStyle + [csClickEvents, csDoubleClicks, csSetCaption] - [csAcceptsControls, csOpaque]; + + FImageIndex := -1; + FImageChangeLink := TChangeLink.Create; + FImageChangeLink.OnChange := ImageListChange; + + FAlignment := taLeftJustify; + FCaptionGlowColor := clYellow; + FDisabledIconCorrection := True; + FDrawPushedCaption := False; + FShowAccelChar := True; + FSkinType := sknSkin; + + Autosize := True; + Color := clNone; + DoubleBuffered := True; + ParentColor := False; + TabStop := True; + Width := 100; + SkinManager.AddSkinNotification(Self); +end; + +destructor TSpTBXTextObject.Destroy; +begin + FImageChangeLink.Free; + SkinManager.RemoveSkinNotification(Self); + + inherited; +end; + +procedure TSpTBXTextObject.CreateParams(var Params: TCreateParams); +begin + inherited CreateParams(Params); + { + if not (csDesigning in ComponentState) then + with Params.WindowClass do + Style := Style and not (CS_HREDRAW or CS_VREDRAW); + } +end; + +procedure TSpTBXTextObject.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if Operation = opRemove then + if AComponent = Images then SetImages(nil); +end; + +procedure TSpTBXTextObject.DefineProperties(Filer: TFiler); +begin + inherited; + + // [Backward-Compatibility]: Don't read/save LinkFont, it's not used anymore + Filer.DefineProperty('LinkFont.Charset', ReadLinkFont, nil, False); + Filer.DefineProperty('LinkFont.Color', ReadLinkFont, nil, False); + Filer.DefineProperty('LinkFont.Height', ReadLinkFont, nil, False); + Filer.DefineProperty('LinkFont.Name', ReadLinkFont, nil, False); + Filer.DefineProperty('LinkFont.Orientation', ReadLinkFont, nil, False); + Filer.DefineProperty('LinkFont.Pitch', ReadLinkFont, nil, False); + Filer.DefineProperty('LinkFont.Style', ReadLinkFont, nil, False); + + Filer.DefineProperty('EditButton.LinkFont.Charset', ReadLinkFont, nil, False); + Filer.DefineProperty('EditButton.LinkFont.Color', ReadLinkFont, nil, False); + Filer.DefineProperty('EditButton.LinkFont.Height', ReadLinkFont, nil, False); + Filer.DefineProperty('EditButton.LinkFont.Name', ReadLinkFont, nil, False); + Filer.DefineProperty('EditButton.LinkFont.Orientation', ReadLinkFont, nil, False); + Filer.DefineProperty('EditButton.LinkFont.Pitch', ReadLinkFont, nil, False); + Filer.DefineProperty('EditButton.LinkFont.Style', ReadLinkFont, nil, False); + + Filer.DefineProperty('SpinButton.LinkFont.Charset', ReadLinkFont, nil, False); + Filer.DefineProperty('SpinButton.LinkFont.Color', ReadLinkFont, nil, False); + Filer.DefineProperty('SpinButton.LinkFont.Height', ReadLinkFont, nil, False); + Filer.DefineProperty('SpinButton.LinkFont.Name', ReadLinkFont, nil, False); + Filer.DefineProperty('SpinButton.LinkFont.Orientation', ReadLinkFont, nil, False); + Filer.DefineProperty('SpinButton.LinkFont.Pitch', ReadLinkFont, nil, False); + Filer.DefineProperty('SpinButton.LinkFont.Style', ReadLinkFont, nil, False); +end; + +function TSpTBXTextObject.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TSpTBXTextObjectActionLink; +end; + +procedure TSpTBXTextObject.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + inherited; + + if Sender is TCustomAction then + with TCustomAction(Sender) do begin + if not CheckDefaults or (Self.Checked = False) then + Self.Checked := Checked; + if not CheckDefaults or (Self.ImageIndex = -1) then + Self.ImageIndex := ImageIndex; + end; +end; + +procedure TSpTBXTextObject.AdjustFont(AFont: TFont); +begin + if (FLinkText <> '') and MouseInControl then begin + AFont.Color := clBlue; + AFont.Style := AFont.Style + [fsUnderline]; + end; +end; + +procedure TSpTBXTextObject.AdjustBounds; +var + NewWidth, NewHeight: Integer; +begin + if HandleAllocated and not FUpdating and ([csReading, csLoading] * ComponentState = []) and AutoSize then + begin + FUpdating := True; + try + NewWidth := Width; + NewHeight := 0; + DoAdjustBounds(NewWidth, NewHeight); + SetBounds(Left, Top, NewWidth, NewHeight); + finally + FUpdating := False; + end; + end; +end; + +function TSpTBXTextObject.CanFocus: Boolean; +begin + Result := False; +end; + +procedure TSpTBXTextObject.Click; +begin + if not (csLoading in ComponentState) then begin + Invalidate; + inherited; + ExecuteLink; + end; +end; + +function TSpTBXTextObject.CanAutoSize(var NewWidth, NewHeight: Integer): Boolean; +begin + if not FUpdating and ([csReading, csLoading] * ComponentState = []) and AutoSize then begin + FUpdating := True; + try + NewHeight := 0; + DoAdjustBounds(NewWidth, NewHeight); + Result := True; + finally + FUpdating := False; + end; + end + else + Result := False; +end; + +procedure TSpTBXTextObject.DoAdjustBounds(var NewWidth, NewHeight: Integer); +var + R, R1, R2: TRect; +begin + GetSize(R, R1, R2); + NewHeight := R.Bottom - R.Top; + if Wrapping = twNone then + NewWidth := R.Right - R.Left; +end; + +procedure TSpTBXTextObject.DoDrawHint(AHintBitmap: TBitmap; + var AHint: Widestring; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawHint) then FOnDrawHint(Self, AHintBitmap, AHint, PaintDefault); +end; + +function TSpTBXTextObject.DoDrawItem(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage): Boolean; +begin + Result := True; + if Assigned(FOnDraw) then FOnDraw(Self, ACanvas, ARect, PaintStage, Result); +end; + +function TSpTBXTextObject.DoDrawText(ACanvas: TCanvas; var ARect: TRect; + Flags: Longint): Integer; +var + PaintDefault: Boolean; + GlyphSize, DummyRightGlyphSize: TSize; + DummyRightGlyphRect: TRect; + R, R1, R2: TRect; + WS: WideString; + TextFlags: Cardinal; + State: TSpTBXSkinStatesType; +begin + Result := 0; + WS := Caption; + TextFlags := Flags; + if TextFlags and DT_CALCRECT = 0 then begin + ACanvas.Brush.Style := bsClear; + State := CurrentSkin.GetState(Enabled, Pushed, MouseInControl, Checked); + + PaintDefault := True; + if Assigned(FOnDrawCaption) then + FOnDrawCaption(Self, ACanvas, ClientRect, State, WS, ARect, TextFlags, False, pstPrePaint, PaintDefault); + + if PaintDefault then begin + // Calc the rects + GlyphSize := GetGlyphSize; + DummyRightGlyphSize.cx := 0; + DummyRightGlyphSize.cy := 0; + DummyRightGlyphRect := Rect(0, 0, 0, 0); + SpCalcXPText(ACanvas, ARect, WS, GetRealAlignment(Self), TextFlags, GlyphSize, DummyRightGlyphSize, FGlyphLayout, DrawPushedCaption and Pushed, R1, R2, DummyRightGlyphRect, FCaptionRoatationAngle); + + // Paint the text + if not Enabled then + if SpTBXSkinType(FSkinType) = sknNone then begin + OffsetRect(R1, 1, 1); + ACanvas.Font.Color := clBtnHighlight; + SpDrawXPText(ACanvas, WS, R1, TextFlags, FCaptionGlow, FCaptionGlowColor, FCaptionRoatationAngle); + OffsetRect(R1, -1, -1); + ACanvas.Font.Color := clGrayText; + end; + SpDrawXPText(ACanvas, WS, R1, TextFlags, FCaptionGlow, FCaptionGlowColor, FCaptionRoatationAngle); + + // Paint the glyph + DoInternalGlyphDraw(ACanvas, R2); + end; + + PaintDefault := True; + if Assigned(FOnDrawCaption) then + FOnDrawCaption(Self, ACanvas, ClientRect, State, WS, ARect, TextFlags, False, pstPostPaint, PaintDefault); + if PaintDefault then + if GetFocused then begin + R := ClientRect; + SpDrawFocusRect(ACanvas, GetFocusRect(R, R1, R2)); + end; + end + else + Result := SpDrawXPText(ACanvas, WS, ARect, TextFlags); +end; + +procedure TSpTBXTextObject.DoGetImageIndex(var AImageList: TCustomImageList; var AImageIndex: Integer); +begin + if Assigned(FOnGetImageIndex) then FOnGetImageIndex(Self, AImageList, AImageIndex); +end; + +procedure TSpTBXTextObject.DoInternalGlyphDraw(ACanvas: TCanvas; + AGlyphRect: TRect); +var + I: Integer; + IL: TCustomImageList; +begin + IL := FImages; + I := FImageIndex; + DoGetImageIndex(IL, I); + if Assigned(IL) and (I > -1) and (I < IL.Count) then + SpDrawImageList(ACanvas, AGlyphRect, IL, I, Enabled, FDisabledIconCorrection) +end; + +procedure TSpTBXTextObject.DoMouseEnter; +begin + Invalidate; + if Assigned(FOnMouseEnter) then FOnMouseEnter(Self); +end; + +procedure TSpTBXTextObject.DoMouseLeave; +begin + Invalidate; + if Assigned(FOnMouseLeave) then FOnMouseLeave(Self); +end; + +procedure TSpTBXTextObject.ExecuteLink; +begin + if FLinkText <> '' then + if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then + ShellExecuteA(Application.Handle, 'open', PAnsiChar(AnsiString(FLinkText)), PAnsiChar(AnsiString(FLinkTextParams)), '', SW_SHOWNORMAL) + else + ShellExecuteW(Application.Handle, 'open', PWideChar(FLinkText), PWideChar(FLinkTextParams), '', SW_SHOWNORMAL); +end; + +function TSpTBXTextObject.GetControlsAlignment: TAlignment; +begin + Result := FAlignment; +end; + +function TSpTBXTextObject.GetTextFlags: Cardinal; +const + Alignments: array [TAlignment] of Integer = (DT_LEFT, DT_RIGHT, DT_CENTER); + WordWraps: array [TTextWrapping] of Integer = (DT_SINGLELINE, + DT_SINGLELINE or DT_END_ELLIPSIS, + DT_SINGLELINE or DT_PATH_ELLIPSIS, DT_WORDBREAK); + ShowAccelChars: array [Boolean] of Integer = (DT_NOPREFIX, 0); + SystemAccelChars: array [Boolean] of Integer = (DT_HIDEPREFIX, 0); +begin + // Note on SystemAccelChars: custom controls need to update the accel painting + // in response to WM_UPDATEUISTATE, call WM_QUERYUISTATE to get the accel + // painting state: + // http://blogs.msdn.com/oldnewthing/archive/2005/05/03/414317.aspx + // + // Another way of doing it is updating a flag in WM_UPDATEUISTATE, without + // calling WM_QUERYUISTATE everytime the control needs to be painted: + // begin + // if LoWord(Message.WParam) and UISF_HIDEACCEL = UISF_HIDEACCEL then begin + // if HiWord(Message.WParam) and UIS_CLEAR = UIS_CLEAR then + // FSystemShowAccelChar := True; + // if HiWord(Message.WParam) and UIS_SET = UIS_SET then + // FSystemShowAccelChar := False; + // end; + // inherited; + // end; + // + // To test this use the mouse to run the app on the IDE, don't use F9 + // otherwise the accel will always be visible + + Result := DT_EXPANDTABS or WordWraps[Wrapping] or + Alignments[GetRealAlignment(Self)] or + ShowAccelChars[ShowAccelChar] or SystemAccelChars[SendMessage(Handle, WM_QUERYUISTATE, 0, 0) and UISF_HIDEACCEL = 0]; + Result := DrawTextBiDiModeFlags(Result); +end; + +function TSpTBXTextObject.GetFocusRect(R, TextR, GlyphR: TRect): TRect; +begin + if Caption = '' then + Result := Rect(0, 0, 0, 0) + else begin + InflateRect(TextR, 1, 1); + Result := TextR; + end; +end; + +function TSpTBXTextObject.GetGlyphSize: TSize; +var + I: Integer; + IL: TCustomImageList; +begin + IL := FImages; + I := FImageIndex; + DoGetImageIndex(IL, I); + if Assigned(IL) and (I > -1) and (I < IL.Count) then begin + Result.cx := IL.Width; + Result.cy := IL.Height; + end + else begin + Result.cx := 0; + Result.cy := 0; + end; +end; + +function TSpTBXTextObject.GetFocused: Boolean; +begin + Result := Focused; +end; + +function TSpTBXTextObject.GetPushed: Boolean; +begin + Result := FPushed and MouseInControl; +end; + +procedure TSpTBXTextObject.GetSize(out TotalR, TextR, GlyphR: TRect); +// Size of Text + Glyph + TextMargin + Margins +var + GlyphSize, DummyRightGlyphSize: TSize; + DummyRightGlyphRect: TRect; + R: TRect; +begin + GlyphSize := GetGlyphSize; + DummyRightGlyphSize.cx := 0; + DummyRightGlyphSize.cy := 0; + DummyRightGlyphRect := Rect(0, 0, 0, 0); + R := ClientRect; + ApplyMargins(R, GetTextMargins); + + Canvas.Font.Assign(Font); + AdjustFont(Canvas.Font); + SpCalcXPText(Canvas, R, Caption, GetRealAlignment(Self), GetTextFlags, GlyphSize, DummyRightGlyphSize, + FGlyphLayout, DrawPushedCaption and Pushed, TextR, GlyphR, DummyRightGlyphRect); + + UnionRect(TotalR, TextR, GlyphR); + + {$IF CompilerVersion > 17} + if Autosize then + with Margins do begin + Inc(TotalR.Right, Left + Right); + Inc(TotalR.Bottom, Top + Bottom); + end; + {$IFEND} +end; + +function TSpTBXTextObject.GetTextMargins: TRect; +begin + Result := Rect(0, 0, 0, 0); +end; + +procedure TSpTBXTextObject.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + if (Button = mbLeft) and Enabled and not FPushed then begin + FPushed := True; + if not Focused and CanFocus then + SetFocus // Invalidates the canvas + else + Invalidate; + end; + inherited; +end; + +procedure TSpTBXTextObject.MouseMove(Shift: TShiftState; X, Y: Integer); +begin + if FPushed then + UpdateTracking; + inherited; +end; + +procedure TSpTBXTextObject.MouseUp(Button: TMouseButton; Shift: TShiftState; X, + Y: Integer); +begin + FPushed := False; + Invalidate; + inherited; +end; + +procedure TSpTBXTextObject.KeyDown(var Key: Word; Shift: TShiftState); +begin + inherited; + if (Key = VK_SPACE) and FSpaceAsClick then begin + FPushed := True; + FMouseInControl := True; + Invalidate; + end; +end; + +procedure TSpTBXTextObject.KeyUp(var Key: Word; Shift: TShiftState); +begin + if (Key = VK_SPACE) and FSpaceAsClick and FPushed then begin + FPushed := False; + FMouseInControl := False; + Click; + Invalidate; + end; + inherited; +end; + +procedure TSpTBXTextObject.Paint; +var + R, TextR: TRect; +begin + R := ClientRect; + Canvas.Font.Assign(Font); + AdjustFont(Canvas.Font); + // Draw the background + DoDrawItem(Canvas, R, pstPrePaint); + // Draw the text + TextR := R; + ApplyMargins(TextR, GetTextMargins); + DoDrawText(Canvas, TextR, GetTextFlags); + // Draw the Focus, Icon and Text + DoDrawItem(Canvas, R, pstPostPaint); +end; + +procedure TSpTBXTextObject.ReadLinkFont(Reader: TReader); +begin + // [Backward-Compatibility] + Reader.SkipValue; +end; + +procedure TSpTBXTextObject.SetAlignment(const Value: TAlignment); +begin + if FAlignment <> Value then begin + FAlignment := Value; + Invalidate; + end; +end; + +procedure TSpTBXTextObject.Loaded; +begin + inherited; + AdjustBounds; +end; + +procedure TSpTBXTextObject.SetCaptionGlow(const Value: TSpGlowDirection); +begin + if FCaptionGlow <> Value then begin + FCaptionGlow := Value; + Invalidate; + end; +end; + +procedure TSpTBXTextObject.SetCaptionGlowColor(const Value: TColor); +begin + if FCaptionGlowColor <> Value then begin + FCaptionGlowColor := Value; + Invalidate; + end; +end; + +procedure TSpTBXTextObject.SetCaptionRoatationAngle(const Value: TSpTextRotationAngle); +begin + if FCaptionRoatationAngle <> Value then begin + FCaptionRoatationAngle := Value; + Invalidate; + end; +end; + +function TSpTBXTextObject.GetChecked: Boolean; +begin + Result := FChecked; +end; + +procedure TSpTBXTextObject.SetChecked(Value: Boolean); +begin + if Value <> FChecked then begin + FChecked := Value; + Invalidate; + end; +end; + +procedure TSpTBXTextObject.SetGlyphLayout(const Value: TSpGlyphLayout); +begin + if FGlyphLayout <> Value then begin + FGlyphLayout := Value; + Invalidate; + end; +end; + +function TSpTBXTextObject.IsImageIndexValid: Boolean; +var + I: Integer; + IL: TCustomImageList; +begin + IL := FImages; + I := FImageIndex; + DoGetImageIndex(IL, I); + Result := Assigned(IL) and (I > -1) and (I < IL.Count); +end; + +procedure TSpTBXTextObject.ImageListChange(Sender: TObject); +begin + if Sender = Images then begin + Invalidate; + AdjustBounds; + end; +end; + +procedure TSpTBXTextObject.SetImageIndex(const Value: TImageIndex); +begin + if FImageIndex <> Value then begin + FImageIndex := Value; + if Assigned(Images) then Invalidate; + AdjustBounds; + end; +end; + +procedure TSpTBXTextObject.SetImages(const Value: TCustomImageList); +begin + if FImages <> nil then FImages.UnRegisterChanges(FImageChangeLink); + FImages := Value; + if FImages <> nil then begin + FImages.RegisterChanges(FImageChangeLink); + FImages.FreeNotification(Self); + end; + Invalidate; + AdjustBounds; +end; + +procedure TSpTBXTextObject.SetShowAccelChar(Value: Boolean); +begin + if FShowAccelChar <> Value then begin + FShowAccelChar := Value; + AdjustBounds; + Invalidate; + end; +end; + +procedure TSpTBXTextObject.SetSkinType(const Value: TSpTBXSkinType); +begin + if FSkinType <> Value then begin + FSkinType := Value; + Invalidate; + end; +end; + +procedure TSpTBXTextObject.SetWrapping(Value: TTextWrapping); +begin + if FWrapping <> Value then begin + FWrapping := Value; + AdjustBounds; + Invalidate; + end; +end; + +procedure TSpTBXTextObject.UpdateTracking(ForceMouseLeave: Boolean = False); +var + P: TPoint; + IsInControl: Boolean; +begin + if ForceMouseLeave then begin + FMouseInControl := True; + Perform(CM_MOUSELEAVE, 0, 0) + end + else + if Enabled then begin + GetCursorPos(P); + IsInControl := FindDragTarget(P, True) = Self; + + if FMouseInControl <> IsInControl then begin + FMouseInControl := not IsInControl; + if FMouseInControl then + Perform(CM_MOUSELEAVE, 0, 0) + else + Perform(CM_MOUSEENTER, 0, 0); + end; + end; +end; + +procedure TSpTBXTextObject.CMEnabledChanged(var Message: TMessage); +begin + inherited; + if not Enabled and FMouseInControl then begin + FMouseInControl := False; + DoMouseLeave; + Perform(WM_CANCELMODE, 0, 0); + end + else + Invalidate; +end; + +procedure TSpTBXTextObject.CMFontChanged(var Message: TMessage); +begin + inherited; + Invalidate; + AdjustBounds; +end; + +procedure TSpTBXTextObject.CMHintShow(var Message: TCMHintShow); +// Handle the CM_HINTSHOW message to show unicode hints using +// a custom THintWindow. +var + HintInfo: PHintInfo; + WideHint, PrevWideHint: Widestring; + R, TextR: TRect; + PaintDefault: Boolean; +begin + WideHint := Hint; + + // Prepare the HintBitmap + SpStockHintBitmap.Canvas.Font.Assign(Screen.HintFont); + SpStockHintBitmap.Canvas.Font.Color := clInfoText; + SpStockHintBitmap.Canvas.Pen.Color := clBlack; + SpStockHintBitmap.Canvas.Brush.Color := clInfoBk; + TextR := Rect(0, 0, 1, 1); + SpDrawXPText(SpStockHintBitmap.Canvas, WideHint, TextR, DT_NOPREFIX or DT_CALCRECT); + SpStockHintBitmap.Width := TextR.Right + 8; + SpStockHintBitmap.Height := TextR.Bottom + 4; + R := Rect(0, 0, SpStockHintBitmap.Width, SpStockHintBitmap.Height); + SpDrawXPTooltipBackground(SpStockHintBitmap.Canvas, R); + + // Draw the hint in the HintBitmap + PrevWideHint := WideHint; + PaintDefault := True; + DoDrawHint(SpStockHintBitmap, WideHint, PaintDefault); + if PaintDefault then begin + // Prepare the HintInfo + HintInfo := Message.HintInfo; + HintInfo.HintStr := WideHint; + HintInfo.CursorRect := ClientRect; + HintInfo.HintWindowClass := SpTBXHintWindowClass; // Custom HintWindow class + HintInfo.HintData := SpStockHintBitmap; // TApplication.ActivateHint will pass the data to the HintWindow + HintInfo.HideTimeout := 60000; // 1 minute + + // Adjust the bounds and repaint the background if it's needed + if WideHint <> PrevWideHint then begin + TextR := Rect(0, 0, 1, 1); + SpDrawXPText(SpStockHintBitmap.Canvas, WideHint, TextR, DT_NOPREFIX or DT_CALCRECT); + SpStockHintBitmap.Width := TextR.Right + 8; + SpStockHintBitmap.Height := TextR.Bottom + 4; + R := Rect(0, 0, SpStockHintBitmap.Width, SpStockHintBitmap.Height); + SpDrawXPTooltipBackground(SpStockHintBitmap.Canvas, R); + end + else + R := Rect(0, 0, SpStockHintBitmap.Width, SpStockHintBitmap.Height); + + // Draw the hint + OffsetRect(TextR, ((R.Right - TextR.Right) div 2) - 2, (R.Bottom - TextR.Bottom) div 2); + SpDrawXPText(SpStockHintBitmap.Canvas, WideHint, TextR, DT_NOPREFIX); + end; +end; + +procedure TSpTBXTextObject.CMMouseEnter(var Message: TMessage); +begin + inherited; + if not FMouseInControl then begin + FMouseInControl := True; + DoMouseEnter; + end; +end; + +procedure TSpTBXTextObject.CMMouseLeave(var Message: TMessage); +begin + inherited; + if FMouseInControl then begin + FMouseInControl := False; + DoMouseLeave; + end; +end; + +procedure TSpTBXTextObject.CMTextChanged(var Message: TMessage); +begin + inherited; + Invalidate; + AdjustBounds; +end; + +procedure TSpTBXTextObject.WMEraseBkgnd(var Message: TMessage); +begin + if not DoubleBuffered or (Message.wParam = Message.lParam) then + begin + if (Color = clNone) and Assigned(Parent) then + SpDrawParentBackground(Self, TWMEraseBkgnd(Message).DC, ClientRect) + else + Windows.FillRect(TWMEraseBkgnd(Message).DC, ClientRect, Brush.Handle); + end; + Message.Result := 1; +end; + +procedure TSpTBXTextObject.WMKillFocus(var Message: TMessage); +begin + inherited; + FPushed := False; + Invalidate; +end; + +procedure TSpTBXTextObject.WMSetFocus(var Message: TMessage); +begin + inherited; + Invalidate; +end; + +procedure TSpTBXTextObject.WMSetCursor(var Message: TWMSetCursor); +begin + if not (csDesigning in ComponentState) and (Message.CursorWnd = Handle) and + (FLinkText <> '') and MouseInControl and (Screen.Cursor = crDefault) then + begin + // Replace the Delphi hand cursor for the one used by Windows only if + // there is no other cursor assigned. + Windows.SetCursor(Screen.Cursors[crSpTBXNewHandPoint]); + Message.Result := 1; + end + else + inherited; +end; + +procedure TSpTBXTextObject.WMSpSkinChange(var Message: TMessage); +var + R: TRect; +begin + if HandleAllocated then begin + R := ClientRect; + InvalidateRect(Handle, @R, True); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomLabel } + +constructor TSpTBXCustomLabel.Create(AOwner: TComponent); +begin + inherited; + FUnderlineColor := clBtnShadow; + TabStop := False; +end; + +procedure TSpTBXCustomLabel.AdjustFont(AFont: TFont); +var + State: TSpTBXSkinStatesType; +begin + if (LinkText <> '') and MouseInControl then + inherited + else + if (SkinType = sknSkin) and ((AFont.Color = clWindowText) or (AFont.Color = clNone)) then begin + State := CurrentSkin.GetState(Enabled, Pushed, MouseInControl, Checked); + AFont.Color := CurrentSkin.GetTextColor(skncLabel, State); + end; +end; + +function TSpTBXCustomLabel.DoDrawItem(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage): Boolean; +var + C: TColor; +begin + Result := inherited DoDrawItem(ACanvas, ARect, PaintStage); + if Result and (PaintStage = pstPrePaint) and FUnderline then begin + C := ACanvas.Pen.Color; + try + ACanvas.Pen.Color := UnderlineColor; + ACanvas.MoveTo(ARect.Left, ARect.Bottom - 1); + ACanvas.LineTo(ARect.Right, ARect.Bottom - 1); + finally + ACanvas.Pen.Color := C; + end; + end; +end; + +procedure TSpTBXCustomLabel.GetSize(out TotalR, TextR, GlyphR: TRect); +begin + inherited GetSize(TotalR, TextR, GlyphR); + if FUnderline then + Inc(TotalR.Bottom); +end; + +procedure TSpTBXCustomLabel.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if Operation = opRemove then + if AComponent = FocusControl then SetFocusControl(nil); +end; + +procedure TSpTBXCustomLabel.SetFocusControl(const Value: TWinControl); +begin + if FFocusControl <> Value then + begin + FFocusControl := Value; + if FFocusControl <> nil then FFocusControl.FreeNotification(Self); + end; +end; + +procedure TSpTBXCustomLabel.SetUnderline(const Value: Boolean); +begin + if Value <> FUnderline then begin + FUnderline := Value; + Invalidate; + AdjustBounds; + end; +end; + +procedure TSpTBXCustomLabel.SetUnderlineColor(const Value: TColor); +begin + FUnderlineColor := Value; + Invalidate; +end; + +procedure TSpTBXCustomLabel.CMDialogChar(var Message: TCMDialogChar); +begin + if Assigned(FFocusControl) and IsAccel(Message.CharCode, Caption) and SpCanFocus(FFocusControl) then begin + FFocusControl.SetFocus; + Message.Result := 1; + end + else + inherited; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXButtonControl } + +constructor TSpTBXButtonControl.Create(AOwner: TComponent); +begin + inherited; + ControlStyle := ControlStyle - [csDoubleClicks]; + FGroupIndex := 0; +end; + +function TSpTBXButtonControl.CanFocus: Boolean; +var + Control: TWinControl; + Form: TCustomForm; +begin + Result := False; + Form := GetParentForm(Self); + if (Form <> nil) and Form.Visible and Form.Enabled then begin + Control := Self; + while Control <> Form do + begin + if not (Control.Visible and Control.Enabled) then Exit; + Control := Control.Parent; + end; + Result := True; + end; +end; + +function TSpTBXButtonControl.CanUpdateExclusive: Boolean; +begin + Result := FGroupIndex <> 0; +end; + +procedure TSpTBXButtonControl.UpdateExclusive; +var + Msg: TMessage; +begin + if Assigned(Parent) and CanUpdateExclusive then begin + Msg.Msg := CM_SPGROUPINDEXUPDATE; + Msg.WParam := FGroupIndex; + Msg.LParam := Longint(Self); + Msg.Result := 0; + Parent.Broadcast(Msg); + end; +end; + +procedure TSpTBXButtonControl.SetGroupIndex(const Value: Integer); +begin + if FGroupIndex <> Value then begin + FGroupIndex := Value; + UpdateExclusive; + end; +end; + +procedure TSpTBXButtonControl.SetAllowAllUp(const Value: Boolean); +begin + if FAllowAllUp <> Value then begin + FAllowAllUp := Value; + UpdateExclusive; + end; +end; + +procedure TSpTBXButtonControl.SetChecked(Value: Boolean); +begin + inherited; + if Value then UpdateExclusive; +end; + +procedure TSpTBXButtonControl.CMDialogChar(var Message: TCMDialogChar); +begin + if Enabled and ShowAccelChar and IsAccel(Message.CharCode, Caption) and + CanFocus and Visible then + begin + SetFocus; + Click; + Message.Result := 1; + end + else + inherited; +end; + +procedure TSpTBXButtonControl.CMSPGroupIndexUpdate(var Message: TMessage); +var + Sender: TComponent; + SenderButton: TSpTBXButtonControl; +begin + if Message.WParam = FGroupIndex then begin + Sender := TComponent(Message.LParam); + if (Sender <> Self) and (Sender is TSpTBXButtonControl) and (Sender.ClassType = Self.ClassType) then begin + SenderButton := Sender as TSpTBXButtonControl; + FAllowAllUp := SenderButton.AllowAllUp; + if SenderButton.Checked and Checked then + Checked := False; + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomCheckButton } + +function TSpTBXCustomCheckButton.GetGlyphSize: TSize; +begin + Result := inherited GetGlyphSize; + if (Result.cx = 0) or (Result.cy = 0) then begin + Result.cx := 13; + Result.cy := 13; + end; +end; + +procedure TSpTBXCustomCheckButton.GetSize(out TotalR, TextR, GlyphR: TRect); +begin + inherited GetSize(TotalR, TextR, GlyphR); + // Inc TotalR for the FocusRect + if Autosize then begin + Inc(TotalR.Right); + Inc(TotalR.Bottom, 2); + end; +end; + +procedure TSpTBXCustomCheckButton.Toggle; +begin + // Toggle the check state +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomCheckBox } + +constructor TSpTBXCustomCheckBox.Create(AOwner: TComponent); +begin + inherited; + FAllowGrayed := False; + FState := cbUnchecked; + SpaceAsClick := True; +end; + +procedure TSpTBXCustomCheckBox.DoInternalGlyphDraw(ACanvas: TCanvas; + AGlyphRect: TRect); +begin + if IsImageIndexValid then + inherited + else + SpDrawXPCheckBoxGlyph(ACanvas, AGlyphRect, Enabled, State, MouseInControl, Pushed, SkinType); +end; + +procedure TSpTBXCustomCheckBox.AdjustFont(AFont: TFont); +var + State: TSpTBXSkinStatesType; +begin + if (LinkText <> '') and MouseInControl then + inherited + else + if (SkinType = sknSkin) and ((AFont.Color = clWindowText) or (AFont.Color = clNone)) then begin + State := CurrentSkin.GetState(Enabled, Pushed, MouseInControl, Checked); + AFont.Color := CurrentSkin.GetTextColor(skncCheckBox, State); + end; +end; + +procedure TSpTBXCustomCheckBox.Click; +begin + if StateChanged then + inherited + else + Toggle; // Toggle calls OnClick +end; + +function TSpTBXCustomCheckBox.GetChecked: Boolean; +begin + Result := FState = cbChecked; +end; + +procedure TSpTBXCustomCheckBox.SetChecked(Value: Boolean); +begin + if Checked <> Value then begin + inherited; + if Value then SetState(cbChecked) + else SetState(cbUnchecked); + end; +end; + +procedure TSpTBXCustomCheckBox.SetState(const Value: TCheckBoxState); +begin + if (FState <> Value) then begin + FState := Value; + + // When State is changed OnClick must be fired + StateChanged := True; + try + Click; + finally + StateChanged := False; + end; + end; +end; + +procedure TSpTBXCustomCheckBox.Toggle; +begin + case State of + cbUnchecked: if AllowGrayed then SetState(cbGrayed) else SetState(cbChecked); + cbChecked: SetState(cbUnchecked); + cbGrayed: SetState(cbChecked); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomRadioButton } + +constructor TSpTBXCustomRadioButton.Create(AOwner: TComponent); +begin + inherited; + TabStop := False; +end; + +procedure TSpTBXCustomRadioButton.DoInternalGlyphDraw(ACanvas: TCanvas; + AGlyphRect: TRect); +begin + if IsImageIndexValid then + inherited + else + SpDrawXPRadioButtonGlyph(ACanvas, AGlyphRect, Enabled, Checked, MouseInControl, Pushed, SkinType); +end; + +procedure TSpTBXCustomRadioButton.AdjustFont(AFont: TFont); +var + State: TSpTBXSkinStatesType; +begin + if (LinkText <> '') and MouseInControl then + inherited + else + if (SkinType = sknSkin) and ((AFont.Color = clWindowText) or (AFont.Color = clNone)) then begin + State := CurrentSkin.GetState(Enabled, Pushed, MouseInControl, Checked); + AFont.Color := CurrentSkin.GetTextColor(skncRadioButton, State); + end; +end; + +function TSpTBXCustomRadioButton.CanUpdateExclusive: Boolean; +begin + // Special case on RadioButtons, UpdateExclusive on all + // the radiobuttons regardless of the GroupIndex + Result := True; +end; + +procedure TSpTBXCustomRadioButton.Click; +begin + if StateChanged then + inherited + else + if not Checked then Toggle; // Toggle calls OnClick +end; + +procedure TSpTBXCustomRadioButton.CMFocusChanged(var Message: TCMFocusChanged); +begin + inherited; + if Focused then + Toggle; +end; + +procedure TSpTBXCustomRadioButton.SetChecked(Value: Boolean); +var + WasChecked: Boolean; +begin + WasChecked := Checked; + inherited; + TabStop := Value; + // When Checked is true OnClick must be fired + if not WasChecked and Value then begin + StateChanged := True; + try + Click; + finally + StateChanged := False; + end; + end; +end; + +procedure TSpTBXCustomRadioButton.Toggle; +begin + if not Checked then Checked := True; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXRadioGroupButton } + +type + TSpTBXRadioGroupButton = class(TSpTBXRadioButton) + public + constructor InternalCreate(RadioGroup: TSpTBXCustomRadioGroup); + destructor Destroy; override; + end; + +constructor TSpTBXRadioGroupButton.InternalCreate(RadioGroup: TSpTBXCustomRadioGroup); +begin + inherited Create(RadioGroup); + RadioGroup.FButtons.Add(Self); + Parent := RadioGroup; + AutoSize := False; + Visible := False; + Enabled := RadioGroup.Enabled; + ParentShowHint := False; + TabStop := False; + OnClick := RadioGroup.ButtonClick; +end; + +destructor TSpTBXRadioGroupButton.Destroy; +begin + TSpTBXCustomRadioGroup(Owner).FButtons.Remove(Self); + inherited Destroy; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomRadioGroup } + +constructor TSpTBXCustomRadioGroup.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + ControlStyle := ControlStyle - [csAcceptsControls]; + FButtons := TList.Create; + FItems := TTntStringList.Create; + TTntStringList(FItems).OnChange := ItemsChange; + FItemIndex := -1; + FColumns := 1; +end; + +destructor TSpTBXCustomRadioGroup.Destroy; +begin + SetButtonCount(0); + TTntStringList(FItems).OnChange := nil; + FItems.Free; + FButtons.Free; + inherited Destroy; +end; + +procedure TSpTBXCustomRadioGroup.FlipChildren(AllLevels: Boolean); +begin + { The radio buttons are flipped using BiDiMode } +end; + +procedure TSpTBXCustomRadioGroup.ArrangeButtons; +var + ButtonsPerCol, ButtonWidth, ButtonHeight, TopMargin, I: Integer; + DC: HDC; + SaveFont: HFont; + Metrics: TTextMetric; + DeferHandle: THandle; + ALeft: Integer; +begin + if (FButtons.Count <> 0) and not FReading then + begin + DC := GetDC(0); + SaveFont := SelectObject(DC, Font.Handle); + GetTextMetrics(DC, Metrics); + SelectObject(DC, SaveFont); + ReleaseDC(0, DC); + ButtonsPerCol := (FButtons.Count + FColumns - 1) div FColumns; + ButtonWidth := (Width - 10) div FColumns; + I := Height - Metrics.tmHeight - 5; + ButtonHeight := I div ButtonsPerCol; + TopMargin := Metrics.tmHeight + 1 + (I mod ButtonsPerCol) div 2; + DeferHandle := BeginDeferWindowPos(FButtons.Count); + try + for I := 0 to FButtons.Count - 1 do + with TSpTBXRadioGroupButton(FButtons[I]) do + begin + BiDiMode := Self.BiDiMode; + ALeft := (I div ButtonsPerCol) * ButtonWidth + 8; + if UseRightToLeftAlignment then + ALeft := Self.ClientWidth - ALeft - ButtonWidth; + DeferHandle := DeferWindowPos(DeferHandle, Handle, 0, + ALeft, + (I mod ButtonsPerCol) * ButtonHeight + TopMargin, + ButtonWidth, ButtonHeight, + SWP_NOZORDER or SWP_NOACTIVATE); + Visible := True; + end; + finally + EndDeferWindowPos(DeferHandle); + end; + end; +end; + +procedure TSpTBXCustomRadioGroup.ButtonClick(Sender: TObject); +begin + if not FUpdating then begin + FItemIndex := FButtons.IndexOf(Sender); + Changed; + Click; + end; +end; + +procedure TSpTBXCustomRadioGroup.InvalidateBackground(InvalidateChildren: Boolean); +var + I: Integer; + T: TSpTBXSkinType; +begin + inherited; + + if not InvalidateChildren and not (csDestroying in ComponentState) then + if HandleAllocated then begin + T := SkinType; + for I := 0 to FButtons.Count - 1 do + Buttons[I].SkinType := T; + end; +end; + +procedure TSpTBXCustomRadioGroup.ItemsChange(Sender: TObject); +begin + if not FReading then begin + if FItemIndex >= FItems.Count then FItemIndex := FItems.Count - 1; + UpdateButtons; + end; +end; + +procedure TSpTBXCustomRadioGroup.Loaded; +begin + inherited Loaded; + ArrangeButtons; +end; + +procedure TSpTBXCustomRadioGroup.ReadState(Reader: TReader); +begin + FReading := True; + try + inherited ReadState(Reader); + finally + FReading := False; + end; + UpdateButtons; +end; + +procedure TSpTBXCustomRadioGroup.SetButtonCount(Value: Integer); +begin + while FButtons.Count < Value do + TSpTBXRadioGroupButton.InternalCreate(Self); + while FButtons.Count > Value do + TSpTBXRadioGroupButton(FButtons.Last).Free; +end; + +procedure TSpTBXCustomRadioGroup.SetColumns(Value: Integer); +begin + if Value < 1 then Value := 1; + if Value > 16 then Value := 16; + if FColumns <> Value then begin + FColumns := Value; + ArrangeButtons; + Invalidate; + end; +end; + +procedure TSpTBXCustomRadioGroup.SetFocus; +begin + inherited; + if Enabled and (FItemIndex > -1) then + GetButtons(FItemIndex).SetFocus; +end; + +procedure TSpTBXCustomRadioGroup.SetItemIndex(Value: Integer); +begin + if FReading then + FItemIndex := Value + else begin + if Value < -1 then Value := -1; + if Value >= FButtons.Count then Value := FButtons.Count - 1; + if FItemIndex <> Value then + begin + if FItemIndex >= 0 then + GetButtons(FItemIndex).Checked := False; + FItemIndex := Value; + if FItemIndex >= 0 then + GetButtons(FItemIndex).Checked := True; + end; + end; +end; + +procedure TSpTBXCustomRadioGroup.SetItems(Value: TTntStrings); +begin + FItems.Assign(Value); +end; + +procedure TSpTBXCustomRadioGroup.UpdateButtons; +var + I: Integer; +begin + SetButtonCount(FItems.Count); + for I := 0 to FButtons.Count - 1 do + Buttons[I].Caption := FItems[I]; + if FItemIndex >= 0 then begin + FUpdating := True; + try + GetButtons(FItemIndex).Checked := True; + finally + FUpdating := False; + end; + end; + ArrangeButtons; + Invalidate; +end; + +procedure TSpTBXCustomRadioGroup.CMEnabledChanged(var Message: TMessage); +var + I: Integer; +begin + inherited; + for I := 0 to FButtons.Count - 1 do + GetButtons(I).Enabled := Enabled; +end; + +procedure TSpTBXCustomRadioGroup.CMFontChanged(var Message: TMessage); +begin + inherited; + ArrangeButtons; +end; + +procedure TSpTBXCustomRadioGroup.WMSize(var Message: TWMSize); +begin + inherited; + ArrangeButtons; +end; + +procedure TSpTBXCustomRadioGroup.GetChildren(Proc: TGetChildProc; Root: TComponent); +begin + // Do nothing +end; + +function TSpTBXCustomRadioGroup.GetButtons(Index: Integer): TSpTBXRadioButton; +begin + Result := TSpTBXRadioButton(FButtons[Index]); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomButton } + +constructor TSpTBXCustomButton.Create(AOwner: TComponent); +begin + inherited; + + FBitmapTransparent := True; + FBitmap := TBitmap.Create; + FBitmap.OnChange := BitmapChanged; + + FPopupControl := Self; + FDropDownArrow := True; + Alignment := taCenter; + Autosize := False; + DrawPushedCaption := True; + SpaceAsClick := True; + Width := 75; + Height := 25; +end; + +destructor TSpTBXCustomButton.Destroy; +begin + StopRepeat; + FBitmap.Free; + inherited; +end; + +procedure TSpTBXCustomButton.CreateWnd; +begin + inherited; + FActive := FDefault; +end; + +procedure TSpTBXCustomButton.AdjustFont(AFont: TFont); +var + State: TSpTBXSkinStatesType; +begin + if (LinkText <> '') and MouseInControl then + inherited + else + if (SkinType = sknSkin) and ((AFont.Color = clWindowText) or (AFont.Color = clNone)) then begin + State := CurrentSkin.GetState(Enabled, Pushed, MouseInControl, Checked); + AFont.Color := CurrentSkin.GetTextColor(skncButton, State); + end; +end; + +procedure TSpTBXCustomButton.BitmapChanged(Sender: TObject); +begin + Invalidate; +end; + +function TSpTBXCustomButton.BitmapValid: boolean; +begin + Result := (Bitmap <> nil) and (not Bitmap.Empty) and (Bitmap.Height mod ConstStatesCount = 0); +end; + +procedure TSpTBXCustomButton.Click; +var + P: TPoint; + Form: TCustomForm; + M: TPopupMenu; + SpTBXPopup: ISpTBXPopupMenu; + + procedure RemoveClicks; + var + RepostList: TList; + Repost: Boolean; + I: Integer; + Msg: TMsg; + P: TPoint; + begin + RepostList := TList.Create; + try + while PeekMessage(Msg, 0, WM_LBUTTONDOWN, WM_MBUTTONDBLCLK, PM_REMOVE) do + with Msg do + begin + Repost := True; + case Message of + WM_QUIT: begin + { Throw back any WM_QUIT messages } + PostQuitMessage(wParam); + Break; + end; + WM_LBUTTONDOWN, WM_LBUTTONDBLCLK, + WM_RBUTTONDOWN, WM_RBUTTONDBLCLK, + WM_MBUTTONDOWN, WM_MBUTTONDBLCLK: begin + P := SmallPointToPoint(TSmallPoint(lParam)); + Windows.ClientToScreen(hwnd, P); + if FindDragTarget(P, True) = Self then Repost := False; + end; + end; + if Repost then + begin + RepostList.Add(AllocMem(SizeOf(TMsg))); + PMsg(RepostList.Last)^ := Msg; + end; + end; + + for I := 0 to RepostList.Count-1 do + begin + with PMsg(RepostList[I])^ do PostMessage(hwnd, message, wParam, lParam); + FreeMem(RepostList[I]); + end; + finally + RepostList.Free; + end; + end; + +begin + if not FRepeating then begin + M := GetInternalDropDownMenu; + if Assigned(M) then begin + FDropDownMenuVisible := True; + try + UpdateTracking(True); + MouseCapture := False; + M.PopupComponent := Self; + + if M.GetInterface(ISpTBXPopupMenu, SpTBXPopup) then begin + if not SpTBXPopup.InternalPopup(0, 0, False, FPopupControl) then + FDropDownMenuVisible := False; + end + else begin + P := ClientToScreen(Point(0, Height)); + M.Popup(P.X, P.Y); + FDropDownMenuVisible := False; + end; + finally + Invalidate; + RemoveClicks; + end; + Exit; // don't call the Click handler if the DropDownMenu is shown + end; + + Form := GetParentForm(Self); + if Assigned(Form) then Form.ModalResult := FModalResult; + end; + + inherited; +end; + +function TSpTBXCustomButton.DoDrawDropDownArrow(ACanvas: TCanvas; + ARect: TRect): Boolean; +var + R: TRect; + P: TPoint; +begin + Result := True; + if FDropDownArrow and Assigned(FDropDownMenu) then begin + R := ARect; + R.Left := R.Right - GetTextMargins.Right; + + P.X := (R.Left + R.Right) div 2 - 1; + P.Y := (R.Top + R.Bottom) div 2 - 1; + SpDrawArrow(ACanvas, P.X, P.Y, ACanvas.Font.Color, True, False, 2); + end; +end; + +function TSpTBXCustomButton.DoDrawItem(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage): Boolean; +var + B: TBitmap; + T: TSpTBXSkinType; +begin + Result := inherited DoDrawItem(ACanvas, ARect, PaintStage); + + if Result and (PaintStage = pstPrePaint) then + // When Flat is true draw the button only when it's needed + if not Flat or (MouseInControl or Focused or FPushed or Checked) then begin + if BitmapValid then begin + B := TBitmap.Create; + try + B.Width := ARect.Right - ARect.Left; + B.Height := ARect.Bottom - ARect.Top; + SetStretchBltMode(B.Canvas.Handle, COLORONCOLOR); + B.Canvas.CopyRect(ARect, Bitmap.Canvas, GetSkinStateRect); + if FBitmapTransparent then + B.Transparent := True; + ACanvas.Draw(0, 0, B); + finally + B.Free; + end; + end + else begin + T := SpTBXSkinType(SkinType); + case T of + sknNone, sknWindows: + SpDrawXPButton(ACanvas, ARect, Enabled, Pushed, MouseInControl, Checked, False, FActive, T); + sknSkin: + SpDrawXPButton(ACanvas, ARect, Enabled, Pushed, MouseInControl, Checked, False, False, T); + end; + end; + end; + + // Draw the button arrow + if Result and (PaintStage = pstPostPaint) then + DoDrawDropDownArrow(ACanvas, ARect); +end; + +function TSpTBXCustomButton.GetFocused: Boolean; +begin + Result := Focused and (IsDroppedDown or (inherited GetFocused)); +end; + +function TSpTBXCustomButton.GetFocusRect(R, TextR, GlyphR: TRect): TRect; +begin + Result := R; + if SpTBXSkinType(SkinType) = sknNone then + InflateRect(Result, -4, -4) + else + InflateRect(Result, -3, -3); +end; + +function TSpTBXCustomButton.GetInternalDropDownMenu: TPopupMenu; +begin + Result := FDropDownMenu; +end; + +function TSpTBXCustomButton.GetPushed: Boolean; +begin + Result := IsDroppedDown or (inherited GetPushed); +end; + +function TSpTBXCustomButton.GetTextMargins: TRect; +const + ArrowWidth = 5; +begin + Result := Rect(8, 2, 8, 2); + if FDropDownArrow and Assigned(FDropdownMenu) then + Inc(Result.Right, ArrowWidth + 4); +end; + +function TSpTBXCustomButton.IsDroppedDown: Boolean; +begin + Result := FDropDownMenuVisible; +end; + +function TSpTBXCustomButton.GetSkinStateRect: TRect; +var + W, H: integer; +begin + // Finds the skin rect based on the button state + Result := Rect(0, 0, 0, 0); + + if BitmapValid then begin + W := Bitmap.Width; + H := (Bitmap.Height div ConstStatesCount); // 4 states + if not Enabled then + Result := Bounds(0, H * 3, W, H) // 4th state (disabled) + else begin + if Checked or Pushed then + Result := Bounds(0, H * 2, W, H) // 3rd state (down) + else + if MouseInControl then + Result := Bounds(0, H * 1, W, H) // 2nd state (hottrack) + else + Result := Bounds(0, H * 0, W, H); // 1st state (up) + end; + end; +end; + +procedure TSpTBXCustomButton.MouseDown(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + inherited; + if Enabled and (Button = mbLeft) then begin + if Repeating then begin + Click; + ControlState := ControlState - [csClicked]; + if not Assigned(FRepeatTimer) then FRepeatTimer := TTimer.Create(Self); + FRepeatTimer.Interval := ConstInitRepeatPause; + FRepeatTimer.OnTimer := RepeatTimerHandler; + FRepeatTimer.Enabled := True; + end; + end; +end; + +procedure TSpTBXCustomButton.MouseUp(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + inherited; + if Button = mbLeft then StopRepeat; +end; + +procedure TSpTBXCustomButton.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if Operation = opRemove then + if AComponent = DropdownMenu then DropdownMenu := nil; +end; + +procedure TSpTBXCustomButton.RepeatTimerHandler(Sender: TObject); +begin + FRepeatTimer.Interval := ConstRepeatPause; + if Repeating then begin + if Pushed then + Click; + end + else + StopRepeat; +end; + +procedure TSpTBXCustomButton.StopRepeat; +begin + if Assigned(FRepeatTimer) then begin + FRepeatTimer.Free; + FRepeatTimer := nil; + end; +end; + +procedure TSpTBXCustomButton.SetBitmap(const Value: TBitmap); +begin + FBitmap.Assign(Value); + Invalidate; +end; + +procedure TSpTBXCustomButton.SetDefault(const Value: Boolean); +var + Form: TCustomForm; +begin + FDefault := Value; + if HandleAllocated then begin + Form := GetParentForm(Self); + if Assigned(Form) then + Form.Perform(CM_FOCUSCHANGED, 0, Longint(Form.ActiveControl)); + end; +end; + +procedure TSpTBXCustomButton.SetDropDownArrow(const Value: Boolean); +begin + if FDropDownArrow <> Value then begin + FDropDownArrow := Value; + Invalidate; + end; +end; + +procedure TSpTBXCustomButton.SetDropDownMenu(Value: TPopupMenu); +begin + if FDropDownMenu <> Value then begin + if Assigned(FDropDownMenu) then RemoveFreeNotification(FDropDownMenu); + FDropDownMenu := Value; + if Assigned(FDropDownMenu) then FreeNotification(FDropDownMenu); + Invalidate; + end; +end; + +procedure TSpTBXCustomButton.SetFlat(const Value: Boolean); +begin + if FFlat <> Value then begin + FFlat := Value; + Invalidate; + end; +end; + +procedure TSpTBXCustomButton.CMDialogKey(var Message: TCMDialogKey); +begin + with Message do + if (((CharCode = VK_RETURN) and FActive) or + ((CharCode = VK_ESCAPE) and FCancel)) and + (KeyDataToShiftState(Message.KeyData) = []) and CanFocus then + begin + Click; + Result := 1; + end + else + inherited; +end; + +procedure TSpTBXCustomButton.CMFocusChanged(var Message: TCMFocusChanged); +begin + with Message do + if Sender is TSpTBXCustomButton then + FActive := Sender = Self + else + FActive := FDefault; + inherited; +end; + +procedure TSpTBXCustomButton.CMSPPopupClose(var Message: TMessage); +begin + FDropDownMenuVisible := False; + Invalidate; + inherited; +end; + +procedure TSpTBXCustomButton.WMCancelMode(var Message: TWMCancelMode); +begin + inherited; + StopRepeat; + UpdateTracking(True); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomSpeedButton } + +constructor TSpTBXCustomSpeedButton.Create(AOwner: TComponent); +begin + inherited; + ControlStyle := ControlStyle - [csSetCaption]; + SetBounds(0, 0, 23, 22); +end; + +function TSpTBXCustomSpeedButton.CanFocus: Boolean; +begin + Result := False; +end; + +procedure TSpTBXCustomSpeedButton.Click; +begin + if FGroupIndex <> 0 then + if AllowAllUp then + Checked := not Checked + else + Checked := True; + inherited +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomProgressBar } + +constructor TSpTBXCustomProgressBar.Create(AOwner: TComponent); +begin + inherited; + FMax := 100; + FMin := 0; + FPosition := 0; + FProgressVisible := True; + FCaptionGlow := gldAll; + FCaptionType := pctPercentage; + + Alignment := taCenter; + Autosize := False; + Width := 150; + Height := 17; + Font.Style := Font.Style + [fsBold]; + TabStop := False; +end; + +procedure TSpTBXCustomProgressBar.AdjustFont(AFont: TFont); +var + State: TSpTBXSkinStatesType; +begin + if (LinkText <> '') and MouseInControl then + inherited + else + if (SkinType = sknSkin) and ((AFont.Color = clWindowText) or (AFont.Color = clNone)) then begin + State := CurrentSkin.GetState(Enabled, Pushed, MouseInControl, Checked); + AFont.Color := CurrentSkin.GetTextColor(skncProgressBar, State); + end; +end; + +function TSpTBXCustomProgressBar.DoDrawItem(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage): Boolean; +var + I: Integer; + T: TSpTBXSkinType; +begin + Result := inherited DoDrawItem(ACanvas, ARect, PaintStage); + if Result and (PaintStage = pstPrePaint) then begin + T := SpTBXSkinType(SkinType); + I := SpDrawXPProgressBar(ACanvas, ARect, FVertical, FSmooth, FProgressVisible, FMin, FMax, FPosition, T); + case FCaptionType of + pctNone: Caption := ''; + pctPercentage: Caption := IntToStr(I) + '%'; + pctProgress: Caption := IntToStr(FPosition); + end; + end; +end; + +procedure TSpTBXCustomProgressBar.DoProgressChange; +begin + if Assigned(FOnProgressChange) then FOnProgressChange(Self, Position); +end; + +function TSpTBXCustomProgressBar.GetTextMargins: TRect; +begin + Result := Rect(8, 2, 8, 2); +end; + +procedure TSpTBXCustomProgressBar.SetCaptionType(const Value: TSpTBXProgressCaption); +begin + if FCaptionType <> Value then begin + FCaptionType := Value; + if Value <> pctDefault then Caption := ''; + Invalidate; + end; +end; + +procedure TSpTBXCustomProgressBar.SetMax(const Value: integer); +begin + if FMax <> Value then begin + FMax := Value; + Invalidate; + end; +end; + +procedure TSpTBXCustomProgressBar.SetMin(const Value: integer); +begin + if FMin <> Value then begin + FMin := Value; + Invalidate; + end; +end; + +procedure TSpTBXCustomProgressBar.SetPosition(Value: integer); +begin + if Value > FMax then Value := FMax + else if Value < FMin then Value := FMin; + if FPosition <> Value then begin + FPosition := Value; + Invalidate; + DoProgressChange; + end; +end; + +procedure TSpTBXCustomProgressBar.SetProgressVisible(const Value: Boolean); +begin + if FProgressVisible <> Value then begin + FProgressVisible := Value; + Invalidate; + end; +end; + +procedure TSpTBXCustomProgressBar.SetSmooth(const Value: Boolean); +begin + if FSmooth <> Value then begin + FSmooth := Value; + Invalidate; + end; +end; + +procedure TSpTBXCustomProgressBar.SetVertical(const Value: Boolean); +begin + if FVertical <> Value then begin + FVertical := Value; + if FVertical then + FCaptionRoatationAngle := tra90 + else + FCaptionRoatationAngle := tra0; + if Width > Height then + SetBounds(Left, Top, Height, Width); + Invalidate; + end; +end; + +procedure TSpTBXCustomProgressBar.StepIt(Delta: Integer = 1); +begin + SetPosition(FPosition + Delta); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXTrackBar } + +constructor TSpTBXTrackBar.Create(AOwner: TComponent); +begin + inherited; + FSkinType := sknSkin; + FTickMarks := tmxBottomRight; + SkinManager.AddSkinNotification(Self); +end; + +procedure TSpTBXTrackBar.CreateParams(var Params: TCreateParams); +begin + inherited CreateParams(Params); + FCanDrawChannelSelection := (Params.Style and TBS_ENABLESELRANGE) <> 0; +end; + +destructor TSpTBXTrackBar.Destroy; +begin + SkinManager.RemoveSkinNotification(Self); + inherited; +end; + +function TSpTBXTrackBar.ChannelRect: TRect; +var + R: TRect; +begin + // TBM_GETCHANNELRECT allways returns the horizontal channel rect, even + // when the Orientation is vertical. + SendMessage(Handle, TBM_GETCHANNELRECT, 0, Integer(@Result)); + if Orientation = trVertical then begin + R := Result; + Result := Rect(R.Top, R.Left, R.Bottom, R.Right); + end; +end; + +function TSpTBXTrackBar.DoDrawChannel(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage): Boolean; +begin + Result := True; + if Assigned(FOnDrawChannel) then FOnDrawChannel(Self, ACanvas, ARect, PaintStage, Result); +end; + +function TSpTBXTrackBar.DoDrawChannelTicks(ACanvas: TCanvas; X, Y: Integer): Boolean; +begin + Result := True; + if Assigned(FOnDrawChannelTicks) then FOnDrawChannelTicks(Self, ACanvas, X, Y, Result); +end; + +function TSpTBXTrackBar.DoDrawThumb(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage): Boolean; +begin + Result := True; + if Assigned(FOnDrawThumb) then FOnDrawThumb(Self, ACanvas, ARect, PaintStage, Result); +end; + +procedure TSpTBXTrackBar.DrawTicks(ACanvas: TCanvas); +var + PosArray: array of Integer; + I, Count, Y, iStart, iEnd: Integer; + ChannelR, ThumbR: TRect; + FirstTickSize, TickSize, TickDelta: Integer; + LastPenColor: TColor; +begin + if TickStyle = tsNone then Exit; + + // Returns the position of the ticks on the client area + // Check if Max - Min > 2 to see if the ticks array is valid. + Count := Max - Min; + if Count < 2 then + Count := 2 + else + Count := Count + 1; + SetLength(PosArray, Count); + + // Fill the array, the first and last ticks are not included in the ticks array: + // http://msdn.microsoft.com/library/en-us/shellcc/platform/commctls/trackbar/messages/tbm_getticpos.asp?frame=true + // First we need to get the middle ticks + // 0 1 2 3 4 5 6 7 8 9 // Tick positions seen on the trackbar. + // 1 2 3 4 5 6 7 8 // Tick positions whose position can be identified. + // 0 1 2 3 4 5 6 7 // Index numbers for the identifiable positions. + if Count >= 2 then begin + iStart := 1; + iEnd := Count - 1 - 1; + for I := iStart to iEnd do + PosArray[I] := SendMessage(Self.Handle, TBM_GETTICPOS, I - 1, 0); + end; + + LastPenColor := ACanvas.Pen.Color; + + case SpTBXSkinType(FSkinType) of + sknNone: + ACanvas.Pen.Color := clBlack; + sknWindows: + ACanvas.Pen.Color := clBtnShadow; + sknSkin: + if CurrentSkin.Options(skncTrackBar, sknsNormal).TextColor <> clNone then + ACanvas.Pen.Color := CurrentSkin.Options(skncTrackBar, sknsNormal).TextColor + else + ACanvas.Pen.Color := clBtnShadow; + end; + + SendMessage(Self.Handle, TBM_GETTHUMBRECT, 0, Integer(@ThumbR)); + ChannelR := ChannelRect; + FirstTickSize := 4; + TickSize := 3; + Y := 0; + + if Orientation = trHorizontal then begin + I := (ThumbR.Right - ThumbR.Left) div 2; + PosArray[0] := ChannelR.Left + I; + PosArray[Count - 1] := ChannelR.Right - I - 1; + case TickMarks of + tmxBottomRight: + begin + Y := ThumbR.Bottom + 1; + FirstTickSize := 4; + TickSize := 3; + end; + tmxTopLeft: + begin + Y := ThumbR.Top - 2; + FirstTickSize := -4; + TickSize := -3; + end; + tmxBoth: + begin + Y := ThumbR.Top - 2; + FirstTickSize := -4; + TickSize := -3; + end; + tmxCenter: + begin + Y := ChannelR.Top + (ChannelR.Bottom - ChannelR.Top) div 2; + FirstTickSize := 1; + TickSize := 1; + end; + end; + for I := 0 to Count - 1 do + if DoDrawChannelTicks(ACanvas, PosArray[I], Y) then begin + TickDelta := 0; + if (I = 0) or (I = Count - 1) then + TickDelta := FirstTickSize + else + if TickStyle = tsManual then TickDelta := TickSize + else if I mod Frequency = 0 then TickDelta := TickSize; + if TickDelta <> 0 then begin + ACanvas.MoveTo(PosArray[I], Y); + ACanvas.LineTo(PosArray[I], Y + TickDelta); + if TickMarks = tmxBoth then begin + ACanvas.MoveTo(PosArray[I], ThumbR.Bottom + 1); + ACanvas.LineTo(PosArray[I], ThumbR.Bottom + 1 - TickDelta); + end; + end; + end; + end + else begin + I := (ThumbR.Bottom - ThumbR.Top) div 2; + PosArray[0] := ChannelR.Top + I; + PosArray[Count - 1] := ChannelR.Bottom - I - 1; + case TickMarks of + tmxBottomRight: + begin + Y := ThumbR.Right + 1; + FirstTickSize := 4; + TickSize := 3; + end; + tmxTopLeft: + begin + Y := ThumbR.Left - 2; + FirstTickSize := -4; + TickSize := -3; + end; + tmxBoth: + begin + Y := ThumbR.Left - 2; + FirstTickSize := -4; + TickSize := -3; + end; + tmxCenter: + begin + Y := ChannelR.Left + (ChannelR.Right - ChannelR.Left) div 2; + FirstTickSize := 1; + TickSize := 1; + end; + end; + for I := 0 to Count - 1 do + if DoDrawChannelTicks(ACanvas, Y, PosArray[I]) then begin + TickDelta := 0; + if (I = 0) or (I = Count - 1) then + TickDelta := FirstTickSize + else + if TickStyle = tsManual then TickDelta := TickSize + else if I mod Frequency = 0 then TickDelta := TickSize; + if TickDelta <> 0 then begin + ACanvas.MoveTo(Y, PosArray[I]); + ACanvas.LineTo(Y + TickDelta, PosArray[I]); + if TickMarks = tmxBoth then begin + ACanvas.MoveTo(ThumbR.Right + 1, PosArray[I]); + ACanvas.LineTo(ThumbR.Right + 1 - TickDelta, PosArray[I]); + end; + end; + end; + end; + + ACanvas.Pen.Color := LastPenColor; +end; + +function TSpTBXTrackBar.MouseInThumb: Boolean; +var + P: TPoint; + R: TRect; +begin + if csDesigning in ComponentState then + Result := False + else begin + SendMessage(Handle, TBM_GETTHUMBRECT, 0, Integer(@R)); + GetCursorPos(P); + P := ScreenToClient(P); + Result := PtInRect(R, P) + end; + + if SpTBXSkinType(SkinType) = sknWindows then begin + if Focused then Result := not (GetCaptureControl = Self); + end + else + Result := GetCaptureControl = Self; +end; + +procedure TSpTBXTrackBar.InvalidateBackground; +begin + // Invalidate, Repaint, Update, SetWindowPos and RedrawWindow doesn't work + // on Trackbars (CN_NOTIFY messages are not sent), we have to send a + // WM_SIZE message in order to invalidate the control. + if HandleAllocated then + SendMessage(Handle, WM_SIZE, SIZE_RESTORED, MakeLParam(Width, Height)); +end; + +procedure TSpTBXTrackBar.SetSkinType(const Value: TSpTBXSkinType); +begin + if Value <> FSkinType then begin + FSkinType := Value; + InvalidateBackground; + end; +end; + +procedure TSpTBXTrackBar.SetTickMarks(const Value: TSpTBXTickMark); +const + A: array [TSpTBXTickMark] of TTickMark = (tmBottomRight, tmTopLeft, tmBoth, tmBoth); +begin + if Value <> FTickMarks then begin + if A[FTickMarks] = A[Value] then begin + FTickMarks := Value; + inherited TickMarks := A[Value]; + RecreateWnd; + end + else begin + FTickMarks := Value; + inherited TickMarks := A[Value]; + end; + end; +end; + +procedure TSpTBXTrackBar.CMSpTBXControlsInvalidate(var Message: TMessage); +begin + InvalidateBackground; + Message.Result := 1; +end; + +procedure TSpTBXTrackBar.CNNotify(var Message: TWMNotify); +var + Info: PNMCustomDraw; + ACanvas: TCanvas; + R: TRect; + Rgn: HRGN; + Offset: Integer; +begin + if Message.NMHdr.code = NM_CUSTOMDRAW then begin + Message.Result := CDRF_DODEFAULT; + Info := Pointer(Message.NMHdr); + case Info.dwDrawStage of + CDDS_PREPAINT: + Message.Result := CDRF_NOTIFYITEMDRAW; + CDDS_ITEMPREPAINT: + begin + ACanvas := TCanvas.Create; + ACanvas.Lock; + try + ACanvas.Handle := Info.hdc; + case Info.dwItemSpec of + TBCD_TICS: + begin + R := ClientRect; + SpDrawParentBackground(Self, ACanvas.Handle, R); + if Focused then + SpDrawFocusRect(ACanvas, R); + if FTickMarks <> tmxCenter then + DrawTicks(ACanvas); + Message.Result := CDRF_SKIPDEFAULT; + end; + TBCD_THUMB: + begin + if SliderVisible then begin + SendMessage(Handle, TBM_GETTHUMBRECT, 0, Integer(@R)); + if DoDrawThumb(ACanvas, R, pstPrePaint) then + SpDrawXPTrackBar(ACanvas, R, TBCD_THUMB, Orientation = trVertical, MouseInThumb, False, FTickMarks, Min, Max, SelStart, SelEnd, FSkinType); + DoDrawThumb(ACanvas, R, pstPostPaint); + Message.Result := CDRF_SKIPDEFAULT; + end; + end; + TBCD_CHANNEL: + begin + SendMessage(Handle, TBM_GETTHUMBRECT, 0, Integer(@R)); + Offset := 0; + if Focused then + Inc(Offset); + if Orientation = trHorizontal then begin + R.Left := ClientRect.Left + Offset; + R.Right := ClientRect.Right - Offset; + end + else begin + R.Top := ClientRect.Top + Offset; + R.Bottom := ClientRect.Bottom - Offset; + end; + with R do + Rgn := CreateRectRgn(Left, Top, Right, Bottom); + SelectClipRgn(ACanvas.Handle, Rgn); + try + SpDrawParentBackground(Self, ACanvas.Handle, ClientRect); + R := ChannelRect; + + if DoDrawChannel(ACanvas, R, pstPrePaint) then + SpDrawXPTrackBar(ACanvas, R, TBCD_CHANNEL, Orientation = trVertical, False, FCanDrawChannelSelection, FTickMarks, Min, Max, SelStart, SelEnd, FSkinType); + DoDrawChannel(ACanvas, R, pstPostPaint); + + // Draw channel tics + if FTickMarks = tmxCenter then + DrawTicks(ACanvas); + finally + DeleteObject(Rgn); + SelectClipRgn(ACanvas.Handle, 0); + end; + Message.Result := CDRF_SKIPDEFAULT; + end; + end; + finally + ACanvas.Unlock; + ACanvas.Handle := 0; + ACanvas.Free; + end; + end; + end; + end; +end; + +procedure TSpTBXTrackBar.WMEraseBkGnd(var Message: TMessage); +begin + if SpTBXSkinType(SkinType) <> sknNone then + Message.Result := 1 + else + inherited; +end; + +procedure TSpTBXTrackBar.WMSpSkinChange(var Message: TMessage); +begin + InvalidateBackground; +end; + +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXCustomizer.dcu b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXCustomizer.dcu new file mode 100644 index 0000000000000000000000000000000000000000..02fce6111b67de729488b39d9fca6610a5d5edc1 GIT binary patch literal 62337 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 Ba6AA2 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXCustomizer.hpp b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXCustomizer.hpp new file mode 100644 index 0000000..1cdef24 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXCustomizer.hpp @@ -0,0 +1,260 @@ +// CodeGear C++Builder +// Copyright (c) 1995, 2008 by CodeGear +// All rights reserved + +// (DO NOT EDIT: machine generated header) 'Sptbxcustomizer.pas' rev: 20.00 + +#ifndef SptbxcustomizerHPP +#define SptbxcustomizerHPP + +#pragma delphiheader begin +#pragma option push +#pragma option -w- // All warnings off +#pragma option -Vx // Zero-length empty class member functions +#pragma pack(push,8) +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit + +//-- user supplied ----------------------------------------------------------- + +namespace Sptbxcustomizer +{ +//-- type declarations ------------------------------------------------------- +typedef Classes::TStringList* TTntStringList; + +class DELPHICLASS TShortCutsProcessor; +class PASCALIMPLEMENTATION TShortCutsProcessor : public System::TObject +{ + typedef System::TObject inherited; + +private: + bool FActive; + +public: + __fastcall virtual TShortCutsProcessor(void); + __fastcall virtual ~TShortCutsProcessor(void); + bool __fastcall MainWindowHook(Messages::TMessage &Message); + __property bool Active = {read=FActive, write=FActive, nodefault}; +}; + + +class DELPHICLASS TSpTBXMenuBarShortcuts; +class PASCALIMPLEMENTATION TSpTBXMenuBarShortcuts : public Classes::TStringList +{ + typedef Classes::TStringList inherited; + +private: + System::UnicodeString FMenuBarName; + +public: + __property System::UnicodeString MenuBarName = {read=FMenuBarName, write=FMenuBarName}; +public: + /* TStringList.Create */ inline __fastcall TSpTBXMenuBarShortcuts(void)/* overload */ : Classes::TStringList() { } + /* TStringList.Destroy */ inline __fastcall virtual ~TSpTBXMenuBarShortcuts(void) { } + +}; + + +class DELPHICLASS TSpTBXCustomCustomizeForm; +class DELPHICLASS TSpTBXCustomizer; +class PASCALIMPLEMENTATION TSpTBXCustomCustomizeForm : public Forms::TForm +{ + typedef Forms::TForm inherited; + +private: + bool FEmbedded; + +protected: + TSpTBXCustomizer* FCustomizer; + Classes::TStringList* FToolbarList; + Classes::TStringList* FItemList; + Classes::TStringList* FShortcutList; + Classes::TStringList* FSeparatorList; + Classes::TStringList* FBlankSeparatorList; + virtual void __fastcall DoFillCommands(Classes::TStringList* ToolbarList, Classes::TStringList* ItemList, Classes::TStringList* ShortcutsList) = 0 ; + DYNAMIC void __fastcall DoShow(void); + DYNAMIC void __fastcall DoClose(Forms::TCloseAction &Action); + virtual void __fastcall DoIconOptionsChange(bool UseSmallImages); + virtual void __fastcall DoSkinChange(void); + void __fastcall FillCommands(void); + DYNAMIC void __fastcall KeyDown(System::Word &Key, Classes::TShiftState Shift); + +public: + __fastcall TSpTBXCustomCustomizeForm(TSpTBXCustomizer* AOwner, Controls::TWinControl* EmbeddedParent); + __fastcall virtual ~TSpTBXCustomCustomizeForm(void); + __property TSpTBXCustomizer* Customizer = {read=FCustomizer}; + __property bool Embedded = {read=FEmbedded, nodefault}; +public: + /* TCustomForm.CreateNew */ inline __fastcall virtual TSpTBXCustomCustomizeForm(Classes::TComponent* AOwner, int Dummy) : Forms::TForm(AOwner, Dummy) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXCustomCustomizeForm(HWND ParentWindow) : Forms::TForm(ParentWindow) { } + +}; + + +typedef TMetaClass* TSpTBXCustomizeFormClass; + +typedef void __fastcall (__closure *TSpTBXGetCustomizeFormClassEvent)(System::TObject* Sender, TSpTBXCustomizeFormClass &CustomizeFormClass); + +typedef void __fastcall (__closure *TSpTBXExtraOptionsEvent)(System::TObject* Sender, Classes::TStringList* ExtraOptions); + +typedef void __fastcall (__closure *TSpTBXLayoutExtraOptionsEvent)(System::TObject* Sender, System::UnicodeString LayoutName, Classes::TStringList* ExtraOptions); + +typedef void __fastcall (__closure *TSpTBXIconOptionsChangeEvent)(System::TObject* Sender, Tb2toolbar::TTBCustomToolbar* Toolbar, bool UseSmallImages); + +typedef void __fastcall (__closure *TSpTBXAcceptItemEvent)(System::TObject* Sender, Tb2item::TTBCustomItem* AItem, bool &Accept); + +class PASCALIMPLEMENTATION TSpTBXCustomizer : public Classes::TComponent +{ + typedef Classes::TComponent inherited; + +private: + Classes::TStringList* FLayouts; + Classes::TStringList* FResetState; + bool FBlankSeparators; + Tb2item::TTBRootItem* FItems; + TSpTBXCustomCustomizeForm* FCustomizeForm; + Tb2toolbar::TTBCustomToolbar* FMenuBar; + bool FShowing; + bool FSaveFormState; + Classes::TNotifyEvent FOnShow; + Classes::TNotifyEvent FOnClose; + TSpTBXGetCustomizeFormClassEvent FOnGetCustomizeForm; + TSpTBXExtraOptionsEvent FOnLoad; + TSpTBXExtraOptionsEvent FOnSave; + TSpTBXLayoutExtraOptionsEvent FOnLayoutLoad; + TSpTBXLayoutExtraOptionsEvent FOnLayoutSave; + TSpTBXAcceptItemEvent FOnGetShortcutsList; + TSpTBXIconOptionsChangeEvent FOnIconOptionsChange; + Classes::TNotifyEvent FOnSkinChange; + Tb2item::TTBCustomItem* __fastcall GetItems(void); + Imglist::TCustomImageList* __fastcall GetImages(void); + void __fastcall SetImages(Imglist::TCustomImageList* Value); + void __fastcall SetMenuBar(const Tb2toolbar::TTBCustomToolbar* Value); + void __fastcall SaveResetState(TSpTBXMenuBarShortcuts* ShortcutsList); + MESSAGE void __fastcall WMSpSkinChange(Messages::TMessage &Message); + +protected: + virtual bool __fastcall DoGetShortcutsList(Tb2item::TTBCustomItem* AItem); + virtual void __fastcall DoIconOptionsChange(Tb2toolbar::TTBCustomToolbar* Toolbar, bool UseSmallImages); + virtual void __fastcall DoLoad(Classes::TStringList* ExtraOptions); + virtual void __fastcall DoSave(Classes::TStringList* ExtraOptions); + virtual void __fastcall DoLayoutLoad(System::UnicodeString LayoutName, Classes::TStringList* ExtraOptions); + virtual void __fastcall DoLayoutSave(System::UnicodeString LayoutName, Classes::TStringList* ExtraOptions); + virtual void __fastcall DoSkinChange(void); + DYNAMIC void __fastcall GetChildren(Classes::TGetChildProc Proc, Classes::TComponent* Root); + virtual TSpTBXCustomizeFormClass __fastcall GetCustomizeFormClass(void); + void __fastcall GetShortcutList(Classes::TStringList* ShortcutsList); + virtual void __fastcall Notification(Classes::TComponent* AComponent, Classes::TOperation Operation); + virtual void __fastcall SetupForm(void); + DYNAMIC void __fastcall ValidateContainer(Classes::TComponent* AComponent); + +public: + __fastcall virtual TSpTBXCustomizer(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXCustomizer(void); + void __fastcall Show(void); + void __fastcall ShowEmbedded(Controls::TWinControl* AParent = (Controls::TWinControl*)(0x0)); + void __fastcall Close(void); + void __fastcall Load(Inifiles::TCustomIniFile* IniFile, bool LoadLastLayout = true)/* overload */; + void __fastcall Load(Classes::TStrings* OptionsList, bool LoadLastLayout = true)/* overload */; + void __fastcall Load(const System::UnicodeString Filename, bool LoadLastLayout = true)/* overload */; + void __fastcall Load(const unsigned RootKey, System::UnicodeString BaseRegistryKey, bool LoadLastLayout = true)/* overload */; + void __fastcall Save(Inifiles::TCustomIniFile* IniFile)/* overload */; + void __fastcall Save(Classes::TStrings* OptionsList)/* overload */; + void __fastcall Save(const System::UnicodeString Filename)/* overload */; + void __fastcall Save(const unsigned RootKey, System::UnicodeString BaseRegistryKey)/* overload */; + void __fastcall Reset(void); + void __fastcall LoadLayout(Inifiles::TCustomIniFile* IniFile, System::UnicodeString LayoutName)/* overload */; + void __fastcall LoadLayout(Classes::TStrings* OptionsList, System::UnicodeString LayoutName)/* overload */; + void __fastcall LoadLayout(const System::UnicodeString Filename, const System::UnicodeString LayoutName)/* overload */; + void __fastcall LoadLayout(const unsigned RootKey, System::UnicodeString BaseRegistryKey, System::UnicodeString LayoutName)/* overload */; + void __fastcall SaveLayout(Inifiles::TCustomIniFile* IniFile, System::UnicodeString LayoutName)/* overload */; + void __fastcall SaveLayout(Classes::TStrings* OptionsList, System::UnicodeString LayoutName)/* overload */; + void __fastcall SaveLayout(const System::UnicodeString Filename, const System::UnicodeString LayoutName)/* overload */; + void __fastcall SaveLayout(const unsigned RootKey, System::UnicodeString BaseRegistryKey, System::UnicodeString LayoutName)/* overload */; + bool __fastcall DeleteLayout(Inifiles::TCustomIniFile* IniFile, System::UnicodeString LayoutName)/* overload */; + bool __fastcall DeleteLayout(Classes::TStrings* OptionsList, System::UnicodeString LayoutName)/* overload */; + bool __fastcall DeleteLayout(const System::UnicodeString Filename, const System::UnicodeString LayoutName)/* overload */; + bool __fastcall DeleteLayout(const unsigned RootKey, System::UnicodeString BaseRegistryKey, System::UnicodeString LayoutName)/* overload */; + __property TSpTBXCustomCustomizeForm* CustomizeForm = {read=FCustomizeForm}; + __property Classes::TStringList* Layouts = {read=FLayouts}; + __property bool Showing = {read=FShowing, nodefault}; + +__published: + __property bool BlankSeparators = {read=FBlankSeparators, write=FBlankSeparators, default=0}; + __property Imglist::TCustomImageList* Images = {read=GetImages, write=SetImages}; + __property Tb2item::TTBRootItem* Items = {read=FItems}; + __property Tb2toolbar::TTBCustomToolbar* MenuBar = {read=FMenuBar, write=SetMenuBar}; + __property bool SaveFormState = {read=FSaveFormState, write=FSaveFormState, default=1}; + __property Classes::TNotifyEvent OnShow = {read=FOnShow, write=FOnShow}; + __property Classes::TNotifyEvent OnClose = {read=FOnClose, write=FOnClose}; + __property TSpTBXGetCustomizeFormClassEvent OnGetCustomizeForm = {read=FOnGetCustomizeForm, write=FOnGetCustomizeForm}; + __property TSpTBXAcceptItemEvent OnGetShortcutsList = {read=FOnGetShortcutsList, write=FOnGetShortcutsList}; + __property TSpTBXExtraOptionsEvent OnLoad = {read=FOnLoad, write=FOnLoad}; + __property TSpTBXExtraOptionsEvent OnSave = {read=FOnSave, write=FOnSave}; + __property TSpTBXLayoutExtraOptionsEvent OnLayoutLoad = {read=FOnLayoutLoad, write=FOnLayoutLoad}; + __property TSpTBXLayoutExtraOptionsEvent OnLayoutSave = {read=FOnLayoutSave, write=FOnLayoutSave}; + __property TSpTBXIconOptionsChangeEvent OnIconOptionsChange = {read=FOnIconOptionsChange, write=FOnIconOptionsChange}; + __property Classes::TNotifyEvent OnSkinChange = {read=FOnSkinChange, write=FOnSkinChange}; +private: + void *__ITBItems; /* Tb2item::ITBItems */ + +public: + #if defined(MANAGED_INTERFACE_OPERATORS) + operator Tb2item::_di_ITBItems() + { + Tb2item::_di_ITBItems intf; + GetInterface(intf); + return intf; + } + #else + operator ITBItems*(void) { return (ITBItems*)&__ITBItems; } + #endif + +}; + + +//-- var, const, procedure --------------------------------------------------- +extern PACKAGE void __fastcall SpIniEraseSection(Inifiles::TCustomIniFile* IniFile, System::UnicodeString Section, bool EraseKeysOnly); +extern PACKAGE void __fastcall SpIniSaveStringList(Inifiles::TCustomIniFile* IniFile, System::UnicodeString Section, Classes::TStringList* L); +extern PACKAGE void __fastcall SpIniLoadStringList(Inifiles::TCustomIniFile* IniFile, System::UnicodeString Section, Classes::TStringList* L); +extern PACKAGE void __fastcall SpRegSaveStringList(Classes::TStringList* L, const unsigned RootKey, const System::UnicodeString BaseRegistryKey); +extern PACKAGE void __fastcall SpRegLoadStringList(Classes::TStringList* L, const unsigned RootKey, const System::UnicodeString BaseRegistryKey); +extern PACKAGE void __fastcall SpLoadFormState(Forms::TCustomForm* Form, Classes::TStrings* OptionsList); +extern PACKAGE void __fastcall SpSaveFormState(Forms::TCustomForm* Form, Classes::TStrings* OptionsList); +extern PACKAGE void __fastcall SpLoadLayoutList(Inifiles::TCustomIniFile* IniFile, Classes::TStringList* L)/* overload */; +extern PACKAGE void __fastcall SpSaveLayout(const Classes::TComponent* OwnerComponent, Inifiles::TCustomIniFile* IniFile, System::UnicodeString LayoutName, Classes::TStringList* ExtraOptions = (Classes::TStringList*)(0x0)); +extern PACKAGE void __fastcall SpLoadLayout(const Classes::TComponent* OwnerComponent, Inifiles::TCustomIniFile* IniFile, System::UnicodeString LayoutName, Classes::TStringList* ExtraOptions = (Classes::TStringList*)(0x0)); +extern PACKAGE void __fastcall SpSaveItems(const Classes::TComponent* OwnerComponent, Inifiles::TCustomIniFile* IniFile, TSpTBXMenuBarShortcuts* ShortcutsList = (TSpTBXMenuBarShortcuts*)(0x0), Classes::TStringList* ExtraOptions = (Classes::TStringList*)(0x0))/* overload */; +extern PACKAGE void __fastcall SpLoadItems(const Classes::TComponent* OwnerComponent, Inifiles::TCustomIniFile* IniFile, TSpTBXMenuBarShortcuts* ShortcutsList = (TSpTBXMenuBarShortcuts*)(0x0), Classes::TStringList* ExtraOptions = (Classes::TStringList*)(0x0))/* overload */; +extern PACKAGE System::WideString __fastcall SpCustomizerGetWideCaption(Tb2item::TTBCustomItem* Item); +extern PACKAGE Sptbxitem::TSpTBXSeparatorItem* __fastcall SpCreateUniqueSeparator(bool Blank); + +} /* namespace Sptbxcustomizer */ +using namespace Sptbxcustomizer; +#pragma pack(pop) +#pragma option pop + +#pragma delphiheader end. +//-- end unit ---------------------------------------------------------------- +#endif // SptbxcustomizerHPP diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXCustomizer.pas b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXCustomizer.pas new file mode 100644 index 0000000..01b160a --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXCustomizer.pas @@ -0,0 +1,1620 @@ +unit SpTBXCustomizer; + +{============================================================================== +Version 2.4.2 + +The contents of this file are subject to the SpTBXLib License; you may +not use or distribute this file except in compliance with the +SpTBXLib License. +A copy of the SpTBXLib License may be found in SpTBXLib-LICENSE.txt or at: + http://www.silverpointdevelopment.com/sptbxlib/SpTBXLib-LICENSE.htm + +Alternatively, the contents of this file may be used under the terms of the +Mozilla Public License Version 1.1 (the "MPL v1.1"), in which case the provisions +of the MPL v1.1 are applicable instead of those in the SpTBXLib License. +A copy of the MPL v1.1 may be found in MPL-LICENSE.txt or at: + http://www.mozilla.org/MPL/ + +If you wish to allow use of your version of this file only under the terms of +the MPL v1.1 and not to allow others to use your version of this file under the +SpTBXLib License, indicate your decision by deleting the provisions +above and replace them with the notice and other provisions required by the +MPL v1.1. If you do not delete the provisions above, a recipient may use your +version of this file under either the SpTBXLib License or the MPL v1.1. + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for +the specific language governing rights and limitations under the License. + +The initial developer of this code is Robert Lee. + +Requirements: +For Delphi/C++Builder 2009 or newer: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org +For Delphi/C++Builder 7-2007: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org + - Troy Wolbrink's TNT Unicode Controls + http://www.tntware.com/delphicontrols/unicode/ + +History: +8 May 2009 - version 2.4.2 + - No changes. + +15 March 2009 - version 2.4.1 + - Fixed incorrect Customizer loading and saving when Frames + were used, thanks to Eduardo Mauro for reporting this. + +17 January 2009 - version 2.4 + - No changes. + +26 September 2008 - version 2.3 + - No changes. + +29 July 2008 - version 2.2 + - No changes. + +26 June 2008 - version 2.1 + - No changes. + +3 May 2008 - version 2.0 + - No changes. + +2 April 2008 - version 1.9.5 + - No changes. + +3 February 2008 - version 1.9.4 + - No changes. + +19 January 2008 - version 1.9.3 + - Added BlankSeparators property to TSpTBXCustomizer. + - Fixed AV on TSpTBXCustomizer when ShorcutsList was nil + when calling ApplyItemOptions, thanks to PyScripter for + reporting this. + +26 December 2007 - version 1.9.2 + - No changes. + +1 December 2007 - version 1.9.1 + - No changes. + +20 November 2007 - version 1.9 + - Removed TBX dependency. + - Added Reset method to TSpTBXCustomizer, used to reinitialize + the toolbars. + +8 February 2007 - version 1.8.3 + - Added DeleteLayout method to TSpTBXCustomizer. + - The customizer now closes when ESC is pressed, thanks to + Jim Kueneman for reporting this. + - The customizer now saves the Toolbar's DisplayMode, thanks to + Jim Kueneman for reporting this. + +17 December 2006 - version 1.8.2 + - No changes. + +24 November 2006 - version 1.8.1 + - No changes. + +27 August 2006 - version 1.8 + - Fixed TSpTBXCustomizer items saving when the MenuBar items are + nested in more than 3 subitems levels, thanks to Jim Kueneman + for reporting this. + +15 June 2006 - version 1.7 + - Added SaveFormState property to TSpTBXCustomizer, when SaveFormState + is true the main form position and WindowState are saved. + - Added Load and Save methods to TSpTBXCustomizer that loads/saves + the customizer options to a StringList, thanks to Philipp Hechter + for reporting this. + +4 May 2006 - version 1.6 + - No changes. + +12 April 2006 - version 1.5 + - No changes. + +27 February 2006 - version 1.4 + - No changes. + +10 February 2006 - version 1.3 + - No changes. + +28 December 2005 - version 1.2 + - Fixed incorrect ShortCut processing. + +18 October 2005 - version 1.1 + - Fixed TSpTBXCustomizer ShortCut processing method when + loading from file or registry. + - Fixed TSpTBXCustomizer support for separators items. + - Fixed TSpTBXCustomizer support for anchored items. + - Added OnGetShortcutsList event to the TSpTBXCustomizer to + allow the shortcuts list filtering. + - Added separator cloning support to the TSpTBXCustomizer. + +10 August 2005 - version 1.0 + - Initial release. + +==============================================================================} + +interface + +{$BOOLEVAL OFF} // Unit depends on short-circuit boolean evaluation + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, ExtCtrls, ImgList, IniFiles, + {$IFNDEF UNICODE} + TntClasses, + {$ENDIF} + TB2Dock, TB2Toolbar, TB2Item, + SpTBXSkins, SpTBXItem, SpTBXEditors; + + +type + +{$IFDEF UNICODE} + TTntStringList = TStringList; +{$ENDIF} + + TSpTBXCustomizer = class; + + TShortCutsProcessor = class + private + FActive: Boolean; + public + constructor Create; virtual; + destructor Destroy; override; + function MainWindowHook(var Message: TMessage): Boolean; + property Active: Boolean read FActive write FActive; + end; + + TSpTBXMenuBarShortcuts = class(TTntStringList) + private + FMenuBarName: string; + public + property MenuBarName: string read FMenuBarName write FMenuBarName; + end; + + TSpTBXCustomCustomizeForm = class(TForm) + private + FEmbedded: Boolean; + protected + FCustomizer: TSpTBXCustomizer; + FToolbarList: TTntStringList; + FItemList: TTntStringList; + FShortcutList: TTntStringList; + FSeparatorList: TTntStringList; + FBlankSeparatorList: TTntStringList; + procedure DoFillCommands(ToolbarList, ItemList, ShortcutsList: TTntStringList); virtual; abstract; + procedure DoShow; override; + procedure DoClose(var Action: TCloseAction); override; + procedure DoIconOptionsChange(UseSmallImages: Boolean); virtual; + procedure DoSkinChange; virtual; + procedure FillCommands; + procedure KeyDown(var Key: Word; Shift: TShiftState); override; + public + constructor Create(AOwner: TSpTBXCustomizer; EmbeddedParent: TWinControl); reintroduce; + destructor Destroy; override; + property Customizer: TSpTBXCustomizer read FCustomizer; + property Embedded: Boolean read FEmbedded; + end; + + TSpTBXCustomizeFormClass = class of TSpTBXCustomCustomizeForm; + + TSpTBXGetCustomizeFormClassEvent = procedure(Sender: TObject; var CustomizeFormClass: TSpTBXCustomizeFormClass) of object; + TSpTBXExtraOptionsEvent = procedure(Sender: TObject; ExtraOptions: TStringList) of object; + TSpTBXLayoutExtraOptionsEvent = procedure(Sender: TObject; LayoutName: string; ExtraOptions: TStringList) of object; + + TSpTBXIconOptionsChangeEvent = procedure(Sender: TObject; Toolbar: TTBCustomToolbar; UseSmallImages: Boolean) of object; + TSpTBXAcceptItemEvent = procedure(Sender: TObject; AItem: TTBCustomItem; var Accept: Boolean) of object; + + TSpTBXCustomizer = class(TComponent, ITBItems) + private + FLayouts: TStringList; + FResetState: TStringList; + FBlankSeparators: Boolean; + FItems: TTBRootItem; + FCustomizeForm: TSpTBXCustomCustomizeForm; + FMenuBar: TTBCustomToolbar; + FShowing: Boolean; + FSaveFormState: Boolean; + FOnShow: TNotifyEvent; + FOnClose: TNotifyEvent; + FOnGetCustomizeForm: TSpTBXGetCustomizeFormClassEvent; + FOnLoad: TSpTBXExtraOptionsEvent; + FOnSave: TSpTBXExtraOptionsEvent; + FOnLayoutLoad: TSpTBXLayoutExtraOptionsEvent; + FOnLayoutSave: TSpTBXLayoutExtraOptionsEvent; + FOnGetShortcutsList: TSpTBXAcceptItemEvent; + FOnIconOptionsChange: TSpTBXIconOptionsChangeEvent; + FOnSkinChange: TNotifyEvent; + function GetItems: TTBCustomItem; // For ITBItems interface + function GetImages: TCustomImageList; + procedure SetImages(Value: TCustomImageList); + procedure SetMenuBar(const Value: TTBCustomToolbar); + procedure SaveResetState(ShortcutsList: TSpTBXMenuBarShortcuts); + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + protected + function DoGetShortcutsList(AItem: TTBCustomItem): Boolean; virtual; + procedure DoIconOptionsChange(Toolbar: TTBCustomToolbar; UseSmallImages: Boolean); virtual; + procedure DoLoad(ExtraOptions: TStringList); virtual; + procedure DoSave(ExtraOptions: TStringList); virtual; + procedure DoLayoutLoad(LayoutName: string; ExtraOptions: TStringList); virtual; + procedure DoLayoutSave(LayoutName: string; ExtraOptions: TStringList); virtual; + procedure DoSkinChange; virtual; + procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override; // For ITBItems interface + function GetCustomizeFormClass: TSpTBXCustomizeFormClass; virtual; + procedure GetShortcutList(ShortcutsList: TTntStringList); + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure SetupForm; virtual; + procedure ValidateContainer(AComponent: TComponent); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Show; + procedure ShowEmbedded(AParent: TWinControl = nil); + procedure Close; + procedure Load(IniFile: TCustomIniFile; LoadLastLayout: Boolean = True); overload; + procedure Load(OptionsList: TStrings; LoadLastLayout: Boolean = True); overload; + procedure Load(const Filename: string; LoadLastLayout: Boolean = True); overload; + procedure Load(const RootKey: DWORD; BaseRegistryKey: string; LoadLastLayout: Boolean = True); overload; + procedure Save(IniFile: TCustomIniFile); overload; + procedure Save(OptionsList: TStrings); overload; + procedure Save(const Filename: string); overload; + procedure Save(const RootKey: DWORD; BaseRegistryKey: string); overload; + procedure Reset; + procedure LoadLayout(IniFile: TCustomIniFile; LayoutName: string); overload; + procedure LoadLayout(OptionsList: TStrings; LayoutName: string); overload; + procedure LoadLayout(const Filename, LayoutName: string); overload; + procedure LoadLayout(const RootKey: DWORD; BaseRegistryKey, LayoutName: string); overload; + procedure SaveLayout(IniFile: TCustomIniFile; LayoutName: string); overload; + procedure SaveLayout(OptionsList: TStrings; LayoutName: string); overload; + procedure SaveLayout(const Filename, LayoutName: string); overload; + procedure SaveLayout(const RootKey: DWORD; BaseRegistryKey, LayoutName: string); overload; + function DeleteLayout(IniFile: TCustomIniFile; LayoutName: string): Boolean; overload; + function DeleteLayout(OptionsList: TStrings; LayoutName: string): Boolean; overload; + function DeleteLayout(const Filename, LayoutName: string): Boolean; overload; + function DeleteLayout(const RootKey: DWORD; BaseRegistryKey, LayoutName: string): Boolean; overload; + property CustomizeForm: TSpTBXCustomCustomizeForm read FCustomizeForm; + property Layouts: TStringList read FLayouts; + property Showing: Boolean read FShowing; + published + property BlankSeparators: Boolean read FBlankSeparators write FBlankSeparators default False; + property Images: TCustomImageList read GetImages write SetImages; + property Items: TTBRootItem read FItems; + property MenuBar: TTBCustomToolbar read FMenuBar write SetMenuBar; + property SaveFormState: Boolean read FSaveFormState write FSaveFormState default True; + property OnShow: TNotifyEvent read FOnShow write FOnShow; + property OnClose: TNotifyEvent read FOnClose write FOnClose; + property OnGetCustomizeForm: TSpTBXGetCustomizeFormClassEvent read FOnGetCustomizeForm write FOnGetCustomizeForm; + property OnGetShortcutsList: TSpTBXAcceptItemEvent read FOnGetShortcutsList write FOnGetShortcutsList; + property OnLoad: TSpTBXExtraOptionsEvent read FOnLoad write FOnLoad; + property OnSave: TSpTBXExtraOptionsEvent read FOnSave write FOnSave; + property OnLayoutLoad: TSpTBXLayoutExtraOptionsEvent read FOnLayoutLoad write FOnLayoutLoad; + property OnLayoutSave: TSpTBXLayoutExtraOptionsEvent read FOnLayoutSave write FOnLayoutSave; + property OnIconOptionsChange: TSpTBXIconOptionsChangeEvent read FOnIconOptionsChange write FOnIconOptionsChange; + property OnSkinChange: TNotifyEvent read FOnSkinChange write FOnSkinChange; + end; + +{ Ini/Reg } +procedure SpIniEraseSection(IniFile: TCustomIniFile; Section: string; EraseKeysOnly: Boolean); +procedure SpIniSaveStringList(IniFile: TCustomIniFile; Section: string; L: TStringList); +procedure SpIniLoadStringList(IniFile: TCustomIniFile; Section: string; L: TStringList); +procedure SpRegSaveStringList(L: TStringList; const RootKey: DWORD; const BaseRegistryKey: string); +procedure SpRegLoadStringList(L: TStringList; const RootKey: DWORD; const BaseRegistryKey: string); + +{ Layouts } +procedure SpLoadFormState(Form: TCustomForm; OptionsList: TStrings); +procedure SpSaveFormState(Form: TCustomForm; OptionsList: TStrings); +procedure SpLoadLayoutList(IniFile: TCustomIniFile; L: TStringList); overload; +procedure SpLoadLayout(const OwnerComponent: TComponent; IniFile: TCustomIniFile; LayoutName: string; ExtraOptions: TStringList = nil); +procedure SpSaveLayout(const OwnerComponent: TComponent; IniFile: TCustomIniFile; LayoutName: string; ExtraOptions: TStringList = nil); + +{ Items } +procedure SpLoadItems(const OwnerComponent: TComponent; IniFile: TCustomIniFile; ShortcutsList: TSpTBXMenuBarShortcuts = nil; ExtraOptions: TStringList = nil); +procedure SpSaveItems(const OwnerComponent: TComponent; IniFile: TCustomIniFile; ShortcutsList: TSpTBXMenuBarShortcuts = nil; ExtraOptions: TStringList = nil); + +{ Misc } +function SpCustomizerGetWideCaption(Item: TTBCustomItem): WideString; +function SpCreateUniqueSeparator(Blank: Boolean): TSpTBXSeparatorItem; + +implementation + +uses + TypInfo, Registry, Menus, ActnList, TB2ExtItems, + SpTBXTabs, SpTBXDkPanels, SpTBXCustomizerForm; + +type + TTBRootItemAccess = class(TTBRootItem); + TTBCustomItemAccess = class(TTBCustomItem); + TTBDockAccess = class(TTBDock); + TSpTBXTabToolbarAccess = class(TSpTBXTabToolbar); + +{ Constants for SpTBXCustomizer-specific registry values. Do not localize! } +const + SSpTBXCustomizerRepeatedInstance = 'There''s already another instance of TSpTBXCustomizer'; + SSpTBXCustomizerInvalidParent = 'TSpTBXCustomizer must be dropped only on a Form or on a Frame'; + rvLastLayout = 'LastLayout'; + rvExtraOptions = 'ExtraOptions'; + rvLayoutRegList = 'LayoutsList'; + rvLayoutList = 'Layouts'; + rvItemsList = 'Items'; + rvCount = 'Count'; + rvSkin = 'Skin'; + rvMainFormWindowState = 'MainForm.WindowState'; + rvMainFormBounds = 'MainForm.Bounds'; + rvMainFormRestoreBounds = 'MainForm.RestoreBounds'; + rvSeparator = '--[Separator]--'; + rvBlankSeparator = '--[Blank Separator]--'; + rvUniqueSeparatorPrefix = 'CustomizerUniqueSeparator'; + rvUniqueBlankSeparatorPrefix = 'CustomizerUniqueBlankSeparator'; + +var + FShortcutsProcessor: TShortCutsProcessor; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Helpers } + +function IncludeTrailingRegKeyDelimiter(const S: string): string; +var + C: integer; +begin + Result := S; + C := Length(Result); + if (C > 0) and (Result[C] <> '\') then + Result := Result + '\'; +end; + +function ParseItemEntry(RootItemsList, ItemsList: TStringList; const ItemEntry: string; + out ParentItem: TTBCustomItem; out ItemName: string; out ShortCut: TShortCut): TTBCustomItem; +var + L: TStringList; + I: Integer; + TBName: string; +begin + Result := nil; + ParentItem := nil; + ShortCut := 0; + + L := TStringList.Create; + try + L.CommaText := ItemEntry; + TBName := L[0]; + ItemName := L[1]; + if L.Count > 2 then + if L[2] = '0' then + ShortCut := 0 + else + ShortCut := TextToShortCut(L[2]); + I := RootItemsList.IndexOf(TBName); + if I > -1 then begin + ParentItem := RootItemsList.Objects[I] as TTBCustomItem; + if Pos(rvUniqueSeparatorPrefix, ItemName) > 0 then begin // If it's a cloned separator create it + Result := TSpTBXSeparatorItem.Create(nil); + Result.Name := ItemName; + end + else + if Pos(rvUniqueBlankSeparatorPrefix, ItemName) > 0 then begin // If it's a cloned blank separator create it + Result := TSpTBXSeparatorItem.Create(nil); + Result.Name := ItemName; + TSpTBXSeparatorItem(Result).Blank := True; + end + else begin + I := ItemsList.IndexOf(ItemName); + if I > -1 then + Result := ItemsList.Objects[I] as TTBCustomItem; + end; + end; + finally + L.Free; + end; +end; + +procedure GetRootItemsList(OwnerComponent: TComponent; RootItemsList: TStringList); +// Creates a list with all the toolbar's root items +// It excludes Frames toolbars (name collision problems) +var + I: Integer; + C: TComponent; +begin + for I := 0 to OwnerComponent.ComponentCount - 1 do begin + C := OwnerComponent.Components[I]; + if C is TFrame then + Continue + else + if C is TSpTBXToolbar then begin + if TSpTBXToolbar(C).Customizable then + RootItemsList.AddObject(C.Name, TSpTBXToolbar(C).Items); + end + else + if C is TSpTBXCustomizer then + RootItemsList.AddObject(C.Name, TSpTBXCustomizer(C).Items) + else + if (C is TWinControl) and not (C is TFrame) and not (C is TForm) then + GetRootItemsList(C, RootItemsList); + end; +end; + +procedure SaveItemOptions(OwnerComponent: TComponent; + ShortcutsList: TSpTBXMenuBarShortcuts; OptionsList: TStringList); + + procedure SaveOption(ComponentName: string; AItem: TTBCustomItem); + var + ShortCut: string; + begin + ShortCut := ShortCutToText(AItem.ShortCut); + if ShortCut = '' then ShortCut := '0'; + OptionsList.Add(ComponentName + ', ' + AItem.Name + ', ' + ShortCut); + end; + +var + I, J: Integer; + ParentItem: TTBCustomItem; + RootItemsList: TStringList; +begin + OptionsList.Clear; + + RootItemsList := TStringList.Create; + try + GetRootItemsList(OwnerComponent, RootItemsList); + for I := 0 to RootItemsList.Count - 1 do begin + ParentItem := TTBCustomItem(RootItemsList.Objects[I]); + for J := 0 to ParentItem.Count - 1 do + SaveOption(RootItemsList.Strings[I], ParentItem[J]); + end; + finally + RootItemsList.Free; + end; + + // Save the MenuBar shortcuts + if Assigned(ShortcutsList) then begin + for J := 0 to ShortcutsList.Count - 1 do + SaveOption(ShortcutsList.MenuBarName, ShortcutsList.Objects[J] as TTBCustomItem); + end; +end; + +procedure ApplyItemOptions(OwnerComponent: TComponent; + ShortcutsList: TSpTBXMenuBarShortcuts; OptionsList: TStringList); +var + RootItemsList, ItemsList: TStringList; + I, J, OrigPos, InsertPoint: Integer; + Item, ParentItem, AuxParentItem: TTBCustomItem; + ParentToolbar: TSpTBXTabToolbarAccess; + ItemName: string; + ShortCut: TShortCut; +begin + RootItemsList := TStringList.Create; + ItemsList := TStringList.Create; + try + GetRootItemsList(OwnerComponent, RootItemsList); + for I := 0 to RootItemsList.Count - 1 do begin + ParentItem := TTBCustomItem(RootItemsList.Objects[I]); + for J := 0 to ParentItem.Count - 1 do + ItemsList.AddObject(ParentItem[J].Name, ParentItem[J]); + end; + + InsertPoint := 0; + AuxParentItem := nil; + for I := 0 to OptionsList.Count - 1 do begin + Item := ParseItemEntry(RootItemsList, ItemsList, OptionsList[I], ParentItem, ItemName, ShortCut); + if Assigned(Item) then begin + if AuxParentItem <> ParentItem then begin + AuxParentItem := ParentItem; + InsertPoint := 0; + end; + // Move the item if the parent or index are different + if not Assigned(Item.Parent) then + ParentItem.Insert(InsertPoint, Item) + else + if Item.Parent <> ParentItem then begin + Item.Parent.Remove(Item); + ParentItem.Insert(InsertPoint, Item); + end + else begin + OrigPos := Item.Parent.IndexOf(Item); + if OrigPos <> InsertPoint then begin + if Item.Parent.ParentComponent is TSpTBXTabToolbar then begin + ParentToolbar := TSpTBXTabToolbarAccess(Item.Parent.ParentComponent); + ParentToolbar.BeginItemMove; + ParentToolbar.View.BeginUpdate; + try + // The item is the active tab, we need to update the ActiveTabIndex + // Just set the internal value because the page didn't change + if ParentToolbar.FActiveTabIndex = OrigPos then + ParentToolbar.FActiveTabIndex := InsertPoint; + Item.Parent.Move(OrigPos, InsertPoint); + finally + ParentToolbar.View.EndUpdate; + ParentToolbar.EndItemMove; + end; + end + else + Item.Parent.Move(OrigPos, InsertPoint); + end; + end; + + if Assigned(Item.Action) and (Item.Action is TAction) then + TAction(Item.Action).ShortCut := ShortCut + else + Item.ShortCut := ShortCut; + Inc(InsertPoint); + end + else begin + // Item not found try to change the Shortcut + if Assigned(ShortcutsList) then + for J := 0 to ShortcutsList.Count - 1 do begin + Item := ShortcutsList.Objects[J] as TTBCustomItem; + if Item.Name = ItemName then begin + if Assigned(Item.Action) and (Item.Action is TAction) then + TAction(Item.Action).ShortCut := ShortCut + else + Item.ShortCut := ShortCut; + Break; + end; + end; + end; + end; + + finally + RootItemsList.Free; + ItemsList.Free; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Ini/Reg } + +procedure SpIniEraseSection(IniFile: TCustomIniFile; Section: string; EraseKeysOnly: Boolean); +var + I: Integer; + Keys: TStringList; +begin + if EraseKeysOnly then begin + Keys := TStringList.Create; + try + IniFile.ReadSection(Section, Keys); + for I := 0 to Keys.Count - 1 do + IniFile.DeleteKey(Section, Keys[I]); + finally + Keys.Free; + end; + end + else + IniFile.EraseSection(Section); +end; + +procedure SpIniSaveStringList(IniFile: TCustomIniFile; Section: string; L: TStringList); +var + I: Integer; +begin + if not Assigned(L) then Exit; + SpIniEraseSection(IniFile, Section, True); + if L.Count > 0 then begin + IniFile.WriteInteger(Section, rvCount, L.Count); + for I := 0 to L.Count - 1 do + IniFile.WriteString(Section, IntToStr(I), L[I]); + end; +end; + +procedure SpIniLoadStringList(IniFile: TCustomIniFile; Section: string; L: TStringList); +var + I, C: integer; +begin + if not Assigned(L) then Exit; + L.Clear; + C := IniFile.ReadInteger(Section, rvCount, -1); + for I := 0 to C - 1 do + L.Add(IniFile.ReadString(Section, IntToStr(I), '')); +end; + +procedure SpRegSaveStringList(L: TStringList; const RootKey: DWORD; const BaseRegistryKey: string); +var + Reg: TRegistry; + I: integer; +begin + if not Assigned(L) then Exit; + Reg := TRegistry.Create; + try + Reg.RootKey := RootKey; + Reg.DeleteKey(BaseRegistryKey); + if Reg.OpenKey(BaseRegistryKey, True) and (L.Count > 0) then begin + Reg.WriteInteger(rvCount, L.Count); + for I := 0 to L.Count - 1 do + Reg.WriteString(IntToStr(I), L[I]); + Reg.CloseKey; + end; + finally + Reg.Free; + end; +end; + +procedure SpRegLoadStringList(L: TStringList; const RootKey: DWORD; const BaseRegistryKey: string); +var + Reg: TRegistry; + I, C: integer; +begin + if not Assigned(L) then Exit; + Reg := TRegistry.Create; + try + L.Clear; + Reg.RootKey := RootKey; + if Reg.OpenKey(BaseRegistryKey, True) then begin + if Reg.ValueExists(rvCount) then begin + C := Reg.ReadInteger(rvCount); + for I := 0 to C - 1 do + if Reg.ValueExists(inttostr(I)) then + L.Add(Reg.ReadString(inttostr(I))); + end; + Reg.CloseKey; + end; + finally + Reg.Free; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Layouts } + +procedure SpLoadFormState(Form: TCustomForm; OptionsList: TStrings); +var + WState: TWindowState; + R: TRect; +begin + if Assigned(Form) then begin + WState := TWindowState(GetEnumValue(TypeInfo(TWindowState), OptionsList.Values[rvMainFormWindowState])); + if (WState < Low(WState)) or (WState > High(WState)) then + WState := Form.WindowState; // Failed reading from string, leave the default value + + if SpStringToRect(OptionsList.Values[rvMainFormBounds], R) then + Form.SetBounds(R.Left, R.Top, R.Right, R.Bottom); + + if not SpStringToRect(OptionsList.Values[rvMainFormRestoreBounds], R) then + R := Rect(Form.Left, Form.Top, Form.Width, Form.Height); // Failed reading from string, leave the default value + + SpSetFormWindowState(Form, WState, R); + end; +end; + +procedure SpSaveFormState(Form: TCustomForm; OptionsList: TStrings); +var + WState: TWindowState; + RestoreBounds: TRect; +begin + if Assigned(Form) then begin + WState := SpGetFormWindowState(Form, RestoreBounds); + OptionsList.Values[rvMainFormWindowState] := GetEnumName(TypeInfo(TWindowState), Ord(WState)); + OptionsList.Values[rvMainFormBounds] := SpRectToString(Rect(Form.Left, Form.Top, Form.Width, Form.Height)); + OptionsList.Values[rvMainFormRestoreBounds] := SpRectToString(RestoreBounds); + end; +end; + +procedure SpLoadLayoutList(IniFile: TCustomIniFile; L: TStringList); overload; +begin + SpIniLoadStringList(IniFile, rvLayoutList, L); +end; + +procedure SpSaveLayout(const OwnerComponent: TComponent; IniFile: TCustomIniFile; + LayoutName: string; ExtraOptions: TStringList = nil); +var + L: TStringList; + Prefix, RegPrevPath: string; +begin + // Add the Layout to the LayoutList + L := TStringList.Create; + try + SpIniLoadStringList(IniFile, rvLayoutList, L); + if L.IndexOf(LayoutName) = -1 then + L.Add(LayoutName); + SpIniSaveStringList(IniFile, rvLayoutList, L); + finally + L.Free; + end; + + Prefix := LayoutName + ' @ '; + // Open the new key and save the previous key if it's a TRegistryIniFile + if IniFile is TRegistryIniFile then begin + RegPrevPath := TRegistryIniFile(IniFile).RegIniFile.CurrentPath; + Prefix := ''; + if not TRegistryIniFile(IniFile).RegIniFile.OpenKey(RegPrevPath + '\' + rvLayoutRegList + '\' + LayoutName, True) then + Exit; + end; + // Save the Layout and ExtraOptions + SpTBIniSavePositions(OwnerComponent, IniFile, Prefix); + if Assigned(ExtraOptions) then + SpIniSaveStringList(IniFile, Prefix + rvExtraOptions, ExtraOptions); + // Open the previous key if it's a TRegistryIniFile + if IniFile is TRegistryIniFile then + TRegistryIniFile(IniFile).RegIniFile.OpenKey(RegPrevPath, False); +end; + +procedure SpLoadLayout(const OwnerComponent: TComponent; IniFile: TCustomIniFile; + LayoutName: string; ExtraOptions: TStringList = nil); +var + L: TStringList; + Prefix, RegPrevPath: string; +begin + // Check if the layout exists on the layout list + L := TStringList.Create; + try + SpIniLoadStringList(IniFile, rvLayoutList, L); + if L.IndexOf(LayoutName) < 0 then + Exit; + finally + L.Free; + end; + + Prefix := LayoutName + ' @ '; + // Open the new key and save the previous key if it's a TRegistryIniFile + if IniFile is TRegistryIniFile then begin + RegPrevPath := TRegistryIniFile(IniFile).RegIniFile.CurrentPath; + Prefix := ''; + if not TRegistryIniFile(IniFile).RegIniFile.OpenKey(RegPrevPath + '\' + rvLayoutRegList + '\' + LayoutName, False) then + Exit; + end; + // Load the Layout and ExtraOptions + SpTBIniLoadPositions(OwnerComponent, IniFile, Prefix); + if Assigned(ExtraOptions) then + SpIniLoadStringList(IniFile, Prefix + rvExtraOptions, ExtraOptions); + // Open the previous key if it's a TRegistryIniFile + if IniFile is TRegistryIniFile then + TRegistryIniFile(IniFile).RegIniFile.OpenKey(RegPrevPath, False); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Items } + +procedure SpSaveItems(const OwnerComponent: TComponent; IniFile: TCustomIniFile; + ShortcutsList: TSpTBXMenuBarShortcuts = nil; ExtraOptions: TStringList = nil); overload; +var + L: TStringList; +begin + L := TStringList.Create; + try + SaveItemOptions(OwnerComponent, ShortcutsList, L); + SpIniSaveStringList(IniFile, rvItemsList, L); + SpIniSaveStringList(IniFile, rvExtraOptions, ExtraOptions); + finally + L.Free; + end; +end; + +procedure SpLoadItems(const OwnerComponent: TComponent; IniFile: TCustomIniFile; + ShortcutsList: TSpTBXMenuBarShortcuts = nil; ExtraOptions: TStringList = nil); overload; +var + L: TStringList; +begin + L := TStringList.Create; + try + SpIniLoadStringList(IniFile, rvItemsList, L); + ApplyItemOptions(OwnerComponent, ShortcutsList, L); + SpIniLoadStringList(IniFile, rvExtraOptions, ExtraOptions); + finally + L.Free; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Misc } + +function SpCustomizerGetWideCaption(Item: TTBCustomItem): WideString; +begin + if Item is TSpTBXCustomItem then Result := TSpTBXCustomItem(Item).Caption + else if Item is TSpTBXEditItem then Result := TSpTBXEditItem(Item).Caption + else if Item is TTBSeparatorItem then Result := Item.Name + else if Item is TTBGroupItem then Result := Item.Name + else Result := Item.Caption; + Result := SpStripShortcut(Result); + Result := SpStripAccelChars(Result); +end; + +function SpCreateUniqueSeparator(Blank: Boolean): TSpTBXSeparatorItem; +var + S: string; +begin + S := IntToStr(DateTimeToFileDate(Now)); + Result := TSpTBXSeparatorItem.Create(nil); + if Blank then begin + Result.Name := rvUniqueBlankSeparatorPrefix + S; + TSpTBXSeparatorItem(Result).Blank := True; + end + else + Result.Name := rvUniqueSeparatorPrefix + S; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TShortCutsProcessor } + +constructor TShortCutsProcessor.Create; +begin + inherited; + if Assigned(Application) then + Application.HookMainWindow(MainWindowHook); +end; + +destructor TShortCutsProcessor.Destroy; +begin + if Assigned(Application) then + Application.UnhookMainWindow(MainWindowHook); + inherited; +end; + +function TShortCutsProcessor.MainWindowHook(var Message: TMessage): Boolean; +begin + // Hook to the Application's message loop to disable ShortCut messages processing. + // If the Form is non-modal and a key is pressed it tries to find a shortcut + // handler in the main form, we need to disable this. + // We have to hook in the initialization section so the hook is prior the + // TTBCustomToolbar hook in the Application's hooklist. + + // Shortcut messages: + // Whenever a keystroke is pressed and is not handled by the active control + // or a suitable popup menu item, it is passed to the underlying form's + // IsShortCut method. The form tries to handle the keystroke through its + // OnShortCut event or, failing that, through its main menu. If nothing wants + // it, all action lists owned by the form are checked for a matching shortcut. + // The action list checks each of its actions and if a match is found, + // the action's Execute method is called. + // If no suitable action is found on the current form a CM_APPKEYDOWN message + // is sent to the Application object which calls its own IsShortCut method. + // This tries to handle the keystroke in its own OnShortCut event and if + // that fails it calls the main form's IsShortCut method. + + // Key press -> Active Control -> Popup Menu -> TCustomForm.IsShortCut -> + // TCustomForm.MainMenu -> TActionList -> TApplication CM_APPKEYDOWN and CM_APPSYSCOMMAND -> + // TApplication.IsShortCut + + Result := False; + if FActive then + if (Message.Msg = CM_APPKEYDOWN) or (Message.Msg = CM_APPSYSCOMMAND) then begin + Message.Result := 0; + Result := true; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomizer } + +constructor TSpTBXCustomizer.Create(AOwner: TComponent); +begin + inherited; + FItems := TTBRootItem.Create(Self); + FItems.ParentComponent := Self; + FLayouts := TStringList.Create; + FResetState := TStringList.Create; + FSaveFormState := True; + SkinManager.AddSkinNotification(Self); +end; + +destructor TSpTBXCustomizer.Destroy; +begin + SkinManager.RemoveSkinNotification(Self); + FItems.Free; + FLayouts.Free; + FResetState.Free; + inherited; +end; + +procedure TSpTBXCustomizer.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited Notification(AComponent, Operation); + if (Operation = opRemove) then begin + if AComponent = FCustomizeForm then FCustomizeForm := nil; + if AComponent = FMenuBar then FMenuBar := nil; + end; +end; + +procedure TSpTBXCustomizer.GetChildren(Proc: TGetChildProc; + Root: TComponent); +begin + TTBRootItemAccess(FItems).GetChildren(Proc, Root); +end; + +function TSpTBXCustomizer.GetCustomizeFormClass: TSpTBXCustomizeFormClass; +begin + Result := TSpTBXCustomizeForm; + if Assigned(FOnGetCustomizeForm) then FOnGetCustomizeForm(Self, Result); + if not Assigned(Result) then + Result := TSpTBXCustomizeForm; +end; + +procedure TSpTBXCustomizer.GetShortcutList(ShortcutsList: TTntStringList); +var + I: Integer; + Item: TTBCustomItem; + ItemStyle: TTBItemStyle; + L: TTntStringList; +begin + ShortcutsList.Clear; + + if Assigned(MenuBar) then begin + if ShortcutsList is TSpTBXMenuBarShortcuts then + TSpTBXMenuBarShortcuts(ShortcutsList).MenuBarName := MenuBar.Name; + + L := TTntStringList.Create; + try + SpGetAllItems(MenuBar.Items, L); + for I := 0 to L.Count - 1 do begin + Item := L.Objects[I] as TTBCustomItem; + ItemStyle := TTBCustomItemAccess(Item).ItemStyle; + // Exclude the submenus, separators, labels, groups and edit items + if (ItemStyle * [tbisSubMenu, tbisSeparator, tbisEmbeddedGroup, tbisClicksTransparent] = []) and + not (Item is TTBEditItem) then + begin + if DoGetShortcutsList(Item) then + ShortcutsList.AddObject(SpCustomizerGetWideCaption(Item), Item); + end; + end; + finally + L.Free; + end; + end; +end; + +function TSpTBXCustomizer.GetImages: TCustomImageList; +begin + Result := FItems.SubMenuImages; +end; + +function TSpTBXCustomizer.GetItems: TTBCustomItem; +begin + Result := FItems; +end; + +procedure TSpTBXCustomizer.SetImages(Value: TCustomImageList); +begin + FItems.SubMenuImages := Value; +end; + +procedure TSpTBXCustomizer.SetMenuBar(const Value: TTBCustomToolbar); +begin + if FMenuBar <> Value then begin + FMenuBar := Value; + if Assigned(Value) then + Value.FreeNotification(Self); + end; +end; + +procedure TSpTBXCustomizer.SetupForm; +begin + FCustomizeForm.FormStyle := fsStayOnTop; + FCustomizeForm.BorderIcons := [biSystemMenu]; + FCustomizeForm.Position := poMainFormCenter; + SpCustomizeAllToolbars(Owner as TWinControl, False); + SpCustomizeAllToolbars(FCustomizeForm, False); +end; + +procedure TSpTBXCustomizer.Close; +begin + if FShowing and Assigned(FCustomizeForm) then begin + FCustomizeForm.Close; + SpCustomizeAllToolbars(Owner as TWinControl, True); + SpCustomizeAllToolbars(FCustomizeForm, True); + FShowing := False; + if Assigned(FOnClose) then FOnClose(Self); + end; +end; + +procedure TSpTBXCustomizer.Show; +begin + ShowEmbedded; +end; + +procedure TSpTBXCustomizer.ShowEmbedded(AParent: TWinControl = nil); +begin + if not Assigned(FCustomizeForm) then + FCustomizeForm := GetCustomizeFormClass.Create(Self, AParent); + + if not FShowing and Assigned(FCustomizeForm) then begin + FShowing := True; + SetupForm; + FCustomizeForm.Show; + FCustomizeForm.DoSkinChange; + if Assigned(FOnShow) then FOnShow(Self); + end; +end; + +procedure TSpTBXCustomizer.ValidateContainer(AComponent: TComponent); +var + I: Integer; +begin + if Assigned(AComponent) then begin + if not (AComponent is TCustomForm) and not (AComponent is TCustomFrame) then + raise EInvalidOperation.Create(SSpTBXCustomizerInvalidParent); + for I := 0 to AComponent.ComponentCount - 1 do + if AComponent.Components[I] is TSpTBXCustomizer then + raise EInvalidOperation.Create(SSpTBXCustomizerRepeatedInstance); + end + else + raise EInvalidOperation.Create(SSpTBXCustomizerInvalidParent); + + inherited; +end; + +procedure TSpTBXCustomizer.Load(IniFile: TCustomIniFile; LoadLastLayout: Boolean = True); +var + ExtraL: TStringList; + ShortcutsL: TSpTBXMenuBarShortcuts; +begin + ExtraL := TStringList.Create; + ShortcutsL := TSpTBXMenuBarShortcuts.Create; + try + // Load Shortcuts + if Assigned(MenuBar) then + GetShortcutList(ShortcutsL); + + // Save the ResetState, save only the Items and Toolbar state + SaveResetState(ShortcutsL); + + // Load Items + SpLoadItems(Owner, IniFile, ShortcutsL, ExtraL); + + // Fill Extra Options + DoLoad(ExtraL); + if FSaveFormState then + SpLoadFormState(Application.MainForm, ExtraL); + SkinManager.SetSkin(ExtraL.Values[rvSkin]); + + // Load Layouts + SpLoadLayoutList(IniFile, FLayouts); + if LoadLastLayout then + LoadLayout(IniFile, rvLastLayout); + finally + ExtraL.Free; + ShortcutsL.Free; + end; +end; + +procedure TSpTBXCustomizer.Load(OptionsList: TStrings; LoadLastLayout: Boolean = True); +var + MemIni: TMemIniFile; +begin + MemIni := TMemIniFile.Create(''); + try + MemIni.SetStrings(OptionsList); // Transfer OptionsList contents to MemIni + Load(MemIni, LoadLastLayout); + finally + MemIni.Free; + end; +end; + +procedure TSpTBXCustomizer.Load(const Filename: string; LoadLastLayout: Boolean = True); +var + MemIni: TMemIniFile; +begin + MemIni := TMemIniFile.Create(Filename); + try + Load(MemIni, LoadLastLayout); + finally + MemIni.Free; + end; +end; + +procedure TSpTBXCustomizer.Load(const RootKey: DWORD; BaseRegistryKey: string; LoadLastLayout: Boolean = True); +var + Reg: TRegistryIniFile; +begin + // Use TRegistryIniFile to call Load + Reg := TRegistryIniFile.Create('', KEY_QUERY_VALUE); + try + Reg.RegIniFile.RootKey := RootKey; + if Reg.RegIniFile.OpenKey(BaseRegistryKey, False) then + Load(Reg, LoadLastLayout); + finally + Reg.Free; + end; +end; + +procedure TSpTBXCustomizer.Save(IniFile: TCustomIniFile); +var + ExtraL: TStringList; + ShortcutsL: TSpTBXMenuBarShortcuts; +begin + ExtraL := TStringList.Create; + ShortcutsL := TSpTBXMenuBarShortcuts.Create; + try + // Fill Extra Options, SpSaveItems will save it + ExtraL.Values[rvSkin] := SkinManager.CurrentSkinName; + if FSaveFormState then + SpSaveFormState(Application.MainForm, ExtraL); + DoSave(ExtraL); + + // Save Items + if Assigned(MenuBar) then + GetShortcutList(ShortcutsL); + SpSaveItems(Owner, IniFile, ShortcutsL, ExtraL); + + // Save Layouts + SaveLayout(IniFile, rvLastLayout); + finally + ExtraL.Free; + ShortcutsL.Free; + end; +end; + +procedure TSpTBXCustomizer.Save(OptionsList: TStrings); +var + MemIni: TMemIniFile; +begin + MemIni := TMemIniFile.Create(''); + try + MemIni.SetStrings(OptionsList); // Transfer OptionsList contents to MemIni + Save(MemIni); + OptionsList.Clear; + MemIni.GetStrings(OptionsList); // Transfer MemIni contents to OptionsList + finally + MemIni.Free; + end; +end; + +procedure TSpTBXCustomizer.Save(const Filename: string); +var + MemIni: TMemIniFile; +begin + MemIni := TMemIniFile.Create(Filename); + try + Save(MemIni); + MemIni.UpdateFile; + finally + MemIni.Free; + end; +end; + +procedure TSpTBXCustomizer.Save(const RootKey: DWORD; BaseRegistryKey: string); +var + Reg: TRegistryIniFile; +begin + // Use TRegistryIniFile to call Save + Reg := TRegistryIniFile.Create(''); + try + Reg.RegIniFile.RootKey := RootKey; + Reg.RegIniFile.CreateKey(BaseRegistryKey); + if Reg.RegIniFile.OpenKey(BaseRegistryKey, True) then + Save(Reg); + finally + Reg.Free; + end; +end; + +procedure TSpTBXCustomizer.Reset; +var + MemIni: TMemIniFile; + ShortcutsL: TSpTBXMenuBarShortcuts; +begin + // Load ResetState + if FResetState.Count > 0 then begin + MemIni := TMemIniFile.Create(''); + ShortcutsL := TSpTBXMenuBarShortcuts.Create; + try + MemIni.SetStrings(FResetState); // Transfer FResetState contents to MemIni + // Load Shortcuts + if Assigned(MenuBar) then + GetShortcutList(ShortcutsL); + // Load Items + SpLoadItems(Owner, MemIni, ShortcutsL, nil); + // Load last layout + SpLoadLayout(Owner, MemIni, rvLastLayout, nil); + finally + MemIni.Free; + ShortcutsL.Free; + end; + end; +end; + +procedure TSpTBXCustomizer.LoadLayout(IniFile: TCustomIniFile; LayoutName: string); +var + ExtraL: TStringList; +begin + ExtraL := TStringList.Create; + try + SpLoadLayout(Owner, IniFile, LayoutName, ExtraL); + DoLayoutLoad(LayoutName, ExtraL); + finally + ExtraL.Free; + end; +end; + +procedure TSpTBXCustomizer.LoadLayout(OptionsList: TStrings; LayoutName: string); +var + MemIni: TMemIniFile; +begin + MemIni := TMemIniFile.Create(''); + try + MemIni.SetStrings(OptionsList); // Transfer OptionsList contents to MemIni + LoadLayout(MemIni, LayoutName); + finally + MemIni.Free; + end; +end; + +procedure TSpTBXCustomizer.LoadLayout(const Filename, LayoutName: string); +var + MemIni: TMemIniFile; +begin + MemIni := TMemIniFile.Create(Filename); + try + LoadLayout(MemIni, LayoutName); + finally + MemIni.Free; + end; +end; + +procedure TSpTBXCustomizer.LoadLayout(const RootKey: DWORD; + BaseRegistryKey, LayoutName: string); +var + Reg: TRegistryIniFile; +begin + // Use TRegistryIniFile to call LoadLayout + Reg := TRegistryIniFile.Create('', KEY_QUERY_VALUE); + try + Reg.RegIniFile.RootKey := RootKey; + if Reg.RegIniFile.OpenKey(BaseRegistryKey, False) then + LoadLayout(Reg, LayoutName); + finally + Reg.Free; + end; +end; + +procedure TSpTBXCustomizer.SaveLayout(IniFile: TCustomIniFile; LayoutName: string); +var + ExtraL: TStringList; +begin + if LayoutName = '' then Exit; + ExtraL := TStringList.Create; + try + DoLayoutSave(LayoutName, ExtraL); + SpSaveLayout(Owner, IniFile, LayoutName, ExtraL); + SpLoadLayoutList(IniFile, FLayouts); + finally + ExtraL.Free; + end; +end; + +procedure TSpTBXCustomizer.SaveLayout(OptionsList: TStrings; LayoutName: string); +var + MemIni: TMemIniFile; +begin + if LayoutName = '' then Exit; + MemIni := TMemIniFile.Create(''); + try + MemIni.SetStrings(OptionsList); // Transfer OptionsList contents to MemIni + SaveLayout(MemIni, LayoutName); + + // Reload OptionsList + OptionsList.Clear; + MemIni.GetStrings(OptionsList); // Transfer MemIni contents to OptionsList + finally + MemIni.Free; + end; +end; + +procedure TSpTBXCustomizer.SaveLayout(const Filename, LayoutName: string); +var + MemIni: TMemIniFile; +begin + if LayoutName = '' then Exit; + MemIni := TMemIniFile.Create(Filename); + try + SaveLayout(MemIni, LayoutName); + MemIni.UpdateFile; + finally + MemIni.Free; + end; +end; + +procedure TSpTBXCustomizer.SaveLayout(const RootKey: DWORD; + BaseRegistryKey, LayoutName: string); +var + Reg: TRegistryIniFile; +begin + if LayoutName = '' then Exit; + // Use TRegistryIniFile to call SaveLayout + Reg := TRegistryIniFile.Create(''); + try + Reg.RegIniFile.RootKey := RootKey; + Reg.RegIniFile.CreateKey(BaseRegistryKey); + if Reg.RegIniFile.OpenKey(BaseRegistryKey, True) then + SaveLayout(Reg, LayoutName); + finally + Reg.Free; + end; +end; + +procedure TSpTBXCustomizer.SaveResetState(ShortcutsList: TSpTBXMenuBarShortcuts); +var + TempIni: TMemIniFile; +begin + // Save the ResetState, save only the Items and Toolbar state + if FResetState.Count = 0 then begin + TempIni := TMemIniFile.Create(''); + try + SaveItemOptions(Owner, ShortcutsList, FResetState); + SpIniSaveStringList(TempIni, rvItemsList, FResetState); + SpSaveLayout(Owner, TempIni, rvLastLayout, nil); + FResetState.Clear; + TempIni.GetStrings(FResetState); // Transfer MemIni contents to OptionsList + finally + TempIni.Free; + end; + end; +end; + +function TSpTBXCustomizer.DeleteLayout(IniFile: TCustomIniFile; LayoutName: string): Boolean; +var + L: TStringList; + I, P: Integer; + S: string; +begin + Result := False; + L := TStringList.Create; + try + SpIniLoadStringList(IniFile, rvLayoutList, L); + I := L.IndexOf(LayoutName); + if I > -1 then begin + Result := True; + L.Delete(I); + SpIniSaveStringList(IniFile, rvLayoutList, L); + + if IniFile is TRegistryIniFile then + TRegistryIniFile(IniFile).EraseSection(rvLayoutRegList + '\' + LayoutName) + else begin + // Delete all the Layout sections + IniFile.ReadSections(L); + for I := 0 to L.Count - 1 do begin + P := Pos(' @ ', L[I]); + if P > 0 then begin + S := Copy(L[I], 1, P - 1); + if SameText(LayoutName, S) then + IniFile.EraseSection(L[I]); + end; + end; + end; + + SpLoadLayoutList(IniFile, FLayouts); + end; + finally + L.Free; + end; +end; + +function TSpTBXCustomizer.DeleteLayout(OptionsList: TStrings; LayoutName: string): Boolean; +var + MemIni: TMemIniFile; +begin + Result := False; + MemIni := TMemIniFile.Create(''); + try + MemIni.SetStrings(OptionsList); // Transfer OptionsList contents to MemIni + if DeleteLayout(MemIni, LayoutName) then begin + Result := True; + // Reload OptionsList + OptionsList.Clear; + MemIni.GetStrings(OptionsList); // Transfer MemIni contents to OptionsList + end; + finally + MemIni.Free; + end; +end; + +function TSpTBXCustomizer.DeleteLayout(const Filename, LayoutName: string): Boolean; +var + MemIni: TMemIniFile; +begin + Result := False; + MemIni := TMemIniFile.Create(Filename); + try + if DeleteLayout(MemIni, LayoutName) then begin + Result := True; + MemIni.UpdateFile; + end; + finally + MemIni.Free; + end; +end; + +function TSpTBXCustomizer.DeleteLayout(const RootKey: DWORD; BaseRegistryKey, + LayoutName: string): Boolean; +var + Reg: TRegistryIniFile; +begin + // Use TRegistryIniFile to call DeleteLayout + Result := False; + Reg := TRegistryIniFile.Create(''); + try + Reg.RegIniFile.RootKey := RootKey; + Reg.RegIniFile.CreateKey(BaseRegistryKey); + if Reg.RegIniFile.OpenKey(BaseRegistryKey, True) then + Result := DeleteLayout(Reg, LayoutName); + finally + Reg.Free; + end; +end; + +function TSpTBXCustomizer.DoGetShortcutsList(AItem: TTBCustomItem): Boolean; +begin + if AItem.Parent is TSpTBXSkinGroupItem then + Result := False + else + Result := True; + if Assigned(FOnGetShortcutsList) then FOnGetShortcutsList(Self, AItem, Result); +end; + +procedure TSpTBXCustomizer.DoIconOptionsChange(Toolbar: TTBCustomToolbar; + UseSmallImages: Boolean); +begin + if Assigned(FOnIconOptionsChange) then FOnIconOptionsChange(Self, Toolbar, UseSmallImages); +end; + +procedure TSpTBXCustomizer.DoLoad(ExtraOptions: TStringList); +begin + if Assigned(FOnLoad) then FOnLoad(Self, ExtraOptions); +end; + +procedure TSpTBXCustomizer.DoSave(ExtraOptions: TStringList); +begin + if Assigned(FOnSave) then FOnSave(Self, ExtraOptions); +end; + +procedure TSpTBXCustomizer.DoLayoutLoad(LayoutName: string; + ExtraOptions: TStringList); +begin + if Assigned(FOnLayoutLoad) then FOnLayoutLoad(Self, LayoutName, ExtraOptions); +end; + +procedure TSpTBXCustomizer.DoLayoutSave(LayoutName: string; + ExtraOptions: TStringList); +begin + if Assigned(FOnLayoutSave) then FOnLayoutSave(Self, LayoutName, ExtraOptions); +end; + +procedure TSpTBXCustomizer.DoSkinChange; +begin + if FShowing and Assigned(FCustomizeForm) then + FCustomizeForm.DoSkinChange; + if Assigned(FOnSkinChange) then FOnSkinChange(Self); +end; + +procedure TSpTBXCustomizer.WMSpSkinChange(var Message: TMessage); +begin + DoSkinChange; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomCustomizeForm } + +constructor TSpTBXCustomCustomizeForm.Create(AOwner: TSpTBXCustomizer; EmbeddedParent: TWinControl); +begin + FCustomizer := AOwner; + FEmbedded := Assigned(EmbeddedParent); + + inherited Create(AOwner); + + FToolbarList := TTntStringList.Create; + FItemList := TTntStringList.Create; + FShortcutList := TTntStringList.Create; + FSeparatorList := TTntStringList.Create; + FBlankSeparatorList := TTntStringList.Create; + + // Hook to the Application's message loop to disable ShortCut messages processing. + // Otherwise the TApplication.MainForm Actions are executed. + if Assigned(FShortcutsProcessor) then + FShortcutsProcessor.Active := True; + + if Assigned(EmbeddedParent) then begin + Parent := EmbeddedParent; + BorderStyle := bsNone; + Align := alClient; + end; +end; + +destructor TSpTBXCustomCustomizeForm.Destroy; +begin + Customizer.Close; + if Assigned(FShortcutsProcessor) then + FShortcutsProcessor.Active := False; + FreeAndNil(FToolbarList); + FreeAndNil(FItemList); + FreeAndNil(FShortcutList); + FreeAndNil(FSeparatorList); + FreeAndNil(FBlankSeparatorList); + inherited; +end; + +procedure TSpTBXCustomCustomizeForm.FillCommands; +var + I: Integer; + W: TWinControl; + TB: TSpTBXToolbar; + Item: TTBCustomItem; + WS: WideString; + UseBlankSeparators: Boolean; +begin + // Get the main form + W := Customizer.Owner as TWinControl; + + FToolbarList.Clear; + FSeparatorList.Clear; + FBlankSeparatorList.Clear; + FItemList.Clear; + + // Fill the Toolbars + for I := 0 to W.ComponentCount - 1 do + if W.Components[I] is TSpTBXToolbar then begin + TB := W.Components[I] as TSpTBXToolbar; + if TB.Customizable then + FToolbarList.AddObject(TB.Caption, TB); + end; + + // Add the Separator item + FItemList.Add(rvSeparator); + UseBlankSeparators := Customizer.BlankSeparators; + if UseBlankSeparators then + FItemList.Add(rvBlankSeparator); + + // Add the Customizer items + for I := 0 to Customizer.Items.Count - 1 do begin + Item := Customizer.Items[I]; + WS := SpCustomizerGetWideCaption(Item); + if Item is TTBSeparatorItem then begin + if UseBlankSeparators and TTBSeparatorItem(Item).Blank then + FBlankSeparatorList.AddObject(WS, Item) + else + FSeparatorList.AddObject(WS, Item); + end + else + FItemList.AddObject(WS, Item); + end; + + // Add the Shortcuts items + Customizer.GetShortcutList(FShortcutList); + + DoFillCommands(FToolbarList, FItemList, FShortcutList); +end; + +procedure TSpTBXCustomCustomizeForm.KeyDown(var Key: Word; Shift: TShiftState); +begin + inherited KeyUp(Key, Shift); + if Key = VK_ESCAPE then Close; +end; + +procedure TSpTBXCustomCustomizeForm.DoClose(var Action: TCloseAction); +begin + Action := caFree; + inherited DoClose(Action); +end; + +procedure TSpTBXCustomCustomizeForm.DoShow; +begin + if Assigned(Customizer) then + FillCommands; + inherited; +end; + +procedure TSpTBXCustomCustomizeForm.DoIconOptionsChange(UseSmallImages: Boolean); +var + I: integer; + TB: TTBCustomToolbar; +begin + if Assigned(Customizer) then + for I := 0 to FToolbarList.Count - 1 do + if FToolbarList.Objects[I] is TTBCustomToolbar then begin + TB := FToolbarList.Objects[I] as TTBCustomToolbar; + Customizer.DoIconOptionsChange(TB, UseSmallImages); + end; +end; + +procedure TSpTBXCustomCustomizeForm.DoSkinChange; +begin + // The skin has changed +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM + +initialization + FShortcutsProcessor := TShortCutsProcessor.Create; +finalization + FreeAndNil(FShortcutsProcessor); + +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXCustomizerForm.dcu b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXCustomizerForm.dcu new file mode 100644 index 0000000000000000000000000000000000000000..de87e95463c7a2a38f09c085fd39d43482fee4f7 GIT binary patch literal 22296 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 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXCustomizerForm.dfm b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXCustomizerForm.dfm new file mode 100644 index 0000000..a451e91 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXCustomizerForm.dfm @@ -0,0 +1,299 @@ +object SpTBXCustomizeForm: TSpTBXCustomizeForm + Left = 219 + Top = 115 + Caption = 'Customizer' + ClientHeight = 321 + ClientWidth = 347 + Color = clBtnFace + Constraints.MinHeight = 355 + Constraints.MinWidth = 355 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Shell Dlg 2' + Font.Style = [] + FormStyle = fsStayOnTop + KeyPreview = True + OldCreateOrder = False + Position = poDesigned + OnCreate = FormCreate + OnKeyDown = FormKeyDown + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object SpTBXTabControl1: TSpTBXTabControl + Left = 0 + Top = 0 + Width = 347 + Height = 286 + Align = alClient + ActiveTabIndex = 0 + HiddenItems = <> + object tabToolbars: TSpTBXTabItem + Caption = 'Toolbars' + Checked = True + end + object tabCommands: TSpTBXTabItem + Caption = 'Commands' + end + object tabShortcuts: TSpTBXTabItem + Caption = 'Shortcuts' + end + object SpTBXTabSheet3: TSpTBXTabSheet + Left = 0 + Top = 23 + Width = 347 + Height = 263 + Caption = 'Commands' + ImageIndex = -1 + DesignSize = ( + 347 + 263) + TabItem = 'tabCommands' + object SpTBXLabel3: TSpTBXLabel + Left = 8 + Top = 213 + Width = 330 + Height = 44 + Caption = + 'To add command buttons, drag and drop commands onto a toolbar. T' + + 'o remove command buttons, drag them off the toolbar and drop the' + + 'm on the commands list.' + Anchors = [akLeft, akRight, akBottom] + AutoSize = False + Wrapping = twWrap + end + object lbCommands: TSpTBXListBox + Left = 8 + Top = 7 + Width = 330 + Height = 205 + Anchors = [akLeft, akTop, akRight, akBottom] + DragMode = dmAutomatic + ItemHeight = 16 + TabOrder = 0 + OnDragDrop = lbCommandsDragDrop + OnDragOver = lbCommandsDragOver + OnDrawItem = lbCommandsDrawItem + OnEndDrag = lbCommandsEndDrag + OnStartDrag = lbCommandsStartDrag + end + end + object SpTBXTabSheet2: TSpTBXTabSheet + Left = 0 + Top = 23 + Width = 347 + Height = 263 + Caption = 'Shortcuts' + ImageIndex = -1 + DesignSize = ( + 347 + 263) + TabItem = 'tabShortcuts' + object SpTBXPanel5: TSpTBXPanel + Left = 65 + Top = 228 + Width = 191 + Height = 22 + Anchors = [akLeft, akRight, akBottom] + TabOrder = 1 + HotTrack = True + object Panel1: TPanel + Left = 2 + Top = 2 + Width = 187 + Height = 18 + Align = alClient + BevelOuter = bvNone + TabOrder = 0 + DesignSize = ( + 187 + 18) + object HotKey1: THotKey + Left = -2 + Top = -2 + Width = 193 + Height = 23 + Anchors = [akLeft, akTop, akRight, akBottom] + HotKey = 0 + Modifiers = [] + TabOrder = 0 + end + end + end + object SpTBXLabel4: TSpTBXLabel + Left = 11 + Top = 229 + Width = 47 + Height = 19 + Caption = '&Shortcut' + Anchors = [akLeft, akBottom] + FocusControl = HotKey1 + end + object ChangeShortcut: TSpTBXButton + Left = 261 + Top = 227 + Width = 75 + Height = 25 + Caption = 'C&hange' + Anchors = [akRight, akBottom] + TabOrder = 2 + OnClick = ChangeShortcutClick + end + object lbShortcuts: TSpTBXListBox + Left = 8 + Top = 7 + Width = 330 + Height = 210 + Anchors = [akLeft, akTop, akRight, akBottom] + ItemHeight = 16 + TabOrder = 0 + OnClick = lbShortcutsClick + OnDrawItem = lbShortcutsDrawItem + end + end + object SpTBXTabSheet1: TSpTBXTabSheet + Left = 0 + Top = 23 + Width = 347 + Height = 263 + Caption = 'Toolbars' + ImageIndex = -1 + DesignSize = ( + 347 + 263) + TabItem = 'tabToolbars' + object SpTBXLabel1: TSpTBXLabel + Left = 10 + Top = 4 + Width = 47 + Height = 19 + Caption = '&Toolbars' + FocusControl = lbToolbars + end + object SpTBXGroupBox1: TSpTBXGroupBox + Left = 173 + Top = 18 + Width = 161 + Height = 177 + Caption = 'Options' + Anchors = [akTop, akRight] + TabOrder = 1 + object cbText: TSpTBXComboBox + Left = 8 + Top = 64 + Width = 145 + Height = 21 + Style = csDropDownList + ItemHeight = 13 + TabOrder = 1 + OnClick = cbTextClick + Items.Strings = ( + 'Selective text on right' + 'No text labels' + 'Show text labels' + 'Text only') + end + object cbIcon: TSpTBXComboBox + Left = 8 + Top = 112 + Width = 145 + Height = 21 + Style = csDropDownList + ItemHeight = 13 + TabOrder = 2 + Items.Strings = ( + 'Large images' + 'Small images') + end + object cbTextLabel: TSpTBXLabel + Left = 8 + Top = 43 + Width = 68 + Height = 19 + Caption = 'T&ext Options' + FocusControl = cbText + end + object cbIconLabel: TSpTBXLabel + Left = 8 + Top = 93 + Width = 67 + Height = 19 + Caption = '&Icon Options' + FocusControl = cbIcon + end + object checkVisible: TSpTBXCheckBox + Left = 8 + Top = 21 + Width = 53 + Height = 21 + Caption = '&Visible' + TabOrder = 0 + OnClick = checkVisibleClick + end + end + object SpTBXGroupBox2: TSpTBXGroupBox + Left = 173 + Top = 200 + Width = 161 + Height = 49 + Caption = '&Skins' + Anchors = [akTop, akRight, akBottom] + TabOrder = 2 + object cbSkins: TSpTBXComboBox + Left = 8 + Top = 20 + Width = 145 + Height = 21 + Style = csDropDownList + ItemHeight = 13 + TabOrder = 0 + OnClick = cbSkinsClick + end + end + object lbToolbars: TSpTBXCheckListBox + Left = 8 + Top = 24 + Width = 158 + Height = 225 + OnClickCheck = lbToolbarsClickCheck + Anchors = [akLeft, akTop, akRight, akBottom] + ItemHeight = 20 + TabOrder = 0 + OnClick = lbToolbarsClick + end + end + end + object ClosePanel: TSpTBXPanel + Left = 0 + Top = 286 + Width = 347 + Height = 35 + Align = alBottom + TabOrder = 1 + Borders = False + TBXStyleBackground = True + DesignSize = ( + 347 + 35) + object CloseButton: TSpTBXButton + Left = 267 + Top = 4 + Width = 75 + Height = 25 + Caption = 'Close' + Anchors = [akRight, akBottom] + TabOrder = 0 + OnClick = CloseButtonClick + end + object ResetButton: TSpTBXButton + Left = 7 + Top = 4 + Width = 105 + Height = 25 + Caption = '&Reset to default' + TabOrder = 1 + OnClick = ResetButtonClick + end + end +end diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXCustomizerForm.hpp b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXCustomizerForm.hpp new file mode 100644 index 0000000..276a6bc --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXCustomizerForm.hpp @@ -0,0 +1,131 @@ +// CodeGear C++Builder +// Copyright (c) 1995, 2008 by CodeGear +// All rights reserved + +// (DO NOT EDIT: machine generated header) 'Sptbxcustomizerform.pas' rev: 20.00 + +#ifndef SptbxcustomizerformHPP +#define SptbxcustomizerformHPP + +#pragma delphiheader begin +#pragma option push +#pragma option -w- // All warnings off +#pragma option -Vx // Zero-length empty class member functions +#pragma pack(push,8) +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit + +//-- user supplied ----------------------------------------------------------- + +namespace Sptbxcustomizerform +{ +//-- type declarations ------------------------------------------------------- +class DELPHICLASS TSpTBXCustomizeForm; +class PASCALIMPLEMENTATION TSpTBXCustomizeForm : public Sptbxcustomizer::TSpTBXCustomCustomizeForm +{ + typedef Sptbxcustomizer::TSpTBXCustomCustomizeForm inherited; + +__published: + Sptbxtabs::TSpTBXTabControl* SpTBXTabControl1; + Sptbxtabs::TSpTBXTabItem* tabCommands; + Sptbxtabs::TSpTBXTabSheet* SpTBXTabSheet1; + Sptbxtabs::TSpTBXTabItem* tabToolbars; + Sptbxtabs::TSpTBXTabSheet* SpTBXTabSheet2; + Sptbxtabs::TSpTBXTabItem* tabShortcuts; + Sptbxtabs::TSpTBXTabSheet* SpTBXTabSheet3; + Sptbxcontrols::TSpTBXButton* CloseButton; + Sptbxcontrols::TSpTBXLabel* SpTBXLabel1; + Sptbxcontrols::TSpTBXLabel* SpTBXLabel3; + Comctrls::THotKey* HotKey1; + Sptbxcontrols::TSpTBXButton* ChangeShortcut; + Sptbxcontrols::TSpTBXLabel* SpTBXLabel4; + Sptbxcontrols::TSpTBXPanel* SpTBXPanel5; + Extctrls::TPanel* Panel1; + Sptbxeditors::TSpTBXComboBox* cbSkins; + Sptbxcontrols::TSpTBXLabel* cbIconLabel; + Sptbxeditors::TSpTBXComboBox* cbText; + Sptbxeditors::TSpTBXComboBox* cbIcon; + Sptbxcontrols::TSpTBXLabel* cbTextLabel; + Sptbxcontrols::TSpTBXGroupBox* SpTBXGroupBox1; + Sptbxcontrols::TSpTBXButton* ResetButton; + Sptbxcontrols::TSpTBXCheckBox* checkVisible; + Sptbxcontrols::TSpTBXGroupBox* SpTBXGroupBox2; + Sptbxeditors::TSpTBXCheckListBox* lbToolbars; + Sptbxeditors::TSpTBXListBox* lbCommands; + Sptbxeditors::TSpTBXListBox* lbShortcuts; + Sptbxcontrols::TSpTBXPanel* ClosePanel; + void __fastcall lbCommandsStartDrag(System::TObject* Sender, Controls::TDragObject* &DragObject); + void __fastcall lbCommandsDragOver(System::TObject* Sender, System::TObject* Source, int X, int Y, Controls::TDragState State, bool &Accept); + void __fastcall lbCommandsDragDrop(System::TObject* Sender, System::TObject* Source, int X, int Y); + void __fastcall lbToolbarsClickCheck(System::TObject* Sender); + void __fastcall CloseButtonClick(System::TObject* Sender); + void __fastcall FormKeyDown(System::TObject* Sender, System::Word &Key, Classes::TShiftState Shift); + void __fastcall lbCommandsEndDrag(System::TObject* Sender, System::TObject* Target, int X, int Y); + void __fastcall lbShortcutsClick(System::TObject* Sender); + void __fastcall FormCreate(System::TObject* Sender); + void __fastcall cbSkinsClick(System::TObject* Sender); + void __fastcall checkVisibleClick(System::TObject* Sender); + void __fastcall cbTextClick(System::TObject* Sender); + void __fastcall lbToolbarsClick(System::TObject* Sender); + void __fastcall ChangeShortcutClick(System::TObject* Sender); + void __fastcall FormShow(System::TObject* Sender); + void __fastcall ResetButtonClick(System::TObject* Sender); + void __fastcall lbCommandsDrawItem(System::TObject* Sender, Graphics::TCanvas* ACanvas, Types::TRect &ARect, int Index, const Windows::TOwnerDrawState State, const Sptbxitem::TSpTBXPaintStage PaintStage, bool &PaintDefault); + void __fastcall lbShortcutsDrawItem(System::TObject* Sender, Graphics::TCanvas* ACanvas, Types::TRect &ARect, int Index, const Windows::TOwnerDrawState State, const Sptbxitem::TSpTBXPaintStage PaintStage, bool &PaintDefault); + +protected: + virtual void __fastcall DoFillCommands(Classes::TStringList* ToolbarList, Classes::TStringList* ItemList, Classes::TStringList* ShortcutsList); + virtual void __fastcall DoSkinChange(void); +public: + /* TSpTBXCustomCustomizeForm.Create */ inline __fastcall TSpTBXCustomizeForm(Sptbxcustomizer::TSpTBXCustomizer* AOwner, Controls::TWinControl* EmbeddedParent) : Sptbxcustomizer::TSpTBXCustomCustomizeForm(AOwner, EmbeddedParent) { } + /* TSpTBXCustomCustomizeForm.Destroy */ inline __fastcall virtual ~TSpTBXCustomizeForm(void) { } + +public: + /* TCustomForm.CreateNew */ inline __fastcall virtual TSpTBXCustomizeForm(Classes::TComponent* AOwner, int Dummy) : Sptbxcustomizer::TSpTBXCustomCustomizeForm(AOwner, Dummy) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXCustomizeForm(HWND ParentWindow) : Sptbxcustomizer::TSpTBXCustomCustomizeForm(ParentWindow) { } + +}; + + +//-- var, const, procedure --------------------------------------------------- +extern PACKAGE System::ResourceString _SSpTBXCustomizerFormChangeShortcut; +#define Sptbxcustomizerform_SSpTBXCustomizerFormChangeShortcut System::LoadResourceString(&Sptbxcustomizerform::_SSpTBXCustomizerFormChangeShortcut) +extern PACKAGE System::ResourceString _SSpTBXCustomizerFormChangeShortcutTitle; +#define Sptbxcustomizerform_SSpTBXCustomizerFormChangeShortcutTitle System::LoadResourceString(&Sptbxcustomizerform::_SSpTBXCustomizerFormChangeShortcutTitle) +extern PACKAGE System::ResourceString _SSpTBXCustomizerFormSeparator; +#define Sptbxcustomizerform_SSpTBXCustomizerFormSeparator System::LoadResourceString(&Sptbxcustomizerform::_SSpTBXCustomizerFormSeparator) +extern PACKAGE System::ResourceString _SSpTBXCustomizerFormBlankSeparator; +#define Sptbxcustomizerform_SSpTBXCustomizerFormBlankSeparator System::LoadResourceString(&Sptbxcustomizerform::_SSpTBXCustomizerFormBlankSeparator) + +} /* namespace Sptbxcustomizerform */ +using namespace Sptbxcustomizerform; +#pragma pack(pop) +#pragma option pop + +#pragma delphiheader end. +//-- end unit ---------------------------------------------------------------- +#endif // SptbxcustomizerformHPP diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXCustomizerForm.pas b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXCustomizerForm.pas new file mode 100644 index 0000000..aa3e3c2 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXCustomizerForm.pas @@ -0,0 +1,531 @@ +unit SpTBXCustomizerForm; + +{============================================================================== +Version 2.4.2 + +The contents of this file are subject to the SpTBXLib License; you may +not use or distribute this file except in compliance with the +SpTBXLib License. +A copy of the SpTBXLib License may be found in SpTBXLib-LICENSE.txt or at: + http://www.silverpointdevelopment.com/sptbxlib/SpTBXLib-LICENSE.htm + +Alternatively, the contents of this file may be used under the terms of the +Mozilla Public License Version 1.1 (the "MPL v1.1"), in which case the provisions +of the MPL v1.1 are applicable instead of those in the SpTBXLib License. +A copy of the MPL v1.1 may be found in MPL-LICENSE.txt or at: + http://www.mozilla.org/MPL/ + +If you wish to allow use of your version of this file only under the terms of +the MPL v1.1 and not to allow others to use your version of this file under the +SpTBXLib License, indicate your decision by deleting the provisions +above and replace them with the notice and other provisions required by the +MPL v1.1. If you do not delete the provisions above, a recipient may use your +version of this file under either the SpTBXLib License or the MPL v1.1. + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for +the specific language governing rights and limitations under the License. + +The initial developer of this code is Robert Lee. + +Requirements: +For Delphi/C++Builder 2009 or newer: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org +For Delphi/C++Builder 7-2007: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org + - Troy Wolbrink's TNT Unicode Controls + http://www.tntware.com/delphicontrols/unicode/ + +Development notes: + - All the TBX theme changes and adjustments are marked with '[TBXTheme-Change]'. + +History: + - + +==============================================================================} + +interface + +{$BOOLEVAL OFF} // Unit depends on short-circuit boolean evaluation + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, ExtCtrls, ComCtrls, ImgList, CheckLst, + {$IFNDEF UNICODE} + TntClasses, TntStdCtrls, TntCheckLst, + {$ENDIF} + TB2Toolbar, TB2Item, + SpTBXSkins, SpTBXItem, SpTBXControls, SpTBXEditors, SpTBXTabs, SpTBXCustomizer; + +resourcestring + SSpTBXCustomizerFormChangeShortcut = 'The shortcut is already being used by the "%s" command. Do you want to reassign it to the "%s" command?'; + SSpTBXCustomizerFormChangeShortcutTitle = 'Change Shortcut'; + SSpTBXCustomizerFormSeparator = '[ Separator ]'; + SSpTBXCustomizerFormBlankSeparator = '[ Blank Separator ]'; + +type + TSpTBXCustomizeForm = class(TSpTBXCustomCustomizeForm) + SpTBXTabControl1: TSpTBXTabControl; + tabCommands: TSpTBXTabItem; + SpTBXTabSheet1: TSpTBXTabSheet; + tabToolbars: TSpTBXTabItem; + SpTBXTabSheet2: TSpTBXTabSheet; + tabShortcuts: TSpTBXTabItem; + SpTBXTabSheet3: TSpTBXTabSheet; + CloseButton: TSpTBXButton; + SpTBXLabel1: TSpTBXLabel; + SpTBXLabel3: TSpTBXLabel; + HotKey1: THotKey; + ChangeShortcut: TSpTBXButton; + SpTBXLabel4: TSpTBXLabel; + SpTBXPanel5: TSpTBXPanel; + Panel1: TPanel; + cbSkins: TSpTBXComboBox; + cbIconLabel: TSpTBXLabel; + cbText: TSpTBXComboBox; + cbIcon: TSpTBXComboBox; + cbTextLabel: TSpTBXLabel; + SpTBXGroupBox1: TSpTBXGroupBox; + ResetButton: TSpTBXButton; + checkVisible: TSpTBXCheckBox; + SpTBXGroupBox2: TSpTBXGroupBox; + lbToolbars: TSpTBXCheckListBox; + lbCommands: TSpTBXListBox; + lbShortcuts: TSpTBXListBox; + ClosePanel: TSpTBXPanel; + procedure lbCommandsStartDrag(Sender: TObject; + var DragObject: TDragObject); + procedure lbCommandsDragOver(Sender, Source: TObject; X, + Y: Integer; State: TDragState; var Accept: Boolean); + procedure lbCommandsDragDrop(Sender, Source: TObject; X, + Y: Integer); + procedure lbToolbarsClickCheck(Sender: TObject); + procedure CloseButtonClick(Sender: TObject); + procedure FormKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); + procedure lbCommandsEndDrag(Sender, Target: TObject; X, Y: Integer); + procedure lbShortcutsClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure cbSkinsClick(Sender: TObject); + procedure checkVisibleClick(Sender: TObject); + procedure cbTextClick(Sender: TObject); + procedure lbToolbarsClick(Sender: TObject); + procedure ChangeShortcutClick(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure ResetButtonClick(Sender: TObject); + procedure lbCommandsDrawItem(Sender: TObject; ACanvas: TCanvas; + var ARect: TRect; Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); + procedure lbShortcutsDrawItem(Sender: TObject; ACanvas: TCanvas; + var ARect: TRect; Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); + protected + procedure DoFillCommands(ToolbarList, ItemList, ShortcutsList: TTntStringList); override; + procedure DoSkinChange; override; + end; + +implementation + +uses + ActnList; + +{$R *.dfm} + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Helpers } + +procedure SpDrawListboxItem(L: TSpTBXListBox; Index: Integer; ARect: TRect; + State: TOwnerDrawState; DrawShortcut: Boolean; DefaultImageList: TCustomImageList); +var + Item: TTBCustomItem; + IL: TCustomImageList; + WS: WideString; + TextR, ILRect: TRect; + Y: Integer; + ACanvas: TCanvas; +begin + if (Index < 0) or (Index > L.Count - 1) or not (L.Items.Objects[Index] is TTBCustomItem) then Exit; + Item := L.Items.Objects[Index] as TTBCustomItem; + ACanvas := L.Canvas; + + // Draw the icon image + Inc(ARect.Left, 2); // Apply margins + if Item.ImageIndex > -1 then begin + IL := Item.Images; + if not Assigned(IL) then + IL := DefaultImageList; + if Assigned(IL) then begin + ILRect := Bounds(ARect.Left, ARect.Top + ((L.ItemHeight - IL.Height) div 2), IL.Width, IL.Height); + // Draw icon shadow + if odSelected in State then begin + OffsetRect(ILRect, 1, 1); + SpDrawIconShadow(ACanvas, ILRect, IL, Item.ImageIndex); + OffsetRect(ILRect, -2, -2); + end; + SpDrawImageList(ACanvas, ILRect, IL, Item.ImageIndex, True, True); + end; + end; + + // Draw the caption + Inc(ARect.Left, L.ItemHeight); // Apply margins + WS := L.Items[Index]; + TextR := ARect; + Y := SpDrawXPText(ACanvas, WS, TextR, DT_CALCRECT); + ARect.Top := ARect.Top + ((L.ItemHeight - Y) div 2); + SpDrawXPText(ACanvas, WS, ARect, 0); + + // Draw the shortcut + if DrawShortcut then begin + WS := Item.GetShortCutText; + if (WS <> '0') and (WS <> '') then begin + ARect.Left := L.Width - 120; + SpDrawXPText(ACanvas, WS, ARect, 0) + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomizeForm } + +procedure TSpTBXCustomizeForm.FormCreate(Sender: TObject); +var + L: TStringList; +begin + ClosePanel.Visible := not Embedded; + + // Setup the listboxes + if Assigned(Customizer.Images) then begin + lbCommands.ItemHeight := Customizer.Images.Height + 4; + lbShortcuts.ItemHeight := Customizer.Images.Height + 4; + end; + // Hide the Icon Options combobox if necessary + if not Assigned(Customizer.OnIconOptionsChange) then begin + cbIconLabel.Visible := False; + cbIcon.Visible := False; + end; + // Fill the Skins combobox + L := TStringList.Create; + try + SkinManager.SkinsList.GetSkinNames(L); + L.Sort; + cbSkins.Items.Assign(L); + cbSkins.ItemIndex := L.IndexOf(SkinManager.CurrentSkinName); + finally + L.Free; + end; +end; + +procedure TSpTBXCustomizeForm.FormShow(Sender: TObject); +begin + SpTBXTabControl1.ActiveTabIndex := 0; +end; + +procedure TSpTBXCustomizeForm.FormKeyDown(Sender: TObject; + var Key: Word; Shift: TShiftState); +var + I: Integer; +begin + // Allow to change the tab index using Ctrl+Tab and Shift+Ctrl+Tab + if Key = VK_TAB then + if Shift = [ssCtrl] then begin + I := SpTBXTabControl1.ActiveTabIndex; + if I + 1 < SpTBXTabControl1.PagesCount then + SpTBXTabControl1.ActiveTabIndex := I + 1 + else + SpTBXTabControl1.ActiveTabIndex := I - 1 + end + else + if Shift = [ssCtrl, ssShift] then begin + I := SpTBXTabControl1.ActiveTabIndex; + if I - 1 > -1 then + SpTBXTabControl1.ActiveTabIndex := I - 1 + else + SpTBXTabControl1.ActiveTabIndex := I + 1; + end; +end; + +procedure TSpTBXCustomizeForm.CloseButtonClick(Sender: TObject); +begin + Close; +end; + +procedure TSpTBXCustomizeForm.DoFillCommands(ToolbarList, ItemList, ShortcutsList: TTntStringList); +var + I: Integer; + TB: TSpTBXToolbar; +begin + lbToolbars.Items.Assign(ToolbarList); + lbCommands.Items.Assign(ItemList); + lbShortcuts.Items.Assign(ShortcutsList); + // Setup the Toolbars check list + for I := 0 to lbToolbars.Count - 1 do begin + TB := lbToolbars.Items.Objects[I] as TSpTBXToolbar; + if TB.Visible then + lbToolbars.State[I] := cbChecked; + end; + if lbToolbars.Count > 0 then begin + lbToolbars.ItemIndex := 0; + lbToolbarsClick(nil); + end; +end; + +procedure TSpTBXCustomizeForm.DoSkinChange; +begin + inherited; + ClosePanel.Color := SkinManager.CurrentSkin.ColorBtnFace; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Toolbars tab } + +procedure TSpTBXCustomizeForm.lbToolbarsClick(Sender: TObject); +var + I: Integer; + TB: TTBCustomToolbar; +begin + I := lbToolbars.ItemIndex; + if I > -1 then begin + TB := lbToolbars.Items.Objects[I] as TTBCustomToolbar; + checkVisible.Checked := TB.Visible; + if TB is TSpTBXToolbar then + cbText.ItemIndex := Ord(TSpTBXToolbar(TB).DisplayMode) + else + cbText.ItemIndex := -1; + end; +end; + +procedure TSpTBXCustomizeForm.lbToolbarsClickCheck(Sender: TObject); +var + I: Integer; + TB: TTBCustomToolbar; +begin + I := lbToolbars.ItemIndex; + if I > -1 then begin + TB := lbToolbars.Items.Objects[I] as TTBCustomToolbar; + TB.Visible := lbToolbars.Checked[I]; + end; +end; + +procedure TSpTBXCustomizeForm.ResetButtonClick(Sender: TObject); +begin + Customizer.Reset; + FillCommands; +end; + +procedure TSpTBXCustomizeForm.checkVisibleClick(Sender: TObject); +var + I: Integer; +begin + I := lbToolbars.ItemIndex; + if I > -1 then begin + lbToolbars.Checked[I] := checkVisible.Checked; + lbToolbarsClickCheck(nil); + end; +end; + +procedure TSpTBXCustomizeForm.cbTextClick(Sender: TObject); +var + I: Integer; + TB: TSpTBXToolbar; +begin + I := lbToolbars.ItemIndex; + if (I > -1) and (cbText.ItemIndex > -1) then + if lbToolbars.Items.Objects[I] is TSpTBXToolbar then begin + TB := lbToolbars.Items.Objects[I] as TSpTBXToolbar; + TB.DisplayMode := TSpTBXToolbarDisplayMode(cbText.ItemIndex); + end; +end; + +procedure TSpTBXCustomizeForm.cbSkinsClick(Sender: TObject); +begin + if cbSkins.ItemIndex > -1 then + SkinManager.SetSkin(cbSkins.Text); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Commands tab } + +procedure TSpTBXCustomizeForm.lbCommandsStartDrag(Sender: TObject; + var DragObject: TDragObject); +var + L: TSpTBXListBox; + I: Integer; + Item: TTBCustomItem; + Sep: TTBSeparatorItem; +begin + L := Sender as TSpTBXListBox; + I := L.ItemIndex; + if I > -1 then begin + if I = 0 then begin + // When dragging the separator item use the first one available, or create one + if FSeparatorList.Count = 0 then begin + Sep := SpCreateUniqueSeparator(False); + Customizer.Items.Add(Sep); + FSeparatorList.AddObject(Sep.Name, Sep); + end; + Item := FSeparatorList.Objects[0] as TTBCustomItem; + // SpOutputDebugString('Start ' + FSeparatorList[0]); + end + else + if (I = 1) and Customizer.BlankSeparators then begin + // When dragging the blank separator item use the first one available, or create one + if FBlankSeparatorList.Count = 0 then begin + Sep := SpCreateUniqueSeparator(True); + Customizer.Items.Add(Sep); + FBlankSeparatorList.AddObject(Sep.Name, Sep); + end; + Item := FBlankSeparatorList.Objects[0] as TTBCustomItem; + end + else + Item := L.Items.Objects[I] as TTBCustomItem; + DragObject := TSpTBXItemDragObject.Create(L, Item); + end; +end; + +procedure TSpTBXCustomizeForm.lbCommandsEndDrag(Sender, + Target: TObject; X, Y: Integer); +var + Accepted: Boolean; + I: Integer; +begin + // When dropping an item on a toolbar we must remove the item from the list + Accepted := Assigned(Target) and (Target <> Sender); + if Accepted then begin + I := lbCommands.ItemIndex; + if I > -1 then + if I = 0 then begin + // SpOutputDebugString('End ' + FSeparatorList[0]); + FSeparatorList.Delete(0); + end + else + if (I = 1) and Customizer.BlankSeparators then + FBlankSeparatorList.Delete(0) + else + lbCommands.Items.Delete(I); + end; +end; + +procedure TSpTBXCustomizeForm.lbCommandsDragOver(Sender, + Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); +begin + Accept := Assigned(Source) and (Source is TSpTBXItemDragObject); +end; + +procedure TSpTBXCustomizeForm.lbCommandsDragDrop(Sender, + Source: TObject; X, Y: Integer); +var + OrigItem: TTBCustomItem; + WS: WideString; +begin + if Assigned(Source) and (Source is TSpTBXItemDragObject) and + (TSpTBXItemDragObject(Source).SourceControl <> Sender) then + begin + OrigItem := TSpTBXItemDragObject(Source).SouceItem; + // Remove the item from its parent + OrigItem.Parent.Remove(OrigItem); + // Add the item to the Customizer.Items property + Customizer.Items.Add(OrigItem); + WS := SpCustomizerGetWideCaption(OrigItem); + // Add the item entry in the commands list + if OrigItem is TTBSeparatorItem then begin + if Customizer.BlankSeparators and TTBSeparatorItem(OrigItem).Blank then + FBlankSeparatorList.InsertObject(0, WS, OrigItem) // Insert the blank separator in the first position + else + FSeparatorList.InsertObject(0, WS, OrigItem) // Insert the separator in the first position + end + else + lbCommands.AddItem(WS, OrigItem); + // SpOutputDebugString('Dropped ' + WS); + end; +end; + +procedure TSpTBXCustomizeForm.lbCommandsDrawItem(Sender: TObject; + ACanvas: TCanvas; var ARect: TRect; Index: Integer; + const State: TOwnerDrawState; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +begin + if PaintStage = pstPrePaint then begin + PaintDefault := False; + if Index = 0 then begin + // Draw the separator + SpDrawXPText(ACanvas, SSpTBXCustomizerFormSeparator, ARect, DT_SINGLELINE or DT_CENTER or DT_VCENTER); + end + else + if (Index = 1) and Customizer.BlankSeparators then begin + // Draw the blank separator + SpDrawXPText(ACanvas, SSpTBXCustomizerFormBlankSeparator, ARect, DT_SINGLELINE or DT_CENTER or DT_VCENTER); + end + else + SpDrawListboxItem(Sender as TSpTBXListBox, Index, ARect, State, False, Customizer.Images); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Shortcuts tab } + +procedure TSpTBXCustomizeForm.lbShortcutsClick(Sender: TObject); +var + Item: TTBCustomItem; +begin + if lbShortcuts.ItemIndex > -1 then begin + Item := lbShortcuts.Items.Objects[lbShortcuts.ItemIndex] as TTBCustomItem; + HotKey1.HotKey := Item.ShortCut; + end; +end; + +procedure TSpTBXCustomizeForm.lbShortcutsDrawItem(Sender: TObject; + ACanvas: TCanvas; var ARect: TRect; Index: Integer; + const State: TOwnerDrawState; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +begin + if PaintStage = pstPrePaint then begin + PaintDefault := False; + SpDrawListboxItem(Sender as TSpTBXListBox, Index, ARect, State, True, Customizer.Images); + end; +end; + +procedure TSpTBXCustomizeForm.ChangeShortcutClick(Sender: TObject); +var + Item, F: TTBCustomItem; + WS, WS2: WideString; + T: TShortCut; + I: Integer; + ChangeShortCut: Boolean; +begin + if lbShortcuts.ItemIndex < 0 then Exit; + T := HotKey1.HotKey; + Item := lbShortcuts.Items.Objects[lbShortcuts.ItemIndex] as TTBCustomItem; + + ChangeShortCut := True; + + if T <> 0 then begin + // Find if the shortcut is already being used + for I := 0 to lbShortcuts.Count - 1 do begin + F := lbShortcuts.Items.Objects[I] as TTBCustomItem; + if F.ShortCut = T then begin + WS := WideFormat(SSpTBXCustomizerFormChangeShortcut, [SpCustomizerGetWideCaption(F), SpCustomizerGetWideCaption(Item)]); + WS2 := SSpTBXCustomizerFormChangeShortcutTitle; + ChangeShortCut := MessageBoxW(Handle, PWideChar(WS), PWideChar(WS2), MB_APPLMODAL+MB_ICONWARNING+MB_OKCANCEL+MB_DEFBUTTON1) = IDOK; + if ChangeShortCut then + if Assigned(F.Action) and (F.Action is TAction) then + TAction(F.Action).ShortCut := 0 + else + F.ShortCut := 0; + + Break; + end; + end; + end; + + if ChangeShortCut then begin + if Assigned(Item.Action) and (Item.Action is TAction) then + TAction(Item.Action).ShortCut := T + else + Item.ShortCut := T; + lbShortcuts.Invalidate; + end; +end; + +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXDefaultSkins.dcu b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXDefaultSkins.dcu new file mode 100644 index 0000000000000000000000000000000000000000..891f92ecf6b76659fd32ad97548952279a65facc GIT binary patch literal 76991 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 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXDefaultSkins.hpp b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXDefaultSkins.hpp new file mode 100644 index 0000000..1c9ef10 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXDefaultSkins.hpp @@ -0,0 +1,256 @@ +// CodeGear C++Builder +// Copyright (c) 1995, 2008 by CodeGear +// All rights reserved + +// (DO NOT EDIT: machine generated header) 'Sptbxdefaultskins.pas' rev: 20.00 + +#ifndef SptbxdefaultskinsHPP +#define SptbxdefaultskinsHPP + +#pragma delphiheader begin +#pragma option push +#pragma option -w- // All warnings off +#pragma option -Vx // Zero-length empty class member functions +#pragma pack(push,8) +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit + +//-- user supplied ----------------------------------------------------------- + +namespace Sptbxdefaultskins +{ +//-- type declarations ------------------------------------------------------- +typedef StaticArray TSpTBXAluminumColors; + +class DELPHICLASS TSpTBXAluminumSkin; +class PASCALIMPLEMENTATION TSpTBXAluminumSkin : public Sptbxskins::TSpTBXSkinOptions +{ + typedef Sptbxskins::TSpTBXSkinOptions inherited; + +private: + void __fastcall SetDefaultColorScheme(const Sptbxskins::TSpTBXLunaScheme Value); + +protected: + TSpTBXAluminumColors FColors; + Sptbxskins::TSpTBXLunaScheme FDefaultColorScheme; + Graphics::TColor FLightMetalColor; + Graphics::TColor FDarkMetalColor; + int FRoughness; + virtual void __fastcall FillColors(void); + virtual Graphics::TColor __fastcall GetBrushMetalColor(Sptbxskins::TSpTBXSkinComponentsType Component, Sptbxskins::TSpTBXSkinStatesType State); + +public: + __fastcall virtual TSpTBXAluminumSkin(void); + __fastcall virtual ~TSpTBXAluminumSkin(void); + virtual void __fastcall FillOptions(void); + virtual void __fastcall PaintBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, Sptbxskins::TSpTBXSkinComponentsType Component, Sptbxskins::TSpTBXSkinStatesType State, bool Background, bool Borders, bool Vertical = false, Controls::TAnchors ForceRectBorders = Controls::TAnchors() ); + __property Graphics::TColor LightMetalColor = {read=FLightMetalColor, write=FLightMetalColor, nodefault}; + __property Graphics::TColor DarkMetalColor = {read=FDarkMetalColor, write=FDarkMetalColor, nodefault}; + __property Sptbxskins::TSpTBXLunaScheme DefaultColorScheme = {read=FDefaultColorScheme, write=SetDefaultColorScheme, default=3}; +}; + + +class DELPHICLASS TSpTBXAthenSkin; +class PASCALIMPLEMENTATION TSpTBXAthenSkin : public Sptbxskins::TSpTBXSkinOptions +{ + typedef Sptbxskins::TSpTBXSkinOptions inherited; + +public: + virtual void __fastcall FillOptions(void); +public: + /* TSpTBXSkinOptions.Create */ inline __fastcall virtual TSpTBXAthenSkin(void) : Sptbxskins::TSpTBXSkinOptions() { } + /* TSpTBXSkinOptions.Destroy */ inline __fastcall virtual ~TSpTBXAthenSkin(void) { } + +}; + + +class DELPHICLASS TSpTBXDreamSkin; +class PASCALIMPLEMENTATION TSpTBXDreamSkin : public Sptbxskins::TSpTBXSkinOptions +{ + typedef Sptbxskins::TSpTBXSkinOptions inherited; + +public: + virtual void __fastcall FillOptions(void); +public: + /* TSpTBXSkinOptions.Create */ inline __fastcall virtual TSpTBXDreamSkin(void) : Sptbxskins::TSpTBXSkinOptions() { } + /* TSpTBXSkinOptions.Destroy */ inline __fastcall virtual ~TSpTBXDreamSkin(void) { } + +}; + + +class DELPHICLASS TSpTBXEosSkin; +class PASCALIMPLEMENTATION TSpTBXEosSkin : public Sptbxskins::TSpTBXSkinOptions +{ + typedef Sptbxskins::TSpTBXSkinOptions inherited; + +public: + virtual void __fastcall FillOptions(void); +public: + /* TSpTBXSkinOptions.Create */ inline __fastcall virtual TSpTBXEosSkin(void) : Sptbxskins::TSpTBXSkinOptions() { } + /* TSpTBXSkinOptions.Destroy */ inline __fastcall virtual ~TSpTBXEosSkin(void) { } + +}; + + +class DELPHICLASS TSpTBXHumanSkin; +class PASCALIMPLEMENTATION TSpTBXHumanSkin : public Sptbxskins::TSpTBXSkinOptions +{ + typedef Sptbxskins::TSpTBXSkinOptions inherited; + +public: + virtual void __fastcall FillOptions(void); + virtual void __fastcall PaintBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, Sptbxskins::TSpTBXSkinComponentsType Component, Sptbxskins::TSpTBXSkinStatesType State, bool Background, bool Borders, bool Vertical = false, Controls::TAnchors ForceRectBorders = Controls::TAnchors() ); +public: + /* TSpTBXSkinOptions.Create */ inline __fastcall virtual TSpTBXHumanSkin(void) : Sptbxskins::TSpTBXSkinOptions() { } + /* TSpTBXSkinOptions.Destroy */ inline __fastcall virtual ~TSpTBXHumanSkin(void) { } + +}; + + +class DELPHICLASS TSpTBXLeopardSkin; +class PASCALIMPLEMENTATION TSpTBXLeopardSkin : public Sptbxskins::TSpTBXSkinOptions +{ + typedef Sptbxskins::TSpTBXSkinOptions inherited; + +public: + virtual void __fastcall FillOptions(void); + virtual void __fastcall PaintBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, Sptbxskins::TSpTBXSkinComponentsType Component, Sptbxskins::TSpTBXSkinStatesType State, bool Background, bool Borders, bool Vertical = false, Controls::TAnchors ForceRectBorders = Controls::TAnchors() ); +public: + /* TSpTBXSkinOptions.Create */ inline __fastcall virtual TSpTBXLeopardSkin(void) : Sptbxskins::TSpTBXSkinOptions() { } + /* TSpTBXSkinOptions.Destroy */ inline __fastcall virtual ~TSpTBXLeopardSkin(void) { } + +}; + + +class DELPHICLASS TSpTBXXitoSkin; +class PASCALIMPLEMENTATION TSpTBXXitoSkin : public Sptbxskins::TSpTBXSkinOptions +{ + typedef Sptbxskins::TSpTBXSkinOptions inherited; + +public: + virtual void __fastcall FillOptions(void); +public: + /* TSpTBXSkinOptions.Create */ inline __fastcall virtual TSpTBXXitoSkin(void) : Sptbxskins::TSpTBXSkinOptions() { } + /* TSpTBXSkinOptions.Destroy */ inline __fastcall virtual ~TSpTBXXitoSkin(void) { } + +}; + + +class DELPHICLASS TSpTBXOfficeXPSkin; +class PASCALIMPLEMENTATION TSpTBXOfficeXPSkin : public Sptbxskins::TSpTBXSkinOptions +{ + typedef Sptbxskins::TSpTBXSkinOptions inherited; + +public: + virtual void __fastcall FillOptions(void); +public: + /* TSpTBXSkinOptions.Create */ inline __fastcall virtual TSpTBXOfficeXPSkin(void) : Sptbxskins::TSpTBXSkinOptions() { } + /* TSpTBXSkinOptions.Destroy */ inline __fastcall virtual ~TSpTBXOfficeXPSkin(void) { } + +}; + + +typedef StaticArray TSpTBXOffice2003Colors; + +class DELPHICLASS TSpTBXOffice2003Skin; +class PASCALIMPLEMENTATION TSpTBXOffice2003Skin : public Sptbxskins::TSpTBXSkinOptions +{ + typedef Sptbxskins::TSpTBXSkinOptions inherited; + +private: + void __fastcall SetDefaultColorScheme(const Sptbxskins::TSpTBXLunaScheme Value); + +protected: + TSpTBXOffice2003Colors FColors; + Sptbxskins::TSpTBXLunaScheme FDefaultColorScheme; + virtual void __fastcall FillColors(void); + +public: + __fastcall virtual TSpTBXOffice2003Skin(void); + virtual void __fastcall FillOptions(void); + __property Sptbxskins::TSpTBXLunaScheme DefaultColorScheme = {read=FDefaultColorScheme, write=SetDefaultColorScheme, default=3}; +public: + /* TSpTBXSkinOptions.Destroy */ inline __fastcall virtual ~TSpTBXOffice2003Skin(void) { } + +}; + + +typedef StaticArray TSpTBXOffice2007Colors; + +class DELPHICLASS TSpTBXOffice2007Skin; +class PASCALIMPLEMENTATION TSpTBXOffice2007Skin : public Sptbxskins::TSpTBXSkinOptions +{ + typedef Sptbxskins::TSpTBXSkinOptions inherited; + +protected: + TSpTBXOffice2007Colors FColors; + virtual void __fastcall FillColors(void) = 0 ; + +public: + virtual void __fastcall FillOptions(void); +public: + /* TSpTBXSkinOptions.Create */ inline __fastcall virtual TSpTBXOffice2007Skin(void) : Sptbxskins::TSpTBXSkinOptions() { } + /* TSpTBXSkinOptions.Destroy */ inline __fastcall virtual ~TSpTBXOffice2007Skin(void) { } + +}; + + +class DELPHICLASS TSpTBXOffice2007BlueSkin; +class PASCALIMPLEMENTATION TSpTBXOffice2007BlueSkin : public TSpTBXOffice2007Skin +{ + typedef TSpTBXOffice2007Skin inherited; + +protected: + virtual void __fastcall FillColors(void); +public: + /* TSpTBXSkinOptions.Create */ inline __fastcall virtual TSpTBXOffice2007BlueSkin(void) : TSpTBXOffice2007Skin() { } + /* TSpTBXSkinOptions.Destroy */ inline __fastcall virtual ~TSpTBXOffice2007BlueSkin(void) { } + +}; + + +class DELPHICLASS TSpTBXOffice2007BlackSkin; +class PASCALIMPLEMENTATION TSpTBXOffice2007BlackSkin : public TSpTBXOffice2007Skin +{ + typedef TSpTBXOffice2007Skin inherited; + +protected: + virtual void __fastcall FillColors(void); +public: + /* TSpTBXSkinOptions.Create */ inline __fastcall virtual TSpTBXOffice2007BlackSkin(void) : TSpTBXOffice2007Skin() { } + /* TSpTBXSkinOptions.Destroy */ inline __fastcall virtual ~TSpTBXOffice2007BlackSkin(void) { } + +}; + + +class DELPHICLASS TSpTBXOffice2007SilverSkin; +class PASCALIMPLEMENTATION TSpTBXOffice2007SilverSkin : public TSpTBXOffice2007Skin +{ + typedef TSpTBXOffice2007Skin inherited; + +protected: + virtual void __fastcall FillColors(void); +public: + /* TSpTBXSkinOptions.Create */ inline __fastcall virtual TSpTBXOffice2007SilverSkin(void) : TSpTBXOffice2007Skin() { } + /* TSpTBXSkinOptions.Destroy */ inline __fastcall virtual ~TSpTBXOffice2007SilverSkin(void) { } + +}; + + +//-- var, const, procedure --------------------------------------------------- + +} /* namespace Sptbxdefaultskins */ +using namespace Sptbxdefaultskins; +#pragma pack(pop) +#pragma option pop + +#pragma delphiheader end. +//-- end unit ---------------------------------------------------------------- +#endif // SptbxdefaultskinsHPP diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXDefaultSkins.pas b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXDefaultSkins.pas new file mode 100644 index 0000000..6079623 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXDefaultSkins.pas @@ -0,0 +1,2105 @@ +unit SpTBXDefaultSkins; + +{============================================================================== +Version 2.4.2 + +The contents of this file are subject to the SpTBXLib License; you may +not use or distribute this file except in compliance with the +SpTBXLib License. +A copy of the SpTBXLib License may be found in SpTBXLib-LICENSE.txt or at: + http://www.silverpointdevelopment.com/sptbxlib/SpTBXLib-LICENSE.htm + +Alternatively, the contents of this file may be used under the terms of the +Mozilla Public License Version 1.1 (the "MPL v1.1"), in which case the provisions +of the MPL v1.1 are applicable instead of those in the SpTBXLib License. +A copy of the MPL v1.1 may be found in MPL-LICENSE.txt or at: + http://www.mozilla.org/MPL/ + +If you wish to allow use of your version of this file only under the terms of +the MPL v1.1 and not to allow others to use your version of this file under the +SpTBXLib License, indicate your decision by deleting the provisions +above and replace them with the notice and other provisions required by the +MPL v1.1. If you do not delete the provisions above, a recipient may use your +version of this file under either the SpTBXLib License or the MPL v1.1. + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for +the specific language governing rights and limitations under the License. + +The initial developer of this code is Robert Lee. + +Requirements: +For Delphi/C++Builder 2009 or newer: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org +For Delphi/C++Builder 7-2007: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org + - Troy Wolbrink's TNT Unicode Controls + http://www.tntware.com/delphicontrols/unicode/ + +History: +8 May 2009 - version 2.4.2 + - No changes. + +15 March 2009 - version 2.4.1 + - No changes. + +17 January 2009 - version 2.4 + - No changes. + +26 September 2008 - version 2.3 + - No changes. + +29 July 2008 - version 2.2 + - Fixed incorrect TRGBQuadArray declaration, thanks to Arvid + for reporting this. + - Fixed incorrect gradients in Office 2003 skins, thanks to + David for reporting this. + - Fixed Vista painting bug, the menu checkboxes are stretched + by the themes API, this doesn't happen on XP, thanks to + Arvid for reporting this. + +26 June 2008 - version 2.1 + - New skin added: Aluminum, thanks to Pete for his contribution. + +3 May 2008 - version 2.0 + - No changes. + +2 April 2008 - version 1.9.5 + - No changes. + +3 February 2008 - version 1.9.4 + - No changes. + +19 January 2008 - version 1.9.3 + - New skin added: Human. + +26 December 2007 - version 1.9.2 + - No changes. + +1 December 2007 - version 1.9.1 + - No changes. + +20 November 2007 - version 1.9 + - Initial release. + +==============================================================================} + +interface + +{$BOOLEVAL OFF} // Unit depends on short-circuit boolean evaluation + +uses + Windows, Messages, Classes, SysUtils, Graphics, Controls, SpTBXSkins; + +type + { Skins } + + TSpTBXAluminumColors = array[0..3] of TColor; + + TSpTBXAluminumSkin = class(TSpTBXSkinOptions) + private + procedure SetDefaultColorScheme(const Value: TSpTBXLunaScheme); + protected + FColors: TSpTBXAluminumColors; + FDefaultColorScheme: TSpTBXLunaScheme; + FLightMetalColor: TColor; + FDarkMetalColor: TColor; + FRoughness: Integer; + procedure FillColors; virtual; + function GetBrushMetalColor(Component: TSpTBXSkinComponentsType; State: TSpTBXSkinStatesType): TColor; virtual; + public + constructor Create; override; + destructor Destroy; override; + procedure FillOptions; override; + procedure PaintBackground(ACanvas: TCanvas; ARect: TRect; Component: TSpTBXSkinComponentsType; State: TSpTBXSkinStatesType; Background, Borders: Boolean; Vertical: Boolean = False; ForceRectBorders: TAnchors = []); override; + property LightMetalColor: TColor read FLightMetalColor write FLightMetalColor; + property DarkMetalColor: TColor read FDarkMetalColor write FDarkMetalColor; + property DefaultColorScheme: TSpTBXLunaScheme read FDefaultColorScheme write SetDefaultColorScheme default lusUnknown; + end; + + TSpTBXAthenSkin = class(TSpTBXSkinOptions) + public + procedure FillOptions; override; + end; + + TSpTBXDreamSkin = class(TSpTBXSkinOptions) + public + procedure FillOptions; override; + end; + + TSpTBXEosSkin = class(TSpTBXSkinOptions) + public + procedure FillOptions; override; + end; + + TSpTBXHumanSkin = class(TSpTBXSkinOptions) + public + procedure FillOptions; override; + procedure PaintBackground(ACanvas: TCanvas; ARect: TRect; Component: TSpTBXSkinComponentsType; State: TSpTBXSkinStatesType; Background, Borders: Boolean; Vertical: Boolean = False; ForceRectBorders: TAnchors = []); override; + end; + + TSpTBXLeopardSkin = class(TSpTBXSkinOptions) + public + procedure FillOptions; override; + procedure PaintBackground(ACanvas: TCanvas; ARect: TRect; Component: TSpTBXSkinComponentsType; State: TSpTBXSkinStatesType; Background, Borders: Boolean; Vertical: Boolean = False; ForceRectBorders: TAnchors = []); override; + end; + + TSpTBXXitoSkin = class(TSpTBXSkinOptions) + public + procedure FillOptions; override; + end; + + { Office Skins } + + TSpTBXOfficeXPSkin = class(TSpTBXSkinOptions) + public + procedure FillOptions; override; + end; + + TSpTBXOffice2003Colors = array[0..22] of TColor; + + TSpTBXOffice2003Skin = class(TSpTBXSkinOptions) + private + procedure SetDefaultColorScheme(const Value: TSpTBXLunaScheme); + protected + FColors: TSpTBXOffice2003Colors; + FDefaultColorScheme: TSpTBXLunaScheme; + procedure FillColors; virtual; + public + constructor Create; override; + procedure FillOptions; override; + property DefaultColorScheme: TSpTBXLunaScheme read FDefaultColorScheme write SetDefaultColorScheme default lusUnknown; + end; + + TSpTBXOffice2007Colors = array[0..17] of TColor; + + TSpTBXOffice2007Skin = class(TSpTBXSkinOptions) + protected + FColors: TSpTBXOffice2007Colors; + procedure FillColors; virtual; abstract; + public + procedure FillOptions; override; + end; + + TSpTBXOffice2007BlueSkin = class(TSpTBXOffice2007Skin) + protected + procedure FillColors; override; + end; + + TSpTBXOffice2007BlackSkin = class(TSpTBXOffice2007Skin) + protected + procedure FillColors; override; + end; + + TSpTBXOffice2007SilverSkin = class(TSpTBXOffice2007Skin) + protected + procedure FillColors; override; + end; + +implementation + +uses + Math; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Brushed Fill } + +const + THREAD_CACHE_SIZE = 16; + NUM_TEMPLATES = 8; + MIN_TEMPLATE_SIZE = 100; + MAX_TEMPLATE_SIZE = 200; + NUM_RANDTHREADS = 1024; + +type + PRGBQuad = ^TRGBQuad; + TRGBQuad = Integer; + PRGBQuadArray = ^TRGBQuadArray; + TRGBQuadArray = array [Byte] of TRGBQuad; + TThreadCacheItem = record + BaseColor: TColorRef; + Roughness: Integer; + Bitmaps: array [0..NUM_TEMPLATES - 1] of HBITMAP; + end; + +var + ThreadTemplates: array of array of Integer; + RandThreadIndex: array of Integer; + RandThreadPositions: array of Integer; + ThreadCache: array of TThreadCacheItem; + NextCacheEntry: Integer = 0; + +function GetBGR(C: TColorRef): Cardinal; +asm + MOV ECX,EAX // this function swaps R and B bytes in ABGR + SHR EAX,16 + XCHG AL,CL + MOV AH,$FF // and writes $FF into A component } + SHL EAX,16 + MOV AX,CX +end; + +procedure InitializeBrushedFill; +const + Pi = 3.14159265358987; +var + TemplateIndex, Size, I, V, V1, V2: Integer; + T, R12, R13, R14, R21, R22, R23, R24: Single; +begin + + SetLength(ThreadTemplates, NUM_TEMPLATES); + SetLength(RandThreadIndex, NUM_RANDTHREADS); + SetLength(RandThreadPositions, NUM_RANDTHREADS); + + { Make thread templates } + for TemplateIndex := 0 to NUM_TEMPLATES - 1 do begin + Size := (MIN_TEMPLATE_SIZE + Random(MAX_TEMPLATE_SIZE - MIN_TEMPLATE_SIZE + 1)) div 2; + SetLength(ThreadTemplates[TemplateIndex], Size * 2); + R12 := Random * 2 * Pi; + R13 := Random * 2 * Pi; + R14 := Random * 2 * Pi; + R21 := Random * 2 * Pi; + R22 := Random * 2 * Pi; + R23 := Random * 2 * Pi; + R24 := Random * 2 * Pi; + for I := 0 to Size - 1 do begin + T := 2 * Pi * I / Size; + V1 := Round(150 * Sin(T) + 100 * Sin(2 * T + R12) + 50 * Sin(3 * T + R13) + 20 * Sin(4 * T + R14)); + if V1 > 255 then V1 := 255; + if V1 < -255 then V1 := -255; + + V2 := Round(150 * Sin(T + R21) + 100 * Sin(2 * T + R22) + 50 * Sin(3 * T + R23) + 20 * Sin(4 * T + R24)); + if V2 > 255 then V2 := 255; + if V2 < -255 then V2 := -255; + + if Abs(V2 - V1) > 300 then begin + V := (V1 + V2) div 2; + V1 := V - 150; + V2 := V + 150; + end; + + ThreadTemplates[TemplateIndex][I * 2] := Min(V1, V2); + ThreadTemplates[TemplateIndex][I * 2 + 1] := Max(V1, V2); + end; + end; + + { Initialize Rand arrays } + for I := 0 to NUM_RANDTHREADS- 1 do begin + RandThreadIndex[I] := Random(NUM_TEMPLATES); + V1 := Random(Length(ThreadTemplates[RandThreadIndex[I]])) and not $1; + if Odd(I) then Inc(V1); + RandThreadPositions[I] := V1; + end; +end; + +procedure ClearCacheItem(var CacheItem: TThreadCacheItem); +var + I: Integer; +begin + with CacheItem do begin + BaseColor := $FFFFFFFF; + Roughness := -1; + for I := NUM_TEMPLATES- 1 downto 0 do + if Bitmaps[I] <> 0 then begin + DeleteObject(Bitmaps[I]); + Bitmaps[I] := 0; + end; + end; +end; + +procedure ResetBrushedFillCache; +var + I: Integer; +begin + { Should be called each time the screen parameters change } + for I := High(ThreadCache) downto 0 do ClearCacheItem(ThreadCache[I]); +end; + +procedure FinalizeBrushedFill; +begin + ResetBrushedFillCache; + SetLength(ThreadCache, 0); + ThreadCache := nil; + SetLength(RandThreadPositions, 0); + RandThreadPositions := nil; + SetLength(RandThreadIndex, 0); + RandThreadIndex := nil; + SetLength(ThreadTemplates, 0, 0); + ThreadTemplates := nil; +end; + +procedure MakeCacheItem(var CacheItem: TThreadCacheItem; Color: TColorRef; Roughness: Integer); +var + TemplateIndex, Size, I, V: Integer; + CR, CG, CB: Integer; + R, G, B: Integer; + ScreenDC: HDC; + BMI: TBitmapInfo; + Bits: PRGBQuadArray; + DIBSection: HBITMAP; + DIBDC, CacheDC: HDC; +begin + ScreenDC := GetDC(0); + FillChar(BMI, SizeOf(TBitmapInfo), 0); + with BMI.bmiHeader do begin + biSize := SizeOf(TBitmapInfoHeader); + biPlanes := 1; + biCompression := BI_RGB; + biWidth := MAX_TEMPLATE_SIZE; + biHeight := -1; + biBitCount := 32; + end; + DIBSection := CreateDIBSection(0, BMI, DIB_RGB_COLORS, Pointer(Bits), 0, 0); + DIBDC := CreateCompatibleDC(0); + SelectObject(DIBDC, DIBSection); + CacheDC := CreateCompatibleDC(0); + + CR := Color shl 8 and $FF00; + CG := Color and $FF00; + CB := Color shr 8 and $FF00; + try + for TemplateIndex := 0 to NUM_TEMPLATES - 1 do begin + CacheItem.BaseColor := Color; + CacheItem.Roughness := Roughness; + Size := Length(ThreadTemplates[TemplateIndex]); + + if CacheItem.Bitmaps[TemplateIndex] = 0 then + CacheItem.Bitmaps[TemplateIndex] := CreateCompatibleBitmap(ScreenDC, Size, 1); + SelectObject(CacheDC, CacheItem.Bitmaps[TemplateIndex]); + + for I := 0 to Size - 1 do begin + V := ThreadTemplates[TemplateIndex][I]; + R := CR + V * Roughness; + G := CG + V * Roughness; + B := CB + V * Roughness; + if R < 0 then R := 0; + if G < 0 then G := 0; + if B < 0 then B := 0; + if R > $EF00 then R := $EF00; + if G > $EF00 then G := $EF00; + if B > $EF00 then B := $EF00; + Bits^[I] := (R and $FF00 + (G and $FF00) shl 8 + (B and $FF00) shl 16) shr 8; + end; + + BitBlt(CacheDC, 0, 0, Size, 1, DIBDC, 0, 0, SRCCOPY); + end; + finally + DeleteDC(CacheDC); + DeleteDC(DIBDC); + DeleteObject(DIBSection); + ReleaseDC(0, ScreenDC); + end; +end; + +function FindCacheItem(Color: TColorRef; Roughness: Integer): Integer; +begin + Result := High(ThreadCache); + while Result >= 0 do + if (ThreadCache[Result].BaseColor = Color) and (ThreadCache[Result].Roughness = Roughness) then + Exit + else + Dec(Result); +end; + +function GetCacheItem(Color: TColorRef; Roughness: Integer): Integer; +begin + Result := FindCacheItem(Color, Roughness); + if Result >= 0 then + Exit + else begin + Result := NextCacheEntry; + if Result > High(ThreadCache) then begin + SetLength(ThreadCache, Result+ 1); + ClearCacheItem(ThreadCache[Result]); + end; + MakeCacheItem(ThreadCache[Result], Color, Roughness); + NextCacheEntry := (NextCacheEntry + 1) mod THREAD_CACHE_SIZE; + end; +end; + +procedure BrushedFill(DC: HDC; Origin: PPoint; ARect: TRect; Color: TColor; Roughness: Integer); +const + ZeroOrigin: TPoint = (X: 0; Y: 0); +var + CR: TColorRef; + X, Y: Integer; + CacheIndex: Integer; + TemplateIndex: Integer; + CacheDC: HDC; + Size: Integer; + BoxR: TRect; +begin + if (Color = clNone) or not RectVisible(DC, ARect) then Exit; + CR := GetBGR(ColorToRGB(Color)); + if Origin = nil then Origin := @ZeroOrigin; + if ThreadTemplates = nil then InitializeBrushedFill; + CacheIndex := GetCacheItem(CR, Roughness); + GetClipBox(DC, BoxR); + IntersectRect(ARect, ARect, BoxR); + SaveDC(DC); + IntersectClipRect(DC, ARect.Left, ARect.Top, ARect.Right, ARect.Bottom); + + CacheDC := CreateCompatibleDC(0); + for Y := ARect.Top to ARect.Bottom - 1 do begin + TemplateIndex := RandThreadIndex[(65536 + Y - Origin.Y) mod NUM_RANDTHREADS]; + Size := Length(ThreadTemplates[TemplateIndex]); + X := -RandThreadPositions[(65536 + Y - Origin.Y) mod NUM_RANDTHREADS] + Origin.X; + SelectObject(CacheDC, ThreadCache[CacheIndex].Bitmaps[TemplateIndex]); + while X < ARect.Right do begin + if X + Size >= ARect.Left then BitBlt(DC, X, Y, Size, 1, CacheDC, 0, 0, SRCCOPY); + Inc(X, Size); + end; + end; + DeleteDC(CacheDC); + RestoreDC(DC, -1); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXAluminumSkin } + +constructor TSpTBXAluminumSkin.Create; +begin + FRoughness := 12; + FDefaultColorScheme := lusUnknown; + inherited; +end; + +destructor TSpTBXAluminumSkin.Destroy; +begin + FinalizeBrushedFill; + inherited; +end; + +procedure TSpTBXAluminumSkin.FillColors; +const + AluminumColors: array[lusBlue..lusGreen] of TSpTBXAluminumColors = ( + ($C56A31, // 0: Item borders + $E0D7D1, // 1: Item Checked + $E2B598, // 2: Item Pushed + $EED2C1), // 3: Item HotTrack + + ($BFB4B2, // 0: Item borders + $DDDCDC, // 1: Item Checked + $DFDAD9, // 2: Item Pushed + $ECE9E8), // 3: Item HotTrack + + ($70A093, // 0: Item borders + $D8DCDB, // 1: Item Checked + $B8D0C9, // 2: Item Pushed + $D4E3DF) // 3: Item HotTrack + ); +var + Luna: TSpTBXLunaScheme; +begin + if FDefaultColorScheme <> lusUnknown then + Luna := FDefaultColorScheme + else begin + Luna := SpGetLunaScheme; + if Luna = lusUnknown then Luna := lusMetallic; + end; + + FColors := AluminumColors[Luna]; + FRoughness := 12; + FLightMetalColor := $C7C7C7; + FDarkMetalColor := $DFDFDF; +end; + +procedure TSpTBXAluminumSkin.FillOptions; +begin + SkinName := 'Aluminum'; + + //---- Colors ----// + + FillColors; + + //---- Single State ----// + Options(skncDock, sknsNormal).Body.Fill(0, clWhite, clNone, clNone, clNone); // Dummy, uses BrushedFill + + Options(skncDockablePanel, sknsNormal).Body.Fill(0, $F9F9F9, clNone, clNone, clNone); + Options(skncDockablePanel, sknsNormal).Borders.Fill(0, $C7C7C7, $C7C7C7, clWhite, clWhite); + + Options(skncDockablePanelTitleBar, sknsNormal).Body.Fill(1, clWhite, $D8D8D8, clNone, clNone); + Options(skncDockablePanelTitleBar, sknsNormal).Borders.Fill(0, clWhite, $9F9F9F, clNone, clNone); + + Options(skncPanel, sknsNormal).Body.Fill(0, clWhite, clNone, clNone, clNone); // Dummy, uses BrushedFill + Options(skncPanel, sknsNormal).Borders.Fill(2, FColors[0], FColors[0], clWhite, clWhite); + + Options(skncPopup, sknsNormal).Body.Fill(0, $F9F9F9, clNone, clNone, clNone); + Options(skncPopup, sknsNormal).Borders.Fill(0, $7F7F7F, $7F7F7F, clNone, clNone); + + Options(skncStatusBar, sknsNormal).Body.Fill(0, clWhite, clNone, clNone, clNone); // Dummy, uses BrushedFill + + Options(skncSplitter, sknsNormal).Body.Fill(0, clWhite, clNone, clNone, clNone); // Dummy, uses BrushedFill + + Options(skncToolbar, sknsNormal).Body.Fill(0, clWhite, clNone, clNone, clNone); // Dummy, uses BrushedFill + Options(skncToolbar, sknsNormal).Borders.Fill(2, clWhite, $7F7F7F, clNone, clNone); + + CopyOptions(skncToolbar, skncMenuBar); // Dummy, uses BrushedFill + + Options(skncWindow, sknsNormal).Borders.Fill(0, $808080, $808080, $C0C0C0, $DDD9D2); + + Options(skncWindowTitleBar, sknsNormal).Body.Fill(1, clWhite, $D8D8D8, clNone, clNone); + + //---- Elements ----// + Options(skncToolbarGrip, sknsNormal).Body.Fill(0, $B0B0B0, clWhite, clNone, clNone); + + Options(skncStatusBarGrip, sknsNormal).Body.Fill(0, $B0B0B0, clWhite, clNone, clNone); + + Options(skncSeparator, sknsNormal).Body.Fill(0, $9F9F9F, clWhite, clNone, clNone); + + //---- Buttons ----// + Options(skncToolbarItem, sknsHotTrack).Body.Fill(0, FColors[3], clNone, clNone, clNone); + Options(skncToolbarItem, sknsHotTrack).Borders.Fill(1, FColors[0], FColors[0], clNone, clNone); + Options(skncToolbarItem, sknsPushed).Body.Fill(0, FColors[2], clNone, clNone, clNone); + Options(skncToolbarItem, sknsPushed).Borders.Fill(1, FColors[0], FColors[0], clNone, clNone); + Options(skncToolbarItem, sknsChecked).Body.Fill(0, FColors[1], clNone, clNone, clNone); + Options(skncToolbarItem, sknsChecked).Borders.Fill(1, FColors[0], FColors[0], clNone, clNone); + Options(skncToolbarItem, sknsCheckedAndHotTrack).Body.Fill(0, FColors[2], clNone, clNone, clNone); + Options(skncToolbarItem, sknsCheckedAndHotTrack).Borders.Fill(1, FColors[0], FColors[0], clNone, clNone); + + Options(skncOpenToolbarItem, sknsNormal).Body.Fill(0, $ECECEC, clNone, clNone, clNone); + Options(skncOpenToolbarItem, sknsNormal).Borders.Fill(0, $7F7F7F, $7F7F7F, clNone, clNone); + + CopyOptions(skncToolbarItem, skncMenuBarItem); + + CopyOptions(skncToolbarItem, skncMenuItem); + + Options(skncButton, sknsNormal).Body.Fill(1, $EFEFEF, $D1D1D1, clNone, clNone); + Options(skncButton, sknsNormal).Borders.Fill(1, $9F9F9F, $9F9F9F, $F7F7F7, $C7C7C7); + Options(skncButton, sknsDisabled).Body.Fill(1, $EFEFEF, $D1D1D1, clNone, clNone); + Options(skncButton, sknsDisabled).Borders.Fill(1, $9F9F9F, $9F9F9F, $F7F7F7, $C7C7C7); + Options(skncButton, sknsHotTrack).Body.Fill(1, $F2F2F2, $DDDDDD, clNone, clNone); + Options(skncButton, sknsHotTrack).Borders.Fill(1, $BABABA, $BABABA, $F8F8F8, $D6D6D6); + Options(skncButton, sknsPushed).Body.Fill(1, $D1D1D1, $EFEFEF, clNone, clNone); + Options(skncButton, sknsPushed).Borders.Fill(1, $9F9F9F, $9F9F9F, $C7C7C7, $F7F7F7); + Options(skncButton, sknsChecked).Body.Fill(1, $D1D1D1, $EFEFEF, clNone, clNone); + Options(skncButton, sknsChecked).Borders.Fill(1, $9F9F9F, $9F9F9F, $C7C7C7, $F7F7F7); + Options(skncButton, sknsCheckedAndHotTrack).Body.Fill(1, $D1D1D1, $EFEFEF, clNone, clNone); + Options(skncButton, sknsCheckedAndHotTrack).Borders.Fill(1, $9F9F9F, $9F9F9F, $C7C7C7, $F7F7F7); + + CopyOptions(skncToolbarItem, skncListItem); + + CopyOptions(skncToolbarItem, skncCheckBox); + Options(skncCheckBox, sknsNormal).Borders.Fill(1, $9F9F9F, $9F9F9F, clNone, clNone); + Options(skncCheckBox, sknsDisabled).Borders.Fill(1, $99A8AC, $99A8AC, clNone, clNone); + + CopyOptions(skncCheckBox, skncRadioButton); + + //---- Editors ----// + Options(skncEditFrame, sknsNormal).Borders.Fill(1, clNone, clNone, $9F9F9F, $9F9F9F); + Options(skncEditFrame, sknsDisabled).Borders.Fill(1, clNone, clNone, $99A8AC, $99A8AC); + Options(skncEditFrame, sknsHotTrack).Borders.Fill(1, clNone, clNone, $9F9F9F, $9F9F9F); + + CopyOptions(skncButton, skncEditButton); + Options(skncEditButton, sknsNormal).Reset; + + //---- Tabs ----// + CopyOptions(skncToolbarItem, skncTab); + + // TabBackground: Only Normal state is used + Options(skncTabBackground, sknsNormal).Body.Fill(0, FColors[1], clNone, clNone, clNone); + Options(skncTabBackground, sknsNormal).Borders.Fill(0, FColors[0], FColors[0], clNone, clNone); + + //---- ProgressBar ----// + // ProgressBar: Only Normal and HotTrack states are used + // HotTrack represents the selection + Options(skncProgressBar, sknsNormal).Body.Fill(0, FColors[2], clNone, clNone, clNone); + Options(skncProgressBar, sknsNormal).Borders.Fill(1, FColors[0], FColors[0], clNone, clNone); + Options(skncProgressBar, sknsHotTrack).Body.Fill(0, FColors[3], clNone, clNone, clNone); + Options(skncProgressBar, sknsHotTrack).Borders.Fill(1, FColors[0], FColors[0], clNone, clNone); + + //---- TrackBar ----// + // TrackBar: Only Normal and HotTrack states are used + // HotTrack represents the selection + CopyOptions(skncProgressBar, skncTrackBar); + + // TrackBarButton: Only Normal and Pushed states are used + Options(skncTrackBarButton, sknsNormal).Body.Fill(0, FColors[3], clNone, clNone, clNone); + Options(skncTrackBarButton, sknsNormal).Borders.Fill(1, FColors[0], FColors[0], clNone, clNone); + Options(skncTrackBarButton, sknsPushed).Body.Fill(0, FColors[1], clNone, clNone, clNone); + Options(skncTrackBarButton, sknsPushed).Borders.Fill(1, FColors[0], FColors[0], clNone, clNone); + + //---- Header ----// + Options(skncHeader, sknsNormal).Body.Fill(1, $EFEFEF, $D1D1D1, clNone, clNone); + Options(skncHeader, sknsNormal).Borders.Fill(0, $F7F7F7, $C7C7C7, clNone, clNone); + Options(skncHeader, sknsHotTrack).Body.Fill(1, $F2F2F2, $DDDDDD, clNone, clNone); + Options(skncHeader, sknsHotTrack).Borders.Fill(0, $F8F8F8, $D6D6D6, clNone, clNone); + Options(skncHeader, sknsPushed).Body.Fill(1, $D1D1D1, $EFEFEF, clNone, clNone); + Options(skncHeader, sknsPushed).Borders.Fill(0, $C7C7C7, $F7F7F7, clNone, clNone); +end; + +function TSpTBXAluminumSkin.GetBrushMetalColor(Component: TSpTBXSkinComponentsType; + State: TSpTBXSkinStatesType): TColor; +begin + Result := clNone; + if Component in [skncDock, skncPanel, skncTabToolbar, skncStatusBar, skncSplitter] then + Result := FLightMetalColor + else + if Component in [skncToolbar, skncMenuBar] then + Result := FDarkMetalColor; +end; + +procedure TSpTBXAluminumSkin.PaintBackground(ACanvas: TCanvas; ARect: TRect; + Component: TSpTBXSkinComponentsType; State: TSpTBXSkinStatesType; + Background, Borders, Vertical: Boolean; ForceRectBorders: TAnchors); +var + BackgroundRect: TRect; + Op: TSpTBXSkinOptionCategory; + BrushColor: TColor; +begin + BrushColor := GetBrushMetalColor(Component, State); + + if BrushColor = clNone then + inherited + else begin + Op := Options(Component, State); + + if Op.Borders.IsEmpty then + Borders := False; + if Op.Body.IsEmpty then + Background := False; + + if Background then begin + BackgroundRect := ARect; + if Borders then + InflateRect(BackgroundRect, -1, -1); + BrushedFill(ACanvas.Handle, nil, BackgroundRect, BrushColor, FRoughness); + end; + + if Borders then + SpPaintSkinBorders(ACanvas, ARect, Op, ForceRectBorders); + end; +end; + +procedure TSpTBXAluminumSkin.SetDefaultColorScheme(const Value: TSpTBXLunaScheme); +begin + if FDefaultColorScheme <> Value then begin + FDefaultColorScheme := Value; + Reset; + FillOptions; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXAthenSkin } + +procedure TSpTBXAthenSkin.FillOptions; +begin + SkinName := 'Athen'; + + //---- Single State ----// + Options(skncDock, sknsNormal).Body.Fill(0, $E0E0E0, clNone, clNone, clNone); + + Options(skncDockablePanel, sknsNormal).Body.Fill(0, clWhite, clNone, clNone, clNone); + Options(skncDockablePanel, sknsNormal).Borders.Fill(0, $E0E0E0, $E0E0E0, clWhite, clWhite); + + Options(skncDockablePanelTitleBar, sknsNormal).Body.Fill(3, $F8F8F8, $D8D8D8, $F0F0F0, $F8F8F8); + + Options(skncPanel, sknsNormal).Body.Fill(1, $FBF9A0, clWhite, clNone, clNone); + Options(skncPanel, sknsNormal).Borders.Fill(2, $D0D0D0, $D0D0D0, $F8F8F8, $F8F8F8); + + Options(skncPopup, sknsNormal).Body.Fill(0, clWhite, clNone, clNone, clNone); + Options(skncPopup, sknsNormal).Borders.Fill(0, $C0C0C0, $C0C0C0, clNone, clNone); + + Options(skncStatusBar, sknsNormal).Body.Fill(3, $F8F8F8, $D8D8D8, $F0F0F0, $F8F8F8); + + Options(skncSplitter, sknsNormal).Body.Fill(1, $D8D8D8, $F0F0F0, clNone, clNone); + + Options(skncToolbar, sknsNormal).Body.Fill(3, $F8F8F8, $D8D8D8, $F0F0F0, $F8F8F8); + Options(skncToolbar, sknsNormal).Borders.Fill(1, clWhite, $B0B0B0, clNone, clNone); + + CopyOptions(skncToolbar, skncMenuBar); + + Options(skncWindow, sknsNormal).Borders.Fill(0, $808080, $808080, $C0C0C0, $DDD9D2); + + Options(skncWindowTitleBar, sknsNormal).Body.Fill(3, $F8F8F8, $D8D8D8, $F0F0F0, $F8F8F8); + + //---- Elements ----// + Options(skncToolbarGrip, sknsNormal).Body.Fill(0, $B0B0B0, clWhite, clNone, clNone); + + Options(skncStatusBarGrip, sknsNormal).Body.Fill(0, $B0B0B0, clWhite, clNone, clNone); + + Options(skncSeparator, sknsNormal).Body.Fill(0, $B0B0B0, clWhite, clNone, clNone); + + //---- Buttons ----// + Options(skncToolbarItem, sknsHotTrack).Body.Fill(3, $FFF8F0, $E0B080, $F0E870, $FFFFB0); + Options(skncToolbarItem, sknsHotTrack).Borders.Fill(1, $DAB370, $DAB370, clNone, clNone); + Options(skncToolbarItem, sknsPushed).Body.Fill(1, $C0C0C0, clWhite, clNone, clNone); + Options(skncToolbarItem, sknsPushed).Borders.Fill(1, $D0D0D0, $B0B0B0, clNone, clNone); + Options(skncToolbarItem, sknsChecked).Body.Fill(3, $FFF8F0, $E0B080, $F0E870, $FFFFB0); + Options(skncToolbarItem, sknsChecked).Borders.Fill(1, $DAB370, $DAB370, clNone, clNone); + Options(skncToolbarItem, sknsCheckedAndHotTrack).Body.Fill(3, $FAECDE, $E0B080, $EDDE73, $FFFFBA); + Options(skncToolbarItem, sknsCheckedAndHotTrack).Borders.Fill(1, $DAB370, $DAB370, clNone, clNone); + + Options(skncOpenToolbarItem, sknsNormal).Body.Fill(1, $C0C0C0, clWhite, clNone, clNone); + Options(skncOpenToolbarItem, sknsNormal).Borders.Fill(1, $D0D0D0, $B0B0B0, clNone, clNone); + + Options(skncMenuBarItem, sknsHotTrack).Body.Fill(3, $FFF8F0, $E0B080, $F0E870, $FFFFB0); + Options(skncMenuBarItem, sknsPushed).Body.Fill(3, $FFF8F0, $E0B080, $F0E870, $FFFFB0); + Options(skncMenuBarItem, sknsChecked).Body.Fill(3, $FFF8F0, $E0B080, $F0E870, $FFFFB0); + Options(skncMenuBarItem, sknsCheckedAndHotTrack).Body.Fill(3, $FAECDE, $E0B080, $EDDE73, $FFFFBA); + + CopyOptions(skncToolbarItem, skncMenuItem); + Options(skncMenuItem, sknsHotTrack).Body.Fill(3, $F8F8F8, $D8D8D8, $F0F0F0, $F8F8F8); + Options(skncMenuItem, sknsHotTrack).Borders.Fill(1, $C0C0C0, $C0C0C0, clNone, clNone); + + CopyOptions(skncToolbarItem, skncButton); + Options(skncButton, sknsNormal).Body.Fill(3, $F8F8F8, $D8D8D8, $F0F0F0, $F8F8F8); + Options(skncButton, sknsNormal).Borders.Fill(1, $C0C0C0, $C0C0C0, clNone, clNone); + Options(skncButton, sknsDisabled).Body.Fill(3, $F8F8F8, $D8D8D8, $F0F0F0, $F8F8F8); + Options(skncButton, sknsDisabled).Borders.Fill(1, $C0C0C0, $C0C0C0, clNone, clNone); + + CopyOptions(skncToolbarItem, skncListItem); + + CopyOptions(skncToolbarItem, skncCheckBox); + Options(skncCheckBox, sknsNormal).Body.Fill(3, $F8F8F8, $D8D8D8, $F0F0F0, $F8F8F8); + Options(skncCheckBox, sknsNormal).Borders.Fill(0, $C0C0C0, $C0C0C0, clNone, clNone); + Options(skncCheckBox, sknsDisabled).Borders.Fill(0, $99A8AC, $99A8AC, clNone, clNone); + + CopyOptions(skncCheckBox, skncRadioButton); + + //---- Editors ----// + Options(skncEditFrame, sknsNormal).Borders.Fill(1, clNone, clNone, $D0D0D0, $D0D0D0); + Options(skncEditFrame, sknsDisabled).Borders.Fill(1, clNone, clNone, $99A8AC, $99A8AC); + Options(skncEditFrame, sknsHotTrack).Borders.Fill(1, clNone, clNone, $DAB370, $DAB370); + + CopyOptions(skncToolbarItem, skncEditButton); + + //---- Tabs ----// + Options(skncTab, sknsHotTrack).Body.Fill(3, $FFF8F0, $E0B080, $F0E870, $FFFFB0); + Options(skncTab, sknsHotTrack).Borders.Fill(2, $DAB370, $DAB370, clNone, clNone); + Options(skncTab, sknsChecked).Body.Fill(3, $FFF8F0, $E0B080, $F0E870, $FFFFB0); + Options(skncTab, sknsChecked).Borders.Fill(2, $DAB370, $DAB370, clNone, clNone); + Options(skncTab, sknsCheckedAndHotTrack).Body.Fill(3, $FAECDE, $E0B080, $EDDE73, $FFFFBA); + Options(skncTab, sknsCheckedAndHotTrack).Borders.Fill(2, $DAB370, $DAB370, clNone, clNone); + + // TabBackground: Only Normal state is used + Options(skncTabBackground, sknsNormal).Body.Fill(1, $FBF9A0, clWhite, clNone, clNone); + Options(skncTabBackground, sknsNormal).Borders.Fill(0, $DAB370, $DAB370, clNone, clNone); + + //---- ProgressBar ----// + // ProgressBar: Only Normal and HotTrack states are used + // HotTrack represents the selection + Options(skncProgressBar, sknsNormal).Body.Fill(1, $C0C0C0, clWhite, clNone, clNone); + Options(skncProgressBar, sknsNormal).Borders.Fill(1, $D0D0D0, $B0B0B0, clNone, clNone); + Options(skncProgressBar, sknsHotTrack).Body.Fill(3, $FFF8F0, $E0B080, $F0E870, $FFFFB0); + Options(skncProgressBar, sknsHotTrack).Borders.Fill(2, $DAB370, $DAB370, clNone, clNone); + + //---- TrackBar ----// + // TrackBar: Only Normal and HotTrack states are used + // HotTrack represents the selection + CopyOptions(skncProgressBar, skncTrackBar); + + // TrackBarButton: Only Normal and Pushed states are used + Options(skncTrackBarButton, sknsNormal).Body.Fill(3, $F8F8F8, $D8D8D8, $F0F0F0, $F8F8F8); + Options(skncTrackBarButton, sknsNormal).Borders.Fill(1, $C0C0C0, $C0C0C0, clNone, clNone); + Options(skncTrackBarButton, sknsPushed).Body.Fill(3, $FFF8F0, $E0B080, $F0E870, $FFFFB0); + Options(skncTrackBarButton, sknsPushed).Borders.Fill(1, $DAB370, $DAB370, clNone, clNone); + + //---- Header ----// + Options(skncHeader, sknsNormal).Body.Fill(3, $F8F8F8, $D8D8D8, $F0F0F0, $F8F8F8); + Options(skncHeader, sknsNormal).Borders.Fill(0, $E7E7E7, $C0C0C0, clNone, clNone); + Options(skncHeader, sknsHotTrack).Body.Fill(3, $FFF8F0, $E0B080, $F0E870, $FFFFB0); + Options(skncHeader, sknsHotTrack).Borders.Fill(0, $F7E4D0, $DAB370, clNone, clNone); + Options(skncHeader, sknsPushed).Body.Fill(1, $C0C0C0, clWhite, clNone, clNone); + Options(skncHeader, sknsPushed).Borders.Fill(0, $D0D0D0, $B0B0B0, clNone, clNone); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXDreamSkin } + +procedure TSpTBXDreamSkin.FillOptions; +begin + SkinName := 'Dream'; + + //---- Single State ----// + Options(skncDock, sknsNormal).Body.Fill(0, $E0E0E0, clNone, clNone, clNone); + + Options(skncDockablePanel, sknsNormal).Body.Fill(1, clWhite, $DDD9D2, clNone, clNone); + Options(skncDockablePanel, sknsNormal).Borders.Fill(0, $E0E0E0, $E0E0E0, clWhite, clWhite); + + Options(skncDockablePanelTitleBar, sknsNormal).Body.Fill(1, clWhite, $DDD9D2, clNone, clNone); + + Options(skncPanel, sknsNormal).Body.Fill(1, $D1F9FF, clWhite, clNone, clNone); + Options(skncPanel, sknsNormal).Borders.Fill(2, $808080, $808080, $B0D4DF, clWhite); + + Options(skncPopup, sknsNormal).Body.Fill(0, $F9F9F9, clNone, clNone, clNone); + Options(skncPopup, sknsNormal).Borders.Fill(0, $C0C0C0, $C0C0C0, clNone, clNone); + + Options(skncStatusBar, sknsNormal).Body.Fill(1, $DDD9D2, clWhite, clNone, clNone); + + Options(skncSplitter, sknsNormal).Body.Fill(1, clWhite, $DDD9D2, clNone, clNone); + + Options(skncToolbar, sknsNormal).Body.Fill(1, clWhite, $DDD9D2, clNone, clNone); + Options(skncToolbar, sknsNormal).Borders.Fill(2, clWhite, $B0B0B0, clNone, clNone); + + CopyOptions(skncToolbar, skncMenuBar); + + Options(skncWindow, sknsNormal).Borders.Fill(0, $808080, $808080, $C0C0C0, $DDD9D2); + + Options(skncWindowTitleBar, sknsNormal).Body.Fill(1, clWhite, $DDD9D2, clNone, clNone); + + //---- Elements ----// + Options(skncToolbarGrip, sknsNormal).Body.Fill(0, $B0B0B0, clWhite, clNone, clNone); + + Options(skncStatusBarGrip, sknsNormal).Body.Fill(0, $B0B0B0, clWhite, clNone, clNone); + + Options(skncSeparator, sknsNormal).Body.Fill(0, $B0B0B0, clWhite, clNone, clNone); + + //---- Buttons ----// + Options(skncToolbarItem, sknsHotTrack).Body.Fill(1, clWhite, $E5E2DB, clNone, clNone); + Options(skncToolbarItem, sknsHotTrack).Borders.Fill(1, $909090, $909090, clNone, clNone); + Options(skncToolbarItem, sknsPushed).Body.Fill(1, $C0C0C0, clWhite, clNone, clNone); + Options(skncToolbarItem, sknsPushed).Borders.Fill(1, $909090, $909090, clNone, clNone); + Options(skncToolbarItem, sknsChecked).Body.Fill(1, $D2F9FF, $F0FDFF, clNone, clNone); + Options(skncToolbarItem, sknsChecked).Borders.Fill(1, $808080, $808080, $B0D4DF, $F0FDFF); + Options(skncToolbarItem, sknsCheckedAndHotTrack).Body.Fill(1, $2695EA, $80E0FF, clNone, clNone); + Options(skncToolbarItem, sknsCheckedAndHotTrack).Borders.Fill(1, $808080, $808080, $60B0E8, $80E0FF); + + Options(skncOpenToolbarItem, sknsNormal).Body.Fill(1, $C0C0C0, clWhite, clNone, clNone); + Options(skncOpenToolbarItem, sknsNormal).Borders.Fill(1, $909090, $909090, clNone, clNone); + + CopyOptions(skncToolbarItem, skncMenuBarItem); + + CopyOptions(skncToolbarItem, skncMenuItem); + + CopyOptions(skncToolbarItem, skncButton); + Options(skncButton, sknsNormal).Body.Fill(1, clWhite, $DCD8D0, clNone, clNone); + Options(skncButton, sknsNormal).Borders.Fill(1, $909090, $909090, clNone, clNone); + Options(skncButton, sknsDisabled).Body.Fill(1, clWhite, $DCD8D0, clNone, clNone); + Options(skncButton, sknsDisabled).Borders.Fill(1, $909090, $909090, clNone, clNone); + + CopyOptions(skncToolbarItem, skncListItem); + + CopyOptions(skncToolbarItem, skncCheckBox); + Options(skncCheckBox, sknsNormal).Borders.Fill(0, $808080, $808080, clNone, clNone); + Options(skncCheckBox, sknsDisabled).Borders.Fill(0, $99A8AC, $99A8AC, clNone, clNone); + + CopyOptions(skncCheckBox, skncRadioButton); + + //---- Editors ----// + Options(skncEditFrame, sknsNormal).Borders.Fill(1, clNone, clNone, $D0D0D0, $D0D0D0); + Options(skncEditFrame, sknsDisabled).Borders.Fill(1, clNone, clNone, $99A8AC, $99A8AC); + Options(skncEditFrame, sknsHotTrack).Borders.Fill(1, clNone, clNone, $909090, $909090); + + CopyOptions(skncToolbarItem, skncEditButton); + + //---- Tabs ----// + Options(skncTab, sknsHotTrack).Body.Fill(0, $F4F0F0, clNone, clNone, clNone); + Options(skncTab, sknsHotTrack).Borders.Fill(1, $A0A0A0, $A0A0A0, clNone, clNone); + Options(skncTab, sknsChecked).Body.Fill(1, $F0FDFF, $D2F9FF, clNone, clNone); + Options(skncTab, sknsChecked).Borders.Fill(1, $808080, $808080, $B0D4DF, $F0FDFF); + Options(skncTab, sknsCheckedAndHotTrack).Body.Fill(1, $2695EA, $80E0FF, clNone, clNone); + Options(skncTab, sknsCheckedAndHotTrack).Borders.Fill(1, $808080, $808080, $60B0E8, $80E0FF); + + // TabBackground: Only Normal state is used + Options(skncTabBackground, sknsNormal).Body.Fill(1, $D2F9FF, $F0FDFF, clNone, clNone); + Options(skncTabBackground, sknsNormal).Borders.Fill(0, $808080, $808080, $B0D4DF, $F0FDFF); + + //---- ProgressBar ----// + // ProgressBar: Only Normal and HotTrack states are used + // HotTrack represents the selection + Options(skncProgressBar, sknsNormal).Body.Fill(1, $C0C0C0, clWhite, clNone, clNone); + Options(skncProgressBar, sknsNormal).Borders.Fill(2, $909090, $909090, clNone, clNone); + Options(skncProgressBar, sknsHotTrack).Body.Fill(1, clWhite, $DDD9D2, clNone, clNone); + Options(skncProgressBar, sknsHotTrack).Borders.Fill(2, $909090, $909090, clNone, clNone); + + //---- TrackBar ----// + // TrackBar: Only Normal and HotTrack states are used + // HotTrack represents the selection + CopyOptions(skncProgressBar, skncTrackBar); + + // TrackBarButton: Only Normal and Pushed states are used + Options(skncTrackBarButton, sknsNormal).Body.Fill(0, $F4F0F0, clNone, clNone, clNone); + Options(skncTrackBarButton, sknsNormal).Borders.Fill(1, $909090, $909090, clNone, clNone); + Options(skncTrackBarButton, sknsPushed).Body.Fill(1, $D1F9FF, clWhite, clNone, clNone); + Options(skncTrackBarButton, sknsPushed).Borders.Fill(1, $808080, $808080, $B0D4DF, clWhite); + + //---- Header ----// + Options(skncHeader, sknsNormal).Body.Fill(1, clWhite, $DCD8D0, clNone, clNone); + Options(skncHeader, sknsNormal).Borders.Fill(0, $E7E7E7, $C0C0C0, clNone, clNone); + Options(skncHeader, sknsHotTrack).Body.Fill(1, clWhite, $E5E2DB, clNone, clNone); + Options(skncHeader, sknsHotTrack).Borders.Fill(0, $E7E7E7, $C0C0C0, clNone, clNone); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXEosSkin } + +procedure TSpTBXEosSkin.FillOptions; +begin + SkinName := 'Eos'; + + //---- Single State ----// + Options(skncDock, sknsNormal).Body.Fill(0, $809090, clNone, clNone, clNone); + + Options(skncDockablePanel, sknsNormal).Body.Fill(0, $809090, clNone, clNone, clNone); + Options(skncDockablePanel, sknsNormal).Borders.Fill(0, $838C8C, $838C8C, clNone, clNone); + + Options(skncDockablePanelTitleBar, sknsNormal).Body.Fill(0, $5A6666, clNone, clNone, clNone); + + Options(skncPanel, sknsNormal).Body.Fill(0, $809090, clNone, clNone, clNone); + Options(skncPanel, sknsNormal).Borders.Fill(0, $5A6666, $5A6666, clNone, clNone); + + Options(skncPopup, sknsNormal).Body.Fill(0, $708080, clNone, clNone, clNone); + Options(skncPopup, sknsNormal).Borders.Fill(0, $5A6666, $5A6666, clNone, clNone); + + Options(skncStatusBar, sknsNormal).Body.Fill(0, $708080, clNone, clNone, clNone); + + Options(skncSplitter, sknsNormal).Body.Fill(0, $708080, clNone, clNone, clNone); + + Options(skncToolbar, sknsNormal).Body.Fill(0, $708080, clNone, clNone, clNone); + Options(skncToolbar, sknsNormal).Borders.Fill(0, $838C8C, $5A6666, clNone, clNone); + + CopyOptions(skncToolbar, skncMenuBar); + + Options(skncWindow, sknsNormal).Borders.Fill(0, $808080, $808080, $C0C0C0, $DDD9D2); + + Options(skncWindowTitleBar, sknsNormal).Body.Fill(0, $5A6666, clNone, clNone, clNone); + Options(skncWindowTitleBar, sknsNormal).TextColor := $EEEEEE; // This overrides the Items text color + + //---- Elements ----// + Options(skncToolbarGrip, sknsNormal).Body.Fill(0, $576363, clWhite, clNone, clNone); + + Options(skncStatusBarGrip, sknsNormal).Body.Fill(0, $576363, clWhite, clNone, clNone); + + Options(skncSeparator, sknsNormal).Body.Fill(0, $869999, clNone, clNone, clNone); + + //---- Buttons ----// + Options(skncToolbarItem, sknsNormal).TextColor := $EEEEEE; + Options(skncToolbarItem, sknsHotTrack).TextColor := $68CAE6; + Options(skncToolbarItem, sknsHotTrack).Body.Fill(0, $5F6D6D, clNone, clNone, clNone); + Options(skncToolbarItem, sknsHotTrack).Borders.Fill(0, $94A0A0, $94A0A0, clNone, clNone); + Options(skncToolbarItem, sknsPushed).TextColor := clBlack; + Options(skncToolbarItem, sknsPushed).Body.Fill(0, $7AD2EA, clNone, clNone, clNone); + Options(skncToolbarItem, sknsPushed).Borders.Fill(0, $94A0A0, $94A0A0, clNone, clNone); + Options(skncToolbarItem, sknsChecked).TextColor := $EEEEEE; + Options(skncToolbarItem, sknsChecked).Body.Fill(0, $94A0A0, clNone, clNone, clNone); + Options(skncToolbarItem, sknsChecked).Borders.Fill(0, $94A0A0, $94A0A0, clNone, clNone); + Options(skncToolbarItem, sknsCheckedAndHotTrack).TextColor := clBlack; + Options(skncToolbarItem, sknsCheckedAndHotTrack).Body.Fill(0, $8ED7EC, clNone, clNone, clNone); + Options(skncToolbarItem, sknsCheckedAndHotTrack).Borders.Fill(0, $94A0A0, $94A0A0, clNone, clNone); + Options(skncToolbarItem, sknsDisabled).TextColor := $99A8AC; + + CopyOptions(skncToolbarItem, skncMenuBarItem); + + CopyOptions(skncToolbarItem, skncMenuItem); + Options(skncMenuItem, sknsPushed).TextColor := $68CAE6; + Options(skncMenuItem, sknsCheckedAndHotTrack).Body.Fill(0, $94A0A0, clNone, clNone, clNone); + Options(skncMenuItem, sknsCheckedAndHotTrack).TextColor := $68CAE6; + + Options(skncButton, sknsNormal).TextColor := $EEEEEE; + Options(skncButton, sknsNormal).Body.Fill(0, $708080, clNone, clNone, clNone); + Options(skncButton, sknsNormal).Borders.Fill(0, clWhite, $3C4444, $838C8C, $5A6666); + Options(skncButton, sknsHotTrack).TextColor := $68CAE6; + Options(skncButton, sknsHotTrack).Body.Fill(0, $708080, clNone, clNone, clNone); + Options(skncButton, sknsHotTrack).Borders.Fill(0, clWhite, $3C4444, $838C8C, $5A6666); + Options(skncButton, sknsPushed).TextColor := $EEEEEE; + Options(skncButton, sknsPushed).Body.Fill(0, $708080, clNone, clNone, clNone); + Options(skncButton, sknsPushed).Borders.Fill(0, $3C4444, clWhite, $5A6666, $838C8C); + Options(skncButton, sknsChecked).TextColor := $EEEEEE; + Options(skncButton, sknsChecked).Body.Fill(0, $708080, clNone, clNone, clNone); + Options(skncButton, sknsChecked).Borders.Fill(0, $3C4444, clWhite, $5A6666, $838C8C); + Options(skncButton, sknsCheckedAndHotTrack).TextColor := $68CAE6; + Options(skncButton, sknsCheckedAndHotTrack).Body.Fill(0, $708080, clNone, clNone, clNone); + Options(skncButton, sknsCheckedAndHotTrack).Borders.Fill(0, $3C4444, clWhite, $5A6666, $838C8C); + Options(skncButton, sknsDisabled).Body.Fill(0, $708080, clNone, clNone, clNone); + Options(skncButton, sknsDisabled).Borders.Fill(0, clWhite, $3C4444, $838C8C, $5A6666); + Options(skncButton, sknsDisabled).TextColor := $99A8AC; + + CopyOptions(skncToolbarItem, skncListItem); + + Options(skncCheckBox, sknsNormal).Borders.Fill(0, $5A6666, $5A6666, clNone, clNone); + Options(skncCheckBox, sknsHotTrack).Body.Fill(0, $5F6D6D, clNone, clNone, clNone); + Options(skncCheckBox, sknsHotTrack).Borders.Fill(0, $94A0A0, $94A0A0, clNone, clNone); + Options(skncCheckBox, sknsPushed).Body.Fill(0, $7AD2EA, clNone, clNone, clNone); + Options(skncCheckBox, sknsPushed).Borders.Fill(0, $94A0A0, $94A0A0, clNone, clNone); + Options(skncCheckBox, sknsChecked).Body.Fill(0, $94A0A0, clNone, clNone, clNone); + Options(skncCheckBox, sknsChecked).Borders.Fill(0, $94A0A0, $94A0A0, clNone, clNone); + Options(skncCheckBox, sknsCheckedAndHotTrack).Body.Fill(0, $8ED7EC, clNone, clNone, clNone); + Options(skncCheckBox, sknsCheckedAndHotTrack).Borders.Fill(0, $94A0A0, $94A0A0, clNone, clNone); + Options(skncCheckBox, sknsDisabled).Borders.Fill(0, $99A8AC, $99A8AC, clNone, clNone); + + CopyOptions(skncCheckBox, skncRadioButton); + + //---- Editors ----// + Options(skncEditFrame, sknsNormal).Borders.Fill(1, clNone, clNone, $D0D0D0, $D0D0D0); + Options(skncEditFrame, sknsDisabled).Borders.Fill(1, clNone, clNone, $99A8AC, $99A8AC); + Options(skncEditFrame, sknsHotTrack).Borders.Fill(1, clNone, clNone, $94A0A0, $94A0A0); + + CopyOptions(skncToolbarItem, skncEditButton); + Options(skncEditButton, sknsNormal).TextColor := clBlack; + + //---- Tabs ----// + Options(skncTab, sknsNormal).TextColor := $EEEEEE; + Options(skncTab, sknsHotTrack).TextColor := $68CAE6; + Options(skncTab, sknsHotTrack).Body.Fill(0, $708080, clNone, clNone, clNone); + Options(skncTab, sknsHotTrack).Borders.Fill(0, $5A6666, $5A6666, clNone, clNone); + Options(skncTab, sknsChecked).TextColor := $EEEEEE; + Options(skncTab, sknsChecked).Body.Fill(0, $809090, clNone, clNone, clNone); + Options(skncTab, sknsChecked).Borders.Fill(0, $5A6666, $5A6666, clNone, clNone); + Options(skncTab, sknsCheckedAndHotTrack).TextColor := $68CAE6; + Options(skncTab, sknsCheckedAndHotTrack).Body.Fill(0, $809090, clNone, clNone, clNone); + Options(skncTab, sknsCheckedAndHotTrack).Borders.Fill(0, $5A6666, $5A6666, clNone, clNone); + + // TabBackground: Only Normal state is used + Options(skncTabBackground, sknsNormal).Body.Fill(0, $809090, clNone, clNone, clNone); + Options(skncTabBackground, sknsNormal).Borders.Fill(0, $5A6666, $5A6666, clNone, clNone); + + //---- ProgressBar ----// + // ProgressBar: Only Normal and HotTrack states are used + // HotTrack represents the selection + Options(skncProgressBar, sknsNormal).Body.Fill(0, $809090, clNone, clNone, clNone); + Options(skncProgressBar, sknsNormal).Borders.Fill(0, $5A6666, $5A6666, clNone, clNone); + Options(skncProgressBar, sknsHotTrack).Body.Fill(0, $94A0A0, clNone, clNone, clNone); + Options(skncProgressBar, sknsHotTrack).Borders.Fill(1, $5A6666, $5A6666, clNone, clNone); + + //---- TrackBar ----// + // TrackBar: Only Normal and HotTrack states are used + // HotTrack represents the selection + CopyOptions(skncProgressBar, skncTrackBar); + Options(skncTrackBar, sknsNormal).TextColor := $5A6666; + + // TrackBarButton: Only Normal and Pushed states are used + Options(skncTrackBarButton, sknsNormal).Body.Fill(0, $5A6666, clNone, clNone, clNone); + Options(skncTrackBarButton, sknsNormal).Borders.Fill(1, $94A0A0, $94A0A0, clNone, clNone); + Options(skncTrackBarButton, sknsPushed).Body.Fill(0, $809090, clNone, clNone, clNone); + Options(skncTrackBarButton, sknsPushed).Borders.Fill(1, $94A0A0, $94A0A0, clNone, clNone); + + //---- Header ----// + Options(skncHeader, sknsNormal).TextColor := $EEEEEE; + Options(skncHeader, sknsNormal).Body.Fill(0, $708080, clNone, clNone, clNone); + Options(skncHeader, sknsNormal).Borders.Fill(0, $838C8C, $5A6666, clNone, clNone); + Options(skncHeader, sknsHotTrack).TextColor := $68CAE6; + Options(skncHeader, sknsHotTrack).Body.Fill(0, $5F6D6D, clNone, clNone, clNone); + Options(skncHeader, sknsHotTrack).Borders.Fill(0, $838C8C, $5A6666, clNone, clNone); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXHumanSkin } + +procedure TSpTBXHumanSkin.FillOptions; +begin + SkinName := 'Human'; + + //---- Single State ----// + Options(skncDock, sknsNormal).Body.Fill(0, $E7EBEF, clNone, clNone, clNone); + + Options(skncDockablePanel, sknsNormal).Body.Fill(0, $F1F6F9, clNone, clNone, clNone); + + Options(skncDockablePanelTitleBar, sknsNormal).Body.Fill(0, $E7EBEF, clNone, clNone, clNone); + Options(skncDockablePanelTitleBar, sknsNormal).Borders.Fill(0, $B9BCBF, $B9BCBF, clWhite, clNone); + + Options(skncPanel, sknsNormal).Body.Fill(0, $F1F6F9, clNone, clNone, clNone); + Options(skncPanel, sknsNormal).Borders.Fill(2, $B7C1CB, $B7C1CB, clNone, clNone); + + Options(skncPopup, sknsNormal).Body.Fill(0, $F2F5F8, clNone, clNone, clNone); + Options(skncPopup, sknsNormal).Borders.Fill(0, $91A3B6, $91A3B6, clNone, clNone); + + Options(skncStatusBar, sknsNormal).Body.Fill(0, $E7EBEF, clNone, clNone, clNone); + + Options(skncSplitter, sknsNormal).Body.Fill(0, $E7EBEF, clNone, clNone, clNone); + + Options(skncToolbar, sknsNormal).Body.Fill(0, $E7EBEF, clNone, clNone, clNone); + Options(skncToolbar, sknsNormal).Borders.Fill(0, clWhite, $B7C1CB, clNone, clNone); + + CopyOptions(skncToolbar, skncMenuBar); + + Options(skncWindow, sknsNormal).Borders.Fill(0, $383A3D, $C7CFD8, $E7EBEF, $E7EBEF); + + Options(skncWindowTitleBar, sknsNormal).Body.Fill(5, $6AAAE8, $468CD1, $3A82C8, $488ED3); + Options(skncWindowTitleBar, sknsNormal).TextColor := clWhite; // This overrides the Items text color + + //---- Elements ----// + Options(skncToolbarGrip, sknsNormal).Body.Fill(0, $B7C1CB, clWhite, clNone, clNone); + + Options(skncStatusBarGrip, sknsNormal).Body.Fill(0, $B7C1CB, clWhite, clNone, clNone); + + Options(skncSeparator, sknsNormal).Body.Fill(0, $B7C1CB, clWhite, clNone, clNone); + + //---- Buttons ----// + Options(skncToolbarItem, sknsHotTrack).Body.Fill(5, clWhite, $EDF0F3, $E2E7EC, $E7EBEF); + Options(skncToolbarItem, sknsHotTrack).Borders.Fill(2, $1E4B8F, $1E4B8F, $1975FF, $1975FF); + Options(skncToolbarItem, sknsPushed).Body.Fill(0, $D4DBE0, clNone, clNone, clNone); + Options(skncToolbarItem, sknsPushed).Borders.Fill(2, $606A73, $606A73, clNone, clNone); + Options(skncToolbarItem, sknsChecked).Body.Fill(0, $D4DBE0, clNone, clNone, clNone); + Options(skncToolbarItem, sknsChecked).Borders.Fill(2, $606A73, $606A73, clNone, clNone); + Options(skncToolbarItem, sknsCheckedAndHotTrack).Body.Fill(5, clWhite, $EDF0F3, $E2E7EC, $E7EBEF); + Options(skncToolbarItem, sknsCheckedAndHotTrack).Borders.Fill(2, $1E4B8F, $1E4B8F, $1975FF, $1975FF); + + Options(skncMenuBarItem, sknsHotTrack).Body.Fill(1, $ACDEFE, $7BC5F5, clNone, clNone); + Options(skncMenuBarItem, sknsPushed).Body.Fill(1, $ACDEFE, $7BC5F5, clNone, clNone); + Options(skncMenuBarItem, sknsChecked).Body.Fill(1, $ACDEFE, $7BC5F5, clNone, clNone); + Options(skncMenuBarItem, sknsCheckedAndHotTrack).Body.Fill(1, $ACDEFE, $7BC5F5, clNone, clNone); + + Options(skncMenuItem, sknsHotTrack).Body.Fill(1, $ACDEFE, $7BC5F5, clNone, clNone); + Options(skncMenuItem, sknsHotTrack).Borders.Fill(1, $69BAEF, $69BAEF, clNone, clNone); + Options(skncMenuItem, sknsChecked).Body.Fill(1, $ACDEFE, $7BC5F5, clNone, clNone); + Options(skncMenuItem, sknsChecked).Borders.Fill(1, $69BAEF, $69BAEF, clNone, clNone); + Options(skncMenuItem, sknsCheckedAndHotTrack).Body.Fill(1, $ACDEFE, $7BC5F5, clNone, clNone); + Options(skncMenuItem, sknsCheckedAndHotTrack).Borders.Fill(1, $69BAEF, $69BAEF, clNone, clNone); + + CopyOptions(skncToolbarItem, skncButton); + Options(skncButton, sknsNormal).Body.Fill(5, clWhite, $EDF0F3, $E2E7EC, $E7EBEF); + Options(skncButton, sknsNormal).Borders.Fill(2, $D0D4D8, $D0D4D8, $606A73, $606A73); + Options(skncButton, sknsDisabled).Body.Fill(5, clWhite, $EDF0F3, $E2E7EC, $E7EBEF); + Options(skncButton, sknsDisabled).Borders.Fill(2, $D0D4D8, $D0D4D8, $606A73, $606A73); + + CopyOptions(skncMenuBarItem, skncListItem); + + Options(skncCheckBox, sknsNormal).Body.Fill(5, clWhite, $EDF0F3, $E2E7EC, $E7EBEF); + Options(skncCheckBox, sknsNormal).Borders.Fill(2, $666666, $666666, $F1F1F1, $F1F1F1); + Options(skncCheckBox, sknsDisabled).Body.Fill(5, clWhite, $EDF0F3, $E2E7EC, $E7EBEF); + Options(skncCheckBox, sknsDisabled).Borders.Fill(2, $D0D4D8, $D0D4D8, $606A73, $606A73); + Options(skncCheckBox, sknsPushed).Body.Fill(5, clWhite, $EDF0F3, $E2E7EC, $E7EBEF); + Options(skncCheckBox, sknsPushed).Borders.Fill(2, $666666, $666666, $F1F1F1, $F1F1F1); + Options(skncCheckBox, sknsHotTrack).Body.Fill(1, $76ADFF, $2C7DF7, clNone, clNone); + Options(skncCheckBox, sknsHotTrack).Borders.Fill(2, $214A87, $214A87, $8FBCFD, $8FBCFD); + Options(skncCheckBox, sknsChecked).Body.Fill(1, $76ADFF, $2C7DF7, clNone, clNone); + Options(skncCheckBox, sknsChecked).Borders.Fill(2, $214A87, $214A87, $8FBCFD, $8FBCFD); + Options(skncCheckBox, sknsCheckedAndHotTrack).Body.Fill(1, $76ADFF, $2C7DF7, clNone, clNone); + Options(skncCheckBox, sknsCheckedAndHotTrack).Borders.Fill(2, $214A87, $214A87, $8FBCFD, $8FBCFD); + + CopyOptions(skncCheckBox, skncRadioButton); + + //---- Editors ----// + Options(skncEditFrame, sknsNormal).Borders.Fill(1, $778B97, $778B97, $E6E6E6, $E6E6E6); + Options(skncEditFrame, sknsDisabled).Borders.Fill(1, clNone, clNone, $E6E6E6, $E6E6E6); + Options(skncEditFrame, sknsHotTrack).Borders.Fill(1, $1E4B8F, $1E4B8F, $1975FF, $1975FF); + + Options(skncEditButton, sknsHotTrack).Body.Fill(1, $76ADFF, $2C7DF7, clNone, clNone); + Options(skncEditButton, sknsHotTrack).Borders.Fill(0, $1975FF, $1975FF, $8FBCFD, $8FBCFD); + Options(skncEditButton, sknsPushed).Body.Fill(1, $3787FF, $0A66F0, clNone, clNone); + Options(skncEditButton, sknsPushed).Borders.Fill(0, $1975FF, $1975FF, $589AFC, $589AFC); + + //---- Tabs ----// + Options(skncTab, sknsNormal).Body.Fill(0, $DBDFE4, clNone, clNone, clNone); + Options(skncTab, sknsNormal).Borders.Fill(2, $B8C2CA, $B8C2CA, $E1E4E8, $E1E4E8); + Options(skncTab, sknsDisabled).Body.Fill(0, $DBDFE4, clNone, clNone, clNone); + Options(skncTab, sknsDisabled).Borders.Fill(2, $B8C2CA, $B8C2CA, $E1E4E8, $E1E4E8); + + Options(skncTab, sknsHotTrack).Body.Fill(1, clWhite, $E7EBEF, clNone, clNone); + Options(skncTab, sknsHotTrack).Borders.Fill(2, $677883, $677883, clWhite, $DCE0E4); + Options(skncTab, sknsChecked).Body.Fill(1, clWhite, $E7EBEF, clNone, clNone); + Options(skncTab, sknsChecked).Borders.Fill(2, $677883, $677883, clWhite, $DCE0E4); + Options(skncTab, sknsCheckedAndHotTrack).Body.Fill(1, clWhite, $E7EBEF, clNone, clNone); + Options(skncTab, sknsCheckedAndHotTrack).Borders.Fill(2, $677883, $677883, clWhite, $DCE0E4); + + // TabBackground: Only Normal state is used + Options(skncTabBackground, sknsNormal).Body.Fill(0, $E7EBEF, clNone, clNone, clNone); + Options(skncTabBackground, sknsNormal).Borders.Fill(0, $677883, $677883, clWhite, $DCE0E4); + + //---- ProgressBar ----// + // ProgressBar: Only Normal and HotTrack states are used + // HotTrack represents the selection + Options(skncProgressBar, sknsNormal).Body.Fill(5, clWhite, $EDF0F3, $E2E7EC, $E7EBEF); + Options(skncProgressBar, sknsNormal).Borders.Fill(2, $D0D4D8, $D0D4D8, $606A73, $606A73); + Options(skncProgressBar, sknsHotTrack).Body.Fill(5, $9CC3FF, $60A0FF, $1672FD, $63A1FF); + Options(skncProgressBar, sknsHotTrack).Borders.Fill(2, $D0D4D8, $D0D4D8, $606A73, $606A73); + + + //---- TrackBar ----// + // TrackBar: Only Normal and HotTrack states are used + // HotTrack represents the selection + CopyOptions(skncProgressBar, skncTrackBar); + + // TrackBarButton: Only Normal and Pushed states are used + Options(skncTrackBarButton, sknsNormal).Body.Fill(5, clWhite, $EDF0F3, $E2E7EC, $E7EBEF); + Options(skncTrackBarButton, sknsNormal).Borders.Fill(2, $D0D4D8, $D0D4D8, $606A73, $606A73); + Options(skncTrackBarButton, sknsPushed).Body.Fill(5, $9CC3FF, $60A0FF, $1672FD, $63A1FF); + Options(skncTrackBarButton, sknsPushed).Borders.Fill(2, $D0D4D8, $D0D4D8, $606A73, $606A73); + + //---- Header ----// + Options(skncHeader, sknsNormal).Body.Fill(0, $E7EBEF, clNone, clNone, clNone); + Options(skncHeader, sknsNormal).Borders.Fill(0, $F3F5F7, $8F9CAA, clNone, $D4D8DB); + Options(skncHeader, sknsHotTrack).Body.Fill(0, $EEF2F6, clNone, clNone, clNone); + Options(skncHeader, sknsHotTrack).Borders.Fill(0, $F3F5F7, $8F9CAA, clNone, $D4D8DB); +end; + +procedure TSpTBXHumanSkin.PaintBackground(ACanvas: TCanvas; ARect: TRect; + Component: TSpTBXSkinComponentsType; State: TSpTBXSkinStatesType; Background, + Borders, Vertical: Boolean; ForceRectBorders: TAnchors); +begin + inherited; + // Override the Tab painting + if (Component = skncTab) and (State in [sknsHotTrack, sknsPushed, sknsChecked, sknsCheckedAndHotTrack]) then begin + SpDrawLine(ACanvas, ARect.Left + 2, ARect.Top, ARect.Right - 2, ARect.Top, $1E4B8F); + SpDrawLine(ACanvas, ARect.Left + 1, ARect.Top + 1, ARect.Right - 1, ARect.Top + 1, $1975FF); + SpDrawLine(ACanvas, ARect.Left, ARect.Top + 2, ARect.Right, ARect.Top + 2, $1975FF); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXLeopardSkin } + +procedure TSpTBXLeopardSkin.FillOptions; +begin + SkinName := 'Leopard'; + + //---- Single State ----// + Options(skncDock, sknsNormal).Body.Fill(1, $CFCFCF, $999797, clNone, clNone); + + Options(skncDockablePanel, sknsNormal).Body.Fill(0, $EAE4DD, clNone, clNone, clNone); + Options(skncDockablePanel, sknsNormal).Borders.Fill(0, $999797, $999797, clNone, clNone); + + Options(skncDockablePanelTitleBar, sknsNormal).Body.Fill(1, $C0C0C0, $999797, clNone, clNone); + + Options(skncPanel, sknsNormal).Body.Fill(0, $EAE4DD, clNone, clNone, clNone); + Options(skncPanel, sknsNormal).Borders.Fill(2, $999797, $999797, clNone, clNone); + + Options(skncPopup, sknsNormal).Body.Fill(0, clWhite, clNone, clNone, clNone); + Options(skncPopup, sknsNormal).Borders.Fill(0, $C0C0C0, $C0C0C0, clNone, clNone); + + Options(skncStatusBar, sknsNormal).Body.Fill(1, $C2C5C3, $999797, clNone, clNone); + + Options(skncSplitter, sknsNormal).Body.Fill(1, $C2C5C3, $999797, clNone, clNone); + + Options(skncWindow, sknsNormal).Borders.Fill(0, $808080, $808080, $C0C0C0, $DDD9D2); + + Options(skncWindowTitleBar, sknsNormal).Body.Fill(1, $C2C5C3, $999797, clNone, clNone); + + //---- Elements ----// + Options(skncToolbarGrip, sknsNormal).Body.Fill(0, $646262, $CECECE, clNone, clNone); + + Options(skncStatusBarGrip, sknsNormal).Body.Fill(0, $646262, $CECECE, clNone, clNone); + + Options(skncSeparator, sknsNormal).Body.Fill(0, $646262, $CECECE, clNone, clNone); + + //---- Buttons ----// + Options(skncToolbarItem, sknsHotTrack).Body.Fill(1, clWhite, $A8A8A8, clNone, clNone); + Options(skncToolbarItem, sknsHotTrack).Borders.Fill(2, $848484, $848484, clNone, clNone); + Options(skncToolbarItem, sknsPushed).Body.Fill(1, $343434, $696969, clNone, clNone); + Options(skncToolbarItem, sknsPushed).Borders.Fill(2, $272727, $272727, clNone, clNone); + Options(skncToolbarItem, sknsPushed).TextColor := clWhite; + Options(skncToolbarItem, sknsChecked).Body.Fill(1, $343434, $696969, clNone, clNone); + Options(skncToolbarItem, sknsChecked).Borders.Fill(2, $272727, $272727, clNone, clNone); + Options(skncToolbarItem, sknsChecked).TextColor := clWhite; + Options(skncToolbarItem, sknsCheckedAndHotTrack).Body.Fill(1, $343434, $696969, clNone, clNone); + Options(skncToolbarItem, sknsCheckedAndHotTrack).Borders.Fill(2, $272727, $272727, $343434, $343434); + Options(skncToolbarItem, sknsCheckedAndHotTrack).TextColor := clWhite; + Options(skncToolbarItem, sknsDisabled).TextColor := $89736D; + + Options(skncMenuBarItem, sknsHotTrack).Body.Fill(0, $D87439, clNone, clNone, clNone); + Options(skncMenuBarItem, sknsHotTrack).TextColor := clWhite; + Options(skncMenuBarItem, sknsPushed).Body.Fill(0, $D87439, clNone, clNone, clNone); + Options(skncMenuBarItem, sknsPushed).TextColor := clWhite; + Options(skncMenuBarItem, sknsChecked).Body.Fill(0, $D87439, clNone, clNone, clNone); + Options(skncMenuBarItem, sknsChecked).TextColor := clWhite; + Options(skncMenuBarItem, sknsCheckedAndHotTrack).Body.Fill(0, $D87439, clNone, clNone, clNone); + Options(skncMenuBarItem, sknsCheckedAndHotTrack).TextColor := clWhite; + + Options(skncMenuItem, sknsHotTrack).Body.Fill(0, $D87439, clNone, clNone, clNone); + Options(skncMenuItem, sknsHotTrack).TextColor := clWhite; + Options(skncMenuItem, sknsChecked).Body.Fill(5, $FFE7D5, $FFD0A2, $F5BA82, $FDFCDA); + Options(skncMenuItem, sknsChecked).Borders.Fill(2, $DB9D79, $DB9D79, clNone, clNone); + Options(skncMenuItem, sknsCheckedAndHotTrack).Body.Fill(5, $FFE7D5, $FFD0A2, $F5BA82, $FDFCDA); + Options(skncMenuItem, sknsCheckedAndHotTrack).Borders.Fill(2, $DB9D79, $DB9D79, clNone, clNone); + Options(skncMenuItem, sknsCheckedAndHotTrack).TextColor := clWhite; + + Options(skncButton, sknsNormal).Body.Fill(5, clWhite, $EFEFEF, $E3E3E3, clWhite); + Options(skncButton, sknsNormal).Borders.Fill(2, $C0C0C0, $C0C0C0, clNone, clNone); + Options(skncButton, sknsDisabled).Body.Fill(5, clWhite, $EFEFEF, $E3E3E3, clWhite); + Options(skncButton, sknsDisabled).Borders.Fill(2, $C0C0C0, $C0C0C0, clNone, clNone); + Options(skncButton, sknsHotTrack).Body.Fill(5, $FFE7D5, $FFD0A2, $F5BA82, $FDFCDA); + Options(skncButton, sknsHotTrack).Borders.Fill(2, $DB9D79, $DB9D79, clNone, clNone); + Options(skncButton, sknsPushed).Body.Fill(5, $FFD6B7, $FFC689, $F3AF67, $FCFBBE); + Options(skncButton, sknsPushed).Borders.Fill(2, $DB9D79, $DB9D79, clNone, clNone); + Options(skncButton, sknsChecked).Body.Fill(5, $FFD6B7, $FFC689, $F3AF67, $FCFBBE); + Options(skncButton, sknsChecked).Borders.Fill(2, $DB9D79, $DB9D79, clNone, clNone); + Options(skncButton, sknsCheckedAndHotTrack).Body.Fill(5, $FFE7D5, $FFD0A2, $F5BA82, $FDFCDA); + Options(skncButton, sknsCheckedAndHotTrack).Borders.Fill(2, $DB9D79, $DB9D79, clNone, clNone); + + CopyOptions(skncButton, skncListItem); + + CopyOptions(skncButton, skncCheckBox); + + CopyOptions(skncCheckBox, skncRadioButton); + + //---- Editors ----// + Options(skncEditFrame, sknsNormal).Borders.Fill(1, clNone, clNone, $D0D0D0, $D0D0D0); + Options(skncEditFrame, sknsDisabled).Borders.Fill(1, clNone, clNone, $99A8AC, $99A8AC); + Options(skncEditFrame, sknsHotTrack).Borders.Fill(1, $D99D51, $D99D51, $FFD3A7, $FFD3A7); + + Options(skncEditButton, sknsHotTrack).Body.Fill(5, $FFE7D5, $FFD0A2, $F5BA82, $FDFCDA); + Options(skncEditButton, sknsHotTrack).Borders.Fill(0, $DB9D79, $DB9D79, clNone, clNone); + Options(skncEditButton, sknsPushed).Body.Fill(5, $FFD6B7, $FFC689, $F3AF67, $FCFBBE); + Options(skncEditButton, sknsPushed).Borders.Fill(0, $DB9D79, $DB9D79, clNone, clNone); + Options(skncEditButton, sknsChecked).Body.Fill(5, $FFD6B7, $FFC689, $F3AF67, $FCFBBE); + Options(skncEditButton, sknsChecked).Borders.Fill(0, $DB9D79, $DB9D79, clNone, clNone); + Options(skncEditButton, sknsCheckedAndHotTrack).Body.Fill(5, $FFE7D5, $FFD0A2, $F5BA82, $FDFCDA); + Options(skncEditButton, sknsCheckedAndHotTrack).Borders.Fill(0, $DB9D79, $DB9D79, clNone, clNone); + + //---- Tabs ----// + Options(skncTab, sknsNormal).Body.Fill(5, clWhite, $EFEFEF, $E3E3E3, clWhite); + Options(skncTab, sknsNormal).Borders.Fill(2, $C0C0C0, $C0C0C0, clNone, clNone); + Options(skncTab, sknsDisabled).Body.Fill(5, clWhite, $EFEFEF, $E3E3E3, clWhite); + Options(skncTab, sknsDisabled).Borders.Fill(2, $C0C0C0, $C0C0C0, clNone, clNone); + Options(skncTab, sknsHotTrack).Body.Fill(5, $FFD6B7, $FFC689, $F3AF67, $FCFBBE); + Options(skncTab, sknsHotTrack).Borders.Fill(2, $DB9D79, $DB9D79, clNone, clNone); + Options(skncTab, sknsChecked).Body.Fill(5, $FFD6B7, $FFC689, $F3AF67, $FCFBBE); + Options(skncTab, sknsChecked).Borders.Fill(2, $DB9D79, $DB9D79, clNone, clNone); + Options(skncTab, sknsCheckedAndHotTrack).Body.Fill(5, $FFE7D5, $FFD0A2, $F5BA82, $FDFCDA); + Options(skncTab, sknsCheckedAndHotTrack).Borders.Fill(2, $DB9D79, $DB9D79, clNone, clNone); + + // TabBackground: Only Normal state is used + Options(skncTabBackground, sknsNormal).Body.Fill(0, $EAE4DD, clNone, clNone, clNone); + + //---- ProgressBar ----// + // ProgressBar: Only Normal and HotTrack states are used + // HotTrack represents the selection + Options(skncProgressBar, sknsNormal).Body.Fill(5, clWhite, $EFEFEF, $E3E3E3, clWhite); + Options(skncProgressBar, sknsNormal).Borders.Fill(2, $C0C0C0, $C0C0C0, clNone, clNone); + Options(skncProgressBar, sknsHotTrack).Body.Fill(5, $FFD6B7, $FFC689, $F3AF67, $FCFBBE); + Options(skncProgressBar, sknsHotTrack).Borders.Fill(2, $DB9D79, $DB9D79, clNone, clNone); + + //---- TrackBar ----// + // TrackBar: Only Normal and HotTrack states are used + // HotTrack represents the selection + CopyOptions(skncProgressBar, skncTrackBar); + + // TrackBarButton: Only Normal and Pushed states are used + Options(skncTrackBarButton, sknsNormal).Body.Fill(5, $FFD6B7, $FFC689, $F3AF67, $FCFBBE); + Options(skncTrackBarButton, sknsNormal).Borders.Fill(2, $DB9D79, $DB9D79, clNone, clNone); + Options(skncTrackBarButton, sknsPushed).Body.Fill(5, $FFE7D5, $FFD0A2, $F5BA82, $FDFCDA); + Options(skncTrackBarButton, sknsPushed).Borders.Fill(2, $DB9D79, $DB9D79, clNone, clNone); + + //---- Header ----// + Options(skncHeader, sknsNormal).Body.Fill(5, clWhite, $EFEFEF, $E3E3E3, clWhite); + Options(skncHeader, sknsNormal).Borders.Fill(0, $E7E7E7, $C0C0C0, clNone, clNone); + Options(skncHeader, sknsHotTrack).Body.Fill(5, $FFE7D5, $FFD0A2, $F5BA82, $FDFCDA); + Options(skncHeader, sknsHotTrack).Borders.Fill(0, $F5BA82, $DB9D79, clNone, clNone); + Options(skncHeader, sknsPushed).Body.Fill(5, $FFE7D5, $FFD0A2, $F5BA82, $FDFCDA); + Options(skncHeader, sknsPushed).Borders.Fill(0, $F5BA82, $DB9D79, clNone, clNone); +end; + +procedure TSpTBXLeopardSkin.PaintBackground(ACanvas: TCanvas; ARect: TRect; + Component: TSpTBXSkinComponentsType; State: TSpTBXSkinStatesType; Background, + Borders, Vertical: Boolean; ForceRectBorders: TAnchors); +begin + inherited; + // Override the TabBackground painting + if Component = skncTabBackground then begin + SpDrawLine(ACanvas, ARect.Left, ARect.Top, ARect.Right, ARect.Top, $DB9D79); + SpDrawLine(ACanvas, ARect.Left, ARect.Top + 1, ARect.Right, ARect.Top + 1, $FAEEAF); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXXitoSkin } + +procedure TSpTBXXitoSkin.FillOptions; +begin + SkinName := 'Xito'; + + //---- Single State ----// + Options(skncDock, sknsNormal).Body.Fill(0, $E0E0E0, clNone, clNone, clNone); + + Options(skncDockablePanel, sknsNormal).Body.Fill(0, clWhite, clNone, clNone, clNone); + Options(skncDockablePanel, sknsNormal).Borders.Fill(0, $E0E0E0, $E0E0E0, clWhite, clWhite); + + Options(skncDockablePanelTitleBar, sknsNormal).Body.Fill(5, clWhite, $F2F2F2, $EAEAEA, $EFEFEF); + + Options(skncPanel, sknsNormal).Body.Fill(0, $D8D8D8, clNone, clNone, clNone); + Options(skncPanel, sknsNormal).Borders.Fill(2, $909090, $909090, $D0D0D0, $D0D0D0); + + Options(skncPopup, sknsNormal).Body.Fill(0, clWhite, clNone, clNone, clNone); + Options(skncPopup, sknsNormal).Borders.Fill(0, $C0C0C0, $C0C0C0, clNone, clNone); + + Options(skncStatusBar, sknsNormal).Body.Fill(5, clWhite, $F2F2F2, $EAEAEA, $EFEFEF); + + Options(skncSplitter, sknsNormal).Body.Fill(5, clWhite, $F2F2F2, $EAEAEA, $EFEFEF); + + Options(skncToolbar, sknsNormal).Body.Fill(5, clWhite, $F2F2F2, $EAEAEA, $EFEFEF); + Options(skncToolbar, sknsNormal).Borders.Fill(2, clWhite, $B0B0B0, clNone, clNone); + + CopyOptions(skncToolbar, skncMenuBar); + + Options(skncWindow, sknsNormal).Borders.Fill(0, $808080, $808080, $C0C0C0, $DDD9D2); + + Options(skncWindowTitleBar, sknsNormal).Body.Fill(1, $C0C0C0, clWhite, clNone, clNone); + + //---- Elements ----// + Options(skncToolbarGrip, sknsNormal).Body.Fill(0, $B0B0B0, clWhite, clNone, clNone); + + Options(skncStatusBarGrip, sknsNormal).Body.Fill(0, $B0B0B0, clWhite, clNone, clNone); + + Options(skncSeparator, sknsNormal).Body.Fill(0, $D0D0D0, clWhite, clNone, clNone); + + //---- Buttons ----// + Options(skncToolbarItem, sknsHotTrack).Body.Fill(0, $E0E0E0, clNone, clNone, clNone); + Options(skncToolbarItem, sknsHotTrack).Borders.Fill(2, $A0A0A0, $A0A0A0, clNone, clNone); + Options(skncToolbarItem, sknsPushed).Body.Fill(0, $C0C0C0, clNone, clNone, clNone); + Options(skncToolbarItem, sknsPushed).Borders.Fill(2, $909090, $909090, clNone, clNone); + Options(skncToolbarItem, sknsChecked).Body.Fill(0, $D8D8D8, clNone, clNone, clNone); + Options(skncToolbarItem, sknsChecked).Borders.Fill(2, $B8B8B8, $F8F8F8, clNone, clNone); + Options(skncToolbarItem, sknsCheckedAndHotTrack).Body.Fill(0, $D0D0D0, clNone, clNone, clNone); + Options(skncToolbarItem, sknsCheckedAndHotTrack).Borders.Fill(2, $808080, $808080, clNone, clNone); + + CopyOptions(skncToolbarItem, skncMenuBarItem); + + CopyOptions(skncToolbarItem, skncMenuItem); + + Options(skncButton, sknsNormal).Body.Fill(5, clWhite, $DADADA, $D0D0D0, $E0E0E0); + Options(skncButton, sknsNormal).Borders.Fill(2, $C0C0C0, $C0C0C0, clNone, clNone); + Options(skncButton, sknsDisabled).Body.Fill(5, clWhite, $DADADA, $D0D0D0, $E0E0E0); + Options(skncButton, sknsDisabled).Borders.Fill(2, $C0C0C0, $C0C0C0, clNone, clNone); + Options(skncButton, sknsHotTrack).Body.Fill(5, clWhite, $DADADA, $DFDFDF, $E0E0E0); + Options(skncButton, sknsHotTrack).Borders.Fill(2, $C0C0C0, $C0C0C0, clNone, clNone); + Options(skncButton, sknsPushed).Body.Fill(1, $D0D0D0, clWhite, clNone, clNone); + Options(skncButton, sknsPushed).Borders.Fill(2, $C0C0C0, $C0C0C0, clNone, clNone); + Options(skncButton, sknsChecked).Body.Fill(1, $D0D0D0, clWhite, clNone, clNone); + Options(skncButton, sknsChecked).Borders.Fill(2, $C0C0C0, $C0C0C0, clNone, clNone); + Options(skncButton, sknsCheckedAndHotTrack).Body.Fill(1, $EFEFEF, clWhite, clNone, clNone); + Options(skncButton, sknsCheckedAndHotTrack).Borders.Fill(2, $C0C0C0, $C0C0C0, clNone, clNone); + + CopyOptions(skncButton, skncListItem); + + CopyOptions(skncButton, skncCheckBox); + Options(skncCheckBox, sknsNormal).Body.Reset; + Options(skncCheckBox, sknsChecked).Body.Fill(5, clWhite, $DADADA, $D0D0D0, $E0E0E0); + Options(skncCheckBox, sknsDisabled).Body.Reset; + + CopyOptions(skncCheckBox, skncRadioButton); + + //---- Editors ----// + Options(skncEditFrame, sknsNormal).Borders.Fill(1, clNone, clNone, $E0E0E0, $E0E0E0); + Options(skncEditFrame, sknsDisabled).Borders.Fill(1, clNone, clNone, $99A8AC, $99A8AC); + Options(skncEditFrame, sknsHotTrack).Borders.Fill(1, clNone, clNone, $C0C0C0, $C0C0C0); + + CopyOptions(skncButton, skncEditButton); + Options(skncEditButton, sknsNormal).Reset; + Options(skncEditButton, sknsDisabled).Borders.SkinType := 0; + Options(skncEditButton, sknsHotTrack).Borders.SkinType := 0; + Options(skncEditButton, sknsPushed).Borders.SkinType := 0; + Options(skncEditButton, sknsChecked).Borders.SkinType := 0; + Options(skncEditButton, sknsCheckedAndHotTrack).Borders.SkinType := 0; + + //---- Tabs ----// + CopyOptions(skncToolbarItem, skncTab); + Options(skncTab, sknsCheckedAndHotTrack).Borders.Fill(2, $B8B8B8, $F8F8F8, clNone, clNone); + + // TabBackground: Only Normal state is used + Options(skncTabBackground, sknsNormal).Body.Fill(0, $D8D8D8, clNone, clNone, clNone); + Options(skncTabBackground, sknsNormal).Borders.Fill(2, $B8B8B8, $F8F8F8, clNone, clNone); + + //---- ProgressBar ----// + // ProgressBar: Only Normal and HotTrack states are used + // HotTrack represents the selection + Options(skncProgressBar, sknsNormal).Body.Fill(0, $C0C0C0, clNone, clNone, clNone); + Options(skncProgressBar, sknsNormal).Borders.Fill(2, $909090, $909090, clNone, clNone); + Options(skncProgressBar, sknsHotTrack).Body.Fill(0, $E0E0E0, clNone, clNone, clNone); + Options(skncProgressBar, sknsHotTrack).Borders.Fill(2, $909090, $909090, clNone, clNone); + + //---- TrackBar ----// + // TrackBar: Only Normal and HotTrack states are used + // HotTrack represents the selection + CopyOptions(skncProgressBar, skncTrackBar); + + // TrackBarButton: Only Normal and Pushed states are used + Options(skncTrackBarButton, sknsNormal).Body.Fill(0, $E0E0E0, clNone, clNone, clNone); + Options(skncTrackBarButton, sknsNormal).Borders.Fill(2, $909090, $909090, clNone, clNone); + Options(skncTrackBarButton, sknsPushed).Body.Fill(0, $F0F0F0, clNone, clNone, clNone); + Options(skncTrackBarButton, sknsPushed).Borders.Fill(2, $909090, $909090, clNone, clNone); + + //---- Header ----// + Options(skncHeader, sknsNormal).Body.Fill(5, clWhite, $DADADA, $D0D0D0, $E0E0E0); + Options(skncHeader, sknsNormal).Borders.Fill(0, $E7E7E7, $C0C0C0, clNone, clNone); + Options(skncHeader, sknsHotTrack).Body.Fill(5, clWhite, $DADADA, $DFDFDF, $E0E0E0); + Options(skncHeader, sknsHotTrack).Borders.Fill(0, $E7E7E7, $C0C0C0, clNone, clNone); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXOfficeXPSkin } + +procedure TSpTBXOfficeXPSkin.FillOptions; +var + ToolbarC, PopupC, HotTrackC, CheckedC, EditHotTrackC: TColor; +begin + //---- Skin Properties ----// + + SkinName := 'Office XP'; + OfficeIcons := True; + OfficeMenuSeparator := True; + OfficeStatusBar := True; + + //---- Colors ----// + + ToolbarC := SpBlendColors(clWindow, clBtnFace, 165); + PopupC := SpBlendColors(clBtnFace, clWindow, 143); + + HotTrackC := SpBlendColors(clHighlight, clWindow, 30); + HotTrackC := SpLighten(HotTrackC, -15); //-7 original, -30 silver + + CheckedC := SpBlendColors(clBtnFace, clWindow, 50); + CheckedC := SpBlendColors(clHighlight, CheckedC, 10); + + EditHotTrackC := clHighlight; + + //---- Single State ----// + Options(skncDock, sknsNormal).Body.Fill(0, clBtnFace, clNone, clNone, clNone); + + Options(skncDockablePanel, sknsNormal).Body.Fill(0, PopupC, clNone, clNone, clNone); + + Options(skncDockablePanelTitleBar, sknsNormal).Body.Fill(0, clBtnFace, clNone, clNone, clNone); + Options(skncDockablePanelTitleBar, sknsNormal).Borders.Fill(0, PopupC, PopupC, clNone, clNone); + + Options(skncPanel, sknsNormal).Body.Fill(1, clBtnFace, clWhite, clNone, clNone); + Options(skncPanel, sknsNormal).Borders.Fill(2, $808080, $808080, $B0D4DF, clWhite); + + Options(skncPopup, sknsNormal).Body.Fill(0, PopupC, clNone, clNone, clNone); + Options(skncPopup, sknsNormal).Borders.Fill(0, clBtnShadow, clBtnShadow, clNone, clNone); + + Options(skncStatusBar, sknsNormal).Body.Fill(0, clBtnFace, clNone, clNone, clNone); + + Options(skncSplitter, sknsNormal).Body.Fill(0, ToolbarC, clNone, clNone, clNone); + + Options(skncToolbar, sknsNormal).Body.Fill(0, ToolbarC, clNone, clNone, clNone); + Options(skncToolbar, sknsNormal).Borders.Fill(2, clBtnFace, clBtnFace, clNone, clNone); + + CopyOptions(skncToolbar, skncMenuBar); + + Options(skncWindow, sknsNormal).Body.Fill(0, clBtnFace, clNone, clNone, clNone); + Options(skncWindow, sknsNormal).Borders.Fill(0, $808080, $808080, clBtnShadow, clBtnShadow); + + Options(skncWindowTitleBar, sknsNormal).Body.Fill(0, clBtnShadow, clNone, clNone, clNone); + Options(skncWindowTitleBar, sknsNormal).Borders.Fill(0, clBtnFace, clBtnFace, clNone, clNone); + + //---- Elements ----// + Options(skncGutter, sknsNormal).Body.Fill(0, clBtnFace, clNone, clNone, clNone); + + Options(skncToolbarGrip, sknsNormal).Body.Fill(0, clBtnShadow, clWhite, clNone, clNone);////// + + Options(skncStatusBarGrip, sknsNormal).Body.Fill(0, clBtnShadow, clWhite, clNone, clNone);////// + + Options(skncSeparator, sknsNormal).Body.Fill(0, clBtnShadow, clNone, clNone, clNone); + + //---- Buttons ----// + Options(skncToolbarItem, sknsHotTrack).Body.Fill(0, HotTrackC, clNone, clNone, clNone); + Options(skncToolbarItem, sknsHotTrack).Borders.Fill(0, clHighlight, clHighlight, clNone, clNone); + Options(skncToolbarItem, sknsPushed).Body.Fill(0, clBtnFace, clNone, clNone, clNone); + Options(skncToolbarItem, sknsPushed).Borders.Fill(0, clBtnShadow, clBtnShadow, clNone, clNone); + Options(skncToolbarItem, sknsChecked).Body.Fill(0, CheckedC, clNone, clNone, clNone); + Options(skncToolbarItem, sknsChecked).Borders.Fill(0, clHighlight, clHighlight, clNone, clNone); + Options(skncToolbarItem, sknsCheckedAndHotTrack).Body.Fill(0, HotTrackC, clNone, clNone, clNone); + Options(skncToolbarItem, sknsCheckedAndHotTrack).Borders.Fill(0, clHighlight, clHighlight, clNone, clNone); + + Options(skncOpenToolbarItem, sknsNormal).Body.Fill(0, clBtnFace, clNone, clNone, clNone); + Options(skncOpenToolbarItem, sknsNormal).Borders.Fill(0, clBtnShadow, clBtnShadow, clNone, clNone); + + CopyOptions(skncToolbarItem, skncMenuBarItem); + + CopyOptions(skncToolbarItem, skncMenuItem); + + CopyOptions(skncToolbarItem, skncButton); + Options(skncButton, sknsNormal).Body.Fill(0, clBtnFace, clNone, clNone, clNone); + Options(skncButton, sknsNormal).Borders.Fill(0, clBtnShadow, clBtnShadow, clNone, clNone); + Options(skncButton, sknsDisabled).Body.Fill(0, clBtnFace, clNone, clNone, clNone); + Options(skncButton, sknsDisabled).Borders.Fill(0, clBtnShadow, clBtnShadow, clNone, clNone); + + CopyOptions(skncToolbarItem, skncListItem); + + CopyOptions(skncToolbarItem, skncCheckBox); + Options(skncCheckBox, sknsNormal).Borders.Fill(0, clBtnShadow, clBtnShadow, clNone, clNone); + Options(skncCheckBox, sknsDisabled).Borders.Fill(0, clBtnShadow, clBtnShadow, clNone, clNone); + + CopyOptions(skncCheckBox, skncRadioButton); + + //---- Editors ----// + Options(skncEditFrame, sknsNormal).Borders.Fill(1, clNone, clNone, clBtnFace, clBtnFace); + Options(skncEditFrame, sknsDisabled).Borders.Fill(1, clNone, clNone, clBtnShadow, clBtnShadow); + Options(skncEditFrame, sknsHotTrack).Borders.Fill(1, clNone, clNone, EditHotTrackC, EditHotTrackC); + + CopyOptions(skncToolbarItem, skncEditButton); + Options(skncEditButton, sknsNormal).Body.Fill(0, clBtnFace, clNone, clNone, clNone); + Options(skncEditButton, sknsNormal).Borders.Fill(0, clWindow, clWindow, clNone, clNone); + Options(skncEditButton, sknsPushed).Body.Fill(0, HotTrackC, clNone, clNone, clNone); + Options(skncEditButton, sknsPushed).Borders.Fill(0, EditHotTrackC, EditHotTrackC, clNone, clNone); + Options(skncEditButton, sknsPushed).TextColor := clHighlightText; + + //---- Tabs ----// + Options(skncTab, sknsHotTrack).Body.Fill(0, HotTrackC, clNone, clNone, clNone); + Options(skncTab, sknsHotTrack).Borders.Fill(0, clBtnShadow, clBtnShadow, clNone, clNone); + Options(skncTab, sknsChecked).Body.Fill(0, clBtnFace, clNone, clNone, clNone); + Options(skncTab, sknsChecked).Borders.Fill(0, clBtnShadow, clBtnShadow, clNone, clNone); + Options(skncTab, sknsCheckedAndHotTrack).Body.Fill(0, HotTrackC, clNone, clNone, clNone); + Options(skncTab, sknsCheckedAndHotTrack).Borders.Fill(0, clBtnShadow, clBtnShadow, clNone, clNone); + + // TabBackground: Only Normal state is used + Options(skncTabBackground, sknsNormal).Body.Fill(0, clBtnFace, clNone, clNone, clNone); + Options(skncTabBackground, sknsNormal).Borders.Fill(0, clBtnShadow, clBtnShadow, clNone, clNone); + + //---- ProgressBar ----// + // ProgressBar: Only Normal and HotTrack states are used + // HotTrack represents the selection + Options(skncProgressBar, sknsNormal).Body.Fill(0, CheckedC, clWhite, clNone, clNone); + Options(skncProgressBar, sknsNormal).Borders.Fill(0, clHighlight, clHighlight, clNone, clNone); + Options(skncProgressBar, sknsHotTrack).Body.Fill(0, HotTrackC, clNone, clNone, clNone); + Options(skncProgressBar, sknsHotTrack).Borders.Fill(0, clHighlight, clHighlight, clNone, clNone); + + //---- TrackBar ----// + // TrackBar: Only Normal and HotTrack states are used + // HotTrack represents the selection + CopyOptions(skncProgressBar, skncTrackBar); + + // TrackBarButton: Only Normal and Pushed states are used + Options(skncTrackBarButton, sknsNormal).Body.Fill(0, CheckedC, clNone, clNone, clNone); + Options(skncTrackBarButton, sknsNormal).Borders.Fill(0, clHighlight, clHighlight, clNone, clNone); + Options(skncTrackBarButton, sknsPushed).Body.Fill(0, HotTrackC, clWhite, clNone, clNone); + Options(skncTrackBarButton, sknsPushed).Borders.Fill(0, clHighlight, clHighlight, clNone, clNone); + + //---- Header ----// + Options(skncHeader, sknsNormal).Body.Fill(0, clBtnFace, clNone, clNone, clNone); + Options(skncHeader, sknsNormal).Borders.Fill(0, clWindow, clBtnShadow, clNone, clNone); + Options(skncHeader, sknsHotTrack).Body.Fill(0, HotTrackC, clNone, clNone, clNone); + Options(skncHeader, sknsHotTrack).Borders.Fill(0, clBtnFace, clBtnShadow, clNone, clNone); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXOffice2003Skin } + +constructor TSpTBXOffice2003Skin.Create; +begin + FDefaultColorScheme := lusUnknown; + inherited; +end; + +procedure TSpTBXOffice2003Skin.FillColors; +const + Office2003Colors: array[lusBlue..lusGreen] of TSpTBXOffice2003Colors = ( + ($F5BE9E, $F9D9C3, // 0, 1: Dock + $FEECDD, $E2A981, // 2, 3: Toolbar + $CB8C6A, $F5BE9E, // 4, 5: Toolbar borders + $F6F6F6, // 6: Popup + $962D00, // 7: Popup borders + $800000, // 8: Item borders + $C9662A, // 9: Window borders + $8CD5FF, $55ADFF, // 10, 11: Item Checked + $4E91FE, $8ED3FF, // 12, 13: Item Pushed + $CCF4FF, $91D0FF, // 14, 15: Item HotTrack + $FFEFE3, $E7B593, // 16, 17: OpenToolbarItem + $91420D, // 18: Button external border + $FBD0B3, $CB8C6A, // 19, 20: Button internal borders + $FEECDD, // 21: Grip/Separator soft color + $E2A981), // 22: Panel/CheckBox/Tabs/ProgressBar/TrackBar borders + + ($E5D7D7, $F7F3F3, // 0, 1: Dock + $FAF4F3, $B59799, // 2, 3: Toolbar + $8F6D6E, $E5D7D7, // 4, 5: Toolbar borders + $FFFAFD, // 6: Popup + $947C7C, // 7: Popup borders + $6F4B4B, // 8: Item borders + $99797A, // 9: Window borders + $8CD5FF, $55ADFF, // 10, 11: Item Checked + $4E91FE, $8ED3FF, // 12, 13: Item Pushed + $CCF4FF, $91D0FF, // 14, 15: Item HotTrack + $F1E9E8, $CDB9BA, // 16, 17: OpenToolbarItem + $988B8A, // 18: Button external border + clWhite, $B0A7A6, // 19, 20: Button internal borders + $FFFFFF, // 21: Grip/Separator soft color + $B59799), // 22: Panel/CheckBox/Tabs/ProgressBar/TrackBar borders + + ($A7D9D9, $E4F2F0, // 0, 1: Dock + $DEF7F4, $91C6B7, // 2, 3: Toolbar + $588060, $A7D9D9, // 4, 5: Toolbar borders + $EEF4F4, // 6: Popup + $5E8D75, // 7: Popup borders + $385D3F, // 8: Item borders + $5E8674, // 9: Window borders + $8CD5FF, $55ADFF, // 10, 11: Item Checked + $4E91FE, $8ED3FF, // 12, 13: Item Pushed + $CCF4FF, $91D0FF, // 14, 15: Item HotTrack + $D5F0EC, $9FCEC2, // 16, 17: OpenToolbarItem + $5B8479, // 18: Button external border + $E3FFFA, $86ADAA, // 19, 20: Button internal borders + $DEF7F4, // 21: Grip/Separator soft color + $91C6B7) // 22: Panel/CheckBox/Tabs/ProgressBar/TrackBar borders + ); +var + Luna: TSpTBXLunaScheme; +begin + if FDefaultColorScheme <> lusUnknown then + Luna := FDefaultColorScheme + else + Luna := SpGetLunaScheme; + + if Luna <> lusUnknown then + FColors := Office2003Colors[Luna] + else begin + // Use adapted colors + // 0, 1: Dock + FColors[0] := clBtnFace; + FColors[1] := SpBlendColors(clBtnFace, clWindow, 35); + // 2, 3: Toolbar + FColors[2] := SpBlendColors(clBtnFace, clWindow, 20); + FColors[3] := SpBlendColors(clBtnFace, clWindow, 95); + // 4, 5: Toolbar borders + FColors[4] := SpBlendColors(clBtnShadow, clWindow, 70); + FColors[5] := SpBlendColors(clBtnFace, clWindow, 62); + // 6: Popup + FColors[6] := SpBlendColors(clBtnFace, clWindow, 15); + // 7: Popup borders + FColors[7] := SpBlendColors(clBtnFace, clBtnShadow, 20); + // 8: Item borders + FColors[8] := clHighlight; + // 9: Window borders + FColors[9] := SpBlendColors(clBtnText, clBtnShadow, 15); + // 10, 11: Item Checked + FColors[10] := SpBlendColors(clHighlight, SpBlendColors(clBtnFace, clWindow, 50), 10); + FColors[11] := FColors[10]; + // 12, 13: Item Pushed + FColors[12] := SpBlendColors(clHighlight, clWindow, 50); + FColors[13] := FColors[12]; + // 14, 15: Item HotTrack + FColors[14] := SpBlendColors(clHighlight, clWindow, 30); + FColors[15] := FColors[14]; + // 16, 17: OpenToolbarItem + FColors[16] := SpBlendColors(clBtnFace, clWindow, 16); + FColors[17] := SpBlendColors(clBtnFace, clWindow, 42); + // 18: Button external border + FColors[18] := FColors[4]; + // 19, 20: Button internal borders + FColors[19] := FColors[5]; + FColors[20] := SpBlendColors(clBtnShadow, clWindow, 40); + // 21: Grip/Separator soft color + FColors[21] := clWhite; + // 22: Panel/CheckBox/Tabs/ProgressBar/TrackBar borders + FColors[22] := SpBlendColors(clBtnShadow, clWindow, 70); + end; +end; + +procedure TSpTBXOffice2003Skin.FillOptions; +var + IsUnknownLuna: Boolean; +begin + //---- Skin Properties ----// + + SkinName := 'Office 2003'; + OfficeMenuSeparator := True; + + //---- Colors ----// + + FillColors; + IsUnknownLuna := FColors[0] = clBtnFace; + + //---- Single State ----// + Options(skncDock, sknsNormal).Body.Fill(2, FColors[0], FColors[1], clNone, clNone); + + Options(skncDockablePanel, sknsNormal).Body.Fill(0, FColors[6], clNone, clNone, clNone); + Options(skncDockablePanel, sknsNormal).Borders.Fill(0, FColors[3], FColors[3], clNone, clNone); + + Options(skncDockablePanelTitleBar, sknsNormal).Body.Fill(1, FColors[2], FColors[3], clNone, clNone); + Options(skncDockablePanelTitleBar, sknsNormal).Borders.Fill(0, FColors[6], FColors[6], clNone, clNone); + + Options(skncPanel, sknsNormal).Body.Fill(0, FColors[6], clNone, clNone, clNone); + Options(skncPanel, sknsNormal).Borders.Fill(2, FColors[22], FColors[22], clNone, clNone); + + Options(skncPopup, sknsNormal).Body.Fill(0, FColors[6], clNone, clNone, clNone); + Options(skncPopup, sknsNormal).Borders.Fill(0, FColors[7], FColors[7], clNone, clNone); + + Options(skncStatusBar, sknsNormal).Body.Fill(1, FColors[2], FColors[3], clNone, clNone); + + Options(skncSplitter, sknsNormal).Body.Fill(1, FColors[2], FColors[3], clNone, clNone); + + Options(skncToolbar, sknsNormal).Body.Fill(1, FColors[2], FColors[3], clNone, clNone); + Options(skncToolbar, sknsNormal).Borders.Fill(2, FColors[5], FColors[4], clNone, clNone); + + Options(skncWindow, sknsNormal).Body.Fill(0, FColors[6], clNone, clNone, clNone); + Options(skncWindow, sknsNormal).Borders.Fill(0, FColors[9], FColors[9], FColors[9], FColors[9]); + + Options(skncWindowTitleBar, sknsNormal).Body.Fill(0, FColors[9], clNone, clNone, clNone); + if IsUnknownLuna then + Options(skncWindowTitleBar, sknsNormal).TextColor := clBtnHighlight; + + //---- Elements ----// + Options(skncGutter, sknsNormal).Body.Fill(2, FColors[2], FColors[3], clNone, clNone); + + Options(skncToolbarGrip, sknsNormal).Body.Fill(0, FColors[4], FColors[21], clNone, clNone); + + Options(skncStatusBarGrip, sknsNormal).Body.Fill(0, FColors[4], FColors[21], clNone, clNone); + + Options(skncSeparator, sknsNormal).Body.Fill(0, FColors[4], FColors[21], clNone, clNone); + + //---- Buttons ----// + Options(skncToolbarItem, sknsHotTrack).Body.Fill(1, FColors[14], FColors[15], clNone, clNone); + Options(skncToolbarItem, sknsHotTrack).Borders.Fill(0, FColors[8], FColors[8], clNone, clNone); + Options(skncToolbarItem, sknsPushed).Body.Fill(1, FColors[12], FColors[13], clNone, clNone); + Options(skncToolbarItem, sknsPushed).Borders.Fill(0, FColors[8], FColors[8], clNone, clNone); + Options(skncToolbarItem, sknsChecked).Body.Fill(1, FColors[10], FColors[11], clNone, clNone); + Options(skncToolbarItem, sknsChecked).Borders.Fill(0, FColors[8], FColors[8], clNone, clNone); + Options(skncToolbarItem, sknsCheckedAndHotTrack).Body.Fill(1, FColors[12], FColors[13], clNone, clNone); + Options(skncToolbarItem, sknsCheckedAndHotTrack).Borders.Fill(0, FColors[8], FColors[8], clNone, clNone); + + Options(skncOpenToolbarItem, sknsNormal).Body.Fill(1, FColors[16], FColors[17], clNone, clNone); + Options(skncOpenToolbarItem, sknsNormal).Borders.Fill(0, FColors[7], FColors[7], clNone, clNone); + + CopyOptions(skncToolbarItem, skncMenuBarItem); + + CopyOptions(skncToolbarItem, skncMenuItem); + + Options(skncButton, sknsNormal).Body.Fill(1, FColors[2], FColors[3], clNone, clNone); + Options(skncButton, sknsNormal).Borders.Fill(1, FColors[18], FColors[18], FColors[19], FColors[20]); + Options(skncButton, sknsDisabled).Body.Fill(1, FColors[2], FColors[3], clNone, clNone); + Options(skncButton, sknsDisabled).Borders.Fill(1, FColors[18], FColors[18], FColors[19], FColors[20]); + Options(skncButton, sknsHotTrack).Body.Fill(1, FColors[14], FColors[15], clNone, clNone); + Options(skncButton, sknsHotTrack).Borders.Fill(1, FColors[18], FColors[18], FColors[19], FColors[20]); + Options(skncButton, sknsPushed).Body.Fill(1, FColors[12], FColors[13], clNone, clNone); + Options(skncButton, sknsPushed).Borders.Fill(1, FColors[18], FColors[18], FColors[19], FColors[20]); + Options(skncButton, sknsChecked).Body.Fill(1, FColors[10], FColors[11], clNone, clNone); + Options(skncButton, sknsChecked).Borders.Fill(1, FColors[18], FColors[18], FColors[19], FColors[20]); + Options(skncButton, sknsCheckedAndHotTrack).Body.Fill(1, SpLighten(FColors[12], 15), FColors[13], clNone, clNone); + Options(skncButton, sknsCheckedAndHotTrack).Borders.Fill(1, FColors[18], FColors[18], FColors[19], FColors[20]); + + CopyOptions(skncToolbarItem, skncListItem); + + CopyOptions(skncToolbarItem, skncCheckBox); + Options(skncCheckBox, sknsNormal).Borders.Fill(0, FColors[22], FColors[22], clNone, clNone); + Options(skncCheckBox, sknsDisabled).Borders.Fill(0, FColors[22], FColors[22], clNone, clNone); + + CopyOptions(skncCheckBox, skncRadioButton); + + //---- Editors ----// + Options(skncEditFrame, sknsNormal).Borders.Fill(1, clNone, clNone, FColors[3], FColors[3]); + Options(skncEditFrame, sknsDisabled).Borders.Fill(1, clNone, clNone, clBtnShadow, clBtnShadow); + Options(skncEditFrame, sknsHotTrack).Borders.Fill(1, clNone, clNone, FColors[8], FColors[8]); + + CopyOptions(skncToolbarItem, skncEditButton); + Options(skncEditButton, sknsNormal).Body.Fill(1, FColors[2], FColors[3], clNone, clNone); + Options(skncEditButton, sknsNormal).Borders.Fill(0, clWindow, clWindow, clNone, clNone); + + //---- Tabs ----// + Options(skncTab, sknsHotTrack).Body.Fill(1, FColors[14], FColors[15], clNone, clNone); + Options(skncTab, sknsHotTrack).Borders.Fill(0, FColors[22], FColors[22], clNone, clNone); + Options(skncTab, sknsChecked).Body.Fill(0, FColors[6], clNone, clNone, clNone); + Options(skncTab, sknsChecked).Borders.Fill(0, FColors[22], FColors[22], clNone, clNone); + Options(skncTab, sknsCheckedAndHotTrack).Body.Fill(1, FColors[14], FColors[15], clNone, clNone); + Options(skncTab, sknsCheckedAndHotTrack).Borders.Fill(0, FColors[22], FColors[22], clNone, clNone); + + // TabBackground: Only Normal state is used + Options(skncTabBackground, sknsNormal).Body.Fill(0, FColors[6], clNone, clNone, clNone); + Options(skncTabBackground, sknsNormal).Borders.Fill(0, FColors[22], FColors[22], clNone, clNone); + + //---- ProgressBar ----// + // ProgressBar: Only Normal and HotTrack states are used + // HotTrack represents the selection + Options(skncProgressBar, sknsNormal).Body.Fill(0, FColors[6], clWhite, clNone, clNone); + Options(skncProgressBar, sknsNormal).Borders.Fill(0, FColors[22], FColors[22], clNone, clNone); + Options(skncProgressBar, sknsHotTrack).Body.Fill(0, FColors[0], clNone, clNone, clNone); + Options(skncProgressBar, sknsHotTrack).Borders.Fill(0, FColors[22], FColors[22], clNone, clNone); + + //---- TrackBar ----// + // TrackBar: Only Normal and HotTrack states are used + // HotTrack represents the selection + CopyOptions(skncProgressBar, skncTrackBar); + + // TrackBarButton: Only Normal and Pushed states are used + Options(skncTrackBarButton, sknsNormal).Body.Fill(0, FColors[0], clNone, clNone, clNone); + Options(skncTrackBarButton, sknsNormal).Borders.Fill(0, FColors[22], FColors[22], clNone, clNone); + Options(skncTrackBarButton, sknsPushed).Body.Fill(1, FColors[12], FColors[13], clNone, clNone); + Options(skncTrackBarButton, sknsPushed).Borders.Fill(0, FColors[22], FColors[22], clNone, clNone); + + //---- Header ----// + Options(skncHeader, sknsNormal).Body.Fill(1, FColors[2], FColors[3], clNone, clNone); + Options(skncHeader, sknsNormal).Borders.Fill(0, FColors[19], FColors[20], clNone, clNone); + Options(skncHeader, sknsHotTrack).Body.Fill(1, FColors[14], FColors[15], clNone, clNone); + Options(skncHeader, sknsHotTrack).Borders.Fill(0, FColors[19], FColors[20], clNone, clNone); +end; + +procedure TSpTBXOffice2003Skin.SetDefaultColorScheme(const Value: TSpTBXLunaScheme); +begin + if FDefaultColorScheme <> Value then begin + FDefaultColorScheme := Value; + Reset; + FillOptions; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXOffice2007Skin } + +procedure TSpTBXOffice2007Skin.FillOptions; +begin + //---- Skin Properties ----// + + SkinName := 'Office 2007'; + OfficeMenuSeparator := True; + + //---- Colors ----// + + FillColors; + + //---- Single State ----// + Options(skncDock, sknsNormal).Body.Fill(7, FColors[0], FColors[1], FColors[2], FColors[3]); + + Options(skncDockablePanel, sknsNormal).Body.Fill(1, FColors[13], FColors[14], clNone, clNone); + Options(skncDockablePanel, sknsNormal).Borders.Fill(0, FColors[11], FColors[11], FColors[12], FColors[12]); + + Options(skncPanel, sknsNormal).Body.Fill(1, FColors[13], FColors[14], clNone, clNone); + Options(skncPanel, sknsNormal).Borders.Fill(1, FColors[11], FColors[11], FColors[12], FColors[12]); + + Options(skncPopup, sknsNormal).Body.Fill(0, clWhite, clNone, clNone, clNone); + Options(skncPopup, sknsNormal).Borders.Fill(0, $C0C0C0, $C0C0C0, clNone, clNone); + + Options(skncStatusBar, sknsNormal).Body.Fill(7, FColors[7], FColors[8], FColors[9], FColors[10]); + Options(skncStatusBar, sknsNormal).TextColor := FColors[6]; // This overrides the Items text color + + CopyOptions(skncStatusBar, skncDockablePanelTitleBar); + + CopyOptions(skncDock, skncSplitter); + + Options(skncWindow, sknsNormal).Body.Fill(1, FColors[13], FColors[14], clNone, clNone); + Options(skncWindow, sknsNormal).Borders.Fill(0, FColors[15], FColors[16], FColors[17], FColors[16]); + + CopyOptions(skncStatusBar, skncWindowTitleBar); + + //---- Elements ----// + Options(skncGutter, sknsNormal).Body.Fill(0, $EEEEE9, clNone, clNone, clNone); + Options(skncGutter, sknsNormal).Borders.Fill(0, $C5C5C5, clNone, clNone, clNone); + + Options(skncToolbarGrip, sknsNormal).Body.Fill(0, FColors[4], FColors[5], clNone, clNone); + + Options(skncStatusBarGrip, sknsNormal).Body.Fill(0, FColors[4], FColors[5], clNone, clNone); + + Options(skncSeparator, sknsNormal).Body.Fill(0, FColors[4], FColors[5], clNone, clNone); + + //---- Buttons ----// + Options(skncToolbarItem, sknsHotTrack).Body.Fill(7, $DBFDFF, $95E7FF, $4CD7FF, $96E7FF); + Options(skncToolbarItem, sknsHotTrack).Borders.Fill(1, $9BCFDD, $9BCFDD, $D2FBFF, $B3FAFF); + Options(skncToolbarItem, sknsPushed).Body.Fill(7, $70BAFC, $59A5F3, $388FEF, $64CDFD); + Options(skncToolbarItem, sknsPushed).Borders.Fill(1, $65818E, $AEBDC3, $66C1FA, $66C1FA); + Options(skncToolbarItem, sknsChecked).Body.Fill(7, $A8D6FE, $61AFFC, $329BFB, $ACF0FF); + Options(skncToolbarItem, sknsChecked).Borders.Fill(1, $65818E, $AEBDC3, $66C1FA, $66C1FA); + Options(skncToolbarItem, sknsCheckedAndHotTrack).Body.Fill(7, $70BAFC, $59A5F3, $388FEF, $64CDFD); + Options(skncToolbarItem, sknsCheckedAndHotTrack).Borders.Fill(1, $65818E, $AEBDC3, $66C1FA, $66C1FA); + + CopyOptions(skncToolbarItem, skncMenuBarItem); + + CopyOptions(skncToolbarItem, skncMenuItem); + + CopyOptions(skncToolbarItem, skncButton); + Options(skncButton, sknsNormal).Body.Fill(1, FColors[13], FColors[14], clNone, clNone); + Options(skncButton, sknsNormal).Borders.Fill(1, FColors[11], FColors[11], FColors[12], FColors[12]); + Options(skncButton, sknsDisabled).Body.Fill(1, FColors[13], FColors[14], clNone, clNone); + Options(skncButton, sknsDisabled).Borders.Fill(1, FColors[11], FColors[11], FColors[12], FColors[12]); + + CopyOptions(skncToolbarItem, skncListItem); + + CopyOptions(skncToolbarItem, skncCheckBox); + Options(skncCheckBox, sknsNormal).Borders.Fill(1, FColors[11], FColors[11], clNone, clNone); + Options(skncCheckBox, sknsDisabled).Borders.Fill(1, FColors[11], FColors[11], clNone, clNone); + + CopyOptions(skncCheckBox, skncRadioButton); + + //---- Editors ----// + Options(skncEditFrame, sknsNormal).Borders.Fill(1, clNone, clNone, FColors[4], FColors[4]); + Options(skncEditFrame, sknsDisabled).Borders.Fill(1, clNone, clNone, FColors[4], FColors[4]); + Options(skncEditFrame, sknsHotTrack).Borders.Fill(1, clNone, clNone, FColors[4], FColors[4]); + + CopyOptions(skncToolbarItem, skncEditButton); + + //---- Tabs ----// + Options(skncTab, sknsHotTrack).Assign(Options(skncButton, sknsHotTrack)); + Options(skncTab, sknsChecked).Body.Fill(0, FColors[13], clNone, clNone, clNone); + Options(skncTab, sknsChecked).Borders.Fill(1, FColors[11], FColors[11], FColors[12], FColors[12]); + Options(skncTab, sknsCheckedAndHotTrack).Assign(Options(skncButton, sknsHotTrack)); + + // TabBackground: Only Normal state is used + Options(skncTabBackground, sknsNormal).Assign(Options(skncButton, sknsNormal)); + + //---- ProgressBar ----// + // ProgressBar: Only Normal and HotTrack states are used + // HotTrack represents the selection + Options(skncProgressBar, sknsNormal).Body.Fill(0, FColors[5], clWhite, clNone, clNone); + Options(skncProgressBar, sknsNormal).Borders.Fill(1, FColors[2], FColors[2], clNone, clNone); + Options(skncProgressBar, sknsHotTrack).Body.Fill(7, $DBFDFF, $95E7FF, $4CD7FF, $96E7FF); + Options(skncProgressBar, sknsHotTrack).Borders.Fill(1, FColors[2], FColors[2], clNone, clNone); + + //---- TrackBar ----// + // TrackBar: Only Normal and HotTrack states are used + // HotTrack represents the selection + CopyOptions(skncProgressBar, skncTrackBar); + + // TrackBarButton: Only Normal and Pushed states are used + Options(skncTrackBarButton, sknsNormal).Assign(Options(skncToolbarItem, sknsChecked)); + Options(skncTrackBarButton, sknsPushed).Assign(Options(skncToolbarItem, sknsPushed)); + + //---- Header ----// + Options(skncHeader, sknsNormal).Body.Fill(1, FColors[13], FColors[14], clNone, clNone); + Options(skncHeader, sknsNormal).Borders.Fill(0, FColors[11], FColors[11], FColors[12], FColors[12]); + Options(skncHeader, sknsHotTrack).Body.Fill(7, $DBFDFF, $95E7FF, $4CD7FF, $96E7FF); + Options(skncHeader, sknsHotTrack).Borders.Fill(0, $7E99A9, $7E99A9, $D2FBFF, $D2FBFF); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXOffice2007BlueSkin } + +procedure TSpTBXOffice2007BlueSkin.FillColors; +const + ColorConst: TSpTBXOffice2007Colors = ( + $F4E6DB, $F0DECF, $EDD9C9, $FFF2E7, // 0, 1, 2, 3: Dock + $D6AE90, $FFFFFF, // 4, 5: Separator + clNone, // 6: StatusBar Text Color + $F9E6D7, $F7D7BF, $F5D0B4, $F7E5D6, // 7, 8, 9, 10: StatusBar + $EDC4A5, $FEF6ED, // 11, 12: Button Borders + $FEF9F6, $FBE7D9, // 13, 14: Button Normal + $825A3B, $E1C6B1, $F7D9C2 // 15, 16, 17: Window Borders + ); +begin + FColors := ColorConst; + SkinName := 'Office 2007 Blue'; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXOffice2007BlackSkin } + +procedure TSpTBXOffice2007BlackSkin.FillColors; +const + ColorConst: TSpTBXOffice2007Colors = ( + $DDD8D5, $CFC6C1, $C5BBB4, $EAEAEA, // 0, 1, 2, 3: Dock + $989898, $CCCCCC, // 4, 5: Separator + clWhite, // 6: StatusBar Text Color + $524743, $463E3B, $30302F, $454545, // 7, 8, 9, 10: StatusBar + $B4B0AE, $DBD4D0, // 11, 12: Button Borders + $E5E0DD, $CFC6C1, // 13, 14: Button Normal + $2F2F2F, $4D4D4D, $666666 // 15, 16, 17: Window Borders + ); +begin + FColors := ColorConst; + SkinName := 'Office 2007 Black'; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXOffice2007SilverSkin } + +procedure TSpTBXOffice2007SilverSkin.FillColors; +const + ColorConst: TSpTBXOffice2007Colors = ( + $DDD8D5, $CFC6C1, $C5BBB4, $EAEAEA, // 0, 1, 2, 3: Dock + $AAA6A2, $FFFFFF, // 4, 5: Separator + clNone, // 6: StatusBar Text Color + $EBE8E7, $C2B7B1, $B6AFA9, $CEC9C7, // 7, 8, 9, 10: StatusBar + $B4B0AE, $DBD4D0, // 11, 12: Button Borders + $E5E0DD, $CFC6C1, // 13, 14: Button Normal + $989898, $BABABB, $DEDDDE // 15, 16, 17: Window Borders + ); +begin + FColors := ColorConst; + SkinName := 'Office 2007 Silver'; +end; + +initialization + SkinManager.SkinsList.AddSkin('Aluminum', TSpTBXAluminumSkin); + SkinManager.SkinsList.AddSkin('Athen', TSpTBXAthenSkin); + SkinManager.SkinsList.AddSkin('Dream', TSpTBXDreamSkin); + SkinManager.SkinsList.AddSkin('Eos', TSpTBXEosSkin); + SkinManager.SkinsList.AddSkin('Human', TSpTBXHumanSkin); + SkinManager.SkinsList.AddSkin('Leopard', TSpTBXLeopardSkin); + SkinManager.SkinsList.AddSkin('Xito', TSpTBXXitoSkin); + { Office } + SkinManager.SkinsList.AddSkin('Office XP', TSpTBXOfficeXPSkin); + SkinManager.SkinsList.AddSkin('Office 2003', TSpTBXOffice2003Skin); + SkinManager.SkinsList.AddSkin('Office 2007 Blue', TSpTBXOffice2007BlueSkin); + SkinManager.SkinsList.AddSkin('Office 2007 Black', TSpTBXOffice2007BlackSkin); + SkinManager.SkinsList.AddSkin('Office 2007 Silver', TSpTBXOffice2007SilverSkin); + +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXDkPanels.dcu b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXDkPanels.dcu new file mode 100644 index 0000000000000000000000000000000000000000..6c0cc6f24decdbc42899f06ecdb9ec7677a8a1ed GIT binary patch literal 114571 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 z z8zWKF@|>xY7_UujU5G&Rkjm z%>|er@i>~ap-LSlvWOM@K@S_p^v7WUTyE+eByzGV2BGrV`A_IuAi<(iqVGBs_E0`M z<;(s*mra;`Yyyh?uw6Gh18f58Ny6=BeM&JKP;@y>D{27A=k*|HwxkrXc8gOlcNT$u zmmp{ta9S2(+wL#%xZ=EC=d92hoG-H_>2HkXq%tc84M6OI%FNg=LlmCH5!)ZLG5yns z!GG9Ar=i&w^-iZx?{SuZx>amay{Zp7J#1OJ%2uQr1n8dhIKurpozIOpuR)f+j)oq^ zXwE>%O7|Cl5+vOi=oJj`I#AKiMSaQ%lWhq=*X;VNQ^$NP`hv5XE$NT59i3LPyJ3t^ zAq2pYe0|MX%C1+j=kGP9b83IZI0^g;)~A1*O`1<)LCIs&s565wixvEa&YnNT7M#!V z6lBhF4Y|v}D>a(PV?oO$_RMFE+}TV6McMWXEDz~nS7yB^6~itc`&@vLQ$lOui*9y3 zkF82}_W5e|r3&^(KVxgoQwX{2%Wn2(gk)!5q-vR@oBerF#+`|~Fr!C7vXcnadaJA2 znA(*rr&?VVY}j4|E>(%GXn?$+5~Pe}n7S_EeSU$(F{)eoBXr(1`YUF0kot;TJ?T1Q z^x$J_(#32qNf*fjnbY$u%^pFh5|f$U3iVOfFN`{5Yk#fJx}IT?oI>_YF?;4gq@W76 zOZuwolD_LYqeF`TI|a+~G$f=5;c-aCImA~G?$(3u8+y!rw_fiq1DTzAqq`VlUdbMX z53H2zOL`uX@EFWz*}4?aJKO;l)SP<44fo0&(9>?aK8$$Gt?82pGwwn*3kx%kcoOlF z`!QB-%gs0g=P;r?R`0H2&%o=Z=+fS}x7`mLlY7h{#-5M5?IxPQpS&By#~R7puvOJy z6RjEdBYzzsfb`h|%t@wmPVI0f3Bk0!X=f z&{M&lvFPOsKE0GVL9%q;VTs>cHd3p^0vXp6G0_j#b37?W)IbY{bNPF^RDhU6%1dJ$o{M6`>A z7|}uUfuPcN;Qc>jP%{^cNTojEaq80^w?2mv5|dxKTkJ&DF1dvDVB?s;F#6E7}Zfu>+@V^uRHZs&wWVlFn!kphaT-Mcz$1(y~XU&OS<2Ck-6j= zmPV0mDQ1m6+K2oJgc|0T?~9*;FlW=BW2+uJoAW@JF)X%5uQ{F;M z_Ty;bV;DfbKIhFt{xb3~2vD23;)>{LJ zp#X3LB;<4(d(j*ilzR);O|5M#q@0Cky3RWtWVT(`* zU)lnUDvX|L>X>6GaPp9scx?|3g*42d7!aQ%{Q{Fhc`?tsndKdZ^(DX|C}+|;yvGc_ zoAOTdjJ;GI`lXTCnH!FzTT*_`e2R`7`sMVI?q*IY04pDr-wevboVB}KEFzW$U zDFqY**Umzc#scsK6_{%$Xdhxu@FExUaHF4mBbEa2@xUF)3HnOF(J&|AC}$-Pdf~AJ z6zB5*1&I2fN=V5^Da~yk768nRd`QaEJfOXk>6Vb>hPH+P%_qJnMbdp3lYKv6zWL}= z`T?u9gM%f&Eae>Z0lShtq&)>cg=739E3sqsEU^@^$CV1{BF0^!RAB@)d=xYm%mky( zl`d71yk%%-ND9VX$WwNV%r52sl!Zz-P3`PK>=aJ|Kg2Gvd-+(aAR{HLOe?ZDae|O5 zJ@kE6<904HjtT(&UAA0Ckx#n!|70Pzj-mjz7{y#Rilr(k1eqg9A%_GQhiOE4%uCaZ z82t1Q2H|tbA?#eK6tyiFtDEzf`0U1LO6=8GsNKM};GYjtPr37;xDWifTXUkNQ{c== zq!eB!ph+xOXXt~Pc*XtBus<;z!G4S3H8D;A+(g816MB~CZ75rdv3|@ zK93pF$VjuOeXQoPsk&(D9QP4|G`n31lJ!EXXa()oOri(HJ0wmf|fZFBH3m6D+Jh&}j`&JI0~GA(D{R5o=l%4(uLA z$^%Mypp$N?8WeDYs{zCmN^rVBsX}%Je<9Ndr|_4g5V+7;(12uJ`A6QSF4+~upaKNP zhuQkD%XfocBn6d_o+?)K4mgyN6AKGqny@fR2y%&WfJ%A9Iaa6?OJ&dl$QbAhd%@sP z5GN2qC@%sJ3Rxk_p1~MEVJtWj`piZB;$KUOqLhKg)LsddLlPv+gho*)6tp1vb721~#W*}*=bL^^}rGWsKH11z_O**J;2G#l_nDT8IAdHbYOQjHYwkUeor#ehDJ5s*cL z^|F+}qJ@as>@wQIIHi2pqYy@$uT%h-APuC z){H#K4!Pobrxa1CpoY@%AO@W0Di+S?<4gR~s#p3 z1TY&NDT)iF5Dv3Kkk2Ce2dbV&FN8%_%n5DHrYty9tH6kLj0SaK4+2~ZN`YSjJt(!f zVRbPJ$fg}y;~`@J8TO%+?Dd0aJ0Dy%az)A&=xaV&C}Q`+9x-+jGqLvz`;q~2SS}X&9%fL0Xm>n_v zIg*hZ(Aa!VVGrymt&JofBz47T!TwJ$mKY7Kw4nGqv_8{n=lc~V2)KdkgI;5+g+Q{J z_fuAA=PPIk8bRYNgw0X72NKZ8V&~CpF>lBcj@8IcmSG*%m1&w5H{CE5rP?HH4NV^- zz8|Zx8@3>mg2dl4U-aQ&*zsfB_d-%apgE1H5cCtt*lRnRS!f+uzb z`UCD^)rGdwN>4bD4J8C_c~BQR4R06gAJUcVL9El{3($&zv7u$3Qi0jfnvNVK2@)&i zqlFTs45I{80-*q{Mj3P+b5KxzFZjVV34dXewMypm8_EPN4CHRz ztzE(7+$3To3>Y?+ahfI^G&ifp;La;&Ejm~fz;wv@D%JBOG7?xkAd(8ZfGK0*Sb*>s zX5MZXeqhr-T9l|CVl%PRPR z5AD%G#%kbHfH0n4pM=dX%%rOo1$Mj!wTTF1xnUn*&&qJ!*jY&;Op;_p z$7)Bu2d%XMNHb#62QDIpeX8d6iTG3k3s=N(Nwz&)_N%cv`oPbAW;q#^VF_=as{aO$v@MZ?j_!~@u8Bwb#--T$xWcMRlG5uo! zq7nJy^n-3m<&UC>=GBTgqA3jx2*Nae3J%eXCbS}&)r59LbDD7fjzfqZWy~xfD$@Hak5bR3*)GoY=F}0(rp0XCbT{T~S_DaGz!l1nEZBEVjck~S(z3L6 z*jzjt*~FTMp?Y;O&zl#?>&P3)8_k=`+sRV|&#tM7EucA<$!nT4O`BFt>!wZ9rbY4y zO>8VL7;Mf@=O;>*OJ*Y55p&s=MX+F=Gi;GXOiPF6DcgqRv@_=2IEP^ILWfozQm75~o4sYin(JE=e6hn!39vQ_WOtTJO zr?1D?>+ACk_>#WiLnA2AbYTVri+V-h%As`tESfOO{HBK7f!tw5kakUTEQZE)MWDo- zcZ37ySsj3OMWDo**Xs}zX%U=@`J206uOS}SZ=k=39&tF34W^Q0x|-10td6l`*u?MPcnOdVCDT1*>K9>(BS*{-*V z8eC;7Y#RjiF=2&`DkOD8?*ggOyX1}fI>H5nwFZ(k0xMS%R#~mLj$rFRTLLVg2y3j) z+jC?{c^oZoverZMRKCg9StEv;$AoqE4h?6MZ86z2YnqZ~rEf`?XosNi!1_^Bd5>1US9i2SC>Lu*v*hZc{c z{|Y8}Aug4Q;5Q|ThKh!iF90oU3VU@L0*UXA%7ObQXflSl*a?&}2Ib+B0Er%wwm}JQ%ZwE#+f$f@FOkCC4ObOE< zOwpQY%d~AWOE$?bxvWeQ+5mQ0CAR>hn7fWAkFwwFFYrhFG5?5m4h?jfnu)_*rcTpN zuFI-OLZ^uuKaW8sOq;olRGI+VDoQmbbeTpq!9ry{rfJRVuSYxgqMaU78)5dK!0UHe zEs~Jn?Oa4Vy`~0#7nSw`tsbR16HuFLQ=e%@8d2u7DC|d%btZS%KV3SaT|%t^(|m3n z)fzAX3BB7Tp^vxu1o}&w?8KC$DUBJ*a!_{ZO?uM4oipimS)G!QG%e(gXpaLk4Fcdt zDAJ}ywBb>NK~q7nH-AKX8f8N$^GU*xX(<=qWGKS8X+)X{jA^7M|6s7bYV5?XX+#8s)l?gK!B8+#6|Wl89!6(V zrfHha6!FRLx8ld~CruHJjMtQ@*Iz4Br&Fd`SFhh+J;s?cZAw#(X^!BxN=%qCjcK?d zHqDqOsAL9<&jQ*~m@ti!kD;wOQ>VX|%I2W^?I_bEVb(Mg7$Mj^iU$D$d*)2Gz&Mwo zWm7~USz0!QtxOkIO`_~7^_Iqubsh_oeO?27dy7Vj!dAs8teYB+PDi#Pou#&8o5!|* zp?QQ&Q+X&F>Nq+T*^H!1&Bs=bt)jqU5w=Y6g6)FNis6c|Rrd(nCOI#f=L$9i>+|I! z)Mi)76V&w%y0+`Wj%nE46-Wd|BBK}*hzUiJYNa}VOe&!n~N$?m>5F zU@Q{0x-~(R+9K_dIb=K@!O)MLK*M2wUNCPWZ!)ho7`FO!!3^z{4{wz=l{J^)6B=EB zn#ktEo29*FePt7z=`N{2UQ-fkm<%mtcEe#SmV8fa~x!LCXO*mxQgwFej2NZzX>>2hb?sa(UQVq6pS2WSMa3Q4GydgK{`)dN}wSfwP? zNqzD>!Qz0n0#+pn_0oWxmdO^xrB2B#j}(uVb`VYjutv~lwIsv=PY|pT&>6sLG@(Hn zl!p&@6_+bC)<(%DFBkU_P7|<}fpbz42%08XGoVmG>nTYfZCq2SPP3Gj#iPSi-U18} z<2i$0BLK98h|&tExfGw@NJ5Jw%IySe1GE6Jvy#w?Id>7P9ngBf&cRG#&buq zl)ph3eNvDx27t2wjQg3;C;gBx2BgjM9}&iYR8AO4;A{fpK_(1He@_@msj=csBT*Zu zC!92}8lk0E7=FO!AE_uUO;!AuT1iVygfR%5DPTOrgtW9G6UvY@7zkS*_6U?13JeEE z0^@<^!{d4WU^F<%P1~?E29!rU0wu-+6M@OVRA4qR2f1!K9JW5{5k{nP*Lv;@2hIl; z0*iqq)OgGzj7qmU-(zsU!`6?vg)wQ|I%%DG@unn#hOLjo+DfBJ0~Jn7^M`{@6i%af7KKm1u%fV@3TLF`VKWuZptuW#S7BRG z*u)@tv(oUfy0TH?;w&LR0-j{TjPwq9c?;4=xlEK=K;aPRjc=Z3r7-FFB4CY2!q!hn z!h)2p;I?g1T9Q^EpO8GcPacp5m2st&ke7gNE(}|rl7vO6tzsGuE4Z*MjZ)z_EK3b}T|w`WQ6)~3S(PS&Jv5nBAPvC^ehQAKG{xpjDBP45 zf`e4JiQ*X)KEs4nsZJ)to3&pt?#1@Hrd_i|*t%iSGfHCWY*9SC9S+t6X#`tnV;eT> z(-vVqmEv&eC|dQ8tJ1J}U`Z(qv$jU^{>|0Q)&f*p@c23RPo%qP#>ciSmxr z2Zg@IgdLdr-IaB zl3y^G-1kh@)VK3POg;;ARK?hgj#u2simTNd6tUmQKc3| z_^FdR`8|^HdO2D=&Bn-qjmv|@jYP9Jy!%*j*oq(0t(PYh@+0DMgWMQNMn)AsvARKS zj>Jf68{|0PVJm*vAdVqlMp>gg7^$bSM$}27?9Z6cAW!nOtx;ZzjBED;t4UsoG!j;m zOu(@9&zaDO7RVWCmi<)H49S@!s+nr(XFHY^2YLV znqDjTxB?>m6)d&9T~wpyWLU_Nb3+-~m-&wL)vRb-c#wDgh?!?=*A!S0DRHl_#WgGjl5vtTFcgW%Vu=Q&& z>GEdTCJi+l{klcyk>kgjkF_3~gLm@^HsEsS zvEE|?$7YcITUcL6<2PVp5q%3*6cK*fA}yC&1ttuGu|Ec>Mv;Z%H!4rDP8oVOCQqro z=1p@e4ki3Kw%lOlcvU$$dMLn41JoEt4Y+sXXkeP5#)RBzZPq*VA^V7Z_wZcaeBNk& zIeF$2!1y^TOrnAX)(+W!0^_FS7Hc_q+*1Jj7l_8RTo7sw^@Pgt(XlWM;4E{)?8yn+ zfX(c5IS1XtM@El~Mar%CO{5u=&yo3=MXPSuGvwbvb`DwmaMBz`*(xDFkGziw^C?_5T{fkb;nUQx?wySaiE-UGra z5DHIuu+$r$d_O%iy8|uCb$LXL9`BgC%rv~ zh{|)Ib1C+-z^^xfuAscm5 z02`)W%atAUdJaYkkP(7Jm0dv2!!)6tFtrmyI~TAUMLt6LTI4Un9wA>&`8wq9g%Lsv z6Ex0xQy;Z#@)=v08RPdq5hw45Q zvnrY}q_nGz$J>y>c4S!TjHaW5(V^&YbSt_OO;!z6#jF;)FrtW6a+SGiw@N%ApQz_P z%&4+n8MEq6VN~fkzE-(jxmmeg>5clMF{|Aoj46p|Z!}%Cej;XdYQng(TD5dy85y@l zm{9tVSv#?Xtj8%#D&uPMMEb<`iLvUn>h?PhW(~Q8d1Wd(4d8gy1PbP==0S!+kFcODSFKhx zqxE=fq-LUKwq~g&W-YP{i%R|Rk($Yxxtisg&6)+yge45GSQC~Mxhe*-t#YC*E1l>X zyADd!9WUp5rxit1yVL}lDzykJN|)Mvytk$gSs3G0r9RpaU9M^Yt>FIfEmqBznO3xQ zr3Y={)P)jFH8@oUa8v08uu2gqQCrjKgMr>wwiFvUjD5wHGOEsb0o#F1Z^LA3;7TZC zY761*f<7_eVIQ#rd5I8ARCkp&39(t{m@OT-3ARIvb_8i`X_ou--*Y$s+hG$>_Q{okphh&oaE6T(1( zFv?Ye#7JKwp!NMuA*wd#Oy{&5Up^6y#bTSW9qOW1jj2IUh(CZ2z6@1iEylsMi2-37-sjd zQvgD=D_U3GSsjgy#)2Q(rSb+fuC9Y@k0?T1jaIFk;A&tTt+c5fYFb^Xti@DSGZ>6Cn)dAIy zp?w;z31(zRSz7Hq-brO?HK}%@>{<9L>J-g#5LDeo>(9aNs!I@pcH-ZVI;gflrLI|o zL3QxN&WX+Hh7YY0{;)cvEOnstJWsKe?iVAmyKSe0wG2sWyYs5^kcM;}o) zG2t5)VN~s{>N~N1q8oE~R@>zI0Ak*jI(x}V)kZ?-vGY50Lhw3BI^4Rgs zh=Ikk@bvIWRP3$3GzYP`Csx{f@tMZnV3;*z=^+zgI} z$HEKY#c;5!FE$XXBj0QZ72o)txKs5Svk z5O@oDcvKX@k=jNC2Wkfq{H9$*aF=AQj=Ur@q7b|aM1^oA5Wx@fB7*zlM+C1YhzQP2 zf%eX0XnIh7=VM0nIFI}`L1R&^*A)qG9WA#B3X5seuA!r&HbKH?Z;LsfAbU}-#kDDd z#5J#n-zdbj1`Yr5Fs)fzc6a0~ibP^^Q0^sSd}WW7IM4Sa$3dwbDs!k5(J#sA#j&J(o6B zSXYi|Vx^*!vPo^LumGql6jo$}rp-onB1uY)Yh)7fUA=;vOMf6yjL*|0++H^N z@!2)Q{Utt9hF7fNGh7Y#moj%Ors(*7MGNK>5Rv}BH3X05owThWr{QS-cc%Uo+|v&<1jr+Ll1Zf>@;Smp_%6T-c1 z7A*~yc1xFKf%@z+F9Nt_-Zj?)+-B*t?3!se-({Y#nDIf4%|$!;PWQHV{>UOHKN{Rb zg>6(3(Qqp&l~N6(^IFTeb>2FnFX&#|v>nF=67~;Nv|z4-%`KOaO=Bwa7-UkSdc)>| z9NVGcz;Ic6IVt7#@y5z2wod9Zj;S?R7A+%O9c_ok^2YPhywapOoa2XbZ$YsKqjS+= zI4o0aiEA;Rv)2-_(7XpMtCls(G+bw>=(IUv5plcJjZ3sybJQ|r+qI3`d)$q=L};im zSAQbeCT2(XmR^jxhsL}J`m9@`mAhsIhz7-idVxOUoORASr`&^~T{G>qsKkKJI~Sbk z&|+vQG|glg#~^E9#Hyvyx_Zb}Ia)PSHO=t$9?ETQ!3dkI&HOsUTRB!Wi>a(okwN2G zi}#TKP%^L?T7wN5Qa**zyKt8}Z)>raJLlYexzlWjrsu_M!-vK>feI{<9M>VD=MLyO z3=+*%8Iz3g%h)O5-&$vliPS7a#9f+1hb*3i5UG+us4p66wN-CE;7P3Qi%p93J zQeNOH^cQYXy$SGc*RoB`Pok%F^d(x&R+-nDwbZ)mTy>$z&}JxHymq`c+Edk_(nagM zW$Tb!RCjFpSb2GEMJ0&{4YtRYw2g!ByLnrn?ow35y+4&KSXPhJh0>uxG&L7m0Ph=l zGYgg--0hipL$Qh~IucvJ^rj#nn-F)}ST?C-3KuQght}?jm9&+I@!LQ|cp}4EkeVF| z4QHBdR_SPH$+CNB9k{^?vxQpRwJbZET{}lQDtoI2utHYTXl>TCKBKSdW?RG-v9CH? zU2{IO4i<#1%>_0c`X9E&tu5A8>xeabK6c=sF)?K1|6crk+ zS#cG0khB)EOKngEnE-VMFt`I&XC1W0^cLHut<#>cw>xE5t9zPt(jpeOPUHImo~WTA z$8l8Ag`CLAKyPU^E(r-O_U+lsBnPRAL)D#fzXf}`Cb<&V%t3*s9b zGE?!ZG9=op3)WxxK&}oP{Wkb|N~TM2H4Cec2~WXLEm-|JCPjC|)5t7gmaEnvVGLR) z&@2H8bQtQv%<=KBa?$Frwbs|7l4Fct&>-HATHEwV+m0>aZpvNAt1p-l{0+CulhylHhxVdc|)$57y+twz1T3^v+Ti6!Yp<$xlpijXV zFYBVsYb&sYskW$3;!F8mJ!s?dFXC#v)81#_c9N;5X9cx~BGjR%d-b4RPDxpJ!7N0H z5@y{GXn{V#Pkp_5_K{00*cBWIZUxQxXck2B>)sDF;2Kh)I0#1`h! zi+Pw`L05rmRGB2+wCaQW)T<+Z>&Vny9Yw1}@uO%O=R4FVk$)G&34%DaHjEd>Y6tZ5 zgMt_&i~yBVo-o3;RvKTUjouuz8OaV?r>&j1&}i$jbr7t@MzBs|NQKeQUX!MQJTt@&8Sibz!=$*PJ1+%&Zjp*^oFRsw6S!Y zdhN6ia$TLW8;50dAU0tXEF$T31aWp2$LSb(bdxlkPWzO72C^P?P7{f`>`8lpbB3xU z(8iK|4F_t&juFSCW6`nXm^BKPa0*A~Y({%@7B@!&PuNEtV~%mSi7Sp($2{Toz;KM( z$MI-nC-ZEi+_^vnz36uu&1~7jj)wX+Z}a%RbqZ7!M$ zuZC$Zuv+|}aD>St5p&fFF$r)}cnhdXmjo}PBhEaP4 z@I}YEW7{F)tTuCYIm{cU!ZCMOu0I$I4j%ziun3Lt3QIt5aB_>h;8=649*Gpz7So#&b7Crp8=Old$}P^$BgSgb;_PrH zooTH1NnG;H=d~VLII?V@EIU_-X)VqHjBvO&PjFm>fFa$y=#?zKTPZF_)b*O2l&*g^KN-Z!2Gu1ocH%{oAJ0QHieTIU+iBQxF+p_>Yv4pNuBu3^`RYur_EFcY?6Cxbm94UZ7U zUA6oOV!$=;YCE1dK2becU8lLx4ME}>IgClyf@`3<;Xt~PA3_bgnlf<%f7UYWT6V3u z8mjB$&tq^Su5KdRi0e~E)XZNLk#E1ATeNd9++2u|YvcFGxO>M1#ky1TAA`OiQm zYGn;A?7BvdHelypFNf{`?ckGIcC{FXpsqno=n;@%#Wi}g8R^GBoON{h3@u2Tu7%J} zkvTknbouCNc~^B$bvv)N<=U+5z@2nA z*|74rAwdsbhTOyMG53_)SSJa(;`RIDzENL&Zd>kX?p$s&O`cYjK3;p?-9ms4)Eh<3 zNz`@m1--*PSK3PK??j{2q}L*0#)Omzj7E0xyl3W^tIUhe>O+1eLALmr;pIJzNh_sE4Rr zJ?c=Ey2Otv#NjzSg{V{^E_I2@xYXros7gIl<+)S?E~8SHxKyPc;vsrerQXc9w(fm- zj9~A*_S$Rjz4rg#T1WSG*`dBdM8HeV@zHx|lA-<3@zJ+X4ics#9!Z?;+|hE#q6w`x zX7!`*VT_MKTo~cdf8}mPE+Ur^WQjB)j+7&bGdAuK9c3OlukJeg&fIh`en{0(bYzr6 zrOIpDarki-M^vmm+(J;2$Dj1nh_v(x(i7?f2Vkwn$xkWOGPt||pBC^rPQ%5U@7kd% z4I=0|ZXF{>lfY|$5010fAVlGK+c*Zm4nZ`bq#y~5=?WN+5>pC%(|haqDviQ{BL&rm zu}foo;D~|T`!TfmF+@A@ap>~LQ2b+P^*);w-LLT7TG(H0~bflFF zVpUdxN=CUPPz9J&+EhsdQnU_Dip10`BpMh4EchNjX-!ic76d*JcW?9rxvIam9{_~H9^=d07=5;)P40pt*9wVFAt!K75!Y5Xfu7Sj%F?cnP4FZd9~FHPjizq zfQ?ZWqP0Sg?~%4BAp&oK&vCLm*$?UtIYV`qBFWC2^D{KmWamY=Fvhr?#n-?d0jksG zEb#;mD9xZV<;)^lnevJ`)6R^uLihxLO@#dW26{%$StXoM!cMK~JfdWFoh4_D3RHls zc?r_y73W944$`voqpyO2sx!85%5$kx%u{E}dEvZtHYjQxK$EhoJI|eM=NS<+d2rjw zkAfG@otgW&;oO90JG>h{3ZI8N;TBKq!h)H+?;K&bXqcv36}ky}b(! zW2Otb-tPyS5b?7=FpaLK-Jwx~*#9(Msf9yJQox2`fqq)R9?L2oEt{3V& zW`oz7tB&9%HOz^tf&NI;Z5O|{YPl}w545UwuC=u*&E=2y)BbZFwMBVdyLzrm?rl>_ zw=UJ~a(5`?&Sh|4je&@}OC)!$>#@@#(gCU|>AsXIq< z9hFQVA;*UM(mizF6B|43x@aJ>GJqe$t+;D%&Jl9LP@G znaIgfeJK$u#QOM(2)4oQF7NlJ?sMo{qOZYShI{U=iN6oGGG&WoDli>I9k~#U&`&dL?Bd()_>Ok2I=fv5UREp&6gbmd! z@SC*k>=qO6pt|s%AZ?C;U8`>nHN-X+C{iU;@eTso`P_Uv*uit`ZIBf9&}aU?2z&E2$oVM<8CT&5bL~N-965|t zW0$dgUYRATrV1jKd3~LGDpV)Oo`&b#b4aKffa+`D=rvH|kx!_w9nT#vT~qowtSfh( zD{q}Y5u2g6j4-{O0S3@1+ngk44#F91+zD&b%{E+u;Xob`Q{^sXQ3n>h04CVzZ2*NvcY2T znj+>F_7-|$;ysM38>)sphFEFgVBv6~Z^MCN2PFIO9xc=snhUo?u?x@f0^MWrP1Qa; zdT%L6JoCpy3@+ zrk4x13q^0!d+yb1X6@02gKTG^59A2FKJDG{7QI!xH%-WB*vG^)jfh zQ2V0=qB-UdNEB=!>MLATji0E-^kx|ax>^``AHDeJ6HOj_A6|J?s?;vpal&i%y2x`4 zP!ErXJiUd4HwAuvgL+7RVOIk$I*Q)n?w~IAN%lI8QbBf*WSuv?zeS5CCH|Xq z+c?gJ^62m-C+FSc-J|N|6Gqj$sr7viJ`ZG#W0>UbAW@9kL;$fZy^zLpd88*}tZx(AW1tgCA(srEmubZ};H9A#3L>>!JSJlsLGxx#qi!_P5>(|e zt-!rWYN(jD`^uZ5u!Oe7!_pKpsTH+Tt*U|j^!}DENDp%b?Oh5eYQIYXl-xI{q4%|WP4*x7U)^<*SMMjp?$X&(I<_B^ zm%m97N}B5b76FG^(ElD)>miajhbQfSkE8>}yd?eqNU5H1#!~(tQj8NV<^MK~n{zGg zPptkE;aXb8|IY+mYFYokyaxW2fR489|33tDwY>jFuYvao=xMwD?+|dK75v{N;6W?< z`N}%f&U{1PgI^BZ1oFZCU?N zVuE1sokN;r6OAs&zD;OsQLmDHN4}mf7%qm7!>w>PoFz)xM=v8=W6FeYn_5oxQMcIg z6?{2rESE3%F(NP1H3mXch=&e`xO8=o!IAb=0*8T)WFwX?g7; z_dDM{C0X{J`Kap;!CZ-$uORdq;Rh7&5Ce77kH>Q`edtREJd49vXC;=%t)8!yiGeE0 zAM_{DRJ;Cyzd{Kd`I?Bn=|3dTG3ue}Kk~QvJ>{`)dv%>EcgvsiclfsQ5J7FaXeO#E zzJvnt5C0M6Ee!mIz%fB}|E+%_P@~@2z?5+5zw;0L4|p3e1mwU8Wz)nw(ewBHr&J`` zJoG?e2xx%|$QC2<38Ww=U+XOxZwF`ZU}; zTsq$E1jduyULX>F%}erW>uEg}iPPH&MgcL<2qZ$e=vd;W&9!4Hp;4^65?fQ(T^r_4 zbvVygWM2ll#BDpEVG>IOuW1%<2S$NM+!vdJV`PsyS3A%P+z`+~hwc;m-GB!KK}>y# zV9UUT2ark*8aJ`^JU^ zQhP}w&IPD;lKX%KK0?3{KJ~rAVzobkfW=F z?xRr}5}hk=7mqo*M(78$)G7DY$*T_;LT2gjL51ey=rcmQLY`2IdoRcv3nfBr?(GmW znNT*g9coH%Vp`h{)gz_oWAx#vVM$)y z7=-RaL&R)KpF{l|Bdy|iW(#eu_w{dM*q()`w@_c_6KYSZDL}C$bDH2P?c4B+6 z5pgXP!dKx(%Eu7ShbN#eB)Gx}Q0g6E%7cr(0@jBktPtl|BRU}Fi;f4I=uyNF)uNf` zZnP4;TFEC26hjMV!dqdwAf$NXIA#YX0WG{4KHv#mAg&tucN(@ty&0A%A}vFE;r(z4 zRAppW3!j8lVkd$*ax1(+$A%;lHphC)_sbLU)A;_Xn#2dt@HUM!poNX}$|&T3r-!pH z_`SfYb{*~^!&^M{55iy(R9C>tR6xY-B5b?^x(j=jXi^!XpJ$=XP)-ci_{uv7_c6-z zv6E%j>I0M@=!p(2BcXe)bLT-qf`FQJppk-+A@9twNQ}Hff&$Z#OeDpo$1`SxT@PIggy-qj*?S z_)AV3KJgR2kG_X4fG@p31e8+Q<}q^=vlkge&Uwt&f#*EtYu^qh-KB~*L`hk`I4)gu zk5F1P7EMN*($6C=TDR1gYq`V;wxS0_kbyKsE?VJ<91>zTx)&`)k2vC(5S8drv=%+# zh*OGM$0W*6Ce7$IroGEpC4L;=gL=yZ)G`{JuIa#-xj=9)dV{a9H1HjkGY8hUHW2qw z*VD77=ah6Cq1R7a4h)iZv>#19%{(nWtv|gOhuuc?OP6EtE_(K~?Z7(T!Pfl|Pk;0z zNY8)rQiuBD6*5UaO+8I>oj7`4K7V@5wG*zRUA}X_iMDiAJ-PrX&7H0y787}n9`$O97+{O}|Dyg7D+{etz z+H!<{pddwvArP^?-Y8(7|ZA4z2&Wy?Uf4Dpd#xums~*+>IanJ{&J2d zlvmJTEvy*r=MEn!7=c6RL1u5A5)a>^4}RzPek_L$$z)J%jK()g+vy4%V=PoM-p{vTknv{L3gnfW%k zwsOdQRibG^YWJ9XYYOf1R&G{`@xAyVhHou?5MY^ z6xv-$#OXLm2gqW)p;|EkN zKH|&;A&-5_$7DPOl`QORQ8UELIcKs(JfFo|@xQ08(u!YlY@6(M{6cp@t#lPX+}Qop z6%Y9ns?R<`45XGxL-tR{m_HjkAB>#|t^qyPZXwmD489_b8-;jAKL__de!zLVkC$J$ z|AV+9g}4kpIZeo`u|z6Cs%2Zy`@ju58VugQAhNB*UydEV6z?Po ziOtpgsY-O;cE&&$gG4S&!02q6R{G3@Imr8>x-$ zjnfUN?ms9a4Xw7t>t~xvtgU6%a#T!hZFB8#E&mg6he{Oz zHoKNv+a)}C@@oYGV`~*q7l|YRfYdcl_==TTgZMbIIb7?k?elC(luZN0IUt}()i4G+ zYn9i)A*FeaD1)^l9_d)c7*yAT>oLq(IVj83C@XcnuwKLzb}|kvu9GlOZN0UAN|o+f zKZ55B-ul>k4DUI-4I=lfN03+o(_eSJr90$v)cTdqi0Y+0NLDEa`X=bR>jzv^iqyl( zT)-&3e#k5LXuZNiD9=M4(p=YgNOL{-%8k5oW3Sw_6sGnCCsiJopu9xF9|RpsTpj^X z4WB+FTut)AJzqcL6>(1X%{m^+G0NAslcnSZ$6r#J9@j}nH3%)$&19Pp`lOsxlL;st zW|LQ(u1ob+K(uD^B6&^qQp72+iLP{!?2WyZ+bC|_@l5WyJ>>QywW$!?m~g^%Z3H*;uK@!A9$?I`0hItDwc+9J z_J#%(Ibjn6B)1WCg756c7WZ)Bz^x6wMnn1ZQ!ytE`2@w<1rsUmO;hC325HJ}I#EvH zwYpH&iP@!wL3aj?+%|M_d(g@qU?9;k8O?AGFZ5?n>D>*eiNL+ZWaEPiRU_SiR>9H6 zHqRqRT*;qOxyE#mcXS$!J3Mfg0+Udr&U|VUDt>eWLr{?i?vcIsso%YmTTj}$xbWhw zHa=r?`NS)>pL~V2pL`eEN`C_PpMgtHvd)w4q;&mc0kN5zT-t>+*VfxTGVLF~7Fe7d$7kenq)!K3$GB@MNEnmGtCGwQ@0q;DqUon0Apf?wZ~6w?Gku#CVM->iO%UFym|ju? z)J%UW)lGjZ)=fWVHB&^#>ZT(deA*;ym?{!6+%$Q`GbGkE{i}3ls_R(O)FEqP66lFZ zINM zQx(0>bTY~Mrurn%ZGvEpOz%Gj?SwgOG@HLD%I5Dw(;zs-WOH(gO__`EmVoF%ux9x{LgfZ6b5hJQCnhal6jGKi8eSeC^LOHIe{XKTb0B+6jotYe7_S5#d#p^H*=Qt46QUI;f9 zG>yeB-CFEo-|`l_g}Jf(0=u)kwAo(h21s~lS(ZkYW#ho|OKb=;f_bz&LpH*Mm5hZM ztnZ^i?Plw$BwJVUji%>JhA~^e1OInK+4^I^k2* zf{=$7f?2w}^$TnVX4m?mAb5p>6`vik>U4Wnd=AJu&x$a6*7d2Pbse}*!~bbkuznV} z&ra=AN;aWng-obb6iZfx9axuGnb2{eVhu=DYhdco8W5}24R&NjW!r=rC~MY5c4A!= zPOX1Plyxh%lvYVScZFvUq7-W^L;)vm5KL2shUM3f%u>x7N?17VUS|&rA2#&rjW3f0aFq zIUHI|;>c=}hSn$>A{7&L7lSstF=AU~n(aTaAWV$n+1^Uoz9pt?|HM+ZnhwA{1`re}@XOf9*jdIl19ypS z+LnZ@?H^{))CF65QrxlKP8tg~^Ay_|TbL#DHv9u~-qs@=meCw6A!pmtv!V?WTSZ$} zWP7&HQtFW1fKgb<1|=ZdbIBIhm2GaRVsndS+YeX;=9n0a3pJZXJh6RII9JVZ4zYmQ8hX~UJ*P^#u$jb5n@PH`{VcnLX%kuy zI>;Sz3iuwg!mePtwwEZEcy03vecLm*&)BW)yV9)b6!{D;7Q2>ge@ ze<*It|HO9WmoG527i70olz&Mq%KyR&a$3g@wd#AErEytzqMmtT6(@C~qaDJON(rF@9lPR74uU&;k+h-B9k zYs=5WGcR-j(#S zJ1g7mLS>A?n~rd3pJ7$|jBqqY;XOwq-Y{BrY z>+>-RZ#qH?s0*Mj$0)q(2yJ_mb?i~$YK+1wj?e|_8mONA`I{)ijeQB9dss5w*fEIv zWDV`(W5T0-PE;L#CaI2`jy>A3OV&FEI!SiqCPmp1n}TfzlZtELC8 zqX+JRyx2YJ9a#~$mIz!?g10I$m*W}Lmd8QH&LR$8c`6w?k- zmv$&D<@i3!5E@P5uo$xriCEwt*m3MmnmUg36ze$ZQ-I1icR8+c z2y#@>$c`(rMxuD;kg=zBxUheQh0r>AheoO4aAEsP))nQ7EdlE58ufMU_&L^f{2J>K zIxgIxG<}q+@AwkCar~Iwj(Nm|xPa?$-2hc`=U8O-j;|B-1E`0f9y*?}q2u##{~LR7 z{0*anMZjk;D_67A&4tHO_^gs#m6FwPlzZRET+7Vd?+|0Cdj#CDYDROnqLAQhFsR6z-dMR2mGJR|hJ;*?5?Q#>HAO(-M5vhq1r zQ9di+hr41J3}giZS>eauW3YX!{2_ypPL=;{YA8Pz8_K;N2(!pe$vUI7Fltf$mSSNS zV=r!Ng-gZ8I^&G56iK`Sd);xy*U0!<`5Nmf&uB)wQB2~E^1s-v@&WDX?v!QmL0OiD z%Cd2!yeo{9KVu`bf^er~CfS2h#34u7$5EWD$8m}iDwV!}f=7ar9oCe+`O5-R5OwAz?7X4LMakWtZl(<)9MX*HoYZmQ6)+f>_n zc)NO*RPXVD8g=sx=23GJ%c}4HEOx+K>Y|ua7p1(qXw0dXlPphG5tdL?hd3sw@)X-s zUsAUFpecdA4EmD#o2;yUhwZBgoOsj^us{k&s!cpqx2B}Jx{D85sOLBak#!0lfK#E@ zt?r1x!8%fJaBx+hQ$wDi^ym1)!gEz&XX@Lmr9Q`YSGYiOZFN~{tN+F>RCKzI+Sbv& z|4OxpeKjog)SouqsBf8i>gQNb{XF1bVmIn9o37Na!u=}itM9OD^&O$Fz6;uSfqU0< z4Y#j;6ZmfmH|lrcewW>&KLdS(or%B8@O;XmGzy#~8V1jj`$G;G^k$MiPZ#(~n<;N-G kDhgUT0{%VVO}68Fixr419H4+MBGo;o7e1SgY+?8R0elCu#sB~S literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXDkPanels.hpp b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXDkPanels.hpp new file mode 100644 index 0000000..6790e68 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXDkPanels.hpp @@ -0,0 +1,517 @@ +// CodeGear C++Builder +// Copyright (c) 1995, 2008 by CodeGear +// All rights reserved + +// (DO NOT EDIT: machine generated header) 'Sptbxdkpanels.pas' rev: 20.00 + +#ifndef SptbxdkpanelsHPP +#define SptbxdkpanelsHPP + +#pragma delphiheader begin +#pragma option push +#pragma option -w- // All warnings off +#pragma option -Vx // Zero-length empty class member functions +#pragma pack(push,8) +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit + +//-- user supplied ----------------------------------------------------------- + +namespace Sptbxdkpanels +{ +//-- type declarations ------------------------------------------------------- +struct TSpTBXDockStateRec +{ + +public: + Forms::TWindowState DockedState; + int RestoreSize; +}; + + +#pragma option push -b- +enum TSpTBXDockPosition { dpxLeft, dpxTop, dpxRight, dpxBottom, dpxClient }; +#pragma option pop + +#pragma option push -b- +enum TSpTBXDPResizeType { dprtManualResize, dprtMinimizeOrRestore, dprtMinimizeOrRestoreTaskPaneStyle, dprtSplitResize }; +#pragma option pop + +typedef void __fastcall (__closure *TSpTBXWindowStateChangedEvent)(System::TObject* Sender, Forms::TWindowState AWindowState); + +class DELPHICLASS TSpTBXCustomMultiDock; +class DELPHICLASS TSpTBXCustomSplitter; +class DELPHICLASS TSpTBXCustomDockablePanel; +class PASCALIMPLEMENTATION TSpTBXCustomMultiDock : public Tb2dock::TTBDock +{ + typedef Tb2dock::TTBDock inherited; + +private: + bool FAutoSplitterVisibility; + bool FLimitToOneRow; + TSpTBXCustomSplitter* FLastSplitter; + TSpTBXDockPosition FPosition; + bool FUpdatingLateralSize; + Tb2dock::TTBInsertRemoveEvent FOnInsertRemoveBar; + Tb2dock::TTBRequestDockEvent FOnRequestDock; + void __fastcall UpdateDPLateralSize(int AWidth, int AHeight); + HIDESBASE void __fastcall SetPosition(const TSpTBXDockPosition Value); + void __fastcall SetLimitToOneRow(const bool Value); + +protected: + virtual void __fastcall AlignControls(Controls::TControl* AControl, Types::TRect &Rect); + virtual void __fastcall DoInsertRemoveBar(System::TObject* Sender, bool Inserting, Tb2dock::TTBCustomDockableWindow* Bar); + virtual void __fastcall DoRequestDock(System::TObject* Sender, Tb2dock::TTBCustomDockableWindow* Bar, bool &Accept); + virtual void __fastcall Loaded(void); + virtual void __fastcall Notification(Classes::TComponent* AComponent, Classes::TOperation Operation); + DYNAMIC void __fastcall ValidateInsert(Classes::TComponent* AComponent); + void __fastcall InsertingOnEmptyDock(void); + TSpTBXCustomSplitter* __fastcall GetAdjacentSplitter(int SpacingDelta = 0x1); + +public: + __fastcall virtual TSpTBXCustomMultiDock(Classes::TComponent* AOwner); + bool __fastcall IsVertical(void); + void __fastcall GetDockablePanelList(Classes::TList* DPList); + void __fastcall GetDockablePanelDockIndex(Classes::TList* DPList, TSpTBXCustomDockablePanel* DP, /* out */ int &DPDockIndex); + virtual void __fastcall SetBounds(int ALeft, int ATop, int AWidth, int AHeight); + __property bool UpdatingLateralSize = {read=FUpdatingLateralSize, nodefault}; + +__published: + __property bool LimitToOneRow = {read=FLimitToOneRow, write=SetLimitToOneRow, default=1}; + __property TSpTBXDockPosition Position = {read=FPosition, write=SetPosition, default=0}; + __property bool AutoSplitterVisibility = {read=FAutoSplitterVisibility, write=FAutoSplitterVisibility, default=1}; + __property Tb2dock::TTBInsertRemoveEvent OnInsertRemoveBar = {read=FOnInsertRemoveBar, write=FOnInsertRemoveBar}; + __property Tb2dock::TTBRequestDockEvent OnRequestDock = {read=FOnRequestDock, write=FOnRequestDock}; +public: + /* TTBDock.Destroy */ inline __fastcall virtual ~TSpTBXCustomMultiDock(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXCustomMultiDock(HWND ParentWindow) : Tb2dock::TTBDock(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXMultiDock; +class PASCALIMPLEMENTATION TSpTBXMultiDock : public TSpTBXCustomMultiDock +{ + typedef TSpTBXCustomMultiDock inherited; + +public: + /* TSpTBXCustomMultiDock.Create */ inline __fastcall virtual TSpTBXMultiDock(Classes::TComponent* AOwner) : TSpTBXCustomMultiDock(AOwner) { } + +public: + /* TTBDock.Destroy */ inline __fastcall virtual ~TSpTBXMultiDock(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXMultiDock(HWND ParentWindow) : TSpTBXCustomMultiDock(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXDockablePanelButtonOptions; +class PASCALIMPLEMENTATION TSpTBXDockablePanelButtonOptions : public Sptbxitem::TSpTBXButtonOptions +{ + typedef Sptbxitem::TSpTBXButtonOptions inherited; + +private: + bool FTaskPaneStyleResize; + +protected: + TSpTBXCustomDockablePanel* FDockablePanel; + virtual void __fastcall ButtonsClick(System::TObject* Sender); + virtual void __fastcall CreateButtons(void); + virtual bool __fastcall Restoring(Sptbxitem::TSpTBXCustomItem* B); + virtual void __fastcall SetupButton(Sptbxitem::TSpTBXCustomItem* B); + +public: + __fastcall virtual TSpTBXDockablePanelButtonOptions(Controls::TWinControl* AParent); + +__published: + __property Maximize = {default=0}; + __property Minimize = {default=0}; + __property bool TaskPaneStyleResize = {read=FTaskPaneStyleResize, write=FTaskPaneStyleResize, default=0}; + __property TitleBarMaxSize = {default=19}; +public: + /* TPersistent.Destroy */ inline __fastcall virtual ~TSpTBXDockablePanelButtonOptions(void) { } + +}; + + +class DELPHICLASS TSpTBXDockablePanelToolbar; +class PASCALIMPLEMENTATION TSpTBXDockablePanelToolbar : public Sptbxitem::TSpTBXToolbar +{ + typedef Sptbxitem::TSpTBXToolbar inherited; + +protected: + virtual bool __fastcall CanItemClick(Tb2item::TTBCustomItem* Item, Controls::TMouseButton Button, Classes::TShiftState Shift, int X, int Y); + virtual Graphics::TColor __fastcall GetItemsTextColor(Sptbxskins::TSpTBXSkinStatesType State); + virtual int __fastcall GetRightAlignMargin(void); + +public: + __fastcall virtual TSpTBXDockablePanelToolbar(Classes::TComponent* AOwner); + TSpTBXCustomDockablePanel* __fastcall GetParentDockablePanel(void); +public: + /* TSpTBXToolbar.Destroy */ inline __fastcall virtual ~TSpTBXDockablePanelToolbar(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXDockablePanelToolbar(HWND ParentWindow) : Sptbxitem::TSpTBXToolbar(ParentWindow) { } + +}; + + +class PASCALIMPLEMENTATION TSpTBXCustomDockablePanel : public Sptbxitem::TSpTBXCustomToolWindow +{ + typedef Sptbxitem::TSpTBXCustomToolWindow inherited; + +private: + int FDefaultDockedSize; + bool FFixedDockedSize; + int FFloatingClientHeight; + int FFloatingClientWidth; + bool FIsDockedMoving; + bool FIsManualSizing; + tagSIZE FLoadedBarSize; + int FLoadedDockPos; + Forms::TWindowState FLoadedState; + TSpTBXDockablePanelButtonOptions* FOptions; + bool FShowCaption; + bool FShowCaptionWhenDocked; + Sptbxitem::TSpTBXDrawEvent FOnDrawCaptionPanel; + TSpTBXWindowStateChangedEvent FOnWindowStateChanged; + bool FShowVerticalCaption; + bool __fastcall CanSplitResize(Tb2dock::TTBDockPosition EdgePosition); + void __fastcall DockRequestDock(System::TObject* Sender, Tb2dock::TTBCustomDockableWindow* Bar, bool &Accept); + void __fastcall DockResize(System::TObject* Sender); + bool __fastcall InternalMaximize(bool Restore); + void __fastcall UpdateTitleBarRotation(void); + Types::TPoint __fastcall GetCaptionPanelSize(); + int __fastcall GetEffectiveHeight(void); + int __fastcall GetEffectiveWidth(void); + int __fastcall GetFloatingClientHeight(void); + int __fastcall GetFloatingClientWidth(void); + Imglist::TCustomImageList* __fastcall GetImages(void); + Tb2item::TTBCustomItem* __fastcall GetItems(void); + Tb2item::TTBRootItem* __fastcall GetRootItems(void); + Sptbxitem::TSpTBXToolbar* __fastcall GetToolbar(void); + Tb2toolbar::TTBToolbarView* __fastcall GetView(void); + void __fastcall SetDefaultDockedSize(int Value); + void __fastcall SetEffectiveHeight(const int Value); + void __fastcall SetEffectiveWidth(const int Value); + void __fastcall SetFloatingClientHeight(const int Value); + void __fastcall SetFloatingClientWidth(const int Value); + void __fastcall SetImages(const Imglist::TCustomImageList* Value); + HIDESBASE void __fastcall SetShowCaption(const bool Value); + void __fastcall SetShowCaptionWhenDocked(const bool Value); + void __fastcall SetShowVerticalCaption(const bool Value); + HIDESBASE MESSAGE void __fastcall CMTextChanged(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall WMNCCalcSize(Messages::TWMNCCalcSize &Message); + HIDESBASE MESSAGE void __fastcall WMNCHitTest(Messages::TWMNCHitTest &Message); + HIDESBASE MESSAGE void __fastcall WMNCLButtonDown(Messages::TWMNCHitMessage &Message); + HIDESBASE MESSAGE void __fastcall WMSetCursor(Messages::TWMSetCursor &Message); + +protected: + Extctrls::TPanel* FPanel; + Sptbxitem::TSpTBXDock* FToolbarDock; + TSpTBXDockablePanelToolbar* FToolbar; + TSpTBXDockStateRec FState; + Classes::TList* FDockForms; + virtual void __fastcall CreateParams(Controls::TCreateParams &Params); + virtual void __fastcall Notification(Classes::TComponent* AComponent, Classes::TOperation Operation); + virtual void __fastcall Loaded(void); + virtual void __fastcall SetParent(Controls::TWinControl* AParent); + DYNAMIC void __fastcall ValidateContainer(Classes::TComponent* AComponent); + void __fastcall BeginDockedMoving(void); + void __fastcall BeginSplitResizing(int HitTest); + virtual void __fastcall ConstrainedResize(int &MinWidth, int &MinHeight, int &MaxWidth, int &MaxHeight); + virtual void __fastcall DoWindowStateChanged(Forms::TWindowState AWindowState); + DYNAMIC void __fastcall MouseDown(Controls::TMouseButton Button, Classes::TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall Resize(void); + virtual void __fastcall DoDrawCaptionPanel(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxitem::TSpTBXPaintStage PaintStage, bool &PaintDefault); + virtual void __fastcall DockDrawBackground(System::TObject* Sender, Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxitem::TSpTBXPaintStage PaintStage, bool &PaintDefault); + virtual void __fastcall ToolbarDrawBackground(System::TObject* Sender, Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxitem::TSpTBXPaintStage PaintStage, bool &PaintDefault); + virtual void __fastcall InternalDrawBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool PaintOnNCArea, bool PaintBorders = true); + __property int DefaultDockedSize = {read=FDefaultDockedSize, write=SetDefaultDockedSize, default=0}; + __property bool FixedDockedSize = {read=FFixedDockedSize, write=FFixedDockedSize, default=0}; + __property Imglist::TCustomImageList* Images = {read=GetImages, write=SetImages}; + __property Tb2item::TTBRootItem* Items = {read=GetRootItems}; + __property TSpTBXDockablePanelButtonOptions* Options = {read=FOptions, write=FOptions}; + __property bool ShowCaption = {read=FShowCaption, write=SetShowCaption, default=1}; + __property bool ShowCaptionWhenDocked = {read=FShowCaptionWhenDocked, write=SetShowCaptionWhenDocked, default=1}; + __property bool ShowVerticalCaption = {read=FShowVerticalCaption, write=SetShowVerticalCaption, default=0}; + __property Sptbxitem::TSpTBXDrawEvent OnDrawCaptionPanel = {read=FOnDrawCaptionPanel, write=FOnDrawCaptionPanel}; + __property TSpTBXWindowStateChangedEvent OnWindowStateChanged = {read=FOnWindowStateChanged, write=FOnWindowStateChanged}; + +public: + __fastcall virtual TSpTBXCustomDockablePanel(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXCustomDockablePanel(void); + HIDESBASE void __fastcall AddDockForm(const Forms::TCustomForm* Form); + HIDESBASE void __fastcall RemoveDockForm(const Forms::TCustomForm* Form); + DYNAMIC void __fastcall GetChildren(Classes::TGetChildProc Proc, Classes::TComponent* Root); + DYNAMIC void __fastcall DoneReadingPositionData(const Tb2dock::TTBReadPositionData &Data); + DYNAMIC void __fastcall ReadPositionData(const Tb2dock::TTBReadPositionData &Data); + DYNAMIC void __fastcall WritePositionData(const Tb2dock::TTBWritePositionData &Data); + virtual void __fastcall InvalidateBackground(bool InvalidateChildren = true); + bool __fastcall IsVerticalTitleBar(void); + virtual bool __fastcall Maximize(void); + bool __fastcall Maximized(void); + virtual bool __fastcall Minimize(void); + bool __fastcall Minimized(void); + virtual bool __fastcall Restore(void); + bool __fastcall SizeToggle(bool ToMaximize); + __property Types::TPoint CaptionPanelSize = {read=GetCaptionPanelSize}; + __property int EffectiveWidth = {read=GetEffectiveWidth, write=SetEffectiveWidth, nodefault}; + __property int EffectiveHeight = {read=GetEffectiveHeight, write=SetEffectiveHeight, nodefault}; + __property int FloatingClientHeight = {read=GetFloatingClientHeight, write=SetFloatingClientHeight, nodefault}; + __property int FloatingClientWidth = {read=GetFloatingClientWidth, write=SetFloatingClientWidth, nodefault}; + __property Sptbxitem::TSpTBXToolbar* Toolbar = {read=GetToolbar}; + __property Tb2toolbar::TTBToolbarView* View = {read=GetView}; +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXCustomDockablePanel(HWND ParentWindow) : Sptbxitem::TSpTBXCustomToolWindow(ParentWindow) { } + +private: + void *__ITBItems; /* Tb2item::ITBItems */ + +public: + #if defined(MANAGED_INTERFACE_OPERATORS) + operator Tb2item::_di_ITBItems() + { + Tb2item::_di_ITBItems intf; + GetInterface(intf); + return intf; + } + #else + operator ITBItems*(void) { return (ITBItems*)&__ITBItems; } + #endif + +}; + + +class DELPHICLASS TSpTBXDockablePanel; +class PASCALIMPLEMENTATION TSpTBXDockablePanel : public TSpTBXCustomDockablePanel +{ + typedef TSpTBXCustomDockablePanel inherited; + +__published: + __property ActivateParent = {default=1}; + __property Align = {default=0}; + __property Anchors = {default=3}; + __property CurrentDock; + __property DefaultDock; + __property DockableTo = {default=15}; + __property DockMode = {default=0}; + __property DockPos = {default=-1}; + __property DockRow = {default=0}; + __property FloatingMode = {default=0}; + __property Font; + __property HideWhenInactive = {default=1}; + __property LastDock; + __property ParentFont = {default=1}; + __property ParentShowHint = {default=1}; + __property PopupMenu; + __property Resizable = {default=1}; + __property ShowHint; + __property TabOrder = {default=-1}; + __property UseLastDock = {default=1}; + __property Visible = {default=1}; + __property Height = {stored=true}; + __property Width = {stored=true}; + __property OnClose; + __property OnCloseQuery; + __property OnContextPopup; + __property OnDragDrop; + __property OnDragOver; + __property OnDockChanged; + __property OnDockChanging; + __property OnDockChangingHidden; + __property OnMouseDown; + __property OnMouseMove; + __property OnMouseUp; + __property OnMove; + __property OnRecreated; + __property OnRecreating; + __property OnResize; + __property OnVisibleChanged; + __property DefaultDockedSize = {default=0}; + __property FixedDockedSize = {default=0}; + __property Images; + __property Items; + __property Options; + __property ShowCaption = {default=1}; + __property ShowCaptionWhenDocked = {default=1}; + __property ShowVerticalCaption = {default=0}; + __property OnDrawCaptionPanel; + __property OnWindowStateChanged; +public: + /* TSpTBXCustomDockablePanel.Create */ inline __fastcall virtual TSpTBXDockablePanel(Classes::TComponent* AOwner) : TSpTBXCustomDockablePanel(AOwner) { } + /* TSpTBXCustomDockablePanel.Destroy */ inline __fastcall virtual ~TSpTBXDockablePanel(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXDockablePanel(HWND ParentWindow) : TSpTBXCustomDockablePanel(ParentWindow) { } + +}; + + +class PASCALIMPLEMENTATION TSpTBXCustomSplitter : public Controls::TCustomControl +{ + typedef Controls::TCustomControl inherited; + +private: + bool FAutoCalcMaxSize; + int FGripSize; + bool FGripHotTrack; + Controls::TControl* FMouseSplitControl; + Controls::TWinControl* FMouseActiveControl; + Graphics::TBrush* FMouseBrush; + Types::TPoint FMouseDownPos; + int FMousePrevSplitControlSize; + bool FMouseDownOnGrip; + bool FMouseOverGrip; + HDC FMouseLineDC; + bool FMouseLineVisible; + HBRUSH FMousePrevBrush; + bool FMoving; + int FMinSize; + int FMaxSize; + int FNewSize; + int FOldSize; + Controls::TKeyEvent FOldKeyDown; + Extctrls::TResizeStyle FResizeStyle; + Sptbxskins::TSpTBXSkinType FSkinType; + int FSplitLinePaintingPos; + Sptbxitem::TSpTBXDrawEvent FOnDrawBackground; + Sptbxcontrols::TSpTBXCanResizeEvent FOnMoving; + Classes::TNotifyEvent FOnMoved; + Types::TRect __fastcall GetGripRect(); + bool __fastcall GetMinimized(void); + void __fastcall SetGripSize(const int Value); + void __fastcall SetMinSize(const int Value); + void __fastcall SetSkinType(const Sptbxskins::TSpTBXSkinType Value); + void __fastcall UpdateControlSize(Controls::TControl* SplitControl); + void __fastcall MouseCalcSplitSize(int X, int Y, int &NewSize, int &Split); + void __fastcall MouseAllocateLineDC(void); + void __fastcall MouseReleaseLineDC(void); + void __fastcall MouseDrawLine(void); + void __fastcall MouseFocusKeyDown(System::TObject* Sender, System::Word &Key, Classes::TShiftState Shift); + Controls::TControl* __fastcall ValidateSplitControl(void); + HIDESBASE MESSAGE void __fastcall CMMouseleave(Messages::TMessage &Message); + MESSAGE void __fastcall WMSpSkinChange(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall WMEraseBkgnd(Messages::TWMEraseBkgnd &Message); + +protected: + int FRestorePos; + virtual void __fastcall DoDrawBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxitem::TSpTBXPaintStage PaintStage, bool &PaintDefault); + virtual void __fastcall DoMoved(void); + virtual bool __fastcall DoMoving(int &NewSize); + bool __fastcall IsVertical(void); + DYNAMIC void __fastcall MouseStopSizing(void); + DYNAMIC void __fastcall MouseDown(Controls::TMouseButton Button, Classes::TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseMove(Classes::TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseUp(Controls::TMouseButton Button, Classes::TShiftState Shift, int X, int Y); + virtual void __fastcall Paint(void); + virtual void __fastcall RequestAlign(void); + __property bool AutoCalcMaxSize = {read=FAutoCalcMaxSize, write=FAutoCalcMaxSize, default=1}; + __property int GripSize = {read=FGripSize, write=SetGripSize, default=50}; + __property bool GripHotTrack = {read=FGripHotTrack, write=FGripHotTrack, default=1}; + __property int MinSize = {read=FMinSize, write=SetMinSize, default=0}; + __property Extctrls::TResizeStyle ResizeStyle = {read=FResizeStyle, write=FResizeStyle, default=2}; + __property Sptbxskins::TSpTBXSkinType SkinType = {read=FSkinType, write=SetSkinType, default=2}; + __property Sptbxitem::TSpTBXDrawEvent OnDrawBackground = {read=FOnDrawBackground, write=FOnDrawBackground}; + __property Sptbxcontrols::TSpTBXCanResizeEvent OnMoving = {read=FOnMoving, write=FOnMoving}; + __property Classes::TNotifyEvent OnMoved = {read=FOnMoved, write=FOnMoved}; + +public: + __fastcall virtual TSpTBXCustomSplitter(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXCustomSplitter(void); + void __fastcall ChangeSplitControlSize(int NewControlSize); + void __fastcall InvalidateGrip(void); + void __fastcall Minimize(void); + void __fastcall Restore(void); + void __fastcall Toggle(void); + __property Types::TRect GripRect = {read=GetGripRect}; + __property bool Minimized = {read=GetMinimized, nodefault}; + __property bool MouseOverGrip = {read=FMouseOverGrip, nodefault}; + __property bool Moving = {read=FMoving, nodefault}; + +__published: + __property Align = {default=3}; + __property Width = {default=5}; +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXCustomSplitter(HWND ParentWindow) : Controls::TCustomControl(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXSplitter; +class PASCALIMPLEMENTATION TSpTBXSplitter : public TSpTBXCustomSplitter +{ + typedef TSpTBXCustomSplitter inherited; + +__published: + __property Align = {default=3}; + __property Color = {default=-16777211}; + __property Constraints; + __property ParentColor = {default=1}; + __property PopupMenu; + __property ShowHint; + __property Visible = {default=1}; + __property OnClick; + __property OnContextPopup; + __property OnDblClick; + __property OnMouseDown; + __property OnMouseMove; + __property OnMouseUp; + __property AutoCalcMaxSize = {default=1}; + __property GripSize = {default=50}; + __property MinSize = {default=0}; + __property ResizeStyle = {default=2}; + __property SkinType = {default=2}; + __property OnDrawBackground; + __property OnMoving; + __property OnMoved; +public: + /* TSpTBXCustomSplitter.Create */ inline __fastcall virtual TSpTBXSplitter(Classes::TComponent* AOwner) : TSpTBXCustomSplitter(AOwner) { } + /* TSpTBXCustomSplitter.Destroy */ inline __fastcall virtual ~TSpTBXSplitter(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXSplitter(HWND ParentWindow) : TSpTBXCustomSplitter(ParentWindow) { } + +}; + + +//-- var, const, procedure --------------------------------------------------- +extern PACKAGE void __fastcall SpDrawXPDockablePanelTitleBar(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool IsActive, bool Vertical); +extern PACKAGE void __fastcall SpDrawXPDockablePanelBody(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool IsActive, bool IsFloating); +extern PACKAGE void __fastcall SpTBRegLoadPositions(const Classes::TComponent* OwnerComponent, const unsigned RootKey, const System::UnicodeString BaseRegistryKey); +extern PACKAGE void __fastcall SpTBRegSavePositions(const Classes::TComponent* OwnerComponent, const unsigned RootKey, const System::UnicodeString BaseRegistryKey); +extern PACKAGE void __fastcall SpTBIniLoadPositions(const Classes::TComponent* OwnerComponent, const Inifiles::TCustomIniFile* IniFile, const System::UnicodeString SectionNamePrefix)/* overload */; +extern PACKAGE void __fastcall SpTBIniSavePositions(const Classes::TComponent* OwnerComponent, const Inifiles::TCustomIniFile* IniFile, const System::UnicodeString SectionNamePrefix)/* overload */; +extern PACKAGE void __fastcall SpTBIniLoadPositions(const Classes::TComponent* OwnerComponent, const System::UnicodeString Filename, const System::UnicodeString SectionNamePrefix)/* overload */; +extern PACKAGE void __fastcall SpTBIniSavePositions(const Classes::TComponent* OwnerComponent, const System::UnicodeString Filename, const System::UnicodeString SectionNamePrefix)/* overload */; + +} /* namespace Sptbxdkpanels */ +using namespace Sptbxdkpanels; +#pragma pack(pop) +#pragma option pop + +#pragma delphiheader end. +//-- end unit ---------------------------------------------------------------- +#endif // SptbxdkpanelsHPP diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXDkPanels.pas b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXDkPanels.pas new file mode 100644 index 0000000..7109441 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXDkPanels.pas @@ -0,0 +1,3547 @@ +unit SpTBXDkPanels; + +{============================================================================== +Version 2.4.2 + +The contents of this file are subject to the SpTBXLib License; you may +not use or distribute this file except in compliance with the +SpTBXLib License. +A copy of the SpTBXLib License may be found in SpTBXLib-LICENSE.txt or at: + http://www.silverpointdevelopment.com/sptbxlib/SpTBXLib-LICENSE.htm + +Alternatively, the contents of this file may be used under the terms of the +Mozilla Public License Version 1.1 (the "MPL v1.1"), in which case the provisions +of the MPL v1.1 are applicable instead of those in the SpTBXLib License. +A copy of the MPL v1.1 may be found in MPL-LICENSE.txt or at: + http://www.mozilla.org/MPL/ + +If you wish to allow use of your version of this file only under the terms of +the MPL v1.1 and not to allow others to use your version of this file under the +SpTBXLib License, indicate your decision by deleting the provisions +above and replace them with the notice and other provisions required by the +MPL v1.1. If you do not delete the provisions above, a recipient may use your +version of this file under either the SpTBXLib License or the MPL v1.1. + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for +the specific language governing rights and limitations under the License. + +The initial developer of this code is Robert Lee. + +Requirements: +For Delphi/C++Builder 2009 or newer: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org +For Delphi/C++Builder 7-2007: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org + - Troy Wolbrink's TNT Unicode Controls + http://www.tntware.com/delphicontrols/unicode/ + +Development notes: + - All the Windows and Delphi bugs fixes are marked with '[Bugfix]'. + - All the theme changes and adjustments are marked with '[Theme-Change]'. + - All the DockablePanels rules are marked with '[DockablePanel-Rule]'. + - To handle the size constraints use GetMinMaxSize when the DP is floating, + and ConstrainedResize when is Docked (explicitly check if it's docked). + +Limitations: + - DockablePanels can be docked only on MultiDocks. + - MultiDocks doesn't have lateral splitters, you can solve this by + adding a TSpTBXSplitter on the Form. + +History: +8 May 2009 - version 2.4.2 + - Fixed incorrect TSpTBXDockablePanel floating border + painting on Vista with Aero enabled, thanks to Mattias + Andersson for reporting this. + +15 March 2009 - version 2.4.1 + - Fixed TSpTBXSplitter bug, it wasn't correctly minimized + when MinSize was 1, 2 or 3, thanks to Sertac Akyuz for + fixing this. + - Fixed TSpTBXSplitter bug, it wasn't correctly restored + when SpTBIniLoadPositions was called. + - Fixed incorrect TSpTBXDockablePanel behavior, when DockMode + is dmCannotFloat the DP should be able to be re-docked, + thanks to Ivan Petrovic for reporting this. + - Fixed incorrect TSpTBXDockablePanel behavior, it wasn't + correctly resized when using the embedded splitter, thanks + to Gilles Arcas for reporting this. + - Fixed incorrect TSpTBXDockablePanel painting, + OnDrawCaptionPanel wasn't called when painting the NC + area borders, thanks to Mikael Stalvik for reporting this. + +17 January 2009 - version 2.4 + - Added FloatingClientWidth and FloatingClientHeight public + properties to TSpTBXDockablePanel. + - Added TaskPaneStyleResize property to TSpTBXDockablePanel, + when this property is set to True the Minimize/Restore + behavior will be the same as the Windows Task Pane (the + DockablePanel is minimized from bottom to top). + - Changed TSpTBXDockablePanel undocking behavior the panel + will remember the previous floating size when it is + undocked. + - Changed TSpTBXDockablePanel docking behavior, when the + panel is docked on an empty MultiDock it will use the + DefaultDockedSize property to set its size. + If DefaultDockedSize is 0 it will use the floating size. + +26 September 2008 - version 2.3 + - Added DefaultDockedSize property to TSpTBXDockablePanel, + this property is used to set the DockablePanel size when + it's docked on an empty MultiDock. + - Added ShowVerticalCaption property to TSpTBXDockablePanel, + this property is used to rotate the caption panel vertically. + When the DockablePanel is floating or docked on a vertical + MultiDock the caption will be horizontal regardless of the + value of ShowVerticalCaption. + - Fixed TSpTBXDockablePanel bug, anchored children were not + correctly resized when the Form was loaded, thanks to + Alex Neznanov for reporting this. + - Fixed TSpTBXDockablePanel bug, hiding/restoring a DP + misaligned the adjacent splitter, thanks to Alexander for + reporting this (related to Delphi's zero size align bug). + - Fixed TSpTBXDockablePanel bug, dragging a floating DP + with CTRL key pressed should not dock the DP. + +29 July 2008 - version 2.2 + - Fixed TSpTBXDockablePanel bug, an AV was raised when the + DockablePanel was undocked when it was minimized by an + adjacent splitter, thanks to Minoru Yoshida for reporting this. + +26 June 2008 - version 2.1 + - Added AutoSplitterVisibility property to TSpTBXMultiDock, + use this property to automatically hide the adjacent + splitter when the MultiDock is empty. + - Added OnWindowStateChanged event to TSpTBXDockablePanel, + this event is fired when the DockablePanel gets minimized, + maximized or restored. + - Fixed TSpTBXDockablePanel bug, the floating panel was able to be + dragged offscreen leaving no way to move it back, thanks to + Minoru Yoshida for reporting this. + - Fixed TSpTBXSplitter bug, incorrect alignment when the split + control was minimized and the Form was resized, thanks to + Den and Minoru Yoshida for reporting this. + +3 May 2008 - version 2.0 + - Decoupled from TBX. + +==============================================================================} + +interface + +{$BOOLEVAL OFF} // Unit depends on short-circuit boolean evaluation + +uses + Windows, Messages, Classes, SysUtils, Controls, Graphics, ImgList, Forms, + Menus, StdCtrls, ExtCtrls, ActnList, IniFiles, + TB2Item, TB2Dock, TB2Toolbar, + SpTBXSkins, SpTBXItem, SpTBXControls; + +type + TSpTBXCustomDockablePanel = class; + TSpTBXCustomSplitter = class; + + TSpTBXDockStateRec = record + DockedState: TWindowState; + RestoreSize: Integer; + end; + + TSpTBXDockPosition = ( + dpxLeft, // dpLeft + dpxTop, // dpTop + dpxRight, // dpRight + dpxBottom, // dpBottom + dpxClient // dpRight + ); + + TSpTBXDPResizeType = ( + dprtManualResize, + dprtMinimizeOrRestore, + dprtMinimizeOrRestoreTaskPaneStyle, + dprtSplitResize + ); + + TSpTBXWindowStateChangedEvent = procedure(Sender: TObject; AWindowState: TWindowState) of object; + + { TSpTBXMultiDock } + + TSpTBXCustomMultiDock = class(TTBDock) + private + FAutoSplitterVisibility: Boolean; + FLimitToOneRow: Boolean; + FLastSplitter: TSpTBXCustomSplitter; + FPosition: TSpTBXDockPosition; + FUpdatingLateralSize: Boolean; + FOnInsertRemoveBar: TTBInsertRemoveEvent; + FOnRequestDock: TTBRequestDockEvent; + procedure UpdateDPLateralSize(AWidth, AHeight: Integer); + procedure SetPosition(const Value: TSpTBXDockPosition); + procedure SetLimitToOneRow(const Value: Boolean); + protected + procedure AlignControls(AControl: TControl; var Rect: TRect); override; + procedure DoInsertRemoveBar(Sender: TObject; Inserting: Boolean; Bar: TTBCustomDockableWindow); virtual; // OnInsertRemoveBar is republished + procedure DoRequestDock(Sender: TObject; Bar: TTBCustomDockableWindow; var Accept: Boolean); virtual; // OnRequestDock is republished + procedure Loaded; override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure ValidateInsert(AComponent: TComponent); override; + + procedure InsertingOnEmptyDock; + function GetAdjacentSplitter(SpacingDelta: Integer = 1): TSpTBXCustomSplitter; + public + constructor Create(AOwner: TComponent); override; + function IsVertical: Boolean; + procedure GetDockablePanelList(DPList: TList); + procedure GetDockablePanelDockIndex(DPList: TList; DP: TSpTBXCustomDockablePanel; out DPDockIndex: Integer); + procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override; + property UpdatingLateralSize: Boolean read FUpdatingLateralSize; + published + // Republish LimitToOneRow, the inherited LimitToOneRow should always be True + property LimitToOneRow: Boolean read FLimitToOneRow write SetLimitToOneRow default True; + property Position: TSpTBXDockPosition read FPosition write SetPosition default dpxLeft; + property AutoSplitterVisibility: Boolean read FAutoSplitterVisibility write FAutoSplitterVisibility default True; + // Republish OnInsertRemoveBar, use the inherited OnRequestDock to show/hide the Splitter + property OnInsertRemoveBar: TTBInsertRemoveEvent read FOnInsertRemoveBar write FOnInsertRemoveBar; + // Republish OnRequestDock, use the inherited OnRequestDock to deny non DPs + property OnRequestDock: TTBRequestDockEvent read FOnRequestDock write FOnRequestDock; + end; + + TSpTBXMultiDock = class(TSpTBXCustomMultiDock); + + { TSpTBXDockablePanelButtonOptions } + + TSpTBXDockablePanelButtonOptions = class(TSpTBXButtonOptions) + private + FTaskPaneStyleResize: Boolean; + protected + FDockablePanel: TSpTBXCustomDockablePanel; + procedure ButtonsClick(Sender: TObject); override; + procedure CreateButtons; override; + function Restoring(B: TSpTBXCustomItem): Boolean; override; + procedure SetupButton(B: TSpTBXCustomItem); override; + public + constructor Create(AParent: TWinControl); override; + published + property Maximize default False; + property Minimize default False; + property TaskPaneStyleResize: Boolean read FTaskPaneStyleResize write FTaskPaneStyleResize default False; + property TitleBarMaxSize default 19; + end; + + { TSpTBXDockablePanelToolbar } + + TSpTBXDockablePanelToolbar = class(TSpTBXToolbar) + protected + function CanItemClick(Item: TTBCustomItem; Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer): Boolean; override; + function GetItemsTextColor(State: TSpTBXSkinStatesType): TColor; override; + function GetRightAlignMargin: Integer; override; + public + constructor Create(AOwner: TComponent); override; + function GetParentDockablePanel: TSpTBXCustomDockablePanel; + end; + + { TSpTBXDockablePanel } + + TSpTBXCustomDockablePanel = class(TSpTBXCustomToolWindow, ITBItems) + private + FDefaultDockedSize: Integer; + FFixedDockedSize: Boolean; + FFloatingClientHeight: Integer; + FFloatingClientWidth: Integer; + FIsDockedMoving: Boolean; + FIsManualSizing: Boolean; + FLoadedBarSize: TSize; + FLoadedDockPos: Integer; + FLoadedState: TWindowState; + FOptions: TSpTBXDockablePanelButtonOptions; + FShowCaption: Boolean; + FShowCaptionWhenDocked: Boolean; + FOnDrawCaptionPanel: TSpTBXDrawEvent; + FOnWindowStateChanged: TSpTBXWindowStateChangedEvent; + FShowVerticalCaption: Boolean; + function CanSplitResize(EdgePosition: TTBDockPosition): Boolean; + procedure DockRequestDock(Sender: TObject; Bar: TTBCustomDockableWindow; var Accept: Boolean); + procedure DockResize(Sender: TObject); + function InternalMaximize(Restore: Boolean): Boolean; + procedure UpdateTitleBarRotation; + function GetCaptionPanelSize: TPoint; + function GetEffectiveHeight: Integer; + function GetEffectiveWidth: Integer; + function GetFloatingClientHeight: Integer; + function GetFloatingClientWidth: Integer; + function GetImages: TCustomImageList; + function GetItems: TTBCustomItem; // For ITBItems interface + function GetRootItems: TTBRootItem; + function GetToolbar: TSpTBXToolbar; + function GetView: TTBToolbarView; + procedure SetDefaultDockedSize(Value: Integer); + procedure SetEffectiveHeight(const Value: Integer); + procedure SetEffectiveWidth(const Value: Integer); + procedure SetFloatingClientHeight(const Value: Integer); + procedure SetFloatingClientWidth(const Value: Integer); + procedure SetImages(const Value: TCustomImageList); + procedure SetShowCaption(const Value: Boolean); + procedure SetShowCaptionWhenDocked(const Value: Boolean); + procedure SetShowVerticalCaption(const Value: Boolean); + procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED; + procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE; + procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST; + procedure WMNCLButtonDown(var Message: TWMNCLButtonDown); message WM_NCLBUTTONDOWN; + procedure WMSetCursor(var Message: TWMSetCursor); message WM_SETCURSOR; + protected + FPanel: TPanel; + FToolbarDock: TSpTBXDock; + FToolbar: TSpTBXDockablePanelToolbar; + FState: TSpTBXDockStateRec; + FDockForms: TList; + + // Component + procedure CreateParams(var Params: TCreateParams); override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure Loaded; override; + procedure SetParent(AParent: TWinControl); override; + procedure ValidateContainer(AComponent: TComponent); override; + + // Sizing + procedure BeginDockedMoving; + procedure BeginSplitResizing(HitTest: Integer); + procedure ConstrainedResize(var MinWidth, MinHeight, MaxWidth, MaxHeight: Integer); override; + procedure DoWindowStateChanged(AWindowState: TWindowState); virtual; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + procedure Resize; override; + + // Painting + procedure DoDrawCaptionPanel(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure DockDrawBackground(Sender: TObject; ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure ToolbarDrawBackground(Sender: TObject; ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure InternalDrawBackground(ACanvas: TCanvas; ARect: TRect; PaintOnNCArea: Boolean; PaintBorders: Boolean = True); override; + + property DefaultDockedSize: Integer read FDefaultDockedSize write SetDefaultDockedSize default 0; + property FixedDockedSize: Boolean read FFixedDockedSize write FFixedDockedSize default False; + property Images: TCustomImageList read GetImages write SetImages; + property Items: TTBRootItem read GetRootItems; + property Options: TSpTBXDockablePanelButtonOptions read FOptions write FOptions; + property ShowCaption: Boolean read FShowCaption write SetShowCaption default True; + property ShowCaptionWhenDocked: Boolean read FShowCaptionWhenDocked write SetShowCaptionWhenDocked default True; + property ShowVerticalCaption: Boolean read FShowVerticalCaption write SetShowVerticalCaption default False; + property OnDrawCaptionPanel: TSpTBXDrawEvent read FOnDrawCaptionPanel write FOnDrawCaptionPanel; + property OnWindowStateChanged: TSpTBXWindowStateChangedEvent read FOnWindowStateChanged write FOnWindowStateChanged; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + + procedure AddDockForm(const Form: TTBCustomForm); + procedure RemoveDockForm(const Form: TTBCustomForm); + procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override; // For ITBItems interface + procedure DoneReadingPositionData(const Data: TTBReadPositionData); override; + procedure ReadPositionData(const Data: TTBReadPositionData); override; + procedure WritePositionData(const Data: TTBWritePositionData); override; + procedure InvalidateBackground(InvalidateChildren: Boolean = True); override; + function IsVerticalTitleBar: Boolean; + function Maximize: Boolean; virtual; + function Maximized: Boolean; + function Minimize: Boolean; virtual; + function Minimized: Boolean; + function Restore: Boolean; virtual; + function SizeToggle(ToMaximize: Boolean): Boolean; + + property CaptionPanelSize: TPoint read GetCaptionPanelSize; + property EffectiveWidth: Integer read GetEffectiveWidth write SetEffectiveWidth; + property EffectiveHeight: Integer read GetEffectiveHeight write SetEffectiveHeight; + property FloatingClientHeight: Integer read GetFloatingClientHeight write SetFloatingClientHeight; + property FloatingClientWidth: Integer read GetFloatingClientWidth write SetFloatingClientWidth; + property Toolbar: TSpTBXToolbar read GetToolbar; + property View: TTBToolbarView read GetView; + end; + + TSpTBXDockablePanel = class(TSpTBXCustomDockablePanel) + published + property ActivateParent; + property Align; + property Anchors; + property CurrentDock; + property DefaultDock; + property DockableTo; + property DockMode; + property DockPos; + property DockRow; + property FloatingMode; + property Font; + property HideWhenInactive; + property LastDock; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property Resizable; + property ShowHint; + property TabOrder; + property UseLastDock; + property Visible; + // TTBCustomDockableWindow doesn't store the Width and Height, make + // sure it is stored and do not store TSpTBXCustomToolWindow + // ClientWidth/ClientHeight + property Height stored True; + property Width stored True; + property OnClose; + property OnCloseQuery; + property OnContextPopup; + property OnDragDrop; + property OnDragOver; + property OnDockChanged; + property OnDockChanging; + property OnDockChangingHidden; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnMove; + property OnRecreated; + property OnRecreating; + property OnResize; + property OnVisibleChanged; + // TSpTBXCustomDockablePanel properties + property DefaultDockedSize; + property FixedDockedSize; + property Images; + property Items; + property Options; + property ShowCaption; + property ShowCaptionWhenDocked; + property ShowVerticalCaption; + property OnDrawCaptionPanel; + property OnWindowStateChanged; + end; + + { TSpTBXSplitter } + + TSpTBXCustomSplitter = class(TCustomControl) + private + FAutoCalcMaxSize: Boolean; + FGripSize: Integer; + FGripHotTrack: Boolean; + FMouseSplitControl: TControl; + FMouseActiveControl: TWinControl; + FMouseBrush: TBrush; + FMouseDownPos: TPoint; + FMousePrevSplitControlSize: Integer; + FMouseDownOnGrip: Boolean; + FMouseOverGrip: Boolean; + FMouseLineDC: HDC; + FMouseLineVisible: Boolean; + FMousePrevBrush: HBrush; + FMoving: Boolean; + FMinSize: Integer; + FMaxSize: Integer; + FNewSize: Integer; + FOldSize: Integer; + FOldKeyDown: TKeyEvent; + FResizeStyle: TResizeStyle; + FSkinType: TSpTBXSkinType; + FSplitLinePaintingPos: Integer; + FOnDrawBackground: TSpTBXDrawEvent; + FOnMoving: TSpTBXCanResizeEvent; + FOnMoved: TNotifyEvent; + function GetGripRect: TRect; + function GetMinimized: Boolean; + procedure SetGripSize(const Value: Integer); + procedure SetMinSize(const Value: integer); + procedure SetSkinType(const Value: TSpTBXSkinType); + procedure UpdateControlSize(SplitControl: TControl); + procedure MouseCalcSplitSize(X, Y: Integer; var NewSize, Split: Integer); + procedure MouseAllocateLineDC; + procedure MouseReleaseLineDC; + procedure MouseDrawLine; + procedure MouseFocusKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); + function ValidateSplitControl: TControl; + procedure CMMouseleave(var Message: TMessage); message CM_MOUSELEAVE; + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND; + protected + FRestorePos: Integer; + procedure DoDrawBackground(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure DoMoved; virtual; + function DoMoving(var NewSize: Integer): Boolean; virtual; + function IsVertical: Boolean; + procedure MouseStopSizing; dynamic; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; + procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + procedure Paint; override; + procedure RequestAlign; override; + property AutoCalcMaxSize: Boolean read FAutoCalcMaxSize write FAutoCalcMaxSize default True; + property GripSize: Integer read FGripSize write SetGripSize default 50; + property GripHotTrack: Boolean read FGripHotTrack write FGripHotTrack default True; + property MinSize: Integer read FMinSize write SetMinSize default 0; + property ResizeStyle: TResizeStyle read FResizeStyle write FResizeStyle default rsUpdate; + property SkinType: TSpTBXSkinType read FSkinType write SetSkinType default sknSkin; + property OnDrawBackground: TSpTBXDrawEvent read FOnDrawBackground write FOnDrawBackground; + property OnMoving: TSpTBXCanResizeEvent read FOnMoving write FOnMoving; + property OnMoved: TNotifyEvent read FOnMoved write FOnMoved; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure ChangeSplitControlSize(NewControlSize: Integer); + procedure InvalidateGrip; + procedure Minimize; + procedure Restore; + procedure Toggle; + property GripRect: TRect read GetGripRect; + property Minimized: Boolean read GetMinimized; + property MouseOverGrip: Boolean read FMouseOverGrip; + property Moving: Boolean read FMoving; + published + property Align default alLeft; + property Width default 5; + end; + + TSpTBXSplitter = class(TSpTBXCustomSplitter) + published + property Align; + property Color; + property Constraints; + property ParentColor; + property PopupMenu; + property ShowHint; + property Visible; + property OnClick; + property OnContextPopup; + property OnDblClick; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + // TSpTBXCustomSplitter properties + property AutoCalcMaxSize; + property GripSize; + property MinSize; + property ResizeStyle; + property SkinType; + property OnDrawBackground; + property OnMoving; + property OnMoved; + end; + +{ Painting helpers } +procedure SpDrawXPDockablePanelTitleBar(ACanvas: TCanvas; ARect: TRect; IsActive, Vertical: Boolean); +procedure SpDrawXPDockablePanelBody(ACanvas: TCanvas; ARect: TRect; IsActive, IsFloating: Boolean); + +{ Toolbar Load/Save Position helpers } +procedure SpTBRegLoadPositions(const OwnerComponent: TComponent; const RootKey: DWORD; const BaseRegistryKey: string); +procedure SpTBRegSavePositions(const OwnerComponent: TComponent; const RootKey: DWORD; const BaseRegistryKey: string); +procedure SpTBIniLoadPositions(const OwnerComponent: TComponent; const Filename, SectionNamePrefix: string); overload; +procedure SpTBIniLoadPositions(const OwnerComponent: TComponent; const IniFile: TCustomIniFile; const SectionNamePrefix: string); overload; +procedure SpTBIniSavePositions(const OwnerComponent: TComponent; const Filename, SectionNamePrefix: string); overload; +procedure SpTBIniSavePositions(const OwnerComponent: TComponent; const IniFile: TCustomIniFile; const SectionNamePrefix: string); overload; + +implementation + +uses + Types, ComCtrls, Registry, TB2Consts, TB2Common; + +const + DockedBorderSize = 2; + HT_TB2k_Border = 2000; + HT_DP_SPLITRESIZELEFT = 86; + HT_DP_SPLITRESIZERIGHT = 87; + HT_DP_SPLITRESIZETOP = 88; + HT_DP_SPLITRESIZEBOTTOM = 89; + // Constants for ini/registry values. Do not localize! + rvMultiDockWidth = 'MultiDockWidth'; + rvMultiDockHeight = 'MultiDockHeight'; + rvFloatingClientWidth = 'FloatingClientWidth'; + rvFloatingClientHeight = 'FloatingClientHeight'; + rvRestoreSize = 'RestoreSize'; + rvState = 'State'; + rvSplitterRestorePos = 'SplitterRestorePos'; + +type + TTBCustomItemAccess = class(TTBCustomItem); + TSpTBXCustomItemAccess = class(TSpTBXCustomItem); + TTBDockAccess = class(TTBDock); + TControlAccess = class(TControl); + TWinControlAccess = class(TWinControl); + + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Helpers } + +procedure SpFixDelphiAlignBug(W: TControl; NewSize: Integer; Splitter: TControl); +// [Bugfix] +{ Try to fix a Delphi align bug when a control is right or bottom aligned and + its size is changed. + To reproduce this: + - On a new form drop 3 TPanels, align them to the bottom, don't change the size. + - Drop a button, on its OnClick event change the middle panel size to 200. + - Run the app, when you click the button the middle panel will be moved to the bottom of the form. + + Another Delphi bug: the controls aligning is based on the Controls array when they + have the same position. + For example: + Form1.DisableAlign; + try + Control1.Left:= 10; Control1.Top:= 10; + Control1.Align:= alLeft; + Control2.Left:= 10; Control2.Top:= 10; + Control2.Align:= alLeft; + // Control1 has the aligning priority because it has lower index in the Controls array + finally + Form1.EnableAlign; + end; + + This will affect the splitter when the splitter is Minimized or Maximazed to 0. + Thats why the standard Borland TSplitter must minimize to a value higher than 0. + + Solution: we must move the splitter before or after the other control + based on the Align property, for that we use SendToBack and BringToFront methods. + SendToBack and BringToFront besides of changing the "z-order" changes the + order of the control in the Controls array, SendToBack moves the control + to the first position while BringToFront moves it the last position. + + When Align is alLeft or alTop we should make the splitter to have the + aligning priority using BringToFront. + And when Align is alRight or alBottom we will use SendToBack. } +var + I, Delta: Integer; + PrevBounds: TRect; + C: TControl; +begin + case W.Align of + alLeft: + begin + if Assigned(Splitter) then Splitter.BringToFront; + W.SendToBack; + W.Width := NewSize; + end; + alTop: + begin + if Assigned(Splitter) then Splitter.BringToFront; + W.SendToBack; + W.Height := NewSize; + end; + alRight: + begin + W.Parent.DisableAlign; + if W is TSpTBXCustomMultiDock then + TSpTBXCustomMultiDock(W).BeginUpdate; + try + if Assigned(Splitter) then Splitter.SendToBack; + W.BringToFront; + PrevBounds := W.BoundsRect; + W.Width := NewSize; + Delta := (PrevBounds.Right - PrevBounds.Left) - W.Width; + + // Move all children + for I := 0 to W.Parent.ControlCount - 1 do begin + C := W.Parent.Controls[I]; + if C.Align = W.Align then + if (C = Splitter) and (PrevBounds.Right - PrevBounds.Left = 0) then + C.Left := C.Left + Delta - 1 + else + if (C.Left < PrevBounds.Right) or ((C = W) and (C.Left = PrevBounds.Right)) then + C.Left := C.Left + Delta; + end; + finally + if W is TSpTBXCustomMultiDock then + TSpTBXCustomMultiDock(W).EndUpdate; + W.Parent.EnableAlign; + end; + end; + alBottom: + begin + W.Parent.DisableAlign; + if W is TSpTBXCustomMultiDock then + TSpTBXCustomMultiDock(W).BeginUpdate; + try + if Assigned(Splitter) then Splitter.SendToBack; + W.BringToFront; + PrevBounds := W.BoundsRect; + W.Height := NewSize; + Delta := (PrevBounds.Bottom - PrevBounds.Top) - W.Height; + + // Move all children + for I := 0 to W.Parent.ControlCount - 1 do begin + C := W.Parent.Controls[I]; + if C.Align = W.Align then + if (C = Splitter) and (PrevBounds.Bottom - PrevBounds.Top = 0) then + C.Top := C.Top + Delta - 1 + else + if (C.Top < PrevBounds.Bottom) or ((C = W) and (C.Top = PrevBounds.Bottom)) then + C.Top := C.Top + Delta; + end; + finally + if W is TSpTBXCustomMultiDock then + TSpTBXCustomMultiDock(W).EndUpdate; + W.Parent.EnableAlign; + end; + end; + end; +end; + +function SpAdjacentSplitter(Dock: TTBDock; Space: Integer = 1): TSpTBXCustomSplitter; +var + I: Integer; + P: TPoint; + R: TRect; + C: TControl; +begin + Result := nil; + + P := Point(Dock.Left, Dock.Top); + case Dock.Position of + dpLeft: Inc(P.X, Dock.Width + Space); + dpRight: Dec(P.X, Space); + dpTop: Inc(P.Y, Dock.Height + Space); + dpBottom: Dec(P.Y, Space); + end; + + for I := 0 to Dock.Parent.ControlCount - 1 do begin + C := Dock.Parent.Controls[I]; + R := C.BoundsRect; + if (C.Align = Dock.Align) and (C is TSpTBXCustomSplitter) then begin + // The splitter should be adjacent to the Dock + // Or the splitter is not visible and a DP is being docked on an + // empty Dock. + if PtInRect(R, P) or + (not C.Visible and (Space = -1)) then + begin + Result := TSpTBXCustomSplitter(C); + Break; + end; + end; + end; +end; + +procedure SpDPGetDockableMultiDockList(DP: TSpTBXCustomDockablePanel; var L: TList); +// Returns a valid list of MultiDocks where the DP can dock to. + + procedure Recurse(const ParentCtl: TWinControl); + var + M: TTBDock; + I: Integer; + begin + if DP.ContainsControl(ParentCtl) or not ParentCtl.Showing then Exit; + + for I := 0 to ParentCtl.ControlCount-1 do + if ParentCtl.Controls[I] is TSpTBXCustomMultiDock then begin + M := TSpTBXCustomMultiDock(ParentCtl.Controls[I]); + if (L.IndexOf(M) = -1) and M.Visible and M.AllowDrag and (M.Position in DP.DockableTo) then + if DP.CurrentDock = M then + L.Insert(0, M) // Add CurrentDock to the DockList first so that it gets priority + else + L.Add(M); + end + else + if (ParentCtl.Controls[I] is TWinControl) and not (ParentCtl.Controls[I] is TTBDock) then + Recurse(TWinControl(ParentCtl.Controls[I])); + end; + +var + ParentForm: TTBCustomForm; + DockFormsList: TList; + I, J: Integer; +begin + L.Clear; + ParentForm := TBGetToolWindowParentForm(DP); + DockFormsList := TList.Create; + try + if Assigned(DP.FDockForms) then begin + for I := 0 to Screen.CustomFormCount - 1 do begin + J := DP.FDockForms.IndexOf(Screen.CustomForms[I]); + if (J > -1) and (DP.FDockForms[J] <> ParentForm) then + DockFormsList.Add(DP.FDockForms[J]); + end; + end; + + if Assigned(ParentForm) then + DockFormsList.Insert(0, ParentForm); + + for I := 0 to DockFormsList.Count - 1 do + Recurse(DockFormsList[I]); + finally + DockFormsList.Free; + end; +end; + +function SpDPInmediateResizableSibling(DP: TSpTBXCustomDockablePanel; + ResizeType: TSpTBXDPResizeType; out IsAdjacent: Boolean): TSpTBXCustomDockablePanel; +// Returns the inmediate resizable DP sibling + + function CanResizeAdjacent(Adjacent: TSpTBXCustomDockablePanel): Boolean; + var + R: TRect; + begin + Result := False; + if Adjacent.FState.DockedState <> wsMinimized then begin + R := Rect(1, 1, 0, 0); + Adjacent.ConstrainedResize(R.Left, R.Top, R.Right, R.Bottom); + Result := (R.Top <> R.Bottom) and (R.Left <> R.Right); + end; + end; + +var + I, J: Integer; + MultiDock: TSpTBXCustomMultiDock; + L: TList; + DkPanel: TSpTBXCustomDockablePanel; +begin + Result := nil; + DkPanel := nil; + IsAdjacent := False; + if not (DP.CurrentDock is TSpTBXCustomMultiDock) then Exit; + + if DP.Docked then begin + L := TList.Create; + try + MultiDock := TSpTBXCustomMultiDock(DP.CurrentDock); + MultiDock.GetDockablePanelList(L); + if L.Count <= 1 then Exit; + + // Resize only the inmediate dockable panel sibling + // Find DP on the DockList + for I := 0 to L.Count - 1 do + if L[I] = DP then begin + DkPanel := L[I]; + Break; + end; + + // Find the inmediate resizable sibling + if Assigned(DkPanel) then + if ResizeType = dprtMinimizeOrRestore then begin + // Find the prev sibling + if I > 0 then + for J := I - 1 downto 0 do begin + if CanResizeAdjacent(L[J]) then begin + Result := L[J]; + IsAdjacent := J = I - 1; + Break; + end; + end; + // If not found find the next sibling + if not Assigned(Result) then + for J := I + 1 to L.Count - 1 do + if CanResizeAdjacent(L[J]) then begin + Result := L[J]; + IsAdjacent := J = I + 1; + Break; + end; + end + else begin + // Find the next sibling + if I + 1 < L.Count then + for J := I + 1 to L.Count - 1 do + if CanResizeAdjacent(L[J]) then begin + Result := L[J]; + IsAdjacent := J = I + 1; + Break; + end; + // If not found find the prev sibling + if not Assigned(Result) then + for J := I - 1 downto 0 do + if CanResizeAdjacent(L[J]) then begin + Result := L[J]; + IsAdjacent := J = I - 1; + Break; + end; + end; + finally + L.Free; + end; + end; +end; + +procedure SpDPUpdateDockPos(DPList: TList; IsVertical: Boolean); overload; +// Updates the DP.DockPos on all the DPs on the list +var + I, TotalDockPos: Integer; + DP: TSpTBXCustomDockablePanel; +begin + TotalDockPos := 0; + for I := 0 to DPList.Count - 1 do begin + DP := DPList[I]; + if IsVertical then begin + DP.DockPos := TotalDockPos; + Inc(TotalDockPos, DP.Height); + end + else begin + DP.DockPos := TotalDockPos; + Inc(TotalDockPos, DP.Width); + end; + end; +end; + +procedure SpDPUpdateDockPos(MultiDock: TSpTBXCustomMultiDock); overload; +// Updates the DP.DockPos on all the DPs on a MultiDock +var + L: TList; +begin + L := TList.Create; + MultiDock.BeginUpdate; + try + MultiDock.GetDockablePanelList(L); + SpDPUpdateDockPos(L, MultiDock.IsVertical); + finally + Multidock.EndUpdate; + L.Free; + end; +end; + +procedure SpDPSwapPos(MultiDock: TSpTBXCustomMultiDock; DP1, DP2: TSpTBXCustomDockablePanel); +// Swaps the positions of two DPs +var + L: TList; + I, DP1Index, DP2Index: Integer; + Temp: TSpTBXCustomDockablePanel; +begin + L := TList.Create; + MultiDock.BeginUpdate; + try + MultiDock.GetDockablePanelList(L); + + // Find the DPs indexes + DP1Index := -1; + DP2Index := -1; + for I := 0 to L.Count - 1 do begin + Temp := L[I]; + if Temp = DP1 then DP1Index := I; + if Temp = DP2 then DP2Index := I; + if (DP1Index > -1) and (DP2Index > -1) then Break; + end; + + if (DP1Index > -1) and (DP2Index > -1) then begin + // Swap the DPs + Temp := L[DP1Index]; + L[DP1Index] := L[DP2Index]; + L[DP2Index] := Temp; + // Adjust the Dock Pos + SpDPUpdateDockPos(L, MultiDock.IsVertical); + end; + finally + Multidock.EndUpdate; + L.Free; + end; +end; + +function SpDPResize(DP: TSpTBXCustomDockablePanel; NewSize: Integer; ResizeType: TSpTBXDPResizeType = dprtManualResize): Boolean; +var + PrevSize, Delta, MinSize: Integer; + MultiDock: TSpTBXCustomMultiDock; + DPSibling: TSpTBXCustomDockablePanel; + IsDPSiblingAdjacent: Boolean; +begin + Result := False; + + if DP.Docked then begin + if not (DP.CurrentDock is TSpTBXCustomMultiDock) then Exit; + + MultiDock := TSpTBXCustomMultiDock(DP.CurrentDock); + if MultiDock.ToolbarCount < 2 then Exit; + + MultiDock.BeginUpdate; + try + // Resize only the inmediate dockable panel sibling + DPSibling := SpDPInmediateResizableSibling(DP, ResizeType, IsDPSiblingAdjacent); + if Assigned(DPSibling) then begin + case ResizeType of + dprtManualResize, dprtMinimizeOrRestore, dprtMinimizeOrRestoreTaskPaneStyle: + begin + if MultiDock.IsVertical then begin + PrevSize := DP.Height; + DP.Height := NewSize; + Delta := DP.Height - PrevSize; + DPSibling.Height := DPSibling.Height - Delta; + end + else begin + PrevSize := DP.Width; + DP.Width := NewSize; + Delta := DP.Width - PrevSize; + DPSibling.Width := DPSibling.Width - Delta; + end; + SpDPUpdateDockPos(MultiDock); + end; + dprtSplitResize: + begin + // If DP can't be resized find another sibling + if DP.FixedDockedSize then begin + if MultiDock.IsVertical then + Delta := NewSize - DP.Height + else + Delta := NewSize - DP.Width; + + DP := DPSibling; + DPSibling := SpDPInmediateResizableSibling(DP, ResizeType, IsDPSiblingAdjacent); + if not Assigned(DPSibling) then + Exit; + + if MultiDock.IsVertical then begin + NewSize := DP.Height - Delta; + if (DPSibling.Height + Delta < DPSibling.MinClientHeight + (DockedBorderSize * 2)) or + (NewSize < DP.MinClientHeight + (DockedBorderSize * 2)) then + begin + Exit; + end; + DPSibling.Height := DPSibling.Height + Delta; + end + else begin + NewSize := DP.Width - Delta; + if (DPSibling.Width + Delta < DPSibling.MinClientWidth + (DockedBorderSize * 2)) or + (NewSize < DP.MinClientWidth + (DockedBorderSize * 2)) then + begin + Exit; + end; + DPSibling.Width := DPSibling.Width + Delta; + end; + end; + + // Resize the DP and DPSibling + if MultiDock.IsVertical then begin + if NewSize < DP.MinClientHeight + (DockedBorderSize * 2) then + Exit; + PrevSize := DP.Height; + Delta := NewSize - PrevSize; + MinSize := DPSibling.MinClientHeight + (DockedBorderSize * 2); + if DPSibling.Height - Delta < MinSize then begin + Delta := DPSibling.Height - MinSize; + if Delta <= 0 then Exit; + DP.Height := PrevSize + Delta; + end + else + DP.Height := NewSize; + end + else begin + if NewSize < DP.MinClientWidth + (DockedBorderSize * 2) then + Exit; + PrevSize := DP.Width; + Delta := NewSize - PrevSize; + MinSize := DPSibling.MinClientWidth + (DockedBorderSize * 2); + if DPSibling.Width - Delta < MinSize then begin + Delta := DPSibling.Width - MinSize; + if Delta <= 0 then Exit; + DP.Width := PrevSize + Delta; + end + else + DP.Width := NewSize; + end; + + if IsDPSiblingAdjacent then + if DP.EffectiveDockPos < DPSibling.EffectiveDockPos then + DPSibling.DockPos := DPSibling.EffectiveDockPos + Delta + else + DP.DockPos := DP.EffectiveDockPos - Delta; + end; + end; + + Result := True; + end; + finally + MultiDock.EndUpdate; + if ResizeType = dprtSplitResize then + SpDPUpdateDockPos(MultiDock) // Update DockPos of all the DPs, including the non-visible DPs + end; + end + else begin + // Not docked nor floating + DP.Width := NewSize + end; +end; + +function SpPtInMultiDock(P: TPoint; MultiDockList: TList): TSpTBXCustomMultiDock; +// Returns the Dock that is under the point, on screen coordinates +var + I: Integer; + MultiDock: TSpTBXCustomMultiDock; + R: TRect; +const + SnapBuffer = 24; + MinDockSize = 4; +begin + Result := nil; + for I := 0 to MultiDockList.Count - 1 do + if TControl(MultiDockList[I]) is TSpTBXCustomMultiDock then begin + MultiDock := TSpTBXCustomMultiDock(MultiDockList[I]); + GetWindowRect(MultiDock.Handle, R); + + // Ensure there is a minimum size for mouse sensibility + case MultiDock.Position of + dpxTop: + if (R.Bottom - R.Top) < MinDockSize then + Inc(R.Bottom, SnapBuffer); + dpxBottom: + if (R.Bottom - R.Top) < MinDockSize then + Dec(R.Top, SnapBuffer); + dpxLeft: + if (R.Right - R.Left) < MinDockSize then + Inc(R.Right, SnapBuffer); + dpxRight, dpxClient: + if (R.Right - R.Left) < MinDockSize then + Dec(R.Left, SnapBuffer); + end; + + if PtInRect(R, P) then begin + Result := MultiDock; + Break; + end; + end; +end; + +function SpPtInDP(P: TPoint; MultiDock: TSpTBXCustomMultiDock; OnlyOnTitleBar: Boolean): TSpTBXCustomDockablePanel; +// Returns a DP that is under the point, on screen coordinates +// If OnlyOnTitleBar is true it returns a DP if the point is under the DP's TitleBar. +var + I: Integer; + DP: TSpTBXCustomDockablePanel; + R: TRect; +begin + Result := nil; + for I := 0 to MultiDock.ToolbarCount - 1 do + if MultiDock.Toolbars[I] is TSpTBXCustomDockablePanel then begin + DP := TSpTBXCustomDockablePanel(MultiDock.Toolbars[I]); + if OnlyOnTitleBar then begin + if MultiDock.IsVertical then + GetWindowRect(DP.FToolbar.Handle, R) + else begin + // When the DP is horizontal track 20 pixels from the left + R.TopLeft := DP.ClientToScreen(Point(0, 0)); + R.BottomRight := DP.ClientToScreen(Point(20, DP.ClientHeight)); + end; + end + else + GetWindowRect(DP.Handle, R); + + if PtInRect(R, P) then begin + Result := DP; + Break; + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Painting helpers } + +procedure SpDrawXPDockablePanelTitleBar(ACanvas: TCanvas; ARect: TRect; IsActive, Vertical: Boolean); +begin + case SkinManager.GetSkinType of + sknNone, sknWindows: + begin + // [Theme-Change] + // When the XP theme is used just paint a gradient + SpGradientFill(ACanvas, ARect, SpLighten(clBtnFace, 12), SpLighten(clBtnFace, -12), not Vertical); + Windows.DrawEdge(ACanvas.Handle, ARect, BDR_RAISEDINNER, BF_RECT); + end; + sknSkin: + CurrentSkin.PaintBackground(ACanvas, ARect, skncDockablePanelTitleBar, sknsNormal, True, True, Vertical); + end; +end; + +procedure SpDrawXPDockablePanelBody(ACanvas: TCanvas; ARect: TRect; IsActive, IsFloating: Boolean); +var + C: TColor; +begin + case SkinManager.GetSkinType of + sknNone, sknWindows: + begin + C := ACanvas.Brush.Color; + ACanvas.Brush.Color := SpMixColors(clBtnFace, clWindow, 80); + ACanvas.FillRect(ARect); + if not IsFloating then begin + ACanvas.Brush.Color := clBtnFace; + ACanvas.FrameRect(ARect); + InflateRect(ARect, -1, -1); + ACanvas.Brush.Color := clWhite; + ACanvas.FrameRect(ARect); + end; + ACanvas.Brush.Color := C; + end; + sknSkin: + CurrentSkin.PaintBackground(ACanvas, ARect, skncDockablePanel, sknsNormal, True, not IsFloating); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Toolbar Load/Save Position helpers } + +procedure SpTBUpdateMultiDocksAfterLoad(const M: TSpTBXMultiDock); +// TBCustomLoadPositions doesn't correctly position the DPs after they are loaded. +// To reproduce: +// 1) Drop a top aligned MultiDock with 3 DPs (DP1, DP2, DP3), and drop a left +// aligned Multidock with a single DP (DP4) +// 2) Use TBIniLoadPositions in Form.OnShow and TBIniSavePositions in Form.OnClose +// 3) Run the app, position the top DPs in this order: DP4, DP3, DP1, and +// dock DP2 on the left aligned Multidock +// 4) Close and run the app, the top DPs are not correctly positioned/sized +// This happens because TBCustomLoadPositions updates the DockPos and Size +// after the toolbar Parent is set, toolbar by toolbar. +// DockPos and Size should be changed after all the toolbars parent is changed. +// http://news.jrsoftware.org/read/article.php?id=15131&group=jrsoftware.toolbar2000.thirdparty#15131 +var + J: Integer; + DP: TSpTBXCustomDockablePanel; + L: TList; + Sz: TSize; + R: TRect; +begin + L := TList.Create; + M.BeginUpdate; + try + M.GetDockablePanelList(L); + for J := 0 to L.Count - 1 do begin + DP := TSpTBXCustomDockablePanel(L[J]); + if DP.FLoadedDockPos > -1 then + DP.DockPos := DP.FLoadedDockPos; + Windows.GetClientRect(DP.Handle, R); + Sz := DP.FLoadedBarSize; + if M.IsVertical then begin + if Sz.cy > 0 then + DP.Height := DP.Height - R.Bottom + Sz.cy; + end + else begin + if Sz.cx > 0 then + DP.Width := DP.Width - R.Right + Sz.cx; + end; + end; + finally + M.EndUpdate; + L.Free; + end; +end; + +procedure SpTBUpdateAfterLoadIni(const OwnerComponent: TComponent; + const IniFile: TCustomIniFile; const SectionNamePrefix: string); +var + I, W, H: Integer; + MultiDock: TSpTBXMultiDock; + Splitter: TSpTBXCustomSplitter; +begin + for I := 0 to OwnerComponent.ComponentCount - 1 do begin + // Load the MultiDock size + if OwnerComponent.Components[I] is TSpTBXMultiDock then begin + MultiDock := TSpTBXMultiDock(OwnerComponent.Components[I]); + if MultiDock.ToolbarCount > 0 then begin + W := IniFile.ReadInteger(SectionNamePrefix + MultiDock.Name, rvMultiDockWidth, -1); + H := IniFile.ReadInteger(SectionNamePrefix + MultiDock.Name, rvMultiDockHeight, -1); + Splitter := MultiDock.GetAdjacentSplitter; + if Assigned(Splitter) then begin + case MultiDock.Align of + alLeft: if W > -1 then SpFixDelphiAlignBug(MultiDock, W, Splitter); + alTop: if H > -1 then SpFixDelphiAlignBug(MultiDock, H, Splitter); + alRight: if W > -1 then SpFixDelphiAlignBug(MultiDock, W, Splitter); + alBottom: if H > -1 then SpFixDelphiAlignBug(MultiDock, H, Splitter); + end; + end; + // Update the size and position of the DPs + SpTBUpdateMultiDocksAfterLoad(MultiDock); + end; + end; + + // Load Splitter.RestorePos + if OwnerComponent.Components[I] is TSpTBXCustomSplitter then begin + Splitter := TSpTBXCustomSplitter(OwnerComponent.Components[I]); + Splitter.FRestorePos := IniFile.ReadInteger(SectionNamePrefix + Splitter.Name, rvSplitterRestorePos, 60); + end; + end; +end; + +procedure SpTBUpdateAfterSaveIni(const OwnerComponent: TComponent; + const IniFile: TCustomIniFile; const SectionNamePrefix: string); +var + I: Integer; + MultiDock: TSpTBXMultiDock; + Splitter: TSpTBXCustomSplitter; +begin + for I := 0 to OwnerComponent.ComponentCount - 1 do begin + // Save the MultiDock size + if OwnerComponent.Components[I] is TSpTBXMultiDock then begin + MultiDock := TSpTBXMultiDock(OwnerComponent.Components[I]); + if MultiDock.ToolbarCount > 0 then begin + IniFile.WriteInteger(SectionNamePrefix + MultiDock.Name, rvMultiDockWidth, MultiDock.Width); + IniFile.WriteInteger(SectionNamePrefix + MultiDock.Name, rvMultiDockHeight, MultiDock.Height); + end; + end; + + // Save the Splitter.RestorePos + if OwnerComponent.Components[I] is TSpTBXCustomSplitter then begin + Splitter := TSpTBXCustomSplitter(OwnerComponent.Components[I]); + IniFile.WriteInteger(SectionNamePrefix + Splitter.Name, rvSplitterRestorePos, Splitter.FRestorePos); + end; + end; +end; + +procedure SpTBRegLoadPositions(const OwnerComponent: TComponent; + const RootKey: DWORD; const BaseRegistryKey: string); +var + Reg: TRegistryIniFile; +begin + TBRegLoadPositions(OwnerComponent, RootKey, BaseRegistryKey); + // Use TRegistryIniFile to call SpTBUpdateAfterLoadIni + Reg := TRegistryIniFile.Create('', KEY_QUERY_VALUE); + try + Reg.RegIniFile.RootKey := RootKey; + if Reg.RegIniFile.OpenKey(BaseRegistryKey, False) then + SpTBUpdateAfterLoadIni(OwnerComponent, Reg, ''); + finally + Reg.Free; + end; +end; + +procedure SpTBRegSavePositions(const OwnerComponent: TComponent; + const RootKey: DWORD; const BaseRegistryKey: string); +var + Reg: TRegistryIniFile; +begin + TBRegSavePositions(OwnerComponent, RootKey, BaseRegistryKey); + // Use TRegistryIniFile to call SpTBUpdateAfterSaveIni + Reg := TRegistryIniFile.Create(''); + try + Reg.RegIniFile.RootKey := RootKey; + Reg.RegIniFile.CreateKey(BaseRegistryKey); + if Reg.RegIniFile.OpenKey(BaseRegistryKey, True) then + SpTBUpdateAfterSaveIni(OwnerComponent, Reg, ''); + finally + Reg.Free; + end; +end; + +procedure SpTBIniLoadPositions(const OwnerComponent: TComponent; + const IniFile: TCustomIniFile; const SectionNamePrefix: string); +begin + TBIniLoadPositions(OwnerComponent, IniFile, SectionNamePrefix); + SpTBUpdateAfterLoadIni(OwnerComponent, IniFile, SectionNamePrefix); +end; + +procedure SpTBIniSavePositions(const OwnerComponent: TComponent; + const IniFile: TCustomIniFile; const SectionNamePrefix: string); +begin + TBIniSavePositions(OwnerComponent, IniFile, SectionNamePrefix); + SpTBUpdateAfterSaveIni(OwnerComponent, IniFile, SectionNamePrefix); +end; + +procedure SpTBIniLoadPositions(const OwnerComponent: TComponent; + const Filename, SectionNamePrefix: string); +// Use TMemIniFile instead of TIniFile for better readability and to solve +// the #7363 bug report from QC: http://qc.borland.com/wc/qcmain.aspx?d=7363 +var + MemIniFile: TMemIniFile; +begin + MemIniFile := TMemIniFile.Create(Filename); + try + SpTBIniLoadPositions(OwnerComponent, MemIniFile, SectionNamePrefix); + finally + MemIniFile.Free; + end; +end; + +procedure SpTBIniSavePositions(const OwnerComponent: TComponent; + const Filename, SectionNamePrefix: string); +// Use TMemIniFile instead of TIniFile for better readability and to solve +// the #7363 bug report from QC: http://qc.borland.com/wc/qcmain.aspx?d=7363 +var + MemIniFile: TMemIniFile; +begin + MemIniFile := TMemIniFile.Create(Filename); + try + SpTBIniSavePositions(OwnerComponent, MemIniFile, SectionNamePrefix); + MemIniFile.UpdateFile; + finally + MemIniFile.Free; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomMultiDock } + +constructor TSpTBXCustomMultiDock.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + inherited LimitToOneRow := True; + FAutoSplitterVisibility := True; + FLimitToOneRow := True; + FPosition := dpxTop; + SetPosition(dpxLeft); + inherited OnInsertRemoveBar := DoInsertRemoveBar; + inherited OnRequestDock := DoRequestDock; +end; + +procedure TSpTBXCustomMultiDock.DoInsertRemoveBar(Sender: TObject; + Inserting: Boolean; Bar: TTBCustomDockableWindow); +var + SpacingDelta: Integer; + Splitter: TSpTBXCustomSplitter; +begin + // Automatically Show or Hide the adjacent splitter when + // the MultiDock is empty + if FAutoSplitterVisibility then begin + if Inserting and (ToolbarCount = 1) then + SpacingDelta := -1 // Inserting on an empty Dock + else + SpacingDelta := 1; + + Splitter := GetAdjacentSplitter(SpacingDelta); + + if Assigned(Splitter) then begin + if Inserting and (ToolbarCount = 1) then begin + // Inserting on an empty Dock, re-align adjacent splitter + // When Width/Height = 0 the realign must be done by SetParent + Splitter.Visible := True; + if (IsVertical and (Width > 0)) or (not IsVertical and (Height > 0)) then + InsertingOnEmptyDock; + end + else begin + if ToolbarCount = 0 then + Splitter.Visible := False; + end; + end; + end; + + if Assigned(FOnInsertRemoveBar) then FOnInsertRemoveBar(Sender, Inserting, Bar); +end; + +procedure TSpTBXCustomMultiDock.DoRequestDock(Sender: TObject; + Bar: TTBCustomDockableWindow; var Accept: Boolean); +begin + Accept := Assigned(Bar) and (Bar is TSpTBXCustomDockablePanel); + if Accept then + if Assigned(FOnRequestDock) then FOnRequestDock(Sender, Bar, Accept); +end; + +procedure TSpTBXCustomMultiDock.AlignControls(AControl: TControl; + var Rect: TRect); +begin + inherited; + if FPosition = dpxClient then + UpdateDPLateralSize(Width, Height); +end; + +function CompareEffectiveDockPos(Item1, Item2: Pointer): Integer; +begin + Result := TSpTBXCustomDockablePanel(Item1).EffectiveDockPos - TSpTBXCustomDockablePanel(Item2).EffectiveDockPos; +end; + +procedure TSpTBXCustomMultiDock.GetDockablePanelList(DPList: TList); +var + I: Integer; + T: TTBCustomDockableWindow; +begin + DPList.Clear; + for I := 0 to ToolbarCount - 1 do begin + T := Toolbars[I]; + if T is TSpTBXCustomDockablePanel then + DPList.Add(T); + end; + // Sort the list based on the dock pos + DPList.Sort(CompareEffectiveDockPos); +end; + +function TSpTBXCustomMultiDock.GetAdjacentSplitter(SpacingDelta: Integer = 1): TSpTBXCustomSplitter; +begin + if Assigned(FLastSplitter) then + Result := FLastSplitter + else begin + Result := SpAdjacentSplitter(Self, SpacingDelta); + if Result <> FLastSplitter then begin + if Assigned(FLastSplitter) then FLastSplitter.RemoveFreeNotification(Self); + FLastSplitter := Result; + if Assigned(FLastSplitter) then + FLastSplitter.FreeNotification(Self); + end; + end; +end; + +procedure TSpTBXCustomMultiDock.GetDockablePanelDockIndex(DPList: TList; + DP: TSpTBXCustomDockablePanel; out DPDockIndex: Integer); +var + I: Integer; +begin + DPDockIndex := -1; + GetDockablePanelList(DPList); + for I := 0 to DPList.Count - 1 do + if DPList[I] = DP then begin + DPDockIndex := I; + Break; + end; +end; + +procedure TSpTBXCustomMultiDock.InsertingOnEmptyDock; +var + Splitter: TSpTBXCustomSplitter; +begin + // When a DP is docked on an empty right/bottom aligned MultiDock and there's + // an adjacent Splitter, the Splitter is moved to the right/bottom side + // of the MultiDock: + // http://news.jrsoftware.org/read/article.php?id=14410&group=jrsoftware.toolbar2000.thirdparty#14410 + // To fix this, re align the Splitter after the MultiDock is resized. + Splitter := GetAdjacentSplitter; + if Assigned(Splitter) then begin + Parent.DisableAlign; + try + case Splitter.Align of + alTop: Splitter.Top := Top + Height + 1; + alBottom: Splitter.Top := Top - 1; + alLeft: Splitter.Left := Left + Width + 1; + alRight: Splitter.Left := Left - 1; + end; + finally + Parent.EnableAlign; + end; + end; +end; + +function TSpTBXCustomMultiDock.IsVertical: Boolean; +begin + Result := not (Position in [dpxTop, dpxBottom]); +end; + +procedure TSpTBXCustomMultiDock.Loaded; +var + Splitter: TSpTBXCustomSplitter; +begin + inherited; + + // Automatically Hide the adjacent splitter when + // the MultiDock is empty + if FAutoSplitterVisibility and (ToolbarCount = 0) then begin + Splitter := GetAdjacentSplitter; + if Assigned(Splitter) then + Splitter.Visible := False; + end; +end; + +procedure TSpTBXCustomMultiDock.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if (Operation = opRemove) and (AComponent = FLastSplitter) then + FLastSplitter := nil; +end; + +procedure TSpTBXCustomMultiDock.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); +begin + inherited; + UpdateDPLateralSize(AWidth, AHeight); +end; + +procedure TSpTBXCustomMultiDock.SetLimitToOneRow(const Value: Boolean); +begin + FLimitToOneRow := True; +end; + +procedure TSpTBXCustomMultiDock.SetPosition(const Value: TSpTBXDockPosition); +begin + if FPosition <> Value then begin + if (ControlCount <> 0) then + raise EInvalidOperation.Create(STBDockCannotChangePosition); + FPosition := Value; + case Value of + dpxLeft: inherited Position := dpLeft; + dpxTop: inherited Position := dpTop; + dpxRight: inherited Position := dpRight; + dpxBottom: inherited Position := dpBottom; + dpxClient: + begin + inherited Position := dpRight; + Align := alClient; + end; + end; + ArrangeToolbars; + end; +end; + +procedure TSpTBXCustomMultiDock.UpdateDPLateralSize(AWidth, AHeight: Integer); +// Update the lateral size of all the DPs relative to the MultiDock +// This causes flicker! +var + L: TList; + I: Integer; + DP: TSpTBXCustomDockablePanel; +begin + FUpdatingLateralSize := True; + BeginUpdate; + L := TList.Create; + try + GetDockablePanelList(L); + for I := 0 to L.Count - 1 do begin + DP := TSpTBXCustomDockablePanel(L[I]); + if IsVertical then + DP.Width := AWidth + else + DP.Height := AHeight; + end; + finally + L.Free; + EndUpdate; + FUpdatingLateralSize := False; + end; +end; + +procedure TSpTBXCustomMultiDock.ValidateInsert(AComponent: TComponent); +begin + inherited; + if not (AComponent is TSpTBXCustomDockablePanel) then + raise EInvalidOperation.CreateFmt('Cannot insert %s into MultiDock', [AComponent.ClassName]); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXDockablePanelButtonOptions } + +constructor TSpTBXDockablePanelButtonOptions.Create(AParent: TWinControl); +begin + FDockablePanel := AParent as TSpTBXCustomDockablePanel; + inherited; + Maximize := False; + Minimize := False; + TitleBarMaxSize := 19; +end; + +procedure TSpTBXDockablePanelButtonOptions.CreateButtons; +begin + FToolbar := FDockablePanel.FToolbar; + inherited; +end; + +procedure TSpTBXDockablePanelButtonOptions.ButtonsClick(Sender: TObject); +begin + if Sender = MinimizeButton then FDockablePanel.SizeToggle(False) + else if Sender = MaximizeButton then FDockablePanel.SizeToggle(True) + else if Sender = CloseButton then FDockablePanel.Close; +end; + +function TSpTBXDockablePanelButtonOptions.Restoring(B: TSpTBXCustomItem): Boolean; +begin + Result := False; + if Assigned(FDockablePanel) then + if B = MinimizeButton then + Result := FDockablePanel.Minimized + else + if B = MaximizeButton then + Result := FDockablePanel.Maximized; +end; + +procedure TSpTBXDockablePanelButtonOptions.SetupButton(B: TSpTBXCustomItem); +begin + inherited; + TSpTBXCustomItemAccess(B).CustomWidth := 15; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXDockablePanelToolbar } + +constructor TSpTBXDockablePanelToolbar.Create(AOwner: TComponent); +begin + inherited; + CompoundToolbar := True; +end; + +function TSpTBXDockablePanelToolbar.GetItemsTextColor(State: TSpTBXSkinStatesType): TColor; +begin + Result := CurrentSkin.GetTextColor(skncDockablePanelTitleBar, State); +end; + +function TSpTBXDockablePanelToolbar.GetParentDockablePanel: TSpTBXCustomDockablePanel; +var + P: TWinControl; +begin + Result := nil; + P := Parent; + while Assigned(P) do + if P is TSpTBXCustomDockablePanel then begin + Result := P as TSpTBXCustomDockablePanel; + Break; + end + else + P := P.Parent; +end; + +function TSpTBXDockablePanelToolbar.GetRightAlignMargin: Integer; +begin + Result := 4; +end; + +function TSpTBXDockablePanelToolbar.CanItemClick(Item: TTBCustomItem; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer): Boolean; +var + TransparentClick: Boolean; + DP: TSpTBXCustomDockablePanel; +begin + Result := True; + + // Move the DockablePanel if the toolbar client area or an item with + // tbisClicksTransparent itemstyle is clicked (like a LabelItem) + if Button = mbLeft then begin + DP := GetParentDockablePanel; + if Assigned(DP) and DP.IsMovable then begin + if Assigned(Item) then + TransparentClick := tbisClicksTransparent in TTBCustomItemAccess(Item).ItemStyle + else + TransparentClick := True; + if TransparentClick then + if ssDouble in Shift then + DP.DoubleClick + else begin + Result := False; + SendMessage(DP.Handle, WM_NCLBUTTONDOWN, HT_TB2k_Border, 0); + end; + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomDockablePanel } + +constructor TSpTBXCustomDockablePanel.Create(AOwner: TComponent); +begin + inherited; + + FLoadedDockPos := -1; + FLoadedBarSize.cx := -1; + FLoadedBarSize.cy := -1; + + Stretch := True; + DragHandleStyle := dhNone; + + SetBounds(Left, Top, 160, 128); + + FPanel := TPanel.Create(Self); + FPanel.Parent := Self; + FPanel.Align := alTop; + FPanel.BevelOuter := bvNone; + + FToolbarDock := TSpTBXDock.Create(Self); + FToolbarDock.Parent := FPanel; + FToolbarDock.OnRequestDock := DockRequestDock; + FToolbarDock.OnDrawBackground := DockDrawBackground; + FToolbarDock.OnResize := DockResize; + + FToolbar := TSpTBXDockablePanelToolbar.Create(Self); + FToolbar.Parent := FToolbarDock; + FToolbar.CurrentDock := FToolbarDock; + FToolbar.Name := Name + 'Toolbar'; + FToolbar.Customizable := False; + FToolbar.BorderStyle := bsNone; + FToolbar.DockMode := dmCannotFloatOrChangeDocks; + FToolbar.DragHandleStyle := dhNone; + FToolbar.Options := FToolbar.Options + [tboNoAutoHint]; + FToolbar.Stretch := True; + FToolbar.ShrinkMode := tbsmNone; + FToolbar.ShowCaption := False; + FToolbar.OnDrawBackground := ToolbarDrawBackground; + + FOptions := TSpTBXDockablePanelButtonOptions.Create(Self); + FOptions.CaptionLabel := Caption; + + inherited ShowCaption := False; // Re-publish it, should always be False + FShowCaption := True; + FShowCaptionWhenDocked := True; + + DockResize(FToolbarDock); // Adjust ToolbarDock resizing +end; + +procedure TSpTBXCustomDockablePanel.CreateParams(var Params: TCreateParams); +begin + inherited CreateParams(Params); + + if not (csDesigning in ComponentState) then + with Params do + Params.Style := Params.Style or WS_CLIPCHILDREN; +end; + +destructor TSpTBXCustomDockablePanel.Destroy; +begin + FOptions.Free; + FToolbar.Free; + FToolbarDock.Free; + FPanel.Free; + + inherited; + + FreeAndNil(FDockForms); // After inherited, Notification accesses FDockForms +end; + +procedure TSpTBXCustomDockablePanel.Loaded; +var + I: Integer; + C: TControl; + DesignerRootItem: TTBCustomItem; +begin + inherited; + + // The parent of TTBControlItem.Control should be the toolbar, not Self + // (as setted in GetChildren for dfm streaming). + DesignerRootItem := GetItems; + for I := 0 to DesignerRootItem.Count - 1 do + if DesignerRootItem[I] is TTBControlItem then begin + C := TTBControlItem(DesignerRootItem[I]).Control; + if Assigned(C) and (C.Parent <> FToolbar) then + C.Parent := FToolbar; + end; +end; + +procedure TSpTBXCustomDockablePanel.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if Operation = opRemove then + RemoveFromList(FDockForms, AComponent); +end; + +function TSpTBXCustomDockablePanel.Maximize: Boolean; +var + PrevState: TWindowState; +begin + Result := False; + if not Maximized then begin + // [DockablePanel-Rule] + // Do not maximize if it's the only DP on the dock + if Docked and (CurrentDock.ToolbarCount > 1) then begin + PrevState := FState.DockedState; + FIsManualSizing := True; + try + if InternalMaximize(False) then begin + Result := True; + FState.DockedState := wsMaximized; + FOptions.SetupButtonIcon(FOptions.MinimizeButton); + FOptions.SetupButtonIcon(FOptions.MaximizeButton); + end + else + FState.DockedState := PrevState; + finally + FIsManualSizing := False; + end; + end; + end; + + if Result then + DoWindowStateChanged(wsMaximized); +end; + +function TSpTBXCustomDockablePanel.Maximized: Boolean; +begin + if Floating then + Result := False + else + Result := FState.DockedState = wsMaximized; +end; + +function TSpTBXCustomDockablePanel.Minimize: Boolean; +var + CanMinimize: Boolean; + I, MinimizedCount: Integer; + L: TList; + MultiDock: TSpTBXCustomMultiDock; + RS: TSpTBXDPResizeType; +begin + Result := False; + if Floating then begin + if FState.DockedState <> wsMinimized then begin + FState.DockedState := wsMinimized; + FState.RestoreSize := Parent.Height; + Parent.ClientHeight := FPanel.Height; + FOptions.SetupButtonIcon(FOptions.MinimizeButton); + FOptions.SetupButtonIcon(FOptions.MaximizeButton); + Result := True; + end; + end + else + if Docked and (FState.DockedState <> wsMinimized) and (CurrentDock is TSpTBXCustomMultiDock) then begin + MultiDock := TSpTBXCustomMultiDock(CurrentDock); + L := TList.Create; + try + MultiDock.GetDockablePanelList(L); + // [DockablePanel-Rule] + // Only minimize if it's horizontal and is the only DP on the dock + // Or if it's vertical and it's not the only DP on the dock and the rest of the siblings are not minimized + MinimizedCount := 0; + if not MultiDock.IsVertical then + CanMinimize := L.Count = 1 + else begin + for I := 0 to L.Count - 1 do + if TSpTBXCustomDockablePanel(L[I]).FState.DockedState = wsMinimized then + Inc(MinimizedCount); + CanMinimize := (L.Count > 1) and (L.Count - 1 > MinimizedCount); + end; + + if CanMinimize then begin + FIsManualSizing := True; + try + if Height > FPanel.Height then + FState.RestoreSize := Height; + if Options.TaskPaneStyleResize then + RS := dprtMinimizeOrRestoreTaskPaneStyle + else + RS := dprtMinimizeOrRestore; + SpDPResize(Self, FPanel.Height, RS); + FState.DockedState := wsMinimized; + FOptions.SetupButtonIcon(FOptions.MinimizeButton); + FOptions.SetupButtonIcon(FOptions.MaximizeButton); + Result := True; + finally + FIsManualSizing := False; + end; + end; + + finally + L.Free; + end; + end; + + if Result then + DoWindowStateChanged(wsMinimized); +end; + +function TSpTBXCustomDockablePanel.Minimized: Boolean; +begin + Result := FState.DockedState = wsMinimized; +end; + +procedure TSpTBXCustomDockablePanel.MouseDown(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + // Don't let the DP be dragged by the client area + // Override TTBCustomDockableWindow.MouseDown + if (Button <> mbLeft) or not IsMovable then + inherited + else + if Assigned(OnMouseDown) then OnMouseDown(Self, Button, Shift, X, Y); +end; + +procedure TSpTBXCustomDockablePanel.Resize; +var + TotalBorderSize: Integer; +begin + inherited; + + if Floating and Assigned(Parent) then begin + // When Floating the caption panel is always horizontal + // Make sure to calculate the floating form constraints taking into + // account the borders and the close button. + TotalBorderSize := GetFloatingBorderSize.Y * 2; + Parent.Constraints.MinWidth := 20 + TotalBorderSize; + Parent.Constraints.MinHeight := FPanel.Height + TotalBorderSize; + if (FState.DockedState = wsMinimized) and (Parent.ClientHeight > FPanel.Height) then begin + FState.DockedState := wsNormal; + FOptions.SetupButtonIcon(FOptions.MinimizeButton); + end; + end + else begin + if (FState.DockedState = wsMinimized) and (ClientHeight > FPanel.Height) then begin + FState.DockedState := wsNormal; + FOptions.SetupButtonIcon(FOptions.MinimizeButton); + end; + end; +end; + +function TSpTBXCustomDockablePanel.Restore: Boolean; +var + I: Integer; + DkPanel: TSpTBXCustomDockablePanel; + RS: TSpTBXDPResizeType; +begin + Result := False; + FIsManualSizing := True; + try + if Floating then begin + if FState.DockedState = wsMinimized then begin + FState.DockedState := wsNormal; + Parent.Height := FState.RestoreSize; + Result := True; + end; + end + else + if Docked then begin + case FState.DockedState of + wsNormal: ; + wsMinimized: + begin + if Options.TaskPaneStyleResize then + RS := dprtMinimizeOrRestoreTaskPaneStyle + else + RS := dprtMinimizeOrRestore; + Result := SpDPResize(Self, FState.RestoreSize, RS); + if Result then begin + FState.DockedState := wsNormal; + + // If a sibling was Maximized restore it + if Assigned(CurrentDock) then begin + for I := 0 to CurrentDock.ToolbarCount - 1 do + if (CurrentDock.Toolbars[I] <> Self) and (CurrentDock.Toolbars[I] is TSpTBXCustomDockablePanel) then begin + DkPanel := TSpTBXCustomDockablePanel(CurrentDock.Toolbars[I]); + if DkPanel.Maximized then begin + DkPanel.FState.DockedState := wsNormal; + DkPanel.Options.SetupButtonIcon(DkPanel.Options.MaximizeButton); + Break; + end; + end; + end; + end; + end; + wsMaximized: + begin + Result := InternalMaximize(True); + if Result then + FState.DockedState := wsNormal; + end; + end; + end; + + FOptions.SetupButtonIcon(FOptions.MinimizeButton); + FOptions.SetupButtonIcon(FOptions.MaximizeButton); + finally + FIsManualSizing := False; + end; + + if Result then + DoWindowStateChanged(wsNormal); +end; + +procedure TSpTBXCustomDockablePanel.AddDockForm(const Form: TTBCustomForm); +begin + if Assigned(Form) and AddToList(FDockForms, Form) then + Form.FreeNotification(Self); +end; + +procedure TSpTBXCustomDockablePanel.RemoveDockForm(const Form: TTBCustomForm); +begin + RemoveFromList(FDockForms, Form); +end; + +procedure TSpTBXCustomDockablePanel.BeginDockedMoving; + + function DockDPOnMultiDock(DockList: TList; CursorPos: TPoint): Boolean; + var + MultiDock: TSpTBXCustomMultiDock; + DP: TSpTBXCustomDockablePanel; + begin + Result := False; + MultiDock := SpPtInMultiDock(CursorPos, DockList); + if Assigned(MultiDock) then begin + Result := True; + MultiDock.DoRequestDock(MultiDock, Self, Result); + end; + + if Result then begin + // Dock the DP if the cursor is over a valid dock + DP := SpPtInDP(CursorPos, MultiDock, False); + if Assigned(DP) then begin + if MultiDock.IsVertical then + DockPos := DP.EffectiveDockPos + (DP.Height) div 2 + else + DockPos := DP.EffectiveDockPos + (DP.Width) div 2; + end; + CurrentDock := MultiDock; + end + end; + + procedure MouseMoved(DockList: TList; ClientClickPos: TPoint; + OldCursor: HCURSOR; PreventDocking: Boolean; var OldCursorPos: TPoint); + var + CursorPos, Delta: TPoint; + R, TitleBarR, FloatR1, FloatR2: TRect; + MultiDock: TSpTBXCustomMultiDock; + DP: TSpTBXCustomDockablePanel; + FloatingW: Integer; + begin + GetCursorPos(CursorPos); + if (CursorPos.X = OldCursorPos.X) and (CursorPos.Y = OldCursorPos.Y) then Exit; + + SetCursor(OldCursor); + + if Docked and (CurrentDock is TSpTBXCustomMultiDock) then begin + GetWindowRect(CurrentDock.Handle, R); + if PtInRect(R, CursorPos) then begin + MultiDock := TSpTBXCustomMultiDock(CurrentDock); + DP := SpPtInDP(CursorPos, MultiDock, True); + if Assigned(DP) then begin + // The cursor is over another dockable window, swap the pos + SpDPSwapPos(MultiDock, Self, DP); + end; + end + else begin + // Change the cursor if it can't float + if DockMode = dmCanFloat then begin + // The cursor is outside the Dock, make the DP float + // Position the DP at the center of the clicked point + if FFloatingClientWidth > 0 then + FloatingW := FFloatingClientWidth + else + FloatingW := ClientAreaWidth; + FloatingPosition := Point(CursorPos.X - (FloatingW div 2), CursorPos.Y - 10); + Floating := True; + MoveOnScreen(True); + end + else begin + SetCursor(LoadCursor(0, IDC_NO)); + if DockMode = dmCannotFloat then + // The DP can't float but can be re-docked on a different MultiDock + DockDPOnMultiDock(DockList, CursorPos); + end; + end; + OldCursorPos := CursorPos; + end + else + if Floating then + if DockMode <> dmCanFloat then + SetCursor(LoadCursor(0, IDC_NO)) + else begin + // Clip the point so it doesn't get dragged under the taskbar + R := GetRectOfMonitorContainingPoint(CursorPos, True); + if CursorPos.X < R.Left then CursorPos.X := R.Left; + if CursorPos.X > R.Right then CursorPos.X := R.Right; + if CursorPos.Y < R.Top then CursorPos.Y := R.Top; + if CursorPos.Y > R.Bottom then CursorPos.Y := R.Bottom; + + // Try to dock it on a MultiDock + if not PreventDocking and DockDPOnMultiDock(DockList, CursorPos) then + OldCursorPos := CursorPos + else begin + Delta := Point(CursorPos.X - OldCursorPos.X, CursorPos.Y - OldCursorPos.Y); + + // Make sure the TitleBar is still accessible if it's dragged almost + // completely off the screen so it can be dragged back. + GetWindowRect(FToolbar.Handle, TitleBarR); + OffsetRect(TitleBarR, Delta.X, Delta.Y); + with GetFloatingBorderSize do + InflateRect(TitleBarR, -X, -Y); + if TitleBarR.Right < R.Left then Delta.X := 0; + if TitleBarR.Left > R.Right then Delta.X := 0; + if TitleBarR.Bottom < R.Top then Delta.Y := 0; + if TitleBarR.Top > R.Bottom then Delta.Y := 0; + + // Move the floating DP + GetWindowRect(Parent.Handle, FloatR1); + FloatingPosition := Point(Parent.Left + Delta.X, Parent.Top + Delta.Y); + GetWindowRect(Parent.Handle, FloatR2); + + // Don't change OldCursorPos if the floating DP wasn't moved + if not EqualRect(FloatR1, FloatR2) then begin + if FloatR1.Left <> FloatR2.Left then + OldCursorPos.X := CursorPos.X; + if FloatR1.Top <> FloatR2.Top then + OldCursorPos.Y := CursorPos.Y; + end; + end; + end; + end; + +var + L: TList; + ClientClickPos, OldCursorPos: TPoint; + OldCursor: HCURSOR; + PreventDocking: Boolean; + Msg: TMsg; +begin + L := TList.Create; + FIsDockedMoving := True; + try + OldCursor := GetCursor; // Save the original mouse cursor + + SpDPGetDockableMultiDockList(Self, L); + + SetCapture(Handle); + GetCursorPos(OldCursorPos); + ClientClickPos := ScreenToClient(OldCursorPos); + PreventDocking := GetKeyState(VK_CONTROL) < 0; + + while GetCapture = Handle do begin + case Integer(GetMessage(Msg, 0, 0, 0)) of + -1: Break; // if GetMessage failed + 0: begin + // Repost WM_QUIT messages + PostQuitMessage(Msg.WParam); + Break; + end; + end; + case Msg.Message of + WM_KEYDOWN, WM_KEYUP: + if (Msg.wParam = VK_CONTROL) and (PreventDocking <> (Msg.Message = WM_KEYDOWN)) then begin + PreventDocking := Msg.Message = WM_KEYDOWN; + MouseMoved(L, ClientClickPos, OldCursor, PreventDocking, OldCursorPos); + end + else + if Msg.wParam = VK_ESCAPE then Break; + WM_MOUSEMOVE: + MouseMoved(L, ClientClickPos, OldCursor, PreventDocking, OldCursorPos); + WM_LBUTTONDOWN, WM_LBUTTONDBLCLK: + Break; + WM_LBUTTONUP: + Break; + WM_RBUTTONDOWN..WM_MBUTTONDBLCLK: ; + else + TranslateMessage(Msg); + DispatchMessage(Msg); + end; + end; + + finally + if GetCapture = Handle then + ReleaseCapture; + FIsDockedMoving := False; + L.Free; + end; +end; + +procedure TSpTBXCustomDockablePanel.BeginSplitResizing(HitTest: Integer); + + procedure MouseMoved(DP: TSpTBXCustomDockablePanel; VerticalSplitting: Boolean; var OldCursorPos: TPoint); + var + CursorPos: TPoint; + Delta: Integer; + begin + GetCursorPos(CursorPos); + if (CursorPos.X = OldCursorPos.X) and (CursorPos.Y = OldCursorPos.Y) then Exit; + + if VerticalSplitting then begin + Delta := CursorPos.Y - OldCursorPos.Y; + if Delta = 0 then Exit; + if not SpDPResize(DP, DP.Height + Delta, dprtSplitResize) then + Exit; // Exit if it couldn't be resized + end + else begin + Delta := CursorPos.X - OldCursorPos.X; + if Delta = 0 then Exit; + if not SpDPResize(DP, DP.Width + Delta, dprtSplitResize) then + Exit; // Exit if it couldn't be resized + end; + + OldCursorPos := CursorPos; + end; + +var + M: TSpTBXCustomMultiDock; + L: TList; + VerticalSplitting: Boolean; + DockIndex: Integer; + OldCursorPos: TPoint; + Msg: TMsg; + EffectivePanel: TSpTBXCustomDockablePanel; + Form: TCustomForm; +begin + if not (CurrentDock is TSpTBXCustomMultiDock) then Exit; + M := TSpTBXCustomMultiDock(CurrentDock); + + // Get the EffectivePanel + EffectivePanel := Self; + VerticalSplitting := False; + case HitTest of + HT_DP_SPLITRESIZELEFT, HT_DP_SPLITRESIZETOP: + begin + // If we are grabbing the left or top side of the DP the + // EffectivePanel should be the previous sibling + L := TList.Create; + try + M.GetDockablePanelDockIndex(L, Self, DockIndex); + if DockIndex > 0 then + EffectivePanel := TSpTBXCustomDockablePanel(L[DockIndex - 1]); + if HitTest = HT_DP_SPLITRESIZETOP then + VerticalSplitting := True; + finally + L.Free; + end; + end; + HT_DP_SPLITRESIZEBOTTOM: VerticalSplitting := True; + HT_DP_SPLITRESIZERIGHT: VerticalSplitting := False; + end; + + try + SetCapture(Handle); + GetCursorPos(OldCursorPos); + + while GetCapture = Handle do begin + case Integer(GetMessage(Msg, 0, 0, 0)) of + -1: Break; { if GetMessage failed } + 0: begin + { Repost WM_QUIT messages } + PostQuitMessage(Msg.WParam); + Break; + end; + end; + case Msg.Message of + WM_KEYDOWN, WM_KEYUP: + if Msg.WParam = VK_ESCAPE then Break; + WM_MOUSEMOVE: + MouseMoved(EffectivePanel, VerticalSplitting, OldCursorPos); + WM_LBUTTONDOWN, WM_LBUTTONDBLCLK: + Break; + WM_LBUTTONUP: + Break; + WM_RBUTTONDOWN..WM_MBUTTONDBLCLK: ; + else + TranslateMessage(Msg); + DispatchMessage(Msg); + end; + end; + + finally + if GetCapture = Handle then + ReleaseCapture; + if csDesigning in ComponentState then begin + Form := GetParentForm(Self); + if (Form <> nil) and (Form.Designer <> nil) then + Form.Designer.Modified; + end; + end; +end; + +function TSpTBXCustomDockablePanel.CanSplitResize(EdgePosition: TTBDockPosition): Boolean; +var + M: TSpTBXCustomMultiDock; + L: TList; +begin + Result := Docked and (CurrentDock is TSpTBXCustomMultiDock) and HandleAllocated; + + if not Result then Exit; + + M := TSpTBXCustomMultiDock(CurrentDock); + + L := TList.Create; + try + M.GetDockablePanelList(L); + + if M.IsVertical then begin + case EdgePosition of + dpTop: Result := EffectiveDockPos > 0; + dpBottom: Result := L.Last <> Self; + else + Result := False; + end; + end + else begin + case EdgePosition of + dpLeft: Result := EffectiveDockPos > 0; + dpRight: Result := L.Last <> Self; + else + Result := False; + end; + end; + finally + L.Free; + end; +end; + +procedure TSpTBXCustomDockablePanel.ConstrainedResize(var MinWidth, MinHeight, + MaxWidth, MaxHeight: Integer); +var + Sz: TPoint; + M: TSpTBXCustomMultiDock; +begin + Sz := CalcNCSizes; + + if MinClientWidth > 0 then MinWidth := MinClientWidth + Sz.X; + if MinClientHeight > 0 then MinHeight := MinClientHeight + Sz.Y; + if MaxClientWidth > 0 then MaxWidth := MaxClientWidth + Sz.X; + if MaxClientHeight > 0 then MaxHeight := MaxClientHeight + Sz.Y; + + // Disallow lateral Width change when the DP is docked + if Docked and (CurrentDock is TSpTBXCustomMultiDock) then begin + M := TSpTBXCustomMultiDock(CurrentDock); + if M.IsVertical then begin + if not M.UpdatingLateralSize then + MinWidth := Width; + if FFixedDockedSize and not FIsManualSizing and not (csDesigning in ComponentState) then begin + MinHeight := Height; + MaxHeight := Height; + end; + end + else begin + if not M.UpdatingLateralSize then + MinHeight := Height; + if FFixedDockedSize and not FIsManualSizing and not (csDesigning in ComponentState) then begin + MinWidth := Width; + MaxWidth := Width; + end; + end; + end; +end; + +procedure TSpTBXCustomDockablePanel.DockDrawBackground(Sender: TObject; + ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +var + DefaultPainting: Boolean; +begin + if PaintStage = pstPrePaint then begin + PaintDefault := False; + + if Docked and not Floating then begin + // When the DP is not floating draws the CaptionBar borders on the NC area + // of the DockablePanel, see InternalDrawBackground + // Just draw 1 pixel from the left and right, and 2 pixels from the top + // ARect.Bottom should remain the same + if IsVerticalTitleBar then begin + InflateRect(ARect, 0, 1); + ARect.Left := ARect.Left - DockedBorderSize; + end + else begin + InflateRect(ARect, 1, 0); + ARect.Top := ARect.Top - DockedBorderSize; + end; + end; + + DefaultPainting := True; + DoDrawCaptionPanel(ACanvas, ARect, pstPrePaint, DefaultPainting); + if DefaultPainting then + SpDrawXPDockablePanelTitleBar(ACanvas, ARect, True, IsVerticalTitleBar); + DefaultPainting := True; + DoDrawCaptionPanel(ACanvas, ARect, pstPostPaint, DefaultPainting); + end; +end; + +procedure TSpTBXCustomDockablePanel.ToolbarDrawBackground(Sender: TObject; + ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +begin + // Let the background be painted by the Dock + if PaintStage = pstPrePaint then + PaintDefault := False; +end; + +procedure TSpTBXCustomDockablePanel.DockRequestDock(Sender: TObject; + Bar: TTBCustomDockableWindow; var Accept: Boolean); +begin + Accept := False; + if Assigned(FToolbar) then + Accept := Bar = FToolbar; +end; + +procedure TSpTBXCustomDockablePanel.DockResize(Sender: TObject); +begin + if IsVerticalTitleBar then begin + // If the Panel is left/right aligned + if FPanel.Width <> FToolbarDock.Width then begin + FPanel.Width := FToolbarDock.Width; + if Floating and Assigned(Parent) then begin + Parent.Constraints.MinWidth := FPanel.Width + GetFloatingBorderSize.X * 2; + Parent.Constraints.MinHeight := 0; + end; + end; + MinClientWidth := FPanel.Width; + MinClientHeight := 0; + end + else begin + if FPanel.Height <> FToolbarDock.Height then begin + FPanel.Height := FToolbarDock.Height; + if Floating and Assigned(Parent) then begin + Parent.Constraints.MinWidth := 0; + Parent.Constraints.MinHeight := FPanel.Height + GetFloatingBorderSize.Y * 2; + end; + end; + MinClientWidth := 0; + MinClientHeight := FPanel.Height; + end; +end; + +procedure TSpTBXCustomDockablePanel.DoDrawCaptionPanel(ACanvas: TCanvas; + ARect: TRect; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawCaptionPanel) then FOnDrawCaptionPanel(Self, ACanvas, ARect, PaintStage, PaintDefault); +end; + +procedure TSpTBXCustomDockablePanel.DoWindowStateChanged(AWindowState: TWindowState); +begin + if Assigned(FOnWindowStateChanged) then FOnWindowStateChanged(Self, AWindowState); +end; + +function TSpTBXCustomDockablePanel.GetCaptionPanelSize: TPoint; +begin + Result := Point(FPanel.Width, FPanel.Height); +end; + +procedure TSpTBXCustomDockablePanel.GetChildren(Proc: TGetChildProc; + Root: TComponent); +var + I: Integer; + C: TControl; + DesignerRootItem: TTBCustomItem; +begin + // Needed to fake the DFM streaming system because the owner of the items + // is the Form and not the Toolbar nor Self. + // But the parent must be the Toolbar. + // GetChildren is used to pass the children components of Self to the DFM + // streaming system. + // We also need to do the same with the controls of TTBControlItems. + // More info on the Delphi help or Classes.TWriter.WriteData + // Same as TSpTBXCompoundItemsControl and TSpTBXCustomDockablePanel + + DesignerRootItem := GetItems; + TTBCustomItemAccess(DesignerRootItem).GetChildren(Proc, Root); + for I := 0 to DesignerRootItem.Count - 1 do + if (DesignerRootItem[I] is TTBControlItem) then begin + C := TTBControlItem(DesignerRootItem[I]).Control; + if Assigned(C) then + if SpFindControl(Self, C) = -1 then Proc(C); + end; + inherited; +end; + +function TSpTBXCustomDockablePanel.GetImages: TCustomImageList; +begin + if Assigned(FToolbar) then + Result := FToolbar.Images + else + Result := nil; +end; + +function TSpTBXCustomDockablePanel.GetItems: TTBCustomItem; +begin + // The ToolbarEditor designer will open the editable items and + // not the Toolbar.Items + Result := Options.EditableItems; +end; + +function TSpTBXCustomDockablePanel.GetRootItems: TTBRootItem; +begin + Result := FToolbar.Items; +end; + +function TSpTBXCustomDockablePanel.GetToolbar: TSpTBXToolbar; +begin + Result := FToolbar; +end; + +function TSpTBXCustomDockablePanel.GetView: TTBToolbarView; +begin + Result := FToolbar.View; +end; + +function TSpTBXCustomDockablePanel.GetEffectiveHeight: Integer; +begin + Result := Height; +end; + +function TSpTBXCustomDockablePanel.GetEffectiveWidth: Integer; +begin + Result := Width; +end; + +function TSpTBXCustomDockablePanel.GetFloatingClientHeight: Integer; +begin + if Docked then + Result := FFloatingClientHeight + else + Result := ClientAreaHeight; +end; + +function TSpTBXCustomDockablePanel.GetFloatingClientWidth: Integer; +begin + if Docked then + Result := FFloatingClientWidth + else + Result := ClientAreaWidth; +end; + +procedure TSpTBXCustomDockablePanel.InternalDrawBackground(ACanvas: TCanvas; + ARect: TRect; PaintOnNCArea, PaintBorders: Boolean); +var + DefaultPainting: Boolean; +begin + if Color = clNone then + SpDrawXPDockablePanelBody(ACanvas, ARect, True, Floating) + else begin + ACanvas.Brush.Color := Color; + ACanvas.FillRect(ARect); + end; + + if PaintOnNCArea and FPanel.Visible then begin + // Draw the CaptionBar borders on the NC Area of the embedded Dock + // See DockDrawBackground. + // Just draw 1 pixel from the left and right, and 2 pixels from the top + // ARect.Top should remain the same + if IsVerticalTitleBar then begin + ARect.Right := ARect.Left + CaptionPanelSize.X + 2; + InflateRect(ARect, 0, -(DockedBorderSize - 1)); + end + else begin + ARect.Bottom := ARect.Top + CaptionPanelSize.Y + 2; + InflateRect(ARect, -(DockedBorderSize - 1), 0); + end; + + DefaultPainting := True; + DoDrawCaptionPanel(ACanvas, ARect, pstPrePaint, DefaultPainting); + if DefaultPainting then + SpDrawXPDockablePanelTitleBar(ACanvas, ARect, True, IsVerticalTitleBar); + DefaultPainting := True; + DoDrawCaptionPanel(ACanvas, ARect, pstPostPaint, DefaultPainting); + end; +end; + +function TSpTBXCustomDockablePanel.InternalMaximize(Restore: Boolean): Boolean; +// Resize the dockable panel to the maximum size, and minimize the rest of +// the panels +// Horizontal resizing is not supported. +var + I: Integer; + L, PrevRestoreSize: TList; + DP: TSpTBXCustomDockablePanel; + MultiDock: TSpTBXCustomMultiDock; +begin + Result := False; + if not Docked or not (CurrentDock is TSpTBXCustomMultiDock) or (CurrentDock.Position in [dpTop, dpBottom]) then Exit; + MultiDock := TSpTBXCustomMultiDock(CurrentDock); + + L := TList.Create; + PrevRestoreSize := TList.Create; + try + MultiDock.GetDockablePanelList(L); + if L.Count < 2 then Exit; + + if Restore then begin + // Restore the minimized DPs, from down-to-top + for I := L.Count - 1 downto 0 do + if L[I] <> Self then begin + DP := TSpTBXCustomDockablePanel(L[I]); + if DP.Minimized then begin + DP.FIsManualSizing := True; + if SpDPResize(DP, DP.FState.RestoreSize, dprtMinimizeOrRestore) then + PrevRestoreSize.Add(DP); + DP.FIsManualSizing := False; + end; + end; + // Now set the DockedState + for I := 0 to PrevRestoreSize.Count - 1 do begin + DP := TSpTBXCustomDockablePanel(PrevRestoreSize[I]); + DP.FState.DockedState := wsNormal; + DP.Options.SetupButtonIcon(DP.Options.MinimizeButton); + DP.Options.SetupButtonIcon(DP.Options.MaximizeButton); + end; + end + else begin + // Remember the previous Height of the DPs + for I := 0 to L.Count - 1 do begin + DP := TSpTBXCustomDockablePanel(L[I]); + PrevRestoreSize.Add(Pointer(DP.Height)); + end; + // Minimize the DPs + for I := 0 to L.Count - 1 do + if L[I] <> Self then begin + DP := TSpTBXCustomDockablePanel(L[I]); + if not DP.Minimized then begin + if not DP.Maximized then begin + DP.FState.RestoreSize := Integer(PrevRestoreSize[I]); + end; + DP.FIsManualSizing := True; + SpDPResize(DP, DP.CaptionPanelSize.Y, dprtMinimizeOrRestore); + DP.FIsManualSizing := False; + DP.FState.DockedState := wsMinimized; + DP.Options.SetupButtonIcon(DP.Options.MinimizeButton); + DP.Options.SetupButtonIcon(DP.Options.MaximizeButton); + end; + end; + end; + + Result := True; + finally + L.Free; + PrevRestoreSize.Free; + end; +end; + +procedure TSpTBXCustomDockablePanel.InvalidateBackground(InvalidateChildren: Boolean); +begin + SpInvalidateSpTBXControl(Self, True, True); +end; + +function TSpTBXCustomDockablePanel.IsVerticalTitleBar: Boolean; +begin + Result := FPanel.Align in [alLeft, alRight]; +end; + +procedure TSpTBXCustomDockablePanel.DoneReadingPositionData(const Data: TTBReadPositionData); +begin + inherited; + + // Special case when it's floating and minimized force the state + if Floating and (FLoadedState = wsMinimized) then begin + FState.DockedState := FLoadedState; + Parent.ClientHeight := FPanel.Height; + end; + + // Update buttons state + FOptions.SetupButtonIcon(FOptions.MinimizeButton); + FOptions.SetupButtonIcon(FOptions.MaximizeButton); +end; + +procedure TSpTBXCustomDockablePanel.ReadPositionData(const Data: TTBReadPositionData); +begin + inherited; + + // Load FLoadedBarSize and FLoadedDockPos + FLoadedBarSize.cx := ClientAreaWidth; + FLoadedBarSize.cy := ClientAreaHeight; + FLoadedDockPos := DockPos; + + // Load FloatingClientWidth/FloatingClientHeight, RestoreSize, State + with Data do begin + FFloatingClientWidth := ReadIntProc(Name, rvFloatingClientWidth, 0, ExtraData); + FFloatingClientHeight := ReadIntProc(Name, rvFloatingClientHeight, 0, ExtraData); + FState.RestoreSize := ReadIntProc(Name, rvRestoreSize, 0, ExtraData); + FState.DockedState := TWindowState(ReadIntProc(Name, rvState, 0, ExtraData)); + FLoadedState := FState.DockedState; + end; +end; + +procedure TSpTBXCustomDockablePanel.WritePositionData(const Data: TTBWritePositionData); +begin + inherited; + + // Save FloatingClientWidth/FloatingClientHeight, RestoreSize, State + with Data do begin + WriteIntProc(Name, rvFloatingClientWidth, FFloatingClientWidth, ExtraData); + WriteIntProc(Name, rvFloatingClientHeight, FFloatingClientHeight, ExtraData); + WriteIntProc(Name, rvRestoreSize, FState.RestoreSize, ExtraData); + WriteIntProc(Name, rvState, Integer(FState.DockedState), ExtraData); + end; +end; + +procedure TSpTBXCustomDockablePanel.SetDefaultDockedSize(Value: Integer); +begin + if FDefaultDockedSize <> Value then + FDefaultDockedSize := Value; +end; + +procedure TSpTBXCustomDockablePanel.SetEffectiveHeight(const Value: Integer); +begin + if Docked and IsVertical and (CurrentDock is TSpTBXCustomMultiDock) then + SpDPResize(Self, Value) + else + Height := Value; +end; + +procedure TSpTBXCustomDockablePanel.SetEffectiveWidth(const Value: Integer); +begin + if Docked and not IsVertical and (CurrentDock is TSpTBXCustomMultiDock) then + SpDPResize(Self, Value) + else + Width := Value; +end; + +procedure TSpTBXCustomDockablePanel.SetFloatingClientHeight(const Value: Integer); +begin + if Docked then + FFloatingClientHeight := Value + else + ClientAreaHeight := Value; +end; + +procedure TSpTBXCustomDockablePanel.SetFloatingClientWidth(const Value: Integer); +begin + if Docked then + FFloatingClientWidth := Value + else + ClientAreaWidth := Value; +end; + +procedure TSpTBXCustomDockablePanel.SetImages(const Value: TCustomImageList); +begin + if Assigned(FToolbar) then + FToolbar.Images := Value; +end; + +procedure TSpTBXCustomDockablePanel.SetParent(AParent: TWinControl); +var + ToDock, ToFloating, ToEmptyMultiDock, WasMinimized, WasNotDocked: Boolean; + PrevSize: TSize; + D: TTBDock; +begin + if not (csDestroying in ComponentState) and Assigned(Parent) and Assigned(AParent) and (AParent <> Parent) then begin + ToDock := AParent is TTBDock; + ToFloating := AParent is TTBFloatingWindowParent; + ToEmptyMultiDock := False; + WasMinimized := Minimized; + WasNotDocked := not (Parent is TTBDock); + + if ToDock then FPanel.Visible := FShowCaptionWhenDocked + else FPanel.Visible := FShowCaption; + + PrevSize.cx := ClientAreaWidth; + PrevSize.cy := ClientAreaHeight; + + if Floating then begin + FFloatingClientWidth := PrevSize.cx; + FFloatingClientHeight := PrevSize.cy; + end; + + if ToDock then begin + // [DockablePanel-Rule] + // When a floating DP is re-docked the DP size should be the same + // as the rest of the DPs that are present on the MultiDock. + // If the MultiDock is empty then the size should be DefaultDockedSize, + // and if DefaultDockedSize is 0 use the previous size. + D := TTBDock(AParent); + if D is TSpTBXCustomMultiDock then begin + ToEmptyMultiDock := D.ToolbarCount = 0; + if D.Position in [dpLeft, dpRight] then begin + if ToEmptyMultiDock then begin + if FDefaultDockedSize > 0 then EffectiveWidth := FDefaultDockedSize; + end + else + if Floating then // If it's still floating compute the borders + EffectiveWidth := D.ClientWidth - (DockedBorderSize * 2) + else + EffectiveWidth := D.ClientWidth; + end + else begin + if ToEmptyMultiDock then begin + if FDefaultDockedSize > 0 then EffectiveHeight := FDefaultDockedSize; + end + else + if Floating then // If it's still floating compute the borders + EffectiveHeight := D.ClientHeight - (DockedBorderSize * 2) + else + EffectiveHeight := D.ClientHeight; + end; + end; + end; + + inherited; + + if ToEmptyMultiDock then + TSpTBXMultiDock(AParent).InsertingOnEmptyDock // Re-align adjacent splitter + else + if ToDock and WasNotDocked then begin + D := TTBDock(AParent); + if D is TSpTBXCustomMultiDock then + if D.Position in [dpLeft, dpRight] then + EffectiveHeight := PrevSize.cy + else + EffectiveWidth := PrevSize.cx + end + else + if ToFloating then begin + // [DockablePanel-Rule] + // Remember the previous floating size + if FFloatingClientWidth > 0 then + ClientAreaWidth := FFloatingClientWidth + else + ClientAreaWidth := PrevSize.cx; + if FFloatingClientHeight > 0 then + ClientAreaHeight := FFloatingClientHeight + else + // [DockablePanel-Rule] + // If the previous floating size is not valid and the DP was minimized + // when it was undocked then use the Restore size. + if WasMinimized then + ClientAreaHeight := FState.RestoreSize + else + ClientAreaHeight := PrevSize.cy; + + if Assigned(Parent) and (Parent is TSpTBXFloatingWindowParent) then begin + Parent.Constraints.MinHeight := FPanel.Height + GetFloatingBorderSize.Y * 2; + TSpTBXFloatingWindowParent(Parent).CloseOnAltF4 := True; + end; + end; + + UpdateTitleBarRotation; // Update the rotation of the titlebar + end + else + inherited; +end; + +procedure TSpTBXCustomDockablePanel.SetShowCaption(const Value: Boolean); +begin + if FShowCaption <> Value then begin + FShowCaption := Value; + if not Docked then begin + FPanel.Visible := Value; + RedrawWindow(Parent.Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN or RDW_FRAME); + end; + end; +end; + +procedure TSpTBXCustomDockablePanel.SetShowCaptionWhenDocked(const Value: Boolean); +begin + if FShowCaptionWhenDocked <> Value then begin + FShowCaptionWhenDocked := Value; + if not Floating then begin + FPanel.Visible := Value; + // The panel can't be hidden at designtime, move it outside the client area + if (csDesigning in ComponentState) then + if Value then + FPanel.Align := alTop + else begin + FPanel.Align := alNone; + FPanel.Top := FPanel.Top - FPanel.Height - 60; + end; + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN or RDW_FRAME); + end; + end; +end; + +procedure TSpTBXCustomDockablePanel.SetShowVerticalCaption(const Value: Boolean); +begin + if FShowVerticalCaption <> Value then begin + FShowVerticalCaption := Value; + UpdateTitleBarRotation; + end; +end; + +function TSpTBXCustomDockablePanel.SizeToggle(ToMaximize: Boolean): Boolean; +begin + if (Minimized and not ToMaximize) or (Maximized and ToMaximize) then + Result := Restore + else + if ToMaximize then Result := Maximize + else Result := Minimize; +end; + +procedure TSpTBXCustomDockablePanel.UpdateTitleBarRotation; +begin + if not HandleAllocated then Exit; + + if FShowVerticalCaption and not (Floating or IsVertical) then begin + if not IsVerticalTitleBar then begin + // TTBDock doesn't allow us to change the position when there are + // docked toolbars, we have to undock the toolbar + FToolbar.Visible := False; + FToolbar.Floating := True; + FToolbarDock.Position := dpLeft; + FPanel.Align := alLeft; + FToolbar.CurrentDock := FToolbarDock; + FToolbar.Visible := True; + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN or RDW_FRAME); + end; + end + else begin + if IsVerticalTitleBar then begin + // TTBDock doesn't allow us to change the position when there are + // docked toolbars, we have to undock the toolbar + FToolbar.Visible := False; + FToolbar.Floating := True; + FToolbarDock.Position := dpTop; + FPanel.Align := alTop; + FToolbar.CurrentDock := FToolbarDock; + FToolbar.Visible := True; + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN or RDW_FRAME); + end; + end; + + // Update buttons glyphs + FOptions.SetupButtonIcon(FOptions.MinimizeButton); + FOptions.SetupButtonIcon(FOptions.MaximizeButton); +end; + +procedure TSpTBXCustomDockablePanel.ValidateContainer(AComponent: TComponent); +begin + inherited; + if (AComponent is TTBDock) and not (AComponent is TSpTBXCustomMultiDock) then + raise EInvalidOperation.CreateFmt('Cannot insert %s into %s. Place it on a MultiDock instead', [Self.ClassName, AComponent.ClassName]); +end; + +procedure TSpTBXCustomDockablePanel.CMTextChanged(var Message: TMessage); +begin + inherited; + if Assigned(FOptions) then + FOptions.CaptionLabel := Caption; +end; + +procedure TSpTBXCustomDockablePanel.WMNCCalcSize(var Message: TWMNCCalcSize); +begin + Message.Result := 0; + if Docked then + with Message.CalcSize_Params^ do + InflateRect(rgrc[0], -DockedBorderSize, -DockedBorderSize); +end; + +procedure TSpTBXCustomDockablePanel.WMNCHitTest(var Message: TWMNCHitTest); +var + P: TPoint; + R: TRect; +begin + inherited; + + if Docked then begin + P := SmallPointToPoint(Message.Pos); + GetWindowRect(Handle, R); + + if IsVertical then begin + if (P.Y >= R.Bottom - DockedBorderSize) and CanSplitResize(dpBottom) then + Message.Result := HT_DP_SPLITRESIZEBOTTOM + else if (P.Y <= R.Top + DockedBorderSize) and CanSplitResize(dpTop) then + Message.Result := HT_DP_SPLITRESIZETOP; + end + else begin + if (P.X >= R.Right - DockedBorderSize) and CanSplitResize(dpRight) then Message.Result := HT_DP_SPLITRESIZERIGHT + else if (P.X <= R.Left + DockedBorderSize) and CanSplitResize(dpLeft) then Message.Result := HT_DP_SPLITRESIZELEFT; + end; + end; +end; + +procedure TSpTBXCustomDockablePanel.WMNCLButtonDown(var Message: TWMNCLButtonDown); +var + OldCursor: HCURSOR; +begin + if Message.HitTest in [HT_DP_SPLITRESIZELEFT..HT_DP_SPLITRESIZEBOTTOM] then + BeginSplitResizing(Message.HitTest) + else + if (Message.HitTest = HT_TB2k_Border) and IsMovable then begin + FIsDockedMoving := True; + OldCursor := SetCursor(LoadCursor(0, IDC_SIZEALL)); + try + // To prevent resizing when clicking on the CaptionPanel: + // Instead of calling inherited call BeginDockedMoving + // that mimics TTBCustomDockableWindow.BeginMoving. + // The new method should only change position and change dock/floating + // it won't resize the DP. + BeginDockedMoving; + finally + SetCursor(OldCursor); + FIsDockedMoving := False; + end; + end + else + inherited; +end; + +procedure TSpTBXCustomDockablePanel.WMSetCursor(var Message: TWMSetCursor); +begin + if Docked and CurrentDock.AllowDrag and (Message.CursorWnd = WindowHandle) then begin + case Message.HitTest of + HT_DP_SPLITRESIZELEFT, HT_DP_SPLITRESIZERIGHT: + begin + SetCursor(LoadCursor(0, IDC_SIZEWE)); + Message.Result := 1; + Exit; + end; + HT_DP_SPLITRESIZETOP, HT_DP_SPLITRESIZEBOTTOM: + begin + SetCursor(LoadCursor(0, IDC_SIZENS)); + Message.Result := 1; + Exit; + end; + end; + end; + + inherited; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSplitter } + +constructor TSpTBXCustomSplitter.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + ControlStyle := ControlStyle + [csOpaque]; + + Width := 5; + Height := 100; + Align := alLeft; + Cursor := crSizeWE; + FResizeStyle := rsUpdate; + FOldSize := -1; + FMinSize := 0; + FGripSize := 50; + FGripHotTrack := True; + FAutoCalcMaxSize := True; + FSkinType := sknSkin; + FRestorePos := 60; + + SkinManager.AddSkinNotification(Self); +end; + +destructor TSpTBXCustomSplitter.Destroy; +begin + SkinManager.RemoveSkinNotification(Self); + FreeAndNil(FMouseBrush); + inherited Destroy; +end; + +procedure TSpTBXCustomSplitter.RequestAlign; +begin + inherited; + if Align in [alTop, alBottom] then Cursor:= crSizeNS + else Cursor:= crSizeWE; +end; + +function TSpTBXCustomSplitter.IsVertical: Boolean; +begin + Result := not (Align in [alTop, alBottom]); +end; + +function TSpTBXCustomSplitter.ValidateSplitControl: TControl; +// Find the control that the splitter must resize +var + P: TPoint; + I: Integer; + R: TRect; + C, ZeroSized: TControl; +begin + Result := nil; + ZeroSized := nil; + + P := Point(Left, Top); + case Align of + alLeft: Dec(P.X); + alRight: Inc(P.X, Width); + alTop: Dec(P.Y); + alBottom: Inc(P.Y, Height); + else + Exit; + end; + + // Try to find the Split Control + for I := 0 to Parent.ControlCount - 1 do begin + C := Parent.Controls[I]; + // Can't be a StatusBar, a Splitter or a regular Toolbar Dock + if C.Visible and (C.Align = Align) and + not ((C is TSpTBXCustomStatusBar) or (C is TCustomStatusBar)) and + not ((C is TSpTBXCustomSplitter) or (C is TSplitter)) and + not ((C is TTBDock) and not (C is TSpTBXCustomMultiDock)) then + begin + R := C.BoundsRect; + case Align of + alLeft, alRight: + if (R.Right - R.Left) = 0 then begin + if (R.Left = Left) or (R.Left = Left + Width) then + ZeroSized := C; + end; + alTop, alBottom: + if (R.Bottom - R.Top) = 0 then begin + if (R.Top = Top) or (R.Top = Top + Height) then + ZeroSized := C; + end; + end; + + if (Result = nil) and PtInRect(R, P) then + Result := C; + end; + end; + + // Zero sized control has the priority + if Assigned(ZeroSized) then + Result := ZeroSized; + + // Don't try to resize an empty MultiDock + if Assigned(Result) and (Result is TSpTBXCustomMultiDock) then + if TSpTBXCustomMultiDock(Result).ToolbarCount = 0 then begin + Result := nil; + Exit; + end; +end; + +procedure TSpTBXCustomSplitter.WMEraseBkgnd(var Message: TWmEraseBkgnd); +begin + Message.Result := 1; +end; + +procedure TSpTBXCustomSplitter.WMSpSkinChange(var Message: TMessage); +begin + Invalidate; +end; + +procedure TSpTBXCustomSplitter.MouseAllocateLineDC; +begin + FMouseLineDC := GetDCEx(Parent.Handle, 0, DCX_CACHE or DCX_CLIPSIBLINGS or DCX_LOCKWINDOWUPDATE); + if ResizeStyle = rsPattern then begin + if FMouseBrush = nil then begin + FMouseBrush := TBrush.Create; + FMouseBrush.Bitmap:= AllocPatternBitmap(clBlack,clWhite); + end; + FMousePrevBrush := SelectObject(FMouseLineDC, FMouseBrush.Handle); + end; +end; + +procedure TSpTBXCustomSplitter.MouseReleaseLineDC; +begin + if FMousePrevBrush <> 0 then SelectObject(FMouseLineDC, FMousePrevBrush); + ReleaseDC(Parent.Handle, FMouseLineDC); + if FMouseBrush <> nil then + FreeAndNil(FMouseBrush); +end; + +procedure TSpTBXCustomSplitter.MouseDrawLine; +var + P: TPoint; +begin + FMouseLineVisible := not FMouseLineVisible; + P := Point(Left, Top); + if IsVertical then + P.X := Left + FSplitLinePaintingPos + else + P.Y := Top + FSplitLinePaintingPos; + PatBlt(FMouseLineDC, P.X, P.Y, Width, Height, PATINVERT); +end; + +procedure TSpTBXCustomSplitter.MouseCalcSplitSize(X, Y: Integer; var NewSize, + Split: Integer); +var + I: Integer; +begin + if Assigned(FMouseSplitControl) then begin + if IsVertical then + Split := X - FMouseDownPos.X + else + Split := Y - FMouseDownPos.Y; + + I := 0; + case Align of + alLeft: I := FMouseSplitControl.Width + Split; + alRight: I := FMouseSplitControl.Width - Split; + alTop: I := FMouseSplitControl.Height + Split; + alBottom: I := FMouseSplitControl.Height - Split; + end; + + NewSize := I; + if I < FMinSize then + NewSize := FMinSize + else + if AutoCalcMaxSize and (I > FMaxSize) then + NewSize := FMaxSize; // Use the Maximum Size + + if I <> NewSize then begin + if Align in [alRight, alBottom] then + I := I - NewSize + else + I := NewSize - I; + Inc(Split, I); + end; + end; +end; + +procedure TSpTBXCustomSplitter.MouseStopSizing; +begin + if Assigned(FMouseSplitControl) then begin + if FMouseLineVisible then MouseDrawLine; + FMouseSplitControl := nil; + MouseReleaseLineDC; + if Assigned(FMouseActiveControl) then begin + TWinControlAccess(FMouseActiveControl).OnKeyDown := FOldKeyDown; + FMouseActiveControl := nil; + end; + end; + DoMoved; + FMoving:= False; +end; + +procedure TSpTBXCustomSplitter.MouseFocusKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); +begin + if Key = VK_ESCAPE then MouseStopSizing + else if Assigned(FOldKeyDown) then FOldKeyDown(Sender,Key,Shift); +end; + +procedure TSpTBXCustomSplitter.MouseDown(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +var + C: TControl; + F: TCustomForm; + P: TPoint; + I: Integer; +begin + inherited; + + if (Button = mbLeft) and not (ssDouble in Shift) then begin + C := ValidateSplitControl; + if C = nil then Exit; + + P := Point(X,Y); + if (FGripSize > 0) and PtInRect(GripRect, P) then + FMouseDownOnGrip := True; + + FMouseSplitControl := C; + FMouseDownPos := P; + + if AutoCalcMaxSize and Assigned(FMouseSplitControl) then begin + if Align in [alLeft, alRight] then begin + FMaxSize := Parent.ClientWidth - FMinSize - Width; + for I := 0 to Parent.ControlCount - 1 do + with Parent.Controls[I] do + if Visible and (Align in [alLeft, alRight]) then Dec(FMaxSize, Width); + Inc(FMaxSize, FMouseSplitControl.Width); + end + else begin + FMaxSize := Parent.ClientHeight - FMinSize - Height; + for I := 0 to Parent.ControlCount - 1 do + with Parent.Controls[I] do + if Visible and (Align in [alTop, alBottom]) then Dec(FMaxSize, Height); + Inc(FMaxSize, FMouseSplitControl.Height); + end; + end; + + MouseCalcSplitSize(X, Y, FNewSize, FSplitLinePaintingPos); + MouseAllocateLineDC; + FMousePrevSplitControlSize := FNewSize; + + // When the ESC key is pressed we must abort the moving with StopSizing, + // for that we must intercept the key event from the Active control. + F := ValidParentForm(Self); + if Assigned(F) then + if F.ActiveControl <> nil then begin + FMouseActiveControl := F.ActiveControl; + FOldKeyDown := TWinControlAccess(FMouseActiveControl).OnKeyDown; + TWinControlAccess(FMouseActiveControl).OnKeyDown := MouseFocusKeyDown; + end; + + if ResizeStyle in [rsLine, rsPattern] then MouseDrawLine; + end; +end; + +procedure TSpTBXCustomSplitter.MouseMove(Shift: TShiftState; X, Y: Integer); +var + I, Split: Integer; + GripR: TRect; + MouseInGrip: Boolean; +begin + inherited; + + if (ssLeft in Shift) and not (ssDouble in Shift) and Assigned(FMouseSplitControl) then begin + MouseCalcSplitSize(X, Y, I, Split); + if DoMoving(I) then begin + FMoving := True; + if ResizeStyle in [rsLine, rsPattern] then MouseDrawLine; + FNewSize := I; + FSplitLinePaintingPos := Split; + case ResizeStyle of + rsUpdate: UpdateControlSize(FMouseSplitControl); + rsLine, rsPattern: MouseDrawLine; + end; + end; + end; + + // Track the mouse to invalidate the Grip when the mouse enters or leaves the grip zone + if (FGripSize > 0) and not FMoving then begin + GripR := GripRect; + MouseInGrip := PtInRect(GripR, Point(X, Y)); + if (MouseInGrip <> FMouseOverGrip) then begin + FMouseOverGrip := MouseInGrip; + InvalidateGrip; + end; + end; +end; + +procedure TSpTBXCustomSplitter.MouseUp(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +var + P: TPoint; +begin + inherited; + + if (Button = mbLeft) and not (ssDouble in Shift) and Assigned(FMouseSplitControl) then begin + P := Point(X, Y); + if ResizeStyle in [rsLine, rsPattern] then MouseDrawLine; + UpdateControlSize(FMouseSplitControl); + // If the splitter was minimized then RestorePos should be the MouseDown point + if not FMouseDownOnGrip and FMoving and (FNewSize = 0) and (FMousePrevSplitControlSize <> 0) then + FRestorePos := FMousePrevSplitControlSize; + MouseStopSizing; + + if (FGripSize > 0) and FMouseDownOnGrip then begin + if (P.X = FMouseDownPos.X) and (P.Y = FMouseDownPos.Y) and PtInRect(GripRect, P) then + Toggle; + FMouseDownOnGrip := False; + FMouseOverGrip := False; + InvalidateGrip; + end; + end; +end; + +procedure TSpTBXCustomSplitter.Paint; +var + ClientR, R, DragHandleR: TRect; + C1, C2: TColor; + PaintDefault: Boolean; +begin + ClientR := ClientRect; + PaintDefault := True; + DoDrawBackground(Canvas, ClientR, pstPrePaint, PaintDefault); + if PaintDefault then begin + // Paint background + if SpTBXSkinType(SkinType) = sknSkin then + CurrentSkin.PaintBackground(Canvas, ClientR, skncSplitter, sknsNormal, True, False, IsVertical) + else begin + if Color = clNone then + Canvas.Brush.Color := clBtnFace + else + Canvas.Brush.Color := Color; + Canvas.FillRect(ClientR); + end; + + // Paint grip + R := GripRect; + DragHandleR := R; + if IsVertical then + InflateRect(DragHandleR, -1, -10) + else + InflateRect(DragHandleR, -10, -1); + + case SpTBXSkinType(SkinType) of + sknNone, sknWindows: + begin + C1 := clBtnShadow; + C2 := clWindow; + SpDrawXPGrip(Canvas, DragHandleR, C1, C2); + end; + sknSkin: + begin + if FMouseOverGrip then + CurrentSkin.PaintBackground(Canvas, R, skncButton, sknsNormal, True, True, False, [akLeft, akTop, akRight, akBottom]); + C1 := SkinManager.CurrentSkin.Options(skncToolbarGrip).Body.Color1; + C2 := SkinManager.CurrentSkin.Options(skncToolbarGrip).Body.Color2; + SpDrawXPGrip(Canvas, DragHandleR, C1, C2); + end; + end; + end; + + PaintDefault := True; + DoDrawBackground(Canvas, ClientR, pstPostPaint, PaintDefault); +end; + +procedure TSpTBXCustomSplitter.CMMouseleave(var Message: TMessage); +begin + inherited; + if FMouseOverGrip and not FMoving then begin + FMouseOverGrip := False; + InvalidateGrip; + end; +end; + +procedure TSpTBXCustomSplitter.ChangeSplitControlSize(NewControlSize: Integer); +var + C: TControl; +begin + if not (csDesigning in ComponentState) then begin + C := ValidateSplitControl; + if C = nil then Exit; + + if NewControlSize < FMinSize then + NewControlSize := FMinSize; + if DoMoving(NewControlSize) then begin + // If minimizing save restore position + if NewControlSize = FMinSize then begin + if IsVertical then FRestorePos := C.Width + else FRestorePos := C.Height; + end; + + FMoving := True; + FNewSize := NewControlSize; + UpdateControlSize(C); + end; + FMoving := False; + end; +end; + +function TSpTBXCustomSplitter.GetMinimized: Boolean; +var + I, MinW, MinH: Integer; + C: TControl; +begin + Result := False; + C := ValidateSplitControl; + if Assigned(C) then begin + MinW := C.Constraints.MinWidth; + MinH := C.Constraints.MinHeight; + + if FMinSize > MinW then + MinW := FMinSize; + if FMinSize > MinH then + MinH := FMinSize; + + if IsVertical then begin + I := C.Width; + Result := I <= MinW; + end + else begin + I := C.Height; + Result := I <= MinH; + end; + end; +end; + +procedure TSpTBXCustomSplitter.Minimize; +begin + ChangeSplitControlSize(0); +end; + +procedure TSpTBXCustomSplitter.Restore; +begin + if Minimized then + ChangeSplitControlSize(FRestorePos); +end; + +procedure TSpTBXCustomSplitter.Toggle; +begin + if Minimized then + Restore + else + Minimize; +end; + +procedure TSpTBXCustomSplitter.DoDrawBackground(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawBackground) then FOnDrawBackground(Self, ACanvas, ARect, PaintStage, PaintDefault); +end; + +procedure TSpTBXCustomSplitter.DoMoved; +begin + if Assigned(FOnMoved) then FOnMoved(Self); +end; + +function TSpTBXCustomSplitter.DoMoving(var NewSize: Integer): Boolean; +begin + Result := True; + if Assigned(FOnMoving) then FOnMoving(Self, NewSize, Result); + if Result and (NewSize < FMinSize) then NewSize := 0; +end; + +procedure TSpTBXCustomSplitter.SetMinSize(const Value: integer); +begin + if (Value <> FMinSize) and (Value >= 0) then FMinSize := Value; +end; + +procedure TSpTBXCustomSplitter.SetSkinType(const Value: TSpTBXSkinType); +begin + if Value <> FSkinType then begin + FSkinType := Value; + Invalidate; + end; +end; + +procedure TSpTBXCustomSplitter.UpdateControlSize(SplitControl: TControl); +begin + if (FOldSize <> FNewSize) and Assigned(SplitControl) then begin + case Align of + alLeft: + begin + SpFixDelphiAlignBug(SplitControl, FNewSize, Self); + FOldSize := SplitControl.Width; + end; + alTop: + begin + SpFixDelphiAlignBug(SplitControl, FNewSize, Self); + FOldSize := SplitControl.Height; + end; + alRight: + begin + SpFixDelphiAlignBug(SplitControl, FNewSize, Self); + FOldSize := SplitControl.Width; + end; + alBottom: + begin + SpFixDelphiAlignBug(SplitControl, FNewSize, Self); + FOldSize := SplitControl.Height; + end; + end; + Update; + DoMoved; + end; +end; + +function TSpTBXCustomSplitter.GetGripRect: TRect; +begin + Result := Rect(0, 0, 0, 0); + if FGripSize > 0 then + if IsVertical then + Result := Bounds(0, (Height - FGripSize) div 2, Width, FGripSize) + else + Result := Bounds((Width - FGripSize) div 2, 0, FGripSize, Height); +end; + +procedure TSpTBXCustomSplitter.SetGripSize(const Value: Integer); +begin + if FGripSize <> Value then begin + if Value < 0 then FGripSize := 0 + else FGripSize := Value; + InvalidateGrip; + end; +end; + +procedure TSpTBXCustomSplitter.InvalidateGrip; +begin + if FGripHotTrack then Invalidate; +end; + +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXEditors.dcu b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXEditors.dcu new file mode 100644 index 0000000000000000000000000000000000000000..fd2dee902c9a07e1b0d19b8ec06a41121eb5f69a GIT binary patch literal 133970 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 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXEditors.hpp b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXEditors.hpp new file mode 100644 index 0000000..1945c02 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXEditors.hpp @@ -0,0 +1,741 @@ +// CodeGear C++Builder +// Copyright (c) 1995, 2008 by CodeGear +// All rights reserved + +// (DO NOT EDIT: machine generated header) 'Sptbxeditors.pas' rev: 20.00 + +#ifndef SptbxeditorsHPP +#define SptbxeditorsHPP + +#pragma delphiheader begin +#pragma option push +#pragma option -w- // All warnings off +#pragma option -Vx // Zero-length empty class member functions +#pragma pack(push,8) +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit + +//-- user supplied ----------------------------------------------------------- + +namespace Sptbxeditors +{ +//-- type declarations ------------------------------------------------------- +typedef Stdctrls::TComboBox* TTntComboBox; + +typedef Stdctrls::TListBox* TTntListBox; + +typedef Checklst::TCheckListBox* TTntCheckListBox; + +#pragma option push -b- +enum TSpTBXSpinType { spnInteger, spnFloat, spnHex }; +#pragma option pop + +typedef void __fastcall (__closure *TSpTBXEditChangeEvent)(System::TObject* Sender, const System::WideString AText); + +typedef void __fastcall (__closure *TSpTBXEditAcceptTextEvent)(System::TObject* Sender, System::WideString &NewText, bool &Accept); + +typedef void __fastcall (__closure *TSpTBXEditGetTextEvent)(System::TObject* Sender, System::WideString &AText); + +class DELPHICLASS TSpTBXEditItemViewer; +typedef void __fastcall (__closure *TSpTBXBeginEditEvent)(System::TObject* Sender, TSpTBXEditItemViewer* Viewer, Stdctrls::TCustomEdit* EditControl); + +typedef void __fastcall (__closure *TSpTBXEditMessageEvent)(System::TObject* Sender, TSpTBXEditItemViewer* Viewer, Messages::TMessage &Message, bool &Handled); + +typedef void __fastcall (__closure *TSpTBXDrawListItemEvent)(System::TObject* Sender, Graphics::TCanvas* ACanvas, Types::TRect &ARect, int Index, const Windows::TOwnerDrawState State, const Sptbxitem::TSpTBXPaintStage PaintStage, bool &PaintDefault); + +class DELPHICLASS TSpTBXEditButton; +class PASCALIMPLEMENTATION TSpTBXEditButton : public Sptbxcontrols::TSpTBXSpeedButton +{ + typedef Sptbxcontrols::TSpTBXSpeedButton inherited; + +protected: + virtual void __fastcall AdjustFont(Graphics::TFont* AFont); + virtual bool __fastcall DoDrawDropDownArrow(Graphics::TCanvas* ACanvas, const Types::TRect &ARect); + virtual bool __fastcall DoDrawItem(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxitem::TSpTBXPaintStage PaintStage); + bool __fastcall GetFrameHotTrack(void); + +public: + __fastcall virtual TSpTBXEditButton(Classes::TComponent* AOwner); + DYNAMIC void __fastcall Click(void); +public: + /* TSpTBXCustomButton.Destroy */ inline __fastcall virtual ~TSpTBXEditButton(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXEditButton(HWND ParentWindow) : Sptbxcontrols::TSpTBXSpeedButton(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXSpinButton; +class PASCALIMPLEMENTATION TSpTBXSpinButton : public TSpTBXEditButton +{ + typedef TSpTBXEditButton inherited; + +private: + bool FUpPushed; + bool FDownPushed; + Classes::TNotifyEvent FOnUpClick; + Classes::TNotifyEvent FOnDownClick; + +protected: + virtual bool __fastcall DoDrawItem(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxitem::TSpTBXPaintStage PaintStage); + virtual void __fastcall DoMouseLeave(void); + DYNAMIC void __fastcall MouseMove(Classes::TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseUp(Controls::TMouseButton Button, Classes::TShiftState Shift, int X, int Y); + __property Classes::TNotifyEvent OnUpClick = {read=FOnUpClick, write=FOnUpClick}; + __property Classes::TNotifyEvent OnDownClick = {read=FOnDownClick, write=FOnDownClick}; + +public: + __fastcall virtual TSpTBXSpinButton(Classes::TComponent* AOwner); + DYNAMIC void __fastcall Click(void); + void __fastcall IsHotTracking(/* out */ bool &UpButton, /* out */ bool &DownButton, /* out */ bool &EditFrame); + +__published: + __property Repeating = {default=1}; +public: + /* TSpTBXCustomButton.Destroy */ inline __fastcall virtual ~TSpTBXSpinButton(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXSpinButton(HWND ParentWindow) : TSpTBXEditButton(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXUnicodeAdaptEdit; +class PASCALIMPLEMENTATION TSpTBXUnicodeAdaptEdit : public Stdctrls::TEdit +{ + typedef Stdctrls::TEdit inherited; + +public: + /* TCustomEdit.Create */ inline __fastcall virtual TSpTBXUnicodeAdaptEdit(Classes::TComponent* AOwner) : Stdctrls::TEdit(AOwner) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXUnicodeAdaptEdit(HWND ParentWindow) : Stdctrls::TEdit(ParentWindow) { } + /* TWinControl.Destroy */ inline __fastcall virtual ~TSpTBXUnicodeAdaptEdit(void) { } + +}; + + +class DELPHICLASS TSpTBXUnicodeEdit; +class PASCALIMPLEMENTATION TSpTBXUnicodeEdit : public TSpTBXUnicodeAdaptEdit +{ + typedef TSpTBXUnicodeAdaptEdit inherited; + +private: + Classes::TAlignment FAlignment; + HIDESBASE void __fastcall SetAlignment(Classes::TAlignment Value); + HIDESBASE MESSAGE void __fastcall CMEnabledChanged(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall CMFontChanged(Messages::TMessage &Message); + +protected: + virtual void __fastcall CreateWnd(void); + virtual void __fastcall CreateParams(Controls::TCreateParams &Params); + virtual void __fastcall UpdateEditRect(void); + +public: + TSpTBXEditButton* __fastcall AddEditButton(bool RightAligned = true, int AWidth = 0xffffffff); + bool __fastcall HasEditButton(void); + +__published: + __property Classes::TAlignment Alignment = {read=FAlignment, write=SetAlignment, default=0}; +public: + /* TCustomEdit.Create */ inline __fastcall virtual TSpTBXUnicodeEdit(Classes::TComponent* AOwner) : TSpTBXUnicodeAdaptEdit(AOwner) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXUnicodeEdit(HWND ParentWindow) : TSpTBXUnicodeAdaptEdit(ParentWindow) { } + /* TWinControl.Destroy */ inline __fastcall virtual ~TSpTBXUnicodeEdit(void) { } + +}; + + +class DELPHICLASS TSpTBXEdit; +class PASCALIMPLEMENTATION TSpTBXEdit : public TSpTBXUnicodeEdit +{ + typedef TSpTBXUnicodeEdit inherited; + +private: + Forms::TFormBorderStyle FBorderStyle; + bool FHotTrack; + Sptbxskins::TSpTBXSkinType FSkinType; + bool FMouseInControl; + HIDESBASE void __fastcall SetBorderStyle(const Forms::TBorderStyle Value); + void __fastcall SetSkinType(const Sptbxskins::TSpTBXSkinType Value); + HIDESBASE MESSAGE void __fastcall CMEnabledChanged(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall CMEnter(Messages::TWMNoParams &Message); + HIDESBASE MESSAGE void __fastcall CMExit(Messages::TWMNoParams &Message); + HIDESBASE MESSAGE void __fastcall CMMouseEnter(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall CMMouseLeave(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall WMNCPaint(Messages::TWMNCPaint &Message); + MESSAGE void __fastcall WMSpSkinChange(Messages::TMessage &Message); + +public: + __fastcall virtual TSpTBXEdit(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXEdit(void); + HIDESBASE void __fastcall InvalidateFrame(void); + __property bool MouseInControl = {read=FMouseInControl, nodefault}; + +__published: + __property Forms::TBorderStyle BorderStyle = {read=FBorderStyle, write=SetBorderStyle, default=1}; + __property bool HotTrack = {read=FHotTrack, write=FHotTrack, default=1}; + __property Sptbxskins::TSpTBXSkinType SkinType = {read=FSkinType, write=SetSkinType, default=2}; +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXEdit(HWND ParentWindow) : TSpTBXUnicodeEdit(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXCustomButtonEdit; +class PASCALIMPLEMENTATION TSpTBXCustomButtonEdit : public TSpTBXEdit +{ + typedef TSpTBXEdit inherited; + +private: + TSpTBXEditButton* FEditButton; + +protected: + virtual void __fastcall Notification(Classes::TComponent* AComponent, Classes::TOperation Operation); + virtual void __fastcall SetName(const Classes::TComponentName Value); + __property TSpTBXEditButton* EditButton = {read=FEditButton}; + +public: + __fastcall virtual TSpTBXCustomButtonEdit(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXCustomButtonEdit(void); +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXCustomButtonEdit(HWND ParentWindow) : TSpTBXEdit(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXButtonEdit; +class PASCALIMPLEMENTATION TSpTBXButtonEdit : public TSpTBXCustomButtonEdit +{ + typedef TSpTBXCustomButtonEdit inherited; + +__published: + __property EditButton; +public: + /* TSpTBXCustomButtonEdit.Create */ inline __fastcall virtual TSpTBXButtonEdit(Classes::TComponent* AOwner) : TSpTBXCustomButtonEdit(AOwner) { } + /* TSpTBXCustomButtonEdit.Destroy */ inline __fastcall virtual ~TSpTBXButtonEdit(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXButtonEdit(HWND ParentWindow) : TSpTBXCustomButtonEdit(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXSpinEditOptions; +class PASCALIMPLEMENTATION TSpTBXSpinEditOptions : public Classes::TPersistent +{ + typedef Classes::TPersistent inherited; + +private: + int FDecimal; + System::Extended FIncrement; + System::Extended FMinValue; + System::Extended FMaxValue; + System::Extended FValue; + bool FValueSnap; + TSpTBXSpinType FValueType; + System::WideString FPrefix; + System::WideString FPostfix; + TSpTBXEditAcceptTextEvent FOnGetText; + TSpTBXEditChangeEvent FOnSetText; + Classes::TNotifyEvent FOnValueChanged; + bool __fastcall IsIncrementStored(void); + bool __fastcall IsMaxValueStored(void); + bool __fastcall IsMinValueStored(void); + bool __fastcall IsValueStored(void); + void __fastcall SetDecimal(int NewDecimal); + void __fastcall SetMaxValue(const System::Extended NewValue); + void __fastcall SetMinValue(const System::Extended NewValue); + void __fastcall SetValue(const System::Extended NewValue); + void __fastcall SetValueType(TSpTBXSpinType NewType); + void __fastcall SetPostfix(const System::WideString ValueString); + void __fastcall SetPrefix(const System::WideString ValueString); + __int64 __fastcall GetValueAsInteger(void); + void __fastcall SetValueAsInteger(const __int64 NewValue); + +protected: + virtual void __fastcall DoValueChanged(void); + void __fastcall UpdateTextFromValue(void); + void __fastcall UpdateValueFromText(bool RevertWhenInvalid = true); + __property TSpTBXEditAcceptTextEvent OnGetText = {read=FOnGetText, write=FOnGetText}; + __property TSpTBXEditChangeEvent OnSetText = {read=FOnSetText, write=FOnSetText}; + __property Classes::TNotifyEvent OnValueChanged = {read=FOnValueChanged, write=FOnValueChanged}; + +public: + __fastcall virtual TSpTBXSpinEditOptions(void); + void __fastcall ValueInc(void); + void __fastcall ValueDec(void); + __property __int64 ValueAsInteger = {read=GetValueAsInteger, write=SetValueAsInteger}; + +__published: + __property int Decimal = {read=FDecimal, write=SetDecimal, default=2}; + __property System::Extended Increment = {read=FIncrement, write=FIncrement, stored=IsIncrementStored}; + __property System::Extended MaxValue = {read=FMaxValue, write=SetMaxValue, stored=IsMaxValueStored}; + __property System::Extended MinValue = {read=FMinValue, write=SetMinValue, stored=IsMinValueStored}; + __property System::WideString Postfix = {read=FPostfix, write=SetPostfix}; + __property System::WideString Prefix = {read=FPrefix, write=SetPrefix}; + __property System::Extended Value = {read=FValue, write=SetValue, stored=IsValueStored}; + __property bool ValueSnap = {read=FValueSnap, write=FValueSnap, default=1}; + __property TSpTBXSpinType ValueType = {read=FValueType, write=SetValueType, default=0}; +public: + /* TPersistent.Destroy */ inline __fastcall virtual ~TSpTBXSpinEditOptions(void) { } + +}; + + +class DELPHICLASS TSpTBXSpinEdit; +class PASCALIMPLEMENTATION TSpTBXSpinEdit : public TSpTBXEdit +{ + typedef TSpTBXEdit inherited; + +private: + bool FExtendedAccept; + TSpTBXSpinButton* FSpinButton; + TSpTBXSpinEditOptions* FSpinOptions; + void __fastcall SpinOptionsGetText(System::TObject* Sender, System::WideString &NewText, bool &Accept); + void __fastcall SpinOptionsSetText(System::TObject* Sender, const System::WideString AText); + System::Extended __fastcall GetValue(void); + Classes::TNotifyEvent __fastcall GetValueChanged(); + void __fastcall SetValue(const System::Extended Value); + void __fastcall SetValueChanged(const Classes::TNotifyEvent ValueChangedEvent); + HIDESBASE MESSAGE void __fastcall CMExit(Messages::TWMNoParams &Message); + +protected: + DYNAMIC void __fastcall Change(void); + DYNAMIC void __fastcall KeyDown(System::Word &Key, Classes::TShiftState Shift); + DYNAMIC void __fastcall KeyPress(System::WideChar &Key); + virtual void __fastcall Notification(Classes::TComponent* AComponent, Classes::TOperation Operation); + virtual void __fastcall UpClick(System::TObject* Sender); + virtual void __fastcall DownClick(System::TObject* Sender); + +public: + __fastcall virtual TSpTBXSpinEdit(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXSpinEdit(void); + +__published: + __property Alignment = {default=1}; + __property bool ExtendedAccept = {read=FExtendedAccept, write=FExtendedAccept, default=0}; + __property Text = {stored=false}; + __property TSpTBXSpinButton* SpinButton = {read=FSpinButton}; + __property TSpTBXSpinEditOptions* SpinOptions = {read=FSpinOptions, write=FSpinOptions}; + __property System::Extended Value = {read=GetValue, write=SetValue, stored=false}; + __property Classes::TNotifyEvent OnValueChanged = {read=GetValueChanged, write=SetValueChanged}; +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXSpinEdit(HWND ParentWindow) : TSpTBXEdit(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXComboBox; +class PASCALIMPLEMENTATION TSpTBXComboBox : public Stdctrls::TComboBox +{ + typedef Stdctrls::TComboBox inherited; + +private: + bool FAutoDropDownWidth; + bool FAutoItemHeight; + bool FFontChanging; + bool FHotTrack; + int FInternalItemHeight; + bool FMouseInControl; + bool FMouseInDropDownButton; + Extctrls::TTimer* FMouseTimer; + Sptbxskins::TSpTBXSkinType FSkinType; + Sptbxitem::TSpTBXDrawEvent FOnDrawBackground; + TSpTBXDrawListItemEvent FOnDrawItem; + TSpTBXDrawListItemEvent FOnDrawItemBackground; + void __fastcall MouseTimerHandler(System::TObject* Sender); + void __fastcall SetSkinType(const Sptbxskins::TSpTBXSkinType Value); + void __fastcall UpdateDropDownButton(void); + HIDESBASE MESSAGE void __fastcall CMEnter(Messages::TWMNoParams &Message); + HIDESBASE MESSAGE void __fastcall CMExit(Messages::TWMNoParams &Message); + HIDESBASE MESSAGE void __fastcall CNMeasureItem(Messages::TWMMeasureItem &Message); + HIDESBASE MESSAGE void __fastcall CMMouseEnter(Messages::TMessage &Message); + MESSAGE void __fastcall CMSPFontChanged(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall CNDrawItem(Messages::TWMDrawItem &Message); + HIDESBASE MESSAGE void __fastcall WMMouseMove(Messages::TWMMouse &Message); + HIDESBASE MESSAGE void __fastcall WMNCCalcSize(Messages::TWMNCCalcSize &Message); + HIDESBASE MESSAGE void __fastcall WMPaint(Messages::TWMPaint &Message); + MESSAGE void __fastcall WMSetFont(Messages::TWMSetFont &Message); + MESSAGE void __fastcall WMSpSkinChange(Messages::TMessage &Message); + +protected: + int FAutoDropDownWidthRightMargin; + virtual void __fastcall CreateParams(Controls::TCreateParams &Params); + virtual void __fastcall CreateWnd(void); + DYNAMIC void __fastcall CloseUp(void); + virtual void __fastcall DoCalcMaxDropDownWidth(void); + virtual void __fastcall DoDrawBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxitem::TSpTBXPaintStage PaintStage, bool &PaintDefault); + virtual void __fastcall DoDrawItem(Graphics::TCanvas* ACanvas, Types::TRect &ARect, int Index, const Windows::TOwnerDrawState State, const Sptbxitem::TSpTBXPaintStage PaintStage, bool &PaintDefault); + virtual void __fastcall DoDrawItemBackground(Graphics::TCanvas* ACanvas, Types::TRect &ARect, int Index, const Windows::TOwnerDrawState State, const Sptbxitem::TSpTBXPaintStage PaintStage, bool &PaintDefault); + virtual void __fastcall DrawItem(int Index, const Types::TRect &Rect, Windows::TOwnerDrawState State); + virtual void __fastcall DrawItemBackground(int Index, const Types::TRect &Rect, Windows::TOwnerDrawState State); + virtual void __fastcall EditWndProc(Messages::TMessage &Message); + virtual int __fastcall GetItemHt(void); + virtual void __fastcall SetItemHeight(int Value); + +public: + __fastcall virtual TSpTBXComboBox(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXComboBox(void); + Types::TRect __fastcall GetDropDownButtonRect(); + bool __fastcall GetMouseInDropDownButton(void); + HIDESBASE void __fastcall InvalidateFrame(void); + __property bool MouseInControl = {read=FMouseInControl, nodefault}; + +__published: + __property bool AutoDropDownWidth = {read=FAutoDropDownWidth, write=FAutoDropDownWidth, default=0}; + __property bool AutoItemHeight = {read=FAutoItemHeight, write=FAutoItemHeight, default=1}; + __property bool HotTrack = {read=FHotTrack, write=FHotTrack, default=1}; + __property Sptbxskins::TSpTBXSkinType SkinType = {read=FSkinType, write=SetSkinType, default=2}; + __property Sptbxitem::TSpTBXDrawEvent OnDrawBackground = {read=FOnDrawBackground, write=FOnDrawBackground}; + __property TSpTBXDrawListItemEvent OnDrawItem = {read=FOnDrawItem, write=FOnDrawItem}; + __property TSpTBXDrawListItemEvent OnDrawItemBackground = {read=FOnDrawItemBackground, write=FOnDrawItemBackground}; + __property OnMouseMove; +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXComboBox(HWND ParentWindow) : Stdctrls::TComboBox(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXListBox; +class PASCALIMPLEMENTATION TSpTBXListBox : public Stdctrls::TListBox +{ + typedef Stdctrls::TListBox inherited; + +private: + bool FHotTracking; + bool FHotTrack; + Sptbxskins::TSpTBXSkinType FSkinType; + bool FChildFocused; + TSpTBXDrawListItemEvent FOnDrawItem; + TSpTBXDrawListItemEvent FOnDrawItemBackground; + void __fastcall SetHotTrack(const bool Value); + void __fastcall SetSkinType(const Sptbxskins::TSpTBXSkinType Value); + HIDESBASE MESSAGE void __fastcall CMMouseEnter(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall CMMouseLeave(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall CMFocusChanged(Controls::TCMFocusChanged &Message); + HIDESBASE MESSAGE void __fastcall CNDrawItem(Messages::TWMDrawItem &Message); + HIDESBASE MESSAGE void __fastcall WMNCPaint(Messages::TWMNCPaint &Message); + MESSAGE void __fastcall WMSpSkinChange(Messages::TMessage &Message); + +protected: + virtual void __fastcall CreateParams(Controls::TCreateParams &Params); + virtual void __fastcall DoDrawItem(Graphics::TCanvas* ACanvas, Types::TRect &ARect, int Index, const Windows::TOwnerDrawState State, const Sptbxitem::TSpTBXPaintStage PaintStage, bool &PaintDefault); + virtual void __fastcall DoDrawItemBackground(Graphics::TCanvas* ACanvas, Types::TRect &ARect, int Index, const Windows::TOwnerDrawState State, const Sptbxitem::TSpTBXPaintStage PaintStage, bool &PaintDefault); + virtual void __fastcall DrawItem(int Index, const Types::TRect &Rect, Windows::TOwnerDrawState State); + virtual void __fastcall DrawItemBackground(int Index, const Types::TRect &Rect, Windows::TOwnerDrawState State); + +public: + __fastcall virtual TSpTBXListBox(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXListBox(void); + void __fastcall InvalidateBorders(void); + __property bool HotTracking = {read=FHotTracking, nodefault}; + +__published: + __property Style = {default=1}; + __property bool HotTrack = {read=FHotTrack, write=SetHotTrack, default=1}; + __property Sptbxskins::TSpTBXSkinType SkinType = {read=FSkinType, write=SetSkinType, default=2}; + __property TSpTBXDrawListItemEvent OnDrawItem = {read=FOnDrawItem, write=FOnDrawItem}; + __property TSpTBXDrawListItemEvent OnDrawItemBackground = {read=FOnDrawItemBackground, write=FOnDrawItemBackground}; +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXListBox(HWND ParentWindow) : Stdctrls::TListBox(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXCheckListBox; +class PASCALIMPLEMENTATION TSpTBXCheckListBox : public Checklst::TCheckListBox +{ + typedef Checklst::TCheckListBox inherited; + +private: + bool FHotTracking; + bool FHotTrack; + Sptbxskins::TSpTBXSkinType FSkinType; + bool FChildFocused; + TSpTBXDrawListItemEvent FOnDrawItem; + TSpTBXDrawListItemEvent FOnDrawItemBackground; + void __fastcall SetHotTrack(const bool Value); + void __fastcall SetSkinType(const Sptbxskins::TSpTBXSkinType Value); + HIDESBASE MESSAGE void __fastcall CMMouseEnter(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall CMMouseLeave(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall CMFocusChanged(Controls::TCMFocusChanged &Message); + HIDESBASE MESSAGE void __fastcall CNDrawItem(Messages::TWMDrawItem &Message); + HIDESBASE MESSAGE void __fastcall WMNCPaint(Messages::TWMNCPaint &Message); + MESSAGE void __fastcall WMSpSkinChange(Messages::TMessage &Message); + +protected: + virtual void __fastcall DoDrawItem(Graphics::TCanvas* ACanvas, Types::TRect &ARect, int Index, const Windows::TOwnerDrawState State, const Sptbxitem::TSpTBXPaintStage PaintStage, bool &PaintDefault); + virtual void __fastcall DoDrawItemBackground(Graphics::TCanvas* ACanvas, Types::TRect &ARect, int Index, const Windows::TOwnerDrawState State, const Sptbxitem::TSpTBXPaintStage PaintStage, bool &PaintDefault); + virtual void __fastcall DrawItem(int Index, const Types::TRect &Rect, Windows::TOwnerDrawState State); + virtual void __fastcall DrawItemBackground(int Index, const Types::TRect &Rect, Windows::TOwnerDrawState State); + +public: + __fastcall virtual TSpTBXCheckListBox(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXCheckListBox(void); + void __fastcall InvalidateBorders(void); + __property bool HotTracking = {read=FHotTracking, nodefault}; + +__published: + __property Style = {default=1}; + __property bool HotTrack = {read=FHotTrack, write=SetHotTrack, default=1}; + __property Sptbxskins::TSpTBXSkinType SkinType = {read=FSkinType, write=SetSkinType, default=2}; + __property TSpTBXDrawListItemEvent OnDrawItem = {read=FOnDrawItem, write=FOnDrawItem}; + __property TSpTBXDrawListItemEvent OnDrawItemBackground = {read=FOnDrawItemBackground, write=FOnDrawItemBackground}; +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXCheckListBox(HWND ParentWindow) : Checklst::TCheckListBox(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXEditItem; +class PASCALIMPLEMENTATION TSpTBXEditItem : public Sptbxitem::TSpTBXCustomItem +{ + typedef Sptbxitem::TSpTBXCustomItem inherited; + +private: + System::WideString FEditCaption; + Imglist::TImageIndex FEditImageIndex; + System::WideString FText; + bool FAllowVerticalEditor; + Stdctrls::TEditCharCase FCharCase; + Sptbxitem::TSpTBXFontSettings* FEditorFontSettings; + bool FExtendedAccept; + Sptbxitem::TSpTBXFontSettings* FFontSettings; + int FMaxLength; + System::WideChar FPasswordChar; + bool FReadOnly; + bool FShowImage; + TSpTBXEditAcceptTextEvent FOnAcceptText; + TSpTBXBeginEditEvent FOnBeginEdit; + TSpTBXEditChangeEvent FOnChange; + TSpTBXEditMessageEvent FOnEditMessage; + HIDESBASE void __fastcall FontSettingsChanged(System::TObject* Sender); + void __fastcall SetAllowVerticalEditor(const bool Value); + void __fastcall SetCharCase(Stdctrls::TEditCharCase Value); + void __fastcall SetEditCaption(const System::WideString Value); + void __fastcall SetEditorFontSettings(const Sptbxitem::TSpTBXFontSettings* Value); + void __fastcall SetMaxLength(int Value); + void __fastcall SetPasswordChar(System::WideChar Value); + void __fastcall SetShowImage(const bool Value); + void __fastcall SetText(System::WideString Value); + +protected: + virtual bool __fastcall DoAcceptText(System::WideString &NewText); + virtual bool __fastcall DoAutoComplete(System::WideString &AText); + virtual void __fastcall DoBeginEdit(TSpTBXEditItemViewer* Viewer); + virtual void __fastcall DoChange(const System::WideString AText); + virtual void __fastcall DoTextChanging(const System::WideString OldText, System::WideString &NewText, int Reason); + virtual Tb2item::TTBItemViewerClass __fastcall GetItemViewerClass(Tb2item::TTBView* AView); + virtual bool __fastcall NeedToRecreateViewer(Tb2item::TTBItemViewer* AViewer); + virtual void __fastcall SetTextEx(System::WideString Value, int Reason); + +public: + bool __fastcall StartEditing(Tb2item::TTBView* AView); + __fastcall virtual TSpTBXEditItem(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXEditItem(void); + +__published: + __property Action; + __property Alignment = {default=0}; + __property Caption; + __property CustomWidth = {default=64}; + __property CustomHeight = {default=-1}; + __property DisplayMode = {default=0}; + __property Enabled = {default=1}; + __property FontSettings; + __property GroupIndex = {default=0}; + __property HelpContext = {default=0}; + __property Hint; + __property ImageIndex = {default=-1}; + __property Images; + __property ShortCut = {default=0}; + __property Visible = {default=1}; + __property OnClick; + __property OnDrawCaption; + __property OnDrawHint; + __property OnDrawImage; + __property OnDrawItem; + __property OnSelect; + __property System::WideString EditCaption = {read=FEditCaption, write=SetEditCaption}; + __property Imglist::TImageIndex EditImageIndex = {read=FEditImageIndex, write=FEditImageIndex, default=-1}; + __property System::WideString Text = {read=FText, write=SetText}; + __property bool AllowVerticalEditor = {read=FAllowVerticalEditor, write=SetAllowVerticalEditor, default=0}; + __property Stdctrls::TEditCharCase CharCase = {read=FCharCase, write=SetCharCase, default=0}; + __property Sptbxitem::TSpTBXFontSettings* EditorFontSettings = {read=FEditorFontSettings, write=SetEditorFontSettings}; + __property bool ExtendedAccept = {read=FExtendedAccept, write=FExtendedAccept, default=0}; + __property int MaxLength = {read=FMaxLength, write=SetMaxLength, default=0}; + __property System::WideChar PasswordChar = {read=FPasswordChar, write=SetPasswordChar, default=0}; + __property bool ReadOnly = {read=FReadOnly, write=FReadOnly, default=0}; + __property bool ShowImage = {read=FShowImage, write=SetShowImage, default=0}; + __property TSpTBXEditAcceptTextEvent OnAcceptText = {read=FOnAcceptText, write=FOnAcceptText}; + __property TSpTBXBeginEditEvent OnBeginEdit = {read=FOnBeginEdit, write=FOnBeginEdit}; + __property TSpTBXEditChangeEvent OnChange = {read=FOnChange, write=FOnChange}; + __property TSpTBXEditMessageEvent OnEditMessage = {read=FOnEditMessage, write=FOnEditMessage}; +}; + + +typedef TMetaClass* TEditClass; + +class PASCALIMPLEMENTATION TSpTBXEditItemViewer : public Sptbxitem::TSpTBXItemViewer +{ + typedef Sptbxitem::TSpTBXItemViewer inherited; + +private: + #pragma option push -b- + enum _TSpTBXEditItemViewer__1 { ecsContinueLoop, ecsAccept, ecsClose }; + #pragma option pop + + +private: + bool __fastcall EditLoop(const HWND CapHandle); + void __fastcall EditWndProc(Messages::TMessage &Message); + System::WideString __fastcall GetEditControlText(); + void __fastcall GetEditHeight(const HDC DC, /* out */ int &EditHeight, /* out */ int &ExternalLeading); + HIDESBASE TSpTBXEditItem* __fastcall GetItem(void); + void __fastcall MouseBeginEdit(void); + tagSIZE __fastcall MeasureEditCaption(); + int __fastcall MeasureTextHeight(void); + +protected: + Stdctrls::TCustomEdit* FEditControl; + Set<_TSpTBXEditItemViewer__1, ecsContinueLoop, ecsClose> FEditControlStatus; + virtual void __fastcall CalcSize(const Graphics::TCanvas* Canvas, int &AWidth, int &AHeight); + DYNAMIC bool __fastcall CaptionShown(void); + virtual void __fastcall DoBeginEdit(void); + virtual bool __fastcall DoExecute(void); + virtual bool __fastcall HandleEditMessage(Messages::TMessage &Message); + virtual int __fastcall GetAccRole(void); + virtual bool __fastcall GetAccValue(System::WideString &Value); + virtual void __fastcall GetCursor(const Types::TPoint &Pt, HICON &ACursor); + virtual TEditClass __fastcall GetEditControlClass(void); + virtual void __fastcall GetEditRect(Types::TRect &R); + virtual bool __fastcall GetImageShown(void); + virtual int __fastcall GetIndentBefore(void); + virtual int __fastcall GetIndentAfter(void); + virtual void __fastcall InternalDrawFrame(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxskins::TSpTBXMenuItemInfo &ItemInfo); + virtual void __fastcall InternalEditControlChange(System::TObject* Sender); + virtual void __fastcall InternalEditControlExit(void); + virtual void __fastcall MouseDown(Classes::TShiftState Shift, int X, int Y, bool &MouseDownOnMenu); + virtual void __fastcall MouseUp(int X, int Y, bool MouseWasDownOnMenu); + virtual void __fastcall Paint(const Graphics::TCanvas* Canvas, const Types::TRect &ClientAreaRect, bool IsSelected, bool IsPushed, bool UseDisabledShadow); + virtual bool __fastcall ShowImage(void); + virtual bool __fastcall UsesSameWidth(void); + +public: + virtual System::WideString __fastcall GetCaptionText(); + __property Stdctrls::TCustomEdit* EditControl = {read=FEditControl}; + __property TSpTBXEditItem* Item = {read=GetItem}; +public: + /* TTBItemViewer.Create */ inline __fastcall virtual TSpTBXEditItemViewer(Tb2item::TTBView* AView, Tb2item::TTBCustomItem* AItem, int AGroupLevel) : Sptbxitem::TSpTBXItemViewer(AView, AItem, AGroupLevel) { } + /* TTBItemViewer.Destroy */ inline __fastcall virtual ~TSpTBXEditItemViewer(void) { } + +}; + + +class DELPHICLASS TSpTBXSpinEditItem; +class PASCALIMPLEMENTATION TSpTBXSpinEditItem : public TSpTBXEditItem +{ + typedef TSpTBXEditItem inherited; + +private: + TSpTBXSpinEditOptions* FSpinOptions; + void __fastcall SpinOptionsGetText(System::TObject* Sender, System::WideString &NewText, bool &Accept); + void __fastcall SpinOptionsSetText(System::TObject* Sender, const System::WideString AText); + System::Extended __fastcall GetValue(void); + Classes::TNotifyEvent __fastcall GetValueChanged(); + void __fastcall SetValue(const System::Extended Value); + void __fastcall SetValueChanged(const Classes::TNotifyEvent ValueChangedEvent); + +protected: + virtual Tb2item::TTBItemViewerClass __fastcall GetItemViewerClass(Tb2item::TTBView* AView); + +public: + __fastcall virtual TSpTBXSpinEditItem(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXSpinEditItem(void); + +__published: + __property Alignment = {default=1}; + __property Text = {stored=false}; + __property TSpTBXSpinEditOptions* SpinOptions = {read=FSpinOptions, write=FSpinOptions}; + __property System::Extended Value = {read=GetValue, write=SetValue, stored=false}; + __property Classes::TNotifyEvent OnValueChanged = {read=GetValueChanged, write=SetValueChanged}; +}; + + +class DELPHICLASS TSpTBXSpinEditViewer; +class PASCALIMPLEMENTATION TSpTBXSpinEditViewer : public TSpTBXEditItemViewer +{ + typedef TSpTBXEditItemViewer inherited; + +private: + bool FUpPushed; + bool FDownPushed; + Extctrls::TTimer* FTimer; + void __fastcall TimerHandler(System::TObject* Sender); + HIDESBASE TSpTBXSpinEditItem* __fastcall GetItem(void); + +protected: + virtual int __fastcall GetAccRole(void); + virtual int __fastcall GetIndentAfter(void); + virtual bool __fastcall HandleEditMessage(Messages::TMessage &Message); + void __fastcall InvalidateButtons(void); + virtual bool __fastcall IsPtInButtonPart(int X, int Y); + virtual void __fastcall LosingCapture(void); + virtual void __fastcall MouseDown(Classes::TShiftState Shift, int X, int Y, bool &MouseDownOnMenu); + virtual void __fastcall MouseUp(int X, int Y, bool MouseWasDownOnMenu); + virtual void __fastcall InternalDrawFrame(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxskins::TSpTBXMenuItemInfo &ItemInfo); + virtual void __fastcall InternalEditControlChange(System::TObject* Sender); + virtual void __fastcall InternalEditControlExit(void); + +public: + __fastcall virtual ~TSpTBXSpinEditViewer(void); + __property TSpTBXSpinEditItem* Item = {read=GetItem}; +public: + /* TTBItemViewer.Create */ inline __fastcall virtual TSpTBXSpinEditViewer(Tb2item::TTBView* AView, Tb2item::TTBCustomItem* AItem, int AGroupLevel) : TSpTBXEditItemViewer(AView, AItem, AGroupLevel) { } + +}; + + +//-- var, const, procedure --------------------------------------------------- +static const Word CM_SPFONTCHANGED = 0xb8ad; +static const ShortInt tcrSetProperty = 0x0; +static const ShortInt tcrActionLink = 0x1; +static const ShortInt tcrEditControl = 0x2; +extern PACKAGE void __fastcall SpCalcMaxDropDownWidth(TSpTBXComboBox* Combo, int RightMargin = 0x8); +extern PACKAGE bool __fastcall SpFocusEditItem(Tb2item::TTBCustomItem* Item, Tb2item::TTBView* View); +extern PACKAGE bool __fastcall SpStartsTextW(const System::WideString ASubText, const System::WideString AText); +extern PACKAGE bool __fastcall SpCanEditFrameBeHotTracked(Forms::TBorderStyle BorderStyle, Sptbxskins::TSpTBXSkinType SkinType); +extern PACKAGE void __fastcall SpDrawXPEditButton(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool Enabled, bool FrameHotTrack, bool HotTrack, bool Pushed, bool RightAligned); +extern PACKAGE void __fastcall SpDrawXPComboButton(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool Enabled, bool FrameHotTrack, bool HotTrack, bool DroppedDown, bool RightAligned, Sptbxskins::TSpTBXSkinType SkinType); +extern PACKAGE void __fastcall SpDrawXPSpinButton(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool Enabled, bool FrameHotTrack, bool UpHotTrack, bool DownHotTrack, bool UpPushed, bool DownPushed, bool RightAligned, Sptbxskins::TSpTBXSkinType SkinType); + +} /* namespace Sptbxeditors */ +using namespace Sptbxeditors; +#pragma pack(pop) +#pragma option pop + +#pragma delphiheader end. +//-- end unit ---------------------------------------------------------------- +#endif // SptbxeditorsHPP diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXEditors.pas b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXEditors.pas new file mode 100644 index 0000000..dc93482 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXEditors.pas @@ -0,0 +1,3725 @@ +unit SpTBXEditors; + +{============================================================================== +Version 2.4.2 + +The contents of this file are subject to the SpTBXLib License; you may +not use or distribute this file except in compliance with the +SpTBXLib License. +A copy of the SpTBXLib License may be found in SpTBXLib-LICENSE.txt or at: + http://www.silverpointdevelopment.com/sptbxlib/SpTBXLib-LICENSE.htm + +Alternatively, the contents of this file may be used under the terms of the +Mozilla Public License Version 1.1 (the "MPL v1.1"), in which case the provisions +of the MPL v1.1 are applicable instead of those in the SpTBXLib License. +A copy of the MPL v1.1 may be found in MPL-LICENSE.txt or at: + http://www.mozilla.org/MPL/ + +If you wish to allow use of your version of this file only under the terms of +the MPL v1.1 and not to allow others to use your version of this file under the +SpTBXLib License, indicate your decision by deleting the provisions +above and replace them with the notice and other provisions required by the +MPL v1.1. If you do not delete the provisions above, a recipient may use your +version of this file under either the SpTBXLib License or the MPL v1.1. + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for +the specific language governing rights and limitations under the License. + +The initial developer of this code is Robert Lee. + +Requirements: +For Delphi/C++Builder 2009 or newer: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org +For Delphi/C++Builder 7-2007: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org + - Troy Wolbrink's TNT Unicode Controls + http://www.tntware.com/delphicontrols/unicode/ + +Development notes: + - All the Windows and Delphi bugs fixes are marked with '[Bugfix]'. + - All the theme changes and adjustments are marked with '[Theme-Change]'. + +To Do: + - Rotated caption painting. + +Known Issues: + - + +History: +8 May 2009 - version 2.4.2 + - Added AutoDropDownWidth property to TSpTBXComboBox, use + this to automatically calculate the DropDown window + size. + - Changed params of OnDrawItem and OnDrawItemBackground events + from TSpTBXComboBox. + +15 March 2009 - version 2.4.1 + - Added HasEditButton public method to TSpTBXEdit. + - Added GetDropDownButtonRect public method to TSpTBXComboBox. + - Fixed TSpTBXEdit frame flicker, thanks to Marc Hoffmann for + reporting this. + - Fixed incorrect TSpTBXEdit frame painting when the edit was + placed on a Toolbar, thanks to Alfred Vink for reporting this. + - Fixed incorrect TSpTBXListBox painting when OnDrawItem event + was used, thanks to Evgeny Efimov for reporting this. + +17 January 2009 - version 2.4 + - Added AutoItemHeight property to TSpTBXComboBox, use this + to automatically calculate the ItemHeight property when the + Style is csDropDown, csDropDownList or csSimple. + +26 September 2008 - version 2.3 + - Added skinning support to TSpTBXComboBox items. + - Fixed incorrect TSpTBXEditItem OnChange event handling, + the event was only fired if the text property was changed, + thanks to Anta for reporting this. + - Added hack to automatically adjust the ItemHeight based on + the ComboBox font size. Delphi doesn't do this when the + ComboBox is owner drawed. + +29 July 2008 - version 2.2 + - Fixed incorrect TSpTBXEditItem size when the item is on + a menu, thanks to David for reporting it. + +26 June 2008 - version 2.1 + - Added EditImageIndex property to TSpTBXEditItem and + TSpTBXSpinEditItem, use this to show an icon image + on the left of the EditCaption when the item is on a menu. + +3 May 2008 - version 2.0 + - No changes. + +2 April 2008 - version 1.9.5 + - Added ExtendedAccept property to TSpTBXSpinEditor. + - Fixed incorrect TSpTBXSpinEditor.ValueInc/ValueDec behavior + when ValueSnap was true and Increment was a fraction, thanks + to John for reporting this. + +3 Febrary 2008 - version 1.9.4 + - Fixed incorrect TSpTBXSpinEditor.ValueInc/ValueDec behavior + when ValueSnap was true and Increment was higher than + 10000, thanks to Yucel for reporting this. + +19 January 2008 - version 1.9.3 + - Fixed incorrect TSpTBXComboBox painting on Windows Vista, + thanks to Santiago Vila for reporting this. + +26 December 2007 - version 1.9.2 + - Fixed incorrect TSpTBXSpinEdit font behavior, when the font + was changed at runtime the edit rect was not updated, thanks + to Beta Xiong for reporting this. + +1 December 2007 - version 1.9.1 + - Fixed incorrect TSpTBXEditButton painting, when the caption + was empty and DropDownMenu was assigned 2 arrows were painted + instead of 1, thanks to Costas Stergiou for reporting this. + +20 November 2007 - version 1.9 + - Removed TBX dependency. + +20 April 2007 - version 1.8.4 + - Added CustomWidth and CustomHeight properties to the toolbar + editor items. + - Fixed incorrect TSpTBXEditItem.StartEditing behavior, + thanks to Daniel Rikowski for reporting this. + +8 February 2007 - version 1.8.3 + - Fixed incorrect OnChange event handling in TSpTBXEditItem, + thanks to Daniel Rikowski for reporting this. + +17 December 2006 - version 1.8.2 + - Fixed a BDS 2006 bug related to Comboboxes, CM_MOUSEENTER and + CM_MOUSELEAVE are fired everytime the mouse is moved over the + internal edit control. In D7 these messages were only fired when + the mouse entered or leaved the combobox. + +24 November 2006 - version 1.8.1 + - Fixed incorrect TSpTBXSpinEdit behavior, the Value was not updated + when the control was unfocused, thanks to Steve and Sebastian for + reporting this. + +27 August 2006 - version 1.8 + - Improved editor's button painting. + +15 June 2006 - version 1.7 + - Fixed edit items incorrect painting, the items were not painted + using the color of FontSettings and EditorFontSettings properties, + the same happens with the TBX items. + +4 May 2006 - version 1.6 + - No changes. + +12 April 2006 - version 1.5 + - Added ValueType, ValueAsInteger, Decimals, Prefix and Postfix + properties to TSpTBXSpinEdit, thanks to Maxim Rylov for his + code donation. + - Fixed TSpTBXSpinEdit painting. + +27 February 2006 - version 1.4 + - New component added, TSpTBXSpinEdit: a SpinEdit control + that has TBX themes support. + - Fixed TSpTBXComboBoxItem bug, when AutoComplete is set to + false the ComboBox still autocompletes the text, thanks to + Erwin Denissen for reporting this. + - Fixed Delphi 2005/2006 bug, CM_MOUSEENTER and CM_MOUSELEAVE + are fired everytime the mouse enters the combobox internal + edit control. In prior versions of Delphi these messages + were only fired when the mouse entered or leaved the combobox, + including the internal edit control. + +10 February 2006 - version 1.3 + - New component added, TSpTBXButtonEdit: an Edit control that + has a multipurpose button attached. + - Added new public method, AddEditButton, to TSpTBXEdit. + +28 December 2005 - version 1.2 + - No changes. + +18 October 2005 - version 1.1 + - New component added, TSpTBXListBox: a ListBox + with Unicode and TBX themes support that paints + a hottrack border and TBX theme style selection. + - New component added, TSpTBXCheckListBox: a CheckListBox + with Unicode and TBX themes support that paints + a hottrack border and TBX theme style selection. + - Fixed TSpTBXComboBoxItem dynamic creation problem. + +18 August 2005 - version 1.0 + - No changes. + +10 June 2005 - version 0.9 + - SpTBXLib may now alternatively, at your option, be used and/or + distributed under the terms of the SpTBXLib License. + Please see the updated LICENSE.TXT file for more information. + +20 May 2005 - version 0.8 + - Fixed TSpTBXDropDownItem and TSpTBXComboBoxItem bugs, the popup list + should be closed when F4 is pressed, thanks to Rune Moberg for + reporting this. + - Fixed TSpTBXComboBoxItem bug, the ComboBox didn't check the ItemIndex + bounds when pressing Up or Down keys, thanks to Rune Moberg for + reporting this. + - Fixed AV when trying to dock a toolbar with a TSpTBXComboBoxItem + on a vertical dock, thanks to Pavel for reporting this. + +16 February 2005 - version 0.7 + - Fixed unicode support in W9x, thanks to Daniel Rikowski for + reporting this. + - Fixed editors bug, the editors autocomplete was case sensitive, + this is a TBX bug but it was fixed without patching the source, + thanks to Daniel Rikowski for reporting this. + - Fixed TSpTBXComboBox painting bug, the edit frame was not + correctly highlighted when using the Default theme. + - Added HotTrack property to TSpTBXEdit and TSpTBXComboBox, when + setted to true a TBX style frame will be painted when the mouse + is over the control. + - Added OnDrawBackground event to TSpTBXEdit and TSpTBXComboBox. + +23 December 2004 - version 0.6 + - Initial release. + +==============================================================================} + +interface + +{$BOOLEVAL OFF} // Unit depends on short-circuit boolean evaluation + +uses + Windows, Messages, Classes, SysUtils, Controls, Graphics, ImgList, Forms, + Menus, StdCtrls, ExtCtrls, ActnList, CheckLst, + {$IFNDEF UNICODE} + TntClasses, TntControls, TntStdCtrls, TntCheckLst, TntSysUtils, + {$ENDIF} + TB2Toolbar, TB2Item, TB2ExtItems, + SpTBXSkins, SpTBXItem, SpTBXControls; + +{$IFDEF UNICODE} +type + TTntComboBox = TComboBox; + TTntListBox = TListBox; + TTntCheckListBox = TCheckListBox; +{$ENDIF} + +const + CM_SPFONTCHANGED = CM_BASE + 2221; // Message sent to the control when the font is changed + + { Change reasons for EditItem.Text property } + tcrSetProperty = 0; // direct assignment to Text property + tcrActionLink = 1; // change comes from an action link + tcrEditControl = 2; // change is caused by typing in edit area + +type + TSpTBXSpinType = ( + spnInteger, + spnFloat, + spnHex + ); + + TSpTBXEditItemViewer = class; + TSpTBXSpinEditViewer = class; + + TSpTBXEditChangeEvent = procedure(Sender: TObject; const AText: WideString) of object; + TSpTBXEditAcceptTextEvent = procedure(Sender: TObject; var NewText: WideString; var Accept: Boolean) of object; + TSpTBXEditGetTextEvent = procedure(Sender: TObject; var AText: WideString) of object; + TSpTBXBeginEditEvent = procedure(Sender: TObject; Viewer: TSpTBXEditItemViewer; EditControl: TCustomEdit) of object; + TSpTBXEditMessageEvent = procedure(Sender: TObject; Viewer: TSpTBXEditItemViewer; var Message: TMessage; var Handled: Boolean) of object; + TSpTBXDrawListItemEvent = procedure(Sender: TObject; ACanvas: TCanvas; var ARect: TRect; Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean) of object; + + { TSpTBXEditButton } + + TSpTBXEditButton = class(TSpTBXSpeedButton) + protected + procedure AdjustFont(AFont: TFont); override; + function DoDrawDropDownArrow(ACanvas: TCanvas; ARect: TRect): Boolean; override; + function DoDrawItem(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage): Boolean; override; + function GetFrameHotTrack: Boolean; + public + constructor Create(AOwner: TComponent); override; + procedure Click; override; + end; + + { TSpTBXSpinButton } + + TSpTBXSpinButton = class(TSpTBXEditButton) + private + FUpPushed: Boolean; + FDownPushed: Boolean; + FOnUpClick: TNotifyEvent; + FOnDownClick: TNotifyEvent; + protected + function DoDrawItem(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage): Boolean; override; + procedure DoMouseLeave; override; + procedure MouseMove(Shift: TShiftState; X: Integer; Y: Integer); override; + procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); override; + property OnUpClick: TNotifyEvent read FOnUpClick write FOnUpClick; + property OnDownClick: TNotifyEvent read FOnDownClick write FOnDownClick; + public + constructor Create(AOwner: TComponent); override; + procedure Click; override; + procedure IsHotTracking(out UpButton, DownButton, EditFrame: Boolean); + published + property Repeating default True; + end; + + { TSpTBXUnicodeAdaptEdit } + + // Do not inherit from TTNTEdit, TBEditItemViewer.GetEditControlClass needs a TEditClass + {$IFNDEF UNICODE} + TSpTBXUnicodeAdaptEdit = class(TEdit) + private + FPasswordChar: WideChar; + procedure SetSelText(const Value: WideString); + function GetText: WideString; + procedure SetText(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsHintStored: Boolean; + function GetPasswordChar: WideChar; + procedure SetPasswordChar(const Value: WideChar); + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure CreateWnd; override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + function GetSelStart: Integer; reintroduce; virtual; + procedure SetSelStart(const Value: Integer); reintroduce; virtual; + function GetSelLength: Integer; reintroduce; virtual; + procedure SetSelLength(const Value: Integer); reintroduce; virtual; + function GetSelText: WideString; reintroduce; virtual; + public + property SelText: WideString read GetSelText write SetSelText; + property SelStart: Integer read GetSelStart write SetSelStart; + property SelLength: Integer read GetSelLength write SetSelLength; + published + // Don't let the streaming system store the WideStrings, use DefineProperties instead + property Text: WideString read GetText write SetText; + property Hint: WideString read GetHint write SetHint stored IsHintStored; + property PasswordChar: WideChar read GetPasswordChar write SetPasswordChar default #0; + end; + {$ELSE} + TSpTBXUnicodeAdaptEdit = class(TEdit); + {$ENDIF} + + { TSpTBXUnicodeEdit } + + TSpTBXUnicodeEdit = class(TSpTBXUnicodeAdaptEdit) + private + FAlignment: TAlignment; + procedure SetAlignment(Value: TAlignment); + procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED; + procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED; + protected + procedure CreateWnd; override; + procedure CreateParams(var Params: TCreateParams); override; + procedure UpdateEditRect; virtual; + public + function AddEditButton(RightAligned: Boolean = True; AWidth: Integer = -1): TSpTBXEditButton; + function HasEditButton: Boolean; + published + property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify; + end; + + { TSpTBXEdit } + + TSpTBXEdit = class(TSpTBXUnicodeEdit) + private + FBorderStyle: TBorderStyle; + FHotTrack: Boolean; + FSkinType: TSpTBXSkinType; + FMouseInControl: Boolean; + procedure SetBorderStyle(const Value: TBorderStyle); + procedure SetSkinType(const Value: TSpTBXSkinType); + procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED; + procedure CMEnter(var Message: TCMEnter); message CM_ENTER; + procedure CMExit(var Message: TCMExit); message CM_EXIT; + procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; + procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; + procedure WMNCPaint(var Message: TWMNCPaint); message WM_NCPAINT; + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure InvalidateFrame; + property MouseInControl: Boolean read FMouseInControl; + published + property BorderStyle: TBorderStyle read FBorderStyle write SetBorderStyle default bsSingle; // Hides the inherited BorderStyle + property HotTrack: Boolean read FHotTrack write FHotTrack default True; + property SkinType: TSpTBXSkinType read FSkinType write SetSkinType default sknSkin; + end; + + { TSpTBXButtonEdit } + + TSpTBXCustomButtonEdit = class(TSpTBXEdit) + private + FEditButton: TSpTBXEditButton; + protected + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure SetName(const Value: TComponentName); override; + property EditButton: TSpTBXEditButton read FEditButton; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + end; + + TSpTBXButtonEdit = class(TSpTBXCustomButtonEdit) + published + property EditButton; + end; + + { TSpTBXSpinEdit } + + TSpTBXSpinEditOptions = class(TPersistent) + private + FDecimal: Integer; + FIncrement: Extended; + FMinValue: Extended; + FMaxValue: Extended; + FValue: Extended; + FValueSnap: Boolean; + FValueType: TSpTBXSpinType; + FPrefix: WideString; + FPostfix: WideString; + FOnGetText: TSpTBXEditAcceptTextEvent; + FOnSetText: TSpTBXEditChangeEvent; + FOnValueChanged: TNotifyEvent; + function IsIncrementStored: Boolean; + function IsMaxValueStored: Boolean; + function IsMinValueStored: Boolean; + function IsValueStored: Boolean; + procedure SetDecimal(NewDecimal: Integer); + procedure SetMaxValue(const NewValue: Extended); + procedure SetMinValue(const NewValue: Extended); + procedure SetValue(const NewValue: Extended); + procedure SetValueType(NewType: TSpTBXSpinType); + procedure SetPostfix(const ValueString: WideString); + procedure SetPrefix(const ValueString: WideString); + function GetValueAsInteger: Int64; + procedure SetValueAsInteger(const NewValue: Int64); + protected + procedure DoValueChanged; virtual; + procedure UpdateTextFromValue; + procedure UpdateValueFromText(RevertWhenInvalid: Boolean = True); + property OnGetText: TSpTBXEditAcceptTextEvent read FOnGetText write FOnGetText; + property OnSetText: TSpTBXEditChangeEvent read FOnSetText write FOnSetText; + property OnValueChanged: TNotifyEvent read FOnValueChanged write FOnValueChanged; + public + constructor Create; virtual; + procedure ValueInc; + procedure ValueDec; + property ValueAsInteger: Int64 read GetValueAsInteger write SetValueAsInteger; + published + property Decimal: Integer read FDecimal write SetDecimal default 2; + property Increment: Extended read FIncrement write FIncrement stored IsIncrementStored; + property MaxValue: Extended read FMaxValue write SetMaxValue stored IsMaxValueStored; + property MinValue: Extended read FMinValue write SetMinValue stored IsMinValueStored; + property Postfix: WideString read FPostfix write SetPostfix; + property Prefix: WideString read FPrefix write SetPrefix; + property Value: Extended read FValue write SetValue stored IsValueStored; + property ValueSnap: Boolean read FValueSnap write FValueSnap default True; + property ValueType: TSpTBXSpinType read FValueType write SetValueType default spnInteger; + end; + + TSpTBXSpinEdit = class(TSpTBXEdit) + private + FExtendedAccept: Boolean; + FSpinButton: TSpTBXSpinButton; + FSpinOptions: TSpTBXSpinEditOptions; + procedure SpinOptionsGetText(Sender: TObject; var NewText: WideString; var Accept: Boolean); + procedure SpinOptionsSetText(Sender: TObject; const AText: WideString); + function GetValue: Extended; + function GetValueChanged: TNotifyEvent; + procedure SetValue(const Value: Extended); + procedure SetValueChanged(const ValueChangedEvent: TNotifyEvent); + procedure CMExit(var Message: TCMExit); message CM_EXIT; + protected + procedure Change; override; + procedure KeyDown(var Key: Word; Shift: TShiftState); override; + procedure KeyPress(var Key: Char); override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure UpClick(Sender: TObject); virtual; + procedure DownClick(Sender: TObject); virtual; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + property Alignment default taRightJustify; + property ExtendedAccept: Boolean read FExtendedAccept write FExtendedAccept default False; + property Text stored False; + property SpinButton: TSpTBXSpinButton read FSpinButton; + property SpinOptions: TSpTBXSpinEditOptions read FSpinOptions write FSpinOptions; + property Value: Extended read GetValue write SetValue stored False; + property OnValueChanged: TNotifyEvent read GetValueChanged write SetValueChanged; + end; + + { TSpTBXComboBox } + + TSpTBXComboBox = class(TTntComboBox) + private + FAutoDropDownWidth: Boolean; + FAutoItemHeight: Boolean; + FFontChanging: Boolean; + FHotTrack: Boolean; + FInternalItemHeight: Integer; + FMouseInControl: Boolean; + FMouseInDropDownButton: Boolean; + FMouseTimer: TTimer; + FSkinType: TSpTBXSkinType; + FOnDrawBackground: TSpTBXDrawEvent; + FOnDrawItem: TSpTBXDrawListItemEvent; + FOnDrawItemBackground: TSpTBXDrawListItemEvent; + procedure MouseTimerHandler(Sender: TObject); + procedure SetSkinType(const Value: TSpTBXSkinType); + procedure UpdateDropDownButton; + procedure CMEnter(var Message: TCMEnter); message CM_ENTER; + procedure CMExit(var Message: TCMExit); message CM_EXIT; + procedure CNMeasureItem(var Message: TWMMeasureItem); message CN_MEASUREITEM; + procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; + procedure CMSPFontChanged(var Message: TMessage); message CM_SPFONTCHANGED; + procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM; + procedure WMMouseMove(var Message: TWMMouseMove); message WM_MOUSEMOVE; + procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE; + procedure WMPaint(var Message: TWMPaint); message WM_PAINT; + procedure WMSetFont(var Message: TWMSetFont); message WM_SETFONT; + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + protected + FAutoDropDownWidthRightMargin: Integer; + procedure CreateParams(var Params: TCreateParams); override; + procedure CreateWnd; override; + procedure CloseUp; override; + procedure DoCalcMaxDropDownWidth; virtual; + procedure DoDrawBackground(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure DoDrawItem(ACanvas: TCanvas; var ARect: TRect; Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure DoDrawItemBackground(ACanvas: TCanvas; var ARect: TRect; Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); override; + procedure DrawItemBackground(Index: Integer; Rect: TRect; State: TOwnerDrawState); virtual; + {$IF CompilerVersion > 17} + procedure EditWndProc(var Message: TMessage); override; + {$IFEND} + function GetItemHt: Integer; override; + procedure SetItemHeight(Value: Integer); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function GetDropDownButtonRect: TRect; + function GetMouseInDropDownButton: Boolean; + procedure InvalidateFrame; + property MouseInControl: Boolean read FMouseInControl; + published + property AutoDropDownWidth: Boolean read FAutoDropDownWidth write FAutoDropDownWidth default False; + property AutoItemHeight: Boolean read FAutoItemHeight write FAutoItemHeight default True; + property HotTrack: Boolean read FHotTrack write FHotTrack default True; + property SkinType: TSpTBXSkinType read FSkinType write SetSkinType default sknSkin; + property OnDrawBackground: TSpTBXDrawEvent read FOnDrawBackground write FOnDrawBackground; + property OnDrawItem: TSpTBXDrawListItemEvent read FOnDrawItem write FOnDrawItem; // Hides the inherited OnDrawItem + property OnDrawItemBackground: TSpTBXDrawListItemEvent read FOnDrawItemBackground write FOnDrawItemBackground; + property OnMouseMove; + end; + + { TSpTBXListBox } + + TSpTBXListBox = class(TTntListBox) + private + FHotTracking: Boolean; + FHotTrack: Boolean; + FSkinType: TSpTBXSkinType; + FChildFocused: Boolean; + FOnDrawItem: TSpTBXDrawListItemEvent; + FOnDrawItemBackground: TSpTBXDrawListItemEvent; + procedure SetHotTrack(const Value: Boolean); + procedure SetSkinType(const Value: TSpTBXSkinType); + procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; + procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; + procedure CMFocusChanged(var Message: TCMFocusChanged); message CM_FOCUSCHANGED; + procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM; + procedure WMNCPaint(var Message: TWMNCPaint); message WM_NCPAINT; + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + protected + procedure CreateParams(var Params: TCreateParams); override; + procedure DoDrawItem(ACanvas: TCanvas; var ARect: TRect; Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure DoDrawItemBackground(ACanvas: TCanvas; var ARect: TRect; Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); override; + procedure DrawItemBackground(Index: Integer; Rect: TRect; State: TOwnerDrawState); virtual; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure InvalidateBorders; + property HotTracking: Boolean read FHotTracking; + published + property Style default lbOwnerDrawFixed; + property HotTrack: Boolean read FHotTrack write SetHotTrack default True; + property SkinType: TSpTBXSkinType read FSkinType write SetSkinType default sknSkin; + property OnDrawItem: TSpTBXDrawListItemEvent read FOnDrawItem write FOnDrawItem; // Hides the inherited OnDrawItem + property OnDrawItemBackground: TSpTBXDrawListItemEvent read FOnDrawItemBackground write FOnDrawItemBackground; + end; + + { TSpTBXCheckListBox } + + TSpTBXCheckListBox = class(TTntCheckListBox) + private + FHotTracking: Boolean; + FHotTrack: Boolean; + FSkinType: TSpTBXSkinType; + FChildFocused: Boolean; + FOnDrawItem: TSpTBXDrawListItemEvent; + FOnDrawItemBackground: TSpTBXDrawListItemEvent; + procedure SetHotTrack(const Value: Boolean); + procedure SetSkinType(const Value: TSpTBXSkinType); + procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; + procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; + procedure CMFocusChanged(var Message: TCMFocusChanged); message CM_FOCUSCHANGED; + procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM; + procedure WMNCPaint(var Message: TWMNCPaint); message WM_NCPAINT; + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + protected + procedure DoDrawItem(ACanvas: TCanvas; var ARect: TRect; Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure DoDrawItemBackground(ACanvas: TCanvas; var ARect: TRect; Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); override; + procedure DrawItemBackground(Index: Integer; Rect: TRect; State: TOwnerDrawState); virtual; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure InvalidateBorders; + property HotTracking: Boolean read FHotTracking; + published + property Style default lbOwnerDrawFixed; + property HotTrack: Boolean read FHotTrack write SetHotTrack default True; + property SkinType: TSpTBXSkinType read FSkinType write SetSkinType default sknSkin; + property OnDrawItem: TSpTBXDrawListItemEvent read FOnDrawItem write FOnDrawItem; + property OnDrawItemBackground: TSpTBXDrawListItemEvent read FOnDrawItemBackground write FOnDrawItemBackground; + end; + + { TSpTBXEditItem } + + TSpTBXEditItem = class(TSpTBXCustomItem) + private + FEditCaption: WideString; + FEditImageIndex: TImageIndex; + FText: WideString; + FAllowVerticalEditor: Boolean; + FCharCase: TEditCharCase; + FEditorFontSettings: TSpTBXFontSettings; + FExtendedAccept: Boolean; + FFontSettings: TSpTBXFontSettings; + FMaxLength: Integer; + FPasswordChar: WideChar; + FReadOnly: Boolean; + FShowImage: Boolean; + FOnAcceptText: TSpTBXEditAcceptTextEvent; + FOnBeginEdit: TSpTBXBeginEditEvent; + FOnChange: TSpTBXEditChangeEvent; + FOnEditMessage: TSpTBXEditMessageEvent; + procedure FontSettingsChanged(Sender: TObject); + procedure SetAllowVerticalEditor(const Value: Boolean); + procedure SetCharCase(Value: TEditCharCase); + procedure SetEditCaption(const Value: WideString); + procedure SetEditorFontSettings(const Value: TSpTBXFontSettings); + procedure SetMaxLength(Value: Integer); + procedure SetPasswordChar(Value: WideChar); + procedure SetShowImage(const Value: Boolean); + procedure SetText(Value: WideString); + protected + function DoAcceptText(var NewText: WideString): Boolean; virtual; + function DoAutoComplete(var AText: WideString): Boolean; virtual; + procedure DoBeginEdit(Viewer: TSpTBXEditItemViewer); virtual; + procedure DoChange(const AText: WideString); virtual; + procedure DoTextChanging(const OldText: WideString; var NewText: WideString; Reason: Integer); virtual; + function GetItemViewerClass(AView: TTBView): TTBItemViewerClass; override; + function NeedToRecreateViewer(AViewer: TTBItemViewer): Boolean; override; + procedure SetTextEx(Value: WideString; Reason: Integer); virtual; + public + function StartEditing(AView: TTBView): Boolean; + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + // TSpTBXCustomItem properties + property Action; + property Alignment default taLeftJustify; + property Caption; + property CustomWidth default 64; + property CustomHeight; + property DisplayMode; + property Enabled; + property FontSettings; + property GroupIndex; + property HelpContext; + property Hint; + property ImageIndex; + property Images; + property ShortCut; + property Visible; + property OnClick; + property OnDrawCaption; + property OnDrawHint; + property OnDrawImage; + property OnDrawItem; + property OnSelect; + + // Don't let the streaming system store the WideStrings, use DefineProperties instead + property EditCaption: WideString read FEditCaption write SetEditCaption; // Hides the inherited EditCaption + property EditImageIndex: TImageIndex read FEditImageIndex write FEditImageIndex default -1; + property Text: WideString read FText write SetText; // Hides the inherited Text + property AllowVerticalEditor: Boolean read FAllowVerticalEditor write SetAllowVerticalEditor default False; + property CharCase: TEditCharCase read FCharCase write SetCharCase default ecNormal; + property EditorFontSettings: TSpTBXFontSettings read FEditorFontSettings write SetEditorFontSettings; + property ExtendedAccept: Boolean read FExtendedAccept write FExtendedAccept default False; + property MaxLength: Integer read FMaxLength write SetMaxLength default 0; + property PasswordChar: WideChar read FPasswordChar write SetPasswordChar default #0; + property ReadOnly: Boolean read FReadOnly write FReadOnly default False; + property ShowImage: Boolean read FShowImage write SetShowImage default False; + property OnAcceptText: TSpTBXEditAcceptTextEvent read FOnAcceptText write FOnAcceptText; // Hides the inherited OnAcceptText + property OnBeginEdit: TSpTBXBeginEditEvent read FOnBeginEdit write FOnBeginEdit; + property OnChange: TSpTBXEditChangeEvent read FOnChange write FOnChange; + property OnEditMessage: TSpTBXEditMessageEvent read FOnEditMessage write FOnEditMessage; + end; + + TEditClass = class of TCustomEdit; + + TSpTBXEditItemViewer = class(TSpTBXItemViewer) + private + function EditLoop(const CapHandle: HWND): Boolean; + procedure EditWndProc(var Message: TMessage); + function GetEditControlText: WideString; + procedure GetEditHeight(const DC: HDC; out EditHeight, ExternalLeading: Integer); + function GetItem: TSpTBXEditItem; + procedure MouseBeginEdit; + function MeasureEditCaption: TSize; + function MeasureTextHeight: Integer; + protected + FEditControl: TCustomEdit; + FEditControlStatus: set of (ecsContinueLoop, ecsAccept, ecsClose); + procedure CalcSize(const Canvas: TCanvas; var AWidth, AHeight: Integer); override; + function CaptionShown: Boolean; override; + procedure DoBeginEdit; virtual; + function DoExecute: Boolean; override; + function HandleEditMessage(var Message: TMessage): Boolean; virtual; + function GetAccRole: Integer; override; + function GetAccValue(var Value: WideString): Boolean; override; + procedure GetCursor(const Pt: TPoint; var ACursor: HCURSOR); override; + function GetEditControlClass: TEditClass; virtual; + procedure GetEditRect(var R: TRect); virtual; + function GetImageShown: Boolean; override; + function GetIndentBefore: Integer; virtual; + function GetIndentAfter: Integer; virtual; + procedure InternalDrawFrame(ACanvas: TCanvas; ARect: TRect; ItemInfo: TSpTBXMenuItemInfo); virtual; + procedure InternalEditControlChange(Sender: TObject); virtual; + procedure InternalEditControlExit; virtual; + procedure MouseDown(Shift: TShiftState; X, Y: Integer; var MouseDownOnMenu: Boolean); override; + procedure MouseUp(X, Y: Integer; MouseWasDownOnMenu: Boolean); override; + procedure Paint(const Canvas: TCanvas; const ClientAreaRect: TRect; IsSelected, IsPushed, UseDisabledShadow: Boolean); override; + + function ShowImage: Boolean; virtual; + function UsesSameWidth: Boolean; override; + public + function GetCaptionText: WideString; override; + property EditControl: TCustomEdit read FEditControl; + property Item: TSpTBXEditItem read GetItem; // Hides the inherited TB2K Item property + end; + + { TSpTBXSpinEditItem } + + TSpTBXSpinEditItem = class(TSpTBXEditItem) + private + FSpinOptions: TSpTBXSpinEditOptions; + procedure SpinOptionsGetText(Sender: TObject; var NewText: WideString; var Accept: Boolean); + procedure SpinOptionsSetText(Sender: TObject; const AText: WideString); + function GetValue: Extended; + function GetValueChanged: TNotifyEvent; + procedure SetValue(const Value: Extended); + procedure SetValueChanged(const ValueChangedEvent: TNotifyEvent); + protected + function GetItemViewerClass(AView: TTBView): TTBItemViewerClass; override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + property Alignment default taRightJustify; + property Text stored False; + property SpinOptions: TSpTBXSpinEditOptions read FSpinOptions write FSpinOptions; + property Value: Extended read GetValue write SetValue stored False; + property OnValueChanged: TNotifyEvent read GetValueChanged write SetValueChanged; + end; + + TSpTBXSpinEditViewer = class(TSpTBXEditItemViewer) + private + FUpPushed: Boolean; + FDownPushed: Boolean; + FTimer: TTimer; + procedure TimerHandler(Sender: TObject); + function GetItem: TSpTBXSpinEditItem; + protected + function GetAccRole: Integer; override; + function GetIndentAfter: Integer; override; + function HandleEditMessage(var Message: TMessage): Boolean; override; + procedure InvalidateButtons; + function IsPtInButtonPart(X, Y: Integer): Boolean; override; + procedure LosingCapture; override; + procedure MouseDown(Shift: TShiftState; X, Y: Integer; var MouseDownOnMenu: Boolean); override; + procedure MouseUp(X, Y: Integer; MouseWasDownOnMenu: Boolean); override; + procedure InternalDrawFrame(ACanvas: TCanvas; ARect: TRect; ItemInfo: TSpTBXMenuItemInfo); override; + procedure InternalEditControlChange(Sender: TObject); override; + procedure InternalEditControlExit; override; + public + destructor Destroy; override; + property Item: TSpTBXSpinEditItem read GetItem; // Hides the inherited TB2K Item property + end; + +{ Helpers } +procedure SpCalcMaxDropDownWidth(Combo: TSpTBXComboBox; RightMargin: Integer = 8); +function SpFocusEditItem(Item: TTBCustomItem; View: TTBView): Boolean; +function SpStartsTextW(const ASubText, AText: WideString): Boolean; + +{ Painting helpers } +function SpCanEditFrameBeHotTracked(BorderStyle: TBorderStyle; SkinType: TSpTBXSkinType): Boolean; +procedure SpDrawXPEditButton(ACanvas: TCanvas; ARect: TRect; Enabled, FrameHotTrack, HotTrack, Pushed, RightAligned: Boolean); +procedure SpDrawXPComboButton(ACanvas: TCanvas; ARect: TRect; Enabled, FrameHotTrack, HotTrack, DroppedDown, RightAligned: Boolean; SkinType: TSpTBXSkinType); +procedure SpDrawXPSpinButton(ACanvas: TCanvas; ARect: TRect; Enabled, FrameHotTrack, UpHotTrack, DownHotTrack, UpPushed, DownPushed, RightAligned: Boolean; SkinType: TSpTBXSkinType); + +implementation + +uses + Themes, UxTheme, + {$IFNDEF UNICODE} TntActnList, TntWindows, {$ENDIF} + Math, TB2Common; + +const + DefaultSpinButtonSize = 14; + +type + TTBViewAccess = class(TTBView); + TSpTBXFontSettingsAccess = class(TSpTBXFontSettings); + TCustomEditAccess = class(TCustomEdit); + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Helpers } + +procedure SpCalcMaxDropDownWidth(Combo: TSpTBXComboBox; RightMargin: Integer = 8); +var + I, MaxWidth: Integer; + Sz: TSize; + C: TControlCanvas; +begin + MaxWidth := 0; + + C := TControlCanvas.Create; + try + C.Control := Combo; + C.Font.Assign(Combo.Font); + for I := 0 to Combo.Items.Count - 1 do begin + Sz := SpGetTextSize(C.Handle, Combo.Items[I], False); + if Sz.cx > MaxWidth then MaxWidth := Sz.cx; + end; + + MaxWidth := MaxWidth + GetSystemMetrics(SM_CXVSCROLL) + RightMargin; + if Combo.Width < MaxWidth then + SendMessage(Combo.Handle, CB_SETDROPPEDWIDTH, MaxWidth, 0); + finally + C.Free; + end; +end; + +function SpFocusEditItem(Item: TTBCustomItem; View: TTBView): Boolean; +var + IV: TTBItemViewer; +begin + Result := False; + IV := View.Find(Item); + if Assigned(IV) then begin + View.Select(IV, False); + View.ExecuteSelected(False); + Result := True; + end; +end; + +function SpStartsTextW(const ASubText, AText: WideString): Boolean; +var + L, L2: Integer; +begin + L := Length(ASubText); + L2 := Length(AText); + if L > L2 then Result := False + else Result := CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE, + PWideChar(AText), L, PWideChar(ASubText), L) = 2; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Painting helpers } + +function SpCanEditFrameBeHotTracked(BorderStyle: TBorderStyle; SkinType: TSpTBXSkinType): Boolean; +var + NormalB, HotTrackB: TSpTBXSkinOptionEntry; +begin + Result := False; + if (BorderStyle <> bsNone) and (SpTBXSkinType(SkinType) <> sknNone) then begin + // If the HotTrack borders are different than the Normal borders then + // return true. + NormalB := CurrentSkin.Options(skncEditFrame, sknsNormal).Borders; + HotTrackB := CurrentSkin.Options(skncEditFrame, sknsHotTrack).Borders; + if not NormalB.IsEqual(HotTrackB) then + Result := True; + end; +end; + +procedure SpDrawXPEditButton(ACanvas: TCanvas; ARect: TRect; Enabled, FrameHotTrack, + HotTrack, Pushed, RightAligned: Boolean); +var + State: TSpTBXSkinStatesType; +begin + State := CurrentSkin.GetState(Enabled, Pushed, HotTrack or FrameHotTrack, False); + if FrameHotTrack then begin + InflateRect(ARect, 1, 1); + if RightAligned then + ARect.Left := ARect.Left + 1 + else + ARect.Right := ARect.Right - 1; + end; + CurrentSkin.PaintBackground(ACanvas, ARect, skncEditButton, State, True, True); +end; + +procedure SpDrawXPComboButton(ACanvas: TCanvas; ARect: TRect; Enabled, FrameHotTrack, + HotTrack, DroppedDown, RightAligned: Boolean; SkinType: TSpTBXSkinType); +var + Flags: Integer; + State: TSpTBXSkinStatesType; + C: TColor; + X, Y, Part: Integer; +begin + case SpTBXSkinType(SkinType) of + sknNone: + begin + Inc(ARect.Left, 4); + SpFillRect(ACanvas, ARect, clBtnFace, clWindow); + if DroppedDown then + Windows.DrawEdge(ACanvas.Handle, ARect, BDR_SUNKENOUTER, BF_RECT) + else if FrameHotTrack or HotTrack then + Windows.DrawEdge(ACanvas.Handle, ARect, BDR_RAISEDINNER, BF_RECT); + State := CurrentSkin.GetState(Enabled, DroppedDown, HotTrack, False); + C := CurrentSkin.GetTextColor(skncEditButton, State); + X := (ARect.Left + ARect.Right) div 2; + Y := (ARect.Top + ARect.Bottom) div 2 - 1; + SpDrawArrow(ACanvas, X, Y, C, True, False, 2); + end; + sknWindows: + begin + if SpIsWinVistaOrUp then + Part := 6 // (CP_DROPDOWNBUTTONRIGHT) Use the new API on Windows Vista + else + Part := CP_DROPDOWNBUTTON; + if not Enabled then Flags := CBXS_DISABLED + else if DroppedDown then Flags := CBXS_PRESSED + else if HotTrack then Flags := CBXS_HOT + else Flags := CBXS_NORMAL; + DrawThemeBackground(ThemeServices.Theme[teComboBox], ACanvas.Handle, Part, Flags, ARect, nil); + end; + sknSkin: + begin + State := CurrentSkin.GetState(Enabled, DroppedDown, FrameHotTrack, False); + ACanvas.FillRect(ARect); + SpDrawXPEditButton(ACanvas, ARect, Enabled, FrameHotTrack, HotTrack, DroppedDown, RightAligned); + C := CurrentSkin.GetTextColor(skncEditButton, State); + X := (ARect.Left + ARect.Right) div 2; + Y := (ARect.Top + ARect.Bottom) div 2 - 1; + SpDrawArrow(ACanvas, X, Y, C, True, False, 2); + end; + end; +end; + +procedure SpDrawXPSpinButton(ACanvas: TCanvas; ARect: TRect; Enabled, FrameHotTrack, + UpHotTrack, DownHotTrack, UpPushed, DownPushed, RightAligned: Boolean; SkinType: TSpTBXSkinType); +var + ButtonR, BR: TRect; + StateFlags: Integer; + Flags: Cardinal; + X, Y: Integer; + State: TSpTBXSkinStatesType; + C: TColor; +begin + ButtonR := ARect; + + case SpTBXSkinType(SkinType) of + sknNone: + begin + // Up button + Flags := DFCS_SCROLLUP; + if UpPushed then + Flags := Flags or DFCS_PUSHED; + BR := Rect(ButtonR.Left, ButtonR.Top, ButtonR.Right, (ButtonR.Bottom + ButtonR.Top) div 2); + DrawFrameControl(ACanvas.Handle, BR, DFC_SCROLL, Flags); + // Down button + Flags := DFCS_SCROLLDOWN; + if DownPushed then + Flags := Flags or DFCS_PUSHED; + BR := Rect(ButtonR.Left, BR.Bottom - 1, ButtonR.Right, ButtonR.Bottom); + DrawFrameControl(ACanvas.Handle, BR, DFC_SCROLL, Flags); + end; + sknWindows: + begin + InflateRect(ButtonR, 1, 1); + // Up button + BR := ButtonR; + BR.Bottom := (ButtonR.Top + ButtonR.Bottom) div 2; + if not Enabled then StateFlags := UPS_DISABLED + else if UpPushed then StateFlags := UPS_PRESSED + else if UpHotTrack then StateFlags := UPS_HOT + else StateFlags := UPS_NORMAL; + DrawThemeBackground(ThemeServices.Theme[teSpin], ACanvas.Handle, SPNP_UP, StateFlags, BR, nil); + // Down button + BR := ButtonR; + BR.Top := (ButtonR.Top + ButtonR.Bottom) div 2; + if not Enabled then StateFlags := DNS_DISABLED + else if DownPushed then StateFlags := DNS_PRESSED + else if DownHotTrack then StateFlags := DNS_HOT + else StateFlags := DNS_NORMAL; + DrawThemeBackground(ThemeServices.Theme[teSpin], ACanvas.Handle, SPNP_DOWN, StateFlags, BR, nil); + end; + sknSkin: + begin + // Up button + BR := Rect(ButtonR.Left, ButtonR.Top, ButtonR.Right, (ButtonR.Top + ButtonR.Bottom) div 2 + 1); + X := (BR.Left + BR.Right) div 2; + Y := (BR.Top + BR.Bottom) div 2 - 1; + State := CurrentSkin.GetState(Enabled, UpPushed, UpHotTrack or FrameHotTrack, False); + if FrameHotTrack then + BR.Bottom := BR.Bottom - 1; + SpDrawXPEditButton(ACanvas, BR, Enabled, FrameHotTrack, UpHotTrack, UpPushed, RightAligned); + C := CurrentSkin.GetTextColor(skncEditButton, State); + SpDrawArrow(ACanvas, X, Y, C, True, True, 2); + if FrameHotTrack then + BR.Bottom := BR.Bottom + 1; + // Down button + BR := Rect(ButtonR.Left, BR.Bottom - 1, ButtonR.Right, ButtonR.Bottom); + X := (BR.Left + BR.Right) div 2; + Y := (BR.Top + BR.Bottom) div 2 - 1; + State := CurrentSkin.GetState(Enabled, DownPushed, DownHotTrack or FrameHotTrack, False); + if FrameHotTrack then + BR.Top := BR.Top + 1; + SpDrawXPEditButton(ACanvas, BR, Enabled, FrameHotTrack, DownHotTrack, DownPushed, RightAligned); + C := CurrentSkin.GetTextColor(skncEditButton, State); + SpDrawArrow(ACanvas, X, Y, C, True, False, 2); + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXEditButton } + +constructor TSpTBXEditButton.Create(AOwner: TComponent); +var + Index: Integer; +const + DefaultName = 'SubEditButton'; +begin + inherited; + + // Find unique name + if Assigned(AOwner) then begin + Index := 0; + while AOwner.FindComponent(DefaultName + IntToStr(Index)) <> nil do + Inc(Index); + Name := DefaultName + IntToStr(Index); + end; + + // Change the FPopupControl, we need to align + // the DropdownMenu to the Edit control not the button. + // FPopupControl is used in TSpTBXCustomButton.Click + if Assigned(AOwner) and (AOwner is TControl) then + FPopupControl := AOwner as TControl; + + SetSubComponent(True); + SkinType := sknSkin; +end; + +procedure TSpTBXEditButton.AdjustFont(AFont: TFont); +var + State: TSpTBXSkinStatesType; +begin + if (LinkText <> '') and MouseInControl then + inherited + else begin + State := CurrentSkin.GetState(Enabled, Pushed, MouseInControl or GetFrameHotTrack, Checked); + AFont.Color := CurrentSkin.GetTextColor(skncEditButton, State); + end; +end; + +procedure TSpTBXEditButton.Click; +begin + if Assigned(Parent) and SpCanFocus(Parent) then + Parent.SetFocus; + inherited; +end; + +function TSpTBXEditButton.DoDrawDropDownArrow(ACanvas: TCanvas; + ARect: TRect): Boolean; +begin + if (Caption = '') and not IsImageIndexValid then + Result := False // Paint the default Windows combo button + else + Result := inherited DoDrawDropDownArrow(ACanvas, ARect); +end; + +function TSpTBXEditButton.DoDrawItem(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage): Boolean; +var + T: TSpTBXSkinType; + FrameHotTrack, RightAligned: Boolean; +begin + if (PaintStage = pstPrePaint) and not BitmapValid then begin + Result := True; + if Assigned(OnDraw) then OnDraw(Self, ACanvas, ARect, PaintStage, Result); + if Result then begin + FrameHotTrack := GetFrameHotTrack; + RightAligned := Align <> alLeft; + + // Draw the ComboButton if the caption is not set + T := SpTBXSkinType(SkinType); + if (Length(Caption) = 0) and not IsImageIndexValid then + SpDrawXPComboButton(ACanvas, ARect, Enabled, FrameHotTrack, MouseInControl, Pushed, RightAligned, T) + else begin + case T of + sknNone: + SpDrawXPButton(ACanvas, ARect, Enabled, Pushed, MouseInControl, Checked, Focused, Default, T); + sknWindows: + begin + InflateRect(ARect, 1, 1); + SpDrawXPButton(ACanvas, ARect, Enabled, Pushed, MouseInControl, Checked, Focused, Default, T); + end; + sknSkin: + SpDrawXPEditButton(ACanvas, ARect, Enabled, FrameHotTrack, FrameHotTrack or MouseInControl, Pushed, RightAligned); + end; + end; + end; + end + else + Result := inherited DoDrawItem(ACanvas, ARect, PaintStage); +end; + +function TSpTBXEditButton.GetFrameHotTrack: Boolean; +begin + if Parent is TSpTBXEdit then + Result := TSpTBXEdit(Parent).MouseInControl or Parent.Focused + else + Result := False; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSpinButton } + +constructor TSpTBXSpinButton.Create(AOwner: TComponent); +begin + inherited; + Repeating := True; +end; + +procedure TSpTBXSpinButton.Click; +var + P: TPoint; +begin + FUpPushed := False; + FDownPushed := False; + if Enabled then begin + GetCursorPos(P); + P := ScreenToClient(P); + if P.Y < Height div 2 then begin + FUpPushed := True; + if Assigned(FOnUpClick) then FOnUpClick(Self); + end + else begin + FDownPushed := True; + if Assigned(FOnDownClick) then FOnDownClick(Self); + end; + end; + + inherited; +end; + +function TSpTBXSpinButton.DoDrawItem(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage): Boolean; +var + UpHotTrack, DownHotTrack, EditFrameHotTrack, RightAligned: Boolean; +begin + // Draw rectangle buttons + if (PaintStage = pstPrePaint) and not BitmapValid then begin + Result := True; + if Assigned(OnDraw) then OnDraw(Self, ACanvas, ARect, PaintStage, Result); + if Result then begin + IsHotTracking(UpHotTrack, DownHotTrack, EditFrameHotTrack); + RightAligned := Align <> alLeft; + SpDrawXPSpinButton(ACanvas, ARect, Enabled, EditFrameHotTrack, UpHotTrack, DownHotTrack, FUpPushed, FDownPushed, RightAligned, SkinType); + end; + end + else + Result := inherited DoDrawItem(ACanvas, ARect, PaintStage); +end; + +procedure TSpTBXSpinButton.IsHotTracking(out UpButton, DownButton, EditFrame: Boolean); +var + Edit: TSpTBXEdit; + P: TPoint; + R: TRect; +begin + UpButton := False; + DownButton := False; + EditFrame := False; + + if GetCursorPos(P) then begin + P := ScreenToClient(P); + R := Rect(0, 0, Width, Height div 2); + UpButton := PtInRect(R, P); + if not UpButton then begin + R := Rect(0, Height div 2, Width, Height); + DownButton := PtInRect(R, P); + end; + end; + + if Assigned(Owner) and (Owner is TSpTBXEdit) then begin + Edit := Owner as TSpTBXEdit; + if Edit.HotTrack then + EditFrame := Edit.MouseInControl or Edit.Focused; + end; +end; + +procedure TSpTBXSpinButton.DoMouseLeave; +begin + FUpPushed := False; + FDownPushed := False; + inherited; +end; + +procedure TSpTBXSpinButton.MouseUp(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + FUpPushed := False; + FDownPushed := False; + inherited; +end; + +procedure TSpTBXSpinButton.MouseMove(Shift: TShiftState; X, Y: Integer); +begin + inherited; + if Enabled then + Repaint; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXUnicodeAdaptEdit } + +{$IFNDEF UNICODE} +procedure TSpTBXUnicodeAdaptEdit.CreateWindowHandle(const Params: TCreateParams); +begin + TntCustomEdit_CreateWindowHandle(Self, Params); +end; + +procedure TSpTBXUnicodeAdaptEdit.CreateWnd; +begin + inherited; + TntCustomEdit_AfterInherited_CreateWnd(Self, FPasswordChar); +end; + +procedure TSpTBXUnicodeAdaptEdit.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TSpTBXUnicodeAdaptEdit.GetSelStart: Integer; +begin + Result := TntCustomEdit_GetSelStart(Self); +end; + +procedure TSpTBXUnicodeAdaptEdit.SetSelStart(const Value: Integer); +begin + TntCustomEdit_SetSelStart(Self, Value); +end; + +function TSpTBXUnicodeAdaptEdit.GetSelLength: Integer; +begin + Result := TntCustomEdit_GetSelLength(Self); +end; + +procedure TSpTBXUnicodeAdaptEdit.SetSelLength(const Value: Integer); +begin + TntCustomEdit_SetSelLength(Self, Value); +end; + +function TSpTBXUnicodeAdaptEdit.GetSelText: WideString; +begin + Result := TntCustomEdit_GetSelText(Self); +end; + +procedure TSpTBXUnicodeAdaptEdit.SetSelText(const Value: WideString); +begin + TntCustomEdit_SetSelText(Self, Value); +end; + +function TSpTBXUnicodeAdaptEdit.GetPasswordChar: WideChar; +begin + Result := TntCustomEdit_GetPasswordChar(Self, FPasswordChar); +end; + +procedure TSpTBXUnicodeAdaptEdit.SetPasswordChar(const Value: WideChar); +begin + TntCustomEdit_SetPasswordChar(Self, FPasswordChar, Value); +end; + +function TSpTBXUnicodeAdaptEdit.GetText: WideString; +begin + Result := TntControl_GetText(Self); +end; + +procedure TSpTBXUnicodeAdaptEdit.SetText(const Value: WideString); +begin + TntControl_SetText(Self, Value); +end; + +function TSpTBXUnicodeAdaptEdit.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TSpTBXUnicodeAdaptEdit.GetHint: WideString; +begin + Result := TntControl_GetHint(Self); +end; + +procedure TSpTBXUnicodeAdaptEdit.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TSpTBXUnicodeAdaptEdit.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TSpTBXUnicodeAdaptEdit.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; +{$ENDIF} + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXUnicodeEdit } + +procedure TSpTBXUnicodeEdit.CreateWnd; +begin + inherited; + if HandleAllocated then UpdateEditRect; +end; + +procedure TSpTBXUnicodeEdit.CreateParams(var Params: TCreateParams); +const + Alignments: array[TAlignment] of Cardinal = (ES_LEFT, ES_RIGHT, ES_CENTER); +begin + inherited CreateParams(Params); + // WS_CLIPCHILDREN needed for edit buttons + Params.Style := Params.Style or Alignments[FAlignment] or WS_CLIPCHILDREN; +end; + +procedure TSpTBXUnicodeEdit.SetAlignment(Value: TAlignment); +begin + if Value <> FAlignment then begin + FAlignment := Value; + RecreateWnd; + end; +end; + +function TSpTBXUnicodeEdit.AddEditButton(RightAligned: Boolean; + AWidth: Integer): TSpTBXEditButton; +begin + Result := TSpTBXEditButton.Create(Self); + Result.Parent := Self; + Result.FreeNotification(Self); + if RightAligned then + Result.Align := alRight + else + Result.Align := alLeft; + if AWidth = -1 then + Result.Width := GetSystemMetrics(SM_CXVSCROLL) + else + Result.Width := AWidth; + UpdateEditRect; +end; + +function TSpTBXUnicodeEdit.HasEditButton: Boolean; +var + I: Integer; +begin + Result := False; + if not HandleAllocated then Exit; + for I := 0 to ControlCount - 1 do begin + if Controls[I] is TSpTBXEditButton then begin + Result := True; + Break; + end; + end; +end; + +procedure TSpTBXUnicodeEdit.UpdateEditRect; +var + I, X1, X2: Integer; + B: TSpTBXEditButton; +begin + if not HandleAllocated then Exit; + + X1 := 0; + X2 := 0; + + for I := 0 to ControlCount - 1 do begin + if Controls[I] is TSpTBXEditButton then begin + B := Controls[I] as TSpTBXEditButton; + if B.Visible then + case B.Align of + alLeft: X1 := X1 + B.Width; + alRight: X2 := X2 + B.Width; + end; + end; + end; + + if X1 > 0 then Inc(X1, 2); + if X2 > 0 then Inc(X2, 2); + + SendMessage(Handle, EM_SETMARGINS, EC_LEFTMARGIN or EC_RIGHTMARGIN, MakeLong(X1, X2)); +end; + +procedure TSpTBXUnicodeEdit.CMEnabledChanged(var Message: TMessage); +var + I: Integer; +begin + inherited; + for I := 0 to ControlCount - 1 do + if Controls[I] is TSpTBXEditButton then + TSpTBXEditButton(Controls[I]).Enabled := Enabled; +end; + +procedure TSpTBXUnicodeEdit.CMFontChanged(var Message: TMessage); +begin + inherited; + UpdateEditRect; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXEdit } + +constructor TSpTBXEdit.Create(AOwner: TComponent); +begin + inherited; + FSkinType := sknSkin; + FHotTrack := True; + FBorderStyle := bsSingle; + SkinManager.AddSkinNotification(Self); + + if not (csDesigning in ComponentState) then + DoubleBuffered := True; +end; + +destructor TSpTBXEdit.Destroy; +begin + SkinManager.RemoveSkinNotification(Self); + inherited; +end; + +procedure TSpTBXEdit.CMEnabledChanged(var Message: TMessage); +begin + inherited; + FMouseInControl := False; + if FHotTrack then InvalidateFrame; +end; + +procedure TSpTBXEdit.CMEnter(var Message: TCMEnter); +begin + inherited; + FMouseInControl := True; + if FHotTrack then InvalidateFrame; +end; + +procedure TSpTBXEdit.CMExit(var Message: TCMExit); +begin + inherited; + FMouseInControl := False; + if FHotTrack then InvalidateFrame; +end; + +procedure TSpTBXEdit.CMMouseEnter(var Message: TMessage); +begin + inherited; + if not FMouseInControl then begin + FMouseInControl := True; + if FHotTrack and not Focused and (HasEditButton or SpCanEditFrameBeHotTracked(BorderStyle, SkinType)) then + InvalidateFrame; + end; +end; + +procedure TSpTBXEdit.CMMouseLeave(var Message: TMessage); +begin + inherited; + if FMouseInControl then begin + FMouseInControl := False; + if FHotTrack and not Focused and (HasEditButton or SpCanEditFrameBeHotTracked(BorderStyle, SkinType)) then + InvalidateFrame; + end; +end; + +procedure TSpTBXEdit.InvalidateFrame; +begin + if HandleAllocated then + RedrawWindow(Handle, nil, 0, RDW_FRAME or RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN); +end; + +procedure TSpTBXEdit.SetBorderStyle(const Value: TBorderStyle); +begin + if FBorderStyle <> Value then begin + FBorderStyle := Value; + InvalidateFrame; + end; +end; + +procedure TSpTBXEdit.SetSkinType(const Value: TSpTBXSkinType); +var + I: Integer; +begin + if Value <> FSkinType then begin + FSkinType := Value; + for I := 0 to ControlCount - 1 do + if Controls[I] is TSpTBXEditButton then + TSpTBXEditButton(Controls[I]).SkinType := Value; + InvalidateFrame; + end; +end; + +procedure TSpTBXEdit.WMNCPaint(var Message: TWMNCPaint); +var + HotTrackFrame: Boolean; +begin + if FHotTrack then + HotTrackFrame := FMouseInControl or Focused + else + HotTrackFrame := False; + + if (SpTBXSkinType(FSkinType) = sknNone) and (FBorderStyle <> bsNone) then + inherited + else + SpDrawXPEditFrame(Self, HotTrackFrame, FSkinType, False, FBorderStyle = bsNone); +end; + +procedure TSpTBXEdit.WMSpSkinChange(var Message: TMessage); +begin + inherited; + InvalidateFrame; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomButtonEdit } + +constructor TSpTBXCustomButtonEdit.Create(AOwner: TComponent); +begin + inherited; + ControlStyle := ControlStyle - [csSetCaption]; + FEditButton := AddEditButton(True, 19); +end; + +destructor TSpTBXCustomButtonEdit.Destroy; +begin + FreeAndNil(FEditButton); + inherited; +end; + +procedure TSpTBXCustomButtonEdit.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if (AComponent = FEditButton) and (Operation = opRemove) then + FEditButton := nil; +end; + +procedure TSpTBXCustomButtonEdit.SetName(const Value: TComponentName); +begin + inherited SetName(Value); + if not (csLoading in ComponentState) then begin + FEditButton.Caption := '...'; + Text := ''; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSpinEditOptions } + +constructor TSpTBXSpinEditOptions.Create; +begin + inherited Create; + FDecimal := 2; + FIncrement := 1; + FValueSnap := True; + FValueType := spnInteger; +end; + +procedure TSpTBXSpinEditOptions.DoValueChanged; +begin + if Assigned(FOnValueChanged) then FOnValueChanged(Self); +end; + +function TSpTBXSpinEditOptions.GetValueAsInteger: Int64; +begin + Result := Round(Value); +end; + +function TSpTBXSpinEditOptions.IsIncrementStored: Boolean; +begin + Result := FIncrement <> 1; +end; + +function TSpTBXSpinEditOptions.IsMaxValueStored: Boolean; +begin + Result := FMaxValue <> 0; +end; + +function TSpTBXSpinEditOptions.IsMinValueStored: Boolean; +begin + Result := FMinValue <> 0; +end; + +function TSpTBXSpinEditOptions.IsValueStored: Boolean; +begin + Result := FValue <> 0; +end; + +procedure TSpTBXSpinEditOptions.SetDecimal(NewDecimal: Integer); +begin + if NewDecimal > 10 then NewDecimal := 10; + if NewDecimal < 0 then NewDecimal := 0; + if NewDecimal <> FDecimal then begin + FDecimal := NewDecimal; + UpdateTextFromValue; + end; +end; + +procedure TSpTBXSpinEditOptions.SetMaxValue(const NewValue: Extended); +begin + if NewValue <> FMaxValue then begin + FMaxValue := NewValue; + if FValue > NewValue then SetValue(NewValue); + end; +end; + +procedure TSpTBXSpinEditOptions.SetMinValue(const NewValue: Extended); +begin + if NewValue <> FMinValue then begin + FMinValue := NewValue; + if FValue < NewValue then SetValue(NewValue); + end; +end; + +procedure TSpTBXSpinEditOptions.SetPostfix(const ValueString: WideString); +begin + if FPostfix <> ValueString then begin + FPostfix := ValueString; + UpdateTextFromValue; + end; +end; + +procedure TSpTBXSpinEditOptions.SetPrefix(const ValueString: WideString); +begin + if FPrefix <> ValueString then begin + FPrefix := ValueString; + UpdateTextFromValue; + end; +end; + +procedure TSpTBXSpinEditOptions.SetValue(const NewValue: Extended); +begin + if NewValue <> FValue then + if (FMaxValue = FMinValue) or + (FMaxValue <> FMinValue) and (NewValue >= FMinValue) and (NewValue <= FMaxValue) then + begin + FValue := NewValue; + DoValueChanged; + UpdateTextFromValue; + end; +end; + +procedure TSpTBXSpinEditOptions.SetValueAsInteger(const NewValue: Int64); +begin + Value := NewValue; +end; + +procedure TSpTBXSpinEditOptions.SetValueType(NewType: TSpTBXSpinType); +begin + if NewType <> FValueType then begin + FValueType := NewType; + if NewType in [spnInteger, spnHex] then FIncrement := Max(Round(FIncrement), 1); + UpdateTextFromValue; + end; +end; + +procedure TSpTBXSpinEditOptions.UpdateTextFromValue; +var + WS: WideString; +begin + WS := ''; + case FValueType of + spnInteger: WS := IntToStr(Round(FValue)); + spnFloat: WS := FloatToStrF(FValue, ffFixed, 15, FDecimal); + spnHex: WS := IntToHex(Round(FValue), 1); + end; + if Assigned(FOnSetText) then FOnSetText(Self, FPrefix + WS + FPostfix); +end; + +procedure TSpTBXSpinEditOptions.UpdateValueFromText(RevertWhenInvalid: Boolean = True); +var + WS: WideString; + PrevValue, NewValue: Extended; + I: Integer; + Dummy: Boolean; +begin + PrevValue := FValue; + NewValue := FValue; + Dummy := True; + WS := ''; + if Assigned(FOnGetText) then FOnGetText(Self, WS, Dummy); + + // Remove the Prefix and Postfix from the text + I := Pos(Prefix, WS); + if I > 0 then + Delete(WS, I, Length(Prefix)); + I := Pos(Postfix, WS); + if I > 0 then + Delete(WS, I, Length(Postfix)); + + // Try to parse the text to get the value + WS := Trim(WS); + if Length(WS) > 0 then begin + case FValueType of + spnInteger: NewValue := StrToInt64Def(WS, Round(PrevValue)); + spnFloat: NewValue := StrToFloatDef(WS, PrevValue); + spnHex: NewValue := StrToInt64Def('$' + WS, Round(PrevValue)); + end; + end; + + if RevertWhenInvalid or (NewValue <> PrevValue) then begin + SetValue(NewValue); + UpdateTextFromValue; + end; +end; + +procedure TSpTBXSpinEditOptions.ValueInc; +var + NewValue: Extended; +begin + if FValueSnap then + NewValue := Math.Floor(FValue / FIncrement + 1 + FIncrement * 0.0000000001) * FIncrement + else + NewValue := FValue + FIncrement; + SetValue(NewValue); +end; + +procedure TSpTBXSpinEditOptions.ValueDec; +var + NewValue: Extended; +begin + if FValueSnap then + NewValue := Math.Ceil(FValue / FIncrement - 1 - FIncrement * 0.0000000001) * FIncrement + else + NewValue := FValue - FIncrement; + SetValue(NewValue); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSpinEdit } + +constructor TSpTBXSpinEdit.Create(AOwner: TComponent); +begin + inherited; + Alignment := taRightJustify; + + FSpinOptions := TSpTBXSpinEditOptions.Create; + FSpinOptions.OnGetText := SpinOptionsGetText; + FSpinOptions.OnSetText := SpinOptionsSetText; + + FSpinButton := TSpTBXSpinButton.Create(Self); + FSpinButton.Parent := Self; + FSpinButton.FreeNotification(Self); + FSpinButton.OnUpClick := UpClick; + FSpinButton.OnDownClick := DownClick; + FSpinButton.Align := alRight; + FSpinButton.Width := DefaultSpinButtonSize; + UpdateEditRect; + + Text := '0'; +end; + +destructor TSpTBXSpinEdit.Destroy; +begin + FreeAndNil(FSpinOptions); + FreeAndNil(FSpinButton); + inherited; +end; + +procedure TSpTBXSpinEdit.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if (AComponent = FSpinButton) and (Operation = opRemove) then + FSpinButton := nil; +end; + +procedure TSpTBXSpinEdit.KeyDown(var Key: Word; Shift: TShiftState); +begin + inherited; + case Key of + VK_UP: SpinOptions.ValueInc; + VK_DOWN: SpinOptions.ValueDec; + end; +end; + +procedure TSpTBXSpinEdit.KeyPress(var Key: Char); +begin + inherited; + if Key = #13 then begin + Key := #0; + SpinOptions.UpdateValueFromText; + end; +end; + +procedure TSpTBXSpinEdit.UpClick(Sender: TObject); +begin + SpinOptions.ValueInc; +end; + +procedure TSpTBXSpinEdit.DownClick(Sender: TObject); +begin + SpinOptions.ValueDec; +end; + +procedure TSpTBXSpinEdit.Change; +begin + if FExtendedAccept then + SpinOptions.UpdateValueFromText(False); // Don't revert when an invalid text is entered + inherited; +end; + +procedure TSpTBXSpinEdit.CMExit(var Message: TCMExit); +begin + SpinOptions.UpdateValueFromText; + inherited; +end; + +function TSpTBXSpinEdit.GetValue: Extended; +begin + Result := SpinOptions.Value; +end; + +procedure TSpTBXSpinEdit.SetValue(const Value: Extended); +begin + SpinOptions.Value := Value; +end; + +function TSpTBXSpinEdit.GetValueChanged: TNotifyEvent; +begin + Result := SpinOptions.OnValueChanged; +end; + +procedure TSpTBXSpinEdit.SetValueChanged(const ValueChangedEvent: TNotifyEvent); +begin + SpinOptions.OnValueChanged := ValueChangedEvent; +end; + +procedure TSpTBXSpinEdit.SpinOptionsGetText(Sender: TObject; + var NewText: WideString; var Accept: Boolean); +begin + // Event used by SpinOptions to get the text from the edit control + NewText := Text; +end; + +procedure TSpTBXSpinEdit.SpinOptionsSetText(Sender: TObject; + const AText: WideString); +begin + // Event used by SpinOptions to set the edit control text + Text := AText; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXComboBox } + +constructor TSpTBXComboBox.Create(AOwner: TComponent); +begin + inherited; + FAutoDropDownWidthRightMargin := 8; + FAutoItemHeight := True; + FMouseTimer := nil; + FHotTrack := True; + FSkinType := sknSkin; + SkinManager.AddSkinNotification(Self); + + if not (csDesigning in ComponentState) then + DoubleBuffered := True; +end; + +procedure TSpTBXComboBox.CreateParams(var Params: TCreateParams); +begin + inherited CreateParams(Params); + + // Force the ComboBox to be owner draw + with Params do + if Style and (CBS_OWNERDRAWFIXED or CBS_OWNERDRAWVARIABLE) = 0 then + Style := Style or LBS_OWNERDRAWFIXED; +end; + +procedure TSpTBXComboBox.CreateWnd; +begin + inherited; + DoCalcMaxDropDownWidth; +end; + +destructor TSpTBXComboBox.Destroy; +begin + SkinManager.RemoveSkinNotification(Self); + if Assigned(FMouseTimer) then begin + FMouseTimer.Enabled := False; + FreeAndNil(FMouseTimer); + end; + inherited; +end; + +procedure TSpTBXComboBox.CloseUp; +begin + inherited; + InvalidateFrame; +end; + +procedure TSpTBXComboBox.CMEnter(var Message: TCMEnter); +begin + inherited; + FMouseInControl := True; + InvalidateFrame; +end; + +procedure TSpTBXComboBox.CMExit(var Message: TCMExit); +begin + inherited; + FMouseInControl := False; + InvalidateFrame; +end; + +procedure TSpTBXComboBox.CMMouseEnter(var Message: TMessage); +begin + inherited; + if Message.LParam = 0 then begin + if not FMouseInControl then begin + FMouseInControl := True; + if FHotTrack then + InvalidateFrame; + if not Assigned(FMouseTimer) then begin + FMouseTimer := TTimer.Create(nil); + FMouseTimer.Enabled := False; + FMouseTimer.Interval := 125; + FMouseTimer.OnTimer := MouseTimerHandler; + FMouseTimer.Enabled := True; + end; + end; + end; +end; + +procedure TSpTBXComboBox.CNDrawItem(var Message: TWMDrawItem); +var + State: TOwnerDrawState; + SknState: TSpTBXSkinStatesType; +begin + with Message.DrawItemStruct^ do + begin + State := TOwnerDrawState(LongRec(itemState).Lo); + if itemState and ODS_COMBOBOXEDIT <> 0 then + Include(State, odComboBoxEdit); + if itemState and ODS_DEFAULT <> 0 then + Include(State, odDefault); + + Canvas.Handle := hDC; + Canvas.Lock; + try + Canvas.Font := Font; + Canvas.Brush := Brush; + if (Integer(itemID) >= 0) and (Integer(itemID) < Items.Count) then begin + DrawItemBackground(itemID, rcItem, State); + + TControlCanvas(Canvas).UpdateTextFlags; + SknState := CurrentSkin.GetState(not (odDisabled in State), False, odSelected in State, False); + Canvas.Brush.Style := bsClear; + if SknState = sknsHotTrack then + Canvas.Font.Color := CurrentSkin.GetTextColor(skncListItem, sknsHotTrack, SkinType); + DrawItem(itemID, rcItem, State); + end + else + Canvas.FillRect(rcItem); + finally + Canvas.Unlock; + Canvas.Handle := 0; + end; + end; +end; + +procedure TSpTBXComboBox.MouseTimerHandler(Sender: TObject); +var + P: TPoint; + R: TRect; + InControl: Boolean; +begin + if not DroppedDown and GetCursorPos(P) then begin + GetWindowRect(Handle, R); + InControl := PtInRect(R, P); + if InControl <> FMouseInControl then begin + FMouseInControl := InControl; + if FHotTrack then InvalidateFrame; + end; + + if not InControl then begin + FMouseTimer.Enabled := False; + FreeAndNil(FMouseTimer); + end; + end; +end; + +procedure TSpTBXComboBox.DoCalcMaxDropDownWidth; +begin + if FAutoDropDownWidth then + SpCalcMaxDropDownWidth(Self, FAutoDropDownWidthRightMargin); +end; + +procedure TSpTBXComboBox.DoDrawBackground(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawBackground) then FOnDrawBackground(Self, ACanvas, ARect, + PaintStage, PaintDefault); +end; + +procedure TSpTBXComboBox.DoDrawItem(ACanvas: TCanvas; var ARect: TRect; + Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawItem) then FOnDrawItem(Self, ACanvas, ARect, Index, State, PaintStage, PaintDefault); +end; + +procedure TSpTBXComboBox.DoDrawItemBackground(ACanvas: TCanvas; + var ARect: TRect; Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawItemBackground) then FOnDrawItemBackground(Self, ACanvas, ARect, Index, State, PaintStage, PaintDefault); +end; + +procedure TSpTBXComboBox.DrawItem(Index: Integer; Rect: TRect; + State: TOwnerDrawState); +var + Flags: Integer; + PaintDefault: Boolean; +begin + // Draw the item text + PaintDefault := True; + DoDrawItem(Canvas, Rect, Index, State, pstPrePaint, PaintDefault); + if PaintDefault then begin + Flags := DrawTextBiDiModeFlags(DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX); + Inc(Rect.Left, 2); + SpDrawXPText(Canvas, Items[Index], Rect, Flags); + end; + + PaintDefault := True; + DoDrawItem(Canvas, Rect, Index, State, pstPostPaint, PaintDefault); +end; + +procedure TSpTBXComboBox.DrawItemBackground(Index: Integer; Rect: TRect; + State: TOwnerDrawState); +var + PaintDefault: Boolean; +begin + // Draw the list items background + PaintDefault := True; + DoDrawItemBackground(Canvas, Rect, Index, State, pstPrePaint, PaintDefault); + if PaintDefault then + SpDrawXPListItemBackground(Canvas, Rect, odSelected in State, False, odFocused in State, SkinType); + + PaintDefault := True; + DoDrawItemBackground(Canvas, Rect, Index, State, pstPostPaint, PaintDefault); +end; + +{$IF CompilerVersion > 17} +procedure TSpTBXComboBox.EditWndProc(var Message: TMessage); +begin + // [Bugfix] Delphi 2006/2007 bug: + // CM_MOUSEENTER and CM_MOUSELEAVE are fired everytime the mouse + // enters the combobox internal edit control. + // In D7 these messages were only fired when the mouse entered or leaved + // the combobox, including the internal edit control. + // We need to block the mouse messages from the internal edit control + // in EditWndProc + if Message.Msg = WM_MOUSEMOVE then + ComboWndProc(Message, FEditHandle, FDefEditProc) + else + inherited; +end; +{$IFEND} + +function TSpTBXComboBox.GetDropDownButtonRect: TRect; +var + ButtonWidth: Integer; + T: TSpTBXSkinType; +begin + if Style = csSimple then + ButtonWidth := 0 + else + ButtonWidth := GetSystemMetrics(SM_CXHSCROLL); + Result.Left := Width - ButtonWidth; + Result.Top := 0; + Result.Right := Result.Left + ButtonWidth; + Result.Bottom := Height; + + T := SpTBXSkinType(FSkinType); + case T of + sknNone: + begin + InflateRect(Result, 0, -1); + OffsetRect(Result, -1, 0); + end; + sknWindows: + begin + InflateRect(Result, 0, -1); + OffsetRect(Result, -1, 0); + end; + sknSkin: + begin + InflateRect(Result, 0, -2); + OffsetRect(Result, -2, 0); + end; + end; +end; + +function TSpTBXComboBox.GetMouseInDropDownButton: Boolean; +var + P: TPoint; + ButtonR: TRect; + ButtonWidth: Integer; +begin + Result := False; + + if not (csDesigning in ComponentState) and GetCursorPos(P) then begin + P := ScreenToClient(P); + if Style = csSimple then + ButtonWidth := 0 + else + ButtonWidth := GetSystemMetrics(SM_CXHSCROLL); + ButtonR.Left := Width - ButtonWidth; + ButtonR.Top := 0; + ButtonR.Right := ButtonR.Left + ButtonWidth; + ButtonR.Bottom := Height; + + Result := PtInRect(ButtonR, P); + end; +end; + +procedure TSpTBXComboBox.InvalidateFrame; +begin + if HandleAllocated then + Invalidate; +end; + +procedure TSpTBXComboBox.UpdateDropDownButton; +var + ButtonState: Boolean; +begin + if not DroppedDown then begin + ButtonState := GetMouseInDropDownButton; + if ButtonState <> FMouseInDropDownButton then + InvalidateFrame; + FMouseInDropDownButton := ButtonState; + end; +end; + +function TSpTBXComboBox.GetItemHt: Integer; +// Automatically update the Height/ItemHeight when Style is csDropDown, +// csDropDownList or csSimple +begin + // CB_GETITEMHEIGHT doesn't work when Style is csOwnerDrawFixed or + // csOwnerDrawVariable. + // Since TSpTBXComboBox is always owner-drawed we must calculate the + // ItemHeight based on the font when Style <> csOwnerDrawFixed/csOwnerDrawVariable. + // Look at TCustomComboBox.GetItemHt + if Style in [csOwnerDrawFixed, csOwnerDrawVariable] then + Result := inherited GetItemHt + else + if not FAutoItemHeight then // When AutoItemHeight is turned off return the ItemHeight + Result := FInternalItemHeight + else + Result := SpGetControlTextHeight(Self, Font); +end; + +procedure TSpTBXComboBox.SetItemHeight(Value: Integer); +begin + if Value > 0 then + FInternalItemHeight := Value; + inherited; +end; + +procedure TSpTBXComboBox.SetSkinType(const Value: TSpTBXSkinType); +begin + if Value <> FSkinType then begin + FSkinType := Value; + InvalidateFrame; + end; +end; + +procedure TSpTBXComboBox.WMMouseMove(var Message: TWMMouseMove); +begin + inherited; + UpdateDropDownButton; +end; + +procedure TSpTBXComboBox.WMNCCalcSize(var Message: TWMNCCalcSize); +begin + // [Bugfix] Delphi 2006 bug: + // Do nothing, fix Delphi 2005/2006 bug: http://qc.borland.com/wc/qcmain.aspx?d=13852 +end; + +procedure TSpTBXComboBox.WMPaint(var Message: TWMPaint); +var + ACanvas: TControlCanvas; + R, ButtonR: TRect; + ButtonWidth: Integer; + T: TSpTBXSkinType; + PaintDefault, HotTrackFrame, VistaNewComCtrls: Boolean; +begin + inherited; + + ACanvas := TControlCanvas.Create; + try + ACanvas.Control := Self; + ACanvas.Lock; // lock the canvas to prevent flicker on mouse click + GetWindowRect(Handle, R); + OffsetRect(R, -R.Left, -R.Top); + + if Style = csSimple then + ButtonWidth := 0 + else + ButtonWidth := GetSystemMetrics(SM_CXHSCROLL); + + T := SpTBXSkinType(FSkinType); + ExcludeClipRect(ACanvas.Handle, 2, 2, R.Right - 2 - ButtonWidth, R.Bottom - 2); + try + PaintDefault := True; + DoDrawBackground(ACanvas, R, pstPrePaint, PaintDefault); + + // Don't custom paint if we are on Vista with ComCtrls 6, let the + // OS draw the frame + VistaNewComCtrls := not (csDesigning in ComponentState) and (T = sknWindows) and SpIsWinVistaOrUp and ThemeServices.ThemesEnabled; + + if PaintDefault and (T <> sknNone) and not VistaNewComCtrls then begin + if csDesigning in ComponentState then + HotTrackFrame := False + else + if FHotTrack then + HotTrackFrame := FMouseInControl or Focused + else + HotTrackFrame := DroppedDown; + + ButtonR := GetDropDownButtonRect; + if T = sknSkin then + SpDrawParentBackground(Self, ACanvas.Handle, R); + SpDrawXPEditFrame(ACanvas, R, Enabled, HotTrackFrame, T); + if Style <> csSimple then + SpDrawXPComboButton(ACanvas, ButtonR, Enabled, HotTrackFrame, GetMouseInDropDownButton, DroppedDown, True, T); + end; + + PaintDefault := True; + DoDrawBackground(ACanvas, R, pstPostPaint, PaintDefault); + finally + SelectClipRgn(ACanvas.Handle, 0); + end; + finally + ACanvas.Unlock; + ACanvas.Free; + end; +end; + +procedure TSpTBXComboBox.CNMeasureItem(var Message: TWMMeasureItem); +// Automatically update the Height/ItemHeight when Style is csDropDown, +// csDropDownList or csSimple +// Recalc ItemHeight based on the font +var + I: Integer; +begin + inherited; + if not (Style in [csOwnerDrawFixed, csOwnerDrawVariable]) then begin + // When itemID = $FFFFFFFFFF the itemHeight is refering to the + // editbox height + if Message.MeasureItemStruct.itemID = High(LongWord) then begin + I := SpGetControlTextHeight(Self, Font); + Inc(I, 2); + end + else + I := GetItemHt; + Message.MeasureItemStruct^.itemHeight := I; + end; +end; + +procedure TSpTBXComboBox.CMSPFontChanged(var Message: TMessage); +// Automatically update the Height/ItemHeight when Style is csDropDown, +// csDropDownList or csSimple +// Recreate when the font is changed +begin + if not FFontChanging and not (Style in [csOwnerDrawFixed, csOwnerDrawVariable]) then begin + FFontChanging := True; + RecreateWnd; + FFontChanging := False; + end; +end; + +procedure TSpTBXComboBox.WMSetFont(var Message: TWMSetFont); +// Automatically update the Height/ItemHeight when Style is csDropDown, +// csDropDownList or csSimple +// Recreate when the font is changed +begin + inherited; + if not FFontChanging and not (Style in [csOwnerDrawFixed, csOwnerDrawVariable]) then + PostMessage(Handle, CM_SPFONTCHANGED, 0, 0); +end; + +procedure TSpTBXComboBox.WMSpSkinChange(var Message: TMessage); +begin + inherited; + InvalidateFrame; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXListBox } + +constructor TSpTBXListBox.Create(AOwner: TComponent); +begin + inherited; + FHotTrack := True; + FSkinType := sknSkin; + SkinManager.AddSkinNotification(Self); + Style := lbOwnerDrawFixed; +end; + +procedure TSpTBXListBox.CreateParams(var Params: TCreateParams); +begin + inherited; + // Force the ListBox to be owner draw + with Params do + if Style and (LBS_OWNERDRAWFIXED or LBS_OWNERDRAWVARIABLE) = 0 then + Style := Style or LBS_OWNERDRAWFIXED; +end; + +destructor TSpTBXListBox.Destroy; +begin + SkinManager.RemoveSkinNotification(Self); + inherited; +end; + +procedure TSpTBXListBox.InvalidateBorders; +begin + if HandleAllocated then + RedrawWindow(Handle, nil, 0, RDW_FRAME or RDW_INVALIDATE); +end; + +procedure TSpTBXListBox.SetHotTrack(const Value: Boolean); +begin + if FHotTrack <> Value then begin + FHotTrack := Value; + InvalidateBorders; + end; +end; + +procedure TSpTBXListBox.SetSkinType(const Value: TSpTBXSkinType); +begin + if Value <> FSkinType then begin + FSkinType := Value; + InvalidateBorders; + end; +end; + +procedure TSpTBXListBox.CMFocusChanged(var Message: TCMFocusChanged); +begin + inherited; + if FHotTrack and Assigned(Message.Sender) then begin + FChildFocused := Self = Message.Sender; + if FChildFocused <> FHotTracking then begin + FHotTracking := FChildFocused; + InvalidateBorders; + end; + end; +end; + +procedure TSpTBXListBox.CMMouseEnter(var Message: TMessage); +begin + inherited; + if FHotTrack and not FHotTracking then begin + FHotTracking := True; + if SpCanEditFrameBeHotTracked(BorderStyle, SkinType) then + InvalidateBorders; + end; +end; + +procedure TSpTBXListBox.CMMouseLeave(var Message: TMessage); +begin + inherited; + if FHotTrack and FHotTracking and not FChildFocused then begin + FHotTracking := False; + if SpCanEditFrameBeHotTracked(BorderStyle, SkinType) then + InvalidateBorders; + end; +end; + +procedure TSpTBXListBox.WMSpSkinChange(var Message: TMessage); +begin + inherited; + InvalidateBorders; +end; + +procedure TSpTBXListBox.DoDrawItem(ACanvas: TCanvas; var ARect: TRect; + Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawItem) then FOnDrawItem(Self, ACanvas, ARect, Index, State, PaintStage, PaintDefault); +end; + +procedure TSpTBXListBox.DoDrawItemBackground(ACanvas: TCanvas; var ARect: TRect; + Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawItemBackground) then FOnDrawItemBackground(Self, ACanvas, ARect, Index, State, PaintStage, PaintDefault); +end; + +procedure TSpTBXListBox.DrawItem(Index: Integer; Rect: TRect; + State: TOwnerDrawState); +var + R: TRect; + Flags: Integer; + PaintDefault: Boolean; +begin + // Draw the item text + PaintDefault := True; + DoDrawItem(Canvas, Rect, Index, State, pstPrePaint, PaintDefault); + if PaintDefault then begin + Flags := DrawTextBiDiModeFlags(DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX); + + // It seems TabWidth doesn't work on owner-drawed listboxes, we have to do + // it manually using DT_EXPANDTABS. + // It seems that DrawText uses a different unit metric than LB_SETTABSTOPS, + // don't know how to calculate it correctly for more info: + // http://news.jrsoftware.org/read/article.php?id=15427&group=jrsoftware.toolbar2000.thirdparty#15427 + // Using DrawTextEx doesn't solve the problem, GetDialogBaseUnits doesn't help either + if TabWidth > 0 then + Flags := ((Flags or DT_EXPANDTABS or DT_TABSTOP) and not $800) or (Round(TabWidth * 0.3) shl 8); + + // Add a margin to the rect + R := Rect; + if not UseRightToLeftAlignment then + Inc(R.Left, 3) + else + Dec(R.Right, 3); + SpDrawXPText(Canvas, Items[Index], R, Flags); + end; + + PaintDefault := True; + DoDrawItem(Canvas, Rect, Index, State, pstPostPaint, PaintDefault); +end; + +procedure TSpTBXListBox.DrawItemBackground(Index: Integer; Rect: TRect; + State: TOwnerDrawState); +var + PaintDefault: Boolean; +begin + // Draw the item background + PaintDefault := True; + DoDrawItemBackground(Canvas, Rect, Index, State, pstPrePaint, PaintDefault); + if PaintDefault then + SpDrawXPListItemBackground(Canvas, Rect, odSelected in State, False, odFocused in State, SkinType); + + PaintDefault := True; + DoDrawItemBackground(Canvas, Rect, Index, State, pstPostPaint, PaintDefault); +end; + +procedure TSpTBXListBox.CNDrawItem(var Message: TWMDrawItem); +var + State: TOwnerDrawState; + SknState: TSpTBXSkinStatesType; +begin + with Message.DrawItemStruct^ do + begin + State := TOwnerDrawState(LongRec(itemState).Lo); + Canvas.Handle := hDC; + Canvas.Lock; + try + Canvas.Font := Font; + Canvas.Brush := Brush; + if (Integer(itemID) >= 0) and (Integer(itemID) < Items.Count) then begin + DrawItemBackground(itemID, rcItem, State); + + SknState := CurrentSkin.GetState(not (odDisabled in State), False, odSelected in State, False); + Canvas.Brush.Style := bsClear; + if SknState = sknsHotTrack then + Canvas.Font.Color := CurrentSkin.GetTextColor(skncListItem, sknsHotTrack, SkinType); + DrawItem(itemID, rcItem, State); + end + else + Canvas.FillRect(rcItem); + finally + Canvas.Unlock; + Canvas.Handle := 0; + end; + end; +end; + +procedure TSpTBXListBox.WMNCPaint(var Message: TWMNCPaint); +begin + inherited; + if (BorderStyle <> bsNone) and (SpTBXSkinType(FSkinType) <> sknNone) then + SpDrawXPEditFrame(Self, FHotTracking, FSkinType, True); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCheckListBox } + +constructor TSpTBXCheckListBox.Create(AOwner: TComponent); +begin + inherited; + FHotTrack := True; + FSkinType := sknSkin; + SkinManager.AddSkinNotification(Self); + Style := lbOwnerDrawFixed; +end; + +destructor TSpTBXCheckListBox.Destroy; +begin + SkinManager.RemoveSkinNotification(Self); + inherited; +end; + +procedure TSpTBXCheckListBox.InvalidateBorders; +begin + if HandleAllocated then + RedrawWindow(Handle, nil, 0, RDW_FRAME or RDW_INVALIDATE); +end; + +procedure TSpTBXCheckListBox.SetHotTrack(const Value: Boolean); +begin + if FHotTrack <> Value then begin + FHotTrack := Value; + InvalidateBorders; + end; +end; + +procedure TSpTBXCheckListBox.SetSkinType(const Value: TSpTBXSkinType); +begin + if Value <> FSkinType then begin + FSkinType := Value; + InvalidateBorders; + end; +end; + +procedure TSpTBXCheckListBox.CMFocusChanged(var Message: TCMFocusChanged); +begin + inherited; + if FHotTrack and Assigned(Message.Sender) then begin + FChildFocused := Self = Message.Sender; + if FChildFocused <> FHotTracking then begin + FHotTracking := FChildFocused; + InvalidateBorders; + end; + end; +end; + +procedure TSpTBXCheckListBox.CMMouseEnter(var Message: TMessage); +begin + inherited; + if FHotTrack and not FHotTracking then begin + FHotTracking := True; + if SpCanEditFrameBeHotTracked(BorderStyle, SkinType) then + InvalidateBorders; + end; +end; + +procedure TSpTBXCheckListBox.CMMouseLeave(var Message: TMessage); +begin + inherited; + if FHotTrack and FHotTracking and not FChildFocused then begin + FHotTracking := False; + if SpCanEditFrameBeHotTracked(BorderStyle, SkinType) then + InvalidateBorders; + end; +end; + +procedure TSpTBXCheckListBox.WMSpSkinChange(var Message: TMessage); +begin + inherited; + InvalidateBorders; +end; + +procedure TSpTBXCheckListBox.DoDrawItem(ACanvas: TCanvas; var ARect: TRect; + Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawItem) then FOnDrawItem(Self, ACanvas, ARect, Index, State, PaintStage, PaintDefault); +end; + +procedure TSpTBXCheckListBox.DoDrawItemBackground(ACanvas: TCanvas; + var ARect: TRect; Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawItemBackground) then FOnDrawItemBackground(Self, ACanvas, ARect, Index, State, PaintStage, PaintDefault); +end; + +procedure TSpTBXCheckListBox.DrawItem(Index: Integer; Rect: TRect; + State: TOwnerDrawState); +var + R: TRect; + Flags: Integer; + PaintDefault: Boolean; +begin + // Draw the item text + PaintDefault := True; + DoDrawItem(Canvas, Rect, Index, State, pstPrePaint, PaintDefault); + if PaintDefault then begin + Flags := DrawTextBiDiModeFlags(DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX); + + // Add a margin to the rect + R := Rect; + if not UseRightToLeftAlignment then + Inc(R.Left, 3) + else + Dec(R.Right, 3); + SpDrawXPText(Canvas, Items[Index], R, Flags); + end; + + PaintDefault := True; + DoDrawItem(Canvas, Rect, Index, State, pstPostPaint, PaintDefault); +end; + +procedure TSpTBXCheckListBox.DrawItemBackground(Index: Integer; Rect: TRect; + State: TOwnerDrawState); +var + ACheckWidth: Integer; + R: TRect; + PaintDefault: Boolean; +begin + // Draw the checkbox, background and focus + PaintDefault := True; + DoDrawItemBackground(Canvas, Rect, Index, State, pstPrePaint, PaintDefault); + if PaintDefault then begin + if not Header[Index] then begin + // Draw the checkbox + ACheckWidth := GetCheckWidth; + if not UseRightToLeftAlignment then begin + R.Right := Rect.Left; + R.Left := R.Right - ACheckWidth; + end + else begin + R.Left := Rect.Right; + R.Right := R.Left + ACheckWidth; + end; + R.Top := Rect.Top + (Rect.Bottom - Rect.Top - ACheckWidth) div 2; + R.Bottom := R.Top + ACheckWidth; + InflateRect(R, -1, -1); + + Canvas.FillRect(R); + SpDrawXPCheckBoxGlyph(Canvas, R, ItemEnabled[Index], Self.State[Index], False, False, SkinType); + + // Draw the background and focus + SpDrawXPListItemBackground(Canvas, Rect, odSelected in State, False, odFocused in State, SkinType); + end + else begin + Canvas.Font.Color := HeaderColor; + Canvas.Brush.Color := HeaderBackgroundColor; + Canvas.FillRect(Rect); + if odFocused in State then + SpDrawFocusRect(Canvas, Rect); + end; + end; + + PaintDefault := True; + DoDrawItemBackground(Canvas, Rect, Index, State, pstPostPaint, PaintDefault); +end; + +procedure TSpTBXCheckListBox.CNDrawItem(var Message: TWMDrawItem); +var + State: TOwnerDrawState; + SknState: TSpTBXSkinStatesType; +begin + if Items.Count = 0 then Exit; + + with Message.DrawItemStruct^ do + begin + State := TOwnerDrawState(LongRec(itemState).Lo); + Canvas.Handle := hDC; + Canvas.Lock; + try + Canvas.Font := Font; + Canvas.Brush := Brush; + if (Integer(itemID) >= 0) and (Integer(itemID) < Items.Count) then begin + // Exclude the checkbox area + if not Header[itemID] then + if not UseRightToLeftAlignment then + rcItem.Left := rcItem.Left + GetCheckWidth + else + rcItem.Right := rcItem.Right - GetCheckWidth; + + DrawItemBackground(itemID, rcItem, State); + + SknState := CurrentSkin.GetState(not (odDisabled in State), False, odSelected in State, False); + Canvas.Brush.Style := bsClear; + if SknState = sknsHotTrack then + Canvas.Font.Color := CurrentSkin.GetTextColor(skncListItem, sknsHotTrack, SkinType); + DrawItem(itemID, rcItem, State); + end + else + Canvas.FillRect(rcItem); + finally + Canvas.Unlock; + Canvas.Handle := 0; + end; + end; +end; + +procedure TSpTBXCheckListBox.WMNCPaint(var Message: TWMNCPaint); +begin + inherited; + if (BorderStyle <> bsNone) and (SpTBXSkinType(FSkinType) <> sknNone) then + SpDrawXPEditFrame(Self, FHotTracking, FSkinType, True); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXEditItem } + +constructor TSpTBXEditItem.Create(AOwner: TComponent); +begin + inherited; + FEditImageIndex := -1; + FEditorFontSettings := TSpTBXFontSettings.Create; + TSpTBXFontSettingsAccess(FEditorFontSettings).OnChange := FontSettingsChanged; + CustomWidth := 64; + Alignment := taLeftJustify; +end; + +destructor TSpTBXEditItem.Destroy; +begin + FFontSettings.Free; + FEditorFontSettings.Free; + inherited; +end; + +function TSpTBXEditItem.DoAcceptText(var NewText: WideString): Boolean; +begin + Result := True; + if Assigned(FOnAcceptText) then FOnAcceptText(Self, NewText, Result); +end; + +function TSpTBXEditItem.DoAutoComplete(var AText: WideString): Boolean; +begin + Result := False; +end; + +procedure TSpTBXEditItem.DoBeginEdit(Viewer: TSpTBXEditItemViewer); +begin + if Assigned(FOnBeginEdit) then FOnBeginEdit(Self, Viewer, Viewer.EditControl); +end; + +procedure TSpTBXEditItem.DoChange(const AText: WideString); +begin + if Assigned(FOnChange) then FOnChange(Self, AText); +end; + +procedure TSpTBXEditItem.DoTextChanging(const OldText: WideString; + var NewText: WideString; Reason: Integer); +begin + case CharCase of + ecUpperCase: NewText := WideUpperCase(NewText); + ecLowerCase: NewText := WideLowerCase(NewText); + end; +end; + +procedure TSpTBXEditItem.FontSettingsChanged(Sender: TObject); +begin + Change(True); +end; + +function TSpTBXEditItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + if not FAllowVerticalEditor and (AView.Orientation = tbvoVertical) then + Result := inherited GetItemViewerClass(AView) + else + Result := TSpTBXEditItemViewer; +end; + +function TSpTBXEditItem.NeedToRecreateViewer(AViewer: TTBItemViewer): Boolean; +begin + Result := GetItemViewerClass(AViewer.View) <> AViewer.ClassType; +end; + +procedure TSpTBXEditItem.SetPasswordChar(Value: WideChar); +begin + if Value <> FPasswordChar then begin + FPasswordChar := Value; + Change(True); + end; +end; + +procedure TSpTBXEditItem.SetShowImage(const Value: Boolean); +begin + if FShowImage <> Value then begin + FShowImage := Value; + Change(True); + end; +end; + +function TSpTBXEditItem.StartEditing(AView: TTBView): Boolean; +var + SaveText: WideString; +begin + SaveText := Text; + SpFocusEditItem(Self, AView); + // Case Sensitive, Result is true when the text is changed + Result := Text <> SaveText; +end; + +procedure TSpTBXEditItem.SetAllowVerticalEditor(const Value: Boolean); +begin + if FAllowVerticalEditor <> Value then begin + FAllowVerticalEditor := Value; + Change(True); + end; +end; + +procedure TSpTBXEditItem.SetCharCase(Value: TEditCharCase); +begin + if FCharCase <> Value then begin + FCharCase := Value; + SetText(Text); // Updates case + end; +end; + +procedure TSpTBXEditItem.SetEditCaption(const Value: WideString); +begin + if FEditCaption <> Value then begin + FEditCaption := Value; + Change(True); + end; +end; + +procedure TSpTBXEditItem.SetEditorFontSettings(const Value: TSpTBXFontSettings); +begin + FEditorFontSettings.Assign(Value); +end; + +procedure TSpTBXEditItem.SetMaxLength(Value: Integer); +begin + if FMaxLength <> Value then begin + FMaxLength := Value; + Change(False); + end; +end; + +procedure TSpTBXEditItem.SetText(Value: WideString); +begin + SetTextEx(Value, tcrSetProperty); +end; + +procedure TSpTBXEditItem.SetTextEx(Value: WideString; Reason: Integer); +begin + DoTextChanging(FText, Value, Reason); + // Case Sensitive, fire the event when the text is changed + if FText <> Value then begin + FText := Value; + Change(False); + DoChange(Text); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXEditItemViewer } + +procedure TSpTBXEditItemViewer.EditWndProc(var Message: TMessage); + + procedure AcceptText; + var + S: WideString; + begin + S := GetEditControlText; + if Item.DoAcceptText(S) then Item.SetTextEx(S, tcrEditControl); + end; + +begin + if FEditControl = nil then + Exit; + + if not HandleEditMessage(Message) then begin + if Message.Msg = WM_CHAR then + case TWMChar(Message).CharCode of + VK_TAB: begin + FEditControlStatus := [ecsAccept]; + AcceptText; + Exit; + end; + VK_RETURN: begin + FEditControlStatus := [ecsAccept, ecsClose]; + AcceptText; + Exit; + end; + VK_ESCAPE: begin + FEditControlStatus := []; + Exit; + end; + end; + TCustomEditAccess(FEditControl).WndProc(Message); + end; + + if Message.Msg = WM_KILLFOCUS then begin + View.CancelMode; + FEditControlStatus := [ecsClose]; + end; +end; + +function TSpTBXEditItemViewer.GetEditControlClass: TEditClass; +begin + Result := TSpTBXUnicodeEdit; +end; + +function TSpTBXEditItemViewer.GetEditControlText: WideString; +begin + Result := ''; + if Assigned(FEditControl) then begin + if FEditControl is TSpTBXUnicodeEdit then + Result := TSpTBXUnicodeEdit(FEditControl).Text + else + Result := TCustomEditAccess(FEditControl).Text; + end; +end; + +procedure TSpTBXEditItemViewer.GetEditHeight(const DC: HDC; out EditHeight, + ExternalLeading: Integer); +var + TextMetricA: TTextMetricA; + TextMetricW: TTextMetricW; +begin + if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then begin + Windows.GetTextMetricsA(DC, TextMetricA); + EditHeight := TextMetricA.tmHeight; + ExternalLeading := TextMetricA.tmExternalLeading; + end + else begin + Windows.GetTextMetricsW(DC, TextMetricW); + EditHeight := TextMetricW.tmHeight; + ExternalLeading := TextMetricW.tmExternalLeading; + end; +end; + +procedure TSpTBXEditItemViewer.GetEditRect(var R: TRect); +var + TextSize: TSize; + MarginsInfo: TSpTBXMenuItemMarginsInfo; +begin + R := BoundsRect; + if not IsToolbarStyle then begin + TextSize := MeasureEditCaption; + CurrentSkin.GetMenuItemMargins(StockBitmap.Canvas, 0, MarginsInfo); + Inc(R.Left, MarginsInfo.GutterSize + MarginsInfo.ImageTextSpace); + if Length(Item.EditCaption) > 0 then + Inc(R.Left, MarginsInfo.LeftCaptionMargin + TextSize.cx + MarginsInfo.RightCaptionMargin + 1); + end; + + InflateRect(R, 1, 0); + Inc(R.Left, GetIndentBefore); + Dec(R.Right, GetIndentAfter); +end; + +function TSpTBXEditItemViewer.GetImageShown: Boolean; +begin + Result := (Item.EditImageIndex >= 0) and + ((Item.DisplayMode in [nbdmDefault, nbdmImageAndText]) or + (IsToolbarStyle and (Item.DisplayMode = nbdmTextOnlyInMenus))); + + if Assigned(View) and Assigned(View.Owner) and (View.Owner is TSpTBXToolbar) then + if TSpTBXToolbar(View.Owner).DisplayMode = tbdmTextOnly then + Result := False; +end; + +function TSpTBXEditItemViewer.GetIndentAfter: Integer; +begin + Result := 1; +end; + +function TSpTBXEditItemViewer.GetIndentBefore: Integer; +var + ImgList: TCustomImageList; +begin + Result := 1; + + if ShowImage then begin + ImgList := GetImageList; + if Assigned(ImgList) and (Item.ImageIndex >= 0) and (Item.ImageIndex <= ImgList.Count - 1) then + Result := ImgList.Width + 4; + end; +end; + +function TSpTBXEditItemViewer.GetItem: TSpTBXEditItem; +var + TBItem: TTBCustomItem; +begin + TBItem := inherited Item; + if Assigned(TBItem) then + Result := TBItem as TSpTBXEditItem + else + Result := nil; +end; + +function TSpTBXEditItemViewer.HandleEditMessage(var Message: TMessage): Boolean; +begin + Result := False; + if Assigned(Item.FOnEditMessage) then Item.FOnEditMessage(Item, Self, Message, Result); +end; + +procedure TSpTBXEditItemViewer.CalcSize(const Canvas: TCanvas; + var AWidth, AHeight: Integer); +var + TextSize: TSize; + MarginsInfo: TSpTBXMenuItemMarginsInfo; + EditBoxHeight: Integer; +begin + if Item.CustomWidth > -1 then + AWidth := Item.CustomWidth; + + if not IsToolbarStyle then begin + TextSize := MeasureEditCaption; + CurrentSkin.GetMenuItemMargins(StockBitmap.Canvas, 0, MarginsInfo); + Inc(AWidth, MarginsInfo.GutterSize + MarginsInfo.ImageTextSpace); + if Length(Item.EditCaption) > 0 then + Inc(AWidth, MarginsInfo.LeftCaptionMargin + TextSize.cx + MarginsInfo.RightCaptionMargin + 2); + end + else begin + TextSize.cx := 0; + TextSize.cy := 0; + end; + + EditBoxHeight := MeasureTextHeight + 1; + Inc(EditBoxHeight, 2 + 4); + AHeight := Max(EditBoxHeight, TextSize.cy); + if not IsToolbarStyle then + AHeight := AHeight + else + AHeight := AHeight or $01; + + if (Item.CustomHeight > -1) and IsToolbarStyle then + AHeight := Item.CustomHeight; +end; + +function TSpTBXEditItemViewer.CaptionShown: Boolean; +begin + Result := not IsToolbarStyle and inherited CaptionShown; +end; + +function TSpTBXEditItemViewer.GetCaptionText: WideString; +begin + Result := TSpTBXEditItem(Item).EditCaption; +end; + +procedure TSpTBXEditItemViewer.InternalDrawFrame(ACanvas: TCanvas; + ARect: TRect; ItemInfo: TSpTBXMenuItemInfo); +begin + if not (ItemInfo.HotTrack or ItemInfo.Pushed) and (SkinManager.CurrentSkinName = 'Default') then + SpFillRect(ACanvas, ARect, clWindow, clBtnFace) + else begin + SpDrawXPEditFrame(ACanvas, ARect, ItemInfo.Enabled, ItemInfo.HotTrack, sknSkin); + InflateRect(ARect, -2, -2); + SpFillRect(ACanvas, ARect, clWindow); + end; +end; + +procedure TSpTBXEditItemViewer.InternalEditControlChange(Sender: TObject); +begin + // Used by descendants + Item.DoChange(GetEditControlText); +end; + +procedure TSpTBXEditItemViewer.InternalEditControlExit; +begin + // Used by descendants +end; + +procedure TSpTBXEditItemViewer.Paint(const Canvas: TCanvas; + const ClientAreaRect: TRect; IsSelected, IsPushed, UseDisabledShadow: Boolean); +const + Alignments: array [TAlignment] of Integer = (DT_LEFT, DT_RIGHT, DT_CENTER); +var + DC: HDC; + S: WideString; + R, ImageRect: TRect; + ImgList: TCustomImageList; + TextSize: TSize; + ItemInfo: TSpTBXMenuItemInfo; + MarginsInfo: TSpTBXMenuItemMarginsInfo; +begin + DC := Canvas.Handle; + R := ClientAreaRect; + SpFillItemInfo(Canvas, Self, ItemInfo); + + Canvas.Font.Assign(View.GetFont); + Item.FontSettings.Apply(Canvas.Font); + + { Item Caption, only on MenuItems } + if not IsToolbarStyle then begin + S := Item.EditCaption; + CurrentSkin.GetMenuItemMargins(Canvas, 0, MarginsInfo); + TextSize := SpGetTextSize(DC, S, True); + + if Length(S) > 0 then + R.Right := MarginsInfo.GutterSize + MarginsInfo.ImageTextSpace + TextSize.cx + MarginsInfo.LeftCaptionMargin + MarginsInfo.RightCaptionMargin + else + R.Right := MarginsInfo.GutterSize + MarginsInfo.ImageTextSpace - 1; + SpDrawXPMenuItem(Canvas, R, ItemInfo); + + R.Right := ClientAreaRect.Right; + Inc(R.Left, MarginsInfo.GutterSize + MarginsInfo.ImageTextSpace); + + if Length(S) > 0 then begin + if Canvas.Font.Color = clNone then + Canvas.Font.Color := CurrentSkin.GetTextColor(skncMenuItem, ItemInfo.State); + Inc(R.Left, MarginsInfo.LeftCaptionMargin); + SpDrawXPText(Canvas, S, R, DT_SINGLELINE or DT_LEFT or DT_VCENTER); + Inc(R.Left, TextSize.cx + MarginsInfo.RightCaptionMargin + 1); + end; + + ImageRect := ClientAreaRect; + ImageRect.Right := ImageRect.Left + ItemInfo.MenuMargins.GutterSize; + if ItemInfo.ImageShown then begin + ImageRect.Left := ImageRect.Left + ((ImageRect.Right - ImageRect.Left) - ItemInfo.ImageSize.cx) div 2; + ImageRect.Top := ImageRect.Top + ((ImageRect.Bottom - ImageRect.Top) - ItemInfo.ImageSize.cy) div 2; + ImageRect.Right := ImageRect.Left + ItemInfo.ImageSize.cx; + ImageRect.Bottom := ImageRect.Top + ItemInfo.ImageSize.cy; + DrawItemImage(Canvas, ImageRect, ItemInfo, Item.EditImageIndex); + end; + end; + + { Edit Frame } + InternalDrawFrame(Canvas, R, ItemInfo); + InflateRect(R, 1, 0); + + { Editor Image } + if ShowImage then begin + ImgList := GetImageList; + if Assigned(ImgList) and (Item.ImageIndex >= 0) and (Item.ImageIndex <= ImgList.Count - 1) then begin + ImageRect.Left := R.Left + 4; + ImageRect.Right := R.Left + ImgList.Width; + ImageRect.Top := (R.Top + R.Bottom + 1 - ImgList.Height) div 2; + ImageRect.Bottom := ImageRect.Top + ImgList.Height; + + SpDrawImageList(Canvas, ImageRect, ImgList, Item.ImageIndex, Item.Enabled, True); + end; + end; + + { Editor text } + if Length(Item.Text) > 0 then begin + if Item.PasswordChar <> #0 then + S := StringOfChar(Item.PasswordChar, Length(S)) + else + S := Item.Text; + + Canvas.Font.Assign(View.GetFont); + Item.EditorFontSettings.Apply(Canvas.Font); + if Canvas.Font.Color = clNone then + if Item.Enabled then + Canvas.Font.Color := clBtnText + else + Canvas.Font.Color := clGrayText; + InflateRect(R, -2, -1); + if not IsToolbarStyle then + Inc(R.Left, GetIndentBefore + 1) + else + Inc(R.Left, GetIndentBefore + 2); + Dec(R.Right, GetIndentAfter + 1); + Dec(R.Top, 1); + if IsToolbarStyle then + Inc(R.Left, -1); + SpDrawXPText(Canvas, S, R, DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX or Alignments[Item.Alignment]); + end; +end; + +function TSpTBXEditItemViewer.ShowImage: Boolean; +begin + Result := Item.ShowImage; +end; + +procedure TSpTBXEditItemViewer.GetCursor(const Pt: TPoint; var ACursor: HCURSOR); +var + R: TRect; +begin + if not Item.Enabled then + Exit; + GetEditRect(R); + OffsetRect(R, -BoundsRect.Left, -BoundsRect.Top); + InflateRect(R, -2, -2); + if PtInRect(R, Pt) then + ACursor := LoadCursor(0, IDC_IBEAM); +end; + +function TSpTBXEditItemViewer.EditLoop(const CapHandle: HWND): Boolean; + + procedure ControlMessageLoop; + + function PointInWindow(const Wnd: HWND; const P: TPoint): Boolean; + var + W: HWND; + begin + Result := False; + W := WindowFromPoint(P); + if W = 0 then Exit; + if W = Wnd then + Result := True + else + if IsChild(Wnd, W) then + Result := True; + end; + + function ContinueLoop: Boolean; + begin + Result := (ecsContinueLoop in FEditControlStatus) and + not View.IsModalEnding and FEditControl.Focused and Item.Enabled; + { Note: View.IsModalEnding is checked since TTBView.CancelMode doesn't + destroy popup windows; it merely hides them and calls EndModal. So if + IsModalEnding returns True we can infer that CancelMode was likely + called. } + end; + + var + Msg: TMsg; + IsKeypadDigit: Boolean; + V: Integer; + begin + try + while ContinueLoop do begin + { Examine the next message before popping it out of the queue } + if not PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE) then begin + WaitMessage; + Continue; + end; + case Msg.message of + WM_SYSKEYDOWN: begin + { Exit immediately if Alt+[key] or F10 are pressed, but not + Alt+Shift, Alt+`, or Alt+[keypad digit] } + if (Msg.wParam <> VK_MENU) and (Msg.wParam <> VK_SHIFT) and + (Msg.wParam <> VK_HANJA) then begin + IsKeypadDigit := False; + { This detect digits regardless of whether Num Lock is on: } + if Lo(LongRec(Msg.lParam).Hi) <> 0 then + for V := VK_NUMPAD0 to VK_NUMPAD9 do + if MapVirtualKey(V, 0) = Lo(LongRec(Msg.lParam).Hi) then begin + IsKeypadDigit := True; + Break; + end; + if not IsKeypadDigit then begin + FEditControlStatus := [ecsClose]; + Exit; + end; + end; + end; + WM_SYSKEYUP: begin + { Exit when Alt is released by itself } + if Msg.wParam = VK_MENU then begin + FEditControlStatus := [ecsClose]; + Exit; + end; + end; + WM_LBUTTONDOWN, WM_LBUTTONDBLCLK, + WM_RBUTTONDOWN, WM_RBUTTONDBLCLK, + WM_MBUTTONDOWN, WM_MBUTTONDBLCLK, + WM_NCLBUTTONDOWN, WM_NCLBUTTONDBLCLK, + WM_NCRBUTTONDOWN, WM_NCRBUTTONDBLCLK, + WM_NCMBUTTONDOWN, WM_NCMBUTTONDBLCLK: begin + { If a mouse click outside the edit control is in the queue, + exit and let the upstream message loop deal with it } + if Msg.hwnd <> FEditControl.Handle then + Exit; + end; + WM_MOUSEMOVE, WM_NCMOUSEMOVE: begin + if GetCapture = CapHandle then begin + if PointInWindow(FEditControl.Handle, Msg.pt) then + ReleaseCapture; + end + else if GetCapture = 0 then begin + if not PointInWindow(FEditControl.Handle, Msg.pt) then + SetCapture(CapHandle); + end; + if GetCapture = CapHandle then + SetCursor(LoadCursor(0, IDC_ARROW)); + end; + end; + { Now pop the message out of the queue } + if not PeekMessage(Msg, 0, Msg.message, Msg.message, PM_REMOVE or PM_NOYIELD) then + Continue; + if ((Msg.message >= WM_MOUSEFIRST) and (Msg.message <= WM_MOUSELAST)) and + (Msg.hwnd = CapHandle) then + { discard, so that the selection doesn't get changed } + else begin + TranslateMessage(Msg); + DispatchMessage(Msg); + end; + end; + finally + { Make sure there are no outstanding WM_*CHAR messages } + RemoveMessages(WM_CHAR, WM_DEADCHAR); + RemoveMessages(WM_SYSCHAR, WM_SYSDEADCHAR); + end; + end; + +var + R: TRect; + ActiveWnd, FocusWnd: HWND; + S: WideString; +begin + GetEditRect(R); + if IsRectEmpty(R) then begin + Result := False; + Exit; + end; + + ActiveWnd := GetActiveWindow; + FocusWnd := GetFocus; + + { Create the edit control } + InflateRect(R, -3, -3); + FEditControl := GetEditControlClass.Create(nil); + try + FEditControl.Name := Format('%s_edit_control_%p', [ClassName, Pointer(FEditControl)]); + FEditControl.Visible := False; + TCustomEditAccess(FEditControl).ReadOnly := Item.ReadOnly; + TCustomEditAccess(FEditControl).BorderStyle := bsNone; + TCustomEditAccess(FEditControl).AutoSize := False; + TCustomEditAccess(FEditControl).Font.Assign(View.GetFont); + Item.EditorFontSettings.Apply(TCustomEditAccess(FEditControl).Font); + if FEditControl is TSpTBXUnicodeEdit then begin + TSpTBXUnicodeEdit(FEditControl).Alignment := Item.Alignment; + TSpTBXUnicodeEdit(FEditControl).PasswordChar := Item.PasswordChar; + TSpTBXUnicodeEdit(FEditControl).Text := Item.Text + end + else + TCustomEditAccess(FEditControl).Text := Item.Text; + TCustomEditAccess(FEditControl).CharCase := Item.FCharCase; + TCustomEditAccess(FEditControl).MaxLength := Item.FMaxLength; + FEditControl.BoundsRect := R; + FEditControl.WindowProc := EditWndProc; + FEditControl.ParentWindow := View.Window.Handle; + TCustomEditAccess(FEditControl).OnChange := InternalEditControlChange; + FEditControl.SelectAll; + DoBeginEdit; + FEditControl.Visible := True; + FEditControl.SetFocus; + if GetActiveWindow <> ActiveWnd then + SendMessage(ActiveWnd, WM_NCACTIVATE, 1, 0) // Don't gray out title bar of old active window + else + ActiveWnd := 0; + + FEditControlStatus := [ecsContinueLoop]; + ControlMessageLoop; + finally + if FEditControlStatus = [ecsContinueLoop] then + InternalEditControlExit; + S := GetEditControlText; + FreeAndNil(FEditControl); + end; + + if (FEditControlStatus = [ecsContinueLoop]) and Item.ExtendedAccept then + if Item.DoAcceptText(S) then Item.SetTextEx(S, tcrEditControl); + + { ensure the area underneath the edit control is repainted immediately } + View.Window.Update; + { If app is still active, set focus to previous control and restore capture + to CapHandle if another control hasn't taken it } + if GetActiveWindow <> 0 then begin + SetFocus(FocusWnd); + if GetCapture = 0 then + SetCapture(CapHandle); + end; + if ActiveWnd <> 0 then + SendMessage(ActiveWnd, WM_NCACTIVATE, Ord(GetActiveWindow = ActiveWnd), 0); + { The SetFocus call above can change the Z order of windows. If the parent + window is a popup window, reassert its topmostness. } + if View.Window is TTBPopupWindow then + SetWindowPos(View.Window.Handle, HWND_TOPMOST, 0, 0, 0, 0, + SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE); + { Send an MSAA "focus" event now that we're returning to the regular modal loop } + View.NotifyFocusEvent; + + Result := ecsClose in FEditControlStatus; + if not Result and (GetCapture = CapHandle) then begin + if ecsAccept in FEditControlStatus then + { if we are accepting but not closing, Tab must have been pressed } + View.Selected := View.NextSelectable(View.Selected, + GetKeyState(VK_SHIFT) >= 0); + end; +end; + +procedure TSpTBXEditItemViewer.DoBeginEdit; +begin + Item.DoBeginEdit(Self); +end; + +function TSpTBXEditItemViewer.DoExecute: Boolean; +begin + // Close any delay-close popup menus before entering the edit loop + View.CancelChildPopups; + Result := False; + if EditLoop(View.GetCaptureWnd) then begin + View.EndModal; + if ecsAccept in FEditControlStatus then + Result := True; + end; +end; + +function TSpTBXEditItemViewer.MeasureEditCaption: TSize; +begin + StockBitmap.Canvas.Font.Assign(View.GetFont); + Item.FontSettings.Apply(StockBitmap.Canvas.Font); + Result := SpGetTextSize(StockBitmap.Canvas.Handle, Item.EditCaption, True); +end; + +function TSpTBXEditItemViewer.MeasureTextHeight: Integer; +var + I: Integer; +begin + StockBitmap.Canvas.Font.Assign(View.GetFont); + Item.EditorFontSettings.Apply(StockBitmap.Canvas.Font); + GetEditHeight(StockBitmap.Canvas.Handle, Result, I); + Inc(Result, I); +end; + +procedure TSpTBXEditItemViewer.MouseBeginEdit; +begin + if Item.Enabled then + Execute(True) + else begin + if (View.ParentView = nil) and not View.IsPopup then + View.EndModal; + end; +end; + +procedure TSpTBXEditItemViewer.MouseDown(Shift: TShiftState; X, Y: Integer; + var MouseDownOnMenu: Boolean); +begin + if IsPtInButtonPart(X, Y) then + MouseBeginEdit + else + inherited; +end; + +procedure TSpTBXEditItemViewer.MouseUp(X, Y: Integer; MouseWasDownOnMenu: Boolean); +begin + if IsPtInButtonPart(X, Y) then + MouseBeginEdit + else + inherited; +end; + +function TSpTBXEditItemViewer.UsesSameWidth: Boolean; +begin + Result := False; +end; + +function TSpTBXEditItemViewer.GetAccRole: Integer; +const + ROLE_SYSTEM_TEXT = $2a; // from OleAcc.h +begin + Result := ROLE_SYSTEM_TEXT; +end; + +function TSpTBXEditItemViewer.GetAccValue(var Value: WideString): Boolean; +begin + Value := Item.Text; + Result := True; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSpinEditItem } + +constructor TSpTBXSpinEditItem.Create(AOwner: TComponent); +begin + inherited; + FSpinOptions := TSpTBXSpinEditOptions.Create; + FSpinOptions.OnGetText := SpinOptionsGetText; + FSpinOptions.OnSetText := SpinOptionsSetText; + + Alignment := taRightJustify; + Text := '0'; +end; + +destructor TSpTBXSpinEditItem.Destroy; +begin + FreeAndNil(FSpinOptions); + inherited; +end; + +function TSpTBXSpinEditItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + if not FAllowVerticalEditor and (AView.Orientation = tbvoVertical) then + Result := inherited GetItemViewerClass(AView) + else + Result := TSpTBXSpinEditViewer; +end; + +function TSpTBXSpinEditItem.GetValue: Extended; +begin + Result := SpinOptions.Value; +end; + +procedure TSpTBXSpinEditItem.SetValue(const Value: Extended); +begin + SpinOptions.Value := Value; +end; + +function TSpTBXSpinEditItem.GetValueChanged: TNotifyEvent; +begin + Result := SpinOptions.OnValueChanged; +end; + +procedure TSpTBXSpinEditItem.SetValueChanged(const ValueChangedEvent: TNotifyEvent); +begin + SpinOptions.OnValueChanged := ValueChangedEvent; +end; + +procedure TSpTBXSpinEditItem.SpinOptionsGetText(Sender: TObject; + var NewText: WideString; var Accept: Boolean); +begin + // Event used by SpinOptions to get the text from the edit control + NewText := Text; +end; + +procedure TSpTBXSpinEditItem.SpinOptionsSetText(Sender: TObject; + const AText: WideString); +begin + // Event used by SpinOptions to set the edit control text + Text := AText; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSpinEditViewer } + +destructor TSpTBXSpinEditViewer.Destroy; +begin + FreeAndNil(FTimer); + inherited; +end; + +function TSpTBXSpinEditViewer.GetAccRole: Integer; +const + ROLE_SYSTEM_SPINBUTTON = $34; +begin + Result := ROLE_SYSTEM_SPINBUTTON; +end; + +function TSpTBXSpinEditViewer.GetIndentAfter: Integer; +begin + if IsToolbarStyle then + Result := DefaultSpinButtonSize + 1 + else + Result := GetSystemMetrics(SM_CXMENUCHECK) + 1; +end; + +function TSpTBXSpinEditViewer.GetItem: TSpTBXSpinEditItem; +begin + Result := (inherited Item) as TSpTBXSpinEditItem; +end; + +function TSpTBXSpinEditViewer.HandleEditMessage(var Message: TMessage): Boolean; +begin + if Message.Msg = WM_CHAR then + case TWMChar(Message).CharCode of + VK_TAB, VK_RETURN: + begin + Item.Text := EditControl.Text; + Item.SpinOptions.UpdateValueFromText; + EditControl.Text := Item.Text; + end; + end + else + if Message.Msg = WM_KEYDOWN then + case TWMKeyDown(Message).CharCode of + VK_UP: + begin + Item.SpinOptions.ValueInc; + EditControl.Text := Item.Text; + EditControl.SelectAll; + Result := True; + Exit; + end; + VK_DOWN: + begin + Item.SpinOptions.ValueDec; + EditControl.Text := Item.Text; + EditControl.SelectAll; + Result := True; + Exit; + end; + end; + + Result := inherited HandleEditMessage(Message); +end; + +procedure TSpTBXSpinEditViewer.InternalDrawFrame(ACanvas: TCanvas; ARect: TRect; + ItemInfo: TSpTBXMenuItemInfo); +var + IsHotTrack: Boolean; + R: TRect; +begin + inherited; + R := ARect; + InflateRect(R, -2, -2); + R.Left := ARect.Right - GetIndentAfter; + + IsHotTrack := ItemInfo.HotTrack; + SpDrawXPSpinButton(ACanvas, R, ItemInfo.Enabled, IsHotTrack, IsHotTrack, IsHotTrack, FUpPushed, FDownPushed, True, sknSkin); +end; + +procedure TSpTBXSpinEditViewer.InternalEditControlChange(Sender: TObject); +begin + if Item.ExtendedAccept then begin + Item.Text := EditControl.Text; + Item.SpinOptions.UpdateValueFromText(False); // Don't revert when an invalid text is entered + EditControl.Text := Item.Text; + end + else + inherited; +end; + +procedure TSpTBXSpinEditViewer.InternalEditControlExit; +begin + if Item.ExtendedAccept then begin + Item.Text := EditControl.Text; + Item.SpinOptions.UpdateValueFromText; + EditControl.Text := Item.Text; + end; +end; + +procedure TSpTBXSpinEditViewer.InvalidateButtons; +var + R: TRect; +begin + if Show and not IsRectEmpty(BoundsRect) then begin + R := BoundsRect; + R.Left := R.Right - GetIndentAfter; + InvalidateRect(View.Window.Handle, @R, False); + Include(State, tbisInvalidated); + end; +end; + +function TSpTBXSpinEditViewer.IsPtInButtonPart(X, Y: Integer): Boolean; +begin + Result := X <= (BoundsRect.Right - BoundsRect.Left) - GetIndentAfter; +end; + +procedure TSpTBXSpinEditViewer.LosingCapture; +begin + FUpPushed := False; + FDownPushed := False; + FreeAndNil(FTimer); + inherited; +end; + +procedure TSpTBXSpinEditViewer.MouseDown(Shift: TShiftState; X, Y: Integer; + var MouseDownOnMenu: Boolean); +begin + if not Item.Enabled then Exit; + + FUpPushed := False; + FDownPushed := False; + + if X >= BoundsRect.Right - BoundsRect.Left - GetIndentAfter then begin + if Y < (BoundsRect.Bottom - BoundsRect.Top) div 2 then begin + FUpPushed := True; + Item.SpinOptions.ValueInc; + end + else begin + FDownPushed := True; + Item.SpinOptions.ValueDec; + end; + + if not Assigned(FTimer) then begin + FTimer := TTimer.Create(nil); + FTimer.OnTimer := TimerHandler; + end; + FTimer.Interval := 400; + FTimer.Enabled := True; + end; + + if FUpPushed or FDownPushed then begin + InvalidateButtons; + inherited; + View.SetCapture; + end + else + inherited; +end; + +procedure TSpTBXSpinEditViewer.MouseUp(X, Y: Integer; MouseWasDownOnMenu: Boolean); +begin + if FUpPushed or FDownPushed then begin + FUpPushed := False; + FDownPushed := False; + FreeAndNil(FTimer); + InvalidateButtons; + end; + inherited; +end; + +procedure TSpTBXSpinEditViewer.TimerHandler(Sender: TObject); +begin + FTimer.Interval := 100; + if FUpPushed then Item.SpinOptions.ValueInc + else + if FDownPushed then Item.SpinOptions.ValueDec + else FreeAndNil(FTimer); +end; + +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXExtEditors.dcu b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXExtEditors.dcu new file mode 100644 index 0000000000000000000000000000000000000000..f09965c253ccf7b28001d60879ae3248e2651140 GIT binary patch literal 43562 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 IHR&t=2Sl2(ZU6uP literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXExtEditors.hpp b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXExtEditors.hpp new file mode 100644 index 0000000..d04ea9d --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXExtEditors.hpp @@ -0,0 +1,236 @@ +// CodeGear C++Builder +// Copyright (c) 1995, 2008 by CodeGear +// All rights reserved + +// (DO NOT EDIT: machine generated header) 'Sptbxexteditors.pas' rev: 20.00 + +#ifndef SptbxexteditorsHPP +#define SptbxexteditorsHPP + +#pragma delphiheader begin +#pragma option push +#pragma option -w- // All warnings off +#pragma option -Vx // Zero-length empty class member functions +#pragma pack(push,8) +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit + +//-- user supplied ----------------------------------------------------------- + +namespace Sptbxexteditors +{ +//-- type declarations ------------------------------------------------------- +#pragma option push -b- +enum TSpTBXColorListBoxStyle { clbsStandardColors, clbsSystemColors, clbsIncludeNone, clbsIncludeDefault, clbsCustomColor, clbsPrettyNames, clbsNoneAsTransparent }; +#pragma option pop + +typedef Set TSpTBXColorListBoxStyles; + +class DELPHICLASS TSpTBXColorEditButton; +class PASCALIMPLEMENTATION TSpTBXColorEditButton : public Sptbxeditors::TSpTBXEditButton +{ + typedef Sptbxeditors::TSpTBXEditButton inherited; + +private: + Graphics::TColor FSelectedColor; + void __fastcall SetSelectedColor(const Graphics::TColor Value); + +protected: + virtual bool __fastcall DoDrawItem(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxitem::TSpTBXPaintStage PaintStage); + virtual Menus::TPopupMenu* __fastcall GetInternalDropDownMenu(void); + +public: + __property Graphics::TColor SelectedColor = {read=FSelectedColor, write=SetSelectedColor, nodefault}; +public: + /* TSpTBXEditButton.Create */ inline __fastcall virtual TSpTBXColorEditButton(Classes::TComponent* AOwner) : Sptbxeditors::TSpTBXEditButton(AOwner) { } + +public: + /* TSpTBXCustomButton.Destroy */ inline __fastcall virtual ~TSpTBXColorEditButton(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXColorEditButton(HWND ParentWindow) : Sptbxeditors::TSpTBXEditButton(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXColorEdit; +class PASCALIMPLEMENTATION TSpTBXColorEdit : public Sptbxeditors::TSpTBXEdit +{ + typedef Sptbxeditors::TSpTBXEdit inherited; + +private: + TSpTBXColorEditButton* FColorButton; + Sptbxskins::TSpTBXColorTextType FSelectedFormat; + Classes::TNotifyEvent FOnSelectedColorChanged; + Graphics::TColor __fastcall GetSelectedColor(void); + void __fastcall SetSelectedColor(const Graphics::TColor Value); + void __fastcall SetSelectedFormat(const Sptbxskins::TSpTBXColorTextType Value); + HIDESBASE MESSAGE void __fastcall CMExit(Messages::TWMNoParams &Message); + +protected: + DYNAMIC void __fastcall KeyPress(System::WideChar &Key); + virtual void __fastcall Notification(Classes::TComponent* AComponent, Classes::TOperation Operation); + virtual void __fastcall DoSelectedColorChanged(void); + void __fastcall UpdateTextFromValue(void); + void __fastcall UpdateValueFromText(bool RevertWhenInvalid = true); + +public: + __fastcall virtual TSpTBXColorEdit(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXColorEdit(void); + __property TSpTBXColorEditButton* ColorButton = {read=FColorButton}; + +__published: + __property Text = {stored=false}; + __property Graphics::TColor SelectedColor = {read=GetSelectedColor, write=SetSelectedColor, nodefault}; + __property Sptbxskins::TSpTBXColorTextType SelectedFormat = {read=FSelectedFormat, write=SetSelectedFormat, default=2}; + __property Classes::TNotifyEvent OnSelectedColorChanged = {read=FOnSelectedColorChanged, write=FOnSelectedColorChanged}; +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXColorEdit(HWND ParentWindow) : Sptbxeditors::TSpTBXEdit(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXFontComboBoxPreview; +class PASCALIMPLEMENTATION TSpTBXFontComboBoxPreview : public Controls::TCustomControl +{ + typedef Controls::TCustomControl inherited; + +private: + Extctrls::TPanel* FPreviewPanel; + +protected: + virtual void __fastcall CreateParams(Controls::TCreateParams &Params); + +public: + __fastcall virtual TSpTBXFontComboBoxPreview(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXFontComboBoxPreview(void); + __property Extctrls::TPanel* PreviewPanel = {read=FPreviewPanel}; +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXFontComboBoxPreview(HWND ParentWindow) : Controls::TCustomControl(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXFontComboBox; +class PASCALIMPLEMENTATION TSpTBXFontComboBox : public Sptbxeditors::TSpTBXComboBox +{ + typedef Sptbxeditors::TSpTBXComboBox inherited; + +private: + bool FFontPreview; + bool FFontNamePreview; + int FMaxMRUItems; + int FMRUCount; + TSpTBXFontComboBoxPreview* FPreviewWindow; + Graphics::TFontName FSelectedFont; + Sptbxeditors::TSpTBXEditGetTextEvent FOnFontPreview; + void __fastcall UpdateSelectedFont(bool AddMRU); + void __fastcall SetFontNamePreview(const bool Value); + void __fastcall SetSelectedFont(const Graphics::TFontName Value); + void __fastcall SetMaxMRUItems(int Value); + void __fastcall SetFontPreview(const bool Value); + +protected: + DYNAMIC void __fastcall Click(void); + DYNAMIC void __fastcall CloseUp(void); + virtual void __fastcall DoCalcMaxDropDownWidth(void); + virtual void __fastcall DoDrawItem(Graphics::TCanvas* ACanvas, Types::TRect &ARect, int Index, const Windows::TOwnerDrawState State, const Sptbxitem::TSpTBXPaintStage PaintStage, bool &PaintDefault); + DYNAMIC void __fastcall DropDown(void); + +public: + __fastcall virtual TSpTBXFontComboBox(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXFontComboBox(void); + void __fastcall MRUAdd(Graphics::TFontName AFontName); + bool __fastcall MRUDelete(Graphics::TFontName AFontName); + __property int MRUCount = {read=FMRUCount, nodefault}; + +__published: + __property Items = {stored=false}; + __property AutoDropDownWidth = {default=1}; + __property AutoItemHeight = {default=0}; + __property bool FontPreview = {read=FFontPreview, write=SetFontPreview, default=1}; + __property bool FontNamePreview = {read=FFontNamePreview, write=SetFontNamePreview, default=1}; + __property int MaxMRUItems = {read=FMaxMRUItems, write=SetMaxMRUItems, default=5}; + __property Graphics::TFontName SelectedFont = {read=FSelectedFont, write=SetSelectedFont}; + __property Sptbxeditors::TSpTBXEditGetTextEvent OnFontPreview = {read=FOnFontPreview, write=FOnFontPreview}; +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXFontComboBox(HWND ParentWindow) : Sptbxeditors::TSpTBXComboBox(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXColorListBox; +class PASCALIMPLEMENTATION TSpTBXColorListBox : public Sptbxeditors::TSpTBXListBox +{ + typedef Sptbxeditors::TSpTBXListBox inherited; + +private: + bool FItems; + bool FNeedToPopulate; + Graphics::TColor FSelectedColor; + TSpTBXColorListBoxStyles FStyle; + void __fastcall ColorCallBack(const System::UnicodeString AName); + System::UnicodeString __fastcall GetColorName(int Index); + Graphics::TColor __fastcall GetColor(int Index); + HIDESBASE Graphics::TColor __fastcall GetSelected(void); + HIDESBASE void __fastcall SetSelected(const Graphics::TColor Value); + HIDESBASE void __fastcall SetStyle(const TSpTBXColorListBoxStyles Value); + +protected: + virtual void __fastcall CreateWnd(void); + virtual void __fastcall Loaded(void); + DYNAMIC void __fastcall DblClick(void); + DYNAMIC void __fastcall KeyPress(System::WideChar &Key); + virtual void __fastcall DoDrawItem(Graphics::TCanvas* ACanvas, Types::TRect &ARect, int Index, const Windows::TOwnerDrawState State, const Sptbxitem::TSpTBXPaintStage PaintStage, bool &PaintDefault); + bool __fastcall PickCustomColor(void); + void __fastcall PopulateList(void); + +public: + __fastcall virtual TSpTBXColorListBox(Classes::TComponent* AOwner); + void __fastcall AddColor(Graphics::TColor AColor, System::UnicodeString AColorName); + int __fastcall ColorCount(void); + __property Graphics::TColor Colors[int Index] = {read=GetColor}; + __property System::UnicodeString ColorNames[int Index] = {read=GetColorName}; + +__published: + __property bool Items = {read=FItems, nodefault}; + __property Graphics::TColor Selected = {read=GetSelected, write=SetSelected, default=0}; + __property TSpTBXColorListBoxStyles Style = {read=FStyle, write=SetStyle, default=67}; +public: + /* TSpTBXListBox.Destroy */ inline __fastcall virtual ~TSpTBXColorListBox(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXColorListBox(HWND ParentWindow) : Sptbxeditors::TSpTBXListBox(ParentWindow) { } + +}; + + +//-- var, const, procedure --------------------------------------------------- +extern PACKAGE Controls::TImageList* FontGlyphImgList; +extern PACKAGE void __fastcall SpFillFontNames(Classes::TStrings* ADest); +extern PACKAGE void __fastcall SpDrawCheckeredBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect); +extern PACKAGE void __fastcall SpDrawColorDropDownButton(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool Pushed, Graphics::TColor AColor, bool CheckeredBkgndWhenTransparent = true); + +} /* namespace Sptbxexteditors */ +using namespace Sptbxexteditors; +#pragma pack(pop) +#pragma option pop + +#pragma delphiheader end. +//-- end unit ---------------------------------------------------------------- +#endif // SptbxexteditorsHPP diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXExtEditors.pas b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXExtEditors.pas new file mode 100644 index 0000000..e92918c --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXExtEditors.pas @@ -0,0 +1,1068 @@ +unit SpTBXExtEditors; + +{============================================================================== +Version 2.4.2 + +The contents of this file are subject to the SpTBXLib License; you may +not use or distribute this file except in compliance with the +SpTBXLib License. +A copy of the SpTBXLib License may be found in SpTBXLib-LICENSE.txt or at: + http://www.silverpointdevelopment.com/sptbxlib/SpTBXLib-LICENSE.htm + +Alternatively, the contents of this file may be used under the terms of the +Mozilla Public License Version 1.1 (the "MPL v1.1"), in which case the provisions +of the MPL v1.1 are applicable instead of those in the SpTBXLib License. +A copy of the MPL v1.1 may be found in MPL-LICENSE.txt or at: + http://www.mozilla.org/MPL/ + +If you wish to allow use of your version of this file only under the terms of +the MPL v1.1 and not to allow others to use your version of this file under the +SpTBXLib License, indicate your decision by deleting the provisions +above and replace them with the notice and other provisions required by the +MPL v1.1. If you do not delete the provisions above, a recipient may use your +version of this file under either the SpTBXLib License or the MPL v1.1. + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for +the specific language governing rights and limitations under the License. + +The initial developer of this code is Robert Lee. + +Requirements: +For Delphi/C++Builder 2009 or newer: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org +For Delphi/C++Builder 7-2007: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org + - Troy Wolbrink's TNT Unicode Controls + http://www.tntware.com/delphicontrols/unicode/ + +Development notes: + - All the Windows and Delphi bugs fixes are marked with '[Bugfix]'. + - All the theme changes and adjustments are marked with '[Theme-Change]'. + +To Do: + - Rotated caption painting. + +Known Issues: + - + +History: +8 May 2009 - version 2.4.2 + - No changes. + +15 March 2009 - version 2.4.1 + - No changes. + +17 January 2009 - version 2.4 + - Initial release. + +==============================================================================} + +interface + +{$BOOLEVAL OFF} // Unit depends on short-circuit boolean evaluation + +uses + Windows, Messages, Classes, SysUtils, Controls, Graphics, ImgList, Forms, + Menus, StdCtrls, ExtCtrls, + SpTBXSkins, SpTBXItem, SpTBXEditors; + +type + TSpTBXColorListBoxStyle = ( + clbsStandardColors, // First 16 RGBI colors + 4 additional extended colors + clbsSystemColors, // System colors + clbsIncludeNone, // Include clNone color + clbsIncludeDefault, // Include clDefault color + clbsCustomColor, // First color is customizable + clbsPrettyNames, // Draw text with pretty names + clbsNoneAsTransparent // Draw clNone as transparent color + ); + TSpTBXColorListBoxStyles = set of TSpTBXColorListBoxStyle; + + { TSpTBXColorEditButton } + + TSpTBXColorEditButton = class(TSpTBXEditButton) + private + FSelectedColor: TColor; + procedure SetSelectedColor(const Value: TColor); + protected + function DoDrawItem(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage): Boolean; override; + function GetInternalDropDownMenu: TPopupMenu; override; + public + property SelectedColor: TColor read FSelectedColor write SetSelectedColor; + end; + + { TSpTBXColorEdit } + + TSpTBXColorEdit = class(TSpTBXEdit) + private + FColorButton: TSpTBXColorEditButton; + FSelectedFormat: TSpTBXColorTextType; + FOnSelectedColorChanged: TNotifyEvent; + function GetSelectedColor: TColor; + procedure SetSelectedColor(const Value: TColor); + procedure SetSelectedFormat(const Value: TSpTBXColorTextType); + procedure CMExit(var Message: TCMExit); message CM_EXIT; + protected + procedure KeyPress(var Key: Char); override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure DoSelectedColorChanged; virtual; + procedure UpdateTextFromValue; + procedure UpdateValueFromText(RevertWhenInvalid: Boolean = True); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + property ColorButton: TSpTBXColorEditButton read FColorButton; + published + property Text stored False; + property SelectedColor: TColor read GetSelectedColor write SetSelectedColor; + property SelectedFormat: TSpTBXColorTextType read FSelectedFormat write SetSelectedFormat default cttIdentAndHTML; + property OnSelectedColorChanged: TNotifyEvent read FOnSelectedColorChanged write FOnSelectedColorChanged; + end; + + { TSpTBXFontComboBox } + + TSpTBXFontComboBoxPreview = class(TCustomControl) + private + FPreviewPanel: TPanel; + protected + procedure CreateParams(var Params: TCreateParams); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + property PreviewPanel: TPanel read FPreviewPanel; + end; + + TSpTBXFontComboBox = class(TSpTBXComboBox) + private + FFontPreview: Boolean; + FFontNamePreview: Boolean; + FMaxMRUItems: Integer; + FMRUCount: Integer; + FPreviewWindow: TSpTBXFontComboBoxPreview; + FSelectedFont: TFontName; + FOnFontPreview: TSpTBXEditGetTextEvent; + procedure UpdateSelectedFont(AddMRU: Boolean); + procedure SetFontNamePreview(const Value: Boolean); + procedure SetSelectedFont(const Value: TFontName); + procedure SetMaxMRUItems(Value: Integer); + procedure SetFontPreview(const Value: Boolean); + protected + procedure Click; override; + procedure CloseUp; override; + procedure DoCalcMaxDropDownWidth; override; + procedure DoDrawItem(ACanvas: TCanvas; var ARect: TRect; Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); override; + procedure DropDown; override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure MRUAdd(AFontName: TFontName); + function MRUDelete(AFontName: TFontName): Boolean; + property MRUCount: Integer read FMRUCount; + published + property Items stored False; + property AutoDropDownWidth default True; + property AutoItemHeight default False; + property FontPreview: Boolean read FFontPreview write SetFontPreview default True; + property FontNamePreview: Boolean read FFontNamePreview write SetFontNamePreview default True; + property MaxMRUItems: Integer read FMaxMRUItems write SetMaxMRUItems default 5; + property SelectedFont: TFontName read FSelectedFont write SetSelectedFont; + property OnFontPreview: TSpTBXEditGetTextEvent read FOnFontPreview write FOnFontPreview; + end; + + { TSpTBXColorListBox } + + TSpTBXColorListBox = class(TSpTBXListBox) + private + FItems: Boolean; + FNeedToPopulate: Boolean; + FSelectedColor: TColor; + FStyle: TSpTBXColorListBoxStyles; + procedure ColorCallBack(const AName: string); + function GetColorName(Index: Integer): string; + function GetColor(Index: Integer): TColor; + function GetSelected: TColor; + procedure SetSelected(const Value: TColor); + procedure SetStyle(const Value: TSpTBXColorListBoxStyles); + protected + procedure CreateWnd; override; + procedure Loaded; override; + procedure DblClick; override; + procedure KeyPress(var Key: Char); override; + procedure DoDrawItem(ACanvas: TCanvas; var ARect: TRect; Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); override; + function PickCustomColor: Boolean; + procedure PopulateList; + public + constructor Create(AOwner: TComponent); override; + procedure AddColor(AColor: TColor; AColorName: string); + function ColorCount: Integer; + property Colors[Index: Integer]: TColor read GetColor; + property ColorNames[Index: Integer]: string read GetColorName; + published + property Items: Boolean read FItems; // Hides inherited Items property + property Selected: TColor read GetSelected write SetSelected default clBlack; + property Style: TSpTBXColorListBoxStyles read FStyle write SetStyle default [clbsStandardColors, clbsSystemColors, clbsNoneAsTransparent]; // Hides inherited Style property + end; + +{ Helpers } +procedure SpFillFontNames(ADest: TStrings); + +{ Painting helpers } +procedure SpDrawCheckeredBackground(ACanvas: TCanvas; ARect: TRect); +procedure SpDrawColorDropDownButton(ACanvas: TCanvas; ARect: TRect; Pushed: Boolean; AColor: TColor; CheckeredBkgndWhenTransparent: Boolean = True); + +var + FontGlyphImgList: TImageList = nil; + +implementation + +uses + Dialogs, TB2Common, SpTBXFormPopupMenu, SpTBXColorPickerForm; + +var + DefaultColorPickerDropDownMenu: TSpTBXColorEditPopupMenu = nil; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Helpers } + +procedure SpFillFontNames(ADest: TStrings); +// This will only work on Windows 2000 and above, more info on: +// http://www.delphipraxis.net/post712587.html&sid=945c12fa9fb826d76e51c80b42109a21#712587 + + function EnumFontsProcWin9x(EnumLogFontEx: PEnumLogFontEx; NewTextMetric: PNewTextMetric; + FontType: DWORD; LParam: LPARAM): Integer; stdcall; + var + S: string; + GlyphIndex: Integer; + L: TStrings; + const + NTM_PS_OPENTYPE = $00020000; + NTM_TT_OPENTYPE = $00040000; + begin + L := TStrings(LParam); + if FontType = TRUETYPE_FONTTYPE then + GlyphIndex := 1 + else + GlyphIndex := 0; + + S := EnumLogFontEx.elfLogFont.lfFaceName; + + if (S[1] <> '@') then + if (L.Count = 0) or not SameText(S, L[L.Count - 1]) then + L.AddObject(S, Pointer(GlyphIndex)); + + Result := 1; + end; + + function EnumFontsProc(EnumLogFontExDV: PEnumLogFontExDV; EnumTextMetric: PEnumTextMetric; + FontType: DWORD; LParam: LPARAM): Integer; stdcall; + var + S: string; + GlyphIndex: Integer; + L: TStrings; + const + NTM_PS_OPENTYPE = $00020000; + NTM_TT_OPENTYPE = $00040000; + begin + L := TStrings(LParam); + GlyphIndex := 0; + if ((EnumTextMetric.etmNewTextMetricEx.ntmTm.ntmFlags and NTM_TT_OPENTYPE) = NTM_TT_OPENTYPE) or + ((EnumTextMetric.etmNewTextMetricEx.ntmTm.ntmFlags and NTM_PS_OPENTYPE) = NTM_PS_OPENTYPE) then + GlyphIndex := 2 + else + if FontType = TRUETYPE_FONTTYPE then + GlyphIndex := 1; + + S := EnumLogFontExDV.elfEnumLogfontEx.elfLogFont.lfFaceName; + + if (S[1] <> '@') then + if (L.Count = 0) or not SameText(S, L[L.Count - 1]) then + L.AddObject(S, Pointer(GlyphIndex)); + + Result := 1; + end; + +var + DC: HDC; + LFont: TLogFont; + L: TStringList; +begin + L := TStringList.Create; + DC := GetDC(0); + try + FillChar(LFont, SizeOf(LFont), 0); + LFont.lfCharset := DEFAULT_CHARSET; + if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then + EnumFontFamiliesEx(DC, LFont, @EnumFontsProcWin9x, LongInt(L), 0) + else + EnumFontFamiliesEx(DC, LFont, @EnumFontsProc, LongInt(L), 0); + L.Sort; + ADest.Assign(L); + finally + ReleaseDC(0, DC); + L.Free; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Painting helpers } + +procedure SpDrawCheckeredBackground(ACanvas: TCanvas; ARect: TRect); +// Draws a 2x2 white and silver checkered background +var + R: TRect; + I, J, HCount, WCount: Integer; +const + Size = 2; +begin + WCount := (ARect.Right - ARect.Left) div Size; + HCount := (ARect.Bottom - ARect.Top) div Size; + for J := 0 to HCount do + for I := 0 to WCount do begin + R := Bounds(ARect.Left + (I * Size), ARect.Top + (J * Size), Size, Size); + if R.Right > ARect.Right then + R.Right := ARect.Right; + if R.Bottom > ARect.Bottom then + R.Bottom := ARect.Bottom; + if (I + J) mod 2 = 0 then + ACanvas.Brush.Color := clWhite + else + ACanvas.Brush.Color := clSilver; + ACanvas.FillRect(R); + end; +end; + +procedure SpDrawColorDropDownButton(ACanvas: TCanvas; ARect: TRect; + Pushed: Boolean; AColor: TColor; CheckeredBkgndWhenTransparent: Boolean); +// Draws a button used for color editboxes +var + R: TRect; +begin + R := ARect; + + ACanvas.Brush.Color := clBtnFace; + ACanvas.FillRect(R); + if not Pushed then + SpDrawRectangle(ACanvas, R, 0, clBtnHighlight, clBtnShadow); + + InflateRect(R, -2, -2); + if (AColor = clNone) and CheckeredBkgndWhenTransparent then begin + // Draw a checkered background when clNone is used + SpDrawCheckeredBackground(ACanvas, R); + end + else begin + ACanvas.Brush.Color := AColor; + ACanvas.FillRect(R); + end; + SpDrawRectangle(ACanvas, R, 0, clBtnShadow, clBtnHighlight); + + R := ARect; + R.Left := R.Right - 9; + R.Top := R.Bottom - 7; + ACanvas.Brush.Color := clBtnFace; + ACanvas.FillRect(R); + if Pushed then + SpDrawRectangle(ACanvas, R, 0, clBtnHighlight, clBtnFace) + else + SpDrawRectangle(ACanvas, R, 0, clBtnHighlight, clBtnShadow); + SpDrawArrow(ACanvas, R.Left + (R.Right - R.Left) div 2, R.Top + (R.Bottom - R.Top) div 2 - 1, clBlack, True, False, 2); + + R := ARect; + InflateRect(R, -1, -1); + SpDrawRectangle(ACanvas, R, 0, clBtnFace, clBtnFace); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXColorEditButton } + +function TSpTBXColorEditButton.DoDrawItem(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage): Boolean; +begin + if (PaintStage = pstPrePaint) and not BitmapValid then begin + Result := True; + if Assigned(OnDraw) then OnDraw(Self, ACanvas, ARect, PaintStage, Result); + if Result then + SpDrawColorDropDownButton(ACanvas, ARect, Pushed, FSelectedColor); + end + else + Result := inherited DoDrawItem(ACanvas, ARect, PaintStage); +end; + +function TSpTBXColorEditButton.GetInternalDropDownMenu: TPopupMenu; +begin + if Assigned(DropDownMenu) then + Result := DropDownMenu + else + Result := DefaultColorPickerDropDownMenu; +end; + +procedure TSpTBXColorEditButton.SetSelectedColor(const Value: TColor); +begin + if FSelectedColor <> Value then begin + FSelectedColor := Value; + Invalidate; + if Owner is TSpTBXColorEdit then begin + TSpTBXColorEdit(Owner).UpdateTextFromValue; + TSpTBXColorEdit(Owner).DoSelectedColorChanged; + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXColorEdit } + +constructor TSpTBXColorEdit.Create(AOwner: TComponent); +begin + inherited; + + FSelectedFormat := cttIdentAndHTML; + + FColorButton := TSpTBXColorEditButton.Create(Self); + FColorButton.Parent := Self; + FColorButton.FreeNotification(Self); + FColorButton.Align := alRight; + FColorButton.Width := 19; + UpdateEditRect; + + Text := 'clBlack'; +end; + +destructor TSpTBXColorEdit.Destroy; +begin + FreeAndNil(FColorButton); + inherited; +end; + +procedure TSpTBXColorEdit.DoSelectedColorChanged; +begin + if Assigned(FOnSelectedColorChanged) then FOnSelectedColorChanged(Self); +end; + +procedure TSpTBXColorEdit.KeyPress(var Key: Char); +begin + inherited; + if Key = #13 then begin + Key := #0; + UpdateValueFromText; + if FColorButton.IsDroppedDown and Assigned(ActiveFormPopupMenu) then + ActiveFormPopupMenu.ClosePopup(False); + end; +end; + +procedure TSpTBXColorEdit.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if (AComponent = FColorButton) and (Operation = opRemove) then + FColorButton := nil; +end; + +function TSpTBXColorEdit.GetSelectedColor: TColor; +begin + Result := FColorButton.SelectedColor; +end; + +procedure TSpTBXColorEdit.SetSelectedColor(const Value: TColor); +begin + FColorButton.SelectedColor := Value; +end; + +procedure TSpTBXColorEdit.SetSelectedFormat(const Value: TSpTBXColorTextType); +begin + if FSelectedFormat <> Value then begin + FSelectedFormat := Value; + UpdateTextFromValue; + end; +end; + +procedure TSpTBXColorEdit.UpdateTextFromValue; +begin + if (SelectedColor = clNone) or (SelectedColor = clDefault) then + Text := ColorToString(SelectedColor) + else + Text := SpColorToString(SelectedColor, FSelectedFormat); + SelStart := Length(Text); +end; + +procedure TSpTBXColorEdit.UpdateValueFromText(RevertWhenInvalid: Boolean = True); +var + WS: WideString; + PrevValue, NewValue, C: TColor; +begin + PrevValue := SelectedColor; + NewValue := SelectedColor; + WS := Text; + + // Try to parse the text to get the value + WS := Trim(WS); + if SpStringToColor(WS, C) then + NewValue := C; + + if RevertWhenInvalid or (NewValue <> PrevValue) then begin + SetSelectedColor(NewValue); + UpdateTextFromValue; + end; +end; + +procedure TSpTBXColorEdit.CMExit(var Message: TCMExit); +begin + inherited; + UpdateValueFromText; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXFontComboBoxPreview } + +constructor TSpTBXFontComboBoxPreview.Create(AOwner: TComponent); +begin + inherited; + + Visible := False; + SetBounds(0, 0, 0, 0); + Color := clWindow; + FPreviewPanel := TPanel.Create(Self); + FPreviewPanel.Parent := Self; + FPreviewPanel.Color := clWindow; + FPreviewPanel.BevelOuter := bvNone; + FPreviewPanel.Align := alClient; +end; + +procedure TSpTBXFontComboBoxPreview.CreateParams(var Params: TCreateParams); +const + CS_DROPSHADOW = $00020000; +begin + inherited; + with Params do begin + Style := (Style and not (WS_CHILD or WS_GROUP or WS_TABSTOP)) or WS_POPUP; + ExStyle := ExStyle or WS_EX_TOPMOST or WS_EX_TOOLWINDOW; + WindowClass.Style := WindowClass.Style or CS_SAVEBITS; + if IsWindowsXP then + WindowClass.Style := WindowClass.Style or CS_DROPSHADOW; + end; +end; + +destructor TSpTBXFontComboBoxPreview.Destroy; +begin + FreeAndNil(FPreviewPanel); + + inherited; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXFontComboBox } + +constructor TSpTBXFontComboBox.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FAutoDropDownWidthRightMargin := 60; + FFontNamePreview := True; + FFontPreview := True; + FMaxMRUItems := 5; + FMRUCount := 0; + AutoItemHeight := False; + AutoDropDownWidth := True; + ItemHeight := 23; +end; + +destructor TSpTBXFontComboBox.Destroy; +begin + FreeAndNil(FPreviewWindow); + inherited; +end; + +procedure TSpTBXFontComboBox.Click; +begin + UpdateSelectedFont(False); + inherited; +end; + +procedure TSpTBXFontComboBox.CloseUp; +begin + UpdateSelectedFont(True); + inherited; + FreeAndNil(FPreviewWindow); +end; + +procedure TSpTBXFontComboBox.DropDown; +var + W: Integer; + P: TPoint; + Sz: TSize; + WS: WideString; +begin + inherited; + + if FFontPreview then begin + WS := 'AaBbYyZz'; + FPreviewWindow := TSpTBXFontComboBoxPreview.Create(Self); + FPreviewWindow.ParentWindow := Application.Handle; + FPreviewWindow.PreviewPanel.Font.Size := 14; + + if Assigned(FOnFontPreview) then FOnFontPreview(Self, WS); + + FPreviewWindow.PreviewPanel.Caption := WS; + Sz := SpGetControlTextSize(FPreviewWindow.PreviewPanel, FPreviewWindow.PreviewPanel.Font, WS); + Inc(Sz.cx, 100); + Inc(Sz.cy, 20); + + W := SendMessage(Handle, CB_GETDROPPEDWIDTH, 0, 0); + P := Parent.ClientToScreen(Point(Left, Top)); + + if P.X + W + Sz.cx > Screen.Width then + Dec(P.X, Sz.cx) + else + Inc(P.X, W); + if P.Y + Height + Sz.cy > Screen.Height then + Dec(P.Y, Sz.cy) + else + Inc(P.Y, Height); + FPreviewWindow.SetBounds(P.X, P.Y, Sz.cx, Sz.cy); + FPreviewWindow.Visible := True; + ShowWindow(FPreviewWindow.Handle, SW_SHOWNA); + end; +end; + +procedure TSpTBXFontComboBox.DoCalcMaxDropDownWidth; +begin + if Items.Count <= 0 then begin + {$IFNDEF UNICODE} + SpFillFontNames(Items.AnsiStrings); + {$ELSE} + SpFillFontNames(Items); + {$ENDIF} + end; + + inherited; +end; + +procedure TSpTBXFontComboBox.DoDrawItem(ACanvas: TCanvas; var ARect: TRect; + Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +var + Flags, ImageIndex: Integer; + R: TRect; +const + Spacing = 4; +begin + inherited DoDrawItem(ACanvas, ARect, Index, State, PaintStage, PaintDefault); + if (PaintStage = pstPrePaint) and PaintDefault then begin + PaintDefault := False; // Override the default painting + // Draw the item glyph if the font is TrueType/OpenType + R := ARect; + R.Left := Spacing; + R.Top := R.Top + ((R.Bottom - R.Top) - FontGlyphImgList.Height) div 2; + ImageIndex := Integer(Items.Objects[Index]) - 1; + if ImageIndex > -1 then + FontGlyphImgList.Draw(ACanvas, R.Left, R.Top, ImageIndex); + + // Draw the item text + R := ARect; + R.Left := Spacing + FontGlyphImgList.Width + Spacing; + if FFontNamePreview then + ACanvas.Font.Name := Items[Index]; + Flags := DrawTextBiDiModeFlags(DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX); + SpDrawXPText(ACanvas, Items[Index], R, Flags); + + // Draw the MRU separator line + if FMaxMRUItems > 0 then begin + if Index = MRUCount - 1 then + SpDrawLine(ACanvas, ARect.Left, ARect.Bottom - 1, ARect.Right, ARect.Bottom - 1, $C0C0C0); + if Index = MRUCount then + SpDrawLine(ACanvas, ARect.Left, ARect.Top, ARect.Right, ARect.Top, $C0C0C0); + end; + + // Update the Font of the PreviewWindow + if Assigned(FPreviewWindow) and (odSelected in State) then + FPreviewWindow.PreviewPanel.Font.Name := Items[Index]; + end; +end; + +procedure TSpTBXFontComboBox.MRUAdd(AFontName: TFontName); +var + I, AFontNameIndex: Integer; +begin + AFontNameIndex := Items.IndexOf(AFontName); + if (AFontNameIndex > -1) and (FMRUCount < Items.Count) and (FMaxMRUItems > 0) then begin + // Exit if it's already on the list + for I := 0 to FMRUCount - 1 do + if SameText(AFontName, Items[I]) then Exit; + + // Add the font to the top and delete the last MRU item if necessary + Items.InsertObject(0, Items[AFontNameIndex], Items.Objects[AFontNameIndex]); + if FMRUCount >= FMaxMRUItems then + Items.Delete(FMRUCount) + else + Inc(FMRUCount); + end; +end; + +function TSpTBXFontComboBox.MRUDelete(AFontName: TFontName): Boolean; +var + I: Integer; +begin + Result := False; + for I := 0 to FMRUCount - 1 do + if SameText(AFontName, Items[I]) then begin + Items.Delete(I); + Result := True; + Break; + end; +end; + +procedure TSpTBXFontComboBox.SetMaxMRUItems(Value: Integer); +begin + if Value < 0 then Value := 0; + if FMaxMRUItems <> Value then begin + FMaxMRUItems := Value; + while FMRUCount > FMaxMRUItems do begin + Items.Delete(FMRUCount); + Dec(FMRUCount); + end; + end; +end; + +procedure TSpTBXFontComboBox.SetFontNamePreview(const Value: Boolean); +begin + if FFontNamePreview <> Value then begin + FFontNamePreview := Value; + Invalidate; + end; +end; + +procedure TSpTBXFontComboBox.SetFontPreview(const Value: Boolean); +begin + FFontPreview := Value; +end; + +procedure TSpTBXFontComboBox.SetSelectedFont(const Value: TFontName); +var + I: Integer; +begin + I := Items.IndexOf(Value); + if ItemIndex <> I then + ItemIndex := I; + UpdateSelectedFont(True); + + // If the Value is not valid clear the text and call the click events + if I = -1 then begin + Click; + Select; + end; +end; + +procedure TSpTBXFontComboBox.UpdateSelectedFont(AddMRU: Boolean); +var + I: Integer; +begin + I := ItemIndex; + if I > -1 then begin + FSelectedFont := Items[I]; + if AddMRU then + MRUAdd(FSelectedFont); + end + else + FSelectedFont := ''; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXColorListBox } + +constructor TSpTBXColorListBox.Create(AOwner: TComponent); +begin + inherited; + FStyle := [clbsStandardColors, clbsSystemColors, clbsNoneAsTransparent]; + FSelectedColor := clBlack; + PopulateList; +end; + +procedure TSpTBXColorListBox.CreateWnd; +begin + inherited CreateWnd; + if FNeedToPopulate then + PopulateList; +end; + +procedure TSpTBXColorListBox.DblClick; +begin + inherited; + if ItemIndex = 0 then + PickCustomColor; +end; + +procedure TSpTBXColorListBox.Loaded; +begin + inherited; + Selected := FSelectedColor; + if FNeedToPopulate then + PopulateList; +end; + +procedure TSpTBXColorListBox.AddColor(AColor: TColor; AColorName: string); +begin + (inherited Items).AddObject(AColorName, TObject(AColor)); +end; + +procedure TSpTBXColorListBox.ColorCallBack(const AName: string); +var + I, LStart: Integer; + LColor: TColor; + LName: string; +begin + LColor := StringToColor(AName); + if clbsPrettyNames in Style then begin + if AName = 'clBtnFace' then LName := 'Button Face' + else if AName = 'clBtnHighlight' then LName := 'Button Highlight' + else if AName = 'clBtnShadow' then LName := 'Button Shadow' + else if AName = 'clBtnText' then LName := 'Button Text' + else if AName = 'clMedGray' then LName := 'Medium Gray' + else if AName = 'clInfoBk' then LName := 'Info Background' + else if AName = 'cl3DDkShadow' then LName := '3D Dark Shadow' + else if AName = 'cl3DLight' then LName := '3D Light' + else begin + // Remove the 'cl' prefix and separate the words with a space + if Copy(AName, 1, 2) = 'cl' then + LStart := 3 + else + LStart := 1; + LName := ''; + for I := LStart to Length(AName) do begin + case AName[I] of + 'A'..'Z': + if LName <> '' then + LName := LName + ' '; + end; + LName := LName + AName[I]; + end; + end; + end + else + LName := AName; + + AddColor(LColor, LName); +end; + +function TSpTBXColorListBox.ColorCount: Integer; +begin + Result := (inherited Items).Count; +end; + +procedure TSpTBXColorListBox.DoDrawItem(ACanvas: TCanvas; var ARect: TRect; + Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +var + R: TRect; + SavedBrushColor: TColor; +begin + if PaintStage = pstPrePaint then begin + // Paint the color glyphs + R := ARect; + R.Right := R.Left + 16 + 5; + ARect.Left := R.Right + 1; + inherited DoDrawItem(ACanvas, ARect, Index, State, PaintStage, PaintDefault); + if PaintDefault then begin + SavedBrushColor := ACanvas.Brush.Color; + try + InflateRect(R, -1, -1); + + ACanvas.Brush.Color := Colors[Index]; + if (ACanvas.Brush.Color = clNone) and (clbsNoneAsTransparent in Style) then + SpDrawCheckeredBackground(ACanvas, R) + else + ACanvas.FillRect(R); + + if odSelected in State then + ACanvas.Brush.Color := clWhite + else + ACanvas.Brush.Color := clBlack; + ACanvas.FrameRect(R); + finally + ACanvas.Brush.Color := SavedBrushColor; + end; + end; + end + else + inherited DoDrawItem(ACanvas, ARect, Index, State, PaintStage, PaintDefault); +end; + +function TSpTBXColorListBox.GetColor(Index: Integer): TColor; +begin + Result := TColor((inherited Items).Objects[Index]); +end; + +function TSpTBXColorListBox.GetColorName(Index: Integer): string; +begin + Result := (inherited Items)[Index]; +end; + +function TSpTBXColorListBox.GetSelected: TColor; +begin + if HandleAllocated then + if ItemIndex <> -1 then + Result := Colors[ItemIndex] + else + Result := clNone + else + Result := FSelectedColor; +end; + +procedure TSpTBXColorListBox.KeyPress(var Key: Char); +begin + inherited KeyPress(Key); + if (clbsCustomColor in Style) and (Key = #13) and (ItemIndex = 0) then begin + Key := #0; + PickCustomColor; + end; +end; + +function TSpTBXColorListBox.PickCustomColor: Boolean; +var + LColor: TColor; + CD: TColorDialog; +begin + Result := False; + if not (clbsCustomColor in Style) then Exit; + + CD := TColorDialog.Create(nil); + try + LColor := ColorToRGB(Colors[0]); + CD.Color := LColor; + CD.CustomColors.Text := Format('ColorA=%.8x', [LColor]); + CD.Options := CD.Options + [cdFullOpen]; + Result := CD.Execute; + if Result then begin + (inherited Items).Objects[0] := TObject(CD.Color); + Invalidate; + end; + finally + CD.Free; + end; +end; + +procedure TSpTBXColorListBox.PopulateList; + + procedure DeleteRange(const AMin, AMax: Integer); + var + I: Integer; + begin + for I := AMax downto AMin do + (inherited Items).Delete(I); + end; + + procedure DeleteColor(const AColor: TColor); + var + I: Integer; + begin + I := (inherited Items).IndexOfObject(TObject(AColor)); + if I <> -1 then + (inherited Items).Delete(I); + end; + +var + LSelectedColor, LCustomColor: TColor; +begin + if HandleAllocated and not (csLoading in ComponentState) then begin + (inherited Items).BeginUpdate; + try + // Get the custom color + LCustomColor := clBlack; + if (clbsCustomColor in Style) and ((inherited Items).Count > 0) then + LCustomColor := TColor((inherited Items).Objects[0]); + + LSelectedColor := FSelectedColor; + (inherited Items).Clear; + + GetColorValues(ColorCallBack); + if not (clbsIncludeNone in Style) then + DeleteColor(clNone); + if not (clbsIncludeDefault in Style) then + DeleteColor(clDefault); + if not (clbsSystemColors in Style) then + DeleteRange(StandardColorsCount + ExtendedColorsCount, (inherited Items).Count - 1); + if not (clbsStandardColors in Style) then + DeleteRange(0, StandardColorsCount + ExtendedColorsCount - 1); + + if clbsCustomColor in Style then + (inherited Items).InsertObject(0, '...', TObject(LCustomColor)); + + Selected := LSelectedColor; + finally + (inherited Items).EndUpdate; + FNeedToPopulate := False; + end; + end + else + FNeedToPopulate := True; +end; + +procedure TSpTBXColorListBox.SetSelected(const Value: TColor); +var + I, J: Integer; +begin + if HandleAllocated then begin + I := (inherited Items).IndexOfObject(TObject(Value)); + if (I = -1) and (clbsCustomColor in Style) then begin + // If the color is not on the list add it and select it + (inherited Items).Objects[0] := TObject(Value); + I := 0; + end + else + if (clbsCustomColor in Style) and (I = 0) then begin + // Try to find the color on the list before selecting the 1st custom color + for J := 1 to (inherited Items).Count - 1 do + if (inherited Items).Objects[J] = TObject(Value) then begin + I := J; + Break; + end; + end; + + if (ItemIndex = 0) and (I = 0) then + Invalidate + else + ItemIndex := I; + end; + + FSelectedColor := Value; +end; + +procedure TSpTBXColorListBox.SetStyle(const Value: TSpTBXColorListBoxStyles); +begin + if Style <> Value then begin + FStyle := Value; + Enabled := ([clbsStandardColors, clbsSystemColors, clbsCustomColor] * FStyle) <> []; + PopulateList; + if (ColorCount > 0) and (ItemIndex = -1) then + ItemIndex := 0; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Stock Objects } + +procedure InitializeStock; +begin + Screen.Cursors[crSpTBXEyeDropper] := LoadCursor(HInstance, 'CZEYEDROPPER'); + + FontGlyphImgList := TImageList.CreateSize(12, 12); + FontGlyphImgList.ResInstLoad(HInstance, rtBitmap, 'SPTBXTRUETYPE', clFuchsia); + FontGlyphImgList.ResInstLoad(HInstance, rtBitmap, 'SPTBXOPENTYPE', clFuchsia); + + DefaultColorPickerDropDownMenu := TSpTBXColorEditPopupMenu.Create(nil); +end; + +procedure FinalizeStock; +begin + FreeAndNil(FontGlyphImgList); + FreeAndNil(DefaultColorPickerDropDownMenu); +end; + +initialization + InitializeStock; + +finalization + FinalizeStock; + +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXFormPopupMenu.dcu b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXFormPopupMenu.dcu new file mode 100644 index 0000000000000000000000000000000000000000..f4251779bde78b3a3f832f78c513aa687bd17ab8 GIT binary patch literal 41116 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 h?o=U?Uk77*z%i5KOVq_v // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit + +//-- user supplied ----------------------------------------------------------- + +namespace Sptbxformpopupmenu +{ +//-- type declarations ------------------------------------------------------- +#pragma option push -b- +enum TSpTBXPopupAnimationType { patNone, patSlide, patFade }; +#pragma option pop + +#pragma option push -b- +enum TSpTBXPopupBorderStyleType { pbsFrame, pbsSizeable, pbsSizeableBottom, pbsSizeableRightBottom }; +#pragma option pop + +struct TSpTBXPopupFormState +{ + +public: + Forms::TCustomForm* PopupForm; + Forms::TFormBorderStyle BorderStyle; + Types::TRect BoundsRect; +}; + + +typedef void __fastcall (__closure *TSpTBXRollDownEvent)(System::TObject* Sender, int &FormWidth, int &FormHeight); + +typedef void __fastcall (__closure *TSpTBXRollUpEvent)(System::TObject* Sender, bool Selected); + +typedef void __fastcall (__closure *TSpTBXGetFormClassEvent)(System::TObject* Sender, Forms::TCustomFormClass &AFormClass); + +class DELPHICLASS TSpTBXPopupSizeGrip; +class DELPHICLASS TSpTBXCustomWrapperPopupForm; +class PASCALIMPLEMENTATION TSpTBXPopupSizeGrip : public Controls::TWinControl +{ + typedef Controls::TWinControl inherited; + +private: + Sptbxskins::TSpTBXSkinType FSkinType; + Sptbxitem::TSpTBXDrawEvent FOnDrawBackground; + HIDESBASE MESSAGE void __fastcall WMSetCursor(Messages::TWMSetCursor &Message); + HIDESBASE MESSAGE void __fastcall WMEraseBkgnd(Messages::TWMEraseBkgnd &Message); + +protected: + TSpTBXCustomWrapperPopupForm* FPopupForm; + void __fastcall DoDrawBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxitem::TSpTBXPaintStage PaintStage, bool &PaintDefault); + DYNAMIC void __fastcall MouseDown(Controls::TMouseButton Button, Classes::TShiftState Shift, int X, int Y); + +public: + __fastcall virtual TSpTBXPopupSizeGrip(Classes::TComponent* AOwner); + Types::TRect __fastcall GetGripRect(); + Types::TRect __fastcall GetGripSizerRect(); + bool __fastcall IsScreenPointInGrip(const Types::TPoint &P); + +__published: + __property Sptbxskins::TSpTBXSkinType SkinType = {read=FSkinType, write=FSkinType, default=2}; + __property Sptbxitem::TSpTBXDrawEvent OnDrawBackground = {read=FOnDrawBackground, write=FOnDrawBackground}; +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXPopupSizeGrip(HWND ParentWindow) : Controls::TWinControl(ParentWindow) { } + /* TWinControl.Destroy */ inline __fastcall virtual ~TSpTBXPopupSizeGrip(void) { } + +}; + + +class DELPHICLASS TSpTBXFormPopupMenu; +class PASCALIMPLEMENTATION TSpTBXCustomWrapperPopupForm : public Forms::TCustomForm +{ + typedef Forms::TCustomForm inherited; + +private: + bool FHooksInstalled; + Forms::TMessageEvent FOldAppOnMessage; + Classes::TWndMethod FOldPopupControlWndProc; + bool FShowShadows; + TSpTBXPopupAnimationType FAnimation; + Tb2anim::TTBAnimationDirection FAnimationDirection; + TSpTBXPopupBorderStyleType FBorderStyle; + Classes::TNotifyEvent FOnRollDown; + TSpTBXRollUpEvent FOnRollUp; + HIDESBASE void __fastcall SetBorderStyle(const TSpTBXPopupBorderStyleType Value); + void __fastcall InstallHooks(void); + void __fastcall UninstallHooks(void); + HIDESBASE MESSAGE void __fastcall CMChildKey(Controls::TCMChildKey &Message); + MESSAGE void __fastcall CMCancelMode(Controls::TCMCancelMode &Message); + HIDESBASE MESSAGE void __fastcall WMActivate(Messages::TWMActivate &Message); + HIDESBASE MESSAGE void __fastcall WMEraseBkgnd(Messages::TWMEraseBkgnd &Message); + HIDESBASE MESSAGE void __fastcall WMNCCalcSize(Messages::TWMNCCalcSize &Message); + HIDESBASE MESSAGE void __fastcall WMNCHitTest(Messages::TWMNCHitTest &Message); + HIDESBASE MESSAGE void __fastcall WMNCPaint(Messages::TMessage &Message); + MESSAGE void __fastcall WMPrint(Messages::TMessage &Message); + MESSAGE void __fastcall WMSpTBXPopupInvalidate(Messages::TMessage &Message); + MESSAGE void __fastcall WMSpTBXPopupRollUp(Messages::TMessage &Message); + +protected: + Controls::TControl* FPopupControl; + TSpTBXFormPopupMenu* FFormPopupMenu; + bool FPaintingClientArea; + TSpTBXPopupSizeGrip* FSizeGrip; + virtual void __fastcall CreateParams(Controls::TCreateParams &Params); + virtual void __fastcall PaintBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect) = 0 ; + TSpTBXPopupAnimationType __fastcall GetSysAnimation(void); + virtual void __fastcall AppOnMessageHook(tagMSG &Msg, bool &Handled); + virtual void __fastcall PopupControlWindowProc(Messages::TMessage &Message); + virtual void __fastcall DoRollDown(void); + virtual void __fastcall DoRollUp(bool Selected); + __property TSpTBXPopupAnimationType Animation = {read=FAnimation, write=FAnimation, nodefault}; + __property Tb2anim::TTBAnimationDirection AnimationDirection = {read=FAnimationDirection, write=FAnimationDirection, default=0}; + __property TSpTBXPopupBorderStyleType BorderStyle = {read=FBorderStyle, write=SetBorderStyle, default=0}; + __property bool ShowShadows = {read=FShowShadows, write=FShowShadows, default=1}; + __property Classes::TNotifyEvent OnRollDown = {read=FOnRollDown, write=FOnRollDown}; + __property TSpTBXRollUpEvent OnRollUp = {read=FOnRollUp, write=FOnRollUp}; + +public: + __fastcall virtual TSpTBXCustomWrapperPopupForm(TSpTBXFormPopupMenu* AFormPopupMenu); + __fastcall virtual ~TSpTBXCustomWrapperPopupForm(void); + virtual void __fastcall RollDown(int X, int Y, int AWidth, int AHeight, bool FocusPopup = true)/* overload */; + virtual void __fastcall RollDown(Controls::TControl* APopupControl, int AWidth, int AHeight, bool IsVertical = false, bool FocusPopup = true)/* overload */; + virtual void __fastcall RollUp(bool Selected, bool FocusParentControl = true); + __property TSpTBXFormPopupMenu* FormPopupMenu = {read=FFormPopupMenu}; +public: + /* TCustomForm.CreateNew */ inline __fastcall virtual TSpTBXCustomWrapperPopupForm(Classes::TComponent* AOwner, int Dummy) : Forms::TCustomForm(AOwner, Dummy) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXCustomWrapperPopupForm(HWND ParentWindow) : Forms::TCustomForm(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXWrapperPopupForm; +class PASCALIMPLEMENTATION TSpTBXWrapperPopupForm : public TSpTBXCustomWrapperPopupForm +{ + typedef TSpTBXCustomWrapperPopupForm inherited; + +private: + Sptbxskins::TSpTBXSkinType FSkinType; + HIDESBASE MESSAGE void __fastcall CMShowingChanged(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall WMEraseBkgnd(Messages::TWMEraseBkgnd &Message); + void __fastcall SetSkinType(const Sptbxskins::TSpTBXSkinType Value); + +protected: + virtual void __fastcall DestroyWindowHandle(void); + virtual void __fastcall PaintBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect); + +public: + __fastcall virtual TSpTBXWrapperPopupForm(TSpTBXFormPopupMenu* AFormPopupMenu); + __fastcall virtual ~TSpTBXWrapperPopupForm(void); + +__published: + __property Height; + __property Width; + __property BorderStyle = {default=0}; + __property ShowShadows = {default=1}; + __property OnRollDown; + __property OnRollUp; + __property Sptbxskins::TSpTBXSkinType SkinType = {read=FSkinType, write=SetSkinType, default=2}; +public: + /* TCustomForm.CreateNew */ inline __fastcall virtual TSpTBXWrapperPopupForm(Classes::TComponent* AOwner, int Dummy) : TSpTBXCustomWrapperPopupForm(AOwner, Dummy) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXWrapperPopupForm(HWND ParentWindow) : TSpTBXCustomWrapperPopupForm(ParentWindow) { } + +}; + + +class PASCALIMPLEMENTATION TSpTBXFormPopupMenu : public Menus::TPopupMenu +{ + typedef Menus::TPopupMenu inherited; + +private: + Sptbxskins::TSpTBXSkinType FSkinType; + Classes::TList* FNotifies; + bool FItems; + bool FPopupFocus; + TSpTBXPopupFormState FPopupFormState; + TSpTBXRollUpEvent FClosePopup; + TSpTBXRollUpEvent FOnBeforeClosePopup; + TSpTBXRollDownEvent FOnBeforePopup; + TSpTBXGetFormClassEvent FOnGetPopupFormClass; + TSpTBXPopupBorderStyleType __fastcall GetBorderStyle(void); + bool __fastcall GetShowShadows(void); + void __fastcall SetBorderStyle(const TSpTBXPopupBorderStyleType Value); + void __fastcall SetShowShadows(const bool Value); + void __fastcall SetPopupForm(const Forms::TCustomForm* Value); + void __fastcall SetSkinType(const Sptbxskins::TSpTBXSkinType Value); + +protected: + Forms::TCustomForm* FPopupForm; + TSpTBXWrapperPopupForm* FWrapperForm; + virtual void __fastcall Notification(Classes::TComponent* AComponent, Classes::TOperation Operation); + void __fastcall BroadcastCloseMessage(bool Selected); + virtual void __fastcall DoGetPopupFormClass(Forms::TCustomFormClass &AFormClass); + virtual bool __fastcall InternalPopup(int X, int Y, bool ForceFocus, Controls::TControl* PopupControl = (Controls::TControl*)(0x0)); + virtual void __fastcall InternalClosePopup(System::TObject* Sender, bool Selected); + +public: + __fastcall virtual TSpTBXFormPopupMenu(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXFormPopupMenu(void); + virtual void __fastcall Popup(int X, int Y); + void __fastcall PopupEx(int X, int Y, bool ForceFocus)/* overload */; + void __fastcall PopupEx(Controls::TControl* PopupControl, bool ForceFocus)/* overload */; + void __fastcall AddCloseNotification(System::TObject* AObject); + void __fastcall RemoveCloseNotification(System::TObject* AObject); + void __fastcall ClosePopup(bool Selected); + __property Forms::TCustomForm* PopupForm = {read=FPopupForm, write=SetPopupForm}; + +__published: + __property bool Items = {read=FItems, nodefault}; + __property TSpTBXPopupBorderStyleType BorderStyle = {read=GetBorderStyle, write=SetBorderStyle, default=0}; + __property bool PopupFocus = {read=FPopupFocus, write=FPopupFocus, default=0}; + __property bool ShowShadows = {read=GetShowShadows, write=SetShowShadows, default=1}; + __property Sptbxskins::TSpTBXSkinType SkinType = {read=FSkinType, write=SetSkinType, default=2}; + __property TSpTBXRollUpEvent OnClosePopup = {read=FClosePopup, write=FClosePopup}; + __property TSpTBXRollUpEvent OnBeforeClosePopup = {read=FOnBeforeClosePopup, write=FOnBeforeClosePopup}; + __property TSpTBXRollDownEvent OnBeforePopup = {read=FOnBeforePopup, write=FOnBeforePopup}; + __property TSpTBXGetFormClassEvent OnGetPopupFormClass = {read=FOnGetPopupFormClass, write=FOnGetPopupFormClass}; +private: + void *__ISpTBXPopupMenu; /* Sptbxitem::ISpTBXPopupMenu */ + +public: + #if defined(MANAGED_INTERFACE_OPERATORS) + operator Sptbxitem::_di_ISpTBXPopupMenu() + { + Sptbxitem::_di_ISpTBXPopupMenu intf; + GetInterface(intf); + return intf; + } + #else + operator ISpTBXPopupMenu*(void) { return (ISpTBXPopupMenu*)&__ISpTBXPopupMenu; } + #endif + +}; + + +//-- var, const, procedure --------------------------------------------------- +static const Word WM_SPTBX_POPUPINVALIDATE = 0x777; +static const Word WM_SPTBX_POPUPROLLUP = 0x778; +extern PACKAGE TSpTBXFormPopupMenu* ActiveFormPopupMenu; + +} /* namespace Sptbxformpopupmenu */ +using namespace Sptbxformpopupmenu; +#pragma pack(pop) +#pragma option pop + +#pragma delphiheader end. +//-- end unit ---------------------------------------------------------------- +#endif // SptbxformpopupmenuHPP diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXFormPopupMenu.pas b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXFormPopupMenu.pas new file mode 100644 index 0000000..9bf524d --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXFormPopupMenu.pas @@ -0,0 +1,1172 @@ +unit SpTBXFormPopupMenu; + +{============================================================================== +Version 2.4.2 + +The contents of this file are subject to the SpTBXLib License; you may +not use or distribute this file except in compliance with the +SpTBXLib License. +A copy of the SpTBXLib License may be found in SpTBXLib-LICENSE.txt or at: + http://www.silverpointdevelopment.com/sptbxlib/SpTBXLib-LICENSE.htm + +Alternatively, the contents of this file may be used under the terms of the +Mozilla Public License Version 1.1 (the "MPL v1.1"), in which case the provisions +of the MPL v1.1 are applicable instead of those in the SpTBXLib License. +A copy of the MPL v1.1 may be found in MPL-LICENSE.txt or at: + http://www.mozilla.org/MPL/ + +If you wish to allow use of your version of this file only under the terms of +the MPL v1.1 and not to allow others to use your version of this file under the +SpTBXLib License, indicate your decision by deleting the provisions +above and replace them with the notice and other provisions required by the +MPL v1.1. If you do not delete the provisions above, a recipient may use your +version of this file under either the SpTBXLib License or the MPL v1.1. + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for +the specific language governing rights and limitations under the License. + +The initial developer of this code is Robert Lee. + +Requirements: +For Delphi/C++Builder 2009 or newer: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org +For Delphi/C++Builder 7-2007: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org + - Troy Wolbrink's TNT Unicode Controls + http://www.tntware.com/delphicontrols/unicode/ + +History: +8 May 2009 - version 2.4.2 + - No changes. + +15 March 2009 - version 2.4.1 + - No changes. + +17 January 2009 - version 2.4 + - Fixed incorrect focus handling on TSpTBXFormPopupMenu, + when a dialog is showed on top of a TSpTBXFormPopupMenu and + the app is deactivated the Popup is closed but the dialog + stays, thanks to Sertac Akyuz for reporting this. + +26 September 2008 - version 2.3 + - No changes. + +29 July 2008 - version 2.2 + - No changes. + +26 June 2008 - version 2.1 + - No changes. + +3 May 2008 - version 2.0 + - No changes. + +2 April 2008 - version 1.9.5 + - No changes. + +3 February 2008 - version 1.9.4 + - No changes. + +19 January 2008 - version 1.9.3 + - No changes. + +26 December 2007 - version 1.9.2 + - Fixed incorrect focus handling on TSpTBXFormPopupMenu, + thanks to Costas Stergiou for reporting this. + +1 December 2007 - version 1.9.1 + - Removed TBX dependency. + +20 November 2007 - version 1.9 + - Removed TBX dependency. + +8 February 2007 - version 1.8.3 + - No changes. + +17 December 2006 - version 1.8.2 + - No changes. + +24 November 2006 - version 1.8.1 + - Fixed TSpTBXFormPopupMenu resizing flicker. + +27 August 2006 - version 1.8 + - Initial release. + +==============================================================================} + +interface + +{$BOOLEVAL OFF} // Unit depends on short-circuit boolean evaluation +{$I TB2Ver.inc} + +uses + Windows, Messages, Classes, SysUtils, Controls, Graphics, ImgList, Forms, + Menus, StdCtrls, TB2Item, TB2Anim, SpTBXSkins, SpTBXItem; + +const + WM_SPTBX_POPUPINVALIDATE = WM_USER + 887; + WM_SPTBX_POPUPROLLUP = WM_USER + 888; + +type + TSpTBXFormPopupMenu = class; + TSpTBXCustomWrapperPopupForm = class; + + TSpTBXPopupAnimationType = ( + patNone, + patSlide, + patFade + ); + + TSpTBXPopupBorderStyleType = ( + pbsFrame, + pbsSizeable, + pbsSizeableBottom, + pbsSizeableRightBottom + ); + + TSpTBXPopupFormState = record + PopupForm: TCustomForm; + BorderStyle: TFormBorderStyle; + BoundsRect: TRect; + end; + + TSpTBXRollDownEvent = procedure(Sender: TObject; var FormWidth, FormHeight: Integer) of object; + TSpTBXRollUpEvent = procedure(Sender: TObject; Selected: Boolean) of object; + TSpTBXGetFormClassEvent = procedure(Sender: TObject; var AFormClass: TCustomFormClass) of object; + + { TSpTBXPopupSizeGrip } + + TSpTBXPopupSizeGrip = class(TWinControl) + private + FSkinType: TSpTBXSkinType; + FOnDrawBackground: TSpTBXDrawEvent; + procedure WMSetCursor(var Message: TWMSetCursor); message WM_SETCURSOR; + procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; + protected + FPopupForm: TSpTBXCustomWrapperPopupForm; + procedure DoDrawBackground(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); override; + public + constructor Create(AOwner: TComponent); override; + function GetGripRect: TRect; + function GetGripSizerRect: TRect; + function IsScreenPointInGrip(P: TPoint): Boolean; + published + property SkinType: TSpTBXSkinType read FSkinType write FSkinType default sknSkin; + property OnDrawBackground: TSpTBXDrawEvent read FOnDrawBackground write FOnDrawBackground; + end; + + { TSpTBXWrapperPopupForm } + + TSpTBXCustomWrapperPopupForm = class(TCustomForm) + private + FHooksInstalled: Boolean; + FOldAppOnMessage: TMessageEvent; + FOldPopupControlWndProc: TWndMethod; + FShowShadows: Boolean; + FAnimation: TSpTBXPopupAnimationType; + FAnimationDirection: TTBAnimationDirection; + FBorderStyle: TSpTBXPopupBorderStyleType; + FOnRollDown: TNotifyEvent; + FOnRollUp: TSpTBXRollUpEvent; + procedure SetBorderStyle(const Value: TSpTBXPopupBorderStyleType); + procedure InstallHooks; + procedure UninstallHooks; + procedure CMChildKey(var Message: TCMChildKey); message CM_CHILDKEY; + procedure CMCancelMode(var Message: TCMCancelMode); message CM_CANCELMODE; + procedure WMActivate(var Message: TWMActivate); message WM_ACTIVATE; + procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; + procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE; + procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST; + procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT; + procedure WMPrint(var Message: TMessage); message WM_PRINT; + procedure WMSpTBXPopupInvalidate(var Message: TMessage); message WM_SPTBX_POPUPINVALIDATE; + procedure WMSpTBXPopupRollUp(var Message: TMessage); message WM_SPTBX_POPUPROLLUP; + protected + FPopupControl: TControl; + FFormPopupMenu: TSpTBXFormPopupMenu; + FPaintingClientArea: Boolean; + FSizeGrip: TSpTBXPopupSizeGrip; + procedure CreateParams(var Params: TCreateParams); override; + procedure PaintBackground(ACanvas: TCanvas; ARect: TRect); virtual; abstract; + function GetSysAnimation: TSpTBXPopupAnimationType; + procedure AppOnMessageHook(var Msg: TMsg; var Handled: Boolean); virtual; + procedure PopupControlWindowProc(var Message: TMessage); virtual; + procedure DoRollDown; virtual; + procedure DoRollUp(Selected: Boolean); virtual; + property Animation: TSpTBXPopupAnimationType read FAnimation write FAnimation; + property AnimationDirection: TTBAnimationDirection read FAnimationDirection write FAnimationDirection default []; + property BorderStyle: TSpTBXPopupBorderStyleType read FBorderStyle write SetBorderStyle default pbsFrame; + property ShowShadows: Boolean read FShowShadows write FShowShadows default True; + property OnRollDown: TNotifyEvent read FOnRollDown write FOnRollDown; + property OnRollUp: TSpTBXRollUpEvent read FOnRollUp write FOnRollUp; + public + constructor Create(AFormPopupMenu: TSpTBXFormPopupMenu); reintroduce; virtual; + destructor Destroy; override; + procedure RollDown(X, Y, AWidth, AHeight: Integer; FocusPopup: Boolean = True); overload; virtual; + procedure RollDown(APopupControl: TControl; AWidth, AHeight: Integer; IsVertical: Boolean = False; FocusPopup: Boolean = True); overload; virtual; + procedure RollUp(Selected: Boolean; FocusParentControl: Boolean = True); virtual; + property FormPopupMenu: TSpTBXFormPopupMenu read FFormPopupMenu; + end; + + TSpTBXWrapperPopupForm = class(TSpTBXCustomWrapperPopupForm) + private + FSkinType: TSpTBXSkinType; + procedure CMShowingChanged(var Message: TMessage); message CM_SHOWINGCHANGED; + procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; + procedure SetSkinType(const Value: TSpTBXSkinType); + protected + procedure DestroyWindowHandle; override; + procedure PaintBackground(ACanvas: TCanvas; ARect: TRect); override; + public + constructor Create(AFormPopupMenu: TSpTBXFormPopupMenu); override; + destructor Destroy; override; + published + property Height; + property Width; + property BorderStyle; + property ShowShadows; + property OnRollDown; + property OnRollUp; + property SkinType: TSpTBXSkinType read FSkinType write SetSkinType default sknSkin; + end; + + { TSpTBXFormPopupMenu } + + TSpTBXFormPopupMenu = class(TPopupMenu, ISpTBXPopupMenu) + private + FSkinType: TSpTBXSkinType; + FNotifies: TList; + FItems: Boolean; + FPopupFocus: Boolean; + FPopupFormState: TSpTBXPopupFormState; + FClosePopup: TSpTBXRollUpEvent; + FOnBeforeClosePopup: TSpTBXRollUpEvent; + FOnBeforePopup: TSpTBXRollDownEvent; + FOnGetPopupFormClass: TSpTBXGetFormClassEvent; + function GetBorderStyle: TSpTBXPopupBorderStyleType; + function GetShowShadows: Boolean; + procedure SetBorderStyle(const Value: TSpTBXPopupBorderStyleType); + procedure SetShowShadows(const Value: Boolean); + procedure SetPopupForm(const Value: TCustomForm); + procedure SetSkinType(const Value: TSpTBXSkinType); + protected + FPopupForm: TCustomForm; + FWrapperForm: TSpTBXWrapperPopupForm; // Container of FPopupForm + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure BroadcastCloseMessage(Selected: Boolean); + procedure DoGetPopupFormClass(var AFormClass: TCustomFormClass); virtual; + function InternalPopup(X, Y: Integer; ForceFocus: Boolean; PopupControl: TControl = nil): Boolean; virtual; + procedure InternalClosePopup(Sender: TObject; Selected: Boolean); virtual; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Popup(X: Integer; Y: Integer); override; + procedure PopupEx(X, Y: Integer; ForceFocus: Boolean); overload; + procedure PopupEx(PopupControl: TControl; ForceFocus: Boolean); overload; + procedure AddCloseNotification(AObject: TObject); + procedure RemoveCloseNotification(AObject: TObject); + procedure ClosePopup(Selected: Boolean); + property PopupForm: TCustomForm read FPopupForm write SetPopupForm; + published + property Items: Boolean read FItems; // Hide the Items property + property BorderStyle: TSpTBXPopupBorderStyleType read GetBorderStyle write SetBorderStyle default pbsFrame; + property PopupFocus: Boolean read FPopupFocus write FPopupFocus default False; + property ShowShadows: Boolean read GetShowShadows write SetShowShadows default True; + property SkinType: TSpTBXSkinType read FSkinType write SetSkinType default sknSkin; + property OnClosePopup: TSpTBXRollUpEvent read FClosePopup write FClosePopup; + property OnBeforeClosePopup: TSpTBXRollUpEvent read FOnBeforeClosePopup write FOnBeforeClosePopup; + property OnBeforePopup: TSpTBXRollDownEvent read FOnBeforePopup write FOnBeforePopup; + property OnGetPopupFormClass: TSpTBXGetFormClassEvent read FOnGetPopupFormClass write FOnGetPopupFormClass; + end; + +var + ActiveFormPopupMenu: TSpTBXFormPopupMenu = nil; + +implementation + +uses + Themes, UxTheme, Types, TB2Common, TB2Acc; + +const + DefaultBorderSize = 2; + +type + TCustomFormAccess = class(TCustomForm); + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXPopupSizeGrip } + +constructor TSpTBXPopupSizeGrip.Create(AOwner: TComponent); +begin + inherited; + if Assigned(AOwner) and (AOwner is TSpTBXCustomWrapperPopupForm) then + FPopupForm := AOwner as TSpTBXCustomWrapperPopupForm; + FSkinType := sknSkin; + Align := alBottom; + Height := 10; +end; + +procedure TSpTBXPopupSizeGrip.DoDrawBackground(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawBackground) then FOnDrawBackground(Self, ACanvas, ARect, PaintStage, PaintDefault); +end; + +function TSpTBXPopupSizeGrip.GetGripRect: TRect; +begin + // Return the rect of the area that is sizeable. + // If BorderStyle = pbsSizeableRightBottom the sizeable area is the + // bottom right corner, when BorderStyle = pbsSizeableRightBottom the + // sizeable area is the client rect of the SizeGrip + Result := Rect(0, 0, 0, 0); + if not (csDestroying in ComponentState) and Assigned(FPopupForm) and + (FPopupForm.FBorderStyle in [pbsSizeableBottom, pbsSizeableRightBottom]) then + begin + Result := ClientRect; + if FPopupForm.BorderStyle = pbsSizeableRightBottom then + Result := GetGripSizerRect + else + Result := ClientRect; + end; +end; + +function TSpTBXPopupSizeGrip.GetGripSizerRect: TRect; +begin + // Return the rect of the grip sizer, the area that has the + // dots on the sizer. + Result := Rect(0, 0, 0, 0); + if not (csDestroying in ComponentState) and Assigned(FPopupForm) then begin + case FPopupForm.BorderStyle of + pbsSizeableBottom: + begin + Result := ClientRect; + Result.Left := (Result.Right + Result.Left - 20) div 2; + Result.Right := Result.Left + 20; + end; + pbsSizeableRightBottom: + begin + Result := ClientRect; + Result.Left := Result.Right - 14; + end; + end; + end; +end; + +function TSpTBXPopupSizeGrip.IsScreenPointInGrip(P: TPoint): Boolean; +var + GR: TRect; +begin + Result := False; + P := ScreenToClient(P); + GR := GetGripRect; + if not IsRectEmpty(GR) and PtInRect(GR, P) then + Result := True; +end; + +procedure TSpTBXPopupSizeGrip.MouseDown(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +var + P: TPoint; +const + SC_SizeDown = $F006; + SC_SizeDownRight = $F008; +begin + // Resize the StatusBar if the parent is TSpTBXTitleBar + if not (csDesigning in ComponentState) and (Button = mbLeft) and Assigned(FPopupForm) then begin + P := ClientToScreen(Point(X, Y)); + if IsScreenPointInGrip(P) then begin + ReleaseCapture; + case FPopupForm.BorderStyle of + pbsSizeableBottom: + SendMessage(FPopupForm.Handle, WM_SYSCOMMAND, SC_SizeDown, 0); + pbsSizeableRightBottom: + SendMessage(FPopupForm.Handle, WM_SYSCOMMAND, SC_SizeDownRight, 0); + end; + Exit; + end; + end; + + inherited; +end; + +procedure TSpTBXPopupSizeGrip.WMEraseBkgnd(var Message: TWMEraseBkgnd); +var + ACanvas: TCanvas; + PaintDefault: Boolean; + R, GR, CellR: TRect; + C1, C2: TColor; + T: TSpTBXSkinType; +begin + Message.Result := 1; + if (csDestroying in ComponentState) then Exit; + + ACanvas := TCanvas.Create; + ACanvas.Handle := Message.DC; + try + R := ClientRect; + T := SpTBXSkinType(FSkinType); + + // Draw the background + PaintDefault := True; + DoDrawBackground(ACanvas, R, pstPrePaint, PaintDefault); + if PaintDefault then begin + GR := Rect(0, 0, 0, 0); + SpDrawXPStatusBar(ACanvas, R, GR, T, False); + end; + + // Draw the grip + PaintDefault := True; + DoDrawBackground(ACanvas, R, pstPostPaint, PaintDefault); + if PaintDefault then begin + C1 := SkinManager.CurrentSkin.Options(skncStatusBarGrip).Body.Color1; + if (C1 = clNone) or (T <> sknSkin) then C1 := clBtnShadow; + C2 := SkinManager.CurrentSkin.Options(skncStatusBarGrip).Body.Color2; + if (C2 = clNone) or (T <> sknSkin) then C2 := clBtnHighlight; + // Grip cells are 4x4 pixels + case FPopupForm.BorderStyle of + pbsSizeableBottom: + begin + GR := GetGripSizerRect; + CellR := GR; + CellR.Top := (CellR.Top + CellR.Bottom - 4) div 2 + 1; + CellR.Bottom := CellR.Top + 3; + SpDrawXPGrip(ACanvas, CellR, C1, C2); + end; + pbsSizeableRightBottom: + begin + GR := GetGripSizerRect; + CellR := GR; + // Draw 2 cells at the bottom + CellR.Left := GR.Right - 8; + CellR.Top := CellR.Bottom - 4; + SpDrawXPGrip(ACanvas, CellR, C1, C2); + // Draw 1 cell at the top + CellR.Bottom := CellR.Top; + CellR.Top := CellR.Bottom - 4; + CellR.Left := CellR.Left + 4; + SpDrawXPGrip(ACanvas, CellR, C1, C2); + end; + end; + end; + finally + ACanvas.Handle := 0; + ACanvas.Free; + end; +end; + +procedure TSpTBXPopupSizeGrip.WMSetCursor(var Message: TWMSetCursor); +var + P: TPoint; +begin + if not (csDesigning in ComponentState) and (Message.CursorWnd = Handle) and + (Screen.Cursor = crDefault) and Assigned(FPopupForm) then + begin + GetCursorPos(P); + if IsScreenPointInGrip(P) then begin + case FPopupForm.BorderStyle of + pbsSizeableBottom: + Windows.SetCursor(Screen.Cursors[-7]); + pbsSizeableRightBottom: + Windows.SetCursor(Screen.Cursors[-8]); + end; + Message.Result := 1; + Exit; + end; + end; + + inherited; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomWrapperPopupForm } + +constructor TSpTBXCustomWrapperPopupForm.Create(AFormPopupMenu: TSpTBXFormPopupMenu); +begin + // Form doesn't have DFM info + inherited CreateNew(nil); + + Visible := False; + SetBounds(0, 0, 0, 0); + FFormPopupMenu := AFormPopupMenu; + FAnimation := GetSysAnimation; + FAnimationDirection := []; + FShowShadows := True; + FSizeGrip := TSpTBXPopupSizeGrip.Create(Self); + FSizeGrip.Parent := Self; +end; + +procedure TSpTBXCustomWrapperPopupForm.CreateParams(var Params: TCreateParams); +begin + inherited; + if not (csDesigning in ComponentState) then + with Params do begin + Style := WS_POPUP or WS_CLIPCHILDREN; + + // Add the thickframe on all the BorderStyles + // We should handle the NC HitTest + Style := Style or WS_THICKFRAME; + + ExStyle := WS_EX_TOPMOST or WS_EX_TOOLWINDOW; + WindowClass.Style := WindowClass.Style or CS_SAVEBITS; + if IsWindowsXP then + WindowClass.Style := WindowClass.Style or CS_DROPSHADOW; + end; +end; + +destructor TSpTBXCustomWrapperPopupForm.Destroy; +begin + FreeAndNil(FSizeGrip); + inherited; +end; + +procedure TSpTBXCustomWrapperPopupForm.DoRollDown; +begin + if Assigned(FOnRollDown) then FOnRollDown(Self); +end; + +procedure TSpTBXCustomWrapperPopupForm.DoRollUp(Selected: Boolean); +begin + if Assigned(FOnRollUp) then FOnRollUp(Self, Selected); +end; + +function TSpTBXCustomWrapperPopupForm.GetSysAnimation: TSpTBXPopupAnimationType; +const + SPI_GETMENUFADE = $1012; +var + Animate: BOOL; +begin + Result := patNone; + if SystemParametersInfo(SPI_GETMENUANIMATION, 0, @Animate, 0) and Animate then + if SystemParametersInfo(SPI_GETMENUFADE, 0, @Animate, 0) and Animate then + Result := patFade + else + Result := patSlide; +end; + +procedure TSpTBXCustomWrapperPopupForm.RollDown(X, Y, AWidth, + AHeight: Integer; FocusPopup: Boolean = True); +begin + if not Visible then begin + ActiveFormPopupMenu := FFormPopupMenu; // Set global variable used by RollUp + // If FPopupControl is nil we should use the ActiveForm to set focus on RollUp + if not Assigned(FPopupControl) then + FPopupControl := Screen.ActiveForm; + // Increase the size of the form if the size grip is visible + if FBorderStyle in [pbsSizeableBottom, pbsSizeableRightBottom] then begin + FSizeGrip.Visible := True; + AHeight := AHeight + FSizeGrip.Height; + end + else + FSizeGrip.Visible := False; + + InstallHooks; + HandleNeeded; // We need the handle to set the Bounds and deactivate Vista form thick borders + SetBounds(X, Y, AWidth, AHeight); + SpActivateDwmNC(Self, False); + // Make sure it will be showed on top of all the forms/dialogs + SetWindowPos(WindowHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE or SWP_NOACTIVATE); + Visible := True; + if FocusPopup then + SetFocus; + DoRollDown; + end; +end; + +procedure TSpTBXCustomWrapperPopupForm.RollDown(APopupControl: TControl; + AWidth, AHeight: Integer; IsVertical: Boolean = False; + FocusPopup: Boolean = True); +var + P, Size: TPoint; +begin + if Assigned(APopupControl) and Assigned(APopupControl.Parent) then begin + FPopupControl := APopupControl; + // Increase the size of the form if the size grip is visible + Size.X := AWidth; + Size.Y := AHeight; + if FBorderStyle in [pbsSizeableBottom, pbsSizeableRightBottom] then + Size.Y := Size.Y + FSizeGrip.Height; + + P := SpCalcPopupPosition(0, 0, Size.X, Size.Y, APopupControl, IsVertical); + RollDown(P.X, P.Y, AWidth, AHeight, FocusPopup); + end; +end; + +procedure TSpTBXCustomWrapperPopupForm.RollUp(Selected: Boolean; FocusParentControl: Boolean = True); +var + W: TWinControl; + Msg: TMessage; +begin + // Instead of checking for Self.Visible check if the actual wrapped form + // is visible. + if FFormPopupMenu.PopupForm.Visible then begin + UninstallHooks; + + if Assigned(FPopupControl) and (FPopupControl is TWinControl) then begin + W := FPopupControl as TWinControl; + if FocusParentControl and W.CanFocus then + W.SetFocus; + // Send a message to the PopupControl and it's children controls + // to inform that the Popup was closed. + Msg.Msg := CM_SPPOPUPCLOSE; + Msg.WParam := Integer(Self); + if Selected then + Msg.LParam := 1 + else + Msg.LParam := 0; + Msg.Result := 0; + PostMessage(W.Handle, Msg.Msg, Msg.WParam, Msg.LParam); + W.Broadcast(Msg); + end; + + Visible := False; + + // Broadcast the close message to all the notifies + if Assigned(ActiveFormPopupMenu) then + ActiveFormPopupMenu.BroadcastCloseMessage(Selected); + ActiveFormPopupMenu := nil; // Reset global variable + FPopupControl := nil; + DoRollUp(Selected); + end; +end; + +procedure TSpTBXCustomWrapperPopupForm.SetBorderStyle(const Value: TSpTBXPopupBorderStyleType); +begin + if FBorderStyle <> Value then + FBorderStyle := Value; +end; + +procedure TSpTBXCustomWrapperPopupForm.InstallHooks; +begin + if not FHooksInstalled then begin + FHooksInstalled := True; + + // Needed to handle main form mouse clicks when the popup is visible + FOldAppOnMessage := Application.OnMessage; + Application.OnMessage := AppOnMessageHook; + + if Assigned(FPopupControl) then begin + // Needed to handle focus changes when the popup is visible but the + // ParentControl has the focus, like the Comboboxes + FOldPopupControlWndProc := FPopupControl.WindowProc; + FPopupControl.WindowProc := PopupControlWindowProc; + end; + end; +end; + +procedure TSpTBXCustomWrapperPopupForm.UninstallHooks; +begin + if FHooksInstalled then begin + FHooksInstalled := False; + + Application.OnMessage := FOldAppOnMessage; + FOldAppOnMessage := nil; + + if Assigned(FPopupControl) then begin + FPopupControl.WindowProc := FOldPopupControlWndProc; + FOldPopupControlWndProc := nil; + end; + end; +end; + +procedure TSpTBXCustomWrapperPopupForm.AppOnMessageHook(var Msg: TMsg; var Handled: Boolean); +begin + if Assigned(FOldAppOnMessage) then FOldAppOnMessage(Msg, Handled); + + if not IsWindowEnabled(Handle) then begin + Handled := False; + Exit; + end; + + case Msg.message of + CM_DEACTIVATE: + begin + // Rollup when the popup is deactivated + // Instead of calling Rollup post a message so the + // Application.OnMessage is processed before + // the popup is closed, this is needed to handle + // the mouse clicks on the main form + PostMessage(Handle, WM_SPTBX_POPUPROLLUP, 0, 0); // Set FocusParentControl param to False + end; + WM_LBUTTONDOWN, WM_RBUTTONDOWN, WM_MBUTTONDOWN: + // If the click was not on the popup, rollup and Handle the message + if (GetCapture = 0) and (Msg.hwnd <> Handle) and not Windows.IsChild(Handle, Msg.hwnd) then + if Assigned(FPopupControl) and not (FPopupControl is TCustomForm) and (FPopupControl is TWinControl) then begin + if (Msg.hwnd <> TWinControl(FPopupControl).Handle) and not Windows.IsChild(TWinControl(FPopupControl).Handle, Msg.hwnd) then begin + Handled := True; + RollUp(False); + end; + end + else begin + Handled := True; + RollUp(False); + end; + WM_NCLBUTTONDOWN..WM_NCMBUTTONDBLCLK: + // If the click was not on the popup, rollup and Handle the message + if (Msg.hwnd <> Handle) and not Windows.IsChild(Handle, Msg.hwnd) then begin + Handled := True; + RollUp(False); + end; + end; +end; + +procedure TSpTBXCustomWrapperPopupForm.PopupControlWindowProc(var Message: TMessage); +begin + if Assigned(FOldPopupControlWndProc) then FOldPopupControlWndProc(Message); + + if Visible then + case Message.Msg of + CM_FOCUSCHANGED: + // Rollup when the popup is deactivated + // Instead of calling Rollup post a message so the + // Application.OnMessage is processed before + // the popup is closed, this is needed to handle + // the focus change on the main form + PostMessage(Handle, WM_SPTBX_POPUPROLLUP, 0, 0); // Set FocusParentControl param to False + CM_CHILDKEY: + if Message.WParam = VK_ESCAPE then + RollUp(False); +// CM_CANCELMODE: +// RollUp(False); + end; +end; + +procedure TSpTBXCustomWrapperPopupForm.CMCancelMode(var Message: TCMCancelMode); +begin + inherited; + RollUp(False); +end; + +procedure TSpTBXCustomWrapperPopupForm.CMChildKey(var Message: TCMChildKey); +begin + inherited; + if Message.CharCode = VK_ESCAPE then + RollUp(False); +end; + +procedure TSpTBXCustomWrapperPopupForm.WMActivate(var Message: TWMActivate); +begin + inherited; + if Message.Active = WA_INACTIVE then begin + // Rollup when the popup is deactivated + // Instead of calling Rollup post a message so the + // Application.OnMessage is processed before + // the popup is closed, this is needed to handle + // the mouse clicks on the main form +// PostMessage(Handle, WM_SPTBX_POPUPROLLUP, 0, 1); + end + else begin + // When the popup is activated redraw the caption bar of the Main Form + // And invalidate the client and non client area + SendMessage(Message.ActiveWindow, WM_NCACTIVATE, 1, 0); + PostMessage(Handle, WM_SPTBX_POPUPINVALIDATE, 0, 0); // Post the invalidate message to avoid flicker + end; +end; + +procedure TSpTBXCustomWrapperPopupForm.WMNCCalcSize(var Message: TWMNCCalcSize); +begin + Message.Result := 0; + InflateRect(Message.CalcSize_Params^.rgrc[0], -DefaultBorderSize, -DefaultBorderSize); +end; + +procedure TSpTBXCustomWrapperPopupForm.WMNCHitTest(var Message: TWMNCHitTest); +var + P: TPoint; + GR: TRect; + HitOnBorder: Boolean; +begin + inherited; + + HitOnBorder := Message.Result in [HTLEFT, HTTOP, HTTOPLEFT, HTTOPRIGHT, HTRIGHT, HTBOTTOM, HTBOTTOMLEFT, HTBOTTOMRIGHT]; + + if HitOnBorder then + case FBorderStyle of + pbsFrame: + Message.Result := HTNOWHERE; + pbsSizeableBottom: + begin + // Make the NC area resizeable + Message.Result := HTNOWHERE; + P := FSizeGrip.ScreenToClient(SmallPointToPoint(Message.Pos)); + GR := FSizeGrip.GetGripRect; + if P.Y >= GR.Top then + Message.Result := HTBOTTOM; + end; + pbsSizeableRightBottom: + begin + // Make the NC area resizeable + Message.Result := HTNOWHERE; + P := FSizeGrip.ScreenToClient(SmallPointToPoint(Message.Pos)); + GR := FSizeGrip.GetGripRect; + if P.Y >= GR.Top then + if P.X >= GR.Left then + Message.Result := HTBOTTOMRIGHT; + end; + end; +end; + +procedure PopupWindowNCPaintProc(Wnd: HWND; DC: HDC; AppData: TObject); +// Paints the NC area and the client background, used by WMEraseBkgnd, WMNCPaint, WMPrint +var + ACanvas: TCanvas; + R: TRect; + PopupWindow: TSpTBXCustomWrapperPopupForm; +begin + ACanvas := TCanvas.Create; + try + ACanvas.Handle := DC; + GetWindowRect(Wnd, R); + OffsetRect(R, -R.Left, -R.Top); + + // If it's used by WM_ERASEBKGND offset the rect + PopupWindow := TSpTBXCustomWrapperPopupForm(AppData); + if PopupWindow.FPaintingClientArea then begin + PopupWindow.FPaintingClientArea := False; + OffsetRect(R, -DefaultBorderSize, -DefaultBorderSize); + end; + + PopupWindow.PaintBackground(ACanvas, R); + finally + ACanvas.Handle := 0; + ACanvas.Free; + end; +end; + +procedure TSpTBXCustomWrapperPopupForm.WMEraseBkgnd(var Message: TWMEraseBkgnd); +begin + // There's no need to call PopupWindowNCPaintProc here, because the + // ClientArea is filled with the child Form + Message.Result := 1; +end; + +procedure TSpTBXCustomWrapperPopupForm.WMNCPaint(var Message: TMessage); +var + DC: HDC; +begin + DC := GetWindowDC(Handle); + try + FPaintingClientArea := False; + SelectNCUpdateRgn(Handle, DC, HRGN(Message.WParam)); + PopupWindowNCPaintProc(Handle, DC, Self); + finally + ReleaseDC(Handle, DC); + end; +end; + +procedure TSpTBXCustomWrapperPopupForm.WMPrint(var Message: TMessage); +begin + FPaintingClientArea := False; + HandleWMPrint(Handle, Message, PopupWindowNCPaintProc, Self); +end; + +procedure TSpTBXCustomWrapperPopupForm.WMSpTBXPopupInvalidate(var Message: TMessage); +begin + if HandleAllocated then + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN or RDW_FRAME); +end; + +procedure TSpTBXCustomWrapperPopupForm.WMSpTBXPopupRollUp(var Message: TMessage); +var + Selected, FocusParentControl: Boolean; +begin + Selected := Message.WParam <> 0; + FocusParentControl := Message.LParam <> 0; + RollUp(Selected, FocusParentControl); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXWrapperPopupForm } + +constructor TSpTBXWrapperPopupForm.Create(AFormPopupMenu: TSpTBXFormPopupMenu); +begin + inherited; + FSkinType := sknSkin; +end; + +destructor TSpTBXWrapperPopupForm.Destroy; +begin + Destroying; + if HandleAllocated then + DestroyWindowHandle; + inherited; +end; + +procedure TSpTBXWrapperPopupForm.DestroyWindowHandle; +begin + { Cleanly destroy any timers before the window handle is destroyed } + CallNotifyWinEvent(EVENT_SYSTEM_MENUPOPUPEND, WindowHandle, OBJID_CLIENT, CHILDID_SELF); + inherited; +end; + +procedure TSpTBXWrapperPopupForm.CMShowingChanged(var Message: TMessage); +const + ShowFlags: array[Boolean] of UINT = ( + SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_HIDEWINDOW, + SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_SHOWWINDOW); +var + Blend: Boolean; +begin + { Must override TCustomForm/TForm's CM_SHOWINGCHANGED handler so that the + form doesn't get activated when Visible is set to True. } + + { Handle animation } + if Showing and not IsWindowVisible(WindowHandle) and (Animation <> patNone) then + begin + Blend := Animation = patFade; + if Assigned(AnimateWindowProc) and (Blend or (FAnimationDirection <> [])) then begin + AnimateWindowProc(Handle, 150, AW_BLEND); + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN); + Exit; + end; + end; + + { No animation... } + SetWindowPos(WindowHandle, 0, 0, 0, 0, 0, ShowFlags[Showing]); + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN); +end; + +procedure TSpTBXWrapperPopupForm.PaintBackground(ACanvas: TCanvas; ARect: TRect); +begin + SpDrawXPMenuPopupWindow(ACanvas, ARect, Rect(0, 0, 0, 0), False, 0, FSkinType); +end; + +procedure TSpTBXWrapperPopupForm.SetSkinType(const Value: TSpTBXSkinType); +begin + if FSkinType <> Value then begin + FSkinType := Value; + FSizeGrip.SkinType := Value; + end; +end; + +procedure TSpTBXWrapperPopupForm.WMEraseBkgnd(var Message: TWMEraseBkgnd); +begin + Message.Result := 1; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXFormPopupMenu } + +constructor TSpTBXFormPopupMenu.Create(AOwner: TComponent); +begin + inherited; + FSkinType := sknSkin; + FNotifies := TList.Create; + FWrapperForm := TSpTBXWrapperPopupForm.Create(Self); + FWrapperForm.OnRollUp := InternalClosePopup; +end; + +destructor TSpTBXFormPopupMenu.Destroy; +var + FC: TCustomFormClass; +begin + if Assigned(FPopupForm) then + FPopupForm.Parent := nil; + // Free the PopupForm if the OnGetPopupFormClass event returns + // a valid form class. + FC := nil; + DoGetPopupFormClass(FC); + if Assigned(FC) then + FreeAndNil(FPopupForm); + + FreeAndNil(FNotifies); + FreeAndNil(FWrapperForm); + inherited; +end; + +procedure TSpTBXFormPopupMenu.DoGetPopupFormClass(var AFormClass: TCustomFormClass); +begin + if Assigned(FOnGetPopupFormClass) then FOnGetPopupFormClass(Self, AFormClass); +end; + +procedure TSpTBXFormPopupMenu.AddCloseNotification(AObject: TObject); +begin + if Assigned(AObject) then + if FNotifies.IndexOf(AObject) < 0 then FNotifies.Add(AObject); +end; + +procedure TSpTBXFormPopupMenu.RemoveCloseNotification(AObject: TObject); +begin + FNotifies.Remove(AObject); +end; + +procedure TSpTBXFormPopupMenu.BroadcastCloseMessage(Selected: Boolean); +var + Msg: TMessage; + I: Integer; +begin + if FNotifies.Count > 0 then begin + Msg.Msg := CM_SPPOPUPCLOSE; + Msg.WParam := Integer(FWrapperForm); + if Selected then + Msg.LParam := 1 + else + Msg.LParam := 0; + Msg.Result := 0; + for I := 0 to FNotifies.Count - 1 do + TObject(FNotifies[I]).Dispatch(Msg); + end; +end; + +procedure TSpTBXFormPopupMenu.ClosePopup(Selected: Boolean); +begin + // Instead of calling Rollup post a message so the Application.OnMessage is + // processed before the popup is closed, this is needed to handle the mouse + // clicks on the main form. + PostMessage(FWrapperForm.Handle, WM_SPTBX_POPUPROLLUP, Integer(Selected), 1); +end; + +procedure TSpTBXFormPopupMenu.InternalClosePopup(Sender: TObject; Selected: Boolean); +var + FC: TCustomFormClass; +begin + if Assigned(FOnBeforeClosePopup) then FOnBeforeClosePopup(Self, Selected); + + if Assigned(FPopupForm) then begin + FPopupForm.Visible := False; + FPopupForm.Parent := nil; + FPopupForm.Align := alNone; + if FPopupFormState.PopupForm = FPopupForm then begin + FPopupForm.BorderStyle := FPopupFormState.BorderStyle; + FPopupForm.BoundsRect := FPopupFormState.BoundsRect; + end; + end; + + if Assigned(FClosePopup) then FClosePopup(Self, Selected); + + // Free the PopupForm if the OnGetPopupFormClass event returns + // a valid form class. + FC := nil; + DoGetPopupFormClass(FC); + if Assigned(FC) then + FreeAndNil(FPopupForm); +end; + +function TSpTBXFormPopupMenu.InternalPopup(X, Y: Integer; ForceFocus: Boolean; + PopupControl: TControl = nil): Boolean; +var + ClientR: TRect; + FC: TCustomFormClass; +begin + Result := False; + + {$IFDEF JR_D9} + SetPopupPoint(Point(X, Y)); + {$ELSE} + PPoint(@PopupPoint)^ := Point(X, Y); + {$ENDIF} + + // Create the PopupForm if the OnGetPopupFormClass event returns + // a valid form class. + // Otherwise try to use the assigned PopupForm property. + FC := nil; + DoGetPopupFormClass(FC); + if Assigned(FC) then + FPopupForm := FC.Create(nil); + + // Use the WrapperForm to show the PopupForm + if Assigned(FPopupForm) then begin + FPopupFormState.PopupForm := FPopupForm; + FPopupFormState.BorderStyle := FPopupForm.BorderStyle; + FPopupFormState.BoundsRect := FPopupForm.BoundsRect; + + ClientR := FPopupForm.ClientRect; + + FPopupForm.Parent := FWrapperForm; + FPopupForm.Align := alClient; + FPopupForm.BorderStyle := bsNone; + FPopupForm.Visible := True; + + if Assigned(FOnBeforePopup) then FOnBeforePopup(Self, ClientR.Right, ClientR.Bottom); + + if Assigned(PopupControl) then + FWrapperForm.RollDown(PopupControl, ClientR.Right + DefaultBorderSize * 2, ClientR.Bottom + DefaultBorderSize * 2, False, ForceFocus) + else + FWrapperForm.RollDown(X, Y, ClientR.Right + DefaultBorderSize * 2, ClientR.Bottom + DefaultBorderSize * 2, ForceFocus); + + if Assigned(OnPopup) then OnPopup(Self); + Result := True; + end; +end; + +procedure TSpTBXFormPopupMenu.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if Operation = opRemove then + if AComponent = PopupForm then begin + // Weird Delphi IDE bug at design time. + // When a Form is closed at design time it will fire the + // FreeNotification, setting PopupForm to nil and not + // saving it to the dfm + + SetPopupForm(nil); + + { TODO : Delphi IDE bug } + // This line doesn't seem to fix it, it raises AVs in the IDE + // PopupForm shouldn't be published. + // if not (csDesigning in ComponentState) then + // SetPopupForm(nil); + end; +end; + +procedure TSpTBXFormPopupMenu.Popup(X, Y: Integer); +begin + InternalPopup(X, Y, FPopupFocus); +end; + +procedure TSpTBXFormPopupMenu.PopupEx(X, Y: Integer; ForceFocus: Boolean); +begin + InternalPopup(X, Y, ForceFocus); +end; + +procedure TSpTBXFormPopupMenu.PopupEx(PopupControl: TControl; ForceFocus: Boolean); +begin + InternalPopup(0, 0, ForceFocus, PopupControl); +end; + +function TSpTBXFormPopupMenu.GetBorderStyle: TSpTBXPopupBorderStyleType; +begin + Result := FWrapperForm.BorderStyle; +end; + +function TSpTBXFormPopupMenu.GetShowShadows: Boolean; +begin + Result := FWrapperForm.ShowShadows; +end; + +procedure TSpTBXFormPopupMenu.SetBorderStyle(const Value: TSpTBXPopupBorderStyleType); +begin + FWrapperForm.BorderStyle := Value; +end; + +procedure TSpTBXFormPopupMenu.SetPopupForm(const Value: TCustomForm); +begin + if FPopupForm <> Value then begin + if FWrapperForm.Visible then + ClosePopup(False); + + if Assigned(FPopupForm) then + FPopupForm.RemoveFreeNotification(Self); + + FPopupForm := Value; + if Assigned(FPopupForm) then + FPopupForm.FreeNotification(Self); + end; +end; + +procedure TSpTBXFormPopupMenu.SetShowShadows(const Value: Boolean); +begin + FWrapperForm.ShowShadows := Value; +end; + +procedure TSpTBXFormPopupMenu.SetSkinType(const Value: TSpTBXSkinType); +begin + if FSkinType <> Value then begin + FSkinType := Value; + FWrapperForm.SkinType := Value; + end; +end; + +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXGlyphs.res b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXGlyphs.res new file mode 100644 index 0000000000000000000000000000000000000000..ce753b77f4d8b38a1b74fa477d3d3734534bf90c GIT binary patch literal 3788 zcmeI#y^b735Ww-;yVWg1790X02bNr+ksLSxiOdD|Wqer1ARsEGj3FeL)`z zq~qh~Z~n2<4GIdwf@4m*FbYq5V^67x9PV}T*EHaYML&wwbgXGv#He?w!co( z_A?yr$n9w>4?%e`>Vo{==|6maP7mhG`giAaf2SAXA?2>m=YKY*`?gSTp4_~vn7#uWcqR_^MV@fnQ0*OK!&%>2ya0C*Cw)r(GN!;QD|Z+P#7G6M4^q_rjwb$5l9r;m=af_ z!4XIl+L*3TqQMbJ6xx`|RHDHVNEF(b=2D`;5l9r;{0OWm(clOq3QdCh4^i|xcl0As zXcF9isKVd~BnoXjHdCU(5l9r;c%-gGgCmeAwDGw4kqCn$kSMgV6jF%>M<7vXW0{l^ z4URyf(B>r+O^F6aAW>*i+<%F};0Pr8(Zhp2C`6 z>s@+UjoQoiy9aV#K9rOH_dAi|0rI?ATyO*ug~pyHP#7G6M4^d^K+z9JAW>-SX#$18 z5l9podzwIDa0C*C#-1in7#x8_p|Ph46b45iQE0+YP#7G6M4_>#2^0oLAW>-SX#$18 z5l9r8@bgggJ9qRWQE2RG0)@d5NE8}-nm}Q21QLbDo+eNj9Dzik@%JcD7#x8_p|Ph4 z6b45iQE2RG0)@d5NE8}-nm}Q21QLZNoDPM-5lHl-jiseZG&ll@LL1A@lxT1S5`{LF zq$|@~|d&D+jg+UI&p&p)2i z$oJB|o;>ZnzIQvHU-tUtlD?0}@FU;LW5_;EABu`y>iJiA9=9+}SLBX-inn;LyCWy^ z4z(j4AMbNL9>_wJ!^rplViwZJxQYE3@A7{55hLu=U!Q+4pFiF)$2FYrR(T?K*>n4Q WW`EPXzaQ#C++R!okF#IPQho=2_S#SY literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXItem.dcu b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXItem.dcu new file mode 100644 index 0000000000000000000000000000000000000000..8f939970825d89327768c828b9bfb32ff5236e29 GIT binary patch literal 336321 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 // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit + +//-- user supplied ----------------------------------------------------------- + +namespace Sptbxitem +{ +//-- type declarations ------------------------------------------------------- +typedef Classes::TStringList* TTntStringList; + +#pragma option push -b- +enum TSpTBXPaintStage { pstPrePaint, pstPostPaint }; +#pragma option pop + +#pragma option push -b- +enum TSpTBXToolbarDisplayMode { tbdmSelectiveCaption, tbdmImageOnly, tbdmImageAboveCaption, tbdmTextOnly }; +#pragma option pop + +#pragma option push -b- +enum TSpTBXToolbarState { tstResizing, tstRightAligning, tstAnchoring }; +#pragma option pop + +typedef Set TSpTBXToolbarStates; + +#pragma option push -b- +enum TSpBorderIcon { briSystemMenu, briMinimize, briMaximize, briClose }; +#pragma option pop + +typedef Set TSpBorderIcons; + +#pragma option push -b- +enum TTextWrapping { twNone, twEndEllipsis, twPathEllipsis, twWrap }; +#pragma option pop + +#pragma option push -b- +enum TSpTBXSearchItemViewerType { sivtNormal, sivtInmediate, sivtInmediateSkipNonVisible }; +#pragma option pop + +typedef void __fastcall (__closure *TSpTBXGetImageIndexEvent)(System::TObject* Sender, Imglist::TCustomImageList* &AImageList, int &AItemIndex); + +typedef void __fastcall (__closure *TSpTBXDrawEvent)(System::TObject* Sender, Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const TSpTBXPaintStage PaintStage, bool &PaintDefault); + +typedef void __fastcall (__closure *TSpTBXDrawImageEvent)(System::TObject* Sender, Graphics::TCanvas* ACanvas, Sptbxskins::TSpTBXSkinStatesType State, const TSpTBXPaintStage PaintStage, Imglist::TCustomImageList* &AImageList, int &AImageIndex, Types::TRect &ARect, bool &PaintDefault); + +typedef void __fastcall (__closure *TSpTBXDrawItemEvent)(System::TObject* Sender, Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxskins::TSpTBXMenuItemInfo &ItemInfo, const TSpTBXPaintStage PaintStage, bool &PaintDefault); + +typedef void __fastcall (__closure *TSpTBXDrawPosEvent)(System::TObject* Sender, Graphics::TCanvas* ACanvas, int X, int Y, bool &PaintDefault); + +typedef void __fastcall (__closure *TSpTBXDrawTextEvent)(System::TObject* Sender, Graphics::TCanvas* ACanvas, const Types::TRect &ClientAreaRect, Sptbxskins::TSpTBXSkinStatesType State, System::WideString &ACaption, Types::TRect &CaptionRect, unsigned &CaptionFormat, bool IsTextRotated, const TSpTBXPaintStage PaintStage, bool &PaintDefault); + +typedef void __fastcall (__closure *TSpTBXDrawHintEvent)(System::TObject* Sender, Graphics::TBitmap* AHintBitmap, System::WideString &AHint, bool &PaintDefault); + +typedef void __fastcall (__closure *TSpTBXItemNotificationEvent)(System::TObject* Sender, Tb2item::TTBCustomItem* Ancestor, bool Relayed, Tb2item::TTBItemChangedAction Action, int Index, Tb2item::TTBCustomItem* Item); + +typedef void __fastcall (__closure *TSpTBXRadioGroupFillStringsEvent)(System::TObject* Sender, Classes::TStringList* Strings); + +typedef void __fastcall (__closure *TSpTBXPopupEvent)(System::TObject* Sender, Tb2item::TTBView* PopupView); + +typedef Word TSpTBXFontSize; + +class DELPHICLASS TSpTBXFontSettings; +class PASCALIMPLEMENTATION TSpTBXFontSettings : public Classes::TPersistent +{ + typedef Classes::TPersistent inherited; + +private: + Graphics::TColor FColor; + Graphics::TFontName FName; + TSpTBXFontSize FSize; + Graphics::TFontStyles FStyle; + Classes::TNotifyEvent FOnChange; + void __fastcall SetColor(Graphics::TColor Value); + void __fastcall SetName(const Graphics::TFontName Value); + void __fastcall SetSize(TSpTBXFontSize Value); + void __fastcall SetStyle(const Graphics::TFontStyles Value); + +protected: + void __fastcall Modified(void); + __property Classes::TNotifyEvent OnChange = {read=FOnChange, write=FOnChange}; + +public: + __fastcall TSpTBXFontSettings(void); + void __fastcall Apply(Graphics::TFont* AFont); + virtual void __fastcall Assign(Classes::TPersistent* Src); + +__published: + __property Graphics::TColor Color = {read=FColor, write=SetColor, default=536870911}; + __property Graphics::TFontName Name = {read=FName, write=SetName}; + __property TSpTBXFontSize Size = {read=FSize, write=SetSize, default=100}; + __property Graphics::TFontStyles Style = {read=FStyle, write=SetStyle, default=0}; +public: + /* TPersistent.Destroy */ inline __fastcall virtual ~TSpTBXFontSettings(void) { } + +}; + + +class DELPHICLASS TSpTBXCustomDragObject; +class PASCALIMPLEMENTATION TSpTBXCustomDragObject : public Controls::TDragObjectEx +{ + typedef Controls::TDragObjectEx inherited; + +private: + Controls::TCursor FDragCursorAccept; + Controls::TCursor FDragCursorCancel; + Controls::TControl* FSourceControl; + Tb2item::TTBCustomItem* FSourceItem; + +protected: + virtual Controls::TCursor __fastcall GetDragCursor(bool Accepted, int X, int Y); + virtual void __fastcall Finished(System::TObject* Target, int X, int Y, bool Accepted); + +public: + __fastcall virtual TSpTBXCustomDragObject(Controls::TControl* ASourceControl, Tb2item::TTBCustomItem* AItem); + __property Controls::TCursor DragCursorAccept = {read=FDragCursorAccept, write=FDragCursorAccept, nodefault}; + __property Controls::TCursor DragCursorCancel = {read=FDragCursorCancel, write=FDragCursorCancel, nodefault}; + __property Tb2item::TTBCustomItem* SouceItem = {read=FSourceItem}; + __property Controls::TControl* SourceControl = {read=FSourceControl}; +public: + /* TObject.Destroy */ inline __fastcall virtual ~TSpTBXCustomDragObject(void) { } + +}; + + +class DELPHICLASS TSpTBXItemDragObject; +class PASCALIMPLEMENTATION TSpTBXItemDragObject : public TSpTBXCustomDragObject +{ + typedef TSpTBXCustomDragObject inherited; + +public: + /* TSpTBXCustomDragObject.Create */ inline __fastcall virtual TSpTBXItemDragObject(Controls::TControl* ASourceControl, Tb2item::TTBCustomItem* AItem) : TSpTBXCustomDragObject(ASourceControl, AItem) { } + +public: + /* TObject.Destroy */ inline __fastcall virtual ~TSpTBXItemDragObject(void) { } + +}; + + +class DELPHICLASS TSpTBXCustomItemActionLink; +class PASCALIMPLEMENTATION TSpTBXCustomItemActionLink : public Tb2item::TTBCustomItemActionLink +{ + typedef Tb2item::TTBCustomItemActionLink inherited; + +public: + /* TBasicActionLink.Create */ inline __fastcall virtual TSpTBXCustomItemActionLink(System::TObject* AClient) : Tb2item::TTBCustomItemActionLink(AClient) { } + /* TBasicActionLink.Destroy */ inline __fastcall virtual ~TSpTBXCustomItemActionLink(void) { } + +}; + + +class DELPHICLASS TSpTBXCustomControl; +class PASCALIMPLEMENTATION TSpTBXCustomControl : public Controls::TCustomControl +{ + typedef Controls::TCustomControl inherited; + +public: + /* TCustomControl.Create */ inline __fastcall virtual TSpTBXCustomControl(Classes::TComponent* AOwner) : Controls::TCustomControl(AOwner) { } + /* TCustomControl.Destroy */ inline __fastcall virtual ~TSpTBXCustomControl(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXCustomControl(HWND ParentWindow) : Controls::TCustomControl(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXCustomItem; +class PASCALIMPLEMENTATION TSpTBXCustomItem : public Tb2item::TTBCustomItem +{ + typedef Tb2item::TTBCustomItem inherited; + +private: + Sptbxskins::TSpGlowDirection FCaptionGlow; + Graphics::TColor FCaptionGlowColor; + Classes::TAlignment FAlignment; + bool FAnchored; + Controls::TControl* FControl; + int FCustomWidth; + int FCustomHeight; + TSpTBXFontSettings* FFontSettings; + int FMargins; + int FMinHeight; + int FMinWidth; + bool FStretch; + bool FToolbarStylePopup; + bool FToolBoxPopup; + TTextWrapping FWrapping; + Classes::TNotifyEvent FOnClosePopup; + TSpTBXPopupEvent FOnInitPopup; + TSpTBXDrawTextEvent FOnDrawCaption; + TSpTBXDrawHintEvent FOnDrawHint; + TSpTBXDrawItemEvent FOnDrawItem; + TSpTBXDrawImageEvent FOnDrawImage; + void __fastcall FontSettingsChanged(System::TObject* Sender); + void __fastcall SetAlignment(const Classes::TAlignment Value); + void __fastcall SetAnchored(const bool Value); + void __fastcall SetCaptionGlow(const Sptbxskins::TSpGlowDirection Value); + void __fastcall SetCaptionGlowColor(const Graphics::TColor Value); + void __fastcall SetControl(const Controls::TControl* Value); + void __fastcall SetCustomWidth(int Value); + void __fastcall SetCustomHeight(int Value); + void __fastcall SetFontSettings(const TSpTBXFontSettings* Value); + void __fastcall SetMargins(int Value); + void __fastcall SetMinHeight(const int Value); + void __fastcall SetMinWidth(const int Value); + void __fastcall SetStretch(const bool Value); + void __fastcall SetToolBoxPopup(const bool Value); + void __fastcall SetWrapping(const TTextWrapping Value); + +protected: + DYNAMIC void __fastcall ActionChange(System::TObject* Sender, bool CheckDefaults); + virtual bool __fastcall DialogChar(System::Word CharCode); + virtual void __fastcall DefineProperties(Classes::TFiler* Filer); + virtual void __fastcall DoDrawAdjustFont(Graphics::TFont* AFont, Sptbxskins::TSpTBXSkinStatesType State); + virtual void __fastcall DoDrawHint(Graphics::TBitmap* AHintBitmap, System::WideString &AHint, bool &PaintDefault); + virtual void __fastcall DoDrawButton(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxskins::TSpTBXMenuItemInfo &ItemInfo, const TSpTBXPaintStage PaintStage, bool &PaintDefault); + virtual void __fastcall DoDrawCaption(Graphics::TCanvas* ACanvas, const Types::TRect &ClientAreaRect, Sptbxskins::TSpTBXSkinStatesType State, System::WideString &ACaption, Types::TRect &CaptionRect, unsigned &CaptionFormat, bool IsTextRotated, const TSpTBXPaintStage PaintStage, bool &PaintDefault); + virtual void __fastcall DoDrawImage(Graphics::TCanvas* ACanvas, Sptbxskins::TSpTBXSkinStatesType State, const TSpTBXPaintStage PaintStage, Imglist::TCustomImageList* &AImageList, int &AImageIndex, Types::TRect &ARect, bool &PaintDefault); + virtual void __fastcall DoPopupShowingChanged(Tb2item::TTBPopupWindow* APopupWindow, bool IsVisible); + DYNAMIC Tb2item::TTBCustomItemActionLinkClass __fastcall GetActionLinkClass(void); + virtual Tb2item::TTBItemViewerClass __fastcall GetItemViewerClass(Tb2item::TTBView* AView); + virtual Tb2item::TTBPopupWindowClass __fastcall GetPopupWindowClass(void); + virtual void __fastcall ToggleControl(void); + virtual void __fastcall UpdateProps(void); + virtual void __fastcall Notification(Classes::TComponent* AComponent, Classes::TOperation Operation); + __property Classes::TAlignment Alignment = {read=FAlignment, write=SetAlignment, default=2}; + __property bool Anchored = {read=FAnchored, write=SetAnchored, default=0}; + __property Sptbxskins::TSpGlowDirection CaptionGlow = {read=FCaptionGlow, write=SetCaptionGlow, default=0}; + __property Graphics::TColor CaptionGlowColor = {read=FCaptionGlowColor, write=SetCaptionGlowColor, default=65535}; + __property Controls::TControl* Control = {read=FControl, write=SetControl}; + __property int CustomWidth = {read=FCustomWidth, write=SetCustomWidth, default=-1}; + __property int CustomHeight = {read=FCustomHeight, write=SetCustomHeight, default=-1}; + __property TSpTBXFontSettings* FontSettings = {read=FFontSettings, write=SetFontSettings}; + __property int Margins = {read=FMargins, write=SetMargins, default=0}; + __property int MinHeight = {read=FMinHeight, write=SetMinHeight, default=0}; + __property int MinWidth = {read=FMinWidth, write=SetMinWidth, default=0}; + __property bool ToolbarStylePopup = {read=FToolbarStylePopup, write=FToolbarStylePopup, default=0}; + __property bool ToolBoxPopup = {read=FToolBoxPopup, write=SetToolBoxPopup, default=0}; + __property bool Stretch = {read=FStretch, write=SetStretch, default=1}; + __property Classes::TNotifyEvent OnClosePopup = {read=FOnClosePopup, write=FOnClosePopup}; + __property TSpTBXPopupEvent OnInitPopup = {read=FOnInitPopup, write=FOnInitPopup}; + __property TSpTBXDrawTextEvent OnDrawCaption = {read=FOnDrawCaption, write=FOnDrawCaption}; + __property TSpTBXDrawHintEvent OnDrawHint = {read=FOnDrawHint, write=FOnDrawHint}; + __property TSpTBXDrawImageEvent OnDrawImage = {read=FOnDrawImage, write=FOnDrawImage}; + __property TSpTBXDrawItemEvent OnDrawItem = {read=FOnDrawItem, write=FOnDrawItem}; + +public: + __fastcall virtual TSpTBXCustomItem(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXCustomItem(void); + virtual void __fastcall Click(void); + HIDESBASE System::WideString __fastcall GetShortCutText(); + virtual void __fastcall InitiateAction(void); + void __fastcall Invalidate(void); + +__published: + __property Caption; + __property Hint; + __property TTextWrapping Wrapping = {read=FWrapping, write=SetWrapping, default=3}; +}; + + +class DELPHICLASS TSpTBXItemViewer; +class PASCALIMPLEMENTATION TSpTBXItemViewer : public Tb2item::TTBItemViewer +{ + typedef Tb2item::TTBItemViewer inherited; + +private: + TSpTBXCustomItem* __fastcall GetItem(void); + MESSAGE void __fastcall CMHintShow(Messages::TMessage &Message); + void __fastcall InternalCalcSize(const Graphics::TCanvas* Canvas, bool CalcStretch, int &AWidth, int &AHeight); + +protected: + Types::TPoint FAnchorSize; + int FAnchorDelta; + virtual void __fastcall DoDrawAdjustFont(Graphics::TFont* AFont, Sptbxskins::TSpTBXSkinStatesType State); + virtual void __fastcall DoDrawButton(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxskins::TSpTBXMenuItemInfo &ItemInfo, const TSpTBXPaintStage PaintStage, bool &PaintDefault); + virtual void __fastcall DoDrawCaption(Graphics::TCanvas* ACanvas, const Types::TRect &ClientAreaRect, Sptbxskins::TSpTBXSkinStatesType State, System::WideString &ACaption, Types::TRect &CaptionRect, unsigned &CaptionFormat, bool IsTextRotated, const TSpTBXPaintStage PaintStage, bool &PaintDefault); + virtual void __fastcall DoDrawImage(Graphics::TCanvas* ACanvas, Sptbxskins::TSpTBXSkinStatesType State, const TSpTBXPaintStage PaintStage, Imglist::TCustomImageList* &AImageList, int &AImageIndex, Types::TRect &ARect, bool &PaintDefault); + virtual void __fastcall DoDrawHint(Graphics::TBitmap* AHintBitmap, const Types::TPoint &CursorPos, Types::TRect &CursorRect, System::WideString &AHint, bool &PaintDefault); + DYNAMIC bool __fastcall CaptionShown(void); + virtual bool __fastcall GetImageShown(void); + virtual tagSIZE __fastcall GetImageSize(); + virtual tagSIZE __fastcall GetRightImageSize(); + virtual Graphics::TColor __fastcall GetTextColor(Sptbxskins::TSpTBXSkinStatesType State); + virtual void __fastcall DrawItemImage(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxskins::TSpTBXMenuItemInfo &ItemInfo, int ImgIndex); + virtual void __fastcall DrawItemRightImage(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxskins::TSpTBXMenuItemInfo &ItemInfo); + virtual void __fastcall CalcSize(const Graphics::TCanvas* Canvas, int &AWidth, int &AHeight); + void __fastcall GetTextInfo(Graphics::TCanvas* ACanvas, Sptbxskins::TSpTBXSkinStatesType State, /* out */ Sptbxskins::TSpTBXTextInfo &TextInfo); + virtual void __fastcall Paint(const Graphics::TCanvas* Canvas, const Types::TRect &ClientAreaRect, bool IsSelected, bool IsPushed, bool UseDisabledShadow); + virtual void __fastcall Entering(void); + virtual void __fastcall InternalMouseMove(Classes::TShiftState Shift, int X, int Y); + +public: + HIDESBASE virtual System::WideString __fastcall GetCaptionText(); + HIDESBASE virtual System::WideString __fastcall GetHintText(); + __property TSpTBXCustomItem* Item = {read=GetItem}; +public: + /* TTBItemViewer.Create */ inline __fastcall virtual TSpTBXItemViewer(Tb2item::TTBView* AView, Tb2item::TTBCustomItem* AItem, int AGroupLevel) : Tb2item::TTBItemViewer(AView, AItem, AGroupLevel) { } + /* TTBItemViewer.Destroy */ inline __fastcall virtual ~TSpTBXItemViewer(void) { } + +}; + + +class DELPHICLASS TSpTBXItem; +class PASCALIMPLEMENTATION TSpTBXItem : public TSpTBXCustomItem +{ + typedef TSpTBXCustomItem inherited; + +__published: + __property Action; + __property AutoCheck = {default=0}; + __property Checked = {default=0}; + __property DisplayMode = {default=0}; + __property Enabled = {default=1}; + __property GroupIndex = {default=0}; + __property HelpContext = {default=0}; + __property ImageIndex = {default=-1}; + __property Images; + __property InheritOptions = {default=1}; + __property MaskOptions = {default=0}; + __property Options = {default=0}; + __property RadioItem = {default=0}; + __property ShortCut = {default=0}; + __property Visible = {default=1}; + __property OnClick; + __property OnSelect; + __property Alignment = {default=2}; + __property Anchored = {default=0}; + __property CaptionGlow = {default=0}; + __property CaptionGlowColor = {default=65535}; + __property Control; + __property CustomWidth = {default=-1}; + __property CustomHeight = {default=-1}; + __property FontSettings; + __property Margins = {default=0}; + __property MinHeight = {default=0}; + __property MinWidth = {default=0}; + __property OnDrawCaption; + __property OnDrawHint; + __property OnDrawImage; + __property OnDrawItem; +public: + /* TSpTBXCustomItem.Create */ inline __fastcall virtual TSpTBXItem(Classes::TComponent* AOwner) : TSpTBXCustomItem(AOwner) { } + /* TSpTBXCustomItem.Destroy */ inline __fastcall virtual ~TSpTBXItem(void) { } + +}; + + +class DELPHICLASS TSpTBXRootItem; +class PASCALIMPLEMENTATION TSpTBXRootItem : public Tb2item::TTBRootItem +{ + typedef Tb2item::TTBRootItem inherited; + +private: + bool FToolBoxPopup; + TSpTBXPopupEvent FOnInitPopup; + Classes::TNotifyEvent FOnClosePopup; + void __fastcall SetToolBoxPopup(const bool Value); + +protected: + virtual void __fastcall DoPopupShowingChanged(Tb2item::TTBPopupWindow* APopupWindow, bool IsVisible); + virtual Tb2item::TTBPopupWindowClass __fastcall GetPopupWindowClass(void); + __property bool ToolBoxPopup = {read=FToolBoxPopup, write=SetToolBoxPopup, default=0}; + +public: + __property TSpTBXPopupEvent OnInitPopup = {read=FOnInitPopup, write=FOnInitPopup}; + __property Classes::TNotifyEvent OnClosePopup = {read=FOnClosePopup, write=FOnClosePopup}; +public: + /* TTBCustomItem.Create */ inline __fastcall virtual TSpTBXRootItem(Classes::TComponent* AOwner) : Tb2item::TTBRootItem(AOwner) { } + /* TTBCustomItem.Destroy */ inline __fastcall virtual ~TSpTBXRootItem(void) { } + +}; + + +class DELPHICLASS TSpTBXSubmenuItem; +class PASCALIMPLEMENTATION TSpTBXSubmenuItem : public TSpTBXItem +{ + typedef TSpTBXItem inherited; + +private: + bool FHideEmptyPopup; + bool __fastcall GetDropdownCombo(void); + void __fastcall SetDropdownCombo(bool Value); + +public: + __fastcall virtual TSpTBXSubmenuItem(Classes::TComponent* AOwner); + +__published: + __property bool DropdownCombo = {read=GetDropdownCombo, write=SetDropdownCombo, default=0}; + __property bool HideEmptyPopup = {read=FHideEmptyPopup, write=FHideEmptyPopup, default=0}; + __property LinkSubitems; + __property SubMenuImages; + __property ToolbarStylePopup = {default=0}; + __property ToolBoxPopup = {default=0}; + __property OnPopup; + __property OnClosePopup; + __property OnInitPopup; +public: + /* TSpTBXCustomItem.Destroy */ inline __fastcall virtual ~TSpTBXSubmenuItem(void) { } + +}; + + +class DELPHICLASS TSpTBXColorItem; +class PASCALIMPLEMENTATION TSpTBXColorItem : public TSpTBXCustomItem +{ + typedef TSpTBXCustomItem inherited; + +private: + Graphics::TColor FColor; + void __fastcall SetColor(Graphics::TColor Value); + +protected: + virtual Tb2item::TTBItemViewerClass __fastcall GetItemViewerClass(Tb2item::TTBView* AView); + +public: + __fastcall virtual TSpTBXColorItem(Classes::TComponent* AOwner); + +__published: + __property Action; + __property AutoCheck = {default=0}; + __property Checked = {default=0}; + __property DisplayMode = {default=0}; + __property Enabled = {default=1}; + __property GroupIndex = {default=0}; + __property HelpContext = {default=0}; + __property InheritOptions = {default=1}; + __property MaskOptions = {default=0}; + __property Options = {default=0}; + __property ShortCut = {default=0}; + __property Visible = {default=1}; + __property OnClick; + __property OnSelect; + __property Alignment = {default=2}; + __property Anchored = {default=0}; + __property CaptionGlow = {default=0}; + __property CaptionGlowColor = {default=65535}; + __property Control; + __property CustomWidth = {default=-1}; + __property CustomHeight = {default=-1}; + __property FontSettings; + __property Margins = {default=0}; + __property MinHeight = {default=0}; + __property MinWidth = {default=0}; + __property OnDrawCaption; + __property OnDrawHint; + __property OnDrawImage; + __property OnDrawItem; + __property Graphics::TColor Color = {read=FColor, write=SetColor, default=16777215}; +public: + /* TSpTBXCustomItem.Destroy */ inline __fastcall virtual ~TSpTBXColorItem(void) { } + +}; + + +class DELPHICLASS TSpTBXColorItemViewer; +class PASCALIMPLEMENTATION TSpTBXColorItemViewer : public TSpTBXItemViewer +{ + typedef TSpTBXItemViewer inherited; + +protected: + virtual void __fastcall DoDrawImage(Graphics::TCanvas* ACanvas, Sptbxskins::TSpTBXSkinStatesType State, const TSpTBXPaintStage PaintStage, Imglist::TCustomImageList* &AImageList, int &AImageIndex, Types::TRect &ARect, bool &PaintDefault); + virtual bool __fastcall GetImageShown(void); + virtual tagSIZE __fastcall GetImageSize(); +public: + /* TTBItemViewer.Create */ inline __fastcall virtual TSpTBXColorItemViewer(Tb2item::TTBView* AView, Tb2item::TTBCustomItem* AItem, int AGroupLevel) : TSpTBXItemViewer(AView, AItem, AGroupLevel) { } + /* TTBItemViewer.Destroy */ inline __fastcall virtual ~TSpTBXColorItemViewer(void) { } + +}; + + +class DELPHICLASS TSpTBXCustomLabelItem; +class PASCALIMPLEMENTATION TSpTBXCustomLabelItem : public TSpTBXCustomItem +{ + typedef TSpTBXCustomItem inherited; + +protected: + virtual bool __fastcall DialogChar(System::Word CharCode); + virtual void __fastcall DoDrawButton(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxskins::TSpTBXMenuItemInfo &ItemInfo, const TSpTBXPaintStage PaintStage, bool &PaintDefault); + virtual Tb2item::TTBItemViewerClass __fastcall GetItemViewerClass(Tb2item::TTBView* AView); + virtual void __fastcall ToggleControl(void); + virtual void __fastcall UpdateProps(void); + __property Alignment = {default=0}; + +public: + __fastcall virtual TSpTBXCustomLabelItem(Classes::TComponent* AOwner); +public: + /* TSpTBXCustomItem.Destroy */ inline __fastcall virtual ~TSpTBXCustomLabelItem(void) { } + +}; + + +class DELPHICLASS TSpTBXLabelItemViewer; +class PASCALIMPLEMENTATION TSpTBXLabelItemViewer : public TSpTBXItemViewer +{ + typedef TSpTBXItemViewer inherited; + +protected: + virtual void __fastcall CalcSize(const Graphics::TCanvas* Canvas, int &AWidth, int &AHeight); + virtual bool __fastcall DoExecute(void); +public: + /* TTBItemViewer.Create */ inline __fastcall virtual TSpTBXLabelItemViewer(Tb2item::TTBView* AView, Tb2item::TTBCustomItem* AItem, int AGroupLevel) : TSpTBXItemViewer(AView, AItem, AGroupLevel) { } + /* TTBItemViewer.Destroy */ inline __fastcall virtual ~TSpTBXLabelItemViewer(void) { } + +}; + + +class DELPHICLASS TSpTBXLabelItem; +class PASCALIMPLEMENTATION TSpTBXLabelItem : public TSpTBXCustomLabelItem +{ + typedef TSpTBXCustomLabelItem inherited; + +__published: + __property Enabled = {default=1}; + __property ImageIndex = {default=-1}; + __property Images; + __property InheritOptions = {default=1}; + __property MaskOptions = {default=0}; + __property Options = {default=0}; + __property Visible = {default=1}; + __property OnClick; + __property Alignment = {default=0}; + __property Anchored = {default=0}; + __property CaptionGlow = {default=0}; + __property CaptionGlowColor = {default=65535}; + __property Control; + __property CustomWidth = {default=-1}; + __property CustomHeight = {default=-1}; + __property FontSettings; + __property Margins = {default=0}; + __property MinHeight = {default=0}; + __property MinWidth = {default=0}; + __property OnDrawCaption; + __property OnDrawHint; + __property OnDrawImage; + __property OnDrawItem; +public: + /* TSpTBXCustomLabelItem.Create */ inline __fastcall virtual TSpTBXLabelItem(Classes::TComponent* AOwner) : TSpTBXCustomLabelItem(AOwner) { } + +public: + /* TSpTBXCustomItem.Destroy */ inline __fastcall virtual ~TSpTBXLabelItem(void) { } + +}; + + +class DELPHICLASS TSpTBXSeparatorItem; +class PASCALIMPLEMENTATION TSpTBXSeparatorItem : public Tb2item::TTBSeparatorItem +{ + typedef Tb2item::TTBSeparatorItem inherited; + +protected: + virtual Tb2item::TTBItemViewerClass __fastcall GetItemViewerClass(Tb2item::TTBView* AView); +public: + /* TTBSeparatorItem.Create */ inline __fastcall virtual TSpTBXSeparatorItem(Classes::TComponent* AOwner) : Tb2item::TTBSeparatorItem(AOwner) { } + +public: + /* TTBCustomItem.Destroy */ inline __fastcall virtual ~TSpTBXSeparatorItem(void) { } + +}; + + +class DELPHICLASS TSpTBXSeparatorItemViewer; +class PASCALIMPLEMENTATION TSpTBXSeparatorItemViewer : public Tb2item::TTBSeparatorItemViewer +{ + typedef Tb2item::TTBSeparatorItemViewer inherited; + +protected: + virtual void __fastcall CalcSize(const Graphics::TCanvas* Canvas, int &AWidth, int &AHeight); + bool __fastcall IsStatusBarSeparator(void); + virtual void __fastcall Paint(const Graphics::TCanvas* Canvas, const Types::TRect &ClientAreaRect, bool IsSelected, bool IsPushed, bool UseDisabledShadow); +public: + /* TTBItemViewer.Create */ inline __fastcall virtual TSpTBXSeparatorItemViewer(Tb2item::TTBView* AView, Tb2item::TTBCustomItem* AItem, int AGroupLevel) : Tb2item::TTBSeparatorItemViewer(AView, AItem, AGroupLevel) { } + /* TTBItemViewer.Destroy */ inline __fastcall virtual ~TSpTBXSeparatorItemViewer(void) { } + +}; + + +class DELPHICLASS TSpTBXRightAlignSpacerItem; +class PASCALIMPLEMENTATION TSpTBXRightAlignSpacerItem : public TSpTBXCustomLabelItem +{ + typedef TSpTBXCustomLabelItem inherited; + +__published: + __property ImageIndex = {default=-1}; + __property Images; + __property MaskOptions = {default=0}; + __property Options = {default=0}; + __property OnClick; + __property Alignment = {default=0}; + __property CaptionGlow = {default=0}; + __property CaptionGlowColor = {default=65535}; + __property CustomWidth = {default=-1}; + __property CustomHeight = {default=-1}; + __property FontSettings; + __property OnDrawCaption; + __property OnDrawHint; + __property OnDrawImage; + __property OnDrawItem; +public: + /* TSpTBXCustomLabelItem.Create */ inline __fastcall virtual TSpTBXRightAlignSpacerItem(Classes::TComponent* AOwner) : TSpTBXCustomLabelItem(AOwner) { } + +public: + /* TSpTBXCustomItem.Destroy */ inline __fastcall virtual ~TSpTBXRightAlignSpacerItem(void) { } + +}; + + +class DELPHICLASS TSpTBXRadioGroupItem; +class PASCALIMPLEMENTATION TSpTBXRadioGroupItem : public Tb2item::TTBGroupItem +{ + typedef Tb2item::TTBGroupItem inherited; + +private: + int FDefaultIndex; + int FLastClickedIndex; + Classes::TNotifyEvent FOnClick; + TSpTBXRadioGroupFillStringsEvent FOnFillStrings; + Classes::TNotifyEvent FOnUpdate; + +protected: + Classes::TStringList* FStrings; + virtual void __fastcall Loaded(void); + virtual void __fastcall ItemClickEvent(System::TObject* Sender); + virtual void __fastcall DoClick(TSpTBXItem* AItem); + virtual void __fastcall DoFillStrings(void); + +public: + __fastcall virtual TSpTBXRadioGroupItem(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXRadioGroupItem(void); + void __fastcall Recreate(void); + __property int DefaultIndex = {read=FDefaultIndex, write=FDefaultIndex, nodefault}; + __property int LastClickedIndex = {read=FLastClickedIndex, nodefault}; + +__published: + __property Classes::TNotifyEvent OnClick = {read=FOnClick, write=FOnClick}; + __property TSpTBXRadioGroupFillStringsEvent OnFillStrings = {read=FOnFillStrings, write=FOnFillStrings}; + __property Classes::TNotifyEvent OnUpdate = {read=FOnUpdate, write=FOnUpdate}; +}; + + +class DELPHICLASS TSpTBXSkinGroupItem; +class PASCALIMPLEMENTATION TSpTBXSkinGroupItem : public TSpTBXRadioGroupItem +{ + typedef TSpTBXRadioGroupItem inherited; + +private: + Classes::TNotifyEvent FOnSkinChange; + MESSAGE void __fastcall WMSpSkinChange(Messages::TMessage &Message); + +protected: + virtual void __fastcall DoClick(TSpTBXItem* AItem); + virtual void __fastcall DoSkinChange(void); + virtual void __fastcall DoFillStrings(void); + +public: + __fastcall virtual TSpTBXSkinGroupItem(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXSkinGroupItem(void); + +__published: + __property Classes::TNotifyEvent OnSkinChange = {read=FOnSkinChange, write=FOnSkinChange}; +}; + + +class DELPHICLASS TSpTBXSystemMenuItem; +class PASCALIMPLEMENTATION TSpTBXSystemMenuItem : public TSpTBXCustomItem +{ + typedef TSpTBXCustomItem inherited; + +private: + bool FMDISystemMenu; + bool FShowSize; + void __fastcall CommandClick(System::TObject* Sender); + +protected: + virtual Tb2item::TTBItemViewerClass __fastcall GetItemViewerClass(Tb2item::TTBView* AView); + Forms::TCustomForm* __fastcall GetSystemMenuParentForm(void); + +public: + __fastcall virtual TSpTBXSystemMenuItem(Classes::TComponent* AOwner); + virtual void __fastcall Click(void); + +__published: + __property bool MDISystemMenu = {read=FMDISystemMenu, write=FMDISystemMenu, default=0}; + __property bool ShowSize = {read=FShowSize, write=FShowSize, default=1}; +public: + /* TSpTBXCustomItem.Destroy */ inline __fastcall virtual ~TSpTBXSystemMenuItem(void) { } + +}; + + +class DELPHICLASS TSpTBXSystemMenuItemViewer; +class PASCALIMPLEMENTATION TSpTBXSystemMenuItemViewer : public TSpTBXItemViewer +{ + typedef TSpTBXItemViewer inherited; + +protected: + virtual void __fastcall CalcSize(const Graphics::TCanvas* Canvas, int &AWidth, int &AHeight); + virtual void __fastcall Paint(const Graphics::TCanvas* Canvas, const Types::TRect &ClientAreaRect, bool IsSelected, bool IsPushed, bool UseDisabledShadow); +public: + /* TTBItemViewer.Create */ inline __fastcall virtual TSpTBXSystemMenuItemViewer(Tb2item::TTBView* AView, Tb2item::TTBCustomItem* AItem, int AGroupLevel) : TSpTBXItemViewer(AView, AItem, AGroupLevel) { } + /* TTBItemViewer.Destroy */ inline __fastcall virtual ~TSpTBXSystemMenuItemViewer(void) { } + +}; + + +typedef ShortInt TSpTBXRowColCount; + +typedef void __fastcall (__closure *TSpTBXTPGetCellHint)(System::TObject* Sender, int ACol, int ARow, System::WideString &AHint); + +typedef void __fastcall (__closure *TSpTBXTPDrawCellImage)(System::TObject* Sender, Graphics::TCanvas* ACanvas, const Types::TRect &ARect, int ACol, int ARow, bool Selected, bool HotTrack, bool Enabled); + +typedef void __fastcall (__closure *TSpTBXTPCellClick)(System::TObject* Sender, int ACol, int ARow, bool &Allow); + +typedef void __fastcall (__closure *TSpTBXCPGetColorInfo)(System::TObject* Sender, int ACol, int ARow, Graphics::TColor &Color, System::WideString &Name); + +class DELPHICLASS TSpTBXCustomToolPalette; +class PASCALIMPLEMENTATION TSpTBXCustomToolPalette : public TSpTBXCustomItem +{ + typedef TSpTBXCustomItem inherited; + +private: + bool FCustomImages; + TSpTBXRowColCount FColCount; + TSpTBXRowColCount FRowCount; + Types::TPoint FSelectedCell; + Classes::TNotifyEvent FOnChange; + TSpTBXTPCellClick FOnCellClick; + TSpTBXTPDrawCellImage FOnDrawCellImage; + TSpTBXTPGetCellHint FOnGetCellHint; + void __fastcall SetSelectedCell(const Types::TPoint &Value); + +protected: + virtual bool __fastcall DoCellClick(int ACol, int ARow); + virtual void __fastcall DoChange(void); + virtual void __fastcall DoDrawCellImage(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, int ACol, int ARow, const Sptbxskins::TSpTBXMenuItemInfo &ItemInfo); + virtual void __fastcall DoGetCellHint(int ACol, int ARow, System::WideString &AHint); + virtual Tb2item::TTBItemViewerClass __fastcall GetItemViewerClass(Tb2item::TTBView* AView); + virtual void __fastcall HandleClickCell(int ACol, int ARow); + virtual void __fastcall SetColCount(TSpTBXRowColCount Value); + virtual void __fastcall SetRowCount(TSpTBXRowColCount Value); + __property bool CustomImages = {read=FCustomImages, write=FCustomImages, nodefault}; + __property TSpTBXRowColCount ColCount = {read=FColCount, write=SetColCount, default=1}; + __property TSpTBXRowColCount RowCount = {read=FRowCount, write=SetRowCount, default=1}; + __property Types::TPoint SelectedCell = {read=FSelectedCell, write=SetSelectedCell}; + __property Classes::TNotifyEvent OnChange = {read=FOnChange, write=FOnChange}; + __property TSpTBXTPCellClick OnCellClick = {read=FOnCellClick, write=FOnCellClick}; + __property TSpTBXTPDrawCellImage OnDrawCellImage = {read=FOnDrawCellImage, write=FOnDrawCellImage}; + __property TSpTBXTPGetCellHint OnGetCellHint = {read=FOnGetCellHint, write=FOnGetCellHint}; + +public: + __fastcall virtual TSpTBXCustomToolPalette(Classes::TComponent* AOwner); +public: + /* TSpTBXCustomItem.Destroy */ inline __fastcall virtual ~TSpTBXCustomToolPalette(void) { } + +}; + + +class DELPHICLASS TSpTBXToolPalette; +class PASCALIMPLEMENTATION TSpTBXToolPalette : public TSpTBXCustomToolPalette +{ + typedef TSpTBXCustomToolPalette inherited; + +public: + __property SelectedCell; + +__published: + __property ColCount = {default=1}; + __property HelpContext = {default=0}; + __property Images; + __property Options = {default=0}; + __property RowCount = {default=1}; + __property Visible = {default=1}; + __property OnChange; + __property OnCellClick; + __property OnDrawCellImage; + __property OnGetCellHint; +public: + /* TSpTBXCustomToolPalette.Create */ inline __fastcall virtual TSpTBXToolPalette(Classes::TComponent* AOwner) : TSpTBXCustomToolPalette(AOwner) { } + +public: + /* TSpTBXCustomItem.Destroy */ inline __fastcall virtual ~TSpTBXToolPalette(void) { } + +}; + + +class DELPHICLASS TSpTBXToolViewer; +class PASCALIMPLEMENTATION TSpTBXToolViewer : public TSpTBXItemViewer +{ + typedef TSpTBXItemViewer inherited; + +private: + int FCellHeight; + int FCellWidth; + int FColCount; + int FRowCount; + Types::TPoint FHotCell; + HIDESBASE TSpTBXCustomToolPalette* __fastcall GetItem(void); + +protected: + int FIndent; + bool FMouseIsDown; + virtual void __fastcall CalcCellSize(Graphics::TCanvas* ACanvas, int &AWidth, int &AHeight); + virtual void __fastcall CalcSize(const Graphics::TCanvas* Canvas, int &AWidth, int &AHeight); + int __fastcall GetImageIndex(int Col, int Row); + virtual tagSIZE __fastcall GetImageSize(); + virtual bool __fastcall GetImageShown(void); + bool __fastcall GetCellAt(int X, int Y, /* out */ int &Col, /* out */ int &Row); + virtual Types::TRect __fastcall GetCellRect(const Types::TRect &ClientAreaRect, int Col, int Row); + System::WideString __fastcall GetCellHint(int Col, int Row); + virtual void __fastcall DoDrawHint(Graphics::TBitmap* AHintBitmap, const Types::TPoint &CursorPos, Types::TRect &CursorRect, System::WideString &AHint, bool &PaintDefault); + virtual void __fastcall DrawCellImage(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, int Col, int Row, const Sptbxskins::TSpTBXMenuItemInfo &ItemInfo); + virtual void __fastcall Entering(void); + void __fastcall InvalidateCell(int ACol, int ARow); + virtual bool __fastcall IsCellVisible(const Types::TPoint &Cell); + virtual void __fastcall KeyDown(System::Word &Key, Classes::TShiftState Shift); + virtual void __fastcall MouseDown(Classes::TShiftState Shift, int X, int Y, bool &MouseDownOnMenu); + virtual void __fastcall MouseMove(int X, int Y); + virtual void __fastcall MouseUp(int X, int Y, bool MouseWasDownOnMenu); + virtual void __fastcall Paint(const Graphics::TCanvas* Canvas, const Types::TRect &ClientAreaRect, bool IsSelected, bool IsPushed, bool UseDisabledShadow); + +public: + __fastcall virtual TSpTBXToolViewer(Tb2item::TTBView* AView, Tb2item::TTBCustomItem* AItem, int AGroupLevel); + __property TSpTBXCustomToolPalette* Item = {read=GetItem}; +public: + /* TTBItemViewer.Destroy */ inline __fastcall virtual ~TSpTBXToolViewer(void) { } + +}; + + +class DELPHICLASS TSpTBXColorPalette; +class PASCALIMPLEMENTATION TSpTBXColorPalette : public TSpTBXCustomToolPalette +{ + typedef TSpTBXCustomToolPalette inherited; + +private: + Graphics::TColor FColor; + bool FCustomColors; + TSpTBXCPGetColorInfo FOnGetColor; + void __fastcall SetColor(Graphics::TColor Value); + void __fastcall SetCustomColors(const bool Value); + +protected: + virtual void __fastcall DoChange(void); + virtual void __fastcall DoGetCellHint(int ACol, int ARow, System::WideString &AHint); + virtual void __fastcall DoDrawCellImage(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, int ACol, int ARow, const Sptbxskins::TSpTBXMenuItemInfo &ItemInfo); + Graphics::TColor __fastcall GetCellColor(int ACol, int ARow); + void __fastcall GetCellInfo(int ACol, int ARow, /* out */ Graphics::TColor &AColor, /* out */ System::WideString &AName); + virtual void __fastcall SetColCount(TSpTBXRowColCount Value); + virtual void __fastcall SetRowCount(TSpTBXRowColCount Value); + +public: + __fastcall virtual TSpTBXColorPalette(Classes::TComponent* AOwner); + Types::TPoint __fastcall FindCell(Graphics::TColor AColor); + +__published: + __property bool CustomColors = {read=FCustomColors, write=SetCustomColors, default=0}; + __property ColCount = {default=8}; + __property Graphics::TColor Color = {read=FColor, write=SetColor, default=536870911}; + __property HelpContext = {default=0}; + __property InheritOptions = {default=1}; + __property MaskOptions = {default=0}; + __property Options = {default=128}; + __property RowCount = {default=5}; + __property Visible = {default=1}; + __property OnChange; + __property OnCellClick; + __property OnGetCellHint; + __property TSpTBXCPGetColorInfo OnGetColor = {read=FOnGetColor, write=FOnGetColor}; +public: + /* TSpTBXCustomItem.Destroy */ inline __fastcall virtual ~TSpTBXColorPalette(void) { } + +}; + + +class DELPHICLASS TSpTBXItemCache; +class PASCALIMPLEMENTATION TSpTBXItemCache : public Classes::TCollectionItem +{ + typedef Classes::TCollectionItem inherited; + +private: + Tb2dock::TTBDock* FDock; + Classes::TComponentName FName; + Tb2item::TTBCustomItem* FItem; + int FWidth; + int FHeight; + int FParentWidth; + int FParentHeight; + Classes::TComponentName __fastcall GetName(); + +public: + virtual void __fastcall Assign(Classes::TPersistent* Source); + __property Tb2item::TTBCustomItem* Item = {read=FItem, write=FItem}; + +__published: + __property Tb2dock::TTBDock* Dock = {read=FDock, write=FDock}; + __property Classes::TComponentName Name = {read=GetName, write=FName}; + __property int Width = {read=FWidth, write=FWidth, default=0}; + __property int Height = {read=FHeight, write=FHeight, default=0}; + __property int ParentWidth = {read=FParentWidth, write=FParentWidth, default=0}; + __property int ParentHeight = {read=FParentHeight, write=FParentHeight, default=0}; +public: + /* TCollectionItem.Create */ inline __fastcall virtual TSpTBXItemCache(Classes::TCollection* Collection) : Classes::TCollectionItem(Collection) { } + /* TCollectionItem.Destroy */ inline __fastcall virtual ~TSpTBXItemCache(void) { } + +}; + + +class DELPHICLASS TSpTBXItemCacheCollection; +class PASCALIMPLEMENTATION TSpTBXItemCacheCollection : public Classes::TCollection +{ + typedef Classes::TCollection inherited; + +public: + TSpTBXItemCache* operator[](int Index) { return Items[Index]; } + +private: + HIDESBASE TSpTBXItemCache* __fastcall GetItem(int Index); + HIDESBASE void __fastcall SetItem(int Index, const TSpTBXItemCache* Value); + +public: + HIDESBASE virtual int __fastcall Add(Tb2item::TTBCustomItem* AItem); + int __fastcall IndexOf(Tb2item::TTBCustomItem* AItem); + __property TSpTBXItemCache* Items[int Index] = {read=GetItem, write=SetItem/*, default*/}; +public: + /* TCollection.Create */ inline __fastcall TSpTBXItemCacheCollection(Classes::TCollectionItemClass ItemClass) : Classes::TCollection(ItemClass) { } + /* TCollection.Destroy */ inline __fastcall virtual ~TSpTBXItemCacheCollection(void) { } + +}; + + +class DELPHICLASS TSpTBXDock; +class PASCALIMPLEMENTATION TSpTBXDock : public Tb2dock::TTBDock +{ + typedef Tb2dock::TTBDock inherited; + +private: + bool FMoving; + bool FResizing; + int FPrevWidth; + int FPrevHeight; + TSpTBXDrawEvent FOnDrawBackground; + HIDESBASE MESSAGE void __fastcall WMEraseBkgnd(Messages::TWMEraseBkgnd &Message); + HIDESBASE MESSAGE void __fastcall WMMove(Messages::TWMMove &Message); + HIDESBASE MESSAGE void __fastcall WMSize(Messages::TWMSize &Message); + MESSAGE void __fastcall WMSpSkinChange(Messages::TMessage &Message); + +protected: + virtual bool __fastcall CanResize(int &NewWidth, int &NewHeight); + virtual void __fastcall DrawBackground(HDC DC, const Types::TRect &DrawRect); + virtual void __fastcall DoDrawBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const TSpTBXPaintStage PaintStage, bool &PaintDefault); + void __fastcall InternalDrawBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect); + DYNAMIC void __fastcall Resize(void); + virtual bool __fastcall UsingBackground(void); + bool __fastcall UsingBitmap(void); + +public: + __fastcall virtual TSpTBXDock(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXDock(void); + __property int PrevWidth = {read=FPrevWidth, nodefault}; + __property int PrevHeight = {read=FPrevHeight, nodefault}; + +__published: + __property Color = {default=536870911}; + __property OnCanResize; + __property TSpTBXDrawEvent OnDrawBackground = {read=FOnDrawBackground, write=FOnDrawBackground}; +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXDock(HWND ParentWindow) : Tb2dock::TTBDock(ParentWindow) { } + +}; + + +typedef TMetaClass* TSpTBXDockClass; + +class DELPHICLASS TSpTBXToolbarView; +class PASCALIMPLEMENTATION TSpTBXToolbarView : public Tb2toolbar::TTBToolbarView +{ + typedef Tb2toolbar::TTBToolbarView inherited; + +private: + int FMaxSize; + void __fastcall SetMaxSize(const int Value); + +protected: + int FTallestItemSize; + virtual void __fastcall DoUpdatePositions(Types::TPoint &ASize); + +public: + __fastcall virtual TSpTBXToolbarView(Classes::TComponent* AOwner, Tb2item::TTBView* AParentView, Tb2item::TTBCustomItem* AParentItem, Controls::TWinControl* AWindow, bool AIsToolbar, bool ACustomizing, bool AUsePriorityList); + __property int MaxSize = {read=FMaxSize, write=SetMaxSize, nodefault}; +public: + /* TTBView.Destroy */ inline __fastcall virtual ~TSpTBXToolbarView(void) { } + +}; + + +class DELPHICLASS TSpTBXToolbar; +class PASCALIMPLEMENTATION TSpTBXToolbar : public Tb2toolbar::TTBCustomToolbar +{ + typedef Tb2toolbar::TTBCustomToolbar inherited; + +private: + bool FChevronVertical; + bool FCompoundToolbar; + bool FCustomizable; + int FCustomizingCount; + int FItemMovingCount; + TSpTBXToolbarDisplayMode FDisplayMode; + Types::TRect FLastDropMark; + int FLastSelectableWidth; + TSpTBXDrawEvent FOnDrawBackground; + TSpTBXItemNotificationEvent FOnItemNotification; + void __fastcall SetDisplayMode(const TSpTBXToolbarDisplayMode Value); + int __fastcall GetMaxSize(void); + void __fastcall SetMaxSize(const int Value); + HIDESBASE Tb2item::TTBControlItem* __fastcall CreateWrapper(int Index, Controls::TControl* Ctl); + Tb2item::TTBControlItem* __fastcall IsAnchoredControlItem(Tb2item::TTBCustomItem* Item); + HIDESBASE MESSAGE void __fastcall CMControlChange(Controls::TCMControlChange &Message); + HIDESBASE MESSAGE void __fastcall CMDialogChar(Messages::TWMKey &Message); + HIDESBASE MESSAGE void __fastcall CMMouseleave(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall CMHintShow(Controls::TCMHintShow &Message); + HIDESBASE MESSAGE void __fastcall CMTextChanged(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall WMEraseBkgnd(Messages::TWMEraseBkgnd &Message); + HIDESBASE MESSAGE void __fastcall WMSize(Messages::TWMSize &Message); + MESSAGE void __fastcall WMSpSkinChange(Messages::TMessage &Message); + +protected: + Tb2item::TTBItemViewer* FBeginDragIV; + TSpTBXItemCacheCollection* FAnchoredControlItems; + TSpTBXToolbarStates FState; + virtual void __fastcall CreateWindowHandle(const Controls::TCreateParams &Params); + virtual void __fastcall DefineProperties(Classes::TFiler* Filer); + DYNAMIC void __fastcall Resize(void); + virtual void __fastcall AnchorItems(bool UpdateControlItems = true); + virtual void __fastcall RightAlignItems(void); + virtual void __fastcall DrawNCArea(const bool DrawToDC, const HDC ADC, const HRGN Clip); + virtual Graphics::TColor __fastcall GetItemsTextColor(Sptbxskins::TSpTBXSkinStatesType State); + virtual void __fastcall InternalDrawBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool PaintOnNCArea, bool PaintBorders = true); + virtual void __fastcall DoDrawBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const TSpTBXPaintStage PaintStage, bool &PaintDefault); + DYNAMIC Tb2toolbar::TTBChevronItemClass __fastcall GetChevronItemClass(void); + DYNAMIC Tb2dock::TTBFloatingWindowParentClass __fastcall GetFloatingWindowParentClass(void); + virtual int __fastcall GetRightAlignMargin(void); + DYNAMIC Tb2toolbar::TTBToolbarViewClass __fastcall GetViewClass(void); + DYNAMIC void __fastcall MouseMove(Classes::TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseDown(Controls::TMouseButton Button, Classes::TShiftState Shift, int X, int Y); + virtual bool __fastcall CanDragCustomize(Controls::TMouseButton Button, Classes::TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall DoStartDrag(Controls::TDragObject* &DragObject); + DYNAMIC void __fastcall DragOver(System::TObject* Source, int X, int Y, Controls::TDragState State, bool &Accept); + virtual bool __fastcall CanItemClick(Tb2item::TTBCustomItem* Item, Controls::TMouseButton Button, Classes::TShiftState Shift, int X, int Y); + virtual void __fastcall DoItemClick(Tb2item::TTBCustomItem* Item, Controls::TMouseButton Button, Classes::TShiftState Shift, int X, int Y); + virtual void __fastcall DoItemNotification(Tb2item::TTBCustomItem* Ancestor, bool Relayed, Tb2item::TTBItemChangedAction Action, int Index, Tb2item::TTBCustomItem* Item); + __property bool CompoundToolbar = {read=FCompoundToolbar, write=FCompoundToolbar, nodefault}; + +public: + __fastcall virtual TSpTBXToolbar(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXToolbar(void); + DYNAMIC void __fastcall DragDrop(System::TObject* Source, int X, int Y); + DYNAMIC void __fastcall ReadPositionData(const Tb2dock::TTBReadPositionData &Data); + DYNAMIC void __fastcall WritePositionData(const Tb2dock::TTBWritePositionData &Data); + void __fastcall BeginCustomize(void); + void __fastcall EndCustomize(void); + void __fastcall BeginItemMove(void); + void __fastcall EndItemMove(void); + virtual Types::TPoint __fastcall GetFloatingBorderSize(); + bool __fastcall IsCustomizing(void); + bool __fastcall IsItemMoving(void); + bool __fastcall IsVertical(void); + __property int MaxSize = {read=GetMaxSize, write=SetMaxSize, default=-1}; + +__published: + __property ActivateParent = {default=1}; + __property Align = {default=0}; + __property AutoResize = {default=1}; + __property BorderStyle = {default=1}; + __property ChevronHint; + __property ChevronMoveItems = {default=1}; + __property ChevronPriorityForNewItems = {default=0}; + __property CloseButton = {default=1}; + __property CloseButtonWhenDocked = {default=0}; + __property CurrentDock; + __property DefaultDock; + __property DockableTo = {default=15}; + __property DockMode = {default=0}; + __property DockPos = {default=-1}; + __property DockRow = {default=0}; + __property DragHandleStyle = {default=2}; + __property FloatingMode = {default=0}; + __property Font; + __property FullSize = {default=0}; + __property HideWhenInactive = {default=1}; + __property Images; + __property Items; + __property LastDock; + __property LinkSubitems; + __property MenuBar = {default=0}; + __property Options = {default=0}; + __property ParentFont = {default=1}; + __property ParentShowHint = {default=1}; + __property PopupMenu; + __property ProcessShortCuts = {default=0}; + __property Resizable = {default=1}; + __property ShowCaption = {default=1}; + __property ShowHint; + __property ShrinkMode = {default=2}; + __property SmoothDrag = {default=1}; + __property Stretch = {default=0}; + __property SystemFont = {default=1}; + __property TabOrder = {default=-1}; + __property TabStop = {default=0}; + __property UpdateActions = {default=1}; + __property UseLastDock = {default=1}; + __property Visible = {default=1}; + __property Color = {default=536870911}; + __property OnClose; + __property OnCloseQuery; + __property OnContextPopup; + __property OnDblClick; + __property OnDragDrop; + __property OnDragOver; + __property OnMouseDown; + __property OnMouseMove; + __property OnMouseUp; + __property OnMove; + __property OnRecreated; + __property OnRecreating; + __property OnDockChanged; + __property OnDockChanging; + __property OnDockChangingHidden; + __property OnResize; + __property OnShortCut; + __property OnVisibleChanged; + __property Caption; + __property Hint; + __property bool ChevronVertical = {read=FChevronVertical, write=FChevronVertical, default=1}; + __property bool Customizable = {read=FCustomizable, write=FCustomizable, default=1}; + __property TSpTBXToolbarDisplayMode DisplayMode = {read=FDisplayMode, write=SetDisplayMode, default=0}; + __property TSpTBXDrawEvent OnDrawBackground = {read=FOnDrawBackground, write=FOnDrawBackground}; + __property TSpTBXItemNotificationEvent OnItemNotification = {read=FOnItemNotification, write=FOnItemNotification}; +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXToolbar(HWND ParentWindow) : Tb2toolbar::TTBCustomToolbar(ParentWindow) { } + +}; + + +typedef TMetaClass* TSpTBXToolbarClass; + +class DELPHICLASS TSpTBXCustomToolWindow; +class PASCALIMPLEMENTATION TSpTBXCustomToolWindow : public Tb2dock::TTBCustomDockableWindow +{ + typedef Tb2dock::TTBCustomDockableWindow inherited; + +private: + int FMinClientWidth; + int FMinClientHeight; + int FMaxClientWidth; + int FMaxClientHeight; + TSpTBXDrawEvent FOnDrawBackground; + int __fastcall GetClientAreaWidth(void); + void __fastcall SetClientAreaWidth(int Value); + int __fastcall GetClientAreaHeight(void); + void __fastcall SetClientAreaHeight(int Value); + HIDESBASE MESSAGE void __fastcall CMTextChanged(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall WMEraseBkgnd(Messages::TWMEraseBkgnd &Message); + MESSAGE void __fastcall WMSpSkinChange(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall WMWindowPosChanged(Messages::TWMWindowPosMsg &Message); + +protected: + tagSIZE FBarSize; + virtual void __fastcall CreateWindowHandle(const Controls::TCreateParams &Params); + virtual void __fastcall DefineProperties(Classes::TFiler* Filer); + DYNAMIC Tb2dock::TTBFloatingWindowParentClass __fastcall GetFloatingWindowParentClass(void); + virtual Types::TPoint __fastcall CalcSize(Tb2dock::TTBDock* ADock); + virtual Types::TPoint __fastcall DoArrange(bool CanMoveControls, Tb2dock::TTBDockType PreviousDockType, bool NewFloating, Tb2dock::TTBDock* NewDock); + virtual void __fastcall GetBaseSize(Types::TPoint &ASize); + virtual void __fastcall GetMinMaxSize(int &AMinClientWidth, int &AMinClientHeight, int &AMaxClientWidth, int &AMaxClientHeight); + virtual void __fastcall SetClientAreaSize(int AWidth, int AHeight); + virtual void __fastcall SizeChanging(const int AWidth, const int AHeight); + virtual void __fastcall Paint(void); + virtual void __fastcall DrawNCArea(const bool DrawToDC, const HDC ADC, const HRGN Clip); + virtual void __fastcall InternalDrawBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool PaintOnNCArea, bool PaintBorders = true); + virtual void __fastcall DoDrawBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const TSpTBXPaintStage PaintStage, bool &PaintDefault); + __property int ClientAreaHeight = {read=GetClientAreaHeight, write=SetClientAreaHeight, nodefault}; + __property int ClientAreaWidth = {read=GetClientAreaWidth, write=SetClientAreaWidth, nodefault}; + __property int MaxClientHeight = {read=FMaxClientHeight, write=FMaxClientHeight, default=0}; + __property int MaxClientWidth = {read=FMaxClientWidth, write=FMaxClientWidth, default=0}; + __property int MinClientHeight = {read=FMinClientHeight, write=FMinClientHeight, default=32}; + __property int MinClientWidth = {read=FMinClientWidth, write=FMinClientWidth, default=32}; + __property TSpTBXDrawEvent OnDrawBackground = {read=FOnDrawBackground, write=FOnDrawBackground}; + +public: + __fastcall virtual TSpTBXCustomToolWindow(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXCustomToolWindow(void); + virtual Types::TPoint __fastcall GetFloatingBorderSize(); + virtual void __fastcall InvalidateBackground(bool InvalidateChildren = true); + bool __fastcall IsVertical(void); + DYNAMIC void __fastcall ReadPositionData(const Tb2dock::TTBReadPositionData &Data); + DYNAMIC void __fastcall WritePositionData(const Tb2dock::TTBWritePositionData &Data); + +__published: + __property Caption; + __property Color = {default=536870911}; +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXCustomToolWindow(HWND ParentWindow) : Tb2dock::TTBCustomDockableWindow(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXToolWindow; +class PASCALIMPLEMENTATION TSpTBXToolWindow : public TSpTBXCustomToolWindow +{ + typedef TSpTBXCustomToolWindow inherited; + +__published: + __property ActivateParent = {default=1}; + __property Align = {default=0}; + __property Anchors = {default=3}; + __property BorderStyle = {default=1}; + __property Caption; + __property Color = {default=536870911}; + __property CloseButton = {default=1}; + __property CloseButtonWhenDocked = {default=0}; + __property CurrentDock; + __property DefaultDock; + __property DockableTo = {default=15}; + __property DockMode = {default=0}; + __property DockPos = {default=-1}; + __property DockRow = {default=0}; + __property DragHandleStyle = {default=2}; + __property FloatingMode = {default=0}; + __property Font; + __property FullSize = {default=0}; + __property HideWhenInactive = {default=1}; + __property LastDock; + __property ParentFont = {default=1}; + __property ParentShowHint = {default=1}; + __property PopupMenu; + __property Resizable = {default=1}; + __property ShowCaption = {default=1}; + __property ShowHint; + __property Stretch = {default=0}; + __property SmoothDrag = {default=1}; + __property TabOrder = {default=-1}; + __property UseLastDock = {default=1}; + __property Visible = {default=1}; + __property OnClose; + __property OnCloseQuery; + __property OnContextPopup; + __property OnDblClick; + __property OnDragDrop; + __property OnDragOver; + __property OnDockChanged; + __property OnDockChanging; + __property OnDockChangingHidden; + __property OnMouseDown; + __property OnMouseMove; + __property OnMouseUp; + __property OnMove; + __property OnRecreated; + __property OnRecreating; + __property OnResize; + __property OnVisibleChanged; + __property ClientAreaHeight; + __property ClientAreaWidth; + __property MaxClientHeight = {default=0}; + __property MaxClientWidth = {default=0}; + __property MinClientHeight = {default=32}; + __property MinClientWidth = {default=32}; + __property OnDrawBackground; +public: + /* TSpTBXCustomToolWindow.Create */ inline __fastcall virtual TSpTBXToolWindow(Classes::TComponent* AOwner) : TSpTBXCustomToolWindow(AOwner) { } + /* TSpTBXCustomToolWindow.Destroy */ inline __fastcall virtual ~TSpTBXToolWindow(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXToolWindow(HWND ParentWindow) : TSpTBXCustomToolWindow(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXFloatingWindowParent; +class PASCALIMPLEMENTATION TSpTBXFloatingWindowParent : public Tb2dock::TTBFloatingWindowParent +{ + typedef Tb2dock::TTBFloatingWindowParent inherited; + +private: + bool FCloseButtonHover; + bool FCloseOnAltF4; + void __fastcall UpdateDwmNCSize(void); + HIDESBASE MESSAGE void __fastcall CMMouseLeave(Messages::TMessage &Message); + MESSAGE void __fastcall WMActivateApp(Messages::TWMActivateApp &Message); + HIDESBASE MESSAGE void __fastcall WMClose(Messages::TWMNoParams &Message); + HIDESBASE MESSAGE void __fastcall WMEraseBkgnd(Messages::TMessage &Message); + MESSAGE void __fastcall WMNCMouseLeave(Messages::TMessage &Message); + MESSAGE void __fastcall WMNCMouseMove(Messages::TWMNCHitMessage &Message); + MESSAGE void __fastcall WMSpSkinChange(Messages::TMessage &Message); + +protected: + void __fastcall CancelNCHover(void); + virtual void __fastcall CreateWnd(void); + DYNAMIC void __fastcall DrawNCArea(const bool DrawToDC, const HDC ADC, const HRGN Clip, Tb2dock::TTBToolWindowNCRedrawWhat RedrawWhat); + void __fastcall RedrawCloseButton(void); + DYNAMIC void __fastcall VisibleChanging(void); + __property bool CloseButtonHover = {read=FCloseButtonHover, nodefault}; + +public: + __fastcall virtual TSpTBXFloatingWindowParent(Classes::TComponent* AOwner, int Dummy); + __fastcall virtual ~TSpTBXFloatingWindowParent(void); + __property bool CloseOnAltF4 = {read=FCloseOnAltF4, write=FCloseOnAltF4, nodefault}; +public: + /* TCustomForm.Create */ inline __fastcall virtual TSpTBXFloatingWindowParent(Classes::TComponent* AOwner) : Tb2dock::TTBFloatingWindowParent(AOwner) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXFloatingWindowParent(HWND ParentWindow) : Tb2dock::TTBFloatingWindowParent(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXPopupWindow; +class PASCALIMPLEMENTATION TSpTBXPopupWindow : public Tb2item::TTBPopupWindow +{ + typedef Tb2item::TTBPopupWindow inherited; + +private: + bool FPaintingClientArea; + tagSIZE FMaximumImageSize; + bool __fastcall CanDrawGutter(void); + HIDESBASE MESSAGE void __fastcall CMHintShow(Controls::TCMHintShow &Message); + HIDESBASE MESSAGE void __fastcall CMShowingchanged(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall WMEraseBkgnd(Messages::TWMEraseBkgnd &Message); + HIDESBASE MESSAGE void __fastcall WMNCPaint(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall WMPrint(Messages::TMessage &Message); + +protected: + DYNAMIC Tb2item::TTBViewClass __fastcall GetViewClass(void); + virtual void __fastcall DoPopupShowingChanged(bool IsVisible); + virtual void __fastcall PaintBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect); + +public: + __fastcall virtual TSpTBXPopupWindow(Classes::TComponent* AOwner, const Tb2item::TTBView* AParentView, const Tb2item::TTBCustomItem* AItem, const bool ACustomizing); + __fastcall virtual ~TSpTBXPopupWindow(void); + __property tagSIZE MaximumImageSize = {read=FMaximumImageSize}; +public: + /* TCustomControl.Create */ inline __fastcall virtual TSpTBXPopupWindow(Classes::TComponent* AOwner) : Tb2item::TTBPopupWindow(AOwner) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXPopupWindow(HWND ParentWindow) : Tb2item::TTBPopupWindow(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXPopupWindowView; +class PASCALIMPLEMENTATION TSpTBXPopupWindowView : public Tb2item::TTBPopupView +{ + typedef Tb2item::TTBPopupView inherited; + +protected: + virtual void __fastcall AutoSize(int AWidth, int AHeight); + +public: + void __fastcall SetIsToolbar(const bool Value); + +__published: + __property IsToolbar; +public: + /* TTBView.Create */ inline __fastcall virtual TSpTBXPopupWindowView(Classes::TComponent* AOwner, Tb2item::TTBView* AParentView, Tb2item::TTBCustomItem* AParentItem, Controls::TWinControl* AWindow, bool AIsToolbar, bool ACustomizing, bool AUsePriorityList) : Tb2item::TTBPopupView(AOwner, AParentView, AParentItem, AWindow, AIsToolbar, ACustomizing, AUsePriorityList) { } + /* TTBView.Destroy */ inline __fastcall virtual ~TSpTBXPopupWindowView(void) { } + +}; + + +class DELPHICLASS TSpTBXChevronItem; +class PASCALIMPLEMENTATION TSpTBXChevronItem : public Tb2toolbar::TTBChevronItem +{ + typedef Tb2toolbar::TTBChevronItem inherited; + +protected: + virtual Tb2item::TTBPopupWindowClass __fastcall GetPopupWindowClass(void); + +public: + virtual Tb2item::TTBItemViewerClass __fastcall GetItemViewerClass(Tb2item::TTBView* AView); +public: + /* TTBChevronItem.Create */ inline __fastcall virtual TSpTBXChevronItem(Classes::TComponent* AOwner) : Tb2toolbar::TTBChevronItem(AOwner) { } + +public: + /* TTBCustomItem.Destroy */ inline __fastcall virtual ~TSpTBXChevronItem(void) { } + +}; + + +class DELPHICLASS TSpTBXChevronItemViewer; +class PASCALIMPLEMENTATION TSpTBXChevronItemViewer : public Tb2item::TTBItemViewer +{ + typedef Tb2item::TTBItemViewer inherited; + +protected: + virtual void __fastcall Paint(const Graphics::TCanvas* Canvas, const Types::TRect &ClientAreaRect, bool IsSelected, bool IsPushed, bool UseDisabledShadow); + +public: + virtual Graphics::TColor __fastcall GetTextColor(Sptbxskins::TSpTBXSkinStatesType State); +public: + /* TTBItemViewer.Create */ inline __fastcall virtual TSpTBXChevronItemViewer(Tb2item::TTBView* AView, Tb2item::TTBCustomItem* AItem, int AGroupLevel) : Tb2item::TTBItemViewer(AView, AItem, AGroupLevel) { } + /* TTBItemViewer.Destroy */ inline __fastcall virtual ~TSpTBXChevronItemViewer(void) { } + +}; + + +class DELPHICLASS TSpTBXChevronPopupWindow; +class PASCALIMPLEMENTATION TSpTBXChevronPopupWindow : public TSpTBXPopupWindow +{ + typedef TSpTBXPopupWindow inherited; + +private: + HIDESBASE MESSAGE void __fastcall CMColorChanged(Messages::TMessage &Message); +public: + /* TSpTBXPopupWindow.CreatePopupWindow */ inline __fastcall virtual TSpTBXChevronPopupWindow(Classes::TComponent* AOwner, const Tb2item::TTBView* AParentView, const Tb2item::TTBCustomItem* AItem, const bool ACustomizing) : TSpTBXPopupWindow(AOwner, AParentView, AItem, ACustomizing) { } + /* TSpTBXPopupWindow.Destroy */ inline __fastcall virtual ~TSpTBXChevronPopupWindow(void) { } + +public: + /* TCustomControl.Create */ inline __fastcall virtual TSpTBXChevronPopupWindow(Classes::TComponent* AOwner) : TSpTBXPopupWindow(AOwner) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXChevronPopupWindow(HWND ParentWindow) : TSpTBXPopupWindow(ParentWindow) { } + +}; + + +__interface ISpTBXPopupMenu; +typedef System::DelphiInterface _di_ISpTBXPopupMenu; +__interface INTERFACE_UUID("{C576A225-6E42-49F6-96E5-712510C5D85C}") ISpTBXPopupMenu : public System::IInterface +{ + +public: + virtual bool __fastcall InternalPopup(int X, int Y, bool ForceFocus, Controls::TControl* PopupControl = (Controls::TControl*)(0x0)) = 0 ; +}; + +class DELPHICLASS TSpTBXPopupMenu; +class PASCALIMPLEMENTATION TSpTBXPopupMenu : public Tb2item::TTBPopupMenu +{ + typedef Tb2item::TTBPopupMenu inherited; + +private: + Tb2item::TTBCustomItem* FClickedItem; + bool FReturnClickedItemOnly; + bool FToolBoxPopup; + TSpTBXPopupEvent __fastcall GetOnInitPopup(); + void __fastcall SetOnInitPopup(const TSpTBXPopupEvent Value); + Classes::TNotifyEvent __fastcall GetOnClosePopup(); + void __fastcall SetOnClosePopup(const Classes::TNotifyEvent Value); + +protected: + virtual bool __fastcall InternalPopup(int X, int Y, bool ForceFocus, Controls::TControl* PopupControl = (Controls::TControl*)(0x0)); + DYNAMIC Tb2item::TTBRootItemClass __fastcall GetRootItemClass(void); + +public: + virtual void __fastcall Popup(int X, int Y); + HIDESBASE virtual Tb2item::TTBCustomItem* __fastcall PopupEx(int X, int Y, Controls::TControl* PopupControl = (Controls::TControl*)(0x0), bool ReturnClickedItemOnly = false); + +__published: + __property bool ToolBoxPopup = {read=FToolBoxPopup, write=FToolBoxPopup, default=0}; + __property TSpTBXPopupEvent OnInitPopup = {read=GetOnInitPopup, write=SetOnInitPopup}; + __property Classes::TNotifyEvent OnClosePopup = {read=GetOnClosePopup, write=SetOnClosePopup}; +public: + /* TTBPopupMenu.Create */ inline __fastcall virtual TSpTBXPopupMenu(Classes::TComponent* AOwner) : Tb2item::TTBPopupMenu(AOwner) { } + /* TTBPopupMenu.Destroy */ inline __fastcall virtual ~TSpTBXPopupMenu(void) { } + +private: + void *__ISpTBXPopupMenu; /* ISpTBXPopupMenu */ + +public: + #if defined(MANAGED_INTERFACE_OPERATORS) + operator _di_ISpTBXPopupMenu() + { + _di_ISpTBXPopupMenu intf; + GetInterface(intf); + return intf; + } + #else + operator ISpTBXPopupMenu*(void) { return (ISpTBXPopupMenu*)&__ISpTBXPopupMenu; } + #endif + +}; + + +class DELPHICLASS TSpTBXCompoundItemsControl; +class PASCALIMPLEMENTATION TSpTBXCompoundItemsControl : public TSpTBXCustomControl +{ + typedef TSpTBXCustomControl inherited; + +private: + Sptbxskins::TSpTBXSkinType FSkinType; + void __fastcall DockRequestDock(System::TObject* Sender, Tb2dock::TTBCustomDockableWindow* Bar, bool &Accept); + Tb2item::TTBRootItem* __fastcall GetRootItems(void); + TSpTBXToolbarView* __fastcall GetView(void); + Imglist::TCustomImageList* __fastcall GetImages(void); + void __fastcall SetImages(const Imglist::TCustomImageList* Value); + void __fastcall SetSkinType(const Sptbxskins::TSpTBXSkinType Value); + MESSAGE void __fastcall WMSpSkinChange(Messages::TMessage &Message); + +protected: + TSpTBXDock* FDock; + TSpTBXToolbar* FToolbar; + virtual void __fastcall CreateParams(Controls::TCreateParams &Params); + virtual TSpTBXDockClass __fastcall GetDockClass(void); + virtual TSpTBXToolbarClass __fastcall GetToolbarClass(void); + virtual Tb2item::TTBCustomItem* __fastcall GetItems(void); + virtual void __fastcall Loaded(void); + virtual void __fastcall SetName(const Classes::TComponentName Value); + __property Imglist::TCustomImageList* Images = {read=GetImages, write=SetImages}; + __property Sptbxskins::TSpTBXSkinType SkinType = {read=FSkinType, write=SetSkinType, default=2}; + +public: + __fastcall virtual TSpTBXCompoundItemsControl(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXCompoundItemsControl(void); + DYNAMIC void __fastcall GetChildren(Classes::TGetChildProc Proc, Classes::TComponent* Root); + virtual void __fastcall InvalidateBackground(bool InvalidateChildren = true); + __property TSpTBXToolbarView* View = {read=GetView}; + +__published: + __property Tb2item::TTBRootItem* Items = {read=GetRootItems}; +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXCompoundItemsControl(HWND ParentWindow) : TSpTBXCustomControl(ParentWindow) { } + +private: + void *__ITBItems; /* Tb2item::ITBItems */ + +public: + #if defined(MANAGED_INTERFACE_OPERATORS) + operator Tb2item::_di_ITBItems() + { + Tb2item::_di_ITBItems intf; + GetInterface(intf); + return intf; + } + #else + operator ITBItems*(void) { return (ITBItems*)&__ITBItems; } + #endif + +}; + + +class DELPHICLASS TSpTBXCompoundBar; +class PASCALIMPLEMENTATION TSpTBXCompoundBar : public TSpTBXCompoundItemsControl +{ + typedef TSpTBXCompoundItemsControl inherited; + +private: + TSpTBXDrawEvent FOnDrawDockBackground; + void __fastcall DrawDockBackground(System::TObject* Sender, Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const TSpTBXPaintStage PaintStage, bool &PaintDefault); + void __fastcall DrawToolbarBackground(System::TObject* Sender, Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const TSpTBXPaintStage PaintStage, bool &PaintDefault); + void __fastcall DockResize(System::TObject* Sender); + +protected: + virtual void __fastcall DoDrawDockBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const TSpTBXPaintStage PaintStage, bool &PaintDefault); + __property TSpTBXDrawEvent OnDrawDockBackground = {read=FOnDrawDockBackground, write=FOnDrawDockBackground}; + +public: + __fastcall virtual TSpTBXCompoundBar(Classes::TComponent* AOwner); +public: + /* TSpTBXCompoundItemsControl.Destroy */ inline __fastcall virtual ~TSpTBXCompoundBar(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXCompoundBar(HWND ParentWindow) : TSpTBXCompoundItemsControl(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXButtonOptions; +class PASCALIMPLEMENTATION TSpTBXButtonOptions : public Classes::TPersistent +{ + typedef Classes::TPersistent inherited; + +private: + Tb2item::TTBGroupItem* FEditableItems; + TSpTBXItem* FCloseButton; + TSpTBXItem* FMinimizeButton; + TSpTBXItem* FMaximizeButton; + TSpTBXRightAlignSpacerItem* FRightAlignSpacer; + int FCaptionImageIndex; + int FCloseImageIndex; + int FMinimizeImageIndex; + int FMaximizeImageIndex; + int FRestoreImageIndex; + System::WideString FCaptionLabel; + bool FCaption; + bool FClose; + bool FMinimize; + bool FMaximize; + bool FButtonBorders; + int FTitleBarMaxSize; + void __fastcall SetCaptionImageIndex(int Value); + void __fastcall SetCloseImageIndex(int Value); + void __fastcall SetCaptionLabel(const System::WideString Value); + void __fastcall SetMaximizeImageIndex(int Value); + void __fastcall SetRestoreImageIndex(int Value); + void __fastcall SetMinimizeImageIndex(int Value); + void __fastcall SetCaption(const bool Value); + void __fastcall SetClose(const bool Value); + void __fastcall SetMaximize(const bool Value); + void __fastcall SetMinimize(const bool Value); + void __fastcall SetTitleBarMaxSize(const int Value); + +protected: + Controls::TWinControl* FParentControl; + TSpTBXToolbar* FToolbar; + virtual void __fastcall ButtonsDrawImage(System::TObject* Sender, Graphics::TCanvas* ACanvas, Sptbxskins::TSpTBXSkinStatesType State, const TSpTBXPaintStage PaintStage, Imglist::TCustomImageList* &AImageList, int &AImageIndex, Types::TRect &ARect, bool &PaintDefault); + virtual void __fastcall ButtonsDrawItem(System::TObject* Sender, Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxskins::TSpTBXMenuItemInfo &ItemInfo, const TSpTBXPaintStage PaintStage, bool &PaintDefault); + virtual void __fastcall ButtonsClick(System::TObject* Sender) = 0 ; + virtual void __fastcall CreateButtons(void); + virtual void __fastcall UpdateButtonsVisibility(void); + virtual void __fastcall SetupButton(TSpTBXCustomItem* B); + virtual bool __fastcall Restoring(TSpTBXCustomItem* B) = 0 ; + +public: + __fastcall virtual TSpTBXButtonOptions(Controls::TWinControl* AParent); + virtual void __fastcall SetupButtonIcon(TSpTBXCustomItem* B); + void __fastcall MoveItemToTheLeft(Tb2item::TTBCustomItem* B); + __property Tb2item::TTBGroupItem* EditableItems = {read=FEditableItems}; + __property TSpTBXRightAlignSpacerItem* RightAlignSpacer = {read=FRightAlignSpacer}; + __property TSpTBXItem* MinimizeButton = {read=FMinimizeButton}; + __property TSpTBXItem* MaximizeButton = {read=FMaximizeButton}; + __property TSpTBXItem* CloseButton = {read=FCloseButton}; + __property System::WideString CaptionLabel = {read=FCaptionLabel, write=SetCaptionLabel}; + +__published: + __property bool ButtonBorders = {read=FButtonBorders, write=FButtonBorders, default=1}; + __property bool Caption = {read=FCaption, write=SetCaption, default=1}; + __property bool Close = {read=FClose, write=SetClose, default=1}; + __property bool Minimize = {read=FMinimize, write=SetMinimize, default=1}; + __property bool Maximize = {read=FMaximize, write=SetMaximize, default=1}; + __property int CaptionImageIndex = {read=FCaptionImageIndex, write=SetCaptionImageIndex, default=-1}; + __property int CloseImageIndex = {read=FCloseImageIndex, write=SetCloseImageIndex, default=-1}; + __property int MinimizeImageIndex = {read=FMinimizeImageIndex, write=SetMinimizeImageIndex, default=-1}; + __property int MaximizeImageIndex = {read=FMaximizeImageIndex, write=SetMaximizeImageIndex, default=-1}; + __property int RestoreImageIndex = {read=FRestoreImageIndex, write=SetRestoreImageIndex, default=-1}; + __property int TitleBarMaxSize = {read=FTitleBarMaxSize, write=SetTitleBarMaxSize, default=21}; +public: + /* TPersistent.Destroy */ inline __fastcall virtual ~TSpTBXButtonOptions(void) { } + +}; + + +class DELPHICLASS TSpTBXStatusToolbar; +class PASCALIMPLEMENTATION TSpTBXStatusToolbar : public TSpTBXToolbar +{ + typedef TSpTBXToolbar inherited; + +private: + bool FSizeGrip; + Sptbxskins::TSpTBXSkinType FSkinType; + void __fastcall SetSizeGrip(const bool Value); + HIDESBASE MESSAGE void __fastcall WMSetCursor(Messages::TWMSetCursor &Message); + +protected: + Forms::TCustomForm* FParentForm; + bool __fastcall IsPointInGrip(const Types::TPoint &P); + virtual Graphics::TColor __fastcall GetItemsTextColor(Sptbxskins::TSpTBXSkinStatesType State); + virtual int __fastcall GetRightAlignMargin(void); + Forms::TWindowState __fastcall GetParentFormWindowState(void); + DYNAMIC void __fastcall MouseDown(Controls::TMouseButton Button, Classes::TShiftState Shift, int X, int Y); + HIDESBASE MESSAGE void __fastcall WMNCLButtonDown(Messages::TWMNCHitMessage &Message); + +public: + __fastcall virtual TSpTBXStatusToolbar(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXStatusToolbar(void); + Types::TRect __fastcall GetGripRect(); + bool __fastcall NeedsSeparatorRepaint(void); + +__published: + __property bool SizeGrip = {read=FSizeGrip, write=SetSizeGrip, default=1}; +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXStatusToolbar(HWND ParentWindow) : TSpTBXToolbar(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXCustomStatusBar; +class PASCALIMPLEMENTATION TSpTBXCustomStatusBar : public TSpTBXCompoundBar +{ + typedef TSpTBXCompoundBar inherited; + +private: + bool __fastcall GetSizeGrip(void); + void __fastcall SetSizeGrip(const bool Value); + TSpTBXStatusToolbar* __fastcall GetStatusToolbar(void); + HIDESBASE MESSAGE void __fastcall WMEraseBkgnd(Messages::TWMEraseBkgnd &Message); + +protected: + Forms::TWindowState FPrevState; + virtual bool __fastcall CanResize(int &NewWidth, int &NewHeight); + virtual void __fastcall DoDrawDockBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const TSpTBXPaintStage PaintStage, bool &PaintDefault); + virtual void __fastcall DrawSeparators(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Types::TRect &AGripRect); + virtual TSpTBXToolbarClass __fastcall GetToolbarClass(void); + __property Align = {default=2}; + __property bool SizeGrip = {read=GetSizeGrip, write=SetSizeGrip, default=1}; + +public: + __fastcall virtual TSpTBXCustomStatusBar(Classes::TComponent* AOwner); + __property TSpTBXStatusToolbar* Toolbar = {read=GetStatusToolbar}; +public: + /* TSpTBXCompoundItemsControl.Destroy */ inline __fastcall virtual ~TSpTBXCustomStatusBar(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXCustomStatusBar(HWND ParentWindow) : TSpTBXCompoundBar(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXStatusBar; +class PASCALIMPLEMENTATION TSpTBXStatusBar : public TSpTBXCustomStatusBar +{ + typedef TSpTBXCustomStatusBar inherited; + +__published: + __property Align = {default=2}; + __property Anchors = {default=3}; + __property BiDiMode; + __property DragCursor = {default=-12}; + __property DragKind = {default=0}; + __property DragMode = {default=0}; + __property Enabled = {default=1}; + __property Font; + __property ParentColor = {default=1}; + __property ParentBiDiMode = {default=1}; + __property ParentFont = {default=1}; + __property ParentShowHint = {default=1}; + __property PopupMenu; + __property ShowHint; + __property Visible = {default=1}; + __property OnCanResize; + __property OnContextPopup; + __property OnDragDrop; + __property OnDragOver; + __property OnEndDock; + __property OnEndDrag; + __property OnMouseDown; + __property OnMouseMove; + __property OnMouseUp; + __property OnResize; + __property OnStartDock; + __property OnStartDrag; + __property Images; + __property SizeGrip = {default=1}; + __property SkinType = {default=2}; + __property OnDrawDockBackground; +public: + /* TSpTBXCustomStatusBar.Create */ inline __fastcall virtual TSpTBXStatusBar(Classes::TComponent* AOwner) : TSpTBXCustomStatusBar(AOwner) { } + +public: + /* TSpTBXCompoundItemsControl.Destroy */ inline __fastcall virtual ~TSpTBXStatusBar(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXStatusBar(HWND ParentWindow) : TSpTBXCustomStatusBar(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXTitleToolbar; +class DELPHICLASS TSpTBXCustomTitleBar; +class PASCALIMPLEMENTATION TSpTBXTitleToolbar : public TSpTBXToolbar +{ + typedef TSpTBXToolbar inherited; + +protected: + virtual Graphics::TColor __fastcall GetItemsTextColor(Sptbxskins::TSpTBXSkinStatesType State); + TSpTBXCustomTitleBar* __fastcall GetTitleBar(void); + virtual int __fastcall GetRightAlignMargin(void); + DYNAMIC void __fastcall MouseDown(Controls::TMouseButton Button, Classes::TShiftState Shift, int X, int Y); +public: + /* TSpTBXToolbar.Create */ inline __fastcall virtual TSpTBXTitleToolbar(Classes::TComponent* AOwner) : TSpTBXToolbar(AOwner) { } + /* TSpTBXToolbar.Destroy */ inline __fastcall virtual ~TSpTBXTitleToolbar(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXTitleToolbar(HWND ParentWindow) : TSpTBXToolbar(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXTitleBarButtonOptions; +class PASCALIMPLEMENTATION TSpTBXTitleBarButtonOptions : public TSpTBXButtonOptions +{ + typedef TSpTBXButtonOptions inherited; + +private: + bool FSystemMenu; + TSpTBXSystemMenuItem* FSystemButton; + void __fastcall SetSystemMenu(const bool Value); + +protected: + TSpTBXCustomTitleBar* FTitleBar; + virtual void __fastcall ButtonsDrawItem(System::TObject* Sender, Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxskins::TSpTBXMenuItemInfo &ItemInfo, const TSpTBXPaintStage PaintStage, bool &PaintDefault); + virtual void __fastcall ButtonsClick(System::TObject* Sender); + virtual void __fastcall CreateButtons(void); + virtual bool __fastcall Restoring(TSpTBXCustomItem* B); + +public: + __fastcall virtual TSpTBXTitleBarButtonOptions(Controls::TWinControl* AParent); + __property TSpTBXSystemMenuItem* SystemButton = {read=FSystemButton}; + +__published: + __property bool SystemMenu = {read=FSystemMenu, write=SetSystemMenu, default=1}; +public: + /* TPersistent.Destroy */ inline __fastcall virtual ~TSpTBXTitleBarButtonOptions(void) { } + +}; + + +class PASCALIMPLEMENTATION TSpTBXCustomTitleBar : public TSpTBXCompoundBar +{ + typedef TSpTBXCompoundBar inherited; + +private: + bool FActive; + bool FFixedSize; + bool FFullScreenMaximize; + bool FMouseActive; + TSpTBXTitleBarButtonOptions* FOptions; + void *FOldAppWndProc; + void *FNewAppWndProc; + TSpTBXDrawEvent FOnDrawBackground; + TSpTBXPopupEvent FOnSystemMenuPopup; + Classes::TWndMethod FOldParentFormWndProc; + void __fastcall AppWndProc(Messages::TMessage &Msg); + void __fastcall NewParentFormWndProc(Messages::TMessage &Message); + void __fastcall SetActive(const bool Value); + void __fastcall SetMouseActive(const bool Value); + void __fastcall SetFullScreenMaximize(const bool Value); + Forms::TWindowState __fastcall GetWindowState(void); + void __fastcall SetWindowState(const Forms::TWindowState Value); + HIDESBASE MESSAGE void __fastcall CMTextChanged(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall WMEraseBkgnd(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall WMSetCursor(Messages::TWMSetCursor &Message); + HIDESBASE MESSAGE void __fastcall WMSpSkinChange(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall WMWindowPosChanged(Messages::TWMWindowPosMsg &Message); + +protected: + Forms::TCustomForm* FParentForm; + virtual void __fastcall Loaded(void); + Types::TPoint __fastcall GetFloatingBorderSize(); + virtual Tb2item::TTBCustomItem* __fastcall GetItems(void); + virtual TSpTBXToolbarClass __fastcall GetToolbarClass(void); + void __fastcall ChangeTitleBarState(bool Activate); + void __fastcall UpdateSkinMetrics(void); + virtual void __fastcall DoDrawDockBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const TSpTBXPaintStage PaintStage, bool &PaintDefault); + virtual void __fastcall DoDrawBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const TSpTBXPaintStage PaintStage, bool &PaintDefault); + virtual void __fastcall AdjustClientRect(Types::TRect &Rect); + void __fastcall GetSizeCursor(const Types::TPoint &MousePos, int &SizeCursor, int &SizeCode); + DYNAMIC void __fastcall MouseDown(Controls::TMouseButton Button, Classes::TShiftState Shift, int X, int Y); + __property bool Active = {read=FActive, write=SetActive, default=1}; + __property Align = {default=5}; + __property bool FixedSize = {read=FFixedSize, write=FFixedSize, default=0}; + __property bool FullScreenMaximize = {read=FFullScreenMaximize, write=SetFullScreenMaximize, default=0}; + __property TSpTBXTitleBarButtonOptions* Options = {read=FOptions, write=FOptions}; + __property Forms::TWindowState WindowState = {read=GetWindowState, write=SetWindowState, nodefault}; + __property TSpTBXDrawEvent OnDrawBackground = {read=FOnDrawBackground, write=FOnDrawBackground}; + __property TSpTBXPopupEvent OnSystemMenuPopup = {read=FOnSystemMenuPopup, write=FOnSystemMenuPopup}; + +public: + __fastcall virtual TSpTBXCustomTitleBar(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXCustomTitleBar(void); + Types::TRect __fastcall GetClientAreaRect(); + bool __fastcall IsActive(void); + __property bool MouseActive = {read=FMouseActive, write=SetMouseActive, default=1}; + __property TSpTBXToolbar* Toolbar = {read=FToolbar}; + +__published: + __property Caption; +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXCustomTitleBar(HWND ParentWindow) : TSpTBXCompoundBar(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXTitleBar; +class PASCALIMPLEMENTATION TSpTBXTitleBar : public TSpTBXCustomTitleBar +{ + typedef TSpTBXCustomTitleBar inherited; + +__published: + __property Align = {default=5}; + __property Anchors = {default=3}; + __property Color = {default=-16777211}; + __property BiDiMode; + __property Constraints; + __property DockSite = {default=0}; + __property DragCursor = {default=-12}; + __property DragKind = {default=0}; + __property DragMode = {default=0}; + __property Enabled = {default=1}; + __property Font; + __property ParentColor = {default=1}; + __property ParentBiDiMode = {default=1}; + __property ParentFont = {default=1}; + __property ParentShowHint = {default=1}; + __property PopupMenu; + __property ShowHint; + __property Visible = {default=1}; + __property OnCanResize; + __property OnContextPopup; + __property OnDockDrop; + __property OnDockOver; + __property OnDragDrop; + __property OnDragOver; + __property OnEndDock; + __property OnEndDrag; + __property OnEnter; + __property OnExit; + __property OnGetSiteInfo; + __property OnMouseDown; + __property OnMouseMove; + __property OnMouseUp; + __property OnResize; + __property OnStartDock; + __property OnStartDrag; + __property OnUnDock; + __property Active = {default=1}; + __property FixedSize = {default=0}; + __property FullScreenMaximize = {default=0}; + __property Images; + __property Options; + __property OnDrawBackground; + __property OnDrawDockBackground; + __property OnSystemMenuPopup; +public: + /* TSpTBXCustomTitleBar.Create */ inline __fastcall virtual TSpTBXTitleBar(Classes::TComponent* AOwner) : TSpTBXCustomTitleBar(AOwner) { } + /* TSpTBXCustomTitleBar.Destroy */ inline __fastcall virtual ~TSpTBXTitleBar(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXTitleBar(HWND ParentWindow) : TSpTBXCustomTitleBar(ParentWindow) { } + +}; + + +class DELPHICLASS TBitmapHint; +class PASCALIMPLEMENTATION TBitmapHint : public Controls::THintWindow +{ + typedef Controls::THintWindow inherited; + +private: + Graphics::TBitmap* FHintBitmap; + bool FActivating; + HIDESBASE MESSAGE void __fastcall CMTextChanged(Messages::TMessage &Message); + +protected: + virtual void __fastcall Paint(void); + +public: + __property bool Activating = {read=FActivating, nodefault}; + virtual void __fastcall ActivateHint(const Types::TRect &Rect, const System::UnicodeString AHint); + virtual void __fastcall ActivateHintData(const Types::TRect &Rect, const System::UnicodeString AHint, void * AData); +public: + /* THintWindow.Create */ inline __fastcall virtual TBitmapHint(Classes::TComponent* AOwner) : Controls::THintWindow(AOwner) { } + +public: + /* TCustomControl.Destroy */ inline __fastcall virtual ~TBitmapHint(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TBitmapHint(HWND ParentWindow) : Controls::THintWindow(ParentWindow) { } + +}; + + +//-- var, const, procedure --------------------------------------------------- +static const Word C_SpTBXRadioGroupIndex = 0x22b8; +static const Word CM_SPPOPUPCLOSE = 0xb457; +#define rvSpTBXDisplayMode L"DisplayMode" +static const ShortInt CPDefaultCols = 0x8; +static const ShortInt CPDefaultRows = 0x5; +extern PACKAGE Graphics::TFont* SmCaptionFont; +extern PACKAGE Graphics::TBitmap* SpStockHintBitmap; +extern PACKAGE Controls::TImageList* MDIButtonsImgList; +extern PACKAGE Controls::THintWindowClass SpTBXHintWindowClass; +static const ShortInt DefaultToolbarBorderSize = 0x2; +static const ShortInt crSpTBXNewHandPoint = 0x64; +static const ShortInt crSpTBXCustomization = 0x65; +static const ShortInt crSpTBXCustomizationCancel = 0x66; +extern PACKAGE void __fastcall SpFillItemInfo(Graphics::TCanvas* ACanvas, Tb2item::TTBItemViewer* IV, /* out */ Sptbxskins::TSpTBXMenuItemInfo &ItemInfo); +extern PACKAGE Types::TRect __fastcall SpGetBoundsRect(Tb2item::TTBItemViewer* IV, Tb2item::TTBRootItem* Root); +extern PACKAGE void __fastcall SpGetAllItems(Tb2item::TTBCustomItem* AParentItem, Classes::TStringList* ItemsList, bool ClearFirst = true); +extern PACKAGE tagSIZE __fastcall SpGetMenuMaximumImageSize(Tb2item::TTBView* View); +extern PACKAGE Tb2item::TTBItemViewer* __fastcall SpGetItemViewerFromPoint(Tb2item::TTBRootItem* Root, Tb2item::TTBView* View, const Types::TPoint &P, bool ProcessGroupItems = true); +extern PACKAGE Tb2item::TTBItemViewer* __fastcall SpGetNextItemSameEdge(Tb2item::TTBView* View, Tb2item::TTBItemViewer* IV, bool GoForward, TSpTBXSearchItemViewerType SearchType); +extern PACKAGE TSpTBXItemViewer* __fastcall SpGetFirstRightAlignSpacer(Tb2item::TTBView* View); +extern PACKAGE TSpTBXItemViewer* __fastcall SpGetRightAlignedItems(Tb2item::TTBView* View, Classes::TList* RightAlignedList, bool IsRotated, /* out */ int &VisibleTotalWidth, /* out */ int &RightAlignedTotalWidth); +extern PACKAGE void __fastcall SpInvalidateItem(Tb2item::TTBView* View, Tb2item::TTBCustomItem* Item); +extern PACKAGE Tb2item::TTBItemViewer* __fastcall SpFindItemViewer(Tb2item::TTBView* View, Tb2item::TTBCustomItem* Item); +extern PACKAGE Tb2item::TTBControlItem* __fastcall SpFindControlItem(Tb2item::TTBCustomItem* Item, Controls::TControl* Ctl, bool Recurse = true); +extern PACKAGE void __fastcall SpGetDropPosItemViewer(Tb2item::TTBRootItem* Root, Tb2item::TTBView* View, const Types::TPoint &P, /* out */ Tb2item::TTBItemViewer* &DestIV, /* out */ int &DestItemPos, /* out */ Types::TRect &DropMark)/* overload */; +extern PACKAGE void __fastcall SpGetDropPosItemViewer(Tb2item::TTBRootItem* Root, Tb2item::TTBView* View, const Types::TPoint &P, int SourceItemPos, /* out */ Tb2item::TTBItemViewer* &DestIV, /* out */ int &DestItemPos)/* overload */; +extern PACKAGE int __fastcall SpGetDragHandleSize(Tb2dock::TTBCustomDockableWindow* Toolbar); +extern PACKAGE bool __fastcall SpIsVerticalToolbar(Tb2dock::TTBCustomDockableWindow* Toolbar); +extern PACKAGE bool __fastcall SpIsDockUsingBitmap(Tb2dock::TTBDock* Dock); +extern PACKAGE void __fastcall SpDrawXPMenuItem(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxskins::TSpTBXMenuItemInfo &ItemInfo); +extern PACKAGE void __fastcall SpDrawXPMenuSeparator(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool MenuItemStyle, bool Vertical); +extern PACKAGE void __fastcall SpDrawXPMenuItemImage(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxskins::TSpTBXMenuItemInfo &ItemInfo, Imglist::TCustomImageList* ImageList, int ImageIndex); +extern PACKAGE void __fastcall SpDrawXPMenuGutter(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, Sptbxskins::TSpTBXSkinType SkinType); +extern PACKAGE void __fastcall SpDrawXPMenuPopupWindow(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Types::TRect &OpenIVRect, bool DrawGutter, int ImageSize, Sptbxskins::TSpTBXSkinType SkinType); +extern PACKAGE void __fastcall SpDrawXPStatusBar(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Types::TRect &AGripRect, Sptbxskins::TSpTBXSkinType SkinType, bool UsingOfficeTheme); +extern PACKAGE void __fastcall SpDrawXPTitleBar(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool IsActive, bool DrawBorders = true); +extern PACKAGE void __fastcall SpDrawXPTitleBarBody(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool IsActive, const Types::TPoint &BorderSize, bool DrawBody = true); +extern PACKAGE void __fastcall SpDrawXPDock(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, Sptbxskins::TSpTBXSkinType SkinType, bool Vertical = false); +extern PACKAGE void __fastcall SpDrawXPToolbar(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, Sptbxskins::TSpTBXSkinType SkinType, bool Docked, bool Floating, bool Vertical, bool PaintSkinBackground, bool PaintBorders, Sptbxskins::TSpTBXSkinComponentsType SkinComponent = (Sptbxskins::TSpTBXSkinComponentsType)(0xe))/* overload */; +extern PACKAGE void __fastcall SpDrawXPToolbar(Tb2dock::TTBCustomDockableWindow* W, Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool PaintOnNCArea, bool PaintBorders = true, Sptbxskins::TSpTBXSkinComponentsType SkinComponent = (Sptbxskins::TSpTBXSkinComponentsType)(0xe))/* overload */; +extern PACKAGE void __fastcall SpDrawXPToolbarGrip(Tb2dock::TTBCustomDockableWindow* W, Graphics::TCanvas* ACanvas, const Types::TRect &ARect); +extern PACKAGE void __fastcall SpDrawXPTooltipBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect); +extern PACKAGE Types::TPoint __fastcall SpCalcPopupPosition(const int X, const int Y, const int Width, const int Height, Controls::TControl* PopupControl = (Controls::TControl*)(0x0), bool IsVertical = false); +extern PACKAGE System::WideString __fastcall SpHMenuGetCaption(HMENU Menu, int Index); +extern PACKAGE bool __fastcall SpHMenuToTBMenuItem(HMENU Menu, Tb2item::TTBCustomItem* ParentItem); +extern PACKAGE int __fastcall SpShowSystemPopupMenu(Forms::TCustomForm* ParentForm, const Types::TPoint &ScreenPos, bool DoDefault = true); +extern PACKAGE bool __fastcall SpFillSystemSpTBXPopup(Forms::TCustomForm* ParentForm, Tb2item::TTBCustomItem* ParentItem, bool ShowSize, bool ShowMinimize, bool ShowMaximize, bool ShowClose, Classes::TNotifyEvent ClickEvent = 0x0); +extern PACKAGE int __fastcall SpShowSystemSpTBXPopupMenu(Forms::TCustomForm* ParentForm, const Types::TPoint &ScreenPos, bool ShowSize, bool ShowMinimize, bool ShowMaximize, bool ShowClose, TSpTBXPopupEvent PopupEvent, bool DoDefault = true); +extern PACKAGE void __fastcall SpActivateDwmNC(Controls::TWinControl* WinControl, bool Activate); +extern PACKAGE bool __fastcall SpIsDwmCompositionEnabled(void); +extern PACKAGE bool __fastcall SpCanFocus(Controls::TWinControl* WinControl); +extern PACKAGE bool __fastcall SpIsFocused(Controls::TWinControl* WinControl, /* out */ Controls::TWinControl* &FocusedChild); +extern PACKAGE Controls::TWinControl* __fastcall SpFocusFirstChild(Controls::TWinControl* WinControl); +extern PACKAGE int __fastcall SpFindControl(Controls::TWinControl* Parent, Controls::TControl* Child); +extern PACKAGE Controls::TWinControl* __fastcall SpFindParent(Controls::TControl* Control, System::TClass ParentClass); +extern PACKAGE bool __fastcall SpHasBorders(Controls::TWinControl* WinControl); +extern PACKAGE Forms::TWindowState __fastcall SpGetFormWindowState(Forms::TCustomForm* F, /* out */ Types::TRect &RestoreBoundsRect); +extern PACKAGE void __fastcall SpSetFormWindowState(Forms::TCustomForm* F, Forms::TWindowState WindowState, const Types::TRect &RestoreBoundsRect); +extern PACKAGE bool __fastcall SpGetTaskBar(/* out */ unsigned &State, /* out */ unsigned &Edge, /* out */ Types::TRect &Bounds); +extern PACKAGE void __fastcall SpRecalcNCArea(Controls::TWinControl* WinControl); +extern PACKAGE void __fastcall SpCustomizeAllToolbars(Classes::TComponent* AParentComponent, bool Reset); +extern PACKAGE void __fastcall SpBeginUpdateAllToolbars(Classes::TComponent* AParentComponent); +extern PACKAGE void __fastcall SpEndUpdateAllToolbars(Classes::TComponent* AParentComponent); +extern PACKAGE void __fastcall SpPersistent_AfterInherited_DefineProperties(Classes::TFiler* Filer, Classes::TPersistent* Instance); + +} /* namespace Sptbxitem */ +using namespace Sptbxitem; +#pragma pack(pop) +#pragma option pop + +#pragma delphiheader end. +//-- end unit ---------------------------------------------------------------- +#endif // SptbxitemHPP diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXItem.pas b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXItem.pas new file mode 100644 index 0000000..a5e0a28 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXItem.pas @@ -0,0 +1,9857 @@ +unit SpTBXItem; + +{============================================================================== +Version 2.4.2 + +The contents of this file are subject to the SpTBXLib License; you may +not use or distribute this file except in compliance with the +SpTBXLib License. +A copy of the SpTBXLib License may be found in SpTBXLib-LICENSE.txt or at: + http://www.silverpointdevelopment.com/sptbxlib/SpTBXLib-LICENSE.htm + +Alternatively, the contents of this file may be used under the terms of the +Mozilla Public License Version 1.1 (the "MPL v1.1"), in which case the provisions +of the MPL v1.1 are applicable instead of those in the SpTBXLib License. +A copy of the MPL v1.1 may be found in MPL-LICENSE.txt or at: + http://www.mozilla.org/MPL/ + +If you wish to allow use of your version of this file only under the terms of +the MPL v1.1 and not to allow others to use your version of this file under the +SpTBXLib License, indicate your decision by deleting the provisions +above and replace them with the notice and other provisions required by the +MPL v1.1. If you do not delete the provisions above, a recipient may use your +version of this file under either the SpTBXLib License or the MPL v1.1. + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for +the specific language governing rights and limitations under the License. + +The initial developer of this code is Robert Lee. + +Requirements: +For Delphi/C++Builder 2009 or newer: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org +For Delphi/C++Builder 7-2007: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org + - Troy Wolbrink's TNT Unicode Controls + http://www.tntware.com/delphicontrols/unicode/ + +Wish list for TB2K: + - tboSameHeight option for toolbar items, used to stretch the item + to the highest possible size. + - It would be nice to have a way to get the TTBItemViewer width and height + even when the Item is not visible (TTBItemViewer.BoundsRect is not valid + when the item is not visible). + As a workaround we should use TTBItemViewer.CalcSize method. + - It would be nice to allow component writers to override + TTBCustomToolbar.CreateWrapper so they can create custom TTBControlItem + items descendants as the dropped control wrappers. + - It would be nice to have access to the TTBPopupMenu Viewer before the + popup is showed to initialize the items, for example to set the focus + on a TTBEditItem. + +Development notes: + - All the Windows and Delphi bugs fixes are marked with '[Bugfix]'. + - All the theme changes and adjustments are marked with '[Theme-Change]'. + - All the compatibility changes are marked with '[Backward-Compatibility]'. + - TSpTBXCompoundItemsControl is used as the base class for TB2K items enabled + Controls, it uses the ITBItems interface and streams the items to the DFM. + - When a control is dropped on the toolbar a TTBControlItem is created by + TTBCustomToolbar.CreateWrapper, unfortunately it is created with the + Toolbar.Owner instead of the Form (Owner.Owner for TSpTBXCompoundItemsControl + like the TSpTBXTabSet or TSpTBXStatusBar). The workaround is to handle the + CM_CONTROLCHANGE message in the compound toolbar, stream all the + TTBControlItem.Control to the DFM (the TSpTBXCompoundItemsControl must be + the parent in the DFM), and finally reset the TTBControlItem.Control + parentship to the Toolbar in TSpTBXCompoundItemsControl.Loaded. + +To Do: + - + +History: +8 May 2009 - version 2.4.2 + - Added Dutch translation for the Customizer demo, thanks to + Alfred Vink. + - Added Tooltips Vista theming. + +15 March 2009 - version 2.4.1 + - Fixed incorrect TntAction checking, thanks to Costas Stergiou + for reporting this. + +17 January 2009 - version 2.4 + - Replaced the default Windows taskbar PopupMenu with a skninned + PopupMenu when TSpTBXTitleBar is used on the Main form. + - Fixed incorrect menu separator painting when it was used on + a ToolBoxPopup submenu, thanks to Yury Plashenkov for + reporting this. + - Fixed incorrect menu item margins, thanks to Eduardo Mauro + for reporting this. + +26 September 2008 - version 2.3 + - New Toolbar item added, TSpTBXColorItem. + - Fixed incorrect Alt-Space handling on TSpTBXTitleBar, the + System PopupMenu was still showed even when SystemMenu was + setted to False, thanks to Ilya Zaytsev for reporting this. + - Fixed incorrect items text sizing when SystemFont was setted + to False, thanks to Minoru Yoshida for reporting this. + - Fixed a Delphi 7 bug, D7 hints didn't support multi-monitors, + thanks to Costas Stergiou for reporting this. + +29 July 2008 - version 2.2 + - Fixed AV raised when Screen.MonitorFromWindow failed, thanks + to Andrew Denton for reporting this. + - Added OnClosePopup event to TSpTBXPopupMenu. + +26 June 2008 - version 2.1 + - Added Turkish translation for the Customizer demo, thanks to + Zylar. + - Fixed incorrect keyboard handling on TSpTBXTitleBar, Alt+Space + didn't popup the system menu, thanks to Costas Stergiou for + reporting this. + +3 May 2008 - version 2.0 + - SpTBXLib is now decoupled from TBX and uses the latest version + of TB2K, with NO PATCHES REQUIRED. + - Added HideEmptyPopup property to TSpTBXSubmenuItem, when + the submenu has no items and this property is set the + popup window will not be showed. + - Added Swedish translation for the Customizer demo, thanks to + Mattias Andersson. + +2 April 2008 - version 1.9.5 + - Fixed incorrect item stretching when the toolbar was + vertical and tboImageAboveCaption was set, thanks to + John for reporting this. + - Fixed incorrect item painting when no themes were + used, thanks to Denis for reporting this. + - Fixed incorrect TSpTBXToolPalette.Images handling, thanks + to Minoru Yoshida for reporting this. + - Fixed incorrect menu gutter painting when hints were showed, + thanks to Michele and Beta Xiong for reporting this. + - Fixed incorrect floating border painting when the default + size was changed thanks to Costas Stergiou and Serge + for reporting this. + - Fixed incorrect floating border painting on Vista, + the borders should not be transparent, thanks to + Costas Stergiou for reporting this. + +3 February 2008 - version 1.9.4 + - No changes. + +19 January 2008 - version 1.9.3 + - Completed the Brazilian Portuguese translation of the Customizer + demo, thanks to Mauricio Magnani. + - Added TSpTBXToolWindow component. + - Fixed incorrect gutter painting on the popup menus. + - Fixed item stretching problems + +26 December 2007 - version 1.9.2 + - New component added: TSpTBXToolWindow, a fully customizable + ToolWindow with unicode support. + - Added State parameter to the toolbar items OnDrawCaption event. + - Fixed AV on Delphi 2005, Margins and Paddings were introduced + on Delphi 2006, thanks to Stefan for reporting this. + - Minor bug fixes. + +1 December 2007 - version 1.9.1 + - Added Invalidate method to TSpTBXItem. + - Added OnClosePopup event to TSpTBXSubmenuItem. + - Fixed tboNoRotation use on vertical toolbar items, when + tboImageAboveCaption is not set the glyph should appear + aligned with the caption. + +20 November 2007 - version 1.9 + - New theme engine. + - Added SpTBXHintWindowClass global variable, it specifies which + THintWindow class is used to show the hints. + - Added TSpTBXToolPalette and TSpTBXColorPalette items. + - Added TSpTBXToolWindow component. + - Removed TSpTBXComboBoxItem, TSpTBXDropDownItem, TSpTBXStringList + and TSpTBXUndoList. + +8 February 2007 - version 1.8.3 + - No changes. + +17 December 2006 - version 1.8.2 + - Added Toolbar public property to TSpTBXStatusBar. + +24 November 2006 - version 1.8.1 + - Added properties to TSpTBXRightAlignSpacer: ImageIndex, Images, + OnAdjustFont, OnClick, OnDrawHint, OnDrawImage, OnDrawItem. + - Added unicode shortcut-text support for menu items, thanks + Steve for reporting this. + - Fixed incorrect TSpTBXTitleBar positioning when the + taskbar is moved around the screen, thanks to + Costas Stergiou for reporting this. + - Fixed incorrect TSpTBXStatusBar size grip painting when + Windows XP themes are disabled, thanks to Alexey Naumov + for reporting this. + +27 August 2006 - version 1.8 + - Fixed incorrect DropdownCombo item painting, thanks to + François Rivierre for reporting this. + - Fixed incorrect TSpTBXTitleBar SystemMenu painting, + GetMenuStringW doesn't work correctly on Win2K/WinXP, + when a DBCS code page is active (e.g. Japanese), thanks + to Jordan Russell for reporting this. + http://news.jrsoftware.org/read/article.php?id=12268&group=jrsoftware.toolbar2000.thirdparty + - Fixed bug in TSpTBXLabelItem, clicking a TSpTBXLabelItem + on a popup menu causes the menu to close, thanks to + Piotr Janus for reporting this. + +15 June 2006 - version 1.7 + - Added vertical caption painting to toolbar items. + - Added CaptionGlow and CaptionGlowColor properties to + toolbar Items. + - Added Margins property to toolbar items. + - Fixed incorrect TSpTBXTitleBar resizing when the form is + maximized and the titlebar is activated and deactivated + multiple times, thanks to Costas Stergiou for reporting this. + +4 May 2006 - version 1.6 + - Fixed incorrect TSpTBXStatusBar behavior, the size grip + disappeared when the parent was a TSpTBXTitleBar, thanks to + Costas Stergiou for reporting this. + - Fixed incorrect TSpTBXStatusBar's size grip painting when the + Default theme was used. + - Fixed incorrect TSpTBXLabelItem painting when the label was used + in a submenu, thanks to Costas Stergiou for reporting this. + - Added OnSystemMenuPopup event to TSpTBXTitleBar. + +12 April 2006 - version 1.5 + - Fixed incorrect TSpTBXStatusBar behavior, it didn't resized + the form if the mouse click was on the non-client area of the + status bar, thanks to Frank de Groot for reporting this. + - Fixed incorrect mouse handling in TSpTBXTitlebar, thanks to + Marten Pape for reporting this. + - Fixed incorrect TSpTBXLabelItem alignment on menus, thanks to + Costas Stergiou for reporting this. + - Added ClickedItem parameter to TSpTBXSubmenuItem.OnClosePopup + event. + +27 February 2006 - version 1.4 + - Added SizeGrip property to TSpTBXStatusBar. + - Added FullScreenMaximize property to TSpTBXTitleBar. + +10 February 2006 - version 1.3 + - Fixed AV in TSpTBXTitleBar at designtime, thanks to + Alexey Naumov for reporting this. + - Fixed incorrect system popupmenu visibility in TSpTBXTitleBar. + - Added Active property to TSpTBXTitleBar. + - Added OnDrawBackground event to TSpTBXTitleBar. + - Added OnClosePopup event to TSpTBXSubmenuItem. + +28 December 2005 - version 1.2 + - Fixed incorrect items anchoring. + - Fixed range check errrors. + +18 October 2005 - version 1.1 + - Fixed incorrect TSpTBXStatusBar margins when the form is + maximazed. + - Fixed incorrect accel char handling in TSpTBXToolbar. + - Fixed incorrect TntAction support, the previous version of + TntActions didn't supported unicode enabled ActionLinks. + - Fixed incorrect tab stop chars handling in TSpTBXItem. + - Added MaxSize property to TSpTBXToolbar, determines + the maximum height the toolbar can have. + - Added TBX themes support to TSpTBXTitleBar's system menu. + - Added radio item painting support. + +18 August 2005 - version 1.0 + - Added DisplayOptions property to TSpTBXToolbar, determines + whether the item's image is to be displayed. + - Added Customizable property to TSpTBXToolbar, determines + whether the toolbar is customizable or not. + - Added TitleBarSize property to the Options of the + TSpTBXTitlebar. + +10 June 2005 - version 0.9 + - SpTBXLib may now alternatively, at your option, be used and/or + distributed under the terms of the SpTBXLib License. + Please see the updated LICENSE.TXT file for more information. + +20 May 2005 - version 0.8 + - Fixed incorrect caption centering in TSpTBXItem. + - Fixed incorrect TSpTBXItem hint when accessing TntApplication, + thanks to Erik Maly for reporting this. + - Changed the Options property of TSpTBXTitleBar to use a base class + for default buttons. + - Added ChevronVertical property to TSpTBXToolbar, it changes the + layout of the chevron popup to be vertical. + - Added Wrapping property to TSpTBXItem, it determines the wrapping + type of the item's caption. + - Added FixedSize property to TSpTBXTitleBar, it determines if + the TitleBar can be resized. + +16 February 2005 - version 0.7 + - Fixed TSpTBXThemeGroupItem theme sync bug, it now correctly selects + the current TBX theme. + - Fixed unicode support in W9x. + - Fixed TSpTBXTitleBar painting flicker. + - Fixed TSpTBXStatusBar right align margin. + - Added TBXStyleBackground property to TSpTBXTitleBar, when setted to + true it paints a TBX style background. + - Added AutoCheck property to TSpTBXItem. + +23 December 2004 - version 0.6 + - Fixed hint bug, ampersands were not removed in auto-generated hints. + - Fixed incorrect caption painting when the font is italic, this bug + is present in TBX items, TLabel, TBitBtn, TSpeedButton, TGroupBox, + TRadioGroup, and any other control that uses DrawText to draw the + caption. To reproduce this, drop a TBitBtn, change the caption to + 'WWW' and the font to italic, the last W is cropped. + - Fixed incorrect caption painting when the Default theme is used, + the caption was not painted in a down state when the toolbarstyle + item was pushed, thanks Daniel Rikowski for reporting this. + - Changed the default value of DisplayMode to nbdmDefault. + - New component added, TSpTBXTitleBar: a fully customizable + TitleBar with Unicode text and TBX themes support. + - New component added, TSpTBXPopupMenu: a TTBXPopupMenu descendant + with an OnPopupMenuInit event to setup the items before the popup + is showed, it could be used for example to set the focus to an + EditItem. + - Added SpChangeThemeType utility function, this makes it easier to + switch the theme type of any given control and its children. + +30 August 2004 - version 0.5 + - Reworked the hint show event of the items. + +21 July 2004 - version 0.4 + - Fixed TTBControlItem.Control streaming bug on TSpTBXStatusBar. + - Fixed bad sync of the items unicode caption and hint properties + when an Action was assigned. + +12 July 2004 - version 0.3.1 + - Unchanged. + +9 July 2004 - version 0.3 + - Fixed incorrect TSpTBXItem caption painting when DisplayMode + was nbdmDefault, thanks to Cyril for reporting this. + - Added anchors support for TTBControlItem items, if the associated + Control is client aligned or has akRight in its Anchors property. + - The theme items in TSpTBXThemeGroupItem are now sorted. + - Added OnUpdate event to TSpTBXThemeGroupItem, this event is fired + every time the theme items list is recreated, use this event + to sort or change the items properties. + +27 June 2004 - version 0.2 + - Fixed Toolbar custom painting event. + - Fixed incorrect Shortcut painting in submenus. + - Fixed incorrect Shortcut hint painting. + - Removed thtBitmapSkin from TSpTBXThemeType. + - Published more properties for TSpTBXLabelItem. + - New Toolbar item added, TSpTBXSeparator. + - New component added, TSpTBXStatusBar: a fully customizable + StatusBar with Unicode text and TBX themes support. + +22 June 2004 - version 0.1 + - Initial release. + +==============================================================================} + +interface + +{$BOOLEVAL OFF} // Unit depends on short-circuit boolean evaluation +{$I TB2Ver.inc} + +uses + Windows, Messages, Classes, SysUtils, Forms, Controls, Graphics, ImgList, + Menus, StdCtrls, ActnList, + {$IFNDEF UNICODE} + TntClasses, TntControls, + {$ENDIF} + TB2Item, TB2Dock, TB2Toolbar, TB2ToolWindow, + SpTBXSkins; + +{$IFDEF UNICODE} +type + TTntStringList = TStringList; +{$ENDIF} + +const + C_SpTBXRadioGroupIndex = 8888; // Default GroupItem of TSpTBXRadioGroupItem + CM_SPPOPUPCLOSE = CM_BASE + 1111; // Message sent to the PopupControl to update its state after the Popup is closed + rvSpTBXDisplayMode = 'DisplayMode'; // Constant used to save the Toolbar DisplayMode with the Customizer. Do not localize! + CPDefaultCols = 8; // ColorPalette constant + CPDefaultRows = 5; // ColorPalette constant + +type + TSpTBXCustomItem = class; + TSpTBXToolbar = class; + TSpTBXStatusToolbar = class; + TSpTBXPopupMenu = class; + + TSpTBXPaintStage = ( + pstPrePaint, // Pre paint stage + pstPostPaint // Post paint stage + ); + + TSpTBXToolbarDisplayMode = ( + tbdmSelectiveCaption, // The caption is displayed if the Item.DisplayMode = nbdmImageAndText + tbdmImageOnly, // Only the images are displayed + tbdmImageAboveCaption, // The images are displayed above the caption + tbdmTextOnly // Show the caption only + ); + + TSpTBXToolbarState = ( + tstResizing, // The toolbar is being resized + tstRightAligning, // The toolbar items are being right aligned + tstAnchoring // The toolbar items are being anchored + ); + + TSpTBXToolbarStates = set of TSpTBXToolbarState; + + TSpBorderIcon = ( + briSystemMenu, // SystemMenu item on the title bar + briMinimize, // Minimize item on the title bar + briMaximize, // Maximize item on the title bar + briClose // Close item on the title bar + ); + + TSpBorderIcons = set of TSpBorderIcon; + + TTextWrapping = ( + twNone, // No wrapping + twEndEllipsis, // End ellipsis '...' + twPathEllipsis, // Path ellipsis '\..\..' + twWrap // Word wrap + ); + + TSpTBXSearchItemViewerType = ( + sivtNormal, // Normal search + sivtInmediate, // Search for the inmediate ItemViewer + sivtInmediateSkipNonVisible// Search for the next inmediate ItemViewer, skipping non visible ones + ); + + TSpTBXGetImageIndexEvent = procedure(Sender: TObject; + var AImageList: TCustomImageList; var AItemIndex: Integer) of object; + + TSpTBXDrawEvent = procedure(Sender: TObject; ACanvas: TCanvas; + ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean) of object; + + TSpTBXDrawImageEvent = procedure(Sender: TObject; ACanvas: TCanvas; + State: TSpTBXSkinStatesType; const PaintStage: TSpTBXPaintStage; + var AImageList: TCustomImageList; var AImageIndex: Integer; + var ARect: TRect; var PaintDefault: Boolean) of object; + + TSpTBXDrawItemEvent = procedure(Sender: TObject; ACanvas: TCanvas; + ARect: TRect; ItemInfo: TSpTBXMenuItemInfo; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean) of object; + + TSpTBXDrawPosEvent = procedure(Sender: TObject; ACanvas: TCanvas; + X, Y: Integer; var PaintDefault: Boolean) of object; + + TSpTBXDrawTextEvent = procedure(Sender: TObject; ACanvas: TCanvas; + ClientAreaRect: TRect; State: TSpTBXSkinStatesType; var ACaption: WideString; + var CaptionRect: TRect; var CaptionFormat: Cardinal; IsTextRotated: Boolean; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean) of object; + + TSpTBXDrawHintEvent = procedure(Sender: TObject; AHintBitmap: TBitmap; + var AHint: WideString; var PaintDefault: Boolean) of object; + + TSpTBXItemNotificationEvent = procedure(Sender: TObject; + Ancestor: TTBCustomItem; Relayed: Boolean; Action: TTBItemChangedAction; + Index: Integer; Item: TTBCustomItem) of object; + + TSpTBXRadioGroupFillStringsEvent = procedure(Sender: TObject; + Strings: TTntStringList) of object; + + TSpTBXPopupEvent = procedure(Sender: TObject; PopupView: TTBView) of object; + + { TSpTBXFontSettings } + + TSpTBXFontSize = 25..1000; + + TSpTBXFontSettings = class(TPersistent) + private + FColor: TColor; + FName: TFontName; + FSize: TSpTBXFontSize; + FStyle: TFontStyles; + FOnChange: TNotifyEvent; + procedure SetColor(Value: TColor); + procedure SetName(const Value: TFontName); + procedure SetSize(Value: TSpTBXFontSize); + procedure SetStyle(const Value: TFontStyles); + protected + procedure Modified; + property OnChange: TNotifyEvent read FOnChange write FOnChange; + public + constructor Create; + procedure Apply(AFont: TFont); + procedure Assign(Src: TPersistent); override; + published + property Color: TColor read FColor write SetColor default clNone; + property Name: TFontName read FName write SetName; // default '' + property Size: TSpTBXFontSize read FSize write SetSize default 100; // Size Percent + property Style: TFontStyles read FStyle write SetStyle default []; + end; + + { TSpTBXCustomDragObject } + + TSpTBXCustomDragObject = class(TDragObjectEx) + private + FDragCursorAccept: TCursor; + FDragCursorCancel: TCursor; + FSourceControl: TControl; + FSourceItem: TTBCustomItem; + protected + function GetDragCursor(Accepted: Boolean; X: Integer; Y: Integer): TCursor; override; + procedure Finished(Target: TObject; X, Y: Integer; Accepted: Boolean); override; + public + constructor Create(ASourceControl: TControl; AItem: TTBCustomItem); virtual; + property DragCursorAccept: TCursor read FDragCursorAccept write FDragCursorAccept; + property DragCursorCancel: TCursor read FDragCursorCancel write FDragCursorCancel; + property SouceItem: TTBCustomItem read FSourceItem; + property SourceControl: TControl read FSourceControl; + end; + + { TSpTBXItemDragObject } + + TSpTBXItemDragObject = class(TSpTBXCustomDragObject); + + { TSpTBXCustomItemActionLink } + + {$IFNDEF UNICODE} + TSpTBXCustomItemActionLink = class(TTBCustomItemActionLink) + protected + FUnicodeClient: TSpTBXCustomItem; + procedure AssignClient(AClient: TObject); override; + function IsCaptionLinked: Boolean; override; + function IsHintLinked: Boolean; override; + procedure SetCaption(const Value: string); override; + procedure SetHint(const Value: string); override; + end; + {$ELSE} + TSpTBXCustomItemActionLink = class(TTBCustomItemActionLink); + {$ENDIF} + + { TSpTBXCustomControl } + + {$IFNDEF UNICODE} + TSpTBXCustomControl = class(TCustomControl) + private + function IsCaptionStored: Boolean; + function IsHintStored: Boolean; + function GetCaption: TWideCaption; + function GetHint: WideString; + procedure SetCaption(const Value: TWideCaption); + procedure SetHint(const Value: WideString); + protected + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + // Don't let the streaming system store the WideStrings, use DefineProperties instead + property Caption: TWideCaption read GetCaption write SetCaption stored IsCaptionStored; // Hides the inherited Caption + property Hint: WideString read GetHint write SetHint stored IsHintStored; // Hides the inherited Hint + end; + {$ELSE} + TSpTBXCustomControl = class(TCustomControl); + {$ENDIF} + + { TSpTBXItem } + + TSpTBXCustomItem = class(TTBCustomItem) + private + {$IFNDEF UNICODE} + FCaption: WideString; + FHint: WideString; + {$ENDIF} + FCaptionGlow: TSpGlowDirection; + FCaptionGlowColor: TColor; + FAlignment: TAlignment; + FAnchored: Boolean; + FControl: TControl; + FCustomWidth: Integer; + FCustomHeight: Integer; + FFontSettings: TSpTBXFontSettings; + FMargins: Integer; + FMinHeight: Integer; + FMinWidth: Integer; + FStretch: Boolean; + FToolbarStylePopup: Boolean; + FToolBoxPopup: Boolean; + FWrapping: TTextWrapping; + FOnClosePopup: TNotifyEvent; + FOnInitPopup: TSpTBXPopupEvent; + FOnDrawCaption: TSpTBXDrawTextEvent; + FOnDrawHint: TSpTBXDrawHintEvent; + FOnDrawItem: TSpTBXDrawItemEvent; + FOnDrawImage: TSpTBXDrawImageEvent; + {$IFNDEF UNICODE} + function IsCaptionStored: Boolean; + function IsHintStored: Boolean; + procedure SetCaption(const Value: WideString); + procedure SetHint(const Value: WideString); + {$ENDIF} + procedure FontSettingsChanged(Sender: TObject); + procedure SetAlignment(const Value: TAlignment); + procedure SetAnchored(const Value: Boolean); + procedure SetCaptionGlow(const Value: TSpGlowDirection); + procedure SetCaptionGlowColor(const Value: TColor); + procedure SetControl(const Value: TControl); + procedure SetCustomWidth(Value: Integer); + procedure SetCustomHeight(Value: Integer); + procedure SetFontSettings(const Value: TSpTBXFontSettings); + procedure SetMargins(Value: Integer); + procedure SetMinHeight(const Value: Integer); + procedure SetMinWidth(const Value: Integer); + procedure SetStretch(const Value: Boolean); + procedure SetToolBoxPopup(const Value: Boolean); + procedure SetWrapping(const Value: TTextWrapping); + protected + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + function DialogChar(CharCode: Word): Boolean; virtual; + procedure DefineProperties(Filer: TFiler); override; + procedure DoDrawAdjustFont(AFont: TFont; State: TSpTBXSkinStatesType); virtual; + procedure DoDrawHint(AHintBitmap: TBitmap; var AHint: Widestring; var PaintDefault: Boolean); virtual; + procedure DoDrawButton(ACanvas: TCanvas; ARect: TRect; ItemInfo: TSpTBXMenuItemInfo; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure DoDrawCaption(ACanvas: TCanvas; ClientAreaRect: TRect; State: TSpTBXSkinStatesType; + var ACaption: WideString; var CaptionRect: TRect; var CaptionFormat: Cardinal; + IsTextRotated: Boolean; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure DoDrawImage(ACanvas: TCanvas; State: TSpTBXSkinStatesType; + const PaintStage: TSpTBXPaintStage; var AImageList: TCustomImageList; + var AImageIndex: Integer; var ARect: TRect; var PaintDefault: Boolean); virtual; + procedure DoPopupShowingChanged(APopupWindow: TTBPopupWindow; IsVisible: Boolean); virtual; + function GetActionLinkClass: TTBCustomItemActionLinkClass; override; + function GetItemViewerClass(AView: TTBView): TTBItemViewerClass; override; + function GetPopupWindowClass: TTBPopupWindowClass; override; + procedure ToggleControl; virtual; + procedure UpdateProps; virtual; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + + property Alignment: TAlignment read FAlignment write SetAlignment default taCenter; + property Anchored: Boolean read FAnchored write SetAnchored default False; + property CaptionGlow: TSpGlowDirection read FCaptionGlow write SetCaptionGlow default gldNone; + property CaptionGlowColor: TColor read FCaptionGlowColor write SetCaptionGlowColor default clYellow; + property Control: TControl read FControl write SetControl; + property CustomWidth: Integer read FCustomWidth write SetCustomWidth default -1; + property CustomHeight: Integer read FCustomHeight write SetCustomHeight default -1; + property FontSettings: TSpTBXFontSettings read FFontSettings write SetFontSettings; + property Margins: Integer read FMargins write SetMargins default 0; + property MinHeight: Integer read FMinHeight write SetMinHeight default 0; + property MinWidth: Integer read FMinWidth write SetMinWidth default 0; + property ToolbarStylePopup: Boolean read FToolbarStylePopup write FToolbarStylePopup default False; // Used on submenus + property ToolBoxPopup: Boolean read FToolBoxPopup write SetToolBoxPopup default False; // Used on submenus + property Stretch: Boolean read FStretch write SetStretch default True; // Hidden, all items are stretched by default + property OnClosePopup: TNotifyEvent read FOnClosePopup write FOnClosePopup; + property OnInitPopup: TSpTBXPopupEvent read FOnInitPopup write FOnInitPopup; + property OnDrawCaption: TSpTBXDrawTextEvent read FOnDrawCaption write FOnDrawCaption; + property OnDrawHint: TSpTBXDrawHintEvent read FOnDrawHint write FOnDrawHint; + property OnDrawImage: TSpTBXDrawImageEvent read FOnDrawImage write FOnDrawImage; + property OnDrawItem: TSpTBXDrawItemEvent read FOnDrawItem write FOnDrawItem; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Click; override; + function GetShortCutText: WideString; // Reintroduce to support unicode shortcut text + procedure InitiateAction; override; + procedure Invalidate; + published + {$IFNDEF UNICODE} + // Don't let the streaming system store the WideStrings, use DefineProperties instead + property Caption: WideString read FCaption write SetCaption stored IsCaptionStored; // Hides the inherited Caption + property Hint: WideString read FHint write SetHint stored IsHintStored; // Hides the inherited Hint + {$ELSE} + property Caption; + property Hint; + {$ENDIF} + property Wrapping: TTextWrapping read FWrapping write SetWrapping default twWrap; + end; + + TSpTBXItemViewer = class(TTBItemViewer) + private + function GetItem: TSpTBXCustomItem; + procedure CMHintShow(var Message: TMessage); message CM_HINTSHOW; + procedure InternalCalcSize(const Canvas: TCanvas; CalcStretch: Boolean; var AWidth, AHeight: Integer); + protected + FAnchorSize: TPoint; + FAnchorDelta: Integer; + + // Custom Painting methods + procedure DoDrawAdjustFont(AFont: TFont; State: TSpTBXSkinStatesType); virtual; + procedure DoDrawButton(ACanvas: TCanvas; ARect: TRect; ItemInfo: TSpTBXMenuItemInfo; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure DoDrawCaption(ACanvas: TCanvas; ClientAreaRect: TRect; + State: TSpTBXSkinStatesType; var ACaption: WideString; var CaptionRect: TRect; + var CaptionFormat: Cardinal; IsTextRotated: Boolean; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); virtual; + procedure DoDrawImage(ACanvas: TCanvas; State: TSpTBXSkinStatesType; + const PaintStage: TSpTBXPaintStage; var AImageList: TCustomImageList; + var AImageIndex: Integer; var ARect: TRect; var PaintDefault: Boolean); virtual; + procedure DoDrawHint(AHintBitmap: TBitmap; CursorPos: TPoint; var CursorRect: TRect; var AHint: Widestring; var PaintDefault: Boolean); virtual; + + // Painting methods + function CaptionShown: Boolean; override; + function GetImageShown: Boolean; virtual; + function GetImageSize: TSize; virtual; + function GetRightImageSize: TSize; virtual; + function GetTextColor(State: TSpTBXSkinStatesType): TColor; virtual; + procedure DrawItemImage(ACanvas: TCanvas; ARect: TRect; ItemInfo: TSpTBXMenuItemInfo; ImgIndex: Integer); virtual; + procedure DrawItemRightImage(ACanvas: TCanvas; ARect: TRect; ItemInfo: TSpTBXMenuItemInfo); virtual; + procedure CalcSize(const Canvas: TCanvas; var AWidth, AHeight: Integer); override; + procedure GetTextInfo(ACanvas: TCanvas; State: TSpTBXSkinStatesType; out TextInfo: TSpTBXTextInfo); + procedure Paint(const Canvas: TCanvas; const ClientAreaRect: TRect; IsSelected, IsPushed, UseDisabledShadow: Boolean); override; + + // Hints + procedure Entering; override; + procedure InternalMouseMove(Shift: TShiftState; X, Y: Integer); virtual; + public + function GetCaptionText: WideString; reintroduce; virtual; // Hides the inherited TB2K GetCaptionText function + function GetHintText: Widestring; reintroduce; virtual; // Hides the inherited TB2K GetHintText function + property Item: TSpTBXCustomItem read GetItem; // Hides the inherited TB2K Item property + end; + + TSpTBXItem = class(TSpTBXCustomItem) + published + property Action; + property AutoCheck; + property Checked; + property DisplayMode; + property Enabled; + property GroupIndex; + property HelpContext; + property ImageIndex; + property Images; + property InheritOptions; + property MaskOptions; + property Options; + property RadioItem; + property ShortCut; + property Visible; + // property OnDrawImage; use custom OnDrawImage + property OnClick; + property OnSelect; + // TSpTBXCustomItem properties + property Alignment; + property Anchored; + property CaptionGlow; + property CaptionGlowColor; + property Control; + property CustomWidth; + property CustomHeight; + property FontSettings; + property Margins; + property MinHeight; + property MinWidth; + property OnDrawCaption; + property OnDrawHint; + property OnDrawImage; + property OnDrawItem; + end; + + { TSpTBXRootItem } + + TSpTBXRootItem = class(TTBRootItem) + private + FToolBoxPopup: Boolean; + FOnInitPopup: TSpTBXPopupEvent; + FOnClosePopup: TNotifyEvent; + procedure SetToolBoxPopup(const Value: Boolean); + protected + procedure DoPopupShowingChanged(APopupWindow: TTBPopupWindow; IsVisible: Boolean); virtual; + function GetPopupWindowClass: TTBPopupWindowClass; override; + property ToolBoxPopup: Boolean read FToolBoxPopup write SetToolBoxPopup default False; + public + property OnInitPopup: TSpTBXPopupEvent read FOnInitPopup write FOnInitPopup; + property OnClosePopup: TNotifyEvent read FOnClosePopup write FOnClosePopup; + end; + + { TSpTBXSubmenuItem } + + TSpTBXSubmenuItem = class(TSpTBXItem) + private + FHideEmptyPopup: Boolean; + function GetDropdownCombo: Boolean; + procedure SetDropdownCombo(Value: Boolean); + public + constructor Create(AOwner: TComponent); override; + published + property DropdownCombo: Boolean read GetDropdownCombo write SetDropdownCombo default False; + property HideEmptyPopup: Boolean read FHideEmptyPopup write FHideEmptyPopup default False; + property LinkSubitems; + property SubMenuImages; + property ToolbarStylePopup; + property ToolBoxPopup; + property OnPopup; + property OnClosePopup; + property OnInitPopup; + end; + + { TSpTBXColorItem } + + TSpTBXColorItem = class(TSpTBXCustomItem) + private + FColor: TColor; + procedure SetColor(Value: TColor); + protected + function GetItemViewerClass(AView: TTBView): TTBItemViewerClass; override; + public + constructor Create(AOwner: TComponent); override; + published + property Action; + property AutoCheck; + property Checked; + property DisplayMode; + property Enabled; + property GroupIndex; + property HelpContext; + property InheritOptions; + property MaskOptions; + property Options; + property ShortCut; + property Visible; + property OnClick; + property OnSelect; + // TSpTBXCustomItem properties + property Alignment; + property Anchored; + property CaptionGlow; + property CaptionGlowColor; + property Control; + property CustomWidth; + property CustomHeight; + property FontSettings; + property Margins; + property MinHeight; + property MinWidth; + property OnDrawCaption; + property OnDrawHint; + property OnDrawImage; + property OnDrawItem; + // TSpTBXColorItem properties + property Color: TColor read FColor write SetColor default clWhite; + end; + + TSpTBXColorItemViewer = class(TSpTBXItemViewer) + protected + procedure DoDrawImage(ACanvas: TCanvas; State: TSpTBXSkinStatesType; + const PaintStage: TSpTBXPaintStage; var AImageList: TCustomImageList; + var AImageIndex: Integer; var ARect: TRect; var PaintDefault: Boolean); override; + function GetImageShown: Boolean; override; + function GetImageSize: TSize; override; + end; + + { TSpTBXLabelItem } + + TSpTBXCustomLabelItem = class(TSpTBXCustomItem) + protected + function DialogChar(CharCode: Word): Boolean; override; + procedure DoDrawButton(ACanvas: TCanvas; ARect: TRect; ItemInfo: TSpTBXMenuItemInfo; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); override; + function GetItemViewerClass(AView: TTBView): TTBItemViewerClass; override; + procedure ToggleControl; override; + procedure UpdateProps; override; + property Alignment default taLeftJustify; + public + constructor Create(AOwner: TComponent); override; + end; + + TSpTBXLabelItemViewer = class(TSpTBXItemViewer) + protected + procedure CalcSize(const Canvas: TCanvas; var AWidth, AHeight: Integer); override; + function DoExecute: Boolean; override; + end; + + TSpTBXLabelItem = class(TSpTBXCustomLabelItem) + published + property Enabled; + property ImageIndex; + property Images; + property InheritOptions; + property MaskOptions; + property Options; + property Visible; + property OnClick; + // TSpTBXCustomItem properties + property Alignment; + property Anchored; + property CaptionGlow; + property CaptionGlowColor; + property Control; + property CustomWidth; + property CustomHeight; + property FontSettings; + property Margins; + property MinHeight; + property MinWidth; + property OnDrawCaption; + property OnDrawHint; + property OnDrawImage; + property OnDrawItem; + end; + + { TSpTBXSeparatorItem } + + TSpTBXSeparatorItem = class(TTBSeparatorItem) + protected + function GetItemViewerClass(AView: TTBView): TTBItemViewerClass; override; + end; + + TSpTBXSeparatorItemViewer = class(TTBSeparatorItemViewer) + protected + procedure CalcSize(const Canvas: TCanvas; var AWidth, AHeight: Integer); override; + function IsStatusBarSeparator: Boolean; + procedure Paint(const Canvas: TCanvas; const ClientAreaRect: TRect; IsSelected, IsPushed, UseDisabledShadow: Boolean); override; + end; + + { TSpTBXRightAlignSpacerItem } + + TSpTBXRightAlignSpacerItem = class(TSpTBXCustomLabelItem) + published + property ImageIndex; + property Images; + property MaskOptions; + property Options; + property OnClick; + // TSpTBXCustomItem properties + property Alignment; + property CaptionGlow; + property CaptionGlowColor; + property CustomWidth; + property CustomHeight; + property FontSettings; + property OnDrawCaption; + property OnDrawHint; + property OnDrawImage; + property OnDrawItem; + end; + + { TSpTBXRadioGroupItem } + + TSpTBXRadioGroupItem = class(TTBGroupItem) + private + FDefaultIndex: Integer; + FLastClickedIndex: Integer; + FOnClick: TNotifyEvent; + FOnFillStrings: TSpTBXRadioGroupFillStringsEvent; + FOnUpdate: TNotifyEvent; + protected + FStrings: TTntStringList; + procedure Loaded; override; + procedure ItemClickEvent(Sender: TObject); virtual; + procedure DoClick(AItem: TSpTBXItem); virtual; + procedure DoFillStrings; virtual; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Recreate; + property DefaultIndex: Integer read FDefaultIndex write FDefaultIndex; + property LastClickedIndex: Integer read FLastClickedIndex; + published + property OnClick: TNotifyEvent read FOnClick write FOnClick; + property OnFillStrings: TSpTBXRadioGroupFillStringsEvent read FOnFillStrings write FOnFillStrings; + property OnUpdate: TNotifyEvent read FOnUpdate write FOnUpdate; + end; + + { TSpTBXSkinGroupItem } + + TSpTBXSkinGroupItem = class(TSpTBXRadioGroupItem) + private + FOnSkinChange: TNotifyEvent; + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + protected + procedure DoClick(AItem: TSpTBXItem); override; + procedure DoSkinChange; virtual; + procedure DoFillStrings; override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + property OnSkinChange: TNotifyEvent read FOnSkinChange write FOnSkinChange; + end; + + { TSpTBXSystemMenuItem } + + TSpTBXSystemMenuItem = class(TSpTBXCustomItem) + private + FMDISystemMenu: Boolean; + FShowSize: Boolean; + procedure CommandClick(Sender: TObject); + protected + function GetItemViewerClass(AView: TTBView): TTBItemViewerClass; override; + function GetSystemMenuParentForm: TCustomForm; + public + constructor Create(AOwner: TComponent); override; + procedure Click; override; + published + property MDISystemMenu: Boolean read FMDISystemMenu write FMDISystemMenu default False; + property ShowSize: Boolean read FShowSize write FShowSize default True; + end; + + TSpTBXSystemMenuItemViewer = class(TSpTBXItemViewer) + protected + procedure CalcSize(const Canvas: TCanvas; var AWidth, AHeight: Integer); override; + procedure Paint(const Canvas: TCanvas; const ClientAreaRect: TRect; IsSelected, IsPushed, UseDisabledShadow: Boolean); override; + end; + + { TSpTBXToolPalette } + + TSpTBXRowColCount = 1..100; + + TSpTBXTPGetCellHint = procedure(Sender: TObject; ACol, ARow: Integer; var AHint: WideString) of object; + + TSpTBXTPDrawCellImage = procedure(Sender: TObject; ACanvas: TCanvas; + ARect: TRect; ACol, ARow: Integer; Selected, HotTrack, Enabled: Boolean) of object; + + TSpTBXTPCellClick = procedure(Sender: TObject; ACol, ARow: Integer; var Allow: Boolean) of object; + + TSpTBXCPGetColorInfo = procedure(Sender: TObject; ACol, ARow: Integer; var Color: TColor; var Name: WideString) of object; + + TSpTBXCustomToolPalette = class(TSpTBXCustomItem) + private + FCustomImages: Boolean; + FColCount: TSpTBXRowColCount; + FRowCount: TSpTBXRowColCount; + FSelectedCell: TPoint; + FOnChange: TNotifyEvent; + FOnCellClick: TSpTBXTPCellClick; + FOnDrawCellImage: TSpTBXTPDrawCellImage; + FOnGetCellHint: TSpTBXTPGetCellHint; + procedure SetSelectedCell(Value: TPoint); + protected + function DoCellClick(ACol, ARow: Integer): Boolean; virtual; + procedure DoChange; virtual; + procedure DoDrawCellImage(ACanvas: TCanvas; const ARect: TRect; ACol, ARow: Integer; ItemInfo: TSpTBXMenuItemInfo); virtual; + procedure DoGetCellHint(ACol, ARow: Integer; var AHint: WideString); virtual; + function GetItemViewerClass(AView: TTBView): TTBItemViewerClass; override; + procedure HandleClickCell(ACol, ARow: Integer); virtual; + procedure SetColCount(Value: TSpTBXRowColCount); virtual; + procedure SetRowCount(Value: TSpTBXRowColCount); virtual; + property CustomImages: Boolean read FCustomImages write FCustomImages; + property ColCount: TSpTBXRowColCount read FColCount write SetColCount default 1; + property RowCount: TSpTBXRowColCount read FRowCount write SetRowCount default 1; + property SelectedCell: TPoint read FSelectedCell write SetSelectedCell; + property OnChange: TNotifyEvent read FOnChange write FOnChange; + property OnCellClick: TSpTBXTPCellClick read FOnCellClick write FOnCellClick; + property OnDrawCellImage: TSpTBXTPDrawCellImage read FOnDrawCellImage write FOnDrawCellImage; + property OnGetCellHint: TSpTBXTPGetCellHint read FOnGetCellHint write FOnGetCellHint; + public + constructor Create(AOwner: TComponent); override; + end; + + TSpTBXToolPalette = class(TSpTBXCustomToolPalette) + public + property SelectedCell; + published + property ColCount; + property HelpContext; + property Images; + property Options; + property RowCount; + property Visible; + property OnChange; + property OnCellClick; + property OnDrawCellImage; + property OnGetCellHint; + end; + + TSpTBXToolViewer = class(TSpTBXItemViewer) + private + FCellHeight: Integer; + FCellWidth: Integer; + FColCount: Integer; + FRowCount: Integer; + FHotCell: TPoint; + function GetItem: TSpTBXCustomToolPalette; + protected + FIndent: Integer; + FMouseIsDown: Boolean; + procedure CalcCellSize(ACanvas: TCanvas; var AWidth, AHeight: Integer); virtual; + procedure CalcSize(const Canvas: TCanvas; var AWidth, AHeight: Integer); override; + function GetImageIndex(Col, Row: Integer): Integer; + function GetImageSize: TSize; override; + function GetImageShown: Boolean; override; + function GetCellAt(X, Y: Integer; out Col, Row: Integer): Boolean; + function GetCellRect(ClientAreaRect: TRect; Col, Row: Integer): TRect; virtual; + function GetCellHint(Col, Row: Integer): WideString; + procedure DoDrawHint(AHintBitmap: TBitmap; CursorPos: TPoint; var CursorRect: TRect; var AHint: Widestring; var PaintDefault: Boolean); override; + procedure DrawCellImage(ACanvas: TCanvas; const ARect: TRect; Col, Row: Integer; ItemInfo: TSpTBXMenuItemInfo); virtual; + procedure Entering; override; + procedure InvalidateCell(ACol, ARow: Integer); + function IsCellVisible(Cell: TPoint): Boolean; virtual; + procedure KeyDown(var Key: Word; Shift: TShiftState); override; + procedure MouseDown(Shift: TShiftState; X, Y: Integer;var MouseDownOnMenu: Boolean); override; + procedure MouseMove(X, Y: Integer); override; + procedure MouseUp(X, Y: Integer; MouseWasDownOnMenu: Boolean); override; + procedure Paint(const Canvas: TCanvas; const ClientAreaRect: TRect; IsSelected, IsPushed, UseDisabledShadow: Boolean); override; + public + constructor Create(AView: TTBView; AItem: TTBCustomItem; AGroupLevel: Integer); override; + property Item: TSpTBXCustomToolPalette read GetItem; // Hides the inherited TB2K Item property + end; + + { TSpTBXColorPalette } + + TSpTBXColorPalette = class(TSpTBXCustomToolPalette) + private + FColor: TColor; + FCustomColors: Boolean; + FOnGetColor: TSpTBXCPGetColorInfo; + procedure SetColor(Value: TColor); + procedure SetCustomColors(const Value: Boolean); + protected + procedure DoChange; override; + procedure DoGetCellHint(ACol, ARow: Integer; var AHint: WideString); override; + procedure DoDrawCellImage(ACanvas: TCanvas; const ARect: TRect; ACol, ARow: Integer; ItemInfo: TSpTBXMenuItemInfo); override; + function GetCellColor(ACol, ARow: Integer): TColor; + procedure GetCellInfo(ACol, ARow: Integer; out AColor: TColor; out AName: WideString); + procedure SetColCount(Value: TSpTBXRowColCount); override; + procedure SetRowCount(Value: TSpTBXRowColCount); override; + public + constructor Create(AOwner: TComponent); override; + function FindCell(AColor: TColor): TPoint; + published + property CustomColors: Boolean read FCustomColors write SetCustomColors default False; // Must be published before ColCount + property ColCount default CPDefaultCols; + property Color: TColor read FColor write SetColor default clNone; + property HelpContext; + property InheritOptions; + property MaskOptions; + property Options default [tboShowHint]; + property RowCount default CPDefaultRows; + property Visible; + property OnChange; + property OnCellClick; + property OnGetCellHint; + property OnGetColor: TSpTBXCPGetColorInfo read FOnGetColor write FOnGetColor; + end; + + { TSpTBXItemCacheList } + + TSpTBXItemCache = class(TCollectionItem) + private + FDock: TTBDock; + FName: TComponentName; + FItem: TTBCustomItem; + FWidth, FHeight: Integer; + FParentWidth, FParentHeight: Integer; + function GetName: TComponentName; + public + procedure Assign(Source: TPersistent); override; + property Item: TTBCustomItem read FItem write FItem; + published + property Dock: TTBDock read FDock write FDock; + property Name: TComponentName read GetName write FName; + property Width: Integer read FWidth write FWidth default 0; + property Height: Integer read FHeight write FHeight default 0; + property ParentWidth: Integer read FParentWidth write FParentWidth default 0; + property ParentHeight: Integer read FParentHeight write FParentHeight default 0; + end; + + TSpTBXItemCacheCollection = class(TCollection) + private + function GetItem(Index: Integer): TSpTBXItemCache; + procedure SetItem(Index: Integer; const Value: TSpTBXItemCache); + public + function Add(AItem: TTBCustomItem): Integer; virtual; + function IndexOf(AItem: TTBCustomItem): Integer; + property Items[Index: Integer]: TSpTBXItemCache read GetItem write SetItem; default; + end; + + { TSpTBXDock } + + TSpTBXDock = class(TTBDock) + private + FMoving: Boolean; + FResizing: Boolean; + FPrevWidth: Integer; + FPrevHeight: Integer; + FOnDrawBackground: TSpTBXDrawEvent; + procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; + procedure WMMove(var Message: TWMMove); message WM_MOVE; + procedure WMSize(var Message: TWMSize); message WM_SIZE; + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + protected + function CanResize(var NewWidth: Integer; var NewHeight: Integer): Boolean; override; + procedure DrawBackground(DC: HDC; const DrawRect: TRect); override; + procedure DoDrawBackground(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure InternalDrawBackground(ACanvas: TCanvas; ARect: TRect); + procedure Resize; override; + function UsingBackground: Boolean; override; + function UsingBitmap: Boolean; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + property PrevWidth: Integer read FPrevWidth; + property PrevHeight: Integer read FPrevHeight; + published + property Color default clNone; + property OnCanResize; + property OnDrawBackground: TSpTBXDrawEvent read FOnDrawBackground write FOnDrawBackground; + end; + + TSpTBXDockClass = class of TSpTBXDock; + + { TSpTBXToolbar } + + TSpTBXToolbarView = class(TTBToolbarView) + private + FMaxSize: Integer; + procedure SetMaxSize(const Value: Integer); + protected + FTallestItemSize: Integer; + procedure DoUpdatePositions(var ASize: TPoint); override; + public + constructor Create(AOwner: TComponent; AParentView: TTBView; + AParentItem: TTBCustomItem; AWindow: TWinControl; + AIsToolbar, ACustomizing, AUsePriorityList: Boolean); override; + property MaxSize: Integer read FMaxSize write SetMaxSize; + end; + + TSpTBXToolbar = class(TTBCustomToolbar) + private + FChevronVertical: Boolean; + FCompoundToolbar: Boolean; + FCustomizable: Boolean; + FCustomizingCount: Integer; + FItemMovingCount: Integer; + FDisplayMode: TSpTBXToolbarDisplayMode; + FLastDropMark: TRect; + FLastSelectableWidth: Integer; + FOnDrawBackground: TSpTBXDrawEvent; + FOnItemNotification: TSpTBXItemNotificationEvent; + {$IFNDEF UNICODE} + function IsCaptionStored: Boolean; + function GetCaption: TWideCaption; + procedure SetCaption(const Value: TWideCaption); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + {$ENDIF} + procedure SetDisplayMode(const Value: TSpTBXToolbarDisplayMode); + function GetMaxSize: Integer; + procedure SetMaxSize(const Value: Integer); + function CreateWrapper(Index: Integer; Ctl: TControl): TTBControlItem; + function IsAnchoredControlItem(Item: TTBCustomItem): TTBControlItem; + procedure CMControlChange(var Message: TCMControlChange); message CM_CONTROLCHANGE; + procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; + procedure CMMouseleave(var Message: TMessage); message CM_MOUSELEAVE; + procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW; + procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED; + procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; + procedure WMSize(var Message: TWMSize); message WM_SIZE; + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + protected + FBeginDragIV: TTBItemViewer; + FAnchoredControlItems: TSpTBXItemCacheCollection; + FState: TSpTBXToolbarStates; + + // Component + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + procedure Resize; override; + procedure AnchorItems(UpdateControlItems: Boolean = True); virtual; + procedure RightAlignItems; virtual; + + // Painting + procedure DrawNCArea(const DrawToDC: Boolean; const ADC: HDC; const Clip: HRGN); override; + function GetItemsTextColor(State: TSpTBXSkinStatesType): TColor; virtual; + procedure InternalDrawBackground(ACanvas: TCanvas; ARect: TRect; PaintOnNCArea: Boolean; PaintBorders: Boolean = True); virtual; + procedure DoDrawBackground(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + + // Get class + function GetChevronItemClass: TTBChevronItemClass; override; + function GetFloatingWindowParentClass: TTBFloatingWindowParentClass; override; + function GetRightAlignMargin: Integer; virtual; + function GetViewClass: TTBToolbarViewClass; override; + + // Hints + procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; + + // Customizer + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); override; + function CanDragCustomize(Button: TMouseButton; Shift: TShiftState; X, Y: Integer): Boolean; virtual; + procedure DoStartDrag(var DragObject: TDragObject); override; + procedure DragOver(Source: TObject; X: Integer; Y: Integer; State: TDragState; var Accept: Boolean); override; + + // Misc + function CanItemClick(Item: TTBCustomItem; Button: TMouseButton; Shift: TShiftState; X, Y: Integer): Boolean; virtual; + procedure DoItemClick(Item: TTBCustomItem; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); virtual; + procedure DoItemNotification(Ancestor: TTBCustomItem; Relayed: Boolean; Action: TTBItemChangedAction; Index: Integer; Item: TTBCustomItem); virtual; + + property CompoundToolbar: Boolean read FCompoundToolbar write FCompoundToolbar; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure DragDrop(Source: TObject; X: Integer; Y: Integer); override; + procedure ReadPositionData(const Data: TTBReadPositionData); override; + procedure WritePositionData(const Data: TTBWritePositionData); override; + procedure BeginCustomize; + procedure EndCustomize; + procedure BeginItemMove; + procedure EndItemMove; + function GetFloatingBorderSize: TPoint; override; + function IsCustomizing: Boolean; + function IsItemMoving: Boolean; + function IsVertical: Boolean; + property MaxSize: Integer read GetMaxSize write SetMaxSize default -1; + published + property ActivateParent; + property Align; + property AutoResize; + property BorderStyle; + property ChevronHint; + property ChevronMoveItems; + property ChevronPriorityForNewItems; + property CloseButton; + property CloseButtonWhenDocked; + property CurrentDock; + property DefaultDock; + property DockableTo; + property DockMode; + property DockPos; + property DockRow; + property DragHandleStyle; + property FloatingMode; + property Font; + property FullSize; + property HideWhenInactive; + property Images; + property Items; + property LastDock; + property LinkSubitems; + property MenuBar; + property Options; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ProcessShortCuts; + property Resizable; + property ShowCaption; + property ShowHint; + property ShrinkMode; + property SmoothDrag; + property Stretch; + property SystemFont; + property TabOrder; + property TabStop; + property UpdateActions; + property UseLastDock; + property Visible; + property Color default clNone; + property OnClose; + property OnCloseQuery; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnMove; + property OnRecreated; + property OnRecreating; + property OnDockChanged; + property OnDockChanging; + property OnDockChangingHidden; + property OnResize; + property OnShortCut; + property OnVisibleChanged; + {$IFNDEF UNICODE} + // Don't let the streaming system store the WideStrings, use DefineProperties instead + property Caption: TWideCaption read GetCaption write SetCaption stored IsCaptionStored; // Hides the inherited Caption + property Hint: WideString read GetHint write SetHint stored False; // Hint is set dynamically in MouseMove, don't save it + {$ELSE} + property Caption; + property Hint; + {$ENDIF} + property ChevronVertical: Boolean read FChevronVertical write FChevronVertical default True; + property Customizable: Boolean read FCustomizable write FCustomizable default True; + property DisplayMode: TSpTBXToolbarDisplayMode read FDisplayMode write SetDisplayMode default tbdmSelectiveCaption; + property OnDrawBackground: TSpTBXDrawEvent read FOnDrawBackground write FOnDrawBackground; + property OnItemNotification: TSpTBXItemNotificationEvent read FOnItemNotification write FOnItemNotification; + end; + + TSpTBXToolbarClass = class of TSpTBXToolbar; + + { TSpTBXToolWindow } + + TSpTBXCustomToolWindow = class(TTBCustomDockableWindow) + private + FMinClientWidth, FMinClientHeight, FMaxClientWidth, FMaxClientHeight: Integer; + FOnDrawBackground: TSpTBXDrawEvent; + {$IFNDEF UNICODE} + function IsCaptionStored: Boolean; + function GetCaption: TWideCaption; + procedure SetCaption(const Value: TWideCaption); + {$ENDIF} + function GetClientAreaWidth: Integer; + procedure SetClientAreaWidth(Value: Integer); + function GetClientAreaHeight: Integer; + procedure SetClientAreaHeight(Value: Integer); + procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED; + procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + procedure WMWindowPosChanged(var Message: TWMWindowPosChanged); message WM_WINDOWPOSCHANGED; + protected + FBarSize: TSize; + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetFloatingWindowParentClass: TTBFloatingWindowParentClass; override; + + // Sizing + function CalcSize(ADock: TTBDock): TPoint; virtual; + function DoArrange(CanMoveControls: Boolean; PreviousDockType: TTBDockType; NewFloating: Boolean; NewDock: TTBDock): TPoint; override; + procedure GetBaseSize(var ASize: TPoint); override; + procedure GetMinMaxSize(var AMinClientWidth, AMinClientHeight, AMaxClientWidth, AMaxClientHeight: Integer); override; + procedure SetClientAreaSize(AWidth, AHeight: Integer); virtual; + procedure SizeChanging(const AWidth, AHeight: Integer); override; + + // Painting + procedure Paint; override; + procedure DrawNCArea(const DrawToDC: Boolean; const ADC: HDC; const Clip: HRGN); override; + procedure InternalDrawBackground(ACanvas: TCanvas; ARect: TRect; PaintOnNCArea: Boolean; PaintBorders: Boolean = True); virtual; + procedure DoDrawBackground(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + + property ClientAreaHeight: Integer read GetClientAreaHeight write SetClientAreaHeight; + property ClientAreaWidth: Integer read GetClientAreaWidth write SetClientAreaWidth; + property MaxClientHeight: Integer read FMaxClientHeight write FMaxClientHeight default 0; + property MaxClientWidth: Integer read FMaxClientWidth write FMaxClientWidth default 0; + property MinClientHeight: Integer read FMinClientHeight write FMinClientHeight default 32; + property MinClientWidth: Integer read FMinClientWidth write FMinClientWidth default 32; + property OnDrawBackground: TSpTBXDrawEvent read FOnDrawBackground write FOnDrawBackground; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function GetFloatingBorderSize: TPoint; override; + procedure InvalidateBackground(InvalidateChildren: Boolean = True); virtual; + function IsVertical: Boolean; + procedure ReadPositionData(const Data: TTBReadPositionData); override; + procedure WritePositionData(const Data: TTBWritePositionData); override; + published + {$IFNDEF UNICODE} + // Don't let the streaming system store the WideStrings, use DefineProperties instead + property Caption: TWideCaption read GetCaption write SetCaption stored IsCaptionStored; // Hides the inherited Caption + {$ELSE} + property Caption; + {$ENDIF} + property Color default clNone; + end; + + TSpTBXToolWindow = class(TSpTBXCustomToolWindow) + published + property ActivateParent; + property Align; + property Anchors; + property BorderStyle; + property Caption; + property Color; + property CloseButton; + property CloseButtonWhenDocked; + property CurrentDock; + property DefaultDock; + property DockableTo; + property DockMode; + property DockPos; + property DockRow; + property DragHandleStyle; + property FloatingMode; + property Font; + property FullSize; + property HideWhenInactive; + property LastDock; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property Resizable; + property ShowCaption; + property ShowHint; + property Stretch; + property SmoothDrag; + property TabOrder; + property UseLastDock; + property Visible; + property OnClose; + property OnCloseQuery; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnDockChanged; + property OnDockChanging; + property OnDockChangingHidden; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnMove; + property OnRecreated; + property OnRecreating; + property OnResize; + property OnVisibleChanged; + // TSpTBXCustomToolWindow properties + property ClientAreaHeight; + property ClientAreaWidth; + property MaxClientHeight; + property MaxClientWidth; + property MinClientHeight; + property MinClientWidth; + property OnDrawBackground; + end; + + { TSpTBXFloatingWindowParent } + + TSpTBXFloatingWindowParent = class(TTBFloatingWindowParent) + private + FCloseButtonHover: Boolean; + FCloseOnAltF4: Boolean; + procedure UpdateDwmNCSize; + procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; + procedure WMActivateApp(var Message: TWMActivateApp); message WM_ACTIVATEAPP; + procedure WMClose(var Message: TWMClose); message WM_CLOSE; + procedure WMEraseBkgnd(var Message: TMessage); message WM_ERASEBKGND; + procedure WMNCMouseLeave(var Message: TMessage); message WM_NCMOUSELEAVE; + procedure WMNCMouseMove(var Message: TWMNCMouseMove); message WM_NCMOUSEMOVE; + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + protected + procedure CancelNCHover; + procedure CreateWnd; override; + procedure DrawNCArea(const DrawToDC: Boolean; const ADC: HDC; const Clip: HRGN; RedrawWhat: TTBToolWindowNCRedrawWhat); override; + procedure RedrawCloseButton; + procedure VisibleChanging; override; + property CloseButtonHover: Boolean read FCloseButtonHover; + public + constructor CreateNew(AOwner: TComponent; Dummy: Integer = 0); override; + destructor Destroy; override; + property CloseOnAltF4: Boolean read FCloseOnAltF4 write FCloseOnAltF4; + end; + + { TSpTBXPopupWindow } + + TSpTBXPopupWindow = class(TTBPopupWindow) + private + FPaintingClientArea: Boolean; + FMaximumImageSize: TSize; + function CanDrawGutter: Boolean; + procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW; + procedure CMShowingchanged(var Message: TMessage); message CM_SHOWINGCHANGED; + procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; + procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT; + procedure WMPrint(var Message: TMessage); message WM_PRINT; + protected + function GetViewClass: TTBViewClass; override; + procedure DoPopupShowingChanged(IsVisible: Boolean); virtual; + procedure PaintBackground(ACanvas: TCanvas; ARect: TRect); virtual; + public + constructor CreatePopupWindow(AOwner: TComponent; const AParentView: TTBView; + const AItem: TTBCustomItem; const ACustomizing: Boolean); override; + destructor Destroy; override; + property MaximumImageSize: TSize read FMaximumImageSize; + end; + + TSpTBXPopupWindowView = class(TTBPopupView) + protected + procedure AutoSize(AWidth, AHeight: Integer); override; + public + procedure SetIsToolbar(const Value: Boolean); + published + property IsToolbar; + end; + + { TSpTBXChevronItem } + + TSpTBXChevronItem = class(TTBChevronItem) + protected + function GetPopupWindowClass: TTBPopupWindowClass; override; + public + function GetItemViewerClass(AView: TTBView): TTBItemViewerClass; override; + end; + + TSpTBXChevronItemViewer = class(TTBItemViewer) + protected + procedure Paint(const Canvas: TCanvas; const ClientAreaRect: TRect; + IsSelected, IsPushed, UseDisabledShadow: Boolean); override; + public + function GetTextColor(State: TSpTBXSkinStatesType): TColor; virtual; + end; + + TSpTBXChevronPopupWindow = class(TSpTBXPopupWindow) + private + procedure CMColorChanged(var Message: TMessage); message CM_COLORCHANGED; + end; + + { TSpTBXPopupMenu } + + ISpTBXPopupMenu = interface + ['{C576A225-6E42-49F6-96E5-712510C5D85C}'] + function InternalPopup(X, Y: Integer; ForceFocus: Boolean; PopupControl: TControl = nil): Boolean; + end; + + TSpTBXPopupMenu = class(TTBPopupMenu, ISpTBXPopupMenu) + private + FClickedItem: TTBCustomItem; + FReturnClickedItemOnly: Boolean; + FToolBoxPopup: Boolean; + function GetOnInitPopup: TSpTBXPopupEvent; + procedure SetOnInitPopup(const Value: TSpTBXPopupEvent); + function GetOnClosePopup: TNotifyEvent; + procedure SetOnClosePopup(const Value: TNotifyEvent); + protected + function InternalPopup(X, Y: Integer; ForceFocus: Boolean; PopupControl: TControl = nil): Boolean; virtual; + function GetRootItemClass: TTBRootItemClass; override; + public + procedure Popup(X: Integer; Y: Integer); override; + function PopupEx(X, Y: Integer; PopupControl: TControl = nil; ReturnClickedItemOnly: Boolean = False): TTBCustomItem; virtual; + published + property ToolBoxPopup: Boolean read FToolBoxPopup write FToolBoxPopup default False; + property OnInitPopup: TSpTBXPopupEvent read GetOnInitPopup write SetOnInitPopup; + property OnClosePopup: TNotifyEvent read GetOnClosePopup write SetOnClosePopup; + end; + + { TSpTBXCompoundItemsControl } + + TSpTBXCompoundItemsControl = class(TSpTBXCustomControl, ITBItems) + private + FSkinType: TSpTBXSkinType; + procedure DockRequestDock(Sender: TObject; Bar: TTBCustomDockableWindow; var Accept: Boolean); + function GetRootItems: TTBRootItem; + function GetView: TSpTBXToolbarView; + function GetImages: TCustomImageList; + procedure SetImages(const Value: TCustomImageList); + procedure SetSkinType(const Value: TSpTBXSkinType); + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + protected + FDock: TSpTBXDock; + FToolbar: TSpTBXToolbar; + procedure CreateParams(var Params: TCreateParams); override; + function GetDockClass: TSpTBXDockClass; virtual; + function GetToolbarClass: TSpTBXToolbarClass; virtual; + function GetItems: TTBCustomItem; virtual; // For ITBItems interface + procedure Loaded; override; + procedure SetName(const Value: TComponentName); override; + property Images: TCustomImageList read GetImages write SetImages; + property SkinType: TSpTBXSkinType read FSkinType write SetSkinType default sknSkin; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override; // For ITBItems interface + procedure InvalidateBackground(InvalidateChildren: Boolean = True); virtual; + property View: TSpTBXToolbarView read GetView; + published + property Items: TTBRootItem read GetRootItems; + end; + + { TSpTBXCompoundBar } + + TSpTBXCompoundBar = class(TSpTBXCompoundItemsControl) + private + FOnDrawDockBackground: TSpTBXDrawEvent; + procedure DrawDockBackground(Sender: TObject; ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); + procedure DrawToolbarBackground(Sender: TObject; ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); + procedure DockResize(Sender: TObject); + protected + procedure DoDrawDockBackground(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + property OnDrawDockBackground: TSpTBXDrawEvent read FOnDrawDockBackground write FOnDrawDockBackground; + public + constructor Create(AOwner: TComponent); override; + end; + + { TSpTBXButtonOptions } + + TSpTBXButtonOptions = class(TPersistent) + private + FEditableItems: TTBGroupItem; + FCloseButton: TSpTBXItem; + FMinimizeButton: TSpTBXItem; + FMaximizeButton: TSpTBXItem; + FRightAlignSpacer: TSpTBXRightAlignSpacerItem; + FCaptionImageIndex: Integer; + FCloseImageIndex: Integer; + FMinimizeImageIndex: Integer; + FMaximizeImageIndex: Integer; + FRestoreImageIndex: Integer; + FCaptionLabel: WideString; + FCaption: Boolean; + FClose: Boolean; + FMinimize: Boolean; + FMaximize: Boolean; + FButtonBorders: Boolean; + FTitleBarMaxSize: Integer; + procedure SetCaptionImageIndex(Value: Integer); + procedure SetCloseImageIndex(Value: Integer); + procedure SetCaptionLabel(const Value: WideString); + procedure SetMaximizeImageIndex(Value: Integer); + procedure SetRestoreImageIndex(Value: Integer); + procedure SetMinimizeImageIndex(Value: Integer); + procedure SetCaption(const Value: Boolean); + procedure SetClose(const Value: Boolean); + procedure SetMaximize(const Value: Boolean); + procedure SetMinimize(const Value: Boolean); + procedure SetTitleBarMaxSize(const Value: Integer); + protected + FParentControl: TWinControl; + FToolbar: TSpTBXToolbar; + procedure ButtonsDrawImage(Sender: TObject; ACanvas: TCanvas; + State: TSpTBXSkinStatesType; const PaintStage: TSpTBXPaintStage; + var AImageList: TCustomImageList; var AImageIndex: Integer; var ARect: + TRect; var PaintDefault: Boolean); virtual; + procedure ButtonsDrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; + ItemInfo: TSpTBXMenuItemInfo; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); virtual; + procedure ButtonsClick(Sender: TObject); virtual; abstract; + procedure CreateButtons; virtual; + procedure UpdateButtonsVisibility; virtual; + procedure SetupButton(B: TSpTBXCustomItem); virtual; + function Restoring(B: TSpTBXCustomItem): Boolean; virtual; abstract; + public + constructor Create(AParent: TWinControl); virtual; + procedure SetupButtonIcon(B: TSpTBXCustomItem); virtual; + procedure MoveItemToTheLeft(B: TTBCustomItem); + property EditableItems: TTBGroupItem read FEditableItems; + property RightAlignSpacer: TSpTBXRightAlignSpacerItem read FRightAlignSpacer; + property MinimizeButton: TSpTBXItem read FMinimizeButton; + property MaximizeButton: TSpTBXItem read FMaximizeButton; + property CloseButton: TSpTBXItem read FCloseButton; + property CaptionLabel: WideString read FCaptionLabel write SetCaptionLabel; + published + property ButtonBorders: Boolean read FButtonBorders write FButtonBorders default True; + property Caption: Boolean read FCaption write SetCaption default True; + property Close: Boolean read FClose write SetClose default True; + property Minimize: Boolean read FMinimize write SetMinimize default True; + property Maximize: Boolean read FMaximize write SetMaximize default True; + property CaptionImageIndex: Integer read FCaptionImageIndex write SetCaptionImageIndex default -1; + property CloseImageIndex: Integer read FCloseImageIndex write SetCloseImageIndex default -1; + property MinimizeImageIndex: Integer read FMinimizeImageIndex write SetMinimizeImageIndex default -1; + property MaximizeImageIndex: Integer read FMaximizeImageIndex write SetMaximizeImageIndex default -1; + property RestoreImageIndex: Integer read FRestoreImageIndex write SetRestoreImageIndex default -1; + property TitleBarMaxSize: Integer read FTitleBarMaxSize write SetTitleBarMaxSize default 21; + end; + + { TSpTBXStatusBar } + + TSpTBXStatusToolbar = class(TSpTBXToolbar) + private + FSizeGrip: Boolean; + FSkinType: TSpTBXSkinType; + procedure SetSizeGrip(const Value: Boolean); + procedure WMSetCursor(var Message: TWMSetCursor); message WM_SETCURSOR; + protected + FParentForm: TCustomForm; + function IsPointInGrip(P: TPoint): Boolean; + function GetItemsTextColor(State: TSpTBXSkinStatesType): TColor; override; + function GetRightAlignMargin: Integer; override; + function GetParentFormWindowState: TWindowState; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); override; + procedure WMNCLButtonDown(var Message: TWMNCLButtonDown); message WM_NCLBUTTONDOWN; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function GetGripRect: TRect; + function NeedsSeparatorRepaint: Boolean; + published + property SizeGrip: Boolean read FSizeGrip write SetSizeGrip default True; + end; + + TSpTBXCustomStatusBar = class(TSpTBXCompoundBar) + private + function GetSizeGrip: Boolean; + procedure SetSizeGrip(const Value: Boolean); + function GetStatusToolbar: TSpTBXStatusToolbar; + procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; + protected + FPrevState: TWindowState; + function CanResize(var NewWidth: Integer; var NewHeight: Integer): Boolean; override; + procedure DoDrawDockBackground(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); override; + procedure DrawSeparators(ACanvas: TCanvas; ARect, AGripRect: TRect); virtual; + function GetToolbarClass: TSpTBXToolbarClass; override; + property Align default alBottom; + property SizeGrip: Boolean read GetSizeGrip write SetSizeGrip default True; + public + constructor Create(AOwner: TComponent); override; + property Toolbar: TSpTBXStatusToolbar read GetStatusToolbar; + end; + + TSpTBXStatusBar = class(TSpTBXCustomStatusBar) + published + property Align; + property Anchors; + property BiDiMode; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property ParentColor; + property ParentBiDiMode; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property Visible; + property OnCanResize; + property OnContextPopup; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnResize; + property OnStartDock; + property OnStartDrag; + // TSpTBXCustomStatusBar properties + property Images; + property SizeGrip; + property SkinType; + property OnDrawDockBackground; + end; + + { TSpTBXTitleBar } + + TSpTBXCustomTitleBar = class; + + TSpTBXTitleToolbar = class(TSpTBXToolbar) + protected + function GetItemsTextColor(State: TSpTBXSkinStatesType): TColor; override; + function GetTitleBar: TSpTBXCustomTitleBar; + function GetRightAlignMargin: Integer; override; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); override; + end; + + TSpTBXTitleBarButtonOptions = class(TSpTBXButtonOptions) + private + FSystemMenu: Boolean; + FSystemButton: TSpTBXSystemMenuItem; + procedure SetSystemMenu(const Value: Boolean); + protected + FTitleBar: TSpTBXCustomTitleBar; + procedure ButtonsDrawItem(Sender: TObject; ACanvas: TCanvas; + ARect: TRect; ItemInfo: TSpTBXMenuItemInfo; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); override; + procedure ButtonsClick(Sender: TObject); override; + procedure CreateButtons; override; + function Restoring(B: TSpTBXCustomItem): Boolean; override; + public + constructor Create(AParent: TWinControl); override; + property SystemButton: TSpTBXSystemMenuItem read FSystemButton; + published + property SystemMenu: Boolean read FSystemMenu write SetSystemMenu default True; + end; + + TSpTBXCustomTitleBar = class(TSpTBXCompoundBar) + private + FActive: Boolean; + FFixedSize: Boolean; + FFullScreenMaximize: Boolean; + FMouseActive: Boolean; + FOptions: TSpTBXTitleBarButtonOptions; + FOldAppWndProc: Pointer; + FNewAppWndProc: Pointer; + FOnDrawBackground: TSpTBXDrawEvent; + FOnSystemMenuPopup: TSpTBXPopupEvent; + FOldParentFormWndProc: TWndMethod; + procedure AppWndProc(var Msg: TMessage); + procedure NewParentFormWndProc(var Message: TMessage); + procedure SetActive(const Value: Boolean); + procedure SetMouseActive(const Value: Boolean); + procedure SetFullScreenMaximize(const Value: Boolean); + function GetWindowState: TWindowState; + procedure SetWindowState(const Value: TWindowState); + procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED; + procedure WMEraseBkgnd(var Message: TMessage); message WM_ERASEBKGND; + procedure WMSetCursor(var Message: TWMSetCursor); message WM_SETCURSOR; + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + procedure WMWindowPosChanged(var Message: TWMWindowPosChanged); message WM_WINDOWPOSCHANGED; + protected + FParentForm: TCustomForm; + // Component + procedure Loaded; override; + function GetFloatingBorderSize: TPoint; + function GetItems: TTBCustomItem; override; // For ITBItems interface + function GetToolbarClass: TSpTBXToolbarClass; override; + procedure ChangeTitleBarState(Activate: Boolean); + procedure UpdateSkinMetrics; + + // Painting + procedure DoDrawDockBackground(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); override; + procedure DoDrawBackground(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + + // Sizing + procedure AdjustClientRect(var Rect: TRect); override; + procedure GetSizeCursor(MousePos: TPoint; var SizeCursor, SizeCode: Integer); + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); override; + + property Active: Boolean read FActive write SetActive default True; + property Align default alClient; + property FixedSize: Boolean read FFixedSize write FFixedSize default False; + property FullScreenMaximize: Boolean read FFullScreenMaximize write SetFullScreenMaximize default False; + property Options: TSpTBXTitleBarButtonOptions read FOptions write FOptions; + property WindowState: TWindowState read GetWindowState write SetWindowState; + property OnDrawBackground: TSpTBXDrawEvent read FOnDrawBackground write FOnDrawBackground; + property OnSystemMenuPopup: TSpTBXPopupEvent read FOnSystemMenuPopup write FOnSystemMenuPopup; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function GetClientAreaRect: TRect; + function IsActive: Boolean; + property MouseActive: Boolean read FMouseActive write SetMouseActive default True; + property Toolbar: TSpTBXToolbar read FToolbar; + published + property Caption; + end; + + TSpTBXTitleBar = class(TSpTBXCustomTitleBar) + published + property Align; + property Anchors; + property Color; + property BiDiMode; + property Constraints; + property DockSite; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property ParentColor; + property ParentBiDiMode; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property Visible; + property OnCanResize; + property OnContextPopup; + property OnDockDrop; + property OnDockOver; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnGetSiteInfo; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnResize; + property OnStartDock; + property OnStartDrag; + property OnUnDock; + // TSpTBXCustomTitleBar properties + property Active; + property FixedSize; + property FullScreenMaximize; + property Images; + property Options; + property OnDrawBackground; + property OnDrawDockBackground; + property OnSystemMenuPopup; + end; + + { TBitmapHint } + + TBitmapHint = class(THintWindow) + private + FHintBitmap: TBitmap; + FActivating: Boolean; + procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED; + protected + procedure Paint; override; + public + property Activating: Boolean read FActivating; + procedure ActivateHint(Rect: TRect; const AHint: string); override; + procedure ActivateHintData(Rect: TRect; const AHint: string; AData: Pointer); override; + end; + +{ Item helpers } +procedure SpFillItemInfo(ACanvas: TCanvas; IV: TTBItemViewer; out ItemInfo: TSpTBXMenuItemInfo); +function SpGetBoundsRect(IV: TTBItemViewer; Root: TTBRootItem): TRect; +procedure SpGetAllItems(AParentItem: TTBCustomItem; ItemsList: TTntStringList; ClearFirst: Boolean = True); +function SpGetMenuMaximumImageSize(View: TTBView): TSize; +function SpGetItemViewerFromPoint(Root: TTBRootItem; View: TTBView; P: TPoint; ProcessGroupItems: Boolean = True): TTBItemViewer; +function SpGetNextItemSameEdge(View: TTBView; IV: TTBItemViewer; GoForward: Boolean; SearchType: TSpTBXSearchItemViewerType): TTBItemViewer; +function SpGetFirstRightAlignSpacer(View: TTBView): TSpTBXItemViewer; +function SpGetRightAlignedItems(View: TTBView; RightAlignedList: TList; IsRotated: Boolean; out VisibleTotalWidth, RightAlignedTotalWidth: Integer): TSpTBXItemViewer; +procedure SpInvalidateItem(View: TTBView; Item: TTBCustomItem); +function SpFindItemViewer(View: TTBView; Item: TTBCustomItem): TTBItemViewer; +function SpFindControlItem(Item: TTBCustomItem; Ctl: TControl; Recurse: Boolean = True): TTBControlItem; +procedure SpGetDropPosItemViewer(Root: TTBRootItem; View: TTBView; P: TPoint; out DestIV: TTBItemViewer; out DestItemPos: Integer; out DropMark: TRect); overload; +procedure SpGetDropPosItemViewer(Root: TTBRootItem; View: TTBView; P: TPoint; SourceItemPos: Integer; out DestIV: TTBItemViewer; out DestItemPos: Integer); overload; +function SpGetDragHandleSize(Toolbar: TTBCustomDockableWindow): Integer; +function SpIsVerticalToolbar(Toolbar: TTBCustomDockableWindow): Boolean; +function SpIsDockUsingBitmap(Dock: TTBDock): Boolean; + +{ Painting helpers } +procedure SpDrawXPMenuItem(ACanvas: TCanvas; ARect: TRect; ItemInfo: TSpTBXMenuItemInfo); +procedure SpDrawXPMenuSeparator(ACanvas: TCanvas; ARect: TRect; MenuItemStyle, Vertical: Boolean); +procedure SpDrawXPMenuItemImage(ACanvas: TCanvas; ARect: TRect; const ItemInfo: TSpTBXMenuItemInfo; ImageList: TCustomImageList; ImageIndex: Integer); +procedure SpDrawXPMenuGutter(ACanvas: TCanvas; ARect: TRect; SkinType: TSpTBXSkinType); +procedure SpDrawXPMenuPopupWindow(ACanvas: TCanvas; ARect, OpenIVRect: TRect; DrawGutter: Boolean; ImageSize: Integer; SkinType: TSpTBXSkinType); +procedure SpDrawXPStatusBar(ACanvas: TCanvas; ARect, AGripRect: TRect; SkinType: TSpTBXSkinType; UsingOfficeTheme: Boolean); +procedure SpDrawXPTitleBar(ACanvas: TCanvas; ARect: TRect; IsActive: Boolean; DrawBorders: Boolean = True); +procedure SpDrawXPTitleBarBody(ACanvas: TCanvas; ARect: TRect; IsActive: Boolean; BorderSize: TPoint; DrawBody: Boolean = True); +procedure SpDrawXPDock(ACanvas: TCanvas; ARect: TRect; SkinType: TSpTBXSkinType; Vertical: Boolean = False); +procedure SpDrawXPToolbar(ACanvas: TCanvas; ARect: TRect; SkinType: TSpTBXSkinType; Docked, Floating, Vertical, PaintSkinBackground, PaintBorders: Boolean; SkinComponent: TSpTBXSkinComponentsType = skncToolbar); overload; +procedure SpDrawXPToolbar(W: TTBCustomDockableWindow; ACanvas: TCanvas; ARect: TRect; PaintOnNCArea: Boolean; PaintBorders: Boolean = True; SkinComponent: TSpTBXSkinComponentsType = skncToolbar); overload; +procedure SpDrawXPToolbarGrip(W: TTBCustomDockableWindow; ACanvas: TCanvas; ARect: TRect); +procedure SpDrawXPTooltipBackground(ACanvas: TCanvas; ARect: TRect); + +{ Menu helpers } +function SpCalcPopupPosition(const X, Y, Width, Height: Integer; PopupControl: TControl = nil; IsVertical: Boolean = False): TPoint; +function SpHMenuGetCaption(Menu: HMenu; Index: Integer): WideString; +function SpHMenuToTBMenuItem(Menu: HMenu; ParentItem: TTBCustomItem): Boolean; +function SpShowSystemPopupMenu(ParentForm: TCustomForm; ScreenPos: TPoint; DoDefault: Boolean = True): Integer; +function SpFillSystemSpTBXPopup(ParentForm: TCustomForm; ParentItem: TTBCustomItem; ShowSize, ShowMinimize, ShowMaximize, ShowClose: Boolean; ClickEvent: TNotifyEvent = nil): Boolean; +function SpShowSystemSpTBXPopupMenu(ParentForm: TCustomForm; ScreenPos: TPoint; ShowSize, ShowMinimize, ShowMaximize, ShowClose: Boolean; PopupEvent: TSpTBXPopupEvent; DoDefault: Boolean = True): Integer; + +{ Misc helpers } +procedure SpActivateDwmNC(WinControl: TWinControl; Activate: Boolean); +function SpIsDwmCompositionEnabled: Boolean; +function SpCanFocus(WinControl: TWinControl): Boolean; +function SpIsFocused(WinControl: TWinControl; out FocusedChild: TWinControl): Boolean; +function SpFocusFirstChild(WinControl: TWinControl): TWinControl; +function SpFindControl(Parent: TWinControl; Child: TControl): Integer; +function SpFindParent(Control: TControl; ParentClass: TClass): TWinControl; +function SpHasBorders(WinControl: TWinControl): Boolean; +function SpGetFormWindowState(F: TCustomForm; out RestoreBoundsRect: TRect): TWindowState; +procedure SpSetFormWindowState(F: TCustomForm; WindowState: TWindowState; RestoreBoundsRect: TRect); +function SpGetTaskBar(out State, Edge: Cardinal; out Bounds: TRect): Boolean; +procedure SpRecalcNCArea(WinControl: TWinControl); + +{ Customizer helpers } +procedure SpCustomizeAllToolbars(AParentComponent: TComponent; Reset: Boolean); +procedure SpBeginUpdateAllToolbars(AParentComponent: TComponent); +procedure SpEndUpdateAllToolbars(AParentComponent: TComponent); + +{ Unicode helpers } +procedure SpPersistent_AfterInherited_DefineProperties(Filer: TFiler; Instance: TPersistent); + +var + SmCaptionFont: TFont; + SpStockHintBitmap: TBitmap; + MDIButtonsImgList: TImageList = nil; + SpTBXHintWindowClass: THintWindowClass = TBitmapHint; + +const + DefaultToolbarBorderSize = 2; // Default size of Floating Toolbar borders + crSpTBXNewHandPoint = 100; // Cursor ID to replace crHandPoint for IDC_HAND + crSpTBXCustomization = 101; // Cursor ID used for item D&D customization accepted + crSpTBXCustomizationCancel = 102; // Cursor ID used for item D&D customization cancelled + +implementation + +{$R SpTBXGlyphs.res} + +uses + Themes, UxTheme, + TypInfo, Types, ComCtrls, CommCtrl, ShellApi, + {$IFDEF JR_D11} DwmApi, {$ENDIF} + {$IFNDEF UNICODE} TntWindows, TntSysUtils, TntActnList, TntForms, {$ENDIF} + TB2Anim, TB2Common; + +const + ROP_DSPDxax = $00E20746; + // Constants for TSpTBXToolWindow registry values. Do not localize! + rvClientWidth = 'ClientWidth'; + rvClientHeight = 'ClientHeight'; + // ColorPalette constants: + CPDefaultColors: array[0..CPDefaultCols * CPDefaultRows - 1] of TIdentMapEntry = ( + (Value: $000000; Name: 'Black'), + (Value: $003399; Name: 'Brown'), + (Value: $003333; Name: 'Olive Green'), + (Value: $003300; Name: 'Dark Green'), + (Value: $663300; Name: 'Dark Teal'), + (Value: $800000; Name: 'Dark blue'), + (Value: $993333; Name: 'Indigo'), + (Value: $333333; Name: 'Gray-80%'), + + (Value: $000080; Name: 'Dark Red'), + (Value: $0066FF; Name: 'Orange'), + (Value: $008080; Name: 'Dark Yellow'), + (Value: $008000; Name: 'Green'), + (Value: $808000; Name: 'Teal'), + (Value: $FF0000; Name: 'Blue'), + (Value: $996666; Name: 'Blue-Gray'), + (Value: $808080; Name: 'Gray-50%'), + + (Value: $0000FF; Name: 'Red'), + (Value: $0099FF; Name: 'Light Orange'), + (Value: $00CC99; Name: 'Lime'), + (Value: $669933; Name: 'Sea Green'), + (Value: $CCCC33; Name: 'Aqua'), + (Value: $FF6633; Name: 'Light Blue'), + (Value: $800080; Name: 'Violet'), + (Value: $969696; Name: 'Gray-40%'), + + (Value: $FF00FF; Name: 'Pink'), + (Value: $00CCFF; Name: 'Gold'), + (Value: $00FFFF; Name: 'Yellow'), + (Value: $00FF00; Name: 'Bright Green'), + (Value: $FFFF00; Name: 'Turquoise'), + (Value: $FFCC00; Name: 'Sky Blue'), + (Value: $663399; Name: 'Plum'), + (Value: $C0C0C0; Name: 'Gray-25%'), + + (Value: $CC99FF; Name: 'Rose'), + (Value: $99CCFF; Name: 'Tan'), + (Value: $99FFFF; Name: 'Light Yellow'), + (Value: $CCFFCC; Name: 'Light Green'), + (Value: $FFFFCC; Name: 'Light Turquoise'), + (Value: $FFCC99; Name: 'Pale Blue'), + (Value: $FF99CC; Name: 'Lavender'), + (Value: $FFFFFF; Name: 'White')); + +type + TTBCustomItemAccess = class(TTBCustomItem); + TTBItemViewerAccess = class(TTBItemViewer); + TTBViewAccess = class(TTBView); + TTBDockAccess = class(TTBDock); + TTBCustomDockableWindowAccess = class(TTBCustomDockableWindow); + TTBBasicBackgroundAccess = class(TTBBasicBackground); + TControlAccess = class(TControl); + TWinControlAccess = class(TWinControl); + TCustomFormAccess = class(TCustomForm); + TActionLinkAccess = class(TActionLink); + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Item Helpers } + +procedure SpFillItemInfo(ACanvas: TCanvas; IV: TTBItemViewer; out ItemInfo: TSpTBXMenuItemInfo); +var + Item: TTBCustomItemAccess; + View: TTBViewAccess; + + IsHoverItem, IsOpen, IsPushed: Boolean; + IsSplit: Boolean; + ImageIsShown: Boolean; + ImgSize, RightImageSize: TSize; + IsComboPushed: Boolean; +begin + Item := TTBCustomItemAccess(IV.Item); + View := TTBViewAccess(IV.View); + + IsOpen := IV = View.OpenViewer; + IsHoverItem := IV = View.Selected; + IsPushed := IsHoverItem and (IsOpen or (View.MouseOverSelected and View.Capture and IV.IsToolbarStyle)); + IsSplit := tbisCombo in Item.ItemStyle; + IsComboPushed := IsSplit and IsPushed and not View.Capture; + if IsComboPushed then IsPushed := False; + + ImgSize.cx := 0; + ImgSize.cy := 0; + RightImageSize.cx := 0; + RightImageSize.cy := 0; + ImageIsShown := False; + if IV is TSpTBXItemViewer then begin + if TSpTBXItemViewer(IV).GetImageShown then begin + ImgSize := TSpTBXItemViewer(IV).GetImageSize; + if (ImgSize.cx > 0) and (ImgSize.cy > 0) then + ImageIsShown := True; + end; + RightImageSize := TSpTBXItemViewer(IV).GetRightImageSize; + end; + + FillChar(ItemInfo, SizeOf(ItemInfo), 0); + ItemInfo.Enabled := Item.Enabled or View.Customizing; + ItemInfo.Pushed := IsPushed; + ItemInfo.Checked := Item.Checked; + ItemInfo.HotTrack := IsHoverItem; + ItemInfo.ImageShown := ImageIsShown; + ItemInfo.ImageOrCheckShown := ImageIsShown or (not IV.IsToolbarStyle and Item.Checked); + ItemInfo.ImageSize := ImgSize; + ItemInfo.RightImageSize := RightImageSize; + ItemInfo.IsDesigning := csDesigning in View.ComponentState; + ItemInfo.IsOnMenuBar := vsMenuBar in View.Style; + ItemInfo.IsVertical := (View.Orientation = tbvoVertical) and not IsSplit; + ItemInfo.IsOnToolbox := False; + if Assigned(View.ParentItem) then begin + if View.ParentItem is TSpTBXCustomItem then + ItemInfo.IsOnToolbox := TSpTBXCustomItem(View.ParentItem).ToolBoxPopup + else + if View.ParentItem is TSpTBXRootItem then + ItemInfo.IsOnToolbox := TSpTBXRootItem(View.ParentItem).ToolBoxPopup; + end; + ItemInfo.IsOpen := IsOpen; + ItemInfo.IsSplit := IsSplit; + ItemInfo.ComboRect := Rect(0, 0, 0, 0); + // HasArrow = tboDropdownArrow or (Submenu and Combo) + ItemInfo.HasArrow := (tboDropdownArrow in Item.Options) or + ((tbisSubmenu in Item.ItemStyle) and (tbisCombo in Item.ItemStyle)); + ItemInfo.ToolbarStyle := IV.IsToolbarStyle; + + if ItemInfo.ToolbarStyle then + begin + if ItemInfo.HasArrow then + ItemInfo.ComboPart := cpCombo; + if ItemInfo.IsSplit then + ItemInfo.ComboPart := cpSplitLeft; + end + else begin + // Only for menu items + if View.Window is TSpTBXPopupWindow then + CurrentSkin.GetMenuItemMargins(ACanvas, TSpTBXPopupWindow(View.Window).MaximumImageSize.cx, ItemInfo.MenuMargins) + else + CurrentSkin.GetMenuItemMargins(ACanvas, ImgSize.cx, ItemInfo.MenuMargins); + end; + + ItemInfo.State := CurrentSkin.GetState(ItemInfo.Enabled, ItemInfo.Pushed, ItemInfo.HotTrack, ItemInfo.Checked); + ItemInfo.ComboState := sknsNormal; + if IsSplit then begin + ItemInfo.ComboState := ItemInfo.State; + if IsComboPushed then + ItemInfo.ComboState := sknsPushed + else + case ItemInfo.State of + sknsPushed: ItemInfo.ComboState := sknsHotTrack; + sknsChecked: ItemInfo.ComboState := sknsNormal; + sknsCheckedAndHotTrack: ItemInfo.ComboState := sknsHotTrack; + end; + end; + + ItemInfo.SkinType := SkinManager.GetSkinType; + + // [Theme-Change] + // The Default theme paints the caption of the pushed button in a down + // state, this only happens when the Item is on a toolbar and: + // 1) Windows themes are enabled and the item is not on a menubar + // 2) Windows themes are disabled + ItemInfo.IsSunkenCaption := False; + if (ItemInfo.Pushed or ItemInfo.Checked) and ItemInfo.ToolbarStyle then + ItemInfo.IsSunkenCaption := (not ItemInfo.IsOnMenuBar and (ItemInfo.SkinType = sknWindows)) or + (ItemInfo.SkinType = sknNone); +end; + +function SpGetBoundsRect(IV: TTBItemViewer; Root: TTBRootItem): TRect; +// Returns the Bounds Rect of an ItemViewer. +// If the ItemViewer is a GroupItemViewer then it returns the sum +// of all the ItemViewers inside it. +var + G: TTBItemViewer; + V: TTBView; + I, J: Integer; + R: TRect; + FirstItemFound: Boolean; +begin + Result := Rect(0, 0, 0, 0); + if Assigned(IV) then + if IV.Item is TTBGroupItem then begin + // Sum all the ItemViewers of the GroupItem + V := IV.View; + J := IV.Index + 1; + FirstItemFound := False; + for I := J to V.ViewerCount - 1 do begin + G := V.Viewers[I]; + if (G.Item.Parent = Root) then + Break + else + if G.Item.Visible and not (G.Item is TTBGroupItem) then + if not FirstItemFound then begin + FirstItemFound := True; + Result := G.BoundsRect; + end + else begin + R := G.BoundsRect; + Result.Left := Min(Result.Left, R.Left); + Result.Top := Min(Result.Top, R.Top); + Result.Right := Max(Result.Right, R.Right); + Result.Bottom := Max(Result.Bottom, R.Bottom); + end; + end; + end + else + Result := IV.BoundsRect; +end; + +procedure SpGetAllItems(AParentItem: TTBCustomItem; ItemsList: TTntStringList; ClearFirst: Boolean = True); +// Returns a StringList with all the items, subitems and linked items from AParentItem. +// The ItemsList.Strings[] contains the items name +// The ItemsList.Objects[] contains the items reference + + procedure Iterate(AParentItem: TTBCustomItem; LinkDepth: Integer); + var + I: Integer; + NewParentItem, Item: TTBCustomItem; + begin + NewParentItem := AParentItem; + if Assigned(NewParentItem.LinkSubitems) then begin + NewParentItem := NewParentItem.LinkSubitems; + Inc(LinkDepth); + if LinkDepth > 25 then + Exit; { prevent infinite link recursion } + end; + for I := 0 to NewParentItem.Count - 1 do begin + Item := NewParentItem.Items[I]; + ItemsList.AddObject(Item.Name, Item); + Iterate(Item, LinkDepth); + end; + end; + +begin + if ClearFirst then + ItemsList.Clear; + Iterate(AParentItem, 0); +end; + +function SpGetMenuMaximumImageSize(View: TTBView): TSize; +// Iterates the viewers and returns the maximum image size +var + I: Integer; + IV: TTBItemViewer; + IL: TCustomImageList; + ImageShown: Boolean; +begin + Result.cx := 0; + Result.cy := 0; + for I := 0 to View.ViewerCount - 1 do begin + IV := View.Viewers[I]; + if IV is TSpTBXItemViewer then + ImageShown := TSpTBXItemViewer(IV).GetImageShown + else + ImageShown := TTBItemViewerAccess(IV).ImageShown; + + if ImageShown then begin + IL := TTBItemViewerAccess(IV).GetImageList; + if Assigned(IL) then begin + if IL.Width > Result.cx then + Result.cx := IL.Width; + if IL.Height > Result.cy then + Result.cy := IL.Height; + end; + end; + end; +end; + +function SpGetItemViewerFromPoint(Root: TTBRootItem; View: TTBView; P: TPoint; + ProcessGroupItems: Boolean = True): TTBItemViewer; +// Returns the ItemViewer at the given position +// If ProcessGroupItems is true and the ItemViewer is on a GroupItem return +// the GroupItem's ItemViewer instead. +var + IV: TTBItemViewer; + I, X: Integer; + G: TTBItemViewer; +begin + Result := nil; + if Assigned(Root) and Assigned(View) then begin + IV := View.ViewerFromPoint(P); + + // If the Item is not on the Root it must be part of a GroupItem + if ProcessGroupItems and Assigned(IV) and not (IV.Item is TTBChevronItem) and (IV.Item.Parent <> Root) then begin + // Get the parent GroupItem ItemViewer + X := IV.Index; + for I := X downto 0 do begin + G := IV.View.Viewers[I]; + if G.Item is TTBGroupItem then begin + Result := G; + Break; + end; + end; + end + else + Result := IV; + end; +end; + +function SpGetNextItemSameEdge(View: TTBView; IV: TTBItemViewer; GoForward: Boolean; + SearchType: TSpTBXSearchItemViewerType): TTBItemViewer; +// Returns the left or right Tab item depending on GoForward +// SearchType can be: +// sivtNormal: Normal search +// sivtInmediate: Search for the inmediate ItemViewer +// sivtInmediateSkipNonVisible: Search for the next inmediate ItemViewer, skipping non visible ones +var + Temp: TTBItemViewer; + I: Integer; +begin + Result := nil; + if IV = nil then + Result := View.NextSelectable(nil, GoForward) + else begin + View.ValidatePositions; + I := View.IndexOf(IV); + while not Assigned(Result) do begin + if GoForward then Inc(I) + else Dec(I); + + if (I > View.ViewerCount - 1) or (I < 0) then + Break + else begin + Temp := View.Viewers[I]; + // Skip non visible items, search for same edge items + if Temp.Item.Visible and (Temp.OffEdge = IV.OffEdge) and (Temp.BoundsRect.Top = IV.BoundsRect.Top) then begin + Result := Temp; // Found IV + Break; + end + else begin + case SearchType of + sivtInmediate: + Break; // Inmediate not found, exit + sivtInmediateSkipNonVisible: + if Temp.Item.Visible then Break; // Inmediate not found and visible, exit + end; + end; + end; + end; + end; +end; + +function SpGetFirstRightAlignSpacer(View: TTBView): TSpTBXItemViewer; +var + I: Integer; + IV: TTBItemViewer; +begin + Result := nil; + for I := 0 to View.ViewerCount - 1 do begin + IV := View.Viewers[I]; + if IV.Item.Visible and (IV.Item is TSpTBXRightAlignSpacerItem) then + Result := IV as TSpTBXItemViewer; + end; +end; + +function SpGetRightAlignedItems(View: TTBView; RightAlignedList: TList; + IsRotated: Boolean; out VisibleTotalWidth, RightAlignedTotalWidth: Integer): TSpTBXItemViewer; + + function GetWidth(R: TRect): Integer; + begin + if IsRotated then + Result := R.Bottom - R.Top + else + Result := R.Right - R.Left; + end; + +var + I: Integer; + IV: TTBItemViewer; +begin + Result := nil; + + if Assigned(RightAlignedList) then + RightAlignedList.Clear; + VisibleTotalWidth := 0; + RightAlignedTotalWidth := 0; + + for I := 0 to View.ViewerCount - 1 do begin + IV := View.Viewers[I]; + if IV.Item.Visible then + VisibleTotalWidth := VisibleTotalWidth + GetWidth(IV.BoundsRect); + if not Assigned(Result) and (IV.Item.Visible) and (IV.Item is TSpTBXRightAlignSpacerItem) then + Result := IV as TSpTBXItemViewer; + if Assigned(Result) then begin + if Assigned(RightAlignedList) then + RightAlignedList.Add(IV); + RightAlignedTotalWidth := RightAlignedTotalWidth + GetWidth(IV.BoundsRect); + end; + end; +end; + +procedure SpInvalidateItem(View: TTBView; Item: TTBCustomItem); +var + IV: TTBItemViewer; +begin + IV := View.Find(Item); + if Assigned(IV) then View.Invalidate(IV); +end; + +function SpFindItemViewer(View: TTBView; Item: TTBCustomItem): TTBItemViewer; +var + I: Integer; +begin + Result := nil; + if Assigned(Item) then + for I := 0 to View.ViewerCount - 1 do + if View.Viewers[I].Item = Item then begin + Result := View.Viewers[I]; + Exit; + end; +end; + +function SpFindControlItem(Item: TTBCustomItem; Ctl: TControl; Recurse: Boolean): TTBControlItem; +var + I: Integer; +begin + Result := nil; + for I := 0 to Item.Count - 1 do begin + if Recurse and (Item[I] is TTBGroupItem) then begin + Result := SpFindControlItem(Item[I], Ctl, True); + if Assigned(Result) then + Break; + end; + if (Item[I] is TTBControlItem) and (TTBControlItem(Item[I]).Control = Ctl) then begin + Result := TTBControlItem(Item[I]); + Break; + end; + end; +end; + +procedure SpGetDropPosItemViewer(Root: TTBRootItem; View: TTBView; P: TPoint; + out DestIV: TTBItemViewer; out DestItemPos: Integer; out DropMark: TRect); +// Returns the ItemViewer and Item index at the given position for Drag & Drop +// operations that needs a DropMark rect. +// Use this when the items are dropped when the drag operation is finished. +var + DestR: TRect; +const + DropMarkSize = 4; +begin + DestItemPos := -1; + DestIV := SpGetItemViewerFromPoint(Root, View, P); + DropMark := Rect(0, 0, 0, 0); + if Assigned(DestIV) then begin + // Get the destination item position + DestItemPos := Root.IndexOf(DestIV.Item); + DestR := SpGetBoundsRect(DestIV, Root); + if View.Orientation = tbvoVertical then begin + if P.Y > ((DestR.Bottom - DestR.Top) div 2) + DestR.Top then begin + Inc(DestItemPos); + DropMark := Rect(0, DestR.Bottom, View.BaseSize.X, DestR.Bottom + DropMarkSize); + end + else + DropMark := Rect(0, DestR.Top, View.BaseSize.X, DestR.Top + DropMarkSize); + end + else + if P.X > ((DestR.Right - DestR.Left) div 2) + DestR.Left then begin + Inc(DestItemPos); + DropMark := Rect(DestR.Right, 0, DestR.Right + DropMarkSize, View.BaseSize.Y); + end + else + DropMark := Rect(DestR.Left, 0, DestR.Left + DropMarkSize, View.BaseSize.Y); + end; +end; + +procedure SpGetDropPosItemViewer(Root: TTBRootItem; View: TTBView; P: TPoint; + SourceItemPos: Integer; out DestIV: TTBItemViewer; out DestItemPos: Integer); +// Returns the ItemViewer and Item index at the given position for inmediate +// Drag & Drop operations without a DropMark. +// Use this when the items are moved while the mouse is being dragged. +var + DestR: TRect; +begin + DestItemPos := -1; + DestIV := SpGetItemViewerFromPoint(Root, View, P); + if Assigned(DestIV) then begin + // Get the destination item position + DestItemPos := Root.IndexOf(DestIV.Item); + DestR := SpGetBoundsRect(DestIV, Root); + + if View.Orientation = tbvoVertical then begin + if P.Y > ((DestR.Bottom - DestR.Top) div 2) + DestR.Top then begin + if DestItemPos - 1 <> SourceItemPos then Inc(DestItemPos); + end + else begin + if DestItemPos - 1 = SourceItemPos then Dec(DestItemPos); + end; + end + else + if P.X > ((DestR.Right - DestR.Left) div 2) + DestR.Left then begin + if DestItemPos - 1 <> SourceItemPos then Inc(DestItemPos); + end + else begin + if DestItemPos - 1 = SourceItemPos then Dec(DestItemPos); + end; + end; +end; + +function SpGetDragHandleSize(Toolbar: TTBCustomDockableWindow): Integer; +const + DragHandleSizes: array [Boolean, 0..2] of Integer = ((9, 0, 6), (14, 14, 14)); +var + T: TTBCustomDockableWindowAccess; +begin + Result := 0; + if Assigned(Toolbar.CurrentDock) then + if Toolbar.CurrentDock.AllowDrag then begin + T := TTBCustomDockableWindowAccess(Toolbar); + Result := DragHandleSizes[T.CloseButtonWhenDocked, Ord(T.DragHandleStyle)] + end; +end; + +function SpIsVerticalToolbar(Toolbar: TTBCustomDockableWindow): Boolean; +begin + if Assigned(Toolbar.CurrentDock) then + Result := Toolbar.CurrentDock.Position in [dpLeft, dpRight] + else + Result := False; +end; + +function SpIsDockUsingBitmap(Dock: TTBDock): Boolean; +var + Background: TTBBasicBackgroundAccess; +begin + Background := TTBBasicBackgroundAccess(Dock.Background); + Result := Assigned(Background) and Background.UsingBackground; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Painting helpers } + +procedure SpDrawXPMenuItem(ACanvas: TCanvas; ARect: TRect; ItemInfo: TSpTBXMenuItemInfo); + + procedure ToolbarItemDraw(ARect: TRect); + var + Flags: Integer; + ForceRectBorders: TAnchors; + const + XPPart: array [TSpTBXComboPart] of Integer = (TP_BUTTON, TP_DROPDOWNBUTTON, + TP_SPLITBUTTON, TP_SPLITBUTTONDROPDOWN); + begin + ForceRectBorders := []; + if ItemInfo.IsSplit then + if ItemInfo.ComboPart = cpSplitLeft then + ForceRectBorders := [akRight] + else + ForceRectBorders := [akLeft]; + + case ItemInfo.SkinType of + sknNone: + if ItemInfo.Checked then begin + if not ItemInfo.HotTrack or (not ItemInfo.Enabled and ItemInfo.ToolbarStyle) then begin + ACanvas.Brush.Bitmap := AllocPatternBitmap(clBtnFace, clBtnHighlight);; + ACanvas.Brush.Bitmap.HandleType := bmDDB; { needed for Win95, or else brush is solid white } + ACanvas.FillRect(ARect); + ACanvas.Brush.Style := bsClear; + end; + Windows.DrawEdge(ACanvas.Handle, ARect, BDR_SUNKENOUTER, BF_RECT); + end + else begin + case ItemInfo.State of + sknsNormal: + if ItemInfo.IsDesigning then + Windows.DrawEdge(ACanvas.Handle, ARect, BDR_RAISEDINNER, BF_RECT); + sknsHotTrack: + Windows.DrawEdge(ACanvas.Handle, ARect, BDR_RAISEDINNER, BF_RECT); + sknsPushed: + Windows.DrawEdge(ACanvas.Handle, ARect, BDR_SUNKENOUTER, BF_RECT); + end; + end; + sknWindows: + if ItemInfo.IsDesigning then + SpDrawRectangle(ACanvas, ARect, 2, clBtnShadow, clBtnShadow, clNone, clNone, ForceRectBorders) + else + if ItemInfo.IsOnMenuBar then begin + if ItemInfo.State in [sknsHotTrack, sknsPushed, sknsChecked, sknsCheckedAndHotTrack] then + SpFillRect(ACanvas, ARect, clHighlight); + end + else begin + Flags := 0; + case ItemInfo.State of + sknsNormal: Flags := TS_NORMAL; + sknsDisabled: Flags := TS_DISABLED; + sknsHotTrack: Flags := TS_HOT; + sknsPushed: Flags := TS_PRESSED; + sknsChecked: Flags := TS_CHECKED; + sknsCheckedAndHotTrack: Flags := TS_HOTCHECKED; + end; + DrawThemeBackground(ThemeServices.Theme[teToolBar], ACanvas.Handle, XPPart[ItemInfo.ComboPart], Flags, ARect, nil); + end; + sknSkin: + if ItemInfo.IsOpen and CurrentSkin.OfficePopup then begin + // Paints skncOpenToolbarItem skin, hide the bottom border + ARect.Bottom := ARect.Bottom + 2; + CurrentSkin.PaintBackground(ACanvas, ARect, skncOpenToolbarItem, sknsNormal, True, True) + end + else + if ItemInfo.IsDesigning then + SpDrawRectangle(ACanvas, ARect, 2, clBtnShadow, clBtnShadow, clNone, clNone, ForceRectBorders) + else + if ItemInfo.IsOnMenuBar then + CurrentSkin.PaintBackground(ACanvas, ARect, skncMenuBarItem, ItemInfo.State, True, True, False, ForceRectBorders) + else + CurrentSkin.PaintBackground(ACanvas, ARect, skncToolbarItem, ItemInfo.State, True, True, False, ForceRectBorders); + end; + end; + + procedure MenuItemDraw(ARect: TRect); + var + MenuState: TSpTBXSkinStatesType; + begin + MenuState := sknsHotTrack; // other states are not painted + + case ItemInfo.SkinType of + sknNone: + SpFillRect(ACanvas, ARect, clHighlight); + sknWindows: + if SpIsWinVistaOrUp then begin + // Use the new API on Windows Vista + DrawThemeBackground(ThemeServices.Theme[teMenu], ACanvas.Handle, MENU_POPUPITEM, MPI_HOT, ARect, nil); + end + else + SpFillRect(ACanvas, ARect, clHighlight); + sknSkin: + CurrentSkin.PaintBackground(ACanvas, ARect, skncMenuItem, MenuState, True, True); + end; + end; + +var + R: TRect; + DrawCheckBoxFrame: Boolean; + C: TColor; + SelectionDelta: Integer; + Flags: Integer; +begin + if ItemInfo.ToolbarStyle then begin // Toolbar Item + if ItemInfo.IsSplit then begin + if ItemInfo.IsOpen and CurrentSkin.OfficePopup then begin + // If it's Split, Open and OfficePopup paint the skncOpenToolbarItem skin + ARect.Right := ItemInfo.ComboRect.Right; + ToolbarItemDraw(ARect); + end + else begin + // Draw the left side button + if (ItemInfo.SkinType = sknSkin) or ItemInfo.IsDesigning then + Inc(ARect.Right, 2); + ItemInfo.ComboPart := cpSplitLeft; + ToolbarItemDraw(ARect); + + // Draw the right side button + ItemInfo.ComboPart := cpSplitRight; + ItemInfo.State := ItemInfo.ComboState; + ToolbarItemDraw(ItemInfo.ComboRect); + end; + end + else + ToolbarItemDraw(ARect); + end + else begin // Menu item + // DrawCheckBoxFrame is true when the item is checked + if (ItemInfo.SkinType = sknSkin) or (SpIsWinVistaOrUp and (ItemInfo.SkinType = sknWindows)) then + DrawCheckBoxFrame := ItemInfo.Enabled and ItemInfo.Checked + else begin + if ItemInfo.SkinType = sknNone then + DrawCheckBoxFrame := ItemInfo.Checked or ItemInfo.ImageOrCheckShown + else + DrawCheckBoxFrame := ItemInfo.Enabled and (ItemInfo.Checked or ItemInfo.ImageOrCheckShown); + end; + + R := ARect; + + // Draw the item selection rectangle + if ItemInfo.HotTrack then begin + if DrawCheckBoxFrame then begin + SelectionDelta := 0; + case ItemInfo.SkinType of + sknNone: + SelectionDelta := ItemInfo.MenuMargins.GutterSize + 1; // Don't draw the hottrack selection behind the checkbox + sknWindows: + if not SpIsWinVistaOrUp then + SelectionDelta := ItemInfo.MenuMargins.GutterSize + 1; // Don't draw the hottrack selection behind the checkbox + sknSkin: + SelectionDelta := 3; // Don't draw the hottrack selection behind the checkbox left borders + end; + Inc(R.Left, SelectionDelta); + end; + MenuItemDraw(R); + end; + + // Draw the checkbox frame (the checkbox glyph is painted in the ItemViewer.Paint method) + if DrawCheckBoxFrame then begin + R := ARect; + R.Right := R.Left + ItemInfo.MenuMargins.GutterSize; + if SpIsWinVistaOrUp and (ItemInfo.SkinType = sknWindows) then begin + // Use the new API on Windows Vista + // The checkbox frame is not painted + if ItemInfo.State = sknsDisabled then Flags := MCB_DISABLED + else if ItemInfo.ImageShown then Flags := MCB_BITMAP + else Flags := MCB_NORMAL; + DrawThemeBackground(ThemeServices.Theme[teMenu], ACanvas.Handle, MENU_POPUPCHECKBACKGROUND, Flags, R, nil); + end + else + if ItemInfo.SkinType = sknSkin then + CurrentSkin.PaintBackground(ACanvas, R, skncMenuItem, ItemInfo.State, True, True) + else + ToolbarItemDraw(R); + end; + + // Draw the combo item separator + if ItemInfo.IsSplit then begin + if ItemInfo.SkinType = sknSkin then begin + C := SkinManager.CurrentSkin.Options(skncMenuItem, ItemInfo.State).Borders.Color1; + if C = clNone then + C := clBtnShadow; + end + else + C := clBtnShadow; + R := ARect; + R.Left := ARect.Right - 10 - 4; + SpDrawLine(ACanvas, R.Left, R.Top + 1, R.Left, R.Bottom - 1, C); + end; + end; +end; + +procedure SpDrawXPMenuSeparator(ACanvas: TCanvas; ARect: TRect; MenuItemStyle, Vertical: Boolean); +const + ToolbarXPFlags: array [Boolean] of Integer = (TP_SEPARATORVERT, TP_SEPARATOR); +var + R: TRect; + C: TColor; + D: Integer; + VistaSeparatorSize: tagSize; +begin + R := ARect; + case SkinManager.GetSkinType of + sknNone: + if not Vertical then begin + R.Top := (R.Top + R.Bottom) div 2 - 1; + DrawEdge(ACanvas.Handle, R, EDGE_ETCHED, BF_TOP); + end + else begin + R.Left := (R.Left + R.Right) div 2 - 1; + DrawEdge(ACanvas.Handle, R, EDGE_ETCHED, BF_LEFT); + end; + sknWindows: + if MenuItemStyle and SpIsWinVistaOrUp then begin + // Use the new API in Windows Vista + GetThemePartSize(ThemeServices.Theme[teMenu], 0, MENU_POPUPSEPARATOR, 0, nil, TS_TRUE, VistaSeparatorSize); + R := SpCenterRectVert(R, VistaSeparatorSize.cy); + DrawThemeBackground(ThemeServices.Theme[teMenu], ACanvas.Handle, MENU_POPUPSEPARATOR, 0, R, nil); + end + else begin + if MenuItemStyle then begin + D := 0; + if Vertical then begin + R.Left := (R.Left + R.Right) div 2 - 1; + Inc(R.Top, D); Dec(R.Bottom, D); + Windows.DrawEdge(ACanvas.Handle, R, EDGE_ETCHED, BF_LEFT); + end + else begin + R.Top := (R.Top + R.Bottom) div 2 - 1; + Inc(R.Left, D); Dec(R.Right, D); + Windows.DrawEdge(ACanvas.Handle, R, EDGE_ETCHED, BF_TOP); + end; + end + else + DrawThemeBackground(ThemeServices.Theme[teToolbar], ACanvas.Handle, ToolbarXPFlags[Vertical], TS_NORMAL, R, nil); + end; + sknSkin: + if not Vertical then begin + // ??? what happens when 2 items have different imagelist sizes? how is the gutter measured? + R.Top := (R.Bottom + R.Top) div 2 - 1; + R.Bottom := R.Top; + C := SkinManager.CurrentSkin.Options(skncSeparator, sknsNormal).Body.Color1; + SpDrawLine(ACanvas, R.Left, R.Top, R.Right, R.Bottom, C); + OffsetRect(R, 0, 1); + C := SkinManager.CurrentSkin.Options(skncSeparator, sknsNormal).Body.Color2; + SpDrawLine(ACanvas, R.Left, R.Top, R.Right, R.Bottom, C); + end + else begin + R.Left := (R.Right + R.Left) div 2 - 1; + R.Right := R.Left; + InflateRect(R, 0, -3); + C := SkinManager.CurrentSkin.Options(skncSeparator, sknsNormal).Body.Color1; + SpDrawLine(ACanvas, R.Left, R.Top, R.Right, R.Bottom, C); + OffsetRect(R, 1, 0); + C := SkinManager.CurrentSkin.Options(skncSeparator, sknsNormal).Body.Color2; + SpDrawLine(ACanvas, R.Left, R.Top, R.Right, R.Bottom, C); + end; + end; +end; + +procedure SpDrawXPMenuItemImage(ACanvas: TCanvas; ARect: TRect; + const ItemInfo: TSpTBXMenuItemInfo; ImageList: TCustomImageList; ImageIndex: Integer); +begin + if ImageList is TTBCustomImageList then begin + if ItemInfo.IsSunkenCaption then + OffsetRect(ARect, 1, 1); + TTBCustomImageList(ImageList).DrawState(ACanvas, ARect.Left, ARect.Top, + ImageIndex, ItemInfo.Enabled, ItemInfo.HotTrack, ItemInfo.Checked); + Exit; + end; + + if ItemInfo.Enabled and SkinManager.CurrentSkin.OfficeIcons then begin + // Draw icon shadow + if ItemInfo.HotTrack and not ItemInfo.Pushed then begin + OffsetRect(ARect, 1, 1); + SpDrawIconShadow(ACanvas, ARect, ImageList, ImageIndex); + OffsetRect(ARect, -2, -2); + end; + SpDrawImageList(ACanvas, ARect, ImageList, ImageIndex, ItemInfo.Enabled, True); + end + else begin + if ItemInfo.IsSunkenCaption then + OffsetRect(ARect, 1, 1); + SpDrawImageList(ACanvas, ARect, ImageList, ImageIndex, ItemInfo.Enabled, True); + end; +end; + +procedure SpDrawXPMenuGutter(ACanvas: TCanvas; ARect: TRect; SkinType: TSpTBXSkinType); +var + Op: TSpTBXSkinOptionCategory; + C: TColor; +begin + SkinType := SpTBXSkinType(SkinType); + // If it's Windows theme and we're not on Vista do default painting + if (SkinType = sknWindows) and not SpIsWinVistaOrUp then + SkinType := sknNone; + + case SkinType of + sknNone:; // No gutter on Windows 9x, 2000 + sknWindows: + begin + // Only Windows Vista painting, XP just fills the background + if SpIsWinVistaOrUp then + DrawThemeBackground(ThemeServices.Theme[teMenu], ACanvas.Handle, MENU_POPUPGUTTER, 0, ARect, nil); + end; + sknSkin: + begin + Op := CurrentSkin.Options(skncGutter, sknsNormal); + if not Op.Body.IsEmpty then + SpPaintSkinBackground(ACanvas, ARect, Op, False); + + // Paint only the right side border, like a Separator line + ARect.Left := ARect.Right; + C := Op.Borders.Color2; + if C <> clNone then begin + SpDrawLine(ACanvas, ARect.Left, ARect.Top, ARect.Right, ARect.Bottom, C); + OffsetRect(ARect, -1, 0); + end; + C := Op.Borders.Color1; + if C <> clNone then + SpDrawLine(ACanvas, ARect.Left, ARect.Top, ARect.Right, ARect.Bottom, C); + end; + end; +end; + +procedure SpDrawXPMenuPopupWindow(ACanvas: TCanvas; ARect, OpenIVRect: TRect; + DrawGutter: Boolean; ImageSize: Integer; SkinType: TSpTBXSkinType); +var + GutterR: TRect; + MarginsInfo: TSpTBXMenuItemMarginsInfo; + SaveIndex: Integer; +begin + SkinType := SpTBXSkinType(SkinType); + // If it's Windows theme and we're not on Vista do default painting + if (SkinType = sknWindows) and not SpIsWinVistaOrUp then + SkinType := sknNone; + + case SkinType of + sknNone: // Windows 9x, 2000 and XP + if not AreFlatMenusEnabled then begin + DrawEdge(ACanvas.Handle, ARect, EDGE_RAISED, BF_RECT or BF_ADJUST); + SpFillRect(ACanvas, ARect, clBtnFace); + end + else + SpFillRect(ACanvas, ARect, clMenu, clBtnShadow); + sknWindows: // Only Windows Vista painting, XP just fills the background + begin + // Use the new API in Windows Vista + DrawThemeBackground(ThemeServices.Theme[teMenu], ACanvas.Handle, MENU_POPUPBACKGROUND, 0, ARect, nil); + DrawThemeBackground(ThemeServices.Theme[teMenu], ACanvas.Handle, MENU_POPUPBORDERS, 0, ARect, nil); + if DrawGutter then begin + CurrentSkin.GetMenuItemMargins(ACanvas, ImageSize, MarginsInfo); + GutterR := ARect; + InflateRect(GutterR, -1, -1); + GutterR.Right := GutterR.Left + MarginsInfo.GutterSize + MarginsInfo.LeftCaptionMargin + 3; // +3 because the popup has 2 pixel border and the gutter separator has 2 pixel + SpDrawXPMenuGutter(ACanvas, GutterR, SkinType); + end; + end; + sknSkin: + begin + // Paint the background, if OfficePopup is true just clip the top + // border corresponding to the Open ItemViewer Rect + if OpenIVRect.Top < 0 then begin + OpenIVRect.Top := ARect.Top; + OpenIVRect.Bottom := ARect.Top + 1; + InflateRect(OpenIVRect, -1, 0); + + // First paint the background + CurrentSkin.PaintBackground(ACanvas, ARect, skncPopup, sknsNormal, True, False); + // Now paint the borders, clip the top border + SaveIndex := SaveDC(ACanvas.Handle); + try + ExcludeClipRect(ACanvas.Handle, OpenIVRect.Left, OpenIVRect.Top, OpenIVRect.Right, OpenIVRect.Bottom); + CurrentSkin.PaintBackground(ACanvas, ARect, skncPopup, sknsNormal, False, True); + finally + RestoreDC(ACanvas.Handle, SaveIndex); + end; + end + else + CurrentSkin.PaintBackground(ACanvas, ARect, skncPopup, sknsNormal, True, True); + + // Paint the gutter + if DrawGutter and not CurrentSkin.Options(skncGutter, sknsNormal).IsEmpty then begin + if ImageSize <= 0 then ImageSize := 16; + CurrentSkin.GetMenuItemMargins(ACanvas, ImageSize, MarginsInfo); + GutterR := ARect; + InflateRect(GutterR, -1, -1); + GutterR.Right := GutterR.Left + MarginsInfo.GutterSize + MarginsInfo.LeftCaptionMargin + 1; // +1 because the popup has 2 pixel border + SpDrawXPMenuGutter(ACanvas, GutterR, SkinType); + end; + end; + end; +end; + +procedure SpDrawXPStatusBar(ACanvas: TCanvas; ARect, AGripRect: TRect; SkinType: TSpTBXSkinType; UsingOfficeTheme: Boolean); +var + R: TRect; + C1, C2: TColor; +begin + case SpTBXSkinType(SkinType) of + sknNone: + begin + if not IsRectEmpty(ARect) then begin + SpFillRect(ACanvas, ARect, clBtnFace); + SpDrawRectangle(ACanvas, ARect, 0, clBtnShadow, clWindow); + end; + if not IsRectEmpty(AGripRect) then begin + InflateRect(AGripRect, 0, -1); + DrawFrameControl(ACanvas.Handle, AGripRect, DFC_SCROLL, DFCS_SCROLLSIZEGRIP); + end; + end; + sknWindows: + begin + if not IsRectEmpty(ARect) then + DrawThemeBackground(ThemeServices.Theme[teStatus], ACanvas.Handle, 0, 0, ARect, nil); + if not IsRectEmpty(AGripRect) then + DrawThemeBackground(ThemeServices.Theme[teStatus], ACanvas.Handle, SP_GRIPPER, 0, AGripRect, nil) + end; + sknSkin: + begin + if not IsRectEmpty(ARect) then + CurrentSkin.PaintBackground(ACanvas, ARect, skncStatusBar, sknsNormal, True, True); + if not IsRectEmpty(AGripRect) then begin + R := AGripRect; + C1 := SkinManager.CurrentSkin.Options(skncStatusBarGrip).Body.Color1; + C2 := SkinManager.CurrentSkin.Options(skncStatusBarGrip).Body.Color2; + // Draw 3 cells at the bottom + R.Left := R.Right - 12; + R.Top := R.Bottom - 4; + SpDrawXPGrip(ACanvas, R, C1, C2); + // Draw 2 cells at the top + R.Bottom := R.Top; + R.Top := R.Bottom - 4; + R.Left := R.Left + 4; + SpDrawXPGrip(ACanvas, R, C1, C2); + // Draw 1 cell at the top + R.Bottom := R.Top; + R.Top := R.Bottom - 4; + R.Left := R.Left + 4; + SpDrawXPGrip(ACanvas, R, C1, C2); + end; + + if UsingOfficeTheme and not IsRectEmpty(ARect) then begin + Inc(ARect.Top); + ACanvas.Brush.Color := clWindow; + ACanvas.FrameRect(ARect); + end; + end; + end; +end; + +procedure SpDrawXPTitleBar(ACanvas: TCanvas; ARect: TRect; IsActive: Boolean; DrawBorders: Boolean = True); +const + XpFlags: array [Boolean] of Integer = (FS_INACTIVE, FS_ACTIVE); + W9xFlags: array [Boolean] of Integer = (0, DC_ACTIVE); + W9xGradientFlag: array [Boolean] of Integer = (0, DC_GRADIENT); +var + Gradient: Boolean; + B: BOOL; +begin + case SkinManager.GetSkinType of + sknNone: + begin + Gradient := SystemParametersInfo(SPI_GETGRADIENTCAPTIONS, 0, @B, 0) and B; + Windows.DrawCaption(GetDesktopWindow, ACanvas.Handle, ARect, DC_TEXT or W9xFlags[IsActive] or W9xGradientFlag[Gradient]); + end; + sknWindows: + // If WP_CAPTION is used instead of WP_SMALLCAPTION the top borders are rounded + DrawThemeBackground(ThemeServices.Theme[teWindow], ACanvas.Handle, WP_SMALLCAPTION, XpFlags[IsActive], ARect, nil); + sknSkin: + CurrentSkin.PaintBackground(ACanvas, ARect, skncWindowTitleBar, sknsNormal, True, DrawBorders); + end; +end; + +procedure SpDrawXPTitleBarBody(ACanvas: TCanvas; ARect: TRect; IsActive: Boolean; + BorderSize: TPoint; DrawBody: Boolean = True); +var + R, MirrorR: TRect; + SaveIndex, Flags: Integer; + B: TBitmap; +begin + case SkinManager.GetSkinType of + sknNone: + begin + if DrawBody then + ACanvas.FillRect(ARect); + SaveIndex := SaveDC(ACanvas.Handle); + try + R := ARect; + InflateRect(R, -BorderSize.X, -BorderSize.Y); + ExcludeClipRect(ACanvas.Handle, R.Left, R.Top, R.Right, R.Bottom); + if not DrawBody then + ACanvas.FillRect(ARect); + Windows.DrawEdge(ACanvas.Handle, ARect, EDGE_RAISED, BF_RECT); + finally + RestoreDC(ACanvas.Handle, SaveIndex); + end; + end; + sknWindows: + begin + if IsActive then + Flags := FS_ACTIVE + else + Flags := FS_INACTIVE; + R := ARect; + R.Top := R.Bottom - BorderSize.Y; + DrawThemeBackground(ThemeServices.Theme[teWindow], ACanvas.Handle, WP_SMALLFRAMEBOTTOM, Flags, R, nil); + R.Top := ARect.Top + BorderSize.Y; + R.Bottom := ARect.Bottom - BorderSize.Y; + R.Right := R.Left + BorderSize.X; + DrawThemeBackground(ThemeServices.Theme[teWindow], ACanvas.Handle, WP_SMALLFRAMELEFT, Flags, R, nil); + R.Right := ARect.Right; + R.Left := R.Right - BorderSize.X; + DrawThemeBackground(ThemeServices.Theme[teWindow], ACanvas.Handle, WP_SMALLFRAMERIGHT, Flags, R, nil); + + // Don't know how to paint a captionless window frame + // We have to mirror the bottom frame and paint it on the top + B := TBitmap.Create; + try + R := ARect; + R.Bottom := R.Top + BorderSize.Y; + B.Width := R.Right - R.Left; + B.Height := R.Bottom - R.Top; + DrawThemeBackground(ThemeServices.Theme[teWindow], B.Canvas.Handle, WP_SMALLFRAMEBOTTOM, Flags, R, nil); + + // Mirror + MirrorR := Rect(0, B.Height - 1, B.Width, -1); + ACanvas.CopyRect(R, B.Canvas, MirrorR); + finally + B.Free; + end; + end; + sknSkin: + begin + CurrentSkin.PaintWindowFrame(ACanvas, ARect, IsActive, DrawBody, BorderSize.X); + end; + end; +end; + +procedure SpDrawXPDock(ACanvas: TCanvas; ARect: TRect; SkinType: TSpTBXSkinType; Vertical: Boolean = False); +begin + SkinType := SpTBXSkinType(SkinType); + case SkinType of + sknNone: + begin + ACanvas.Brush.Color := clBtnFace; + ACanvas.FillRect(ARect); + end; + sknWindows: + begin + if Vertical then Inc(ARect.Bottom, 1); // Fix WindowsXP bug + DrawThemeBackground(ThemeServices.Theme[teRebar], ACanvas.Handle, 0, 0, ARect, nil); + end; + sknSkin: + CurrentSkin.PaintBackground(ACanvas, ARect, skncDock, sknsNormal, True, True, Vertical); + end; +end; + +procedure SpDrawXPToolbar(ACanvas: TCanvas; ARect: TRect; SkinType: TSpTBXSkinType; + Docked, Floating, Vertical, PaintSkinBackground, PaintBorders: Boolean; + SkinComponent: TSpTBXSkinComponentsType = skncToolbar); +begin + SkinType := SpTBXSkinType(SkinType); + case SkinType of + sknNone: + if PaintBorders and Docked then + Windows.DrawEdge(ACanvas.Handle, ARect, BDR_RAISEDINNER, BF_RECT or BF_ADJUST); + sknWindows: + if PaintBorders and Docked then + SpDrawRectangle(ACanvas, ARect, 0, SpLighten(clBtnFace, 24), SpLighten(clBtnFace, -32)); + sknSkin: + if Docked or Floating then begin + if Floating and CurrentSkin.Options(SkinComponent, sknsNormal).Body.IsEmpty then // Floating and doesn't have a Body + CurrentSkin.PaintBackground(ACanvas, ARect, skncDock, sknsNormal, True, False) + else begin + if Floating then PaintBorders := False; + CurrentSkin.PaintBackground(ACanvas, ARect, SkinComponent, sknsNormal, PaintSkinBackground, PaintBorders, Vertical); + end; + end; + end; +end; + +procedure SpDrawXPToolbar(W: TTBCustomDockableWindow; ACanvas: TCanvas; + ARect: TRect; PaintOnNCArea: Boolean; PaintBorders: Boolean = True; + SkinComponent: TSpTBXSkinComponentsType = skncToolbar); +var + R: TRect; + PaintDefault, DrawSkinBody: Boolean; + Toolbar: TTBCustomDockableWindowAccess; + IsVertical: Boolean; +begin + if CurrentSkin.Options(SkinComponent, sknsNormal).Body.IsEmpty then + SkinComponent := skncToolbar; + + Toolbar := TTBCustomDockableWindowAccess(W); + IsVertical := SpIsVerticalToolbar(Toolbar); + DrawSkinBody := True; + + if Toolbar.Docked then begin + // Prepare R + R := Toolbar.CurrentDock.ClientRect; + OffsetRect(R, -Toolbar.Left, -Toolbar.Top); + if not PaintOnNCArea then begin + OffsetRect(R, -DefaultToolbarBorderSize, -DefaultToolbarBorderSize); + if IsVertical then + Dec(R.Top, SpGetDragHandleSize(Toolbar)) + else + Dec(R.Left, SpGetDragHandleSize(Toolbar)); + end; + // Draw the Dock background + if Toolbar.CurrentDock is TSpTBXDock then + TSpTBXDock(Toolbar.CurrentDock).DrawBackground(ACanvas.Handle, R); + + DrawSkinBody := not (Toolbar.CurrentDock.BackgroundOnToolbars and SpIsDockUsingBitmap(Toolbar.CurrentDock)); + end + else begin + if Toolbar.Floating then begin + if SkinManager.GetSkinType <> sknSkin then begin + if Toolbar.Color = clNone then ACanvas.Brush.Color := clBtnFace + else ACanvas.Brush.Color := Toolbar.Color; + ACanvas.FillRect(ARect); + end; + end + else begin + // Draw the parent background if the toolbar is not docked nor floating + // SpDrawParentBackground doesn't seem to work correctly here + // (when a toolbar is inside a toolwindow), use PerformEraseBackground instead + Controls.PerformEraseBackground(Toolbar, ACanvas.Handle); + end; + end; + + // Default painting + PaintDefault := True; + if W is TSpTBXToolbar then begin + if TSpTBXToolbar(W).MenuBar then + SkinComponent := skncMenuBar; + TSpTBXToolbar(W).DoDrawBackground(ACanvas, ARect, pstPrePaint, PaintDefault); + end + else + if W is TSpTBXCustomToolWindow then + TSpTBXCustomToolWindow(W).DoDrawBackground(ACanvas, ARect, pstPrePaint, PaintDefault); + + if PaintDefault then begin + R := ARect; + if Toolbar.Color <> clNone then begin + ACanvas.Brush.Color := Toolbar.Color; + ACanvas.FillRect(R); + end + else + SpDrawXPToolbar(ACanvas, R, SkinManager.GetSkinType, Toolbar.Docked, Toolbar.Floating, IsVertical, DrawSkinBody, PaintBorders, SkinComponent); + end; + + PaintDefault := True; + if W is TSpTBXToolbar then + TSpTBXToolbar(W).DoDrawBackground(ACanvas, ARect, pstPostPaint, PaintDefault) + else + if W is TSpTBXCustomToolWindow then + TSpTBXCustomToolWindow(W).DoDrawBackground(ACanvas, ARect, pstPostPaint, PaintDefault); +end; + +procedure SpDrawXPToolbarGrip(W: TTBCustomDockableWindow; ACanvas: TCanvas; ARect: TRect); +const + GripperPart: array [Boolean] of Cardinal = (RP_GRIPPER, RP_GRIPPERVERT); + Pattern: array [0..15] of Byte = (0, 0, $CC, 0, $78, 0, $30, 0, $78, 0, $CC, 0, 0, 0, 0, 0); +var + GripR, CloseR: TRect; + GripSize, Z: Integer; + Vertical: Boolean; + C1, C2, PatternColor: TColor; + Flags: Integer; + Toolbar: TTBCustomDockableWindowAccess; + State: TSpTBXSkinStatesType; +begin + Toolbar := TTBCustomDockableWindowAccess(W); + + GripSize := SpGetDragHandleSize(Toolbar); + if GripSize <= 0 then Exit; + + Vertical := SpIsVerticalToolbar(Toolbar); + + GripR := ARect; + if Vertical then begin + GripR.Bottom := GripR.Top + GripSize; + InflateRect(GripR, -2, 0); + end + else begin + GripR.Right := GripR.Left + GripSize; + InflateRect(GripR, 0, -2); + end; + + if Toolbar.DragHandleStyle <> dhNone then begin + if Toolbar.CloseButtonWhenDocked then begin + if Vertical then begin + CloseR.Left := ARect.Right - GripSize; + CloseR.Right := CloseR.Left + GripSize - 2; + CloseR.Top := ARect.Top + 2; + CloseR.Bottom := CloseR.Top + GripSize - 2; + Dec(GripR.Right, GripSize - 1); + end + else begin + CloseR.Left := ARect.Left + 2; + CloseR.Right := CloseR.Left + GripSize - 2; + CloseR.Top := ARect.Top + 2; + CloseR.Bottom := CloseR.Top + GripSize - 2; + Inc(GripR.Top, GripSize - 1); + end; + end; + + case SkinManager.GetSkinType of + sknNone: + begin + OffsetRect(CloseR, -1, -1); + if Vertical then begin + if Toolbar.CloseButtonWhenDocked then + if Toolbar.DragHandleStyle = dhDouble then Inc(GripR.Top, 1) + else Inc(GripR.Top, 3); + Inc(GripR.Top, 3); + GripR.Bottom := GripR.Top + 3; + end + else begin + if Toolbar.CloseButtonWhenDocked then + if Toolbar.DragHandleStyle = dhDouble then Inc(GripR.Left, 1) + else Inc(GripR.Left, 3); + Inc(GripR.Left, 3); + GripR.Right := GripR.Left + 3; + end; + Windows.DrawEdge(ACanvas.Handle, GripR, BDR_RAISEDINNER, BF_RECT); + ACanvas.Pixels[GripR.Left, GripR.Bottom - 1] := clBtnHighlight; + if Toolbar.DragHandleStyle = dhDouble then begin + if Vertical then OffsetRect(GripR, 0, 3) + else OffsetRect(GripR, 3, 0); + Windows.DrawEdge(ACanvas.Handle, GripR, BDR_RAISEDINNER, BF_RECT); + ACanvas.Pixels[GripR.Left, GripR.Bottom - 1] := clBtnHighlight; + end; + + // Close button + if Toolbar.CloseButtonWhenDocked then begin + if Toolbar.CloseButtonDown then + Windows.DrawEdge(ACanvas.Handle, CloseR, BDR_SUNKENOUTER, BF_RECT) + else + if Toolbar. CloseButtonHover then + Windows.DrawEdge(ACanvas.Handle, CloseR, BDR_RAISEDINNER, BF_RECT); + if Toolbar.CloseButtonDown then OffsetRect(CloseR, 1, 1); + SpDrawGlyphPattern(ACanvas.Handle, CloseR, 7, 7, Pattern[0], clBtnText); + end; + end; + sknWindows: + begin + // Since GetThemePartSize does not seem to work properly, assume we use default + // WindowsXP themes where the gripper pattern repeats itself every 4 pixels + if Vertical then begin + OffsetRect(GripR, -1, 0); + GripR := SpCenterRectVert(GripR, 6); + Z := GripR.Right - GripR.Left; + GripR.Left := GripR.Left - 1 + (Z and $3) shr 1; + GripR.Right := GripR.Left + Z and not $3 + 2; + end + else begin + OffsetRect(GripR, 0, -1); + GripR := SpCenterRectHoriz(GripR, 6); + Z := GripR.Bottom - GripR.Top; + GripR.Top := GripR.Top - 1 + (Z and $3) shr 1; + GripR.Bottom := GripR.Top + Z and not $3 + 1; + end; + DrawThemeBackground(ThemeServices.Theme[teRebar], ACanvas.Handle, GripperPart[Vertical], 0, GripR, nil); + + // Close button + if Toolbar.CloseButtonWhenDocked then begin + Flags := TS_NORMAL; + if Toolbar.CloseButtonDown then Flags := TS_PRESSED + else if Toolbar.CloseButtonHover then Flags := TS_HOT; + DrawThemeBackground(ThemeServices.Theme[teToolbar], ACanvas.Handle, TP_BUTTON, Flags, CloseR, nil); + if Toolbar.CloseButtonDown then OffsetRect(CloseR, 1, 1); + SpDrawGlyphPattern(ACanvas.Handle, CloseR, 7, 7, Pattern[0], clBtnText); + end; + end; + sknSkin: + begin + if Vertical then begin + InflateRect(GripR, -3, 0); + OffsetRect(GripR, 0, 2); + GripR := SpCenterRectVert(GripR, 4); + end + else begin + InflateRect(GripR, 0, -3); + OffsetRect(GripR, 2, 0); + GripR := SpCenterRectHoriz(GripR, 4); + end; + C1 := SkinManager.CurrentSkin.Options(skncToolbarGrip).Body.Color1; + C2 := SkinManager.CurrentSkin.Options(skncToolbarGrip).Body.Color2; + SpDrawXPGrip(ACanvas, GripR, C1, C2); + + // Close button + if Toolbar.CloseButtonWhenDocked then begin + State := sknsNormal; + if Toolbar.CloseButtonDown then State := sknsPushed + else if Toolbar.CloseButtonHover then State := sknsHotTrack; + CurrentSkin.PaintBackground(ACanvas, CloseR, skncToolbarItem, State, True, True); + if Toolbar.CloseButtonDown then OffsetRect(CloseR, 1, 1); + PatternColor := CurrentSkin.GetTextColor(skncToolbarItem, State); + SpDrawGlyphPattern(ACanvas.Handle, CloseR, 7, 7, Pattern[0], PatternColor); + end; + end; + end; + end; +end; + +procedure SpDrawXPTooltipBackground(ACanvas: TCanvas; ARect: TRect); +var + ClipRect: TRect; +begin + if SpIsWinVistaOrUp and ThemeServices.ThemesEnabled then begin + // Paint Vista gradient background if themes enabled + ClipRect := ARect; + InflateRect(ARect, 4, 4); + DrawThemeBackground(ThemeServices.Theme[teToolTip], ACanvas.Handle, TTP_STANDARD, TTSS_NORMAL, ARect, @ClipRect); + end + else + ACanvas.FillRect(ARect); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Menu helpers } + +function SpCalcPopupPosition(const X, Y, Width, Height: Integer; + PopupControl: TControl = nil; IsVertical: Boolean = False): TPoint; +var + R, MonitorR: TRect; +begin + if Assigned(PopupControl) then begin + Result := Point(0, 0); + if PopupControl.Parent = nil then Exit; + + R := PopupControl.BoundsRect; + R.TopLeft := PopupControl.Parent.ClientToScreen(R.TopLeft); + R.BottomRight := PopupControl.Parent.ClientToScreen(R.BottomRight); + + if IsVertical then + Result := Point(R.Right, R.Top) + else + Result := Point(R.Left, R.Bottom); + + MonitorR := GetRectOfMonitorContainingPoint(Result, True); + + if IsVertical then begin + if Result.X + Width > MonitorR.Right then + Result.X := R.Left - Width; + if Result.Y + Height > MonitorR.Bottom then + if R.Bottom > MonitorR.Bottom then + Result.Y := MonitorR.Bottom - Height + else + Result.Y := R.Bottom - Height; + end + else begin + if Result.X + Width > MonitorR.Right then + if R.Right > MonitorR.Right then + Result.X := MonitorR.Right - Width + else + Result.X := R.Right - Width; + if Result.Y + Height > MonitorR.Bottom then + Result.Y := R.Top - Height; + end; + end + else begin + Result := Point(X, Y); + MonitorR := GetRectOfMonitorContainingPoint(Result, True); + if X + Width > MonitorR.Right then + Result.X := X - Width; + if Y + Height > MonitorR.Bottom then + Result.Y := Y - Height; + end; +end; + +function SpHMenuGetCaption(Menu: HMenu; Index: Integer): WideString; +var + AnsiBuf: array[0..MAX_PATH] of AnsiChar; + WideBuf: array[0..MAX_PATH] of WideChar; + Size: Integer; +begin + Result := ''; + if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then begin + FillChar(AnsiBuf, MAX_PATH, #0); + GetMenuStringA(Menu, Index, @AnsiBuf, MAX_PATH, MF_BYPOSITION); + Size := lstrlenA(@AnsiBuf); + Result := WideString(AnsiBuf); + SetLength(Result, Size); + end + else begin + // [Bugfix] Windows bug: + // GetMenuStringW when a DBCS code page is active (e.g. Japanese) + // the result of the function is incorrect (it returns Size * 2) + // http://news.jrsoftware.org/read/article.php?id=12268&group=jrsoftware.toolbar2000.thirdparty + FillChar(WideBuf, MAX_PATH, #0); + GetMenuStringW(Menu, Index, @WideBuf, MAX_PATH, MF_BYPOSITION); + Size := lstrlenW(@WideBuf); + Result := WideBuf; + SetLength(Result, Size); + end; +end; + +function SpHMenuToTBMenuItem(Menu: HMenu; ParentItem: TTBCustomItem): Boolean; +var + MenuInfo: TMenuItemInfo; + I, C: Integer; + Item: TSpTBXItem; + HasSubMenu: Boolean; +begin + Result := False; + if not Assigned(ParentItem) or not IsMenu(Menu) then Exit; + + C := GetMenuItemCount(Menu); + + for I := 0 to C - 1 do begin + FillChar(MenuInfo, SizeOf(MenuInfo), #0); + MenuInfo.cbSize := SizeOf(MenuInfo); + MenuInfo.fMask := MIIM_TYPE or MIIM_STATE or MIIM_ID or MIIM_SUBMENU; + GetMenuItemInfo(Menu, I, True, MenuInfo); + + if MenuInfo.fType and MFT_SEPARATOR <> 0 then + ParentItem.Add(TSpTBXSeparatorItem.Create(nil)) + else begin + HasSubmenu := IsMenu(MenuInfo.hSubMenu); + if HasSubmenu then + Item := TSpTBXSubmenuItem.Create(nil) + else + Item := TSpTBXItem.Create(nil); + + Item.Caption := SpHMenuGetCaption(Menu, I); + Item.Tag := MenuInfo.wID; + if MenuInfo.fState and MFS_DISABLED <> 0 then + Item.Enabled := False; + if MenuInfo.fState and MFS_CHECKED <> 0 then + Item.Checked := True; + if MenuInfo.fState and MFS_DEFAULT <> 0 then + Item.Options := Item.Options + [tboDefault]; + ParentItem.Add(Item); + end; + end; + + Result := True; +end; + +function SpShowSystemPopupMenu(ParentForm: TCustomForm; ScreenPos: TPoint; DoDefault: Boolean = True): Integer; +var + SysMenu: HMENU; +begin + ReleaseCapture; + SysMenu := GetSystemMenu(ParentForm.Handle, False); + case ParentForm.WindowState of + wsMaximized: + begin + EnableMenuItem(SysMenu, SC_RESTORE, MF_ENABLED); + EnableMenuItem(SysMenu, SC_MAXIMIZE, MF_GRAYED); + EnableMenuItem(SysMenu, SC_MOVE, MF_GRAYED); + EnableMenuItem(SysMenu, SC_SIZE, MF_GRAYED); + end; + wsNormal: + begin + EnableMenuItem(SysMenu, SC_RESTORE, MF_GRAYED); + EnableMenuItem(SysMenu, SC_MAXIMIZE, MF_ENABLED); + EnableMenuItem(SysMenu, SC_MOVE, MF_ENABLED); + EnableMenuItem(SysMenu, SC_SIZE, MF_ENABLED); + end; + end; + Result := Integer(TrackPopupMenuEx(SysMenu, TPM_LEFTALIGN or TPM_RETURNCMD or + TPM_RIGHTBUTTON or TPM_HORIZONTAL or TPM_VERTICAL, ScreenPos.X, ScreenPos.Y, ParentForm.Handle, nil)); + if DoDefault then + case Result of + SC_MAXIMIZE: ParentForm.WindowState := wsMaximized; + SC_RESTORE: ParentForm.WindowState := wsNormal; + else + // WindowState := wsMinimized will not minimize the app correctly + SendMessage(ParentForm.Handle, WM_SYSCOMMAND, Result, 0); + end; +end; + +function SpFillSystemSpTBXPopup(ParentForm: TCustomForm; ParentItem: TTBCustomItem; + ShowSize, ShowMinimize, ShowMaximize, ShowClose: Boolean; ClickEvent: TNotifyEvent = nil): Boolean; +var + Menu: HMENU; + I: Integer; + Item: TTBCustomItem; +begin + Result := False; + Menu := GetSystemMenu(ParentForm.Handle, False); + + if SpHMenuToTBMenuItem(Menu, ParentItem) then begin + for I := 0 to ParentItem.Count - 1 do begin + Item := ParentItem.Items[I]; + Item.OnClick := ClickEvent; + case Item.Tag of + SC_MINIMIZE: + begin + Item.Visible := ShowMinimize; + Item.Enabled := ParentForm.WindowState <> wsMinimized; + Item.Images := MDIButtonsImgList; + Item.ImageIndex := 2; + end; + SC_RESTORE: + begin + Item.Visible := ShowMaximize; + Item.Enabled := ParentForm.WindowState <> wsNormal; + Item.Images := MDIButtonsImgList; + Item.ImageIndex := 3; + end; + SC_MAXIMIZE: + begin + Item.Visible := ShowMaximize; + Item.Enabled := ParentForm.WindowState <> wsMaximized; + Item.Images := MDIButtonsImgList; + Item.ImageIndex := 1; + end; + SC_CLOSE: + begin + Item.Visible := ShowClose; + Item.Options := Item.Options + [tboDefault]; + Item.Images := MDIButtonsImgList; + Item.ImageIndex := 0; + end; + SC_MOVE: + begin + Item.Enabled := ParentForm.WindowState <> wsMaximized; + end; + SC_SIZE: + begin + Item.Visible := ShowSize; + Item.Enabled := ParentForm.WindowState <> wsMaximized; + end; + end; + end; + + Result := True; + end; +end; + +function SpShowSystemSpTBXPopupMenu(ParentForm: TCustomForm; ScreenPos: TPoint; + ShowSize, ShowMinimize, ShowMaximize, ShowClose: Boolean; + PopupEvent: TSpTBXPopupEvent; DoDefault: Boolean = True): Integer; +var + Popup: TSpTBXPopupMenu; + ClickedItem: TTBCustomItem; +begin + Result := 0; + ReleaseCapture; + + Popup := TSpTBXPopupMenu.Create(ParentForm); + try + if SpFillSystemSpTBXPopup(ParentForm, Popup.Items, ShowSize, ShowMinimize, ShowMaximize, ShowClose) then begin + if Assigned(PopupEvent) then + Popup.OnInitPopup := PopupEvent; + Popup.PopupComponent := ParentForm; + ClickedItem := Popup.PopupEx(ScreenPos.X, ScreenPos.Y, nil, True); + if Assigned(ClickedItem) then begin + Result := ClickedItem.Tag; + // If it's not a SystemMenu item fire the OnClick event of the item + // We can't use PostClick because the Item will be destroyed by the + // time the message is handled. + if (Result < SC_SIZE) or (Result > SC_CONTEXTHELP) then + ClickedItem.Click; + end; + end; + finally + Popup.Free; + end; + + if DoDefault and (Result > 0) then + case Result of + SC_MAXIMIZE: + ParentForm.WindowState := wsMaximized; + SC_RESTORE: + ParentForm.WindowState := wsNormal; + SC_SIZE, SC_MOVE, SC_MINIMIZE, SC_CLOSE: + begin + // WindowState := wsMinimized will not minimize the app correctly + SendMessage(ParentForm.Handle, WM_SYSCOMMAND, Result, 0); + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Misc helpers } + +procedure SpActivateDwmNC(WinControl: TWinControl; Activate: Boolean); +{$IFDEF JR_D11} +var + ncrp: Cardinal; +{$ENDIF} +begin + {$IFDEF JR_D11} + // Use the new API on Windows Vista + if DwmCompositionEnabled and WinControl.HandleAllocated then begin + if Activate then + ncrp := DWMNCRP_USEWINDOWSTYLE + else + ncrp := DWMNCRP_DISABLED; + DwmSetWindowAttribute(WinControl.Handle, DWMWA_NCRENDERING_POLICY, @ncrp, SizeOf(ncrp)); + end; + {$ENDIF} +end; + +function SpIsDwmCompositionEnabled: Boolean; +begin + {$IFDEF JR_D11} + // Use the new API on Windows Vista + Result := DwmCompositionEnabled; + {$ELSE} + Result := False; + {$ENDIF} +end; + +function SpCanFocus(WinControl: TWinControl): Boolean; +var + Form: TCustomForm; +begin + Result := False; + if Assigned(WinControl) and not WinControl.Focused then begin + Form := GetParentForm(WinControl); + if Assigned(Form) and Form.Enabled and Form.Visible then + Result := WinControl.CanFocus; + end; +end; + +function SpIsFocused(WinControl: TWinControl; out FocusedChild: TWinControl): Boolean; +var + Form: TCustomForm; +begin + Result := False; + FocusedChild := nil; + if WinControl.Focused then + Result := True + else begin + Form := GetParentForm(WinControl); + if Assigned(Form) and Form.Enabled and Form.Visible then + if Assigned(Form.ActiveControl) and Form.ActiveControl.Focused then + if IsChild(WinControl.Handle, Form.ActiveControl.Handle) then begin + Result := True; + FocusedChild := Form.ActiveControl; + end; + end; +end; + +function SpFocusFirstChild(WinControl: TWinControl): TWinControl; +var + Form: TCustomForm; +begin + Result := nil; + Form := GetParentForm(WinControl); + if Assigned(Form) and Form.Enabled and Form.Visible then begin + TWinControlAccess(WinControl).SelectFirst; + Result := Form.ActiveControl; + end; +end; + +function SpFindControl(Parent: TWinControl; Child: TControl): Integer; +var + I: Integer; +begin + Result := -1; + for I := 0 to Parent.ControlCount - 1 do + if Parent.Controls[I] = Child then begin + Result := I; + Break; + end; +end; + +function SpFindParent(Control: TControl; ParentClass: TClass): TWinControl; +var + P: TWinControl; +begin + Result := nil; + if Assigned(Control) then begin + P := Control.Parent; + while Assigned(P) do + if P is ParentClass then begin + Result := P; + Break; + end + else + P := P.Parent; + end; +end; + +function SpHasBorders(WinControl: TWinControl): Boolean; +var + Style, ExStyle: Integer; +begin + Result := False; + Style := GetWindowLong(WinControl.Handle, GWL_STYLE); + ExStyle := GetWindowLong(WinControl.Handle, GWL_EXSTYLE); + + if (Style and WS_BORDER <> 0) or (ExStyle and WS_EX_CLIENTEDGE <> 0) then + Result := True; +end; + +function SpGetFormWindowState(F: TCustomForm; out RestoreBoundsRect: TRect): TWindowState; +// This method is more accurate than Form.WindowState +var + P: TWindowPlacement; +begin + Result := wsNormal; + RestoreBoundsRect := Rect(0, 0, 0, 0); + if Assigned(F) and (F.HandleAllocated) then begin + P.Length := SizeOf(TWindowPlacement); + if GetWindowPlacement(F.Handle, @P) then begin + case P.showCmd of + SW_SHOWMINIMIZED: Result := wsMinimized; + SW_SHOWMAXIMIZED: Result := wsMaximized; + end; + // rcNormalPosition contains the window's coordinates when the window is in the restored position + with P.rcNormalPosition do + RestoreBoundsRect := Rect(Left, Top, Right - Left, Bottom - Top); + end; + end; +end; + +procedure SpSetFormWindowState(F: TCustomForm; WindowState: TWindowState; RestoreBoundsRect: TRect); +// This method is more accurate than Form.WindowState +var + P: TWindowPlacement; +begin + if Assigned(F) and (F.HandleAllocated) then begin + P.Length := SizeOf(TWindowPlacement); + case WindowState of + wsMinimized: P.showCmd := SW_SHOWMINIMIZED; + wsMaximized: P.showCmd := SW_SHOWMAXIMIZED; + else + P.showCmd := SW_SHOWNORMAL; + end; + // rcNormalPosition contains the window's coordinates when the window is in the restored position + if not IsRectEmpty(RestoreBoundsRect) then + with RestoreBoundsRect do + P.rcNormalPosition := Bounds(Left, Top, Right, Bottom); + + SetWindowPlacement(F.Handle, @P); + end; +end; + +function SpGetTaskBar(out State, Edge: Cardinal; out Bounds: TRect): Boolean; +// Returns the TaskBar state and bounds +// State can be: 0, ABS_ALWAYSONTOP, ABS_AUTOHIDE +// Edge can be: ABE_LEFT, ABE_RIGHT, ABE_TOP, ABE_BOTTOM +// ABM_GETSTATE + +var + AppData: TAppBarData; +begin + Result := False; + State := 0; + Edge := 0; + Bounds := Rect(0, 0, 0, 0); + + // 'Shell_TrayWnd' is the name of the task bar's window + AppData.Hwnd := FindWindow('Shell_TrayWnd', nil); + if AppData.Hwnd <> 0 then begin + AppData.cbSize := SizeOf(TAppBarData); + if SHAppBarMessage(ABM_GETTASKBARPOS, AppData) <> 0 then begin + Edge := AppData.uEdge; + Bounds := AppData.rc; + + AppData.cbSize := SizeOf(TAppBarData); + State := SHAppBarMessage(ABM_GETSTATE, AppData); + + Result := True; + end; + end; +end; + +procedure SpRecalcNCArea(WinControl: TWinControl); +begin + if WinControl.HandleAllocated then + SetWindowPos(WinControl.Handle, 0, 0, 0, 0, 0, SWP_FRAMECHANGED or + SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Customizer helpers } + +procedure SpCustomizeAllToolbars(AParentComponent: TComponent; Reset: Boolean); +var + I: Integer; + TB: TSpTBXToolbar; +begin + if Assigned(AParentComponent) then begin + for I := 0 to AParentComponent.ComponentCount - 1 do + if AParentComponent.Components[I] is TSpTBXToolbar then begin + TB := AParentComponent.Components[I] as TSpTBXToolbar; + if Reset then + TB.EndCustomize + else + TB.BeginCustomize; + end; + end; +end; + +procedure SpBeginUpdateAllToolbars(AParentComponent: TComponent); +var + I: Integer; + TB: TTBCustomToolbar; +begin + if Assigned(AParentComponent) then begin + for I := 0 to AParentComponent.ComponentCount - 1 do + if AParentComponent.Components[I] is TTBCustomToolbar then begin + TB := AParentComponent.Components[I] as TTBCustomToolbar; + TB.BeginUpdate; + end; + end; +end; + +procedure SpEndUpdateAllToolbars(AParentComponent: TComponent); +var + I: Integer; + TB: TTBCustomToolbar; +begin + if Assigned(AParentComponent) then begin + for I := 0 to AParentComponent.ComponentCount - 1 do + if AParentComponent.Components[I] is TTBCustomToolbar then begin + TB := AParentComponent.Components[I] as TTBCustomToolbar; + TB.View.UpdatePositions; + TB.EndUpdate; + TB.Invalidate; + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Unicode helpers } + +procedure SpPersistent_AfterInherited_DefineProperties(Filer: TFiler; Instance: TPersistent); +begin + {$IFNDEF UNICODE} + // Don't let the streaming system store the WideStrings, + // we need to store them manually + TntPersistent_AfterInherited_DefineProperties(Filer, Instance); + {$ENDIF} +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXFontSettings } + +constructor TSpTBXFontSettings.Create; +begin + FSize := 100; + FColor := clNone; +end; + +procedure TSpTBXFontSettings.Apply(AFont: TFont); +begin + AFont.Charset := DEFAULT_CHARSET; + AFont.Color := FColor; + if FSize <> 100 then + AFont.Size := (AFont.Size * FSize + 50) div 100; + if FName <> '' then + AFont.Name := Name; + if FStyle <> [] then + AFont.Style := FStyle; +end; + +procedure TSpTBXFontSettings.Assign(Src: TPersistent); +var + F: TSpTBXFontSettings; +begin + if Src is TPersistent then begin + F := TSpTBXFontSettings(Src); + FColor := F.Color; + FName := F.Name; + FSize := F.Size; + FStyle := F.Style; + Modified; + end + else + inherited; +end; + +procedure TSpTBXFontSettings.Modified; +begin + if Assigned(FOnChange) then FOnChange(Self); +end; + +procedure TSpTBXFontSettings.SetColor(Value: TColor); +begin + if FColor <> Value then begin + FColor := Value; + Modified; + end; +end; + +procedure TSpTBXFontSettings.SetName(const Value: TFontName); +begin + if FName <> Value then begin + FName := Value; + Modified; + end; +end; + +procedure TSpTBXFontSettings.SetSize(Value: TSpTBXFontSize); +begin + if FSize <> Value then begin + FSize := Value; + Modified; + end; +end; + +procedure TSpTBXFontSettings.SetStyle(const Value: TFontStyles); +begin + if FStyle <> Value then begin + FStyle := Value; + Modified; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomDragObject } + +constructor TSpTBXCustomDragObject.Create(ASourceControl: TControl; AItem: TTBCustomItem); +begin + FSourceControl := ASourceControl; + FSourceItem := AItem; + FDragCursorAccept := crSpTBXCustomization; + FDragCursorCancel := crNo; +end; + +procedure TSpTBXCustomDragObject.Finished(Target: TObject; X, Y: Integer; + Accepted: Boolean); +begin + inherited; + if not Accepted then begin + if Assigned(FSourceControl) then + TControlAccess(FSourceControl).DragCanceled; + Target := nil; + end; + + if Assigned(FSourceControl) then + TControlAccess(FSourceControl).DoEndDrag(Target, X, Y); +end; + +function TSpTBXCustomDragObject.GetDragCursor(Accepted: Boolean; X, + Y: Integer): TCursor; +begin + if Accepted then Result := FDragCursorAccept + else Result := FDragCursorCancel; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomItemActionLink } + +{$IFNDEF UNICODE} +procedure TSpTBXCustomItemActionLink.AssignClient(AClient: TObject); +begin + inherited AssignClient(AClient); + FUnicodeClient := AClient as TSpTBXCustomItem; +end; + +function TSpTBXCustomItemActionLink.IsCaptionLinked: Boolean; +begin + if (Action is TCustomAction) and Supports(Action, ITntAction) then + Result := FUnicodeClient.Caption = TntActnList.TntAction_GetCaption(Action as TCustomAction) + else + Result := inherited IsCaptionLinked; +end; + +function TSpTBXCustomItemActionLink.IsHintLinked: Boolean; +begin + if (Action is TCustomAction) and Supports(Action, ITntAction) then + Result := FUnicodeClient.Hint = TntActnList.TntAction_GetHint(Action as TCustomAction) + else + Result := inherited IsCaptionLinked; +end; + +procedure TSpTBXCustomItemActionLink.SetCaption(const Value: String); +begin + if IsCaptionLinked then + if (Action is TCustomAction) and Supports(Action, ITntAction) then + FUnicodeClient.Caption := TntActnList.TntAction_GetNewCaption(Action as TCustomAction, Value) + else + FUnicodeClient.Caption := Value; +end; + +procedure TSpTBXCustomItemActionLink.SetHint(const Value: String); +begin + if IsHintLinked then + if (Action is TCustomAction) and Supports(Action, ITntAction) then + FUnicodeClient.Hint := TntActnList.TntAction_GetNewHint(Action as TCustomAction, Value) + else + FUnicodeClient.Hint := Value; +end; +{$ENDIF} + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomControl } + +{$IFNDEF UNICODE} +procedure TSpTBXCustomControl.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle(Self, Params, ''); +end; + +procedure TSpTBXCustomControl.DefineProperties(Filer: TFiler); +begin + inherited; + // Don't let the streaming system store the WideStrings, + // we need to store them manually + SpPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +procedure TSpTBXCustomControl.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + if (Action is TCustomAction) and Supports(Action, ITntAction) then begin + if not CheckDefaults or (Self.Caption = '') then + Self.Caption := TntActnList.TntAction_GetCaption(Action as TCustomAction); + if not CheckDefaults or (Self.Hint = '') then + Self.Hint := TntActnList.TntAction_GetHint(Action as TCustomAction); + end; + // Call inherited after we changed the unicode Caption and Hint + inherited; +end; + +function TSpTBXCustomControl.IsCaptionStored: Boolean; +begin + Result := TntControl_IsCaptionStored(Self); +end; + +function TSpTBXCustomControl.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TSpTBXCustomControl.GetCaption: TWideCaption; +begin + Result := TntControl_GetText(Self); +end; + +function TSpTBXCustomControl.GetHint: WideString; +begin + Result := TntControl_GetHint(Self); +end; + +procedure TSpTBXCustomControl.SetCaption(const Value: TWideCaption); +begin + TntControl_SetText(Self, Value); +end; + +procedure TSpTBXCustomControl.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; +{$ENDIF} + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomItem } + +constructor TSpTBXCustomItem.Create(AOwner: TComponent); +begin + inherited; + FFontSettings := TSpTBXFontSettings.Create; + FFontSettings.OnChange := FontSettingsChanged; + + {$IFNDEF UNICODE} + FCaption := ''; + {$ENDIF} + FAlignment := taCenter; + FCaptionGlowColor := clYellow; + FCustomWidth := -1; + FCustomHeight := -1; + FMargins := 0; + SetStretch(True); + FWrapping := twWrap; +end; + +destructor TSpTBXCustomItem.Destroy; +begin + FreeAndNil(FFontSettings); + inherited; +end; + +procedure TSpTBXCustomItem.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if (Operation = opRemove) and (AComponent = Control) then Control := nil; +end; + +procedure TSpTBXCustomItem.DefineProperties(Filer: TFiler); +begin + inherited; + // Don't let the streaming system store the WideStrings, + // we need to store them manually + SpPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +procedure TSpTBXCustomItem.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + {$IFNDEF UNICODE} + if (Action is TCustomAction) and Supports(Action, ITntAction) then begin + if not CheckDefaults or (Self.Caption = '') then + Self.Caption := TntActnList.TntAction_GetCaption(Action as TCustomAction); + if not CheckDefaults or (Self.Hint = '') then + Self.Hint := TntActnList.TntAction_GetHint(Action as TCustomAction); + inherited; + Exit; + end; + {$ENDIF} + + if Action is TCustomAction then + with TCustomAction(Sender) do begin + if not CheckDefaults or (Self.Caption = '') then + Self.Caption := Caption; + if not CheckDefaults or (Self.Hint = '') then + Self.Hint := Hint; + end; + inherited; +end; + +function TSpTBXCustomItem.DialogChar(CharCode: Word): Boolean; +begin + Result := False; +end; + +procedure TSpTBXCustomItem.DoDrawAdjustFont(AFont: TFont; State: TSpTBXSkinStatesType); +begin + // Do nothing +end; + +procedure TSpTBXCustomItem.DoDrawHint(AHintBitmap: TBitmap; var AHint: Widestring; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawHint) then FOnDrawHint(Self, AHintBitmap, AHint, PaintDefault); +end; + +procedure TSpTBXCustomItem.DoDrawButton(ACanvas: TCanvas; ARect: TRect; + ItemInfo: TSpTBXMenuItemInfo; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawItem) then FOnDrawItem(Self, ACanvas, ARect, ItemInfo, PaintStage, PaintDefault); +end; + +procedure TSpTBXCustomItem.DoDrawCaption(ACanvas: TCanvas; ClientAreaRect: TRect; + State: TSpTBXSkinStatesType; var ACaption: WideString; var CaptionRect: TRect; var CaptionFormat: Cardinal; + IsTextRotated: Boolean; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawCaption) then FOnDrawCaption(Self, ACanvas, ClientAreaRect, + State, ACaption, CaptionRect, CaptionFormat, IsTextRotated, PaintStage, PaintDefault); +end; + +procedure TSpTBXCustomItem.DoDrawImage(ACanvas: TCanvas; + State: TSpTBXSkinStatesType; const PaintStage: TSpTBXPaintStage; + var AImageList: TCustomImageList; var AImageIndex: Integer; + var ARect: TRect; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawImage) then FOnDrawImage(Self, ACanvas, State, PaintStage, + AImageList, AImageIndex, ARect, PaintDefault); +end; + +procedure TSpTBXCustomItem.DoPopupShowingChanged(APopupWindow: TTBPopupWindow; IsVisible: Boolean); +// This method is called by TSpTBXPopupWindow when the popup is Opened and Closed +begin + if Assigned(APopupWindow) then begin + if IsVisible then begin + if Assigned(FOnInitPopup) then FOnInitPopup(Self, APopupWindow.View); + end + else begin + if Assigned(FOnClosePopup) then FOnClosePopup(Self); + end; + end; +end; + +procedure TSpTBXCustomItem.FontSettingsChanged(Sender: TObject); +begin + Change(True); +end; + +function TSpTBXCustomItem.GetActionLinkClass: TTBCustomItemActionLinkClass; +begin + Result := TSpTBXCustomItemActionLink; +end; + +function TSpTBXCustomItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + Result := TSpTBXItemViewer; +end; + +function TSpTBXCustomItem.GetPopupWindowClass: TTBPopupWindowClass; +begin + Result := TSpTBXPopupWindow; +end; + +function TSpTBXCustomItem.GetShortCutText: WideString; +var + P: Integer; +begin + P := Pos(#9, Caption); + if (P = 0) or (P = Length(Caption)) then begin + if ShortCut <> 0 then + Result := ShortCutToText(ShortCut) + else + Result := ''; + end + else + Result := Copy(Caption, P+1, Maxint); +end; + +procedure TSpTBXCustomItem.Click; +begin + if Assigned(FControl) then ToggleControl; + inherited; +end; + +procedure TSpTBXCustomItem.InitiateAction; +begin + inherited; + UpdateProps; +end; + +procedure TSpTBXCustomItem.Invalidate; +begin + Change(False); +end; + +{$IFNDEF UNICODE} +function TSpTBXCustomItem.IsCaptionStored: Boolean; +begin + Result := (ActionLink = nil) or not TActionLinkAccess(ActionLink).IsCaptionLinked; +end; + +function TSpTBXCustomItem.IsHintStored: Boolean; +begin + Result := (ActionLink = nil) or not TActionLinkAccess(ActionLink).IsHintLinked; +end; + +procedure TSpTBXCustomItem.SetCaption(const Value: WideString); +var + S, PrevS: string; +begin + if FCaption <> Value then begin + FCaption := Value; + // We need to compare the Ansi inherited Caption + // to force the change. + // Sometimes '???' = '???' and the change is not executed. + S := inherited Caption; + PrevS := Value; + if S <> PrevS then + inherited Caption := Value + else + Change(True); + end; +end; + +procedure TSpTBXCustomItem.SetHint(const Value: WideString); +begin + if FHint <> Value then begin + FHint := Value; + inherited Hint := Value; + end; +end; +{$ENDIF} + +procedure TSpTBXCustomItem.SetAlignment(const Value: TAlignment); +begin + if FAlignment <> Value then begin + FAlignment := Value; + Change(False); + end; +end; + +procedure TSpTBXCustomItem.SetAnchored(const Value: Boolean); +begin + if FAnchored <> Value then begin + FAnchored := Value; + end; +end; + +procedure TSpTBXCustomItem.SetCaptionGlow(const Value: TSpGlowDirection); +begin + if FCaptionGlow <> Value then begin + FCaptionGlow := Value; + Change(False); + end; +end; + +procedure TSpTBXCustomItem.SetCaptionGlowColor(const Value: TColor); +begin + if FCaptionGlowColor <> Value then begin + FCaptionGlowColor := Value; + Change(False); + end; +end; + +procedure TSpTBXCustomItem.SetControl(const Value: TControl); +begin + if FControl <> Value then + begin + FControl := Value; + if Assigned(Value) then + Value.FreeNotification(Self); + UpdateProps; + end; +end; + +procedure TSpTBXCustomItem.SetCustomWidth(Value: Integer); +begin + if Value < -1 then Value := -1; + if FCustomWidth <> Value then begin + FCustomWidth := Value; + Change(True); + end; +end; + +procedure TSpTBXCustomItem.SetCustomHeight(Value: Integer); +begin + if Value < -1 then Value := -1; + if FCustomHeight <> Value then begin + FCustomHeight := Value; + Change(True); + end; +end; + +procedure TSpTBXCustomItem.SetFontSettings(const Value: TSpTBXFontSettings); +begin + FFontSettings.Assign(Value); +end; + +procedure TSpTBXCustomItem.SetMargins(Value: Integer); +begin + if FMargins <> Value then begin + FMargins := Value; + Change(True); + end; +end; + +procedure TSpTBXCustomItem.SetMinHeight(const Value: Integer); +begin + if Value <> FMinHeight then begin + FMinHeight := Value; + Change(True); + end; +end; + +procedure TSpTBXCustomItem.SetMinWidth(const Value: Integer); +begin + if Value <> FMinWidth then begin + FMinWidth := Value; + Change(True); + end; +end; + +procedure TSpTBXCustomItem.SetStretch(const Value: Boolean); +begin + if FStretch <> Value then begin + FStretch := Value; + Change(True); + end; +end; + +procedure TSpTBXCustomItem.SetToolBoxPopup(const Value: Boolean); +begin + FToolBoxPopup := Value; + if FToolBoxPopup then + Options := Options + [tboToolbarStyle] + else + Options := Options - [tboToolbarStyle]; +end; + +procedure TSpTBXCustomItem.SetWrapping(const Value: TTextWrapping); +begin + if FWrapping <> Value then begin + FWrapping := Value; + Change(False); + end; +end; + +procedure TSpTBXCustomItem.ToggleControl; +begin + FControl.Visible := not FControl.Visible; +end; + +procedure TSpTBXCustomItem.UpdateProps; +begin + if Assigned(Control) then + if (ComponentState * [csDesigning, csLoading, csDestroying] = []) then + Checked := Control.Visible; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXItemViewer } + +function TSpTBXItemViewer.CaptionShown: Boolean; +var + T: TSpTBXToolbar; +begin + Result := inherited CaptionShown; + + if Assigned(View) and Assigned(View.Owner) and (View.Owner is TSpTBXToolbar) then begin + T := View.Owner as TSpTBXToolbar; + case T.DisplayMode of + tbdmImageOnly: + if GetImageShown then Result := False; + tbdmTextOnly: + Result := True; + end; + end; +end; + +function TSpTBXItemViewer.GetImageShown: Boolean; +begin + Result := (Item.ImageIndex >= 0) and + ((Item.DisplayMode in [nbdmDefault, nbdmImageAndText]) or + (IsToolbarStyle and (Item.DisplayMode = nbdmTextOnlyInMenus))); + + if Assigned(View) and Assigned(View.Owner) and (View.Owner is TSpTBXToolbar) then + if TSpTBXToolbar(View.Owner).DisplayMode = tbdmTextOnly then + Result := False; +end; + +function TSpTBXItemViewer.GetImageSize: TSize; +var + IL: TCustomImageList; +begin + IL := GetImageList; + if Assigned(IL) then begin + Result.cx := IL.Width; + Result.cy := IL.Height; + end + else begin + Result.cx := 0; + Result.cy := 0; + end; +end; + +function TSpTBXItemViewer.GetRightImageSize: TSize; +begin + Result.cx := 0; + Result.cy := 0; +end; + +procedure TSpTBXItemViewer.DoDrawButton(ACanvas: TCanvas; ARect: TRect; + ItemInfo: TSpTBXMenuItemInfo; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + Item.DoDrawButton(ACanvas, ARect, ItemInfo, PaintStage, PaintDefault); +end; + +procedure TSpTBXItemViewer.DoDrawCaption(ACanvas: TCanvas; ClientAreaRect: TRect; + State: TSpTBXSkinStatesType; var ACaption: WideString; var CaptionRect: TRect; var CaptionFormat: Cardinal; + IsTextRotated: Boolean; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + Item.DoDrawCaption(ACanvas, ClientAreaRect, State, ACaption, CaptionRect, + CaptionFormat, IsTextRotated, PaintStage, PaintDefault); +end; + +procedure TSpTBXItemViewer.DoDrawHint(AHintBitmap: TBitmap; CursorPos: TPoint; + var CursorRect: TRect; var AHint: Widestring; var PaintDefault: Boolean); +begin + Item.DoDrawHint(AHintBitmap, AHint, PaintDefault); +end; + +procedure TSpTBXItemViewer.DoDrawImage(ACanvas: TCanvas; + State: TSpTBXSkinStatesType; const PaintStage: TSpTBXPaintStage; + var AImageList: TCustomImageList; var AImageIndex: Integer; + var ARect: TRect; var PaintDefault: Boolean); +begin + Item.DoDrawImage(ACanvas, State, PaintStage, AImageList, AImageIndex, ARect, PaintDefault); +end; + +procedure TSpTBXItemViewer.DoDrawAdjustFont(AFont: TFont; State: TSpTBXSkinStatesType); +begin + Item.FontSettings.Apply(AFont); + + if tboDefault in Item.EffectiveOptions then + AFont.Style := AFont.Style + [fsBold]; + + if AFont.Color = clNone then + AFont.Color := GetTextColor(State); + + Item.DoDrawAdjustFont(AFont, State); +end; + +procedure TSpTBXItemViewer.DrawItemImage(ACanvas: TCanvas; ARect: TRect; + ItemInfo: TSpTBXMenuItemInfo; ImgIndex: Integer); +var + PaintDefault: Boolean; + ImgList: TCustomImageList; + PatternColor: TColor; +begin + ImgList := GetImageList; + + PaintDefault := True; + DoDrawImage(ACanvas, ItemInfo.State, pstPrePaint, ImgList, ImgIndex, ARect, PaintDefault); + if PaintDefault and Assigned(ImgList) then + if ImgList = MDIButtonsImgList then begin + if (Item.Enabled) and not IsToolbarStyle and (SkinManager.GetSkinType <> sknSkin) then + PatternColor := clMenuText + else + PatternColor := GetTextColor(ItemInfo.State); + SpDrawGlyphPattern(ACanvas, ARect, ImgIndex, PatternColor); + end + else + if (ImgIndex >= 0) and (ImgIndex < ImgList.Count) then + SpDrawXPMenuItemImage(ACanvas, ARect, ItemInfo, ImgList, ImgIndex); + PaintDefault := True; + DoDrawImage(ACanvas, ItemInfo.State, pstPostPaint, ImgList, ImgIndex, ARect, PaintDefault); +end; + +procedure TSpTBXItemViewer.DrawItemRightImage(ACanvas: TCanvas; ARect: TRect; + ItemInfo: TSpTBXMenuItemInfo); +begin + // Do nothing +end; + +procedure TSpTBXItemViewer.InternalCalcSize(const Canvas: TCanvas; + CalcStretch: Boolean; var AWidth, AHeight: Integer); +var + I, W, H: Integer; + DropDownArrowSize, DropDownArrowMargin, SplitBtnArrowSize: Integer; + ImgSize, RightImgSize: TSize; + GlyphTop, ToolbarStyle: Boolean; + WS: WideString; + TextMetric: TTextMetric; + MenuMargins: TSpTBXMenuItemMarginsInfo; + State: TSpTBXSkinStatesType; + IsHoverItem, IsOpen, IsPushed: Boolean; + TextInfo: TSpTBXTextInfo; + TB: TSpTBXToolbar; +begin + CurrentSkin.GetDropDownArrowSize(DropDownArrowSize, DropDownArrowMargin, SplitBtnArrowSize); + + ToolbarStyle := IsToolbarStyle; + + ImgSize := GetImageSize; + if (ImgSize.CX <= 0) or (ImgSize.CY <= 0) then begin + ImgSize.CX := 0; + ImgSize.CY := 0; + end; + RightImgSize := GetRightImageSize; + if (RightImgSize.CX <= 0) or (RightImgSize.CY <= 0) then begin + RightImgSize.CX := 0; + RightImgSize.CY := 0; + end; + + GlyphTop := False; + if tboImageAboveCaption in Item.EffectiveOptions then + GlyphTop := True; + + // Setup font and get the text info + IsOpen := Self = View.OpenViewer; + IsHoverItem := Self = View.Selected; + IsPushed := IsHoverItem and (IsOpen or (View.MouseOverSelected and View.Capture)); + State := CurrentSkin.GetState(Item.Enabled, IsPushed, IsHoverItem, Item.Checked); + GetTextInfo(Canvas, State, TextInfo); + + // Measure size + if ToolbarStyle then begin + AWidth := 6; + AHeight := 6; + + if CaptionShown then begin + Inc(AWidth, TextInfo.TextSize.CX); + Inc(AHeight, TextInfo.TextSize.CY); + if not TextInfo.IsTextRotated then Inc(AWidth, 4) + else Inc(AHeight, 4); + end; + + if GetImageShown and (ImgSize.CX > 0) and (ImgSize.CY > 0) then begin + if not GlyphTop then begin + if not TextInfo.IsTextRotated then begin + Inc(AWidth, ImgSize.CX); + Inc(AWidth); + if AHeight < ImgSize.CY + 6 then AHeight := ImgSize.CY + 6; + end + else begin + Inc(AHeight, ImgSize.CY); + Inc(AHeight); + if AWidth < ImgSize.CX + 6 then AWidth := ImgSize.CX + 6; + end; + end + else begin + Inc(AHeight, ImgSize.CY); + if AWidth < ImgSize.CX + 7 then AWidth := ImgSize.CX + 7; + end; + end; + + if (RightImgSize.cx > 0) and (RightImgSize.cy > 0) then begin + if View.Orientation = tbvoVertical then + Inc(AHeight, 4 + RightImgSize.cy) + else + Inc(AWidth, 4 + RightImgSize.cx); + end; + + if (tbisSubmenu in Item.ItemStyle) and (tbisCombo in Item.ItemStyle) then + Inc(AWidth, SplitBtnArrowSize) + else begin + if tboDropdownArrow in Item.Options then + if not GlyphTop or (ImgSize.CX = 0) or TextInfo.IsTextRotated then begin + if View.Orientation = tbvoVertical then Inc(AHeight, DropDownArrowSize) + else Inc(AWidth, DropDownArrowSize); + end + else + if GlyphTop and (TextInfo.IsTextRotated xor (View.Orientation <> tbvoVertical)) then begin + W := ImgSize.CX + DropDownArrowSize + 2; + if W > AWidth - 7 then AWidth := W + 7; + end + else begin + H := ImgSize.CY + DropDownArrowSize + 2; + if H > AHeight - 7 then AHeight := H + 7; + end; + end; + + // Widen MenuBar SubMenuItems + if (tbisSubmenu in Item.ItemStyle) and (vsMenuBar in View.Style) then + Inc(AWidth, 6); + + // Toolbar.Stretch property doesn't work correctly, I don't know how to fix + // it without changing the TB2K source. + // http://news.jrsoftware.org/read/article.php?id=8176&group=jrsoftware.toolbar2000#8176 + if CalcStretch and Item.Stretch and (View is TSpTBXToolbarView) and (View.ViewerCount > 2) then begin + if View.Orientation = tbvoVertical then begin + if AWidth < TSpTBXToolbarView(View).FTallestItemSize then AWidth := TSpTBXToolbarView(View).FTallestItemSize; + end + else + if AHeight < TSpTBXToolbarView(View).FTallestItemSize then AHeight := TSpTBXToolbarView(View).FTallestItemSize; + end; + end + else begin // Menu Item + GetTextMetrics(Canvas.Handle, TextMetric); + Inc(TextInfo.TextSize.cy, TextMetric.tmExternalLeading); + + AWidth := TextInfo.TextSize.cx; + AHeight := TextInfo.TextSize.cy; + + if ImgSize.cy = 0 then ImgSize.cy := 16; + if AHeight < ImgSize.cy then AHeight := ImgSize.cy; + + if View.Window is TSpTBXPopupWindow then + CurrentSkin.GetMenuItemMargins(Canvas, TSpTBXPopupWindow(View.Window).MaximumImageSize.cx, MenuMargins) + else + CurrentSkin.GetMenuItemMargins(Canvas, ImgSize.cx, MenuMargins); + + Inc(AWidth, MenuMargins.Margins.Left + MenuMargins.Margins.Right); + Inc(AHeight, MenuMargins.Margins.Top + MenuMargins.Margins.Bottom); + + Inc(AWidth, MenuMargins.GutterSize + MenuMargins.ImageTextSpace + MenuMargins.LeftCaptionMargin + MenuMargins.RightCaptionMargin); + WS := Item.GetShortCutText; + if Length(WS) > 0 then + Inc(AWidth, (AHeight - 6) + SpGetTextSize(Canvas.Handle, WS, True).cx); + Inc(AWidth, AHeight); { Note: maybe this should be controlled by the theme } + end; + + if AWidth < Item.MinWidth then AWidth := Item.MinWidth; + if AHeight < Item.MinHeight then AHeight := Item.MinHeight; + + // Handle Custom size and anchors + if IsRotated then begin + // Reverse + H := AWidth + Item.Margins; + W := AHeight; + end + else begin + W := AWidth + Item.Margins; + H := AHeight; + end; + + if Item.CustomWidth > -1 then + W := Item.CustomWidth; + if Item.CustomHeight > -1 then + H := Item.CustomHeight; + + if IsToolbarStyle and Item.Anchored then + W := W + FAnchorDelta; + if W < Item.MinWidth then W := Item.MinWidth; + if H < Item.MinHeight then H := Item.MinHeight; + // Apply View.MaxSize to the height of the item + if View.Window is TSpTBXToolbar then begin + TB := View.Window as TSpTBXToolbar; + I := TB.MaxSize - TB.NonClientHeight; + if (I > -1) and (H > I) then + H := I; + end; + + if IsRotated then begin + // Reverse + AWidth := H; + AHeight := W; + end + else begin + AWidth := W; + AHeight := H; + end; +end; + +procedure TSpTBXItemViewer.InternalMouseMove(Shift: TShiftState; X, Y: Integer); +begin + // Do nothing +end; + +procedure TSpTBXItemViewer.CalcSize(const Canvas: TCanvas; var AWidth, AHeight: Integer); +begin + InternalCalcSize(Canvas, True, AWidth, AHeight); +end; + +function TSpTBXItemViewer.GetCaptionText: WideString; +begin + Result := SpStripShortcut(Item.Caption); +end; + +function TSpTBXItemViewer.GetTextColor(State: TSpTBXSkinStatesType): TColor; +begin + Result := Item.FontSettings.Color; + if Result = clNone then begin + if IsToolbarStyle then begin + if View.Window is TSpTBXToolbar then + Result := TSpTBXToolbar(View.Window).GetItemsTextColor(State); + if Result = clNone then + Result := CurrentSkin.GetTextColor(skncToolbarItem, State); + end + else + Result := CurrentSkin.GetTextColor(skncMenuItem, State); + end; +end; + +procedure TSpTBXItemViewer.GetTextInfo(ACanvas: TCanvas; State: TSpTBXSkinStatesType; out TextInfo: TSpTBXTextInfo); +var + ToolbarStyle: Boolean; + I: Integer; +const + WordWraps: array [TTextWrapping] of Cardinal = (0, + DT_SINGLELINE or DT_END_ELLIPSIS, + DT_SINGLELINE or DT_PATH_ELLIPSIS, DT_WORDBREAK); + + function GetRealTextSize(TextFlags: Cardinal): TSize; + var + R, CaptionRect: TRect; + begin + TextFlags := TextFlags and not DT_SINGLELINE; + TextFlags := TextFlags and not (DT_WORDBREAK or DT_END_ELLIPSIS or DT_PATH_ELLIPSIS); + if (TextFlags and (DT_WORDBREAK or DT_END_ELLIPSIS or DT_PATH_ELLIPSIS)) <> 0 then begin + // will never get here, TextFlags doesn't have wrapping + CaptionRect := BoundsRect; + R := Rect(0, 0, CaptionRect.Right - CaptionRect.Left, 80); + end + else + R := Rect(0, 0, 1, 1); + SpDrawXPText(ACanvas, TextInfo.Text, R, TextFlags or DT_CALCRECT, gldNone, clYellow, TextInfo.TextAngle); + Result.CX := R.Right; + Result.CY := R.Bottom; + end; + +begin + ToolbarStyle := IsToolbarStyle; + FillChar(TextInfo, SizeOf(TextInfo), 0); + + // Setup Font + ACanvas.Font.Assign(View.GetFont); + DoDrawAdjustFont(ACanvas.Font, State); // Let the Item adjust the font + + // Text Flags + TextInfo.TextFlags := 0; + if not AreKeyboardCuesEnabled and (vsUseHiddenAccels in View.Style) and + not (vsShowAccels in View.State) then TextInfo.TextFlags := DT_HIDEPREFIX; + TextInfo.TextFlags := TextInfo.TextFlags or DT_VCENTER or WordWraps[Item.Wrapping]; + + TextInfo.IsCaptionShown := CaptionShown; + if TextInfo.IsCaptionShown then begin + TextInfo.Text := GetCaptionText; + + TextInfo.IsTextRotated := IsRotated; + if TextInfo.IsTextRotated or not ToolbarStyle then + TextInfo.TextFlags := TextInfo.TextFlags or DT_SINGLELINE; + + TextInfo.TextSize := GetRealTextSize(TextInfo.TextFlags); + if TextInfo.IsTextRotated then begin + I := TextInfo.TextSize.cx; + TextInfo.TextSize.cx := TextInfo.TextSize.cy; + TextInfo.TextSize.cy := I; + end; + end + else begin + TextInfo.Text := ''; + TextInfo.IsTextRotated := False; + TextInfo.TextSize.cx := 0; + TextInfo.TextSize.cy := 0; + end; + + if TextInfo.IsTextRotated then + TextInfo.TextAngle := tra270 + else + TextInfo.TextAngle := tra0; +end; + +procedure TSpTBXItemViewer.Paint(const Canvas: TCanvas; const ClientAreaRect: TRect; + IsSelected, IsPushed, UseDisabledShadow: Boolean); +var + View: TTBViewAccess; + ItemInfo: TSpTBXMenuItemInfo; + TextInfo: TSpTBXTextInfo; + TextAlignment: TAlignment; + TextMetrics: TTextMetric; + PaintDefault, IsSpecialDropDown: Boolean; + + R, CaptionRect, ImageRect, RightImageRect: TRect; + P: TPoint; + + DropDownArrowSize, DropDownArrowMargin, SplitBtnArrowSize, ImgAndArrowWidth: Integer; + WS: WideString; + TextC, DropDownC: TColor; + + GlyphLayout: TSpGlyphLayout; +const + WordWraps: array [TTextWrapping] of Cardinal = (0, + DT_SINGLELINE or DT_END_ELLIPSIS, + DT_SINGLELINE or DT_PATH_ELLIPSIS, DT_WORDBREAK); +begin + CaptionRect := Rect(0, 0, 0, 0); + ImageRect := Rect(0, 0, 0, 0); + RightImageRect := Rect(0, 0, 0, 0); + CurrentSkin.GetDropDownArrowSize(DropDownArrowSize, DropDownArrowMargin, SplitBtnArrowSize); + + View := TTBViewAccess(Self.View); + SpFillItemInfo(Canvas, Self, ItemInfo); + + GlyphLayout := ghlGlyphLeft; + if tboImageAboveCaption in Item.EffectiveOptions then GlyphLayout := ghlGlyphTop; + + { Setup font and get the text info } + GetTextInfo(Canvas, ItemInfo.State, TextInfo); + TextC := Canvas.Font.Color; + TextAlignment := Item.Alignment; + + // Special DropDown, toolbar item with arrow, image and text. The Image is above the caption + // the arrow must be aligned with the image, above the text + IsSpecialDropDown := ItemInfo.HasArrow and not ItemInfo.IsSplit and ItemInfo.ToolbarStyle and + (tboImageAboveCaption in Item.EffectiveOptions) and + (ItemInfo.ImageSize.cx > 0) and not (TextInfo.IsTextRotated) and (Length(Item.Caption) > 0); + + { Border & Arrows } + R := ClientAreaRect; + if ItemInfo.ToolbarStyle then begin + if ItemInfo.HasArrow then begin + if ItemInfo.IsSplit then begin + ItemInfo.ComboRect := R; + Dec(R.Right, SplitBtnArrowSize); + ItemInfo.ComboRect.Left := R.Right; + end + else + if not IsSpecialDropDown then begin + if View.Orientation <> tbvoVertical then + ItemInfo.ComboRect := Rect(R.Right - DropDownArrowSize - DropDownArrowMargin, 0, + R.Right - DropDownArrowMargin, R.Bottom) + else + ItemInfo.ComboRect := Rect(0, R.Bottom - DropDownArrowSize - DropDownArrowMargin, + R.Right, R.Bottom - DropDownArrowMargin); + end + else begin + // Special DropDown, toolbar item with arrow, image and text. The Image is above the caption + // the arrow must be aligned with the image, above the text + ImgAndArrowWidth := ItemInfo.ImageSize.cx + DropDownArrowSize + 2; + ItemInfo.ComboRect.Right := (R.Left + R.Right + ImgAndArrowWidth + 2) div 2; + ItemInfo.ComboRect.Left := ItemInfo.ComboRect.Right - DropDownArrowSize; + ItemInfo.ComboRect.Top := (R.Top + R.Bottom - ItemInfo.ImageSize.cy - 2 - TextInfo.TextSize.CY) div 2; + ItemInfo.ComboRect.Bottom := ItemInfo.ComboRect.Top + ItemInfo.ImageSize.cy; + end; + end; + + PaintDefault := True; + DoDrawButton(Canvas, R, ItemInfo, pstPrePaint, PaintDefault); + if PaintDefault then + SpDrawXPMenuItem(Canvas, R, ItemInfo); + PaintDefault := True; + DoDrawButton(Canvas, R, ItemInfo, pstPostPaint, PaintDefault); + + // Draw dropdown arrow + if PaintDefault and ItemInfo.HasArrow then begin + P.X := (ItemInfo.ComboRect.Left + ItemInfo.ComboRect.Right) div 2 - 1; + P.Y := (ItemInfo.ComboRect.Top + ItemInfo.ComboRect.Bottom) div 2 - 1; + // Don't draw the arrow if is a split button in Windows XP, it's + // painted by the Windows theme. + if not (ItemInfo.IsSplit and (ItemInfo.SkinType = sknWindows)) then begin + DropDownC := TextC; + if ItemInfo.IsSplit and ItemInfo.Enabled then + DropDownC := GetTextColor(ItemInfo.ComboState); + if ItemInfo.IsSunkenCaption then + P := Point(P.X + 1, P.Y + 1); + SpDrawArrow(Canvas, P.X, P.Y, DropDownC, not ItemInfo.IsVertical, False, 2); + end; + if not ItemInfo.IsSplit and not IsSpecialDropDown then begin + if View.Orientation <> tbvoVertical then Dec(R.Right, DropDownArrowSize) + else Dec(R.Bottom, DropDownArrowSize); + end; + end; + + InflateRect(R, -4, -4); // Adjust + end + else begin // Menu items + InflateRect(R, 0, -1); + PaintDefault := True; + DoDrawButton(Canvas, R, ItemInfo, pstPrePaint, PaintDefault); + if PaintDefault then + SpDrawXPMenuItem(Canvas, R, ItemInfo); + PaintDefault := True; + DoDrawButton(Canvas, R, ItemInfo, pstPostPaint, PaintDefault); + InflateRect(R, 0, 1); + + // Draw the submenu arrows + if PaintDefault and (tbisSubmenu in Item.ItemStyle) then + SpDrawArrow(Canvas, R.Right - 10, R.Bottom div 2, TextC, False, False, 3); + + // Don't apply the margins if the menu item has + // tbisClicksTransparent itemstyle (like a SpTBXLabelItem) + // the caption will be automatically centered. + if not (tbisClicksTransparent in Item.ItemStyle) then begin + Inc(R.Left, ItemInfo.MenuMargins.Margins.Left); + Dec(R.Right, ItemInfo.MenuMargins.Margins.Right); + Inc(R.Top, ItemInfo.MenuMargins.Margins.Top); + Dec(R.Bottom, ItemInfo.MenuMargins.Margins.Bottom); + end; + end; + + { Caption } + if TextInfo.IsCaptionShown then + begin + WS := GetCaptionText; + + if ItemInfo.ToolbarStyle then begin + TextInfo.TextFlags := TextInfo.TextFlags and not DT_VCENTER; + // When ItemInfo.RightImageSize is valid use taLeftJustify + if (ItemInfo.RightImageSize.cx > 0) and (ItemInfo.RightImageSize.cy > 0) then + TextAlignment := taLeftJustify; + case TextAlignment of + taCenter: + if GlyphLayout = ghlGlyphTop then TextInfo.TextFlags := TextInfo.TextFlags or DT_CENTER; + taRightJustify: + TextInfo.TextFlags := TextInfo.TextFlags or DT_RIGHT; + end; + SpCalcXPText(Canvas, R, WS, TextAlignment, TextInfo.TextFlags, ItemInfo.ImageSize, ItemInfo.RightImageSize, GlyphLayout, False, CaptionRect, ImageRect, RightImageRect, TextInfo.TextAngle); + + if ItemInfo.IsSunkenCaption then + OffsetRect(CaptionRect, 1, 1); + end + else begin + if tbisClicksTransparent in Item.ItemStyle then begin + // The caption should be centered on the menu popup if the item has + // tbisClicksTransparent itemstyle (like a SpTBXLabelItem) + TextInfo.TextFlags := DT_SINGLELINE or DT_CENTER or DT_VCENTER; + CaptionRect := R; + end + else begin + TextInfo.TextFlags := TextInfo.TextFlags or DT_LEFT or DT_VCENTER; + GetTextMetrics(Canvas.Handle, TextMetrics); + CaptionRect := R; + Inc(CaptionRect.Left, ItemInfo.MenuMargins.GutterSize + ItemInfo.MenuMargins.ImageTextSpace + ItemInfo.MenuMargins.LeftCaptionMargin); + if (CaptionRect.Bottom - CaptionRect.Top) - (TextMetrics.tmHeight + TextMetrics.tmExternalLeading) = ItemInfo.MenuMargins.Margins.Bottom then + Dec(CaptionRect.Bottom); + Inc(CaptionRect.Top, TextMetrics.tmExternalLeading); + CaptionRect.Right := CaptionRect.Left + TextInfo.TextSize.CX; + end; + end; + + Canvas.Font.Color := TextC; + PaintDefault := True; + DoDrawCaption(Canvas, ClientAreaRect, ItemInfo.State, WS, CaptionRect, TextInfo.TextFlags, TextInfo.IsTextRotated, pstPrePaint, PaintDefault); + if PaintDefault then begin + if (not IsSelected or ItemInfo.ToolbarStyle) and + (ItemInfo.State = sknsDisabled) and (ItemInfo.SkinType = sknNone) then + begin + OffsetRect(CaptionRect, 1, 1); + Canvas.Font.Color := clBtnHighlight; + SpDrawXPText(Canvas, WS, CaptionRect, TextInfo.TextFlags, Item.CaptionGlow, Item.CaptionGlowColor, TextInfo.TextAngle); + OffsetRect(CaptionRect, -1, -1); + Canvas.Font.Color := clGrayText; + end; + SpDrawXPText(Canvas, WS, CaptionRect, TextInfo.TextFlags, Item.CaptionGlow, Item.CaptionGlowColor, TextInfo.TextAngle); + end; + PaintDefault := True; + DoDrawCaption(Canvas, ClientAreaRect, ItemInfo.State, WS, CaptionRect, TextInfo.TextFlags, TextInfo.IsTextRotated, pstPostPaint, PaintDefault); + end; + + { Shortcut } + if not ItemInfo.ToolbarStyle then + begin + WS := Item.GetShortCutText; + if Length(WS) > 0 then + begin + CaptionRect := R; + CaptionRect.Left := CaptionRect.Right - (CaptionRect.Bottom - CaptionRect.Top) - SpGetTextSize(Canvas.Handle, WS, True).cx; + if (CaptionRect.Bottom - CaptionRect.Top) - (TextMetrics.tmHeight + TextMetrics.tmExternalLeading) = ItemInfo.MenuMargins.Margins.Bottom then + Dec(CaptionRect.Bottom); + Inc(CaptionRect.Top, TextMetrics.tmExternalLeading); + Canvas.Font.Color := TextC; + PaintDefault := True; + DoDrawCaption(Canvas, ClientAreaRect, ItemInfo.State, WS, CaptionRect, TextInfo.TextFlags, TextInfo.IsTextRotated, pstPrePaint, PaintDefault); + if PaintDefault then + SpDrawXPText(Canvas, WS, CaptionRect, TextInfo.TextFlags, Item.CaptionGlow, Item.CaptionGlowColor, TextInfo.TextAngle); + PaintDefault := True; + DoDrawCaption(Canvas, ClientAreaRect, ItemInfo.State, WS, CaptionRect, TextInfo.TextFlags, TextInfo.IsTextRotated, pstPostPaint, PaintDefault); + end; + end; + + { Image, or check box } + if ItemInfo.ImageOrCheckShown then begin + if ItemInfo.ToolBarStyle then begin + if IsRectEmpty(ImageRect) then + ImageRect := R; + if IsSpecialDropDown then OffsetRect(ImageRect, (-DropDownArrowSize + 1) div 2, 0); + end + else begin + ImageRect := R; + ImageRect.Right := ImageRect.Left + ItemInfo.MenuMargins.GutterSize; + end; + + if ItemInfo.ImageShown then begin + ImageRect := SpCenterRect(ImageRect, ItemInfo.ImageSize.cx, ItemInfo.ImageSize.cy); + DrawItemImage(Canvas, ImageRect, ItemInfo, Item.ImageIndex); + end + else begin + if not ItemInfo.ToolbarStyle and Item.Checked then begin + if Item.RadioItem then + CurrentSkin.PaintMenuRadioMark(Canvas, ImageRect, True, True, ItemInfo.State) + else + CurrentSkin.PaintMenuCheckMark(Canvas, ImageRect, True, False, True, ItemInfo.State); + end; + end; + end; + + { Right Image } + if ItemInfo.ToolbarStyle and (ItemInfo.RightImageSize.cx > 0) and (ItemInfo.RightImageSize.cy > 0) then begin + if IsRectEmpty(RightImageRect) then begin + RightImageRect.Left := R.Right - ItemInfo.RightImageSize.cx; + RightImageRect.Right := RightImageRect.Left + ItemInfo.RightImageSize.cx; + RightImageRect.Top := R.Top + (R.Bottom - R.Top - ItemInfo.RightImageSize.cy) div 2; + RightImageRect.Bottom := RightImageRect.Top + ItemInfo.RightImageSize.cy; + end; + DrawItemRightImage(Canvas, RightImageRect, ItemInfo); + end; +end; + +function TSpTBXItemViewer.GetItem: TSpTBXCustomItem; +var + TBItem: TTBCustomItem; +begin + TBItem := inherited Item; + if Assigned(TBItem) then + Result := TBItem as TSpTBXCustomItem + else + Result := nil; +end; + +function TSpTBXItemViewer.GetHintText: Widestring; +var + I: Integer; + S: string; +begin + // Get the short hint + I := Pos('|', Item.Hint); + if I = 0 then + Result := Item.Hint + else + Result := Copy(Item.Hint, 1, I - 1); + // Use the caption if there is no hint + if (Result = '') and not(tboNoAutoHint in Item.EffectiveOptions) and + (not(tbisSubmenu in Item.ItemStyle) or (tbisCombo in Item.ItemStyle) or + not CaptionShown) then + begin + Result := SpStripAccelChars(SpStripTrailingPunctuation(Item.Caption)); + end; + + // Call associated action's OnHint event handler to post-process the hint + if Assigned(Item.ActionLink) and (Item.ActionLink.Action is TCustomAction) and + Assigned(TCustomAction(Item.ActionLink.Action).OnHint) then + begin + S := Result; + if TCustomAction(Item.ActionLink.Action).DoHint(S) then + Result := S + else + Result := ''; + // Note: TControlActionLink.DoShowHint actually misinterprets the result of DoHint, but we get it right... + end; + + // Add shortcut text + if (Result <> '') and Application.HintShortCuts and (Item.ShortCut <> scNone) then + Result := Result + ' (' + ShortCutToText(Item.ShortCut) + ')'; +end; + +procedure TSpTBXItemViewer.Entering; +begin + // When a Popupmenu is opened the TB2K modal handler will reset + // the TApplication.Hint in UpdateAppHint subprocedure of + // TTBModalHandler.Create, this in turn sets TTntApplication.Hint + // to AnsiString: + // ... + // if Assigned(View.FSelected) then + // Application.Hint := GetLongHint(View.FSelected.Item.Hint) + // else + // Application.Hint := ''; + // ... + // We need to set TTntApplication.Hint before TB2K. + // TTntStatusBar uses TTntApplication.Hint when AutoHint is true. + + inherited; + {$IFNDEF UNICODE} + if View.IsPopup then + TntApplication.Hint := Item.Hint; + {$ENDIF} +end; + +procedure TSpTBXItemViewer.CMHintShow(var Message: TMessage); +// Handle the CM_HINTSHOW message to show unicode hints using +// a custom THintWindow. +var + HintInfo: PHintInfo; + WideHint, PrevWideHint: Widestring; + R, TextR, CursorR: TRect; + PaintDefault: Boolean; +begin + HintInfo := TCMHintShow(Message).HintInfo; + WideHint := GetHintText; + CursorR := BoundsRect; + + // Prepare the HintInfo + HintInfo.HintStr := WideHint; + HintInfo.CursorRect := CursorR; + HintInfo.HintWindowClass := SpTBXHintWindowClass; // Custom HintWindow class + HintInfo.HintData := SpStockHintBitmap; // TApplication.ActivateHint will pass the data to the HintWindow + HintInfo.HideTimeout := 60000; // 1 minute + + // Prepare the HintBitmap + SpStockHintBitmap.Canvas.Font.Assign(Screen.HintFont); + SpStockHintBitmap.Canvas.Font.Color := clInfoText; + SpStockHintBitmap.Canvas.Pen.Color := clBlack; + SpStockHintBitmap.Canvas.Brush.Color := clInfoBk; + TextR := Rect(0, 0, 1, 1); + SpDrawXPText(SpStockHintBitmap.Canvas, WideHint, TextR, DT_NOPREFIX or DT_CALCRECT); + SpStockHintBitmap.Width := TextR.Right + 8; + SpStockHintBitmap.Height := TextR.Bottom + 4; + R := Rect(0, 0, SpStockHintBitmap.Width, SpStockHintBitmap.Height); + SpDrawXPTooltipBackground(SpStockHintBitmap.Canvas, R); + + // Draw the hint in the HintBitmap + PrevWideHint := WideHint; + PaintDefault := True; + DoDrawHint(SpStockHintBitmap, HintInfo.CursorPos, CursorR, WideHint, PaintDefault); + if PaintDefault then begin + HintInfo.HintStr := WideHint; + HintInfo.CursorRect := CursorR; + + // Adjust the bounds and repaint the background if it's needed + if WideHint <> PrevWideHint then begin + TextR := Rect(0, 0, 1, 1); + SpDrawXPText(SpStockHintBitmap.Canvas, WideHint, TextR, DT_NOPREFIX or DT_CALCRECT); + SpStockHintBitmap.Width := TextR.Right + 8; + SpStockHintBitmap.Height := TextR.Bottom + 4; + R := Rect(0, 0, SpStockHintBitmap.Width, SpStockHintBitmap.Height); + SpDrawXPTooltipBackground(SpStockHintBitmap.Canvas, R); + end + else + R := Rect(0, 0, SpStockHintBitmap.Width, SpStockHintBitmap.Height); + + // Draw the hint + OffsetRect(TextR, ((R.Right - TextR.Right) div 2) - 2, (R.Bottom - TextR.Bottom) div 2); + SpDrawXPText(SpStockHintBitmap.Canvas, WideHint, TextR, DT_NOPREFIX); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXRootItem } + +procedure TSpTBXRootItem.DoPopupShowingChanged(APopupWindow: TTBPopupWindow; IsVisible: Boolean); +// This method is called by TSpTBXPopupWindow when the popup is Opened +begin + if Assigned(APopupWindow) then begin + if IsVisible then begin + if Assigned(FOnInitPopup) then FOnInitPopup(Self, APopupWindow.View); + end + else begin + if Assigned(FOnClosePopup) then FOnClosePopup(Self); + end; + end; +end; + +function TSpTBXRootItem.GetPopupWindowClass: TTBPopupWindowClass; +begin + Result := TSpTBXPopupWindow; +end; + +procedure TSpTBXRootItem.SetToolBoxPopup(const Value: Boolean); +begin + FToolBoxPopup := Value; + if FToolBoxPopup then + Options := Options + [tboToolbarStyle] + else + Options := Options - [tboToolbarStyle]; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSubmenuItem } + +constructor TSpTBXSubmenuItem.Create(AOwner: TComponent); +begin + inherited; + ItemStyle := ItemStyle + [tbisSubMenu, tbisSubitemsEditable]; +end; + +function TSpTBXSubmenuItem.GetDropdownCombo: Boolean; +begin + Result := tbisCombo in ItemStyle; +end; + +procedure TSpTBXSubmenuItem.SetDropdownCombo(Value: Boolean); +begin + if (tbisCombo in ItemStyle) <> Value then begin + if Value then ItemStyle := ItemStyle + [tbisCombo] + else ItemStyle := ItemStyle - [tbisCombo]; + Change(True); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXColorItem } + +constructor TSpTBXColorItem.Create(AOwner: TComponent); +begin + inherited; + FColor := clWhite; +end; + +function TSpTBXColorItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + Result := TSpTBXColorItemViewer; +end; + +procedure TSpTBXColorItem.SetColor(Value: TColor); +begin + if FColor <> Value then begin + FColor := Value; + Change(False); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXColorItemViewer } + +procedure TSpTBXColorItemViewer.DoDrawImage(ACanvas: TCanvas; + State: TSpTBXSkinStatesType; const PaintStage: TSpTBXPaintStage; + var AImageList: TCustomImageList; var AImageIndex: Integer; var ARect: TRect; + var PaintDefault: Boolean); +var + C: TColor; +begin + if PaintStage = pstPrePaint then begin + if State = sknsDisabled then begin + Inc(ARect.Right); + Inc(ARect.Bottom); + DrawEdge(ACanvas.Handle, ARect, BDR_SUNKENOUTER or BDR_RAISEDINNER, BF_RECT); + end + else begin + if not IsToolbarStyle then + InflateRect(ARect, -2, -2); + C := TSpTBXColorItem(Item).Color; + if C <> clNone then begin + ACanvas.Brush.Color := clBtnShadow; + ACanvas.FrameRect(ARect); + InflateRect(ARect, -1, -1); + ACanvas.Brush.Color := C; + ACanvas.FillRect(ARect); + end; + end; + end; + inherited; +end; + +function TSpTBXColorItemViewer.GetImageShown: Boolean; +begin + Result := ((Item.DisplayMode in [nbdmDefault, nbdmImageAndText]) or + (IsToolbarStyle and (Item.DisplayMode = nbdmTextOnlyInMenus))); +end; + +function TSpTBXColorItemViewer.GetImageSize: TSize; +begin + if IsToolbarStyle then begin + Result.cx := 12; + Result.cy := 12; + end + else begin + Result.cx := 16; + Result.cy := 16; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomLabelItem } + +constructor TSpTBXCustomLabelItem.Create(AOwner: TComponent); +begin + inherited; + ItemStyle := ItemStyle - [tbisSelectable, tbisRedrawOnSelChange, + tbisRedrawOnMouseOverChange] + [tbisClicksTransparent]; + Alignment := taLeftJustify; + Stretch := False; + DisplayMode := nbdmImageAndText; +end; + +function TSpTBXCustomLabelItem.DialogChar(CharCode: Word): Boolean; +begin + Result := inherited DialogChar(CharCode); + if Enabled and Visible and Assigned(Control) and (Control is TWinControl) and + IsAccel(CharCode, Caption) and SpCanFocus(TWinControl(Control)) then + begin + TWinControl(Control).SetFocus; + Result := True; + end; +end; + +procedure TSpTBXCustomLabelItem.DoDrawButton(ACanvas: TCanvas; ARect: TRect; + ItemInfo: TSpTBXMenuItemInfo; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + PaintDefault := True; + inherited DoDrawButton(ACanvas, ARect, ItemInfo, PaintStage, PaintDefault); + PaintDefault := False; +end; + +function TSpTBXCustomLabelItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + Result := TSpTBXLabelItemViewer; +end; + +procedure TSpTBXCustomLabelItem.ToggleControl; +begin + // Do nothing, the Control property is not valid +end; + +procedure TSpTBXCustomLabelItem.UpdateProps; +begin + // Do nothing, the Control property is not valid +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXLabelItemViewer } + +procedure TSpTBXLabelItemViewer.CalcSize(const Canvas: TCanvas; var AWidth, + AHeight: Integer); +var + TextMetrics: TTextMetric; +begin + inherited CalcSize(Canvas, AWidth, AHeight); + if not IsToolbarStyle and (Length(GetCaptionText) > 0) and (Item.CustomHeight <= -1) then begin + GetTextMetrics(Canvas.Handle, TextMetrics); + AHeight := TextMetrics.tmHeight; + end; +end; + +function TSpTBXLabelItemViewer.DoExecute: Boolean; +begin + // Clicking a TSpTBXLabelItem on a popup menu causes the menu to close. + // This is caused by TTBXItemViewer.MouseUp, which calls + // TTBItemViewer.DoExecute + // The TBXLabelItem doesn't fire the click because the ItemViewer descends + // from TTBItemViewer instead of TTBXItemViewer. + // TTBXItemViewer.MouseUp is the culprit of firing the DoExecute + Result := False; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSeparatorItem } + +function TSpTBXSeparatorItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + Result := TSpTBXSeparatorItemViewer; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSeparatorItemViewer } + +procedure TSpTBXSeparatorItemViewer.CalcSize(const Canvas: TCanvas; var AWidth, + AHeight: Integer); +begin + if not IsToolbarStyle then begin + if CurrentSkin.OfficeMenuSeparator then + AHeight := 4 // For Office XP, 2003, 2007 + else + AHeight := 10; + end + else begin + AWidth := 6; + AHeight := 6; + end; +end; + +function TSpTBXSeparatorItemViewer.IsStatusBarSeparator: Boolean; +var + C: TComponent; +begin + Result := False; + C := Item.GetParentComponent; + if Assigned(C) and (C is TSpTBXStatusToolbar) then + Result := TSpTBXStatusToolbar(C).NeedsSeparatorRepaint; +end; + +procedure TSpTBXSeparatorItemViewer.Paint(const Canvas: TCanvas; const ClientAreaRect: TRect; + IsSelected, IsPushed, UseDisabledShadow: Boolean); +var + Vertical, MenuItemStyle: Boolean; + MarginsInfo: TSpTBXMenuItemMarginsInfo; + R: TRect; +begin + if TTBSeparatorItem(Item).Blank or IsStatusBarSeparator then + Exit; + + R := ClientAreaRect; + MenuItemStyle := View.IsPopup; + if MenuItemStyle then begin + Vertical := False; + case SkinManager.GetSkinType of + sknNone: + begin + // Add separator spacing when it's not on a ToolBoxPopup + if not (tboToolbarStyle in Item.EffectiveOptions) then + InflateRect(R, -tbMenuSeparatorOffset, 0); + end; + sknWindows, sknSkin: + begin + // Draw the separator from the gutter end if the separator is not on + // a ToolBoxPopup and we are using the default Vista theme or the + // skin has a gutter specified. + if not (tboToolbarStyle in Item.EffectiveOptions) then + if SpIsWinVistaOrUp or not CurrentSkin.Options(skncGutter, sknsNormal).IsEmpty then begin + if View.Window is TSpTBXPopupWindow then + CurrentSkin.GetMenuItemMargins(Canvas, TSpTBXPopupWindow(View.Window).MaximumImageSize.cx, MarginsInfo) + else + CurrentSkin.GetMenuItemMargins(Canvas, 0, MarginsInfo); + if SpIsWinVistaOrUp then + R.Left := MarginsInfo.GutterSize + MarginsInfo.ImageTextSpace + else + R.Left := MarginsInfo.GutterSize + MarginsInfo.ImageTextSpace + MarginsInfo.LeftCaptionMargin; + end; + end; + end; + end + else + Vertical := View.Orientation <> tbvoVertical; + + SpDrawXPMenuSeparator(Canvas, R, MenuItemStyle, Vertical); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXRadioGroupItem } + +constructor TSpTBXRadioGroupItem.Create(AOwner: TComponent); +begin + inherited; + FDefaultIndex := 0; + FLastClickedIndex := 0; + FStrings := TTntStringList.Create; +end; + +destructor TSpTBXRadioGroupItem.Destroy; +begin + FStrings.Free; + inherited; +end; + +procedure TSpTBXRadioGroupItem.DoClick(AItem: TSpTBXItem); +begin + if Assigned(FOnClick) then FOnClick(AItem); +end; + +procedure TSpTBXRadioGroupItem.DoFillStrings; +begin + if Assigned(FOnFillStrings) then FOnFillStrings(Self, FStrings); +end; + +procedure TSpTBXRadioGroupItem.ItemClickEvent(Sender: TObject); +var + Item: TSpTBXItem; +begin + Item := Sender as TSpTBXItem; + if not Item.Checked and (Item.Tag > -1) and (Item.Tag < FStrings.Count) then + begin + Item.Checked := True; + FLastClickedIndex := IndexOf(Item); + DoClick(Item); + end; +end; + +procedure TSpTBXRadioGroupItem.Loaded; +begin + inherited; + if not (csDesigning in ComponentState) then + Recreate; +end; + +procedure TSpTBXRadioGroupItem.Recreate; +var + I: Integer; + A: TSpTBXItem; +begin + // Delete FStrings items + FStrings.Clear; + for I := Count - 1 downto 0 do + if Items[I].GroupIndex = C_SpTBXRadioGroupIndex then + Delete(I); + + DoFillStrings; + + // Create group items + for I := 0 to FStrings.Count - 1 do begin + A := TSpTBXItem.Create(Self); + A.Caption := FStrings[I]; + A.AutoCheck := False; + A.GroupIndex := C_SpTBXRadioGroupIndex; + A.Tag := I; + A.OnClick := ItemClickEvent; + Insert(I, A); + if I = FDefaultIndex then A.Click; + end; + + if Assigned(FOnUpdate) then FOnUpdate(Self); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSkinGroupItem } + +constructor TSpTBXSkinGroupItem.Create(AOwner: TComponent); +begin + inherited; + SkinManager.AddSkinNotification(Self); +end; + +destructor TSpTBXSkinGroupItem.Destroy; +begin + SkinManager.RemoveSkinNotification(Self); + inherited; +end; + +procedure TSpTBXSkinGroupItem.DoClick(AItem: TSpTBXItem); +begin + SkinManager.SetSkin(FStrings[AItem.Tag]); + inherited; +end; + +procedure TSpTBXSkinGroupItem.DoSkinChange; +var + I: Integer; +begin + I := FStrings.IndexOf(SkinManager.CurrentSkinName); + if I > -1 then + Items[I].Click; + + if Assigned(FOnSkinChange) then FOnSkinChange(Self); +end; + +procedure TSpTBXSkinGroupItem.DoFillStrings; +var + I: Integer; +begin + {$IFNDEF UNICODE} + SkinManager.SkinsList.GetSkinNames(FStrings.AnsiStrings); + {$ELSE} + SkinManager.SkinsList.GetSkinNames(FStrings); + {$ENDIF} + + // Sort the list and move the Default skin to the top + FStrings.Sort; + I := FStrings.IndexOf('Default'); + if I > -1 then FStrings.Move(I, 0); + inherited; + FDefaultIndex := FStrings.IndexOf(SkinManager.CurrentSkinName); +end; + +procedure TSpTBXSkinGroupItem.WMSpSkinChange(var Message: TMessage); +begin + DoSkinChange; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSystemMenuItem } + +constructor TSpTBXSystemMenuItem.Create(AOwner: TComponent); +begin + inherited; + ItemStyle := ItemStyle + [tbisSubMenu, tbisDontSelectFirst] - [tbisRedrawOnSelChange, tbisRedrawOnMouseOverChange]; + Caption := '&-'; + FShowSize := True; +end; + +function TSpTBXSystemMenuItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + Result := TSpTBXSystemMenuItemViewer; +end; + +function TSpTBXSystemMenuItem.GetSystemMenuParentForm: TCustomForm; +var + C: TComponent; +begin + Result := nil; + C := GetParentComponent; + if Assigned(C) and (C is TControl) then + Result := GetParentForm(TControl(C)); + + if not Assigned(Result) and Assigned(Application.MainForm) then begin + if FMDISystemMenu then + Result := Application.MainForm.ActiveMDIChild + else + Result := Application.MainForm; + end; +end; + +procedure TSpTBXSystemMenuItem.Click; +var + Form: TCustomForm; +begin + inherited; + Clear; + + Form := GetSystemMenuParentForm; + if Assigned(Form) then + SpFillSystemSpTBXPopup(Form, Self, True, True, True, True, CommandClick); +end; + +procedure TSpTBXSystemMenuItem.CommandClick(Sender: TObject); +var + Form: TCustomForm; + I: Integer; +begin + Form := GetSystemMenuParentForm; + if Assigned(Form) and Assigned(Sender) then begin + I := TComponent(Sender).Tag; + if I = SC_MAXIMIZE then + Form.WindowState := wsMaximized + else + SendMessage(Form.Handle, WM_SYSCOMMAND, I, GetMessagePos); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSystemMenuItemViewer } + +procedure TSpTBXSystemMenuItemViewer.CalcSize(const Canvas: TCanvas; + var AWidth, AHeight: Integer); +begin + AWidth := GetSystemMetrics(SM_CXSMICON) + 2; + AHeight := GetSystemMetrics(SM_CYSMICON) + 2; +end; + +procedure TSpTBXSystemMenuItemViewer.Paint(const Canvas: TCanvas; + const ClientAreaRect: TRect; IsSelected, IsPushed, UseDisabledShadow: Boolean); + + function GetIconHandle: HICON; + var + Form: TForm; + begin + Result := 0; + if Assigned(Application.MainForm) then begin + if TSpTBXSystemMenuItem(Item).MDISystemMenu then + Form := Application.MainForm.ActiveMDIChild + else + Form := Application.MainForm; + if Assigned(Form) then + Result := Form.Icon.Handle; + end; + if Result = 0 then + Result := Application.Icon.Handle; + if Result = 0 then + Result := LoadIcon(0, IDI_APPLICATION); + end; + +var + R: TRect; + TempIcon: HICON; +begin + R := ClientAreaRect; + InflateRect(R, -1, -1); + TempIcon := CopyImage(GetIconHandle, IMAGE_ICON, R.Right - R.Left, R.Bottom - R.Top, LR_COPYFROMRESOURCE); + try + DrawIconEx(Canvas.Handle, R.Left, R.Top, TempIcon, 0, 0, 0, 0, DI_NORMAL); + finally + DestroyIcon(TempIcon); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomToolPalette } + +constructor TSpTBXCustomToolPalette.Create(AOwner: TComponent); +begin + inherited; + FColCount := 1; + FRowCount := 1; + FSelectedCell.X := -1; +end; + +function TSpTBXCustomToolPalette.DoCellClick(ACol, ARow: Integer): Boolean; +begin + Result := True; + if Assigned(FOnCellClick) then FOnCellClick(Self, ACol, ARow, Result); +end; + +procedure TSpTBXCustomToolPalette.DoChange; +begin + if Assigned(FOnChange) then FOnChange(Self); +end; + +procedure TSpTBXCustomToolPalette.DoDrawCellImage(ACanvas: TCanvas; + const ARect: TRect; ACol, ARow: Integer; ItemInfo: TSpTBXMenuItemInfo); +begin + if Assigned(FOnDrawCellImage) then + FOnDrawCellImage(Self, ACanvas, ARect, ACol, ARow, ItemInfo.Checked, + ItemInfo.HotTrack, ItemInfo.Enabled); +end; + +procedure TSpTBXCustomToolPalette.DoGetCellHint(ACol, ARow: Integer; var AHint: WideString); +begin + if Assigned(FOnGetCellHint) then FOnGetCellHint(Self, ACol, ARow, AHint); +end; + +function TSpTBXCustomToolPalette.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + Result := TSpTBXToolViewer; +end; + +procedure TSpTBXCustomToolPalette.HandleClickCell(ACol, ARow: Integer); +begin + if DoCellClick(ACol, ARow) then SetSelectedCell(Point(ACol, ARow)); +end; + +procedure TSpTBXCustomToolPalette.SetColCount(Value: TSpTBXRowColCount); +begin + if FColCount <> Value then begin + FColCount := Value; + Change(True); + end; +end; + +procedure TSpTBXCustomToolPalette.SetRowCount(Value: TSpTBXRowColCount); +begin + if FRowCount <> Value then begin + FRowCount := Value; + Change(True); + end; +end; + +procedure TSpTBXCustomToolPalette.SetSelectedCell(Value: TPoint); +begin + FSelectedCell := Value; + Change(True); + DoChange; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXToolViewer } + +constructor TSpTBXToolViewer.Create(AView: TTBView; AItem: TTBCustomItem; + AGroupLevel: Integer); +begin + inherited; + FColCount := TSpTBXCustomToolPalette(AItem).ColCount; + FRowCount := TSpTBXCustomToolPalette(AItem).RowCount; +end; + +procedure TSpTBXToolViewer.CalcCellSize(ACanvas: TCanvas; var AWidth, AHeight: Integer); +var + ImageSize: TSize; +begin + ImageSize := GetImageSize; + AWidth := ImageSize.cx + 6; + AHeight := ImageSize.cy + 6; +end; + +procedure TSpTBXToolViewer.CalcSize(const Canvas: TCanvas; var AWidth, AHeight: Integer); +var + W, H: Integer; + MarginsInfo: TSpTBXMenuItemMarginsInfo; +begin + if IsToolbarStyle then + FIndent := 0 + else begin + if View.Window is TSpTBXPopupWindow then + CurrentSkin.GetMenuItemMargins(Canvas, TSpTBXPopupWindow(View.Window).MaximumImageSize.cx, MarginsInfo) + else + CurrentSkin.GetMenuItemMargins(Canvas, 0, MarginsInfo); + FIndent := MarginsInfo.GutterSize + MarginsInfo.ImageTextSpace + MarginsInfo.LeftCaptionMargin - 3; + end; + + FColCount := Item.ColCount; + FRowCount := Item.RowCount; + CalcCellSize(Canvas, W, H); + AWidth := FIndent + W * FColCount; + if not IsToolbarStyle then + Inc(AWidth, MarginsInfo.RightCaptionMargin); + AHeight := H * FRowCount; + if AWidth < 8 then AWidth := 8; + if AHeight < 8 then AHeight := 8; +end; + +procedure TSpTBXToolViewer.DoDrawHint(AHintBitmap: TBitmap; CursorPos: TPoint; + var CursorRect: TRect; var AHint: Widestring; var PaintDefault: Boolean); +var + Col, Row: Integer; +begin + if GetCellAt(CursorPos.X - BoundsRect.Left, CursorPos.Y - BoundsRect.Top, Col, Row) then begin + AHint := GetCellHint(Col, Row); + CursorRect := GetCellRect(CursorRect, Col, Row); + inherited DoDrawHint(AHintBitmap, CursorPos, CursorRect, AHint, PaintDefault); + end + else + PaintDefault := False; +end; + +procedure TSpTBXToolViewer.DrawCellImage(ACanvas: TCanvas; const ARect: TRect; + Col, Row: Integer; ItemInfo: TSpTBXMenuItemInfo); +var + I: Integer; + IL: TCustomImageList; +begin + if not Item.CustomImages then begin + I := GetImageIndex(Col, Row); + IL := Item.Images; + SpDrawImageList(ACanvas, ARect, IL, I, ItemInfo.Enabled, True); + end; + Item.DoDrawCellImage(ACanvas, ARect, Col, Row, ItemInfo); +end; + +procedure TSpTBXToolViewer.Entering; +begin + FHotCell := Point(-1, 0); + if (View is TSpTBXPopupWindowView) and Assigned(View.Selected) then begin + if View.Selected.Index > Index then begin + FHotCell := Point(FColCount - 1, FRowCount - 1); + while (FHotCell.X > 0) and not IsCellVisible(FHotCell) do + Dec(FHotCell.X); + end + else + if View.Selected.Index < Index then + FHotCell := Point(0, 0); + end; + inherited; +end; + +function TSpTBXToolViewer.GetCellAt(X, Y: Integer; out Col, Row: Integer): Boolean; +begin + if (FCellWidth = 0) or (FCellHeight = 0) then begin + Col := 0; + Row := 0; + end + else begin + Col := (X - FIndent) div FCellWidth; + Row := Y div FCellHeight; + end; + Result := (Col >= 0) and (Row >= 0) and (Col < FColCount) and (Row < FRowCount); +end; + +function TSpTBXToolViewer.GetCellHint(Col, Row: Integer): WideString; +begin + Result := ''; + Item.DoGetCellHint(Col, Row, Result); +end; + +function TSpTBXToolViewer.GetCellRect(ClientAreaRect: TRect; Col, Row: Integer): TRect; +begin + Result := Bounds(ClientAreaRect.Left + FIndent + Col * FCellWidth, ClientAreaRect.Top + Row * FCellHeight, FCellWidth, FCellHeight); +end; + +function TSpTBXToolViewer.GetImageIndex(Col, Row: Integer): Integer; +begin + Result := Col + Row * FColCount; +end; + +function TSpTBXToolViewer.GetImageShown: Boolean; +begin + Result := True; +end; + +function TSpTBXToolViewer.GetImageSize: TSize; +var + IL: TCustomImageList; +begin + if Item.CustomImages then + IL := nil + else + IL := Item.Images; + + if Assigned(IL) then begin + Result.cx := IL.Width; + Result.cy := IL.Height; + end + else begin + Result.cx := 12; + Result.cy := 12; + end; +end; + +function TSpTBXToolViewer.GetItem: TSpTBXCustomToolPalette; +var + TBItem: TTBCustomItem; +begin + TBItem := inherited Item; + if Assigned(TBItem) then + Result := TBItem as TSpTBXCustomToolPalette + else + Result := nil; +end; + +procedure TSpTBXToolViewer.InvalidateCell(ACol, ARow: Integer); +var + R: TRect; +begin + R := GetCellRect(BoundsRect, ACol, ARow); + InvalidateRect(View.Window.Handle, @R, False); +end; + +function TSpTBXToolViewer.IsCellVisible(Cell: TPoint): Boolean; +var + IL: TCustomImageList; +begin + Result := (Cell.X >= 0) and (Cell.Y >= 0) and (Cell.X < FColCount) and (Cell.Y < FRowCount); + if Result and not Item.CustomImages then begin + IL := Item.Images; + if Assigned(IL) then + Result := (Cell.X + Cell.Y * FColCount) < IL.Count; + end; +end; + +procedure TSpTBXToolViewer.KeyDown(var Key: Word; Shift: TShiftState); +var + OldPos, Pos: TPoint; +begin + if IsCellVisible(FHotCell) then + OldPos := FHotCell + else + if IsCellVisible(Item.SelectedCell) then + OldPos := Item.SelectedCell + else + OldPos.X := -1; + + if OldPos.X >= 0 then begin + Pos := OldPos; + case Key of + VK_LEFT: + begin + Dec(Pos.X); + if Pos.X < 0 then begin + Pos.X := FColCount - 1; + Dec(Pos.Y); + end; + end; + VK_UP: Dec(Pos.Y); + VK_RIGHT: + begin + Inc(Pos.X); + if Pos.X >= FColCount then + begin + Pos.X := 0; + Inc(Pos.Y); + end; + end; + VK_DOWN: Inc(Pos.Y); + VK_PRIOR: Pos.Y := 0; + VK_NEXT: Pos.Y := FRowCount - 1; + VK_HOME: Pos.X := 0; + VK_END: Pos.Y := FColCount - 1; + VK_RETURN: + if IsCellVisible(FHotCell) then begin + Item.HandleClickCell(FHotCell.X, FHotCell.Y); + Exit; + end; + else + inherited; + Exit; + end; + end + else begin + OldPos := Point(-1, 0); + Pos := Point(0, 0); + end; + + if ((OldPos.X <> Pos.X) or (OldPos.Y <> Pos.Y)) and IsCellVisible(Pos) then begin + Key := 0; + FHotCell := Pos; + Item.Change(False); + end; +end; + +procedure TSpTBXToolViewer.MouseDown(Shift: TShiftState; X, Y: Integer; + var MouseDownOnMenu: Boolean); +begin + FMouseIsDown := True; + MouseMove(X, Y); + inherited; + View.SetCapture; +end; + +procedure TSpTBXToolViewer.MouseMove(X, Y: Integer); +var + OldHotCell: TPoint; +begin + OldHotCell := FHotCell; + if not GetCellAt(X, Y, FHotCell.X, FHotCell.Y) then + FHotCell := Point(-1, 0); + + if (FHotCell.X <> OldHotCell.X) or (FHotCell.Y <> OldHotCell.Y) then + if Show and not IsRectEmpty(BoundsRect) {and not (Item is TTBControlItem)} then begin + Include(State, tbisInvalidated); + InvalidateCell(OldHotCell.X, OldHotCell.Y); + InvalidateCell(FHotCell.X, FHotCell.Y); + end; +end; + +procedure TSpTBXToolViewer.MouseUp(X, Y: Integer; MouseWasDownOnMenu: Boolean); +var + Col, Row: Integer; +begin + FMouseIsDown := False; + if GetCellAt(X, Y, Col, Row) then + Item.HandleClickCell(Col, Row); + View.EndModalWithClick(Self); + inherited; +end; + +procedure TSpTBXToolViewer.Paint(const Canvas: TCanvas; + const ClientAreaRect: TRect; IsSelected, IsPushed, + UseDisabledShadow: Boolean); +var + I, J: Integer; + ItemInfo: TSpTBXMenuItemInfo; + CellRect: TRect; + ItemHotTrack: Boolean; + ImageSize: TSize; +begin + CalcCellSize(Canvas, FCellWidth, FCellHeight); + + SpFillItemInfo(Canvas, Self, ItemInfo); + ItemInfo.ToolbarStyle := True; + ItemHotTrack := False; + if IsSelected then + if not ItemInfo.Enabled and not View.MouseOverSelected then ItemHotTrack := True + else if ItemInfo.Enabled then ItemHotTrack := True; + + for J := 0 to FRowCount - 1 do + for I := 0 to FColCount - 1 do + if IsCellVisible(Point(I, J)) then begin + ItemInfo.HotTrack := False; + ItemInfo.Pushed := False; + if ItemHotTrack and (FHotCell.X = I) and (FHotCell.Y = J) then begin + ItemInfo.HotTrack := True; + if IsPushed then ItemInfo.Pushed := True + end; + if (Item.SelectedCell.X = I) and (Item.SelectedCell.Y = J) then + ItemInfo.Checked := True + else + ItemInfo.Checked := False; + ItemInfo.State := CurrentSkin.GetState(ItemInfo.Enabled, ItemInfo.Pushed, ItemInfo.HotTrack, ItemInfo.Checked); + CellRect := GetCellRect(ClientAreaRect, I, J); + + // Paint the cell + SpDrawXPMenuItem(Canvas, CellRect, ItemInfo); + ImageSize := GetImageSize; + CellRect := SpCenterRect(CellRect, ImageSize.cx, ImageSize.cy); + DrawCellImage(Canvas, CellRect, I, J, ItemInfo); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXColorPalette } + +constructor TSpTBXColorPalette.Create(AOwner: TComponent); +begin + inherited; + CustomImages := True; + FCustomColors := False; + ColCount := CPDefaultCols; + RowCount := CPDefaultRows; // 40 Default Colors + Options := Options + [tboShowHint]; + FColor := clNone; +end; + +procedure TSpTBXColorPalette.DoChange; +begin + if SelectedCell.X >= 0 then + FColor := GetCellColor(SelectedCell.X, SelectedCell.Y); + inherited; +end; + +procedure TSpTBXColorPalette.DoDrawCellImage(ACanvas: TCanvas; + const ARect: TRect; ACol, ARow: Integer; ItemInfo: TSpTBXMenuItemInfo); +var + R: TRect; +begin + R := ARect; + ACanvas.Brush.Color := clBtnShadow; + ACanvas.FrameRect(R); + InflateRect(R, -1, -1); + if ItemInfo.Enabled then begin + ACanvas.Brush.Color := GetCellColor(ACol, ARow); + ACanvas.FillRect(R); + end; +end; + +procedure TSpTBXColorPalette.DoGetCellHint(ACol, ARow: Integer; var AHint: WideString); +var + C: TColor; +begin + GetCellInfo(ACol, ARow, C, AHint); +end; + +function TSpTBXColorPalette.FindCell(AColor: TColor): TPoint; +var + I, J: Integer; + C: TColor; +begin + if AColor <> clNone then + AColor := ColorToRGB(AColor); + for J := 0 to RowCount - 1 do + for I := 0 to ColCount - 1 do begin + C := GetCellColor(I, J); + if C <> clNone then + C := ColorToRGB(C); + if C = AColor then begin + Result.X := I; + Result.Y := J; + Exit; + end; + end; + Result.X := -1; + Result.Y := 0; +end; + +function TSpTBXColorPalette.GetCellColor(ACol, ARow: Integer): TColor; +var + W: WideString; +begin + GetCellInfo(ACol, ARow, Result, W); +end; + +procedure TSpTBXColorPalette.GetCellInfo(ACol, ARow: Integer; + out AColor: TColor; out AName: WideString); +var + I: Integer; +begin + AColor := clNone; + AName := ''; + if not FCustomColors then begin + I := ACol + ARow * ColCount; + if (I > -1) and (I < CPDefaultCols * CPDefaultRows) then begin + AColor := CPDefaultColors[I].Value; + AName := CPDefaultColors[I].Name; + end; + end; + + if Assigned(FOnGetColor) then FOnGetColor(Self, ACol, ARow, AColor, AName); +end; + +procedure TSpTBXColorPalette.SetColor(Value: TColor); +begin + FColor := Value; + SelectedCell := FindCell(Value); +end; + +procedure TSpTBXColorPalette.SetCustomColors(const Value: Boolean); +begin + if FCustomColors <> Value then begin + FCustomColors := Value; + if not Value then begin + RowCount := CPDefaultCols; + ColCount := CPDefaultRows; + end; + Change(True); + end; +end; + +procedure TSpTBXColorPalette.SetColCount(Value: TSpTBXRowColCount); +begin + if FCustomColors then + inherited SetColCount(Value) + else + inherited SetColCount(CPDefaultCols); +end; + +procedure TSpTBXColorPalette.SetRowCount(Value: TSpTBXRowColCount); +begin + if FCustomColors then + inherited SetRowCount(Value) + else + inherited SetRowCount(CPDefaultRows); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXItemCache } + +procedure TSpTBXItemCache.Assign(Source: TPersistent); +var + C: TSpTBXItemCache; +begin + if Source is TSpTBXItemCache then + begin + C := Source as TSpTBXItemCache; + Dock := C.Dock; + Item := C.Item; + Width := C.Width; + Height := C.Height; + ParentWidth := C.ParentWidth; + ParentHeight := C.ParentHeight; + end + else inherited Assign(Source); +end; + +function TSpTBXItemCache.GetName: TComponentName; +begin + if Assigned(FItem) then + Result := FItem.Name + else + Result := FName; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXItemCacheCollection } + +function TSpTBXItemCacheCollection.Add(AItem: TTBCustomItem): Integer; +var + F: TSpTBXItemCache; +begin + F := TSpTBXItemCache(inherited Add); + F.Item := AItem; + Result := F.Index; +end; + +function TSpTBXItemCacheCollection.GetItem(Index: Integer): TSpTBXItemCache; +begin + Result := TSpTBXItemCache(inherited Items[Index]); +end; + +function TSpTBXItemCacheCollection.IndexOf(AItem: TTBCustomItem): Integer; +var + I: Integer; +begin + Result := -1; + if Assigned(AItem) then + for I := 0 to Count - 1 do + if Items[I].Item = AItem then begin + Result := I; + Break; + end; +end; + +procedure TSpTBXItemCacheCollection.SetItem(Index: Integer; + const Value: TSpTBXItemCache); +begin + inherited Items[Index] := Value; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXDock } + +constructor TSpTBXDock.Create(AOwner: TComponent); +begin + inherited; + Color := clNone; + SkinManager.AddSkinNotification(Self); +end; + +destructor TSpTBXDock.Destroy; +begin + SkinManager.RemoveSkinNotification(Self); + inherited; +end; + +function TSpTBXDock.CanResize(var NewWidth, NewHeight: Integer): Boolean; +begin + FPrevWidth := Width; + FPrevHeight := Height; + Result := inherited CanResize(NewWidth, NewHeight); +end; + +procedure TSpTBXDock.DoDrawBackground(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawBackground) then FOnDrawBackground(Self, ACanvas, ARect, PaintStage, PaintDefault); +end; + +procedure TSpTBXDock.DrawBackground(DC: HDC; const DrawRect: TRect); +var + ACanvas: TCanvas; + PaintDefault: Boolean; +begin + // OnDrawBackground should be used to paint all the toolbars + dock, it is + // used by TSpTBXStatusBar and TSpTBXDockablePanel to paint the whole client + // area with custom painting. + // OnDrawBackground is triggered by the Dock and by the docked Toolbar. + if (csDestroying in ComponentState) then Exit; + + ACanvas := TCanvas.Create; + try + ACanvas.Handle := DC; + ACanvas.Lock; + + PaintDefault := True; + DoDrawBackground(ACanvas, DrawRect, pstPrePaint, PaintDefault); + if PaintDefault then + InternalDrawBackground(ACanvas, DrawRect); + + PaintDefault := True; + DoDrawBackground(ACanvas, DrawRect, pstPostPaint, PaintDefault); + finally + ACanvas.Unlock; + ACanvas.Handle := 0; + ACanvas.Free; + end; +end; + +procedure TSpTBXDock.InternalDrawBackground(ACanvas: TCanvas; ARect: TRect); +begin + if (csDestroying in ComponentState) then Exit; + + // Paint the Bitmap if it's assigned, or use the skin, or use the Color + if UsingBitmap then + inherited + else + if Color = clNone then + SpDrawXPDock(ACanvas, ARect, SkinManager.GetSkinType, Position in [dpLeft, dpRight]) + else begin + ACanvas.Brush.Color := Color; + ACanvas.FillRect(ARect); + end; +end; + +procedure TSpTBXDock.Resize; +var + I, J: Integer; + ResizeToolbars: Boolean; + V: TTBItemViewer; + R: TRect; +begin + inherited Resize; + + // For anchored and right aligned items + if Position in [dpLeft, dpRight] then + ResizeToolbars := Height < FPrevHeight + else + ResizeToolbars := Width < FPrevWidth; + if ResizeToolbars then + for I := 0 to ToolbarCount - 1 do + if Toolbars[I] is TSpTBXToolbar then + TSpTBXToolbar(Toolbars[I]).Resize; + + // Invalidate the dock and the toolbars + for J := 0 to ToolbarCount - 1 do begin + Invalidate; + if Toolbars[J] is TSpTBXToolbar then begin + with TSpTBXToolbar(Toolbars[J]) do begin + // Invalidate Control Items + for I := 0 to View.ViewerCount - 1 do begin + V := View.Viewers[I]; + if V.Show and not IsRectEmpty(V.BoundsRect) and not (V.Item is TTBControlItem) then + View.Invalidate(V); + end; + // Invalidate Toolbar + Update; + if HandleAllocated then + RedrawWindow(Handle, nil, 0, RDW_FRAME or RDW_INVALIDATE or RDW_ERASE); + // Invalidate Items + for I := 0 to View.ViewerCount - 1 do begin + V := View.Viewers[I]; + if V.Show and not IsRectEmpty(V.BoundsRect) and not (V.Item is TTBControlItem) then begin + R := V.BoundsRect; + ValidateRect(Handle, @R); + end; + end; + end; + end + else + if Toolbars[J] is TSpTBXCustomToolWindow then + with TSpTBXCustomToolWindow(Toolbars[J]) do begin + if HandleAllocated then + RedrawWindow(Handle, nil, 0, RDW_FRAME or RDW_INVALIDATE or RDW_ERASE); + end; + end; +end; + +function TSpTBXDock.UsingBackground: Boolean; +begin + // UsingBackground is used by TTB2Dock to repaint the Dock and Toolbars + // To check if the Dock is using a Bitmap use SpIsUsingBitmap instead + Result := True; +end; + +function TSpTBXDock.UsingBitmap: Boolean; +begin + Result := SpIsDockUsingBitmap(Self); +end; + +procedure TSpTBXDock.WMEraseBkgnd(var Message: TWMEraseBkgnd); +begin + DrawBackground(Message.DC, ClientRect); + Message.Result := 1; +end; + +procedure TSpTBXDock.WMMove(var Message: TWMMove); +begin + FMoving := True; + inherited; + FMoving := False; +end; + +procedure TSpTBXDock.WMSize(var Message: TWMSize); +begin + FResizing := True; + inherited; + FResizing := False; +end; + +procedure TSpTBXDock.WMSpSkinChange(var Message: TMessage); +begin + Invalidate; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXToolbarView } + +constructor TSpTBXToolbarView.Create(AOwner: TComponent; AParentView: TTBView; + AParentItem: TTBCustomItem; AWindow: TWinControl; + AIsToolbar, ACustomizing, AUsePriorityList: Boolean); +begin + inherited; + FMaxSize := -1; +end; + +procedure TSpTBXToolbarView.DoUpdatePositions(var ASize: TPoint); +var + I, W, H: Integer; + CtlCanvas: TControlCanvas; +begin + // Find the tallest item size so we can stretch the items + // vertically (if Toolbar.Stretch is true) + FTallestItemSize := 0; + + if Assigned(Window) and Window.HandleAllocated and + (Window.ClientWidth > 0) and (Window.ClientHeight > 0) and + (ViewerCount > 2) then + begin + CtlCanvas := TControlCanvas.Create; + try + CtlCanvas.Control := Window; + for I := 0 to ViewerCount - 1 do begin + W := 0; + H := 0; + if TTBCustomItem(Viewers[I].Item).Visible then + if Viewers[I] is TSpTBXItemViewer then + TSpTBXItemViewer(Viewers[I]).InternalCalcSize(CtlCanvas, False, W, H) + else + TTBItemViewerAccess(Viewers[I]).CalcSize(CtlCanvas, W, H); + if Orientation = tbvoVertical then begin + if W > FTallestItemSize then FTallestItemSize := W; + end + else + if H > FTallestItemSize then FTallestItemSize := H; + end; + finally + CtlCanvas.Free; + end; + end; + + inherited DoUpdatePositions(ASize); +end; + +procedure TSpTBXToolbarView.SetMaxSize(const Value: Integer); +begin + if FMaxSize <> Value then begin + FMaxSize := Value; + UpdatePositions; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXToolbar } + +constructor TSpTBXToolbar.Create(AOwner: TComponent); +begin + inherited; + ControlStyle := ControlStyle - [csOpaque]; + Color := clNone; + + Items.RegisterNotification(DoItemNotification); + FAnchoredControlItems := TSpTBXItemCacheCollection.Create(TSpTBXItemCache); + FChevronVertical := True; + FCustomizable := True; + FDisplayMode := tbdmSelectiveCaption; + SkinManager.AddSkinNotification(Self); +end; + +destructor TSpTBXToolbar.Destroy; +begin + SkinManager.RemoveSkinNotification(Self); + Items.UnRegisterNotification(DoItemNotification); + FAnchoredControlItems.Free; + inherited; +end; + +procedure TSpTBXToolbar.CreateWindowHandle(const Params: TCreateParams); +begin + {$IFNDEF UNICODE} + CreateUnicodeHandle(Self, Params, ''); + {$ELSE} + inherited; + {$ENDIF} +end; + +procedure TSpTBXToolbar.DefineProperties(Filer: TFiler); +begin + inherited; + // Don't let the streaming system store the WideStrings, + // we need to store them manually + SpPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +procedure TSpTBXToolbar.DoDrawBackground(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawBackground) then FOnDrawBackground(Self, ACanvas, ARect, + PaintStage, PaintDefault); +end; + +procedure TSpTBXToolbar.DoItemClick(Item: TTBCustomItem; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + // Force OnClick event, by default tbisClicksTransparent Items doesn't get executed + if (Button = mbLeft) and Item.Enabled then + if (tbisClicksTransparent in TTBCustomItemAccess(Item).ItemStyle) then + if Assigned(Item.OnClick) then Item.OnClick(Item); +end; + +procedure TSpTBXToolbar.DoItemNotification(Ancestor: TTBCustomItem; + Relayed: Boolean; Action: TTBItemChangedAction; Index: Integer; + Item: TTBCustomItem); +var + I: Integer; +begin + if (csDestroying in ComponentState) or (csReading in ComponentState) then Exit; + + if not (tstResizing in FState) and not IsItemMoving then begin + if Assigned(FOnItemNotification) then FOnItemNotification(Self, Ancestor, Relayed, Action, Index, Item); + + case Action of + tbicInserted: + begin + RightAlignItems; + AnchorItems(True); + end; + tbicDeleting: + begin + I := FAnchoredControlItems.IndexOf(Item); + if I > -1 then + FAnchoredControlItems.Delete(I); + RightAlignItems; + AnchorItems(True); + end; + tbicInvalidateAndResize: + begin + RightAlignItems; + end; + end; + end; +end; + +procedure TSpTBXToolbar.Resize; +begin + FState := FState + [tstResizing]; + try + RightAlignItems; + AnchorItems; + finally + FState := FState - [tstResizing]; + end; + inherited; +end; + +procedure TSpTBXToolbar.AnchorItems(UpdateControlItems: Boolean); +var + I, J, UpdatedDelta: Integer; + SpIV: TSpTBXItemViewer; + Size: TPoint; + CI: TTBControlItem; + IV: TTBItemViewer; + IsRotated: Boolean; +begin + if (csDestroying in ComponentState) or + (tstAnchoring in FState) or not Assigned(CurrentDock) or + (CurrentDock.Width = 0) or (CurrentDock.Height = 0) or + not Stretch or (ShrinkMode <> tbsmNone) then + Exit; + + FState := FState + [tstAnchoring]; + View.BeginUpdate; + try + View.ValidatePositions; + IsRotated := IsVertical; + // Adjust the delta, only used when inserting/deleting an item on the toolbar + UpdatedDelta := 0; + if (FLastSelectableWidth > 0) and UpdateControlItems then begin + IV := View.NextSelectable(nil, False); + if Assigned(IV) then + if IsRotated then + UpdatedDelta := FLastSelectableWidth - IV.BoundsRect.Bottom + else + UpdatedDelta := FLastSelectableWidth - IV.BoundsRect.Right; + end; + + // Calculate the Toolbar size + Size := Point(CurrentDock.Width, CurrentDock.Height); + + // Resize the anchored items + for I := 0 to View.ViewerCount - 1 do + if View.Viewers[I] is TSpTBXItemViewer then begin + SpIV := View.Viewers[I] as TSpTBXItemViewer; + if SpIV.Item.Anchored then begin + // Revalidate FAnchorSize and set FAnchorDelta + if (SpIV.FAnchorSize.X = 0) and (SpIV.FAnchorSize.Y = 0) then + SpIV.FAnchorSize := Size; + + // Adjust the delta, only used when inserting/deleting an item on + // the toolbar and resize + if IsRotated then begin + SpIV.FAnchorSize.Y := SpIV.FAnchorSize.Y - UpdatedDelta; + SpIV.FAnchorDelta := Size.Y - SpIV.FAnchorSize.Y; + end + else begin + SpIV.FAnchorSize.X := SpIV.FAnchorSize.X - UpdatedDelta; + SpIV.FAnchorDelta := Size.X - SpIV.FAnchorSize.X; + end; + end; + end + else begin + // Client align TTBControlItem items if the associated Control is client + // aligned or has akRight in its Anchors property. + CI := IsAnchoredControlItem(View.Viewers[I].Item); + J := FAnchoredControlItems.IndexOf(View.Viewers[I].Item); + if Assigned(CI) then begin + // Add the TTBControlItem item to the list if its not there + if J = -1 then begin + J := FAnchoredControlItems.Add(CI); + FAnchoredControlItems[J].Width := CI.Control.Width; + FAnchoredControlItems[J].Height := CI.Control.Height; + FAnchoredControlItems[J].ParentWidth := Size.X; + FAnchoredControlItems[J].ParentHeight := Size.Y; + FAnchoredControlItems[J].Dock := CurrentDock; + end; + // Resize + if FAnchoredControlItems[J].Dock = CurrentDock then begin + FAnchoredControlItems[J].Width := FAnchoredControlItems[J].Width + UpdatedDelta; + CI.Control.Width := FAnchoredControlItems[J].Width + (Size.X - FAnchoredControlItems[J].ParentWidth); + end; + end + else + // If ControlItem is not valid delete it from the list + if J > -1 then + FAnchoredControlItems.Delete(J); + end; + View.UpdatePositions; + finally + View.EndUpdate; + FState := FState - [tstAnchoring]; + end; + + // We can't calculate the delta based on the IV.BoundsRect because + // the IV is nil on tbicDeleting notification. + // We have to keep track of the sum of the selectable items width + IV := View.NextSelectable(nil, False); + if Assigned(IV) then begin + if IsRotated then + FLastSelectableWidth := IV.BoundsRect.Bottom + else + FLastSelectableWidth := IV.BoundsRect.Right; + end + else + FLastSelectableWidth := 0; +end; + +function TSpTBXToolbar.IsAnchoredControlItem(Item: TTBCustomItem): TTBControlItem; +var + CI: TTBControlItem; +begin + Result := nil; + if Assigned(CurrentDock) and (Item is TTBControlItem) then begin + CI := Item as TTBControlItem; + if Assigned(CI.Control) and + ((CI.Control.Align = alClient) or (akRight in CI.Control.Anchors)) then + begin + Result := CI; + end + else + Result := nil; + end; +end; + +procedure TSpTBXToolbar.RightAlignItems; +var + I, VisibleWidth, RightAlignedWidth: Integer; + Spacer: TSpTBXItemViewer; + IsRotated: Boolean; +begin + if (csDestroying in ComponentState) or (tstRightAligning in FState) or + not Assigned(CurrentDock) or (Items.Count <= 0) or + not Stretch or (ShrinkMode <> tbsmNone) or + ((CurrentDock.Width = 0) and (CurrentDock.Height = 0)) then + Exit; + + FState := FState + [tstRightAligning]; + View.ValidatePositions; + View.BeginUpdate; + try + // Find the spacer and the right aligned items + IsRotated := IsVertical; + Spacer := SpGetRightAlignedItems(View, nil, IsRotated, VisibleWidth, RightAlignedWidth); + if Assigned(Spacer) then begin + // Resize the spacer + if IsRotated then + I := CurrentDock.Height - GetRightAlignMargin - (VisibleWidth - (Spacer.BoundsRect.Bottom - Spacer.BoundsRect.Top)) + else + I := CurrentDock.Width - GetRightAlignMargin - (VisibleWidth - (Spacer.BoundsRect.Right - Spacer.BoundsRect.Left)); + + if I < 0 then I := 0; + Spacer.Item.CustomWidth := I; + end; + View.UpdatePositions; + finally + View.EndUpdate; + FState := FState - [tstRightAligning]; + end; +end; + +function TSpTBXToolbar.GetChevronItemClass: TTBChevronItemClass; +begin + Result := TSpTBXChevronItem; +end; + +function TSpTBXToolbar.GetFloatingBorderSize: TPoint; +begin + if SkinManager.GetSkinType = sknSkin then + Result := Point(CurrentSkin.FloatingWindowBorderSize, CurrentSkin.FloatingWindowBorderSize) + else + Result := inherited GetFloatingBorderSize; +end; + +function TSpTBXToolbar.GetFloatingWindowParentClass: TTBFloatingWindowParentClass; +begin + Result := TSpTBXFloatingWindowParent; +end; + +function TSpTBXToolbar.GetRightAlignMargin: Integer; +begin + if IsVertical then + Result := NonClientHeight + else + Result := NonClientWidth; +end; + +function TSpTBXToolbar.GetViewClass: TTBToolbarViewClass; +begin + Result := TSpTBXToolbarView; +end; + +function TSpTBXToolbar.GetItemsTextColor(State: TSpTBXSkinStatesType): TColor; +begin + if vsMenuBar in View.Style then + Result := CurrentSkin.GetTextColor(skncMenuBarItem, State) + else + Result := CurrentSkin.GetTextColor(skncToolbarItem, State); +end; + +function TSpTBXToolbar.IsVertical: Boolean; +begin + Result := SpIsVerticalToolbar(Self); +end; + +procedure TSpTBXToolbar.InternalDrawBackground(ACanvas: TCanvas; ARect: TRect; + PaintOnNCArea: Boolean; PaintBorders: Boolean = True); +begin + SpDrawXPToolbar(Self, ACanvas, ARect, PaintOnNCArea, PaintBorders and (BorderStyle <> bsNone)); +end; + +procedure TSpTBXToolbar.DrawNCArea(const DrawToDC: Boolean; const ADC: HDC; + const Clip: HRGN); +var + DC: HDC; + R, ExcludeR: TRect; + GripSize: Integer; + ACanvas: TCanvas; +begin + if (csDestroying in ComponentState) or not Docked or not HandleAllocated then Exit; + + if not DrawToDC then DC := GetWindowDC(Handle) + else DC := ADC; + try + GetWindowRect(Handle, R); + OffsetRect(R, -R.Left, -R.Top); + GripSize := SpGetDragHandleSize(Self); + + if not DrawToDC then begin + SelectNCUpdateRgn(Handle, DC, Clip); + ExcludeR := R; + InflateRect(ExcludeR, -DefaultToolbarBorderSize, -DefaultToolbarBorderSize); + if IsVertical then + Inc(ExcludeR.Top, GripSize) + else + Inc(ExcludeR.Left, GripSize); + ExcludeClipRect(DC, ExcludeR.Left, ExcludeR.Top, ExcludeR.Right, ExcludeR.Bottom); + end; + + ACanvas := TCanvas.Create; + try + ACanvas.Handle := DC; + + // Paint the background and borders + InternalDrawBackground(ACanvas, R, True); + + // Paint the grip and close button + SpDrawXPToolbarGrip(Self, ACanvas, R); + finally + ACanvas.Handle := 0; + ACanvas.Free; + end; + finally + if not DrawToDC then ReleaseDC(Handle, DC); + end; +end; + +procedure TSpTBXToolbar.CMHintShow(var Message: TCMHintShow); +// Dispatch the message to the Item Viewer. +// TSpTBXItemViewer will handle CM_HINTSHOW message to show unicode hints using +// a custom THintWindow. +begin + with Message.HintInfo^ do begin + HintStr := ''; + if Assigned(View.Selected) then begin + CursorRect := View.Selected.BoundsRect; + HintStr := View.Selected.GetHintText; + View.Selected.Dispatch(Message); + end; + end; +end; + +procedure TSpTBXToolbar.CMControlChange(var Message: TCMControlChange); +begin + // When a control is dropped on the toolbar a TTBControlItem is created by + // TTBCustomToolbar.CreateWrapper, unfortunately it is created with the + // Self.Owner instead of the Form (Owner.Owner for CompoundToolbars like + // the TabToolbar or StatusToolbar). + + if CompoundToolbar and Message.Inserting and not(csLoading in ComponentState) and + not (csUpdating in ComponentState) then + begin + CreateWrapper(Items.Count, Message.Control); + end + else + inherited; +end; + +function TSpTBXToolbar.CreateWrapper(Index: Integer; Ctl: TControl): TTBControlItem; +// CreateWrapper is used only when CompoundToolbar is true, otherwise the +// wrapper is created by TB2K +var + I: Integer; + S: String; + C: TComponent; + ItemsInterface: ITBItems; +begin + Result := nil; + if SpFindControlItem(Items, Ctl) <> nil then Exit; + + C := Owner.Owner; // The Form + Result := TTBControlItem.Create(C); + Result.Control := Ctl; + if (csDesigning in ComponentState) and Assigned(C) then begin + { Needs a name for compatibility with form inheritance } + I := 1; + while True do begin + S := Format('TBControlItem%d', [I]); + if C.FindComponent(S) = nil then + Break; + Inc(I); + end; + Result.Name := S; + end; + + if CompoundToolbar then begin + if Assigned(Owner) and Owner.GetInterface(ITBItems, ItemsInterface) then begin + if Index > ItemsInterface.GetItems.Count then + Index := 0; + ItemsInterface.GetItems.Insert(Index, Result) + end; + end + else + Items.Insert(Index, Result); +end; + +procedure TSpTBXToolbar.CMDialogChar(var Message: TCMDialogChar); +var + I: Integer; +begin + if Enabled and Visible then + for I := 0 to Items.Count - 1 do + if Items[I] is TSpTBXCustomItem then + if TSpTBXCustomItem(Items[I]).DialogChar(Message.CharCode) then begin + Message.Result := 1; + Exit; + end; + inherited; +end; + +procedure TSpTBXToolbar.CMMouseleave(var Message: TMessage); +begin + inherited; + if IsCustomizing and FCustomizable then begin + // Clear the last DropMark + InvalidateRect(Handle, @FLastDropMark, True); + end; +end; + +procedure TSpTBXToolbar.CMTextChanged(var Message: TMessage); +begin + inherited; + if HandleAllocated then begin + if Floating then RedrawWindow(TSpTBXFloatingWindowParent(Parent).Handle, nil, 0, RDW_FRAME or RDW_INVALIDATE) + else RedrawWindow(Handle, nil, 0, RDW_FRAME or RDW_INVALIDATE) + end; +end; + +procedure TSpTBXToolbar.WMSpSkinChange(var Message: TMessage); +begin + if HandleAllocated and not Floating then + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN or RDW_FRAME); +end; + +procedure TSpTBXToolbar.WMEraseBkgnd(var Message: TWMEraseBkgnd); +// Same as TSpTBXToolWindow.WMEraseBkgnd +var + ACanvas: TCanvas; + R: TRect; +begin + if (csDestroying in ComponentState) then Exit; + + Message.Result := 1; + ACanvas := TCanvas.Create; + ACanvas.Handle := Message.DC; + try + R := ClientRect; + if Docked then begin + InflateRect(R, DefaultToolbarBorderSize, DefaultToolbarBorderSize); + if IsVertical then + Dec(R.Top, SpGetDragHandleSize(Self)) + else + Dec(R.Left, SpGetDragHandleSize(Self)); + end; + + InternalDrawBackground(ACanvas, R, False); + finally + ACanvas.Handle := 0; + ACanvas.Free; + end; +end; + +procedure TSpTBXToolbar.WMSize(var Message: TWMSize); +var + I: Integer; + V: TTBItemViewer; + R: TRect; +begin + inherited; + + if Docked and ((CurrentDock is TSpTBXDock) and not TSpTBXDock(CurrentDock).FResizing) then begin + for I := 0 to View.ViewerCount - 1 do begin + V := View.Viewers[I]; + if V.Show and not IsRectEmpty(V.BoundsRect) and not (V.Item is TTBControlItem) then + View.Invalidate(V); + end; + Self.Update; + InvalidateRect(Handle, nil, True); + for I := 0 to View.ViewerCount - 1 do begin + V := View.Viewers[I]; + if V.Show and not IsRectEmpty(V.BoundsRect) and not (V.Item is TTBControlItem) then begin + R := V.BoundsRect; + ValidateRect(Handle, @R); + end; + end; + end; +end; + +{$IFNDEF UNICODE} +function TSpTBXToolbar.IsCaptionStored: Boolean; +begin + Result := TntControl_IsCaptionStored(Self); +end; + +function TSpTBXToolbar.GetCaption: TWideCaption; +begin + Result := TntControl_GetText(Self); +end; + +procedure TSpTBXToolbar.SetCaption(const Value: TWideCaption); +begin + TntControl_SetText(Self, Value); +end; + +function TSpTBXToolbar.GetHint: WideString; +begin + Result := TntControl_GetHint(Self); +end; + +procedure TSpTBXToolbar.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; +{$ENDIF} + +procedure TSpTBXToolbar.SetDisplayMode(const Value: TSpTBXToolbarDisplayMode); +begin + if FDisplayMode <> Value then begin + FDisplayMode := Value; + if Value = tbdmImageAboveCaption then + Options := Options + [tboImageAboveCaption, tboSameWidth] + else + Options := Options - [tboImageAboveCaption, tboSameWidth]; + View.UpdatePositions; + end; +end; + +function TSpTBXToolbar.GetMaxSize: Integer; +begin + if Assigned(View) then + Result := TSpTBXToolbarView(View).MaxSize + else + Result := -1; +end; + +procedure TSpTBXToolbar.SetMaxSize(const Value: Integer); +begin + if Assigned(View) then + TSpTBXToolbarView(View).MaxSize := Value; +end; + +procedure TSpTBXToolbar.BeginItemMove; +begin + Inc(FItemMovingCount); +end; + +procedure TSpTBXToolbar.EndItemMove; +begin + Dec(FItemMovingCount); + if FItemMovingCount < 0 then FItemMovingCount := 0; +end; + +function TSpTBXToolbar.IsItemMoving: Boolean; +begin + Result := FItemMovingCount > 0; +end; + +procedure TSpTBXToolbar.BeginCustomize; +begin + Inc(FCustomizingCount); +end; + +procedure TSpTBXToolbar.EndCustomize; +begin + Dec(FCustomizingCount); + if FCustomizingCount < 0 then FCustomizingCount := 0; +end; + +function TSpTBXToolbar.IsCustomizing: Boolean; +begin + Result := FCustomizingCount > 0; +end; + +function TSpTBXToolbar.CanDragCustomize(Button: TMouseButton; Shift: TShiftState; X, Y: Integer): Boolean; +var + IV: TTBItemViewer; +begin + Result := False; + FBeginDragIV := nil; + + if not (csDesigning in ComponentState) and IsCustomizing then begin + Result := True; + if FCustomizable then begin + IV := SpGetItemViewerFromPoint(Items, View, Point(X, Y)); + if Assigned(IV) and Assigned(IV.Item) and not (IV.Item is TTBChevronItem) then begin + FBeginDragIV := IV; + BeginDrag(True); + end; + end; + end; +end; + +function TSpTBXToolbar.CanItemClick(Item: TTBCustomItem; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer): Boolean; +begin + Result := True; +end; + +procedure TSpTBXToolbar.MouseMove(Shift: TShiftState; X, Y: Integer); +var + Item: TTBCustomItem; +begin + inherited; + + // Handle the Toolbar items hints + // Set the Toolbar.Hint to change the Application.Hint when the + // mouse is over the Item. + // From TB2Toolbar.MouseMove + if not (csDesigning in ComponentState) then begin + if Assigned(View.Selected) then begin + Item := View.Selected.Item; + if not (tboLongHintInMenuOnly in Item.EffectiveOptions) then + if Item is TSpTBXCustomItem then + Hint := TSpTBXCustomItem(Item).Hint + else + Hint := Item.Hint; + // Send MouseMove to the selected viewer (with TB2K MouseMove is only + // called when the modal handler is active, we need this on the toolbar + // for the tab close button) + if View.Selected is TSpTBXItemViewer then + TSpTBXItemViewer(View.Selected).InternalMouseMove(Shift, X, Y); + end; + end; +end; + +procedure TSpTBXToolbar.MouseDown(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); +var + OldParent: TWinControl; + CurrentPos, OldPos: TPoint; + Item: TTBCustomItem; +begin + if not (csDesigning in ComponentState) and not CanDragCustomize(Button, Shift, X, Y) then begin + OldParent := Parent; + OldPos := ClientToScreen(Point(Left, Top)); + if Assigned(View.Selected) then + Item := View.Selected.Item + else + Item := nil; + + if CanItemClick(Item, Button, Shift, X, Y) then + inherited; + + // Check if the Parent was changed due to the toolbar moving between docks + if (Parent = OldParent) and Assigned(View.Selected) then begin + // Check if the toolbar was moved across the screen + CurrentPos := ClientToScreen(Point(Left, Top)); + if (CurrentPos.X = OldPos.X) and (CurrentPos.Y = OldPos.Y) then + DoItemClick(View.Selected.Item, Button, Shift, X, Y); // Extra click processing + end; + end; +end; + +procedure TSpTBXToolbar.DoStartDrag(var DragObject: TDragObject); +begin + if IsCustomizing and FCustomizable and Assigned(FBeginDragIV) and Assigned(FBeginDragIV.Item) then begin + // TSpTBXItemDragObject will be automatically destroyed since it's + // a descendant of TDragObjectEx. + // It's destroyed on Controls.DragDone + DragObject := TSpTBXItemDragObject.Create(Self, FBeginDragIV.Item); + inherited DoStartDrag(DragObject); + end; +end; + +procedure TSpTBXToolbar.DragOver(Source: TObject; X, Y: Integer; + State: TDragState; var Accept: Boolean); +var + DestIV: TTBItemViewer; + DestPos: Integer; + DropMark: TRect; +begin + inherited DragOver(Source, X, Y, State, Accept); + + if IsCustomizing and FCustomizable then begin + Accept := True; + SpGetDropPosItemViewer(Items, View, Point(X, Y), DestIV, DestPos, DropMark); + if not EqualRect(DropMark, FLastDropMark) then begin + // Clear the last DropMark + InvalidateRect(Handle, @FLastDropMark, True); + // Draw the new DropMark + SpDrawDropMark(Canvas, DropMark); + FLastDropMark := DropMark; + end; + end; +end; + +procedure TSpTBXToolbar.DragDrop(Source: TObject; X, Y: Integer); +var + D: TSpTBXItemDragObject; + DestIV: TTBItemViewer; + OrigItem: TTBCustomItem; + OrigPos, DestPos: Integer; + DropMark: TRect; +begin + if Assigned(Source) and (Source is TSpTBXItemDragObject) then begin + D := Source as TSpTBXItemDragObject; + OrigItem := D.SouceItem; + OrigPos := OrigItem.Parent.IndexOf(OrigItem); + + // Get the destination item position + if X < 0 then X := 0; + if Y < 0 then Y := 0; + SpGetDropPosItemViewer(Items, View, Point(X, Y), DestIV, DestPos, DropMark); + if OrigItem.Parent = Items then begin + if DestPos > OrigPos then + dec(DestPos); + if (OrigPos = DestPos) then begin + // Clear the last DropMark + InvalidateRect(Handle, @FLastDropMark, True); + Exit; + end; + end; + + if Assigned(DestIV) and (DestPos < 0) then Exit; + + // Insert the dragging item to the destination toolbar + OrigItem.Parent.Remove(OrigItem); + try + if Assigned(DestIV) then + Items.Insert(DestPos, OrigItem) + else + Items.Add(OrigItem); + + if OrigItem is TTBControlItem then + if D.SourceControl <> Self then + TTBControlItem(OrigItem).Control.Parent := Self; + + OrigItem.Visible := True; + FLastDropMark := Rect(0, 0, 0, 0); + except + OrigItem.Parent.Insert(OrigPos, OrigItem); + end; + end; + + inherited; +end; + +procedure TSpTBXToolbar.ReadPositionData(const Data: TTBReadPositionData); +begin + inherited; + with Data do + DisplayMode := TSpTBXToolbarDisplayMode(ReadIntProc(Name, rvSpTBXDisplayMode, 0, ExtraData)); +end; + +procedure TSpTBXToolbar.WritePositionData(const Data: TTBWritePositionData); +begin + inherited; + with Data do + WriteIntProc(Name, rvSpTBXDisplayMode, Integer(DisplayMode), ExtraData); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomToolWindow } + +constructor TSpTBXCustomToolWindow.Create(AOwner: TComponent); +begin + inherited; + FMinClientWidth := 32; + FMinClientHeight := 32; + SetBounds(Left, Top, FMinClientWidth, FMinClientHeight); + + Color := clNone; + SkinManager.AddSkinNotification(Self); +end; + +destructor TSpTBXCustomToolWindow.Destroy; +begin + SkinManager.RemoveSkinNotification(Self); + inherited; +end; + +procedure TSpTBXCustomToolWindow.CreateWindowHandle(const Params: TCreateParams); +begin + {$IFNDEF UNICODE} + CreateUnicodeHandle(Self, Params, ''); + {$ELSE} + inherited; + {$ENDIF} +end; + +procedure TSpTBXCustomToolWindow.DefineProperties(Filer: TFiler); +begin + inherited; + // Don't let the streaming system store the WideStrings, + // we need to store them manually + SpPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TSpTBXCustomToolWindow.CalcSize(ADock: TTBDock): TPoint; +begin + Result.X := FBarSize.cx; + Result.Y := FBarSize.cy; + if Assigned(ADock) and (FullSize or Stretch) then begin + // If docked and stretching, return the minimum size so that the + // toolbar can shrink below FBarSize + if SpIsVerticalToolbar(Self) then + Result.Y := FMinClientHeight + else + Result.X := FMinClientWidth; + end; +end; + +function TSpTBXCustomToolWindow.DoArrange(CanMoveControls: Boolean; + PreviousDockType: TTBDockType; NewFloating: Boolean; NewDock: TTBDock): TPoint; +begin + Result := CalcSize(NewDock); +end; + +procedure TSpTBXCustomToolWindow.GetBaseSize(var ASize: TPoint); +begin + ASize := CalcSize(CurrentDock); +end; + +procedure TSpTBXCustomToolWindow.GetMinMaxSize(var AMinClientWidth, AMinClientHeight, + AMaxClientWidth, AMaxClientHeight: Integer); +begin + // GetMinMaxSize is used only when the window is floating + AMinClientWidth := FMinClientWidth; + AMinClientHeight := FMinClientHeight; + AMaxClientWidth := FMaxClientWidth; + AMaxClientHeight := FMaxClientHeight; +end; + +function TSpTBXCustomToolWindow.IsVertical: Boolean; +begin + Result := SpIsVerticalToolbar(Self); +end; + +procedure TSpTBXCustomToolWindow.SizeChanging(const AWidth, AHeight: Integer); +begin + FBarSize.cx := AWidth; + FBarSize.cy := AHeight; + if Assigned(Parent) then begin + Dec(FBarSize.cx, Width - ClientWidth); + Dec(FBarSize.cy, Height - ClientHeight); + end; +end; + +procedure TSpTBXCustomToolWindow.SetClientAreaSize(AWidth, AHeight: Integer); +var + R: TRect; +begin + if Assigned(Parent) then begin + Windows.GetClientRect(Handle, R); + SetBounds(Left, Top, Width - R.Right + AWidth, Height - R.Bottom + AHeight); + end + else + SetBounds(Left, Top, AWidth, AHeight); +end; + +procedure TSpTBXCustomToolWindow.Paint; +var + R: TRect; +begin + // Dotted border in design mode + if csDesigning in ComponentState then begin + R := ClientRect; + Canvas.Pen.Style := psDot; + Canvas.Pen.Color := clBtnShadow; + Canvas.Brush.Style := bsClear; + Canvas.Rectangle(R.Left, R.Top, R.Right, R.Bottom); + Canvas.Pen.Style := psSolid; + end; +end; + +procedure TSpTBXCustomToolWindow.InternalDrawBackground(ACanvas: TCanvas; + ARect: TRect; PaintOnNCArea, PaintBorders: Boolean); +begin + SpDrawXPToolbar(Self, ACanvas, ARect, PaintOnNCArea, PaintBorders and (BorderStyle <> bsNone)); +end; + +procedure TSpTBXCustomToolWindow.InvalidateBackground(InvalidateChildren: Boolean); +begin + // Force background repaint + if not (csDestroying in ComponentState) and HandleAllocated then + if InvalidateChildren then + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN) + else + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE); +end; + +procedure TSpTBXCustomToolWindow.DrawNCArea(const DrawToDC: Boolean; + const ADC: HDC; const Clip: HRGN); +var + DC: HDC; + R, ExcludeR: TRect; + GripSize: Integer; + ACanvas: TCanvas; +begin + if (csDestroying in ComponentState) or not Docked or not HandleAllocated then Exit; + + if not DrawToDC then DC := GetWindowDC(Handle) + else DC := ADC; + try + GetWindowRect(Handle, R); + OffsetRect(R, -R.Left, -R.Top); + GripSize := SpGetDragHandleSize(Self); + + if not DrawToDC then begin + SelectNCUpdateRgn(Handle, DC, Clip); + ExcludeR := R; + InflateRect(ExcludeR, -DefaultToolbarBorderSize, -DefaultToolbarBorderSize); + if IsVertical then + Inc(ExcludeR.Top, GripSize) + else + Inc(ExcludeR.Left, GripSize); + ExcludeClipRect(DC, ExcludeR.Left, ExcludeR.Top, ExcludeR.Right, ExcludeR.Bottom); + end; + + ACanvas := TCanvas.Create; + try + ACanvas.Handle := DC; + + // Paint the background and borders + InternalDrawBackground(ACanvas, R, True); + + // Paint the grip and close button + SpDrawXPToolbarGrip(Self, ACanvas, R); + finally + ACanvas.Handle := 0; + ACanvas.Free; + end; + finally + if not DrawToDC then ReleaseDC(Handle, DC); + end; +end; + +procedure TSpTBXCustomToolWindow.DoDrawBackground(ACanvas: TCanvas; + ARect: TRect; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawBackground) then FOnDrawBackground(Self, ACanvas, ARect, PaintStage, PaintDefault); +end; + +procedure TSpTBXCustomToolWindow.ReadPositionData(const Data: TTBReadPositionData); +var + W, H: Integer; +begin + inherited; + // Load ClientAreaWidth/ClientAreaHeight + if Resizable then + with Data do begin + W := ReadIntProc(Name, rvClientWidth, FBarSize.cx, ExtraData); + H := ReadIntProc(Name, rvClientHeight, FBarSize.cy, ExtraData); + SetClientAreaSize(W, H); + end; +end; + +procedure TSpTBXCustomToolWindow.WritePositionData(const Data: TTBWritePositionData); +begin + inherited; + // Save ClientAreaWidth/ClientAreaHeight + with Data do begin + WriteIntProc(Name, rvClientWidth, ClientAreaWidth, ExtraData); + WriteIntProc(Name, rvClientHeight, ClientAreaHeight, ExtraData); + end; +end; + +function TSpTBXCustomToolWindow.GetFloatingBorderSize: TPoint; +begin + if SkinManager.GetSkinType = sknSkin then + Result := Point(CurrentSkin.FloatingWindowBorderSize, CurrentSkin.FloatingWindowBorderSize) + else + Result := inherited GetFloatingBorderSize; +end; + +function TSpTBXCustomToolWindow.GetFloatingWindowParentClass: TTBFloatingWindowParentClass; +begin + Result := TSpTBXFloatingWindowParent; +end; + +{$IFNDEF UNICODE} +function TSpTBXCustomToolWindow.IsCaptionStored: Boolean; +begin + Result := TntControl_IsCaptionStored(Self); +end; + +function TSpTBXCustomToolWindow.GetCaption: TWideCaption; +begin + Result := TntControl_GetText(Self); +end; + +procedure TSpTBXCustomToolWindow.SetCaption(const Value: TWideCaption); +begin + TntControl_SetText(Self, Value); +end; +{$ENDIF} + +function TSpTBXCustomToolWindow.GetClientAreaWidth: Integer; +begin + if Assigned(Parent) then Result := ClientWidth + else Result := Width; +end; + +procedure TSpTBXCustomToolWindow.SetClientAreaWidth(Value: Integer); +begin + SetClientAreaSize(Value, ClientAreaHeight); +end; + +function TSpTBXCustomToolWindow.GetClientAreaHeight: Integer; +begin + if Assigned(Parent) then Result := ClientHeight + else Result := Height; +end; + +procedure TSpTBXCustomToolWindow.SetClientAreaHeight(Value: Integer); +begin + SetClientAreaSize(ClientAreaWidth, Value); +end; + +procedure TSpTBXCustomToolWindow.CMTextChanged(var Message: TMessage); +begin + inherited; + if HandleAllocated then begin + if Floating then RedrawWindow(TSpTBXFloatingWindowParent(Parent).Handle, nil, 0, RDW_FRAME or RDW_INVALIDATE) + else RedrawWindow(Handle, nil, 0, RDW_FRAME or RDW_INVALIDATE) + end; +end; + +procedure TSpTBXCustomToolWindow.WMEraseBkgnd(var Message: TWMEraseBkgnd); +// Same as TSpTBXToolbar.WMEraseBkgnd +var + ACanvas: TCanvas; + R: TRect; +begin + if (csDestroying in ComponentState) then Exit; + + Message.Result := 1; + ACanvas := TCanvas.Create; + ACanvas.Handle := Message.DC; + try + R := ClientRect; + if Docked then begin + InflateRect(R, DefaultToolbarBorderSize, DefaultToolbarBorderSize); + if IsVertical then + Dec(R.Top, SpGetDragHandleSize(Self)) + else + Dec(R.Left, SpGetDragHandleSize(Self)); + end; + + InternalDrawBackground(ACanvas, R, False); + finally + ACanvas.Handle := 0; + ACanvas.Free; + end; +end; + +procedure TSpTBXCustomToolWindow.WMSpSkinChange(var Message: TMessage); +begin + if HandleAllocated and not Floating then + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN or RDW_FRAME); +end; + +procedure TSpTBXCustomToolWindow.WMWindowPosChanged(var Message: TWMWindowPosChanged); +begin + inherited; + InvalidateBackground; + if (Message.WindowPos.flags and SWP_NOSIZE) = 0 then begin + Realign; + Update; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXFloatingWindowParent } + +constructor TSpTBXFloatingWindowParent.CreateNew(AOwner: TComponent; + Dummy: Integer); +begin + inherited; + ScreenSnap := True; + SkinManager.AddSkinNotification(Self); +end; + +procedure TSpTBXFloatingWindowParent.CreateWnd; +begin + inherited; + UpdateDwmNCSize; +end; + +destructor TSpTBXFloatingWindowParent.Destroy; +begin + SkinManager.RemoveSkinNotification(Self); + inherited; +end; + +procedure TSpTBXFloatingWindowParent.DrawNCArea(const DrawToDC: Boolean; + const ADC: HDC; const Clip: HRGN; RedrawWhat: TTBToolWindowNCRedrawWhat); +const + Pattern: array [0..15] of Byte = ($C6, 0, $EE, 0, $7C, 0, $38, 0, $7C, 0, $EE, 0, $C6, 0, 0, 0); +var + DC: HDC; + R, CaptionR, CloseR: TRect; + ACanvas: TCanvas; + DockWindow: TTBCustomDockableWindowAccess; + FloatingBorderSize: TPoint; + WideCaption: WideString; + IsActive: Boolean; + Flags: Integer; + CloseButtonWidth: Integer; + SkinState: TSpTBXSkinStatesType; + PatternColor: TColor; +begin + if not HandleAllocated then Exit; + if not DrawToDC then DC := GetWindowDC(Handle) + else DC := ADC; + try + if not DrawToDC then SelectNCUpdateRgn(Handle, DC, Clip); + GetWindowRect(Handle, R); + OffsetRect(R, -R.Left, -R.Top); + with R do IntersectClipRect(DC, Left, Top, Right, Bottom); + ACanvas := TCanvas.Create; + try + ACanvas.Handle := DC; + ACanvas.Brush.Color := Color; // SpDrawXPTitleBarBody needs it to paint the background + GetWindowRect(Handle, R); + OffsetRect(R, -R.Left, -R.Top); + DockWindow := TTBCustomDockableWindowAccess(DockableWindow); + FloatingBorderSize := DockWindow.GetFloatingBorderSize; + IsActive := not DockWindow.InactiveCaption; + + // Borders + if twrdBorder in RedrawWhat then + SpDrawXPTitleBarBody(ACanvas, R, IsActive, FloatingBorderSize, False); + + // Caption + if DockWindow.ShowCaption then begin + R.Bottom := R.Top + FloatingBorderSize.Y + GetSystemMetrics(SM_CYSMCAPTION); + if SkinManager.GetSkinType = sknWindows then begin + if twrdBorder in RedrawWhat then + SpDrawXPTitleBar(ACanvas, R, IsActive, False); + InflateRect(R, -FloatingBorderSize.X, 0); + R.Top := R.Top + FloatingBorderSize.Y; + end + else begin + InflateRect(R, -FloatingBorderSize.X, 0); + R.Top := R.Top + FloatingBorderSize.Y; + if twrdBorder in RedrawWhat then + SpDrawXPTitleBar(ACanvas, R, IsActive, False); + end; + + // Text + if twrdCaption in RedrawWhat then begin + CaptionR := R; + OffsetRect(CaptionR, 2, 0); + if DockWindow.CloseButton then + Dec(CaptionR.Right, GetSystemMetrics(SM_CYSMCAPTION) + 2); + ACanvas.Brush.Style := bsClear; + try + ACanvas.Font.Assign(SmCaptionFont); + if IsActive then + ACanvas.Font.Color := CurrentSkin.GetTextColor(skncWindowTitleBar, sknsNormal) + else + ACanvas.Font.Color := CurrentSkin.GetTextColor(skncWindowTitleBar, sknsDisabled); + + if DockableWindow is TSpTBXToolbar then + WideCaption := TSpTBXToolbar(DockWindow).Caption + else + if DockableWindow is TSpTBXCustomToolWindow then + WideCaption := TSpTBXCustomToolWindow(DockWindow).Caption + else + WideCaption := ''; + SpDrawXPText(ACanvas, WideCaption, CaptionR, DT_SINGLELINE or DT_VCENTER or DT_END_ELLIPSIS or DT_HIDEPREFIX); + finally + ACanvas.Brush.Style := bsSolid; + end; + end; + + // Close button + if (twrdCloseButton in RedrawWhat) and DockWindow.CloseButton then begin + CloseR := R; + Dec(CloseR.Bottom); + CloseButtonWidth := (CloseR.Bottom - CloseR.Top) - 2 - 2; + CloseR.Left := CloseR.Right - CloseButtonWidth - 2; // TB2Dock.GetCloseButtonRect + CloseR.Right := CloseR.Left + CloseButtonWidth; + CloseR.Top := CloseR.Top + 2; + CloseR.Bottom := CloseR.Top + CloseButtonWidth; + + case SkinManager.GetSkinType of + sknNone: + begin + if CloseButtonDown then + DrawFrameControl(ACanvas.Handle, CloseR, DFC_CAPTION, DFCS_CAPTIONCLOSE or DFCS_PUSHED) + else + DrawFrameControl(ACanvas.Handle, CloseR, DFC_CAPTION, DFCS_CAPTIONCLOSE); + end; + sknWindows: + begin + if CloseButtonDown then Flags := CBS_PUSHED + else if FCloseButtonHover then Flags := CBS_HOT + else Flags := CBS_NORMAL; + DrawThemeBackground(ThemeServices.Theme[teWindow], ACanvas.Handle, WP_SMALLCLOSEBUTTON, Flags, CloseR, nil); + end; + sknSkin: + begin + SkinState := CurrentSkin.GetState(True, CloseButtonDown, FCloseButtonHover, False); + PatternColor := CurrentSkin.GetTextColor(skncWindowTitleBar, SkinState); + if PatternColor = clNone then + PatternColor := CurrentSkin.GetTextColor(skncToolbarItem, SkinState); + CurrentSkin.PaintBackground(ACanvas, CloseR, skncToolbarItem, SkinState, True, True); + SpDrawGlyphPattern(ACanvas, CloseR, 0, PatternColor); + end; + end; + end; + end; + finally + ACanvas.Handle := 0; + ACanvas.Free; + end; + finally + if not DrawToDC then ReleaseDC(Handle, DC); + end; +end; + +procedure TSpTBXFloatingWindowParent.RedrawCloseButton; +begin + if HandleAllocated and IsWindowVisible(Handle) then + if SkinManager.GetSkinType <> sknNone then + DrawNCArea(False, 0, 0, [twrdBorder, twrdCaption, twrdCloseButton]); +end; + +procedure TSpTBXFloatingWindowParent.UpdateDwmNCSize; +var + Style: Integer; +begin + if HandleAllocated then begin + // Make sure WS_THICKFRAME is setted only when Windows themes are used with + // DwmComposition, otherwise borders are incorrectly painted on Vista + Style := GetWindowLong(Handle, GWL_STYLE); + if SpIsDwmCompositionEnabled and (SkinManager.GetSkinType = sknWindows) then + Style := Style or WS_THICKFRAME + else + Style := Style and not WS_THICKFRAME; + SetWindowLong(Handle, GWL_STYLE, Style); + + // Update the NC area size, CurrentSkin.FloatingWindowBorderSize could have changed + // Make sure to resize the toolbar + SpRecalcNCArea(Self); + if Assigned(DockableWindow) then + TTBCustomDockableWindowAccess(DockableWindow).Arrange; + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN or RDW_FRAME); + SpActivateDwmNC(Self, SkinManager.GetSkinType <> sknSkin); + end; +end; + +procedure TSpTBXFloatingWindowParent.CancelNCHover; +begin + if FCloseButtonHover then begin + FCloseButtonHover := False; + RedrawCloseButton; + end; +end; + +procedure TSpTBXFloatingWindowParent.VisibleChanging; +begin + inherited; + Caption := ''; +end; + +procedure TSpTBXFloatingWindowParent.CMMouseLeave(var Message: TMessage); +begin + inherited; + CancelNCHover; +end; + +procedure TSpTBXFloatingWindowParent.WMActivateApp(var Message: TWMActivateApp); +var + DockWindow: TTBCustomDockableWindowAccess; +begin + inherited; + + // The floating window is not repainted correctly if HideWhenInactive is + // false and the application is deactivated/activated. + if HandleAllocated then begin + DockWindow := TTBCustomDockableWindowAccess(DockableWindow); + if not DockWindow.HideWhenInactive then + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN); + end; +end; + +procedure TSpTBXFloatingWindowParent.WMClose(var Message: TWMClose); +begin + if FCloseOnAltF4 then begin + if Assigned(DockableWindow) then + TTBCustomDockableWindowAccess(DockableWindow).Close; + end + else + inherited; +end; + +procedure TSpTBXFloatingWindowParent.WMEraseBkgnd(var Message: TMessage); +begin + Message.Result := 1; +end; + +procedure TSpTBXFloatingWindowParent.WMNCMouseLeave(var Message: TMessage); +begin + if not MouseCapture then CancelNCHover; + inherited; +end; + +procedure TSpTBXFloatingWindowParent.WMNCMouseMove(var Message: TWMNCMouseMove); +var + InArea: Boolean; +begin + inherited; + { Note: TME_NONCLIENT was introduced in Windows 98 and 2000 } + if (Win32MajorVersion >= 5) or + (Win32MajorVersion = 4) and (Win32MinorVersion >= 10) then + CallTrackMouseEvent(Handle, TME_LEAVE or $10 {TME_NONCLIENT}); + InArea := Message.HitTest = 2001; {HT_TB2k_Close} + if FCloseButtonHover <> InArea then begin + FCloseButtonHover := InArea; + RedrawCloseButton; + end; +end; + +procedure TSpTBXFloatingWindowParent.WMSpSkinChange(var Message: TMessage); +begin + UpdateDwmNCSize; + inherited; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXPopupWindow } + +constructor TSpTBXPopupWindow.CreatePopupWindow(AOwner: TComponent; + const AParentView: TTBView; const AItem: TTBCustomItem; + const ACustomizing: Boolean); +begin + inherited; + if AItem is TSpTBXCustomItem then + if Assigned(View) and (View is TSpTBXPopupWindowView) then begin + if TSpTBXCustomItem(AItem).ToolbarStylePopup then + TSpTBXPopupWindowView(View).SetIsToolbar(True); + end; + + FMaximumImageSize := SpGetMenuMaximumImageSize(View); +end; + +destructor TSpTBXPopupWindow.Destroy; +begin + DoPopupShowingChanged(False); + + inherited; +end; + +procedure TSpTBXPopupWindow.DoPopupShowingChanged(IsVisible: Boolean); +begin + if View.ParentItem is TSpTBXCustomItem then + TSpTBXCustomItem(View.ParentItem).DoPopupShowingChanged(Self, IsVisible) + else + if View.ParentItem is TSpTBXRootItem then + TSpTBXRootItem(View.ParentItem).DoPopupShowingChanged(Self, IsVisible); +end; + +function TSpTBXPopupWindow.GetViewClass: TTBViewClass; +begin + Result := TSpTBXPopupWindowView; +end; + +function TSpTBXPopupWindow.CanDrawGutter: Boolean; +begin + if View.IsToolbar then + Result := False + else begin + Result := True; + // Is it a toolbox? + if Assigned(View) and Assigned(View.ParentItem) then begin + if View.ParentItem is TSpTBXCustomItem then + Result := not TSpTBXCustomItem(View.ParentItem).ToolBoxPopup + else + if View.ParentItem is TSpTBXRootItem then + Result := not TSpTBXRootItem(View.ParentItem).ToolBoxPopup; + end; + end; +end; + +procedure PopupWindowNCPaintProc(Wnd: HWND; DC: HDC; AppData: TObject); +// Paints the NC area and the client background, used by WMEraseBkgnd, WMNCPaint, WMPrint +var + ACanvas: TCanvas; + R: TRect; + PopupWindow: TSpTBXPopupWindow; +begin + ACanvas := TCanvas.Create; + try + ACanvas.Handle := DC; + GetWindowRect(Wnd, R); + OffsetRect(R, -R.Left, -R.Top); + + PopupWindow := TSpTBXPopupWindow(AppData); + // If it's used by WM_ERASEBKGND offset the rect + if PopupWindow.FPaintingClientArea then begin + PopupWindow.FPaintingClientArea := False; + OffsetRect(R, -3, -3); + end; + + PopupWindow.PaintBackground(ACanvas, R); + finally + ACanvas.Handle := 0; + ACanvas.Free; + end; +end; + +procedure TSpTBXPopupWindow.PaintBackground(ACanvas: TCanvas; ARect: TRect); +// Paints the NC area and the client background, used by WMEraseBkgnd, WMNCPaint, WMPrint +var + DrawGutter: Boolean; + OpenIVRect: TRect; + OpenIV: TTBItemViewer; + OpenIVSize: Integer; +begin + OpenIVRect := Rect(0, 0, 0, 0); + DrawGutter := False; + + if Assigned(View) then begin + ACanvas.Font.Assign(ToolbarFont); + DrawGutter := CanDrawGutter; + + if Assigned(View.ParentView) and CurrentSkin.OfficePopup then begin + OpenIV := TTBViewAccess(View.ParentView).OpenViewer; + if Assigned(OpenIV) and OpenIV.IsToolbarStyle and + ((OpenIV is TSpTBXItemViewer) or (OpenIV is TSpTBXChevronItemViewer)) then + begin + // Get the OpenIVRect in window coordinates + OpenIVRect := OpenIV.BoundsRect; + OpenIVRect.TopLeft := View.ParentView.Window.ClientToScreen(OpenIVRect.TopLeft); + OpenIVRect.BottomRight := View.ParentView.Window.ClientToScreen(OpenIVRect.BottomRight); + OpenIVRect.TopLeft := ScreenToClient(OpenIVRect.TopLeft); + OpenIVRect.BottomRight := ScreenToClient(OpenIVRect.BottomRight); + OffsetRect(OpenIVRect, 3, 3); // Offset to get it on window coordinates + OpenIVSize := OpenIVRect.Right - OpenIVRect.Left; + + // Get the Clip rect based on OpenIVRect + OpenIVRect.Left := OpenIVRect.Left + ARect.Left; // ARect.Left is -3 when called by WMEraseBkgnd and is 0 when called by WMNCPaint and WMPrint + OpenIVRect.Right := OpenIVRect.Left + OpenIVSize; + end; + end; + end; + + SpDrawXPMenuPopupWindow(ACanvas, ARect, OpenIVRect, DrawGutter, MaximumImageSize.cx, sknSkin); +end; + +procedure TSpTBXPopupWindow.CMHintShow(var Message: TCMHintShow); +// Dispatch the message to the Item Viewer. +// TSpTBXItemViewer will handle CM_HINTSHOW message to show unicode hints using +// a custom THintWindow. +begin + with Message.HintInfo^ do begin + HintStr := ''; + if Assigned(View.Selected) then begin + CursorRect := View.Selected.BoundsRect; + HintStr := View.Selected.GetHintText; + View.Selected.Dispatch(Message); + end; + end; +end; + +procedure TSpTBXPopupWindow.CMShowingchanged(var Message: TMessage); +const + ShowFlags: array[Boolean] of UINT = ( + SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_HIDEWINDOW, + SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_SHOWWINDOW); +var + HideEmptyPopup: Boolean; +begin + if View.ParentItem is TSpTBXSubmenuItem then + HideEmptyPopup := TSpTBXSubmenuItem(View.ParentItem).HideEmptyPopup + else + HideEmptyPopup := False; + + // When the View is empty the size is set to 0 on TSpTBXPopupWindowView.AutoSize + // We should disable the animation because it can't animate an empty window + if HideEmptyPopup and Showing and (View.ViewerCount = 0) then begin + SetWindowPos(WindowHandle, 0, 0, 0, 0, 0, ShowFlags[Showing]); + end + else + inherited; + + if Visible then + DoPopupShowingChanged(True); +end; + +procedure TSpTBXPopupWindow.WMEraseBkgnd(var Message: TWMEraseBkgnd); +begin + case SkinManager.GetSkinType of + sknNone: + inherited; + sknWindows: + // If it's Windows theme and we're not on Vista do default painting + if not SpIsWinVistaOrUp then + inherited + else begin + Message.Result := 1; + FPaintingClientArea := True; + TBEndAnimation(WindowHandle); + PopupWindowNCPaintProc(Handle, Message.DC, Self); + end; + sknSkin: + begin + Message.Result := 1; + FPaintingClientArea := True; + TBEndAnimation(WindowHandle); + PopupWindowNCPaintProc(Handle, Message.DC, Self); + end; + end; +end; + +procedure TSpTBXPopupWindow.WMNCPaint(var Message: TMessage); +var + DC: HDC; +begin + DC := GetWindowDC(Handle); + try + FPaintingClientArea := False; + SelectNCUpdateRgn(Handle, DC, HRGN(Message.WParam)); + PopupWindowNCPaintProc(Handle, DC, Self); + finally + ReleaseDC(Handle, DC); + end; +end; + +procedure TSpTBXPopupWindow.WMPrint(var Message: TMessage); +begin + FPaintingClientArea := False; + HandleWMPrint(Handle, Message, PopupWindowNCPaintProc, Self); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXPopupWindowView } + +procedure TSpTBXPopupWindowView.AutoSize(AWidth, AHeight: Integer); +begin + // When the View is empty the size should be 0 + if (ViewerCount = 0) and (ParentItem is TSpTBXSubmenuItem) then + if TSpTBXSubmenuItem(ParentItem).HideEmptyPopup then begin + AWidth := -(PopupMenuWindowNCSize * 2); + AHeight := -(PopupMenuWindowNCSize * 2); + end; + + inherited AutoSize(AWidth, AHeight); +end; + +procedure TSpTBXPopupWindowView.SetIsToolbar(const Value: Boolean); +begin + // Change the readonly IsToolbar property using RTTI, the property must + // be published. + // Tip from: http://hallvards.blogspot.com/2004/05/hack-1-write-access-to-read-only.html + PBoolean(Integer(Self) + (Integer(GetPropInfo(TSpTBXPopupWindowView, 'IsToolbar').GetProc) and $00FFFFFF))^ := Value; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXChevronItem } + +function TSpTBXChevronItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + Result := TSpTBXChevronItemViewer; +end; + +function TSpTBXChevronItem.GetPopupWindowClass: TTBPopupWindowClass; +begin + Result := TSpTBXChevronPopupWindow; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXChevronItemViewer } + +function TSpTBXChevronItemViewer.GetTextColor(State: TSpTBXSkinStatesType): TColor; +begin + Result := clNone; + if IsToolbarStyle then begin + if View.Window is TSpTBXToolbar then + Result := TSpTBXToolbar(View.Window).GetItemsTextColor(State); + if Result = clNone then + Result := CurrentSkin.GetTextColor(skncToolbarItem, State); + end + else + Result := CurrentSkin.GetTextColor(skncMenuItem, State); +end; + +procedure TSpTBXChevronItemViewer.Paint(const Canvas: TCanvas; + const ClientAreaRect: TRect; IsSelected, IsPushed, + UseDisabledShadow: Boolean); +const + Pattern: array[Boolean, 0..15] of Byte = ( + ($CC, 0, $66, 0, $33, 0, $66, 0, $CC, 0, 0, 0, 0, 0, 0, 0), + ($88, 0, $D8, 0, $70, 0, $20, 0, $88, 0, $D8, 0, $70, 0, $20, 0)); +var + ItemInfo: TSpTBXMenuItemInfo; + R2: TRect; + P: PByte; + W, H: Integer; + DC: HDC; + PatternColor: TColor; +begin + DC := Canvas.Handle; + SpFillItemInfo(Canvas, Self, ItemInfo); + SpDrawXPMenuItem(Canvas, ClientAreaRect, ItemInfo); + + // Chevron glyph + R2 := ClientAreaRect; + if not ItemInfo.IsVertical then begin + Inc(R2.Top, 4); + R2.Bottom := R2.Top + 5; + W := 8; + H := 5; + end + else begin + R2.Left := R2.Right - 9; + R2.Right := R2.Left + 5; + W := 5; + H := 8; + end; + if ItemInfo.Pushed then OffsetRect(R2, 1, 1); + + if SkinManager.GetSkinType = sknSkin then + PatternColor := GetTextColor(ItemInfo.State) + else + PatternColor := clBtnText; + P := @Pattern[ItemInfo.IsVertical][0]; + if ItemInfo.Enabled then + SpDrawGlyphPattern(DC, R2, W, H, P^, PatternColor) + else begin + OffsetRect(R2, 1, 1); + SpDrawGlyphPattern(DC, R2, W, H, P^, clBtnHighlight); + OffsetRect(R2, -1, -1); + SpDrawGlyphPattern(DC, R2, W, H, P^, clBtnShadow); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXChevronPopupWindow } + +procedure TSpTBXChevronPopupWindow.CMColorChanged(var Message: TMessage); +var + V: TSpTBXPopupWindowView; + PV: TTBView; +begin + // The private FIsToolbar field of the ChevronItem is setted to True + // in TTBCustomItem.CreatePopup, we need to reset it to False before + // the Popup is showed. + // TTBCustomItem.CreatePopup changes the PopupWindow color to clBtnFace + // after it changes the FIsToolbar value (and before it is visible), + // that's why we are trapping CM_COLORCHANGED to reset the field. + + inherited; + if Assigned(View) and (View is TSpTBXPopupWindowView) then begin + V := TSpTBXPopupWindowView(View); + PV := V.ParentView; + // Do we really need to change it? + if (Color = clBtnFace) and V.IsToolbar and Assigned(PV) and + Assigned(PV.Owner) and (PV.Owner is TSpTBXToolbar) and + (TSpTBXToolbar(PV.Owner).ChevronVertical) then + begin + V.SetIsToolbar(False); + Color := clMenu; + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXPopupMenu } + +function TSpTBXPopupMenu.GetOnClosePopup: TNotifyEvent; +begin + Result := TSpTBXRootItem(Items).OnClosePopup; +end; + +function TSpTBXPopupMenu.GetOnInitPopup: TSpTBXPopupEvent; +begin + Result := TSpTBXRootItem(Items).OnInitPopup; +end; + +function TSpTBXPopupMenu.GetRootItemClass: TTBRootItemClass; +begin + Result := TSpTBXRootItem; +end; + +function TSpTBXPopupMenu.InternalPopup(X, Y: Integer; ForceFocus: Boolean; + PopupControl: TControl = nil): Boolean; +var + P: TPoint; + PopupControlRect: TRect; + WinPopupControl: TWinControl; + Msg: TMessage; +begin + Result := True; + FClickedItem := nil; + P := Point(X, Y); + + {$IFDEF JR_D9} + SetPopupPoint(P); + {$ELSE} + PPoint(@PopupPoint)^ := P; + {$ENDIF} + + WinPopupControl := nil; + if Assigned(PopupControl) and Assigned(PopupControl.Parent) then begin + PopupControlRect := PopupControl.BoundsRect; + PopupControlRect.TopLeft := PopupControl.Parent.ClientToScreen(PopupControlRect.TopLeft); + PopupControlRect.BottomRight := PopupControl.Parent.ClientToScreen(PopupControlRect.BottomRight); + if PopupControl is TWinControl then + WinPopupControl := PopupControl as TWinControl; + end + else + PopupControlRect := Rect(X, Y, X, Y); + + P.X := PopupControlRect.Left; + P.Y := PopupControlRect.Bottom; + TSpTBXRootItem(Items).ToolBoxPopup := ToolBoxPopup; + FClickedItem := Items.Popup(P.X, P.Y, TrackButton = tbRightButton, + TTBPopupAlignment(Alignment), FReturnClickedItemOnly); + + if Assigned(WinPopupControl) then begin + // Send a message to the PopupControl and it's children controls + // to inform that the Popup is closed. + Msg.Msg := CM_SPPOPUPCLOSE; + Msg.WParam := Integer(Self); + Msg.LParam := 0; + Msg.Result := 0; + PostMessage(WinPopupControl.Handle, Msg.Msg, Msg.WParam, Msg.LParam); + WinPopupControl.Broadcast(Msg); + end; +end; + +procedure TSpTBXPopupMenu.Popup(X, Y: Integer); +begin + PopupEx(X, Y); +end; + +function TSpTBXPopupMenu.PopupEx(X, Y: Integer; PopupControl: TControl = nil; + ReturnClickedItemOnly: Boolean = False): TTBCustomItem; +begin + FReturnClickedItemOnly := ReturnClickedItemOnly; + try + InternalPopup(X, Y, False, PopupControl); + Result := FClickedItem; + finally + FReturnClickedItemOnly := False; + end; +end; + +procedure TSpTBXPopupMenu.SetOnClosePopup(const Value: TNotifyEvent); +begin + TSpTBXRootItem(Items).OnClosePopup := Value; +end; + +procedure TSpTBXPopupMenu.SetOnInitPopup(const Value: TSpTBXPopupEvent); +begin + TSpTBXRootItem(Items).OnInitPopup := Value; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCompoundItemsControl } + +constructor TSpTBXCompoundItemsControl.Create(AOwner: TComponent); +begin + inherited; + + FDock := GetDockClass.Create(Self); + FDock.Parent := Self; + FDock.OnRequestDock := DockRequestDock; + + FToolbar := GetToolbarClass.Create(Self); + FToolbar.CompoundToolbar := True; + FToolbar.Parent := FDock; + FToolbar.CurrentDock := FDock; + FToolbar.Name := Name + 'Toolbar'; + FToolbar.Customizable := False; + FToolbar.BorderStyle := bsNone; + FToolbar.DockMode := dmCannotFloatOrChangeDocks; + FToolbar.DragHandleStyle := dhNone; + FToolbar.Stretch := True; + FToolbar.ShrinkMode := tbsmNone; + FToolbar.ShowCaption := False; + + FSkinType := sknSkin; + SkinManager.AddSkinNotification(Self); +end; + +procedure TSpTBXCompoundItemsControl.CreateParams(var Params: TCreateParams); +begin + // Disable complete redraws when size changes. CS_HREDRAW and CS_VREDRAW + // cause flicker and are not necessary for this control at run time + // Invalidate in WMWindowPosChanged message instead. + inherited CreateParams(Params); + if not (csDesigning in ComponentState) then begin + with Params do + Style := Style or WS_CLIPCHILDREN; + with Params do + WindowClass.Style := WindowClass.Style and not (CS_HREDRAW or CS_VREDRAW); + end; +end; + +destructor TSpTBXCompoundItemsControl.Destroy; +begin + SkinManager.RemoveSkinNotification(Self); + FToolbar.Free; + FDock.Free; + inherited; +end; + +procedure TSpTBXCompoundItemsControl.Loaded; +var + I: Integer; + C: TControl; + DesignerRootItem: TTBCustomItem; +begin + inherited; + + // The parent of TTBControlItem.Control should be the toolbar, not Self + // (as setted in GetChildren for dfm streaming). + DesignerRootItem := GetItems; + for I := 0 to DesignerRootItem.Count - 1 do + if DesignerRootItem[I] is TTBControlItem then begin + C := TTBControlItem(DesignerRootItem[I]).Control; + if Assigned(C) and (C.Parent <> FToolbar) then + C.Parent := FToolbar; + end; +end; + +procedure TSpTBXCompoundItemsControl.DockRequestDock(Sender: TObject; + Bar: TTBCustomDockableWindow; var Accept: Boolean); +begin + if Assigned(FToolbar) then Accept := Bar = FToolbar; +end; + +procedure TSpTBXCompoundItemsControl.GetChildren(Proc: TGetChildProc; + Root: TComponent); +var + I: Integer; + C: TControl; + DesignerRootItem: TTBCustomItem; +begin + // Needed to fake the DFM streaming system because the owner of the items + // is the Form and not the Toolbar nor Self. + // But the parent must be the Toolbar. + // GetChildren is used to pass the children components of Self to the DFM + // streaming system. + // We also need to do the same with the controls of TTBControlItems. + // More info on the Delphi help or Classes.TWriter.WriteData + // Same as TSpTBXCompoundItemsControl and TSpTBXCustomDockablePanel + + DesignerRootItem := GetItems; + TTBCustomItemAccess(DesignerRootItem).GetChildren(Proc, Root); + for I := 0 to DesignerRootItem.Count - 1 do + if (DesignerRootItem[I] is TTBControlItem) then begin + C := TTBControlItem(DesignerRootItem[I]).Control; + if Assigned(C) then + if SpFindControl(Self, C) = -1 then Proc(C); + end; + inherited; +end; + +function TSpTBXCompoundItemsControl.GetItems: TTBCustomItem; +begin + Result := FToolbar.Items; +end; + +function TSpTBXCompoundItemsControl.GetRootItems: TTBRootItem; +begin + Result := FToolbar.Items; +end; + +function TSpTBXCompoundItemsControl.GetDockClass: TSpTBXDockClass; +begin + Result := TSpTBXDock; +end; + +function TSpTBXCompoundItemsControl.GetToolbarClass: TSpTBXToolbarClass; +begin + Result := TSpTBXToolbar; +end; + +function TSpTBXCompoundItemsControl.GetView: TSpTBXToolbarView; +begin + Result := FToolbar.View as TSpTBXToolbarView; +end; + +function TSpTBXCompoundItemsControl.GetImages: TCustomImageList; +begin + if Assigned(FToolbar) then + Result := FToolbar.Images + else + Result := nil; +end; + +procedure TSpTBXCompoundItemsControl.InvalidateBackground(InvalidateChildren: Boolean); +begin + // Invalidate will not fire WM_ERASEBKGND, because csOpaque is setted + if not (csDestroying in ComponentState) and HandleAllocated then + if InvalidateChildren then + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN) + else + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE); +end; + +procedure TSpTBXCompoundItemsControl.SetImages(const Value: TCustomImageList); +begin + if Assigned(FToolbar) then FToolbar.Images := Value; +end; + +procedure TSpTBXCompoundItemsControl.SetName(const Value: TComponentName); +begin + inherited; + if Name = Value then + if Assigned(FToolbar) then + FToolbar.Name := Name + 'Toolbar'; +end; + +procedure TSpTBXCompoundItemsControl.SetSkinType(const Value: TSpTBXSkinType); +begin + if FSkinType <> Value then begin + FSkinType := Value; + InvalidateBackground; + end; +end; + +procedure TSpTBXCompoundItemsControl.WMSpSkinChange(var Message: TMessage); +begin + InvalidateBackground; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCompoundBar } + +constructor TSpTBXCompoundBar.Create(AOwner: TComponent); +begin + inherited; + Height := FDock.Height; + FDock.OnDrawBackground := DrawDockBackground; + FDock.OnResize := DockResize; + FToolbar.OnDrawBackground := DrawToolbarBackground; +end; + +procedure TSpTBXCompoundBar.DockResize(Sender: TObject); +begin + if Assigned(FDock) then + if Height <> FDock.Height then + Height := FDock.Height; +end; + +procedure TSpTBXCompoundBar.DoDrawDockBackground(ACanvas: TCanvas; + ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +begin + if Assigned(FOnDrawDockBackground) then FOnDrawDockBackground(Self, ACanvas, ARect, PaintStage, PaintDefault); +end; + +procedure TSpTBXCompoundBar.DrawDockBackground(Sender: TObject; + ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +var + InternalPaintDefault: Boolean; +begin + if PaintStage = pstPrePaint then begin + // OnDrawBackground is triggered by the Dock and by the docked Toolbar. + // The Toolbar triggers it only if Dock.ThemedBackground is true, which depends + // on CurrentTheme.PaintDockBackground, this is done in + // TTBXToolbar.WMEraseBkgnd. + ACanvas.Brush.Color := clBtnFace; + InternalPaintDefault := True; + DoDrawDockBackground(ACanvas, ARect, pstPrePaint, InternalPaintDefault); + PaintDefault := InternalPaintDefault; + InternalPaintDefault := True; + DoDrawDockBackground(ACanvas, ARect, pstPostPaint, InternalPaintDefault); + end; +end; + +procedure TSpTBXCompoundBar.DrawToolbarBackground(Sender: TObject; + ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +begin + // Let the background be painted by the Dock + if PaintStage = pstPrePaint then + PaintDefault := False; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXButtonOptions } + +constructor TSpTBXButtonOptions.Create(AParent: TWinControl); +begin + inherited Create; + + FToolbar := nil; + if AParent is TSpTBXCompoundItemsControl then + FToolbar := TSpTBXCompoundItemsControl(AParent).FToolbar; + FParentControl := AParent; + + FCaption := True; + FClose := True; + FMinimize := True; + FMaximize := True; + FCaptionImageIndex := -1; + FCloseImageIndex := -1; + FMinimizeImageIndex := -1; + FMaximizeImageIndex := -1; + FRestoreImageIndex := -1; + FTitleBarMaxSize := 21; + FButtonBorders := True; + CreateButtons; +end; + +procedure TSpTBXButtonOptions.CreateButtons; +begin + FRightAlignSpacer := TSpTBXRightAlignSpacerItem.Create(nil); + FRightAlignSpacer.FontSettings.Style := FRightAlignSpacer.FontSettings.Style + [fsBold]; + FRightAlignSpacer.Wrapping := twEndEllipsis; + FToolbar.Items.Add(FRightAlignSpacer); + + FEditableItems := TTBGroupItem.Create(nil); + FToolbar.Items.Add(FEditableItems); + + FMinimizeButton := TSpTBXItem.Create(nil); + SetupButton(FMinimizeButton); + FMinimizeButton.Visible := FMinimize; + + FMaximizeButton := TSpTBXItem.Create(nil); + SetupButton(FMaximizeButton); + FMaximizeButton.Visible := FMaximize; + + FCloseButton := TSpTBXItem.Create(nil); + SetupButton(FCloseButton); + FCloseButton.Visible := FClose; + + SetTitleBarMaxSize(FTitleBarMaxSize); +end; + +procedure TSpTBXButtonOptions.MoveItemToTheLeft(B: TTBCustomItem); +var + I: Integer; +begin + I := EditableItems.IndexOf(B); + if I > -1 then begin + EditableItems.Delete(I); + I := FToolbar.Items.IndexOf(RightAlignSpacer); + FToolbar.Items.Insert(I, B); + end; +end; + +procedure TSpTBXButtonOptions.SetupButton(B: TSpTBXCustomItem); +begin + B.CustomWidth := 17; + B.CustomHeight := FTitleBarMaxSize; + B.DisplayMode := nbdmImageAndText; + B.OnDrawImage := ButtonsDrawImage; + B.OnDrawItem := ButtonsDrawItem; + B.OnClick := ButtonsClick; + FToolbar.Items.Add(B); + B.Visible := False; + SetupButtonIcon(B); +end; + +procedure TSpTBXButtonOptions.SetupButtonIcon(B: TSpTBXCustomItem); +var + Index, GlyphIndex: Integer; +begin + if Assigned(B) then begin + Index := -1; + GlyphIndex := -1; + + if B = FRightAlignSpacer then begin + Index := FCaptionImageIndex; + end else + if B = FCloseButton then begin + Index := FCloseImageIndex; + GlyphIndex := 0; + end else + if B = FMaximizeButton then begin + if Restoring(B) then begin + Index := FRestoreImageIndex; + GlyphIndex := 3; + end + else begin + Index := FMaximizeImageIndex; + GlyphIndex := 1; + end; + end else + if B = FMinimizeButton then begin + if Restoring(B) then begin + Index := FRestoreImageIndex; + GlyphIndex := 3; + end + else begin + Index := FMinimizeImageIndex; + GlyphIndex := 2; + end; + end; + + if Index = -1 then begin + B.Images := MDIButtonsImgList; + B.ImageIndex := GlyphIndex; + end + else begin + B.Images := nil; + B.ImageIndex := Index; + end; + end; +end; + +procedure TSpTBXButtonOptions.UpdateButtonsVisibility; +begin + FRightAlignSpacer.Visible := FCaption or FClose or FMaximize or FMinimize; +end; + +procedure TSpTBXButtonOptions.ButtonsDrawImage(Sender: TObject; + ACanvas: TCanvas; State: TSpTBXSkinStatesType; + const PaintStage: TSpTBXPaintStage; var AImageList: TCustomImageList; + var AImageIndex: Integer; var ARect: TRect; var PaintDefault: Boolean); +begin + // Empty, useful for descendants +end; + +procedure TSpTBXButtonOptions.ButtonsDrawItem(Sender: TObject; ACanvas: TCanvas; + ARect: TRect; ItemInfo: TSpTBXMenuItemInfo; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +begin + if (PaintStage = pstPrePaint) then begin + // [Theme-Change] + // Don't draw the items background if the Default theme is used + if (PaintStage = pstPrePaint) and not ButtonBorders then + PaintDefault := False; + end; +end; + +procedure TSpTBXButtonOptions.SetCaptionLabel(const Value: WideString); +begin + if FCaptionLabel <> Value then begin + FCaptionLabel := Value; + if Assigned(FRightAlignSpacer) then + FRightAlignSpacer.Caption := Value; + end; +end; + +procedure TSpTBXButtonOptions.SetCaption(const Value: Boolean); +begin + FCaption := Value; + if Assigned(FRightAlignSpacer) then begin + if Value then + FRightAlignSpacer.Caption := CaptionLabel + else + FRightAlignSpacer.Caption := ''; + UpdateButtonsVisibility; + end; +end; + +procedure TSpTBXButtonOptions.SetClose(const Value: Boolean); +begin + FClose := Value; + if Assigned(FCloseButton) then begin + FCloseButton.Visible := Value; + UpdateButtonsVisibility; + end; +end; + +procedure TSpTBXButtonOptions.SetMaximize(const Value: Boolean); +begin + FMaximize := Value; + if Assigned(FMaximizeButton) then begin + FMaximizeButton.Visible := Value; + UpdateButtonsVisibility; + end; +end; + +procedure TSpTBXButtonOptions.SetMinimize(const Value: Boolean); +begin + FMinimize := Value; + if Assigned(FMinimizeButton) then begin + FMinimizeButton.Visible := Value; + UpdateButtonsVisibility; + end; +end; + +procedure TSpTBXButtonOptions.SetCaptionImageIndex(Value: Integer); +begin + if Value < 0 then Value := -1; + FCaptionImageIndex := Value; + if Assigned(FRightAlignSpacer) then SetupButtonIcon(FRightAlignSpacer); +end; + +procedure TSpTBXButtonOptions.SetCloseImageIndex(Value: Integer); +begin + if Value < 0 then Value := -1; + FCloseImageIndex := Value; + if Assigned(FCloseButton) then SetupButtonIcon(FCloseButton); +end; + +procedure TSpTBXButtonOptions.SetMinimizeImageIndex(Value: Integer); +begin + if Value < 0 then Value := -1; + FMinimizeImageIndex := Value; + if Assigned(FMinimizeButton) then SetupButtonIcon(FMinimizeButton); +end; + +procedure TSpTBXButtonOptions.SetMaximizeImageIndex(Value: Integer); +begin + if Value < 0 then Value := -1; + FMaximizeImageIndex := Value; + if Assigned(FMaximizeButton) then SetupButtonIcon(FMaximizeButton); +end; + +procedure TSpTBXButtonOptions.SetRestoreImageIndex(Value: Integer); +begin + if Value < 0 then Value := -1; + FRestoreImageIndex := Value; + SetupButtonIcon(FMinimizeButton); + SetupButtonIcon(FMaximizeButton); +end; + +procedure TSpTBXButtonOptions.SetTitleBarMaxSize(const Value: Integer); +begin + FTitleBarMaxSize := Value; + TSpTBXToolbarView(FToolbar.View).MaxSize := Value; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXStatusToolbar } + +constructor TSpTBXStatusToolbar.Create(AOwner: TComponent); +begin + inherited; + FSkinType := sknSkin; + FSizeGrip := True; +end; + +destructor TSpTBXStatusToolbar.Destroy; +begin + FParentForm := nil; + inherited; +end; + +function TSpTBXStatusToolbar.GetParentFormWindowState: TWindowState; +// This method is more accurate than FParentForm.WindowState +var + R: TRect; +begin + if not Assigned(FParentForm) then + FParentForm := GetParentForm(Self); + Result := SpGetFormWindowState(FParentForm, R); +end; + +function TSpTBXStatusToolbar.IsPointInGrip(P: TPoint): Boolean; +var + GR: TRect; +begin + Result := False; + GR := GetGripRect; + if not IsRectEmpty(GR) and PtInRect(GR, P) then + Result := True; +end; + +function TSpTBXStatusToolbar.GetGripRect: TRect; +var + C: TWinControl; + FS: TWindowState; + HasGrip: Boolean; +begin + Result := Rect(0, 0, 0, 0); + if not (csDestroying in ComponentState) and FSizeGrip and Assigned(CurrentDock) then begin + FS := GetParentFormWindowState; // initializes FParentForm + if Assigned(FParentForm) and FParentForm.HandleAllocated then begin + C := SpFindParent(Self, TSpTBXTitleBar); + if Assigned(C) and TSpTBXTitleBar(C).Active and not TSpTBXTitleBar(C).FixedSize then + HasGrip := (FS = wsNormal) or not TSpTBXTitleBar(C).MouseActive + else + HasGrip := (FS = wsNormal) and (GetWindowLong(FParentForm.Handle, GWL_STYLE) and WS_THICKFRAME <> 0); + if HasGrip then begin + Result := CurrentDock.ClientRect; + Result.Left := Result.Right - GetSystemMetrics(SM_CXVSCROLL); + end; + end; + end; +end; + +function TSpTBXStatusToolbar.GetItemsTextColor(State: TSpTBXSkinStatesType): TColor; +begin + if Assigned(Owner) and (Owner is TSpTBXCustomStatusBar) then + Result := CurrentSkin.GetTextColor(skncStatusBar, State, TSpTBXCustomStatusBar(Owner).SkinType) + else + Result := clNone; +end; + +function TSpTBXStatusToolbar.GetRightAlignMargin: Integer; +var + R: TRect; +begin + R := GetGripRect; + Result := R.Right - R.Left; + if Result = 0 then + Result := 4; +end; + +function TSpTBXStatusToolbar.NeedsSeparatorRepaint: Boolean; +var + T: TSpTBXSkinType; +begin + // [Theme-Change] + // Office themes have rectangle panels, the separator needs + // to be painted by the Toolbar. + if Assigned(Owner) and (Owner is TSpTBXCustomStatusBar) then begin + T := TSpTBXCustomStatusBar(Owner).SkinType; + Result := (CurrentSkin.OfficeStatusBar and (T = sknSkin)) or (T = sknNone); + end + else + Result := False; +end; + +procedure TSpTBXStatusToolbar.SetSizeGrip(const Value: Boolean); +begin + if FSizeGrip <> Value then begin + FSizeGrip := Value; + if Owner is TSpTBXStatusBar then + TSpTBXStatusBar(Owner).InvalidateBackground; + end; +end; + +procedure TSpTBXStatusToolbar.MouseDown(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +var + P: TPoint; +begin + // Resize the StatusBar if the parent is TSpTBXTitleBar + if not (csDesigning in ComponentState) and (Button = mbLeft) and Assigned(FParentForm) then begin + P := Point(X, Y); + if IsPointInGrip(P) then begin + ReleaseCapture; + SendMessage(FParentForm.Handle, WM_SYSCOMMAND, $F008, 0); + Exit; + end; + end; + + inherited; +end; + +procedure TSpTBXStatusToolbar.WMNCLButtonDown(var Message: TWMNCLButtonDown); +var + P: TPoint; +begin + if not (csDesigning in ComponentState) and Assigned(FParentForm) then begin + P := ScreenToClient(SmallPointToPoint(TSmallPoint(GetMessagePos()))); + if IsPointInGrip(P) then begin + ReleaseCapture; + SendMessage(FParentForm.Handle, WM_SYSCOMMAND, $F008, 0); + Exit; + end; + end; + + inherited; +end; + +procedure TSpTBXStatusToolbar.WMSetCursor(var Message: TWMSetCursor); +var + P: TPoint; +begin + if not (csDesigning in ComponentState) and (Message.CursorWnd = Handle) and + (Screen.Cursor = crDefault) and Assigned(FParentForm) then + begin + GetCursorPos(P); + P := ScreenToClient(P); + if IsPointInGrip(P) then begin + Windows.SetCursor(Screen.Cursors[-8]); + Message.Result := 1; + Exit; + end; + end; + + inherited; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomStatusBar } + +constructor TSpTBXCustomStatusBar.Create(AOwner: TComponent); +begin + inherited; + Align := alBottom; +end; + +function TSpTBXCustomStatusBar.CanResize(var NewWidth, NewHeight: Integer): Boolean; +begin + if Assigned(FDock) and (NewHeight <> FDock.Height) then + Result := False + else + Result := inherited CanResize(NewWidth, NewHeight); +end; + +procedure TSpTBXCustomStatusBar.DoDrawDockBackground(ACanvas: TCanvas; + ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +var + G: TRect; + OfficeSeparators: Boolean; +begin + inherited DoDrawDockBackground(ACanvas, ARect, PaintStage, PaintDefault); + if (PaintStage = pstPrePaint) and PaintDefault then begin + PaintDefault := False; + G := Toolbar.GetGripRect; + if not IsRectEmpty(G) then begin + // When it's called by the Toolbar the Gripper position should be corrected + if (ARect.Left = -2) and (ARect.Top = -2) then + OffsetRect(G, -2, -2); + end; + + OfficeSeparators := Toolbar.NeedsSeparatorRepaint; + SpDrawXPStatusBar(ACanvas, ARect, G, SkinType, OfficeSeparators); + if OfficeSeparators then + DrawSeparators(ACanvas, ARect, G); + end; +end; + +procedure TSpTBXCustomStatusBar.DrawSeparators(ACanvas: TCanvas; ARect, AGripRect: TRect); +var + I: Integer; + IV: TTBItemViewer; + R: TRect; + C: TColor; +begin + C := ACanvas.Pen.Color; + try + for I := 0 to FToolbar.View.ViewerCount - 1 do begin + IV := FToolbar.View.Viewers[I]; + if (IV is TSpTBXSeparatorItemViewer) and (not TSpTBXSeparatorItem(IV.Item).Blank) then begin + R := IV.BoundsRect; + OffsetRect(R, ARect.Left + 2, ARect.Top + 2); + + R.Top := 0; + R.Bottom := Height; + R.Left := ((R.Right + R.Left) div 2) - 2; + R.Right := R.Left + 3; + + ACanvas.Brush.Color := clBtnFace; + ACanvas.FillRect(R); + + if SpTBXSkinType(FSkinType) = sknNone then begin + SpDrawLine(ACanvas, R.Left, R.Top, R.Left, R.Bottom, clWindow); + SpDrawLine(ACanvas, R.Right, R.Top, R.Right, R.Bottom, clBtnShadow); + end + else begin + // For Office XP, when called by the Dock inc Top by 1 + if ARect.Top = 0 then Inc(R.Top); + SpDrawLine(ACanvas, R.Left, R.Top, R.Left, R.Bottom, clWindow); + SpDrawLine(ACanvas, R.Right, R.Top, R.Right, R.Bottom, clWindow); + end; + end; + end; + finally + ACanvas.Pen.Color := C; + end; +end; + +function TSpTBXCustomStatusBar.GetStatusToolbar: TSpTBXStatusToolbar; +begin + Result := FToolbar as TSpTBXStatusToolbar; +end; + +function TSpTBXCustomStatusBar.GetToolbarClass: TSpTBXToolbarClass; +begin + Result := TSpTBXStatusToolbar; +end; + +function TSpTBXCustomStatusBar.GetSizeGrip: Boolean; +begin + Result := Toolbar.SizeGrip; +end; + +procedure TSpTBXCustomStatusBar.SetSizeGrip(const Value: Boolean); +begin + Toolbar.SizeGrip := Value; +end; + +procedure TSpTBXCustomStatusBar.WMEraseBkgnd(var Message: TWMEraseBkgnd); +begin + Message.Result := 1; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXTitleToolbar } + +function TSpTBXTitleToolbar.GetItemsTextColor(State: TSpTBXSkinStatesType): TColor; +begin + Result := CurrentSkin.GetTextColor(skncWindowTitleBar, State); +end; + +function TSpTBXTitleToolbar.GetRightAlignMargin: Integer; +begin + Result := 4; +end; + +function TSpTBXTitleToolbar.GetTitleBar: TSpTBXCustomTitleBar; +begin + Result := CurrentDock.Parent as TSpTBXCustomTitleBar; +end; + +procedure TSpTBXTitleToolbar.MouseDown(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +var + TransparentClick: Boolean; + F: TCustomForm; + TitleBar: TSpTBXCustomTitleBar; + P: TPoint; + IV: TTBItemViewer; +begin + // Move the Parent Form if the toolbar client area or an item with + // tbisClicksTransparent itemstyle is clicked (like a TBXLabelItem) + if not (csDesigning in ComponentState) then begin + TitleBar := GetTitleBar; + F := TitleBar.FParentForm; + if not Assigned(F) or not Assigned(TitleBar) then Exit; + if not TitleBar.IsActive then Exit; + + if Assigned(View.Selected) then + TransparentClick := tbisClicksTransparent in TTBCustomItemAccess(View.Selected.Item).ItemStyle + else + TransparentClick := True; + + case Button of + mbLeft: + if TransparentClick then begin + if ssDouble in Shift then begin + // Maximize or restore when double clicking the toolbar + if TitleBar.Options.Maximize and not TitleBar.FixedSize then + TitleBar.Options.MaximizeButton.Click; + end + else + if F.WindowState <> wsMaximized then begin + // Drag the form when dragging the toolbar + ReleaseCapture; + SendMessage(F.Handle, WM_SYSCOMMAND, $F012, 0); + end; + Exit; // Do not process transparent clicks + end + else + if (ssDouble in Shift) and TitleBar.Options.SystemMenu then begin + // Close the form when the system menu button is double clicked + IV := View.ViewerFromPoint(Point(X, Y)); + if Assigned(IV) and (IV.Item = TitleBar.Options.SystemButton) then begin + F.Close; + Exit; // Do not process transparent clicks + end; + end; + mbRight: + if TransparentClick and TitleBar.Options.SystemMenu then begin + P := ClientToScreen(Point(X, Y)); + TitleBar.Options.SystemButton.Popup(P.X, P.Y, True); + Exit; // Do not process transparent clicks + end; + end; + end; + + inherited; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXTitleBarButtonOptions } + +constructor TSpTBXTitleBarButtonOptions.Create(AParent: TWinControl); +begin + FSystemMenu := True; + FTitleBar := AParent as TSpTBXCustomTitleBar; + inherited Create(AParent); +end; + +procedure TSpTBXTitleBarButtonOptions.CreateButtons; +begin + FSystemButton := TSpTBXSystemMenuItem.Create(nil); + SetupButton(FSystemButton); + FSystemButton.Visible := FSystemMenu; + + inherited; +end; + +procedure TSpTBXTitleBarButtonOptions.SetSystemMenu(const Value: Boolean); +begin + FSystemMenu := Value; + if Assigned(FSystemButton) then + FSystemButton.Visible := Value; +end; + +procedure TSpTBXTitleBarButtonOptions.ButtonsDrawItem(Sender: TObject; ACanvas: TCanvas; + ARect: TRect; ItemInfo: TSpTBXMenuItemInfo; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +begin + inherited; + if (PaintStage = pstPrePaint) then begin + + // [Theme-Change] + // Don't draw the items background if the Default theme is used + if (PaintStage = pstPrePaint) and (not ButtonBorders or SkinManager.IsDefaultSkin) then + PaintDefault := False; + end; +end; + +procedure TSpTBXTitleBarButtonOptions.ButtonsClick(Sender: TObject); +begin + if not Assigned(FTitleBar.FParentForm) or not FTitleBar.IsActive then Exit; + + if Sender = FSystemButton then + FSystemButton.ShowSize := not FTitleBar.FixedSize + else + if Sender = FMinimizeButton then + FTitleBar.WindowState := wsMinimized + else + if Sender = FCloseButton then + FTitleBar.FParentForm.Close + else + if Sender = FMaximizeButton then begin + if FTitleBar.WindowState = wsNormal then + FTitleBar.WindowState := wsMaximized + else + FTitleBar.WindowState := wsNormal; + end; +end; + +function TSpTBXTitleBarButtonOptions.Restoring(B: TSpTBXCustomItem): Boolean; +begin + Result := False; + if (B = MaximizeButton) and (FTitleBar.WindowState = wsMaximized) then Result := True; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomTitleBar } + +constructor TSpTBXCustomTitleBar.Create(AOwner: TComponent); +begin + inherited; + + FActive := True; + FMouseActive := True; + ControlStyle := ControlStyle + [csAcceptsControls]; + + Align := alClient; + FDock.OnResize := nil; + + FParentForm := GetParentForm(Self); + FOptions := TSpTBXTitleBarButtonOptions.Create(Self); + FOptions.CaptionLabel := Caption; +end; + +destructor TSpTBXCustomTitleBar.Destroy; +begin + ChangeTitleBarState(False); + FOptions.Free; + + if Assigned(FParentForm) and Assigned(FOldParentFormWndProc) then begin + FParentForm.WindowProc := FOldParentFormWndProc; + FOldParentFormWndProc := nil; + end; + + if Assigned(Application) and Assigned(FNewAppWndProc) then begin + SetWindowLong(Application.Handle, GWL_WNDPROC, Longint(FOldAppWndProc)); + Classes.FreeObjectInstance(FNewAppWndProc); + FNewAppWndProc := nil; + end; + + inherited; +end; + +procedure TSpTBXCustomTitleBar.Loaded; +begin + inherited; + + // Subclass the ParentForm and Application for the System menu handling + if not (csDesigning in ComponentState) then begin + FParentForm := GetParentForm(Self); + // Hook the ParentForm + if Assigned(FParentForm) then begin + FOldParentFormWndProc := FParentForm.WindowProc; + FParentForm.WindowProc := NewParentFormWndProc; + end; + + // Hook the Application to trap the $0313 message, more info on AppWndProc + if not (csDesigning in ComponentState) and (Application.Handle <> 0) and + (Application.MainForm = nil) and (FOldAppWndProc = nil) then + begin + // When Application.MainForm asume FParentForm as the MainForm + FOldAppWndProc := Pointer(GetWindowLong(Application.Handle, GWL_WNDPROC)); + FNewAppWndProc := Classes.MakeObjectInstance(AppWndProc); + SetWindowLong(Application.Handle, GWL_WNDPROC, Longint(FNewAppWndProc)); + end; + + ChangeTitleBarState(Active); + end; +end; + +procedure TSpTBXCustomTitleBar.UpdateSkinMetrics; +begin + if HandleAllocated then begin + // Update the NC area size, CurrentSkin.FloatingWindowBorderSize could have changed + // Make sure to realign the toolbars + SpRecalcNCArea(Self); + Realign; + end; +end; + +procedure TSpTBXCustomTitleBar.AppWndProc(var Msg: TMessage); +var + SystemButtonP: TPoint; +begin + // Handle undocumented $0313 message, this is sent when the + // taskbar button of the application is right clicked. + // When Application.MainFormOnTaskbar = True (Delphi 2007 and above) + // the message is sent to the Main Form, otherwise it is sent + // to the Application. + // More info: + // http://delphi.about.com/od/vclwriteenhance/a/ttaskbarmenu.htm + if (Msg.Msg = $0313) and Assigned(FParentForm) and Assigned(Options) then begin + GetCursorPos(SystemButtonP); + FOptions.SystemButton.Popup(SystemButtonP.X, SystemButtonP.Y, True); + end + else + if Assigned(FOldAppWndProc) then + Msg.Result := CallWindowProc(FOldAppWndProc, Application.Handle, Msg.Msg, Msg.wParam, Msg.lParam); +end; + +procedure TSpTBXCustomTitleBar.NewParentFormWndProc(var Message: TMessage); +var + M: TWMSysCommand; + I: Integer; + HandleSpaceKey: Boolean; + + MMI: ^TMinMaxInfo; + MonitorBounds, WorkArea, TaskBarBounds: TRect; + TaskBarState, TaskBarEdge: Cardinal; + SystemButtonIV: TTBItemViewer; + SystemButtonP: TPoint; +begin + if not Assigned(FParentForm) then Exit; + + case Message.Msg of + $0313: + begin + // Handle undocumented $0313 message, this is sent when the + // taskbar button of the application is right clicked. + // When Application.MainFormOnTaskbar = True (Delphi 2007 and above) + // the message is sent to the Main Form, otherwise it is sent + // to the Application. + // More info: + // http://delphi.about.com/od/vclwriteenhance/a/ttaskbarmenu.htm + GetCursorPos(SystemButtonP); + FOptions.SystemButton.Popup(SystemButtonP.X, SystemButtonP.Y, True); + Exit; + end; + WM_GETMINMAXINFO: + if IsActive and not FFullScreenMaximize then begin + MMI := Pointer(Message.lParam); + WorkArea := GetRectOfMonitorContainingWindow(Handle, True); + MonitorBounds := GetRectOfMonitorContainingWindow(Handle, False); + + // Calculate the Max position and size + // http://news.jrsoftware.org/news/toolbar2000.thirdparty/msg13127.html + MMI^.ptMaxPosition.X := WorkArea.Left - MonitorBounds.Left; + MMI^.ptMaxPosition.Y := WorkArea.Top - MonitorBounds.Top; + MMI^.ptMaxSize.X := WorkArea.Right - WorkArea.Left; + MMI^.ptMaxSize.Y := WorkArea.Bottom - WorkArea.Top; + + // Reduce the Max Size if the TaskBar is AutoHidden + if SpGetTaskBar(TaskBarState, TaskBarEdge, TaskBarBounds) then begin + if (TaskBarState and ABS_AUTOHIDE) = ABS_AUTOHIDE then + case TaskBarEdge of + ABE_LEFT, ABE_RIGHT: MMI^.ptMaxSize.X := MMI^.ptMaxSize.X - 2; + ABE_TOP, ABE_BOTTOM: MMI^.ptMaxSize.Y := MMI^.ptMaxSize.Y - 2; + end; + end; + + // Max size during window resize, change the ParentForm constraints + // to make it work + if WindowState = wsMaximized then begin + MMI^.ptMaxTrackSize.X := MMI^.ptMaxSize.X; + MMI^.ptMaxTrackSize.Y := MMI^.ptMaxSize.Y; + FParentForm.Constraints.MaxWidth := MMI^.ptMaxSize.X; + FParentForm.Constraints.MaxHeight := MMI^.ptMaxSize.Y; + end + else begin + FParentForm.Constraints.MaxWidth := 0; + FParentForm.Constraints.MaxHeight := 0; + end; + + Message.Result := 0; + end; + WM_SYSCOMMAND: + if IsActive and Options.SystemMenu then begin + HandleSpaceKey := True; + M := TWMSysCommand(Message); + if M.CmdType and $FFF0 = SC_KEYMENU then + case M.Key of + VK_SPACE: + begin + // Show the custom SysMenu + SystemButtonIV := FToolbar.View.Find(FOptions.SystemButton); + if Assigned(SystemButtonIV) then begin + SystemButtonP.X := SystemButtonIV.BoundsRect.Left; + SystemButtonP.Y := SystemButtonIV.BoundsRect.Bottom; + SystemButtonP := FToolbar.ClientToScreen(SystemButtonP); + FOptions.SystemButton.Popup(SystemButtonP.X, SystemButtonP.Y, True); + Message.Result := 1; + Exit; + end; + end; + 0: + if GetCapture = 0 then begin + // When only the Alt key is pressed and a few seconds latter the Space + // key is pressed the default SysMenu is showed, this only happens + // when there are no menubars on the form. + // In this case the WM_SYSCOMMAND is sent when the Alt key is + // pressed (Key = 0), but not when the space key is pressed. + // Apparently there's no way to override this, the only solution is to + // handle the Alt key press (Key = 0). + // + // Message log when Alt [...] Space is pressed: + // WM_SYSKEYDOWN: VK_MENU + // WM_SYSKEYUP: VK_MENU + // WM_SYSCOMMAND: Key = 0 + // WM_ENTERMENULOOP + // WM_INITMENU + // WM_KEYDOWN: VK_SPACE + // WM_CHAR: VK_SPACE + // WM_INITMENUPOPUP: system hmenu + + // If the form has a main menu VK_SPACE will be correctly handled + if Assigned(FParentForm.Menu) then + HandleSpaceKey := False + else + for I := 0 to FParentForm.ComponentCount - 1 do + if FParentForm.Components[I] is TTBCustomToolbar then + if TTBCustomToolbar(FParentForm.Components[I]).MenuBar then begin + HandleSpaceKey := False; + Break; + end; + if HandleSpaceKey then begin + Message.Result := 1; + Exit; + end; + end; + end; + end; + end; + + // Default processing + if Assigned(FOldParentFormWndProc) then + FOldParentFormWndProc(Message); +end; + +procedure TSpTBXCustomTitleBar.ChangeTitleBarState(Activate: Boolean); +var + FloatingBorderSize: TPoint; + Style: Integer; + RestoreR: TRect; + WState: TWindowState; + OnParentFormShow: TNotifyEvent; +begin + FParentForm := GetParentForm(Self); + if Assigned(FParentForm) and (FParentForm.HandleAllocated) and ([csDesigning, csDestroying] * FParentForm.ComponentState = []) then begin + + if FMouseActive then begin + FloatingBorderSize := GetFloatingBorderSize; + + // Changing the BorderStyle of the form will recreate it, + // causing it to call Form.OnShow everytime Active is changed + // We need to disable the OnShow calling. + OnParentFormShow := TCustomFormAccess(FParentForm).OnShow; + TCustomFormAccess(FParentForm).OnShow := nil; + try + WState := SpGetFormWindowState(FParentForm, RestoreR); + + if Activate then begin + // Remove the border and titlebar from the form, and add the sysmenu + FParentForm.BorderStyle := bsNone; + Style := GetWindowLong(FParentForm.Handle, GWL_STYLE); + Style := Style or WS_SYSMENU; + SetWindowLong(FParentForm.Handle, GWL_STYLE, Style); + + // Resize the form to retain the same size before it was activated. + // This is needed to keep the designtime size + if (WState <> wsMaximized) and (TCustomFormAccess(FParentForm).FormStyle <> fsMDIChild) then begin + FParentForm.Height := FParentForm.Height - GetSystemMetrics(SM_CYCAPTION) - (FloatingBorderSize.Y * 2); + FParentForm.Width := FParentForm.Width - (FloatingBorderSize.X * 2); + end; + end + else begin + FParentForm.BorderStyle := bsSizeable; + + // Resize the form to retain the same size before it was deactivated. + // This is needed to keep the designtime size + if (WState <> wsMaximized) and (TCustomFormAccess(FParentForm).FormStyle <> fsMDIChild) then begin + FParentForm.Height := FParentForm.Height + GetSystemMetrics(SM_CYCAPTION) + (FloatingBorderSize.Y * 2); + FParentForm.Width := FParentForm.Width + (FloatingBorderSize.X * 2); + end; + end; + + // When Active is changed the Form is recreated, we have to + // reset the Restore size if the form is currently Maximized. + if WState = wsMaximized then + SpSetFormWindowState(FParentForm, WState, RestoreR); + + InvalidateBackground; + finally + TCustomFormAccess(FParentForm).OnShow := OnParentFormShow; + end; + end; + + FDock.Visible := FActive; + end; +end; + +procedure TSpTBXCustomTitleBar.AdjustClientRect(var Rect: TRect); +begin + inherited AdjustClientRect(Rect); + Rect := GetClientAreaRect; +end; + +procedure TSpTBXCustomTitleBar.DoDrawDockBackground(ACanvas: TCanvas; + ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +var + FloatingBorderSize: TPoint; +begin + inherited DoDrawDockBackground(ACanvas, ARect, PaintStage, PaintDefault); + if (PaintStage = pstPrePaint) and PaintDefault then begin + PaintDefault := False; + + // [Theme-Change] + // On WindowsXP make sure we paint the titlebar on the NC area + // TSpTBXCustomTitleBar.WMEraseBkgnd and TSpTBXCustomTitleBar.DoDrawDockBackground handles this issue + if SkinManager.GetSkinType = sknWindows then begin + FloatingBorderSize := GetFloatingBorderSize; + InflateRect(ARect, FloatingBorderSize.X, FloatingBorderSize.Y); + end; + + SpDrawXPTitleBar(ACanvas, ARect, True); + end; +end; + +procedure TSpTBXCustomTitleBar.DoDrawBackground(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawBackground) then FOnDrawBackground(Self, ACanvas, ARect, PaintStage, PaintDefault); +end; + +function TSpTBXCustomTitleBar.GetClientAreaRect: TRect; +var + FloatingBorderSize: TPoint; +begin + Result := ClientRect; + if Active then begin + FloatingBorderSize := GetFloatingBorderSize; + if Assigned(FParentForm) then begin + if not FMouseActive or (FParentForm.WindowState <> wsMaximized) then + InflateRect(Result, -FloatingBorderSize.X, -FloatingBorderSize.Y); + end + else + InflateRect(Result, -FloatingBorderSize.X, -FloatingBorderSize.Y); + end; +end; + +function TSpTBXCustomTitleBar.GetFloatingBorderSize: TPoint; +begin + if SkinManager.GetSkinType = sknSkin then + Result := Point(CurrentSkin.FloatingWindowBorderSize, CurrentSkin.FloatingWindowBorderSize) + else begin + Result.X := GetSystemMetrics(SM_CXFRAME); + Result.Y := GetSystemMetrics(SM_CYFRAME); + end +end; + +function TSpTBXCustomTitleBar.GetItems: TTBCustomItem; +begin + // The ToolbarEditor designer will open the editable items and + // not the Toolbar.Items + Result := Options.EditableItems; +end; + +procedure TSpTBXCustomTitleBar.GetSizeCursor(MousePos: TPoint; var SizeCursor, + SizeCode: Integer); +var + R: TRect; + Pt, FloatingBorderSize: TPoint; +const + SC_SizeLeft = $F001; + SC_SizeRight = $F002; + SC_SizeUp = $F003; + SC_SizeUpLeft = $F004; + SC_SizeUpRight = $F005; + SC_SizeDown = $F006; + SC_SizeDownLeft = $F007; + SC_SizeDownRight = $F008; +begin + SizeCursor := 0; + SizeCode := 0; + + if not IsActive or (Assigned(FParentForm) and (FParentForm.WindowState = wsMaximized)) then Exit; + + R := ClientRect; + FloatingBorderSize := GetFloatingBorderSize; + InflateRect(R, -FloatingBorderSize.X, -FloatingBorderSize.Y); + Pt := MousePos; + if not PtInRect(R, Pt) then begin + if (Pt.X < 10) and (Pt.Y < 10) then SizeCode := SC_SizeUpLeft + else if (Pt.X > Width - 10) and (Pt.Y < 10) then SizeCode := SC_SizeUpRight + else if (Pt.X < 10) and (Pt.Y > Height - 10) then SizeCode := SC_SizeDownLeft + else if (Pt.X > Width - 10) and (Pt.Y > Height - 10) then SizeCode := SC_SizeDownRight + else if (Pt.X > 10) and (Pt.X < Width - 10) and (Pt.Y < 10) then SizeCode := SC_SizeUp + else if (Pt.X > 10) and (Pt.X < Width - 10) and (Pt.Y > Height - 10) then SizeCode := SC_SizeDown + else if (Pt.Y > 10) and (Pt.Y < Height - 10) and (Pt.X < 10) then SizeCode := SC_SizeLeft + else if (Pt.Y > 10) and (Pt.Y < Height - 10) and (Pt.X > Width - 10) then SizeCode := SC_SizeRight; + + case SizeCode of + SC_SizeLeft, SC_SizeRight: SizeCursor := -9; + SC_SizeUp, SC_SizeDown: SizeCursor := -7; + SC_SizeUpLeft, SC_SizeDownRight: SizeCursor := -8; + SC_SizeDownLeft, SC_SizeUpRight: SizeCursor := -6; + end; + end +end; + +function TSpTBXCustomTitleBar.GetToolbarClass: TSpTBXToolbarClass; +begin + Result := TSpTBXTitleToolbar; +end; + +function TSpTBXCustomTitleBar.GetWindowState: TWindowState; +begin + if Assigned(FParentForm) then + Result := FParentForm.WindowState + else + Result := wsNormal; +end; + +function TSpTBXCustomTitleBar.IsActive: Boolean; +begin + Result := FActive and FMouseActive; +end; + +procedure TSpTBXCustomTitleBar.MouseDown(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +var + Pt: TPoint; + SizeCursor, SizeCode: Integer; +begin + inherited; + if not FixedSize and (Button = mbLeft) then begin + Pt := Point(X, Y); + GetSizeCursor(Pt, SizeCursor, SizeCode); + if (SizeCode > 0) and Assigned(FParentForm) then begin + ReleaseCapture; + FParentForm.Perform(WM_SYSCOMMAND, SizeCode, 0); + end; + end; +end; + +procedure TSpTBXCustomTitleBar.SetActive(const Value: Boolean); +begin + if FActive <> Value then begin + FActive := Value; + ChangeTitleBarState(Value); + end; +end; + +procedure TSpTBXCustomTitleBar.SetFullScreenMaximize(const Value: Boolean); +begin + if FFullScreenMaximize <> Value then begin + FFullScreenMaximize := Value; + if IsActive and Assigned(FParentForm) and FParentForm.HandleAllocated then begin + FParentForm.Constraints.MaxWidth := 0; + FParentForm.Constraints.MaxHeight := 0; + if (WindowState = wsMaximized) and not (csDesigning in ComponentState) then + TCustomFormAccess(FParentForm).RecreateWnd; + end; + end; +end; + +procedure TSpTBXCustomTitleBar.SetMouseActive(const Value: Boolean); +begin + if FMouseActive <> Value then begin + FMouseActive := Value; + ChangeTitleBarState(Value); + end; +end; + +procedure TSpTBXCustomTitleBar.SetWindowState(const Value: TWindowState); +begin + if Assigned(FParentForm) then begin + case Value of + wsMinimized: + begin + // WindowState := wsMinimized will not minimize the app correctly + SendMessage(FParentForm.Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0); + end; + wsMaximized, wsNormal: + FParentForm.WindowState := Value; + end; + end; +end; + +procedure TSpTBXCustomTitleBar.WMSpSkinChange(var Message: TMessage); +begin + UpdateSkinMetrics; + inherited; +end; + +procedure TSpTBXCustomTitleBar.CMTextChanged(var Message: TMessage); +begin + inherited; + if Assigned(FOptions) then + FOptions.CaptionLabel := Caption; +end; + +procedure TSpTBXCustomTitleBar.WMEraseBkgnd(var Message: TMessage); +var + ARect, DockAreaR: TRect; + FloatingBorderSize: TPoint; + Maximized, PaintDefault: Boolean; + B: TBitmap; +begin + Message.Result := 1; + if not DoubleBuffered or (Message.wParam = Message.lParam) then begin + B := TBitmap.Create; + try + ARect := GetClientRect; + B.Width := ARect.Right; + B.Height := ARect.Bottom; + B.Canvas.Brush.Color := Color; // SpDrawXPTitleBarBody needs it to paint the background + B.Canvas.FillRect(ARect); + + PaintDefault := True; + DoDrawBackground(B.Canvas, ARect, pstPrePaint, PaintDefault); + if PaintDefault then begin + Maximized := (WindowState = wsMaximized) and FMouseActive; + if Maximized then + InflateRect(ARect, 4, 4); + if Active then begin + FloatingBorderSize := GetFloatingBorderSize; + SpDrawXPTitleBarBody(B.Canvas, ARect, True, FloatingBorderSize); + + // [Theme-Change] + // On WindowsXP make sure we paint the titlebar on the NC area + // TSpTBXCustomTitleBar.WMEraseBkgnd and TSpTBXCustomTitleBar.DoDrawDockBackground handles this issue + if Assigned(FDock) and not Maximized and (SkinManager.GetSkinType = sknWindows) then begin + DockAreaR := ARect; + DockAreaR.Bottom := FDock.Height + FloatingBorderSize.Y; // don't multiply by 2 + SpDrawXPTitleBar(B.Canvas, DockAreaR, True); + end; + end; + end; + + PaintDefault := True; + DoDrawBackground(B.Canvas, ARect, pstPostPaint, PaintDefault); + + BitBlt(TWMEraseBkgnd(Message).DC, 0, 0, B.Width, B.Height, B.Canvas.Handle, 0, 0, SRCCOPY); + finally + B.Free; + end; + end; +end; + +procedure TSpTBXCustomTitleBar.WMSetCursor(var Message: TWMSetCursor); +var + P: TPoint; + SizeCursor, SizeCode: Integer; +begin + if not FixedSize and not (csDesigning in ComponentState) and + (Message.CursorWnd = Handle) and (Screen.Cursor = crDefault) then + begin + GetCursorPos(P); + P := ScreenToClient(P); + GetSizeCursor(P, SizeCursor, SizeCode); + if SizeCursor <> 0 then begin + Windows.SetCursor(Screen.Cursors[SizeCursor]); + Message.Result := 1; + end + else + inherited; + end + else + inherited; +end; + +procedure TSpTBXCustomTitleBar.WMWindowPosChanged(var Message: TWMWindowPosChanged); +begin + inherited; + InvalidateBackground(False); + if [csDesigning, csDestroying] * ComponentState = [] then begin + if FOptions.Maximize then + FOptions.SetupButtonIcon(FOptions.MaximizeButton); + // Hide the Toolbar if the Form is a MDI child and it's maximized + if Assigned(FParentForm) and (FParentForm.HandleAllocated) then begin + if (TCustomFormAccess(FParentForm).FormStyle = fsMDIChild) then + FDock.Visible := FParentForm.WindowState <> wsMaximized; + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TBitmapHint } + +procedure TBitmapHint.ActivateHint(Rect: TRect; const AHint: string); +var + SaveActivating: Boolean; + // Detect Delphi 7 + {$IF CompilerVersion < 17} + MonitorR: TRect; + Delta: TPoint; + {$IFEND} +begin + // [Bugfix] Delphi 7 bug, D7 hints doesn't support multi-monitors + {$IF CompilerVersion < 17} + MonitorR := GetRectOfMonitorContainingPoint(Point(Rect.Left, Rect.Top), True); + Delta := Point(0, 0); + if (Rect.Left < MonitorR.Right) and (Rect.Right > MonitorR.Right) then + Delta.X := - (Rect.Right - MonitorR.Right); + if (Rect.Top < MonitorR.Bottom) and (Rect.Bottom > MonitorR.Bottom) then + Delta.Y := - (Rect.Bottom - MonitorR.Bottom); + OffsetRect(Rect, Delta.X, Delta.Y); + {$IFEND} + + SaveActivating := FActivating; + try + FActivating := True; + inherited ActivateHint(Rect, AHint); + finally + FActivating := SaveActivating; + end; +end; + +procedure TBitmapHint.ActivateHintData(Rect: TRect; const AHint: string; AData: Pointer); +begin + //The AData parameter is a bitmap + FHintBitmap := TBitmap(AData); + Rect.Right := Rect.Left + FHintBitmap.Width - 2; + Rect.Bottom := Rect.Top + FHintBitmap.Height - 2; + inherited ActivateHintData(Rect, AHint, AData); +end; + +procedure TBitmapHint.CMTextChanged(var Message: TMessage); +begin + Message.Result := 1; +end; + +procedure TBitmapHint.Paint; +begin + if Assigned(FHintBitmap) then + Canvas.Draw(0, 0, FHintBitmap); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Stock Objects } + +procedure InitializeStock; +var + NonClientMetrics: TNonClientMetrics; +begin + // Small caption font + SmCaptionFont := TFont.Create; + NonClientMetrics.cbSize := SizeOf(NonClientMetrics); + if SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @NonClientMetrics, 0) then + SmCaptionFont.Handle := CreateFontIndirect(NonClientMetrics.lfSmCaptionFont); + + SpStockHintBitmap := TBitmap.Create; + + Screen.Cursors[crSpTBXNewHandPoint] := LoadCursor(0, IDC_HAND); + Screen.Cursors[crSpTBXCustomization] := LoadCursor(HInstance, 'CZMOVE'); + Screen.Cursors[crSpTBXCustomizationCancel] := LoadCursor(HInstance, 'CZCANCEL'); + + // Dummy ImageList, used by TSpTBXItemViewer and TSpTBXButtonOptions + MDIButtonsImgList := TImageList.Create(nil); +end; + +procedure FinalizeStock; +begin + FreeAndNil(SmCaptionFont); + FreeAndNil(SpStockHintBitmap); + FreeAndNil(MDIButtonsImgList); +end; + +initialization + InitializeStock; + +finalization + FinalizeStock; + +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXMDIMRU.dcu b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXMDIMRU.dcu new file mode 100644 index 0000000000000000000000000000000000000000..1173a9c04e6a218cad36cf9fabb561609bf9bbdc GIT binary patch literal 28140 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 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXMDIMRU.hpp b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXMDIMRU.hpp new file mode 100644 index 0000000..eca43c9 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXMDIMRU.hpp @@ -0,0 +1,171 @@ +// CodeGear C++Builder +// Copyright (c) 1995, 2008 by CodeGear +// All rights reserved + +// (DO NOT EDIT: machine generated header) 'Sptbxmdimru.pas' rev: 20.00 + +#ifndef SptbxmdimruHPP +#define SptbxmdimruHPP + +#pragma delphiheader begin +#pragma option push +#pragma option -w- // All warnings off +#pragma option -Vx // Zero-length empty class member functions +#pragma pack(push,8) +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit + +//-- user supplied ----------------------------------------------------------- + +namespace Sptbxmdimru +{ +//-- type declarations ------------------------------------------------------- +typedef void __fastcall (__closure *TSpTBXMRUListClickEvent)(System::TObject* Sender, const System::WideString Filename); + +class DELPHICLASS TSpTBXMDIHandler; +class DELPHICLASS TSpTBXMDIButtonsItem; +class PASCALIMPLEMENTATION TSpTBXMDIHandler : public Classes::TComponent +{ + typedef Classes::TComponent inherited; + +private: + TSpTBXMDIButtonsItem* FButtonsItem; + Sptbxitem::TSpTBXSystemMenuItem* FSystemMenuItem; + Tb2toolbar::TTBCustomToolbar* FToolbar; + void __fastcall SetToolbar(Tb2toolbar::TTBCustomToolbar* Value); + +protected: + virtual void __fastcall Notification(Classes::TComponent* AComponent, Classes::TOperation Operation); + +public: + __fastcall virtual TSpTBXMDIHandler(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXMDIHandler(void); + +__published: + __property Tb2toolbar::TTBCustomToolbar* Toolbar = {read=FToolbar, write=SetToolbar}; +}; + + +class PASCALIMPLEMENTATION TSpTBXMDIButtonsItem : public Tb2item::TTBCustomItem +{ + typedef Tb2item::TTBCustomItem inherited; + +private: + Sptbxitem::TSpTBXItem* FMinimizeItem; + Sptbxitem::TSpTBXItem* FRestoreItem; + Sptbxitem::TSpTBXItem* FCloseItem; + void __fastcall InvalidateSystemMenuItem(void); + void __fastcall ItemClick(System::TObject* Sender); + void __fastcall UpdateState(HWND W, bool Maximized); + +public: + __fastcall virtual TSpTBXMDIButtonsItem(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXMDIButtonsItem(void); +}; + + +class DELPHICLASS TSpTBXMDIWindowItem; +class PASCALIMPLEMENTATION TSpTBXMDIWindowItem : public Tb2item::TTBCustomItem +{ + typedef Tb2item::TTBCustomItem inherited; + +private: + Forms::TForm* FForm; + Classes::TNotifyEvent FOnUpdate; + Menus::TMenuItem* FWindowMenu; + void __fastcall ItemClick(System::TObject* Sender); + void __fastcall SetForm(Forms::TForm* AForm); + +protected: + virtual void __fastcall EnabledChanged(void); + DYNAMIC void __fastcall GetChildren(Classes::TGetChildProc Proc, Classes::TComponent* Root); + virtual void __fastcall Notification(Classes::TComponent* AComponent, Classes::TOperation Operation); + +public: + __fastcall virtual TSpTBXMDIWindowItem(Classes::TComponent* AOwner); + virtual void __fastcall InitiateAction(void); + +__published: + __property Enabled = {default=1}; + __property Classes::TNotifyEvent OnUpdate = {read=FOnUpdate, write=FOnUpdate}; +public: + /* TTBCustomItem.Destroy */ inline __fastcall virtual ~TSpTBXMDIWindowItem(void) { } + +}; + + +class DELPHICLASS TSpTBXMRUListItem; +class PASCALIMPLEMENTATION TSpTBXMRUListItem : public Tb2item::TTBCustomItem +{ + typedef Tb2item::TTBCustomItem inherited; + +private: + int FMaxItems; + TSpTBXMRUListClickEvent FOnClick; + bool FHidePathExtension; + void __fastcall ClickHandler(System::TObject* Sender); + void __fastcall SetHidePathExtension(const bool Value); + void __fastcall SetMaxItems(const int Value); + +public: + __fastcall virtual TSpTBXMRUListItem(Classes::TComponent* AOwner); + void __fastcall GetMRUFilenames(Classes::TStrings* MRUFilenames); + int __fastcall IndexOfMRU(System::WideString Filename); + int __fastcall MRUAdd(System::WideString Filename); + bool __fastcall MRUClick(System::WideString Filename); + void __fastcall MRURemove(System::WideString Filename); + void __fastcall MRUUpdateCaptions(void); + void __fastcall LoadFromIni(Inifiles::TCustomIniFile* Ini, const System::UnicodeString Section); + void __fastcall SaveToIni(Inifiles::TCustomIniFile* Ini, const System::UnicodeString Section); + +__published: + __property bool HidePathExtension = {read=FHidePathExtension, write=SetHidePathExtension, default=1}; + __property int MaxItems = {read=FMaxItems, write=SetMaxItems, default=4}; + __property TSpTBXMRUListClickEvent OnClick = {read=FOnClick, write=FOnClick}; +public: + /* TTBCustomItem.Destroy */ inline __fastcall virtual ~TSpTBXMRUListItem(void) { } + +}; + + +class DELPHICLASS TSpTBXMRUItem; +class PASCALIMPLEMENTATION TSpTBXMRUItem : public Sptbxitem::TSpTBXCustomItem +{ + typedef Sptbxitem::TSpTBXCustomItem inherited; + +private: + System::WideString FMRUString; + +public: + __property System::WideString MRUString = {read=FMRUString, write=FMRUString}; +public: + /* TSpTBXCustomItem.Create */ inline __fastcall virtual TSpTBXMRUItem(Classes::TComponent* AOwner) : Sptbxitem::TSpTBXCustomItem(AOwner) { } + /* TSpTBXCustomItem.Destroy */ inline __fastcall virtual ~TSpTBXMRUItem(void) { } + +}; + + +//-- var, const, procedure --------------------------------------------------- + +} /* namespace Sptbxmdimru */ +using namespace Sptbxmdimru; +#pragma pack(pop) +#pragma option pop + +#pragma delphiheader end. +//-- end unit ---------------------------------------------------------------- +#endif // SptbxmdimruHPP diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXMDIMRU.pas b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXMDIMRU.pas new file mode 100644 index 0000000..6ed2491 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXMDIMRU.pas @@ -0,0 +1,718 @@ +unit SpTBXMDIMRU; + +{============================================================================== +Version 2.4.2 + +The contents of this file are subject to the SpTBXLib License; you may +not use or distribute this file except in compliance with the +SpTBXLib License. +A copy of the SpTBXLib License may be found in SpTBXLib-LICENSE.txt or at: + http://www.silverpointdevelopment.com/sptbxlib/SpTBXLib-LICENSE.htm + +Alternatively, the contents of this file may be used under the terms of the +Mozilla Public License Version 1.1 (the "MPL v1.1"), in which case the provisions +of the MPL v1.1 are applicable instead of those in the SpTBXLib License. +A copy of the MPL v1.1 may be found in MPL-LICENSE.txt or at: + http://www.mozilla.org/MPL/ + +If you wish to allow use of your version of this file only under the terms of +the MPL v1.1 and not to allow others to use your version of this file under the +SpTBXLib License, indicate your decision by deleting the provisions +above and replace them with the notice and other provisions required by the +MPL v1.1. If you do not delete the provisions above, a recipient may use your +version of this file under either the SpTBXLib License or the MPL v1.1. + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for +the specific language governing rights and limitations under the License. + +The initial developer of this code is Robert Lee. + +Requirements: +For Delphi/C++Builder 2009 or newer: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org +For Delphi/C++Builder 7-2007: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org + - Troy Wolbrink's TNT Unicode Controls + http://www.tntware.com/delphicontrols/unicode/ + +Development notes: + - All the theme changes and adjustments are marked with '[Theme-Change]'. + +History: +8 May 2009 - version 2.4.2 + - Fixed incorrect MRU saving on TSpTBXMRUListItem, the + items were not correctly encoded when saving to an Ini + file, thanks to Dirk for reporting this. + +15 March 2009 - version 2.4.1 + - No changes. + +17 January 2009 - version 2.4 + - Added GetMRUFilenames and MRUClick methods to + TSpTBXMRUListItem. + - Added Hints to the items of TSpTBXMRUListItem. + +26 September 2008 - version 2.3 + - No changes. + +29 July 2008 - version 2.2 + - No changes. + +26 June 2008 - version 2.1 + - No changes. + +3 May 2008 - version 2.0 + - No changes. + +2 April 2008 - version 1.9.5 + - Fixed incorrect MRU loading on TSpTBXMRUListItem, thanks + to Pete for reporting this. + - Fixed incorrect TSpTBXMRUListItem behavior, MaxItems + had no effect when new files were added, thanks to + Senfore for reporting this. + +3 February 2008 - version 1.9.4 + - Added HidePathExtension property to TSpTBXMRUListItem. + +19 January 2008 - version 1.9.3 + - Initial release. + +==============================================================================} + +interface + +{$BOOLEVAL OFF} // Unit depends on short-circuit boolean evaluation + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + Menus, IniFiles, TB2Item, TB2Toolbar, SpTBXSkins, SpTBXItem; + +type + TSpTBXMDIButtonsItem = class; + + TSpTBXMRUListClickEvent = procedure(Sender: TObject; const Filename: WideString) of object; + + { TSpTBXMDIHandler } + + TSpTBXMDIHandler = class(TComponent) + private + FButtonsItem: TSpTBXMDIButtonsItem; + FSystemMenuItem: TSpTBXSystemMenuItem; + FToolbar: TTBCustomToolbar; + procedure SetToolbar(Value: TTBCustomToolbar); + protected + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + property Toolbar: TTBCustomToolbar read FToolbar write SetToolbar; + end; + + { TSpTBXMDIButtonsItem: should only be used by TSpTBXMDIHandler } + + TSpTBXMDIButtonsItem = class(TTBCustomItem) + private + FMinimizeItem, FRestoreItem, FCloseItem: TSpTBXItem; + procedure InvalidateSystemMenuItem; + procedure ItemClick(Sender: TObject); + procedure UpdateState(W: HWND; Maximized: Boolean); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + end; + + { TSpTBXMDIWindowItem } + + TSpTBXMDIWindowItem = class(TTBCustomItem) + private + FForm: TForm; + FOnUpdate: TNotifyEvent; + FWindowMenu: TMenuItem; + procedure ItemClick(Sender: TObject); + procedure SetForm(AForm: TForm); + protected + procedure EnabledChanged; override; + procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + public + constructor Create(AOwner: TComponent); override; + procedure InitiateAction; override; + published + property Enabled; + property OnUpdate: TNotifyEvent read FOnUpdate write FOnUpdate; + end; + + { TSpTBXMRUListItem } + + TSpTBXMRUListItem = class(TTBCustomItem) + private + FMaxItems: Integer; + FOnClick: TSpTBXMRUListClickEvent; + FHidePathExtension: Boolean; + procedure ClickHandler(Sender: TObject); + procedure SetHidePathExtension(const Value: Boolean); + procedure SetMaxItems(const Value: Integer); + public + constructor Create(AOwner: TComponent); override; + procedure GetMRUFilenames(MRUFilenames: TStrings); + function IndexOfMRU(Filename: WideString): Integer; + function MRUAdd(Filename: WideString): Integer; + function MRUClick(Filename: WideString): Boolean; + procedure MRURemove(Filename: WideString); + procedure MRUUpdateCaptions; + procedure LoadFromIni(Ini: TCustomIniFile; const Section: string); + procedure SaveToIni(Ini: TCustomIniFile; const Section: string); + published + property HidePathExtension: Boolean read FHidePathExtension write SetHidePathExtension default True; + property MaxItems: Integer read FMaxItems write SetMaxItems default 4; + property OnClick: TSpTBXMRUListClickEvent read FOnClick write FOnClick; + end; + + { TSpTBXMRUItem: should only be used by TSpTBXMRUListItem } + + TSpTBXMRUItem = class(TSpTBXCustomItem) + private + FMRUString: WideString; + public + property MRUString: WideString read FMRUString write FMRUString; + end; + +implementation + +uses + {$IFNDEF UNICODE} + TntSysUtils, + {$ENDIF} + TB2Common, TB2Consts; + +type + TTBCustomToolbarAccess = class(TTBCustomToolbar); + TTBCustomItemAccess = class(TTBCustomItem); + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXMDIHandler } + +constructor TSpTBXMDIHandler.Create(AOwner: TComponent); +begin + inherited; + FSystemMenuItem := TSpTBXSystemMenuItem.Create(Self); + FSystemMenuItem.MDISystemMenu := True; + FButtonsItem := TSpTBXMDIButtonsItem.Create(Self); +end; + +destructor TSpTBXMDIHandler.Destroy; +begin + SetToolbar(nil); + inherited; +end; + +procedure TSpTBXMDIHandler.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if (AComponent = FToolbar) and (Operation = opRemove) then + Toolbar := nil; +end; + +procedure TSpTBXMDIHandler.SetToolbar(Value: TTBCustomToolbar); +var + Rebuild: Boolean; +begin + if FToolbar <> Value then begin + if Assigned(FToolbar) then begin + Rebuild := False; + if TTBCustomToolbarAccess(FToolbar).FMDIButtonsItem = FButtonsItem then begin + TTBCustomToolbarAccess(FToolbar).FMDIButtonsItem := nil; + Rebuild := True; + end; + if TTBCustomToolbarAccess(FToolbar).FMDISystemMenuItem = FSystemMenuItem then begin + TTBCustomToolbarAccess(FToolbar).FMDISystemMenuItem := nil; + Rebuild := True; + end; + if Rebuild and Assigned(FToolbar.View) then + FToolbar.View.RecreateAllViewers; + end; + FToolbar := Value; + if Assigned(Value) then begin + Value.FreeNotification(Self); + TTBCustomToolbarAccess(Value).FMDIButtonsItem := FButtonsItem; + TTBCustomToolbarAccess(Value).FMDISystemMenuItem := FSystemMenuItem; + Value.View.RecreateAllViewers; + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXMDIButtonsItem } + +var + CBTHookHandle: HHOOK; + MDIButtonsItems: TList; + +function WindowIsMDIChild(W: HWND): Boolean; +var + I: Integer; + MainForm, ChildForm: TForm; +begin + MainForm := Application.MainForm; + if Assigned(MainForm) then + for I := 0 to MainForm.MDIChildCount-1 do begin + ChildForm := MainForm.MDIChildren[I]; + if ChildForm.HandleAllocated and (ChildForm.Handle = W) then begin + Result := True; + Exit; + end; + end; + Result := False; +end; + +function CBTHook(Code: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; +stdcall; +var + Maximizing: Boolean; + WindowPlacement: TWindowPlacement; + I: Integer; +begin + case Code of + HCBT_SETFOCUS: begin + if WindowIsMDIChild(HWND(WParam)) and Assigned(MDIButtonsItems) then begin + for I := 0 to MDIButtonsItems.Count-1 do + TSpTBXMDIButtonsItem(MDIButtonsItems[I]).InvalidateSystemMenuItem; + end; + end; + HCBT_MINMAX: begin + if WindowIsMDIChild(HWND(WParam)) and Assigned(MDIButtonsItems) and + (LParam in [SW_SHOWNORMAL, SW_SHOWMAXIMIZED, SW_MINIMIZE, SW_RESTORE]) then begin + Maximizing := (LParam = SW_MAXIMIZE); + if (LParam = SW_RESTORE) and not IsZoomed(HWND(WParam)) then begin + WindowPlacement.length := SizeOf(WindowPlacement); + GetWindowPlacement(HWND(WParam), @WindowPlacement); + Maximizing := (WindowPlacement.flags and WPF_RESTORETOMAXIMIZED <> 0); + end; + for I := 0 to MDIButtonsItems.Count-1 do + TSpTBXMDIButtonsItem(MDIButtonsItems[I]).UpdateState(HWND(WParam), Maximizing); + end; + end; + HCBT_DESTROYWND: begin + if WindowIsMDIChild(HWND(WParam)) and Assigned(MDIButtonsItems) then begin + for I := 0 to MDIButtonsItems.Count-1 do + TSpTBXMDIButtonsItem(MDIButtonsItems[I]).UpdateState(HWND(WParam), False); + end; + end; + end; + Result := CallNextHookEx(CBTHookHandle, Code, WParam, LParam); +end; + +constructor TSpTBXMDIButtonsItem.Create(AOwner: TComponent); + + function CreateItem(ImageIndex: Integer): TSpTBXItem; + var + A: TTBCustomItemAccess; + begin + Result := TSpTBXItem.Create(Self); + A := TTBCustomItemAccess(Result); + A.ItemStyle := A.ItemStyle + [tbisRightAlign]; + Result.Images := MDIButtonsImgList; + Result.ImageIndex := ImageIndex; + Result.CustomWidth := 17; + Result.OnClick := ItemClick; + end; + +begin + inherited; + ItemStyle := ItemStyle + [tbisEmbeddedGroup]; + + FMinimizeItem := CreateItem(2); + FRestoreItem := CreateItem(3); + FCloseItem := CreateItem(0); + + Add(FMinimizeItem); + Add(FRestoreItem); + Add(FCloseItem); + + UpdateState(0, False); + AddToList(MDIButtonsItems, Self); + if CBTHookHandle = 0 then + CBTHookHandle := SetWindowsHookEx(WH_CBT, CBTHook, 0, GetCurrentThreadId); +end; + +destructor TSpTBXMDIButtonsItem.Destroy; +begin + RemoveFromList(MDIButtonsItems, Self); + if (MDIButtonsItems = nil) and (CBTHookHandle <> 0) then begin + UnhookWindowsHookEx(CBTHookHandle); + CBTHookHandle := 0; + end; + inherited; +end; + +procedure TSpTBXMDIButtonsItem.UpdateState(W: HWND; Maximized: Boolean); +var + HasMaxChild, VisibilityChanged: Boolean; + + procedure UpdateVisibleEnabled(const Item: TTBCustomItem; const AEnabled: Boolean); + begin + if (Item.Visible <> HasMaxChild) or (Item.Enabled <> AEnabled) then begin + Item.Visible := HasMaxChild; + Item.Enabled := AEnabled; + VisibilityChanged := True; + end; + end; + +var + MainForm, ActiveMDIChild, ChildForm: TForm; + I: Integer; +begin + HasMaxChild := False; + MainForm := Application.MainForm; + ActiveMDIChild := nil; + if Assigned(MainForm) then begin + for I := 0 to MainForm.MDIChildCount - 1 do begin + ChildForm := MainForm.MDIChildren[I]; + if ChildForm.HandleAllocated and + (((ChildForm.Handle = W) and Maximized) or + ((ChildForm.Handle <> W) and IsZoomed(ChildForm.Handle))) then begin + HasMaxChild := True; + Break; + end; + end; + ActiveMDIChild := MainForm.ActiveMDIChild; + end; + + VisibilityChanged := False; + UpdateVisibleEnabled(TSpTBXMDIHandler(Owner).FSystemMenuItem, True); + UpdateVisibleEnabled(FMinimizeItem, (ActiveMDIChild = nil) or (GetWindowLong(ActiveMDIChild.Handle, GWL_STYLE) and WS_MINIMIZEBOX <> 0)); + UpdateVisibleEnabled(FRestoreItem, True); + UpdateVisibleEnabled(FCloseItem, True); + + if VisibilityChanged and Assigned((Owner as TSpTBXMDIHandler).FToolbar) then begin + TSpTBXMDIHandler(Owner).FToolbar.View.InvalidatePositions; + TSpTBXMDIHandler(Owner).FToolbar.View.TryValidatePositions; + end; +end; + +procedure TSpTBXMDIButtonsItem.ItemClick(Sender: TObject); +var + MainForm, ChildForm: TForm; + Cmd: WPARAM; +begin + MainForm := Application.MainForm; + if Assigned(MainForm) then begin + ChildForm := MainForm.ActiveMDIChild; + if Assigned(ChildForm) then begin + if Sender = FRestoreItem then + Cmd := SC_RESTORE + else if Sender = FCloseItem then + Cmd := SC_CLOSE + else + Cmd := SC_MINIMIZE; + SendMessage(ChildForm.Handle, WM_SYSCOMMAND, Cmd, GetMessagePos); + end; + end; +end; + +procedure TSpTBXMDIButtonsItem.InvalidateSystemMenuItem; +var + View: TTBView; +begin + if Assigned((Owner as TSpTBXMDIHandler).FToolbar) then begin + View := TSpTBXMDIHandler(Owner).FToolbar.View; + View.Invalidate(View.Find(TSpTBXMDIHandler(Owner).FSystemMenuItem)); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXMDIWindowItem } + +constructor TSpTBXMDIWindowItem.Create(AOwner: TComponent); +var + Form: TForm; +begin + inherited; + ItemStyle := ItemStyle + [tbisEmbeddedGroup]; + Caption := STBMDIWindowItemDefCaption; + FWindowMenu := TMenuItem.Create(Self); + + if not (csDesigning in ComponentState) then begin + { Need to set WindowMenu before MDI children are created. Otherwise the + list incorrectly shows the first 9 child windows, even if window 10+ is + active. } + Form := Application.MainForm; + if (Form = nil) and (Screen.FormCount > 0) then + Form := Screen.Forms[0]; + SetForm(Form); + end; +end; + +procedure TSpTBXMDIWindowItem.GetChildren(Proc: TGetChildProc; Root: TComponent); +begin + // Do nothing +end; + +procedure TSpTBXMDIWindowItem.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if (Operation = opRemove) and (AComponent = FForm) then + SetForm(nil); +end; + +procedure TSpTBXMDIWindowItem.SetForm(AForm: TForm); +begin + if FForm <> AForm then begin + if Assigned(FForm) and (FForm.WindowMenu = FWindowMenu) then + FForm.WindowMenu := nil; + FForm := AForm; + if Assigned(FForm) then + FForm.FreeNotification(Self); + end; + if Assigned(FForm) then + FForm.WindowMenu := FWindowMenu; +end; + +procedure TSpTBXMDIWindowItem.EnabledChanged; +var + I: Integer; +begin + inherited; + for I := 0 to Count-1 do + Items[I].Enabled := Enabled; +end; + +procedure TSpTBXMDIWindowItem.InitiateAction; +var + MainForm: TForm; + I: Integer; + M: HMENU; + Item: TSpTBXItem; + ItemCount: Integer; + Buf: array[0..1023] of Char; +begin + inherited; + if csDesigning in ComponentState then + Exit; + MainForm := Application.MainForm; + if Assigned(MainForm) then + SetForm(MainForm); + if FForm = nil then + Exit; + if FForm.ClientHandle <> 0 then + { This is needed, otherwise windows selected on the More Windows dialog + don't move back into the list } + SendMessage(FForm.ClientHandle, WM_MDIREFRESHMENU, 0, 0); + M := FWindowMenu.Handle; + ItemCount := GetMenuItemCount(M) - 1; + if ItemCount < 0 then + ItemCount := 0; + while Count < ItemCount do begin + Item := TSpTBXItem.Create(Self); + Item.Enabled := Enabled; + Item.OnClick := ItemClick; + Add(Item); + end; + while Count > ItemCount do + Items[Count - 1].Free; + for I := 0 to ItemCount - 1 do begin + Item := TSpTBXItem(Items[I]); + Item.Tag := GetMenuItemID(M, I+1); + if GetMenuString(M, I+1, Buf, SizeOf(Buf), MF_BYPOSITION) = 0 then + Buf[0] := #0; + Item.Caption := Buf; + Item.Checked := GetMenuState(M, I+1, MF_BYPOSITION) and MF_CHECKED <> 0; + end; + if Assigned(FOnUpdate) then + FOnUpdate(Self); +end; + +procedure TSpTBXMDIWindowItem.ItemClick(Sender: TObject); +var + Form: TForm; +begin + Form := Application.MainForm; + if Assigned(Form) then + PostMessage(Form.Handle, WM_COMMAND, TTBCustomItem(Sender).Tag, 0); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXMRUListItem } + +procedure TSpTBXMRUListItem.ClickHandler(Sender: TObject); +var + I: Integer; + A: TSpTBXMRUItem; +begin + if Sender is TSpTBXMRUItem then begin + A := TSpTBXMRUItem(Sender); + I := IndexOf(A); + if I > 0 then + Move(I, 0); + MRUUpdateCaptions; + if Assigned(FOnClick) then FOnClick(Self, A.MRUString); + end; +end; + +constructor TSpTBXMRUListItem.Create(AOwner: TComponent); +begin + inherited; + ItemStyle := ItemStyle + [tbisEmbeddedGroup]; + Caption := STBMRUListItemDefCaption; + Options := Options + [tboShowHint]; + FMaxItems := 4; + FHidePathExtension := True; +end; + +procedure TSpTBXMRUListItem.GetMRUFilenames(MRUFilenames: TStrings); +var + I: Integer; +begin + MRUFilenames.Clear; + for I := 0 to Count - 1 do + if Items[I] is TSpTBXMRUItem then + MRUFilenames.Add(TSpTBXMRUItem(Items[I]).MRUString); +end; + +function TSpTBXMRUListItem.IndexOfMRU(Filename: WideString): Integer; +var + I: Integer; +begin + Result := -1; + for I := 0 to Count - 1 do + if Items[I] is TSpTBXMRUItem then + if SpSameText(TSpTBXMRUItem(Items[I]).MRUString, Filename) then begin + Result := I; + Break; + end; +end; + +function TSpTBXMRUListItem.MRUAdd(Filename: WideString): Integer; +var + A: TSpTBXMRUItem; + I: Integer; +begin + Result := -1; + I := IndexOfMRU(Filename); + if I > -1 then begin + // If Filename is already in the MRU list, move it to the top + Move(I, 0); + MRUUpdateCaptions; + end + else begin + // Add the new Filename, if it exceeds the MaxItems limit delete the bottom items + A := TSpTBXMRUItem.Create(Self); + A.MRUString := Filename; + A.Hint := Filename; + A.OnClick := ClickHandler; + Insert(0, A); + while Count > FMaxItems do + Items[Count - 1].Free; + MRUUpdateCaptions; + Result := 0; + end; +end; + +function TSpTBXMRUListItem.MRUClick(Filename: WideString): Boolean; +var + I: Integer; +begin + Result := False; + I := IndexOfMRU(Filename); + if I > -1 then begin + Items[I].Click; + Result := True; + end; +end; + +procedure TSpTBXMRUListItem.MRURemove(Filename: WideString); +var + I: Integer; +begin + I := IndexOfMRU(Filename); + if I > -1 then begin + Items[I].Free; + MRUUpdateCaptions; + end; +end; + +procedure TSpTBXMRUListItem.MRUUpdateCaptions; +var + I: Integer; + A: TSpTBXMRUItem; + S: WideString; +begin + for I := 0 to Count - 1 do + if Items[I] is TSpTBXMRUItem then begin + A := TSpTBXMRUItem(Items[I]); + S := A.MRUString; + if FHidePathExtension then begin + {$IFDEF UNICODE} + S := ExtractFileName(S); + {$ELSE} + S := TntSysUtils.WideExtractFileName(S); + {$ENDIF} + end; + A.Caption := '&' + IntToStr(I + 1) + ' ' + S; + end; +end; + +procedure TSpTBXMRUListItem.LoadFromIni(Ini: TCustomIniFile; const Section: string); +var + I: Integer; + S: WideString; +begin + Clear; + for I := FMaxItems downto 1 do begin + S := Ini.ReadString(Section, IntToStr(I), ''); + {$IFDEF UNICODE} + S := UTF8ToUnicodeString(ShortString(S)); + {$ELSE} + S := UTF8Decode(S); + {$ENDIF} + if S <> '' then + MRUAdd(S); + end; +end; + +procedure TSpTBXMRUListItem.SaveToIni(Ini: TCustomIniFile; const Section: string); +var + I: Integer; + A: TSpTBXMRUItem; + S: string; +begin + for I := 1 to FMaxItems do begin + if I <= Count then begin + A := TSpTBXMRUItem(Items[I - 1]); + {$IFDEF UNICODE} + S := UnicodeString(UTF8EncodeToShortString(A.MRUString)); + {$ELSE} + S := UTF8Encode(A.MRUString); + {$ENDIF} + Ini.WriteString(Section, IntToStr(I), S); + end + else + Ini.DeleteKey(Section, IntToStr(I)); + end; +end; + +procedure TSpTBXMRUListItem.SetHidePathExtension(const Value: Boolean); +begin + if FHidePathExtension <> Value then begin + FHidePathExtension := Value; + MRUUpdateCaptions; + end; +end; + +procedure TSpTBXMRUListItem.SetMaxItems(const Value: Integer); +begin + if FMaxItems <> Value then begin + FMaxItems := Value; + if Count > FMaxItems then begin + while Count > FMaxItems do + Items[Count - 1].Free; + MRUUpdateCaptions; + end; + end; +end; + +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXReg.dcr b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXReg.dcr new file mode 100644 index 0000000000000000000000000000000000000000..c3f2986888938c8b2d1eacc02e5571675cfa1b15 GIT binary patch literal 119936 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 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXReg.hpp b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXReg.hpp new file mode 100644 index 0000000..b30ca22 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXReg.hpp @@ -0,0 +1,106 @@ +// CodeGear C++Builder +// Copyright (c) 1995, 2008 by CodeGear +// All rights reserved + +// (DO NOT EDIT: machine generated header) 'Sptbxreg.pas' rev: 20.00 + +#ifndef SptbxregHPP +#define SptbxregHPP + +#pragma delphiheader begin +#pragma option push +#pragma option -w- // All warnings off +#pragma option -Vx // Zero-length empty class member functions +#pragma pack(push,8) +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit + +//-- user supplied ----------------------------------------------------------- + +namespace Sptbxreg +{ +//-- type declarations ------------------------------------------------------- +class DELPHICLASS TSpTBXItemsEditor; +class PASCALIMPLEMENTATION TSpTBXItemsEditor : public Tb2dsgnitemeditor::TTBItemsEditor +{ + typedef Tb2dsgnitemeditor::TTBItemsEditor inherited; + +public: + virtual void __fastcall Edit(void); +public: + /* TComponentEditor.Create */ inline __fastcall virtual TSpTBXItemsEditor(Classes::TComponent* AComponent, Designintf::_di_IDesigner ADesigner) : Tb2dsgnitemeditor::TTBItemsEditor(AComponent, ADesigner) { } + +public: + /* TObject.Destroy */ inline __fastcall virtual ~TSpTBXItemsEditor(void) { } + +}; + + +class DELPHICLASS TSpTBXImageIndexEditor; +class PASCALIMPLEMENTATION TSpTBXImageIndexEditor : public Designeditors::TIntegerProperty +{ + typedef Designeditors::TIntegerProperty inherited; + +public: + virtual Designintf::TPropertyAttributes __fastcall GetAttributes(void); + virtual void __fastcall GetValues(Classes::TGetStrProc Proc); + virtual Imglist::TCustomImageList* __fastcall GetImageListAt(int Index); + void __fastcall ListMeasureHeight(const System::UnicodeString Value, Graphics::TCanvas* ACanvas, int &AHeight); + void __fastcall ListMeasureWidth(const System::UnicodeString Value, Graphics::TCanvas* ACanvas, int &AWidth); + void __fastcall ListDrawValue(const System::UnicodeString Value, Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool ASelected); +public: + /* TPropertyEditor.Create */ inline __fastcall virtual TSpTBXImageIndexEditor(const Designintf::_di_IDesigner ADesigner, int APropCount) : Designeditors::TIntegerProperty(ADesigner, APropCount) { } + /* TPropertyEditor.Destroy */ inline __fastcall virtual ~TSpTBXImageIndexEditor(void) { } + +private: + void *__ICustomPropertyListDrawing; /* Vcleditors::ICustomPropertyListDrawing */ + +public: + #if defined(MANAGED_INTERFACE_OPERATORS) + operator Vcleditors::_di_ICustomPropertyListDrawing() + { + Vcleditors::_di_ICustomPropertyListDrawing intf; + GetInterface(intf); + return intf; + } + #else + operator ICustomPropertyListDrawing*(void) { return (ICustomPropertyListDrawing*)&__ICustomPropertyListDrawing; } + #endif + +}; + + +//-- var, const, procedure --------------------------------------------------- +extern PACKAGE void __fastcall Register(void); + +} /* namespace Sptbxreg */ +using namespace Sptbxreg; +#pragma pack(pop) +#pragma option pop + +#pragma delphiheader end. +//-- end unit ---------------------------------------------------------------- +#endif // SptbxregHPP diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXReg.pas b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXReg.pas new file mode 100644 index 0000000..ca77a95 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXReg.pas @@ -0,0 +1,300 @@ +unit SpTBXReg; + +{============================================================================== +The contents of this file are subject to the SpTBXLib License; you may +not use or distribute this file except in compliance with the +SpTBXLib License. +A copy of the SpTBXLib License may be found in SpTBXLib-LICENSE.txt or at: + http://www.silverpointdevelopment.com/sptbxlib/SpTBXLib-LICENSE.htm + +Alternatively, the contents of this file may be used under the terms of the +Mozilla Public License Version 1.1 (the "MPL v1.1"), in which case the provisions +of the MPL v1.1 are applicable instead of those in the SpTBXLib License. +A copy of the MPL v1.1 may be found in MPL-LICENSE.txt or at: + http://www.mozilla.org/MPL/ + +If you wish to allow use of your version of this file only under the terms of +the MPL v1.1 and not to allow others to use your version of this file under the +SpTBXLib License, indicate your decision by deleting the provisions +above and replace them with the notice and other provisions required by the +MPL v1.1. If you do not delete the provisions above, a recipient may use your +version of this file under either the SpTBXLib License or the MPL v1.1. + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for +the specific language governing rights and limitations under the License. + +The initial developer of this code is Robert Lee. + +Requirements: +For Delphi/C++Builder 2009 or newer: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org +For Delphi/C++Builder 7-2007: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org + - Troy Wolbrink's TNT Unicode Controls + http://www.tntware.com/delphicontrols/unicode/ +==============================================================================} + +interface + +{$I TB2Ver.inc} + +uses + Windows, Classes, Controls, SysUtils, Graphics, ImgList, Dialogs, + {$IFDEF JR_D6} DesignIntf, DesignEditors, VCLEditors, {$ELSE} DsgnIntf, {$ENDIF} + TB2Reg, TB2Toolbar, TB2Item, TB2DsgnItemEditor, + SpTBXItem, SpTBXTabs, SpTBXDkPanels, SpTBXFormPopupMenu, + SpTBXControls, SpTBXEditors, SpTBXExtEditors, SpTBXCustomizer, SpTBXMDIMRU; + +type + { TSpTBXItemsEditor } + + TSpTBXItemsEditor = class(TTBItemsEditor) + public + procedure Edit; override; + end; + + { TSpTBXImageIndexEditor } + + TSpTBXImageIndexEditor = class(TIntegerProperty, ICustomPropertyListDrawing) + public + function GetAttributes: TPropertyAttributes; override; + procedure GetValues(Proc: TGetStrProc); override; + function GetImageListAt(Index: Integer): TCustomImageList; virtual; + + // ICustomPropertyListDrawing + procedure ListMeasureHeight(const Value: string; ACanvas: TCanvas; var AHeight: Integer); + procedure ListMeasureWidth(const Value: string; ACanvas: TCanvas; var AWidth: Integer); + procedure ListDrawValue(const Value: string; ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean); + end; + +procedure Register; + +implementation + +uses + Forms, TypInfo; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Helpers } + +procedure SpEditFormAddItems(Sender: TTBItemEditForm; const ToolbarName, ItemsPrefix: string); +// Creates a new toolbar in the EditForm with all the items that have the same prefix. +var + TB: TTBToolbar; + Item: TTBCustomItem; + NewItem: TTBItem; + S: string; + I, C: Integer; +begin + if Sender.FindComponent(ToolbarName) <> nil then Exit; + + // Create our own toolbar in the editor + TB := TTBToolbar.Create(Sender); + TB.Top := Sender.Height; + TB.Parent := Sender; + TB.Align := alTop; + TB.Images := Sender.ToolbarItems.SubMenuImages; + TB.ShowHint := True; + TB.Name := ToolbarName; + + C := Length(ItemsPrefix); + for I := 0 to Sender.MoreMenu.Count - 1 do + begin + Item := Sender.MoreMenu.Items[I]; + if Item is TTBCustomItem then + begin + S := TTBCustomItemClass(Item.Tag).ClassName; + if StrLComp(PChar(S), PChar(ItemsPrefix), C) = 0 then + begin + NewItem := TTBItem.Create(TB); + TB.Items.Add(NewItem); + NewItem.Caption := Item.Caption; + NewItem.ImageIndex := Item.ImageIndex; + NewItem.Tag := Item.Tag; + NewItem.Hint := S; + NewItem.OnClick := Item.OnClick; + end; + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBItemsEditor } + +procedure TSpTBXItemsEditor.Edit; +var + Intf: ITBItems; + F: TTBItemEditForm; + I: Integer; +begin + if Assigned(Component) and Component.GetInterface(ITBItems, Intf) then begin + inherited; + F := nil; + if Screen.ActiveForm is TTBItemEditForm then + F := Screen.ActiveForm as TTBItemEditForm + else + for I := 0 to Screen.FormCount - 1 do + if Screen.Forms[I] is TTBItemEditForm then begin + F := Screen.Forms[I] as TTBItemEditForm; + Break; + end; + + if Assigned(F) then + SpEditFormAddItems(F, 'SpTBToolbar', 'TSpTBX'); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXImageIndexEditor } + +function TSpTBXImageIndexEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paMultiSelect, paValueList, paRevertable]; +end; + +function TSpTBXImageIndexEditor.GetImageListAt(Index: Integer): TCustomImageList; +begin + Result := TCustomImageList(TypInfo.GetObjectProp(GetComponent(Index), 'Images')); +end; + +procedure TSpTBXImageIndexEditor.GetValues(Proc: TGetStrProc); +var + ImgList: TCustomImageList; + I: Integer; +begin + ImgList := GetImageListAt(0); + if Assigned(ImgList) then + for I := 0 to ImgList.Count-1 do + Proc(IntToStr(I)); +end; + +procedure TSpTBXImageIndexEditor.ListDrawValue(const Value: string; + ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean); +var + ImgList: TCustomImageList; + X: Integer; +begin + ImgList := GetImageListAt(0); + ACanvas.FillRect(ARect); + X := ARect.Left + 2; + if Assigned(ImgList) then begin + ImgList.Draw(ACanvas, X, ARect.Top + 2, StrToInt(Value)); + Inc(X, ImgList.Width); + end; + ACanvas.TextOut(X + 3, ARect.Top + 1, Value); +end; + +procedure TSpTBXImageIndexEditor.ListMeasureHeight(const Value: string; + ACanvas: TCanvas; var AHeight: Integer); +var + ImgList: TCustomImageList; +begin + ImgList := GetImageListAt(0); + AHeight := ACanvas.TextHeight(Value) + 2; + if Assigned(ImgList) and (ImgList.Height + 4 > AHeight) then + AHeight := ImgList.Height + 4; +end; + +procedure TSpTBXImageIndexEditor.ListMeasureWidth(const Value: string; + ACanvas: TCanvas; var AWidth: Integer); +var + ImgList: TCustomImageList; +begin + ImgList := GetImageListAt(0); + AWidth := ACanvas.TextWidth(Value) + 4; + if Assigned(ImgList) then + Inc(AWidth, ImgList.Width); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM + +procedure Register; +begin + {$IFDEF JR_D9} + ForceDemandLoadState(dlDisable); + {$ENDIF} + + RegisterComponents('SpTBXLib', [TSpTBXDock, TSpTBXMultiDock, TSpTBXToolbar, + TSpTBXToolWindow, TSpTBXDockablePanel, TSpTBXTabSet, TSpTBXTabControl, TSpTBXStatusBar, + TSpTBXPopupMenu, TSpTBXFormPopupMenu, TSpTBXMDIHandler, TSpTBXTitleBar, + TSpTBXLabel, TSpTBXCheckBox, TSpTBXRadioButton, TSpTBXButton, TSpTBXSpeedButton, + TSpTBXProgressBar, TSpTBXTrackBar, TSpTBXSplitter, TSpTBXPanel, TSpTBXGroupBox, + TSpTBXRadioGroup, TSpTBXEdit, TSpTBXButtonEdit, TSpTBXSpinEdit, TSpTBXColorEdit, + TSpTBXComboBox, TSpTBXFontComboBox, TSpTBXListBox, TSpTBXCheckListBox, TSpTBXColorListBox, + TSpTBXCustomizer]); + + RegisterClasses([TSpTBXTabSheet, TSpTBXCustomTabSet, TSpTBXCustomTabControl]); + + // TSpTBXItem + RegisterNoIcon([TSpTBXItem]); + RegisterClasses([TSpTBXItem]); + TBRegisterItemClass(TSpTBXItem, 'New SpTBX Item', HInstance); + // TSpTBXSubmenuItem + RegisterNoIcon([TSpTBXSubmenuItem]); + RegisterClasses([TSpTBXSubmenuItem]); + TBRegisterItemClass(TSpTBXSubmenuItem, 'New SpTBX Submenu Item', HInstance); + // TSpTBXSeparatorItem + RegisterNoIcon([TSpTBXSeparatorItem]); + RegisterClasses([TSpTBXSeparatorItem]); + TBRegisterItemClass(TSpTBXSeparatorItem, 'New SpTBX Separator Item', HInstance); + // TSpTBXSpacerItem + RegisterNoIcon([TSpTBXRightAlignSpacerItem]); + RegisterClasses([TSpTBXRightAlignSpacerItem]); + TBRegisterItemClass(TSpTBXRightAlignSpacerItem, 'New SpTBX RightAlignSpacer Item', HInstance); + // TSpTBXLabelItem + RegisterNoIcon([TSpTBXLabelItem]); + RegisterClasses([TSpTBXLabelItem]); + TBRegisterItemClass(TSpTBXLabelItem, 'New SpTBX Label Item', HInstance); + // TSpTBXSkinGroupItem + RegisterNoIcon([TSpTBXSkinGroupItem]); + RegisterClasses([TSpTBXSkinGroupItem]); + TBRegisterItemClass(TSpTBXSkinGroupItem, 'New SpTBX SkinGroup Item', HInstance); + // TSpTBXColorItem + RegisterNoIcon([TSpTBXColorItem]); + RegisterClasses([TSpTBXColorItem]); + TBRegisterItemClass(TSpTBXColorItem, 'New SpTBX Color Item', HInstance); + // TSpTBXTabItem + RegisterNoIcon([TSpTBXTabItem]); + RegisterClasses([TSpTBXTabItem]); + TBRegisterItemClass(TSpTBXTabItem, 'New SpTBX Tab Item', HInstance); + // TSpTBXEditItem + RegisterNoIcon([TSpTBXEditItem]); + RegisterClasses([TSpTBXEditItem]); + TBRegisterItemClass(TSpTBXEditItem, 'New SpTBX Edit Item', HInstance); + // TSpTBXSpinEditItem + RegisterNoIcon([TSpTBXSpinEditItem]); + RegisterClasses([TSpTBXSpinEditItem]); + TBRegisterItemClass(TSpTBXSpinEditItem, 'New SpTBX Spin Edit Item', HInstance); + // TSpTBXToolPalette + RegisterNoIcon([TSpTBXToolPalette]); + RegisterClasses([TSpTBXToolPalette]); + TBRegisterItemClass(TSpTBXToolPalette, 'New SpTBX Tool Palette Item', HInstance); + // TSpTBXColorPalette + RegisterNoIcon([TSpTBXColorPalette]); + RegisterClasses([TSpTBXColorPalette]); + TBRegisterItemClass(TSpTBXColorPalette, 'New SpTBX Color Palette Item', HInstance); + // TSpTBXMRUListItem + RegisterNoIcon([TSpTBXMRUListItem]); + RegisterClasses([TSpTBXMRUListItem]); + TBRegisterItemClass(TSpTBXMRUListItem, 'New SpTBX MRU List Item', HInstance); + // TSpTBXMDIWindowItem + RegisterNoIcon([TSpTBXMDIWindowItem]); + RegisterClasses([TSpTBXMDIWindowItem]); + TBRegisterItemClass(TSpTBXMDIWindowItem, 'New SpTBX MDI Window Item', HInstance); + + // Register the components editor, the components must implement IItems interface + RegisterComponentEditor(TSpTBXToolbar, TSpTBXItemsEditor); + RegisterComponentEditor(TSpTBXCompoundItemsControl, TSpTBXItemsEditor); + RegisterComponentEditor(TSpTBXDockablePanel, TSpTBXItemsEditor); + RegisterComponentEditor(TSpTBXCustomizer, TSpTBXItemsEditor); + RegisterComponentEditor(TSpTBXPopupMenu, TSpTBXItemsEditor); + + // Register the ImageIndex property editor for TSpTBXTextObject descendants, this is + // needed to show the preview of images in the property editor combobox. + RegisterPropertyEditor(TypeInfo(TImageIndex), TSpTBXTextObject, '', TSpTBXImageIndexEditor); +end; + +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXSkins.dcu b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXSkins.dcu new file mode 100644 index 0000000000000000000000000000000000000000..762b7c59c1da53b55262e9696a1842012b53997f GIT binary patch literal 109176 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%0DZ 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 // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit + +//-- user supplied ----------------------------------------------------------- + +namespace Sptbxskins +{ +//-- type declarations ------------------------------------------------------- +#pragma option push -b- +enum TSpTBXSkinType { sknNone, sknWindows, sknSkin }; +#pragma option pop + +#pragma option push -b- +enum TSpTBXLunaScheme { lusBlue, lusMetallic, lusGreen, lusUnknown }; +#pragma option pop + +#pragma option push -b- +enum TSpTBXSkinComponentsType { skncDock, skncDockablePanel, skncDockablePanelTitleBar, skncGutter, skncMenuBar, skncOpenToolbarItem, skncPanel, skncPopup, skncSeparator, skncSplitter, skncStatusBar, skncStatusBarGrip, skncTabBackground, skncTabToolbar, skncToolbar, skncToolbarGrip, skncWindow, skncWindowTitleBar, skncMenuBarItem, skncMenuItem, skncToolbarItem, skncButton, skncCheckBox, skncEditButton, skncEditFrame, skncHeader, skncLabel, skncListItem, skncProgressBar, skncRadioButton, skncTab, skncTrackBar, skncTrackBarButton }; +#pragma option pop + +#pragma option push -b- +enum TSpTBXSkinStatesType { sknsNormal, sknsDisabled, sknsHotTrack, sknsPushed, sknsChecked, sknsCheckedAndHotTrack }; +#pragma option pop + +typedef Set TSpTBXSkinStatesSet; + +#pragma option push -b- +enum TSpTBXSkinPartsType { sknpBody, sknpBorders, sknpText }; +#pragma option pop + +struct TSpTBXSkinComponentsIdentEntry +{ + +public: + System::UnicodeString Name; + TSpTBXSkinStatesSet States; +}; + + +typedef StaticArray Sptbxskins__1; + +typedef StaticArray Sptbxskins__2; + +typedef StaticArray Sptbxskins__3; + +#pragma option push -b- +enum TSpTextRotationAngle { tra0, tra90, tra270 }; +#pragma option pop + +struct TSpTBXTextInfo +{ + +public: + System::WideString Text; + TSpTextRotationAngle TextAngle; + unsigned TextFlags; + tagSIZE TextSize; + bool IsCaptionShown; + bool IsTextRotated; +}; + + +#pragma option push -b- +enum TSpGlyphLayout { ghlGlyphLeft, ghlGlyphTop }; +#pragma option pop + +#pragma option push -b- +enum TSpGlowDirection { gldNone, gldAll, gldTopLeft, gldBottomRight }; +#pragma option pop + +#pragma option push -b- +enum TSpTBXComboPart { cpNone, cpCombo, cpSplitLeft, cpSplitRight }; +#pragma option pop + +struct TSpTBXMenuItemMarginsInfo +{ + +public: + Types::TRect Margins; + int GutterSize; + int LeftCaptionMargin; + int RightCaptionMargin; + int ImageTextSpace; +}; + + +struct TSpTBXMenuItemInfo +{ + +public: + bool Enabled; + bool HotTrack; + bool Pushed; + bool Checked; + bool HasArrow; + bool ImageShown; + bool ImageOrCheckShown; + tagSIZE ImageSize; + tagSIZE RightImageSize; + bool IsDesigning; + bool IsOnMenuBar; + bool IsOnToolbox; + bool IsOpen; + bool IsSplit; + bool IsSunkenCaption; + bool IsVertical; + TSpTBXMenuItemMarginsInfo MenuMargins; + TSpTBXComboPart ComboPart; + Types::TRect ComboRect; + TSpTBXSkinStatesType ComboState; + bool ToolbarStyle; + TSpTBXSkinStatesType State; + TSpTBXSkinType SkinType; +}; + + +#pragma option push -b- +enum TSpTBXColorTextType { cttDefault, cttHTML, cttIdentAndHTML }; +#pragma option pop + +class DELPHICLASS TSpTBXSkinOptionEntry; +class PASCALIMPLEMENTATION TSpTBXSkinOptionEntry : public Classes::TPersistent +{ + typedef Classes::TPersistent inherited; + +private: + int FSkinType; + Graphics::TColor FColor1; + Graphics::TColor FColor2; + Graphics::TColor FColor3; + Graphics::TColor FColor4; + +protected: + virtual void __fastcall AssignTo(Classes::TPersistent* Dest); + +public: + __fastcall virtual TSpTBXSkinOptionEntry(void); + void __fastcall Fill(int ASkinType, Graphics::TColor AColor1, Graphics::TColor AColor2, Graphics::TColor AColor3, Graphics::TColor AColor4); + void __fastcall ReadFromString(System::UnicodeString S); + System::UnicodeString __fastcall WriteToString(); + bool __fastcall IsEmpty(void); + bool __fastcall IsEqual(TSpTBXSkinOptionEntry* AOptionEntry); + void __fastcall Reset(void); + +__published: + __property int SkinType = {read=FSkinType, write=FSkinType, nodefault}; + __property Graphics::TColor Color1 = {read=FColor1, write=FColor1, nodefault}; + __property Graphics::TColor Color2 = {read=FColor2, write=FColor2, nodefault}; + __property Graphics::TColor Color3 = {read=FColor3, write=FColor3, nodefault}; + __property Graphics::TColor Color4 = {read=FColor4, write=FColor4, nodefault}; +public: + /* TPersistent.Destroy */ inline __fastcall virtual ~TSpTBXSkinOptionEntry(void) { } + +}; + + +class DELPHICLASS TSpTBXSkinOptionCategory; +class PASCALIMPLEMENTATION TSpTBXSkinOptionCategory : public Classes::TPersistent +{ + typedef Classes::TPersistent inherited; + +private: + TSpTBXSkinOptionEntry* FBody; + TSpTBXSkinOptionEntry* FBorders; + Graphics::TColor FTextColor; + +protected: + virtual void __fastcall AssignTo(Classes::TPersistent* Dest); + +public: + __fastcall virtual TSpTBXSkinOptionCategory(void); + __fastcall virtual ~TSpTBXSkinOptionCategory(void); + bool __fastcall IsEmpty(void); + void __fastcall Reset(void); + void __fastcall LoadFromIni(Inifiles::TMemIniFile* MemIni, System::UnicodeString Section, System::UnicodeString Ident); + void __fastcall SaveToIni(Inifiles::TMemIniFile* MemIni, System::UnicodeString Section, System::UnicodeString Ident); + +__published: + __property TSpTBXSkinOptionEntry* Body = {read=FBody, write=FBody}; + __property TSpTBXSkinOptionEntry* Borders = {read=FBorders, write=FBorders}; + __property Graphics::TColor TextColor = {read=FTextColor, write=FTextColor, nodefault}; +}; + + +class DELPHICLASS TSpTBXSkinOptions; +class PASCALIMPLEMENTATION TSpTBXSkinOptions : public Classes::TPersistent +{ + typedef Classes::TPersistent inherited; + +private: + Graphics::TColor FColorBtnFace; + int FFloatingWindowBorderSize; + StaticArray, 33> FOptions; + bool FOfficeIcons; + bool FOfficeMenuSeparator; + bool FOfficeStatusBar; + System::UnicodeString FSkinAuthor; + System::UnicodeString FSkinName; + bool __fastcall GetOfficeIcons(void); + bool __fastcall GetOfficeMenuSeparator(void); + bool __fastcall GetOfficePopup(void); + bool __fastcall GetOfficeStatusBar(void); + int __fastcall GetFloatingWindowBorderSize(void); + void __fastcall SetFloatingWindowBorderSize(const int Value); + +protected: + virtual void __fastcall AssignTo(Classes::TPersistent* Dest); + void __fastcall BroadcastChanges(void); + +public: + __fastcall virtual TSpTBXSkinOptions(void); + __fastcall virtual ~TSpTBXSkinOptions(void); + void __fastcall CopyOptions(TSpTBXSkinComponentsType AComponent, TSpTBXSkinComponentsType ToComponent); + virtual void __fastcall FillOptions(void); + TSpTBXSkinOptionCategory* __fastcall Options(TSpTBXSkinComponentsType Component, TSpTBXSkinStatesType State)/* overload */; + TSpTBXSkinOptionCategory* __fastcall Options(TSpTBXSkinComponentsType Component)/* overload */; + void __fastcall LoadFromFile(System::WideString Filename); + virtual void __fastcall LoadFromStrings(Classes::TStrings* L); + void __fastcall SaveToFile(System::WideString Filename); + virtual void __fastcall SaveToStrings(Classes::TStrings* L); + virtual void __fastcall SaveToMemIni(Inifiles::TMemIniFile* MemIni); + void __fastcall Reset(bool ForceResetSkinProperties = false); + virtual void __fastcall GetDropDownArrowSize(/* out */ int &DropDownArrowSize, /* out */ int &DropDownArrowMargin, /* out */ int &SplitBtnArrowSize); + virtual void __fastcall GetMenuItemMargins(Graphics::TCanvas* ACanvas, int ImgSize, /* out */ TSpTBXMenuItemMarginsInfo &MarginsInfo); + TSpTBXSkinStatesType __fastcall GetState(bool Enabled, bool Pushed, bool HotTrack, bool Checked); + virtual Graphics::TColor __fastcall GetTextColor(TSpTBXSkinComponentsType Component, TSpTBXSkinStatesType State, TSpTBXSkinType SkinType = (TSpTBXSkinType)(0x2)); + virtual void __fastcall PaintBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, TSpTBXSkinComponentsType Component, TSpTBXSkinStatesType State, bool Background, bool Borders, bool Vertical = false, Controls::TAnchors ForceRectBorders = Controls::TAnchors() ); + virtual void __fastcall PaintMenuCheckMark(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool Checked, bool Grayed, bool MenuItemStyle, TSpTBXSkinStatesType State); + virtual void __fastcall PaintMenuRadioMark(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool Checked, bool MenuItemStyle, TSpTBXSkinStatesType State); + virtual void __fastcall PaintWindowFrame(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool IsActive, bool DrawBody, int BorderSize = 0x4); + __property Graphics::TColor ColorBtnFace = {read=FColorBtnFace, write=FColorBtnFace, nodefault}; + __property int FloatingWindowBorderSize = {read=GetFloatingWindowBorderSize, write=SetFloatingWindowBorderSize, nodefault}; + __property bool OfficeIcons = {read=GetOfficeIcons, write=FOfficeIcons, nodefault}; + __property bool OfficeMenuSeparator = {read=GetOfficeMenuSeparator, write=FOfficeMenuSeparator, nodefault}; + __property bool OfficePopup = {read=GetOfficePopup, nodefault}; + __property bool OfficeStatusBar = {read=GetOfficeStatusBar, write=FOfficeStatusBar, nodefault}; + __property System::UnicodeString SkinAuthor = {read=FSkinAuthor, write=FSkinAuthor}; + __property System::UnicodeString SkinName = {read=FSkinName, write=FSkinName}; +}; + + +typedef TMetaClass* TSpTBXSkinOptionsClass; + +class DELPHICLASS TSpTBXSkinsListEntry; +class PASCALIMPLEMENTATION TSpTBXSkinsListEntry : public System::TObject +{ + typedef System::TObject inherited; + +public: + TSpTBXSkinOptionsClass SkinClass; + Classes::TStringList* SkinStrings; + __fastcall virtual ~TSpTBXSkinsListEntry(void); +public: + /* TObject.Create */ inline __fastcall TSpTBXSkinsListEntry(void) : System::TObject() { } + +}; + + +class DELPHICLASS TSpTBXSkinsList; +class PASCALIMPLEMENTATION TSpTBXSkinsList : public Classes::TStringList +{ + typedef Classes::TStringList inherited; + +private: + TSpTBXSkinsListEntry* __fastcall GetSkinOption(int Index); + +public: + virtual void __fastcall Delete(int Index); + __fastcall virtual ~TSpTBXSkinsList(void); + int __fastcall AddSkin(System::UnicodeString SkinName, TSpTBXSkinOptionsClass SkinClass)/* overload */; + int __fastcall AddSkin(Classes::TStrings* SkinOptions)/* overload */; + int __fastcall AddSkinFromFile(System::WideString Filename); + void __fastcall AddSkinsFromFolder(System::WideString Folder); + void __fastcall GetSkinNames(Classes::TStrings* SkinNames); + __property TSpTBXSkinsListEntry* SkinOptions[int Index] = {read=GetSkinOption}; +public: + /* TStringList.Create */ inline __fastcall TSpTBXSkinsList(void)/* overload */ : Classes::TStringList() { } + +}; + + +class DELPHICLASS TSpTBXSkinManager; +class PASCALIMPLEMENTATION TSpTBXSkinManager : public System::TObject +{ + typedef System::TObject inherited; + +private: + TSpTBXSkinOptions* FCurrentSkin; + Classes::TList* FNotifies; + TSpTBXSkinsList* FSkinsList; + Classes::TNotifyEvent FOnSkinChange; + void __fastcall Broadcast(void); + System::UnicodeString __fastcall GetCurrentSkinName(); + +public: + __fastcall virtual TSpTBXSkinManager(void); + __fastcall virtual ~TSpTBXSkinManager(void); + TSpTBXSkinType __fastcall GetSkinType(void); + bool __fastcall IsDefaultSkin(void); + bool __fastcall IsXPThemesEnabled(void); + void __fastcall AddSkinNotification(System::TObject* AObject); + void __fastcall RemoveSkinNotification(System::TObject* AObject); + void __fastcall BroadcastSkinNotification(void); + void __fastcall LoadFromFile(System::WideString Filename); + void __fastcall SaveToFile(System::WideString Filename); + void __fastcall SetToDefaultSkin(void); + void __fastcall SetSkin(System::UnicodeString SkinName); + void __fastcall ChangeControlSkinType(Controls::TWinControl* Control, TSpTBXSkinType SkinType, bool Recursive = true); + __property TSpTBXSkinOptions* CurrentSkin = {read=FCurrentSkin}; + __property System::UnicodeString CurrentSkinName = {read=GetCurrentSkinName}; + __property TSpTBXSkinsList* SkinsList = {read=FSkinsList}; + __property Classes::TNotifyEvent OnSkinChange = {read=FOnSkinChange, write=FOnSkinChange}; +}; + + +class DELPHICLASS TSpTBXSkinSwitcher; +class PASCALIMPLEMENTATION TSpTBXSkinSwitcher : public Classes::TComponent +{ + typedef Classes::TComponent inherited; + +private: + Classes::TNotifyEvent FOnSkinChange; + System::UnicodeString __fastcall GetSkin(); + void __fastcall SetSkin(const System::UnicodeString Value); + MESSAGE void __fastcall WMSpSkinChange(Messages::TMessage &Message); + +public: + __fastcall virtual TSpTBXSkinSwitcher(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXSkinSwitcher(void); + +__published: + __property System::UnicodeString Skin = {read=GetSkin, write=SetSkin}; + __property Classes::TNotifyEvent OnSkinChange = {read=FOnSkinChange, write=FOnSkinChange}; +}; + + +typedef BOOL __stdcall (*TSpPrintWindow)(HWND Hnd, HDC HdcBlt, unsigned nFlags); + +//-- var, const, procedure --------------------------------------------------- +static const Word WM_SPSKINCHANGE = 0x87d7; +static const ShortInt MENU_POPUPBACKGROUND = 0x9; +static const ShortInt MENU_POPUPBORDERS = 0xa; +static const ShortInt MENU_POPUPCHECK = 0xb; +static const ShortInt MENU_POPUPCHECKBACKGROUND = 0xc; +static const ShortInt MENU_POPUPGUTTER = 0xd; +static const ShortInt MENU_POPUPITEM = 0xe; +static const ShortInt MENU_POPUPSEPARATOR = 0xf; +static const ShortInt MPI_NORMAL = 0x1; +static const ShortInt MPI_HOT = 0x2; +static const ShortInt MPI_DISABLED = 0x3; +static const ShortInt MPI_DISABLEDHOT = 0x4; +static const ShortInt MCB_DISABLED = 0x1; +static const ShortInt MCB_NORMAL = 0x2; +static const ShortInt MCB_BITMAP = 0x3; +static const ShortInt MC_CHECKMARKNORMAL = 0x1; +static const ShortInt MC_CHECKMARKDISABLED = 0x2; +static const ShortInt MC_BULLETNORMAL = 0x3; +static const ShortInt MC_BULLETDISABLED = 0x4; +extern PACKAGE Set SpTBXSkinMultiStateComponents; +#define CSpTBXSkinAllStates (Set () << sknsNormal << sknsDisabled << sknsHotTrack << sknsPushed << sknsChecked << sknsCheckedAndHotTrack ) +extern PACKAGE Sptbxskins__1 CSpTBXSkinComponents; +extern PACKAGE Sptbxskins__2 SSpTBXSkinStatesString; +extern PACKAGE Sptbxskins__3 SSpTBXSkinDisplayStatesString; +extern PACKAGE Graphics::TBitmap* StockBitmap; +extern PACKAGE TSpPrintWindow SpPrintWindow; +extern PACKAGE TSpTBXSkinManager* __fastcall SkinManager(void); +extern PACKAGE TSpTBXSkinOptions* __fastcall CurrentSkin(void); +extern PACKAGE TSpTBXSkinType __fastcall SpTBXSkinType(TSpTBXSkinType T); +extern PACKAGE TSpTBXLunaScheme __fastcall SpGetLunaScheme(void); +extern PACKAGE void __fastcall SpDrawParentBackground(Controls::TControl* Control, HDC DC, const Types::TRect &R); +extern PACKAGE HFONT __fastcall SpCreateRotatedFont(HDC DC, int Orientation = 0xa8c); +extern PACKAGE int __fastcall SpDrawRotatedText(const HDC DC, System::WideString AText, Types::TRect &ARect, const unsigned AFormat, TSpTextRotationAngle RotationAngle = (TSpTextRotationAngle)(0x2)); +extern PACKAGE int __fastcall SpCalcXPText(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, System::WideString Caption, Classes::TAlignment CaptionAlignment, unsigned Flags, const tagSIZE &GlyphSize, const tagSIZE &RightGlyphSize, TSpGlyphLayout Layout, bool PushedCaption, /* out */ Types::TRect &ACaptionRect, /* out */ Types::TRect &AGlyphRect, /* out */ Types::TRect &ARightGlyphRect, TSpTextRotationAngle RotationAngle = (TSpTextRotationAngle)(0x0)); +extern PACKAGE int __fastcall SpDrawXPText(Graphics::TCanvas* ACanvas, System::WideString Caption, Types::TRect &ARect, unsigned Flags, TSpGlowDirection CaptionGlow = (TSpGlowDirection)(0x0), Graphics::TColor CaptionGlowColor = (Graphics::TColor)(0xffff), TSpTextRotationAngle RotationAngle = (TSpTextRotationAngle)(0x0))/* overload */; +extern PACKAGE int __fastcall SpDrawXPText(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, System::WideString Caption, TSpGlowDirection CaptionGlow, Graphics::TColor CaptionGlowColor, Classes::TAlignment CaptionAlignment, unsigned Flags, const tagSIZE &GlyphSize, TSpGlyphLayout Layout, bool PushedCaption, /* out */ Types::TRect &ACaptionRect, /* out */ Types::TRect &AGlyphRect, TSpTextRotationAngle RotationAngle = (TSpTextRotationAngle)(0x0))/* overload */; +extern PACKAGE int __fastcall SpDrawXPText(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, System::WideString Caption, TSpGlowDirection CaptionGlow, Graphics::TColor CaptionGlowColor, Classes::TAlignment CaptionAlignment, unsigned Flags, Imglist::TCustomImageList* IL, int ImageIndex, TSpGlyphLayout Layout, bool Enabled, bool PushedCaption, bool DisabledIconCorrection, /* out */ Types::TRect &ACaptionRect, /* out */ Types::TRect &AGlyphRect, TSpTextRotationAngle RotationAngle = (TSpTextRotationAngle)(0x0))/* overload */; +extern PACKAGE tagSIZE __fastcall SpGetTextSize(HDC DC, System::WideString WS, bool NoPrefix); +extern PACKAGE int __fastcall SpGetControlTextHeight(Controls::TControl* AControl, Graphics::TFont* AFont); +extern PACKAGE tagSIZE __fastcall SpGetControlTextSize(Controls::TControl* AControl, Graphics::TFont* AFont, System::WideString WS); +extern PACKAGE bool __fastcall SpSameText(System::WideString W1, System::WideString W2); +extern PACKAGE System::WideString __fastcall SpStripAccelChars(System::WideString S); +extern PACKAGE System::WideString __fastcall SpStripShortcut(System::WideString S); +extern PACKAGE System::WideString __fastcall SpStripTrailingPunctuation(System::WideString S); +extern PACKAGE System::UnicodeString __fastcall SpRectToString(const Types::TRect &R); +extern PACKAGE bool __fastcall SpStringToRect(System::UnicodeString S, /* out */ Types::TRect &R); +extern PACKAGE System::UnicodeString __fastcall SpColorToHTML(const Graphics::TColor Color); +extern PACKAGE System::UnicodeString __fastcall SpColorToString(const Graphics::TColor Color, TSpTBXColorTextType TextType = (TSpTBXColorTextType)(0x0)); +extern PACKAGE bool __fastcall SpStringToColor(System::UnicodeString S, /* out */ Graphics::TColor &Color); +extern PACKAGE void __fastcall SpGetRGB(Graphics::TColor Color, /* out */ int &R, /* out */ int &G, /* out */ int &B); +extern PACKAGE Graphics::TColor __fastcall SpRGBToColor(int R, int G, int B); +extern PACKAGE Graphics::TColor __fastcall SpLighten(Graphics::TColor Color, int Amount); +extern PACKAGE Graphics::TColor __fastcall SpBlendColors(Graphics::TColor TargetColor, Graphics::TColor BaseColor, int Percent); +extern PACKAGE Graphics::TColor __fastcall SpMixColors(Graphics::TColor TargetColor, Graphics::TColor BaseColor, System::Byte Amount); +extern PACKAGE Types::TRect __fastcall SpCenterRect(const Types::TRect &Parent, int ChildWidth, int ChildHeight)/* overload */; +extern PACKAGE Types::TRect __fastcall SpCenterRect(const Types::TRect &Parent, const Types::TRect &Child)/* overload */; +extern PACKAGE Types::TRect __fastcall SpCenterRectHoriz(const Types::TRect &Parent, int ChildWidth); +extern PACKAGE Types::TRect __fastcall SpCenterRectVert(const Types::TRect &Parent, int ChildHeight); +extern PACKAGE void __fastcall SpFillRect(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, Graphics::TColor BrushColor, Graphics::TColor PenColor = (Graphics::TColor)(0x1fffffff)); +extern PACKAGE void __fastcall SpDrawLine(Graphics::TCanvas* ACanvas, int X1, int Y1, int X2, int Y2, Graphics::TColor Color); +extern PACKAGE void __fastcall SpDrawRectangle(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, int CornerSize, Graphics::TColor ColorL, Graphics::TColor ColorT, Graphics::TColor ColorR, Graphics::TColor ColorB, Graphics::TColor InternalColorL, Graphics::TColor InternalColorT, Graphics::TColor InternalColorR, Graphics::TColor InternalColorB, Controls::TAnchors ForceRectBorders = Controls::TAnchors() )/* overload */; +extern PACKAGE void __fastcall SpDrawRectangle(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, int CornerSize, Graphics::TColor ColorTL, Graphics::TColor ColorBR, Graphics::TColor ColorTLInternal = (Graphics::TColor)(0x1fffffff), Graphics::TColor ColorBRInternal = (Graphics::TColor)(0x1fffffff), Controls::TAnchors ForceRectBorders = Controls::TAnchors() )/* overload */; +extern PACKAGE void __fastcall SpAlphaBlend(HDC SrcDC, HDC DstDC, const Types::TRect &SrcR, const Types::TRect &DstR, System::Byte Alpha, bool SrcHasAlphaChannel = false); +extern PACKAGE void __fastcall SpPaintTo(Controls::TWinControl* WinControl, Graphics::TCanvas* ACanvas, int X, int Y); +extern PACKAGE void __fastcall SpDrawIconShadow(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, Imglist::TCustomImageList* ImageList, int ImageIndex); +extern PACKAGE void __fastcall SpDrawImageList(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, Imglist::TCustomImageList* ImageList, int ImageIndex, bool Enabled, bool DisabledIconCorrection); +extern PACKAGE void __fastcall SpGradient(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, int StartPos, int EndPos, int ChunkSize, Graphics::TColor C1, Graphics::TColor C2, const bool Vertical); +extern PACKAGE void __fastcall SpGradientFill(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Graphics::TColor C1, const Graphics::TColor C2, const bool Vertical); +extern PACKAGE void __fastcall SpGradientFillMirror(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Graphics::TColor C1, const Graphics::TColor C2, const Graphics::TColor C3, const Graphics::TColor C4, const bool Vertical); +extern PACKAGE void __fastcall SpGradientFillMirrorTop(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Graphics::TColor C1, const Graphics::TColor C2, const Graphics::TColor C3, const Graphics::TColor C4, const bool Vertical); +extern PACKAGE void __fastcall SpGradientFillGlass(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Graphics::TColor C1, const Graphics::TColor C2, const Graphics::TColor C3, const Graphics::TColor C4, const bool Vertical); +extern PACKAGE void __fastcall SpDrawArrow(Graphics::TCanvas* ACanvas, int X, int Y, Graphics::TColor AColor, bool Vertical, bool Reverse, int Size); +extern PACKAGE void __fastcall SpDrawDropMark(Graphics::TCanvas* ACanvas, const Types::TRect &DropMark); +extern PACKAGE void __fastcall SpDrawFocusRect(Graphics::TCanvas* ACanvas, const Types::TRect &ARect); +extern PACKAGE void __fastcall SpDrawGlyphPattern(HDC DC, const Types::TRect &R, int Width, int Height, const void *PatternBits, Graphics::TColor PatternColor)/* overload */; +extern PACKAGE void __fastcall SpDrawGlyphPattern(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, int PatternIndex, Graphics::TColor PatternColor)/* overload */; +extern PACKAGE void __fastcall SpDrawXPButton(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool Enabled, bool Pushed, bool HotTrack, bool Checked, bool Focused, bool Defaulted, TSpTBXSkinType SkinType); +extern PACKAGE void __fastcall SpDrawXPCheckBoxGlyph(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool Enabled, Stdctrls::TCheckBoxState State, bool HotTrack, bool Pushed, TSpTBXSkinType SkinType); +extern PACKAGE void __fastcall SpDrawXPRadioButtonGlyph(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool Enabled, bool Checked, bool HotTrack, bool Pushed, TSpTBXSkinType SkinType); +extern PACKAGE void __fastcall SpDrawXPEditFrame(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool Enabled, bool HotTrack, TSpTBXSkinType SkinType, bool ClipContent = false, bool AutoAdjust = false)/* overload */; +extern PACKAGE void __fastcall SpDrawXPEditFrame(Controls::TWinControl* AWinControl, bool HotTracking, TSpTBXSkinType SkinType, bool AutoAdjust = false, bool HideFrame = false)/* overload */; +extern PACKAGE void __fastcall SpDrawXPGrip(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, Graphics::TColor LoC, Graphics::TColor HiC); +extern PACKAGE void __fastcall SpDrawXPHeader(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool HotTrack, bool Pushed, TSpTBXSkinType SkinType); +extern PACKAGE void __fastcall SpDrawXPListItemBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool HotTrack, bool Pushed, bool Focused, TSpTBXSkinType SkinType); +extern PACKAGE void __fastcall SpPaintSkinBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, TSpTBXSkinOptionCategory* SkinOption, bool Vertical); +extern PACKAGE void __fastcall SpPaintSkinBorders(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, TSpTBXSkinOptionCategory* SkinOption, Controls::TAnchors ForceRectBorders = Controls::TAnchors() ); +extern PACKAGE bool __fastcall SpIsWinVistaOrUp(void); +extern PACKAGE bool __fastcall SpGetDirectories(System::WideString Path, Classes::TStringList* L); + +} /* namespace Sptbxskins */ +using namespace Sptbxskins; +#pragma pack(pop) +#pragma option pop + +#pragma delphiheader end. +//-- end unit ---------------------------------------------------------------- +#endif // SptbxskinsHPP diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXSkins.pas b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXSkins.pas new file mode 100644 index 0000000..fb46d99 --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXSkins.pas @@ -0,0 +1,3494 @@ +unit SpTBXSkins; + +{============================================================================== +Version 2.4.2 + +The contents of this file are subject to the SpTBXLib License; you may +not use or distribute this file except in compliance with the +SpTBXLib License. +A copy of the SpTBXLib License may be found in SpTBXLib-LICENSE.txt or at: + http://www.silverpointdevelopment.com/sptbxlib/SpTBXLib-LICENSE.htm + +Alternatively, the contents of this file may be used under the terms of the +Mozilla Public License Version 1.1 (the "MPL v1.1"), in which case the provisions +of the MPL v1.1 are applicable instead of those in the SpTBXLib License. +A copy of the MPL v1.1 may be found in MPL-LICENSE.txt or at: + http://www.mozilla.org/MPL/ + +If you wish to allow use of your version of this file only under the terms of +the MPL v1.1 and not to allow others to use your version of this file under the +SpTBXLib License, indicate your decision by deleting the provisions +above and replace them with the notice and other provisions required by the +MPL v1.1. If you do not delete the provisions above, a recipient may use your +version of this file under either the SpTBXLib License or the MPL v1.1. + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for +the specific language governing rights and limitations under the License. + +The initial developer of this code is Robert Lee. + +Requirements: +For Delphi/C++Builder 2009 or newer: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org +For Delphi/C++Builder 7-2007: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org + - Troy Wolbrink's TNT Unicode Controls + http://www.tntware.com/delphicontrols/unicode/ + +Development notes: + - All the Windows and Delphi bugs fixes are marked with '[Bugfix]'. + - All the theme changes and adjustments are marked with '[Theme-Change]'. + - DT_END_ELLIPSIS and DT_PATH_ELLIPSIS doesn't work with rotated text + http://support.microsoft.com/kb/249678 + +History: +8 May 2009 - version 2.4.2 + - No changes. + +15 March 2009 - version 2.4.1 + - Added OnSkinChange event to TSpTBXSkinManager. + +17 January 2009 - version 2.4 + - Minor Fixes. + +26 September 2008 - version 2.3 + - Fixed incorrect skin loading when the Aluminum skin was used, + thanks to Costas Stergiou for reporting this. + +29 July 2008 - version 2.2 + - Fixed incorrect menu items painting on Vista when the Windows + themes was disabled, thanks to Arvid for reporting this. + +26 June 2008 - version 2.1 + - Added Windows Vista specific constants to support Vista + themes on Delphi versions prior to 2007, thanks to Wolf B. + for his contribution. + +3 May 2008 - version 2.0 + - Renamed TSpTBXSkinOptions.TitleBarBorderSize to + FloatingWindowBorderSize. + +2 April 2008 - version 1.9.5 + - No changes. + +3 February 2008 - version 1.9.4 + - Added TitleBarBorderSize to the skins options. + +19 January 2008 - version 1.9.3 + - No changes. + +26 December 2007 - version 1.9.2 + - New gradient skin style added to mimic Vista toolbar gradients, use + 9 or 10 gradient style to paint vertically or horizontally. + +1 December 2007 - version 1.9.1 + - Added Header and Tabs Toolbar skinning. skncHeader and skncTabToolbar + skin elements were added to the skin components type. + - Added SpDrawXPHeader utility function to paint the header controls. + +20 November 2007 - version 1.9 + - Initial release. + +==============================================================================} + +interface + +{$BOOLEVAL OFF} // Unit depends on short-circuit boolean evaluation + +uses + Windows, Messages, Classes, SysUtils, Graphics, Controls, StdCtrls, + ImgList, IniFiles; + +const + WM_SPSKINCHANGE = WM_APP + 2007; // Skin change notification message + + { Windows Vista theme painting constants } + MENU_POPUPBACKGROUND = 9; + MENU_POPUPBORDERS = 10; + MENU_POPUPCHECK = 11; + MENU_POPUPCHECKBACKGROUND = 12; + MENU_POPUPGUTTER = 13; + MENU_POPUPITEM = 14; + MENU_POPUPSEPARATOR = 15; + MPI_NORMAL = 1; + MPI_HOT = 2; + MPI_DISABLED = 3; + MPI_DISABLEDHOT = 4; + MCB_DISABLED = 1; + MCB_NORMAL = 2; + MCB_BITMAP = 3; + MC_CHECKMARKNORMAL = 1; + MC_CHECKMARKDISABLED = 2; + MC_BULLETNORMAL = 3; + MC_BULLETDISABLED = 4; + +type + { Skins } + + TSpTBXSkinType = ( + sknNone, // No themes + sknWindows, // Use Windows themes + sknSkin // Use Skins + ); + + TSpTBXLunaScheme = ( + lusBlue, + lusMetallic, + lusGreen, + lusUnknown + ); + + TSpTBXSkinComponentsType = ( + skncDock, + skncDockablePanel, + skncDockablePanelTitleBar, + skncGutter, + skncMenuBar, + skncOpenToolbarItem, + skncPanel, + skncPopup, + skncSeparator, + skncSplitter, + skncStatusBar, + skncStatusBarGrip, + skncTabBackground, + skncTabToolbar, + skncToolbar, + skncToolbarGrip, + skncWindow, + skncWindowTitleBar, + + // Multiple States + skncMenuBarItem, + skncMenuItem, + skncToolbarItem, + skncButton, + skncCheckBox, + skncEditButton, + skncEditFrame, + skncHeader, + skncLabel, + skncListItem, + skncProgressBar, + skncRadioButton, + skncTab, + skncTrackBar, + skncTrackBarButton + ); + TSpTBXSkinStatesType = (sknsNormal, sknsDisabled, sknsHotTrack, sknsPushed, sknsChecked, sknsCheckedAndHotTrack); + + TSpTBXSkinStatesSet = set of TSpTBXSkinStatesType; + + TSpTBXSkinPartsType = (sknpBody, sknpBorders, sknpText); + + TSpTBXSkinComponentsIdentEntry = record + Name: string; + States: TSpTBXSkinStatesSet; + end; + +const + SpTBXSkinMultiStateComponents: set of TSpTBXSkinComponentsType = [skncMenuBarItem..High(TSpTBXSkinComponentsType)]; + + CSpTBXSkinAllStates = [Low(TSpTBXSkinStatesType)..High(TSpTBXSkinStatesType)]; + CSpTBXSkinComponents: array [TSpTBXSkinComponentsType] of TSpTBXSkinComponentsIdentEntry = ( + // Single state Components + (Name: 'Dock'; States: [sknsNormal]), + (Name: 'DockablePanel'; States: [sknsNormal]), + (Name: 'DockablePanelTitleBar'; States: [sknsNormal]), + (Name: 'Gutter'; States: [sknsNormal]), + (Name: 'MenuBar'; States: [sknsNormal]), + (Name: 'OpenToolbarItem'; States: [sknsNormal]), + (Name: 'Panel'; States: [sknsNormal]), + (Name: 'Popup'; States: [sknsNormal]), + (Name: 'Separator'; States: [sknsNormal]), + (Name: 'Splitter'; States: [sknsNormal]), + (Name: 'StatusBar'; States: [sknsNormal]), + (Name: 'StatusBarGrip'; States: [sknsNormal]), + (Name: 'TabBackground'; States: [sknsNormal]), + (Name: 'TabToolbar'; States: [sknsNormal]), + (Name: 'Toolbar'; States: [sknsNormal]), + (Name: 'ToolbarGrip'; States: [sknsNormal]), + (Name: 'Window'; States: [sknsNormal]), + (Name: 'WindowTitleBar'; States: [sknsNormal]), + // Multi state Components + (Name: 'MenuBarItem'; States: CSpTBXSkinAllStates), + (Name: 'MenuItem'; States: CSpTBXSkinAllStates), + (Name: 'ToolbarItem'; States: CSpTBXSkinAllStates), + (Name: 'Button'; States: CSpTBXSkinAllStates), + (Name: 'CheckBox'; States: CSpTBXSkinAllStates), + (Name: 'EditButton'; States: CSpTBXSkinAllStates), + (Name: 'EditFrame'; States: [sknsNormal, sknsDisabled, sknsHotTrack]), + (Name: 'Header'; States: [sknsNormal, sknsDisabled, sknsHotTrack, sknsPushed]), + (Name: 'Label'; States: [sknsNormal, sknsDisabled]), + (Name: 'ListItem'; States: [sknsHotTrack]), + (Name: 'ProgressBar'; States: [sknsNormal, sknsHotTrack]), + (Name: 'RadioButton'; States: CSpTBXSkinAllStates), + (Name: 'Tab'; States: CSpTBXSkinAllStates), + (Name: 'TrackBar'; States: [sknsNormal, sknsHotTrack]), + (Name: 'TrackBarButton'; States: [sknsNormal, sknsPushed]) + ); + + SSpTBXSkinStatesString: array [TSpTBXSkinStatesType] of string = ('Normal', 'Disabled', 'HotTrack', 'Pushed', 'Checked', 'CheckedAndHotTrack'); + SSpTBXSkinDisplayStatesString: array [TSpTBXSkinStatesType] of string = ('Normal', 'Disabled', 'Hot', 'Pushed', 'Checked', 'Checked && Hot'); + +type + { Text } + + TSpTextRotationAngle = ( + tra0, // No rotation + tra90, // 90 degree rotation + tra270 // 270 degree rotation + ); + + TSpTBXTextInfo = record + Text: WideString; + TextAngle: TSpTextRotationAngle; + TextFlags: Cardinal; + TextSize: TSize; + IsCaptionShown: Boolean; + IsTextRotated: Boolean; + end; + + TSpGlyphLayout = ( + ghlGlyphLeft, // Glyph icon on the left of the caption + ghlGlyphTop // Glyph icon on the top of the caption + ); + + TSpGlowDirection = ( + gldNone, // No glow + gldAll, // Glow on Left, Top, Right and Bottom of the text + gldTopLeft, // Glow on Top-Left of the text + gldBottomRight // Glow on Bottom-Right of the text + ); + + { MenuItem } + + TSpTBXComboPart = (cpNone, cpCombo, cpSplitLeft, cpSplitRight); + TSpTBXMenuItemMarginsInfo = record + Margins: TRect; // MenuItem margins + GutterSize: Integer; // Size of the gutter + LeftCaptionMargin: Integer; // Left margin of the caption + RightCaptionMargin: Integer; // Right margin of the caption + ImageTextSpace: Integer; // Space between the Icon and the caption + end; + + TSpTBXMenuItemInfo = record + Enabled: Boolean; + HotTrack: Boolean; + Pushed: Boolean; + Checked: Boolean; + HasArrow: Boolean; + ImageShown: Boolean; + ImageOrCheckShown: Boolean; + ImageSize: TSize; + RightImageSize: TSize; + IsDesigning: Boolean; + IsOnMenuBar: Boolean; + IsOnToolbox: Boolean; + IsOpen: Boolean; + IsSplit: Boolean; + IsSunkenCaption: Boolean; + IsVertical: Boolean; + MenuMargins: TSpTBXMenuItemMarginsInfo; // Used only on menu items + ComboPart: TSpTBXComboPart; + ComboRect: TRect; + ComboState: TSpTBXSkinStatesType; + ToolbarStyle: Boolean; + State: TSpTBXSkinStatesType; + SkinType: TSpTBXSkinType; + end; + + { Colors } + + TSpTBXColorTextType = ( + cttDefault, // Default format (clWhite, $FFFFFF) + cttHTML, // HTML format (#FFFFFF) + cttIdentAndHTML // Use color idents (clWhite), if not possible use HTML format + ); + + { TSpTBXSkinOptions } + + TSpTBXSkinOptionEntry = class(TPersistent) + private + FSkinType: Integer; + FColor1, FColor2, FColor3, FColor4: TColor; + protected + procedure AssignTo(Dest: TPersistent); override; + public + constructor Create; virtual; + procedure Fill(ASkinType: Integer; AColor1, AColor2, AColor3, AColor4: TColor); + procedure ReadFromString(S: string); + function WriteToString: string; + function IsEmpty: Boolean; + function IsEqual(AOptionEntry: TSpTBXSkinOptionEntry): Boolean; + procedure Reset; + published + property SkinType: Integer read FSkinType write FSkinType; + property Color1: TColor read FColor1 write FColor1; + property Color2: TColor read FColor2 write FColor2; + property Color3: TColor read FColor3 write FColor3; + property Color4: TColor read FColor4 write FColor4; + end; + + TSpTBXSkinOptionCategory = class(TPersistent) + private + FBody: TSpTBXSkinOptionEntry; + FBorders: TSpTBXSkinOptionEntry; + FTextColor: TColor; + protected + procedure AssignTo(Dest: TPersistent); override; + public + constructor Create; virtual; + destructor Destroy; override; + function IsEmpty: Boolean; + procedure Reset; + procedure LoadFromIni(MemIni: TMemIniFile; Section, Ident: string); + procedure SaveToIni(MemIni: TMemIniFile; Section, Ident: string); + published + property Body: TSpTBXSkinOptionEntry read FBody write FBody; + property Borders: TSpTBXSkinOptionEntry read FBorders write FBorders; + property TextColor: TColor read FTextColor write FTextColor; + end; + + TSpTBXSkinOptions = class(TPersistent) + private + FColorBtnFace: TColor; + FFloatingWindowBorderSize: Integer; + FOptions: array [TSpTBXSkinComponentsType, TSpTBXSkinStatesType] of TSpTBXSkinOptionCategory; + FOfficeIcons: Boolean; + FOfficeMenuSeparator: Boolean; + FOfficeStatusBar: Boolean; + FSkinAuthor: string; + FSkinName: string; + function GetOfficeIcons: Boolean; + function GetOfficeMenuSeparator: Boolean; + function GetOfficePopup: Boolean; + function GetOfficeStatusBar: Boolean; + function GetFloatingWindowBorderSize: Integer; + procedure SetFloatingWindowBorderSize(const Value: Integer); + protected + procedure AssignTo(Dest: TPersistent); override; + procedure BroadcastChanges; + public + constructor Create; virtual; + destructor Destroy; override; + procedure CopyOptions(AComponent, ToComponent: TSpTBXSkinComponentsType); + procedure FillOptions; virtual; + function Options(Component: TSpTBXSkinComponentsType; State: TSpTBXSkinStatesType): TSpTBXSkinOptionCategory; overload; + function Options(Component: TSpTBXSkinComponentsType): TSpTBXSkinOptionCategory; overload; + procedure LoadFromFile(Filename: WideString); + procedure LoadFromStrings(L: TStrings); virtual; + procedure SaveToFile(Filename: WideString); + procedure SaveToStrings(L: TStrings); virtual; + procedure SaveToMemIni(MemIni: TMemIniFile); virtual; + procedure Reset(ForceResetSkinProperties: Boolean = False); + + // Metrics + procedure GetDropDownArrowSize(out DropDownArrowSize, DropDownArrowMargin, SplitBtnArrowSize: Integer); virtual; + procedure GetMenuItemMargins(ACanvas: TCanvas; ImgSize: Integer; out MarginsInfo: TSpTBXMenuItemMarginsInfo); virtual; + function GetState(Enabled, Pushed, HotTrack, Checked: Boolean): TSpTBXSkinStatesType; + function GetTextColor(Component: TSpTBXSkinComponentsType; State: TSpTBXSkinStatesType; SkinType: TSpTBXSkinType = sknSkin): TColor; virtual; + + // Skin Paint + procedure PaintBackground(ACanvas: TCanvas; ARect: TRect; Component: TSpTBXSkinComponentsType; State: TSpTBXSkinStatesType; Background, Borders: Boolean; Vertical: Boolean = False; ForceRectBorders: TAnchors = []); virtual; + + // Element Paint + procedure PaintMenuCheckMark(ACanvas: TCanvas; ARect: TRect; Checked, Grayed, MenuItemStyle: Boolean; State: TSpTBXSkinStatesType); virtual; + procedure PaintMenuRadioMark(ACanvas: TCanvas; ARect: TRect; Checked, MenuItemStyle: Boolean; State: TSpTBXSkinStatesType); virtual; + procedure PaintWindowFrame(ACanvas: TCanvas; ARect: TRect; IsActive, DrawBody: Boolean; BorderSize: Integer = 4); virtual; + + // Properties + property ColorBtnFace: TColor read FColorBtnFace write FColorBtnFace; + property FloatingWindowBorderSize: Integer read GetFloatingWindowBorderSize write SetFloatingWindowBorderSize; + property OfficeIcons: Boolean read GetOfficeIcons write FOfficeIcons; + property OfficeMenuSeparator: Boolean read GetOfficeMenuSeparator write FOfficeMenuSeparator; + property OfficePopup: Boolean read GetOfficePopup; + property OfficeStatusBar: Boolean read GetOfficeStatusBar write FOfficeStatusBar; + property SkinAuthor: string read FSkinAuthor write FSkinAuthor; + property SkinName: string read FSkinName write FSkinName; + end; + + TSpTBXSkinOptionsClass = class of TSpTBXSkinOptions; + + { TSpTBXSkinsList } + + TSpTBXSkinsListEntry = class + public + SkinClass: TSpTBXSkinOptionsClass; + SkinStrings: TStringList; + destructor Destroy; override; + end; + + TSpTBXSkinsList = class(TStringList) + private + function GetSkinOption(Index: Integer): TSpTBXSkinsListEntry; + public + procedure Delete(Index: Integer); override; + destructor Destroy; override; + function AddSkin(SkinName: string; SkinClass: TSpTBXSkinOptionsClass): Integer; overload; + function AddSkin(SkinOptions: TStrings): Integer; overload; + function AddSkinFromFile(Filename: WideString): Integer; + procedure AddSkinsFromFolder(Folder: WideString); + procedure GetSkinNames(SkinNames: TStrings); + property SkinOptions[Index: Integer]: TSpTBXSkinsListEntry read GetSkinOption; + end; + + { TSpTBXSkinManager } + + TSpTBXSkinManager = class + private + FCurrentSkin: TSpTBXSkinOptions; + FNotifies: TList; + FSkinsList: TSpTBXSkinsList; + FOnSkinChange: TNotifyEvent; + procedure Broadcast; + function GetCurrentSkinName: string; + public + constructor Create; virtual; + destructor Destroy; override; + + function GetSkinType: TSpTBXSkinType; + function IsDefaultSkin: Boolean; + function IsXPThemesEnabled: Boolean; + + procedure AddSkinNotification(AObject: TObject); + procedure RemoveSkinNotification(AObject: TObject); + procedure BroadcastSkinNotification; + + procedure LoadFromFile(Filename: WideString); + procedure SaveToFile(Filename: WideString); + + procedure SetToDefaultSkin; + procedure SetSkin(SkinName: string); + procedure ChangeControlSkinType(Control: TWinControl; SkinType: TSpTBXSkinType; Recursive: Boolean = True); + + property CurrentSkin: TSpTBXSkinOptions read FCurrentSkin; + property CurrentSkinName: string read GetCurrentSkinName; + property SkinsList: TSpTBXSkinsList read FSkinsList; + property OnSkinChange: TNotifyEvent read FOnSkinChange write FOnSkinChange; + end; + + { TSpTBXSkinSwitcher } + + TSpTBXSkinSwitcher = class(TComponent) + private + FOnSkinChange: TNotifyEvent; + function GetSkin: string; + procedure SetSkin(const Value: string); + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + property Skin: string read GetSkin write SetSkin; + property OnSkinChange: TNotifyEvent read FOnSkinChange write FOnSkinChange; + end; + + { TSpPrintWindow } + // Use SpPrintWindow instead of PaintTo as many controls will not render + // properly (no text on editors, no scrollbars, incorrect borders, etc) + // http://msdn2.microsoft.com/en-us/library/ms535695.aspx + TSpPrintWindow = function(Hnd: HWND; HdcBlt: HDC; nFlags: UINT): BOOL; stdcall; + +{ Themes } +function SkinManager: TSpTBXSkinManager; +function CurrentSkin: TSpTBXSkinOptions; +function SpTBXSkinType(T: TSpTBXSkinType): TSpTBXSkinType; +function SpGetLunaScheme: TSpTBXLunaScheme; +procedure SpDrawParentBackground(Control: TControl; DC: HDC; R: TRect); + +{ WideString helpers } +function SpCreateRotatedFont(DC: HDC; Orientation: Integer = 2700): HFONT; +function SpDrawRotatedText(const DC: HDC; AText: WideString; var ARect: TRect; const AFormat: Cardinal; RotationAngle: TSpTextRotationAngle = tra270): Integer; +function SpCalcXPText(ACanvas: TCanvas; ARect: TRect; Caption: WideString; CaptionAlignment: TAlignment; Flags: Cardinal; GlyphSize, RightGlyphSize: TSize; Layout: TSpGlyphLayout; PushedCaption: Boolean; out ACaptionRect, AGlyphRect, ARightGlyphRect: TRect; RotationAngle: TSpTextRotationAngle = tra0): Integer; +function SpDrawXPText(ACanvas: TCanvas; Caption: WideString; var ARect: TRect; Flags: Cardinal; CaptionGlow: TSpGlowDirection = gldNone; CaptionGlowColor: TColor = clYellow; RotationAngle: TSpTextRotationAngle = tra0): Integer; overload; +function SpDrawXPText(ACanvas: TCanvas; ARect: TRect; Caption: WideString; CaptionGlow: TSpGlowDirection; CaptionGlowColor: TColor; CaptionAlignment: TAlignment; Flags: Cardinal; GlyphSize: TSize; Layout: TSpGlyphLayout; PushedCaption: Boolean; out ACaptionRect, AGlyphRect: TRect; RotationAngle: TSpTextRotationAngle = tra0): Integer; overload; +function SpDrawXPText(ACanvas: TCanvas; ARect: TRect; Caption: WideString; CaptionGlow: TSpGlowDirection; CaptionGlowColor: TColor; CaptionAlignment: TAlignment; Flags: Cardinal; IL: TCustomImageList; ImageIndex: Integer; Layout: TSpGlyphLayout; Enabled, PushedCaption, DisabledIconCorrection: Boolean; out ACaptionRect, AGlyphRect: TRect; RotationAngle: TSpTextRotationAngle = tra0): Integer; overload; +function SpGetTextSize(DC: HDC; WS: WideString; NoPrefix: Boolean): TSize; +function SpGetControlTextHeight(AControl: TControl; AFont: TFont): Integer; +function SpGetControlTextSize(AControl: TControl; AFont: TFont; WS: WideString): TSize; +function SpSameText(W1, W2: WideString): Boolean; +function SpStripAccelChars(S: WideString): WideString; +function SpStripShortcut(S: WideString): WideString; +function SpStripTrailingPunctuation(S: WideString): WideString; +function SpRectToString(R: TRect): string; +function SpStringToRect(S: string; out R: TRect): Boolean; + +{ Color helpers } +function SpColorToHTML(const Color: TColor): string; +function SpColorToString(const Color: TColor; TextType: TSpTBXColorTextType = cttDefault): string; +function SpStringToColor(S: string; out Color: TColor): Boolean; +procedure SpGetRGB(Color: TColor; out R, G, B: Integer); +function SpRGBToColor(R, G, B: Integer): TColor; +function SpLighten(Color: TColor; Amount: Integer): TColor; +function SpBlendColors(TargetColor, BaseColor: TColor; Percent: Integer): TColor; +function SpMixColors(TargetColor, BaseColor: TColor; Amount: Byte): TColor; + +{ Painting helpers } +function SpCenterRect(Parent: TRect; ChildWidth, ChildHeight: Integer): TRect; overload; +function SpCenterRect(Parent, Child: TRect): TRect; overload; +function SpCenterRectHoriz(Parent: TRect; ChildWidth: Integer): TRect; +function SpCenterRectVert(Parent: TRect; ChildHeight: Integer): TRect; +procedure SpFillRect(ACanvas: TCanvas; const ARect: TRect; BrushColor: TColor; PenColor: TColor = clNone); +procedure SpDrawLine(ACanvas: TCanvas; X1, Y1, X2, Y2: Integer; Color: TColor); +procedure SpDrawRectangle(ACanvas: TCanvas; ARect: TRect; CornerSize: Integer; ColorTL, ColorBR: TColor; ColorTLInternal: TColor = clNone; ColorBRInternal: TColor = clNone; ForceRectBorders: TAnchors = []); overload; +procedure SpDrawRectangle(ACanvas: TCanvas; ARect: TRect; CornerSize: Integer; ColorL, ColorT, ColorR, ColorB, InternalColorL, InternalColorT, InternalColorR, InternalColorB: TColor; ForceRectBorders: TAnchors = []); overload; +procedure SpAlphaBlend(SrcDC, DstDC: HDC; SrcR, DstR: TRect; Alpha: Byte; SrcHasAlphaChannel: Boolean = False); +procedure SpPaintTo(WinControl: TWinControl; ACanvas: TCanvas; X, Y: Integer); + +{ ImageList painting } +procedure SpDrawIconShadow(ACanvas: TCanvas; const ARect: TRect; ImageList: TCustomImageList; ImageIndex: Integer); +procedure SpDrawImageList(ACanvas: TCanvas; const ARect: TRect; ImageList: TCustomImageList; ImageIndex: Integer; Enabled, DisabledIconCorrection: Boolean); + +{ Gradients } +procedure SpGradient(ACanvas: TCanvas; const ARect: TRect; StartPos, EndPos, ChunkSize: Integer; C1, C2: TColor; const Vertical: Boolean); +procedure SpGradientFill(ACanvas: TCanvas; const ARect: TRect; const C1, C2: TColor; const Vertical: Boolean); +procedure SpGradientFillMirror(ACanvas: TCanvas; const ARect: TRect; const C1, C2, C3, C4: TColor; const Vertical: Boolean); +procedure SpGradientFillMirrorTop(ACanvas: TCanvas; const ARect: TRect; const C1, C2, C3, C4: TColor; const Vertical: Boolean); +procedure SpGradientFillGlass(ACanvas: TCanvas; const ARect: TRect; const C1, C2, C3, C4: TColor; const Vertical: Boolean); + +{ Element painting } +procedure SpDrawArrow(ACanvas: TCanvas; X, Y: Integer; AColor: TColor; Vertical, Reverse: Boolean; Size: Integer); +procedure SpDrawDropMark(ACanvas: TCanvas; DropMark: TRect); +procedure SpDrawFocusRect(ACanvas: TCanvas; const ARect: TRect); +procedure SpDrawGlyphPattern(DC: HDC; const R: TRect; Width, Height: Integer; const PatternBits; PatternColor: TColor); overload; +procedure SpDrawGlyphPattern(ACanvas: TCanvas; ARect: TRect; PatternIndex: Integer; PatternColor: TColor); overload; +procedure SpDrawXPButton(ACanvas: TCanvas; ARect: TRect; Enabled, Pushed, HotTrack, Checked, Focused, Defaulted: Boolean; SkinType: TSpTBXSkinType); +procedure SpDrawXPCheckBoxGlyph(ACanvas: TCanvas; ARect: TRect; Enabled: Boolean; State: TCheckBoxState; HotTrack, Pushed: Boolean; SkinType: TSpTBXSkinType); +procedure SpDrawXPRadioButtonGlyph(ACanvas: TCanvas; ARect: TRect; Enabled, Checked, HotTrack, Pushed: Boolean; SkinType: TSpTBXSkinType); +procedure SpDrawXPEditFrame(ACanvas: TCanvas; ARect: TRect; Enabled, HotTrack: Boolean; SkinType: TSpTBXSkinType; ClipContent: Boolean = False; AutoAdjust: Boolean = False); overload; +procedure SpDrawXPEditFrame(AWinControl: TWinControl; HotTracking: Boolean; SkinType: TSpTBXSkinType; AutoAdjust: Boolean = False; HideFrame: Boolean = False); overload; +procedure SpDrawXPGrip(ACanvas: TCanvas; ARect: TRect; LoC, HiC: TColor); +procedure SpDrawXPHeader(ACanvas: TCanvas; ARect: TRect; HotTrack, Pushed: Boolean; SkinType: TSpTBXSkinType); +procedure SpDrawXPListItemBackground(ACanvas: TCanvas; ARect: TRect; HotTrack, Pushed, Focused: Boolean; SkinType: TSpTBXSkinType); + +{ Skins painting } +procedure SpPaintSkinBackground(ACanvas: TCanvas; ARect: TRect; SkinOption: TSpTBXSkinOptionCategory; Vertical: Boolean); +procedure SpPaintSkinBorders(ACanvas: TCanvas; ARect: TRect; SkinOption: TSpTBXSkinOptionCategory; ForceRectBorders: TAnchors = []); + +{ Misc } +function SpIsWinVistaOrUp: Boolean; +function SpGetDirectories(Path: WideString; L: TStringList): Boolean; + +{ Stock Objects } +var + StockBitmap: TBitmap; + SpPrintWindow: TSpPrintWindow = nil; + +implementation + +uses + UxTheme, Themes, Forms, Math, TypInfo, SpTBXDefaultSkins; + +var + FInternalSkinManager: TSpTBXSkinManager = nil; + +const + ROP_DSPDxax = $00E20746; + +type + TControlAccess = class(TControl); + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Skin Notification } + +function SkinManager: TSpTBXSkinManager; +begin + if not Assigned(FInternalSkinManager) then + FInternalSkinManager := TSpTBXSkinManager.Create; + Result := FInternalSkinManager; +end; + +function CurrentSkin: TSpTBXSkinOptions; +begin + Result := SkinManager.CurrentSkin; +end; + +function SpTBXSkinType(T: TSpTBXSkinType): TSpTBXSkinType; +begin + Result := T; + if (Result = sknSkin) and SkinManager.IsDefaultSkin then + Result := sknWindows; + if (Result = sknWindows) and not SkinManager.IsXPThemesEnabled then + Result := sknNone; +end; + +function SpGetLunaScheme: TSpTBXLunaScheme; +const + MaxChars = 1024; +var + pszThemeFileName, pszColorBuff, pszSizeBuf: PWideChar; + S: string; +begin + Result := lusUnknown; + + if SkinManager.IsXPThemesEnabled then begin + GetMem(pszThemeFileName, 2 * MaxChars); + GetMem(pszColorBuff, 2 * MaxChars); + GetMem(pszSizeBuf, 2 * MaxChars); + try + if not Failed(GetCurrentThemeName(pszThemeFileName, MaxChars, pszColorBuff, MaxChars, pszSizeBuf, MaxChars)) then + if UpperCase(ExtractFileName(pszThemeFileName)) = 'LUNA.MSSTYLES' then begin + S := UpperCase(pszColorBuff); + if S = 'NORMALCOLOR' then + Result := lusBlue + else if S = 'METALLIC' then + Result := lusMetallic + else if S = 'HOMESTEAD' then + Result := lusGreen; + end; + finally + FreeMem(pszSizeBuf); + FreeMem(pszColorBuff); + FreeMem(pszThemeFileName); + end; + end; +end; + +procedure SpDrawParentBackground(Control: TControl; DC: HDC; R: TRect); +// Delphi 2007 and Vista compatible +var + Parent: TWinControl; + P: TPoint; + Brush: HBRUSH; +begin + Parent := Control.Parent; + if Parent = nil then begin + Brush := CreateSolidBrush(ColorToRGB(clBtnFace)); + Windows.FillRect(DC, R, Brush); + end + else if Parent.HandleAllocated then begin + if not Parent.DoubleBuffered and (Control is TWinControl) and SkinManager.IsXPThemesEnabled then + UxTheme.DrawThemeParentBackground(TWinControl(Control).Handle, DC, @R) + else begin + // Same as Controls.PerformEraseBackground + GetWindowOrgEx(DC, P); + SetWindowOrgEx(DC, P.X + Control.Left, P.Y + Control.Top, nil); + Parent.Perform(WM_ERASEBKGND, Integer(DC), Integer(DC)); + SetWindowOrgEx(DC, P.X, P.Y, nil); + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ WideString helpers} + +function EnumFontsProc(const lplf: TLogFont; const lptm: TTextMetric; + dwType: DWORD; lpData: LPARAM): Integer; stdcall; +begin + Boolean(Pointer(lpData)^) := True; + Result := 0; +end; + +function SpCreateRotatedFont(DC: HDC; Orientation: Integer = 2700): HFONT; +var + LogFont: TLogFont; + TM: TTextMetric; + VerticalFontName: array[0..LF_FACESIZE-1] of Char; + VerticalFontExists: Boolean; +begin + if GetObject(GetCurrentObject(DC, OBJ_FONT), SizeOf(LogFont), + @LogFont) = 0 then begin + { just in case... } + Result := 0; + Exit; + end; + LogFont.lfEscapement := Orientation; + LogFont.lfOrientation := Orientation; + LogFont.lfOutPrecision := OUT_TT_ONLY_PRECIS; { needed for Win9x } + + { Don't let a random TrueType font be substituted when MS Sans Serif or + Microsoft Sans Serif are used. On Windows 2000 and later, hard-code Tahoma + because Arial can't display Japanese or Thai Unicode characters (on Windows + 2000 at least). On earlier versions, hard-code Arial since NT 4.0 doesn't + ship with Tahoma, and 9x doesn't do Unicode. } + if (StrIComp(LogFont.lfFaceName, 'MS Sans Serif') = 0) or + (StrIComp(LogFont.lfFaceName, 'Microsoft Sans Serif') = 0) then begin + if Win32MajorVersion >= 5 then + StrPCopy(LogFont.lfFaceName, 'Tahoma') + else + StrPCopy(LogFont.lfFaceName, 'Arial'); + { Set lfHeight to the actual height of the current font. This is needed + to work around a Windows 98 issue: on a clean install of the OS, + SPI_GETNONCLIENTMETRICS returns -5 for lfSmCaptionFont.lfHeight. This is + wrong; it should return -11 for an 8 pt font. With normal, unrotated text + this actually displays correctly, since MS Sans Serif doesn't support + sizes below 8 pt. However, when we change to a TrueType font like Arial, + this becomes a problem because it'll actually create a font that small. } + if GetTextMetrics(DC, TM) then begin + { If the original height was negative, keep it negative } + if LogFont.lfHeight <= 0 then + LogFont.lfHeight := -(TM.tmHeight - TM.tmInternalLeading) + else + LogFont.lfHeight := TM.tmHeight; + end; + end; + + { Use a vertical font if available so that Asian characters aren't drawn + sideways } + if StrLen(LogFont.lfFaceName) < SizeOf(VerticalFontName)-1 then begin + VerticalFontName[0] := '@'; + StrCopy(@VerticalFontName[1], LogFont.lfFaceName); + VerticalFontExists := False; + EnumFonts(DC, VerticalFontName, @EnumFontsProc, @VerticalFontExists); + if VerticalFontExists then + StrCopy(LogFont.lfFaceName, VerticalFontName); + end; + + Result := CreateFontIndirect(LogFont); +end; + +function SpDrawRotatedText(const DC: HDC; AText: WideString; var ARect: TRect; const AFormat: Cardinal; RotationAngle: TSpTextRotationAngle = tra270): Integer; +{ The format flag this function respects are + DT_CALCRECT, DT_NOPREFIX, DT_HIDEPREFIX, DT_CENTER, DT_END_ELLIPSIS, DT_NOCLIP } +var + RotatedFont, SaveFont: HFONT; + TextMetrics: TTextMetric; + X, Y, P, I, SU, FU, W: Integer; + SaveAlign: UINT; + Clip: Boolean; + Pen, SavePen: HPEN; + Sz: TSize; + Orientation: Integer; +begin + Result := 0; + if Length(AText) = 0 then Exit; + + Orientation := 0; + case RotationAngle of + tra90: Orientation := 900; // 90 degrees + tra270: Orientation := 2700; // 270 degrees + end; + RotatedFont := SpCreateRotatedFont(DC, Orientation); + SaveFont := SelectObject(DC, RotatedFont); + + GetTextMetrics(DC, TextMetrics); + X := ARect.Left + (ARect.Right - ARect.Left - TextMetrics.tmHeight) div 2; + + Clip := AFormat and DT_NOCLIP = 0; + + { Find the index of the character that should be underlined. Delete '&' + characters from the string. Like DrawText, only the last prefixed character + will be underlined. } + P := 0; + I := 1; + if AFormat and DT_NOPREFIX = 0 then + while I <= Length(AText) do + begin + if AText[I] = '&' then + begin + Delete(AText, I, 1); + if PWideChar(AText)[I - 1] <> '&' then P := I; + end; + Inc(I); + end; + + if AFormat and DT_END_ELLIPSIS <> 0 then + begin + if (Length(AText) > 1) and (SpGetTextSize(DC, AText, False).cx > ARect.Bottom - ARect.Top) then + begin + W := ARect.Bottom - ARect.Top; + if W > 2 then + begin + Delete(AText, Length(AText), 1); + while (Length(AText) > 1) and (SpGetTextSize(DC, AText + '...', False).cx > W) do + Delete(AText, Length(AText), 1); + end + else AText := AText[1]; + if P > Length(AText) then P := 0; + AText := AText + '...'; + end; + end; + + Sz := SpGetTextSize(DC, AText, False); + Result := Sz.cy; + + if AFormat and DT_CALCRECT <> 0 then begin + ARect.Right := ARect.Left + Sz.cy; + ARect.Bottom := ARect.Top + Sz.cx; + end + else begin + if AFormat and DT_CENTER <> 0 then + Y := ARect.Top + (ARect.Bottom - ARect.Top - Sz.cx) div 2 + else + Y := ARect.Top; + + if Clip then + begin + SaveDC(DC); + with ARect do IntersectClipRect(DC, Left, Top, Right, Bottom); + end; + + case RotationAngle of + tra90: SaveAlign := SetTextAlign(DC, TA_RIGHT); + tra270: SaveAlign := SetTextAlign(DC, TA_BOTTOM); + else + SaveAlign := SetTextAlign(DC, TA_LEFT); + end; + + if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then + Windows.TextOutA(DC, X, Y, PAnsiChar(AnsiString(AText)), Length(AnsiString(AText))) + else + Windows.TextOutW(DC, X, Y, PWideChar(AText), Length(AText)); + + SetTextAlign(DC, SaveAlign); + + { Underline } + if (P > 0) and (AFormat and DT_HIDEPREFIX = 0) then + begin + SU := SpGetTextSize(DC, Copy(AText, 1, P - 1), False).cx; + FU := SU + SpGetTextSize(DC, PWideChar(AText)[P - 1], False).cx; + Inc(X, TextMetrics.tmDescent - 2); + Pen := CreatePen(PS_SOLID, 1, GetTextColor(DC)); + SavePen := SelectObject(DC, Pen); + MoveToEx(DC, X, Y + SU, nil); + LineTo(DC, X, Y + FU); + SelectObject(DC, SavePen); + DeleteObject(Pen); + end; + + if Clip then RestoreDC(DC, -1); + end; + + SelectObject(DC, SaveFont); + DeleteObject(RotatedFont); +end; + +function SpCalcXPText(ACanvas: TCanvas; ARect: TRect; Caption: WideString; + CaptionAlignment: TAlignment; Flags: Cardinal; GlyphSize, RightGlyphSize: TSize; + Layout: TSpGlyphLayout; PushedCaption: Boolean; out ACaptionRect, AGlyphRect, ARightGlyphRect: TRect; + RotationAngle: TSpTextRotationAngle = tra0): Integer; +var + R: TRect; + TextOffset, Spacing, RightSpacing: TPoint; + CaptionSz: TSize; +begin + Result := 0; + ACaptionRect := Rect(0, 0, 0, 0); + AGlyphRect := Rect(0, 0, 0, 0); + ARightGlyphRect := Rect(0, 0, 0, 0); + TextOffset := Point(0, 0); + Spacing := Point(0, 0); + RightSpacing := Point(0, 0); + if (Caption <> '') and (GlyphSize.cx > 0) and (GlyphSize.cy > 0) then + Spacing := Point(4, 1); + if (Caption <> '') and (RightGlyphSize.cx > 0) and (RightGlyphSize.cy > 0) then + RightSpacing := Point(4, 1); + + Flags := Flags and not DT_CENTER; + Flags := Flags and not DT_VCENTER; + if CaptionAlignment = taRightJustify then + Flags := Flags or DT_RIGHT; + + // DT_END_ELLIPSIS and DT_PATH_ELLIPSIS doesn't work with rotated text + // http://support.microsoft.com/kb/249678 + // Revert the ARect if the text is rotated, from now on work on horizontal text !!! + if RotationAngle <> tra0 then + ARect := Rect(ARect.Top, ARect.Left, ARect.Bottom, ARect.Right); + + // Get the caption size + if ((Flags and DT_WORDBREAK) <> 0) or ((Flags and DT_END_ELLIPSIS) <> 0) or ((Flags and DT_PATH_ELLIPSIS) <> 0) then begin + if Layout = ghlGlyphLeft then // Glyph on left or right side + R := Rect(0, 0, ARect.Right - ARect.Left - GlyphSize.cx - Spacing.X - RightGlyphSize.cx - RightSpacing.X + 2, 1) + else // Glyph on top + R := Rect(0, 0, ARect.Right - ARect.Left + 2, 1); + end + else + R := Rect(0, 0, 1, 1); + + if (fsBold in ACanvas.Font.Style) and (RotationAngle = tra0) and (((Flags and DT_END_ELLIPSIS) <> 0) or ((Flags and DT_PATH_ELLIPSIS) <> 0)) then begin + // [Bugfix] Windows bug: + // When the Font is Bold and DT_END_ELLIPSIS or DT_PATH_ELLIPSIS is used + // DrawTextW returns an incorrect size if the string is unicode. + // The R.Right is reduced by 3 which cuts down the string and + // adds the ellipsis. + // We have to obtain the real size and check if it fits in the Rect. + CaptionSz := SpGetTextSize(ACanvas.Handle, Caption, True); + if CaptionSz.cx <= R.Right then begin + R := Rect(0, 0, CaptionSz.cx, CaptionSz.cy); + Result := CaptionSz.cy; + end; + end; + + if Result <= 0 then begin + Result := SpDrawXPText(ACanvas, Caption, R, Flags or DT_CALCRECT, gldNone, clYellow); + CaptionSz.cx := R.Right; + CaptionSz.cy := R.Bottom; + end; + + // ACaptionRect + if Result > 0 then begin + R.Top := ARect.Top + (ARect.Bottom - ARect.Top - CaptionSz.cy) div 2; // Vertically centered + R.Bottom := R.Top + CaptionSz.cy; + case CaptionAlignment of + taCenter: + R.Left := ARect.Left + (ARect.Right - ARect.Left - CaptionSz.cx) div 2; // Horizontally centered + taLeftJustify: + R.Left := ARect.Left; + taRightJustify: + R.Left := ARect.Right - CaptionSz.cx; + end; + R.Right := R.Left + CaptionSz.cx; + + // Since DT_END_ELLIPSIS and DT_PATH_ELLIPSIS doesn't work with rotated text + // try to fix it by padding the text 8 pixels to the right + if (RotationAngle <> tra0) and (R.Right + 8 < ARect.Right) then + if ((Flags and DT_END_ELLIPSIS) <> 0) or ((Flags and DT_PATH_ELLIPSIS) <> 0) then + R.Right := R.Right + 8; + + if PushedCaption then + OffsetRect(R, 1, 1); + + ACaptionRect := R; + end; + + // AGlyphRect + if (GlyphSize.cx > 0) and (GlyphSize.cy > 0) then begin + R := ARect; + + // If ghlGlyphTop is used the glyph should be centered + if Layout = ghlGlyphTop then + CaptionAlignment := taCenter; + + case CaptionAlignment of + taCenter: + begin + // Total width = Icon + Space + Text + if Layout = ghlGlyphLeft then begin + AGlyphRect.Left := R.Left + (R.Right - R.Left - (GlyphSize.cx + Spacing.X + CaptionSz.cx)) div 2; + TextOffset.X := (GlyphSize.cx + Spacing.X) div 2; + end + else + AGlyphRect.Left := R.Left + (R.Right - R.Left - GlyphSize.cx) div 2; + end; + taLeftJustify: + begin + AGlyphRect.Left := R.Left; + TextOffset.X := GlyphSize.cx + Spacing.X; + end; + taRightJustify: + begin + AGlyphRect.Left := R.Right - GlyphSize.cx; + TextOffset.X := - Spacing.X - GlyphSize.cx; + end; + end; + + if Layout = ghlGlyphLeft then + AGlyphRect.Top := R.Top + (R.Bottom - R.Top - GlyphSize.cy) div 2 + else begin + AGlyphRect.Top := R.Top + (R.Bottom - R.Top - (GlyphSize.cy + Spacing.Y + CaptionSz.cy)) div 2; + Inc(TextOffset.Y, (GlyphSize.cy + Spacing.Y) div 2); + end; + + AGlyphRect.Right := AGlyphRect.Left + GlyphSize.cx; + AGlyphRect.Bottom := AGlyphRect.Top + GlyphSize.cy; + + if PushedCaption then + OffsetRect(AGlyphRect, 1, 1); + end; + + // Move the text according to the icon position + if Result > 0 then + OffsetRect(ACaptionRect, TextOffset.X, TextOffset.Y); + + // ARightGlyphRect, it's valid only when using taLeftJustify + if (RightGlyphSize.cx > 0) and (RightGlyphSize.cy > 0) then + if CaptionAlignment = taLeftJustify then begin + R := ARect; + ARightGlyphRect.Left := R.Right - RightGlyphSize.cx; + ARightGlyphRect.Right := ARightGlyphRect.Left + RightGlyphSize.cx; + ARightGlyphRect.Top := R.Top + (R.Bottom - R.Top - RightGlyphSize.cy) div 2; + ARightGlyphRect.Bottom := ARightGlyphRect.Top + RightGlyphSize.cy; + if (Result > 0) and (ACaptionRect.Right > ARightGlyphRect.Left - RightSpacing.X) then + ACaptionRect.Right := ARightGlyphRect.Left - RightSpacing.X; + end; + + // Revert back, normalize when the text is rotated + if RotationAngle <> tra0 then begin + ACaptionRect := Rect(ACaptionRect.Top, ACaptionRect.Left, ACaptionRect.Bottom, ACaptionRect.Right); + AGlyphRect := Rect(AGlyphRect.Top, AGlyphRect.Left, AGlyphRect.Bottom, AGlyphRect.Right); + ARightGlyphRect := Rect(ARightGlyphRect.Top, ARightGlyphRect.Left, ARightGlyphRect.Bottom, ARightGlyphRect.Right); + end; +end; + +function SpDrawXPText(ACanvas: TCanvas; Caption: WideString; var ARect: TRect; + Flags: Cardinal; CaptionGlow: TSpGlowDirection = gldNone; + CaptionGlowColor: TColor = clYellow; RotationAngle: TSpTextRotationAngle = tra0): Integer; overload; + + function InternalDraw(var R: TRect): Integer; + begin + Result := 0; + case RotationAngle of + tra0: + if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then + Result := Windows.DrawTextA(ACanvas.Handle, PAnsiChar(AnsiString(Caption)), -1, R, Flags) + else + Result := Windows.DrawTextW(ACanvas.Handle, PWideChar(Caption), -1, R, Flags); + tra90, tra270: + Result := SpDrawRotatedText(ACanvas.Handle, Caption, R, Flags, RotationAngle); + end; + end; + +var + BS: TBrushStyle; + GlowR: TRect; + C, FC: TColor; +begin + BS := ACanvas.Brush.Style; + C := ACanvas.Brush.Color; + try + ACanvas.Brush.Style := bsClear; + + if (Flags and DT_CALCRECT = 0) and (CaptionGlow <> gldNone) then begin + FC := ACanvas.Font.Color; + ACanvas.Font.Color := CaptionGlowColor; + case CaptionGlow of + gldAll: + begin + GlowR := ARect; OffsetRect(GlowR, 0, -1); + InternalDraw(GlowR); + GlowR := ARect; OffsetRect(GlowR, 0, 1); + InternalDraw(GlowR); + GlowR := ARect; OffsetRect(GlowR, -1, 0); + InternalDraw(GlowR); + GlowR := ARect; OffsetRect(GlowR, 1, 0); + end; + gldTopLeft: + begin + GlowR := ARect; OffsetRect(GlowR, -1, -1); + InternalDraw(GlowR); + end; + gldBottomRight: + begin + GlowR := ARect; OffsetRect(GlowR, 1, 1); + InternalDraw(GlowR); + end; + end; + ACanvas.Font.Color := FC; + end; + + Result := InternalDraw(ARect); + + if IsRectEmpty(ARect) then + Result := 0 + else + if Flags and DT_CALCRECT <> 0 then begin + // [Bugfix] Windows bug: + // When DT_CALCRECT is used and the font is italic the + // resulting rect is incorrect + if fsItalic in ACanvas.Font.Style then + ARect.Right := ARect.Right + 1 + (ACanvas.Font.Size div 8) * 2; + end; + + finally + ACanvas.Brush.Style := BS; + ACanvas.Brush.Color := C; + end; +end; + +function SpDrawXPText(ACanvas: TCanvas; ARect: TRect; Caption: WideString; + CaptionGlow: TSpGlowDirection; CaptionGlowColor: TColor; CaptionAlignment: TAlignment; + Flags: Cardinal; GlyphSize: TSize; Layout: TSpGlyphLayout; PushedCaption: Boolean; + out ACaptionRect, AGlyphRect: TRect; + RotationAngle: TSpTextRotationAngle = tra0): Integer; overload; +var + DummyRightGlyphSize: TSize; + DummyRightGlyphRect: TRect; +begin + DummyRightGlyphSize.cx := 0; + DummyRightGlyphSize.cy := 0; + DummyRightGlyphRect := Rect(0, 0, 0, 0); + Result := SpCalcXPText(ACanvas, ARect, Caption, CaptionAlignment, Flags, GlyphSize, DummyRightGlyphSize, + Layout, PushedCaption, ACaptionRect, AGlyphRect, DummyRightGlyphRect, RotationAngle); + SpDrawXPText(ACanvas, Caption, ACaptionRect, Flags and not DT_CALCRECT, CaptionGlow, CaptionGlowColor, RotationAngle); +end; + +function SpDrawXPText(ACanvas: TCanvas; ARect: TRect; Caption: WideString; + CaptionGlow: TSpGlowDirection; CaptionGlowColor: TColor; CaptionAlignment: TAlignment; + Flags: Cardinal; IL: TCustomImageList; ImageIndex: Integer; Layout: TSpGlyphLayout; + Enabled, PushedCaption, DisabledIconCorrection: Boolean; out ACaptionRect, AGlyphRect: TRect; + RotationAngle: TSpTextRotationAngle = tra0): Integer; overload; +var + GlyphSize, DummyRightGlyphSize: TSize; + DummyRightGlyphRect: TRect; +begin + GlyphSize.cx := 0; + GlyphSize.cy := 0; + DummyRightGlyphSize.cx := 0; + DummyRightGlyphSize.cy := 0; + DummyRightGlyphRect := Rect(0, 0, 0, 0); + + if Assigned(IL) and (ImageIndex > -1) and (ImageIndex < IL.Count) then begin + GlyphSize.cx := IL.Width; + GlyphSize.cy := IL.Height; + end; + + Result := SpCalcXPText(ACanvas, ARect, Caption, CaptionAlignment, Flags, GlyphSize, DummyRightGlyphSize, + Layout, PushedCaption, ACaptionRect, AGlyphRect, DummyRightGlyphRect, RotationAngle); + + SpDrawXPText(ACanvas, Caption, ACaptionRect, Flags and not DT_CALCRECT, CaptionGlow, CaptionGlowColor, RotationAngle); + + if Assigned(IL) and (ImageIndex > -1) and (ImageIndex < IL.Count) then + SpDrawImageList(ACanvas, AGlyphRect, IL, ImageIndex, Enabled, DisabledIconCorrection); +end; + +function SpGetTextSize(DC: HDC; WS: WideString; NoPrefix: Boolean): TSize; +// Returns the size of the string, if NoPrefix is True, it first removes "&" +// characters as necessary. +// This procedure is 10x faster than using DrawText with the DT_CALCRECT flag +begin + Result.cx := 0; + Result.cy := 0; + if NoPrefix then + WS := SpStripAccelChars(WS); + if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then + Windows.GetTextExtentPoint32A(DC, PAnsiChar(AnsiString(WS)), Length(AnsiString(WS)), Result) + else + Windows.GetTextExtentPoint32W(DC, PWideChar(WS), Length(WS), Result); +end; + +function SpGetControlTextHeight(AControl: TControl; AFont: TFont): Integer; +// Returns the control text height based on the font +var + Sz: TSize; +begin + Sz := SpGetControlTextSize(AControl, AFont, 'WQqJ'); + Result := Sz.cy; +end; + +function SpGetControlTextSize(AControl: TControl; AFont: TFont; WS: WideString): TSize; +// Returns the control text size based on the font +var + ACanvas: TControlCanvas; +begin + ACanvas := TControlCanvas.Create; + try + ACanvas.Control := AControl; + ACanvas.Font.Assign(AFont); + Result := SpGetTextSize(ACanvas.Handle, WS, False); + finally + ACanvas.Free; + end; +end; + +function SpSameText(W1, W2: WideString): Boolean; +begin + {$IFNDEF UNICODE} + if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then + Result := AnsiSameText(AnsiString(W1), AnsiString(W2)) + else + Result := WideSameText(W1, W2); + {$ELSE} + Result := WideSameText(W1, W2); + {$ENDIF} +end; + +function SpStripAccelChars(S: WideString): WideString; +var + I: Integer; +begin + Result := S; + I := 1; + while I <= Length(Result) do begin + if Result[I] = '&' then + System.Delete(Result, I, 1); + Inc(I); + end; +end; + +function SpStripShortcut(S: WideString): WideString; +var + P: Integer; +begin + Result := S; + P := Pos(#9, Result); + if P <> 0 then + SetLength(Result, P - 1); +end; + +function SpStripTrailingPunctuation(S: WideString): WideString; +// Removes any colon (':') or ellipsis ('...') from the end of S and returns +// the resulting string +var + L: Integer; +begin + Result := S; + L := Length(Result); + if (L > 1) and (Result[L] = ':') then + SetLength(Result, L-1) + else if (L > 3) and (Result[L-2] = '.') and (Result[L-1] = '.') and + (Result[L] = '.') then + SetLength(Result, L-3); +end; + +function SpRectToString(R: TRect): string; +begin + Result := Format('%d, %d, %d, %d', [R.Left, R.Top, R.Right, R.Bottom]); +end; + +function SpStringToRect(S: string; out R: TRect): Boolean; +var + L: TStringList; +begin + Result := False; + R := Rect(0, 0, 0, 0); + L := TStringList.Create; + try + L.CommaText := S; + if L.Count = 4 then begin + R.Left := StrToIntDef(L[0], 0); + R.Top := StrToIntDef(L[1], 0); + R.Right := StrToIntDef(L[2], 0); + R.Bottom := StrToIntDef(L[3], 0); + Result := True; + end; + finally + L.Free; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Color Helpers } + +function SpColorToHTML(const Color: TColor): string; +var + R: TColorRef; +begin + R := ColorToRGB(Color); + Result := Format('#%.2x%.2x%.2x', [GetRValue(R), GetGValue(R), GetBValue(R)]); +end; + +function SpColorToString(const Color: TColor; TextType: TSpTBXColorTextType = cttDefault): string; +begin + case TextType of + cttDefault: + Result := ColorToString(Color); + cttHTML: + Result := SpColorToHTML(Color); + cttIdentAndHTML: + begin + Result := ColorToString(Color); + if (Length(Result) > 0) and (Result[1] = '$') then + Result := SpColorToHTML(Color); + end; + end; +end; + +function SpStringToColor(S: string; out Color: TColor): Boolean; +var + E, L: Integer; +begin + Result := False; + Color := clDefault; + L := Length(S); + if L < 2 then Exit; + + if (S[1] = '#') and (L = 7) then begin + Delete(S, 1, 1); // strip the # char + S := Format('$00%s%s%s', [Copy(S, 5, 2), Copy(S, 3, 2), Copy(S, 1, 2)]); + Color := StringToColor(S); + Result := True; + end + else begin + Result := IdentToColor(S, Longint(Color)); + if not Result and (L > 6) and (L < 10) and (S[1] = '$') then begin + Val(S, Color, E); + Result := E = 0; + end; + end; +end; + +procedure SpGetRGB(Color: TColor; out R, G, B: Integer); +begin + Color := ColorToRGB(Color); + R := GetRValue(Color); + G := GetGValue(Color); + B := GetBValue(Color); +end; + +function SpRGBToColor(R, G, B: Integer): TColor; +begin + if R < 0 then R := 0 else if R > 255 then R := 255; + if G < 0 then G := 0 else if G > 255 then G := 255; + if B < 0 then B := 0 else if B > 255 then B := 255; + Result := TColor(RGB(R, G, B)); +end; + +function SpLighten(Color: TColor; Amount: Integer): TColor; +var + R, G, B: Integer; +begin + Color := ColorToRGB(Color); + R := GetRValue(Color) + Amount; + G := GetGValue(Color) + Amount; + B := GetBValue(Color) + Amount; + Result := SpRGBToColor(R, G, B); +end; + +function SpBlendColors(TargetColor, BaseColor: TColor; Percent: Integer): TColor; +// Blend 2 colors with a predefined percent (0..100 or 0..1000) +// If Percent is 0 the result will be BaseColor, +// If Percent is 100 the result will be TargetColor. +// Any other value will return a color between base and target. +// For example if you want to add 70% of yellow ($0000FFFF) to a color: +// NewColor := SpBlendColor($0000FFFF, BaseColor, 70); +// The result will have 70% of yellow and 30% of BaseColor +var + Percent2, D, F: Integer; + R, G, B, R2, G2, B2: Integer; +begin + SpGetRGB(TargetColor, R, G, B); + SpGetRGB(BaseColor, R2, G2, B2); + + if Percent >= 100 then D := 1000 + else D := 100; + Percent2 := D - Percent; + F := D div 2; + + R := (R * Percent + R2 * Percent2 + F) div D; + G := (G * Percent + G2 * Percent2 + F) div D; + B := (B * Percent + B2 * Percent2 + F) div D; + + Result := SpRGBToColor(R, G, B); +end; + +function SpMixColors(TargetColor, BaseColor: TColor; Amount: Byte): TColor; +// Mix 2 colors with a predefined amount (0..255). +// If Amount is 0 the result will be BaseColor, +// If Amount is 255 the result will be TargetColor. +// Any other value will return a color between base and target. +// For example if you want to add 50% of yellow ($0000FFFF) to a color: +// NewColor := SpMixColors($0000FFFF, BaseColor, 128); +// The result will be BaseColor + 50% of yellow +var + R1, G1, B1: Integer; + R2, G2, B2: Integer; +begin + SpGetRGB(BaseColor, R1, G1, B1); + SpGetRGB(TargetColor, R2, G2, B2); + + R1 := (R2 - R1) * Amount div 255 + R1; + G1 := (G2 - G1) * Amount div 255 + G1; + B1 := (B2 - B1) * Amount div 255 + B1; + + Result := SpRGBToColor(R1, G1, B1); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Painting Helpers } + +function SpCenterRect(Parent: TRect; ChildWidth, ChildHeight: Integer): TRect; +begin + Result.Left := Parent.Left + (Parent.Right - Parent.Left - ChildWidth) div 2; + Result.Top := Parent.Top + (Parent.Bottom - Parent.Top - ChildHeight) div 2; + Result.Right := Result.Left + ChildWidth; + Result.Bottom := Result.Top + ChildHeight; +end; + +function SpCenterRect(Parent, Child: TRect): TRect; +begin + Result := SpCenterRect(Parent, Child.Right - Child.Left, Child.Bottom - Child.Top); +end; + +function SpCenterRectHoriz(Parent: TRect; ChildWidth: Integer): TRect; +begin + Result.Left := Parent.Left + (Parent.Right - Parent.Left - ChildWidth) div 2; + Result.Right := Result.Left + ChildWidth; + Result.Top := Parent.Top; + Result.Bottom := Parent.Bottom; +end; + +function SpCenterRectVert(Parent: TRect; ChildHeight: Integer): TRect; +begin + Result.Left := Parent.Left; + Result.Right := Parent.Right; + Result.Top := Parent.Top + (Parent.Bottom - Parent.Top - ChildHeight) div 2; + Result.Bottom := Result.Top + ChildHeight; +end; + +procedure SpFillRect(ACanvas: TCanvas; const ARect: TRect; BrushColor: TColor; PenColor: TColor = clNone); +var + C, C2: TColor; +begin + if BrushColor <> clNone then begin + C := ACanvas.Brush.Color; + C2 := ACanvas.Pen.Color; + ACanvas.Brush.Color := BrushColor; + ACanvas.Pen.Color := PenColor; + if PenColor = clNone then + ACanvas.FillRect(ARect) + else + ACanvas.Rectangle(ARect); + ACanvas.Brush.Color := C; + ACanvas.Pen.Color := C2; + end; +end; + +procedure SpDrawLine(ACanvas: TCanvas; X1, Y1, X2, Y2: Integer; Color: TColor); +var + C: TColor; +begin + if Color <> clNone then begin + C := ACanvas.Pen.Color; + ACanvas.Pen.Color := Color; + ACanvas.MoveTo(X1, Y1); + ACanvas.LineTo(X2, Y2); + ACanvas.Pen.Color := C; + end; +end; + +procedure SpDrawRectangle(ACanvas: TCanvas; ARect: TRect; CornerSize: Integer; + ColorL, ColorT, ColorR, ColorB, + InternalColorL, InternalColorT, InternalColorR, InternalColorB: TColor; + ForceRectBorders: TAnchors = []); +// Draws 2 beveled borders. +// CornerSize can be 0, 1 or 2. +// Color: left, top, right, bottom external border color +// InternalColor: left, top, right, bottom internal border color +// ForceRectBorders: forces the borders to be rect +var + Color: TColor; + CornerSizeTL, CornerSizeTR, CornerSizeBL, CornerSizeBR: Integer; +begin + Color := ACanvas.Pen.Color; + + if CornerSize < 0 then CornerSize := 0; + if CornerSize > 2 then CornerSize := 2; + CornerSizeTL := CornerSize; + CornerSizeTR := CornerSize; + CornerSizeBL := CornerSize; + CornerSizeBR := CornerSize; + if akLeft in ForceRectBorders then begin + CornerSizeTL := 0; + CornerSizeBL := 0; + end; + if akRight in ForceRectBorders then begin + CornerSizeTR := 0; + CornerSizeBR := 0; + end; + if akTop in ForceRectBorders then begin + CornerSizeTL := 0; + CornerSizeTR := 0; + end; + if akBottom in ForceRectBorders then begin + CornerSizeBL := 0; + CornerSizeBR := 0; + end; + + with ARect do begin + Dec(Right); + Dec(Bottom); + + // Internal borders + InflateRect(ARect, -1, -1); + if InternalColorL <> clNone then begin + ACanvas.Pen.Color := InternalColorL; + ACanvas.PolyLine([Point(Left, Bottom), Point(Left, Top)]); + end; + if InternalColorT <> clNone then begin + ACanvas.Pen.Color := InternalColorT; + ACanvas.PolyLine([Point(Left, Top), Point(Right, Top)]); + end; + if InternalColorR <> clNone then begin + ACanvas.Pen.Color := InternalColorR; + ACanvas.PolyLine([Point(Right, Bottom), Point(Right, Top - 1)]); + end; + if InternalColorB <> clNone then begin + ACanvas.Pen.Color := InternalColorB; + ACanvas.PolyLine([Point(Left, Bottom), Point(Right, Bottom)]); + end; + + // External borders + InflateRect(ARect, 1, 1); + if ColorL <> clNone then begin + ACanvas.Pen.Color := ColorL; + ACanvas.PolyLine([ + Point(Left, Bottom - CornerSizeBL), + Point(Left, Top + CornerSizeTL) + ]); + end; + if ColorT <> clNone then begin + ACanvas.Pen.Color := ColorT; + ACanvas.PolyLine([ + Point(Left, Top + CornerSizeTL), + Point(Left + CornerSizeTL, Top), + Point(Right - CornerSizeTR + 1, Top), + Point(Right, Top + CornerSizeTR) + ]); + end; + if ColorR <> clNone then begin + ACanvas.Pen.Color := ColorR; + ACanvas.PolyLine([ + Point(Right, Top + CornerSizeTR), + Point(Right , Bottom - CornerSizeBR) + ]); + end; + if ColorB <> clNone then begin + ACanvas.Pen.Color := ColorB; + ACanvas.PolyLine([ + Point(Right, Bottom - CornerSizeBR), + Point(Right - CornerSizeBR, Bottom), + Point(Left + CornerSizeBL, Bottom), + Point(Left, Bottom - CornerSizeBL) + ]); + end; + end; + + ACanvas.Pen.Color := Color; +end; + + +procedure SpDrawRectangle(ACanvas: TCanvas; ARect: TRect; + CornerSize: Integer; ColorTL, ColorBR, ColorTLInternal, ColorBRInternal: TColor; + ForceRectBorders: TAnchors); +// Draws 2 beveled borders. +// CornerSize can be 0, 1 or 2. +// TLColor, ColorBR: external border color +// InternalTL, ColorBRInternal: internal border color +// ForceRectBorders: forces the borders to be rect +var + Color: TColor; + CornerSizeTL, CornerSizeTR, CornerSizeBL, CornerSizeBR: Integer; +begin + Color := ACanvas.Pen.Color; + + if CornerSize < 0 then CornerSize := 0; + if CornerSize > 2 then CornerSize := 2; + CornerSizeTL := CornerSize; + CornerSizeTR := CornerSize; + CornerSizeBL := CornerSize; + CornerSizeBR := CornerSize; + if akLeft in ForceRectBorders then begin + CornerSizeTL := 0; + CornerSizeBL := 0; + end; + if akRight in ForceRectBorders then begin + CornerSizeTR := 0; + CornerSizeBR := 0; + end; + if akTop in ForceRectBorders then begin + CornerSizeTL := 0; + CornerSizeTR := 0; + end; + if akBottom in ForceRectBorders then begin + CornerSizeBL := 0; + CornerSizeBR := 0; + end; + + with ARect do begin + Dec(Right); + Dec(Bottom); + + // Internal borders + InflateRect(ARect, -1, -1); + if ColorTLInternal <> clNone then begin + ACanvas.Pen.Color := ColorTLInternal; + ACanvas.PolyLine([ + Point(Left, Bottom), + Point(Left, Top), + Point(Right, Top) + ]); + end; + if ColorBRInternal <> clNone then begin + ACanvas.Pen.Color := ColorBRInternal; + ACanvas.PolyLine([ + Point(Left, Bottom), + Point(Right, Bottom), + Point(Right, Top - 1) + ]); + end; + + // External borders + InflateRect(ARect, 1, 1); + if ColorTL <> clNone then begin + ACanvas.Pen.Color := ColorTL; + ACanvas.PolyLine([ + Point(Left + CornerSizeBL, Bottom), + Point(Left, Bottom - CornerSizeBL), + Point(Left, Top + CornerSizeTL), + Point(Left + CornerSizeTL, Top), + Point(Right - CornerSizeTR, Top), + Point(Right, Top + CornerSizeTR) + ]); + end; + if ColorBR <> clNone then begin + ACanvas.Pen.Color := ColorBR; + ACanvas.PolyLine([ + Point(Right, Top + CornerSizeTR), + Point(Right , Bottom - CornerSizeBR), + Point(Right - CornerSizeBR, Bottom), + Point(Left + CornerSizeBL - 1, Bottom) + ]); + end; + end; + + ACanvas.Pen.Color := Color; +end; + +procedure SpAlphaBlend(SrcDC, DstDC: HDC; SrcR, DstR: TRect; Alpha: Byte; + SrcHasAlphaChannel: Boolean = False); +// NOTE: AlphaBlend does not work on Windows 95 and Windows NT +var + BF: TBlendFunction; +begin + BF.BlendOp := AC_SRC_OVER; + BF.BlendFlags := 0; + BF.SourceConstantAlpha := Alpha; + if SrcHasAlphaChannel then + BF.AlphaFormat := AC_SRC_ALPHA + else + BF.AlphaFormat := 0; + Windows.AlphaBlend(DstDC, DstR.Left, DstR.Top, DstR.Right - DstR.Left, DstR.Bottom - DstR.Top, + SrcDC, SrcR.Left, SrcR.Top, SrcR.Right - SrcR.Left, SrcR.Bottom - SrcR.Top, BF); +end; + +procedure SpPaintTo(WinControl: TWinControl; ACanvas: TCanvas; X, Y: Integer); +// NOTE: PrintWindow does not work if the control is not visible +var + B: TBitmap; + PrevTop: Integer; +begin + // Use SpPrintWindow instead of PaintTo as many controls will not render + // properly (no text on editors, no scrollbars, incorrect borders, etc) + // http://msdn2.microsoft.com/en-us/library/ms535695.aspx + if Assigned(SpPrintWindow) then begin + ACanvas.Lock; + try + // It doesn't work if the control is not visible !!! + // Show it and move it offscreen + if not WinControl.Visible then begin + PrevTop := WinControl.Top; + WinControl.Top := 10000; // Move it offscreen + WinControl.Visible := True; + SpPrintWindow(WinControl.Handle, ACanvas.Handle, 0); + WinControl.Visible := False; + WinControl.Top := PrevTop; + end + else + SpPrintWindow(WinControl.Handle, ACanvas.Handle, 0); + finally + ACanvas.UnLock; + end; + end + else begin + // If SpPrintWindow is not available use PaintTo + // If the Control is a Form use GetFormImage instead + if WinControl is TCustomForm then begin + B := TCustomForm(WinControl).GetFormImage; + try + ACanvas.Draw(X, Y, B); + finally + B.Free; + end; + end + else + WinControl.PaintTo(ACanvas, X, Y); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ ImageList painting } + +procedure SpDrawIconShadow(ACanvas: TCanvas; const ARect: TRect; + ImageList: TCustomImageList; ImageIndex: Integer); +var + ImageWidth, ImageHeight: Integer; + I, J: Integer; + Src, Dst: ^Cardinal; + S, C, CBRB, CBG: Cardinal; + B1, B2: TBitmap; +begin + ImageWidth := ARect.Right - ARect.Left; + ImageHeight := ARect.Bottom - ARect.Top; + with ImageList do + begin + if Width < ImageWidth then ImageWidth := Width; + if Height < ImageHeight then ImageHeight := Height; + end; + + B1 := TBitmap.Create; + B2 := TBitmap.Create; + try + B1.PixelFormat := pf32bit; + B2.PixelFormat := pf32bit; + B1.Width := ImageWidth; + B1.Height := ImageHeight; + B2.Width := ImageWidth; + B2.Height := ImageHeight; + + BitBlt(B1.Canvas.Handle, 0, 0, ImageWidth, ImageHeight, ACanvas.Handle, ARect.Left, ARect.Top, SRCCOPY); + BitBlt(B2.Canvas.Handle, 0, 0, ImageWidth, ImageHeight, ACanvas.Handle, ARect.Left, ARect.Top, SRCCOPY); + ImageList.Draw(B2.Canvas, 0, 0, ImageIndex, True); + + for J := 0 to ImageHeight - 1 do + begin + Src := B2.ScanLine[J]; + Dst := B1.ScanLine[J]; + for I := 0 to ImageWidth - 1 do + begin + S := Src^; + if S <> Dst^ then + begin + CBRB := Dst^ and $00FF00FF; + CBG := Dst^ and $0000FF00; + C := ((S and $00FF0000) shr 16 * 29 + (S and $0000FF00) shr 8 * 150 + + (S and $000000FF) * 76) shr 8; + C := (C div 3) + (255 - 255 div 3); + Dst^ := ((CBRB * C and $FF00FF00) or (CBG * C and $00FF0000)) shr 8; + end; + Inc(Src); + Inc(Dst); + end; + end; + BitBlt(ACanvas.Handle, ARect.Left, ARect.Top, ImageWidth, ImageHeight, B1.Canvas.Handle, 0, 0, SRCCOPY); + finally + B1.Free; + B2.Free; + end; +end; + +procedure SpDrawImageList(ACanvas: TCanvas; const ARect: TRect; ImageList: TCustomImageList; + ImageIndex: Integer; Enabled, DisabledIconCorrection: Boolean); +begin + if Assigned(ImageList) and (ImageIndex > -1) and (ImageIndex < ImageList.Count) then + if Enabled then + ImageList.Draw(ACanvas, ARect.Left, ARect.Top, ImageIndex) + else + if DisabledIconCorrection then + SpDrawIconShadow(ACanvas, ARect, ImageList, ImageIndex) + else + ImageList.Draw(ACanvas, ARect.Left, ARect.Top, ImageIndex, False); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Gradients } + +procedure SpGradient(ACanvas: TCanvas; const ARect: TRect; + StartPos, EndPos, ChunkSize: Integer; C1, C2: TColor; const Vertical: Boolean); +// StartPos: start position relative to ARect, usually 0 +// EndPos: end position relative to ARect, usually ARect.Bottom - ARect.Top +// ChunkSize: size of the chunk of the gradient we need to paint +var + I: Integer; + r, g, b: Integer; + rc1, gc1, bc1: Integer; + rc2, gc2, bc2: Integer; + PrevColor: TColor; +begin + PrevColor := ACanvas.Brush.Color; + if ChunkSize = 0 then ChunkSize := 1; + SpGetRGB(C1, rc1, gc1, bc1); + SpGetRGB(C2, rc2, gc2, bc2); + for I := StartPos to EndPos do begin + r := rc1 + (((rc2 - rc1) * (I - StartPos)) div ChunkSize); + g := gc1 + (((gc2 - gc1) * (I - StartPos)) div ChunkSize); + b := bc1 + (((bc2 - bc1) * (I - StartPos)) div ChunkSize); + + ACanvas.Brush.Color := SpRGBToColor(r, g, b); + if Vertical then + ACanvas.FillRect(Rect(ARect.Left, ARect.Top + I, ARect.Right, ARect.Top + I + 1)) + else + ACanvas.FillRect(Rect(ARect.Left + I, ARect.Top, ARect.Left + I + 1, ARect.Bottom)); + end; + ACanvas.Brush.Color := PrevColor; +end; + +procedure SpGradientFill(ACanvas: TCanvas; const ARect: TRect; + const C1, C2: TColor; const Vertical: Boolean); +var + GSize: Integer; +begin + if Vertical then + GSize := (ARect.Bottom - ARect.Top) - 1 + else + GSize := (ARect.Right - ARect.Left) - 1; + + SpGradient(ACanvas, ARect, 0, GSize, GSize, C1, C2, Vertical); +end; + +procedure SpGradientFillMirror(ACanvas: TCanvas; const ARect: TRect; + const C1, C2, C3, C4: TColor; const Vertical: Boolean); +var + GSize, ChunkSize, d1, d2: Integer; +begin + if Vertical then + GSize := (ARect.Bottom - ARect.Top) - 1 + else + GSize := (ARect.Right - ARect.Left) - 1; + + ChunkSize := GSize div 2; + if ChunkSize = 0 then ChunkSize := 1; + d1 := ChunkSize; + d2 := GSize; + + SpGradient(ACanvas, ARect, 0, d1, ChunkSize, C1, C2, Vertical); + SpGradient(ACanvas, ARect, d1, d2, ChunkSize, C3, C4, Vertical); +end; + +procedure SpGradientFillMirrorTop(ACanvas: TCanvas; const ARect: TRect; + const C1, C2, C3, C4: TColor; const Vertical: Boolean); +var + GSize, d1, d2: Integer; +begin + if Vertical then + GSize := (ARect.Bottom - ARect.Top) - 1 + else + GSize := (ARect.Right - ARect.Left) - 1; + + d1 := GSize div 3; + d2 := GSize; + + SpGradient(ACanvas, ARect, 0, d1, d1, C1, C2, Vertical); + SpGradient(ACanvas, ARect, d1, d2, d2 - d1, C3, C4, Vertical); +end; + +procedure SpGradientFillGlass(ACanvas: TCanvas; const ARect: TRect; + const C1, C2, C3, C4: TColor; const Vertical: Boolean); +var + GSize, ChunkSize, d1, d2, d3: Integer; +begin + if Vertical then + GSize := (ARect.Bottom - ARect.Top) - 1 + else + GSize := (ARect.Right - ARect.Left) - 1; + + ChunkSize := GSize div 3; + if ChunkSize = 0 then ChunkSize := 1; + d1 := ChunkSize; + d2 := ChunkSize * 2; + d3 := GSize; + + SpGradient(ACanvas, ARect, 0, d1, ChunkSize, C1, C2, Vertical); + SpGradient(ACanvas, ARect, d1, d2, ChunkSize, C2, C3, Vertical); + SpGradient(ACanvas, ARect, d2, d3, ChunkSize, C3, C4, Vertical); +end; + +procedure SpGradientFill9pixels(ACanvas: TCanvas; const ARect: TRect; + const C1, C2, C3, C4: TColor; const Vertical: Boolean); +// Mimics Vista menubar/toolbar blue gradient +var + GSize, d1, d2: Integer; +begin + if Vertical then + GSize := (ARect.Bottom - ARect.Top) - 1 + else + GSize := (ARect.Right - ARect.Left) - 1; + + d1 := GSize div 3; + if d1 > 9 then d1 := 9; + d2 := GSize; + + SpGradient(ACanvas, ARect, 0, d1, d1, C1, C2, Vertical); + SpGradient(ACanvas, ARect, d1, d2, d2 - d1, C3, C4, Vertical); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Element painting } + +procedure SpDrawArrow(ACanvas: TCanvas; X, Y: Integer; AColor: TColor; Vertical, Reverse: Boolean; Size: Integer); +var + C1, C2: TColor; +begin + C1 := ACanvas.Pen.Color; + C2 := ACanvas.Brush.Color; + ACanvas.Pen.Color := AColor; + ACanvas.Brush.Color := AColor; + + if Vertical then + if Reverse then + ACanvas.Polygon([Point(X, Y), Point(X - Size, Y + Size), Point(X + Size, Y + Size)]) + else + ACanvas.Polygon([Point(X - Size, Y), Point(X + Size, Y), Point(X, Y + Size)]) + else + if Reverse then + ACanvas.Polygon([Point(X, Y), Point(X + Size, Y + Size), Point(X + Size, Y - Size)]) + else + ACanvas.Polygon([Point(X, Y - Size), Point(X, Y + Size), Point(X + Size, Y)]); + + ACanvas.Pen.Color := C1; + ACanvas.Brush.Color := C2; +end; + +procedure SpDrawDropMark(ACanvas: TCanvas; DropMark: TRect); +var + C: TColor; + R: TRect; +begin + if IsRectEmpty(DropMark) then Exit; + C := ACanvas.Brush.Color; + + R := Rect(DropMark.Left + 1, DropMark.Top, DropMark.Right - 1, DropMark.Top + 2); + ACanvas.Rectangle(R); + R := Rect(DropMark.Left + 1, DropMark.Bottom - 2, DropMark.Right - 1, DropMark.Bottom); + ACanvas.Rectangle(R); + + R := Rect(DropMark.Left, DropMark.Top + 1, DropMark.Right, DropMark.Top + 3); + ACanvas.Rectangle(R); + R := Rect(DropMark.Left, DropMark.Bottom - 3, DropMark.Right, DropMark.Bottom - 1); + ACanvas.Rectangle(R); + + R := Rect(DropMark.Left + 1, DropMark.Top + 4, DropMark.Right - 1, DropMark.Bottom - 4); + ACanvas.Rectangle(R); + + { + // Standard DropMark + + R := Rect(DropMark.Left, DropMark.Top, DropMark.Right - 1, DropMark.Bottom - 1); + if IsRectEmpty(R) then Exit; + ACanvas.Brush.Color := clBlack; + ACanvas.Polygon([ + Point(R.Left, R.Top), + Point(R.Left + 2, R.Top + 2), + Point(R.Left + 2, R.Bottom - 2), + Point(R.Left, R.Bottom), + Point(R.Right, R.Bottom), + Point(R.Right - 2, R.Bottom - 2), + Point(R.Right - 2, R.Top + 2), + Point(R.Right, R.Top) + ]); + } + ACanvas.Brush.Color := C; +end; + +procedure SpDrawFocusRect(ACanvas: TCanvas; const ARect: TRect); +var + DC: HDC; + C1, C2: TColor; +begin + if not IsRectEmpty(ARect) then begin + DC := ACanvas.Handle; + C1 := SetTextColor(DC, clBlack); + C2 := SetBkColor(DC, clWhite); + ACanvas.DrawFocusRect(ARect); + SetTextColor(DC, C1); + SetBkColor(DC, C2); + end; +end; + +procedure SpDrawGlyphPattern(DC: HDC; const R: TRect; Width, Height: Integer; + const PatternBits; PatternColor: TColor); +var + B: TBitmap; + OldTextColor, OldBkColor: Longword; + OldBrush, Brush: HBrush; + BitmapWidth, BitmapHeight: Integer; +begin + OldTextColor := SetTextColor(DC, clBlack); + OldBkColor := SetBkColor(DC, clWhite); + B := TBitmap.Create; + try + BitmapWidth := 8; + if Width > BitmapWidth then BitmapWidth := Width; + BitmapHeight := 8; + if Height > BitmapHeight then BitmapHeight := Height; + + B.Handle := CreateBitmap(BitmapWidth, BitmapHeight, 1, 1, @PatternBits); + if PatternColor < 0 then Brush := GetSysColorBrush(PatternColor and $FF) + else Brush := CreateSolidBrush(PatternColor); + OldBrush := SelectObject(DC, Brush); + BitBlt(DC, (R.Left + R.Right + 1 - Width) div 2, (R.Top + R.Bottom + 1 - Height) div 2, + Width, Height, B.Canvas.Handle, 0, 0, ROP_DSPDxax); + SelectObject(DC, OldBrush); + if PatternColor >= 0 then DeleteObject(Brush); + finally + SetTextColor(DC, OldTextColor); + SetBkColor(DC, OldBkColor); + B.Free; + end; +end; + +procedure SpDrawGlyphPattern(ACanvas: TCanvas; ARect: TRect; PatternIndex: Integer; PatternColor: TColor); +// The pattern is a 8x8 bitmap +// The array has 16 elements, only the odd elements are used +// The first value of an element represents the bits from the 4 first horizontal pixels, +// and the next value represents the bits of the 4 last horizontal pixels. +// For example: 0 represents -------- +// $FF represents xxxxxxxx +// $C6 represents xx---xx- +const + ClosePattern: array [0..15] of Byte = ($C6, 0, $EE, 0, $7C, 0, $38, 0, $7C, 0, $EE, 0, $C6, 0, 0, 0); + MaximizePattern: array [0..15] of Byte = ($FF, 0, $FF, 0, $81, 0, $81, 0, $81, 0, $81, 0, $81, 0, $FF, 0); + MinimizePattern: array [0..15] of Byte = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, $7E, 0, $7E, 0, 0, 0); + RestorePattern: array [0..17] of Byte = ($3F, 0, $3F, 0, $21, 0, $FD, 0, $FD, 0, $87, 0, $84, 0, $84, 0, $FC, 0); +begin + case PatternIndex of + 0: SpDrawGlyphPattern(ACanvas.Handle, ARect, 8, 8, ClosePattern[0], PatternColor); + 1: SpDrawGlyphPattern(ACanvas.Handle, ARect, 8, 8, MaximizePattern[0], PatternColor); + 2: SpDrawGlyphPattern(ACanvas.Handle, ARect, 8, 8, MinimizePattern[0], PatternColor); + 3: SpDrawGlyphPattern(ACanvas.Handle, ARect, 8, 9, RestorePattern[0], PatternColor); + end; +end; + +procedure SpDrawXPButton(ACanvas: TCanvas; ARect: TRect; Enabled, Pushed, HotTrack, Checked, Focused, Defaulted: Boolean; + SkinType: TSpTBXSkinType); +var + Flags: Cardinal; + C: TColor; + State: TSpTBXSkinStatesType; +begin + SkinType := SpTBXSkinType(SkinType); + case SkinType of + sknNone: + begin + C := ACanvas.Brush.Color; + ACanvas.Brush.Color := clBtnFace; + ACanvas.FillRect(ARect); + if Defaulted or Focused then begin + ACanvas.Brush.Color := clWindowFrame; + ACanvas.FrameRect(ARect); + InflateRect(ARect, -1, -1); // Reduce the Rect for the focus rect + end; + if Pushed or Checked then begin + ACanvas.Brush.Color := clBtnShadow; + ACanvas.FrameRect(ARect); + end + else + DrawFrameControl(ACanvas.Handle, ARect, DFC_BUTTON, DFCS_BUTTONPUSH); + ACanvas.Brush.Color := C; + end; + sknWindows: + begin + if not Enabled then Flags := PBS_DISABLED + else if Pushed or Checked then Flags := PBS_PRESSED + else if HotTrack then Flags := PBS_HOT + else if Defaulted or Focused then Flags := PBS_DEFAULTED + else Flags := PBS_NORMAL; + DrawThemeBackground(ThemeServices.Theme[teButton], ACanvas.Handle, BP_PUSHBUTTON, Flags, ARect, nil); + end; + sknSkin: + begin + State := CurrentSkin.GetState(Enabled, Pushed, HotTrack, Checked); + CurrentSkin.PaintBackground(ACanvas, ARect, skncButton, State, True, True); + end; + end; + + if Focused then begin + InflateRect(ARect, -3, -3); + SpDrawFocusRect(ACanvas, ARect); + end; +end; + +procedure SpDrawXPCheckBoxGlyph(ACanvas: TCanvas; ARect: TRect; Enabled: Boolean; + State: TCheckBoxState; HotTrack, Pushed: Boolean; SkinType: TSpTBXSkinType); +var + Flags: Integer; + SknState: TSpTBXSkinStatesType; +begin + SkinType := SpTBXSkinType(SkinType); + Flags := 0; + case SkinType of + sknNone: + begin + case State of + cbChecked: Flags := DFCS_BUTTONCHECK or DFCS_CHECKED; + cbGrayed: Flags := DFCS_BUTTON3STATE or DFCS_CHECKED; + cbUnChecked: Flags := DFCS_BUTTONCHECK; + end; + if not Enabled then + Flags := Flags or DFCS_INACTIVE; + if Pushed then + Flags := Flags or DFCS_PUSHED; + DrawFrameControl(ACanvas.Handle, ARect, DFC_BUTTON, Flags); + end; + sknWindows: + begin + case State of + cbChecked: Flags := CBS_CHECKEDNORMAL; + cbGrayed: Flags := CBS_MIXEDNORMAL; + cbUnChecked: Flags := CBS_UNCHECKEDNORMAL; + end; + + if not Enabled then Inc(Flags, 3) + else + if Pushed then Inc(Flags, 2) + else if HotTrack then Inc(Flags); + DrawThemeBackground(ThemeServices.Theme[teButton], ACanvas.Handle, BP_CHECKBOX, Flags, ARect, nil); + end; + sknSkin: + begin + SknState := CurrentSkin.GetState(Enabled, Pushed, HotTrack, State in [cbChecked, cbGrayed]); + CurrentSkin.PaintMenuCheckMark(ACanvas, ARect, State = cbChecked, State = cbGrayed, False, SknState); + end; + end; +end; + +procedure SpDrawXPRadioButtonGlyph(ACanvas: TCanvas; ARect: TRect; Enabled: Boolean; + Checked, HotTrack, Pushed: Boolean; SkinType: TSpTBXSkinType); +var + Flags: Integer; + SknState: TSpTBXSkinStatesType; +begin + SkinType := SpTBXSkinType(SkinType); + case SkinType of + sknNone: + begin + Flags := DFCS_BUTTONRADIO; + if Checked then + Flags := Flags or DFCS_CHECKED; + if not Enabled then + Flags := Flags or DFCS_INACTIVE; + if Pushed then + Flags := Flags or DFCS_PUSHED; + DrawFrameControl(ACanvas.Handle, ARect, DFC_BUTTON, Flags); + end; + sknWindows: + begin + if Checked then Flags := RBS_CHECKEDNORMAL + else Flags := RBS_UNCHECKEDNORMAL; + + if not Enabled then Inc(Flags, 3) + else + if Pushed then Inc(Flags, 2) + else if HotTrack then Inc(Flags); + DrawThemeBackground(ThemeServices.Theme[teButton], ACanvas.Handle, BP_RADIOBUTTON, Flags, ARect, nil); + end; + sknSkin: + begin + SknState := CurrentSkin.GetState(Enabled, Pushed, HotTrack, Checked); + CurrentSkin.PaintMenuRadioMark(ACanvas, ARect, Checked, False, SknState); + end; + end; +end; + +procedure SpDrawXPEditFrame(ACanvas: TCanvas; ARect: TRect; Enabled, HotTrack: Boolean; + SkinType: TSpTBXSkinType; ClipContent: Boolean; AutoAdjust: Boolean); +var + PartID, Flags: Integer; + BorderR: TRect; + State: TSpTBXSkinStatesType; + Entry: TSpTBXSkinOptionEntry; +const + CP_BORDER = 4; // Available only on Vista with Delphi 2007 +begin + SkinType := SpTBXSkinType(SkinType); + + if ClipContent then begin + BorderR := ARect; + if HotTrack then + InflateRect(BorderR, -1, -1) + else + InflateRect(BorderR, -2, -2); + ExcludeClipRect(ACanvas.Handle, BorderR.Left, BorderR.Top, BorderR.Right, BorderR.Bottom); + end; + try + case SkinType of + sknNone: + if HotTrack then + SpDrawRectangle(ACanvas, ARect, 0, clBtnShadow, clBtnHighlight, clBtnFace, clBtnFace) + else + SpDrawRectangle(ACanvas, ARect, 0, clBtnFace, clBtnFace, clBtnFace, clBtnFace); + sknWindows: + begin + if SpIsWinVistaOrUp then begin + PartID := CP_BORDER; + if not Enabled then Flags := CBXS_DISABLED + else if HotTrack then Flags := CBXS_HOT + else Flags := CBXS_NORMAL; + end + else begin + PartID := 0; + Flags := 0; + end; + DrawThemeBackground(ThemeServices.Theme[teComboBox], ACanvas.Handle, PartID, Flags, ARect, nil); + end; + sknSkin: + begin + State := CurrentSkin.GetState(Enabled, False, HotTrack, False); + // Try to adjust the borders if only the internal borders are specified, + // used by some controls that need to paint the edit frames like + // TSpTBXPanel (HotTrack=True), TSpTBXListBox, TSpTBXCheckListBox, etc + if AutoAdjust then begin + Entry := SkinManager.CurrentSkin.Options(skncEditFrame, State).Borders; + if (Entry.Color1 = clNone) and (Entry.Color2 = clNone) and + (Entry.Color3 <> clNone) and (Entry.Color4 <> clNone) then + begin + CurrentSkin.PaintBackground(ACanvas, ARect, skncEditFrame, State, True, False); + SpDrawRectangle(ACanvas, ARect, Entry.SkinType, Entry.Color3, Entry.Color4); + Exit; + end; + end; + + CurrentSkin.PaintBackground(ACanvas, ARect, skncEditFrame, State, True, True); + end; + end; + finally + if ClipContent then + SelectClipRgn(ACanvas.Handle, 0); + end; +end; + +procedure SpDrawXPEditFrame(AWinControl: TWinControl; HotTracking: Boolean; + SkinType: TSpTBXSkinType; AutoAdjust, HideFrame: Boolean); +var + R: TRect; + DC: HDC; + ACanvas: TCanvas; +begin + DC := GetWindowDC(AWinControl.Handle); + try + ACanvas := TCanvas.Create; + try + ACanvas.Handle := DC; + GetWindowRect(AWinControl.Handle, R); + OffsetRect(R, -R.Left, -R.Top); + with R do + ExcludeClipRect(DC, Left + 2, Top + 2, Right - 2, Bottom - 2); + + if HideFrame then begin + ACanvas.Brush.Color := TControlAccess(AWinControl).Color; + ACanvas.FillRect(R); + end + else begin + // Don't use SpDrawParentBackground to paint the background it doesn't get + // the correct WindowOrg in this particular case + PerformEraseBackground(AWinControl, ACanvas.Handle); + SpDrawXPEditFrame(ACanvas, R, AWinControl.Enabled, HotTracking, SkinType, False, AutoAdjust); + end; + finally + ACanvas.Handle := 0; + ACanvas.Free; + end; + finally + ReleaseDC(AWinControl.Handle, DC); + end; +end; + +procedure SpDrawXPGrip(ACanvas: TCanvas; ARect: TRect; LoC, HiC: TColor); +var + I, J: Integer; + XCellCount, YCellCount: Integer; + R: TRect; + C: TColor; +begin + // 4 x 4 cells (Grey, White, Null) + // GG-- + // GGW- + // -WW- + // ---- + + C := ACanvas.Brush.Color; + XCellCount := (ARect.Right - ARect.Left) div 4; + YCellCount := (ARect.Bottom - ARect.Top) div 4; + if XCellCount = 0 then XCellCount := 1; + if YCellCount = 0 then YCellCount := 1; + + for J := 0 to YCellCount - 1 do + for I := 0 to XCellCount - 1 do begin + R.Left := ARect.Left + (I * 4) + 1; + R.Right := R.Left + 2; + R.Top := ARect.Top + (J * 4) + 1; + R.Bottom := R.Top + 2; + + ACanvas.Brush.Color := HiC; + ACanvas.FillRect(R); + OffsetRect(R, -1, -1); + ACanvas.Brush.Color := LoC; + ACanvas.FillRect(R); + end; + ACanvas.Brush.Color := C; +end; + +procedure SpDrawXPHeader(ACanvas: TCanvas; ARect: TRect; HotTrack, Pushed: Boolean; SkinType: TSpTBXSkinType); +var + Flags: Cardinal; + State: TSpTBXSkinStatesType; +begin + SkinType := SpTBXSkinType(SkinType); + case SkinType of + sknNone: + begin + DrawEdge(ACanvas.Handle, ARect, BDR_RAISEDINNER or BDR_RAISEDOUTER, BF_RECT or BF_SOFT); + end; + sknWindows: + begin + if Pushed then Flags := HIS_PRESSED + else if HotTrack then Flags := HIS_HOT + else Flags := HIS_NORMAL; + DrawThemeBackground(ThemeServices.Theme[teHeader], ACanvas.Handle, HP_HEADERITEM, Flags, ARect, nil); + end; + sknSkin: + begin + State := CurrentSkin.GetState(True, Pushed, HotTrack, False); + if (State = sknsPushed) and CurrentSkin.Options(skncHeader, State).IsEmpty then + State := sknsHotTrack; + CurrentSkin.PaintBackground(ACanvas, ARect, skncHeader, State, True, True); + end; + end; +end; + +procedure SpDrawXPListItemBackground(ACanvas: TCanvas; ARect: TRect; HotTrack, Pushed, Focused: Boolean; + SkinType: TSpTBXSkinType); +var + State: TSpTBXSkinStatesType; + PrevColor: TColor; +begin + PrevColor := ACanvas.Font.Color; + if SpTBXSkinType(SkinType) = sknSkin then begin + ACanvas.FillRect(ARect); + if HotTrack then begin + State := CurrentSkin.GetState(True, Pushed, HotTrack, False); + ACanvas.Font.Color := CurrentSkin.GetTextColor(skncListItem, State); + CurrentSkin.PaintBackground(ACanvas, ARect, skncListItem, State, True, True); + end; + end + else begin + if HotTrack then begin + ACanvas.Brush.Color := clHighlight; + ACanvas.Font.Color := clHighlightText; + end; + ACanvas.FillRect(ARect); + if Focused then + SpDrawFocusRect(ACanvas, ARect); + end; + ACanvas.Font.Color := PrevColor; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Skins painting } + +procedure SpPaintSkinBackground(ACanvas: TCanvas; ARect: TRect; SkinOption: TSpTBXSkinOptionCategory; Vertical: Boolean); +var + Part: TSpTBXSkinOptionEntry; + SkinType: Integer; +begin + Part := SkinOption.Body; + SkinType := SkinOption.Body.SkinType; + + if Vertical then + case SkinType of + 1: SkinType := 2; // Vertical Gradient to Horizontal + 2: SkinType := 1; // Horizontal Gradient to Vertical + + 3: SkinType := 4; // Vertical Glass Gradient to Horizontal + 4: SkinType := 3; // Horizontal Glass Gradient to Vertical + + 5: SkinType := 6; // Vertical Mirror Gradient to Horizontal + 6: SkinType := 5; // Horizontal Mirror Gradient to Vertical + + 7: SkinType := 8; // Vertical MirrorTop Gradient to Horizontal + 8: SkinType := 7; // Horizontal MirrorTop Gradient to Vertical + + 9: SkinType := 10; // Vertical 9Pixels Gradient to Horizontal + 10: SkinType := 9; // Horizontal 9Pixels Gradient to Vertical + end; + + case SkinType of + 0: begin // Solid + SpFillRect(ACanvas, ARect, Part.Color1); + end; + 1: begin // Vertical Gradient + SpGradientFill(ACanvas, ARect, Part.Color1, Part.Color2, True); + end; + 2: begin // Horizontal Gradient + SpGradientFill(ACanvas, ARect, Part.Color1, Part.Color2, False); + end; + 3: begin // Vertical Glass Gradient + SpGradientFillGlass(ACanvas, ARect, Part.Color1, Part.Color2, Part.Color3, Part.Color4, True); + end; + 4: begin // Horizontal Glass Gradient + SpGradientFillGlass(ACanvas, ARect, Part.Color1, Part.Color2, Part.Color3, Part.Color4, False); + end; + 5: begin // Vertical Mirror Gradient + SpGradientFillMirror(ACanvas, ARect, Part.Color1, Part.Color2, Part.Color3, Part.Color4, True); + end; + 6: begin // Horizontal Mirror Gradient + SpGradientFillMirror(ACanvas, ARect, Part.Color1, Part.Color2, Part.Color3, Part.Color4, False); + end; + 7: begin // Vertical MirrorTop Gradient + SpGradientFillMirrorTop(ACanvas, ARect, Part.Color1, Part.Color2, Part.Color3, Part.Color4, True); + end; + 8: begin // Horizontal MirrorTop Gradient + SpGradientFillMirrorTop(ACanvas, ARect, Part.Color1, Part.Color2, Part.Color3, Part.Color4, False); + end; + 9: begin // Vertical 9Pixels Gradient + SpGradientFill9Pixels(ACanvas, ARect, Part.Color1, Part.Color2, Part.Color3, Part.Color4, True); + end; + 10:begin // Horizontal 9Pixels Gradient + SpGradientFill9Pixels(ACanvas, ARect, Part.Color1, Part.Color2, Part.Color3, Part.Color4, False); + end; + end; +end; + +procedure SpPaintSkinBorders(ACanvas: TCanvas; ARect: TRect; SkinOption: TSpTBXSkinOptionCategory; + ForceRectBorders: TAnchors = []); +var + Part: TSpTBXSkinOptionEntry; +begin + Part := SkinOption.Borders; + case Part.SkinType of + 0, 1, 2: // Rectangle, Simple Rounded and Double Rounded Border + begin + SpDrawRectangle(ACanvas, ARect, Part.SkinType, Part.Color1, Part.Color2, Part.Color3, Part.Color4, ForceRectBorders); + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Misc } + +function SpIsWinVistaOrUp: Boolean; +begin + Result := (Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion >= 6) and (Win32MinorVersion >= 0) +end; + +function SpGetDirectories(Path: WideString; L: TStringList): Boolean; +var + SearchRec: TSearchRec; +begin + Result := False; + if DirectoryExists(Path) then begin + Path := IncludeTrailingPathDelimiter(Path) + '*.*'; + if FindFirst(Path, faDirectory, SearchRec) = 0 then begin + try + repeat + if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then + L.Add(SearchRec.Name); + until FindNext(SearchRec) <> 0; + Result := True; + finally + FindClose(SearchRec); + end; + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSkinOptionEntry } + +procedure TSpTBXSkinOptionEntry.AssignTo(Dest: TPersistent); +begin + if Dest is TSpTBXSkinOptionEntry then + with TSpTBXSkinOptionEntry(Dest) do begin + SkinType := Self.SkinType; + Color1 := Self.Color1; + Color2 := Self.Color2; + Color3 := Self.Color3; + Color4 := Self.Color4; + end + else inherited AssignTo(Dest); +end; + +constructor TSpTBXSkinOptionEntry.Create; +begin + inherited; + Reset; +end; + +procedure TSpTBXSkinOptionEntry.Fill(ASkinType: Integer; AColor1, AColor2, + AColor3, AColor4: TColor); +begin + FSkinType := ASkinType; + FColor1 := AColor1; + FColor2 := AColor2; + FColor3 := AColor3; + FColor4 := AColor4; +end; + +function TSpTBXSkinOptionEntry.IsEmpty: Boolean; +begin + Result := (FColor1 = clNone) and (FColor2 = clNone) and (FColor3 = clNone) and (FColor4 = clNone); +end; + +function TSpTBXSkinOptionEntry.IsEqual(AOptionEntry: TSpTBXSkinOptionEntry): Boolean; +begin + Result := (FSkinType = AOptionEntry.SkinType) and + (FColor1 = AOptionEntry.Color1) and (FColor2 = AOptionEntry.Color2) and + (FColor3 = AOptionEntry.Color3) and (FColor4 = AOptionEntry.Color4); +end; + +procedure TSpTBXSkinOptionEntry.Reset; +begin + FSkinType := 0; + FColor1 := clNone; + FColor2 := clNone; + FColor3 := clNone; + FColor4 := clNone; +end; + +procedure TSpTBXSkinOptionEntry.ReadFromString(S: string); +var + L: TStringList; +begin + Reset; + L := TStringList.Create; + try + L.CommaText := S; + try + if L.Count > 0 then FSkinType := StrToIntDef(L[0], 0); + if L.Count > 1 then FColor1 := StringToColor(L[1]); + if L.Count > 2 then FColor2 := StringToColor(L[2]); + if L.Count > 3 then FColor3 := StringToColor(L[3]); + if L.Count > 4 then FColor4 := StringToColor(L[4]); + except + // do nothing + end; + finally + L.Free; + end; +end; + +function TSpTBXSkinOptionEntry.WriteToString: string; +begin + Result := Format('%d, %s, %s, %s, %s', [FSkinType, + SpColorToString(FColor1), SpColorToString(FColor2), + SpColorToString(FColor3), SpColorToString(FColor4)]); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXThemeOptionCategory } + +procedure TSpTBXSkinOptionCategory.AssignTo(Dest: TPersistent); +begin + if Dest is TSpTBXSkinOptionCategory then + with TSpTBXSkinOptionCategory(Dest) do begin + Body.Assign(Self.Body); + Borders.Assign(Self.Borders); + TextColor := Self.TextColor; + end + else inherited AssignTo(Dest); +end; + +constructor TSpTBXSkinOptionCategory.Create; +begin + inherited; + FBody := TSpTBXSkinOptionEntry.Create; + FBorders := TSpTBXSkinOptionEntry.Create; + FTextColor := clNone; +end; + +destructor TSpTBXSkinOptionCategory.Destroy; +begin + FreeAndNil(FBody); + FreeAndNil(FBorders); + inherited; +end; + +function TSpTBXSkinOptionCategory.IsEmpty: Boolean; +begin + Result := FBody.IsEmpty and FBorders.IsEmpty and (FTextColor = clNone); +end; + +procedure TSpTBXSkinOptionCategory.Reset; +begin + FBody.Reset; + FBorders.Reset; + FTextColor := clNone; +end; + +procedure TSpTBXSkinOptionCategory.SaveToIni(MemIni: TMemIniFile; Section, Ident: string); +begin + if not IsEmpty then begin + MemIni.WriteString(Section, Ident + '.Body', Body.WriteToString); + MemIni.WriteString(Section, Ident + '.Borders', Borders.WriteToString); + MemIni.WriteString(Section, Ident + '.TextColor', SpColorToString(TextColor)); + end; +end; + +procedure TSpTBXSkinOptionCategory.LoadFromIni(MemIni: TMemIniFile; Section, Ident: string); +begin + Reset; + if Ident = '' then Ident := SSpTBXSkinStatesString[sknsNormal]; + + Body.ReadFromString(MemIni.ReadString(Section, Ident + '.Body', '')); + Borders.ReadFromString(MemIni.ReadString(Section, Ident + '.Borders', '')); + TextColor := StringToColor(MemIni.ReadString(Section, Ident + '.TextColor', 'clNone')); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXThemeOptions } + +procedure TSpTBXSkinOptions.AssignTo(Dest: TPersistent); +var + C: TSpTBXSkinComponentsType; + S: TSpTBXSkinStatesType; + DestOp: TSpTBXSkinOptions; +begin + if Dest is TSpTBXSkinOptions then begin + DestOp := TSpTBXSkinOptions(Dest); + for C := Low(C) to High(C) do + for S := Low(S) to High(S) do + DestOp.FOptions[C, S].Assign(Options(C, S)); + DestOp.ColorBtnFace := FColorBtnFace; + DestOp.FloatingWindowBorderSize := FFloatingWindowBorderSize; + DestOp.OfficeIcons := FOfficeIcons; + DestOp.OfficeMenuSeparator := FOfficeMenuSeparator; + DestOp.OfficeStatusBar := FOfficeStatusBar; + DestOp.FSkinAuthor := FSkinAuthor; + DestOp.FSkinName := FSkinName; + end + else inherited AssignTo(Dest); +end; + +procedure TSpTBXSkinOptions.BroadcastChanges; +begin + if Self = SkinManager.CurrentSkin then + SkinManager.BroadcastSkinNotification; +end; + +procedure TSpTBXSkinOptions.CopyOptions(AComponent, ToComponent: TSpTBXSkinComponentsType); +var + S: TSpTBXSkinStatesType; +begin + for S := Low(S) to High(S) do + FOptions[AComponent, S].AssignTo(FOptions[ToComponent, S]); +end; + +constructor TSpTBXSkinOptions.Create; +var + C: TSpTBXSkinComponentsType; + S: TSpTBXSkinStatesType; +begin + inherited; + FSkinName := 'Default'; + FColorBtnFace := clBtnFace; + FFloatingWindowBorderSize := 4; + for C := Low(C) to High(C) do + for S := Low(S) to High(S) do + FOptions[C, S] := TSpTBXSkinOptionCategory.Create; + + FillOptions; +end; + +destructor TSpTBXSkinOptions.Destroy; +var + C: TSpTBXSkinComponentsType; + S: TSpTBXSkinStatesType; +begin + for C := Low(C) to High(C) do + for S := Low(S) to High(S) do + FreeAndNil(FOptions[C, S]); + + inherited; +end; + +procedure TSpTBXSkinOptions.FillOptions; +begin + // Used by descendants to fill the skin options +end; + +procedure TSpTBXSkinOptions.Reset(ForceResetSkinProperties: Boolean); +var + C: TSpTBXSkinComponentsType; + S: TSpTBXSkinStatesType; +begin + if ForceResetSkinProperties then begin + FColorBtnFace := clBtnFace; + FFloatingWindowBorderSize := 4; + FOfficeIcons := False; + FOfficeMenuSeparator := False; + FOfficeStatusBar := False; + end; + + for C := Low(C) to High(C) do + for S := Low(S) to High(S) do + FOptions[C, S].Reset; +end; + +function TSpTBXSkinOptions.Options(Component: TSpTBXSkinComponentsType; State: TSpTBXSkinStatesType): TSpTBXSkinOptionCategory; +begin + if CSpTBXSkinComponents[Component].States = [sknsNormal] then + State := sknsNormal; + Result := FOptions[Component, State]; +end; + +function TSpTBXSkinOptions.Options(Component: TSpTBXSkinComponentsType): TSpTBXSkinOptionCategory; +begin + Result := FOptions[Component, sknsNormal]; +end; + +procedure TSpTBXSkinOptions.SaveToFile(Filename: WideString); +var + MemIni: TMemIniFile; +begin + MemIni := TMemIniFile.Create(Filename); + try + SaveToMemIni(MemIni); + MemIni.UpdateFile; + finally + MemIni.Free; + end; +end; + +procedure TSpTBXSkinOptions.SaveToMemIni(MemIni: TMemIniFile); +var + C: TSpTBXSkinComponentsType; + S: TSpTBXSkinStatesType; +begin + MemIni.WriteString('Skin', 'Name', FSkinName); + MemIni.WriteString('Skin', 'Author', FSkinAuthor); + MemIni.WriteString('Skin', 'ColorBtnFace', SpColorToString(FColorBtnFace)); + MemIni.WriteInteger('Skin', 'FloatingWindowBorderSize', FFloatingWindowBorderSize); + MemIni.WriteBool('Skin', 'OfficeIcons', FOfficeIcons); + MemIni.WriteBool('Skin', 'OfficeMenuSeparator', FOfficeMenuSeparator); + MemIni.WriteBool('Skin', 'OfficeStatusBar', FOfficeStatusBar); + + for C := Low(C) to High(C) do begin + for S := Low(S) to High(S) do + if S in CSpTBXSkinComponents[C].States then + FOptions[C, S].SaveToIni(MemIni, CSpTBXSkinComponents[C].Name, SSpTBXSkinStatesString[S]); + end; +end; + +procedure TSpTBXSkinOptions.SaveToStrings(L: TStrings); +var + MemIni: TMemIniFile; +begin + MemIni := TMemIniFile.Create(''); + try + MemIni.SetStrings(L); // Transfer L contents to MemIni + SaveToMemIni(MemIni); + L.Clear; + MemIni.GetStrings(L); // Transfer MemIni contents to L + finally + MemIni.Free; + end; +end; + +procedure TSpTBXSkinOptions.LoadFromFile(Filename: WideString); +var + L: TStringList; +begin + if FileExists(Filename) then begin + L := TStringList.Create; + try + L.LoadFromFile(Filename); + LoadFromStrings(L); + finally + L.Free; + end; + end; +end; + +procedure TSpTBXSkinOptions.LoadFromStrings(L: TStrings); +var + MemIni: TMemIniFile; + C: TSpTBXSkinComponentsType; + S: TSpTBXSkinStatesType; +begin + MemIni := TMemIniFile.Create(''); + try + MemIni.SetStrings(L); + + FSkinName := MemIni.ReadString('Skin', 'Name', ''); + FSkinAuthor := MemIni.ReadString('Skin', 'Author', ''); + FColorBtnFace := StringToColor(MemIni.ReadString('Skin', 'ColorBtnFace', 'clBtnFace')); + FFloatingWindowBorderSize := MemIni.ReadInteger('Skin', 'FloatingWindowBorderSize', 4); + FOfficeIcons := MemIni.ReadBool('Skin', 'OfficeIcons', False); + FOfficeMenuSeparator := MemIni.ReadBool('Skin', 'OfficeMenuSeparator', False); + FOfficeStatusBar := MemIni.ReadBool('Skin', 'OfficeStautsBar', False); + + for C := Low(C) to High(C) do begin + for S := Low(S) to High(S) do + if S in CSpTBXSkinComponents[C].States then + FOptions[C, S].LoadFromIni(MemIni, CSpTBXSkinComponents[C].Name, SSpTBXSkinStatesString[S]); + end; + + BroadcastChanges; + finally + MemIni.Free; + end; +end; + +function TSpTBXSkinOptions.GetOfficeIcons: Boolean; +// OfficeIcons is used to paint the menu items icons with Office XP shadows. +begin + Result := FOfficeIcons and (SkinManager.GetSkinType = sknSkin); +end; + +function TSpTBXSkinOptions.GetOfficeMenuSeparator: Boolean; +// When OfficeMenuSeparator is True the height of the separators on popup menus +// is 6 pixels, otherwise the size is 10 pixels. +begin + Result := FOfficeMenuSeparator and (SkinManager.GetSkinType = sknSkin); +end; + +function TSpTBXSkinOptions.GetOfficePopup: Boolean; +// OfficePopup is used to paint the PopupWindow with Office XP style. +// It is also used to paint the opened toolbar item with shadows. +begin + Result := (SkinManager.GetSkinType = sknSkin) and not Options(skncOpenToolbarItem).IsEmpty; +end; + +function TSpTBXSkinOptions.GetOfficeStatusBar: Boolean; +// OfficeStatusBar is used to paint the StatusBar panels with Office XP style. +var + T: TSpTBXSkinType; +begin + T := SkinManager.GetSkinType; + Result := (FOfficeStatusBar and (T = sknSkin)) or (T = sknNone); +end; + +function TSpTBXSkinOptions.GetFloatingWindowBorderSize: Integer; +begin + if SkinManager.GetSkinType = sknSkin then + Result := FFloatingWindowBorderSize + else + Result := 4; +end; + +procedure TSpTBXSkinOptions.SetFloatingWindowBorderSize(const Value: Integer); +begin + FFloatingWindowBorderSize := Value; + if FFloatingWindowBorderSize < 0 then FFloatingWindowBorderSize := 0; + if FFloatingWindowBorderSize > 4 then FFloatingWindowBorderSize := 4; +end; + +procedure TSpTBXSkinOptions.GetDropDownArrowSize(out DropDownArrowSize, + DropDownArrowMargin, SplitBtnArrowSize: Integer); +begin + DropDownArrowSize := 8; // TB2Item.tbDropdownArrowWidth + DropDownArrowMargin := 3; // TB2Item.tbDropdownArrowMargin + + SplitBtnArrowSize := 12; // TB2Item.tbDropdownComboArrowWidth + 1 + if SkinManager.GetSkinType = sknWindows then + SplitBtnArrowSize := SplitBtnArrowSize + 1; +end; + +procedure TSpTBXSkinOptions.GetMenuItemMargins(ACanvas: TCanvas; ImgSize: Integer; + out MarginsInfo: TSpTBXMenuItemMarginsInfo); +var + TextMetric: TTextMetric; + H, M2: Integer; +begin + if ImgSize = 0 then + ImgSize := 16; + + FillChar(MarginsInfo, SizeOf(MarginsInfo), 0); + + if (SkinManager.GetSkinType = sknSkin) or ((SkinManager.GetSkinType = sknWindows) and SpIsWinVistaOrUp) then begin + // Office like spacing, used by Windows Vista and all the skins + MarginsInfo.Margins := Rect(1, 4, 1, 4); // MID_MENUITEM + MarginsInfo.ImageTextSpace := 5; // TMI_MENU_IMGTEXTSPACE + MarginsInfo.LeftCaptionMargin := 3; // TMI_MENU_LCAPTIONMARGIN + MarginsInfo.RightCaptionMargin := 3; // TMI_MENU_RCAPTIONMARGIN + end + else begin + MarginsInfo.Margins := Rect(0, 3, 0, 3); // MID_MENUITEM + MarginsInfo.ImageTextSpace := 1; // TMI_MENU_IMGTEXTSPACE + MarginsInfo.LeftCaptionMargin := 2; // TMI_MENU_LCAPTIONMARGIN + MarginsInfo.RightCaptionMargin := 2; // TMI_MENU_RCAPTIONMARGIN + end; + + GetTextMetrics(ACanvas.Handle, TextMetric); + M2 := MarginsInfo.Margins.Top + MarginsInfo.Margins.Bottom; + MarginsInfo.GutterSize := TextMetric.tmHeight + TextMetric.tmExternalLeading + M2; + H := ImgSize + M2; + if H > MarginsInfo.GutterSize then MarginsInfo.GutterSize := H; + MarginsInfo.GutterSize := (ImgSize + M2) * MarginsInfo.GutterSize div H - 2; // GutterSize = GetPopupMargin = ItemInfo.PopupMargin +end; + +function TSpTBXSkinOptions.GetState(Enabled, Pushed, HotTrack, Checked: Boolean): TSpTBXSkinStatesType; +begin + Result := sknsNormal; + if not Enabled then Result := sknsDisabled + else begin + if Pushed then Result := sknsPushed + else + if HotTrack and Checked then Result := sknsCheckedAndHotTrack + else + if HotTrack then Result := sknsHotTrack + else + if Checked then Result := sknsChecked; + end; +end; + +function TSpTBXSkinOptions.GetTextColor(Component: TSpTBXSkinComponentsType; + State: TSpTBXSkinStatesType; SkinType: TSpTBXSkinType = sknSkin): TColor; +var + Flags: Integer; + VistaColor: Cardinal; +begin + Result := clNone; + SkinType := SpTBXSkinType(SkinType); + + if SkinType = sknSkin then begin + if State in CSpTBXSkinComponents[Component].States then begin + Result := Options(Component, State).TextColor; + if Result <> clNone then + Exit; // Text color is specified by the skin + end + else + Exit; // Exit if the State is not valid + end; + + if State = sknsDisabled then Result := clGrayText + else Result := clBtnText; + + case Component of + skncMenuItem: + if SpIsWinVistaOrUp and (SkinType = sknWindows) then begin + Flags := MPI_NORMAL; + if State = sknsDisabled then Flags := MPI_DISABLED + else if State in [sknsHotTrack, sknsCheckedAndHotTrack] then Flags := MPI_HOT; + GetThemeColor(ThemeServices.Theme[teMenu], MENU_POPUPITEM, Flags, TMT_TEXTCOLOR, VistaColor); + Result := TColor(VistaColor); + end + else + if State <> sknsDisabled then begin + Result := clMenuText; + if SkinType <> sknSkin then + if State in [sknsHotTrack, sknsCheckedAndHotTrack, sknsPushed] then + Result := clHighlightText; + end; + skncMenuBarItem: + if State <> sknsDisabled then begin + Result := clMenuText; + if SkinType = sknWindows then + if State in [sknsHotTrack, sknsPushed, sknsChecked, sknsCheckedAndHotTrack] then + Result := clHighlightText; + end; + skncToolbarItem: + if State <> sknsDisabled then Result := clMenuText; + skncListItem: + if SkinType <> sknSkin then + if State in [sknsHotTrack, sknsCheckedAndHotTrack] then + Result := clHighlightText; + skncDockablePanelTitleBar, skncStatusBar, skncTabToolbar: + if SkinType = sknSkin then + Result := clNone; // Reset Result to clNone so the Toolbar can override the items text color + skncWindowTitleBar: + if SkinType = sknSkin then + Result := clNone // Reset Result to clNone so the Toolbar can override the items text color + else + if State = sknsDisabled then Result := clInactiveCaptionText + else Result := clCaptionText; + end; +end; + +procedure TSpTBXSkinOptions.PaintBackground(ACanvas: TCanvas; ARect: TRect; + Component: TSpTBXSkinComponentsType; State: TSpTBXSkinStatesType; + Background, Borders: Boolean; Vertical: Boolean = False; + ForceRectBorders: TAnchors = []); +var + BackgroundRect: TRect; + Op: TSpTBXSkinOptionCategory; +begin + Op := Options(Component, State); + + if Op.Borders.IsEmpty then + Borders := False; + if Op.Body.IsEmpty then + Background := False; + + if Background then begin + BackgroundRect := ARect; + if Borders then + InflateRect(BackgroundRect, -1, -1); + SpPaintSkinBackground(ACanvas, BackgroundRect, Op, Vertical); + end; + + if Borders then + SpPaintSkinBorders(ACanvas, ARect, Op, ForceRectBorders); +end; + +procedure TSpTBXSkinOptions.PaintMenuCheckMark(ACanvas: TCanvas; ARect: TRect; + Checked, Grayed, MenuItemStyle: Boolean; State: TSpTBXSkinStatesType); +var + X, Y: Integer; + PenC, BrushC, CheckColor: TColor; + Flags: Integer; + VistaCheckSize: TSize; +begin + if MenuItemStyle and SpIsWinVistaOrUp and (SkinManager.GetSkinType = sknWindows) then begin + if State = sknsDisabled then Flags := MC_CHECKMARKDISABLED + else Flags := MC_CHECKMARKNORMAL; + VistaCheckSize.cx := 0; + VistaCheckSize.cy := 0; + GetThemePartSize(ThemeServices.Theme[teMenu], ACanvas.Handle, MENU_POPUPCHECK, Flags, nil, TS_TRUE, VistaCheckSize); + ARect := SpCenterRect(ARect, VistaCheckSize.cx, VistaCheckSize.cy); + DrawThemeBackground(ThemeServices.Theme[teMenu], ACanvas.Handle, MENU_POPUPCHECK, Flags, ARect, nil); + end + else begin + X := ARect.Left + (ARect.Right - ARect.Left) div 2 - 1; + Y := ARect.Top + (ARect.Bottom - ARect.Top) div 2 + 1; + + PenC := ACanvas.Pen.Color; + BrushC := ACanvas.Brush.Color; + try + if MenuItemStyle then begin + CheckColor := clMenuText; // On sknNone it's clMenuText even when disabled + case SkinManager.GetSkinType of + sknWindows: + CheckColor := GetTextColor(skncCheckBox, State); + sknSkin: + CheckColor := GetTextColor(skncMenuItem, State); + end; + ACanvas.Brush.Color := CheckColor; + ACanvas.Pen.Color := CheckColor; + ACanvas.Polygon([Point(X - 3, Y - 2), Point(X - 1, Y), Point(X + 3, Y - 4), + Point(X + 3, Y - 3), Point(X - 1, Y + 1), Point(X - 3, Y - 1), Point(X - 3, Y -2)]); + end + else begin + CheckColor := GetTextColor(skncCheckBox, State); + ACanvas.Brush.Color := CheckColor; + ACanvas.Pen.Color := CheckColor; + PaintBackground(ACanvas, ARect, skncCheckBox, State, True, True); + if Checked then + ACanvas.Polygon([Point(X - 2, Y), Point(X, Y + 2), Point(X + 4, Y - 2), + Point(X + 4, Y - 4), Point(X, Y), Point(X - 2, Y - 2), Point(X - 2, Y)]) + else + if Grayed then begin + InflateRect(ARect, -3, -3); + // ACanvas.Brush.Color := Options(skncCheckBox, sknsChecked).Borders.Color1; + ACanvas.FillRect(ARect); + end; + end; + finally + ACanvas.Pen.Color := PenC; + ACanvas.Brush.Color := BrushC; + end; + end; +end; + +procedure TSpTBXSkinOptions.PaintMenuRadioMark(ACanvas: TCanvas; ARect: TRect; + Checked, MenuItemStyle: Boolean; State: TSpTBXSkinStatesType); +var + X, Y: Integer; + PenC, BrushC, CheckColor, FrameColor: TColor; + Flags: Integer; + VistaCheckSize: TSize; +begin + if MenuItemStyle and SpIsWinVistaOrUp and (SkinManager.GetSkinType = sknWindows) then begin + if State = sknsDisabled then Flags := MC_BULLETDISABLED + else Flags := MC_BULLETNORMAL; + VistaCheckSize.cx := 0; + VistaCheckSize.cy := 0; + GetThemePartSize(ThemeServices.Theme[teMenu], ACanvas.Handle, MENU_POPUPCHECK, Flags, nil, TS_TRUE, VistaCheckSize); + ARect := SpCenterRect(ARect, VistaCheckSize.cx, VistaCheckSize.cy); + DrawThemeBackground(ThemeServices.Theme[teMenu], ACanvas.Handle, MENU_POPUPCHECK, Flags, ARect, nil); + end + else begin + PenC := ACanvas.Pen.Color; + BrushC := ACanvas.Brush.Color; + try + if MenuItemStyle then begin + CheckColor := clMenuText; // On sknNone it's clMenuText even when disabled + case SkinManager.GetSkinType of + sknWindows: + CheckColor := GetTextColor(skncRadioButton, State); + sknSkin: + CheckColor := GetTextColor(skncMenuItem, State); + end; + ACanvas.Brush.Color := CheckColor; + ACanvas.Pen.Color := CheckColor; + X := ARect.Left + (ARect.Right - ARect.Left) div 2; + Y := ARect.Top + (ARect.Bottom - ARect.Top) div 2; + ACanvas.RoundRect(X - 3, Y - 3, X + 3, Y + 3, 2, 2); + end + else begin + CheckColor := GetTextColor(skncRadioButton, State); + FrameColor := Options(skncRadioButton, State).Borders.Color1; + if State = sknsDisabled then FrameColor := CheckColor; + if not Checked then CheckColor := clNone; + + // Keep it simple make the radio 13x13 + ARect.Left := ARect.Left + (ARect.Right - ARect.Left - 13) div 2; + ARect.Right := ARect.Left + 13; + ARect.Top := ARect.Top + (ARect.Bottom - ARect.Top - 13) div 2; + ARect.Bottom := ARect.Top + 13; + X := ARect.Left; + Y := ARect.Top; + + // Background + BeginPath(ACanvas.Handle); + ACanvas.Polyline([Point(X, Y + 8), Point(X, Y + 4), Point(X + 1, Y + 3), + Point(X + 1, Y + 2), Point(X + 2, Y + 1), Point(X + 3, Y + 1), + Point(X + 4, Y), Point(X + 8, Y), Point(X + 9, Y + 1), + Point(X + 10, Y + 1), Point(X + 11, Y + 2), Point(X + 11, Y + 3), + Point(X + 12, Y + 4), Point(X + 12, Y + 8), Point(X + 11, Y + 9), + Point(X + 11, Y + 10), Point(X + 10, Y + 11), Point(X + 9, Y + 11), + Point(X + 8, Y + 12), Point(X + 4, Y + 12), Point(X + 3, Y + 11), + Point(X + 2, Y + 11), Point(X + 1, Y + 10), Point(X + 1, Y + 8)]); + EndPath(ACanvas.Handle); + SelectClipPath(ACanvas.Handle, RGN_COPY); + PaintBackground(ACanvas, ARect, skncRadioButton, State, True, False); + SelectClipPath(ACanvas.Handle, 0); + SelectClipRgn(ACanvas.Handle, 0); + + // Frame + ACanvas.Brush.Color := FrameColor; + ACanvas.Pen.Color := FrameColor; + ACanvas.Polyline([Point(X, Y + 8), Point(X, Y + 4), Point(X + 1, Y + 3), + Point(X + 1, Y + 2), Point(X + 2, Y + 1), Point(X + 3, Y + 1), + Point(X + 4, Y), Point(X + 8, Y), Point(X + 9, Y + 1), + Point(X + 10, Y + 1), Point(X + 11, Y + 2), Point(X + 11, Y + 3), + Point(X + 12, Y + 4), Point(X + 12, Y + 8), Point(X + 11, Y + 9), + Point(X + 11, Y + 10), Point(X + 10, Y + 11), Point(X + 9, Y + 11), + Point(X + 8, Y + 12), Point(X + 4, Y + 12), Point(X + 3, Y + 11), + Point(X + 2, Y + 11), Point(X + 1, Y + 10), Point(X + 1, Y + 8)]); + + // Radio + if CheckColor <> clNone then begin + ACanvas.Brush.Color := CheckColor; + ACanvas.Pen.Color := CheckColor; + X := (ARect.Left + ARect.Right) div 2; + Y := (ARect.Top + ARect.Bottom) div 2 + 1; + ACanvas.RoundRect(X - 2, Y - 3, X + 3, Y + 2, 2, 2); + end; + end; + finally + ACanvas.Pen.Color := PenC; + ACanvas.Brush.Color := BrushC; + end; + end; +end; + +procedure TSpTBXSkinOptions.PaintWindowFrame(ACanvas: TCanvas; ARect: TRect; + IsActive, DrawBody: Boolean; BorderSize: Integer = 4); +var + C: TColor; + R: TRect; + I: Integer; + State: TSpTBXSkinStatesType; + Op: TSpTBXSkinOptionEntry; +begin + if IsActive then + State := sknsNormal + else + if Options(skncWindow, sknsDisabled).IsEmpty then + State := sknsNormal + else + State := sknsDisabled; + + C := ACanvas.Brush.Color; + if DrawBody then + PaintBackground(ACanvas, ARect, skncWindow, State, True, False); + R := ARect; + Op := Options(skncWindow, State).Borders; + for I := 1 to BorderSize do begin + if I = 1 then ACanvas.Brush.Color := Op.Color1 + else if I = 2 then ACanvas.Brush.Color := Op.Color2 + else if I = 3 then ACanvas.Brush.Color := Op.Color3 + else if I >= 4 then ACanvas.Brush.Color := Op.Color4; + ACanvas.FrameRect(R); + InflateRect(R, -1, -1); + end; + ACanvas.Brush.Color := C; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSkinsListEntry } + +destructor TSpTBXSkinsListEntry.Destroy; +begin + SkinClass := nil; + FreeAndNil(SkinStrings); + + inherited; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSkinsList } + +destructor TSpTBXSkinsList.Destroy; +begin + // Free all the skins options + while Count > 0 do + Delete(0); + inherited; +end; + +function TSpTBXSkinsList.AddSkin(SkinName: string; SkinClass: TSpTBXSkinOptionsClass): Integer; +var + K: TSpTBXSkinsListEntry; +begin + Result := -1; + if (SkinName <> '') and (IndexOf(SkinName) = -1) then begin + K := TSpTBXSkinsListEntry.Create; + try + K.SkinClass := SkinClass; + Result := AddObject(SkinName, K); // the list owns K + except + K.Free; + end; + end; +end; + +function TSpTBXSkinsList.AddSkin(SkinOptions: TStrings): Integer; +var + K: TSpTBXSkinsListEntry; + S: string; +begin + Result := -1; + K := TSpTBXSkinsListEntry.Create; + try + K.SkinStrings := TStringList.Create; + S := SkinOptions.Values['Name ']; + if S = '' then + S := SkinOptions.Values['Name']; + S := Trim(S); + if (S <> '') and (IndexOf(S) = -1) then begin + K.SkinStrings.Assign(SkinOptions); + Result := AddObject(S, K); // the list owns K + end + else + K.Free; + except + K.Free; + end; +end; + +function TSpTBXSkinsList.AddSkinFromFile(Filename: WideString): Integer; +var + L: TStringList; +begin + L := TStringList.Create; + try + L.LoadFromFile(Filename); + Result := AddSkin(L); + finally + L.Free; + end; +end; + +procedure TSpTBXSkinsList.AddSkinsFromFolder(Folder: WideString); +var + L: TStringList; + I: Integer; + S: string; +begin + L := TStringList.Create; + try + if SpGetDirectories(Folder, L) then begin + for I := 0 to L.Count - 1 do begin + S := IncludeTrailingPathDelimiter(Folder) + L[I] + '\Skin.ini'; + if FileExists(S) then + AddSkinFromFile(S); + end; + end; + finally + L.Free; + end; +end; + +procedure TSpTBXSkinsList.Delete(Index: Integer); +begin + if (Index > -1) and (Index < Count) then + SkinOptions[Index].Free; + inherited Delete(Index); +end; + +procedure TSpTBXSkinsList.GetSkinNames(SkinNames: TStrings); +var + I: Integer; +begin + SkinNames.BeginUpdate; + try + SkinNames.Clear; + SkinNames.Add('Default'); + for I := 0 to Count - 1 do + SkinNames.Add(Strings[I]); + finally + SkinNames.EndUpdate; + end; +end; + +function TSpTBXSkinsList.GetSkinOption(Index: Integer): TSpTBXSkinsListEntry; +begin + Result := TSpTBXSkinsListEntry(Objects[Index]); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSkinManager } + +constructor TSpTBXSkinManager.Create; +begin + FNotifies := TList.Create; + FCurrentSkin := TSpTBXSkinOptions.Create; + FSkinsList := TSpTBXSkinsList.Create; +end; + +destructor TSpTBXSkinManager.Destroy; +begin + FreeAndNil(FNotifies); + FreeAndNil(FCurrentSkin); + FreeAndNil(FSkinsList); + inherited; +end; + +procedure TSpTBXSkinManager.AddSkinNotification(AObject: TObject); +begin + if FNotifies.IndexOf(AObject) < 0 then FNotifies.Add(AObject); +end; + +procedure TSpTBXSkinManager.RemoveSkinNotification(AObject: TObject); +begin + FNotifies.Remove(AObject); +end; + +procedure TSpTBXSkinManager.Broadcast; +var + Msg: TMessage; + I: Integer; +begin + if FNotifies.Count > 0 then begin + Msg.Msg := WM_SPSKINCHANGE; + Msg.WParam := 0; + Msg.LParam := 0; + Msg.Result := 0; + for I := 0 to FNotifies.Count - 1 do + TObject(FNotifies[I]).Dispatch(Msg); + end; + if Assigned(FOnSkinChange) then FOnSkinChange(Self); +end; + +procedure TSpTBXSkinManager.BroadcastSkinNotification; +begin + Broadcast; +end; + +procedure TSpTBXSkinManager.LoadFromFile(Filename: WideString); +begin + FCurrentSkin.LoadFromFile(Filename); +end; + +procedure TSpTBXSkinManager.SaveToFile(Filename: WideString); +begin + FCurrentSkin.SaveToFile(Filename); +end; + +function TSpTBXSkinManager.GetCurrentSkinName: string; +begin + Result := FCurrentSkin.SkinName; +end; + +function TSpTBXSkinManager.GetSkinType: TSpTBXSkinType; +begin + Result := SpTBXSkinType(sknSkin); +end; + +function TSpTBXSkinManager.IsDefaultSkin: Boolean; +begin + Result := CurrentSkinName = 'Default'; +end; + +function TSpTBXSkinManager.IsXPThemesEnabled: Boolean; +begin + Result := ThemeServices.ThemesAvailable and UxTheme.UseThemes; +end; + +procedure TSpTBXSkinManager.SetSkin(SkinName: string); +var + I: Integer; + K: TSpTBXSkinsListEntry; +begin + if not SameText(SkinName, CurrentSkinName) then + if SameText(SkinName, 'Default') then + SetToDefaultSkin + else begin + I := FSkinsList.IndexOf(SkinName); + if I > -1 then begin + K := FSkinsList.SkinOptions[I]; + if Assigned(K.SkinClass) then begin + FCurrentSkin.Free; + FCurrentSkin := K.SkinClass.Create; + Broadcast; + end + else + if Assigned(K.SkinStrings) then begin + FCurrentSkin.Free; + FCurrentSkin := TSpTBXSkinOptions.Create; + FCurrentSkin.LoadFromStrings(K.SkinStrings); + end; + end; + end; +end; + +procedure TSpTBXSkinManager.SetToDefaultSkin; +begin + FCurrentSkin.Free; + FCurrentSkin := TSpTBXSkinOptions.Create; + Broadcast; +end; + +procedure TSpTBXSkinManager.ChangeControlSkinType(Control: TWinControl; + SkinType: TSpTBXSkinType; Recursive: Boolean = True); + + procedure ChangeSkinTypeProperty(Component: TComponent; TM: TSpTBXSkinType); + var + S: string; + PropInfo: PPropInfo; + begin + if Length(Component.ClassName) > 6 then begin + S := Copy(Component.ClassName, 1, 6); + if SameText(S, 'TSpTBX') then begin + PropInfo := GetPropInfo(Component, 'SkinType'); + if (PropInfo <> nil) and (PropInfo.PropType^.Kind = tkEnumeration) then + SetOrdProp(Component, PropInfo, Integer(TM)); + end; + end; + end; + +var + I: Integer; + C: TControl; +begin + for I := 0 to Control.ControlCount - 1 do begin + C := Control.Controls[I]; + ChangeSkinTypeProperty(C, SkinType); + if Recursive and (C is TWinControl) then + ChangeControlSkinType(C as TWinControl, SkinType, Recursive); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSkinSwitcher } + +constructor TSpTBXSkinSwitcher.Create(AOwner: TComponent); +begin + inherited; + SkinManager.AddSkinNotification(Self); +end; + +destructor TSpTBXSkinSwitcher.Destroy; +begin + SkinManager.RemoveSkinNotification(Self); + inherited; +end; + +function TSpTBXSkinSwitcher.GetSkin: string; +begin + Result := SkinManager.CurrentSkinName; +end; + +procedure TSpTBXSkinSwitcher.SetSkin(const Value: string); +begin + SkinManager.SetSkin(Value); +end; + +procedure TSpTBXSkinSwitcher.WMSpSkinChange(var Message: TMessage); +begin + if Assigned(FOnSkinChange) then FOnSkinChange(Self); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Stock Objects } + +procedure InitializeStock; +begin + StockBitmap := TBitmap.Create; + StockBitmap.Width := 8; + StockBitmap.Height := 8; + + @SpPrintWindow := GetProcAddress(GetModuleHandle(user32), 'PrintWindow'); + + if not Assigned(FInternalSkinManager) then + FInternalSkinManager := TSpTBXSkinManager.Create; +end; + +procedure FinalizeStock; +begin + FreeAndNil(StockBitmap); + FreeAndNil(FInternalSkinManager); +end; + +initialization + InitializeStock; + +finalization + FinalizeStock; + +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXTabs.dcu b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXTabs.dcu new file mode 100644 index 0000000000000000000000000000000000000000..654aec863417aeb568776f46c3ff4b70f541e272 GIT binary patch literal 119162 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 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXTabs.hpp b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXTabs.hpp new file mode 100644 index 0000000..dd8925d --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXTabs.hpp @@ -0,0 +1,600 @@ +// CodeGear C++Builder +// Copyright (c) 1995, 2008 by CodeGear +// All rights reserved + +// (DO NOT EDIT: machine generated header) 'Sptbxtabs.pas' rev: 20.00 + +#ifndef SptbxtabsHPP +#define SptbxtabsHPP + +#pragma delphiheader begin +#pragma option push +#pragma option -w- // All warnings off +#pragma option -Vx // Zero-length empty class member functions +#pragma pack(push,8) +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit + +//-- user supplied ----------------------------------------------------------- + +namespace Sptbxtabs +{ +//-- type declarations ------------------------------------------------------- +#pragma option push -b- +enum TSpTBXTabEdge { tedNone, tedLeft, tedRight }; +#pragma option pop + +#pragma option push -b- +enum TSpTBXTabPosition { ttpTop, ttpBottom }; +#pragma option pop + +#pragma option push -b- +enum TSpTBXTabCloseButton { tcbNone, tcbActive, tcbAll }; +#pragma option pop + +typedef void __fastcall (__closure *TSpTBXTabChangeEvent)(System::TObject* Sender, int TabIndex); + +typedef void __fastcall (__closure *TSpTBXTabChangingEvent)(System::TObject* Sender, int TabIndex, int NewTabIndex, bool &Allow); + +typedef void __fastcall (__closure *TSpTBXTabClosingEvent)(System::TObject* Sender, bool &Allow, bool &CloseAndFree); + +class DELPHICLASS TSpTBXTabItemDragObject; +class PASCALIMPLEMENTATION TSpTBXTabItemDragObject : public Sptbxitem::TSpTBXCustomDragObject +{ + typedef Sptbxitem::TSpTBXCustomDragObject inherited; + +public: + __fastcall virtual TSpTBXTabItemDragObject(Controls::TControl* ASourceControl, Tb2item::TTBCustomItem* AItem); +public: + /* TObject.Destroy */ inline __fastcall virtual ~TSpTBXTabItemDragObject(void) { } + +}; + + +class DELPHICLASS TSpTBXTabItem; +class DELPHICLASS TSpTBXTabToolbar; +class PASCALIMPLEMENTATION TSpTBXTabItem : public Sptbxitem::TSpTBXCustomItem +{ + typedef Sptbxitem::TSpTBXCustomItem inherited; + +private: + Sptbxskins::TSpTBXSkinType FSkinType; + Sptbxitem::TSpTBXDrawImageEvent FOnDrawTabCloseButton; + Classes::TNotifyEvent FOnTabClose; + TSpTBXTabClosingEvent FOnTabClosing; + Graphics::TColor __fastcall GetTabColor(void); + Sptbxskins::TSpTBXSkinType __fastcall GetSkinType(void); + void __fastcall SetSkinType(const Sptbxskins::TSpTBXSkinType Value); + +protected: + virtual bool __fastcall DialogChar(System::Word CharCode); + virtual void __fastcall DoDrawTabCloseButton(Graphics::TCanvas* ACanvas, Sptbxskins::TSpTBXSkinStatesType State, const Sptbxitem::TSpTBXPaintStage PaintStage, Imglist::TCustomImageList* AImageList, int &AImageIndex, Types::TRect &ARect, bool &PaintDefault); + virtual void __fastcall DoTabClose(void); + virtual void __fastcall DoTabClosing(bool &Allow, bool &CloseAndFree); + virtual Tb2item::TTBItemViewerClass __fastcall GetItemViewerClass(Tb2item::TTBView* AView); + bool __fastcall GetTabToolbar(/* out */ TSpTBXTabToolbar* &TabToolbar); + virtual void __fastcall ToggleControl(void); + __property Control; + __property Graphics::TColor TabColor = {read=GetTabColor, nodefault}; + +public: + __fastcall virtual TSpTBXTabItem(Classes::TComponent* AOwner); + virtual void __fastcall Click(void); + void __fastcall TabClose(void); + TSpTBXTabItem* __fastcall GetNextTab(bool GoForward, Sptbxitem::TSpTBXSearchItemViewerType SearchType); + bool __fastcall IsFirstVisible(void); + bool __fastcall IsFirstVisibleTab(void); + bool __fastcall IsLastVisibleTab(void); + +__published: + __property Action; + __property Checked = {default=0}; + __property Enabled = {default=1}; + __property HelpContext = {default=0}; + __property ImageIndex = {default=-1}; + __property Images; + __property InheritOptions = {default=1}; + __property MaskOptions = {default=0}; + __property Options = {default=0}; + __property ShortCut = {default=0}; + __property Visible = {default=1}; + __property OnClick; + __property OnSelect; + __property Alignment = {default=2}; + __property CustomWidth = {default=-1}; + __property CustomHeight = {default=-1}; + __property Margins = {default=4}; + __property MinHeight = {default=0}; + __property MinWidth = {default=0}; + __property FontSettings; + __property Wrapping = {default=1}; + __property OnDrawImage; + __property OnDrawItem; + __property OnDrawHint; + __property OnDrawCaption; + __property Sptbxskins::TSpTBXSkinType SkinType = {read=GetSkinType, write=SetSkinType, default=2}; + __property Sptbxitem::TSpTBXDrawImageEvent OnDrawTabCloseButton = {read=FOnDrawTabCloseButton, write=FOnDrawTabCloseButton}; + __property Classes::TNotifyEvent OnTabClose = {read=FOnTabClose, write=FOnTabClose}; + __property TSpTBXTabClosingEvent OnTabClosing = {read=FOnTabClosing, write=FOnTabClosing}; +public: + /* TSpTBXCustomItem.Destroy */ inline __fastcall virtual ~TSpTBXTabItem(void) { } + +}; + + +class DELPHICLASS TSpTBXTabItemViewer; +class PASCALIMPLEMENTATION TSpTBXTabItemViewer : public Sptbxitem::TSpTBXItemViewer +{ + typedef Sptbxitem::TSpTBXItemViewer inherited; + +private: + Sptbxskins::TSpTBXSkinStatesType FTabCloseButtonState; + Types::TRect __fastcall CorrectTabRect(const Types::TRect &ARect); + HIDESBASE TSpTBXTabItem* __fastcall GetItem(void); + void __fastcall GetTabCloseButtonImgList(Imglist::TCustomImageList* &AImageList, int &AImageIndex); + bool __fastcall IsTabCloseButtonVisible(void); + TSpTBXTabPosition __fastcall GetTabPosition(void); + +protected: + virtual void __fastcall CalcSize(const Graphics::TCanvas* Canvas, int &AWidth, int &AHeight); + virtual void __fastcall DoDrawButton(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxskins::TSpTBXMenuItemInfo &ItemInfo, const Sptbxitem::TSpTBXPaintStage PaintStage, bool &PaintDefault); + virtual void __fastcall DoDrawCaption(Graphics::TCanvas* ACanvas, const Types::TRect &ClientAreaRect, Sptbxskins::TSpTBXSkinStatesType State, System::WideString &ACaption, Types::TRect &CaptionRect, unsigned &CaptionFormat, bool IsTextRotated, const Sptbxitem::TSpTBXPaintStage PaintStage, bool &PaintDefault); + virtual void __fastcall DoDrawImage(Graphics::TCanvas* ACanvas, Sptbxskins::TSpTBXSkinStatesType State, const Sptbxitem::TSpTBXPaintStage PaintStage, Imglist::TCustomImageList* &AImageList, int &AImageIndex, Types::TRect &ARect, bool &PaintDefault); + virtual void __fastcall DoDrawTabCloseButton(Graphics::TCanvas* ACanvas, Sptbxskins::TSpTBXSkinStatesType State, const Sptbxitem::TSpTBXPaintStage PaintStage, Imglist::TCustomImageList* &AImageList, int &AImageIndex, Types::TRect &ARect, bool &PaintDefault); + void __fastcall DrawBottomBorder(Graphics::TCanvas* ACanvas, const Types::TRect &ARect); + virtual void __fastcall DrawTab(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool AEnabled, bool AChecked, bool AHoverItem, TSpTBXTabPosition Position, bool ASeparator = false, TSpTBXTabEdge AEdge = (TSpTBXTabEdge)(0x0)); + virtual void __fastcall DrawItemRightImage(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxskins::TSpTBXMenuItemInfo &ItemInfo); + virtual tagSIZE __fastcall GetRightImageSize(); + Types::TRect __fastcall GetRightImageRect(); + virtual Graphics::TColor __fastcall GetTextColor(Sptbxskins::TSpTBXSkinStatesType State); + virtual void __fastcall InternalMouseMove(Classes::TShiftState Shift, int X, int Y); + virtual void __fastcall Leaving(void); + +public: + bool __fastcall IsOnTabToolbar(void); + __property TSpTBXTabItem* Item = {read=GetItem}; + __property Sptbxskins::TSpTBXSkinStatesType TabCloseButtonState = {read=FTabCloseButtonState, nodefault}; + __property TSpTBXTabPosition TabPosition = {read=GetTabPosition, nodefault}; +public: + /* TTBItemViewer.Create */ inline __fastcall virtual TSpTBXTabItemViewer(Tb2item::TTBView* AView, Tb2item::TTBCustomItem* AItem, int AGroupLevel) : Sptbxitem::TSpTBXItemViewer(AView, AItem, AGroupLevel) { } + /* TTBItemViewer.Destroy */ inline __fastcall virtual ~TSpTBXTabItemViewer(void) { } + +}; + + +class DELPHICLASS TSpTBXCustomTabSet; +class PASCALIMPLEMENTATION TSpTBXTabToolbar : public Sptbxitem::TSpTBXToolbar +{ + typedef Sptbxitem::TSpTBXToolbar inherited; + +private: + Sptbxskins::TSpTBXSkinType FSkinType; + int FUpdateHidden; + bool FTabAutofit; + int FTabAutofitMaxSize; + int FTabCloseButtonImageIndex; + TSpTBXTabCloseButton FTabCloseButton; + bool FTabDragReorder; + bool FTabBackgroundBorders; + Graphics::TColor FTabColor; + int FTabMaxSize; + TSpTBXTabPosition FTabPosition; + void __fastcall Scroll(bool ToRight); + TSpTBXTabItem* __fastcall GetActiveTab(void); + void __fastcall SetActiveTabIndex(int Value); + void __fastcall SetSkinType(const Sptbxskins::TSpTBXSkinType Value); + void __fastcall SetTabCloseButton(const TSpTBXTabCloseButton Value); + void __fastcall SetTabCloseButtonImageIndex(const int Value); + void __fastcall SetTabAutofit(const bool Value); + void __fastcall SetTabAutofitMaxSize(const int Value); + void __fastcall SetTabBackgroundBorders(const bool Value); + void __fastcall SetTabColor(const Graphics::TColor Value); + void __fastcall SetTabMaxSize(const int Value); + void __fastcall SetTabPosition(const TSpTBXTabPosition Value); + HIDESBASE MESSAGE void __fastcall CMDesignHitTest(Messages::TWMMouse &Message); + +protected: + Sptbxitem::TSpTBXItemCacheCollection* FHiddenTabs; + int FActiveTabIndex; + TSpTBXCustomTabSet* FOwnerTabControl; + void __fastcall Autofit(void); + virtual Graphics::TColor __fastcall GetItemsTextColor(Sptbxskins::TSpTBXSkinStatesType State); + virtual void __fastcall InternalDrawBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool PaintOnNCArea, bool PaintBorders = true); + virtual void __fastcall DoItemNotification(Tb2item::TTBCustomItem* Ancestor, bool Relayed, Tb2item::TTBItemChangedAction Action, int Index, Tb2item::TTBCustomItem* Item); + virtual void __fastcall RightAlignItems(void); + virtual bool __fastcall CanDragCustomize(Controls::TMouseButton Button, Classes::TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall DoStartDrag(Controls::TDragObject* &DragObject); + DYNAMIC void __fastcall DragOver(System::TObject* Source, int X, int Y, Controls::TDragState State, bool &Accept); + +public: + __fastcall virtual TSpTBXTabToolbar(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXTabToolbar(void); + void __fastcall BeginUpdateHidden(void); + void __fastcall EndUpdateHidden(void); + int __fastcall GetTabsCount(bool VisibleOnly); + void __fastcall InvalidateActiveTab(void); + void __fastcall InvalidateNC(void); + void __fastcall MakeVisible(TSpTBXTabItem* ATab); + void __fastcall ScrollLeft(void); + void __fastcall ScrollRight(void); + void __fastcall ScrollState(/* out */ bool &CanScrollToLeft, /* out */ bool &CanScrollToRight); + void __fastcall TabClose(TSpTBXTabItem* ATab); + +__published: + __property TSpTBXTabItem* ActiveTab = {read=GetActiveTab}; + __property int ActiveTabIndex = {read=FActiveTabIndex, write=SetActiveTabIndex, nodefault}; + __property TSpTBXTabCloseButton TabCloseButton = {read=FTabCloseButton, write=SetTabCloseButton, default=0}; + __property int TabCloseButtonImageIndex = {read=FTabCloseButtonImageIndex, write=SetTabCloseButtonImageIndex, default=-1}; + __property bool TabBackgroundBorders = {read=FTabBackgroundBorders, write=SetTabBackgroundBorders, nodefault}; + __property bool TabAutofit = {read=FTabAutofit, write=SetTabAutofit, default=0}; + __property int TabAutofitMaxSize = {read=FTabAutofitMaxSize, write=SetTabAutofitMaxSize, default=200}; + __property Graphics::TColor TabColor = {read=FTabColor, write=SetTabColor, default=-16777201}; + __property int TabMaxSize = {read=FTabMaxSize, write=SetTabMaxSize, default=-1}; + __property TSpTBXTabPosition TabPosition = {read=FTabPosition, write=SetTabPosition, default=0}; + __property bool TabDragReorder = {read=FTabDragReorder, write=FTabDragReorder, default=0}; + __property Sptbxskins::TSpTBXSkinType SkinType = {read=FSkinType, write=SetSkinType, default=2}; +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXTabToolbar(HWND ParentWindow) : Sptbxitem::TSpTBXToolbar(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXTabSheet; +class DELPHICLASS TSpTBXCustomTabControl; +class PASCALIMPLEMENTATION TSpTBXTabSheet : public Controls::TCustomControl +{ + typedef Controls::TCustomControl inherited; + +private: + TSpTBXCustomTabControl* FTabControl; + TSpTBXTabItem* FItem; + System::UnicodeString FItemName; + Controls::TWinControl* FPrevFocused; + void __fastcall ReadItemName(Classes::TReader* Reader); + void __fastcall WriteItemName(Classes::TWriter* Writer); + System::WideString __fastcall GetCaption(); + bool __fastcall GetTabVisible(void); + void __fastcall SetCaption(const System::WideString Value); + void __fastcall SetTabVisible(const bool Value); + int __fastcall GetImageIndex(void); + void __fastcall SetImageIndex(const int Value); + HIDESBASE MESSAGE void __fastcall CMVisiblechanged(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall WMEraseBkgnd(Messages::TWMEraseBkgnd &Message); + HIDESBASE MESSAGE void __fastcall WMWindowPosChanged(Messages::TWMWindowPosMsg &Message); + +protected: + virtual void __fastcall CreateParams(Controls::TCreateParams &Params); + virtual void __fastcall AdjustClientRect(Types::TRect &Rect); + virtual void __fastcall DefineProperties(Classes::TFiler* Filer); + virtual void __fastcall Notification(Classes::TComponent* AComponent, Classes::TOperation Operation); + virtual void __fastcall ReadState(Classes::TReader* Reader); + DYNAMIC void __fastcall VisibleChanging(void); + __property Align = {default=5}; + __property Controls::TWinControl* PrevFocused = {read=FPrevFocused}; + +public: + __fastcall virtual TSpTBXTabSheet(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXTabSheet(void); + __property TSpTBXTabItem* Item = {read=FItem, write=FItem}; + __property TSpTBXCustomTabControl* TabControl = {read=FTabControl, write=FTabControl}; + +__published: + __property PopupMenu; + __property System::WideString Caption = {read=GetCaption, write=SetCaption}; + __property int ImageIndex = {read=GetImageIndex, write=SetImageIndex, nodefault}; + __property bool TabVisible = {read=GetTabVisible, write=SetTabVisible, default=1}; +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXTabSheet(HWND ParentWindow) : Controls::TCustomControl(ParentWindow) { } + +}; + + +class PASCALIMPLEMENTATION TSpTBXCustomTabSet : public Sptbxitem::TSpTBXCompoundItemsControl +{ + typedef Sptbxitem::TSpTBXCompoundItemsControl inherited; + +private: + int FItemMoveCount; + TSpTBXTabItem* FItemMoved; + bool FTabVisible; + int FLoadingActiveIndex; + bool FUpdatingIndex; + bool FResizing; + Sptbxitem::TSpTBXDrawEvent FOnDrawBackground; + TSpTBXTabChangeEvent FOnActiveTabChange; + TSpTBXTabChangingEvent FOnActiveTabChanging; + TSpTBXTabChangeEvent FOnActiveTabReorder; + TSpTBXTabChangingEvent FOnActiveTabReordering; + void __fastcall ReadHiddenItems(Classes::TReader* Reader); + void __fastcall WriteHiddenItems(Classes::TWriter* Writer); + int __fastcall GetActiveTabIndex(void); + void __fastcall SetActiveTabIndex(int Value); + Sptbxskins::TSpTBXSkinType __fastcall GetSkinType(void); + HIDESBASE void __fastcall SetSkinType(const Sptbxskins::TSpTBXSkinType Value); + bool __fastcall GetTabAutofit(void); + void __fastcall SetTabAutofit(const bool Value); + int __fastcall GetTabAutofitMaxSize(void); + void __fastcall SetTabAutofitMaxSize(const int Value); + bool __fastcall GetTabBackgroundBorders(void); + void __fastcall SetTabBackgroundBorders(const bool Value); + Graphics::TColor __fastcall GetTabBackgroundColor(void); + void __fastcall SetTabBackgroundColor(const Graphics::TColor Value); + TSpTBXTabCloseButton __fastcall GetTabCloseButton(void); + void __fastcall SetTabCloseButton(const TSpTBXTabCloseButton Value); + int __fastcall GetTabCloseButtonImageIndex(void); + void __fastcall SetTabCloseButtonImageIndex(const int Value); + bool __fastcall GetTabDragReorder(void); + void __fastcall SetTabDragReorder(const bool Value); + int __fastcall GetTabMaxSize(void); + void __fastcall SetTabMaxSize(const int Value); + TSpTBXTabPosition __fastcall GetTabPosition(void); + void __fastcall SetTabPosition(const TSpTBXTabPosition Value); + void __fastcall SetTabVisible(const bool Value); + TSpTBXTabToolbar* __fastcall GetTabToolbar(void); + HIDESBASE MESSAGE void __fastcall CMColorchanged(Messages::TMessage &Message); + MESSAGE void __fastcall CMSpTBXControlsInvalidate(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall WMEraseBkgnd(Messages::TMessage &Message); + MESSAGE void __fastcall WMInvalidateTabBackground(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall WMWindowPosChanged(Messages::TWMWindowPosMsg &Message); + +protected: + Graphics::TBitmap* FBackground; + virtual void __fastcall DoDrawBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, const Sptbxitem::TSpTBXPaintStage PaintStage, bool &PaintDefault); + virtual bool __fastcall GetFullRepaint(void); + virtual bool __fastcall CanActiveTabChange(const int TabIndex, const int NewTabIndex); + virtual void __fastcall DoActiveTabChange(const int TabIndex); + virtual bool __fastcall CanActiveTabReorder(const int TabIndex, const int NewTabIndex); + virtual void __fastcall DoActiveTabReorder(const int TabIndex); + virtual void __fastcall ItemNotification(Tb2item::TTBCustomItem* Ancestor, bool Relayed, Tb2item::TTBItemChangedAction Action, int Index, Tb2item::TTBCustomItem* Item); + virtual void __fastcall TabInserted(TSpTBXTabItem* Item); + virtual void __fastcall TabDeleting(TSpTBXTabItem* Item, bool FreeTabSheet = true); + virtual void __fastcall DefineProperties(Classes::TFiler* Filer); + virtual Sptbxitem::TSpTBXToolbarClass __fastcall GetToolbarClass(void); + virtual void __fastcall Loaded(void); + __property Color = {default=-16777201}; + __property ParentColor = {default=0}; + __property int ActiveTabIndex = {read=GetActiveTabIndex, write=SetActiveTabIndex, nodefault}; + __property bool TabAutofit = {read=GetTabAutofit, write=SetTabAutofit, default=0}; + __property int TabAutofitMaxSize = {read=GetTabAutofitMaxSize, write=SetTabAutofitMaxSize, default=200}; + __property Graphics::TColor TabBackgroundColor = {read=GetTabBackgroundColor, write=SetTabBackgroundColor, default=536870911}; + __property bool TabBackgroundBorders = {read=GetTabBackgroundBorders, write=SetTabBackgroundBorders, default=0}; + __property TSpTBXTabCloseButton TabCloseButton = {read=GetTabCloseButton, write=SetTabCloseButton, default=0}; + __property int TabCloseButtonImageIndex = {read=GetTabCloseButtonImageIndex, write=SetTabCloseButtonImageIndex, default=-1}; + __property bool TabDragReorder = {read=GetTabDragReorder, write=SetTabDragReorder, default=0}; + __property int TabMaxSize = {read=GetTabMaxSize, write=SetTabMaxSize, default=-1}; + __property TSpTBXTabPosition TabPosition = {read=GetTabPosition, write=SetTabPosition, default=0}; + __property bool TabVisible = {read=FTabVisible, write=SetTabVisible, default=1}; + __property Sptbxskins::TSpTBXSkinType SkinType = {read=GetSkinType, write=SetSkinType, default=2}; + __property TSpTBXTabChangeEvent OnActiveTabChange = {read=FOnActiveTabChange, write=FOnActiveTabChange}; + __property TSpTBXTabChangingEvent OnActiveTabChanging = {read=FOnActiveTabChanging, write=FOnActiveTabChanging}; + __property TSpTBXTabChangeEvent OnActiveTabReorder = {read=FOnActiveTabReorder, write=FOnActiveTabReorder}; + __property TSpTBXTabChangingEvent OnActiveTabReordering = {read=FOnActiveTabReordering, write=FOnActiveTabReordering}; + __property Sptbxitem::TSpTBXDrawEvent OnDrawBackground = {read=FOnDrawBackground, write=FOnDrawBackground}; + +public: + __fastcall virtual TSpTBXCustomTabSet(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXCustomTabSet(void); + TSpTBXTabItem* __fastcall Add(System::WideString ACaption); + HIDESBASE TSpTBXTabItem* __fastcall Insert(int NewIndex, System::WideString ACaption); + bool __fastcall DrawBackground(HDC DC, const Types::TRect &ARect); + int __fastcall GetTabSetHeight(void); + virtual void __fastcall InvalidateBackground(bool InvalidateChildren = true); + void __fastcall MakeVisible(TSpTBXTabItem* ATab); + void __fastcall ScrollLeft(void); + void __fastcall ScrollRight(void); + void __fastcall ScrollState(/* out */ bool &Left, /* out */ bool &Right); + virtual void __fastcall TabClick(TSpTBXTabItem* ATab); + __property Canvas; + __property TSpTBXTabToolbar* Toolbar = {read=GetTabToolbar}; +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXCustomTabSet(HWND ParentWindow) : Sptbxitem::TSpTBXCompoundItemsControl(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXTabSet; +class PASCALIMPLEMENTATION TSpTBXTabSet : public TSpTBXCustomTabSet +{ + typedef TSpTBXCustomTabSet inherited; + +__published: + __property Align = {default=0}; + __property Anchors = {default=3}; + __property BiDiMode; + __property Color = {default=-16777201}; + __property Constraints; + __property DockSite = {default=0}; + __property DragCursor = {default=-12}; + __property DragKind = {default=0}; + __property DragMode = {default=0}; + __property Enabled = {default=1}; + __property Font; + __property ParentColor = {default=0}; + __property ParentBiDiMode = {default=1}; + __property ParentFont = {default=1}; + __property ParentShowHint = {default=1}; + __property PopupMenu; + __property ShowHint; + __property Visible = {default=1}; + __property OnCanResize; + __property OnContextPopup; + __property OnDockDrop; + __property OnDockOver; + __property OnDragDrop; + __property OnDragOver; + __property OnEndDock; + __property OnEndDrag; + __property OnEnter; + __property OnExit; + __property OnGetSiteInfo; + __property OnMouseDown; + __property OnMouseMove; + __property OnMouseUp; + __property OnResize; + __property OnStartDock; + __property OnStartDrag; + __property OnUnDock; + __property ActiveTabIndex; + __property Images; + __property TabAutofit = {default=0}; + __property TabAutofitMaxSize = {default=200}; + __property TabBackgroundColor = {default=536870911}; + __property TabBackgroundBorders = {default=0}; + __property TabCloseButton = {default=0}; + __property TabCloseButtonImageIndex = {default=-1}; + __property TabDragReorder = {default=0}; + __property TabMaxSize = {default=-1}; + __property TabPosition = {default=0}; + __property TabVisible = {default=1}; + __property SkinType = {default=2}; + __property OnActiveTabChange; + __property OnActiveTabChanging; + __property OnActiveTabReorder; + __property OnActiveTabReordering; + __property OnDrawBackground; +public: + /* TSpTBXCustomTabSet.Create */ inline __fastcall virtual TSpTBXTabSet(Classes::TComponent* AOwner) : TSpTBXCustomTabSet(AOwner) { } + /* TSpTBXCustomTabSet.Destroy */ inline __fastcall virtual ~TSpTBXTabSet(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXTabSet(HWND ParentWindow) : TSpTBXCustomTabSet(ParentWindow) { } + +}; + + +class PASCALIMPLEMENTATION TSpTBXCustomTabControl : public TSpTBXCustomTabSet +{ + typedef TSpTBXCustomTabSet inherited; + +private: + TSpTBXTabSheet* FEmptyTabSheet; + void __fastcall RealignTabSheets(void); + TSpTBXTabSheet* __fastcall GetActivePage(void); + TSpTBXTabSheet* __fastcall GetPages(int Index); + int __fastcall GetPagesCount(void); + void __fastcall SetActivePage(const TSpTBXTabSheet* Value); + HIDESBASE MESSAGE void __fastcall CMSpTBXControlsInvalidate(Messages::TMessage &Message); + HIDESBASE MESSAGE void __fastcall WMSpSkinChange(Messages::TMessage &Message); + +protected: + Classes::TList* FPages; + virtual void __fastcall DoActiveTabChange(const int ItemIndex); + virtual bool __fastcall GetFullRepaint(void); + virtual void __fastcall TabInserted(TSpTBXTabItem* Item); + virtual void __fastcall TabDeleting(TSpTBXTabItem* Item, bool FreeTabSheet = true); + +public: + __fastcall virtual TSpTBXCustomTabControl(Classes::TComponent* AOwner); + __fastcall virtual ~TSpTBXCustomTabControl(void); + TSpTBXTabSheet* __fastcall GetPage(TSpTBXTabItem* Item); + __property TSpTBXTabSheet* ActivePage = {read=GetActivePage, write=SetActivePage}; + __property TSpTBXTabSheet* Pages[int Index] = {read=GetPages}; + __property int PagesCount = {read=GetPagesCount, nodefault}; +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXCustomTabControl(HWND ParentWindow) : TSpTBXCustomTabSet(ParentWindow) { } + +}; + + +class DELPHICLASS TSpTBXTabControl; +class PASCALIMPLEMENTATION TSpTBXTabControl : public TSpTBXCustomTabControl +{ + typedef TSpTBXCustomTabControl inherited; + +__published: + __property Align = {default=0}; + __property Anchors = {default=3}; + __property BiDiMode; + __property Color = {default=-16777201}; + __property Constraints; + __property DockSite = {default=0}; + __property DragCursor = {default=-12}; + __property DragKind = {default=0}; + __property DragMode = {default=0}; + __property Enabled = {default=1}; + __property Font; + __property ParentColor = {default=0}; + __property ParentBiDiMode = {default=1}; + __property ParentFont = {default=1}; + __property ParentShowHint = {default=1}; + __property PopupMenu; + __property ShowHint; + __property Visible = {default=1}; + __property OnCanResize; + __property OnContextPopup; + __property OnDockDrop; + __property OnDockOver; + __property OnDragDrop; + __property OnDragOver; + __property OnEndDock; + __property OnEndDrag; + __property OnEnter; + __property OnExit; + __property OnGetSiteInfo; + __property OnMouseDown; + __property OnMouseMove; + __property OnMouseUp; + __property OnResize; + __property OnStartDock; + __property OnStartDrag; + __property OnUnDock; + __property ActiveTabIndex; + __property Images; + __property TabAutofit = {default=0}; + __property TabAutofitMaxSize = {default=200}; + __property TabBackgroundColor = {default=536870911}; + __property TabBackgroundBorders = {default=0}; + __property TabCloseButton = {default=0}; + __property TabCloseButtonImageIndex = {default=-1}; + __property TabDragReorder = {default=0}; + __property TabMaxSize = {default=-1}; + __property TabPosition = {default=0}; + __property TabVisible = {default=1}; + __property SkinType = {default=2}; + __property OnActiveTabChange; + __property OnActiveTabChanging; + __property OnActiveTabReorder; + __property OnActiveTabReordering; + __property OnDrawBackground; +public: + /* TSpTBXCustomTabControl.Create */ inline __fastcall virtual TSpTBXTabControl(Classes::TComponent* AOwner) : TSpTBXCustomTabControl(AOwner) { } + /* TSpTBXCustomTabControl.Destroy */ inline __fastcall virtual ~TSpTBXTabControl(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TSpTBXTabControl(HWND ParentWindow) : TSpTBXCustomTabControl(ParentWindow) { } + +}; + + +//-- var, const, procedure --------------------------------------------------- +static const Word C_SpTBXTabGroupIndex = 0x1e61; +static const Word WM_INVALIDATETABBACKGROUND = 0x2261; +extern PACKAGE Tb2item::TTBItemViewer* __fastcall SpGetNextTabItemViewer(Tb2item::TTBView* View, Tb2item::TTBItemViewer* IV, bool GoForward, Sptbxitem::TSpTBXSearchItemViewerType SearchType); +extern PACKAGE void __fastcall SpDrawXPTab(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, bool Enabled, bool Checked, bool HotTrack, bool Focused, TSpTBXTabPosition Position, Sptbxskins::TSpTBXSkinType SkinType, TSpTBXTabEdge Edge = (TSpTBXTabEdge)(0x0)); +extern PACKAGE void __fastcall SpDrawXPTabControlBackground(Graphics::TCanvas* ACanvas, const Types::TRect &ARect, Graphics::TColor AColor, bool BottomTabs, Sptbxskins::TSpTBXSkinType SkinType); + +} /* namespace Sptbxtabs */ +using namespace Sptbxtabs; +#pragma pack(pop) +#pragma option pop + +#pragma delphiheader end. +//-- end unit ---------------------------------------------------------------- +#endif // SptbxtabsHPP diff --git a/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXTabs.pas b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXTabs.pas new file mode 100644 index 0000000..763836a --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/Source/SpTBXTabs.pas @@ -0,0 +1,3420 @@ +unit SpTBXTabs; + +{============================================================================== +Version 2.4.2 + +The contents of this file are subject to the SpTBXLib License; you may +not use or distribute this file except in compliance with the +SpTBXLib License. +A copy of the SpTBXLib License may be found in SpTBXLib-LICENSE.txt or at: + http://www.silverpointdevelopment.com/sptbxlib/SpTBXLib-LICENSE.htm + +Alternatively, the contents of this file may be used under the terms of the +Mozilla Public License Version 1.1 (the "MPL v1.1"), in which case the provisions +of the MPL v1.1 are applicable instead of those in the SpTBXLib License. +A copy of the MPL v1.1 may be found in MPL-LICENSE.txt or at: + http://www.mozilla.org/MPL/ + +If you wish to allow use of your version of this file only under the terms of +the MPL v1.1 and not to allow others to use your version of this file under the +SpTBXLib License, indicate your decision by deleting the provisions +above and replace them with the notice and other provisions required by the +MPL v1.1. If you do not delete the provisions above, a recipient may use your +version of this file under either the SpTBXLib License or the MPL v1.1. + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for +the specific language governing rights and limitations under the License. + +The initial developer of this code is Robert Lee. + +Requirements: +For Delphi/C++Builder 2009 or newer: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org +For Delphi/C++Builder 7-2007: + - Jordan Russell's Toolbar 2000 + http://www.jrsoftware.org + - Troy Wolbrink's TNT Unicode Controls + http://www.tntware.com/delphicontrols/unicode/ + +Development Notes: + - All the theme changes and adjustments are marked with '[Theme-Change]'. + - When an item is hidden the ItemViewer.BoundsRect property is invalid. + - tbicDeleting item notification is fired after the ItemViewer of the + Item is destroyed by TTBView, but the Items array still has the Item. + +TODO: + - Tabbed docking + +History: +8 May 2009 - version 2.4.2 + - Fixed incorrect TabControl behavior, when deleting + the tabs the ActiveTabIndex is incorrectly set if + there are regular Items on the control, thanks to + Jonah for reporting this. + +15 March 2009 - version 2.4.1 + - No changes. + +17 January 2009 - version 2.4 + - No changes. + +26 September 2008 - version 2.3 + - No changes. + +29 July 2008 - version 2.2 + - No changes. + +26 June 2008 - version 2.1 + - No changes. + +3 May 2008 - version 2.0 + - Fixed incorrect close button painting on tab items, + thanks to Miha for reporting this. + +2 April 2008 - version 1.9.5 + - Fixed incorrect TabControl behavior, when deleting the + only visible Tab all the auto-hidden tabs will not + be showed on resize, thanks to Jim for reporting this. + +3 February 2008 - version 1.9.4 + - Fixed AV on TabControl when scrolling tabs, thanks + to Beta Xiong and Yucel Yavuz for reporting this. + - Fixed incorrect TabControl.ScrollState behavior + thanks to Michele for reporting this. + +19 January 2008 - version 1.9.3 + - Fixed recursion on TSpTBXTabToolbar.RightAlignItems, + thanks to Jim for reporting this. + +26 December 2007 - version 1.9.2 + - Minor bug fixes. + +1 December 2007 - version 1.9.1 + - Added OnTabClosing event to TSpTBXTabItem. + - Fixed incorrect tab items painting when TabPosition was + ttpBottom, thanks to Marko Savolainen for reporting this. + +20 November 2007 - version 1.9 + - Added TabBackgroundBorders property to TSpTBXTabSet and + TSpTBXTabControl, when set to true the tabs area is + painted with borders. + - Added TabCloseButton and TabCloseButtonImageIndex properties + to SpTBXTabSet and TSpTBXTabControl to control the close + button visibility on the tab items. + - Added TabMaxSize property to SpTBXTabSet and TSpTBXTabControl + to control the maximum size of the tab items. + - Improved tab scrolling, thanks to Kevin Lu for + reporting this. + +8 February 2007 - version 1.8.3 + - Added accel char handling to TSpTBXTabSet and TSpTBXTabControl + +17 December 2006 - version 1.8.2 + - No changes. + +24 November 2006 - version 1.8.1 + - Fixed incorrect Tab painting when the Default theme was used + and the ThemeType was tttFlat. + +27 August 2006 - version 1.8 + - Fixed incorrect OnActiveTabChanging handling when + ActiveTabIndex is changed on this event, thanks to + Serg Chechenin for reporting this. + +15 June 2006 - version 1.7 + - Fixed incorrect Tab painting when the default theme was used, + the captions were painted in a pushed state, thanks to + Mikalai Arapau for reporting this. + - Fixed incorrect Tab aligning when Autofit was used and the + tab control was parented by a Frame, thanks to + Henk van Kampen for reporting this. + +12 April 2006 - version 1.5 + - Fixed incorrect Tab painting when TabAutofit was true. + +27 February 2006 - version 1.4 + - Fixed flicker when reordering TSpTBXTabSet and TSpTBXTabControl + tabs, thanks to Alexey Naumov for reporting this. + - Fixed incorrect context menu handling in TSpTBXTabSet and + TSpTBXTabControl, thanks to Boris Yankov for reporting this. + - Added OnActiveTabReorder event to TSpTBXTabSet and TSpTBXTabControl. + +10 February 2006 - version 1.3 + - Added TabDragReorder property to TSpTBXTabSet and TSpTBXTabControl, + when this property is true it allows tabs reordering with + drag and drop. + - Added TabAutofit and TabAutofitMaxSize properties to TSpTBXTabSet + and TSpTBXTabControl. When TabAutofit is true the tabs are resized + to fit the tabset. + +28 December 2005 - version 1.2 + - Fixed incorrect TSpTBXTabControl background painting on some themes. + - Fixed incorrect OnActiveTabChange call when the component is being + loaded, thanks to Leroy Casterline for reporting this. + - Fixed incorrect tab scrolling when an item is deleted, thanks to + Daniel Rikowski for reporting this. + +18 October 2005 - version 1.1 + - Fixed incorrect TSpTBXTabItem painting on some themes. + - Added Margins property to TSpTBXPageControl. + +18 August 2005 - version 1.0 + - Added TabVisible property to TSpTBXTabSet and TSpTBXPageControl. + - Added OnActiveTabChanging event to TSpTBXTabSet and TSpTBXPageControl. + +10 June 2005 - version 0.9 + - SpTBXLib may now alternatively, at your option, be used and/or + distributed under the terms of the SpTBXLib License. + Please see the updated LICENSE.TXT file for more information. + - Fixed AV in TSpTBXTabSet and TSpTBXPageControl when used in a Frame + with TabPosition setted to dpBottom, thanks to Cyril Velter for the fix. + +20 May 2005 - version 0.8 + - Fixed tab scrolling of TSpTBXTabSet and TSpTBXPageControl, the tabs + were not allowed to scroll when one single tab was visible, thanks + to Anders Olsson for the fix. + - Added MakeVisible method to the TSpTBXTabSet and TSpTBXPageControl, + it scrolls the tabset, if necessary, to ensure a Tab is in view. + +16 February 2005 - version 0.7 + - No changes. + +23 December 2004 - version 0.6 + - Fixed TSpTBXTabControl reordering bug. + - Changed the order of the TSpTBXTabThemeType enumerated type. + - Added ActivePage property to the TSpTBXTabControl. + - Added Caption, ImageIndex, TabVisible and PopupMenu properties + to TSpTBXTabControl. + +30 August 2004 - version 0.5 + - No changes. + +21 July 2004 - version 0.4 + - Fixed TSpTBXTabControl design time bug, it was allowing to drop + components when ActiveTabIndex = -1 + - Fixed TSpTBXTabSet and TSpTBXTabControl design time bug, the + hidden items were not streamed to the DFM. + - Changed TSpTBXTabControl.OnTabClick event for OnActiveTabChange. + - Added GetPage method to TSpTBXTabControl to get the TSpTBXTabSheet + linked to a TSpTBXTabItem. + +12 July 2004 - version 0.3.1 + - Fixed nasty AV when setting TBXSwitcher.EnableXPStyles to false, + thanks to Alfred for reporting this. + Note: TBXThemeManager unloads the theme library and the theme + parts when some conditions are met, we must handle extra theme + parts outside TBXThemeManager space. + - Fixed incorrect TSpTBXTabSet.ActiveTabIndex property update at + design time. + - Fixed incorrect TSpTBXTabSet painting on some TBX themes, thanks + to Tim for reporting this. + +9 July 2004 - version 0.3 + - Fixed design time AVs when moving or deleting TabSheets. + - Published ThemeType and TabPosition properties for TSpTBXTabItem. + - New component added, TSpTBXTabSet, a fully customizable TabSet + with unicode and toolbar items support. + +28 June 2004 - version 0.2 + - No changes. + +22 June 2004 - version 0.1 + - Initial release. + +==============================================================================} + +interface + +{$BOOLEVAL OFF} // Unit depends on short-circuit boolean evaluation + +uses + Windows, Messages, Classes, SysUtils, Controls, Graphics, ImgList, Forms, + Dialogs, ExtCtrls, TB2Item, TB2Dock, TB2Toolbar, + SpTBXSkins, SpTBXItem, SpTBXControls; + +const + C_SpTBXTabGroupIndex = 7777; + WM_INVALIDATETABBACKGROUND = WM_USER + 7777; + +type + TSpTBXTabEdge = ( + tedNone, // No edge needed + tedLeft, // Left edge of the tab + tedRight // Right edge of the tab + ); + + TSpTBXTabPosition = ( + ttpTop, // Top aligned tabset + ttpBottom // Bottom aligned tabset + ); + + TSpTBXTabCloseButton = ( + tcbNone, // No close button on tabs + tcbActive, // Close button only on active tab + tcbAll // Close button on all the tabs + ); + + TSpTBXTabChangeEvent = procedure(Sender: TObject; TabIndex: Integer) of object; + TSpTBXTabChangingEvent = procedure(Sender: TObject; TabIndex, NewTabIndex: Integer; var Allow: Boolean) of object; + TSpTBXTabClosingEvent = procedure(Sender: TObject; var Allow, CloseAndFree: Boolean) of object; + + TSpTBXTabToolbar = class; + TSpTBXCustomTabSet = class; + TSpTBXCustomTabControl = class; + TSpTBXTabSheet = class; + + TSpTBXTabItemDragObject = class(TSpTBXCustomDragObject) + public + constructor Create(ASourceControl: TControl; AItem: TTBCustomItem); override; + end; + + { TSpTBXTabItem } + + TSpTBXTabItem = class(TSpTBXCustomItem) + private + FSkinType: TSpTBXSkinType; + FOnDrawTabCloseButton: TSpTBXDrawImageEvent; + FOnTabClose: TNotifyEvent; + FOnTabClosing: TSpTBXTabClosingEvent; + function GetTabColor: TColor; + function GetSkinType: TSpTBXSkinType; + procedure SetSkinType(const Value: TSpTBXSkinType); + protected + function DialogChar(CharCode: Word): Boolean; override; + procedure DoDrawTabCloseButton(ACanvas: TCanvas; State: TSpTBXSkinStatesType; + const PaintStage: TSpTBXPaintStage; AImageList: TCustomImageList; + var AImageIndex: Integer; var ARect: TRect; var PaintDefault: Boolean); virtual; + procedure DoTabClose; virtual; + procedure DoTabClosing(var Allow, CloseAndFree: Boolean); virtual; + function GetItemViewerClass(AView: TTBView): TTBItemViewerClass; override; + function GetTabToolbar(out TabToolbar: TSpTBXTabToolbar): Boolean; + procedure ToggleControl; override; + property Control; // TabSheet + property TabColor: TColor read GetTabColor; + public + constructor Create(AOwner: TComponent); override; + procedure Click; override; + procedure TabClose; + function GetNextTab(GoForward: Boolean; SearchType: TSpTBXSearchItemViewerType): TSpTBXTabItem; + function IsFirstVisible: Boolean; + function IsFirstVisibleTab: Boolean; + function IsLastVisibleTab: Boolean; + published + property Action; + property Checked; + // Hide DisplayMode + // property DisplayMode default nbdmImageAndText; + property Enabled; + // Hide GroupIndex, all the TabItems must have the same GroupIndex + // property GroupIndex; + property HelpContext; + property ImageIndex; + property Images; + property InheritOptions; + property MaskOptions; + property Options; + property ShortCut; + property Visible; + property OnClick; + property OnSelect; + // TSpTBXCustomItem properties + property Alignment; + property CustomWidth; + property CustomHeight; + property Margins default 4; + property MinHeight; + property MinWidth; + property FontSettings; + property Wrapping default twEndEllipsis; + property OnDrawImage; + property OnDrawItem; + property OnDrawHint; + property OnDrawCaption; + // TSpTBXTabItem properties + property SkinType: TSpTBXSkinType read GetSkinType write SetSkinType default sknSkin; + property OnDrawTabCloseButton: TSpTBXDrawImageEvent read FOnDrawTabCloseButton write FOnDrawTabCloseButton; + property OnTabClose: TNotifyEvent read FOnTabClose write FOnTabClose; + property OnTabClosing: TSpTBXTabClosingEvent read FOnTabClosing write FOnTabClosing; + end; + + TSpTBXTabItemViewer = class(TSpTBXItemViewer) + private + FTabCloseButtonState: TSpTBXSkinStatesType; + function CorrectTabRect(ARect: TRect): TRect; + function GetItem: TSpTBXTabItem; + procedure GetTabCloseButtonImgList(var AImageList: TCustomImageList; var AImageIndex: Integer); + function IsTabCloseButtonVisible: Boolean; + function GetTabPosition: TSpTBXTabPosition; + protected + procedure CalcSize(const Canvas: TCanvas; var AWidth, AHeight: Integer); override; + procedure DoDrawButton(ACanvas: TCanvas; ARect: TRect; ItemInfo: TSpTBXMenuItemInfo; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); override; + procedure DoDrawCaption(ACanvas: TCanvas; ClientAreaRect: TRect; State: TSpTBXSkinStatesType; + var ACaption: WideString; var CaptionRect: TRect; var CaptionFormat: Cardinal; + IsTextRotated: Boolean; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); override; + procedure DoDrawImage(ACanvas: TCanvas; State: TSpTBXSkinStatesType; + const PaintStage: TSpTBXPaintStage; var AImageList: TCustomImageList; + var AImageIndex: Integer; var ARect: TRect; + var PaintDefault: Boolean); override; + procedure DoDrawTabCloseButton(ACanvas: TCanvas; State: TSpTBXSkinStatesType; + const PaintStage: TSpTBXPaintStage; var AImageList: TCustomImageList; + var AImageIndex: Integer; var ARect: TRect; var PaintDefault: Boolean); virtual; + procedure DrawBottomBorder(ACanvas: TCanvas; ARect: TRect); + procedure DrawTab(ACanvas: TCanvas; ARect: TRect; + AEnabled, AChecked, AHoverItem: Boolean; Position: TSpTBXTabPosition; + ASeparator: Boolean = False; AEdge: TSpTBXTabEdge = tedNone); virtual; + procedure DrawItemRightImage(ACanvas: TCanvas; ARect: TRect; ItemInfo: TSpTBXMenuItemInfo); override; + function GetRightImageSize: TSize; override; + function GetRightImageRect: TRect; + function GetTextColor(State: TSpTBXSkinStatesType): TColor; override; + procedure InternalMouseMove(Shift: TShiftState; X, Y: Integer); override; + procedure Leaving; override; + public + function IsOnTabToolbar: Boolean; + property Item: TSpTBXTabItem read GetItem; // Hides the inherited TB2K Item property + property TabCloseButtonState: TSpTBXSkinStatesType read FTabCloseButtonState; + property TabPosition: TSpTBXTabPosition read GetTabPosition; + end; + + { TSpTBXTabToolbar } + + TSpTBXTabToolbar = class(TSpTBXToolbar) + private + FSkinType: TSpTBXSkinType; + FUpdateHidden: Integer; + FTabAutofit: Boolean; + FTabAutofitMaxSize: Integer; + FTabCloseButtonImageIndex: Integer; + FTabCloseButton: TSpTBXTabCloseButton; + FTabDragReorder: Boolean; + FTabBackgroundBorders: Boolean; + FTabColor: TColor; + FTabMaxSize: Integer; + FTabPosition: TSpTBXTabPosition; + procedure Scroll(ToRight: Boolean); + function GetActiveTab: TSpTBXTabItem; + procedure SetActiveTabIndex(Value: Integer); + procedure SetSkinType(const Value: TSpTBXSkinType); + procedure SetTabCloseButton(const Value: TSpTBXTabCloseButton); + procedure SetTabCloseButtonImageIndex(const Value: Integer); + procedure SetTabAutofit(const Value: Boolean); + procedure SetTabAutofitMaxSize(const Value: Integer); + procedure SetTabBackgroundBorders(const Value: Boolean); + procedure SetTabColor(const Value: TColor); + procedure SetTabMaxSize(const Value: Integer); + procedure SetTabPosition(const Value: TSpTBXTabPosition); + procedure CMDesignHitTest(var Message: TCMDesignHitTest); message CM_DESIGNHITTEST; + protected + FHiddenTabs: TSpTBXItemCacheCollection; + FActiveTabIndex: Integer; + FOwnerTabControl: TSpTBXCustomTabSet; + procedure Autofit; + function GetItemsTextColor(State: TSpTBXSkinStatesType): TColor; override; + procedure InternalDrawBackground(ACanvas: TCanvas; ARect: TRect; PaintOnNCArea: Boolean; PaintBorders: Boolean = True); override; + procedure DoItemNotification(Ancestor: TTBCustomItem; Relayed: Boolean; Action: TTBItemChangedAction; Index: Integer; Item: TTBCustomItem); override; + procedure RightAlignItems; override; + + function CanDragCustomize(Button: TMouseButton; Shift: TShiftState; X, Y: Integer): Boolean; override; + procedure DoStartDrag(var DragObject: TDragObject); override; + procedure DragOver(Source: TObject; X: Integer; Y: Integer; State: TDragState; var Accept: Boolean); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure BeginUpdateHidden; + procedure EndUpdateHidden; + function GetTabsCount(VisibleOnly: Boolean): Integer; + procedure InvalidateActiveTab; + procedure InvalidateNC; + procedure MakeVisible(ATab: TSpTBXTabItem); + procedure ScrollLeft; + procedure ScrollRight; + procedure ScrollState(out CanScrollToLeft, CanScrollToRight: Boolean); + procedure TabClose(ATab: TSpTBXTabItem); + published + property ActiveTab: TSpTBXTabItem read GetActiveTab; + property ActiveTabIndex: Integer read FActiveTabIndex write SetActiveTabIndex; + property TabCloseButton: TSpTBXTabCloseButton read FTabCloseButton write SetTabCloseButton default tcbNone; + property TabCloseButtonImageIndex: Integer read FTabCloseButtonImageIndex write SetTabCloseButtonImageIndex default -1; + property TabBackgroundBorders: Boolean read FTabBackgroundBorders write SetTabBackgroundBorders; + property TabAutofit: Boolean read FTabAutofit write SetTabAutofit default False; + property TabAutofitMaxSize: Integer read FTabAutofitMaxSize write SetTabAutofitMaxSize default 200; + property TabColor: TColor read FTabColor write SetTabColor default clBtnFace; + property TabMaxSize: Integer read FTabMaxSize write SetTabMaxSize default -1; + property TabPosition: TSpTBXTabPosition read FTabPosition write SetTabPosition default ttpTop; + property TabDragReorder: Boolean read FTabDragReorder write FTabDragReorder default False; + property SkinType: TSpTBXSkinType read FSkinType write SetSkinType default sknSkin; + end; + + { TSpTBXTabSheet } + + TSpTBXTabSheet = class(TCustomControl) + private + FTabControl: TSpTBXCustomTabControl; + FItem: TSpTBXTabItem; + FItemName: String; + FPrevFocused: TWincontrol; + procedure ReadItemName(Reader: TReader); + procedure WriteItemName(Writer: TWriter); + function GetCaption: WideString; + function GetTabVisible: Boolean; + procedure SetCaption(const Value: WideString); + procedure SetTabVisible(const Value: Boolean); + function GetImageIndex: Integer; + procedure SetImageIndex(const Value: Integer); + procedure CMVisiblechanged(var Message: TMessage); message CM_VISIBLECHANGED; + procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; + procedure WMWindowPosChanged(var Message: TWMWindowPosChanged); message WM_WINDOWPOSCHANGED; + protected + procedure CreateParams(var Params: TCreateParams); override; + procedure AdjustClientRect(var Rect: TRect); override; + procedure DefineProperties(Filer: TFiler); override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure ReadState(Reader: TReader); override; + procedure VisibleChanging; override; + property Align default alClient; + property PrevFocused: TWincontrol read FPrevFocused; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + property Item: TSpTBXTabItem read FItem write FItem; + property TabControl: TSpTBXCustomTabControl read FTabControl write FTabControl; + published + property PopupMenu; + property Caption: WideString read GetCaption write SetCaption; + property ImageIndex: Integer read GetImageIndex write SetImageIndex; + property TabVisible: Boolean read GetTabVisible write SetTabVisible default True; + end; + + { TSpTBXTabControl } + + TSpTBXCustomTabSet = class(TSpTBXCompoundItemsControl) + private + FItemMoveCount: Integer; + FItemMoved: TSpTBXTabItem; + FTabVisible: Boolean; + FLoadingActiveIndex: Integer; + FUpdatingIndex: Boolean; + FResizing: Boolean; + FOnDrawBackground: TSpTBXDrawEvent; + FOnActiveTabChange: TSpTBXTabChangeEvent; + FOnActiveTabChanging: TSpTBXTabChangingEvent; + FOnActiveTabReorder: TSpTBXTabChangeEvent; + FOnActiveTabReordering: TSpTBXTabChangingEvent; + procedure ReadHiddenItems(Reader: TReader); + procedure WriteHiddenItems(Writer: TWriter); + function GetActiveTabIndex: Integer; + procedure SetActiveTabIndex(Value: Integer); + function GetSkinType: TSpTBXSkinType; + procedure SetSkinType(const Value: TSpTBXSkinType); + function GetTabAutofit: Boolean; + procedure SetTabAutofit(const Value: Boolean); + function GetTabAutofitMaxSize: Integer; + procedure SetTabAutofitMaxSize(const Value: Integer); + function GetTabBackgroundBorders: Boolean; + procedure SetTabBackgroundBorders(const Value: Boolean); + function GetTabBackgroundColor: TColor; + procedure SetTabBackgroundColor(const Value: TColor); + function GetTabCloseButton: TSpTBXTabCloseButton; + procedure SetTabCloseButton(const Value: TSpTBXTabCloseButton); + function GetTabCloseButtonImageIndex: Integer; + procedure SetTabCloseButtonImageIndex(const Value: Integer); + function GetTabDragReorder: Boolean; + procedure SetTabDragReorder(const Value: Boolean); + function GetTabMaxSize: Integer; + procedure SetTabMaxSize(const Value: Integer); + function GetTabPosition: TSpTBXTabPosition; + procedure SetTabPosition(const Value: TSpTBXTabPosition); + procedure SetTabVisible(const Value: Boolean); + function GetTabToolbar: TSpTBXTabToolbar; + procedure CMColorchanged(var Message: TMessage); message CM_COLORCHANGED; + procedure CMSpTBXControlsInvalidate(var Message: TMessage); message CM_SPTBXCONTROLSINVALIDATE; + procedure WMEraseBkgnd(var Message: TMessage); message WM_ERASEBKGND; + procedure WMInvalidateTabBackground(var Message: TMessage); message WM_INVALIDATETABBACKGROUND; + procedure WMWindowPosChanged(var Message: TWMWindowPosChanged); message WM_WINDOWPOSCHANGED; + protected + FBackground: TBitmap; + // Painting + procedure DoDrawBackground(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + function GetFullRepaint: Boolean; virtual; + + // Tabs + function CanActiveTabChange(const TabIndex, NewTabIndex: Integer): Boolean; virtual; + procedure DoActiveTabChange(const TabIndex: Integer); virtual; + function CanActiveTabReorder(const TabIndex, NewTabIndex: Integer): Boolean; virtual; + procedure DoActiveTabReorder(const TabIndex: Integer); virtual; + procedure ItemNotification(Ancestor: TTBCustomItem; Relayed: Boolean; + Action: TTBItemChangedAction; Index: Integer; Item: TTBCustomItem); virtual; // Items change notification + procedure TabInserted(Item: TSpTBXTabItem); virtual; + procedure TabDeleting(Item: TSpTBXTabItem; FreeTabSheet: Boolean = True); virtual; + + // Component + procedure DefineProperties(Filer: TFiler); override; + function GetToolbarClass: TSpTBXToolbarClass; override; + procedure Loaded; override; + + property Color default clBtnFace; + property ParentColor default False; + property ActiveTabIndex: Integer read GetActiveTabIndex write SetActiveTabIndex; + property TabAutofit: Boolean read GetTabAutofit write SetTabAutofit default False; + property TabAutofitMaxSize: Integer read GetTabAutofitMaxSize write SetTabAutofitMaxSize default 200; + property TabBackgroundColor: TColor read GetTabBackgroundColor write SetTabBackgroundColor default clNone; + property TabBackgroundBorders: Boolean read GetTabBackgroundBorders write SetTabBackgroundBorders default False; + property TabCloseButton: TSpTBXTabCloseButton read GetTabCloseButton write SetTabCloseButton default tcbNone; + property TabCloseButtonImageIndex: Integer read GetTabCloseButtonImageIndex write SetTabCloseButtonImageIndex default -1; + property TabDragReorder: Boolean read GetTabDragReorder write SetTabDragReorder default False; + property TabMaxSize: Integer read GetTabMaxSize write SetTabMaxSize default -1; + property TabPosition: TSpTBXTabPosition read GetTabPosition write SetTabPosition default ttpTop; + property TabVisible: Boolean read FTabVisible write SetTabVisible default True; + property SkinType: TSpTBXSkinType read GetSkinType write SetSkinType default sknSkin; + property OnActiveTabChange: TSpTBXTabChangeEvent read FOnActiveTabChange write FOnActiveTabChange; + property OnActiveTabChanging: TSpTBXTabChangingEvent read FOnActiveTabChanging write FOnActiveTabChanging; + property OnActiveTabReorder: TSpTBXTabChangeEvent read FOnActiveTabReorder write FOnActiveTabReorder; + property OnActiveTabReordering: TSpTBXTabChangingEvent read FOnActiveTabReordering write FOnActiveTabReordering; + property OnDrawBackground: TSpTBXDrawEvent read FOnDrawBackground write FOnDrawBackground; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function Add(ACaption: WideString): TSpTBXTabItem; + function Insert(NewIndex: Integer; ACaption: WideString): TSpTBXTabItem; + function DrawBackground(DC: HDC; ARect: TRect): Boolean; + function GetTabSetHeight: Integer; + procedure InvalidateBackground(InvalidateChildren: Boolean = True); override; + procedure MakeVisible(ATab: TSpTBXTabItem); + procedure ScrollLeft; + procedure ScrollRight; + procedure ScrollState(out Left, Right: Boolean); + procedure TabClick(ATab: TSpTBXTabItem); virtual; + property Canvas; + property Toolbar: TSpTBXTabToolbar read GetTabToolbar; + end; + + TSpTBXTabSet = class(TSpTBXCustomTabSet) + published + property Align; + property Anchors; + property BiDiMode; + property Color; + property Constraints; + property DockSite; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property ParentColor; + property ParentBiDiMode; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property Visible; + property OnCanResize; + property OnContextPopup; + property OnDockDrop; + property OnDockOver; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnGetSiteInfo; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnResize; + property OnStartDock; + property OnStartDrag; + property OnUnDock; + // TSpTBXCustomTabSet properties + property ActiveTabIndex; + property Images; + property TabAutofit; + property TabAutofitMaxSize; + property TabBackgroundColor; + property TabBackgroundBorders; + property TabCloseButton; + property TabCloseButtonImageIndex; + property TabDragReorder; + property TabMaxSize; + property TabPosition; + property TabVisible; + property SkinType; + property OnActiveTabChange; + property OnActiveTabChanging; + property OnActiveTabReorder; + property OnActiveTabReordering; + property OnDrawBackground; + end; + + { TSpTBXTabControl } + + TSpTBXCustomTabControl = class(TSpTBXCustomTabSet) + private + FEmptyTabSheet: TSpTBXTabSheet; + procedure RealignTabSheets; + function GetActivePage: TSpTBXTabSheet; + function GetPages(Index: Integer): TSpTBXTabSheet; + function GetPagesCount: Integer; + procedure SetActivePage(const Value: TSpTBXTabSheet); + procedure CMSpTBXControlsInvalidate(var Message: TMessage); message CM_SPTBXCONTROLSINVALIDATE; + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + protected + FPages: TList; + procedure DoActiveTabChange(const ItemIndex: Integer); override; + function GetFullRepaint: Boolean; override; + procedure TabInserted(Item: TSpTBXTabItem); override; + procedure TabDeleting(Item: TSpTBXTabItem; FreeTabSheet: Boolean = True); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function GetPage(Item: TSpTBXTabItem): TSpTBXTabSheet; + property ActivePage: TSpTBXTabSheet read GetActivePage write SetActivePage; + property Pages[Index: Integer]: TSpTBXTabSheet read GetPages; + property PagesCount: Integer read GetPagesCount; + end; + + TSpTBXTabControl = class(TSpTBXCustomTabControl) + published + property Align; + property Anchors; + property BiDiMode; + property Color; + property Constraints; + property DockSite; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property ParentColor; + property ParentBiDiMode; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property Visible; + property OnCanResize; + property OnContextPopup; + property OnDockDrop; + property OnDockOver; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnGetSiteInfo; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnResize; + property OnStartDock; + property OnStartDrag; + property OnUnDock; + // TSpTBXCustomTabControl properties + property ActiveTabIndex; + property Images; + property TabAutofit; + property TabAutofitMaxSize; + property TabBackgroundColor; + property TabBackgroundBorders; + property TabCloseButton; + property TabCloseButtonImageIndex; + property TabDragReorder; + property TabMaxSize; + property TabPosition; + property TabVisible; + property SkinType; + property OnActiveTabChange; + property OnActiveTabChanging; + property OnActiveTabReorder; + property OnActiveTabReordering; + property OnDrawBackground; + end; + +function SpGetNextTabItemViewer(View: TTBView; IV: TTBItemViewer; GoForward: Boolean; SearchType: TSpTBXSearchItemViewerType): TTBItemViewer; +procedure SpDrawXPTab(ACanvas: TCanvas; ARect: TRect; Enabled, Checked, HotTrack, Focused: Boolean; Position: TSpTBXTabPosition; SkinType: TSpTBXSkinType; Edge: TSpTBXTabEdge = tedNone); +procedure SpDrawXPTabControlBackground(ACanvas: TCanvas; ARect: TRect; AColor: TColor; BottomTabs: Boolean; SkinType: TSpTBXSkinType); + +implementation + +uses + Themes, UxTheme, Types; + +type + TTBItemViewerAccess = class(TTBItemViewer); + TSpTBXCustomItemAccess = class(TSpTBXCustomItem); + TSpTBXDockAccess = class(TSpTBXDock); + TSpTBXToolbarAccess = class(TSpTBXToolbar); + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Helpers } + +function SpGetNextTabItemViewer(View: TTBView; IV: TTBItemViewer; GoForward: Boolean; + SearchType: TSpTBXSearchItemViewerType): TTBItemViewer; +// Returns the left or right Tab item depending on GoForward +// SearchType can be: +// sivtNormal: Normal search +// sivtInmediate: Search for the inmediate ItemViewer +// sivtInmediateSkipNonVisible: Search for the next inmediate ItemViewer, skipping non visible ones +begin + Result := nil; + while Result = nil do begin + IV := SpGetNextItemSameEdge(View, IV, GoForward, SearchType); + if not Assigned(IV) then + Break // Not found, exit + else + if IV.Item is TSpTBXTabItem then begin + Result := IV; // Found Tab + Break; + end + else begin + case SearchType of + sivtInmediate: + Break; // Inmediate not found, exit + sivtInmediateSkipNonVisible: + if IV.Item.Visible then Break; // Inmediate not found and visible, exit + end; + end; + end; +end; + +procedure SpDrawXPTab(ACanvas: TCanvas; ARect: TRect; + Enabled, Checked, HotTrack, Focused: Boolean; Position: TSpTBXTabPosition; + SkinType: TSpTBXSkinType; Edge: TSpTBXTabEdge = tedNone); +var + Part, Flags: Cardinal; + B: TBitmap; + R, FlippedR: TRect; + State: TSpTBXSkinStatesType; +begin + SkinType := SpTBXSkinType(SkinType); + if (SkinType = sknNone) and not Checked then + Exit; + + B := TBitmap.Create; + try + B.Width := ARect.Right - ARect.Left; + B.Height := ARect.Bottom - ARect.Top; + R := Rect(0, 0, B.Width, B.Height); + B.Canvas.Brush.Color := clFuchsia; + B.Canvas.FillRect(R); + B.TransparentColor := clFuchsia; + B.Transparent := True; + + case SkinType of + sknNone: + if Checked then begin + Position := ttpTop; // Don't need to flip + B.Canvas.Brush.Color := ACanvas.Brush.Color; + B.Canvas.FillRect(R); + ExtCtrls.Frame3D(B.Canvas, R, clWindow, clWindowFrame, 1); + ExtCtrls.Frame3D(B.Canvas, R, B.Canvas.Brush.Color, clBtnShadow, 1); + R := Rect(0, 0, B.Width, B.Height); // Frame3D changed R + end; + sknWindows: + begin + case Edge of + tedLeft: Part := TABP_TABITEMLEFTEDGE; + tedRight: Part := TABP_TABITEMRIGHTEDGE; + else + Part := TABP_TABITEM; + end; + + Flags := TIS_NORMAL; + if not Enabled then Flags := TIS_DISABLED + else + if Checked then Flags := TIS_SELECTED + else + if HotTrack then Flags := TIS_HOT; + DrawThemeBackground(ThemeServices.Theme[teTab], B.Canvas.Handle, Part, Flags, R, nil); + end; + sknSkin: + begin + State := CurrentSkin.GetState(Enabled, False, HotTrack, Checked); + CurrentSkin.PaintBackground(B.Canvas, R, skncTab, State, True, True); + end; + end; + + // Flip top to bottom + if Position = ttpBottom then begin + // Unclear why extra "-1" is needed here. + FlippedR := R; + FlippedR.Top := R.Bottom - 1; + FlippedR.Bottom := R.Top - 1; + B.Canvas.CopyRect(R, B.Canvas, FlippedR); + end; + + // Draw focus + if Checked and Focused then begin + InflateRect(R, -3, -3); + SpDrawFocusRect(B.Canvas, R); + end; + + ACanvas.Draw(ARect.Left, ARect.Top, B); + finally + B.Free; + end; +end; + +procedure SpDrawXPTabControlBackground(ACanvas: TCanvas; ARect: TRect; AColor: TColor; + BottomTabs: Boolean; SkinType: TSpTBXSkinType); +var + B: TBitmap; + R: TRect; +begin + SkinType := SpTBXSkinType(SkinType); + B := TBitmap.Create; + try + B.Width := ARect.Right - ARect.Left; + B.Height := ARect.Bottom - ARect.Top; + R := Rect(0, 0, B.Width, B.Height); + + // Draw the top/bottom border + case SkinType of + sknNone: + begin + BottomTabs := False; // Don't flip + B.Canvas.Brush.Color := AColor; + B.Canvas.FillRect(R); + ExtCtrls.Frame3D(B.Canvas, R, clWindow, clWindowFrame, 1); + ExtCtrls.Frame3D(B.Canvas, R, AColor, clBtnShadow, 1); + R := Rect(0, 0, B.Width, B.Height); // Frame3D changed R + end; + sknWindows: + DrawThemeBackground(ThemeServices.Theme[teTab], B.Canvas.Handle, TABP_PANE, 0, R, nil); + sknSkin: + begin + B.Canvas.Brush.Color := clWhite; + B.Canvas.FillRect(R); + CurrentSkin.PaintBackground(B.Canvas, R, skncTabBackground, sknsNormal, True, True); + end; + end; + + // Flip top to bottom + if BottomTabs then begin + // Unclear why extra "-1" is needed here. + R.Top := B.Height - 1; + R.Bottom := -1 + end; + + ACanvas.CopyRect(ARect, B.Canvas, R); + finally + B.Free; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXTabItemDragObject } + +constructor TSpTBXTabItemDragObject.Create(ASourceControl: TControl; + AItem: TTBCustomItem); +begin + inherited Create(ASourceControl, AItem); + DragCursorAccept := crDefault; + DragCursorCancel := crDefault; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXTabItem } + +constructor TSpTBXTabItem.Create(AOwner: TComponent); +begin + inherited; + DisplayMode := nbdmImageAndText; + GroupIndex := C_SpTBXTabGroupIndex; + Wrapping := twEndEllipsis; + Margins := 4; + FSkinType := sknSkin; +end; + +procedure TSpTBXTabItem.Click; +var + T: TSpTBXTabToolbar; + I: Integer; +begin + // Set the Checked property to True, Autocheck is False + // Checked will call Item.Invalidate, the TabSet.ItemNotification will + // handle the invalidation and set the ActiveTabIndex. + if not Checked and Enabled and Visible then begin + if GetTabToolbar(T) then begin + I := T.Items.IndexOf(Self); + if T.FOwnerTabControl.CanActiveTabChange(T.ActiveTabIndex, I) then + Checked := True; + end; + inherited; + end; +end; + +procedure TSpTBXTabItem.TabClose; +var + NextTab: TSpTBXTabItem; + T: TSpTBXTabToolbar; + CloseAndFree, CanTabClose: Boolean; +begin + if Visible then begin + CanTabClose := True; + CloseAndFree := False; + DoTabClosing(CanTabClose, CloseAndFree); + if CanTabClose then begin + // Check the next visible tab + NextTab := nil; + if Checked and GetTabToolbar(T) then begin + NextTab := GetNextTab(True, sivtInmediateSkipNonVisible); + if not Assigned(NextTab) then + NextTab := GetNextTab(False, sivtInmediateSkipNonVisible); + end; + Visible := False; + DoTabClose; + if CloseAndFree then + Free; // Removes the item from the paren, calls tbicDeleting notification and frees the item + if Assigned(NextTab) then + NextTab.Checked := True; + end; + end; +end; + +function TSpTBXTabItem.DialogChar(CharCode: Word): Boolean; +begin + Result := inherited DialogChar(CharCode); + if Enabled and Visible and IsAccel(CharCode, Caption) then begin + Click; + Result := True; + end; +end; + +procedure TSpTBXTabItem.DoDrawTabCloseButton(ACanvas: TCanvas; + State: TSpTBXSkinStatesType; const PaintStage: TSpTBXPaintStage; + AImageList: TCustomImageList; var AImageIndex: Integer; var ARect: TRect; + var PaintDefault: Boolean); +begin + if Assigned(FOnDrawTabCloseButton) then FOnDrawTabCloseButton(Self, ACanvas, State, PaintStage, + AImageList, AImageIndex, ARect, PaintDefault); +end; + +procedure TSpTBXTabItem.DoTabClose; +begin + if Assigned(FOnTabClose) then FOnTabClose(Self); +end; + +procedure TSpTBXTabItem.DoTabClosing(var Allow, CloseAndFree: Boolean); +begin + if Assigned(FOnTabClosing) then FOnTabClosing(Self, Allow, CloseAndFree); +end; + +function TSpTBXTabItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + Result := TSpTBXTabItemViewer; +end; + +function TSpTBXTabItem.GetNextTab(GoForward: Boolean; SearchType: TSpTBXSearchItemViewerType): TSpTBXTabItem; +// Returns the left or right Tab item depending on GoForward, skipping all the non-visible ones. +// If Inmediate is true it will only search for the next inmediate tab +var + T: TSpTBXTabToolbar; + IV: TTBItemViewer; +begin + Result := nil; + + if GetTabToolbar(T) then begin + IV := SpFindItemViewer(T.View, Self); + if Assigned(IV) then begin + IV := SpGetNextTabItemViewer(T.View, IV, GoForward, SearchType); + if Assigned(IV) then + Result := IV.Item as TSpTBXTabItem + end; + end; +end; + +function TSpTBXTabItem.GetTabColor: TColor; +var + T: TSpTBXTabToolbar; +begin + Result := clBtnFace; + if GetTabToolbar(T) then + Result := T.TabColor; +end; + +function TSpTBXTabItem.GetSkinType: TSpTBXSkinType; +var + T: TSpTBXTabToolbar; +begin + if GetTabToolbar(T) then + FSkinType := T.SkinType; + Result := FSkinType; +end; + +procedure TSpTBXTabItem.SetSkinType(const Value: TSpTBXSkinType); +var + T: TSpTBXTabToolbar; +begin + // Don't change the SkinType if the item is inside a TabToolbar + if not GetTabToolbar(T) then begin + FSkinType := Value; + Change(False); + end; +end; + +function TSpTBXTabItem.IsFirstVisible: Boolean; +var + T: TSpTBXTabToolbar; + IV: TTBItemViewer; +begin + Result := False; + if GetTabToolbar(T) then begin + IV := SpFindItemViewer(T.View, Self); + if Assigned(IV) then + Result := T.View.NextSelectable(nil, True) = IV; + end; +end; + +function TSpTBXTabItem.IsFirstVisibleTab: Boolean; +var + T: TSpTBXTabToolbar; +begin + if GetTabToolbar(T) then + Result := not Assigned(GetNextTab(False, sivtNormal)) + else + Result := False; +end; + +function TSpTBXTabItem.IsLastVisibleTab: Boolean; +var + T: TSpTBXTabToolbar; +begin + if GetTabToolbar(T) then + Result := not Assigned(GetNextTab(True, sivtNormal)) + else + Result := False; +end; + +function TSpTBXTabItem.GetTabToolbar(out TabToolbar: TSpTBXTabToolbar): Boolean; +var + C: TComponent; +begin + C := GetParentComponent; + if Assigned(C) and (C is TSpTBXTabToolbar) then + TabToolbar := C as TSpTBXTabToolbar + else + TabToolbar := nil; + Result := Assigned(TabToolbar); +end; + +procedure TSpTBXTabItem.ToggleControl; +begin + // Do nothing, the Control property is the Tabsheet, and its visibility + // is setted by TabSet.ActiveTabIndex +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXTabItemViewer } + +procedure TSpTBXTabItemViewer.CalcSize(const Canvas: TCanvas; var AWidth, + AHeight: Integer); +var + TabMaxSize: Integer; +begin + inherited CalcSize(Canvas, AWidth, AHeight); + + if IsOnTabToolbar and not Item.Anchored then begin + TabMaxSize := TSpTBXTabToolbar(View.Window).TabMaxSize; + if TabMaxSize > 0 then + if IsRotated then begin + if AHeight > TabMaxSize then + AHeight := TabMaxSize; + end + else begin + if AWidth > TabMaxSize then + AWidth := TabMaxSize; + end; + end; +end; + +function TSpTBXTabItemViewer.CorrectTabRect(ARect: TRect): TRect; +// Offsets the rect to give a pushed effect on the tabs +begin + Result := ARect; + if not Item.Checked then + case TabPosition of + ttpTop: OffsetRect(Result, 0, 2); + ttpBottom: OffsetRect(Result, 0, -2); + end; +end; + +procedure TSpTBXTabItemViewer.DoDrawButton(ACanvas: TCanvas; ARect: TRect; + ItemInfo: TSpTBXMenuItemInfo; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +var + LeftT, RightT: TTBItemViewer; + IsHoverItem: Boolean; + R: TRect; + Position: TSpTBXTabPosition; + TT: TSpTBXSkinType; +begin + inherited; + + if (PaintStage = pstPrePaint) and PaintDefault then begin + PaintDefault := False; + IsHoverItem := (ItemInfo.State = sknsHotTrack) or (ItemInfo.State = sknsCheckedAndHotTrack); + Position := TabPosition; + + // Match the bottom of the Tab with the bottom of the TabSet + case Position of + ttpTop: ARect.Bottom := ARect.Bottom + 1; + ttpBottom: ARect.Top := ARect.Top - 1; + end; + R := ARect; + TT := SpTBXSkinType(Item.SkinType); + + case TT of + sknNone, sknSkin: + if Item.Checked or (IsHoverItem and (TT <> sknNone)) or + not CurrentSkin.Options(skncTab, sknsNormal).Body.IsEmpty or + not CurrentSkin.Options(skncTab, sknsNormal).Borders.IsEmpty then + begin + case Position of + ttpTop: Inc(R.Bottom, 5); + ttpBottom: Dec(R.Top, 5); + end; + DrawTab(ACanvas, R, Item.Enabled, Item.Checked, IsHoverItem, Position); + end + else begin + // Draw the separators + RightT := SpGetNextTabItemViewer(View, Self, True, sivtInmediateSkipNonVisible); + if Assigned(RightT) and not RightT.Item.Checked then + DrawTab(ACanvas, R, Item.Enabled, Item.Checked, IsHoverItem, Position, True); + end; + sknWindows: + begin + if IsOnTabToolbar then begin + // Find the inmediate left and right tabs + LeftT := SpGetNextTabItemViewer(View, Self, False, sivtInmediateSkipNonVisible); + RightT := SpGetNextTabItemViewer(View, Self, True, sivtInmediateSkipNonVisible); + end + else begin + LeftT := nil; + RightT := nil; + end; + + if Item.Checked then begin + // The left border of the Tab will be painted by the Left tab if + // its the first tab + if Assigned(LeftT) or (Item.IsFirstVisible) then + R.Left := R.Left - 2; + // The right border of the Tab will be painted by the Right tab + if Assigned(RightT) then + R.Right := R.Right + 2; + end + else begin + // Non checked tabs should be smaller + case Position of + ttpTop: Inc(R.Top, 2); + ttpBottom: Dec(R.Bottom, 2); + end; + end; + + // Draw the Tab + DrawTab(ACanvas, R, Item.Enabled, Item.Checked, IsHoverItem, Position); + + // If the Tab is not checked then it should paint the active tab borders + if not Item.Checked then begin + R := ARect; + // Draw the left border + if Assigned(LeftT) and LeftT.Item.Checked then begin + R.Right := R.Left + 2; + R.Left := R.Right - 10; + DrawTab(ACanvas, R, LeftT.Item.Enabled, True, IsHoverItem, Position); + end + else + // Draw the right border + if Assigned(RightT) and RightT.Item.Checked then begin + R.Left := R.Right - 2; + R.Right := R.Left + 10; + DrawTab(ACanvas, R, RightT.Item.Enabled, True, IsHoverItem, Position); + end; + end; + end; + end; + end; +end; + +procedure TSpTBXTabItemViewer.DoDrawCaption(ACanvas: TCanvas; ClientAreaRect: TRect; + State: TSpTBXSkinStatesType; var ACaption: WideString; var CaptionRect: TRect; + var CaptionFormat: Cardinal; IsTextRotated: Boolean; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + CaptionRect := CorrectTabRect(CaptionRect); // Offset the rect to give a pushed effect on the tabs + + // [Theme-Change] + // The Default theme paints the caption of the pushed button in a down + // state, this only happens when the item is in a toolbarstyle + if (State = sknsPushed) and (SkinManager.CurrentSkinName = 'Default') then + OffsetRect(CaptionRect, -1, -1); + + inherited DoDrawCaption(ACanvas, ClientAreaRect, State, ACaption, CaptionRect, + CaptionFormat, IsTextRotated, PaintStage, PaintDefault); +end; + +procedure TSpTBXTabItemViewer.DoDrawImage(ACanvas: TCanvas; + State: TSpTBXSkinStatesType; const PaintStage: TSpTBXPaintStage; + var AImageList: TCustomImageList; var AImageIndex: Integer; var ARect: TRect; + var PaintDefault: Boolean); +begin + ARect := CorrectTabRect(ARect); // Offset the rect to give a pushed effect on the tabs + inherited DoDrawImage(ACanvas, State, PaintStage, AImageList, AImageIndex, ARect, PaintDefault); +end; + +procedure TSpTBXTabItemViewer.DoDrawTabCloseButton(ACanvas: TCanvas; + State: TSpTBXSkinStatesType; const PaintStage: TSpTBXPaintStage; + var AImageList: TCustomImageList; var AImageIndex: Integer; var ARect: TRect; + var PaintDefault: Boolean); +begin + TSpTBXTabItem(Item).DoDrawTabCloseButton(ACanvas, State, PaintStage, AImageList, AImageIndex, ARect, PaintDefault); +end; + +procedure TSpTBXTabItemViewer.DrawBottomBorder(ACanvas: TCanvas; ARect: TRect); +var + CR, R: TRect; + Edge: TSpTBXTabEdge; + LeftT, RightT: Boolean; + Position: TSpTBXTabPosition; + B: TBitmap; + TT: TSpTBXSkinType; +begin + if not IsOnTabToolbar then Exit; + + TT := SpTBXSkinType(Item.SkinType); + Position := TabPosition; + Edge := tedNone; + CR := ARect; + + case Position of + ttpTop: + Inc(CR.Bottom, 2); + ttpBottom: + begin + // When sknNone the bottom border size is 2 + if TT = sknNone then + Dec(CR.Top, 2) + else + Dec(CR.Top, 2); + end; + end; + + if TT = sknWindows then begin + LeftT := Assigned(SpGetNextTabItemViewer(View, Self, False, sivtInmediateSkipNonVisible)); + RightT := Assigned(SpGetNextTabItemViewer(View, Self, True, sivtInmediateSkipNonVisible)); + + if Item.IsFirstVisible then // Is first IV? + Edge := tedLeft; + + if Edge = tedLeft then begin + CR.Left := CR.Left - 2; + if RightT then + CR.Right := CR.Right + 2; + end + else begin + if LeftT then + CR.Left := CR.Left - 2; + if RightT then + CR.Right := CR.Right + 2; + end; + end; + + B := TBitmap.Create; + try + B.Width := CR.Right - CR.Left; + B.Height := CR.Bottom - CR.Top + 4; // Larger than CR + R := Rect(0, 0, B.Width, B.Height); + DrawTab(B.Canvas, R, True, True, False, Position, False, Edge); + + case Position of + ttpTop: + R := Bounds(0, 0, CR.Right - CR.Left, CR.Bottom - CR.Top); // Copy from Y = 0 + ttpBottom: + R := Bounds(0, 2, CR.Right - CR.Left, CR.Bottom - CR.Top + 2); // Copy from Y = 2 + end; + + ACanvas.CopyRect(CR, B.Canvas, R); + finally + B.Free; + end; +end; + +procedure TSpTBXTabItemViewer.DrawItemRightImage(ACanvas: TCanvas; ARect: TRect; + ItemInfo: TSpTBXMenuItemInfo); +var + PaintDefault: Boolean; + ImgList: TCustomImageList; + ImgIndex: Integer; + PatternColor: TColor; +begin + if IsOnTabToolbar then begin + if not IsTabCloseButtonVisible then + Exit; + + GetTabCloseButtonImgList(ImgList, ImgIndex); + ARect := CorrectTabRect(ARect); // Offset the rect to give a pushed effect on the tabs + + ItemInfo.Pushed := False; + ItemInfo.Checked := False; + if ItemInfo.Enabled then + if FTabCloseButtonState = sknsHotTrack then + ItemInfo.State := sknsHotTrack + else begin + ItemInfo.Enabled := False; + ItemInfo.State := sknsDisabled; + end; + + PaintDefault := True; + DoDrawTabCloseButton(ACanvas, ItemInfo.State, pstPrePaint, ImgList, ImgIndex, ARect, PaintDefault); + if PaintDefault and Assigned(ImgList) and (FTabCloseButtonState = sknsHotTrack) then + if (ImgList = MDIButtonsImgList) or ((ImgIndex >= 0) and (ImgIndex < ImgList.Count)) then + SpDrawXPMenuItem(ACanvas, ARect, ItemInfo); + PaintDefault := True; + if ImgList = MDIButtonsImgList then begin + PatternColor := GetTextColor(ItemInfo.State); + SpDrawGlyphPattern(ACanvas, ARect, ImgIndex, PatternColor); + end + else + DoDrawTabCloseButton(ACanvas, ItemInfo.State, pstPostPaint, ImgList, ImgIndex, ARect, PaintDefault); + if PaintDefault and Assigned(ImgList) and (ImgIndex >= 0) and (ImgIndex < ImgList.Count) then begin + SpDrawXPMenuItemImage(ACanvas, ARect, ItemInfo, ImgList, ImgIndex); + end; + end; +end; + +procedure TSpTBXTabItemViewer.DrawTab(ACanvas: TCanvas; ARect: TRect; AEnabled, + AChecked, AHoverItem: Boolean; Position: TSpTBXTabPosition; + ASeparator: Boolean; AEdge: TSpTBXTabEdge); +begin + if ASeparator then begin + ARect.Left := ARect.Right - 2; + SpDrawXPMenuSeparator(ACanvas, ARect, False, True) + end + else begin + ACanvas.Brush.Color := Item.TabColor; + SpDrawXPTab(ACanvas, ARect, AEnabled, AChecked, AHoverItem, False, Position, Item.SkinType, AEdge); + end; +end; + +function TSpTBXTabItemViewer.GetItem: TSpTBXTabItem; +begin + Result := TSpTBXTabItem(inherited Item); +end; + +function TSpTBXTabItemViewer.GetRightImageRect: TRect; +var + RightGlyphSize: TSize; + R: TRect; +begin + RightGlyphSize := GetRightImageSize; + R := BoundsRect; + + Result.Left := R.Right - 4 - RightGlyphSize.cx; + Result.Right := Result.Left + RightGlyphSize.cx; + Result.Top := (R.Top + R.Bottom - RightGlyphSize.cy) div 2; + Result.Bottom := Result.Top + RightGlyphSize.cy; + + Result := CorrectTabRect(Result); // Offset the rect to give a pushed effect on the tabs +end; + +function TSpTBXTabItemViewer.GetRightImageSize: TSize; +var + ImgList: TCustomImageList; + ImgIndex: Integer; +begin + Result.cx := 0; + Result.cy := 0; + GetTabCloseButtonImgList(ImgList, ImgIndex); + if Assigned(ImgList) then + if ImgList = MDIButtonsImgList then begin + Result.cx := 15; + Result.cy := 15; + end + else if (ImgIndex >= 0) and (ImgIndex < ImgList.Count) then begin + Result.cx := ImgList.Width; + Result.cy := ImgList.Height; + end; +end; + +procedure TSpTBXTabItemViewer.GetTabCloseButtonImgList(var AImageList: TCustomImageList; + var AImageIndex: Integer); +var + T: TSpTBXTabToolbar; +begin + AImageList := nil; + AimageIndex := -1; + if IsOnTabToolbar then begin + T := TSpTBXTabToolbar(View.Window); + if T.TabCloseButton <> tcbNone then begin + AImageList := GetImageList; + AImageIndex := T.TabCloseButtonImageIndex; + if not Assigned(AImageList) or (AImageIndex < 0) or (AImageIndex >= AImageList.Count) then begin + AImageList := MDIButtonsImgList; + AImageIndex := 0; + end; + end; + end; +end; + +function TSpTBXTabItemViewer.GetTabPosition: TSpTBXTabPosition; +begin + if IsOnTabToolbar then + Result := TSpTBXTabToolbar(View.Window).TabPosition + else + Result := ttpTop; +end; + +function TSpTBXTabItemViewer.GetTextColor(State: TSpTBXSkinStatesType): TColor; +begin + Result := Item.FontSettings.Color; + if Result = clNone then begin + if View.Window is TSpTBXTabToolbar then + Result := TSpTBXToolbarAccess(View.Window).GetItemsTextColor(State); + if Result = clNone then + Result := CurrentSkin.GetTextColor(skncTab, State) + end; +end; + +procedure TSpTBXTabItemViewer.InternalMouseMove(Shift: TShiftState; X, + Y: Integer); +var + P: TPoint; + R: TRect; + NewState: TSpTBXSkinStatesType; +begin + inherited; + + if FTabCloseButtonState in [sknsNormal, sknsHotTrack] then begin + if not Item.Enabled then begin + FTabCloseButtonState := sknsDisabled; + Exit; + end; + P := Point(X, Y); + R := GetRightImageRect; + if PtInRect(R, P) then + NewState := sknsHotTrack + else + NewState := sknsNormal; + if NewState <> FTabCloseButtonState then begin + FTabCloseButtonState := NewState; + InvalidateRect(View.Window.Handle, @R, True) + end; + end; +end; + +function TSpTBXTabItemViewer.IsOnTabToolbar: Boolean; +begin + Result := Assigned(View.Window) and (View.Window is TSpTBXTabToolbar); +end; + +function TSpTBXTabItemViewer.IsTabCloseButtonVisible: Boolean; +var + T: TSpTBXTabToolbar; +begin + Result := False; + if IsOnTabToolbar then begin + T := TSpTBXTabToolbar(View.Window); + case T.TabCloseButton of + tcbNone: + Exit; + tcbActive: + if not Item.Checked then Exit; + end; + Result := True; + end; +end; + +procedure TSpTBXTabItemViewer.Leaving; +var + R: TRect; +begin + inherited; + if FTabCloseButtonState = sknsHotTrack then begin + FTabCloseButtonState := sknsNormal; + R := GetRightImageRect; + InvalidateRect(View.Window.Handle, @R, True) + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXTabToolbar } + +constructor TSpTBXTabToolbar.Create(AOwner: TComponent); +begin + inherited; + FHiddenTabs := TSpTBXItemCacheCollection.Create(TSpTBXItemCache); + if Owner is TSpTBXCustomTabSet then + FOwnerTabControl := Owner as TSpTBXCustomTabSet + else + FOwnerTabControl := nil; + FActiveTabIndex := -1; + FTabBackgroundBorders := False; + FSkinType := sknSkin; + FTabAutofitMaxSize := 200; + FTabCloseButtonImageIndex := -1; + FTabColor := clBtnFace; + FTabMaxSize := -1; + FTabPosition := ttpTop; +end; + +destructor TSpTBXTabToolbar.Destroy; +begin + FHiddenTabs.Free; + inherited; +end; + +procedure TSpTBXTabToolbar.DoItemNotification(Ancestor: TTBCustomItem; + Relayed: Boolean; Action: TTBItemChangedAction; Index: Integer; + Item: TTBCustomItem); +begin + inherited; + if Action = tbicInvalidateAndResize then begin + // Invalidate the NC area, draw the bottom border of the active tab + if (FUpdateHidden = 0) and not IsItemMoving then + InvalidateNC; + end; +end; + +procedure TSpTBXTabToolbar.BeginUpdateHidden; +begin + if FUpdateHidden < 0 then FUpdateHidden := 0; + if FUpdateHidden = 0 then + SendMessage(Handle, WM_SETREDRAW, 0, 0); + Inc(FUpdateHidden); +end; + +procedure TSpTBXTabToolbar.EndUpdateHidden; +begin + Dec(FUpdateHidden); + if FUpdateHidden < 0 then FUpdateHidden := 0; + if FUpdateHidden = 0 then begin + SendMessage(Handle, WM_SETREDRAW, 1, 0); + InvalidateNC; + end; +end; + +procedure TSpTBXTabToolbar.InternalDrawBackground(ACanvas: TCanvas; ARect: TRect; + PaintOnNCArea: Boolean; PaintBorders: Boolean = True); +var + B: TBitmap; + R, BitmapR, DestR: TRect; + Tab: TSpTBXTabItem; + IV: TTBItemViewer; + T: TSpTBXSkinType; + PrevDelta, NextDelta: Integer; +begin + T := SpTBXSkinType(SkinType); + if PaintOnNCArea and Assigned(FOwnerTabControl) then begin + B := TBitmap.Create; + B.Canvas.Lock; + try + R := ARect; + B.Width := R.Right - R.Left; + B.Height := R.Bottom - R.Top; + + SpDrawXPToolbar(Self, B.Canvas, R, PaintOnNCArea, FTabBackgroundBorders and (T <> sknNone), skncTabToolbar); + + // Draw the bottom border of the active tab + Tab := ActiveTab; + if Assigned(Tab) and Tab.Visible then begin + IV := SpFindItemViewer(View, Tab); + if Assigned(IV) then begin + DestR := IV.BoundsRect; + OffsetRect(DestR, 2, 2); // Add the toolbar margins + TSpTBXTabItemViewer(IV).DrawBottomBorder(B.Canvas, DestR); + end; + if T = sknWindows then begin + if Tab.IsFirstVisible or Assigned(Tab.GetNextTab(False, sivtInmediateSkipNonVisible)) then + PrevDelta := 1 + else + PrevDelta := -1; + if Assigned(Tab.GetNextTab(True, sivtInmediateSkipNonVisible)) then + NextDelta := 1 + else + NextDelta := -1; + if FTabPosition = ttpTop then + ExcludeClipRect(B.Canvas.Handle, DestR.Left - PrevDelta, R.Bottom - 2, DestR.Right + NextDelta, R.Bottom + 4) + else + ExcludeClipRect(B.Canvas.Handle, DestR.Left - PrevDelta, R.Top + 2, DestR.Right + NextDelta, R.Top - 4); + end + else + if FTabPosition = ttpTop then + ExcludeClipRect(B.Canvas.Handle, DestR.Left + 1, R.Bottom - 2, DestR.Right - 1, R.Bottom + 4) + else + ExcludeClipRect(B.Canvas.Handle, DestR.Left + 1, R.Top + 2, DestR.Right -1 , R.Top - 4); + end; + + // Draw the bottom border of the tabs pane + BitmapR := Rect(0, 0, FOwnerTabControl.FBackground.Width, FOwnerTabControl.FBackground.Height); + case FTabPosition of + ttpTop: + begin + DestR := Rect(R.Left, R.Bottom - 2, R.Right, R.Bottom); + BitmapR.Bottom := BitmapR.Top + 2; + end; + ttpBottom: + begin + DestR := Rect(R.Left, R.Top, R.Right, R.Top + 2); + BitmapR.Top := BitmapR.Bottom - 2; + end; + end; + + B.Canvas.CopyRect(DestR, FOwnerTabControl.FBackground.Canvas, BitmapR); + ACanvas.Draw(0, 0, B); + finally + B.Canvas.UnLock; + B.Free; + end; + end + else + SpDrawXPToolbar(Self, ACanvas, ARect, PaintOnNCArea, FTabBackgroundBorders and (T <> sknNone), skncTabToolbar); +end; + +procedure TSpTBXTabToolbar.InvalidateActiveTab; +var + Tab: TSpTBXTabItem; + IV: TTBItemViewer; +begin + Tab := ActiveTab; + if Assigned(Tab) then begin + IV := SpFindItemViewer(View, Tab); + if Assigned(IV) then + View.Invalidate(IV); + end; +end; + +procedure TSpTBXTabToolbar.InvalidateNC; +begin + if (FUpdateHidden = 0) and not (tstResizing in FState) and HandleAllocated then + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_FRAME); +end; + +function TSpTBXTabToolbar.GetActiveTab: TSpTBXTabItem; +var + Item: TTBCustomItem; +begin + Result := nil; + if Assigned(Items) and (FActiveTabIndex > -1) and (Items.Count > 0) and + (FActiveTabIndex < Items.Count) then + begin + Item := Items[FActiveTabIndex]; + if not (csDestroying in Item.ComponentState) and (Item is TSpTBXTabItem) and Assigned(Item.Parent) then + Result := Items[FActiveTabIndex] as TSpTBXTabItem; + end; +end; + +function TSpTBXTabToolbar.GetItemsTextColor(State: TSpTBXSkinStatesType): TColor; +begin + Result := CurrentSkin.GetTextColor(skncTabToolbar, State, SkinType); + // Don't call inherited GetItemsTextColor, let the TabItem decide the color. +end; + +function TSpTBXTabToolbar.GetTabsCount(VisibleOnly: Boolean): Integer; +var + I: Integer; + IV: TTBItemViewer; +begin + Result := 0; + for I := 0 to View.ViewerCount - 1 do begin + IV := View.Viewers[I]; + if IV.Item is TSpTBXTabItem then + if VisibleOnly then begin + if IV.Item.Visible then Inc(Result); + end + else + Inc(Result); + end; +end; + +procedure TSpTBXTabToolbar.Autofit; +var + I, TabsCount, TabsWidth, TabsArea, NonTabsArea, RightAlignWidth: Integer; + IV: TTBItemViewer; + R: TRect; +begin + if not FTabAutofit or (FUpdateHidden > 0) or (Items.Count = 0) then Exit; + + BeginUpdateHidden; + try + // Make all the clipped items visible + for I := 0 to FHiddenTabs.Count - 1 do + FHiddenTabs.Items[I].Item.Visible := True; + FHiddenTabs.Clear; + + View.ValidatePositions; + View.BeginUpdate; + try + TabsCount := 0; + TabsWidth := 0; + NonTabsArea := 0; + RightAlignWidth := 0; + + // Get TabsCount and NonTabsArea + for I := 0 to View.ViewerCount - 1 do begin + IV := View.Viewers[I]; + if IV.Item.Visible then begin + if IV.Item is TSpTBXTabItem then + Inc(TabsCount) + else + if IV.Item is TSpTBXRightAlignSpacerItem then + Inc(RightAlignWidth, 20) + else begin + R := SpGetBoundsRect(IV, Items); + Inc(NonTabsArea, R.Right - R.Left); + end; + end; + end; + + // Get TabsArea + if TabsCount > 0 then begin + TabsArea := CurrentDock.ClientWidth - 4 - NonTabsArea - RightAlignWidth; + TabsWidth := TabsArea div TabsCount; + if TabsWidth > FTabAutofitMaxSize then + TabsWidth := FTabAutofitMaxSize; + end; + + // Get RightAlignWidth + Inc(RightAlignWidth, CurrentDock.Width - ((TabsWidth * TabsCount) + NonTabsArea + RightAlignWidth)); + + // Set TabsWidth and RightAlignWidth to the Items + for I := 0 to View.ViewerCount - 1 do begin + IV := View.Viewers[I]; + if IV.Item.Visible then begin + if IV.Item is TSpTBXTabItem then + TSpTBXTabItem(IV.Item).CustomWidth := TabsWidth + else + if IV.Item is TSpTBXRightAlignSpacerItem then + TSpTBXRightAlignSpacerItem(IV.Item).CustomWidth := RightAlignWidth - GetRightAlignMargin; + end; + end; + finally + View.EndUpdate; + end; + finally + EndUpdateHidden; + end; +end; + +procedure TSpTBXTabToolbar.RightAlignItems; +// Hide the items on resizing +var + I, J, W, H, VisibleTabsCount, iStart, iEnd: Integer; + VisibleWidth, RightAlignedWidth, SpacerW, RightAlignedBorder: Integer; + IV: TTBItemViewer; + Spacer: TSpTBXItemViewer; + RightAlignedList: TList; + IsRotated, IsFirstPartiallyVisible: Boolean; +begin + if (FUpdateHidden > 0) or (csDestroying in ComponentState) or (tstRightAligning in FState) or + not Assigned(CurrentDock) or (Items.Count <= 0) or + not Stretch or (ShrinkMode <> tbsmNone) or + (CurrentDock.Width <= 0) or (CurrentDock.Height <= 0) then + Exit; + + if FTabAutofit then begin + Autofit; + Exit; + end; + + FState := FState + [tstRightAligning]; + View.ValidatePositions; + View.BeginUpdate; + RightAlignedList := TList.Create; + try + IsRotated := CurrentDock.Position in [dpLeft, dpRight]; + // Find the spacer and the right aligned items + Spacer := SpGetRightAlignedItems(View, RightAlignedList, IsRotated, VisibleWidth, RightAlignedWidth); + if Assigned(Spacer) then begin + SpacerW := Spacer.BoundsRect.Right - Spacer.BoundsRect.Left; + RightAlignedBorder := CurrentDock.Width - 2 - RightAlignedWidth + SpacerW; + VisibleWidth := VisibleWidth - SpacerW; + SpacerW := CurrentDock.Width - VisibleWidth - 4; + end + else begin + SpacerW := 0; + RightAlignedBorder := CurrentDock.Width - 2; + end; + + // Show items + VisibleTabsCount := GetTabsCount(True); + IsFirstPartiallyVisible := False; + if VisibleTabsCount = 1 then begin + if VisibleWidth > CurrentDock.Width - 2 then + IsFirstPartiallyVisible := True; + end; + + if not IsFirstPartiallyVisible then begin + + IV := SpFindItemViewer(View, ActiveTab); + if Assigned(IV) and (IV.Item.Visible) then begin + iStart := IV.Index; + iEnd := IV.Index; + end + else begin + iStart := 0; + iEnd := 0; + end; + // Show items from left side of the ActiveTab + for I := iStart downto 0 do begin + IV := View.Viewers[I]; + if not IV.Item.Visible and (RightAlignedList.IndexOf(IV) = -1) then begin + // If the item was hidden and can be showed remove it from the HiddenList + J := FHiddenTabs.IndexOf(IV.Item); + if J > -1 then begin + W := 0; + H := 0; + TTBItemViewerAccess(IV).CalcSize(Canvas, W, H); + VisibleWidth := VisibleWidth + W; + if (VisibleTabsCount = 0) or (VisibleWidth < CurrentDock.Width - 2) then begin + SpacerW := SpacerW - W; + FHiddenTabs.Delete(J); + IV.Item.Visible := True; + Inc(VisibleTabsCount); + end + else + Break; + end; + end; + end; + // Show items from right side of the ActiveTab + for I := iEnd to View.ViewerCount - 1 do begin + IV := View.Viewers[I]; + if not IV.Item.Visible and (RightAlignedList.IndexOf(IV) = -1) then begin + // If the item was hidden and can be showed remove it from the HiddenList + J := FHiddenTabs.IndexOf(IV.Item); + if J > -1 then begin + W := 0; + H := 0; + TTBItemViewerAccess(IV).CalcSize(Canvas, W, H); + VisibleWidth := VisibleWidth + W; + if (VisibleTabsCount = 0) or (VisibleWidth < CurrentDock.Width - 2) then begin + SpacerW := SpacerW - W; + FHiddenTabs.Delete(J); + IV.Item.Visible := True; + Inc(VisibleTabsCount); + end + else + Break; + end; + end; + end; + + // Hide items + if VisibleTabsCount > 1 then + for I := View.ViewerCount - 1 downto 0 do begin + IV := View.Viewers[I]; + if (VisibleTabsCount > 1) and (IV is TSpTBXTabItemViewer) and IV.Item.Visible and (IV.BoundsRect.Right > RightAlignedBorder) then + if RightAlignedList.IndexOf(IV) = -1 then begin + // If the item can't be showed add it to the HiddenList + SpacerW := SpacerW + (IV.BoundsRect.Right - IV.BoundsRect.Left); + FHiddenTabs.Add(IV.Item); + IV.Item.Visible := False; + Dec(VisibleTabsCount); + end; + end; + end; + + // Resize the spacer + if Assigned(Spacer) then + TSpTBXCustomItemAccess(Spacer.Item).CustomWidth := SpacerW; + + View.UpdatePositions; + finally + RightAlignedList.Free; + View.EndUpdate; + FState := FState - [tstRightAligning]; + end; +end; + +procedure TSpTBXTabToolbar.TabClose(ATab: TSpTBXTabItem); +begin + ATab.TabClose; +end; + +procedure TSpTBXTabToolbar.MakeVisible(ATab: TSpTBXTabItem); +var + TabIV, FirstIV, LastIV: TTBItemViewer; + I: Integer; + Spacer: TSpTBXItemViewer; +begin + if (Items.Count > 1) and Assigned(ATab) and (ATab.Visible = False) then begin + TabIV := View.Find(ATab); + FirstIV := View.NextSelectable(nil, True); + + // LastIV minus the right aligned items + Spacer := SpGetFirstRightAlignSpacer(View); + if Assigned(Spacer) then + LastIV := View.NextSelectable(Spacer, False) + else + LastIV := View.NextSelectable(nil, False); + + if Assigned(FirstIV) and Assigned(LastIV) then begin + for I := 0 to View.ViewerCount - 1 do begin + if TabIV.Index >= FirstIV.Index then + ScrollRight + else + ScrollLeft; + if TabIV.Item.Visible then + Break; + end; + end; + end; +end; + +procedure TSpTBXTabToolbar.Scroll(ToRight: Boolean); +var + FirstIV, LastIV: TTBItemViewer; + I, VisibleWidth: Integer; + Spacer: TSpTBXItemViewer; + + function ProcessScroll(IV: TTBItemViewer): Boolean; + var + IVIndex, ClippedIndex, VisibleTabsCount, W, H: Integer; + begin + Result := False; + + ClippedIndex := FHiddenTabs.IndexOf(IV.Item); + if Assigned(IV) and (ClippedIndex > -1) then begin + Result := True; // a clipped tab was found + View.BeginUpdate; + BeginUpdateHidden; + try + VisibleTabsCount := GetTabsCount(True); + // Try to hide all the necessary tabs + W := 0; + H := 0; + TTBItemViewerAccess(IV).CalcSize(Canvas, W, H); + if ToRight then begin + while Assigned(FirstIV) and (VisibleWidth + W >= CurrentDock.ClientWidth - 2) do begin + VisibleWidth := VisibleWidth - (FirstIV.BoundsRect.Right - FirstIV.BoundsRect.Left); + FHiddenTabs.Add(FirstIV.Item); + FirstIV.Item.Visible := False; + FirstIV := SpGetNextTabItemViewer(View, FirstIV, True, sivtNormal); + Dec(VisibleTabsCount); + end; + end + else begin + while Assigned(LastIV) and (VisibleWidth + W >= CurrentDock.ClientWidth - 2) do begin + VisibleWidth := VisibleWidth - (LastIV.BoundsRect.Right - LastIV.BoundsRect.Left); + FHiddenTabs.Add(LastIV.Item); + LastIV.Item.Visible := False; + LastIV := SpGetNextTabItemViewer(View, LastIV, False, sivtNormal); + Dec(VisibleTabsCount); + end; + end; + + // Try to show all the necessary clipped tabs + IVIndex := IV.Index; + while Assigned(IV) and (ClippedIndex > -1) and ((VisibleTabsCount = 0) or (VisibleWidth + W <= CurrentDock.ClientWidth - 2)) do begin + VisibleWidth := VisibleWidth + W; + IV.Item.Visible := True; + FHiddenTabs.Delete(ClippedIndex); + Inc(VisibleTabsCount); + + if ToRight then + Inc(IVIndex) + else + Dec(IVIndex); + + if (IVIndex > -1) and (IVIndex < View.ViewerCount) then begin + IV := View.Viewers[IVIndex]; + ClippedIndex := FHiddenTabs.IndexOf(IV.Item); + W := 0; + H := 0; + TTBItemViewerAccess(IV).CalcSize(Canvas, W, H); + end + else + Break; + end; + finally + EndUpdateHidden; + View.EndUpdate; + if Assigned(Spacer) then + RightAlignItems; + end; + end; + end; + +begin + if (Items.Count > 1) and not FTabAutofit then begin + // Find the first Tab + FirstIV := SpGetNextTabItemViewer(View, nil, True, sivtNormal); + + // Get the VisibleWidth + LastIV := View.NextSelectable(nil, False); + if not Assigned(LastIV) then Exit; + VisibleWidth := LastIV.BoundsRect.Right; + + // LastIV minus the right aligned items + Spacer := SpGetFirstRightAlignSpacer(View); + if Assigned(Spacer) then begin + VisibleWidth := VisibleWidth - (Spacer.BoundsRect.Right - Spacer.BoundsRect.Left); + LastIV := View.NextSelectable(Spacer, False); + end; + if Assigned(LastIV) and not (LastIV.Item is TSpTBXTabItem) then + LastIV := SpGetNextTabItemViewer(View, LastIV, False, sivtNormal); + + if Assigned(FirstIV) and Assigned(LastIV) then begin + if ToRight then begin + // Find the first clipped tab from the right side of the tabset + for I := LastIV.Index + 1 to View.ViewerCount - 1 do + if ProcessScroll(View.Viewers[I]) then + Break; + end + else begin + // Find the first clipped tab from the left side of the tabset + for I := FirstIV.Index - 1 downto 0 do + if ProcessScroll(View.Viewers[I]) then + Break; + end; + end; + + end; +end; + +procedure TSpTBXTabToolbar.ScrollLeft; +begin + Scroll(False); +end; + +procedure TSpTBXTabToolbar.ScrollRight; +begin + Scroll(True); +end; + +procedure TSpTBXTabToolbar.ScrollState(out CanScrollToLeft, CanScrollToRight: Boolean); +var + FirstIV, LastIV: TTBItemViewer; + I, ClippedIndex: Integer; + Spacer: TSpTBXItemViewer; +begin + CanScrollToLeft := False; + CanScrollToRight := False; + if (FHiddenTabs.Count > 0) and not FTabAutofit then begin + // Find the first Tab + FirstIV := SpGetNextTabItemViewer(View, nil, True, sivtNormal); + + if Assigned(FirstIV) then begin + // Find the first clipped tab from the left side of the tabset + for I := FirstIV.Index - 1 downto 0 do begin + ClippedIndex := FHiddenTabs.IndexOf(View.Viewers[I].Item); + if ClippedIndex > -1 then begin + CanScrollToLeft := True; + Break; + end; + end; + end; + + // LastIV minus the right aligned items + Spacer := SpGetFirstRightAlignSpacer(View); + if Assigned(Spacer) then + LastIV := View.NextSelectable(Spacer, False) + else + LastIV := View.NextSelectable(nil, False); + // Find the first clipped tab from the right side of the tabset + if Assigned(LastIV) then begin + for I := LastIV.Index + 1 to View.ViewerCount - 1 do begin + ClippedIndex := FHiddenTabs.IndexOf(View.Viewers[I].Item); + if ClippedIndex > -1 then begin + CanScrollToRight := True; + Break; + end; + end; + end; + end; +end; + +procedure TSpTBXTabToolbar.SetActiveTabIndex(Value: Integer); +var + ATab, APrevTab: TSpTBXTabItem; + I: Integer; +begin + if not Assigned(FOwnerTabControl) then Exit; + + if (Value > -1) and (Value < Items.Count) and not (csDestroying in Items[Value].ComponentState) then begin + if not (Items[Value] is TSpTBXTabItem) then + Value := FActiveTabIndex; + end + else + Value := -1; + + if (Value <> FActiveTabIndex) and FOwnerTabControl.CanActiveTabChange(FActiveTabIndex, Value) then + begin + I := FActiveTabIndex; + FActiveTabIndex := Value; + + // Hide the previous TabSheet + if (I > -1) and (I < Items.Count) and not (csDestroying in Items[I].ComponentState) and + (Items[I] is TSpTBXTabItem) then + begin + APrevTab := Items[I] as TSpTBXTabItem; + APrevTab.Checked := False; + if Assigned(APrevTab.Control) then + APrevTab.Control.Visible := False; + end; + + // Check the item and invalidate NC + if FActiveTabIndex > -1 then begin + // Show the TabSheet + ATab := Items[FActiveTabIndex] as TSpTBXTabItem; + ATab.Checked := True; + if Assigned(ATab.Control) then begin + ATab.Control.Visible := True; + ATab.Control.BringToFront; + end; + MakeVisible(ATab); + end; + + FOwnerTabControl.DoActiveTabChange(FActiveTabIndex); + InvalidateNC; + end; +end; + +procedure TSpTBXTabToolbar.SetTabCloseButton(const Value: TSpTBXTabCloseButton); +begin + if FTabCloseButton <> Value then begin + FTabCloseButton := Value; + View.InvalidatePositions; + RightAlignItems; + InvalidateNC; + end; +end; + +procedure TSpTBXTabToolbar.SetTabCloseButtonImageIndex(const Value: Integer); +begin + if FTabCloseButtonImageIndex <> Value then begin + FTabCloseButtonImageIndex := Value; + Invalidate; + end; +end; + +procedure TSpTBXTabToolbar.SetTabAutofit(const Value: Boolean); +begin + if FTabAutofit <> Value then begin + FTabAutofit := Value; + if FTabAutofit then begin + Autofit; + InvalidateNC; + end; + end; +end; + +procedure TSpTBXTabToolbar.SetTabAutofitMaxSize(const Value: Integer); +begin + if FTabAutofitMaxSize <> Value then begin + FTabAutofitMaxSize := Value; + if FTabAutofit then Autofit; + end; +end; + +procedure TSpTBXTabToolbar.SetTabBackgroundBorders(const Value: Boolean); +begin + if FTabBackgroundBorders <> Value then begin + FTabBackgroundBorders := Value; + InvalidateNC; + end; +end; + +procedure TSpTBXTabToolbar.SetTabColor(const Value: TColor); +begin + if (FTabColor <> Value) then begin + FTabColor := Value; + if FSkinType <> sknSkin then begin + Invalidate; + InvalidateNC; + end; + end; +end; + +procedure TSpTBXTabToolbar.SetTabMaxSize(const Value: Integer); +begin + if FTabMaxSize <> Value then begin + FTabMaxSize := Value; + View.InvalidatePositions; + RightAlignItems; + InvalidateNC; + end; +end; + +procedure TSpTBXTabToolbar.SetTabPosition(const Value: TSpTBXTabPosition); +begin + if FTabPosition <> Value then + FTabPosition := Value; +end; + +procedure TSpTBXTabToolbar.SetSkinType(const Value: TSpTBXSkinType); +begin + if FSkinType <> Value then begin + FSkinType := Value; + Invalidate; + InvalidateNC; + end; +end; + +procedure TSpTBXTabToolbar.CMDesignHitTest(var Message: TCMDesignHitTest); +var + P: TPoint; + IV: TTBItemViewer; + Shift: TShiftState; +begin + // Allow left-clicks on TabItems at design time + Shift := KeysToShiftState(Message.Keys); + if (csDesigning in ComponentState) and (ssLeft in Shift) and Assigned(View) then begin + P := SmallPointToPoint(Message.Pos); + IV := View.ViewerFromPoint(P); + if Assigned(IV) and Assigned(IV.Item) and (IV.Item is TSpTBXTabItem) then + IV.Item.Click; + end; + + inherited; +end; + +function TSpTBXTabToolbar.CanDragCustomize(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer): Boolean; +var + IV: TTBItemViewer; + TabIV: TSpTBXTabItemViewer; +begin + Result := False; + FBeginDragIV := nil; + + if not (csDesigning in ComponentState) and (Button = mbLeft) then begin + IV := SpGetItemViewerFromPoint(Items, View, Point(X, Y)); + if Assigned(IV) and (IV is TSpTBXTabItemViewer) and Assigned(IV.Item) and IV.Item.Enabled and IV.Item.Visible then begin + // Close the tab if the close button is pressed + TabIV := TSpTBXTabItemViewer(IV); + if (TabIV.TabCloseButtonState = sknsHotTrack) and TabIV.IsTabCloseButtonVisible then begin + Result := True; // Bypass the inherited mouse down + TabIV.Item.TabClose; + end + else begin + // Click the item on mouse down + if not IV.Item.Checked then begin + Result := True; // Bypass the inherited mouse down + IV.Item.Click; + if Assigned(OnMouseDown) then OnMouseDown(Self, Button, Shift, X, Y); + end; + // Drag reorder + if FTabDragReorder and not IsCustomizing and IV.Item.Checked then begin + Result := True; // Bypass the inherited mouse down + FBeginDragIV := IV; + BeginDrag(False, 2); + end; + end; + end + else + Result := inherited CanDragCustomize(Button, Shift, X, Y); + end; +end; + +procedure TSpTBXTabToolbar.DoStartDrag(var DragObject: TDragObject); +begin + if FTabDragReorder and Assigned(FBeginDragIV) and Assigned(FBeginDragIV.Item) and (FBeginDragIV is TSpTBXTabItemViewer) then begin + DragObject := TSpTBXTabItemDragObject.Create(Self, FBeginDragIV.Item); + inherited DoStartDrag(DragObject); + end + else + inherited DoStartDrag(DragObject); +end; + +procedure TSpTBXTabToolbar.DragOver(Source: TObject; X, Y: Integer; + State: TDragState; var Accept: Boolean); +var + D: TSpTBXTabItemDragObject; + DestIV, RightAlignIV: TTBItemViewer; + OrigItem: TTBCustomItem; + OrigPos, DestPos, RightAlignPos: Integer; +begin + inherited DragOver(Source, X, Y, State, Accept); + + if FTabDragReorder and Assigned(Source) and (Source is TSpTBXTabItemDragObject) then begin + D := Source as TSpTBXTabItemDragObject; + OrigItem := D.SouceItem; + OrigPos := OrigItem.Parent.IndexOf(OrigItem); + + // Move the dragging item in the toolbar + if OrigItem.Parent = Items then begin + Accept := True; + SpGetDropPosItemViewer(Items, View, Point(X, Y), OrigPos, DestIV, DestPos); + RightAlignIV := SpGetFirstRightAlignSpacer(View); + if Assigned(RightAlignIV) then + RightAlignPos := Items.IndexOf(RightAlignIV.Item) + else + RightAlignPos := -1; + if (OrigPos <> DestPos) and (DestPos > -1) and (DestPos < Items.Count) and (OrigItem <> DestIV.Item) and + not ((RightAlignPos > -1) and (DestPos >= RightAlignPos)) then + begin + if FOwnerTabControl.CanActiveTabReorder(OrigPos, DestPos) then begin + BeginItemMove; + View.BeginUpdate; + try + // The item is the active tab, we need to update the ActiveTabIndex + // Just set the internal value because the page didn't change + FActiveTabIndex := DestPos; + Items.Move(OrigPos, DestPos); + FOwnerTabControl.DoActiveTabReorder(DestPos); + finally + View.EndUpdate; + EndItemMove; + InvalidateNC; + end; + end; + end; + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXTabSheet } + +procedure TSpTBXTabSheet.AdjustClientRect(var Rect: TRect); +var + Margin, XPMargin: Integer; +begin + inherited AdjustClientRect(Rect); + + if Assigned(FTabControl) then begin + Margin := 2; + XPMargin := 2; + // [Theme-Change] + // WinXP theme needs to have 4 pixel margin + if SpTBXSkinType(FTabControl.SkinType) = sknWindows then + XPMargin := Margin + 2; + + Inc(Rect.Left, Margin); + Dec(Rect.Right, XPMargin); + case FTabControl.TabPosition of + ttpTop: dec(Rect.Bottom, XPMargin); + ttpBottom: inc(Rect.Top, XPMargin); + end; + end; +end; + +constructor TSpTBXTabSheet.Create(AOwner: TComponent); +begin + inherited; + ControlStyle := ControlStyle + [csAcceptsControls, csOpaque, csSetCaption]; + Align := alClient; + Visible := False; +end; + +procedure TSpTBXTabSheet.CreateParams(var Params: TCreateParams); +begin + inherited CreateParams(Params); + if not (csDesigning in ComponentState) then + with Params do + Params.Style := Params.Style or WS_CLIPCHILDREN; +end; + +procedure TSpTBXTabSheet.DefineProperties(Filer: TFiler); +begin + inherited; + Filer.DefineProperty('TabItem', ReadItemName, WriteItemName, True); +end; + +destructor TSpTBXTabSheet.Destroy; +begin + // If the Item <> nil it means the tabsheet was removed from the form at + // designtime or freed at runtime. + // If that happens TabDeleting was not called, we should call it before + // the tabsheet is destroyed to free the Item and delete it from the + // FPages list. + if Assigned(FItem) then + if Assigned(FTabControl) and not (csDestroying in FTabControl.ComponentState) then + FTabControl.TabDeleting(FItem, False); + + FTabControl := nil; + FItem := nil; + inherited; +end; + +procedure TSpTBXTabSheet.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if Operation = opRemove then + if AComponent = FPrevFocused then FPrevFocused := nil; +end; + +procedure TSpTBXTabSheet.VisibleChanging; +begin + if not (csDesigning in ComponentState) then + if Visible then begin + // TabSheet will be hidden, save the focused control + if Assigned(FPrevFocused) then FPrevFocused.RemoveFreeNotification(Self); + SpIsFocused(Self, FPrevFocused); + if Assigned(FPrevFocused) then FPrevFocused.FreeNotification(Self); + end; + + inherited; +end; + +procedure TSpTBXTabSheet.CMVisiblechanged(var Message: TMessage); +begin + if not (csDesigning in ComponentState) then + if Visible then begin + // TabSheet was showed. + // Focus the previous focused control, or focus the first child + if Assigned(FPrevFocused) then begin + if SpCanFocus(FPrevFocused) then + FPrevFocused.SetFocus; + FPrevFocused.RemoveFreeNotification(Self); + FPrevFocused := nil; + end + else + SpFocusFirstChild(Self); + end; + + inherited; +end; + +function TSpTBXTabSheet.GetCaption: WideString; +begin + if Assigned(FItem) then Result := FItem.Caption + else Result := ''; +end; + +function TSpTBXTabSheet.GetImageIndex: Integer; +begin + if Assigned(FItem) then Result := FItem.ImageIndex + else Result := -1; +end; + +function TSpTBXTabSheet.GetTabVisible: Boolean; +begin + if Assigned(FItem) then Result := FItem.Visible + else Result := False; +end; + +procedure TSpTBXTabSheet.SetCaption(const Value: WideString); +begin + if Assigned(FItem) then FItem.Caption := Value; +end; + +procedure TSpTBXTabSheet.SetImageIndex(const Value: Integer); +begin + if Assigned(FItem) then FItem.ImageIndex := Value; +end; + +procedure TSpTBXTabSheet.SetTabVisible(const Value: Boolean); +begin + if Assigned(FItem) then FItem.Visible := Value; +end; + +procedure TSpTBXTabSheet.ReadItemName(Reader: TReader); +begin + case Reader.NextValue of + vaLString, vaString: + FItemName := Reader.ReadString; + else + FItemName := Reader.ReadWideString; + end; +end; + +procedure TSpTBXTabSheet.WriteItemName(Writer: TWriter); +begin + if Assigned(Item) then + FItemName := Item.Name; + Writer.WriteWideString(FItemName); +end; + +procedure TSpTBXTabSheet.ReadState(Reader: TReader); +var + C: TComponent; + TC: TSpTBXCustomTabControl; +begin + // The TabSheet is being created from the DFM stream + // We must set the initial values of TabControl, Item and add itself to + // the Pages list of the parent TabControl. + + inherited ReadState(Reader); + if Reader.Parent is TSpTBXCustomTabControl then begin + // Set TabControl + TC := TSpTBXCustomTabControl(Reader.Parent); + TabControl := TC; + // Set Item and add Self to TabControl.Pages + if not Assigned(FItem) and (FItemName <> '') then begin + C := Owner.FindComponent(FItemName); + if Assigned(C) and (C is TSpTBXTabItem) then begin + FItem := C as TSpTBXTabItem; + FItem.Control := Self; + if TC.FPages.IndexOf(Self) = -1 then + TC.FPages.Add(Self); + end; + end; + end; +end; + +procedure TSpTBXTabSheet.WMEraseBkgnd(var Message: TWMEraseBkgnd); +var + R: TRect; +begin + if Assigned(FTabControl) and Visible then begin + if not DoubleBuffered or (TMessage(Message).wParam = TMessage(Message).lParam) then begin + R := ClientRect; + if FTabControl.TabVisible then begin + case FTabControl.TabPosition of + ttpTop: dec(R.Top, 4); + ttpBottom: inc(R.Bottom, 4); + end; + end; + FTabControl.DrawBackground(Message.DC, R); + end; + end; + Message.Result := 1; +end; + +procedure TSpTBXTabSheet.WMWindowPosChanged(var Message: TWMWindowPosChanged); +begin + inherited; + SpInvalidateSpTBXControl(Self, True, True); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomTabSet } + +constructor TSpTBXCustomTabSet.Create(AOwner: TComponent); +begin + inherited; + ControlStyle := ControlStyle + [csAcceptsControls, csOpaque]; + + FTabVisible := True; + FBackground := TBitmap.Create; + + Width := 289; + Height := FDock.Height + 2; + ParentColor := False; + Color := clBtnFace; + + FToolbar.Items.RegisterNotification(ItemNotification); +end; + +destructor TSpTBXCustomTabSet.Destroy; +begin + FToolbar.Items.UnRegisterNotification(ItemNotification); + FreeAndNil(FBackground); + inherited; +end; + +procedure TSpTBXCustomTabSet.DefineProperties(Filer: TFiler); +begin + inherited; + Filer.DefineProperty('HiddenItems', ReadHiddenItems, WriteHiddenItems, True); +end; + +procedure TSpTBXCustomTabSet.ReadHiddenItems(Reader: TReader); +begin + if Reader.ReadValue = vaCollection then + Reader.ReadCollection(Toolbar.FHiddenTabs); +end; + +procedure TSpTBXCustomTabSet.WriteHiddenItems(Writer: TWriter); +begin + Writer.WriteCollection(Toolbar.FHiddenTabs); +end; + +procedure TSpTBXCustomTabSet.Loaded; +var + I: Integer; + CacheCollection: TSpTBXItemCacheCollection; + Cache: TSpTBXItemCache; + C: TComponent; +begin + ActiveTabIndex := FLoadingActiveIndex; + + inherited; + // Read the HiddenTabs collection, and fill the Item property of the + // collection items reading the Name from the DFM + CacheCollection := Toolbar.FHiddenTabs; + if Assigned(CacheCollection) then + for I := CacheCollection.Count - 1 downto 0 do begin + Cache := CacheCollection[I]; + if not Assigned(Cache.Item) then begin + if Cache.Name = '' then + CacheCollection.Delete(I) + else begin + C := Owner.FindComponent(Cache.Name); + if Assigned(C) and (C is TTBCustomItem) then begin + Cache.Item := C as TTBCustomItem; + // If the Item is visible then the entry is not valid, delete it + if Cache.Item.Visible then + CacheCollection.Delete(I); + end; + end; + end; + end; + + if TabAutofit then + Toolbar.Autofit; +end; + +function TSpTBXCustomTabSet.GetToolbarClass: TSpTBXToolbarClass; +begin + Result := TSpTBXTabToolbar; +end; + +function TSpTBXCustomTabSet.GetFullRepaint: Boolean; +begin + Result := True; +end; + +function TSpTBXCustomTabSet.Add(ACaption: WideString): TSpTBXTabItem; +var + I: Integer; + SpacerIV: TSpTBXItemViewer; +begin + Result := TSpTBXTabItem.Create(Self); + try + Result.Caption := ACaption; + SpacerIV := SpGetFirstRightAlignSpacer(View); + + if Assigned(SpacerIV) then begin + I := Items.IndexOf(SpacerIV.Item); + if I > -1 then + Items.Insert(I, Result); + end + else + Items.Add(Result); + except + Result.Free; + Result := nil; + end; +end; + +function TSpTBXCustomTabSet.Insert(NewIndex: Integer; ACaption: WideString): TSpTBXTabItem; +begin + Result := TSpTBXTabItem.Create(Self); + try + Result.Caption := ACaption; + Items.Insert(NewIndex, Result); + except + Result.Free; + Result := nil; + end; +end; + +procedure TSpTBXCustomTabSet.TabClick(ATab: TSpTBXTabItem); +begin + ATab.Click; // calls TabToolbar.DoTabClick and Self.DoTabClick +end; + +function TSpTBXCustomTabSet.CanActiveTabChange(const TabIndex, NewTabIndex: Integer): Boolean; +begin + Result := True; + if not (csLoading in ComponentState) then + if (NewTabIndex > -1) and not Items[NewTabIndex].Checked then + if Assigned(FOnActiveTabChanging) then FOnActiveTabChanging(Self, TabIndex, NewTabIndex, Result); +end; + +procedure TSpTBXCustomTabSet.DoActiveTabChange(const TabIndex: Integer); +begin + if not (csLoading in ComponentState) then + if Assigned(FOnActiveTabChange) then FOnActiveTabChange(Self, TabIndex); +end; + +function TSpTBXCustomTabSet.CanActiveTabReorder(const TabIndex, NewTabIndex: Integer): Boolean; +begin + Result := True; + if Assigned(FOnActiveTabReordering) then FOnActiveTabReordering(Self, TabIndex, NewTabIndex, Result); +end; + +procedure TSpTBXCustomTabSet.DoActiveTabReorder(const TabIndex: Integer); +begin + if Assigned(FOnActiveTabReorder) then FOnActiveTabReorder(Self, TabIndex); +end; + +procedure TSpTBXCustomTabSet.MakeVisible(ATab: TSpTBXTabItem); +begin + if Assigned(FToolbar) then Toolbar.MakeVisible(ATab); +end; + +procedure TSpTBXCustomTabSet.ScrollLeft; +begin + if Assigned(FToolbar) then Toolbar.ScrollLeft; +end; + +procedure TSpTBXCustomTabSet.ScrollRight; +begin + if Assigned(FToolbar) then Toolbar.ScrollRight; +end; + +procedure TSpTBXCustomTabSet.ScrollState(out Left, Right: Boolean); +begin + if Assigned(FToolbar) then Toolbar.ScrollState(Left, Right); +end; + +function TSpTBXCustomTabSet.GetActiveTabIndex: Integer; +begin + if Assigned(FToolbar) then + Result := Toolbar.ActiveTabIndex + else + Result := -1; +end; + +procedure TSpTBXCustomTabSet.SetActiveTabIndex(Value: Integer); +begin + // When the component is reading from the DFM the Items are not created. + // We must save the value setted at design time and use it when the + // form is finally loaded. + if csReading in ComponentState then + FLoadingActiveIndex := Value + else + if Assigned(FToolbar) then + Toolbar.ActiveTabIndex := Value; +end; + +function TSpTBXCustomTabSet.GetTabCloseButton: TSpTBXTabCloseButton; +begin + if Assigned(FToolbar) then + Result := Toolbar.TabCloseButton + else + Result := tcbNone; +end; + +procedure TSpTBXCustomTabSet.SetTabCloseButton(const Value: TSpTBXTabCloseButton); +begin + if Assigned(FToolbar) then + Toolbar.TabCloseButton := Value; +end; + +function TSpTBXCustomTabSet.GetTabCloseButtonImageIndex: Integer; +begin + if Assigned(FToolbar) then + Result := Toolbar.TabCloseButtonImageIndex + else + Result := -1; +end; + +procedure TSpTBXCustomTabSet.SetTabCloseButtonImageIndex(const Value: Integer); +begin + if Assigned(FToolbar) then + Toolbar.TabCloseButtonImageIndex := Value; +end; + +function TSpTBXCustomTabSet.GetTabAutofit: Boolean; +begin + if Assigned(FToolbar) then + Result := Toolbar.TabAutofit + else + Result := False; +end; + +procedure TSpTBXCustomTabSet.SetTabAutofit(const Value: Boolean); +begin + if Assigned(FToolbar) then + Toolbar.TabAutofit := Value; +end; + +function TSpTBXCustomTabSet.GetTabAutofitMaxSize: Integer; +begin + if Assigned(FToolbar) then + Result := Toolbar.TabAutofitMaxSize + else + Result := -1; +end; + +procedure TSpTBXCustomTabSet.SetTabAutofitMaxSize(const Value: Integer); +begin + if Assigned(FToolbar) then + Toolbar.TabAutofitMaxSize := Value; +end; + +function TSpTBXCustomTabSet.GetTabBackgroundBorders: Boolean; +begin + if Assigned(FToolbar) then + Result := Toolbar.TabBackgroundBorders + else + Result := True; +end; + +procedure TSpTBXCustomTabSet.SetTabBackgroundBorders(const Value: Boolean); +begin + if Assigned(FToolbar) then Toolbar.TabBackgroundBorders := Value +end; + +function TSpTBXCustomTabSet.GetTabBackgroundColor: TColor; +begin + if Assigned(FToolbar) then + Result := FToolbar.Color + else + Result := clNone; +end; + +procedure TSpTBXCustomTabSet.SetTabBackgroundColor(const Value: TColor); +begin + if Assigned(FToolbar) then FToolbar.Color := Value +end; + +function TSpTBXCustomTabSet.GetTabDragReorder: Boolean; +begin + Result := False; + if Assigned(FToolbar) then + Result := Toolbar.TabDragReorder; +end; + +procedure TSpTBXCustomTabSet.SetTabDragReorder(const Value: Boolean); +begin + if Assigned(FToolbar) then + Toolbar.TabDragReorder := Value; +end; + +function TSpTBXCustomTabSet.GetTabMaxSize: Integer; +begin + Result := -1; + if Assigned(FToolbar) then + Result := Toolbar.TabMaxSize; +end; + +procedure TSpTBXCustomTabSet.SetTabMaxSize(const Value: Integer); +begin + if Assigned(FToolbar) then + Toolbar.TabMaxSize := Value; +end; + +function TSpTBXCustomTabSet.GetTabToolbar: TSpTBXTabToolbar; +begin + Result := FToolbar as TSpTBXTabToolbar; +end; + +function TSpTBXCustomTabSet.GetSkinType: TSpTBXSkinType; +begin + if Assigned(FToolbar) then + Result := Toolbar.SkinType + else + Result := sknNone; +end; + +procedure TSpTBXCustomTabSet.SetSkinType(const Value: TSpTBXSkinType); +begin + if Assigned(FToolbar) then begin + Toolbar.SkinType := Value; + InvalidateBackground; + end; +end; + +function TSpTBXCustomTabSet.GetTabPosition: TSpTBXTabPosition; +begin + if Assigned(FToolbar) then + Result := Toolbar.TabPosition + else + Result := ttpTop; +end; + +procedure TSpTBXCustomTabSet.SetTabPosition(const Value: TSpTBXTabPosition); +var + T: TSpTBXTabToolbar; +begin + if Assigned(FToolbar) and Assigned(FDock) then begin + T := Toolbar; + if T.TabPosition <> Value then begin + T.Visible := False; + T.Parent := nil; + T.TabPosition := Value; + case Value of + ttpTop: FDock.Position := dpTop; + ttpBottom: FDock.Position := dpBottom; + end; + T.CurrentDock := FDock; + T.Visible := True; + + InvalidateBackground; + end; + end; +end; + +procedure TSpTBXCustomTabSet.SetTabVisible(const Value: Boolean); +begin + if FTabVisible <> Value then begin + FTabVisible := Value; + if Assigned(FDock) then + FDock.Visible := Value; + end; +end; + +function TSpTBXCustomTabSet.GetTabSetHeight: Integer; +begin + if Assigned(FDock) then + Result := FDock.Height + else + Result := 0; +end; + +procedure TSpTBXCustomTabSet.DoDrawBackground(ACanvas: TCanvas; + ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +begin + if Assigned(FOnDrawBackground) then FOnDrawBackground(Self, ACanvas, ARect, PaintStage, PaintDefault); +end; + +function TSpTBXCustomTabSet.DrawBackground(DC: HDC; ARect: TRect): Boolean; +var + ACanvas: TCanvas; + PaintDefault: Boolean; + R: TRect; +begin + Result := False; + if (csDestroying in ComponentState) or not Assigned(FDock) or + not Assigned(FBackground) or IsRectEmpty(ARect) then Exit; + + ACanvas := TCanvas.Create; + try + ACanvas.Handle := DC; + R := Rect(0, 0, ARect.Right - ARect.Left, ARect.Bottom - ARect.Top); + + if (FBackground.Width = R.Right) and (FBackground.Height = R.Bottom) and not Assigned(FOnDrawBackground) then + ACanvas.Draw(ARect.Left, ARect.Top, FBackground) + else begin + FBackground.Width := R.Right; + FBackground.Height := R.Bottom; + FBackground.Canvas.Brush.Color := clWhite; + FBackground.Canvas.FillRect(R); + + PaintDefault := True; + DoDrawBackground(FBackground.Canvas, R, pstPrePaint, PaintDefault); + if PaintDefault then + SpDrawXPTabControlBackground(FBackground.Canvas, R, Color, TabPosition = ttpBottom, SkinType); + PaintDefault := True; + DoDrawBackground(FBackground.Canvas, R, pstPostPaint, PaintDefault); + + ACanvas.Draw(ARect.Left, ARect.Top, FBackground); + end; + + Result := True; + finally + ACanvas.Handle := 0; + ACanvas.Free; + end; +end; + +procedure TSpTBXCustomTabSet.InvalidateBackground(InvalidateChildren: Boolean); +begin + // Force background repaint + if not (csDestroying in ComponentState) and Assigned(FToolbar) then begin + if Assigned(FBackground) then + FBackground.Width := 1; + SpInvalidateSpTBXControl(Self, InvalidateChildren, FResizing); + end; +end; + +procedure TSpTBXCustomTabSet.ItemNotification(Ancestor: TTBCustomItem; + Relayed: Boolean; Action: TTBItemChangedAction; Index: Integer; + Item: TTBCustomItem); +var + I: Integer; + Tab: TSpTBXTabItem; +begin + inherited; + + if Assigned(FToolbar) and not Relayed and not FToolbar.IsItemMoving then + case Action of + tbicSubitemsBeginUpdate: + begin + // When a Tab item is moved (TTBCustomItem.Move) + // tbicDeleting and tbicInserted change actions are fired + // but we don't want the associated TabSheet to be recreated + // because the children will be destroyed. + // When a TTBCustomItem is moved it is not recreated, it simply + // deletes and reinserts its reference in the items array. + // We need to find out if the item is being moved and stop the + // TabSheet recreation. + // The action sequence for a move operation is the following: + // tbicSubitemsBeginUpdate (FItemMoveCount = 1) + // tbicDeleting (FItemMoveCount = 2) + // tbicSubitemsBeginUpdate (FItemMoveCount = 1) + // tbicInserted (FItemMoveCount = 0) + // tbicSubitemsEndUpdate (FItemMoveCount = 0) + // tbicSubitemsEndUpdate (FItemMoveCount = 0) + FItemMoveCount := 1; + FItemMoved := nil; + end; + tbicSubitemsEndUpdate: + begin + // Destroy the TabSheet if the sequence was: + // tbicSubitemsBeginUpdate - tbicDeleting - tbicSubitemsEndUpdate + if FItemMoveCount = 2 then + TabDeleting(FItemMoved); + FItemMoveCount := 0; + FItemMoved := nil; + end; + tbicInserted: + if Assigned(Item) then begin + // Update the index if a new item is inserted before the ActiveTabIndex + I := Items.IndexOf(Item); + if (I > -1) and (I <= ActiveTabIndex) then begin + FUpdatingIndex := True; + try + // Don't change the ActiveTabIndex, just set the internal value + // because the page didn't change + Toolbar.FActiveTabIndex := Toolbar.FActiveTabIndex + 1; + finally + FUpdatingIndex := False; + end; + end; + if (Item is TSpTBXTabItem) then + TabInserted(Item as TSpTBXTabItem); + InvalidateBackground; + FItemMoveCount := 0; + FItemMoved := nil; + end; + tbicDeleting: + // The ItemViewer of the Item is not valid, it was destroyed by TTBView + // The Items array still has the Item. + if not (csDestroying in ComponentState) and Assigned(Item) then begin + FUpdatingIndex := True; + try + Tab := nil; + I := Items.IndexOf(Item); + if I > -1 then begin + if I < ActiveTabIndex then + // Don't change the ActiveTabIndex, just set the internal value + // because the page didn't change + Toolbar.FActiveTabIndex := Toolbar.FActiveTabIndex - 1 + else + if I = ActiveTabIndex then + if I = 0 then begin + if (Items.Count > 1) and (Items[1] is TSpTBXTabItem) then begin + // The first tab was deleted, change the internal value of + // Update the checked tab on WM_INVALIDATETABBACKGROUND + Tab := Items[1] as TSpTBXTabItem; + Tab.Click; + end + else + Toolbar.FActiveTabIndex := -1; + end + else begin + Dec(I); // Prev tab + if (I > -1) and (I < Items.Count) and (Items[I] is TSpTBXTabItem) then + SetActiveTabIndex(I) + else + Toolbar.FActiveTabIndex := -1; + end; + end; + + if (Item is TSpTBXTabItem) then + if FItemMoveCount = 1 then begin + FItemMoveCount := 2; + FItemMoved := Item as TSpTBXTabItem; + end + else begin + FItemMoveCount := 0; + TabDeleting(Item as TSpTBXTabItem); + end; + + if (csDesigning in ComponentState) or Assigned(Tab) then + PostMessage(Handle, WM_INVALIDATETABBACKGROUND, 0, 0) + else + InvalidateBackground; + finally + FUpdatingIndex := False; + end; + end; + tbicInvalidate: + // When the Item.Checked property changes we must reset the ActiveTabIndex + if not FUpdatingIndex and Assigned(Item) and (Item is TSpTBXTabItem) and + Item.Checked and Item.Enabled then + begin + I := Items.IndexOf(Item); + if I <> ActiveTabIndex then begin + FUpdatingIndex := True; + try + SetActiveTabIndex(I); + finally + FUpdatingIndex := False; + end; + end; + end; + end; +end; + +procedure TSpTBXCustomTabSet.TabDeleting(Item: TSpTBXTabItem; + FreeTabSheet: Boolean); +begin + if not (csDestroying in ComponentState) then + ScrollLeft; +end; + +procedure TSpTBXCustomTabSet.TabInserted(Item: TSpTBXTabItem); +var + I: Integer; + IV: TTBItemViewer; +begin + if not (csLoading in ComponentState) and Assigned(Item) and (Item is TSpTBXTabItem) then + if Items.Count = 1 then + Item.Click // Select the first Tab + else begin + // If the item is inserted after a hidden tab, we should also hide it + I := Items.IndexOf(Item) - 1; + if I > -1 then + if Toolbar.FHiddenTabs.IndexOf(Items[I]) > -1 then begin + IV := View.Find(Item); + if Assigned(IV) then begin + Toolbar.BeginUpdateHidden; + try + Toolbar.FHiddenTabs.Add(Item); + Item.Visible := False; + finally + Toolbar.EndUpdateHidden; + end; + end; + end; + end; +end; + +procedure TSpTBXCustomTabSet.CMColorchanged(var Message: TMessage); +begin + inherited; + if Assigned(FToolbar) then begin + Toolbar.TabColor := Color; + InvalidateBackground; + end; +end; + +procedure TSpTBXCustomTabSet.CMSpTBXControlsInvalidate(var Message: TMessage); +begin + InvalidateBackground; + Message.Result := 1; +end; + +procedure TSpTBXCustomTabSet.WMEraseBkgnd(var Message: TMessage); +var + R: TRect; +begin + if not DoubleBuffered or (Message.wParam = Message.lParam) then begin + if not (csDestroying in ComponentState) and GetFullRepaint then begin + R := ClientRect; + if FTabVisible then begin + case TabPosition of + ttpTop: Inc(R.Top, GetTabSetHeight - 2); + ttpBottom: Dec(R.Bottom, GetTabSetHeight - 2); + end; + end; + DrawBackground(TWMEraseBkgnd(Message).DC, R); + end; + end; + Message.Result := 1; +end; + +procedure TSpTBXCustomTabSet.WMInvalidateTabBackground(var Message: TMessage); +var + Tab: TSpTBXTabItem; + I: Integer; +begin + if Assigned(FToolbar) then begin + Tab := Toolbar.ActiveTab; + if Assigned(Tab) then begin + I := Items.IndexOf(Tab); + FUpdatingIndex := True; + try + Toolbar.FActiveTabIndex := -1; + SetActiveTabIndex(I); + finally + FUpdatingIndex := False; + end; + end; + if HandleAllocated then + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN); + end; +end; + +procedure TSpTBXCustomTabSet.WMWindowPosChanged(var Message: TWMWindowPosChanged); +begin + FResizing := True; + inherited; + if GetFullRepaint then + InvalidateBackground; + FResizing := False; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomTabControl } + +constructor TSpTBXCustomTabControl.Create(AOwner: TComponent); +begin + inherited; +// ControlStyle := ControlStyle - [csAcceptsControls]; + FPages := TList.Create; + + // FEmptyTabSheet is used to hide the rest of the TabSheets + // when ActiveTabIndex = -1 at design time. + FEmptyTabSheet := TSpTBXTabSheet.Create(Self); + FEmptyTabSheet.Parent := Self; + FEmptyTabSheet.TabControl := Self; + FEmptyTabSheet.Item := nil; + FEmptyTabSheet.Visible := True; + FEmptyTabSheet.BringToFront; + FEmptyTabSheet.ControlStyle := FEmptyTabSheet.ControlStyle - [csAcceptsControls]; + + Width := 289; + Height := 193; +end; + +destructor TSpTBXCustomTabControl.Destroy; +begin + FPages.Free; + inherited; +end; + +procedure TSpTBXCustomTabControl.DoActiveTabChange(const ItemIndex: Integer); +begin + if ItemIndex = -1 then begin + FEmptyTabSheet.Visible := True; + FEmptyTabSheet.BringToFront; + end + else + FEmptyTabSheet.Visible := False; + inherited; +end; + +procedure TSpTBXCustomTabControl.RealignTabSheets; +var + I, C: Integer; +begin + if HandleAllocated then begin + C := PagesCount; + for I := 0 to C - 1 do + Pages[I].Realign; + end; +end; + +function TSpTBXCustomTabControl.GetFullRepaint: Boolean; +begin + if not (csDestroying in ComponentState) then + Result := not Assigned(FPages) or (FPages.Count = 0) or not Assigned(FToolbar) or + not Assigned(Toolbar.ActiveTab) or not Toolbar.ActiveTab.Checked + else + Result := False; +end; + +function TSpTBXCustomTabControl.GetPage(Item: TSpTBXTabItem): TSpTBXTabSheet; +var + I: Integer; +begin + Result := nil; + I := Items.IndexOf(Item); + if (I > - 1) and Assigned(Item.Control) and (Item.Control is TSpTBXTabSheet) then + Result := Item.Control as TSpTBXTabSheet; +end; + +function TSpTBXCustomTabControl.GetActivePage: TSpTBXTabSheet; +begin + if ActiveTabIndex > -1 then + Result := GetPage(Items[ActiveTabIndex] as TSpTBXTabItem) + else + Result := nil; +end; + +procedure TSpTBXCustomTabControl.SetActivePage(const Value: TSpTBXTabSheet); +var + I: Integer; +begin + if Assigned(Value) and (FPages.IndexOf(Value) > -1) and Assigned(FToolbar) then begin + I := FToolbar.Items.IndexOf(Value.Item); + if I > -1 then ActiveTabIndex := I; + end; +end; + +function TSpTBXCustomTabControl.GetPages(Index: Integer): TSpTBXTabSheet; +begin + Result := TSpTBXTabSheet(FPages[Index]); +end; + +function TSpTBXCustomTabControl.GetPagesCount: Integer; +begin + Result := FPages.Count; +end; + +procedure TSpTBXCustomTabControl.TabInserted(Item: TSpTBXTabItem); +var + T: TSpTBXTabSheet; + I: Integer; +begin + // Create a TabSheet and Link it to the TabItem, only if the Item is created + // at DesignTime. + // If the Item is created from the DFM stream then the TabSheet will be + // automatically created, because it will also be streamed, but it won't be + // linked to the Item, this is done in TabSheet.ReadState + + if (csLoading in ComponentState) or not Assigned(Item) then Exit; + + for I := 0 to FPages.Count - 1 do begin + T := TSpTBXTabSheet(FPages[I]); + if T.Item = Item then begin + Exit; + raise Exception.Create('TabSheet Already Exists'); + end; + end; + + // Find unique name + I := 1; + while Owner.FindComponent('SpTBXTabSheet' + IntToStr(I)) <> nil do + inc(I); + + // The Form will be the owner, it will stream the tabsheet to the DFM + T := TSpTBXTabSheet.Create(Owner); + T.Name := 'SpTBXTabSheet' + IntToStr(I); + T.Parent := Self; + T.TabControl := Self; + T.Item := Item; + Item.Control := T; + T.SendToBack; + FPages.Add(T); + + inherited; +end; + +procedure TSpTBXCustomTabControl.TabDeleting(Item: TSpTBXTabItem; + FreeTabSheet: Boolean); +var + I: Integer; + T: TSpTBXTabSheet; +begin + inherited; + // The Toolbar will free the Items, and the Form will free the TabSheets + if (csDestroying in ComponentState) or not Assigned(Item) then Exit; + + for I := 0 to FPages.Count - 1 do begin + T := TSpTBXTabSheet(FPages[I]); + if Assigned(T) and Assigned(T.Item) and (T.Item = Item) then begin + FPages[I] := nil; + FPages.Delete(I); + if FreeTabSheet then begin + T.Item := nil; + T.Free; + end + else begin + // TabSheet deleted at design time, free the linked Item + T.Item.Free; + T.Item := nil; + end; + Break; + end; + end; +end; + +procedure TSpTBXCustomTabControl.CMSpTBXControlsInvalidate(var Message: TMessage); +var + I, C: Integer; +begin + // Force TabControl and TabSheets background repaint + inherited; + if not (csDestroying in ComponentState) and Assigned(FToolbar) then begin + C := PagesCount; + for I := 0 to C - 1 do + SpInvalidateSpTBXControl(Pages[I], True, True); + end; + Message.Result := 1; +end; + +procedure TSpTBXCustomTabControl.WMSpSkinChange(var Message: TMessage); +begin + inherited; + RealignTabSheets; +end; + +end. diff --git a/official/2.2.2+2.4.2/SpTBXLib/SpTBXLib-LICENSE.txt b/official/2.2.2+2.4.2/SpTBXLib/SpTBXLib-LICENSE.txt new file mode 100644 index 0000000..bfea00e --- /dev/null +++ b/official/2.2.2+2.4.2/SpTBXLib/SpTBXLib-LICENSE.txt @@ -0,0 +1,57 @@ +SpTBXLib License v1.0 +===================== + +"Author" herein refers to Robert Lee. +"Software" refers to all files bearing this notice, as well as any other +files and source code included with SpTBXLib and all content in them, +regardless of whether any modifications have been made. + +Except where otherwise noted, all of the documentation and Software included +in the SpTBXLib package is copyrighted by Robert Lee (the Author). + +Copyright (C) 2004-2008 Robert Lee. All rights reserved. + +This notice is only applicable to SpTBXLib package. + +Use and distribution of the software is permitted provided that all of the +following terms are accepted: + +1. Registration (payment) of the Software is required, such payment is made + to the Author of the Software. For information on registering see the + Registration.txt file or this web page: + http://www.silverpointdevelopment.com/sptbxlib/registration.htm + +2. The Software is provided "as-is," without any express or implied + warranty. In no event shall the Author be held liable for any damages + arising from the use of the Software. + +3. All redistributions of the Software's files must be in their original, + unmodified form. Distributions of modified versions of the files is not + permitted without express written permission of the Author. + +4. The origin of this Software must not be misrepresented; you must not + claim your authorship. + +5. None of the Software's files may be redistributed for profit or as part + of another software package without express written permission of the + Author. + +6. You are permitted to Compile the Software into any kind of applications. + ("Compile" here refers to the automatic process of translating the + Software's source code into executable machine code by a compiler such + as the one included with Borland's Delphi or C++Builder.) + +7. Redistribution of any of the Software's files in object form (including + but not limited to .DCU and .OBJ formats) is strictly prohibited without + express written permission of the Author. + +8. Full backward compatibility in future versions of the Software is not + guaranteed. In no event shall the Author be held liable for any + inconvenience or damages arising from lack of backward compatibility. + +If you do not agree to all of the above terms, you are not permitted to +use the Software in any way, and all copies of it must be deleted from your +system(s). + +Robert Lee +http://www.silverpointdevelopment.com \ No newline at end of file diff --git a/official/2.2.2+2.4.2/TB2K/DemoProj/.cvsignore b/official/2.2.2+2.4.2/TB2K/DemoProj/.cvsignore new file mode 100644 index 0000000..9783b61 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/DemoProj/.cvsignore @@ -0,0 +1,5 @@ +*.dcu +*.exe +*.hpp +*.obj +*.tds diff --git a/official/2.2.2+2.4.2/TB2K/DemoProj/Demo.cfg b/official/2.2.2+2.4.2/TB2K/DemoProj/Demo.cfg new file mode 100644 index 0000000..6b67b6f --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/DemoProj/Demo.cfg @@ -0,0 +1,33 @@ +-$A+ +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 diff --git a/official/2.2.2+2.4.2/TB2K/DemoProj/Demo.dof b/official/2.2.2+2.4.2/TB2K/DemoProj/Demo.dof new file mode 100644 index 0000000..d8a22f2 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/DemoProj/Demo.dof @@ -0,0 +1,29 @@ +[Compiler] +A=1 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=0 +Z=1 +ShowHints=1 +ShowWarnings=1 diff --git a/official/2.2.2+2.4.2/TB2K/DemoProj/Demo.dpr b/official/2.2.2+2.4.2/TB2K/DemoProj/Demo.dpr new file mode 100644 index 0000000..1697c6c --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/DemoProj/Demo.dpr @@ -0,0 +1,22 @@ +program Demo; + +uses + Forms, + Demo1 in 'Demo1.pas' {Form1}; + +{$R *.RES} + +{$IFDEF CLR} +[STAThread] // All VCL.NET projects that use Toolbar2000 must include this +{$ENDIF} +begin + Application.Initialize; + {$IFDEF CONDITIONALEXPRESSIONS} + {$IF CompilerVersion >= 18.5} + Application.MainFormOnTaskbar := True; + {$IFEND} + {$ENDIF} + Application.CreateForm(TForm1, Form1); + Application.Run; +end. + diff --git a/official/2.2.2+2.4.2/TB2K/DemoProj/Demo.res b/official/2.2.2+2.4.2/TB2K/DemoProj/Demo.res new file mode 100644 index 0000000000000000000000000000000000000000..a8371ab57e62b805e3cbaca0141aa85575085c64 GIT binary patch literal 876 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 E0X5XFmH+?% literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/DemoProj/Demo1.pas b/official/2.2.2+2.4.2/TB2K/DemoProj/Demo1.pas new file mode 100644 index 0000000..77c64b9 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/DemoProj/Demo1.pas @@ -0,0 +1,254 @@ +unit Demo1; + +{ + Toolbar2000 demo project + + $jrsoftware: tb2k/DemoProj/Demo1.pas,v 1.9 2006/03/12 23:11:58 jr Exp $ +} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, ExtCtrls, Menus, ActnList, ImgList, ComCtrls, + TB2Item, TB2ExtItems, TB2Dock, TB2Toolbar, TB2MRU; + +type + TForm1 = class(TForm) + ActionList: TActionList; + actNew: TAction; + actOpen: TAction; + actSave: TAction; + actSaveAs: TAction; + actPageSetup: TAction; + actPrint: TAction; + actExit: TAction; + actUndo: TAction; + actCut: TAction; + actCopy: TAction; + actPaste: TAction; + actDelete: TAction; + actSelectAll: TAction; + actTimeDate: TAction; + actWordWrap: TAction; + actSetFont: TAction; + actFind: TAction; + actFindNext: TAction; + actReplace: TAction; + actHelpTopics: TAction; + actAbout: TAction; + actTestButton: TAction; + actTestEdit: TTBEditAction; + DockTop: TTBDock; + MenuToolbar: TTBToolbar; + ImageList: TTBImageList; + FMenu: TTBSubmenuItem; + FNew: TTBItem; + FOpen: TTBItem; + FSave: TTBItem; + FSaveAs: TTBItem; + FPageSetup: TTBItem; + FPrint: TTBItem; + FExit: TTBItem; + EMenu: TTBSubmenuItem; + EUndo: TTBItem; + ECut: TTBItem; + ECopy: TTBItem; + EPaste: TTBItem; + EDelete: TTBItem; + ESelectAll: TTBItem; + ETimeDate: TTBItem; + EWordWrap: TTBItem; + ESetFont: TTBItem; + SMenu: TTBSubmenuItem; + SFind: TTBItem; + SFindNext: TTBItem; + SReplace: TTBItem; + HMenu: TTBSubmenuItem; + HHelpTopics: TTBItem; + HAbout: TTBItem; + FMRU: TTBMRUListItem; + NBSeparatorItem3: TTBSeparatorItem; + NBSeparatorItem4: TTBSeparatorItem; + TestEdit: TTBEditItem; + MainToolbar: TTBToolbar; + NewButton: TTBItem; + OpenButton: TTBItem; + SaveButton: TTBItem; + DockBottom: TTBDock; + DockLeft: TTBDock; + DockRight: TTBDock; + BottomToolbar: TTBToolbar; + PopupMenuBarButton: TTBItem; + PopupToolbarButton: TTBItem; + Memo1: TMemo; + ContextPopupMenu: TTBPopupMenu; + StatusBar: TStatusBar; + ToolbarPopupMenu: TTBPopupMenu; + MRUList: TTBMRUList; + PrintButton: TTBItem; + CutButton: TTBItem; + CopyButton: TTBItem; + PasteButton: TTBItem; + UndoButton: TTBSubmenuItem; + actPrintPreview: TAction; + TBItem1: TTBItem; + FormatToolbar: TTBToolbar; + BoldItem: TTBItem; + ItalicItem: TTBItem; + UnderlineItem: TTBItem; + TBSeparatorItem1: TTBSeparatorItem; + AlignLeftItem: TTBItem; + CenterItem: TTBItem; + AlignRightItem: TTBItem; + TBSeparatorItem2: TTBSeparatorItem; + BulletsItem: TTBItem; + NBItem34: TTBItem; + NBSeparatorItem6: TTBSeparatorItem; + NBItem35: TTBItem; + NBItem36: TTBItem; + NBItem37: TTBItem; + NBItem38: TTBItem; + NBSeparatorItem7: TTBSeparatorItem; + NBItem39: TTBItem; + ComboBox1: TComboBox; + TBControlItem1: TTBControlItem; + TBSeparatorItem3: TTBSeparatorItem; + TBControlItem2: TTBControlItem; + ComboBox2: TComboBox; + actBold: TAction; + actItalic: TAction; + actUnderline: TAction; + actAlignLeft: TAction; + actCenter: TAction; + actAlignRight: TAction; + TBSeparatorItem4: TTBSeparatorItem; + actRedo: TAction; + RedoButton: TTBSubmenuItem; + TBItem2: TTBItem; + TBItem3: TTBItem; + TBItem4: TTBItem; + ERedo: TTBItem; + VMenu: TTBSubmenuItem; + VToolbars: TTBSubmenuItem; + VTStandard: TTBVisibilityToggleItem; + VTFormatting: TTBVisibilityToggleItem; + VTBottom: TTBVisibilityToggleItem; + VStatusBar: TTBItem; + actBullets: TAction; + procedure FormCreate(Sender: TObject); + procedure ItemClick(Sender: TObject); + procedure PopupMenuBarButtonClick(Sender: TObject); + procedure PopupToolbarButtonClick(Sender: TObject); + procedure MRUListClick(Sender: TObject; const Filename: String); + procedure AlignClick(Sender: TObject); + procedure BulletsItemClick(Sender: TObject); + procedure BoldItemClick(Sender: TObject); + procedure ItalicItemClick(Sender: TObject); + procedure UnderlineItemClick(Sender: TObject); + procedure VStatusBarClick(Sender: TObject); + procedure VMenuClick(Sender: TObject); + private + { Private declarations } + procedure OnHint(Sender: TObject); + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +uses + {$IFDEF CLR} Types, {$ENDIF} + CommCtrl, TB2Version; + +{$R *.DFM} + +procedure TForm1.FormCreate(Sender: TObject); +begin + Memo1.Text := 'Running on ' + Toolbar2000VersionPropText; + Application.OnHint := OnHint; +end; + +procedure TForm1.OnHint(Sender: TObject); +begin + StatusBar.Panels[0].Text := Application.Hint; +end; + +procedure TForm1.ItemClick(Sender: TObject); +begin + Application.MessageBox( {$IFNDEF CLR} PChar {$ENDIF} + ('You selected:'#13#10#13#10 + (Sender as TComponent).Name), + 'OnClick handler', MB_OK or MB_ICONINFORMATION); +end; + +procedure TForm1.MRUListClick(Sender: TObject; const Filename: String); +begin + Application.MessageBox( {$IFNDEF CLR} PChar {$ENDIF} + (Format('You selected "%s" from the MRU list.', [Filename])), + 'MRUListClick', MB_OK or MB_ICONINFORMATION); +end; + +procedure TForm1.VMenuClick(Sender: TObject); +begin + VStatusBar.Checked := StatusBar.Visible; +end; + +procedure TForm1.VStatusBarClick(Sender: TObject); +begin + { Force the StatusBar to always be at the bottom of the form. Without this + line of code, the status bar sometimes may appear above the bottom dock. + This is not a bug in Toolbar2000, but rather is due to the design of the + VCL's alignment system. } + StatusBar.Top := ClientHeight; + + { Toggle the status bar's visibility } + StatusBar.Visible := not StatusBar.Visible; +end; + +procedure TForm1.AlignClick(Sender: TObject); +begin + AlignLeftItem.Checked := (Sender = actAlignLeft); + CenterItem.Checked := (Sender = actCenter); + AlignRightItem.Checked := (Sender = actAlignRight); +end; + +procedure TForm1.BulletsItemClick(Sender: TObject); +begin + BulletsItem.Checked := not BulletsItem.Checked; +end; + +procedure TForm1.BoldItemClick(Sender: TObject); +begin + BoldItem.Checked := not BoldItem.Checked; +end; + +procedure TForm1.ItalicItemClick(Sender: TObject); +begin + ItalicItem.Checked := not ItalicItem.Checked; +end; + +procedure TForm1.UnderlineItemClick(Sender: TObject); +begin + UnderlineItem.Checked := not UnderlineItem.Checked; +end; + +procedure TForm1.PopupMenuBarButtonClick(Sender: TObject); +var + P: TPoint; +begin + P := Memo1.ClientToScreen(Point(8, 8)); + MenuToolbar.Items.Popup(P.X, P.Y, True); +end; + +procedure TForm1.PopupToolbarButtonClick(Sender: TObject); +var + P: TPoint; +begin + P := Memo1.ClientToScreen(Point(8, 8)); + MainToolbar.Items.Popup(P.X, P.Y, True); +end; + +end. diff --git a/official/2.2.2+2.4.2/TB2K/DemoProj/DemoBCB.bpr b/official/2.2.2+2.4.2/TB2K/DemoProj/DemoBCB.bpr new file mode 100644 index 0000000..9800232 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/DemoProj/DemoBCB.bpr @@ -0,0 +1,179 @@ +# --------------------------------------------------------------------------- +!if !$d(BCB) +BCB = $(MAKEDIR)\.. +!endif + +# --------------------------------------------------------------------------- +# IDE SECTION +# --------------------------------------------------------------------------- +# The following section of the project makefile is managed by the BCB IDE. +# It is recommended to use the IDE to change any of the values in this +# section. +# --------------------------------------------------------------------------- + +VERSION = BCB.04.04 +# --------------------------------------------------------------------------- +PROJECT = DemoBCB.exe +OBJFILES = Demo1.obj DemoBCB.obj +RESFILES = DemoBCB.res +RESDEPEN = $(RESFILES) Demo1.dfm +LIBFILES = +LIBRARIES = vcl40.lib +SPARELIBS = vcl40.lib +PACKAGES = +DEFFILE = +# --------------------------------------------------------------------------- +PATHCPP = .; +PATHASM = .; +PATHPAS = .; +PATHRC = .; +DEBUGLIBPATH = $(BCB)\lib\debug +RELEASELIBPATH = $(BCB)\lib\release +USERDEFINES = +SYSDEFINES = _RTLDLL;NO_STRICT +# --------------------------------------------------------------------------- +CFLAG1 = -I$(BCB)\include;$(BCB)\include\vcl -Od -Hc -H=$(BCB)\lib\vcl40.csm -w -Ve -r- \ + -a8 -k -y -v -vi- -c -b- -w-par -w-inl -Vx -tW -tWM \ + -D$(SYSDEFINES);$(USERDEFINES) +PFLAGS = -U$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib;$(RELEASELIBPATH) \ + -I$(BCB)\include;$(BCB)\include\vcl -$YD -$W -$O- -v -JPHNE -M +RFLAGS = -i$(BCB)\include;$(BCB)\include\vcl +AFLAGS = /i$(BCB)\include /i$(BCB)\include\vcl /mx /w2 /zd +LFLAGS = -L$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib;$(RELEASELIBPATH) -aa -Tpe -x \ + -Gn -v +# --------------------------------------------------------------------------- +ALLOBJ = c0w32.obj Memmgr.Lib sysinit.obj $(OBJFILES) +ALLRES = $(RESFILES) +ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cp32mti.lib +# --------------------------------------------------------------------------- +!ifdef IDEOPTIONS + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +InMemoryExe=0 +ShowInfoMsgs=0 + +!endif + +# --------------------------------------------------------------------------- +# MAKE SECTION +# --------------------------------------------------------------------------- +# This section of the project file is not used by the BCB IDE. It is for +# the benefit of building from the command-line using the MAKE utility. +# --------------------------------------------------------------------------- + +.autodepend +# --------------------------------------------------------------------------- +!if !$d(BCC32) +BCC32 = bcc32 +!endif + +!if !$d(CPP32) +CPP32 = cpp32 +!endif + +!if !$d(DCC32) +DCC32 = dcc32 +!endif + +!if !$d(TASM32) +TASM32 = tasm32 +!endif + +!if !$d(LINKER) +LINKER = ilink32 +!endif + +!if !$d(BRCC32) +BRCC32 = brcc32 +!endif + +# --------------------------------------------------------------------------- +!if $d(PATHCPP) +.PATH.CPP = $(PATHCPP) +.PATH.C = $(PATHCPP) +!endif + +!if $d(PATHPAS) +.PATH.PAS = $(PATHPAS) +!endif + +!if $d(PATHASM) +.PATH.ASM = $(PATHASM) +!endif + +!if $d(PATHRC) +.PATH.RC = $(PATHRC) +!endif +# --------------------------------------------------------------------------- +$(PROJECT): $(OBJFILES) $(RESDEPEN) $(DEFFILE) + $(BCB)\BIN\$(LINKER) @&&! + $(LFLAGS) + + $(ALLOBJ), + + $(PROJECT),, + + $(ALLLIB), + + $(DEFFILE), + + $(ALLRES) +! +# --------------------------------------------------------------------------- +.pas.hpp: + $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< } + +.pas.obj: + $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< } + +.cpp.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) -n$(@D) {$< } + +.c.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) -n$(@D) {$< } + +.c.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) -n. {$< } + +.cpp.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) -n. {$< } + +.asm.obj: + $(BCB)\BIN\$(TASM32) $(AFLAGS) $<, $@ + +.rc.res: + $(BCB)\BIN\$(BRCC32) $(RFLAGS) -fo$@ $< +# --------------------------------------------------------------------------- + diff --git a/official/2.2.2+2.4.2/TB2K/DemoProj/DemoBCB.cpp b/official/2.2.2+2.4.2/TB2K/DemoProj/DemoBCB.cpp new file mode 100644 index 0000000..b4ea3e5 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/DemoProj/DemoBCB.cpp @@ -0,0 +1,22 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop +USERES("DemoBCB.res"); +USEFORMNS("Demo1.pas", Demo1, Form1); +//--------------------------------------------------------------------------- +WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) +{ + try + { + Application->Initialize(); + Application->CreateForm(__classid(TForm1), &Form1); + Application->Run(); + } + catch (Exception &exception) + { + Application->ShowException(&exception); + } + return 0; +} +//--------------------------------------------------------------------------- + diff --git a/official/2.2.2+2.4.2/TB2K/DemoProj/DemoBCB.res b/official/2.2.2+2.4.2/TB2K/DemoProj/DemoBCB.res new file mode 100644 index 0000000000000000000000000000000000000000..32b522d0446895614bc4b68603238d2e2e1f4263 GIT binary patch literal 876 zcmb7@&q~BF5XQf53&o4>!Mia|mo;g+5L__E9`~^tgwG_$B?b zEiQ=Dew~^AW+ovJ0H~-CdNEws*J|WBYqG@F>$74kx@J&OcT|SqH+xQ-0DK|RJAN5b zg0AZb;wGXCz2mpvS3vzvYut|ZZN*CMX^nYm+t&NN-_JPd#LY*mNhj`hPA|C8YQeqM zTgzvdZ;aAuz4DOOcYdfZ_i24&v<}fGuC%ghV~<>^?Z#o^I&$V?KkJuVEjjBKJkHl< z)*t7~G~YS)8yvZD$_evf|IT?uJmXRjBOP$#Xi^Ah@c2h`ybzzr3` eIi7KkN4!uEc%>h0elOx}$WT>9x)t#jW%vP1A`iy^ literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/DemoProj/DemoBCB6.bpr b/official/2.2.2+2.4.2/TB2K/DemoProj/DemoBCB6.bpr new file mode 100644 index 0000000..28a1267 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/DemoProj/DemoBCB6.bpr @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + + \ No newline at end of file diff --git a/official/2.2.2+2.4.2/TB2K/DemoProj/DemoBCB6.cpp b/official/2.2.2+2.4.2/TB2K/DemoProj/DemoBCB6.cpp new file mode 100644 index 0000000..c762f01 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/DemoProj/DemoBCB6.cpp @@ -0,0 +1,34 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +//--------------------------------------------------------------------------- +USEFORMNS("Demo1.pas", Demo1, Form1); +//--------------------------------------------------------------------------- +WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) +{ + try + { + Application->Initialize(); + Application->CreateForm(__classid(TForm1), &Form1); + Application->Run(); + } + catch (Exception &exception) + { + Application->ShowException(&exception); + } + catch (...) + { + try + { + throw Exception(""); + } + catch (Exception &exception) + { + Application->ShowException(&exception); + } + } + return 0; +} +//--------------------------------------------------------------------------- + diff --git a/official/2.2.2+2.4.2/TB2K/DemoProj/DemoBCB6.res b/official/2.2.2+2.4.2/TB2K/DemoProj/DemoBCB6.res new file mode 100644 index 0000000000000000000000000000000000000000..e468bf918a523af7a3091b3eec019fa7b1c1693c GIT binary patch literal 876 zcmb_bF;2uV5Zu5uH0X-!NlA%xEfPT&DWU*=!4q&17bzp%{pX4_DNahW&!C{N_=1_S z(;tv z|In#nuj{navMjJhZPaM_QfNJD4x+|BdQI?CM=$p}-Rz^@qE3JH8vXRJG5P7?`N>Z` z^;5UnYGuEjugCL0h&O2V;=F@MIaK@b1)ytaHG_$|4Ry9gjf8ce7r;f$G$71Q;+N=W zkSqKfCkk>9V-oqZ{(-ldmnrWs9vrd4up7|(OL>%gd5|Y?BhQEl(|f_AGs*KsxD~ub GnS25s111yz literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/GPL-LICENSE.txt b/official/2.2.2+2.4.2/TB2K/GPL-LICENSE.txt new file mode 100644 index 0000000..45645b4 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/GPL-LICENSE.txt @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/official/2.2.2+2.4.2/TB2K/Glyphs.zip b/official/2.2.2+2.4.2/TB2K/Glyphs.zip new file mode 100644 index 0000000000000000000000000000000000000000..60704428f161bb9768d0c5f4b7c214157ca99588 GIT binary patch literal 11257 zcmb`M30PCtw#UzqfgvQ31{ox9u;M)q#aOX2eQ?4c1S6b6RODhzz1o69jYy#=LIPHx zS{kpmT5E5Eg4bH#eQmX`IC4;|UZ*0pw_>3nZ7fz4hg*efNZvV+c*2&7eR(Qh{677C z`=7P}+!Nz5cHucnPr| zZbZoQXDDR!N~m*nkw7q`*Qbd<7Q*iZZt}5M%Sp_|6Y)%T=|B)S zfxtrCozi{%x`nvyeZ6xLClE)jJ&M%#TCGQLxQ|#OOeUhmKKN8`=mpIba?zBot}YG# z-o`_|FG;*{_(IzSisBrc2`f*~s)lH8F(;?LV$TZnHn;mo0pI37{{l z{?|v#Z2I{0XWSf>v+}eZNOfjJRAv-*Fwxz!?HW=W8I=`99YojvnyvGrD7ZQt%R~97 z>M%UX0|xZe{g!Aga)?(dnUL~SK|{99u&RTCF%Qo^(M*BW8i$KHu5e{;DD+a5G-(W~ zmluZ5m{!rCzE}^BrTWK=rRq!2j0q1{V$i-{+C>~<$DZKTySXet79Xz5%X<@QksanHudUOWW<_L1L|k2v zHL*fA8c@M0J}_JDpkhwSA5k%UoYIK5))pSx=x(?JT_W_J*ezl0EbL%pQZu^$>Z#g~ zjGF-s-z7azSK2fTq=hs^inFIDSq8mSu258?E`EMk7Ed_7s;cUCn^b@uK6bRM%yr_A z6#Vk{M(BF348M!cegs|Kdq=OohMvJNYs_;^nqnTWSmu!i)igwO{0jl}mi*j1Nnz6~ zpg-kGMPf=?qO+2vVel1=DgZ^jOhI54N}QFOT;i}K$%KeZdwM1sa$ttrD%W6Kw|#db zC6bt}a#)GZUW7CUUY!)SRTrArw~;5lpjN*O?fEz^yQ;uTv&tATKDZ(}IJhD_886Bo zj|VOdGhd%bq5v&CfzMNWi82u zF8Q1N{RPSpbD-{j@*MF>l_x8*n^&2<3TZ=9IO3QD*wbmah znRckej6-QX3o|lA%{?K#3tHj5u4lIKFWqjhFX3Mz)`ehKPyez>w5f+v0}p+h@GRmB_dZx7j@~H{K@;9_oG0_4)K=>G`1y~yPA}sB&Yu078M)yXzc1S#^$=lYyW=r zGi1YtHcY?ag1-jF+MqoJV+e`1hj*?3l76lKOajPQ_UWFA0-Frx3eHSTQKiU7*tus& z@&3lfQ^#6QovJ;0l>T#~R*H8BYxJI8w@twTm=`g>K-`ul{3~yQ7QVS(dspWJZ{|(R zF88av5C90YtO!FB90U&Jh?#Sg!-eV(R6Eiz=(1+VUAiC{dJ@9@vEnCEQk*Ky+2!h> zD_Nl-8zAmI5?u1Tf{)|hbohqM7No1@|AB8fTuQ3U4b#Ht;^S+>w~HEsZ<{oTvP@Na z!}Fo%!_s?*5i-2K5^}4nn0L-0nmy5VIC-gVAb*Nh#8agSa4 zHB=pfdvtC?KWc8OdR+wU-hI*8cj@>J)WuAV8Jnt%fA*alK8&$OXs=${sL@Q(P{}`S zE5CVK2(0S$y!Yh{+p2E#r$R*^(m3bW)#>%p6CFAi74>h~!MH9uHb>ob<2zmgugIeR zbnl#NTc5eZbm@_hrc^w=OdIh{tIW+ZLW@IoK-*u3OAFBVseXCEe zzLieIQ4f0_9qcLg*@*S@$p*QVKCG)x;Vo+DQ( z9dyy~9xwUOn|WFyhqqUTqK5oWx}X-f+VF_XC?b!agq&GXa06e(&;4_2WM®~o53 zyM+Hib0>1y1uOvPizgRu1B5ww8(o7rq)sczcz!#jGC$8o)U1@)Il=9&SlJ-oZu7;mI*JnL|zB38- z%Mk8qpxUIdM~D@xSAm(W{?@}4c7K97mW)jzS3bQM7*P#saVT-*He)P!VtnExQhs*;`#E z>5=lpg!BZ}oZ$}Q!j)+1ZJVTYyp0ia#IMbyZcpZ?)DN;*LB*a}1w|x4aBm z6Jx&$xMF_<26QmJ94*8-9j?JXIv+Yx>P)pd(^%8!=f;6uqJu-vWEl#(m1OkgXv`Z3 z$Pwd7e|x55%8uD`h0`0B1uc?onaTH&7vLLZesFc$)X89t;65IK?I9YxVhQr6=h_hujBBtzw7BFs!(4pI zl-G34{z_t1KHcz0G*(N09G@hrj~@>RYT|flN?pv1f08Tyuges5Y5fybktV9X7OR@gAiR9r<%V%Ajw;%6B{g0tV^^6 zthRgcf82fDCWkrJjGUB&3@10uHCWQYsa>#jt4c?mI^}vXar3;iMH(cCbD_c51np|^ zmAFxz1hmUbm!i)mHL=yzpstQa*Z5+aE+#Y4M@cDG0ZT< zWvdkzUUzpp8`s<3a4&@DfK;MA^RxV^>j!jiDwC5nLIV#_d$aH8_j(7lBf2IdUJJVM z!!^)qx88?6{Hb*%D7?0?p;&x{RNomh?oRbi+C(uxkp{k}hQIGe`jCDjoGZLmW^$)m zMcRJiezfj<*@vPp!NzLOg)^yIn@nc!;}hr#Kf%ctzA|^e@lK?RUT=&t7|NTl&tn^U zOr`A&o^RdLd|6uBK5F8qB4bpBZ~VHTjQXPRc#(=P1`lQXa_gBVg*n}O>^FAM!eBJU z(7^~pHuRVTv@ot&^QA!GAPmlkDH&ea{QbX}UUi5VZCNPO1Yb;+|_#n?Fhj|C)DN=sNM7KX7~B8jy$P6zEAUGC>z z?d~3QGC_N%24J?-g_42jVqC4t@qn%XQM^lZ*QZgm|Y&MC>deDB;h# zF230sRAdoWM8!0b`NlPts;c6AW3eo7ZyVR8_1vh?Cw3EEB@ozMJDWP%!=C%pH1`bZ z1SC{joyHYmq3x(K1$!tJLvQs`p(wiEYDMFZ|Adn3;HFj)(a(*E(3$Tcc>U2vu8SdC z2A;Oe75{i)8L*@B^fkiCFj9bdNG$Ivj?@u9_tzKco5^VM!K`rA;iIkXfypO( z#W!;Culy%^`~sFBYi@0HO&cmom6V#6>8z+wvJ>H%g01on_wgQEtVr!YRU&Y0<9hg{ zqeVj>C)Hfq&j0^f+gbvTJ)5(=aA8)~aa}eZ2tG3_nk!ygXZ!B91EW-=JGnglE^1-q zPuQ)63m1xZwbA~3Rbvcl`naHcZ=`5WNkI15Ami)!tzz@}52lr8WtqRx<@~84#9LG` zA!Q=j_5#_K0$jS_6R+cQhVD>0sZ=;AlP<` zD`(ml7?D7~KgOrOIs`))^FjZ5Jk$p|6Pfil(R;5-$iz_}~C))tzwPhmj{ zoRqSZH;0bAeQpY3;J}iVc$&r>$Cn@p&K=nWBe=E&ZBs~)1P6gE`O^T&js-yyoXW8z zU4{<1ciurWapv=dpd*pmqhYc7H$ zXaKS#?>Spiwb_9n2|9Kx`7TY`{X38X%`}#pNV_d})n=pYW)et(1`kWVF?xvI1A?IC!h-(ZtN{a3p!LC0XKCv9o+i+V zV5wC;LwpHvInXI!K{sDJIN%$AAlS*X;BFdp=<7ic?73O+ML)+59OS@$nB^`Ga*w-X zkOaF{mRvMuNDm8wU_;4*kpBQ^Z!bX*?DSaBI0(ks`#z8a+cB1$E*)6%adQTeU^B&% zpW8@#YXy>E8^n@R0|wT#H$@-_b|x(N{UG?bPXS4=sbI*#+&wqYR%+N<400BiF3TWj Q2K_sLelSnb{|-U_3juy0{{R30 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/LICENSE.txt b/official/2.2.2+2.4.2/TB2K/LICENSE.txt new file mode 100644 index 0000000..47c1846 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/LICENSE.txt @@ -0,0 +1,17 @@ +All files included in the Toolbar2000 archive are Copyright (C) 1998-2008 +Jordan Russell. + +Use and/or distribution of the files requires compliance with the +"Toolbar2000 License", found in TB2k-LICENSE.txt or at: + + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + +Alternatively, at your option, the files may be used and/or distributed under +the terms of the "GNU General Public License", found in GPL-LICENSE.txt or at: + + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + +NOTE: If you choose the GPL license option, your application as a whole must +also be licensed under the GPL. (Refer to section 2b of the GPL license.) +Therefore, you cannot choose the GPL license option if your application is +proprietary/closed-source. diff --git a/official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Acc.dcu b/official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Acc.dcu new file mode 100644 index 0000000000000000000000000000000000000000..6ed78b5df1a8e83debc7d7448d5efd99c2fb4e35 GIT binary patch literal 45020 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 W^-8J^p*mvDq|iCUE)JgE`2Rok3#?NB literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Anim.dcu b/official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Anim.dcu new file mode 100644 index 0000000000000000000000000000000000000000..3f45d75c55ae9653c64e3933a5486af4871b3d9e GIT binary patch literal 6749 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 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Common.dcu b/official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Common.dcu new file mode 100644 index 0000000000000000000000000000000000000000..3a492fb447fd4a5b142e9d5ec9ea54850f3c5f63 GIT binary patch literal 30393 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 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Consts.dcu b/official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Consts.dcu new file mode 100644 index 0000000000000000000000000000000000000000..06ebf4fb3ecc5ce7efd66718edae8b3c609dc581 GIT binary patch literal 2247 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

    $MzQw04>rf3R30XL02|A+p`$2#x2?e7y;!5Lkb zi8s318G*5CG&yxFGYVq431_Z2gc)}obLsLG{_w#IMo(mdxAg;8%XUN> zuN%3P$T?a%TrFV)La%-cb!owGK1oT2Osr|`Xu7Q`GT-YwG~df3qEd}zUI!O9`a`c# zK@t30H;;1=Z>vaa7G92FULA~*7 zD{t&-^+d#f!RVXX;a__v`hIJ?;?_v1(WQFR z`c81NQSFTQ`n!As*->AA{W@FJe}VfWv(#O9K}!TVZfeI34Gp(O+-o^8M|Lv9 zi1itrD{nN;HFhpp*IzFaOh{Hl`~&EsE70)SVOL9<29~o4Kb$GtP6K0ewcKvT7$J%< zu6F|At_S>x2GTjNO8F%R_y?Fi*E_{5Y1IWS)n@ppbIIjYjrK39kp}$(qP*bO)Cjk9 z1eO`TexoY?X$;xZrGaXd5b<3IH(#&?t~L}BkaN80uk;NB^2|WJ;Tw?XXzd6LRmA~z zD7J}VQ!oea_#C87jhF4W(I39A!WNiiEU4fjXt`otzZsHE0fOL2GfI+*kz;)K4iiym z|3@GdjMf2%4WqPlxzXq}f_i01VBV9AeOu*r${m=tlp6u;<1Jt5y7SWiv@dyS+JUJCf~N^*9IRhU4REazSObYPBk*-% zqRQ;U2N!s}o`8wgo&jfu*s@ z6YWS2EUF3j4B2pXZ1f-)VppmNAarb(?_(`iYBg$k80<=4zpG_6TCf;`Fi8tZ!8Fb^ z^@Qx2;t%h;cKbdiigVhQE(asTSod*0<5yr(CrrjvT|X@C5kPF@5>Nm5#FfV)%j>)D zhq2G5b=?nBolQ$-OOgAxBPuoKF~sbp#ah*wsJyG?oq&rQz4be^oPa=eqYK1@TJhf^ z#9%7?0hIMiMIM*t6}f|s@EY#`k=$|%VB>z67Hyao!8W9*3^$+kwl?~JlBx69vy=C^^ z3DL}TEVwTCA4VrHewA}8f_mtiD{R5^OLKu$`_zt3EQV?+ zkJNe{5s#NJ!F&Qtp$p?P%WG>|YcK+hjn1#O#+z8*P;iZ*YcT zb{hapAkO02{qR{Nwz*xq@3$7)G-F@)}r;}7Kz(zo?UP&W*kj^z*1udyGQiJfN;n@P4RScvc^z`cl|e_&cH^_$iTT5bA` zyP2GefleS$3VfmV0+Kuf4x=+R6bSq;tZD>?Db#?KlZ4g(@##q21tU0s;rL4R)FV;P z5n4-c9H?|W94wSxAUGOA{5Sx}6bpzo~Y)!Q(C8rzy3(=w@ zM$l<|W1w=`51pGbt#o7A!%i!$3~6Ql3!1;51(G2P!=J>1yRe){VT>2|72%)9F(0z# zFa-UT*E*X=#L^bF9%*t@JONXFysj5f|xZvpu5%bV`=@l%@V@OWE3zEA`J>g$_2bZ66Yh*N{lVo4lcRSjA zA0duMxTPbwSf*o-#1`?LM*t1D149q_&Xc|nYW~O;9FAC{zQ(AdWG)xWrl^`)!*4}# zeD9B;SWr?`4RBh%Wh>WuEZls|)|^H_Vg*Jb$|3O)PJA=m{H98LlM+MB@~WIQ;eK1w zwGm%;BGTW@jYND;7``U}rZYgDQzcX)N6>0u_@Ch1@w)DCb9X%0j+9V4_IN;M^Ag3- z5EPUtRT1CTL%wb#GWZe*tGx#d-vbz&tuzDTzV3M4*5K*nML;570a8!$1vkyoEZ0Bz z&()84=|?YR8CCtS%rFqJS3+ggsgSUXx&_YXCj#WSPhJV1Qd%}ni zx+1k(92g3-AsfM;+feM`)3MIUl(A;w{axh`ThsH;ffr;Ui|B>kKYOWH62bD#5V@U^S(y zc*mCNuLcjreLb-u^Wt@F!5>I8xLU^$rYsyhIPe(-!Rt;6SL=Tukb2xgOJB$U<_a?rS=^*_)O+Py=cw7%`2LW6bCdQ?! zm6YD3nFex=`nO{&4QKqJKA?tM180?d!|1j*ZjWUq2OqOYGIG-v(1yYn0v@Wy9se%m zT52NdIe~?yZT>^0R;H;(K)neXk1nGCH{H(^mB78*s-SZIL;9vds|t{lZly)$Ka{8~ z)U>5k1ap#ex;5XSLXwTBm8Tx4-JceI#)~XSG7N`q1pRomt zfXh%jPf5rp;_I&T?Sj_a_-tk4&StyOxU;hH%%;)d<__C^ zNo?t7<#lH;TFyx0nOKp5pAnUf?afK(t!pp;88U!XB!>?0ebvc%y2IL6Q za>|MTiqkg1K!YKXB3=gkU7?X!sKAF3=*!orp;sz>9pDr`YBt>bifz-qMq~H2;Xm1$ zHYk=V5wucBQ`VgzOfpQv{qXup}j{1&0tq z?we)B8q7RY9pyJ|abrO9D;qmDfjR-0N+?6Fvc?V?m_WKI(X{Y1N*W#7@Jk+@l!377 zGSpa&Cth{=X;YTSJbw#FMlm#P{zJf+0*M(KP;Yi08F>bn^Dt1JoaO<;aYet+_%ln? z9mX8;^lsruYs!8DBM$jYvZBr=T4lhBcsZ3A9-~5oA(PP(tXKsvlZR43F#Lzh{bwo< zG((w$fcMV?;%W|ko zf_oN#+Yb4jLWbo2%$5|@W{Sp%R#JpLUg2G>Wb7qb?*&p!NV-{u8CLg1G_1{f z6KrWukVwr*Ca&d_xdusl4DNahUv1kcvwT&q83={4JxjSn34S zg7d9(Fkz2H%e1yOk3%)gGYRS?HRZ=5ED$83YANcmSk`3(g)}4h7|a?$k{}{G`v7fa z@TpDqNbo7fcAKm9=OC4E^HcG_kg)G5hh$GrB@xRK^Xu z6Y)?#nj#JHU8q{7hWLcR_(JwjQ~M}eKr&e;F?SwM7)jQRHm>0X`&>b$?GZ2 z_bx;~s8O!gwol`61`#vvg3(4gp`8F@h11kFAp^0tiQlbTDF?wNH5aShyP@zRQX1Ca zk?Ju;b%l5$0rNbt3Z}QLl0QI6s69y{*0 zqjjRd)Fal0n5q@FCEW`vYCo(gC~fI>Mh{t&f|*u+sQTCzz_ypxHs7m-n!Fke)xO}B zDWzaV%<;jxkX+M?8o(T*3^i-QuYD8Hqv&$i?pkjeK>t<~BI4ht{wo8OwOOF-y0ZJH z2}%XVqs7(^TIDvl{R25 zOdc{8PrI>mY6n9RKG@DC=cE#@mY*VfbQ$bOH@Rq~oXrEVAHs4zcYoG%`-9B$Vf?lKAA$Jjgj``lA z`oTYDGAb-Jmct}QobC)@Tw#?wRIP*8+92DSw)6188pZ|;{TBMko*r0goK*cX{^@4m z;{{>Nb2E^8-DI{`0a!ifc_i!roM3X-8?{~?yR=T#NsN)o96smQvy;%a!J_jV&MK4$oNLK?_1+!d`r$})IpSz zTq_DWwD};lf=XPwb7}I-+)7w-wS0mlv7*rld06NXddc%Ka3E7a2CGs3xnyAyv zEdm9y#xpg8s;omvRizV|eD5Ly)p?9+HQTLwbA?r>-0YEK74_``){}8dF$^oVF8%8S z1xYYS&H{;s2kR^kmdYOW9mL2b%2q+MK-I6nwZl;}CZ0f8RktS*g3-N{N?REuXx5tX zj~J>@^Pg-%XoVM$D;X5EdYr+0l$*X7H=D7eq7kfXbSfbj;nb@sLIwZWePl9MkAG{upt1u`i*lk!ziGtsgY~z0W*+ zkw~$QUvzK&yBu(n;E+r6mS};=p_gfiwFSl*oon{(rgPcMR||{x3;Ex(4_cs!rXjtUEyDe5{jDBmvM) zji53@yolt-msUs=(*V$N69QU{Fs)0q=AWAs_g0tRy{5_?~#)jke)n1`{l zFK{*OZ!TR+*d{otA|_yY)`pf!WjM{12QYGDoio`w9T?WeUl|8h$6HU`uH6pr%rJ3* zz%25&v485Nsd3kC_CBozv;|KK`f&ub>ZhIfiM&XJ5P6woGKJ|I2yHXB(q;j*L|@qw zSZng`>JIcm%BC}aNX!u1gHpmlC%?pYYG)g7A5PG)y_Jitts=N9W8<+#$y#DpU=>qd z&kJ_boBo1Bd98U$7NX1U!%8za>|M0UB{!kNmhgm5(m2owGAmW0Ik82}z7iwc1c4a) zE9VGFj#es!i>aYdq}ma?0_!yeY{tVf*LNw`Fvm8^g$#$Pogw&$%pe|KPCjy1{*=xd z1)Wg!zePU6KZx>I##@Yctboz_{6lmgz;ZpW$JcmYAnHz@I|3fK_r`g`zb$eljvR4F{RHZ7f^$ zsAcA{;HdD+1e*Y`J!mUMNhtu?ng|wVZ3*!K713iJio^)@XjvZjz{#o=ZFO8H(NGitZ+j48$k$XxuFjLN9+2ceypf;=EMk5{c;q1{hA$XfHu!z`1;D` zK|8uoHcw~W0c96M(!lu5)&0g?C9ptVS&lBvb=13drWMY`{#7#Em7R3% z9hA8a#3gfp`u7_@Ps)L7Tgda*EFQ~OgbyA|VY3hp)o?~x;*(UaWCz5QVIi6C^+0TO zfMsj0mU4^@I#aDn$`7^w7Y$b6j(7k^@ZeC*ICKWU%BncbSi;m_WET207y61-sMb5~ z@+EZ8&~bFL_eBgM{3po&V;azx3H_nhXhuP3dIV9B$DKH=XO1|}%uAvFi3~WBh+a6b z(U*gx0D3dks-s+QBh|FDmJ%zEZOScQ=G7Nf9%!O;D229OvVUO3R0W+}5D!?`dZ9g` zU=7kLkGUSqLkMM^DC>HF?4~F`jIxm|C&|eUsoL;(TTe92tVGV{X~;q~LB4iW9@s=J zf>qdhe@1cF)|MZxJnnj69|A~#oNnuVffDYmK^>KU+;nw$lh^sx%D0;)s+N+fp`)F> zEtFeU({wNL&@H~$2Fe8pz5)pJ<}ySR5~#)lo6->?0Ah8p)|Tt92)GKp7h6dTn`z>ot>JmwCrQ72{Esvk-?`08Ua&ZwLiV zl4C*%-09lA+!6X+2A7EaJ*X2xO)}A=oqUTFK^HoyLV7(imdaV77GXu*%e-4Gv3U8=bD7F3NEIbO}y;SgeG#szje;$6(|Slqe|C&~WC`&{jEB zLM4|F91FQr4V^E`vMBTtUzepk5tnoiY@*=VmJ;o`b#+}B8QUfJJ-W<#T z(~u|i2-5aG=85u`luZ<;L)Ef)s&sgFF$t9l?tHH0)J5r6mMD+=kcde@wW1A++Dg7(zhe=(nsTK$K_0&k6jy|M~ zF$nAAp+b(Z)HBP&XIPE_pf}+T!zJl(Rtu2VGJswsugPjz#kZ<4eCJU%Njc;xs#ZH! z%R~$)Fd$spI)U`DR>cspX#4{nBswq+%^CoewEv!`0Uv|5<%orw&)WiHqjkH$a?}WY zp^7To>u7n$)v_yrcF8+jyW6PYL@iPO&P0Vf(G`VT)$?f@MKL;~btjVvg_mxXWMbMf zHYA}0mKI4cH24;tObSvF37dh$u_cyI00y}4*rQBBw9=fP&sx>{bL9@m{r>Y!yo zS@#(Z)0@N*UjL>bMA4qA0^+Zs2-j}^M^VoyGzQ|>@)rq%N7)N#fmT}B6hVa#+hC1J zF&|hxFUM^CONIk0a}6>_eLH!a6mI&I>`DiFrEaHK8<-U|cFro{hP*X`q({g$5XfM> zgF3II%NxLZWu<@Vbntn?L~b8`t<%Az&*5}1F;{$g<%g(GgQR)^Ios|(j}QWMvZ3vM z62K1e30~S<>bgIMusC!-nY?7g`|zPATA=YEc@m%B%TEt|lFt{@`W76{hnZZvGpV`c zMacLwhmLK}AoE-}l3OrXKp^9Qm5Zdq#L@dbNadvH{iUW?9-mU{LdwBnQe@^;q#7Jx zX@}Ayag1f|FXy0BeZec&gxmiO9kvAua8rRmyw8oI$Bgi^h>bt|G=7yfa*Q+=)#+bMvF)9j{Pmx>)=*68>qPG|Avz1LI(`GYHCPsXH zRuwq*M(pf5G;FS4>R>&x8qMcd7{MNxBCR-->;nL5UXm2EmK0{IKD5?&Vd*;T#VQzK zQdoxrIV!Za)b^&71yIF`uSG^w%?9IF+4?;pFeYQ^`fMkt# z=3#v;lVK1jo#z?3PNma)t_tWTwqS~Uo32HXRJqvb3++?Zj_^JQO(iZ1AVT}3dGjBb zldKBuV{y^-h{MaruT4W0-G2#Okq{C+%Bye_aCAAmHo%t8+iW?ZeZ15$f?zLh1 zcCyiox@93FFkg8UfpSMx)XeTc&N|!FBYO*g9TgYzpe45nxoJtHuEP9p-4BBJeq$#c zPoRIP?OiXssqv7Gz(`hCFrc!1Ida`*BnJV;l?nOVwY$?4mdsqTC}1$nODy2_6JIhd zBvrBzuCLAar%3a_i`qIel*qC)(da05pqv&&>^hoKH>ScnvAlKt=Ezol#xV|z@F^f- zFKPg_sEa;}(PGk+B~C~@0C~)Ap_w~AKLvh+;UZZ|?yF;VOFC%%7UIpqvWC9aORko0 zQ?v>HRT1jvvS?QwIy)sS9v(PAvve4FIK2Bm=i7OPMHZ{ z(igzAZ6~{)MLb+_(#Rzl_Y`tuLoM$FNrIJ~H5DW}^ev+}UgjjM({^}@2`OO`m2(e< zOz5H5=rwn>X`^>?<-Qh7kYEN@ko(COyP|Smn-xR8Sf*Tgjkmc);s??!0P~z8eOJrV zGz_p=Rd60C>u%%V3-a6>O-88cZqn5q^fOKZ4MjBw9X=l>3?~l%xYpUq4^XmGCL^f` zNjfDV0jp$kl3N-$E>p^Uf&VF#N&09D=VO?VWE@bS4@Rl9G00y+ zuWQ@>(1+UIDyBi~1}}A>^iBs}*1l1P!KxJc>eFeBI%f8F}~V7(qHycy9%E)4IZZ;3u|BdLV&^2_N+^%F~DG z8aK2kPDaU5J51&-qayx23aWtv+Ox3x&-OGqxDBK;SS&tL*N>|znB~nnFQd!NwW*FI zM6!0{Ox((f!7>Yk7}@4hoVBvQy~GOQoR!`0Tw+{1-&k6OQVJ#Eef>PLMU|Usg0QMP zE30dPXY8Ycw@@b9@gM+PE&mSS;lm02r{D|iYoda#7FwKCEv{DP;l6>&>ME+Nzp{FM z;G4z|2{}L&5ffhyA7d=9J^sgg?BNqQXVkAijPPwpj7o$xnb?)a@)|4Cz@SY1G7|~t z^>i1D?qtb+-%pLPH-y=SoJ^LB8t!ZY&rqFtm!WEqX7N=norZ3ya}u&*D|3C# z5;{LoU(25*1ID-AG@B3w|98o(M)#5wesTHevehA;be2I9Cr+Zsb2Ll_eYEcS`{lec zS3;8e)iEnp6#A27R#XULud1L+tA9&ge_v!P;RF7*?M#)v0X3H)$^b2GTWA!OWZm0A zu+tPPat0TLoBM5$qI?5TnNA=R?LCol5gfq61BBjx5|Q!m9h21~(_YS$Lm4Rf6;5uK z$?*_Lh^Q1O_8|k6;9_|G$Ux9nknu)&PrYGrbT%rzDm;j-M=QX5r zce){M%gozx<#O?8{JC;s|UT7xD)ps%m-8u3n07$(O~IKu23> z3NCeDHnx~)>A`3mod~Jsa1cF z%4qTbyU@B>i)r<-5}%Waa&btd!c+=XB@@RS-!)4Tjidf}o1%IKS7rYXB!oBO$pg@~ z)eoL>^O=HhHkYQ{3mAHA=NOGVo5H&gj6b{+zcTq>Qj?$J>Lo` zbcrvAm-fi8kqU_eJ{`NMkRKofa%SXn8YlmJPGXxcQ`3>c$PJE2L8QSEYQ{4OSHL_< zRwr2LeuGccQ5BUt^@gKO6S0y%mps>jqhk)16TBO1qqP)xKevML=Q^obh&#|1! zg+QsQE0mmsbD13x0XNqXyY>+NLqVgJgReEL<;!_4YGq8Bq(~PMY+geX`;z8Hs_Tj>=Wcwfno=h-XPu zo?3vV7AdaX-=lUy2R;k^4llfDcC<7PNS9{^rBE^#cZ0wNST+b`q-@8Ngxo{J5_(yQ z4s4uY(J9o<(70NtPdL+28798zYJCvFHJdj%j}3LTZh=4aGC`>Y?pel^zyg;-tdg0z zI`qcENIG_q%R%-rCk+LBIwZ8q531*(@BslWW#roXajZif|C9A%vlW6+>T%F~;23d| zWMMelh!@y5;%of_sB$5PMA{c^?xWL)uH6SL8@8){og>NyyTlV4Ut38+=sFjlQQJ$C zp`CuXyKFooX}cRoHNuC^r(TeSOz2(xbpgxOw~hw ztqg&ZN2x3ebmMMEc~?D7su@?5ch)agLX!ED{+uOxagrEETUGh0t^T)WNx zTfP_DqbLR@R>)mAXvocxp`i?690>ibbs$tG$@V~UbRcxVzjisY-5S3N&Dw5_jG+&7 zRj42`Hy;a?{h)geX0)Oh-($Q5ww-stwwsYXQh7i7)z?GqIT$3b%)FAI_$^Ga7mpK=iBQcF}_*uJ7_;v=I@hGE0jiCH=>b2 z$dCHls6H~Ke*vh^BAtQ6mCEwgCRxR^<+8Gln;Jc9^u7;_kZ-=|YA>SDys9D1G zNC)0d`t5zFGSp7&n(XEh1hje*kL75-GjuhRyk)*_b*>pVLb(KSKpX17B-^qB-l{g= zPgL=d*rP5#1X4U-AHB|wQ^j`E&J-(%R@*rNr;N*gVffD24=FQ({{?KvotLDn>KP%= z0KZ#<%CJeHkd3FneC-tOrg$rw_8DkDfprYtu~hlPUG~rFe&TBV8it-Je=)3SSI{;( z0f<|M;r)VD4^lOh=2uL;?hq=+yMvPDJWHB6g9qBg=RHvn2H0p1X>+_0Mz}7fbsa}U zTy#u2sg@Y@BP5q_vd&Xm;e%FS%Btwtsv{HIzJxWIAca+hL9hb$SuC{?94^%STRsjw z04zzel9?2XO&o`2)soADAV;MvkhBLy_DixUQMYLOk;Eog8gN!lo{=--S)QT;aX37+X{nPkN(rs--KNz7~+42y|tBSpA2GJ#kk zT^p%MaJFUM8ak^)q78Q(#p;chDX6v;D1t>?_0X6CpuWludx-8Wuf=7O<7IT@scJs1 zk&x}N97ap~0i4X606}B==T0%DwvM{Z149rrrbEzhYp{^QKMQ^j{1dFpB`{>;mI|GF zO8H5;mNJg6rAQQEkj`L`{`}RHn@QkXZVF!6a`9TTuiHH9i1XGM`xh=c3R8|h?O4wKAlzfyG@)MtW?k3^pCbXx78)fCXYw)f^z=Nlx%zEIH zW*=)7{XJ^9>|tf8ZLqaAU&*Hd7oS*7kdy`2n()g9h}pn`_m&Yp2ygu14*X&WNOI41 z&0I#$^sK&>9$KC>bFveW^bZ^ir}lBEblKb~l;L^`sDH_RGj1I`Q#H{$O*XDduUTZxOm=m2fr3DWnwVr^r@PK{)A4P1aG73hErc^c#Y{FW10lG<-&|+62XO{7c z@;55$1~#Q39wODpalGx*;f&Yy1s}!|Q>7@5p9#dXR7BuDXL#dTNKStO!Vmy&MbE6; z{|H6zfbh;@m@!W$S#h3|WkrjjBR_aLzYG&xDT^n`jT>A>u+JXsKmOT0IpJSo6UGRh zhwU3dJA%|=)Calf-crS=a2nx|@pEQk4N#Wo+%@j^IJ>HTL#ICpxE^CWNtInb7UV-4 ze`5=5lFb4Wm2=;fhTQABX-i&~`x-otS&~Tb4-nR7usv!Q5fv@5ZNd*{_76+K8 znxk$}Ir9Q-3>B&_N9+4!?OalNl|kt;0b0TyKs}POk_`CDatko=|9SbuoP6Aeo|z*6 zIbQC?L8Y6AXL1IDw;1z^>ZLFwbF?EQeI1~@q8cSdu(`SX*b*~wmzC`mWXo6CWMuyh zBKVbL1m0e^81lp00amoqe61c(#d%dOH0gSt_13kx(T! zysm(A?kNC1$`2dOedV99MWMg)kN0f?Bd}vj;8=4Y#gK599NmFR--V_dh<<$o%~r3H zJ3pxM;Dz!Jx$=R^KioHpD<44RBjkyjK1?cg>P8-N;8!+DwPua{5jpWO&)J?Xr#Rmh zq-DzNZem&oAj_h=mX6?z%stynx;CO=(6%iK9W>_7Usb%M7n{|QQt>A z#MkrWsp%mo0Zh0B$?=Ct`r(`3H0v46>UiC|!B&KbOEHkRm_ zkp5=r#pU<`ip80o4jLTt`lJ3ws4a_6f=dP;iEd;QhpOJyN{d~z?x{o*(cn|j=3OMc zMd@}VW7ND%fCpGQ9IS~$bSIB>tx%3Kv<3_>UORB|9x^r3VNxbd25gIT;D*5$XF#uZ zQ4KJMa2=nkp^v(a8ZMV1T6czIAO=~INAT%zm!mug%@N(WP}zr;{m$|}9GXh0nE38b zY=JV0B%GHfr>7rub2%aF`4@9t$-k?fvIsV`@n3Dh3VAG2u4>yl>d9!0 z-5#QoXbt)Z3VBR6!X3dOh$K{ED<3Z#sEzxE1W!|1Z=jS11Ly|pWgFY9p?7ECNW1G_ zx10yHZGfGl5l5_~NsuNPH%OeW$J%dpwT`BxR`L-t@(fP|Wmhm$TIiiuUg2augKr=% zSinyjs;FFKkzTK7t#%!Qox>qb^1qsIW6@zw~ zgR7&h0U)9tsSJvochP7KA`?pWHVQ_g_4qY28m$zHuqDoDT}FOi2i6R zso^?fRwHsP`!a15$QtmI$9yjU zwov=;fG)5@-%nC!!n0PQ2&AiR!x(7Q8cWEqJ%*ZF=EPE~deca(=q*^$L6$O!Tg6)2 z5{#ubgVlly(WBQ7Q~(qzxerJLexHa{JQAQ)`+Rbmc5X3ApGdS{1A2wxC7^RJEJe2kM#x@?udYrp$!(~^L;}X5}d`_ZM zbh@A|a=jzEji!(?$slTZ^d*XjZgjF)W*v;23>YnhZAO)Y>yls+M9jaCQhB{2aGRN@ z{`0^q4gWB4fxiefnn{^M`_VvBPht}+A_kFCeN~b~3Bt=^!MNT57JHM?sbr%npcS1e zz3juC=wzuxF;28L{S7T5)bY}2Z8r@PU^DL$!`i*1G~)ObmY{b{h7}v3Hs;&7j>L~a zwsA=mL`tsK(|E`yksR?suu=k0s2S_NJRU3&z19wzNf9g}zQ^SKn8%2uXt&km`EszW z0RkRrd#=s*BJrKGQC#zpoujuQ55iQ67b4XJ>GHj(^^%Y$&pk$4uLm8--2AHhpO8ea zx@Q}$w80=#de0G6J$@6@kbL0%N>|H2A<}x}eY||+9TyW@+7ZuJE%~i?c{-8adv|T2 zQ>3x=uAg$%Yr;L*0Uf^?u9j9xxP9}V$N&NZ_e|dlft6;+_kuaMuZ{Y)s(u};^lc@T z`EaH0k-$`y0UHI}-ACwQ%n~dUTI?&y9ZdFvpk!6%(N0&(?{G@k9O1PY!1m|zsF%oj z=vLES1y><|FFSmSV{j8FmXucF`#Da>Ea?P63iyogxHjChpxpd1<-gLlvRs z@8B|(MM;qV5(n+U{Ny1FVub1-NFbRJnyrD)(18xvmUFSGLFZ*?7bJ1W!@|Tz5)-Oz zyLt5O9(L>LCtn%>_@ha*V9mw1%CnZkv zS6RFKp^YnSfyvl;j^E*kS6I=oLA&Mn(J5N?0cYv31LJjgdS1RR_%Gpu`FshIWM_5A zE>IHM$Lm&b2`uqah_pOkTiI#wIbWQnA4Zl{+D%&<8yDu|z_!2@n8tjxPTmmer_ui& z>4z#O%A4|vOD=Gsy}TKJ`O}_ffS$Ix&)WQPi1v;8QiyZ7VPE$dSz;7uWU`Xm^_Gku zxI2nh#i6E2#Np3M#Df>um>~E5a7)I-Mj`ZE2rwVfVbLyQdi?umF`rqBoqEalSrraa z<8Y!W(bEniE-7^&3)YFQHT&L@gAp_B*>YHM;7|RdLkQh`HpG0^$vTbjD6*tn*0=O= z2^&VqS;m+3b!-XnW&OZfAh%i%y)5_NmP(7gsVmJlFW-OuNa!rP>yZQ4F(}0{s`i$! z#h~s#6G`B_0bR;g`)e+!&ru-9rlYlS z3=gI}U7}CH81%mpsb_yduQG=`(T?3XTxTcntsCGd<5trN6P_n|A8qNV4H|1p#k3*S zue(=ODXA9|!MY7^B8vFjN#l3ejl!Qk;K(qxcBI|r(gMEaZYK1`cC(D{}9x3AhSTpEse&Ec1FX3bKM`|}Rvq&3$sX!?Fg<~YgATrCj|^&$;N&=;MBA|6@PV|)~C?jiXe@zD(@ zjXx=W=$miRxdXp5^vx6W_5w^`a}R6t=(Lse;xZB}V25mM@d$0~Qd{t_Wheh4`eA0 z7Ds(Oxb^`J=x3Cp9vUc(HcyP$Wo>Yq57O}$n)0w*K$ASLE>5^wri1%+`F;XoIB!`5 zSbXmw8J?d2e}#Oo_Rqr_Nc!D*@?{!Fc}d!8dWv;dlThzYczVYS;o|IOs(c? z=jWnx%y=s&o^=L(tavN`E~68FJteCKKk4*i9f5kw=mg`?C)fi{I4c?l5^y_U2pd2S zvER=AE9??RbpH%@xJr&IU5m> z)nN@Rh;Adao6l3qBS_pV+pw)!%{hPrV6HU%3{WRKm;K=Y}tYx!NJfOgJLHpo8 zv;ZBer#FlNQ7V=1J2IX1sV#_Cenmc;%>{*|nS z{8zFj#PZjKo4-FYFf%sF)P(XuIa;hNYBptgOdzc%JzOno7!&HR=8XjwKbJ?THA>}R zRD2CWxdd1KUQWAtHU(Xz-4L##g!v?N4XP+ruelR>@khB{oTiQT{lvO1Y%$9Q3GJGF zKaq5#xaD~z_+!b%= zsBPo>{Huh*pHd+5!w`Py?K1@?d}^CRW~OJiura=%28VBJ<#Q8vQPaBOs^Un<$2qQk;}6kUc(oUI zHX~d4suPY$MYhrfD3hYE-Zb~i3H7WCvTfR_6@HVJd4(ZTGps;N#ea(?h zAuf3=C-ky3L%8q?9&*w2%6Sz~r+=pI=tMXjS7%0c;S3~M z=}o=S_?e|YOOfa}=Fe{Ya9@oqZJ#~BXIn~ujf z;>lKIydrv6MP#MtP_-Ml!~H`(Qu4XK8;E=TeDipP1f3qz<|jK8VJ(;@~-uh|jEZUbf8q7g9LHe=AT{M!E>d2@g|6=c#JvQFT|Uzr#0D{vEz~ zvY^pJ0)Qj#x8dMI4@>3D2D(v&x+U2iZSD@=I}NG}$ufgGKaEBa4}MC8%w%h`RBQzz z=1pTWgo^Q6G1Ei$R@s7c*ILhFsDb4U;h4oVsuoB1q^ClPbE-=+5C6ti8Fx)HXLFUu zSUR1f!Ctxe3hAjxdTmifc`?~llT%MLa3Oj@PSl%~T?^Zitji?18>f+=*Jqup#rXze zX7_-&6f>i@RhNtdx{KD46`umoKnCR6obYf;MY!LIKOf6}FZprglS~WKeLa zZv_q&4^1?n614>mTv@2RTW>ljfr}tQ_DvgV48^NyP5)^zOJXW~;|ub?dA5MhBrEJF znc-a}Gmykg=<5t^tb#Qqym7j%d8nGU=94r?uK=#08E{@N46KlN^n5bBc>bDu=BgU^ie zpQbi9=g%s6WB`X8rAYD(OC;fDouEpmaecq>9okXeyA`R%0%!a!@EOHj3GhTN+H2nX z?4Qqt=SvQoIe5M&)qu2~L>dmpAPuK;&$8zN-?*XNP$KD3IEX+$mLgEp-=_fLn}|?l zA&sy&5nF}zQo?F^P+NFopS`I%^cpQ)v<}N|09mrb7XXM8N!(f9)~B;3G(~xY8bEC6 z2^`4k6+}-fq0AhFX7p$9AgEbrzS00|nQgx9A8mhc`@ir$!#~>YM)-1R^+>xbDJ>oT zYTNCIg*C}mi}xJX;F~DxOi5pce0LxwHN6&P??NfFeM;v=3baA55uV2%)s$DciICqz zXCxt~OnF}q?eBMRqC8!YOyKk6U-MMBOVtdnq!m(Tmb7mLfnK#I1e%6UpH!pkf!_ei zlv&W1NSAzD9;B61ARf`Tx*ZGR|Va2Zw(?iYXEcQ_Ch~( zQ61Nf(X|UJH19fBYiY8=dI+!r9dwk0{@_(EVNGsfaTEMEsj!nIqZF_Ig~bQXqBMZz ztSYh3e1G1gGswZ9z14UrBtaiUm&@@|$X#%^fX-GYr8(g@X@=ewA?l)kW_@VVRu0Fs zbdvZCi0NdcaUjyzAE`T!gVc0>u^Eq7``7*knN5A=0z)ZJ93r|31AEBFadb~h-LM}t z&b7#xoC=AGM*J#7TaqoN;9i?KB(WQ;y%WBy#4@>guXGx+8q1}%n5KSkBFrUEQr{#P z^wMA=$Z@d@lu=6nR2JnkOd)<4;>;RX>>*Oy>jo$=?Zy3lD_py;U9s1j2*Yf-x5^CS zowU0Cy*DQX`A_cd4Vf{0E99Tt-AmgGsz$>g1!pf^E3#rp(b-Fe02u=*fzJn>$BCgx zGfoI%6J*W4A4%SYztb15JBv3llDC3?2W;Y5PVO)I!#9&SpeX7$lBpfQ_WfWQFvI`5 zY0QZ+xg7s8+xvf-uO_Y|*lfvuq8<82w<1`R;n0`=Nxc<8z0O{?@awlNS-tAk6&r2~ zte(FrunK6m4gGv{0*u5B37(Sl_6<$R3rZ2`$I~A)7jH&A=3Io(`w{3iii!FQ9%?)W zikm(APx?hQolAj1z%TbbGxBpklQi_Xc6h{xc zjW?M2sZAQy=Cz47e-8Onsq|L8ODJC!f^ORPA6zUx$q~` zfs|ma@!E2k@k*ux^#>{b5*${G2{`cVj3wdyH{l@OF~;h2JPqE&2IB+-6b1J;c7`WX zqSm=S;;;NJ5V88Jh?@Mrd;9iA$9qtI+QMlu9@4;<@`vC4kxQlR~z-6PZ)#yuewo|(^ zd%EVwcOhIcoDcCqxCmS?TpHrC;bz0laOdm$fzbWK3K^LVLrS$Qx3&sZ_;k1Sc=k*R zzLb3(hS9C%&&UtF{U5B@gl#ga;4uD#SIz zZHDu~Wy9sd&461B*8sN~?l!pf>GfIz+FA{FCtTxj^c8M4{Oj@E4EGZJ7vZjgzZh;m z{B!Vq58qz6M~6?>PhliZ4V%fM(CaMKPa}MK*i&kT?#EcYhnV+<&4pW}zYqWWnAh(Q z3+dV)SK!npVAMwNXB%RA3qe#P!KL8p&~h;EF|91$sreCq6~3p@ z@*I4RBK#_f%|>_?{6|rC489BDX29)$i^4^aXFrAUeID*K@}0vs4RIghdlV2nkG3u% z>_dBF;9m$g8Ey_-ChFJVCL(PV+>G4mdI5&DK%dD&N}R^+)`IBJxsl_^dk=fZ>BYJb z6P)^0@-qiz=71D@aC1Ng4VbuJ!0IQNOkgqc_~B;25fhjVHwVrKw-9bHr>{dCu$l7z zB;ALWeR>62MNiU7^@S3k2KiYfKkMZuC_kI!CxVg@z#D~&0A{M;FTs4S=&ytM6!NDP z1K)6q;bz0FhVvEUOcmOX>SNJ1!hqp@@a)#&Da^a?DV|2$`Jv)j`ZLJ(43eLNdj?=0 z#{hf*m`9N$8SEbTn&F~wgxkmQeG+a5h2aL{_9et^hHHh3z!ktf1h)u84&fPa#9*I?n*-;Adlha!-0N^hhK|*rLr0#|AwrlyF@1vl(ey0wWcnn0^TdvHuXrwftav^>M}_C>6Emyz*_nlDt(1LI+VNrd zjMM8f$7*$%g<^K*EW0lwL(KAMtI{&WdyWioO(9a;qDmKYi}Z%f46!pqU!7ScexPgV znfdZFPJXh)Y82Y$DUw0&=Muf*)X*ttWHi3{;`Go$IFC4(hcbCGvs->j<%cRPMcyLh z(?u6$*X=K*7m9|=(fYQ`Qus^78y@jyzUW${Ka)8@+Xetn>f*#WeNX0i@k_6MBvVHP zlemIzT|dsjaUA@$uAj~Xv(LPRq^|ce^Tc_t_^!k( zrkvs63!(XrO zK>j0H%f#xeYxE;o*CBqHelF_`{bH8jdeU6i>A5bfRIVj@fonXK)5~0Yguc-Ab$yj< zytc{}f}1aVS$BwYS!3Zc#0_sC-%Qb*Hd<^>YazeH!6ea|Mokoo2nMyl<<`<%ZV^p$ z!#@u3lf*-5d59}QoCjc4pxF#@Q$3Pu0ByE_r`U;~YsCJMCF1DFv>^z5U>6HrQ$!h{ zTj;7+{zs57hEmh%=Oo-%H2NcaFNuknKSKGjDBq9p5`dp3#Hn0}ajp_EH-s)shbu&I zk*EdHm%x|9psYlwP=DWb4a(K%AG*9^8#?kRI`nwjIP^D9q`BRCntKxBM+4$T9KRXq zt6cT^D7P*iADRWfu9vw>MX_^&cs$!9N10Gn2ibcazwG@F-`V7~?F(w^n3} zYecTNS`-McD0AlNtKB(b{m^T~hsgIS@RdGfipU+}K{!VbqN$0_@gkb7>zm!%^$41q z?936H-8uR;cfJ?}njIr@^yl1Dcp^*|bH!C+Ec<5&uuHcW{ygE&7zh7MjBbhW36Gd9 za@03pEEd&bo4W?C5dQi2E>eD7_yswd;JRo)nMNTe+$u31?G%dDVy3uFzqt z#hskLP_?UzAi{IU>b>aVbM6fNqWY#~dr)PDcF~}-d2l`~5;W@PBa*}9nF z9IuyUucgruH;)suomcC#vw^Mb41FPHURidDnB&aS{mSoye^vGbvCuhI)H!uI5QXq& zh$ET#`kmR;dUJM>9?i!5z}WgRYma9Z>W^nnz?7}Pxa;_WShKVAXF!}$H1iUgpzr?d zAE1sL{WQWfAJ1i%KxqJlI`i#E2F>HSVljp};R=z{oYNm>d-P9H$Lh2!Ju}CxXXoUJ zSJP{>%$!;{aFCo*u|IvLJ~2n=vvYLudioOGk9-X|vowFsB+(64oikb-Nza0qe3Lku zUZmfNY{wD4Gbc+NAD*u_=Zq7XnI7Q>5YMEor18YmMoL=ECs1mD2$|YbjsAn4>zDnrGn+0;n z5xtouB3PIwPN#eHtA>|~4+}E%Im1iD^Mx6D-EdGX7?36X( ze-HC*^KhD%d7{9h>(SwE{h{Hd`ZjzY9X<`JND<0i%~jGId=wDMIVk7RWS%>i{Nuhp{8^Rf|9gL^y9-5xOwAhakE>0Z#X!-6O#pFrk2uk!*%W4@MUnA6~mvvBATbI z&dh>8OYFfsx-A0>YOQ{8I2O`UUPRA1^29ku2IUg3A{EQ2=5b3gr$pT8)b-3nFoxm0+ruimTAU8TLGFl&3_@wvQ8Y?4`hkSG*3qybd1vI`Hg6 zCn>$oUP3sMysJ>34S{B&^A<761H5>$^o5>Mz0TtRd1Q!toO#+pPnK9ysyBFsASwq@ zMH0sGig>`_J^3csrywZRp~CeUl0Ldf2r3Z`5VU9l?8&@ZTkUc4bPjrS@dls-q!5>W zS)y*=}Ev7};{GAhJ+`!!%BSHn$HUyo>Zdh}7bLZ1jX1I`Cm2iKU3wJ5Dnzb!XI zJfD`K2Xphp{vo>7n5%2I<(5Dl59ph7Jy_u@WIqde<*ozoAqZDtjGM6nr=!@-Kzy!8 zkLG6S+j6JCpP@gVJ67D2QHV7KYe}vSNU@gW&eiwl)?)p5Q`?_=JsiZ7Lj6?kV-R7+ ziqQ{P`xgry2T?N@Hb7-OdX>N(kmm_|V0m(fN z4Q?{McYbd^F5s)cmA2GK-1S>jH+SAb7y0B|i;J6?iPBi3bz+waGORZ{LUv8{+odr^yy zHgkZTLe%0G+kh2_Vwri9#B4M_J4*$p0U~(8mpnW5vb<8^&zq^w$pb;->(9GE+oN9t zSE8@abL)4)1@lU^^?ADZw^Hp+`grusc`LC1VMgT5M9!H&<4o}qq^Rff9;DLxe$8S{V^-BCcmRUlYeMsfu$6*XY{*C0F=^i>E1)uYE(Yp?1LV7d4v#D=Tk^3cvK z@eJB{#!h9{AnqEt(Q5hG01Qk)o+7k21@-G9eME-H9s$tQy1)OVF#i=m81Q*H}XI zxe?<@koj;#zIfa@4m>|!*YXdF%^8JyS$+<}IpRr3iC5(p!oq}VoOzOPi?D2Z#52&p zuF5xMwK@4!pj>bX=QaA`e4Dm7{|4QUuRlK@ZXBFj+n8j2*uXaY09$u0yUsU?P;Q*w zfN~A_qfy4G>7{yOzFS|FPb%Fw{m%TT(0Am|6|3?W0gF$FraWgq3y_@ zgqdH6?^rQ+nrJR66pe7{xl{C4^VguFo5gLucJd!BwgA0rH5;nn=? zXSB*uD1#+p3^H$n_V;+2N1p>ha!kQ=_(^2*NUbzan^Q22ttRiMm*5L69Tt;qY17c- z3OKNIOqV@rQ{c}KlMB4aFDGK5?k{*y^A~&@nBIWz^&m5~ipynbGQ@}-&*&Q_c*2!wevp4j_n6E;?=Y)&;d*dd1&Jr;Itb2|5h;vY-DxX zH@VVP;#R~xAj0&KF&R}kvhc-$?1j5rPj1C4~ya&d0 z8h-k|Z}*}VDFgrEYO;r11UX!qCi-&)ym=y;F#+GXVjy39=0@XL;=*{8P+r(1&}XVB zh_zT&NYr%=hC4^aW1U9&+*ufX4@RF@{(P(eg{Xzp_6$*5Bx)swOAt4W7QLedL-h9w zOo}KJH`9<$g3G~FhYB%M|FGa{P&h5H59*&3T&JfM)`&geZ=V!EZNcFE{$}VAur3s$ za1K<2ar&6TBC#KpB-E1aK;lgC`&s&o!cu#$!^7?a2QgKTcnC80<`EF&3UkEkkm1)C zmg@dOT^xY|y1r1?S0R2q+)?n0^@W%NBOoLcE*Hna4mKB-a5!36rHH_brf81n+U7za zgteGF)?%U%0~%20Ck3SWU;)H(vIFHmDaZrZCHnIK`=XujO{@?qAJmckXqU8|qlF+c z%#zcXM~{juaTEmB0A~LCDsl5Par1cb9*}hu99bF{YLGEs?=2Mi#X^Doj|^QKnWYzu z9HNgIDfG#3bKn-jEgqTA%lzVz;FmCUIE$39ag(-qB&>J5I0N@?-9K`iIDaZl++2ep zhgv%_Utcvc*8w>}TZNnvh~$Im&D8DwFj{QO7%d*fD)tHZ&=}`*P|g&loby#|g=-Q1 zkzTgIS){jWWD@BCYgo!YPkyoz8L!B10zfMQNcrMs5M!bK{K$HJ|Hvu&(UH^i(qLudHNU1G;u`QAHEL1v2!B>N}%oEDLtN zBAI`&`ZgAg(;ADGqf7tIlkx`2|uRda9w{6*^WRhI+d&IdsLCvi@+YS zFl;Nz&`%W=iJBr&msX_Yk`nDAk`|5EVYw&$YB5Z8G&6}cdPEDRDfBA{Iz=AL-|2{) zq^A|nRfWA`&X6`Gz(CAqK}LrllMjEM@C_l6!3)1zEF4mZuSe9uzj(-KEYg^##Wmtn zXtJ7Pkw|lth;+v+k?9~!mNZewf6&Gjiw&sn4&){6i!@vw$;rhz`fNm9M3;QU)%xOM zuVkfj0U_4;3@=!!M|^t{7-7D?x|r;X6b+LHzAaw;p5oD5xV5-Yf2cT*{f`$Hi3hM- zTs&4B2lqaeX011;2-yy3Gil?IEQhE_f3A3v_FVBSxFRvJ2+9(^qcHZ*6;Fq|1wseb zWRqhpLlmGvmTg5eJVoGdh>~?}6Z#QsXdEe43ql^eMF0XMU;+UR3vBZ$SfEewa+Qzd z3i$J-NvjqmmcW&YhN0u}9SxTu9>hXWJVg*-&lOKV6m&n-Lc+DQdLB^#ysKX^Tk$=*g9Tp%|oVAI8YNiFTTmHTHHJZ zQRr=<_%23pltV8rv1!F6`EcXlzMR;UH%%XfVxvkXp$JP&V@hUfV@jroN9ZGwIa;5M z$k`>c#3R%2F-OafNI&Jg8Xp;1qThzd+hpWzR%CNYDXQnixEX2R%Rwy}s6I>305u~Y zAunHlsH9NSGO|QkMxORiiB~iu{E$k`(|06l*&%DW4Yl}D%SF_(!>VOZQZ0K>%MOJ1 zShXB2fh7ql?KxCYoRO!0its3ev#)^F7~e5hc(pQ&%0$30<_f5|V5~DTU`Rn*M-{|l zt}r2AMC&L-A&R3oT0X^5yjr3qUmUGJeME5-M`0AAu!^JgDvm-FR_jm8Dqe*sUX7zT z3ZropN5g158jpt2{!ZbZnceUEWHnWF>eQ)I=bSoqs&3ueI^8c+G&u0M`#Ty+>Ua|# zEm(PpH)BRW!dZ$H+Z+cr7Q(lAo%D6tYQWkm3ljdxyhD%$*b}e?l%{#%I|7b=r+EX; zjn~jp7QQ6E5UggNAD3o%ue|c@C6ih3$_8v?{E{F3!p8rkWcnKK*1>1Y%YNY_;laNE zIcOEkf+T!|?5G58bOxP-UJQako|Vjktdp^N%J>rm;ag@CQuHYCqr$Q*uyo$`Q}8xc zeo2z~ad7Dptimi-TB|IWzGRrjxu0whcBwQ@m}D}gRTjq_98s8O3yJ8 zoZJes1lqtG1$2}j#YS+Me=0lywWqv6=FyXvha!;*82t) z$kG9k(OBev!thMvte(|E;s%0$9bMxo0M>o95QtagCfR5WRA(SwB+vtfU`8FrPjEbH zG6{bCJrEXT8S3KE+Kt+A?~g*qqu}z6GhQ;wD3ji8pzIJF-@;Hq$&8YOUcn_&Niu*( zodGg{1TavHU4Xh}eo_`jP1vXfc^g&^9d9*F3Vuk(0hwd0!Yn^c5~V)DZ4l2FU`N9A zHzk~IkMpa%|GSe09s2R}^WS>{d5ogvsI^Z%aCzU|=N^dNh1X zf>{B7ew^V!maw8hKP%vQ5`PA)Z6pf^GzaZr66u=N8<5idMoJD53_^MQU<@1B2wo_&`M< zZoJ65p&{4^ERVEiM%^-KOW+Ss-RR%&^SVEmURZ(Yl70%k!wRStbII^kX_`hyat#Vg zpy@)-LbZ&jDIY;-3wF2H_e1L>R}so|mTo zT3P_!_4g#t5aF-F2QVzbZTl2GlFg6v#Zo!=&gvSbpk91FpL3uSp#PnH)a9- z3h+cG-X{3TOGudEuwpB-e=~kTQ*uD+lC%ICf=NKE1Iq>fD>!_d1hrAnn}(%Zc`Mco z189+NF@Sdm{w+&12PE`3$zvKINB(0PmM`!&><(;j5e9zAq(kfkzXDy3Vtz=VFGJ2Y z;R}%dER70!k?wwNNatCJeo01T84gH1C`}8?q%X8J2rD@5abRLPFxL&dA5)%k#0%^O z{X=sGzwi>RV z`BN+7&fx`R>>ds9QwHIY^gg3cI&<)59kyRs6ChBG)F7K^6b2KHzJCTTz#u(?Y;2%I zJ`y@Hn9<7$_#{rJg-OyPcyloOSpaWTV=(BTc%8u}VGi>T$WDZ1#JhJg#R_H<$PNc{ z9y@jZ$6&F8dE)~0$FPErP!IWFWutLX>LrWd-AMhE8r)!<#y)O<)S<@E8{frlHjbf&&64?oB$H4$Gio)%_^R2c|ia0}ogj4cTH5XXM}Ex^}|LmO|%!h~nwh}L5RXe`6}AIU!n4Xt5J z)6yE`9fTE<-P7D7Z@w)280^BJ`x08LNG~C^Rek|_BP+m~Dh<|DT35-B+K|#e_6M1d zqtz^I@<+foTV1gz(i-H2U!!^YgB;n5dz5A_d8-LKw{Ha5nh9D z7d#vFV#dsUf}DA2mgjZjjupsLfETcmhXs}uhrK%Ci?CEgEQZ%;u?$}hJxMN|8DkuW zlwrwm@Ge9}G8THwX66-0i|-@4c#fcn=E5vAhgm9-MPeo*;3udRBUzB9rDtZca+=Qq zxTWF5$b`*J!6YE6f!DJl78>Po z>jpiMw?KTuS`g1x%yb)|j}h^>!4+vk!iZ^Y046*Ye7o>cnuf15nS!K6(ESOFeG)e5 zhZLbP_~I`>7B1lzA+;6kI9D*gAUoNMSuaDrLHTEyKSZ1Z`3caO3;m2DQX@OD^7EK| zv^FE6GI&v@^@Qf@;2)JJrZP*D7)KD+>o&O|chVR|PmBU^Xbo{mUPK<4fBd|`W_Ad# zVa-9%odn!1nS>y$p1eI-1m&!F5{vkh^^TbS<7dZm>cSZ4>%>fLRT<46jA=Cy2R= z8G^8vRyLh5ZnD9HTjgH`wwIrUEX{bp;2o@Vvo9fu$9N($4~=17fLBCKfcd3g5!}$R zUwC}yAN;&5&msz6fPTKnEDq})xHVwyqP6-Z`dwr5467Kt-WtZSjK2k}LlhmDAv=m! zKVo_yZ%DE>3-Im8EhF~;zXTzlv;0pIjs)SC;osMUX|$zin7k^jhE#IMK$PT3$3 zFzrIGz=wb)g-3A0Sjw>gIQU5f;T%0rYHu;piS4p2DF#78daI zgJ@%!fzdC3zZJA|K~S_by0IJ~1pXRqk8#MBWNFm22L8xxPm>8U)svgWKLq@62E0v2 z!XB6Wa959H+BSU=v}`bGiT?s^vgDr!^=bY`zUvpH??^DWY5t4f^~(}mg4;mjehg7l zm_`5QacyahU;8!$0YaiLlff!KhGFTXU&rze9wieT7rAm1&TVMR zIsWDGFFl7ovF4y>T6W);U7&80XAvAM;Y2)$t%VKFjf@w|>-XI7eP%cw8@3%L#5d%0 zr-k2v{sk6_(Gtb<3fbG>+-T~<{liJWguRmi2f^POuxP4-qPzk=;ljugFhUAx5SB~7 zho#yCt_*Pfk01doD9E$m3X^CsB_wbFcaHD{W%Pi}9!A15z1R?B5ZoqAqK4X10APaU zdW9F@15+5<9fdYc6kee%ZS74j1j#BtL7+#HHkiV1;`*2atC$N5%PM9Y>B$N>bjUA2#&Cnk z&tu-v2H6h_S%8Zs8=@^4+3~dChN~S|7+Kje@Yqs^F?ykAP$3H=JNkiDpbWV~CuFIR zI`FK9>A?|%^d&54en2Vn{Ug1HU%>xNEfVW!aXT}t?11CalkMo@PT3Iv_j4{KjY`{*f74179wLJ`UaF*RlUY&sb_?8^SajB!qxVo`jzr7lg0E zRG}MM&S^GLdoxCevVdEg@O=UwH2gGp5dH4irL(O=>ZjogL7R^pG0T-fM%teT$3hxsUfY2thq(;l$e z77)G|=B`Kh-z=E9$fV)1YJFbz@PD9MxqZ+0^Q4uFOizC$W#y97y04_I-1@Z6!k=5Y z>lyyX`+$1C^mpwME{@ga#`Zk0$bb3P&KZ}5uT)04PQ>(;?J=&qiY^bvxb&LvmCG@% zwI+SVH_qkW)188W?t8)+lAHJBGrm2}rQSCT@ttvQ@BIf~@u=M8=lCy2RPOk(`HXL> z+{TmH9}hXWjb{!Ezd6a(KQ{e($jQ}S>!N(a$!%pG{8HP=+25de<>X>-yis0tah*5s z(+Al$-b(-H&g^Z4$F~-Ei4*#oFaMFu;bG91byWDHrcl*$Htugkp)BO(L%E?GD^*=c zpVVK;gzz^v8oZw=aDVsrMm;BUe^;N}cUIgMmTyd+IQQIkmOq-TIrrTv%O6j+omDqp zxc5L%c64abLyd zbuC^evh_9p^o?)s@O%6be~f#5dCic3_jXM3KO1pRv8ZXvS8{&}ua!#N*FAh)!&-d( zn-%^*7*aB>h`T$JTywrQ5uvYtOT^PPJD!v|`8e*R<$1h(DskWR@h6%lN%cF2LRjpJ zLy|`lwM}hHtIAoXgYT$fQ_suX5JYk5zH&G9f{hb#uS*#&PHj!)AJiX&9~z_O$4$K? za|$H5?JfaJwsA%hrZT#T;{H-?XfeIv0EBM6SmT%11|4vbh(aOk)MpVL%FM8^So zo}}Ws=5VC19=iJi(M{rMV@lRKDHX!&7NMKsv)*-+u!SYaLA26@Lkxq{Y zwh8ql!Og6|k6=5Hn9+nlwpIpnwS^>(8(={lcD%#|L-*6L=^ zsA1SfXH&l>aR+?Tm2(|ZpLJ;d$lTOFlDHZlSxzh`2-<*vTEk8K`w~~@H%4}yDpPBN zKjW|Y9)H6Jgs_km)`blrKw~}P8+^mn)IXNF2Cq(qrjk<`qH_!}-+;~&6L$oE95wHm zv$k_bcSBP;*&y6s!nESDi6X8e*oDf{A>P-uLA!S&t35m#>+LI6`Imv@QUht5Of^8zUH}W zKFV76_;uk_5@{qiP(mKHpYmLfkFnYtenV(W7OK64f=Z};!*e%$Tp%}p%ZpQqyWFKK zMp%8GfKB~pJa@|%B+k^=3~4rnhW1h^TW&m&#P5)m4QUjOT~LKhSlYRENG4k=O2<4j zBWi9)$0Bgbu-YHtxgpJ#L?ah91z}qo7|wf)i$&>zhoBWrNgE!vFIuRH0*nC6;zxN- z)NB(oMj+I{%opGdH8&Hts~2m(OB@+BJKDCaDmxSXwVh82QbmKoSTwuZC<)0z^-$6m z1r7w>D-$IeXbc1;+Ke~jnsnjw(} zt7<};ZK0w~%UQW8hn2LFRYZ|Sqz>Q{=bk7=v_-_6nmuiHBEA?PVoqSBLF~tQPSq48 zBIeZWYa{xav1Kd{$L}@nZ7m-z7p0a)*VlM7huYoY=KbsY0TPD?xJ8KLCwR`O$>PYn zukmSolN&_X2V^_!}#pzRD6V_zpTT?nP zM3loAP|wuV{}j)KK-q-)s3t3~51$5{R38O;8a?Ab;rV)Y)c!`x3A7{z|75~%aI+9=JxeX-0!gKjMm#^8<>}Ym1 zutI@s*(nqSE2*e}imr4e-AF!dKpWDAwNY(T|EoM#K>L3KpRd_~PX8^>VLj3RnvL7m z)F&I0N0Y~sJI;M)&3WQ%I}1`)fWk_eo^-)Xg>rF49X<#&(@p)qlem&b9agdSp+n+g zNbA%_5Gh3Egio|x^@c4Ybj=w`8)R0gT8lGcMXr?f;?%nWidrRJq zUea+C-gZ4#o~w^LdRgKWp)q~Aa4`aNvI`bL4RrK6fwKsmSKC&=R6vb09Tq|fNl?oA zH~o85<3wE?H6|UW3LD;{FYZ6^TZoQ_>UT+)w(pE!0YGoTnN`Pmg#L8EmzvLg zv@LPaNkG_@JfZG_?^TxQhJag{?&xhi7Z5fG5(ex9kWoxcp~RN3u&^T)s4jxq9_q$1 zErld=+Yv#TO$oFhMuZ&o9R-#$+tE9CE+V8EPEhfk{|g*;o*QbJt{c$3dI8C5FX5M~;<0Vr-3Q(P!8%(QSUReho7MTSYG z2=$TyZWa9dc`gmxp(Q&boJdh$`@?O9NhK#?W`P?8W{~GHLX&#Q0oDdT^E{V@-B8<{ z(2|aPVseMIrBa;Qt^@Z7Z5QB2gbQlB0azbxm*7%_D}v+!vxDblco*SHKBN_}AcUx@ zfYtHF)6uW++$O4ycu24)Yr6CVn~dN z8F5qG6072Y*wMca&mwg6k98b&fBLiO&UE`8KG-312SQ3rYcpDWtHZ?Agmuv<*|j%H zU&(!(q&Zy^a?un`(wY!^7>cH;O--+`;sgxU~Fp({c?5^l9ya^6>Yk*6Mx zg#PEnmz#t_*}?#(ytKS54zQ`3id)3QF;J+mP58%x^0G954!sm#8ei^E<6~h6*=zDQ zP2p5H6V8Q8p(lu9MLAHEOphA0gezfJ!8bA}kZu91BW%6hep`Ec@>%n?qWVOgsVt6^e7`E2;8+$K}Hg| zp0Jk@4QO~P)a0AR)*F%V`a=AzNO(hH0vX_mV)CugfFT&gf@sw4(rAq0j(00i9%Q!y z#h3V8ip*KWYwejO_M$@USj5vYqndcJM@Sa2Jr+^-2ic}QKc?c8ne&NP(ni4fvFBqI zcM7F+SnZ@kl?)}|YDC?9XF~6>Y2KI zUp0&xxTqMFhwh)=@8941SYc6JLQH5=+N?IGUDp=0XY#r1RPY@c1TU!A|FHU@YH&~? zrM+C~f<65IZ!s~e4Fp3$)!?E+PJ6y`ff_dg8*yFhx$i??(=wM33)=R3XYXCJqm-nW z#0i8K;S4f6AMS$gtjy6oQ|~*`z)yvY_B?fwQVl_wON(9Ub~YbS4f9m+X?FwH^QvLN zio%Vw;r02m{;IzaNPd)pD3-8C7KgN(4;l{w(MU8NZAQ1B6;XlxWkz&rv#)ZH;ED-_ zfR@(Ca-jLD1rTf9O+Wo-p{q#!f>GrGYt7JNr z?#bjVvtm!YmZGqXM>;Nx>}DYTaRSBn1&$`aYItnp)qwLf|YGRSi!hj?QC> z7~4}DmluC9=}V#Q1@)B^j6BnEn_^hI7dVZ#KCc>{>o~G)GV0<>)$l^%5Z{^es%m&C zb6euR?JRZ~Qw<+kxgBv|Jy#3iQrNj1TF%|CKr^p&Ttz%tI$P>29fnoIYnj^<1Ht(H zI_f@^xqb0;K6bx>!W#ou6>I8=+F5Fb&w%uB_-^M2jZc4 zIL;h%T|5$x#g=#~cEv04TD%c&Mb+>{cu+C4w6mldzGUEz#DFYXV`KYqPeL{Pm=%DK z?6k#W)mZFv@yFG;58xk{0gjIy#*gBv;U`Sou^3xPubjr(@q?$`r>fy64O~mSl}@7< z(W4KKVSLyioQi$vEZTl{_AL8h4xpd1ac%J|5MN2GoIkyIdhqeZ$K8*wK5kB6&ACJ{ z-GgQRw7^}63As(MF2ZXOHuf_DcPS?2bAnxAASz%#i^vaivrDjR3@rrM&q>^s*pQFp z=p>*pAJGnb`FXfJ_?ZO3ZeUboQojK22b1bi>stsVj@G{@a5u30KEe7B(s5V9hP z(gl!z87@`w$RUCmfqVmfyrORz7p#q)1yUlNf$T_$acvhm4J->f<=nT1%jy(ps?|OD{!>6UlTZ0ipjeK^MGg?uz!c3 zQgUkd2?8h#sYOzJ#a|M29)64A;)7yqc5YWT9mtxK`c@j`>3d1*u12&slYz)7IgT-YPnrj(cZX#a;g zE-zi_!-nMjqZOk_aqXt$TgusiQ;;aD8vY0;gHmqE!fFdrbSY1@+Y)6}!+*e0ptQa; zIQ-g{O45$BE0v{&)Ra!8wiI{mu;Zm|DL}$2NkD<{{un_U@F-RQeHVYWOdR`lKX5jv$&Y zAo#x;8`xWt#E+!IXH~Y7IFh1-b1V@^HT+lXIHf~^oJhw~2-fl6u;-M@1ZheqQX9Sh z6}F$!E{&xHk%uvs|ITwwsYy7eQcDss-oM6{R5~P_Hk7gsoWH>lq0}JA8I-gI2tLEy zmJS#{XOjBxknwXSozu83B?762|A9k6Ni}?h=eiP`@N_J2EA=JXuY0tE0|M3XcZlO8 zXZTj8^Fmq@_g7WJ-^0O4l=%njYNdm~4zmAGw#MP?dn>gxc&0-I!*|%`W1e9-^ zIHxvduG-?G>Uenk=#gsp4o-#CMpQh3lDUv}-RtpR;ur^O zTNvjMQSF|#f%WZ#J-=w9mB?e)iBti4L`$?2<0@WKzzz~ne7S{7AjQ*4j=~)kX$q+m zX&R{qX$GkeX%=Y!X%1-!={nLd(t`Gytg)os)*2U8Lj<60t({H5k~Y0mlzOy-+Rc1PQXV(I@gLp5QQwY%C)V8sF2)mGSsx~#oOsElq|dzmOm zhqTG6Xm1iCSx`kwP}Pt?i?a5XSlZK8v{A5>1gN4dN@Z%Wul2pxqh9wRD<>vm3blJ$ zBU#U(c3-=NNH`79zP3Y*)U=1%Jp>jR-pn0pTWW3Td}(_n@UfD<$TZkY($=&w%%m&? zT+=4Pw<+UCO={V|niW9H95w-UZ8zLj0X%|wBH(fzz=n1`Q6$!nwMW{*hpJ%%kNl3b zC13x;3&K5tB2&Q41NT^KdFC{50^fvgRl_ENeWdDnch6TR>?3Olv zzegnSG(o!!5=Ag~s;&8A&tlJ=H299Ttu4X$wouX5`qpA=nYD-kJH8I6Z-bAHwro$U z%&^Y2H(HAvkV81+${}bf%lq;k4gErUuI|zBM0o(=fQroZ(u~0+X)rJ5p1K8DGd|oABPkXJ60ayX>T3fRxNSrs?o>qiK z>;c%*9xNRZ@D{AuA>(}jZ?u zJ9!~dsMH5|c?>3!w58NR+mbhGZ5Lh2@BxkdyMdT$E{}zoV<`RKpn%!a(dGjmQP5 zE`mZ7fO9YqmAkI?d^ohb=nQAU#%=f(5%>jk9g}Zj)l3sxX`B_w^q_Wo7!Q<|>&uPh z*76QEJD0G2Y}{5(pB^L*6Pa`_-3F^&v`xr+_Bg`&E98@M)t*qh?4(Cd%Sr4PuE9xK zzF|i?az<_f)B`93=6ZC{nv?B8BhA$u4(W%2s^JE;S=8Q8?Yevu7^2#B7~Un?-l8@q z;~|8A4SinTv=lAd7Rz#ad40LOoOpFfs>(wsJ=jE_H*o86Lp@fv!ly58KCV*brkt0% z(BqH>=gD$_thfM^?qe^3GaGJGu0Dwqu!yaJ2d1q6Sdh1$WN0>RLD)w4WupdXJ#y9; zcxHLNPA0Q0Z^;#yj0MVFFpTbFmP_ZxH zCXCOc&)LMU$`^89HYx!nq0|&Ivz|^Nb`RvLT)-H@c;JrKOGEEh5|=NIG9IctWalJU z2*C7#yq~ENu!hSDLr_W-azB)#1ggt)N&>GByqcVPTad0q7+^y#T1q2_cp7bAt}OTC z-Ot}(KN;89xQ3iCC)7OliIL^2c`$x{l#DWrAGEmm(cP^<+_rDYp-YR$J-y*QM7dpO$fh zhwI5PrIkKS-=ue5@4ha-uD(8cU8W}^UvC3*P_d7yu1Nd&8(C4}%0Aj7z`2p* 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 e5Q2jU_9Hm>@Ea_IU_XK*46PRP$^Q>{`Zmn~ literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Lib/D12/TB2DsgnConvertOptions.dcu b/official/2.2.2+2.4.2/TB2K/Lib/D12/TB2DsgnConvertOptions.dcu new file mode 100644 index 0000000000000000000000000000000000000000..c9f9a161510c9f4a99df53110121bf889d153c3e GIT binary patch literal 6174 zcmeHLYiu0V6~1R;uWy`7 z%*@(xlm?eZ$drdd5>c9_A*EHR5JhQ=5T(#YO)V~#L@66o$efPZXIcKi@6~-E_Xkx7Nz}K#S{Pdj1m^3ffwld>rX4*0bh3)nf zUEMOB^Y7mL2urN7=TD2KGVNW*&6!tA#l@-A_N-O16|sGKW>I$LKe1#bQxn-?#}x&} zSiUCLvtvLg?l0F&ysp&+gVegaO0waUx6jeEOT)SK!tIcq{ID_C|j8CR0~Xudm0O zs@ml8lqh{Wy2W$@Xq3I6}1N4?lg55{l>u- z-Bhh12M1bpSKA#uw>)1ac#>p4kL_? z1{1-WoOS9Ob$4r*MUk{@ww7EgtM3-C5IFB5uunJ$y-LvKF$fdXwPoEDs!w^1C`~bn zEzm`OKi(j8aSSavu2pC?&==f)%=$Kww`}nTB3}6^#9qtMsWjdqQe%{q5onDyyv0=C zA*>~aS<22nQ8Z*lWbiR<=orR75$$tP8s@nV_1Lj)JKJN%LQ?0il8<mc!nuhU zG3$bI^JU*m@Re}^el>cX)+enc67E(+i{+cpMo7%Gj1|aFPfL3^cU6F}! zm@AzG&W(Z_Em;+67tP0F*=@OcURN-~EVFxx$X-f&Ka{-$#w_g`BTNf@0zK3(HR^XDh)AqQW-^Roo{`OyX^XW1Ur^gqx0= zt86DAwk2LC$2z-hipZ~)ggxAeJC-I~Y1pjgcMlGodQK851H-8`Rt$}>b+lFKUi!ZtAG z(YLiafYI<@MwI7!_Q{WGOQ)yOyW0~HG_t+K{S>j2+)i_|E{5(VY9i$|pqF3x%NcD} zYq4kqg>d5y4gbm~bCH=ZzCH0zthUHZDmWUoS-Z}DJm+3KTV-_Fu(a@~`c_D&=D znb-~sJ1k_L_@wded?L3|-XV+^e|_u}orL2ma0k6Q3U(jS|v$86B#9NBP$Qf@L zaw~_ts}PKwxW0tLutlS!>y%ZKeci=%m0-L|LMzdDO<+ z$gY|bmYz`KGoCXR%6r4<&-<5k9Qj&hZBGg0+ zqcT%C3N`*WUNmm~sA&Mf#PDk&_ z*Up}!m1_Llt%nQ~NG z_Nk2qg)mm%!ijc%J>ytXuhg{f=4HnAjV4)Z-PlZc@ccVV+47lP!Yp|$5EHfjud|Op zwdCtwp72`X3Y?$&5zfyH=Vu4)!7pQk8=&q8%nsq&N{JJ831XLoSdG7iWHz)QFfRa7 zb1I9xzJP?&<1l&z<_8QVLtZSHgMN+7!Ro*J*jn<@czfPfx<@`$_Y#{~y<$*wnuSQ(V1pje1}6g=$LoYfo&u^;Y%1`u^oOIQbz>of*IF zBspBe;W-Y^bExC+G>3W)b2&W8VKs*l z4l6l4#9=>&LmUha%Q+n7kmB$|4nN|shQsw7ZsKq!hYcLQ#i5(S4h|1+P&qupAzGMa7}VN0pqp!JL6QH^zuiuk|5OqNKJ5d0p60*!uq6C1!t49rTqzj7rAsz z)pwE)OVTJiAmRVsH#8hvzFNX=DwXllG03EIGdfxQxG4UDry)#ltlIVrK+1d3vx;AP-Et77KJDH1aBy9Xt@ bE%FAR_pU&i?>&?pZ}zrXqFcRpW%7RjNrBYb literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Lib/D12/TB2DsgnConverter.dcu b/official/2.2.2+2.4.2/TB2K/Lib/D12/TB2DsgnConverter.dcu new file mode 100644 index 0000000000000000000000000000000000000000..b464c8fb75d10676037e93ab746edf53f0af80a1 GIT binary patch literal 11115 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 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Lib/D12/TB2DsgnItemEditor.dcu b/official/2.2.2+2.4.2/TB2K/Lib/D12/TB2DsgnItemEditor.dcu new file mode 100644 index 0000000000000000000000000000000000000000..adf0e7890818fd085412f9877253ba132177ee7c GIT binary patch literal 47711 zcmeFaeSB2awKsld&zUo4&YXG4WD=4XFiC+1N>ajGc@ZU$0ip&1BxqE$Loyjg^FlH+ zNLsNV#A_VWD{X0|SK4x0`YYbXHeS6IE%$;JHEpqCi#1yAW4zD{V!Yrb-e8G&zH6VC znMttM-~Bwl&+nf{dUDQQYwfkxUVH7e*WUZg=>kFU-}Rgz#2>kR;oqP2d|zN0HA`nz zM8hqWu~2iMArfnC|D^whZwtb8?OEe6r4`GoGI#xWhPYV)Zhfe|G}2Q4$L%Ex*yd|X zOYd0M8gH);-7&t}=3sPY%Yp?$gS4(A3ORxxgr#+nuY^`N;!$W6mu(8RM-JXl)@ZM8 zjkLrCXHTQOX7$FqL-n!eulxAbMtddT;ZVC{Z{rJ%_NA?@O`%}R$Jg!)HHx>i zwl}PL=yFD*6pghy2s9L_XgD?+iA z!RV%Cs4_$duYss()mVI#2CaxhHwR<&n?6osvMO|MWlJ;`Y^e`jA%x#xvb;SMGB6{A z`CJXPr@b*)A8OEASz6u*z_M123$0>Z7&~mBH^LySm3&LVxYa~YA5LOLQWV8WLHp(}*wuGsdD_OxvNjlrhRVaiNQ(}rfTw6g93X3)n%eJp;vcRLt4p{HtzC1cs~?4ZOUCt< zttwUo__%J`^kw;9(L~OHyIX6=mx6U4hcOoGo8k>2-VU**Js#T9_ub*JZ8=6&D9Rs~ z!jSiHyu$V2LyqfbwsaLQS}Q`l*T&eprekyHG#Smkgm)Bz1-Ei{{`9BA$`TBo#$|{A z?IjOCdj}fHjgmA1LPu37wyCw@?cJ6BF`O$~8e7j2X9+{TiU%VhY+s@kh93LE3t>As zo`I2<=p~Nw@WxP&!mSW$mK~h%+pxT(TU9CmPZO3`P-fB*DC%p#;+X+@|h6bo5?2#8LAp*Bhc*Q7`yJFIGrMH(aZybO`>%uv6&v*9U z8dmG0df-H`X#V0K&xf5_-Q|(?Xv|J(DH`DBU^M0=P8k8}`=&^PY0`6Fy|6y)D;)>_ z?dn&55?1P?(X?CPuBGyV1((=YNNAs>2Wlw5fDj8W=sWEQlsV3jszX z)(SV=(EBA=Nte6kj`lAi#nMpJXVsCdp{9?RwNh9GIgJy@{5%zOw*f=_-xx5L}K5~^%drX^Se@}$hehMLC zR)j{iox@S9+auvf z%UL2wYcdgN1`lkdAr^g)Nb<+>Mq9EOGl5`xe-(q*EKF7um& zz^K#uw-g9UYri#)(b7mogcyB?Fxe(O8bu;1n=$`JzfZUcCXP~y2yCjg`Yj+aRyiew z;TvxJw~nx_xxFqF{b!nYKkk{d-Cw7)+}pkMM};4>tFW$^b?3)#>Xv@L_YuY z5Y1;Mpp=hh-G@LSLKC0JCswN2&r#hzKs0BBfPRVJTtKRI6y! z`7awMm;winENii3UrA_qN0KMdhJ#lU(wB;)1T)l7HLg-MjYd7yBxIT{YeT^XJ`=1Z zR9YXb4YkEFCGwtHN7#v}(%|=cbkhC2b{ub$e3~J&&cb5NC)!V8YtmM>tdE55{Th)R(k(Nj^rn!d8dk)3Y9TDA^ zQekKXOeEhMT}5k#rjLl)S-yF5lb-M{UgZA(2|X!y=B(wr=^aLcp>=b7GffE}fDagAS~!|vu79Ii1!%N`_1bK072gDx7;(pXDv@TO|aG8-|= zysA|GTUcz~xT^I8J;}`*wfW|cRB|=PXcIu^QU)$Wy85O+07;9rSOaCwq!LQVf{aq5 zqh=ji8N)W+D*4X&VWre8m;Gtc!)VOXcr1pLQLBk1P)f}j7=%1!m(BMS7}2aq#W(JH z@?TIS>?)YIDA4tYj-?IR6N95GVFr4{UO`JZH0|8-D_{!mPllj?fa%L z0doVXGv5*V-ejyrOemOB?hqRTMiW*6{4jwtP3mYVmVrD7wG;DnHq@Xn(PyX7FU113 zMT`CSrRx(dP_2rk- zg_UBUVO#b=QqP}KEzr`SDfcx}Lt9gl&7*Vd|Js7~8GR5f)z%^HpZ`xO1xzYYvt86< zK9icj+-ckd&o<%F(iC$v5vye1>*i=CC^k3rzUKyy5G?5r(Na_ER$v;vHS4gWSHGzu z(hiry0Iz(iU}4x6Z9tm$>g|(`qgm7>9ss-YGv5mU{^!)<)oOs zUZeiWH!A+tOgBtw@FEfAu~&%J$VO5dK`v7s+e=NzGHqU36}$&t7>!`PaV^w9fU0Z` z6Ia^cGiDhxFaGr{>pRUU#Dvm7sR~B#2{laLde1~Nr%U3s?4yW~Mk16%qMceM>IEK2 zcU7n*u7yWzI?SR*kt+6@nx*t?Id)Si^r~694(l*%C$+W{RLofaFlN7+rP`ze4kPx@ zlecJ)ZsHpwaLhGFor8 z=sPnL3F#put!efC`y2s_(&cMAk?GP`k#t1+RP|w7o~KEK%NmCxyW4@{9;c_l1pBu| z2Y;jWZVK=v&)-bEigoooGw&)AxK&p-t{~LJbm26wq=er!L^7sth{TMoYl$G;;Y+J< zc5oBH$2gSkq)}?gGQy8>7Ht!B^;Ixhw^b4bhr_yKMwN#X&iV#AEv~_d?Z#j`4R_4@ zOZDOlhjt?orLmv`4s^G^gg8ZK$k+zqiIjpRC*MDd(P=T#AsP|d$ZX&B2JJHtfCt-; z4}>3R%&gJZ#~tM{9MWuz$3oGCyKO&d%&gQnh1#{)iy0$ugQQ^gEZ19F| zqOvU%1m(q&KRgna@CdR?^lT3WIn94jK@J5q_8(IzQyZkF+7!b>2mfV8qqoxBXeT4I zw!eS;)DIBd##tbkU;c4e-W=4@?RSn{-;Jz2NK5F|ElnNoqg>zM(#)f+8YoI5a;AdV z!X1xe_DKbmlA~yfHY~dB+jHPgVKb<`b$g9feiw=8dhvcC5PfbC~EXA{%2ba;PN5Y@(Q$ z&WO8Nl4K5%T$@fp<7*4zD>`p8lCjqIG7yQ2DWMFq{L4?g#rGX`6KK_RgZ}YPEj=*k z80n>Ck^e=gl+z`>UUfUA8X@wJcZdS>a$0-d_-XW8@RfAUu?5(~544>{pT7o7$6yis zi2Kc0na5P37*`+OfqkNQ$gR~k+NSFSEI|S|_UO12%#tBt3MK|6Lz6C-Bwo#8$r&sMB=sRX_Cm-!6r3H^q#8{H_u2mV zGrdU2Z4bXA@WX2ZzojbU3EE`9KFUp4us1FJMrT-#;V7M6kr+Auw>dx(EmfZO?Zh9# zE;K^J5_r)k@Ar%W72fsL16&00q=n<2a|eDDcEN(lY7Z9v{Ag_@9D4jxC*T%8RN4#uLW z2pgS2F+GLrvS|c*j7Fr|hXg^I{=?Uwn93Jde9G74pvw1u z`=iHxDol6lRrso^wH-BnIsDS{C#Oy@q(sSs;2a%h&F{Eho&0lQI;{>k%X9*8czWT5 z*Pr?lE1k0(&jJi*4$)pov$^5y11P8a@E{;*UOEK8)%^6bR1X!5NMoi=`eObeYBFiZ zJxdP||3u9l3w*Y~X@WvgB-GPSSqoeQGRGl+*AG~WJ+y_JLW{lu{kHTn(vUn14Z6SS~OXmgjL>qGQcJ_ZiN{5SH1w8h=TzoA0ac2J3mxTaTU)tcl($?!+3*V}|L|E| zRi!|r;R2x*Qh{tRM~x@mfvGELf5F%#A&EtzA{2_$8r0Y#rRb~(^~Fw7P>-=hZE?U8 zrZ~zsw#NCcs{*Sj3#6ZmOc=#~M?f+~hzc%25ta$9!e*gEXcrwm`TMwc3RSAt*{H=px`7 z;m=Xfw+fB;OVB9bBzYq^7!(DZYXc~VYe<-ZC%T7lzgeh+ZUJGHunvDqg&N^jT%}wl z$z9KRlC%P$nQMA4>TTp42ueH}b=_iUEtQ)fk1(W5fv^Qn?RXxmZ4GL*f_5XQ+jV=) z6c%#HWVINqxKQ{a{@u&}l?r!rKGfD2AXF;^P04OyP~r5V*a%ui@9SyucJ%O#&)zK@ zvSwJHd!kT8IB7($KOq-dO5q^C`~>d1`d)0Q0az@;p8%9EBwZh_r8`QKRR6f8Otu66 z#Aq=#@Og|h#p#(QM7o67+=bXR78O$P|$}Dv!3(R7~Y*QLDrBEq1hcTH| zE_9eLc%eLlj1V^j(5?(w*fbO6Z@AQ@uu{gROm?O{<&ma^bUh{r@?xh zArQkz4By=V^A2ME*yFoWnWqGUT{4*MF_?|hlQ?NT09IRx)#gW(6jl@%`PM#~`~XYg zt5Ey*8+@maZ@;l=h^1GmwWE*|B{>f~mg*Iq|Ng*Lu%hi5q_8BLV}nI>v|%-n`>Y@GMN47W;# zt_7B5;K;k{u%R<;UZ#11KIIStea3>;n@H;nmgW*dp{-n(xJ5SH0rI?L>2o^&yNl75 z`gnUZWMN)RJA7hv>eCL@#w5E1&Q)$GjPk8=k#9M@427_v%}+!K&2JqxLxml0BhZ-y zLC+RA_(_|oO#MB@v|mYO)4|t5vwT{CCDi3QNM=dwg3)t;8vRk1c=hGTMvLK^{WE>sa zfOI>UsQ~!SHTZshto~Z6SJ|TdNW|QZfsD;0;|w!hm5g*2olYv?dHOrBJGNn{ScdXL z!^!e2DjPWsk}*o;im818Lk~JgNb4Z@9aJHZ-oyxrf5?;$4wyeQ=`h`Nb&Su0dC*`! zZXjaanC47qT^sKum&u=6H(cm0PoslS^pTd3Vvre53NS{Mo0LVKqo1?_s7M8(VIA_C zHbWsC45zmi`?Js?L^@10y^xwnM(Q@I8K*_27t=-)>eW-d{Wh~A>3*TW4owW{XA5X8 z#`{L=8lw%y#JYt9?J)$=@k3f~@EtrzY9>i-%#_4c9K#!odJIP60=BkyOT57?Ox%tp zJ&JQnjs^x!hYU{RQVWd}xHJ-%!m+-eG`yKSAj?dPivsu`Gx*b4R9chi$U@h%i6l%* z*HbN&m&Mz8^o80oGJ5{&C%mCeMY%w^C1@P&0>G!6enZwcXD3IZh@tIDqfJXm;&Rg& z$uQ}ON1;gJ4)9yWf-Fcjye=6af!jhB95kfTu})eG4XN1p3$;V&jU@E?G@(*jwgYY! zMGt)AxGk%~24SdOdn*9kHWIfn8BUR1f8_?s6_9c+gWWijkmshEBtZP$_$%6(^WSY^ zp`=-Isvz9qEwJK^9eDkuS0FIg5I9bML!e=enyctP)*597w{a21;8wA*3ESxP_rM_Q zh+$hYo8+T3jUykj)I~sT!8Aroe|{zibIHkR+eUC&OMma30-2umHSG`Jb=r0qC2qib zhYKVPfI{|bX#QeD;c@epp)g*Ot7yHq1^TWceV7D1**f50FD~a`Q(^#7$5?v|{qd)kMV5xAS&~ht!KrSw{)X^QuAy2aL zd|eJLROq*t=q@F>oVty&>z>b~Q3d=A8dZ`;gQBSt1Y?>^SrUVy-9UZ4B4z(tnQUiTnlwUcT`ZE5*`y2Bc(L1~yyvsQtw8q#NK zB8;VYjdcR(l#dF`NIPcwNSYB7iwiM08GBI?<5#A}k;9;f>_}VIzFFW|6{4SanE5A3 zc?0boGTQs8{+!|&H&bJ8GrIvMe8Th$viw!M;jeneRBAcYD0Au&{;#T`yTeVS#>_M| z(nqgha?(j0>kW{$#*j8H9&0B`G^uLILIa6%j9n?|`(DTZw;~}+or0wTS`--3ba;&C zL3G3rJ!Pzap`N~5rM+NjMDS&#!k8&7)%R&e+hK4Wx02GeNoQH{8CZ53EDNuuXlQdf z#}%J}<6eW~IICCTm)>MEqsjLWw@ygS>klm_P3O3rIBxyxO+NXl94QN}9n-_N z62~5!$r1r1JqEM1+}~JtVc~Kkh9S0u&8RD+j|xhN2Mkp{H`dum6-o`#n^#B59QuE) z46>Qepo~S;W6?NEDp{~&eIH7xi-e;gyVqnZRggpxEeiNG- z`v`ji*aHR@M~rE2uae#^1E4r)P^c*{vJ!UlMPPdjEb8-F$$0mcDB3L^Ocn-(s<)f_ z7O=4lV4pFtN^ge(X0sDYGeuB7-w($)ZT%)pFo z?JQ8V1VPbfP~dmYDd%C-nphj~#|=DwBbbbDBzXt0Ck*UZ{gX-@G zw%@?I(?dDodx1Zt<4Yap83<5k>txGAm=_GB+gM#`OKhSTbP&ZEgM#lzXs3NCa|IFZ za1!A;gV2}ea6F6?RX3*^G^pIhnky+VS0O$Z4T_9Z-!s{qaF*Z(!W-+IkX3)5d2ARe!;{+uJfyXdzN{c%< zNtr>CkvhQ41{JF0S91*_vy)O4?&gdZ7&IBFBh6$qz%8@bAj(W1a3-0B%PZH(W_Xv6 zIe*8LQhXF6Ghk3SmK#U$Ky5hzRHcD(FHhU5Cj0>KRR-R(oF6@PP=F)@f?)bZ5Ueo> zoL~^6AB2Mskg~=5xTV%WdY0=eR^Z9HM34c3x~mcB?BzlbY|sfxJ!4Krz~OA6!}17n z1B1kswufl3(hE5*ZtjplB9gyT)jbZ&V_3r(a97%Lkq9EZ3z`iAD_oqw-Mn6#0hYAT zL6~D46E`q;!H7QPLFOXtAs*v83@p8NM<}v|elA8-=VWToHiOEYeu_a9LC$A~LE$AP zsb_*jbC{2tPJ_mkwkRWl1H5fr1_5RwZLgYe{aiq|fwS>}ONbuczTE}_ubl8L2)(n; z&gJMmW6^qNpUvXvy#{)Mw&6VPoQMPkxCZ+SQt#N)7NTk6H2V#jOk>2RZ0Qi$kV5u6 zV36e{U;G(+E=$zCGWok(0q?as%tYnKcRP)zM#+G?zNUgzPfe zl3_(Up`&Kn^%o6*`=m;?l-ZC@m|T-*(m-e6keRq1Hqa_uf++ab90*)E-L^cAv_dDS z=jq~;6WQ_xxf!!b#Y5i~sv~yqC&FZ*RHT}y#7b0Z=`mjC$6N}qwY zLnbXKfRfgzq|R{zMe3Mq4dCT~O4^*z@tQVIonp&la-3`PU14*Zeex%GrN-389pu`a zN@1^twR)0aL!=diT(&eIwwHPL() zAe%5Y7ccuIz><)*oH+uJohZ4#nroO}0W5=3`=t`$qOSlX3Ms3V-*P~5iSimRr>;x> zz`2-8QoF-wVD0dIBSzvK!cig$ADj=RdzK<8v6f7)swhf|MV0O;^>IsXJsZ)T!Kntv5ACFOojou16=q=pX~ z`TJGCl(J*10{@N8(siiO6g^GV8wL$i-RrCpRa;T+aVP#vzP(bzScpGr^!E_M`$=>zj4!cP{4KVr7ZB^f3F# z59yY;Q@&~EUxfSoiQgw)I!h4#2e8rj`#R*#+h1I_{+8Or@L|Hwe*63k5C=5E#D&Ci zkylwX9M4RFYs}7DmVt87t@3@p-EbH9)F$5F`K#e|>k}U)-h9fk-;~!C7@mEkcGF`3 zG>pz{=qk`fSFhu|6R#x#!`f3|IN=>#ySej7-0^bY3cX$pbu{4QmDL8>?APlw@>deI z!>MAf%sz5kU0p+$chmPF%OHR89BFd?LLzYG&fDwiHfVZYK&xlJ-L>IT*MV{4Y*6hEKZ&cvHtUlqHT$%)!4T)*zx z3yGKYhF$2cx-|QBtx$W(P_1j3n)rQ^tEv9;P@+3<;W=c4T2JV0I1e)?&TOC_OK2@8 z{iutlrSd_)trvCCyN<-{iREhNk!|yNzyC48V|@ztSqqsbZ#ZnJl~ zHoV_eb*Za%xGMmg*KYbfSm<4g-g@jusMz^-tmo60(Iwf#G;j;zbVK{`^jew0JsCf#K}eb?CX@p|oOE{KE=O>ZXk;RQ`*-~u|l>(L7klR%FLw9W?_-r4miN#|h0#WnCSfdf|( zE9LIMJJ0!=9n*T8fHoXPKA%_FeCH$_t)LGr7 z&}ic)4eRh+qrcF9GhW_r5$?fH1mbvIUwiGp8L#vg;1&ILynw%%zv3U`KM$avAZR}? zpqKw+z!nIf=Rc14JYLo>5N-h^j@SO_=LjAAnSL-30eAZ8fJPtEf8apnP5j3M1*TMb zYT-XE2m#X|+yFhDDSFFz4(RoXG7PTt-?{|cg17l6+dX@Z=z;3e>?6AO20^2BD>>|y z>SwnC&=t7!QeYS^dkHT4EC8GVx(qIR9l0#y0Mo>qK!VB~Xhs|iRl}&1TVDNl4+Ud> zCsBZ3M3m}RvQv(r{{Q`*$^YNKGodAtAn=Lq5`y8b*JJX|UukjRq1w^J1%wlAZcK|F z4_=|s{va*7QleAhL0Uwn0QQ5mkXRzG>^ySc-AmwrF9(J>D0P-g3@2VqWe(rIMb_Or zu|k`zF{5h!4gjW@uIPO)FC(9Z4zy%T{GNO1Xkd7>>Qa1v;-&4|MunJ%0~`JpYh483 zU#W?g%*lph5^rHz`Th2Hujnn@`OnlUA(p3?6TFq26eEilcD;SSUB@Clc*(+EOgu_~ zj}!4ptRK0;aN;+KH}v^v`(G^a35$L~u{0(x`UM5gxLwDY(-2Y&nz@I&s;*F~L6Lbq zG|`4|ckOUO(iFxMD0XfKlSIzwH;;hE9IhKs=+@H?W4LPB0nM#%dVVpt0u+hosf!jp zzZC;MUa0HQi5V66m4w&KjCn?E-1(}Po9sov=|9Ti*Zreq`+F?r{^ZxO3|xL(6VB&z z?aoioZeH!?&~9w@+ldz`BZI9quhHlCFRb50Op${n&CIK$LHG=R(n!U~L&;EA9;*5; z%++AIO(tXggT*kG=br-J8J2cuY~c)BEOPDuNeB!tdXPFP?%TfYzl6A&_+6qF&Y%g? z(iyaOn+`c2OIC>R3iWqe?iLci!${!%t<`%I>A;P;wa%9(tIXq7W`0_g35jI|iCgA# z9x(+^I*aYwyq0)r;*TlDNW6)xHkPNGNl&{{t);a!CZna|3>I%sJop$n#`agtxtEl@ zebHCdcqQjQNf);0pSd~86W@81?4#$tv%2A1e>CipO!{KE$Oep-y7Y$xSjP{T&i52L zVC-C>4Yn6l0ez2AvFPXI`>`(|pINW9f9E10Uc9LWDvWNCH#LwdFFpqvZ8V|JQH-S& zjfn@cgxhhYmdX2#vV`Yi{Opi^k{82I73n`7;EW6z=`kN?@SdG7^K|b6kmz~P1fzxa z>P=MBEGD+|pr?hJ?y3t3yB>BD{CRuQ_=z`o|03Se3geRIF!n`{ajVOeB-LK(@*0eX zS9gxy_oWrd&}bko=zRg_^d$mvHI02_X2Cb;@@{g; zi&!Ade!X_ntGt!78oG)S+xhgh{Sk~GW5t8X=nbPkUP_tSb{&b&hac;x^bn1qBag0` zuXhx0L*f-PEk9rK-22oJEzlwxGlTmjtSflUoqeMwx!I_bsMH;}G=2q@cu`wI0dI@| z+U%j9>C(?@=_j=G(^MJ<@Psw%)*GH6lPACelVPrgQEmb1!lV&2^Mm3o)cte{>J#qU zh&Hu`u`bYhX4-N@f8t4=uaB0GmgLKb!LQKJ&^&0_s`y)+YK&xVhIAJom%JLO;Q|Ir z44Hzvzohjw{Wa@wcGc-jzhJlv8N_fGOr5Fg>OO=FzNo%{QO&0uZW3Di8*$H=d}*Du zS*GTfU^$0~YAmbX{Ad}PPFoi+2|NTVWm*x^6P9Uj5EOd_`IwC{LM|n?^JyNT7X(X8 zH+TwiAxU$^L-15R_uvbr^JmNq2OA*oA$xn<^G~)VAgb;aA#Ke3UyQa-KpCT(RDE`yoL%LuNon>ja5 zv*M=syBtdaM`L>=mY)tuEKxDw7d=3l#zMgDe3l-OF_?6EOgg{9gp8eNOA^@oFu0`D z)cyW^+SF+}Ke2m^J3dVH7*ETt)yEJV!Ox`;nrpsuYq1a)XCFDwer`#;x$Eti6Dx9% zXvQED&=H3*Em4`yKvK&jfGbHnJ>Sy$fX+cUi(PNWu{(uoCK(wGE=w@72(L;p9$LJ9 zo;_vZn5UEV$+CJ($0nFwOSk&hQtQwmh%OUb8lO@J(Kn69%0+M9m&$~WO_FUlm8Q1E zNs*mfWg&h8@z7@=O||ngIzNKx$TxXgGC2j`?$8xEuORFjN+nHfj=}|yfJ&nek;@x| zdg%Cfj6s@gl8bb`KaFKNC9$t#_R)6{X|^&(3-*W1&h9+o*`;lpY5ki%;&>3EL9bU$ zZowJxh+>Eqhbr_qq-P@Iwv@6D6+nkn{+dzEK!x!1FKA_AJGW7_NSTOk9n&Nipo@|0 z=$611lRkC3z~9izK`#UC7>8@^cOVSYl}P*bNh?t zygm;#k}cJCkF@!{0k*1#1!yOVc8avmWN3d0PM@#P?5KUc?>HsK;` zHb9y=4PXjL)m8W1IuMxF)0V=9W28hT(2=8#C- zT8tbcKbbnDqp{2WJ5$!{TvjS?UE+I~5=9H9M6+@)VhWdzh^zKml4}q?j=@L9g;86Z zxS04jaW>IO3MI5WQQM|XW@QLjuVOy!BtO!6vXjr_)RPF<*QQn0)(Mbk&f`}{gO|pP zPtQA_rMy=7TCP4Jf6d$3$K$azu}0-G$;psG?o1l)o7}H8cgDghWz&LB^QTc^=kt{R z2wz*f^Lakce+`R9nZ=iBY|^r%+d9XPEeR4{)wC0l7&t`BYTzaR=% z5sOfW)ao>4SK67%8|WF$qi8o1d(!D4k!HkHNMcDbsCI63o;F44MCJ}WNR04~*NueL2u#cP26;WU$dfqQpi70rC9z%P`Guu% z=UG?Gg}(){35}z##J+fbLF3C{3g6Z@EvE7EM*&%kISg2q@t|^~Ub>S!5S-U}ev#X_ z^Smo2<8NWidp<{J$y;(>;U)fjJJnd1=x^M)sIWZ?fA7E7e?_9I@h3yFWEVY?`PCBA4;d^kQY@e(GVZ&1Wq z8K0J@f?NAjNA?BeGQJeRq6;zWOLmKvguLL@*L=4mE*ojQmToTkPfw>GJQw{hPp67I zwq*<{p3c9ZL(J%ysKWW5)+XBZ@$8~gCKJo8vFJ_Du9r2ao;iDV{esHtiaB927}B1W zXV>4Qa?k=P=L6zVa}{w7v`Wq`$-F4BImuMtX~FjJZ%~)>FdejrT9wSvFcT!hHmB6R zm9J2FKr~p8?KZq1Yb&6$2>i5Pbm67IU$EW$81>C-p3WPH`?q;d)n4&*&ZJ@$@_%jj zQ!^B`K&xR|NhT0BumhLUXH$L}cPo&3>>I@-)r4Yog0I=IdehGXhp}K=l(>uL!9Ok9 za4GgjigL!LZM<*HX<__XXl&L zWn3v@N%Zn)^$es-B$$SZ)}yr1gG@)CaB45nhM8u``J>-C!fj70Ia=)JXq+j@){Jjh z(L5H_Je@0}X_V3@++Xy3hVMdi0GR18a?RLmJ_PL=S^i4!am*3-776gJM&Yg-|^7{2G#P7 zX3fuJ?nRo)|L4pd;SAHw&DSPc_jJCF4B#OifGWkr3yBlj=s;KSo$fK`iI{#6-ikDj zqwHZqH~dZ?@rXHZfPf>--loG9q@x;FZKIKTd&7%6-?OxfG5NfcmdBz#T%V=I3|1ih z8rFM0ALlqr0OR%fsm>j#CEZz5mbsKG8m~Q+;?03ll#M(RAFIT798x{P6Zo12?LcWC-sip<+%iHlQ{G9-fH49(iugCPI+w(%B zb1uE0n|KL94fhIM>u~V=;&TOf(k+4~qj~f$T`}L^&_1d;Qz%GT@zWkYZzjzxOYo?* zaFm~L$8(=0Ea%DpB#UM{R)9bsufyoR5~^T{Vhxr$IDbe`zK|OgM(M%J59jt1SX=2O zUgHHWWn9gqSZXkB)yxv^Lc`YyEAVB`0G=uVU5x{}N}&or5?BEky`X~+VwJcAHE0(s zL3@EEWS4PIy}XtzNw(z3mOR;#FI(Q1Ep1lW62~=3wrs$yK(-Xg_!^~bsbjLm1;_`o zWg5`{REGOefX~X703P3yEo*Qq111RQ23#Rr2XSq~RR~-s?mf7s;JFv~xwt=r`ypJ1 zaVH!%s~lG?t~y*HToGK&xH{3cJ-GJc8nVfj%eY2x zSztvQE(b0bt_(?qr4LB>;AR27a5WvD-I#CbcFw~0ou*q(I%it;;_6XK@e!F)e6y+; z-x(>zmrY77hn+LHk$i#F@AIcGVs%0N&7UL=dT?cT5>P$;F$^+nGQRm|$RWmHP zA{57U8A|SkLJnLmTp75saOK)$6~FF=3ry!OaM3nLji4N{FTv%t)In*}4W`SM$+BfC zcY+zRrI`CbDJ%q{5*0m!YYnad-2tn`RVhtXo58TzUJQnyk>;pvD7QgC8wBhF&0iM~ z2gM#-5nOG!nsIgD+JI{tt{|i};|k(=2d++BUAQ^`>&AUIt`M%h(mWNv1+v8L^C201 z2~F^e9LpYi4z6NcUdxkIi?hy&RCwF8JAX`RqeCn_sLRwNJ8?F@?=#*_NaBJhs%${@%|PuvKg^^Ri0j zx9qno>?A%Xd(`e_^Ho+cNj+&_XgO)mCg!*lhEHSc!EJc~yV1{9=CRka*-^Wnqb}uv zGLPMidU@)gT?Mc}tCPc4m7>4hY*i6l0JrI?MZV5rk#EDLus`^5bF)5cg|*Y_X5H3F zxck^{tKSxcthF=P9_tLYAK-&lAACh&WpXyE6tP^XlzoK%&Eb4%ve_v#B+KDta~*!x zYxSbyB(@%HQP`~tyDbl7UUmom2OalY)rqporr5I8Y4Rk?G`UE>xI)voLU{mb)E#!U z3p2Wf&Hi%&j%emc#FbqJp;0)7qO2XIEH>Er*rayll|!V{>f<_~=U>TVR{c zzFewS$r9UGzzXq+?p`^Y&7aB|+-jXHs}YE8b0}(DE?`Hk^Vxi_+9}V(ATMAmm*S== zlcVmDy%_b=*)%a5cQ>0NEmZf*rL5cGW_xh;;5z2WQG4a-mcw!$`Nd*e9{Vs)JuEK- zq=^-RVj^T`Ic{bpVje3K>0ZQIa@bsPD!Y;gDz{c?DO)VgWaZ*?sFu&pp%RD!qK{RI zQ$eNaG)X-t7sDy=;ZiTI9JZMr6?Wr;>Sg(Q%Vl{I`^d|AuCYyGmvX>oCaZ$rHR3E* zYn#RDY(6M7on4lTL9H>(Q?nd1@afPwtX9OtfP09SZ4=!fa%<316!TEj z{CJ}}7xL$V!w$%&d#6|oZJ~#4GE6v=b%7Ptm7ndlHKg3k%A{hp!|7w)&U}o0pW2};1T2T0bo$h8Wh$O$ zs{0f_+v}W%=WMk{d4L^7bEk>L>IvmhJkP}QTKLBGaQ7l40@TS?%fw z<>T_PK5-sMjj3pdQ^e$>u!vJpyYWo1nV$FJ*`+@paQZp?VLwoqJ)I1pR8bG(z6bX{ z++As|!?ETUOM7s;X<$Nl2y;x_#O$o89p}H>~6JFbz3^YrUSW2FJ|$_6n4O_@agkUdBA{+ zS7jpbIhH|)=*OJ8A9)8;ERU<~4CYIBsk_5OUW~(={ z9Ca-;$mjngN&b*|6;=ekMVMauL$@|aIlK7b%rih9|QV_erU zujm#1Vkz!^X`;v^mXj^ASz?3#q@B%y&Xd8p2s%vyH$V8P_?ve@@+lbi#Ki~x*`im0 zella(xO^;Iovyl3tYFtk%b~5COC>tlT_iG5WK#jdKglhLip*q;rkN~nm??^1l2%Dm zAqP52KHR4>S-%&_en= zI!(gARet#rlZWD{#igF{Qd09S!9qcChFEF3v&Y4=I+zES=nPukw z$mbSwvROXj{Uojl{hiAH&HQAZD6u=>50jyT3=IoJ@gtv4mb~H?SS=e?C}7LQ?cyfs zVOA{rp!XzPegsUPSRlF4ov^Z3WY?p<7yPOBp$}S71c?75rb^06u|T=N+enx>@ST~= zD=kG`6|+8i&HV}5PIZgKnb49nEfVEnzx#S=2I%3%n0x%<^^l#7()H|m46Dh|PX-Un zCit5NuN2`I@D6FExRlMnJe2Kc@DQRb27l^rh0TMMd}R)}sqzxkDu&&rig-f!nhvSr zo2+yOKHm8X*G-YK$pb_mJVcS)Na|$xs=`YOxWSoWXE%5#61g_+C=pC?i{LG>g=A+@ z@{tGBzy^1q?89_LSJP;Pp`c9Innf!r2M+8(xO|%j%$;LnV zL&*zyQZc^cOTIh@?UmUijPdJ0BZ1F6Xr6~U`RrC$4xYx|R zItYyEbzogTn+$2C%{FIN z5k8h7FiDU`tl#@l$SVs99@&)oMQ0PMsKYEG&zO})QS0>)-WrLm}4;J!@@XlPR zO^QpqrHeKqc*iEv?cI=_`Gt4)Ix3YeWw+9!^eTrGi_771aP;YrUGxj5gZ4FYtsHP{ za11DOor|5#&LJz+{&UDKG2zeMoa0$+7cqP?Mil%b*7x53;KIjOK5?-umdiqRMHJo} z#D;<@3h!UU-7N|q4B_q-g$p6qAU+W=V*Sv@GMGau_lK|~6F$7i6}S|#`2#beWS6TaYVTq+F2ah{Es&d&r(A3LkH9h3xsFaHS6SNuuyc5cdLEu&_@1WpxB1 zVL=--nv5?i;5HRsEWxc9UpB#Qx+r9^X4IG=3b`!qQmH8uSs|Okrm+$%%@<%X9>8LJ z2p=UO%u#!tOdo<}^cb?2GJH7DB?`U~Yaz2a3Y95JnbM&gRU@ALzCi~lr+`@m9Ws*% zg~$g1nFi(=Xv8d0n8GGzbQ7!u;-&yLN5p5^r(|Ssla{a^W^wc@akbBV+%uRl#dpA$ zC6XRx?1U#*LA|+9@&vfgV?qfsOF$Mt>3!fdUliuDwv4?5Ta0Eb0BoTsEMSK++|)>F zRux;r4zPplBo^vJEMTq07ez*_<*b$sWCSz4L`H=Z>@u5ZJtM{CA^DiPz|%vL12D`$ zM#zp|u`OmN2vP}-xxSG7dL{&zg&a4 zP-a_Z$i9>bRjiC4bs!A_Qo)2Z>@Yz#plTe=Sk8nx<|9=%ux;$3w=&}$Dg@aMHsr0! z2$ARzgbaB@_LWT7ztdAhgP@)Tvo0$+{5$e`9D0LFux{3+SY#;H7 zL&+XAvzp=mHDED8I-qneIIm?woRtw|8yaB&q=pF{S~It?PK?lQwwv|Cu!rp@?GaB0 zk#<61XlP&0gl())1q1_`*|J0STba~}I@H+z>lYA>@{9r(W|DwG!6&)Li5L(Wsqkp0VEVK3V!joA0QO5DxvW0@J* zBiy(4!MBdFKJ@KLb`d)tXQWg3xZ_5@u#d&11E?_M*ryy&BCb8IeHb1Mgy@k@*{3L{l*#Y^aYi`Ct{~^Nk!K{0L`HCbQV>VB({~S5iahQ4#jlWM4 z`q)v#-XPJQfaRKDtNRtLrlphm?3@gonlYyOR-Dj^N>_iam0rtC0$g=L^7N2O1%NMZ{ z9I=*I_Y+MC$m8JtIAXkYKc^|N20$|vG-cL3L{kRh0BF94_-n=PHWL&W_s|6N1(Qym=w(kJC>DxA z;v#l~&r#ccyWkcEtbO7Jd(b{*Ldk@V2`BihJz$+O;Q$mAY+`)EK|4NfCVAk*KbY;1-GF1@> zs@f)=5Kl-4?HTeRSGoJ3yO)GiiW??0PgqFKP$@n`@+-xNc*riO!WwaduKG6dFqw(0 z5dj#?1pwgheaZ3EiF zLE9N>RK!NTe2yB`45!%#f`jOEl_B-oYpb*Ot2Xxu_X*!A|BkHM395?xvd6YSzNpxo z$1`6eJ$h`fYq!(cmNZX_x z(q*g<5Rjx?83SW3^8LM>t;VBQdPb@y$6hS$x7W&*j-X?oqujY$9aJx>Bcg*LaWdq- z`ve+L34JWeLGSU*KajhWO1}^2_dcsZd6KJACH3<=MiIx5-d)zy zP%?u1pK))7(p@6hcSwDByiAYOlzp7zHt7Jr?~o4iJ4J6Af_tR}a;_S8_qeM(`@KEh zL*Ap_ckhFh_rqL^l^!d0)~vl`2Q=!CbQHW#NIljTK#xj?IIE-5L^Ayusmu{ns=U)O z3(3Z3q(Ny4J)FZsA@8F>X+-=rDh^812ys~oWtY%{#a?K?$ir!&{S0SWXg|mAQ|xnz zKxnfsmJxLq+smof0(SBS9@GN}X~&U5I~*m-No9)j8Rua&K-yG-B5tRMS4q8FWpC4q zJM5iytgg@+f|Vd8xs1IDq`h{BNFz9ixJZ59Y#$Myg$dj2$1=}h?_>ml{~XrVu&@2y zpOS6uwf=M1P8qT80O=7xI_-s-Ye-LF1OFSOzlZH1YQj-_pZzdzQ=h$=W83KONqYw` zY$KX;_7VFIdcb^b|Cp4xZ13XeZi1G{3*_DOFc%NKwmTqkfqXo3FQ?dt4iYNmD!EP$ z%01RR1h_SFz!h{wTsvF`{5}3DBF=F}tXP1$DqSP4A@^nXK~K3i;I;S;@!qME59{}% z`u!qy#bFq^kyHuF$2d4BAK(HHk|uF^kK99D(kXY#z49g+6y1D@+pFwQr+Df-8$34O zDPJG2x>r8V@5mhaeZPE?-w()lQ^j6haVX=kFC()#b1-uxvoPx!F6$6A?zpUFyd&Z} zXgOtVTGoA0zAOhFAxEd9*D;9I;#{R)Im)XYqiPprExqoe!jN7#PA)PePjti`dmING zC#Wq$a*5+44fo4(#XH?`0au#xXA)+JBDJc$57!UoaYV_6wEql9ZZDtYoy3-vO@ zJ5YgC8B{FJ5%E2}bQ$H-(?Q(fsN%f$IBeoi(eK7K1Z_fOxE6@3V6MH643|rMLdCdt zRAFl(*VW}Y?sH-953?6F8za6420RL*W-(Ogbxh23iGRQoHLOWM%@dApwa{hp^m)&r z=0iaBJEpk?xv4KwQwJSGj>`^lv)rw=&^*OT@LUqKRd!5g?BEGV$lUY+7G~lO^<|mZ_rNjY8=~vDu=afO^ zqB4Z3vdn>*=oD~gbdbeqb2^+3u>wwSYz1{V%lT-j^fmk1#5s^Ppk#;}L2*Xet?p4P zU6>kk=X3(!M~1A9!^K&8h8T+PK~ zvO;I2bAvMoSE5l@=scjdxjI}!u3YyX_c4TpHcvT`O~G2U5@c;+F+6Urv(k6bzbC6r zB$r!^MN0!JS31wA=TwW!28W8ch)vLK!}nwnHJs<1XFTuz09EO6pZkob4LhoctEftW zsKeRq>{KZj1redNfYgSaK*BWp7G#~u8o)spDs(x2MDeHFIlvq?aPD@}ZrqPG*iY!T z+xdic`>A$&QoB|1CRdUF9CY?$>Ar^gzSnueIp`d5=Bl-X>2;oTUUb&c<1?IS0}&kp z^*NATboTS%dID4#?hrC=1`P;41qP0_uBHIMXnm+0wd%K&FHdb2eO>Fx($ay zT`KkA6mfxw>YeID&wy`_NM_QW_wfy=PIbT+=PWwNV-BcfTS_U0u;sQ7Db+U8@~}!f za65?iQ8mMr1=cR5RHz(o>i_o7q;(Q&91ns%Ykr4TL)`+-*jT*fl{*`*Evx| zil^}=@}ORUXEh|w0>;!g`!G=yVwxBcFQJLF^T!ZjG9WVII_f*->+|*aN5oeFqs}k) z1>u|-Sp*6rng_fZSZ;Z+%zJIkHxE_d^N4+0!T&e`KT z;XCF(<&R|T$l6amGU&3nGu%_$CGG=cg^O4#-7v(twUcoyW2oVJ==_B zK6!hyyWc(N&hS*~tMSFYa$m1aL_pB;r$gQ;nP)N&b2djw%RTOWSh(c!#BHCuk0Xv# zYp99+?o;kF?h_=AM%{?p<~d1)KKDdVp=XK*+u<1e?m%XL=9;XbtP$~Day|Eue=nX- z<2l1KH>)3eJT#gndbIFy&~t`Q>X$P{G7j?X-ie+J@qSQG!Bjkyd5Y^WK+2V&N~Pxv zi7dlI9q{J}z5wuARN90}#Po9Ji1-GqQ0ckID-Y4%i03lVMm*a*U7iu*(dOBK$8L`n zRk}QdNG+zpKpT7qea8{Bax?j6I?V{(OwA-_E z8}iKM3>VN}i?^H?0`xc6Td82I6nYm!?MiPIc3OhoX74`lL2s3U)=fb% z4+{8$LR9J!mm2C4eQ>Fu8v1+dxF6n|_ujmDJ2N{o`{vEAgmFCp(HcruoT{_K$dey{ z;Dw5>ji_T%hm!W2YuRzX_mZ|kft4=e@uRE9`yzF zKuk@kRx*S+p|WaS9jNFhwUz3N=0}hEGU_KarwWnXWhy72OaDa2EaEqB-L zxPgW06r+bl&F!%;L`rT0O+Ch{&}(7VZG&jJXKve#c|BgQ*XLmmNqV$$P)48EZ_zEp zLm}n`&>8ivll_WI%mCT1V$(3-rM+ncFlmgsoy4Dzp1F@GKHYH#5FB_fNgG1AO>;}`s7RC0>gMVOwxAhH+4ED;4{2-Kh6}L>}dqci`uO$#5ZD4HrqH2-O85+3rmBc@Ev8^>n48nHWsv;JPh z>=Rz_YY|f?yo#ZQ8Mx)|`q>~EHlmy+VLD}d3zskZ$C2=a@UDMqk#_@s;26uH2rdPE z!NZ_ML*O7{&u9o7_$mm3o}f)~>M0d;NM1*K`-AJjcXu%lsQ6k?M&sdsqYf>fx}u54 zD9s8Lq=T`b5NyJQX#}TObyfHd_3L#Ms6pu?%*SJnN8Fr$D zS%rgxf*HujaY0_BK5XOeOor3pSj3JKyBHS2$%vgI zb~RiNr^)JCxDjrK#c(#to1@z9hxM=#HY3yf2xk8prfXp-s!<*M&%oEiztLzT_QNP` zCg};&2=kGh1-eEjjCCDHR$^TzKcs~ydzrFTSI||DVle$k|A5j1UB}Ty2D&~Y;{#pe z(W7Fp>m(8nc6~?U$*xZ*neJL4Te+@JiOY3;OUYu_C;O>VYQ`{b8s*e;d^gM~YU+M$EVd@!v zVbyJ<9?0X=yZkuyv2Fm4Q%`s!^#rm{^-1b;)<~sI5VNK}P2mBDUt?{hq->|2XPwjt z@1)+=XQ{W1cIxN41whJ>%Cm@mAF|&7eut>(pP~1y5#vkujQI)0v!)Dq(M0r8#dW|} z;#%>|xKw;Qu6z0G^n*uzoUuNBMfdY7#&v$R+c4Zg{&BZ4Z>ISzp5eC=8Gc`n^8d;) zK4h{{zH90+-V?`vmfWLmddNe(rVz3zV)6I$h>gs0rsvMt9LMJ^Jk$$(i5j)YU0L8R zU*;|=@Cm&PSmZN$g;VFbtNazV#$Vy9d`YhXHuyZ1+T@aL@ov7wU)5Xu4Zg|W)kTi4 zbRDCFGnQ?<22w^Vw)qWR;&1D61dmvS&rk)cobw(2Jlo+P=qg~B@0s1*^X?vhfDq9G z+2ErlYw$%=H_%I<3UPhJ>v49(#}m5A8ws4t4kkgZCD|ULUiy$wllL&7J_cDIgQY$u zn|zY#Jwk_sPN@1fjZ$?u$T%Wd%hY9Y z58atvN zuFjhkd5s;&YqBOk;uZP1t^p3@7rHK=ac6#{Ausc$yo|u?ylw(cwOkjU+5m|KN835CWu*6_F8$9^;(!h# zz%&4V6lT)+%~^MO-nuIntT)+$^+YdNUm^V(=|5TC>Nj=HT8)DP%31X|FIcMyR-5F8#oXL9ZbsXf|HEfQ7bYKT~*w|PfdhNZq(QEf5be|oy4vvb^ zZ{OAfHZ5Q7p#36C+pqFLdr7AOLpGXa7;r@lI3nh-?dptuMUUDyNjz>#8+nnX?YkI-H#uur)V=SZ4ihUK99Fwq-{U1&M Bh1mcA literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Lib/D12/TB2ExtItems.dcu b/official/2.2.2+2.4.2/TB2K/Lib/D12/TB2ExtItems.dcu new file mode 100644 index 0000000000000000000000000000000000000000..62c4610c2b7a783a5d47bac00e824c47703ceb92 GIT binary patch literal 42648 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%0A7#m7P7!VSsh+&4ZR(oj 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 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Lib/D12/TB2MRU.dcu b/official/2.2.2+2.4.2/TB2K/Lib/D12/TB2MRU.dcu new file mode 100644 index 0000000000000000000000000000000000000000..420f815b3c769656bad9718d1b167e492af8195a GIT binary patch literal 16027 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 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Toolbar.dcu b/official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Toolbar.dcu new file mode 100644 index 0000000000000000000000000000000000000000..9dc08aa06b51079213a93d96120e71cfd56f8056 GIT binary patch literal 63981 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

    @n4l2dcmwA!oya9 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�CtXfg($(|@;dkNv8tE=&_XHOGfyZ*X zM?F#kS1o;rSAD5hPB35|?a9h%EGKB>YUx+Ws_KAUA{?iOVkV~b%;;QWE|W)Ri30?D zg_U*FE}lA*nW@aHv`D0GJ`$bLPq$=>)jFB3fSpVWZ%f1PWG)3fnd!@9nv4l>EqwuH7>N9_&PT4 zYN(zT^{=!f4s1THU1@*x2e^jX^(4Cy4d_oAy8fi5=ufJ;{(axlAEO`PaCEwoJ_4c4 z)34EQT~6q#I!Rf)t&J$;oPHhOiBNBD2Ka6@XL}GE>=bwyfjQ}ib=-2!vs@WQ$5Q1fGG~^TwIUAu6 zhGpkKb%44Up%98?U7&hE4fV$~d#GZn;vCnk)0c5=aJ1D_}vk9LeYRxa zH%(S>^OubtwpT`0@|TP`y5Z+CmW&MxVufJwoXOSCx-H551M$A|@ zuKSy~ipEV04%;%K>b4QpcA#|2_*;J)*AA{-5`y0dL<9DWjDIkaS%%EA@sMAEOsJ^h zJ&PLtJ)vqm;MZ^+8n4^~gE=xDRqMv1+KKUHgkPWW8^#M-!*~zrdr05+kBmj`w~QAf z7|phk44oUFGdjjoYTNj+-!Xpfw~beT`xVk(`4^<=n%qMbyQpf{c*^gA1^+pV!B(%( zs4L?${(u^DO%9m0HZ*KDG#>O7^Kn%%zvc(bXMEih+>RMj9rH83YeFWz-HIQ}9LEOQ zGvod^t_eb4W0R()PMI2?0&3Fyfu9|rr_GQ$V}`V8^I?Am*R1)Q`_X@MkeM@MTHbt# z<;{2eIrDu#XJ$DvGaQr|uFaXt95~z-&70Kch?%O(rfsa4&uL5MOa2P3W%GCbs(Jk$ zRGmZ;09u-wpv7~P4hXwh-=Gyk)jQim_4mv#`lV58_5mKCHT&iR{sFGCc|8JQ74u%TX5On+%t!qiu0!+Y zHN1LoWZtLN&HJ7lo-MQ%Legzi_p(EY|l=t0d1eZ`-^<>5je_^%jF=mo&9`BR}h4pBp^+|PzY#iv86 zI)neFn+e7I>Cl7zYzPzg8k-A+)LbZ}&4nKD=R@e5Ytek@W9mZaV_F`f7H}<+0Q~S% z2p>q zRuLZNel1jx{G*Ww?CudNj`?-`8`DV$vjW~QWZ=5rZ;d2kThFkm=cl2J-wxg9pN-Ji z+%s(Lc?alopf5&fZ1EX3_`C;nH}oa{lF$*>N3UL?SFb|%`u)&j{vh-`_39A48nEz7 zCRWT3Sodke(9e+m%vY?JnQpy8ES9CIj-_$e(qzYa$oH&IYp(UUZ&}YE|17TWYU37^ zTw@bpowOcclh%{|gjJUOsS!SFh16+i$y$&3)3|0v=vkoWfS$D;_2+QqteYfd9_T#K z3)U0J-}Lj=cl`xii=$FYATNWwWPQqC#9-!+Ox)u&x_L zyz5)Ep7&R+2@V8qJJwB_Rl8PFEm=uz&q^A57JMt3T(VyA53HNlVfIIs#nmGVlZkG~ z^)OskUqWtH_8Zo<2xGjBhMtbH9b_-8ZT=YCXV*%G6#GkR->Pw~Z&f9~OSistENfTR zips964b{K05F)#>N|Y-Fk*fxgs|T54Hz|jkVz+~;VqXSP7B}5)NcTg&V`mJ@&Zt@Y z;gDrN?2p?ouyOl0{)9avsgpK-s%gS*%l@R@k^QVatNISzvNrw+e-by%!OfV!O`Wg< zLGWdRpzdkl!!2v?Yv9}0z_+h~Z(oC^GYx#WIdq$#+qC^KS=9{weQn0Z936pk0O#z_ z`SZ4zM|qpEylwjnw#^o8F}6!K2G0&@EB3u?#s0d#WWVY!+ibo+b6|hi z-?ty}%l385byl%$wQAd1#s0Qm#dU0pNl>>n?Zl4a5a52lVc)OT?Z=Tm;n(daw5I(c z3`T9)aieA5=i@TY?5EW;`wisj3UClS?w{LaS!&mQ%IMk8sXcqh{qE@IN=6r><6q*O z0Luw=U?<_e|4ND!+ZD>!!zv2e`5#hwGL7*am?^FU# z+yb(yghd}>5z6%NqrMeJS45Z-R#hjQ^l>45&UZ&>4`>f)Tu7hu$HVt9uyeYz)&C34 CoIAAu literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Ver.inc b/official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Ver.inc new file mode 100644 index 0000000..f96696b --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Ver.inc @@ -0,0 +1,64 @@ +{ $jrsoftware: tb2k/Source/TB2Ver.inc,v 1.11 2008/09/13 21:06:45 jr Exp $ } + +{ Determine Delphi/C++Builder version } +{$IFNDEF VER90} { if it's not Delphi 2.0 } + {$IFNDEF VER93} { and it's not C++Builder 1.0 } + {$DEFINE JR_D3} { then it must be at least Delphi 3 or C++Builder 3 } + {$IFNDEF VER100} { if it's not Delphi 3.0 } + {$IFNDEF VER120} { Delphi 4/5's command line compiler doesn't like the ObjExportAll directive, so don't include it on Delphi 4/5 } + {$IFNDEF VER130} + {$ObjExportAll On} { <- needed for compatibility with run-time packages in C++Builder 3+ } + {$ENDIF} + {$ENDIF} + {$IFNDEF VER110} { and it's not C++Builder 3.0 } + {$DEFINE JR_D4} { then it must be at least Delphi 4 or C++Builder 4 } + {$IFNDEF VER120} {$IFNDEF VER125} { if it's not Delphi 4 or C++Builder 4 } + {$DEFINE JR_D5} { then it must be at least Delphi 5 or C++Builder 5 } + {$IFNDEF VER130} { if it's not Delphi 5 or C++Builder 5 } + {$DEFINE JR_D6} { then it must be at least Delphi 6 or C++Builder 6 } + {$IFNDEF VER140} { if it's not Delphi 6 or C++Builder 6 } + {$DEFINE JR_D7} { then it must be at least Delphi 7 } + {$IFNDEF VER150} { if it's not Delphi 7 } + {$DEFINE JR_D8} { then it must be at least Delphi 8 } + {$IFNDEF VER160} { if it's not Delphi 8 } + {$DEFINE JR_D9} { then it must be at least Delphi 9 (2005) } + {$IFNDEF VER170} { if it's not Delphi 9 (2005) } + {$DEFINE JR_D10} { then it must be at least Delphi 10 (2006) } + { Delphi 11 (2007) is an odd case: it defines VER180 and VER185 on Win32, and VER190 on .NET } + {$IFDEF VER185} { if it's Win32 Delphi 11 (2007) exactly } + {$DEFINE JR_D11} { then it must be at least Delphi 11 (2007) } + {$ENDIF} + {$IFNDEF VER180} { if it's neither Delphi 10 (2006) nor Win32 Delphi 11 (2007) } + {$DEFINE JR_D11} { then it must be at least Delphi 11 (2007) } + {$IFNDEF VER190} { if it's not .NET Delphi 11 (2007) } + {$DEFINE JR_D12} { then it must be at least Delphi 12 (2009) } + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} +{$ENDIF} + +{$IFDEF JR_D6} + {$IF SizeOf(Char) > 1} + {$DEFINE JR_WIDESTR} { defined if String type = WideString } + {$IFEND} + {$IF not Defined(CLR) and (SizeOf(Pointer) <> 4)} + {$MESSAGE WARN 'This version of Toolbar2000 has not been tested on 64-bit Delphi for Win32'} + {$IFEND} +{$ENDIF} + +{$ALIGN ON} +{$BOOLEVAL OFF} +{$LONGSTRINGS ON} +{$TYPEDADDRESS OFF} +{$WRITEABLECONST ON} +{$IFDEF JR_D6} + {$WARN SYMBOL_PLATFORM OFF} +{$ENDIF} diff --git a/official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Version.dcu b/official/2.2.2+2.4.2/TB2K/Lib/D12/TB2Version.dcu new file mode 100644 index 0000000000000000000000000000000000000000..50de38db46dcd1ee43be868916a7cd5c17a5eccf GIT binary patch literal 907 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%0DXbK;W~$x!Tp*t=e7M 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%0ANf|i z<8X8pxWne7)*~NDqKYhi_v8uywr#mU_Il-b)$SEHt(&$@$7WeOe>@}^pbLj zI_rX4|mF`NM`sdm!32K&Fxd13kpcHH< zLbOvW>6H`Qh&x*;uSAK*0{}9RaFj{xWFeP~WdAw5FUtPJ~ZiA23O#303E@dF&pqCqrbS(2P8E@YZukOhr9$&kF6Rk%oYMR1_&C#yMJ zEvw+xS#Pz!S|!?CcC|)5RXqhN)^R88lw?)+TzUGQBC*^+_S$pfDG~gfv3o|npTmqv z3r(wKl4KJo9Sr3j?e-a$*Phfv`a9(Q=z{0vMtCnz9XY^6otk-9Q>$srAMw;6fNwPm z|2<&!!D`?0eY4tGr4!SW^@g{}efsw8C zKN#!|%4@dW-Yz>4+KUFxKREmF{zG&FpWDFES95J}8btZ??HKdQEqG;Wfj(h0=WF+j z$3FdSt%)|WLWTZz)=aEmrN4J;c2;n*zi#?#UH1$UAA|XA;MBS9S=Wg_2D+a0AOnX8 z>|YPzCEz`PL+cR+juJS!o>;ev696aH;{@RH>j@iVnpw}S=W$N`UY*vjH$yv--F>Vn z*SkY|j=j|0J|lC${$^O)yY)kAi?@l^d+R6+F2AmyY-AbIF(D0k6>p9e^Hj8X?Ot{! z;`a8uQRr{YCvJzfOWW?9)16a>S0tKlZ`hmk9(qfILd2Uw;fxAiZwPe}?_gsQVau}B z=l3OjDZGbz?z{FK57s3wz8Xc_--LJHd-4Fvv2@>?e@H8=$0}aN;fi=6tm9>C**UU# ze8@2EkL_JQDF!YB_klXYY}jBIJ?{`M0QvDc&H11xqUhTQZ!`x*(}sP+feS(xgQE4J z_3#sY z&32^m$?0phGQ=38^f8s-R$;5Sb+Ogj8oZ20Ba3XswrF&Bk3CPKPuw3o2r`ckt@Jm8 zTkoqcwk~%+C;wdCy4r2+M*a1@#-8|0d6s^`I%#j+Y+XK1edu|r3p#>l# zFR=3lLZO#QI=;;I(RO|NeB0^wFdE(oXjKS-Ws)KIh-3&+X3FO$Hp0FGUtj{_jr!sY ziE1LOWt31W2u9C+K|-w}n_)h=>N|W$LsU@%23tdFzP|5hr?6AmsqN6Ak^OPx@e#wU z`LYjboY79u2rhkXSX9TCq>e6qx4y1#5D~YLk8UToGl)DX>a6cw>vJIqT>1U zb{b!-t>KN;@Xpb0ZkHbHoiPGs8fSj{cKdF-Kun$@b4nCW@rn@5S&<4QybVN!Dr-|C zkZs4e8@$uj%9;v`Hpx6|Cw z?V5J2yS80Ci-AKw+f^nJmgeyor-(v%w~4(@Z}(6MMk(f&T*? zVHY4Kt3TvV`ZNAhf75T8gq%-ze11B~JM?G$Cw}WBl=yVV?+-JeZ4!>?bjRj*_?`a$ zo3rfKZG!yHD%Z~SSWSkf`e6Ph&8~(1uK<5d0{YXDr+ul*kB{+ zPF|=pERpc1FN|h&7?usoB>ZWJdc_x*r@$;A!;H@Cg%S3gzpzRPOBdD+YZO?%uzq2I z0xJl#lPy}g(98Ue^$Y6+-vZ`_7zoSSBs)Q0PKIS^vr@9wq&F~1(07!56>HMsfN)tr zxFR529T2`25N-$vKNJvtEFjz+5WX1@{uIJtS&GWc%28Iuh^#dB!ZspnjKvjM87!{I z8fS4;mN<3yJ5g5SO3qf!WbQ`pn)C^*d}%Rf8LgPa2cR<*8`8f9eG#%qT2IT|lk~#N zoTa}wY0{TvvbT^PH1(RnVBE~z&fU$Gnlz^E%Q$8dBPV@LH*H+b88pqCrp%*xY?3va zRflGykN)Q`jb+yvTa3L%>M!_oBWsiSYCBBfNVWTM{u4f5#{v;kwFtxb#VKq7pwVR& zZ`3J8bO*@XKkO_^cPS}2CRTxyB5`Ju#-=wbF7$g-|nG#ahOIVQr1T+{)g znLdWRBzL#q~=O*_Lcac3*aX_Hee!s5g2&g6WGBmnJXG z8&}QS*n_caUMU#IYc)1Mn#1QtYXA@B+4AXQk(R>w!db@m9MKQC6n060lQ392hh3V# zv}jy0nsXz}3iE(@!aQkSU@|aVS|n`krIbslmzF4~XTcRlX_auSmpqr&C}2Zi-51yp z1I|mEV!(ZAi|S~<QinW^k(klMV2QPnsKyY!?bs{`qwCB|2%;wDH zjOC8!uIH}GX_?gpoIYkbJeNWeP(C+!Nt%Eb?Yk5~4^Bb%(MymP=#ij66sFMnS)2$>J>RE!im1 z6Ykoj5Hy7zf6|4237E>B!`awC-?*g8)@Ns;iAJ(DMo*45x8I~sz{lkqm!`Al^U@M9 zs%%{<&vs>}7;QNn<~n@Rk%s@Gz+Viw@zG^R-ay`9-ca5!4)+)ZHV%c{xnwXJjdi&m zmXL-&+T(UF*>fBaMo(TZ!iX7lFqP!PWF=eU+!l{rHTsYGNin=^fZ z3}RoEJ!Z6+K1w}Al|9X5ugRYAJ`GwZwLZJfv|wH|hvk&32-q)*M^ToVh&Dft^<&77HMOcPx zrztbvlJ6>T7kID-;WK1N4B6vX9ThDVZX#*SwwZSGW|?G+*)5dGoK5nd&DqRZHZxCK zOYYYma07kNL!4SrO`5y(5FJbQka?$|mzcI@4;Y7x&U{yXA2B6HUHKdNTlxKz&zil? zBAL`s<=Gi%eFN!sdA2*-m_Qu}Vs&SGvdx6xU{baaLLW51N(g<~l_G-3+P=>NsvNy9sjCB+l2L2=>&IIr?j38yEbQjJ617IS14n%gc-6HZF z=4IL$uQJ+=Zm7eQv5%q}L>(BYmW=%gkh0d8X*9s{v%$tVKp;Jf+KnXBVdEfW zN`XpIudy3N-+ahO-DL$0wv{uHI|=KdFg;4DKWt><;t0+p+%k^j^qTw3{pL~gxVa|} z->5?sXb7d@6US;|4u=8GNUb<+Sue?~VUy;N99QmW?n>?m>}5~hOkPWVM1hCjpx4K$ zoCT7AKF6IupTC*ENEJ=ZNzHYcmMEB(la}i=Ehmt!=a53pfy1qwOpqfBH$*swobjBQ zTyail$noT8&;k1~qA!_NO%~XSVQO_lPI=A7a}ISoHgcGA26I%oos(hmfVybEb%ko}7`K-JEF(_A=8wL%}}Q4zm;- zK<3??IVx)afq81YL54|9wL-E{c;!Luwu+V`Yp_a1Dr)Lh(xRPH{h5@u5~1{h%?Jrrq2Slhh=|tb6-%T9Ks)?F#3Hm?kWG zq2@DVB9k;f-@YvRgra#1%QFH1@6M`;hJpyPZDXccD5ZkT;5gD~BhMns z=HXkYCrp|&WcRjBDjcY3G@H%%j349fwrQYLOPOfw$N<=4wwlY$dcxf`(TN2FNFlCv zvEi4_;v5Zo5%f~<{1Tq2=3V>|9h_qG03o@|z2=C5@d7pyyUdvun+3<)SSAa5E>B*z zSVyi7QXSmpHEdTUSBcqfnEfFFx1e(j=TG3vR~k)H3(^XPX&9m*+Lbqro-Gcn%NWH* zXb|vVyR;?Gp65n4lv=_pqr`#7EMj?Gswr$Y?qP%Ze8ED&lBKt>zi7!nhSsc#BJ!JeY?d<7o`nUZkT)GsVkui> zO|8gVV*ausZzkUejo}!AK6t#PV z4iy`OpF{u0GhLKfVlG=K6D?#OoldH^q*#oWh{C$dQ`Vs(_$^Rz63txRfVc>nmr}gU z_}I-`VJ0Ref1toxJZf7#Ldu(xpUFnr9>5&MJ+@x#_*-LmnfdMlM{%!hoy83KEd_PO zeYTCD*k(}dCiSoB{LL%d#e=Ny_583a%p`jX+?GMhkfrbP+EuM>rgXLx$Kh(p+Da_^T?qXIdtyml#m}X$GC4 zs1-ZaW+`B^xGi&}0Cr2Ah4!y4FeI;oK7$?53s>2c2PYQ|6_W$H#1NJ#^CAR}e-=Vp zk%qXdH>+1!;uxW79FH0PEfrvlA`B)>-Qe zMXlC(>jDU_StFR#t=0k7hz>8^bIb>@jsag$G+iXEvR4hTbvKW7k*!1ape&rHN_sMl z0DDP34`O717XVnIlqCRYKl?KKfB=D20Cae+S?5?4=jkrJy2v6+RA0?i?N#Qeq+K1o zI$ykHla{QO?3ApPr&PErRv6wY-BYiw(If5Zy7<@-A6xX`wuzGYs^#h~i-sftxN|g& z9$W<7omUm&L&IQtb~muQF$p3by6QWJUQ=vN!kC27qG-M-t$3u^Wt*~DaM~L{DMh?Ojn;KV%K&ZQpfaZjBuAjPXa&G67!Fqw#-p*T^H;S+dNv@C=_l%LDtGLvzGwi( zWw^K{3B%d=)uAFsvAcMTnb`pt+72pv0?djlFcZa-#hxUn`NUO4k*a92IECspb#jzw3Mhy`%25pX3Bb5-HYanmy0)Wu7$y7wDl2avZ%MXuXq%c z`fUR?d|QLJnE(;tp)#YRf(Fn{h~5T1hgrAjDIQ_Z-r^lL(DoJA*$N0vWz*aGt8CuW z6qjs6CDSFIGL1dMZnf9hJM1CV10+Lk)iy}aMI0YLM1ds)MwlLsQgqw4V;g7D35tf5 zM3hXi=rl#OCHj(C7M-JLMoDJL0*fwE3z$o+IAea9Qnoh)6#q39bj1DXDD1g0o3UAoD3`c9X2@Ux`YGf0^syEO||>GZhG(k+B61lmTx zEC#HMXB!o&D5GQV?F`@`KxUZ{!lB~`k%s~sV!+8zT!d0yMyL9>F#dwth0Dpuq!ax^kfvOi$9x2-?&#V};FWBiH66nyR{<6Aq907rfl&x1x*{AKjjvhw6 zm#EK_(H{ihuNN^cm1)b(2f1qfyyqF&obaV(OF|>4zdGFws4wZ zM8!yTSgoKJf5#Gm(JeBLjn4^LKhDv+o2H`m?7Aw|(DXpXxc}per*G)=rRZL+) z-2hWVCddYSN97ikiJ_&!Q@Ks;&{DBnk%4U1N_S;T6}W#(+A(#RL0Dd{Z7DJ8W={=+WHatq3(pMK&-sV zQRS@iRE;tReY?_C^$9lbL*Q}p=~PulR+^a#&#ZD)S#athXY}T>Qp5rRuBzUua)xLp zUPh|MaMooV12`$?Y}I_#nzWgORpn;j7Q$O%=Un1HS0lOIsx%m415B~1I-@$XdYphE zd*{9l+UeA{2`W!&AF|Kd9o3V1XiwN4#xQ_{sd~A3i#4ag-bZxm z>@C$j)%`@f&fa4m5Mg8Xar+?g;bO)0CIiY*VU-s)wsbs%P}@A9lc{$Q8+p5@rc+*PdBzs5Vv; zS93%*q}o;OMs%L4DusONs+|B~$qM>M1cs~e9TUa?UoNVmc=Dd3dIgTMwnkr*Qj=Pf zR+CYaS%bgzfl#KaduxVkCTr$v=4zK~H)?ll7pbfXNR6^DQR_|O@W&LE$AG`?FxM;- z#uScxOsm1)?NIAYGYlVP!m`$^64tDj&KlKd4o5?7Rc}{I!NWSG&Q+^ww4kyM>tXZnrK!W5L z=SIRPfQvOdHSXGNJ(l)cfH?-NrJCKEmf9U^CD zh#*)Wf;(a1V5GlBL4YCTSBZhK8jUZY^#$~lf0(hCLa-48cf#nSm(iM30!-9&)TW7n znVJk=Ak!BxQ2t3)wVkkI$TnSLq_jC?GmC+x8jCMr^#yE{ZJtSECyX|oFV@&8Z57-) zD6j^h)QN%J8fP+^Wus;buw5X8L0F_rTQ!baXRVvCG_{$vEfmn!rqy1z(VbWFEHr~Oi^I2cA<8f0`mx{(9T07?p%=-ch6j%mnwrW>=fmL5%jRG4eT!lZm zM_bjd6JQ6KHpGC`vFQtJ`2yP%*ag2TIq8zrfsM})u)^VR>{61#VRnSvjeyEwa7e{~ z(Ghkx#%!u#2B1cuSdpKaHw87$klzHQ42OdCRvdROe-tSOhX)}OLPkfgLqU`rjy{Kq z0(D5!+ztJ#bMzolOVmkr9v1C`?~)-u0h&Dy{oNe?9l-HaOTt=YI)~qS(1VXzpJ<< zgZQM%vwVp1EdI;sAt3~pRQVOezk>L85dV%4rbI6IQA)bP1%((@A*xbd6g0{gIcS7d z86K`zM)E1jvvRGnQP8vNBfM7G8m0rwg!u!tCH>G@(n^rz5OejAgOevqh^9iK=wJ?TjMtPH3byj&yHm5u$pI06WomIXf z%;B2HwIGUT5fxli%7qo>lO*z092mZ)43(@aPlT?c&N!AUbX8d(tl`>JzD@+Ulydow zQpaxrw4=NtY%8yDJIZ3ji{;zOV!*0|EnM5m4|BW95D7G&4~dGwX;U$wVNs_ARa8!> zD(Y!GzZ9y8`o2UH^^Ty4!atp8qFm^BQN7{~$3YEK2sdpMR-?K0P<>Q5mxAL?Qlr8{ z)1s8JjHtNK)TlTiBkHW6$CZLBBkDZx&I9kfBqPcMxCw9*;3mLLfSV-xsQUoBPe{X+ z5p@mEYoK)v>DQ2c4f(Di-!A>^je1ce6fLCBVdkUb5dmNb;>_z<#noI_~$JVNFR2&EbjvR)FVqnHNF zM9Jl|QTNE^q6)dWsE35vs7HkvT=P*cQ+qB%DdkI$=3eIqP)aQjITq{xZ7dLNnt5ItCT9jJ05tYDiMO_Tvh7@`usbiQ@U4sAOR`>K2tB60MX=qm{C-XeA#OeO8c0=i#cAg+%`o zp8q67M3+%6MKsSVqDur-bOoo0zV#$>YNMlheRQ-eGukSVYokMs2$|8TM+9xO?Fg@p z?l>ao>1K$&rbB*XbU1H}E)Xoy1-vEtRlyp4jmX+Swmh1blt)Jkw&)ze9t|G3PzR3r zb3{KS)J2kkIJ}O8_n7S|KocEO=Rq4wtP)pA*(_t&7+=2Z6&W2$Bt8 zZsOV^FqQ~W-5peS2i4t%uy>--^r~zj1y`yFP6Idt;52|TaAm4)QbQY5a^9$tON^?M zf?0J%W>7tc=W~KZg$7RNtST9ARha~v%EXmZ4t%Yo!k>?*B$7InB-E}_3l3a$xSW*y zHs?Y)ZdG1*i|U%JMfJGgQavfSadn7nc#zx!HhNT#3Le#`gkBKF4`&A8k_!W3)o^M6 zhcg2tL#hN}5S$IGFxa$nBPu07rpl9zs|w{4sw!?m^)X=#WsIwy5=K;iFHDNL@%=xC zum2^}$UTMJGn6}BIjcG=n^T?TXH~Vr9Ijc_vxq;-KO*eDU^sm>gSLjiCpg++`~ zOR9Df!!o#D0oTi*wt{O_b&^{bE3|>6O(booz9MX@zA0>pa@|%bG2t>}Osimwd5ky4JSCWMSz@jcaVrShVt9!S#H}&uLU~L(xi8L` zlX82^Ntq+&B=3m%s9=wIPH@Mdn(dq?Mk#NJQOY`ElzdCfX`usGPmD>2&ejW1FUlE+ zLEq!}p_pTmp_qGwVJb?;jl}S>Q4}>2lP!$m8WX{=#Ing4{IN+)mN1EHioogIH29tY z-_tSYgc)431V$G_?eJZ@WDY`@$F&f1>l&C^jEUx#Vxna@{ZJw-#$+7f*J5xq&|=JD zn6N~*HM*^fH1K^jhp($8n=uK(21sua4LB{}eg_rXiFsVuiTN^~Z{uk_BHNB>If4*w zVX=&fh*tS9zSp(pn9c)lPE$C~frhhr__!gws&G@YA>jpQd{ z9}=cwO&oss!V{NVm?5g^+-&R#*?jDY(7D(X{CwDVWud^A`16GP62UB3S5VRvRTq@<8HhOf0PG7m1urEt8e2b-YcTEtIp%gm8h( zroJxV!V|qk-AP`qOfk`c=W9Hb?}w`X-TS0htbU0pFqiu+X7?6whab z7WMOjN32JWn&*4eI-yss0S*GTsV8CV6 zn2?dP;F}wZMk!cDEE}-Ofo0QN7s_$jH84r(oI`VrcW8bqIK@mZ4ad1O;euO?;wv<+ zMRQT;5NUWoqX#rRnkzyNu3iFT%mG$EO6$`^3;nnTG|)9{j0Jd5V-kiyYgmI>YkS_P zMkgE7=;WiCEMW}SsOEme???O7@{EOC+So&}Cu7xkk%7k6bO&zj_#D(LtrEoqhE<7|O z?vxOQOBz=usN$|svIfaoBx~Z51#R3_AvNw6CySJ%;s2pC;$)J{I9aGMPRSeNP70a0 z(&D}-WZ<&Kfj4v+XStEMSA|hrV{y!$ zOvD|NOvDuklW{MngY_x!F&(Fr&BdkQ+t;{Bi7-dE={Us^VJc2@1c@3rhjGRufZ?_j z2d%rtuf!!wR^qM;t8wY1DQj`}aO*_By>KHgk>5aNx8h#LpZ&EL?#7*x?V{qlai7QY z1tB7SN5U)Or4cfHJl^yx;&&niJ>8I?6zuUPYHUY5&pYDp7wY1vD%goHleyw$5@-B9 zf(w^h1a|=JiI;_T#Gev8xOzlzZ+tl47auO`jXx*!;p!(awt2)uo3a0VAU;kQ#5ELu z>t#rCI6j&miI0{|#XCaf!|{5lFcoi=3d8X&QhqpoNGgobZ6+QKt-}F`5?tqnx%i9R zd_2rcI=2viOtu(*j9-kuC@jQZ5tid`rmNc}EAff^YJ8$>Ek04c5}zfk#=k18;o22> z3`q#*r3vA(kc4{#DXy>tBBqQ;IKwLv&PWsq*+N9Zrvz03tG@==T3~AvJ}hVwo)9t< zUWXEd8WJMq=7h5{V?r@!PN)_PxQw_EmLZI^`vJQjuQXek=DR{5I5)@LQxSVE*amp_?N?i+|2bNRh}LxS_N(iOh`~LJmrGOSqnd zmrp@w1{2EofdsuoHkdFb5qfb$l!aC)8gT?s9Dy>B&=ZQNTPh4Cpp&)pqX{MQv4l=M z9}~tB`X$0>0#1S&O&FC3;|Z@{1I9$cDcMxQJ^Xyav)p{bkAw;Fl1(I#r<;HibmkK< zFPjo?ID~B>;pQ92w?^EoC)7#!^@MfI5fdUpaWjX>))HpIgq;Lv0~Q_=cy2eLK?u<{ za8m6p8f?O}m@R6b5OB#9+Lw5Rwg)p6?HW{Gy9@V98zB``T4KIXuQf|#DcVJeJViT= z388kLZm6bSyA&#8VaSK|RY(e|Fu&AYqa@cx?t5{gp7IQ1wH%&0ytJ+ht4ecp@Rr^t40~el%e-v@4 z1OVJ91dvq1Z)j~4UBb$y_F5VG%&u0+ha_TJphY8xB(6z>h{T)J(G`i|yectVrb&Df zyThIoG>Kmn6p8;TXcMndvL4APNY*Fj2`RWz2^`6#CGvbmA}`5Ej26-olZ8wX+W>4M zunmd#2u57yL=%UfC6TVvf;AEL3bX7)8E;Gcv|y)99Opo49d-oOB_;@t#FK(Ek&W`M z#ACcW@tDM&m@c>zS0xfxB8GT3-Fk?19gg(lWqn|xFHtS@C7L9?i6wZJ2>p}{gPo}4 z2T|prM5TNnu}T=kHH2$eEOrFNVlS6uBr#4H#Wj`~BB@0?jVH#)ClX`A#}hv+OyC+% zY(TsL@l*`0bfXYJsgm#+aKq0eYC{3@gd!EU*+d;G#VsT<1z1XybIX9>U)DB7$aW&u z+(jH|5<^vq53Tq}p+|Z_YLYG;+MStXQb?ea#-wE4n3NJK^e5e zr%Wmq25}AH8cxCjYb4I&3+G3YP79++r@1i^G!D>s(mldN(mmW{5>qm4TH&UWqJ`B2g$4FX@|Hj~0-TS?*at)%n9W>U4VEn;Jz3XbsOB)duB!cNjT zAw7<&}B;ux<>?~?g>6qHwAB;Zkf6riQI@AZ`Adn=j+Bp1q;!_ zlval+tqxOKU9w=+)e7Z06KHXET^z1wggUWACrWgoL>EeQ>Iww6?j{MaMTZ3D2tZu3a{-`@FC~ z;J3L&FuANV$rp9)!ZNNE-OFY0K38?8_z?Y)L>8jAh6)=xPbj~N8$zk@`*7nobcUn+ z4sL*Tgb7kTQ>`#PT2K!cLyyHey@|t51&~UAQqT}aB&XH$yjGtl==FIx>+qHg7A{q< zlxONc#%JoE5mLnq@mCT51LA)W4Ek$?X3^*HR{ec4tNsPSqW`jB)1w9)R}T7i>@2XO z*mC`8!9idhSEuJ?PCaI&`WV59%OzsFfsGvqk``dQ^@&1Y2Q52JVRxDD_~UFC%Z{hPJ2cIArxKKZ8pSNx`45OCoM&u@ipoBGis{0eSJ$Jj(S zq%QGD4S{p5r*#x%SaJ!!t1ppYoxKlAq!g$tGQ7x>AoMeKLfXe2p*-h^8f% z$PLL)3Te2EBG?A78DJYgW?bdTH&OLGdvYA_NRE@$CBuJCz9!TqW7e7cZ-R@G)AQWP z(R@pCw4@_BTGo<$UT`OWT{Ccrl)gV;z!t$z(DgI-Z;;OyHWtHJzNu%_QIC(CV|vYJM(REt^kP%V(1> z3Uj#TaV;Sk6qZ3@1r%06VHr7BaINB67n3)Tyouy3ByRw`iE9hjj>vt;-EqA1?l{>l zxDUDerXaohmav=r3nAieCK?TrRY+Fc9Vb`a-7IL3thoCZg8ptD6faUjcg|_xxabdV za@?Qs``K@ff0mQTtMblPwY4>0cXkRZxleO^b~}NpU7cs#t@S^=nP!l*tIwRdud>b4 zS?{{fkA0@y+4YqhKg{A9_{yHHZdVKFH}RG3kGe`5sjSA({2R_r_e5?+7vb_drddRh=H!LkrKo+axV?Hg~zYD0s|E`i!N+1K{uPJKoe3<%3;z zbzgCI-N*->ZAysrB~-PEbpJq5jSp&W1jG4ltzg4b-|cQ|eK#mmfxD~S*ii?6?Ui5Rde{nT&enR@pC}>Pm#MJR&Um4piF`xXBr|t)xtm&D4b)Ce zM@l=zK)5Nt+1b^V-|2F8yE0FQ|Dj1{GIuf9cL)BW9Wgs3W$tSFe%?Rd(-a}bIy;>` z`OTew8vU%M>6l5Zd7--%T=#5TYoBjYnr@S%)YhHc6j9vfY^ZQ`iL$SK{ju`K(7c{* z*L3WfqUngWwVv@7?yC$5X^m=fq`)O6MVLr51wE}!5}voL+eC8Xn(QZFl~uwkkPA-7 zdrhI1N8H`4h&`nd>-{DZm&q#Dd;4D>JlQ18gG3%=$f5{P-}_$p$DBr4WeZq<3KurN z^7%$tjl03+)A^<&`8PUQmLtV&53|5=Q&ne=S2R>QV_D9m$n=%s^$kbSnXIjhxB3QY zRZqLC3%MJmRTbzno>G`DRWTMA!1!9-H;})^-P+LhFv}E(89*TP zN=-?D_4T!)M!u%ZTw%7c-p3dF!=Yuit|smDYrTzpx3kGsc{z6@_HUZx=tB9<_HIw7 zD{<=&KW{n;A>D8{H>AJx-cI9@D+T#PvnjmN)eKg}PX6gv(#D!1kq@=XZ)6@Ja>0qbN9>Kn^4b!PUpjxh9=iv9+|W^9nUMMc%af=Qe-J9wO3gxzSR4l z8BIs?3LmJjmCG2B z1CsZkKOT`^T3lN3Kweczm8G`oXGBD~2fAXte5Dvy)myB@J$U66b3tj%j{$5vdL`dp zQCV8S>Mgrcm0xVNlvMpQ;fIr~Je^%_on>uZ-z)#OoTe}oE<*U|n@5`DmH7`8SsXS? zi9O8{a<)lUUGzX@nK|DQ{wT8FWpj0PIh$O0E?4`@FXXA3jv|?G8IxgEHp>IW7IU?Q zM01-GG%1)qz^;*cvT)s(nl_pg{&-az19$hn_pzohrhO!~?>_R{#irQGGV24_sasN7 zBG$)dsj9H%SDq%mj-y&;n8Sx$qM9*1IBx9{W0qFu^=4NCV|Wi(?e1~|O2GOCnYUg{ zJ!Mti*s3uzrtx?ccE`C}q5J4Vtxc}){OYq`Y>WUfpG;=64R-q@|M2c7n<8p#59FIm z@-4--(gI5uaTN~GWlL3Q-c=|_JwXV`R%)-bFe$~n_fAIRF_0?Bx3zh?T(-7{Tv`0G zr0E#Y03$?OX|*N%laOXO@b;Rj=aswunURM;#I~m9VQevtZfSw3KXrceTdYKE3eGRJ z*~}#c_1h?s2c;rc&&TH*`~!R_{;vU!7LQJySiV0?6ZGQT5!YN*j?ET zL!DawEpNUg-#;`%g*v8qO;Li@A?TP2Ub8d=<5Vd2q1Xd81bL`F>V`o|3Dbg zRb{TuF4O_SKO>HyRc*g*dhuHj!fh$wTH?QZO`JcKfe|KgtOjYlq?%lvi!N^R3!^<5ahFlxgoYQOh~zYda-cVt7-2GQrw zFtzx9t9ySBfslrrA&qvnJL}!uJ%9T9mo7GiiC{4GXNpFMQEO|1>ygsNu+RB1$~@ig z1!RCqy-QJbKou~iHSAUN*Tg_reHUpD_-P_zzv;Bs<-a8H!wzYQu@na9$;Yh+VJml=k&7Hb{zQ)YD^=I|Z zBLPE8i?jXhd!N66`iqe>)EOAQzU-^7k)E&!fkmg~;Rn9?8u>{g`u{re@d5ag-n^nF zT@f>SVUVbpF_pka>znhMo%IjC@=2$GA~iRlwO{|FGaIsK&g*V1go6I=lg{&vq0p7q z-#lWOfXor1hNmH%Z&O3fj8OebXa;WL8ZTkf9MoxblV* z!~Hu%ny+G`>%Z7^FT)FD;XU%}Et$125e&!*_}ato$(oK{hnwSac4q0{{X4%%XefXM zZg!25NRGC5RkoprUIH6v47kMIoo&o)fgTLD7qES8=a-E#v;s?h_)n*uO~>&+`okqot@s-m=5M1GBMVRn4Dq{Je=>G4lzHAVaJ zi>;MaVxB4FX*!0K!qO5isGx@EM1W3#+u7XKMD7{0#}Pm)u$qfYFEf)&SmAqEKBFDJ zhlG(jn{e&|&K1mMDsQws{GFQr@tvl-fO5rJQdN1Sv}TsdC&K=b$4ww5K$K2+UQzrF z!AU+fR(xz_6`{{j3E@?2h|2SHcel0ftj{)M;L7)Ob+@&6rS>gtA=eZa3_DZi1XJQ5 z{5#|Scm}r0-!gl)>KlE>{wFM9U`oSBKsvwK4Rb@SK2I32ff(o|W>0q;P3smYQME4- z9z2r1LrL18BsOybS1xk$f$}P$sDn`0JVWe5uTg5^?WtmwM4YAD%V!j7S{uGcNp}Zj zXCgBm_^Xn@-{ zC`})f)>i*ug{vI~#8rTx*dYHwXz_t)WWrcmm3F$D+^ugBLJ*&O2-KJxlpNG3lq~j7 z%Of<3b^VG^f;0js1+ItO^)5n$^ZaYV2x|1b@qd?+f?Bk~)#1Txlu2Fk7*c~I4NF(% z>_oA7u#-)lZJySKy9g<$-S&_Q+C1u1;4&I3WfpCiOsXWsXte2LlBqdK}(l zQCQAqv2fDlNXifum;tRqPEr&l#04e<&*;xndQhucF#?J1%jMgMqD84&+9)BYL!y#} zZS|h63QAE17AG=ZDZ;({(-1{IcU$X2TGI}59+-_KxYy(U7$uOCwwF-Y+~(}Yc-u=U z`a7kNqE%v$V&3JW!34mduh$RVmV&uj6M5r*O)2Ech=n4Lmz%$#1lW0h0=b1x5fpaI z5A|w;yTDE4p1!T1Ja5Y1QcBETPEt{@U~R$tsOz&x!@$Q>?vH;}c8x|ce+dj6K`62+ zb8G#Lw$82#KVBRN=GvQZ7nMS8jaVIPmls~yjYXD*_YxQpn*O38XjLkphTw=Mnk7Ub zsNMuE-A~s`L!|pB&<*C94e(0JQp(e zW97-!Sy2Cze+cf|Bu{T*DH)mIj_*%&QDTq=dMBHA69a*5>4l5shf?`8abXsY)rUFU zf7|xOlNfDDxe72XVzAH;bmV(sr4P9}8O-wg>94^PVB<6cd^+KCg^kBW0L?8Ku;=M- z^#q%5ariJdH@DSeHq%f*y*$XYqTV8ojVeY<2oPLnH?_m!Q`ILi8Te4f*FJ&CfTF(3 zTu*C)&|HgzC>)e71O4_%w7j$16% zmsMm1YcGtoMM@M^4NmhJMwB$9pWy!98o0=jMM-?i^U^-m-E^b-|Dni!Mey}H z=514Z1|d)tF`)T$?i?Wm4VL*q3pg(jcXx@CL#CvgKi`%I7%t42v3}k1Ce=6mOu#7k z#ODCXMB&Ed?HaR?oB@pzNd`~x%#@)MLZ-+mf z*G5)`O?qxz`uZ)Jfi$;ux!B?X!#m=3%wr{m$gIB=@@&&x=JxhxH~J`glJQdXZ$Tpf za_{ncn=}t#4kqPsf8eEUs(>F-{KuioGzq8FZ-4ElziyPXAY(yyO!v8_u*NQ1ft8X! z`!Cw_aD4rF&osHZ9}t(=fWkW0{Z|$S@n(f7)CUIZzKRL17}0#7;Hzk&0OrnIX={7X zhDH*7(Kok`e*!%!5W(JhBM9YfpkR&3+R{XgPD{;@533s+U;f(tMaPdu7@XM|LYx0!>aPUq>=nJ)!Dyolv%6t z2)C>ASNBRG)vCOTwzh797@DTO2qP_KhYJV4ku`|^7i(EC$e<(|EyDfzrHOxMFp8A2 z5xQ&cW4Fdp6+c1d=d29>@-G=x!X(DIBnJC~75nkLrJX+@RO6VM=@2drz3Gx}U?vUgap^=iJ zf~msx)<2j>3HxeJFI4=4(G|itM$-4!>9ZThH!$pp+9>jU2Je^ZX}a*e`!jzC^B;Z%{H-H8|N@EIFSmgt3oxkQd)W{D=}0gR@(^%DSzs;_3tZ^X{J#4mD0d z5ni2t^A1VHF6Tq2)fy$m2j?or?7FqdJEH!K5ccuK21n{lKR+muM$TW{p;VUB-o8#r z`((+IYHqk(&A+77eLUIm;5@O!CzQgI zO~<;gKh$=mt<(Kc8a11r9sKFPH-!_-H#57n2f@4cZuEubQG)F2Y9a&K(AY-F#f%UO ztps;pcXw5KuD8G*fAqIMfZIoak~W&LmA1QDKSeMSgI~M7%fB?B#WLkbDk-_wn8cAe zA~j>Mf;Mp$>RS%!I!4JPIhO37@$Mm<3$k(0FY-~&5OAM)Al19!dZ@FlRh;_~!8Bq> z7tAj3{NiM0=w8C2?(T<+i(dap4M6=bxVFXa)(0UYH+o@L66M7J?H>ygF8!6jdSpN* z;*A_&p0M|sBQHNkDd{*f9R9)Qo5%lB%T(Dboj^;|6+=Q`#QYh&LJz<1-|9u%9*_jP z=N;GNl)O(F#FZ>7aX~d^1&R{}-Yc0vy16d*tN?V(I=C6J0 zU(h2APZywqM<43K3WBrwIBEXgkd38F?|Z|fpmGb{on77HOKN&u`9Vq~&0_VTSuEqo z)gYw=>PIYr8Eo%Hnc}v#_EVIaE~C1yV~Io@HGE}! zW)mEvhHk9GW9;gx>U6eZV+pO2eS#_zL3#EJ-7z#1k3x z0JWwHd9IV##08VPNqfQ|FhKI0oeiW3P!LeM;%;bgwTf-lMBv+Ph}XB$6OBFf@x8y> zGY5IZ#-94@GbUzA+^Yi(v7Tm36ZbMlP`Y2cF;&5eqOX!vZ&&A8LfLDvJiJ$I6$?qA z1cgsNmevLl{DB~nq~(o`wAsMh(@1jn5=tzr3mgS+Bjf!nj0agVwozlBFs#&>*i_>x zgdsY;w4z21G*w+}0fLZ@iT>21g7c3|!z*uK=zowFy*|AaA}}YJFl+vLwTk(`6rr6T zzvzFyPRsx=MC_#vKkuwu6vUn{+pVw4igPcy-2ht66iq8?I-}ej_6Af14@Nk~c z?mnn^(w&lga?rZ62+=>*?4w6EswCeGm()af=?4*nW>8L71DhX;J`gRW=TWYdLvq>N ztv2T)#EFGa4-^4mFz*|Vkc}`86G0v=kasx=E$xu9eeQ&JmWvV|q%3N`dmAhb=l61L z2UmuSHrxpDmCa8QLFnW`Wdk)}X8qIm!wrz>n}mB{D}ZhQE?l=(u~F9Ew**fo*-gU! z+56#om-Pwv=fGv1%qJ(zUmooK)m}%WZhGy%#_JB&FK|qG(dT|aivbpK>Arjw*|4X7nb5Wlb5VP66U;IPU2M!?;i2N3Dd|(#?$AzBe zX42bVy&qz+vx|x0*MxYW&9HX)@Wi#)9~1V$9fr1Zb-6!EHuN`yd6+hmcjKM&0yS=*G*}KL;YGq;k7~F=ee*!Z#F;rs z+dz2!k=&=6;yB_p(RILqbMYaboD2964P9clwb1fjep_d&tMh-7!w~IHf|JoM&ix*v z6mnngG*F%KPHyf$lnd`F0O1@+$c*iw*voZ+kPd7+S_;P74ez?dpQud^)X0FnS;vX! zfvS^lV{Q{oNL{-`@<0O~v@J|VL=QB}d!E>b2u(&~Y7I80$Z0^OQJ>oBjJM8SH=^sM zFTL{{)p$X}jyANjW!Vvmq#o2R7@pMQ^B!CSh)Oqsf<}rKPQvazt9X>YeQ_ za|<>Tc413o7rn2-f<0RXw6(RiiJPYW`P(n&G)2L2Yi8AF-HDmdPxm}>0)sHQ;#4B( zC4DT=6o$5`Y9sKMkN@4(rehVZ7OVl$T$Eq~`S-k9@1pf)TJ|Q_JEDq0^eUhB`Txw2 z`FKIHuQuz?Z&VJyCxHYc^*ee4ruY z?3wHB%_suDrX*9<^|RgLM-wJDTU%_#AVte7CptPhA7V(_KqR*9`!*CqAj+P0dJTtZ zk4yi0KJn`>;liQWy|px5qrewrM6f;MLu`4<)n#JJ%cy+t zP%3-VQh!6H9hxCvg6q$6c=L&7R-9&%DPwhaGv@9+v@B%wPfq=%9bTh7!{g6zID5Al zHh)Izq3i`@WL3(@U>``Bs%Vu{ZIjIqi?Nfoqty%D0& zmSG5}AQ^w6*Vdkqxev?;Upka96eSP4miLq^m^Vh?@cu2TC{~~jBT;cE54ZUmqL|KR z1ytuY9L8GNp>+3qJYKRF0?6)1VN}l_N>yBoq7^Lvo_nG!juzJs%}Yxi-T_(s$b~Yt zKXO~cJ#zLun50E-Qei49;LR!HG4FlLA&2(RLKvO1hti>Wqjv)ub5n_3(fk~)`N$V+ zeuBH?-m)2E;c!bvr1nqT(E$1EqTxdj0h{+>{|l;JXvb)*i&Z ze{Gp@obi4f@24iR{l0o2u2zf1pTq8iX4q5H{+$VogTn_W$jnblEcC*LF2t-i4y`R@=gsR|u!g@)-+iLRnIfG_NB8tOj^yxpUxsWmp#K9|k=eBgnMfS!0h#r@y$l<*S#dK=!K&>L4O z`?@Ii!~K__r3O~(V289M|BBl;RbiqxA6ogEfHjUoWmxb&Wc;tnM5fXMz2uTM%pLJE zfH8F6p_G`=NgIjG|E1UuuX6C-JI3vu{i4Ik1g;JpD!Id5b5U+rP~lFZBHD=DLq!z0 z>rgEDjx(E_{}vG_;UP3Wa3~G-$%vop!wm+O-RJ{e_PHY~@$A_^74auBC3!z}Bg@6U zjTK2{1d;NkF-nI|$O2wji()unrg?bXZrfyfD6RK1Yi!iOO0-zDbiYCJe>lWyR&{9O z++laDNYD^S&>NQ_tD2q8ns+o778bI;zR-hf8_aarnR%ylIRGiT(TV$pic3z$bu%u^7n4cFq1ZKBiD+RobS4%ALO)b1ZD{e`f$Jawp!iEjq{ z5_=zG#uf>^E#Czn2s`8h1^C}_+Wbxk`9W-4_ZNTWP-c;pCQAROdG1io>GvyV&qouh zbhv#!alN5CU{pDLI)36h);|u^3)W=k_HpO+ps4O9$N-y-MK6hM6@d`_^4ss?-=5RE zI!yKRXWK9Kec8NDV{o4RBH5RRc4PPp*uTgWhzmXcG$Ct08!+Bransw2+S)|l^ftrgU*ab%aCMsY zd;+X3ocDcpjae7_RC?d~nvd#jX5CMf^orV7q`ud~Zm$qi(Ea)npdduZ_a&Zp!XkE| z{Yt$rk2fm5`yej-I&j^>6SG%`K5nsg7JgT!kGw>voZy*Ze>pKqQXTW7; zvNJ#4LZYuLBC8Vx27ZJ;kNDmfFf+t}|5J`#ME5@1kV=s;;6sfF!~;InPocBSo?+T%F$J^OQUKm5UJ z7)#&Z0F++%U5o3Dm9Ud+V{HJ!tq@6wr2d^7PyOilsfW)-Er*>xh7tl0zCZ{!6F-^v ze2t!#j_ zSgAc9f8fbq9{)XZ&WM!_Kw!C_ez7m-t?96nD#o?nVu@yi(fH3Ve53hS$6vbZT+~$9 zX|{iOKN_PHy8O$y-%N(3V1uc*5E`%0oUh|Vq2F?x`hw)l`9{d;?c-m0@|E1opclka zS-ltFeg7K)K)`F*R9SsWMCU_n37EYQua$G$G5M7jLnZ9wxx1i6gQu z`Cjz0mVXzBzvbTL^r7^UIELfC$LWvY3vh(+_Yyc0i=%*zH;_CL{;B5!N$RC$(pX|p62R^A#O;EY{6{`;7rvhOXqmGcAIh{+^Z)7iOKAQN z+(n;D1b~I(-vId3U9`*73pPt4(ZSn)IhXq;HM3Owq#BZiz{OV^_!B9ay#B#c?6V|) z9mIYlepo=vr*8l8OX-9BDT z-9--7k?Zs_d{^V?y5S-nlk<87_LboTL3Ub}cz_F`Md~C4`8YfA^t(Dq#aRRr-_RYc za<#PQwX`Ev_BzC~$;9)UKQomJu!R9C_m4TZew6(aXxxwYnEvsdHBNt**{@FE;OVSA z2(=_2&!p>*n#FMou@9fp%gxpm$wk_N5az63naaBK7|9 zpHI(diIB zR}D;(O2k}#gS3|`%$w^DNf8pJnL%THK*##`-tb$`Erp_Iy}8%3-sEA+p+fHofwnvp zQXXUMzxn4={x1i-lJRY?Btg6inqPQ1LmEg@<{KVBWy(i|KDP*F46Q|V=pr(MAoJ3( z=bi~*EKrMBv(NfSv2h^KU8j+NNcoL6$h{o?+~*G<_jzWh4<$#IbdTKELGIP?=iWGg z+#5u0*+5MP9)OTK>imC zq0a=ij9eE|jK(&-s|&G`^^xg9uF{j!h2*m*irn-S>HiGGSERTuM#NtR@wZO~(I&ei z4JQK$o$-Ia>dVW7AgE-najw^`NhthY{U@1oqvJpPA{vE|W zvOx=rMEKhvtdLyaM_I}~L??POy_79NQgw;8_F&pUOQA&jCD2ZlBnHvu^fI$|odP89 zlO%`IFp6Lzb)qyMb^i`yALqf#vqb)TAa9nKZj-9u|qO;e|>%KkXfXFRqF)K)}3neQ6MxG&MZ1I-$ zkyBCPMksGHi7y63AM3{N=5k*mA1h4!HW5AmvctpKQ<(c?aIG8ae>h1az@N$jleG&9Rjuak3k0vlnhtb=6?ML+f8T2$q zJd%S6WMQd0VJ+~jC6)Oi%FHe^Kg=_qbpNTb+hL}W1LK2Sg$21yC1D-@kLK2S23%SA#tw~K@NJ6ejjca^E zZ%9jSXoDMaLu&FVX~_#|NJARj;F?^M2v?*bH@GG@jNfJefIZdXBisGEe$s^ ziN7Skzsn#MpM#1K`&~CTX+Qa_(o&dvAIN?qfK+}NDyQt}j)WSNT%z!F@fiWHQo9^x z@4+WzltRQxA-z+D)xNggY9Qrbhw=sc(zbeABJs_4p&F+}*d9iT3Py2_MA41&T71py zT>*LaHKbQ>rI+iX%-w(}$v;ApYxV;-chTL{LA2gVVYbglq0lKFzPUo~^A1a4?maH+ zJr*+Y3(#019=W;3d&tM#md4yXXTDBD3cm-1RpOlVjGDS>!f&s=RbsaqWl0`wHki0X z-#@p;E_LwFmf>zywr-(_puUMa8|de*?aZsaOrMR@{cY>(Y(o4PX7yQS-K6MgPYSYW z3O3b?bC^12*(942CM5ni?t5GH;LTJ$z|^~OH|l|Br}G$I66W7_1N(^8yS(YpI z)G{X5>sfn0kwKq@K?(8REqkE$wcI{_&eE9McG4qjx*?Iu--F67@vi5L%&|)55)hT+ z;>|Vk@#NO)bENT;&^RDo&o;6|;v1M?3B@3VE0)6CdvIFe)?03*^;6I~CZ5XDihDcP zO4Wc`#JZ(5J%6;CbXw~T-qa)g{m?%nZW{)s^?#4_+l*94o@@0DULqu|ebBljzVw_` zsd<4}6_(7VfrDgm#cQ^;bGT-wg^F9WRWfJE2H!+XTNh@xy66S4J`7BgMZf@kWWMs9a zF?ZMnjj5Mm$-d7(S)(+TZp~B}nB8nuAu5a7n`=XsQ!nF^w*L#-+K}59Z<5;=$+m`@ zYlCeW+I}C}dZfKKtlj9fUZj$ZS;}&2ACzr>jhSqG4qAt#JvY=!m5)qpwY27TKhSEv zAz&?CJr8{ox6#*eYkga9bd!C9&^ISF-^{+3$i8k%U-~n+j5eM1(mAR8G*qrg+1&&> zX{(GCQrTyz%3C(oBEzYB}jfUm;MkFCf_pdBmPQl*5Ab zDb$RwP)4RKrMaHp{xt+CoQJ|%`Gu^)ly`~rxCS1pbN6H@mTsOykFwN0H1phRnXtF;`g>}2nG5I*3AxooM=9T`Kt z^+60NpMdf{`CZ$Tr&pQD*mX-=Zb!fM-45ycGw2$TqwJZYtV-v`V4UuWscAWlYt>|l z=lCV;-;7f(tjB0neqxCWuc2G51EUcv+&jP_4CG%{Gw$$3$Z@LFciN6Y>GQwZshy&y z5UKBdz$&^1^KI_b?TNcO)j-x&lsk`*7NU%zUA;;-4 zND)=PGAp(8)&f?YzRA~Dl;k*)T#$#vtu&zy!$>EUF8@Re;R8S0=}7JEhtQ4}c8aJ1 z593m~w$phMpN~@yz{9WYG>7)`PVQy%m9?|DOU23g$`5whXrZR)uXeJNWcR+8VRyA< zH}cnd5u-nz^us%0ocmYFsR!;B6^vVGTv~xB-}#w&P0_#eR%W{v&g{w3(8x7}-u`E4 z$gQ>+pTLp7{sR75lXYdwUnqyyG&~g|tIZh`Ec>cZ>cWO6c!I@`v%$xn%RD4+na-zb`z+(=;nJvOTy7_o@in6P zeKwi+4VYNsxHr2Wg`Rm!Pi|v3_29cuivO30U*$NF9Y5tPY6pv!o*VXX>940q*H@vd z-r;%frHp=JxAmmzn;Ilyv?#=u9}in^i&NU0Ni&+oY9oT2uTSrLbN5P7zX?c0PhBKQ8GB!6Ve)2P`XYFwn@_ zIhTz1JdBueJh;uz8SBt@k;+O-W$tJ<{Q)(p`x~fRa(rfMIt`n$r;7J)ja*>4N=}cY zbnkT1+Y@|mJbDbTxW9@QLU!_3Doh{P*a7#;;Jt5;jv8a`T}v-V?4+mgACbQPz-j+8 znbqzYWvBJJ1zM=N^!`j^z zeH4NtbywgSJhR7xzJs@O>n>^Pdr$3_yw@aca&era~RBU9)04(t;59YM05lc^cXBO+0dc(~FNY}@qt4w)1OBeOwW0tPm z+w)EKF(7S!0Bw;QXq&LKX_*@*Pz>6Otx{V(~ zu7JkZ+U(ESrnyN!e0!e~Nxj_rvM7YAUACw3&Wa`T=DcwLP(d9B%~~J>jU?lFCJ;rf zF57chJhu>D>Ugsr!~?XmgM;QRklzGlzqAe9u5ON7Na6m2Y(9{BnF+fCE}IuwS+rC* zpn@iIknM@_SWA{D?*?x=0Cs1i%l7PZw&fJ;4ENz{i%Ly}O^L#ZA9?yq!jc|Qbz66G z$3FHMAvvY*b=FuzM>w-+NW(pc$A9hZy;@C%Cm_8x1?j3K^;*)cr5`}lIY8DdNTCI} z!8#7W-T5MMp9k^h|_{7HK`>E(pdqCZb@7<$8gw_ zx#u8+PemZ~T0(El_6a}5j{y>}AfcMWZT=&Yfk z9ZlmPlG`9Eu|$Zs^~E(M-vwc*B{XWxsV8-5*l332-H?~1Sx;vPP_L1SDht5(t2ayN5{X;6xY`nDv|U;; zCB&jmZ8u^eoM=<#vKk4)1_`5JczKpm0s)Pm{toz2X3ZI zqLd5UETJ31?cT2Dkai2=1!S8Gkiik|%MJ@fM~bFf?6q31qBB#PQD8AH?XslgoEtRT zYpopCZNYTFvKr*IZVu?l0%W$lYaJZWYXS0aato#co8bBBv!MPPEf5iI%Ah*bZ{cvv zTIQy0HoG9a|LSH`qf#2MKsewmHE=SY@)PP$yEgkcYS2REZK2YS*$H{3Yjcz%hb$z{ zR-@aMsq8FaE??c8<5g+c!r;ud^igjF`OT}FB^)whL2zc93Bki8Lj3!yn*oj(wGe9h zV@(45cGul=Bg$v96Xu14-q%0YqQcr zo}9EmIN{XnA8CU}g1n=Zr#58)Tp5q+N&dk(p31Z(hk|T_d({rEVa7t>$W$DKY8{VC zI=Walhs;_KB!aqVK7J>_fkmFkoFzvhxC5j<6DB~dxXuytDa2lPP4>7(5QS&^a2r^# z06qd_k7)=q1k9p^k!t950I+{J2KJJbx}NpE5k^AqD(8tWTY&tVEEL(8DD)?*-Q@8V z3+zkP+>A9WsJv9hQL7fpxwTLS;T4;k?j>uM(8zu?-GyYn9pN5bw;(R`=+@u}8lGI| z4R^y5(|jtuXeo%owPg<2v;cIpG63l*I+T29o!e;hnS+siq$J&c0ARzMpKeQ%g~$UU zV;sicup_7RC71X;%4q@VNFus_Z6SJ-GaR93BDUWBBON`-d5-W}2-$oK4tB_rMtw@a zk~n$oqo=Lps?U#dSB0~sbQdA%=jyq%*pf>8Jq##4FY$pxi6wAltZ-4pv1B)QPw6%Q zUt=P`NOF_|$}E64XPt*&!^wF!AE8(<=hiX~iAR%*TwGy^sTb#O9`U#52=en{UOg*Q zhzd1h^dw?R>qfVGwba{TfHDkGws0BaKv8(g#Ch=#I35R!jwx)$;6FHI4*nx4(SAp2 zlTVE5lVdJhg@kcRO196Hu`VMp;hMy661A4txwYs*LY)iiEMZaB5Nq3um4sjAQ;2#C zPfdV32AlVGF(&*{=Wc1RRy;j> zG{pqPgl>BJQqWEdDyIfjO!$O}2^*z^Ng3W{;rOEVWjOOW6DCmwwNTv_O3NCBG2vMg zTwzpa=+7w~TU+W;|#?MSc@w!VgVlOPSso+5+)e1}4@X z?p>_1Z+UPyg)!&guTM%fdZ|*!=iskl4qnUW;GfwiRG6zsw8uVw_XLZ3!j6GiiOBz^}az|J%PwPe%+I8tXK5@c5zB4ho>f~d4SVs?dux+9H3=Ep6RD`V?$g6+`6oT6-GxEEUQ5QdS?!F%7W&$CgAs`@i21Q!rrPaA=bWhEcj@~isj1K zy`1dcpN2vCtOW~Xz|xzXQ-r(H5ukU@ieP@lM1Z@~fPWH%pW)epg>hkQX6=Da$a~UA zeuaV77BpiEbb{WS16{PBDm^BoZv9xVP%`)t88V8l@7H(Vj2Zc3R zzzqwCn*N&vI zs49|$wK`mAJDNtMQgvFWRCf!|@f?tDffQ>ub29Bj4$f=gvU_DgxeaeYtZo~ShqEBX7DP3BC(FH$q)~81iG?yu6z=5wbW%$4(JW-Cg>-J6QAeQP zN`v?n7M?6%?u`KW(`h{NQEp+)F&;GqQuMfuvW0!r>cO?tfV8I-zLtF{+L>8oR3vvuc zpW$D7og=mI zL+IjMbdQBbk!_(<%1d(Ly%yY`4L6TLqBKf#BlTI46f*xZR>BEbmJ95+fT$5$^A14E zbD;wk)N|~7s)}c1v?4dcU@C$+^1H^LU^PJZN1lFGSYq|+-dA#-U`?UD4e@B#-rh%x z*cl&wqsCpERB1tA*h0{=C2JzV2aPmV#pHVD7{`rRI3IAd9zf#MNt!_Ino();G@3$X zO+r=v1ZpfLGIMZ!nbka|G$99vpZ=V1x>4QzE7-JeYf8U!Ri&kwaUSXV+h-1A2rm3g z*tBih57RTepYf*Se*5jW|Kkfsh++H6^Zdcoo8PT@MCsysW#M?IDkPzIubO_B1&Y3^ z;M*Fm`OUZYDycVDXx4JTgAt}BaMEif=HnntjY4=E&XTAkF~3JfBxNVYkCw=B^w7hH z6V1)U--8jN#dl(qc7jf0c$g&nF(|Yop49WHlX0A~`*{4!`vFkz#URiE$mT07#J&&X zK8qc&Ud6%51+CcE9>?8M)r9r~81h*te;RcJXPKr!4`OjG1v+y8E)pV$D*TcjnjXQj z|8<*}dCZFd^Kj2f%xkYXt@L9j2dZ^btk1=3omrqdTVjw7Ldr{Yz{N|{D!3g~ZoCL_ zmAKtz`mD``BbGC^qse?E%=hz|^0d1WIs5r!zL0jyz4RwM9j?T`bT9oePp2!feIu%@ zFN6+Y;V1hs0ylcZ)8$I!?46WlbZ)F0ZIasO>2@VBHR2YWt3p5l@dR@vpd- zex;|^mALh$f!h{!$gb@>r3XBHuEec3_uX2D;x5%a{jS8VH|)$<*Wytm&%o`950+-F zuyPkB*4=}y#I1LrM#S{00Z(nkJ#@PqZ7m}52#fCF+nHxZ;H#JBOK3deynDozxbYFUmlhW-qq}o01O5A!U z>D*O(p4pr|W6RtVuEfdAZf5(Jeh0Re`bopDy_detJ?To^dhyc!Cv}(#^UX2e%4cCN8#g(}A9;HYxwO~Lo{snvK$Bb21;?_Ik zqs?Tb@kE2McDopKA2(Mzcs^>4_1kr2h>^LvP0?<)bz`-$;Yw`ZXft~p0gJb5d!oYF z{59%o82Q?@9|){gl~SFdrDY|9@P@J z*?v0xGLUKg_SsQDuhkOUHzv+DWNY8tCnUY@b{$6MOENsgo9(5)uGQbZx>5IY+r9J` zwFd1r6S9o=hi+Dgb6Vr=@|N??)6H~EYfZQB*7)m*x86&CLW^mMf0MoRN42#>7^LThd+FC}ZMRjF^^)Js$}+08-|ohi{dxu| zdZJqE&~7t%$a&&v$I?r9b8x(rz;yzxD3lL#|;hv3=X|)VCs(_nYsf-|ZUF za)$W1F*CMbJ!$3Om}^|iS;EW&-{4aa9EjF|H^3`N_vmwugVQcL{$d+ArZrnJQWzkBHiT+=t`xVCR1`_J7=e^s5iL2sPa z`fKl{Kcmj()|ZS5a-+TUC-G5DPNm)!Clxdwz*9}+hvsrEcEL3mGl65}z&Qcp*c6phA`Ob3Mx2{B*+q z_4~g(a5E3IE;2zIQbpT{Q_;pihe0Pnhd^gQ2SHas2S5WZ(bf-I4cZ4<2ignT2-*W0 z1MLQF1?>Xu0PO_r2JHYH0&NE!18oDH1Z@SK0Zo9;gT_IZKx3e*piQ8XCfXW7b3R(#|0a^h%4O$L52U-TY2wDod4q5^# z>7uO|Gyoa~EddRHmVv;uS%v>J2#VL03TAK-WQAK_w5$A5;g8g9bojpp~Fapb^kU&_2)x&=Jsj z&@s?D&M9l2#5G&_0iP-=iX19p{(`3spRBQmS&;2!JJ_A< zfbt9r$&AS?q=-!2agh1hZt*!$h1}1In2#xhly|WZ^DvDmau7UFkt7AsQN%*xVRir- zffjeNUGhERPLGf6N4z8Q{m`->vK_K2``IqVV0W;)5btg!L~+G^;yz75OjTiQhp2EG z!ZrW%w>uEoC+-#RWOpOcyAjb4&oU$RKg9OP4=X{0Lih{v{~@J_K_gd0N>zhF!wzof zF19PVM?_YUg?rgOOl6@rnI)TFD%*3-XY)1 zf}#ic48mST-Vc@J+q>lBobFLiaBEfQ+|BM3RZ--g4YFMxStKtR@(#qMnxHD@HROWV ze>64mE>ZSr@c3??w<1bGyaTBM3C=#$VR!*PEr2y4S$<92eTTS5*2ECk$Moxq=h+PMp<6~X60cIR8v975s_r2slro-5RI$bTv`Qc}*74-N1@HiYh(=|CziU z;80&60;Rpgj;peV*OZ;$pgp6`!wQtAp;8T@)b14h@cnLHHZsbJ>PZkiMFFg*F0BZu z79q#zCdJ^JhH05wTwO&amtxB8HtMn;D%9Jvv7=nM({-ZD} zW@W6AHL)1$XK{O%Js>>+gI=$839|V5k79_ALw;{PJAs#(@OoIH2tU5|#?RVVI~!!h_7b~I3`ie>?rW`tz4qf0XC--9Z@fWje>!L%vrpR-(xMzuI-E=D zhC0JY@Uy5A_c{y83Mva`3%Uy@3MUIa#Q(V$gBQs*ee8 zVrvpr_*H=Qu~mDO54)7e!mrlsQC}&FSoqbnOa*OY#ga**Dr$q1C6tChR26-wTxHHd z=a6&Vx$brPbYG({s>-V1Wh?e!XNj*AK}8k<&>g|0st935#aQBss+wOYX6yFpyqUc9 zJX@e7SRSkm_64J=fvw0`muJ{J?k$l7dDC7B6H3*n>hTM7+3y@ciX+Yqr&sM&`yuct zLKzzk#DndK?)M1g%qgzxlDpbn;+^zO`6fkjP6Zo59SkZ0UGx_W6hzgKB2+S6Y|LxQ zi>d{xP{k&S=8Be!R*Pn2LEE%fvoV&id&R!I_Ha}!@(b0>D^55E@&@xZ^D6zL{&9b2 zSR>a&SXABN5h83OXv?>SBH_kxQ#g)DJ2fH7hV7HiMQ=x5Cz9Ev2(>IAjyt2Savep{ z!0K6(JF4EH3iYhhJ?QTC40&c{Y7q^n;dS=$IIG9JW0CUF$`WkV z8&&s-LV_*ZZIYmF+FRKG+px!d9lkJG*2Y>{92H@|D71ntda3tSGA9D+--# zum~SA%3?QKPCazpC*o7`W&1a%X?3${w!l`{D%)V2tN{g4ulJFH9yGEERE+y&0hprA zq7}+oFY948sCWlHB!&v!I(ykL8)f6@TWWdlGHjo-<2y)M>|?zw4DbO_=tVQYH;%H{ zkLFbc-a&lL%+~Dqm{Ar7&~;71{=@j}8|?reFUsN|+|>bGjVO@c@bRH64xu9&0`Eal z7=$lI$jo6j#QKoWcgeyK3+Ki1@L{1Wj=-dGAdld?V6*^yktmC!a9TA|If_q;;U#=h zD2rn-ydJ#c_&^x7AD<7(;y7x0A9yG5Z8GXOKKGTy31qJgyi=kujw(DsDNnKqwuqD; zl7$Jj>KrbbBIGoiWUZ)&56i+No6GAC%;C1NX`g0MsxPzfb_43mBTSfP^Sq;)WnOK8 zV`f<&VdfaIqUxhem}Qv7qrJ|t9&L$Z=GZ7<78tRj>TfY&jxBQuSmg6Xl;#}j-f1RK zu~O_s7Iv?4%pxlx%o5aw(as)Y!XjJam?gGhtaHo~3lL@*uMBS(QS~gtE9@H_v&_8u zCdVwZ39@1ZNqhCE+RTJyhV2EA&lOflu~(6FJ5qR@2`fzEl2tZMan?}N$`R*%Oju=q zMdq!sc!85c)>tJub{#gwQS;6*VU2y0AnUB!^DR=p&RR+R1|v>XJ<$vP;84HpT-xWt4__Fd9xv-f-WHdHoyHzB;76IHJ;!DjzHA-wj4 z{sYqCwJ(zL0Ov&2Cz#;1ze0$BeOdpZc`;tNPM9#~Mb#&n5I`6EK~X5SS39HXheRA{ zSC5MiqvyuG-su=|jyczywXT>e?kdrr5PX~VGJBuBQ;IlZ4zFv{umu01+!Ffg$V)i~| zTJ9lu!oE&PCG2r~4{j76V?rF7`bgAjUm;N|Fm&VjI1>`~CF(5OAc~^1`~*5s`=GNz zqH<`n7ppV8E9I9_^;76dahsecUWc8=TT%7X=t}J)&S^P9KIyd2s}gy))81j9f%sV_ zbl7z}sq3^idVfl{nofJSeZk%6oyM-O;CI_QyrY!&Zb+KY+CIaCPCFlwb=wE+>-J@7 zMOu?u9Wf<=!Obl0vWV4Vukh4UtRAi{sy@erZqz9m+3dATBQhq3H$9E`J*K42W}xhs=mmCJ_tuhIAE_1 z&y#QfxJr2PvrOoRaEOG1_J;5x2?v3zgYXaWmAoC5&koau?ZxDtVW2kPp3mVsdwY;7 z->`kf9uS8y{up;oI*0HeXdYeC=Vf8oJ}){^*Z&wjt-V5;mRBi}aeEg)&@_(GUkAir zU;>7L@)`*z?3>Op5>5a&2jLf)Fb-jWESR)Qyu$@*4#xcn6DA-kCef5#C(#rz%Mg8u z36u6!(lZTFBg}nC6sGKR>d&Y+r|nA^Xby|GoUyN}I%R8ybEE2)(IX?rBP5))dkX@j zb{4n|sQn6dIIz#MO%l%8t6bF-a}Kx)w8pQZpSHhBMKx#dDX1@uP|SHAh^k)`g*kh@ zIf|W!znr2j2E;CD70nz&R;(NXykMWVkE3&XSr+E){YJ#Sz~>oY`={kfsyd7IMgJ_d zpG7-yqw3euz1tT#Y|*|3ST(_x?Hm3Df-NJ)8eo5c9v-da8=|mmuM?x{Ux~tsy&f0e z6oplL11`R$2saPd7+ki-!&L)4_6&OPB|Q_$#cBD6kXDLynC}Xe zxS_TZx(Z>D2~`NUNpM89IO4CPiA*&jyb4ByGca3;fbkk)L=gkilqg~piwM^uj0p-6 zg9&vYm@3qRU}n&OIIlxVqqym-Q~gY61mg`vYJxn7z74@2q5Nawlr!$CQ$tLMfi=P4 ztGGCf;c=(G$KUJk^Opt614H3DtS||2Ag)740y>J&t0DMP1X~f@!Gu->e~w@qf;*Ye zhTs%+hwTXOVnRE@(-iJN_zrYf2>$}XP6T%|p%cM35$r;64-<&oiM|GTZK5jNBkImN zbuaoD;NGG>MjTRBkhOj2O~CpUqV^%qe)Jz8ccG^Mxf^`~giDm{Aj0>cBLKOV2}2`5k88xh_I8wa|j>D_z2_#6XwMkOx?g< zK=>3|56DAk9YE`ZUPAa`jCGLAEG4rnjuh6>IBgjSFCkWecod@+gaZ^_Lm1<)HN}()>8siRxJ1A_!g#R%NCZt)`Nnr`$vrLc>?xnC3;btZ{5gwqhj_~75&=DS_uovO? zVW@%rvy{>cAdDeV0O2wUhY>!{gfPP86fQ>iA`^-c4pX=U;Y$pAS);3@a4Eu9m{5vv z35ClL#!#jV>5Wo)pXF{uel8x7Pto1{v9+m1

    xS2GBQ(Qx=>m@v^+si< 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ǪQ`XbA zT_jBq80}fq<5g4bR%W&8(W6<%vM{?sX(+7_Ly~FuCNS*HvPjf|L+BT&?i;gaq-UYR z)~qwx7vMXY5!;c^i?Ac>)h9`}S=HVPaHq_OM}hi%q#VogXV;LNLX`hD((mc4Rw}|! z)^OHoUZ&x!4h}s`zvr@!@kl4(T*#WqI!+IGUuV5dLQH3!!Z&F!i1yU#VteAk>gZ3Hwlw;b_ z=M1`~6~uvfX8G7j*JQ|{9qcXng;MD|R! z-#5g0ouR^=RkRWBjPwdhPNOz$)IF(8DqEhFqmZ|}@LJg{w>MnJkS_52Q`jG%9j4TwW)j;;qV<89U65V2sPmnwnJl7*z z2$31-mncdAgY0^Q6>5pJ4q*`KzlDDHsTI~~IM|1>R}qa4wF^S@z)@2IFVc+IiEt~z z6KaiAEdsxvdvEgW!zkzx00w|S^)jf&NE2t&F6$|K)Kly`=PQQ42$#^36=3+jYAsZQZlSxSW+1MIw>WU`vA7OO=nhtV6Zpbl$*x0ax%(bFnj3tr=@TiOqd z^XduPNn6l9?Wk}CJT;yP&tP_qnJVmpn&+7IxTX7074%NNe3$;p6fX2ID>AX)mces1(=Hlfz~RmgvG7520fGB zlfG7oOs*7@mO5k(TF=`q*i3da3@U0TG9iZ&(L#OrY)c+i}jx&oHl#g4<8}|(@ z?VA*wus)#$PinzaT2Rf4ypQas&pL{!dkxk7fOW(=VV$w&+Cl^wu%5F{TEp~siX%k{ zX%N^KfHr9z<;`^jSZ+rcBW?x>D7^sBHmG~X+UgiEFM$-fwpPxtolKz-Ro0vcZ*&IwthDd5*Vx1MMti&cq>Ap0TnD>&-5i7Cfre)N z_6w2?Lp+T(p@;Mgd{jg1Odw2k(~TE}AFqiS=}i=oJbw&5j2kSY_94$1&#gAJ|1dKc}}hS=yRUuFZF5njJuD!d-I%b=`+ACz^iyF`vR9?f`ltZmY{QzSQg`9 zAHgZT1nJetbO4!%=ydjs^dhtnbk6Y1CM!C;sM8D=5rV_cPN&5R8m-Qwcs%aZdX-M6 zA47{(P*9Dh&vO=?R&F+TR(3hhI!&%z7kL=T+dk&@dE7)%@X>FVGml67^gHNW#Uq9E zd)8U31?#P7UnB5xmC(bebHe#;vaV6*XX-f__b| zN*>uozqzhzE82?RRSL0#u1a`XLas(vx2w;!k4jg7XxMesRYRpNz{4?D$clm;(@4G$h*2xeGh98cUXbm_K>LiVk%+7ZCXKyMxjs!& zu6JEWzVD!`+SQ*u>b>AS>^ttW=bX*4c|eH7I>SlQ)9J+15y~2N4Repiao5i&dfYX_ zrGg-41@Ru&IUer^8bf>l=`zB8Dm}tet}zZjh4dW6hg_H>poN@)VV{L*515xC^^EI& zLLPIqbNzLYN+w--?gIB=D$S&8#$|T<+{NyrR6$d&T=#cK119%A_oO)o&YE;cXGPNDROMgg5Oi0&Yut_QlLV`DcXN~;`aS0EC6ym@ z9|zHs?rwLFyPrb`h(N!4(0z*F{q9rl)9y21d)DouA=tRP%X137#c7T_M95?AY4;i9 zVOV>Zai67!aWtqA!W?&>qXLh+r`%@GC_PR9Wbzb9$7sei?Ou<^VtSl$mw0%GYVwq# zqnz}d%AU+F@D2M)asqHpQ?oUB)_Y0-4WgMedWJmXz!~TAoF}F}fG-#i6WT+GXObRr zk#CAyCMOW^Op_?9Kqusxq4Ywuy$VEV+>ef=6p&NdgV`70kfk?w$aC1!kN8mbNOr$> zz&q-l^700H(o>V&k?r;tcuTyM-jKK5+vzpiP;kLw1K*R75-U2|gPR_@@EY(L54qZd zJv$FxN}=0x+B4(v+aOL4e_5RM6xd)Qy`E7N^*nloRp2S~;bGD<<(c-FvU9WZvi;eZ zLlPeK90c%Z7u%=`@lr5l`+!rCy`Ja~cqmdr^iN^ZP?)_wy9N$SvQf{B^h1PGo&)5c zp79jIM>>%`l|9Wz*)!710On-}c)==2=o-v9g2qFo@vw^?LI710W+;1~5fAa4VTyKu zbkulgG#*;%;V?iQ9P=cE~08=r`ocwL>}@sdRGE1Hhf~<&hMP;56X#lN600If%uB z0!pVkJmp(O>FvNC=Cluhb}wcWs4r+>%va2LtpC5AT@P4P*Oh;~f4ukRjSfTyOvQ++ zMzTUB)g-#2K)_~FF=D_!tt1Y^n{jl2VHhl=Wj{zm8uEp1uyGr+G1W9=V-mNu4f~aB z*)L>E8`H&>ezmD>+>L2yL$_|@Zfs&3ulqaq&4U3M(r>@{-k*EUx#yny_uaYo+;ixz zc(3q*Im27Tfh82P&|8Foq#Wzsw6eJtp>l5*|0h@k7)@Nty*^G};YRILduzPaJh+R3 zZQgdTp9d`pc6)ohVdC23J>)&?J?3rVxE7Lj*gNVy>pjO=4`VU=VXz+Y_Hl_u5e_0e z>V2D98wDTa&vOcWVa|HnIiF5S30tvqt$E%rZQ`i`e;D zV?2@ktS5Go*IrpHL^H>)G=+1h!;y_moY@qg&6^dh|@STi?cdaCPZ>Sg%fnmw8ApQxEH9+9ADz9maJ` zk5a5Y-B6F~+1hdaPIg@1srBg%?1cU(NqgI zR>$>11#dlyI-(CM>^$AZ^#v+!xhi0}Dmdk;#<*UsvJtwSr`shGf0b}qH-$9ARIli! zc3EG@uIMqQ7#)j+s8=_(scvJN<~IJDP3*vr-$M?_X)?9tHVDvWnktbt$~%Gf2c3L`ACN@EY$XIjRCM%Z{t4I4jY zmhnqgZ@fiKxXJKnErtjGIOnNt#unCus|6R{RlEbY1-KaCF~DQ2-6#<~LbSBYSg3Uw z>lrSs+vpdey^=4n9;07YdyFClZ{-T!+7#Anbg61D^jbih=EAMXg_tMk?J~XPn(VMq zOci*q z5!rd;q$Hd-E=p{Sc)cf#8}rPI#ystUF%PRU+tdq2lwC5u!p4pHBD+Yp%S0#$_?IIn zm|`iel}vH1mUY)UQE{zfSBx^IyULi`RZOyFxKuR*-~|*Egd7)LUbf7&=QhnF=D9M} zJlAI#E<9gjMK)Cls7gTPb9LN?!rA3Q2dr_el~lY*%yLyqn&qljSdHtL%9>nI!B{M| zxJ<3xWy)spO#6T+LsUe{LE4e5Gt9d_-Z?DQc!M_ib)xe8dHYa2W6I!fSvfKLE?(xr+g zTnpJrTqj&N2`50(@7m1}|2oSBr%vQ_IY|Uq8 z8ztsuR*uVus|IL~NA#PTV40d2HZ|FAE@u|5FfJHt5vl#Qnd`N7b3InGcdMP|LDp%$ zhUZW5{Jq+4E)!Xs*)1W2Tbns5Y29YGtah9E3W64TkXekzAz&_r%gb=inSz*2;qtOR zJBay|a2&yt<{lbe`b|?EFioxBT*n4*4cb(gSz*P;V5jUL=2pT8f@ka?W>>;l1kc++ zOsRx1^8mYG9;J`i6|+Uu6!#JQ>vdxvNx_Y!xpO6U#Vo||Jok_!c6Q_63+npVd<4syLk)D=i4F}l#tLFq^K}nAyHbuOoMsh-8v<{1$jJdvAxy`b&iHIEbpoyLp-Zk)R74=-vJx4#-6!<*j6%I^5Xs z!IVg4;pV769@zUQf_j}u@IdT`H?M@{=RXr}o`c(j6L*fZR|un(G&hGs4OSghen=~> zh8VX;V!NMzVMAz6vCU&sxB)V>jqiyLha_J^fRievG0VR{5zE)i&Bk1MdH?dzTqmuB zQ6EOh$mOkJvKK{3l-R_lyT24oBv{fM`dR5WSB5mWgoAj&MxqSVrK5%VU?PU1>329{ z@3`g9p8;-1xS_7`^W;J=s8nr(?WC5gLyH1+$-V|daC#Q!1^e#Fo%e+_WUZ_EY$a3n(c?Y;L0KSp6EpjB3D{H~UG9|1Fyfp=Kp(BAkn z1c#9}&aZ%ocZBQWd!GY1s8uBrt=t{^Bt$^(fNQA;6--E}kL|LW|F!+Mg($E|=Zhg2 z)o*V0hpe(l==8ExKS#;HsQ?00f#3dN!w*AxeSC*M)__ssubU#D4H^l2X}qD@|Cz1e zTMNFY4d1Ura((TV#!X&iuTptI@;E^9h2F+g2M$n5DzYIO(v zackbp*p_%Bbwn>==S`1G`O2CxNeE1iC_X{RoaxbkOcY+&YF9qLigQ% z`(|4J-WRU-*&~C~La7T<=f@xwdEsq8rYg>0>`*NE<_#M{nFZItl`mcSJFv%;$}ta& z&yWE_4~gKb1HJK(i=3w>0DV1;KR~fmmD&;{pj&G`NGIW^fj?DvW*7Q$g1h~pqwkzM z!Ow==^FhJY&>SZX8&>iovl3$@%@7*{^l`>Fq^gwOcN{!d71D^BLhFM6@+@ap>JRJ> z#mL84_-NTVo82UAb9@Ot2uZGRd7Q-Xio*Zi{F}dK$C-qEeSGeC&_p^D?omIN_MMwU zZc2IrwBgL74{)NbjnS4U8U4MIexqs=O@Q9|mAsRe8Pzj=l>FfaEB3X)+YZ}hHU)fN zulK)rW(k@${FwqfvlM#g@w^V6*r$=vC_$Pl$9`oeHUZkc?BDW(b0A}q9pU?fD_4ZL z1KlK`wa&PYOEtv+vz)R0VOy#x;NQOUsW&;-#5a`^|MlM-|B=l#3HXD#U#9O5{H-Qj zk**D$d@)exLQTS_F_+nC0o0)FPhw!{Udb;0N!X?j%d0sf0#UrHHAfx@nN<1?bp!bN^E3lTAGNOpzSu1}vJ(5EsZ1a`W0D@3&NzKND8%3s?%x zrkcqZdh!%^uP0u6^Zq*g1H8Ac@aBTrXawLN$a zchHWwWDVf}N3C&ClX*$Zc)7)d)@b3a2`}qaaIWO%xYjU54XjE0eeL*IH{zS%RNJmg z8m;dPOz|7O1;|8_Kvn^nG*hlaFlp8r1MTEo^#G7b^U4Q+oSZ{GG~ILe!3oFRcKwnl zPlIU6m*f|=d+N!t|1HFtK3x9}2~7^f@7W=00pR$jz?x}YyByxlC;OG(3Gx2Wg3yeu zw_6OrsW$u#risD1E4Wkb$tHD74BR3t25Rn4YC1N)wR|CU>d6W2)MiX{d*>G412@>* zQ2{kXZq{=u8ARW=B5xKxG-aHe8}rnKdpkB}Ke-%kOfU-$!sEccWX}uB$#q7dL`KE; zU0uQ5lBP(TSWkRFO5&Wi3Et`>OOkm{I%80i-JdR@bc&pGxGS4k(&1C6W}buxNxb<` zWJ(e;N+qxq3pJj_PFq60mcTIwxr$cFqe6v~)U2iD%s_a0Jh=`e_w#AVDI8r3=R+UD z4Y>Uu4vRI{zqdpwp?`w#>f<5Tq4vKFt8O{Gk4=>f9!z$UWCkSjJCfzkR*xiE1r}0T zVwU|6l1uk{NcZSpEM0nu9hH~K)RKZ6osJwU|3W$VKUOZr>OCDB5B$Yqs3kn+%u*aq zNU?k|?;hx$vvrY%xlts2lj9{L6)Cz&bj8Q7bU#h zKSIn5?eR!_LcTcMMyshFhtfz7bcEy%5zs8gKx4hrmOc(&=Dcr=`P zvX>)29iDlvw?KX-{QsNkx#edgt5O*Sf^TcnEyMhd2(vhN4&s@E=K!8C57RG_d6;LK zaMZk45y^Um4Eq>2!HR+=E@3NVbV z>j3tNg%XZh(#iTZF<-(_&2n)kQTW7T;@ zf|JW>IPVHRqc|2#fhGyMeiXRCgDpfnDz*{yEQ;+SpqIsV3ZCO6mk}qp8;r+M6QpH? z!_zPY1Z_Vcwo!_g#E1WuKW?F-x(u-&em(ILd;o|v)De|PH|5JMEt7iaB?B+LBpAKq zq2LcuV1bm&1HtuAintaBh5P8G2rtJem-MnrIzjQvQR~$R1W9eG zQtBtVCaFgmpvr5PsJZl0D{PYnImaO)=mNiC317Qz=`hd(IJrD3og#KUz#IqX&r&{n z00&Vo!u`?^VvI;1QBCx6k{YEOCpw=c^{hVWBZf!6bQ=}OAXt4gpGs~>`e+$FN2D{9 z>?NsPIn4`DI!!GnO+HIfrXkLJ`HX~v*3cZ4p?XLtMb>fRxL)p*PtzF_MIIws1=Q7` zMXyPdPt);g9kGGXf$9VTXPXuIbS4mP`640QK-B|*)783sj+eoC%4rTiL+q3BQHG)( zg?tLcBhCF~0Fr!pa?>?nXfie$&Yf=74D4$~4Vkm9=S)n{g;A+LkgVo9&3f3t0(E+~#4KhUc zE9aCvPT*Gx6VFPHv2ftKKJj*5S<7*j(wTsaDZBVv7-wpqqOxpKS|C%q@*7H}N$KGy zc5EO&Yu?ElP8lga+OH*?W2bT`@qCmbb}O~?IHqt-yFLZl1yHa&3nA&i?znQt)L;%3 z=_Tc{mkT9q+|y_@2i=6f`XnfiN*$VKRc57h6Ass}S1YCUtVRlI=r?#i#{AMzk0&ZN zNlR5rT8hqci)Kl;uy(1+Xp^2|P15)A{(aUdb$DPFrdL{`bxBKvL(*!sOIpniNgb>g z*I^rd1gPU6IRW$$pidx?JS` z4NIl!h;%2ycj6HJJ$T+D4C6U0?E^f<&PpAmo^Vc5)$`JF^&F;6=cQJ<5Pp!2NqbNR z0$QPfHYi?@G&U|}vWs?s;1h_Rwv`y@vZ^ZhVk`0-=9YORG(iD#7%@XO*nC_I_^Xj)xtg!eehgj2$?8 zeRM_#S&$MhSNK!QN2yaKrHqYrU7qkOXn2+lwCJxEBYNYyy_F$19!*UA{ND&y)mE! zNc2>4X{As-o0R}M2m5F3E<`|0CS?-DepZ6|=GOX1U1LfP>g?$BofVsD$Vw>yZF@AA zZ1trgn5u-5iYjSGB_#Jiq3bu`OXFHG5ewY%f^nqoea zGNTwu=xde=pMh$KHa4JpqXm;jVJrpZUMUt&Y*_~ON(TZH?`mBj(j4cCh?t}7)o8v) zTb!7&(4-~hzGp6NPEKryrriCUMmBYFHo4V#!&Gh#8O`b@iEf-mgr(2KT#u$S7$hRL zKLjrL8Z&w33J`7X+1sTE$k-U1oJMLB`=vm6Qf&KW2G-0p2lNKkq@40y@9YJBKh&`? zH*>|j;u%DC)}66?B+{~Ta^4-B2|KI6O`F>~*ldo)n)KA!`oz+-@f0gY#)R;+%9vrt zT6}Igkt2>ho#vI%BR(JgxC-kQUxdl|DNSUi%yWKS;y;D8#O}D&BYrDv&~)8anCce4 z9iFk+y2O`eU;FIBBBvi~o!xlW;Ms%cE_>~>ny-C|RlS+LqPSf+D124ZJou-1XC`i& Py|`_;9=ENJ3I6{BL08a( literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Lib/D12/tb2kdsgn_d12.dcu b/official/2.2.2+2.4.2/TB2K/Lib/D12/tb2kdsgn_d12.dcu new file mode 100644 index 0000000000000000000000000000000000000000..9638efdd0c3e1db857942322d5a02d6aaa3f3efb GIT binary patch literal 4606 zcmeHJe`p+45Z-T_-c7ETnjC3Zi&F;(HHha6* z-Mus^B1MXb6m4rMQlx5WMMOkIq=<<43lR|!kt#)`h_oUiA|fKu*-N5r=-dA3KRI~2 zdvCsZ-@KW5Z)T&Sw9m9DO8w9Sn@(N4?m0zm=?uoYCQQHVJY=rzn)&+P<1uBk*LwM6 zr|FIV&A*t}-r2dU=+-?$>?-wk?GWWo)9@~wvDY;%(C~!6mnqcRf`w`m9#1PGR-E<& zQB@SBob0z8-M04Yf#o`vcGo^MM4Y9AjukY--38s4(90t4>gMV5+g>OypPw0a?D;wB z4)KMF^1;=?eTIn5TF3f^Xyfl3Z*P$K`b;ZuJqc^;95CxTlfnyx47cJ+-1b^%xZmKS z5#6(NC-9+4cDB=UOn0ADPQ3Hsz_R54W{3pDOVhPMXWW%qkhOK+7jgo2WWQxc066TH zA9&L;2HN83wTflPDTeBHU=6vBbcG%xaPmwd12hi^n|B$EOF3fwwjLCFWeZTjvm6ew zRG$Ok7~9A8NCENTsZvE$g^VHAkV@5Kxqa21nkCb2Zul?^vi9`59O?nClx7zR%Z^l%y@IH*N-D=3HZ<b>fUUU}RgA;JSuJyFa~RV|*TowMU3zp^75LnZb7*p6T<2q645n=n>O?04 zdmuDjW*7D9eq(P^Ku-7*k;f$jgefCmf%zi=Re!2#o33<)ShP4kI+PEuEU5t{mou`b zFen4G@D{AHGh4&t`7)BtUkkzoY=rMVE?Y9LW`=O8RON^`BYGT5?u}4x7&3xTJ*>!4 z@&VVCW<7aX?YR&QM9Vs)~_L&NqNzOE@p;Xowc{hF1trs_846U6wX}iIX$k;fFTlw6~%{i4o)uWHv`Rk6>co?=}J7g+o)dSKB5iyru&Ja9JTeZTR%xbX8* zI8hx|m1I>VR8#|ckpI7E1oaF}p(0LKW&(|Cq(g77TiB;k3&DZ**O zi-ea5FQ@Se;nfOWBfL&{gYf1CoF%-a;cdb@gm($=Y50Kfk%o^6pAbGJe3r)Ngf9qR z622mwBYZY8~IR~(hm#S$r z^Sgyd8;=z{uII6e#~L2D@VJe~og9m`{Lb*$$m4F->mX=^6rp_}xmQ&=UWsIV_N^uo v$?3VzWFo1m>T+sP538jksUxa7q8wG8CTdkwWowEb`3`<;Tgi{YF-89eDZWb3 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Packages/.cvsignore b/official/2.2.2+2.4.2/TB2K/Packages/.cvsignore new file mode 100644 index 0000000..b86ea9b --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/.cvsignore @@ -0,0 +1,10 @@ +*.bdsproj.local +*.bpl +*.cfg +*.dcu +*.dcuil +*.hpp +*.identcache +*.lib +*.obj +*.rsp diff --git a/official/2.2.2+2.4.2/TB2K/Packages/BuildPackages_D12.groupproj b/official/2.2.2+2.4.2/TB2K/Packages/BuildPackages_D12.groupproj new file mode 100644 index 0000000..5cf3560 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/BuildPackages_D12.groupproj @@ -0,0 +1,48 @@ + + + {77727181-BF85-4972-B742-2E2510006578} + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_cb4.bpk b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_cb4.bpk new file mode 100644 index 0000000..71a7b35 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_cb4.bpk @@ -0,0 +1,183 @@ +# --------------------------------------------------------------------------- +!if !$d(BCB) +BCB = $(MAKEDIR)\.. +!endif + +# --------------------------------------------------------------------------- +# IDE SECTION +# --------------------------------------------------------------------------- +# The following section of the project makefile is managed by the BCB IDE. +# It is recommended to use the IDE to change any of the values in this +# section. +# --------------------------------------------------------------------------- + +VERSION = BCB.04.04 +# --------------------------------------------------------------------------- +PROJECT = tb2k_cb4.bpl +OBJFILES = ..\Source\TB2Common.obj ..\Source\TB2Consts.obj ..\Source\TB2Dock.obj \ + ..\Source\TB2ExtItems.obj ..\Source\TB2Item.obj ..\Source\TB2Toolbar.obj \ + ..\Source\TB2Version.obj ..\Source\TB2Hook.obj ..\Source\TB2ToolWindow.obj \ + ..\Source\TB2MRU.obj ..\Source\TB2Anim.obj ..\Source\TB2MDI.obj \ + ..\Source\TB2Acc.obj tb2k_cb4.obj +RESFILES = +RESDEPEN = $(RESFILES) +LIBFILES = +LIBRARIES = +SPARELIBS = Vcl40.lib +PACKAGES = vcl40.bpi +DEFFILE = +# --------------------------------------------------------------------------- +PATHCPP = .; +PATHASM = .; +PATHPAS = .;..\Source +PATHRC = .; +DEBUGLIBPATH = $(BCB)\lib\debug +RELEASELIBPATH = $(BCB)\lib\release +USERDEFINES = +SYSDEFINES = _RTLDLL;NO_STRICT;USEPACKAGES +# --------------------------------------------------------------------------- +CFLAG1 = -I..\Source;$(BCB)\include;$(BCB)\include\vcl -Od -Hc -H=$(BCB)\lib\vcl40.csm \ + -w -Ve -r- -a8 -k -y -v -vi- -c -b- -w-par -w-inl -Vx -tWM \ + -D$(SYSDEFINES);$(USERDEFINES) +PFLAGS = -U..\Source;$(BCB)\lib\obj;$(BCB)\lib;$(RELEASELIBPATH) \ + -I..\Source;$(BCB)\include;$(BCB)\include\vcl -$YD -$J- -v -JPHNE -M +RFLAGS = -i..\Source;$(BCB)\include;$(BCB)\include\vcl +AFLAGS = /i..\Source /i$(BCB)\include /i$(BCB)\include\vcl /mx /w2 /zd +LFLAGS = -L..\Source;$(BCB)\lib\obj;$(BCB)\lib;$(RELEASELIBPATH) \ + -D"Toolbar2000 Components (Jordan Russell)" -aa -Tpp -Gpr -x -Gn -Gl -Gi -v +# --------------------------------------------------------------------------- +ALLOBJ = c0pkg32.obj Memmgr.Lib $(PACKAGES) sysinit.obj $(OBJFILES) +ALLRES = $(RESFILES) +ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cp32mti.lib +# --------------------------------------------------------------------------- +!ifdef IDEOPTIONS + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +InMemoryExe=0 +ShowInfoMsgs=0 + +!endif + +# --------------------------------------------------------------------------- +# MAKE SECTION +# --------------------------------------------------------------------------- +# This section of the project file is not used by the BCB IDE. It is for +# the benefit of building from the command-line using the MAKE utility. +# --------------------------------------------------------------------------- + +.autodepend +# --------------------------------------------------------------------------- +!if !$d(BCC32) +BCC32 = bcc32 +!endif + +!if !$d(CPP32) +CPP32 = cpp32 +!endif + +!if !$d(DCC32) +DCC32 = dcc32 +!endif + +!if !$d(TASM32) +TASM32 = tasm32 +!endif + +!if !$d(LINKER) +LINKER = ilink32 +!endif + +!if !$d(BRCC32) +BRCC32 = brcc32 +!endif + +# --------------------------------------------------------------------------- +!if $d(PATHCPP) +.PATH.CPP = $(PATHCPP) +.PATH.C = $(PATHCPP) +!endif + +!if $d(PATHPAS) +.PATH.PAS = $(PATHPAS) +!endif + +!if $d(PATHASM) +.PATH.ASM = $(PATHASM) +!endif + +!if $d(PATHRC) +.PATH.RC = $(PATHRC) +!endif +# --------------------------------------------------------------------------- +$(PROJECT): $(OBJFILES) $(RESDEPEN) $(DEFFILE) + $(BCB)\BIN\$(LINKER) @&&! + $(LFLAGS) + + $(ALLOBJ), + + $(PROJECT),, + + $(ALLLIB), + + $(DEFFILE), + + $(ALLRES) +! +# --------------------------------------------------------------------------- +.pas.hpp: + $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< } + +.pas.obj: + $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< } + +.cpp.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) -n$(@D) {$< } + +.c.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) -n$(@D) {$< } + +.c.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) -n. {$< } + +.cpp.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) -n. {$< } + +.asm.obj: + $(BCB)\BIN\$(TASM32) $(AFLAGS) $<, $@ + +.rc.res: + $(BCB)\BIN\$(BRCC32) $(RFLAGS) -fo$@ $< +# --------------------------------------------------------------------------- + diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_cb4.cpp b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_cb4.cpp new file mode 100644 index 0000000..65d5caa --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_cb4.cpp @@ -0,0 +1,29 @@ +// $jrsoftware: tb2k/Packages/tb2k_cb4.cpp,v 1.9 2003/07/04 22:53:21 jr Exp $ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop +USEPACKAGE("vcl40.bpi"); +USEUNIT("..\Source\TB2Common.pas"); +USEUNIT("..\Source\TB2Consts.pas"); +USEUNIT("..\Source\TB2Dock.pas"); +USEUNIT("..\Source\TB2ExtItems.pas"); +USEUNIT("..\Source\TB2Item.pas"); +USEUNIT("..\Source\TB2Toolbar.pas"); +USEUNIT("..\Source\TB2Version.pas"); +USEUNIT("..\Source\TB2Hook.pas"); +USEUNIT("..\Source\TB2ToolWindow.pas"); +USEUNIT("..\Source\TB2MRU.pas"); +USEUNIT("..\Source\TB2Anim.pas"); +USEUNIT("..\Source\TB2MDI.pas"); +USEUNIT("..\Source\TB2Acc.pas"); +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +// Package source. +//--------------------------------------------------------------------------- +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- + diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_cb5.bpk b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_cb5.bpk new file mode 100644 index 0000000..21efbe7 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_cb5.bpk @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + + \ No newline at end of file diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_cb5.cpp b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_cb5.cpp new file mode 100644 index 0000000..33d2c2b --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_cb5.cpp @@ -0,0 +1,29 @@ +// $jrsoftware: tb2k/Packages/tb2k_cb5.cpp,v 1.9 2003/07/04 22:53:21 jr Exp $ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop +USEPACKAGE("vcl50.bpi"); +USEUNIT("..\Source\TB2Common.pas"); +USEUNIT("..\Source\TB2Consts.pas"); +USEUNIT("..\Source\TB2Dock.pas"); +USEUNIT("..\Source\TB2ExtItems.pas"); +USEUNIT("..\Source\TB2Item.pas"); +USEUNIT("..\Source\TB2Toolbar.pas"); +USEUNIT("..\Source\TB2Version.pas"); +USEUNIT("..\Source\TB2Hook.pas"); +USEUNIT("..\Source\TB2ToolWindow.pas"); +USEUNIT("..\Source\TB2MRU.pas"); +USEUNIT("..\Source\TB2Anim.pas"); +USEUNIT("..\Source\TB2MDI.pas"); +USEUNIT("..\Source\TB2Acc.pas"); +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +// Package source. +//--------------------------------------------------------------------------- +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- + diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_cb6.bpk b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_cb6.bpk new file mode 100644 index 0000000..580309c --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_cb6.bpk @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + +[Linker] +LibPrefix= +LibSuffix= +LibVersion= + + \ No newline at end of file diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_cb6.cpp b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_cb6.cpp new file mode 100644 index 0000000..79fe10f --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_cb6.cpp @@ -0,0 +1,14 @@ +// $jrsoftware: tb2k/Packages/tb2k_cb6.cpp,v 1.2 2002/11/14 18:07:19 jr Exp $ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop +#pragma package(smart_init) +//--------------------------------------------------------------------------- +// Package source. +//--------------------------------------------------------------------------- +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- + diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d10.bdsproj b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d10.bdsproj new file mode 100644 index 0000000..5915d11 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d10.bdsproj @@ -0,0 +1,175 @@ + + + + + + + + + + + + tb2k_d10.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 44 + False + 1 + False + False + False + 16384 + 1048576 + 1069547520 + Toolbar2000 Components (Jordan Russell) + + + + ..\Lib\D10 + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d10.dpk b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d10.dpk new file mode 100644 index 0000000..450237d --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d10.dpk @@ -0,0 +1,48 @@ +package tb2k_d10; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3FC00000} +{$DESCRIPTION 'Toolbar2000 Components (Jordan Russell)'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + vcl; + +contains + TB2Version in '..\Source\TB2Version.pas', + TB2Toolbar in '..\Source\TB2Toolbar.pas', + TB2Consts in '..\Source\TB2Consts.pas', + TB2Dock in '..\Source\TB2Dock.pas', + TB2ExtItems in '..\Source\TB2ExtItems.pas', + TB2Item in '..\Source\TB2Item.pas', + TB2Common in '..\Source\TB2Common.pas', + TB2Hook in '..\Source\TB2Hook.pas', + TB2ToolWindow in '..\Source\TB2ToolWindow.pas', + TB2MRU in '..\Source\TB2MRU.pas', + TB2Anim in '..\Source\TB2Anim.pas', + TB2MDI in '..\Source\TB2MDI.pas', + TB2Acc in '..\Source\TB2Acc.pas'; + +end. + diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d10.res b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d10.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d11.dpk b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d11.dpk new file mode 100644 index 0000000..4ff1052 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d11.dpk @@ -0,0 +1,49 @@ +package tb2k_d11; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3FC00000} +{$DESCRIPTION 'Toolbar2000 Components (Jordan Russell)'} +{$RUNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE DEBUG} + +requires + rtl, + vcl; + +contains + TB2Version in '..\Source\TB2Version.pas', + TB2Toolbar in '..\Source\TB2Toolbar.pas', + TB2Consts in '..\Source\TB2Consts.pas', + TB2Dock in '..\Source\TB2Dock.pas', + TB2ExtItems in '..\Source\TB2ExtItems.pas', + TB2Item in '..\Source\TB2Item.pas', + TB2Common in '..\Source\TB2Common.pas', + TB2Hook in '..\Source\TB2Hook.pas', + TB2ToolWindow in '..\Source\TB2ToolWindow.pas', + TB2MRU in '..\Source\TB2MRU.pas', + TB2Anim in '..\Source\TB2Anim.pas', + TB2MDI in '..\Source\TB2MDI.pas', + TB2Acc in '..\Source\TB2Acc.pas'; + +end. diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d11.dproj b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d11.dproj new file mode 100644 index 0000000..7237486 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d11.dproj @@ -0,0 +1,60 @@ + + + {42085cda-8f18-4859-a681-a3109ff5e295} + tb2k_d11.dpk + Debug + AnyCPU + DCC32 + tb2k_d11.bpl + + + 7.0 + False + False + 0 + RELEASE + All + 3FC00000 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + + + 7.0 + DEBUG + All + 3FC00000 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + + + Delphi.Personality + Package + +FalseTrueFalseFalseFalseTrueToolbar2000 Components (Jordan Russell)FalseFalse1000FalseFalseFalseFalseFalse103312521.0.0.01.0.0.0tb2k_d11.dpk + + + + + MainSource + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d11.res b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d11.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d12.dpk b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d12.dpk new file mode 100644 index 0000000..41f57e6 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d12.dpk @@ -0,0 +1,48 @@ +package tb2k_d12; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3FC00000} +{$DESCRIPTION 'Toolbar2000 Components (Jordan Russell)'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + rtl, + vcl; + +contains + TB2Version in '..\Source\TB2Version.pas', + TB2Toolbar in '..\Source\TB2Toolbar.pas', + TB2Consts in '..\Source\TB2Consts.pas', + TB2Dock in '..\Source\TB2Dock.pas', + TB2ExtItems in '..\Source\TB2ExtItems.pas', + TB2Item in '..\Source\TB2Item.pas', + TB2Common in '..\Source\TB2Common.pas', + TB2Hook in '..\Source\TB2Hook.pas', + TB2ToolWindow in '..\Source\TB2ToolWindow.pas', + TB2MRU in '..\Source\TB2MRU.pas', + TB2Anim in '..\Source\TB2Anim.pas', + TB2MDI in '..\Source\TB2MDI.pas', + TB2Acc in '..\Source\TB2Acc.pas'; + +end. diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d12.dproj b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d12.dproj new file mode 100644 index 0000000..98a3b0a --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d12.dproj @@ -0,0 +1,131 @@ + + + {1EA50D74-2EC7-4FC2-AA38-747CD0E9BCCA} + tb2k_d12.dpk + 12.0 + Debug + DCC32 + + + true + + + true + Base + true + + + true + Base + true + + + ..\Lib\D12 + ..\Lib\D12 + true + false + ..\Lib\D12 + ..\Lib\D12 + ..\Lib\D12 + ..\Lib\D12 + true + Toolbar2000 Components (Jordan Russell) + 3FC00000 + 1 + true + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;$(DCC_UnitAlias) + x86 + ..\Lib\D12\tb2k_d12.bpl + false + false + true + false + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + + + + + + + + + + + + + + + + + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + + + + + Delphi.Personality.12 + Package + + + + tb2k_d12.dpk + + + False + True + False + + + True + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + + diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d12.res b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d12.res new file mode 100644 index 0000000000000000000000000000000000000000..1bf5a8cde9d53fdd3331574c057ae8eedce8b643 GIT binary patch literal 5056 zcmbW5&x;&Y5XWn?3mOsKgC{Suh=}Y#BIM$!6=NWvMvRkd6EwzPvI%i>@YMUCOb#N_ z2mb@E#T1Ta6vr`?3vhsi8Ih_nFsoJ2*J7wrSkcPW$1}Bb!%qBPRUrq&*$a z`O*IuA21R-J!8qEU9>*mi&xvstrdruE8gqQGo7U`D*vH91ZRK3|fP=M*vDRK&;V>R}!J+Ta-#B)!_^I}`-u2kf z{#e?j8~t!t$SdFKLw*cwYCP0g?d0HIeUBrb@_7Ay4fWq0c%aeuNHu5`3kT0~7Jo!B5SO>?{++6(0*Z0y?6DJO=5tpes*G{!pJi1$O*XWPDfyX`uhp4O1HDJn$ z4^6>g-jscoR>wCR(N(LBU#PY-#Z{`a zj6E^UwH<4TktzS2ei!S(2LsKayR}|1*$;f>Ze+qe{Qc15(cd<$_o=rv+6Q84u#*G6 z;4Wc{1AWaUK3d6*cOG5QPEL)@>(K2nU5vqjKKt+33t`XTDPPOaSQq-OnQ8}L#$3am zN1ms@{ums(;Nb6UqdYRJ!Pgl(>IY2vaCQ8JVu-Eft1#;0`jyZ1F5sYcCu~gXv-bV5 z_N#kr$pKDa1~z#MzT!CdU~&$kO^plBnS7;nb#Oo<7{33B+Z7HvpUinp``+N-ZM`3i zQ$yzfHa3g>cT91I6K%M94TR-qQQX4QKdG(SYaKYe!vnVR#hw=Z$)OtcQ*%>Z^iv<+ z>EJQ)PhRe&2MpJy{NTpjLVfkVfj>3ni!)qw*M-YWoR!P>yy(w8@_nMtiUkKPr-rjBUc`XU9msbTxss2H=xx@n8I$xOoP_=1DH=@EPMQdcCW$-dXo0U!gm+=ex^$2KKjXu8j3XaZ0{*Fwa=iPIx z5>TIUEb&hC$MIdl*+3(8<4&XxM?Xs%pZ=Ef{Vz3G13e5495`c~wbPhl9aCqL-wzmE z{P(c?s0q1G^CXAoorh<5!FS+sRNhHAoDDnqB?r7~J4GElt}C^WZuTbgWZtv-T#u(7 z&*gG-rcwFI^G|e^&0$J_LuCb?1}8K*nvED*5^QfJ79-qo7fYx z7nJ)|Va$Y83A67HH~ZJj?1HTCU$IZ@1G{3M%09HK^7%~v*Wlj_{hzV3#FUW@N zpELi5qwlwsXTz6mZ=c`F_50^8s(Ib6S*_2H>~poQI701sm(}L^W$Vv>$QQ;)@u zAz_So*FS#qforyJ5A3$>*)6*)f5&br^PYWe_Z0QB$6T z?%NH;e=pTH)VnzV?0QV*yrh}$>`TYGFU;FoyEnvMuoo4bvDX#*K+$8&yY`OI(-I$^ z`yRU|>^mzA-g5kpHGj)zVS8UZQG3h2(aLy&=NR{eB5v4MT6b6efqg3``9$p1l7p&& zo4o0b6^I&rrr3MR_E6gQR~VXViSFf?RrRadUw2(md(fysGQ8wOuRHH#HSVU_n|=~P R;ht9AQRH+l&Tsv(^)E;gd4d1{ literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d4.dpk b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d4.dpk new file mode 100644 index 0000000..c4b03d9 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d4.dpk @@ -0,0 +1,47 @@ +package tb2k_d4; + +{$R *.RES} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3FC00000} +{$DESCRIPTION 'Toolbar2000 Components (Jordan Russell)'} +{$IMPLICITBUILD ON} + +requires + vcl40; + +contains + TB2Version in '..\Source\TB2Version.pas', + TB2Toolbar in '..\Source\TB2Toolbar.pas', + TB2Consts in '..\Source\TB2Consts.pas', + TB2Dock in '..\Source\TB2Dock.pas', + TB2ExtItems in '..\Source\TB2ExtItems.pas', + TB2Item in '..\Source\TB2Item.pas', + TB2Common in '..\Source\TB2Common.pas', + TB2Hook in '..\Source\TB2Hook.pas', + TB2ToolWindow in '..\Source\TB2ToolWindow.pas', + TB2MRU in '..\Source\TB2MRU.pas', + TB2Anim in '..\Source\TB2Anim.pas', + TB2MDI in '..\Source\TB2MDI.pas', + TB2Acc in '..\Source\TB2Acc.pas'; + +end. + diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d4.res b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d4.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d5.dpk b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d5.dpk new file mode 100644 index 0000000..28e5be4 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d5.dpk @@ -0,0 +1,48 @@ +package tb2k_d5; + +{$R *.RES} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3FC00000} +{$DESCRIPTION 'Toolbar2000 Components (Jordan Russell)'} +{$RUNONLY} +{$IMPLICITBUILD ON} + +requires + vcl50; + +contains + TB2Version in '..\Source\TB2Version.pas', + TB2Toolbar in '..\Source\TB2Toolbar.pas', + TB2Consts in '..\Source\TB2Consts.pas', + TB2Dock in '..\Source\TB2Dock.pas', + TB2ExtItems in '..\Source\TB2ExtItems.pas', + TB2Item in '..\Source\TB2Item.pas', + TB2Common in '..\Source\TB2Common.pas', + TB2Hook in '..\Source\TB2Hook.pas', + TB2ToolWindow in '..\Source\TB2ToolWindow.pas', + TB2MRU in '..\Source\TB2MRU.pas', + TB2Anim in '..\Source\TB2Anim.pas', + TB2MDI in '..\Source\TB2MDI.pas', + TB2Acc in '..\Source\TB2Acc.pas'; + +end. + diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d5.res b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d5.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d6.dpk b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d6.dpk new file mode 100644 index 0000000..ea37a26 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d6.dpk @@ -0,0 +1,48 @@ +package tb2k_d6; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3FC00000} +{$DESCRIPTION 'Toolbar2000 Components (Jordan Russell)'} +{$RUNONLY} +{$IMPLICITBUILD ON} + +requires + vcl; + +contains + TB2Version in '..\Source\TB2Version.pas', + TB2Toolbar in '..\Source\TB2Toolbar.pas', + TB2Consts in '..\Source\TB2Consts.pas', + TB2Dock in '..\Source\TB2Dock.pas', + TB2ExtItems in '..\Source\TB2ExtItems.pas', + TB2Item in '..\Source\TB2Item.pas', + TB2Common in '..\Source\TB2Common.pas', + TB2Hook in '..\Source\TB2Hook.pas', + TB2ToolWindow in '..\Source\TB2ToolWindow.pas', + TB2MRU in '..\Source\TB2MRU.pas', + TB2Anim in '..\Source\TB2Anim.pas', + TB2MDI in '..\Source\TB2MDI.pas', + TB2Acc in '..\Source\TB2Acc.pas'; + +end. + diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d6.res b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d6.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d7.dpk b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d7.dpk new file mode 100644 index 0000000..bc6fb9c --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d7.dpk @@ -0,0 +1,48 @@ +package tb2k_d7; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3FC00000} +{$DESCRIPTION 'Toolbar2000 Components (Jordan Russell)'} +{$RUNONLY} +{$IMPLICITBUILD ON} + +requires + vcl; + +contains + TB2Version in '..\Source\TB2Version.pas', + TB2Toolbar in '..\Source\TB2Toolbar.pas', + TB2Consts in '..\Source\TB2Consts.pas', + TB2Dock in '..\Source\TB2Dock.pas', + TB2ExtItems in '..\Source\TB2ExtItems.pas', + TB2Item in '..\Source\TB2Item.pas', + TB2Common in '..\Source\TB2Common.pas', + TB2Hook in '..\Source\TB2Hook.pas', + TB2ToolWindow in '..\Source\TB2ToolWindow.pas', + TB2MRU in '..\Source\TB2MRU.pas', + TB2Anim in '..\Source\TB2Anim.pas', + TB2MDI in '..\Source\TB2MDI.pas', + TB2Acc in '..\Source\TB2Acc.pas'; + +end. + diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d7.res b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d7.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d9.dpk b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d9.dpk new file mode 100644 index 0000000..56949e2 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d9.dpk @@ -0,0 +1,48 @@ +package tb2k_d9; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3FC00000} +{$DESCRIPTION 'Toolbar2000 Components (Jordan Russell)'} +{$RUNONLY} +{$IMPLICITBUILD ON} + +requires + vcl; + +contains + TB2Version in '..\Source\TB2Version.pas', + TB2Toolbar in '..\Source\TB2Toolbar.pas', + TB2Consts in '..\Source\TB2Consts.pas', + TB2Dock in '..\Source\TB2Dock.pas', + TB2ExtItems in '..\Source\TB2ExtItems.pas', + TB2Item in '..\Source\TB2Item.pas', + TB2Common in '..\Source\TB2Common.pas', + TB2Hook in '..\Source\TB2Hook.pas', + TB2ToolWindow in '..\Source\TB2ToolWindow.pas', + TB2MRU in '..\Source\TB2MRU.pas', + TB2Anim in '..\Source\TB2Anim.pas', + TB2MDI in '..\Source\TB2MDI.pas', + TB2Acc in '..\Source\TB2Acc.pas'; + +end. + diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d9.res b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_d9.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_dn10.bdsproj b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_dn10.bdsproj new file mode 100644 index 0000000..89d1181 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_dn10.bdsproj @@ -0,0 +1,197 @@ + + + + + + + + + + + + tb2k_dn10.dpk + + + 7.0 + + + 0 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + False + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + True + False + False + 4096 + 1048576 + 1061158912 + Toolbar2000 .NET Components (Jordan Russell) + + + + ..\Lib\DN10 + $(BDSPROJECTSDIR)\Bpl + $(BDSPROJECTSDIR)\Bpl + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + True + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_dn10.dpk b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_dn10.dpk new file mode 100644 index 0000000..001eaf6 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_dn10.dpk @@ -0,0 +1,120 @@ +package tb2k_dn10; + +{$ALIGN 0} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3F400000} +{$DESCRIPTION 'Toolbar2000 .NET Components (Jordan Russell)'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + System.Drawing, + Borland.Delphi, + Borland.Vcl, + Borland.VclRtl; + +contains + TB2Version in '..\Source\TB2Version.pas', + TB2Toolbar in '..\Source\TB2Toolbar.pas', + TB2Consts in '..\Source\TB2Consts.pas', + TB2Dock in '..\Source\TB2Dock.pas', + TB2ExtItems in '..\Source\TB2ExtItems.pas', + TB2Item in '..\Source\TB2Item.pas', + TB2Common in '..\Source\TB2Common.pas', + TB2Hook in '..\Source\TB2Hook.pas', + TB2ToolWindow in '..\Source\TB2ToolWindow.pas', + TB2MRU in '..\Source\TB2MRU.pas', + TB2Anim in '..\Source\TB2Anim.pas', + TB2MDI in '..\Source\TB2MDI.pas', + TB2Acc in '..\Source\TB2Acc.pas', + TB2OleMarshal in '..\Source\TB2OleMarshal.pas'; + +[assembly: AssemblyDescription('')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('')] +[assembly: AssemblyProduct('')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + + +// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. +// You can set this in the IDE via the Project Options. +// Manually setting the AssemblyTitle attribute below will override the IDE +// setting. +// [assembly: AssemblyTitle('')] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +//[assembly: AssemblyVersion('1.0.*')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output +// directory is the project directory (the default). +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('')] +[assembly: AssemblyKeyName('')] + +// +// Use the attributes below to control the COM visibility of your assembly. By +// default the entire assembly is visible to COM. Setting ComVisible to false +// is the recommended default for your assembly. To then expose a class and interface +// to COM set ComVisible to true on each one. It is also recommended to add a +// Guid attribute. +// + +[assembly: ComVisible(False)] +//[assembly: Guid('')] +//[assembly: TypeLibVersion(1, 0)] + +end. diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_dn11.dpk b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_dn11.dpk new file mode 100644 index 0000000..836af2d --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_dn11.dpk @@ -0,0 +1,120 @@ +package tb2k_dn11; + +{$ALIGN 0} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3F400000} +{$DESCRIPTION 'Toolbar2000 .NET Components (Jordan Russell)'} +{$RUNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE DEBUG} + +requires + Borland.Delphi, + Borland.VclRtl, + Borland.Vcl; + +contains + TB2Version in '..\Source\TB2Version.pas', + TB2Toolbar in '..\Source\TB2Toolbar.pas', + TB2Consts in '..\Source\TB2Consts.pas', + TB2Dock in '..\Source\TB2Dock.pas', + TB2ExtItems in '..\Source\TB2ExtItems.pas', + TB2Item in '..\Source\TB2Item.pas', + TB2Common in '..\Source\TB2Common.pas', + TB2Hook in '..\Source\TB2Hook.pas', + TB2ToolWindow in '..\Source\TB2ToolWindow.pas', + TB2MRU in '..\Source\TB2MRU.pas', + TB2Anim in '..\Source\TB2Anim.pas', + TB2MDI in '..\Source\TB2MDI.pas', + TB2Acc in '..\Source\TB2Acc.pas', + TB2OleMarshal in '..\Source\TB2OleMarshal.pas'; + +[assembly: AssemblyDescription('')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('')] +[assembly: AssemblyProduct('')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + + +// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. +// You can set this in the IDE via the Project Options. +// Manually setting the AssemblyTitle attribute below will override the IDE +// setting. +// [assembly: AssemblyTitle('')] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +//[assembly: AssemblyVersion('1.0.*')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output +// directory is the project directory (the default). +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('')] +[assembly: AssemblyKeyName('')] + +// +// Use the attributes below to control the COM visibility of your assembly. By +// default the entire assembly is visible to COM. Setting ComVisible to false +// is the recommended default for your assembly. To then expose a class and interface +// to COM set ComVisible to true on each one. It is also recommended to add a +// Guid attribute. +// + +[assembly: ComVisible(False)] +//[assembly: Guid('')] +//[assembly: TypeLibVersion(1, 0)] + +end. diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2k_dn11.dproj b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_dn11.dproj new file mode 100644 index 0000000..e347261 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2k_dn11.dproj @@ -0,0 +1,82 @@ + + + {e64e9cd0-bdee-45e5-a97a-7e85f9f52092} + Debug + AnyCPU + DCCIL + tb2k_dn11.dll + tb2k_dn11.dpk + + + 7.0 + False + False + 0 + RELEASE + 3F400000 + False + ..\Lib\DN11 + ..\Lib\DN11 + ..\Lib\DN11 + + + 7.0 + True + True + DEBUG + 3F400000 + False + ..\Lib\DN11 + ..\Lib\DN11 + ..\Lib\DN11 + + + DelphiDotNet.Personality + + +FalseTrueFalseFalseFalseTrueToolbar2000 .NET Components (Jordan Russell)TrueFalse1000FalseFalseFalseFalseFalse103312521.0.0.01.0.0.0tb2k_dn11.dpk + + + + Borland.VclRtl + 11.0.5000.9245 + Borland.VclRtl.dll + Borland.VclRtl.dll + False + + + Borland.Vcl + 11.0.5000.9245 + Borland.Vcl.dll + Borland.Vcl.dll + False + + + Borland.Delphi + 11.0.5000.9245 + Borland.Delphi.dll + Borland.Delphi.dll + False + + + + + MainSource + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_cb4.bpk b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_cb4.bpk new file mode 100644 index 0000000..e3fe08e --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_cb4.bpk @@ -0,0 +1,181 @@ +# --------------------------------------------------------------------------- +!if !$d(BCB) +BCB = $(MAKEDIR)\.. +!endif + +# --------------------------------------------------------------------------- +# IDE SECTION +# --------------------------------------------------------------------------- +# The following section of the project makefile is managed by the BCB IDE. +# It is recommended to use the IDE to change any of the values in this +# section. +# --------------------------------------------------------------------------- + +VERSION = BCB.04.04 +# --------------------------------------------------------------------------- +PROJECT = tb2kdsgn_cb4.bpl +OBJFILES = ..\Source\TB2DsgnConverter.obj ..\Source\TB2DsgnItemEditor.obj \ + ..\Source\TB2DsgnConvertOptions.obj ..\Source\TB2Reg.obj tb2kdsgn_cb4.obj +RESFILES = ..\Source\TB2Reg.dcr +RESDEPEN = $(RESFILES) ..\Source\TB2DsgnConverter.dfm ..\Source\TB2DsgnItemEditor.dfm \ + ..\Source\TB2DsgnConvertOptions.dfm +LIBFILES = +LIBRARIES = +SPARELIBS = Vcl40.lib +PACKAGES = vcl40.bpi dclstd40.bpi tb2k_cb4.bpi +DEFFILE = +# --------------------------------------------------------------------------- +PATHCPP = .; +PATHASM = .; +PATHPAS = .;..\Source +PATHRC = .; +DEBUGLIBPATH = $(BCB)\lib\debug +RELEASELIBPATH = $(BCB)\lib\release +USERDEFINES = +SYSDEFINES = _RTLDLL;NO_STRICT;USEPACKAGES +# --------------------------------------------------------------------------- +CFLAG1 = -I..\Source;$(BCB)\include;$(BCB)\include\vcl -Od -Hc -H=$(BCB)\lib\vcl40.csm \ + -w -Ve -r- -a8 -k -y -v -vi- -c -b- -w-par -w-inl -Vx -tWM \ + -D$(SYSDEFINES);$(USERDEFINES) +PFLAGS = -U..\Source;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib;$(RELEASELIBPATH) \ + -I..\Source;$(BCB)\include;$(BCB)\include\vcl -$YD -$J- -v -JPHNE -M -LUdclstd40 +RFLAGS = -i..\Source;$(BCB)\include;$(BCB)\include\vcl +AFLAGS = /i..\Source /i$(BCB)\include /i$(BCB)\include\vcl /mx /w2 /zd +LFLAGS = -L..\Source;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib;$(RELEASELIBPATH) \ + -D"Toolbar2000 Design Package (Jordan Russell)" -aa -Tpp -Gpd -x -Gn -Gl -Gi -v +# --------------------------------------------------------------------------- +ALLOBJ = c0pkg32.obj Memmgr.Lib $(PACKAGES) sysinit.obj $(OBJFILES) +ALLRES = $(RESFILES) +ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cp32mti.lib +# --------------------------------------------------------------------------- +!ifdef IDEOPTIONS + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +InMemoryExe=0 +ShowInfoMsgs=0 + +!endif + +# --------------------------------------------------------------------------- +# MAKE SECTION +# --------------------------------------------------------------------------- +# This section of the project file is not used by the BCB IDE. It is for +# the benefit of building from the command-line using the MAKE utility. +# --------------------------------------------------------------------------- + +.autodepend +# --------------------------------------------------------------------------- +!if !$d(BCC32) +BCC32 = bcc32 +!endif + +!if !$d(CPP32) +CPP32 = cpp32 +!endif + +!if !$d(DCC32) +DCC32 = dcc32 +!endif + +!if !$d(TASM32) +TASM32 = tasm32 +!endif + +!if !$d(LINKER) +LINKER = ilink32 +!endif + +!if !$d(BRCC32) +BRCC32 = brcc32 +!endif + +# --------------------------------------------------------------------------- +!if $d(PATHCPP) +.PATH.CPP = $(PATHCPP) +.PATH.C = $(PATHCPP) +!endif + +!if $d(PATHPAS) +.PATH.PAS = $(PATHPAS) +!endif + +!if $d(PATHASM) +.PATH.ASM = $(PATHASM) +!endif + +!if $d(PATHRC) +.PATH.RC = $(PATHRC) +!endif +# --------------------------------------------------------------------------- +$(PROJECT): $(OBJFILES) $(RESDEPEN) $(DEFFILE) + $(BCB)\BIN\$(LINKER) @&&! + $(LFLAGS) + + $(ALLOBJ), + + $(PROJECT),, + + $(ALLLIB), + + $(DEFFILE), + + $(ALLRES) +! +# --------------------------------------------------------------------------- +.pas.hpp: + $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< } + +.pas.obj: + $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< } + +.cpp.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) -n$(@D) {$< } + +.c.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) -n$(@D) {$< } + +.c.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) -n. {$< } + +.cpp.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) -n. {$< } + +.asm.obj: + $(BCB)\BIN\$(TASM32) $(AFLAGS) $<, $@ + +.rc.res: + $(BCB)\BIN\$(BRCC32) $(RFLAGS) -fo$@ $< +# --------------------------------------------------------------------------- + diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_cb4.cpp b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_cb4.cpp new file mode 100644 index 0000000..08b9d21 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_cb4.cpp @@ -0,0 +1,23 @@ +// $jrsoftware: tb2k/Packages/tb2kdsgn_cb4.cpp,v 1.4 2002/11/14 18:15:59 jr Exp $ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop +USEPACKAGE("vcl40.bpi"); +USEFORMNS("..\Source\TB2DsgnConverter.pas", Tb2dsgnconverter, TBConverterForm); +USEFORMNS("..\Source\TB2DsgnItemEditor.pas", Tb2dsgnitemeditor, TBItemEditForm); +USEFORMNS("..\Source\TB2DsgnConvertOptions.pas", Tb2dsgnconvertoptions, TBConvertOptionsForm); +USEUNIT("..\Source\TB2Reg.pas"); +USERES("..\Source\TB2Reg.dcr"); +USEPACKAGE("dclstd40.bpi"); +USEPACKAGE("tb2k_cb4.bpi"); +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +// Package source. +//--------------------------------------------------------------------------- +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- + diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_cb5.bpk b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_cb5.bpk new file mode 100644 index 0000000..2950fbf --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_cb5.bpk @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + + \ No newline at end of file diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_cb5.cpp b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_cb5.cpp new file mode 100644 index 0000000..ba1bbd8 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_cb5.cpp @@ -0,0 +1,23 @@ +// $jrsoftware: tb2k/Packages/tb2kdsgn_cb5.cpp,v 1.4 2002/11/14 18:15:59 jr Exp $ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop +USEPACKAGE("vcl50.bpi"); +USEFORMNS("..\Source\TB2DsgnConverter.pas", Tb2dsgnconverter, TBConverterForm); +USEFORMNS("..\Source\TB2DsgnItemEditor.pas", Tb2dsgnitemeditor, TBItemEditForm); +USEFORMNS("..\Source\TB2DsgnConvertOptions.pas", Tb2dsgnconvertoptions, TBConvertOptionsForm); +USEUNIT("..\Source\TB2Reg.pas"); +USERES("..\Source\TB2Reg.dcr"); +USEPACKAGE("dclstd50.bpi"); +USEPACKAGE("tb2k_cb5.bpi"); +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +// Package source. +//--------------------------------------------------------------------------- +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- + diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_cb6.bpk b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_cb6.bpk new file mode 100644 index 0000000..1223631 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_cb6.bpk @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + +[Linker] +LibPrefix= +LibSuffix= +LibVersion= + + \ No newline at end of file diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_cb6.cpp b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_cb6.cpp new file mode 100644 index 0000000..6fabfa6 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_cb6.cpp @@ -0,0 +1,18 @@ +// $jrsoftware: tb2k/Packages/tb2kdsgn_cb6.cpp,v 1.2 2002/11/14 18:07:19 jr Exp $ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop +USEFORMNS("..\Source\TB2DsgnConverter.pas", Tb2dsgnconverter, TBConverterForm); +USEFORMNS("..\Source\TB2DsgnItemEditor.pas", Tb2dsgnitemeditor, TBItemEditForm); +USEFORMNS("..\Source\TB2DsgnConvertOptions.pas", Tb2dsgnconvertoptions, TBConvertOptionsForm); +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +// Package source. +//--------------------------------------------------------------------------- +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- + diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d10.bdsproj b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d10.bdsproj new file mode 100644 index 0000000..e208fd9 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d10.bdsproj @@ -0,0 +1,175 @@ + + + + + + + + + + + + tb2kdsgn_d10.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 44 + False + 1 + False + False + False + 16384 + 1048576 + 1065353216 + Toolbar2000 Design Package (Jordan Russell) + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d10.dpk b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d10.dpk new file mode 100644 index 0000000..6286adf --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d10.dpk @@ -0,0 +1,42 @@ +package tb2kdsgn_d10; + +{$R *.res} +{$R '..\Source\TB2Reg.dcr'} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3F800000} +{$DESCRIPTION 'Toolbar2000 Design Package (Jordan Russell)'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + vcl, + dclstd, + tb2k_d10; + +contains + TB2Reg in '..\Source\TB2Reg.pas', + TB2DsgnItemEditor in '..\Source\TB2DsgnItemEditor.pas' {TBItemEditForm}, + TB2DsgnConverter in '..\Source\TB2DsgnConverter.pas' {TBConverterForm}, + TB2DsgnConvertOptions in '..\Source\TB2DsgnConvertOptions.pas' {TBConvertOptionsForm}; + +end. + diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d10.res b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d10.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d11.dpk b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d11.dpk new file mode 100644 index 0000000..6ea006f --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d11.dpk @@ -0,0 +1,43 @@ +package tb2kdsgn_d11; + +{$R *.res} +{$R '..\Source\TB2Reg.dcr'} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3F800000} +{$DESCRIPTION 'Toolbar2000 Design Package (Jordan Russell)'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE DEBUG} + +requires + rtl, + vcl, + dclstd, + tb2k_d11; + +contains + TB2Reg in '..\Source\TB2Reg.pas', + TB2DsgnItemEditor in '..\Source\TB2DsgnItemEditor.pas' {TBItemEditForm}, + TB2DsgnConverter in '..\Source\TB2DsgnConverter.pas' {TBConverterForm}, + TB2DsgnConvertOptions in '..\Source\TB2DsgnConvertOptions.pas' {TBConvertOptionsForm}; + +end. diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d11.dproj b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d11.dproj new file mode 100644 index 0000000..454a446 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d11.dproj @@ -0,0 +1,52 @@ + + + {e51188c3-1c1e-47eb-b42e-bb80872f9ae7} + tb2kdsgn_d11.dpk + Debug + AnyCPU + DCC32 + tb2kdsgn_d11.bpl + + + 7.0 + False + False + 0 + RELEASE + All + 3F800000 + + + 7.0 + DEBUG + All + 3F800000 + + + Delphi.Personality + Package + +FalseTrueFalseFalseTrueFalseToolbar2000 Design Package (Jordan Russell)FalseFalse1000FalseFalseFalseFalseFalse103312521.0.0.01.0.0.0tb2kdsgn_d11.dpk + + + + + MainSource + + +

    TBConverterForm + + +
    TBConvertOptionsForm
    +
    + +
    TBItemEditForm
    +
    + + + + + + + + \ No newline at end of file diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d11.res b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d11.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d12.bpi b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d12.bpi new file mode 100644 index 0000000000000000000000000000000000000000..92e703be53a9b7d9db0c8da8799182196d0be2a3 GIT binary patch literal 10388 zcmdT~OLH4V5FQ&asZ=09LZ}2PghYYxh_U2A5(pq!auSjFK_nZf1k7qRR+g-GHoGH7 z&dEnt;R_dv0|&1BFMa@=xzOD^Bd?@cd8A4X@j+#cw)^Yu>F(+2-hW-3r_Z*Ra>jh2mNR!eMkX8dvDq+c#uq1g~t&|x1bBcXXtTzfx*f=-YIFW2z(F0OY z&3o+NM&=$qjJ96E-N8rI4*6{NE8=k>gU59*IFQ4A;_yudhkAXX-=Wa9#hc(t3mqv% zQ1(6d0SXu9FD1$q>nn|)xhoCARtc(5%yq-urFpa3MnD5E@K`Y3#j(U5X0vy39Qy<0 zVKxOJ2;K^Rf6TDIr)Q?7*xrZCdIyNd^Z<|PY4!`Q4gBq#VW+d=n@7(|XrCMoZ4f?* z;L{kcqrzT=r584$W;*JDrn(5C2g(FXJm~0{v`P(@X<*WjzeZkre!y#aWEt(B z5&5}ca+^T^k%(^$6Yqx{k0`v$BHW%Jyf+BorVW5EVm<*vn-JD55KxaYq8M{il)pk} zM6piKlw3@)!`We%6W;PLUPY*^NbI|XJR~y@{IQ6(?8H*E(L2L#{)#$M07f3pTy*-rg(2$Ew zPl{(I;hjn)yp;4w#ydHj@p{?tHT4^~N?Qaf-5pbl>pY6VOVz3>YuatBhx!uZc32HI zg<3j+#1$TUtst?XPKK!;`YRWLODL*=-0Wiw1*UKxs3k2|T?oJ7=!8y*u|GKvC1QG} z+HT$UVqF|*b%v_DBuQwg>9NJGOh0DI{ek_dpg+f}kqF_6v7NY7@dlUcj^CkFYpPLe#PHf!3`g zxuUdL%od5+>Sem-T<2{MJ!<+3W2Q*NL)LNQzHau-Ym86s1# z1yb)Cg77$Bfi&w;>V1hEjUJnFWo8+ov z4*}P5E+;952Fk5r_vq~gT=^$L7^oOWAWT>>{y@8Z-D0=P9XY{9-y{Bu7W|h)#4)#x z<*fFbyv!ff_#}ShkOp5{XaEqXzywxm62_7pMy=CmLr_luV{ff;#2v|%LP>?4zpT3p zOI$isR2$N-OPbua(4-!5zV7iymB?vT;5Z|c!4`(hd!{7+m{8m?QC6TUmx+?U3JH^1 zRK+@qRFhzUNElRX5%}tu;5VJ1>5srSA=w)f3%RFn%rwdqGNyfWY4BTodo_agpK&Ln zhGE0(F|<#PkMS!x#p5xY0x}etO=Z zx4ld$+dgHP?2k+>Q>EdLbtKrII2vIwfJis)gTbh~w9yYOHd?bU-*xH?B_RK%#IZ)#^sdBq=tN9=a#<1{eFDVr9W1R@Q=u zx4=(%RPz0_Oqp#U`&$M2S0W`^vQS8xoE|hei}n5A4C3D+@h@4351WRZsCv(G0sDAf z3%rLNzU;Ks@ohIth)LRe7Sg8eOU|`l=Iu`_Qfn*F^dko`*yt{yRxD7lKZM(`rHTQY z!STS{#{;+H=HuhZ%zf;St6ZZgDFd3a)OTc*l7&%n4JgAh_rPH9fLMQPV!d!jg%Cw2 zzR{2{9=<_$3v;T>2Ul~UV5vdVHE4BAm)`3H_;E73pUZAZ_VTxHehG|*vm5aV%-LM+S0KL(GJ}|7yrZvFt zz0WKM1E8XLTK68a8VwNrsBs2ou+1FB~I=FIYO|2YP3}A?b^m?#m7@O&()X0s7b^w4Qw`6Lk zxSD5iw7Ootod~I+Qj@>_A4W|648uA|;Q>}?N&>^gP0jS4)SFj?&_AoBCCFeS-?A!D zsK1G!4z-2l1Z|FpPHG~XvDrsN^13F`NjR$vxJ{3Lq93pKvbL(%DQ9;>L*KJ&NY8tx Y*(ePG%bW_{V%a(p(a8A!cZ#w90hHgcga7~l literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d12.dpk b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d12.dpk new file mode 100644 index 0000000..b3ebd84 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d12.dpk @@ -0,0 +1,42 @@ +package tb2kdsgn_d12; + +{$R *.res} +{$R '..\Source\TB2Reg.dcr'} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3F800000} +{$DESCRIPTION 'Toolbar2000 Design Package (Jordan Russell)'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + rtl, + vcl, + dclstd, + tb2k_d12; + +contains + TB2Reg in '..\Source\TB2Reg.pas', + TB2DsgnItemEditor in '..\Source\TB2DsgnItemEditor.pas' {TBItemEditForm}, + TB2DsgnConverter in '..\Source\TB2DsgnConverter.pas' {TBConverterForm}, + TB2DsgnConvertOptions in '..\Source\TB2DsgnConvertOptions.pas' {TBConvertOptionsForm}; + +end. diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d12.dproj b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d12.dproj new file mode 100644 index 0000000..ea19959 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d12.dproj @@ -0,0 +1,129 @@ + + + {D9827544-06D4-4C36-9AA3-5858B2C844EA} + tb2kdsgn_d12.dpk + 12.0 + Debug + DCC32 + + + true + + + true + Base + true + + + true + Base + true + + + ..\Lib\D12 + ..\Lib\D12;$(DCC_UnitSearchPath) + ..\Lib\D12 + ..\Lib\D12 + 3F800000 + ..\Lib\D12\tb2kdsgn_d12.bpl + 1 + true + x86 + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;$(DCC_UnitAlias) + Toolbar2000 Design Package (Jordan Russell) + false + false + true + true + false + true + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + + + + + + + +
    TBItemEditForm
    +
    + +
    TBConverterForm
    +
    + +
    TBConvertOptionsForm
    +
    + + + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
    + + + Delphi.Personality.12 + Package + + + + tb2kdsgn_d12.dpk + + + False + True + False + + + True + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + +
    diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d12.hpp b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d12.hpp new file mode 100644 index 0000000..0e40bac --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d12.hpp @@ -0,0 +1,101 @@ +// CodeGear C++Builder +// Copyright (c) 1995, 2008 by CodeGear +// All rights reserved + +// (DO NOT EDIT: machine generated header) 'Tb2kdsgn_d12.pas' rev: 20.00 + +#ifndef Tb2kdsgn_d12HPP +#define Tb2kdsgn_d12HPP + +#pragma delphiheader begin +#pragma option push +#pragma option -w- // All warnings off +#pragma option -Vx // Zero-length empty class member functions +#pragma pack(push,8) +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit + +//-- user supplied ----------------------------------------------------------- + +namespace Tb2kdsgn_d12 +{ +//-- type declarations ------------------------------------------------------- +//-- var, const, procedure --------------------------------------------------- + +} /* namespace Tb2kdsgn_d12 */ +using namespace Tb2kdsgn_d12; +#pragma pack(pop) +#pragma option pop + +#pragma delphiheader end. +//-- end unit ---------------------------------------------------------------- +#endif // Tb2kdsgn_d12HPP diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d12.lib b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d12.lib new file mode 100644 index 0000000000000000000000000000000000000000..42898df2ee13216665a4954c3c1e87eff7c5b954 GIT binary patch literal 76800 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 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d12.res b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d12.res new file mode 100644 index 0000000000000000000000000000000000000000..1bf5a8cde9d53fdd3331574c057ae8eedce8b643 GIT binary patch literal 5056 zcmbW5&x;&Y5XWn?3mOsKgC{Suh=}Y#BIM$!6=NWvMvRkd6EwzPvI%i>@YMUCOb#N_ z2mb@E#T1Ta6vr`?3vhsi8Ih_nFsoJ2*J7wrSkcPW$1}Bb!%qBPRUrq&*$a z`O*IuA21R-J!8qEU9>*mi&xvstrdruE8gqQGo7U`D*vH91ZRK3|fP=M*vDRK&;V>R}!J+Ta-#B)!_^I}`-u2kf z{#e?j8~t!t$SdFKLw*cwYCP0g?d0HIeUBrb@_7Ay4fWq0c%aeuNHu5`3kT0~7Jo!B5SO>?{++6(0*Z0y?6DJO=5tpes*G{!pJi1$O*XWPDfyX`uhp4O1HDJn$ z4^6>g-jscoR>wCR(N(LBU#PY-#Z{`a zj6E^UwH<4TktzS2ei!S(2LsKayR}|1*$;f>Ze+qe{Qc15(cd<$_o=rv+6Q84u#*G6 z;4Wc{1AWaUK3d6*cOG5QPEL)@>(K2nU5vqjKKt+33t`XTDPPOaSQq-OnQ8}L#$3am zN1ms@{ums(;Nb6UqdYRJ!Pgl(>IY2vaCQ8JVu-Eft1#;0`jyZ1F5sYcCu~gXv-bV5 z_N#kr$pKDa1~z#MzT!CdU~&$kO^plBnS7;nb#Oo<7{33B+Z7HvpUinp``+N-ZM`3i zQ$yzfHa3g>cT91I6K%M94TR-qQQX4QKdG(SYaKYe!vnVR#hw=Z$)OtcQ*%>Z^iv<+ z>EJQ)PhRe&2MpJy{NTpjLVfkVfj>3ni!)qw*M-YWoR!P>yy(w8@_nMtiUkKPr-rjBUc`XU9msbTxss2H=xx@n8I$xOoP_=1DH=@EPMQdcCW$-dXo0U!gm+=ex^$2KKjXu8j3XaZ0{*Fwa=iPIx z5>TIUEb&hC$MIdl*+3(8<4&XxM?Xs%pZ=Ef{Vz3G13e5495`c~wbPhl9aCqL-wzmE z{P(c?s0q1G^CXAoorh<5!FS+sRNhHAoDDnqB?r7~J4GElt}C^WZuTbgWZtv-T#u(7 z&*gG-rcwFI^G|e^&0$J_LuCb?1}8K*nvED*5^QfJ79-qo7fYx z7nJ)|Va$Y83A67HH~ZJj?1HTCU$IZ@1G{3M%09HK^7%~v*Wlj_{hzV3#FUW@N zpELi5qwlwsXTz6mZ=c`F_50^8s(Ib6S*_2H>~poQI701sm(}L^W$Vv>$QQ;)@u zAz_So*FS#qforyJ5A3$>*)6*)f5&br^PYWe_Z0QB$6T z?%NH;e=pTH)VnzV?0QV*yrh}$>`TYGFU;FoyEnvMuoo4bvDX#*K+$8&yY`OI(-I$^ z`yRU|>^mzA-g5kpHGj)zVS8UZQG3h2(aLy&=NR{eB5v4MT6b6efqg3``9$p1l7p&& zo4o0b6^I&rrr3MR_E6gQR~VXViSFf?RrRadUw2(md(fysGQ8wOuRHH#HSVU_n|=~P R;ht9AQRH+l&Tsv(^)E;gd4d1{ literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d4.dpk b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d4.dpk new file mode 100644 index 0000000..b9c2f4e --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d4.dpk @@ -0,0 +1,42 @@ +package tb2kdsgn_d4; + +{$R *.RES} +{$R '..\Source\TB2Reg.dcr'} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3F800000} +{$DESCRIPTION 'Toolbar2000 Design Package (Jordan Russell)'} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + vcl40, + dclstd40, + tb2k_d4; + +contains + TB2Reg in '..\Source\TB2Reg.pas', + TB2DsgnItemEditor in '..\Source\TB2DsgnItemEditor.pas' {TBItemEditForm}, + TB2DsgnConverter in '..\Source\TB2DsgnConverter.pas' {TBConverterForm}, + TB2DsgnConvertOptions in '..\Source\TB2DsgnConvertOptions.pas' {TBConvertOptionsForm}; + +end. + diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d4.res b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d4.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d5.dpk b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d5.dpk new file mode 100644 index 0000000..bb80ebc --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d5.dpk @@ -0,0 +1,42 @@ +package tb2kdsgn_d5; + +{$R *.RES} +{$R '..\Source\TB2Reg.dcr'} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3F800000} +{$DESCRIPTION 'Toolbar2000 Design Package (Jordan Russell)'} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + vcl50, + dclstd50, + tb2k_d5; + +contains + TB2Reg in '..\Source\TB2Reg.pas', + TB2DsgnItemEditor in '..\Source\TB2DsgnItemEditor.pas' {TBItemEditForm}, + TB2DsgnConverter in '..\Source\TB2DsgnConverter.pas' {TBConverterForm}, + TB2DsgnConvertOptions in '..\Source\TB2DsgnConvertOptions.pas' {TBConvertOptionsForm}; + +end. + diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d5.res b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d5.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d6.dpk b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d6.dpk new file mode 100644 index 0000000..da87e9e --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d6.dpk @@ -0,0 +1,42 @@ +package tb2kdsgn_d6; + +{$R *.res} +{$R '..\Source\TB2Reg.dcr'} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3F800000} +{$DESCRIPTION 'Toolbar2000 Design Package (Jordan Russell)'} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + vcl, + dclstd, + tb2k_d6; + +contains + TB2Reg in '..\Source\TB2Reg.pas', + TB2DsgnItemEditor in '..\Source\TB2DsgnItemEditor.pas' {TBItemEditForm}, + TB2DsgnConverter in '..\Source\TB2DsgnConverter.pas' {TBConverterForm}, + TB2DsgnConvertOptions in '..\Source\TB2DsgnConvertOptions.pas' {TBConvertOptionsForm}; + +end. + diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d6.res b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d6.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d7.dpk b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d7.dpk new file mode 100644 index 0000000..805b074 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d7.dpk @@ -0,0 +1,42 @@ +package tb2kdsgn_d7; + +{$R *.res} +{$R '..\Source\TB2Reg.dcr'} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3F800000} +{$DESCRIPTION 'Toolbar2000 Design Package (Jordan Russell)'} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + vcl, + dclstd, + tb2k_d7; + +contains + TB2Reg in '..\Source\TB2Reg.pas', + TB2DsgnItemEditor in '..\Source\TB2DsgnItemEditor.pas' {TBItemEditForm}, + TB2DsgnConverter in '..\Source\TB2DsgnConverter.pas' {TBConverterForm}, + TB2DsgnConvertOptions in '..\Source\TB2DsgnConvertOptions.pas' {TBConvertOptionsForm}; + +end. + diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d7.res b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d7.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d9.dpk b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d9.dpk new file mode 100644 index 0000000..ca4e64a --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d9.dpk @@ -0,0 +1,42 @@ +package tb2kdsgn_d9; + +{$R *.res} +{$R '..\Source\TB2Reg.dcr'} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3F800000} +{$DESCRIPTION 'Toolbar2000 Design Package (Jordan Russell)'} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + vcl, + dclstd, + tb2k_d9; + +contains + TB2Reg in '..\Source\TB2Reg.pas', + TB2DsgnItemEditor in '..\Source\TB2DsgnItemEditor.pas' {TBItemEditForm}, + TB2DsgnConverter in '..\Source\TB2DsgnConverter.pas' {TBConverterForm}, + TB2DsgnConvertOptions in '..\Source\TB2DsgnConvertOptions.pas' {TBConvertOptionsForm}; + +end. + diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d9.res b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_d9.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_dn10.bdsproj b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_dn10.bdsproj new file mode 100644 index 0000000..149e279 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_dn10.bdsproj @@ -0,0 +1,188 @@ + + + + + + + + + + + + tb2kdsgn_dn10.dpk + + + 7.0 + + + 0 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + Borland.Vcl.Design + False + + True + True + True + True + True + False + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + True + False + False + 4096 + 1048576 + 1056964608 + Toolbar2000 .NET Design Package (Jordan Russell) + + + + + $(BDSPROJECTSDIR)\Bpl + $(BDSPROJECTSDIR)\Bpl + + + + + True + + + + + + False + + + True + False + + + + $00000000 + + + + True + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + + + + + + + + + + + + + diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_dn10.dpk b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_dn10.dpk new file mode 100644 index 0000000..418a15d --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_dn10.dpk @@ -0,0 +1,111 @@ +package tb2kdsgn_dn10; + +{$ALIGN 0} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3F000000} +{$DESCRIPTION 'Toolbar2000 .NET Design Package (Jordan Russell)'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + System.Drawing, + Borland.Delphi, + Borland.Studio.Vcl.Design, + Borland.Vcl.Design.Standard, + tb2k_dn10; + +contains + TB2Reg in '..\Source\TB2Reg.pas', + TB2DsgnItemEditor in '..\Source\TB2DsgnItemEditor.pas', + TB2DsgnConverter in '..\Source\TB2DsgnConverter.pas', + TB2DsgnConvertOptions in '..\Source\TB2DsgnConvertOptions.pas'; + +[assembly: AssemblyDescription('')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('')] +[assembly: AssemblyProduct('')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + + +// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. +// You can set this in the IDE via the Project Options. +// Manually setting the AssemblyTitle attribute below will override the IDE +// setting. +// [assembly: AssemblyTitle('')] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +//[assembly: AssemblyVersion('1.0.*')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output +// directory is the project directory (the default). +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('')] +[assembly: AssemblyKeyName('')] + +// +// Use the attributes below to control the COM visibility of your assembly. By +// default the entire assembly is visible to COM. Setting ComVisible to false +// is the recommended default for your assembly. To then expose a class and interface +// to COM set ComVisible to true on each one. It is also recommended to add a +// Guid attribute. +// + +[assembly: ComVisible(False)] +//[assembly: Guid('')] +//[assembly: TypeLibVersion(1, 0)] + +end. diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_dn11.dpk b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_dn11.dpk new file mode 100644 index 0000000..b36d21b --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_dn11.dpk @@ -0,0 +1,112 @@ +package tb2kdsgn_dn11; + +{$ALIGN 0} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3F000000} +{$DESCRIPTION 'Toolbar2000 .NET Design Package (Jordan Russell)'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE DEBUG} + +requires + Borland.Delphi, + Borland.Vcl, + Borland.VclRtl, + Borland.Vcl.Design.Standard, + tb2k_dn11; + +contains + TB2Reg in '..\Source\TB2Reg.pas', + TB2DsgnItemEditor in '..\Source\TB2DsgnItemEditor.pas', + TB2DsgnConverter in '..\Source\TB2DsgnConverter.pas', + TB2DsgnConvertOptions in '..\Source\TB2DsgnConvertOptions.pas'; + +[assembly: AssemblyDescription('')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('')] +[assembly: AssemblyProduct('')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + + +// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. +// You can set this in the IDE via the Project Options. +// Manually setting the AssemblyTitle attribute below will override the IDE +// setting. +// [assembly: AssemblyTitle('')] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +//[assembly: AssemblyVersion('1.0.*')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output +// directory is the project directory (the default). +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('')] +[assembly: AssemblyKeyName('')] + +// +// Use the attributes below to control the COM visibility of your assembly. By +// default the entire assembly is visible to COM. Setting ComVisible to false +// is the recommended default for your assembly. To then expose a class and interface +// to COM set ComVisible to true on each one. It is also recommended to add a +// Guid attribute. +// + +[assembly: ComVisible(False)] +//[assembly: Guid('')] +//[assembly: TypeLibVersion(1, 0)] + +end. diff --git a/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_dn11.dproj b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_dn11.dproj new file mode 100644 index 0000000..621b653 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Packages/tb2kdsgn_dn11.dproj @@ -0,0 +1,82 @@ + + + {be3d3497-f4e5-4f7b-a5f7-0ad1f00fddb2} + Debug + AnyCPU + DCCIL + tb2kdsgn_dn11.dll + tb2kdsgn_dn11.dpk + + + 7.0 + False + False + 0 + RELEASE + 3F000000 + False + Borland.Vcl.Design + + + 7.0 + True + True + DEBUG + 3F000000 + False + Borland.Vcl.Design + + + DelphiDotNet.Personality + + +FalseTrueFalseFalseTrueFalseToolbar2000 .NET Design Package (Jordan Russell)TrueFalse1000FalseFalseFalseFalseFalse103312521.0.0.01.0.0.0tb2kdsgn_dn11.dpk + + + + Borland.VclRtl + 11.0.5000.9245 + Borland.VclRtl.dll + Borland.VclRtl.dll + False + + + Borland.Vcl + 11.0.5000.9245 + Borland.Vcl.dll + Borland.Vcl.dll + False + + + tb2k_dn11 + 0.0.0.0 + tb2k_dn11.dll + tb2k_dn11.dll + False + + + Borland.Delphi + 11.0.5000.9245 + Borland.Delphi.dll + Borland.Delphi.dll + False + + + Borland.Vcl.Design.Standard + 11.0.5000.9245 + Borland.Vcl.Design.Standard.dll + Borland.Vcl.Design.Standard.dll + False + + + + + MainSource + + + + + + + + \ No newline at end of file diff --git a/official/2.2.2+2.4.2/TB2K/README.txt b/official/2.2.2+2.4.2/TB2K/README.txt new file mode 100644 index 0000000..c8c520e --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/README.txt @@ -0,0 +1,22 @@ +=========================================================================== + Toolbar2000 README +=========================================================================== + +Thank you for downloading Toolbar2000. + +For details on installing and using Toolbar2000, please refer to the +Toolbar2000 help file - tb2k.chm. To open it, double-click it in Windows +Explorer. + +This file is in HTML Help format. If you are using an older version of +Windows that does not come with HTML Help, it can be downloaded at: + + http://msdn.microsoft.com/library/en-us/htmlhelp/html/hwMicrosoftHTMLHelpDownloads.asp + +You will also need Internet Explorer 4.0 or later (5.0 is preferred), +downloadable from: + + http://www.microsoft.com/ie/ + + +- Jordan Russell (www.jrsoftware.org) diff --git a/official/2.2.2+2.4.2/TB2K/Source/.cvsignore b/official/2.2.2+2.4.2/TB2K/Source/.cvsignore new file mode 100644 index 0000000..a328cf4 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Source/.cvsignore @@ -0,0 +1,5 @@ +*.dcu +*.dcuil +*.obj +*.hpp +_* diff --git a/official/2.2.2+2.4.2/TB2K/Source/Icons/TB2DsgnEditorImages.bmp b/official/2.2.2+2.4.2/TB2K/Source/Icons/TB2DsgnEditorImages.bmp new file mode 100644 index 0000000000000000000000000000000000000000..24199798e3b5bd41156823cefafcaeea7793cb45 GIT binary patch literal 1270 zcmcgry-veG3^poi22_Q|U}WoBp{`M0fhlvPNU&yukw;-?=_B0G)$foY0+#6bK0BAB zMBNZ>d_O+>yU+IZq4>NOlP8RK&^PEU^h*4o8O~w)C5;F^X&Rp}VhL^Jcs$}D+9xq` z1;vjh4Epb~PdDxqG~CUk2tHkPJGstymvtW(rX^0^HD8OC3QX}RtYCm6$#C7j1Y!M~933Jz9IdrubnM?EU1Zb33>@4zm3iAMzqICLDOll~6N Ipg*wu0JkeX+W-In literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBBackground.bmp b/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBBackground.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ce49b5b03b3c302518475c0f190ccb1d18d9211d GIT binary patch literal 406 zcmZ`#u?@p83{!v}(XnIi=-xMcLaou8y?M($KFeE5Qf`0_p(RBLbP@l;A z%FS-#A8W3Mzf#N)R!Ur`XpzOn7#JK1I}Ub898xIh3i(7z?oIHVQm(Z&M62XEK?D!F z_r;5LXfo8T_NAv7BkIF4c&g`=j|6a$kHoXd2R+>@_lgf6Cj}Sr?hs=bd#U>QPrzd@ NUXoux&55hOkiKL%qTv7l literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBBackground16.bmp b/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBBackground16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..05dc86b0fc8391b305da7146685f2f87244997d5 GIT binary patch literal 246 zcmX|4u@S>C2qbr|eHkNjxc53Xjn3+zVJkNuGW&Kjx2KoT+8!wth zqavPjVif)X9XQpRgoqTV)LKKM52xNE1Ms4RaNV}26=r2uExW=*3I`8uhC*mpR_tE2aR1&IERoBjckN7jemTmW5h BdY=FQ literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBEditItem.bmp b/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBEditItem.bmp new file mode 100644 index 0000000000000000000000000000000000000000..08036faf1d44fd99fa020820bd9fe32fff0298a6 GIT binary patch literal 246 zcmZ?r{l)+RWk5;;hy|dSk%0v)(Eui~5kMJ`WJ3dl0+K)`!+`?_fHX+rKNvCm{|{mT qF%W`;fW%!~04NCrcki~B13^8I25~|32Ld!q9aLWj2=wE!fB*mh literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBImageList.bmp b/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBImageList.bmp new file mode 100644 index 0000000000000000000000000000000000000000..97548083824d852495d7f29db33221a1c4d28219 GIT binary patch literal 2322 zcmcJQ?N3rs9LMQRtM#V&s;z&Z_qDd%05eKq+!-jFFES+-YEoe8RjVx)IHw|9S!NGQ z%#tw8hfu&sO{c>tgtB}nAG2iBQOzk%4Y(aRR(F?)SF5w%IXm~<-~I4A_j|vGSS0Eo zE!0ke@fhewxB5QXkm4m7B%F7EdEMKiDP-Cb{onNjgRAYshwh*fTfvVLqZ3#$@j7<~pAv3u#kNqlx z-I~FAoXV(7=DbK3bm#J|*@@QcAi#wGIy=!QrE3H`G6TyF$mCZ@n6(#}bt$p>w6hJO z_~vw^UBYe8;+iCgIXD3$OLviLys{(Hf7l0^N{bG)SLQkHN(V8CO_koO5Ls^s&1jk_ zSJ0HjZ@e0-6DBmsl1wOM>h=2V-hh8|>wP-pDT8W`U5mVX!0R%IwLMtkf-~;hG}|-D zSsGUkJ#A~a7GIYMu#h=5|9QKDXJ_27PCN&}<|$dxz*V!cNk;~50f{_P7|56&gKYu zLFO9D+Xyj(r4})KB@8ci&QqBH;42kuUujIBhz@RT{;Ko&sD-50Z^^{{jgaZh60Q{_ zd{wagcVhgC;NviSO6Gd;nbnfG?<%ghnB`S6;ohIQ+DLl+kqlo2MuS+eNF_k>@^C9r zuQvk&M2pE4QP8{~lVbZc-bvPL+CsG0kZXc?AQ+8C@ZtHa27iw((4)h9s{{SIwIRcz zt8I3oYi8oD`@JPxFa4y6Xfg4AH<1ZS1>4`PUQe7YM2iJadBQmlnY-2NMvD764Rf%XqQf=XvRK$Wg@Y#HtG#v7mE15LWPuyEn&Hw-a literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBImageList16.bmp b/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBImageList16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..289b5031c1dc0fc7fe9fb0ae7a85b1eabb632b11 GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H0s;3voj*M1X8oxE6>;xO%uQi1~QbquGMhJrKizB+z^a xiEKVl3oZm#53z-q_(HY?Ih1f&0ThSZ0#Q%AEogC##|nro$m)r)1z9~YYybeCl{WwY literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBItemContainer.bmp b/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBItemContainer.bmp new file mode 100644 index 0000000000000000000000000000000000000000..579433384b9fb870a058823a65491588245c199e GIT binary patch literal 406 zcmZ?royN!j24z4}1BfM{n2~`6EUo~R2Xjz}1_lNoVrXc9P(TvMWH@l(0FVYr{0Ae3 w|NlWOAO=E^5RfRR9;g5s4KuF-X!ZxF(G_1@T;Oa}aeo}*)KT971eAIY09KHx@Bjb+ literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBItemContainer16.bmp b/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBItemContainer16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..82417d0e2d56ef2395714359483322fe5883b6f4 GIT binary patch literal 246 zcmZ?r{l)+RWk5;;hy|dSk%0v)(Eucm@If$G08Rj9fQX@?0YU*uAd}(1fdfDqB=H}N t82q;dpCM)nS6Lt^JHnQFFJ%90aso*aoSZ009K5!w4=f4|sLBHtgc z2~`{Y!aTK{aH#!ro7c-=3NWDhD|8}KN~~pIHDFeV$x~XiWhY%@S6HQMWd2P#U=Hgi oD#OP}&d@xocgMn_+5NGomnZvXZ-zG`_vdBc8y9K{JFT^R0VkV!A^-pY literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBMDIHandler16.bmp b/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBMDIHandler16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..809e47846f99cff7e87026f2e3c5996ae521ef55 GIT binary patch literal 246 zcmah>F%p0v46AqE)k%DY?{N1oPRb@D&tmW!{DH}1t0|}}p-Fm8>9XEbvBPF?df8E5 z0tdau$};!`35uMn21QFD1h@uLibS*n@pJ@<4fq#Fh28LIX-$Zh08s~S=9 z3*d+uqY)4#rIf&8biLHOR7f0Y0rDH{5K!D&E5acJKQ%kk?7hx$vH3B^&eneH`KoQ_ G=eHYL$8LN8 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBMRUList.bmp b/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBMRUList.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ccd304e6797fe852aa010cc44bd2a9a2368e1665 GIT binary patch literal 406 zcmb`AI}(5(3`Cb1XSjl;rRT8sE>vO%rJbGU;byquJJh<6nP(unCIMj-}|SWNaOIWDU@`%X8qHdZrW>1U=POhJso+GK_` SobOy`+6UwQtLbhNAK?WUMwN~L literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBMRUList16.bmp b/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBMRUList16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..48654a684f9bdf21a3fca23b5e37c713a11d0335 GIT binary patch literal 246 zcmZ?r{l)+RWk5;;hy|dSk%0v)(Eucm@If$G08Rj9fQX@?0YU*uAd}(1fdfDqB=H}N z82JQ3tLr293Ouzv2UW1)H2VE)#aFaf)L2I6(pz{$Ul9uD2t<%ZM^N%iY zj*o2^bs`?whiPxdEQA~9`O|_Ul!GPo2?9_##HRGUI2wjK3zQlosm&P2 zaio5fqY-SmzJJD2bY&dvYC_Bpr%my!a(sw!97o3CqWSCCl;kvLXDP>rOn&$*Qfe;v ulb_jO&50&o{Yb;>ci|+`=4us(=BBuTx?{tRq|Mbr&f5PUGw@HAOyCKK$)+Fx literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBPopupMenu16.bmp b/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBPopupMenu16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b3504eddc8b87b1faf9ba82b2b274862c1802dc8 GIT binary patch literal 822 zcmcJL!41MN3`LDN_5k9<2%Vs(oVc?FJFyT8kS%&(gz%J)tSBK-4`9Vs>pcJd`f^?N zmSdsLh qO+OR_1lp=wztyFn{5=C!`dx?Z5u->=o3|j{oA*{$yWZ*G8|F98$-(&m literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBToolWindow16.bmp b/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBToolWindow16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bc2712f4c87c471591b680f954cdb9296425219e GIT binary patch literal 246 zcmZ8au?>JQ3=0wx8*m19u=5VA*~(cRc!M805w_qo1*y2PT_;sKFBdsh*aVJ+4Yhf| z(4%+e#wVDdh}jK_E5#V$Hqcz8YBvzaT9EUHy+AgH+yT#2L_$EvoO6Vy)YW;YGZC@| N+bHioTV{B_eE`sLcd-Bf literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBToolbar.bmp b/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBToolbar.bmp new file mode 100644 index 0000000000000000000000000000000000000000..557096b77eb0274eb8dab804907c9179e8ae9109 GIT binary patch literal 406 zcmZ?royN!j24z4}1BfM{n2~`6EUo~R2Xjz}1_lNoVrXc9P(TvMWH@l(0FVYr{0Ae3 z|NlWOAO=E^5Rfp&0XmSt_i_Y4VgG2afGBG(|Ngzb9-;~hyMTd#y&NiD@c%!FY-GI* l<#2O=!Z0@2Vl;dIx7P#x2LwQIh{M1nG8-ZfA#ntQF#v$>tQY_Q literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBToolbar16.bmp b/official/2.2.2+2.4.2/TB2K/Source/Icons/TTBToolbar16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..80c1d6620dca1730594c177e2bd0d9579f23bb47 GIT binary patch literal 246 zcmZ8axe 0 then begin + {$IFNDEF CLR} + LresultFromObjectFunc := GetProcAddress(M, 'LresultFromObject'); + AccessibleObjectFromWindowFunc := GetProcAddress(M, 'AccessibleObjectFromWindow'); + if Assigned(LresultFromObjectFunc) and + Assigned(AccessibleObjectFromWindowFunc) then + {$ENDIF} + OleAccAvailable := True; + end; + InterlockedExchange(OleAccInited, 1); + end; + Result := OleAccAvailable; +end; + +{$IFNDEF CLR} +function AccObjectFromWindow(const Wnd: HWND; out ADisp: IDispatch): HRESULT; +begin + Result := AccessibleObjectFromWindowFunc(Wnd, OBJID_WINDOW, IDispatch, ADisp); + if Result <> S_OK then + ADisp := nil; +end; +{$ELSE} +function AccObjectFromWindow(const Wnd: HWND; out ADisp): HRESULT; +begin + Result := AccessibleObjectFromWindowFunc(Wnd, OBJID_WINDOW, + TypeOf(IDispatch).GUID, ADisp); + if Result <> S_OK then + ADisp := nil; +end; +{$ENDIF} + +{$IFNDEF CLR} +procedure DisconnectAccObjects; +{ This procedure calls CoDisconnectObject() on all acc. objects still + allocated. This is needed to prevent potential AV's when TB2k is compiled + into a DLL, since a DLL may be freed by the application while an MSAA + client still holds acc. object references. } +var + Obj, PrevObj: TTBCustomAccObject; +begin + Obj := LastAccObject; + while Assigned(Obj) do begin + { Make a copy of Obj.FPrevious since CoDisconnectObject may cause Obj + to be freed } + PrevObj := Obj.FPrevious; + { CoDisconnectObject should cause remote MSAA clients to release all + references to the object, thus destroying it (assuming the local + application doesn't have references of its own). } + CoDisconnectObject(Obj, 0); + Obj := PrevObj; + end; +end; +{$ELSE} +{ DisconnectAccObjects isn't implemented on .NET because: + - I'm not sure it's needed (the case mentioned above doesn't apply). + - Keeping references to objects in a global linked list would prevent the GC + from ever reclaiming the unused ones. + - The current implementation of TTBStandardOleMarshalObject.DisconnectObject + always returns E_NOTIMPL, so CoDisconnectObject would fail. + - Windows Forms doesn't appear to do it. (Its accessible objects are + derived from StandardOleMarshalObject, and they don't appear to override + the default E_NOTIMPL handling.) } +{$ENDIF} + +function GetAltKeyName: String; +{ This silly function is needed since ShortCutToText(VK_MENU) fails on Delphi + and C++Builder versions <= 4 } +{$IFNDEF CLR} +var + ScanCode: UINT; + KeyName: array[0..255] of Char; +begin + ScanCode := MapVirtualKey(VK_MENU, 0) shl 16; + if (ScanCode <> 0) and + (GetKeyNameText(ScanCode, KeyName, SizeOf(KeyName) div SizeOf(KeyName[0])) > 0) then + Result := KeyName + else + Result := 'Alt'; { shouldn't get here, but just in case... } +end; +{$ELSE} +begin + Result := ShortCutToText(VK_MENU); +end; +{$ENDIF} + +function VarIsInteger(const AVar: TTBVariant): Boolean; +{ Returns True if the specified variant is of type VT_I4, the only integer + type used/allowed in MSAA } +begin + {$IFNDEF CLR} + Result := (VarType(AVar) = varInteger); + {$ELSE} + Result := Assigned(AVar) and (System.Type.GetTypeCode(AVar.GetType) = TypeCode.Int32); + {$ENDIF} +end; + +procedure AssignObjectToVar(var AVariant: TTBVariant; const AObject: TTBBaseAccObject); +{ Creates a VT_DISPATCH-type variant that references AObject } +begin + {$IFNDEF CLR} + AVariant := IDispatch(AObject); + {$ELSE} + AVariant := AObject; + {$ENDIF} +end; + +{ TTBCustomAccObject } + +{$IFNDEF CLR} +constructor TTBCustomAccObject.Create; +begin + inherited Create; + { Add Self to linked list of objects } + EnterCriticalSection(LastAccObjectCritSect); + try + FPrevious := LastAccObject; + if Assigned(FPrevious) then + FPrevious.FNext := Self; + LastAccObject := Self; + finally + LeaveCriticalSection(LastAccObjectCritSect); + end; +end; +{$ENDIF} + +{$IFNDEF CLR} +destructor TTBCustomAccObject.Destroy; +begin + { Remove Self from linked list of objects } + EnterCriticalSection(LastAccObjectCritSect); + try + if LastAccObject = Self then + LastAccObject := FPrevious; + if Assigned(FPrevious) then + FPrevious.FNext := FNext; + if Assigned(FNext) then + FNext.FPrevious := FPrevious; + finally + LeaveCriticalSection(LastAccObjectCritSect); + end; + inherited; +end; +{$ENDIF} + +{ TTBViewAccObject } + +constructor TTBViewAccObject.Create(AView: TTBView); +begin + inherited Create; + FView := AView; + InterlockedIncrement(ViewAccObjectInstances); +end; + +{$IFNDEF CLR} +destructor TTBViewAccObject.Destroy; +begin + InterlockedDecrement(ViewAccObjectInstances); + if Assigned(FView) then begin + TTBViewAccess(FView).FAccObjectInstance := nil; + FView := nil; + end; + inherited; +end; +{$ELSE} +procedure TTBViewAccObject.Finalize; +begin + InterlockedDecrement(ViewAccObjectInstances); + inherited; +end; +{$ENDIF} + +procedure TTBViewAccObject.ClientIsDestroying; +begin + FView := nil; +end; + +function TTBViewAccObject.Check(const varChild: TTBVariant; + var ErrorCode: HRESULT): Boolean; +begin + if FView = nil then begin + ErrorCode := E_FAIL; + Result := False; + end + else if not VarIsInteger(varChild) or (Integer(varChild) <> CHILDID_SELF) then begin + ErrorCode := E_INVALIDARG; + Result := False; + end + else + Result := True; +end; + +function TTBViewAccObject.accDoDefaultAction(varChild: TTBVariant): HRESULT; +begin + Result := S_FALSE; +end; + +function TTBViewAccObject.accHitTest(xLeft, yTop: Integer; + out pvarID: TTBVariant): HRESULT; +var + ViewWnd, W: HWND; + R: TRect; + P: TPoint; + D: {$IFNDEF CLR} IDispatch {$ELSE} TObject {$ENDIF}; + V: TTBItemViewer; +begin + try + if FView = nil then begin + Result := E_FAIL; + Exit; + end; + ViewWnd := FView.Window.Handle; + GetWindowRect(ViewWnd, R); + P.X := xLeft; + P.Y := yTop; + if PtInRect(R, P) then begin + P := FView.Window.ScreenToClient(P); + W := ChildWindowFromPointEx(ViewWnd, P, CWP_SKIPINVISIBLE); + if (W <> 0) and (W <> ViewWnd) then begin + { Point is inside a child window (most likely belonging to a + TTBControlItem) } + Result := AccObjectFromWindow(W, D); + pvarID := D; + end + else begin + V := FView.ViewerFromPoint(P); + if Assigned(V) then + AssignObjectToVar(pvarID, V.GetAccObject) + else + pvarID := TTBVariant(Integer(CHILDID_SELF)); + Result := S_OK; + end; + end + else + Result := S_FALSE; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBViewAccObject.accLocation(out pxLeft, pyTop, pcxWidth, + pcyHeight: Integer; varChild: TTBVariant): HRESULT; +var + R: TRect; +begin + try + if not Check(varChild, Result) then + Exit; + GetWindowRect(FView.Window.Handle, R); + pxLeft := R.Left; + pyTop := R.Top; + pcxWidth := R.Right - R.Left; + pcyHeight := R.Bottom - R.Top; + Result := S_OK; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBViewAccObject.accNavigate(navDir: Integer; varStart: TTBVariant; + out pvarEnd: TTBVariant): HRESULT; +var + I: Integer; +begin + try + if not Check(varStart, Result) then + Exit; + Result := S_FALSE; + case navDir of + NAVDIR_FIRSTCHILD: begin + for I := 0 to FView.ViewerCount-1 do + if FView.Viewers[I].IsAccessible then begin + AssignObjectToVar(pvarEnd, FView.Viewers[I].GetAccObject); + Result := S_OK; + Break; + end; + end; + NAVDIR_LASTCHILD: begin + for I := FView.ViewerCount-1 downto 0 do + if FView.Viewers[I].IsAccessible then begin + AssignObjectToVar(pvarEnd, FView.Viewers[I].GetAccObject); + Result := S_OK; + Break; + end; + end; + end; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBViewAccObject.accSelect(flagsSelect: Integer; + varChild: TTBVariant): HRESULT; +begin + Result := DISP_E_MEMBERNOTFOUND; +end; + +function TTBViewAccObject.get_accChild(varChild: TTBVariant; + out ppdispChild {$IFNDEF CLR}: IDispatch{$ENDIF}): HRESULT; +var + I, J: Integer; + Viewer: TTBItemViewer; + Ctl: TControl; +begin + try + if FView = nil then begin + Result := E_FAIL; + Exit; + end; + if not VarIsInteger(varChild) then begin + Result := E_INVALIDARG; + Exit; + end; + I := Integer(varChild); + if I = CHILDID_SELF then begin + ppdispChild := Self; + Result := S_OK; + end + else begin + { Convert a one-based child index (I) into a real viewer index (J) } + J := 0; + while J < FView.ViewerCount do begin + if FView.Viewers[J].IsAccessible then begin + if I = 1 then Break; + Dec(I); + end; + Inc(J); + end; + if J >= FView.ViewerCount then begin + { 'I' was either negative or too high } + Result := E_INVALIDARG; + Exit; + end; + Viewer := FView.Viewers[J]; + if Viewer.Item is TTBControlItem then begin + { For windowed controls, return the window's accessible object instead + of the item viewer's } + Ctl := TTBControlItem(Viewer.Item).Control; + if (Ctl is TWinControl) and TWinControl(Ctl).HandleAllocated then begin + Result := AccObjectFromWindow(TWinControl(Ctl).Handle, ppdispChild); + Exit; + end; + end; + ppdispChild := Viewer.GetAccObject; + Result := S_OK; + end; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBViewAccObject.get_accChildCount(out pcountChildren: Integer): HRESULT; +var + Count, I: Integer; +begin + try + if Assigned(FView) then begin + Count := 0; + for I := 0 to FView.ViewerCount-1 do + if FView.Viewers[I].IsAccessible then + Inc(Count); + pCountChildren := Count; + Result := S_OK; + end + else + Result := E_FAIL; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBViewAccObject.get_accDefaultAction(varChild: TTBVariant; + out pszDefaultAction: WideString): HRESULT; +begin + Result := S_FALSE; +end; + +function TTBViewAccObject.get_accDescription(varChild: TTBVariant; + out pszDescription: WideString): HRESULT; +begin + Result := S_FALSE; +end; + +function TTBViewAccObject.get_accFocus(out pvarID: TTBVariant): HRESULT; +begin + Result := S_FALSE; +end; + +function TTBViewAccObject.get_accHelp(varChild: TTBVariant; + out pszHelp: WideString): HRESULT; +begin + Result := S_FALSE; +end; + +function TTBViewAccObject.get_accHelpTopic(out pszHelpFile: WideString; + varChild: TTBVariant; out pidTopic: Integer): HRESULT; +begin + pidTopic := 0; { Delphi doesn't implicitly clear Integer 'out' parameters } + Result := S_FALSE; +end; + +function TTBViewAccObject.get_accKeyboardShortcut(varChild: TTBVariant; + out pszKeyboardShortcut: WideString): HRESULT; +begin + try + if not Check(varChild, Result) then + Exit; + if vsMenuBar in FView.Style then begin + pszKeyboardShortcut := GetAltKeyName; + Result := S_OK; + end + else + Result := S_FALSE; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBViewAccObject.get_accName(varChild: TTBVariant; + out pszName: WideString): HRESULT; +var + S: String; +begin + try + if not Check(varChild, Result) then + Exit; + if Assigned(FView.ParentView) and Assigned(FView.ParentView.OpenViewer) then + S := StripAccelChars(TTBItemViewerAccess(FView.ParentView.OpenViewer).GetCaptionText); + if S = '' then + {$IFNDEF CLR} + S := TControlAccess(FView.Window).Caption; + {$ELSE} + S := FView.Window.GetText; + {$ENDIF} + pszName := S; + Result := S_OK; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBViewAccObject.get_accParent(out ppdispParent {$IFNDEF CLR}: IDispatch{$ENDIF}): HRESULT; +begin + try + if Assigned(FView) then begin + if Assigned(FView.ParentView) and Assigned(FView.ParentView.OpenViewer) then begin + ppdispParent := FView.ParentView.OpenViewer.GetAccObject; + Result := S_OK; + end + else + Result := AccObjectFromWindow(FView.Window.Handle, ppdispParent); + end + else + Result := E_FAIL; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBViewAccObject.get_accRole(varChild: TTBVariant; + out pvarRole: TTBVariant): HRESULT; +var + Role: Integer; +begin + try + if not Check(varChild, Result) then + Exit; + if FView.IsPopup then + Role := ROLE_SYSTEM_MENUPOPUP + else begin + if vsMenuBar in FView.Style then + Role := ROLE_SYSTEM_MENUBAR + else + Role := ROLE_SYSTEM_TOOLBAR; + end; + pvarRole := TTBVariant(Role); + Result := S_OK; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBViewAccObject.get_accSelection(out pvarChildren: TTBVariant): HRESULT; +begin + Result := S_FALSE; +end; + +function TTBViewAccObject.get_accState(varChild: TTBVariant; + out pvarState: TTBVariant): HRESULT; +begin + try + if not Check(varChild, Result) then + Exit; + pvarState := TTBVariant(Integer(0)); + Result := S_OK; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBViewAccObject.get_accValue(varChild: TTBVariant; + out pszValue: WideString): HRESULT; +begin + Result := S_FALSE; +end; + +function TTBViewAccObject.put_accName(varChild: TTBVariant; + const pszName: WideString): HRESULT; +begin + Result := S_FALSE; +end; + +function TTBViewAccObject.put_accValue(varChild: TTBVariant; + const pszValue: WideString): HRESULT; +begin + Result := S_FALSE; +end; + +{ TTBItemViewerAccObject } + +constructor TTBItemViewerAccObject.Create(AViewer: TTBItemViewer); +begin + inherited Create; + FViewer := AViewer; + InterlockedIncrement(ItemViewerAccObjectInstances); +end; + +{$IFNDEF CLR} +destructor TTBItemViewerAccObject.Destroy; +begin + InterlockedDecrement(ItemViewerAccObjectInstances); + if Assigned(FViewer) then begin + TTBItemViewerAccess(FViewer).FAccObjectInstance := nil; + FViewer := nil; + end; + inherited; +end; +{$ELSE} +procedure TTBItemViewerAccObject.Finalize; +begin + InterlockedDecrement(ItemViewerAccObjectInstances); + inherited; +end; +{$ENDIF} + +procedure TTBItemViewerAccObject.ClientIsDestroying; +begin + FViewer := nil; +end; + +function TTBItemViewerAccObject.Check(const varChild: TTBVariant; + var ErrorCode: HRESULT): Boolean; +begin + if FViewer = nil then begin + ErrorCode := E_FAIL; + Result := False; + end + else if not VarIsInteger(varChild) or (Integer(varChild) <> CHILDID_SELF) then begin + ErrorCode := E_INVALIDARG; + Result := False; + end + else + Result := True; +end; + +function TTBItemViewerAccObject.IsActionable: Boolean; +{ Returns True if 'doDefaultAction' may be performed on the viewer, i.e. if + it's visible/off-edge/clipped, enabled & selectable, and the view is + focusable. } +begin + Result := FViewer.IsAccessible and IsAvailable and IsFocusable; +end; + +function TTBItemViewerAccObject.IsAvailable: Boolean; +{ Returns True if the viewer's item is enabled and selectable } +begin + Result := FViewer.Item.Enabled and + (tbisSelectable in TTBCustomItemAccess(FViewer.Item).ItemStyle); +end; + +function TTBItemViewerAccObject.IsFocusable: Boolean; +{ Returns True if viewers on the view can be 'focused' (i.e. the view's window + doesn't have the csDesigning state, the window is visible and enabled, and + the application is active). } + + function IsWindowAndParentsEnabled(W: HWND): Boolean; + begin + Result := True; + repeat + if not IsWindowEnabled(W) then begin + Result := False; + Break; + end; + W := GetParent(W); + until W = 0; + end; + +var + ViewWnd, ActiveWnd: HWND; +begin + Result := False; + if csDesigning in FViewer.View.Window.ComponentState then + Exit; + ViewWnd := FViewer.View.Window.Handle; + if IsWindowVisible(ViewWnd) and IsWindowAndParentsEnabled(ViewWnd) then begin + if vsModal in FViewer.View.State then + Result := True + else begin + ActiveWnd := GetActiveWindow; + if (ActiveWnd <> 0) and + ((ActiveWnd = ViewWnd) or IsChild(ActiveWnd, ViewWnd)) then + Result := True; + end; + end; +end; + +procedure TTBItemViewerAccObject.HandleAccSelect(const AExecute: Boolean); +begin + if Assigned(FViewer) and + ((AExecute and IsActionable) or (not AExecute and IsFocusable)) then begin + FViewer.View.Selected := FViewer; + FViewer.View.ScrollSelectedIntoView; + if vsModal in FViewer.View.State then begin + if AExecute then + FViewer.View.ExecuteSelected(False); + end + else if (FViewer.View.ParentView = nil) and (GetCapture = 0) then begin + if AExecute then + FViewer.View.EnterToolbarLoop([tbetExecuteSelected, tbetFromMSAA]) + else + FViewer.View.EnterToolbarLoop([tbetFromMSAA]); + end; + end; +end; + +function TTBItemViewerAccObject.accDoDefaultAction(varChild: TTBVariant): HRESULT; +begin + try + if not Check(varChild, Result) then + Exit; + { NOTE: This must be kept in synch with get_accDefaultAction } + if IsActionable then begin + Result := S_OK; + if FViewer.View.OpenViewer = FViewer then begin + FViewer.View.CancelChildPopups; + { Like standard menus, cancel the modal loop when a top-level menu + is closed } + if (vsModal in FViewer.View.State) and not FViewer.View.IsPopup then + FViewer.View.EndModal; + end + else begin + FViewer.View.Selected := FViewer; + FViewer.View.ScrollSelectedIntoView; + TTBItemViewerAccess(FViewer).PostAccSelect(True); + end; + end + else + { Note: Standard menus return DISP_E_MEMBERNOTFOUND in this case but + that doesn't make much sense. The member is there but just isn't + currently available. } + Result := E_FAIL; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.accHitTest(xLeft, yTop: Integer; + out pvarID: TTBVariant): HRESULT; +var + P: TPoint; +begin + try + if FViewer = nil then begin + Result := E_FAIL; + Exit; + end; + P := FViewer.View.Window.ScreenToClient(Point(xLeft, yTop)); + if PtInRect(FViewer.BoundsRect, P) then begin + pvarID := TTBVariant(Integer(CHILDID_SELF)); + Result := S_OK; + end + else + Result := S_FALSE; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.accLocation(out pxLeft, pyTop, pcxWidth, + pcyHeight: Integer; varChild: TTBVariant): HRESULT; +var + R: TRect; + P: TPoint; +begin + try + if not Check(varChild, Result) then + Exit; + R := FViewer.BoundsRect; + P := FViewer.View.Window.ClientToScreen(Point(0, 0)); + OffsetRect(R, P.X, P.Y); + pxLeft := R.Left; + pyTop := R.Top; + pcxWidth := R.Right - R.Left; + pcyHeight := R.Bottom - R.Top; + Result := S_OK; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.accNavigate(navDir: Integer; varStart: TTBVariant; + out pvarEnd: TTBVariant): HRESULT; +var + I, J: Integer; + View: TTBView; +begin + try + if not Check(varStart, Result) then + Exit; + Result := S_FALSE; + if (navDir = NAVDIR_FIRSTCHILD) or (navDir = NAVDIR_LASTCHILD) then begin + { Return the child view's acc. object } + View := FViewer.View.OpenViewerView; + if Assigned(View) then begin + AssignObjectToVar(pvarEnd, View.GetAccObject); + Result := S_OK; + end; + end + else begin + I := FViewer.View.IndexOf(FViewer); + if I >= 0 then begin + case navDir of + NAVDIR_UP, NAVDIR_LEFT, NAVDIR_PREVIOUS: + for J := I-1 downto 0 do + if FViewer.View.Viewers[J].IsAccessible then begin + AssignObjectToVar(pvarEnd, FViewer.View.Viewers[J].GetAccObject); + Result := S_OK; + Break; + end; + NAVDIR_DOWN, NAVDIR_RIGHT, NAVDIR_NEXT: + for J := I+1 to FViewer.View.ViewerCount-1 do + if FViewer.View.Viewers[J].IsAccessible then begin + AssignObjectToVar(pvarEnd, FViewer.View.Viewers[J].GetAccObject); + Result := S_OK; + Break; + end; + end; + end; + end; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.accSelect(flagsSelect: Integer; + varChild: TTBVariant): HRESULT; +begin + try + if not Check(varChild, Result) then + Exit; + if flagsSelect <> SELFLAG_TAKEFOCUS then begin + Result := E_INVALIDARG; + Exit; + end; + if IsFocusable and (FViewer.Show or FViewer.Clipped) then begin + FViewer.View.Selected := FViewer; + FViewer.View.ScrollSelectedIntoView; + if not(vsModal in FViewer.View.State) and + (FViewer.View.ParentView = nil) then + TTBItemViewerAccess(FViewer).PostAccSelect(False); + end + else + Result := E_FAIL; + { ^ what Office XP returns when you try focusing an off-edge item } + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.get_accChild(varChild: TTBVariant; + out ppdispChild {$IFNDEF CLR}: IDispatch{$ENDIF}): HRESULT; +var + View: TTBView; +begin + try + if FViewer = nil then begin + Result := E_FAIL; + Exit; + end; + Result := E_INVALIDARG; + if VarIsInteger(varChild) then begin + if Integer(varChild) = CHILDID_SELF then begin + ppdispChild := Self; + Result := S_OK; + end + else if Integer(varChild) = 1 then begin + { Return the child view's acc. object } + View := FViewer.View.OpenViewerView; + if Assigned(View) then begin + ppdispChild := View.GetAccObject; + Result := S_OK; + end; + end; + end; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.get_accChildCount(out pcountChildren: Integer): HRESULT; +begin + try + if FViewer = nil then begin + Result := E_FAIL; + Exit; + end; + { Return 1 if the viewer has a child view } + if FViewer.View.OpenViewer = FViewer then + pCountChildren := 1 + else + pCountChildren := 0; + Result := S_OK; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.get_accDefaultAction(varChild: TTBVariant; + out pszDefaultAction: WideString): HRESULT; +begin + try + if not Check(varChild, Result) then + Exit; + if IsActionable then begin + { I'm not sure if these should be localized, or even if any screen + readers make use of this text... + NOTE: This must be kept in synch with accDoDefaultAction } + if FViewer.View.OpenViewer = FViewer then + pszDefaultAction := 'Close' + else if tbisSubmenu in TTBCustomItemAccess(FViewer.Item).ItemStyle then + pszDefaultAction := 'Open' + else if FViewer.View.IsPopup or (vsMenuBar in FViewer.View.Style) then + pszDefaultAction := 'Execute' + else + pszDefaultAction := 'Press'; + Result := S_OK; + end + else + Result := S_FALSE; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.get_accDescription(varChild: TTBVariant; + out pszDescription: WideString): HRESULT; +begin + Result := S_FALSE; +end; + +function TTBItemViewerAccObject.get_accFocus(out pvarID: TTBVariant): HRESULT; +begin + try + if FViewer = nil then begin + Result := E_FAIL; + Exit; + end; + if (vsModal in FViewer.View.State) and + (FViewer.View.Selected = FViewer) then begin + pvarID := TTBVariant(Integer(CHILDID_SELF)); + Result := S_OK; + end + else + Result := S_FALSE; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.get_accHelp(varChild: TTBVariant; + out pszHelp: WideString): HRESULT; +begin + Result := S_FALSE; +end; + +function TTBItemViewerAccObject.get_accHelpTopic(out pszHelpFile: WideString; + varChild: TTBVariant; out pidTopic: Integer): HRESULT; +begin + pidTopic := 0; { Delphi doesn't implicitly clear Integer 'out' parameters } + Result := S_FALSE; +end; + +function TTBItemViewerAccObject.get_accKeyboardShortcut(varChild: TTBVariant; + out pszKeyboardShortcut: WideString): HRESULT; +var + C: Char; +begin + try + if not Check(varChild, Result) then + Exit; + Result := S_FALSE; + if TTBItemViewerAccess(FViewer).CaptionShown then begin + C := FindAccelChar(TTBItemViewerAccess(FViewer).GetCaptionText); + if C <> #0 then begin + C := CharToLower(C); { like standard menus, always use lowercase... } + if FViewer.View.IsPopup then + pszKeyboardShortcut := C + else begin + { Prefix 'Alt+' } + pszKeyboardShortcut := GetAltKeyName + '+' + C; + end; + Result := S_OK; + end; + end; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.get_accName(varChild: TTBVariant; + out pszName: WideString): HRESULT; +var + C, S: String; +begin + try + if not Check(varChild, Result) then + Exit; + C := StripAccelChars(TTBItemViewerAccess(FViewer).GetCaptionText); + if not FViewer.IsToolbarStyle then + S := FViewer.Item.GetShortCutText; + if S = '' then + pszName := C + else + pszName := C + #9 + S; + Result := S_OK; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.get_accParent(out ppdispParent {$IFNDEF CLR}: IDispatch{$ENDIF}): HRESULT; +begin + try + if Assigned(FViewer) then begin + ppdispParent := FViewer.View.GetAccObject; + Result := S_OK; + end + else + Result := E_FAIL; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.get_accRole(varChild: TTBVariant; + out pvarRole: TTBVariant): HRESULT; +begin + try + if not Check(varChild, Result) then + Exit; + pvarRole := TTBVariant(Integer(TTBItemViewerAccess(FViewer).GetAccRole)); + Result := S_OK; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.get_accSelection(out pvarChildren: TTBVariant): HRESULT; +begin + Result := S_FALSE; +end; + +function TTBItemViewerAccObject.get_accState(varChild: TTBVariant; + out pvarState: TTBVariant): HRESULT; +var + Flags: Integer; +begin + try + if not Check(varChild, Result) then + Exit; + Flags := 0; + if FViewer.View.Selected = FViewer then begin + Flags := Flags or STATE_SYSTEM_HOTTRACKED; + if vsModal in FViewer.View.State then + Flags := Flags or STATE_SYSTEM_FOCUSED; + if FViewer.View.MouseOverSelected and FViewer.View.Capture then + { ^ based on "IsPushed :=" code in TTBView.DrawItem } + Flags := Flags or STATE_SYSTEM_PRESSED; + end; + if tbisSubmenu in TTBCustomItemAccess(FViewer.Item).ItemStyle then + Flags := Flags or STATE_SYSTEM_HASPOPUP; + if FViewer.Show or FViewer.Clipped then begin + if IsFocusable then + Flags := Flags or STATE_SYSTEM_FOCUSABLE; + end + else begin + { Mark off-edge items as invisible, like Office } + Flags := Flags or STATE_SYSTEM_INVISIBLE; + end; + if not IsAvailable then + Flags := Flags or STATE_SYSTEM_UNAVAILABLE; + if FViewer.Item.Checked then + Flags := Flags or STATE_SYSTEM_CHECKED; + pvarState := TTBVariant(Flags); + Result := S_OK; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.get_accValue(varChild: TTBVariant; + out pszValue: WideString): HRESULT; +begin + try + if not Check(varChild, Result) then + Exit; + if TTBItemViewerAccess(FViewer).GetAccValue(pszValue) then + Result := S_OK + else begin + { When S_FALSE is returned, the Inspect tool wants NULL in pszValue. + On Delphi for Win32, '' is NULL. On .NET, we have to assign nil. } + pszValue := {$IFNDEF CLR} '' {$ELSE} nil {$ENDIF}; + Result := S_FALSE; + end; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.put_accName(varChild: TTBVariant; + const pszName: WideString): HRESULT; +begin + Result := S_FALSE; +end; + +function TTBItemViewerAccObject.put_accValue(varChild: TTBVariant; + const pszValue: WideString): HRESULT; +begin + Result := S_FALSE; +end; + +{$IFNDEF CLR} +{ Note: This COM initialization code based on code from DBTables } +var + SaveInitProc: Pointer; + NeedToUninitialize: Boolean; + +procedure InitCOM; +begin + if SaveInitProc <> nil then TProcedure(SaveInitProc); + NeedToUninitialize := SUCCEEDED(CoInitialize(nil)); +end; + +initialization + InitializeCriticalSection(LastAccObjectCritSect); + if not IsLibrary then begin + SaveInitProc := InitProc; + InitProc := @InitCOM; + end; +finalization + DisconnectAccObjects; + if NeedToUninitialize then + CoUninitialize; + DeleteCriticalSection(LastAccObjectCritSect); +{$ENDIF} +end. diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2Anim.pas b/official/2.2.2+2.4.2/TB2K/Source/TB2Anim.pas new file mode 100644 index 0000000..96d9756 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Source/TB2Anim.pas @@ -0,0 +1,323 @@ +unit TB2Anim; + +{ + Toolbar2000 + Copyright (C) 1998-2008 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2Anim.pas,v 1.13 2008/09/19 16:41:00 jr Exp $ +} + +interface + +{$I TB2Ver.inc} +{$Q-} + +uses + Windows, Messages, SysUtils, Classes; + +const + WM_TB2K_ANIMATIONENDED = WM_USER + $556; + +type + TTBAnimationDirection = set of (tbadLeft, tbadRight, tbadDown, tbadUp); + +procedure TBStartAnimation(const AWnd: HWND; const ABlend: Boolean; + const ADirection: TTBAnimationDirection); +procedure TBUpdateAnimation; +procedure TBEndAnimation(const Wnd: HWND); +function TBIsAnimationInProgress: Boolean; + +implementation + +uses + {$IFDEF CLR} System.Security, System.Runtime.InteropServices, System.Threading, {$ENDIF} + TB2Common; + +{ Notes to self: + - It originally had the NOMIRRORBITMAP flag on the BitBlt calls, because + Windows 2000's AnimateWindow function has it. But it had to be removed + because on Windows 98 with the Standard VGA or VMware video driver, it + caused no bits to be blitted, even though Windows 98 is supposed to + support NOMIRRORBITMAP according to the documentation. I don't think it's + necessary anyway. +} + +const + DCX_USESTYLE = $10000; + WS_EX_LAYERED = $80000; + NOMIRRORBITMAP = $80000000; + ULW_ALPHA = 2; + +type + PAnimateThreadFuncData = ^TAnimateThreadFuncData; + TAnimateThreadFuncData = record + FRunning: Boolean; + FWnd: HWND; + FTime: Integer; + FBlending: Boolean; + FStartStep, FCurStep: Integer; + FStartTime, FLastFrameTime: DWORD; + FWndDC, FBmpDC: HDC; + FBmp: HBITMAP; + FScreenClientRect: TRect; + FSize: TSize; + FLastPos: TPoint; + FDirection: TTBAnimationDirection; + end; + { Delphi.NET 2007 note: Because TRect/TSize/TPoint are wrongly declared as + 'packed', fields of these types must be preceded by an Integer- or + IntPtr-sized field to ensure correct alignment and avoid an alignment + fault on IA-64. } + +{$IFNDEF CLR} +var + UpdateLayeredWindowProc: function(Handle: HWND; hdcDest: HDC; + pptDst: PPoint; _psize: PSize; hdcSrc: HDC; pptSrc: PPoint; + crKey: COLORREF; var pblend: TBLENDFUNCTION; dwFlags: DWORD): BOOL; stdcall; +{$ELSE} +{ We can't use Borland.Vcl.Windows' UpdateLayeredWindow because the "pblend" + parameter is misdeclared (see QC #25130) } +[SuppressUnmanagedCodeSecurity, DllImport(user32, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'UpdateLayeredWindow')] +function UpdateLayeredWindowProc(Handle: HWND; hdcDest: HDC; const pptDst: TPoint; + const _psize: TSize; hdcSrc: HDC; const pptSrc: TPoint; + crKey: COLORREF; [in] var pblend: TBLENDFUNCTION; dwFlags: DWORD): BOOL; overload; external; +[SuppressUnmanagedCodeSecurity, DllImport(user32, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'UpdateLayeredWindow')] +function UpdateLayeredWindowProc(Handle: HWND; hdcDest: HDC; pptDst: IntPtr; + _psize: IntPtr; hdcSrc: HDC; pptSrc: IntPtr; + crKey: COLORREF; [in] var pblend: TBLENDFUNCTION; dwFlags: DWORD): BOOL; overload; external; +{$ENDIF} + +threadvar + AnimateData: TAnimateThreadFuncData; + +procedure FinalizeAnimation; +begin + {$IFNDEF CLR} + with PAnimateThreadFuncData(@AnimateData)^ do begin + {$ELSE} + with AnimateData do begin + {$ENDIF} + FRunning := False; + if FBmpDC <> 0 then begin + if FBlending then + SetWindowLong(FWnd, GWL_EXSTYLE, + GetWindowLong(FWnd, GWL_EXSTYLE) and not WS_EX_LAYERED) + else + SetWindowRgn(FWnd, 0, False); + BitBlt(FWndDC, 0, 0, FSize.cx, FSize.cy, FBmpDC, 0, 0, SRCCOPY); + DeleteDC(FBmpDC); + FBmpDC := 0; + end; + if FBmp <> 0 then begin + DeleteObject(FBmp); + FBmp := 0; + end; + if FWndDC <> 0 then begin + ReleaseDC(FWnd, FWndDC); + FWndDC := 0; + end; + if FWnd <> 0 then begin + SendNotifyMessage(FWnd, WM_TB2K_ANIMATIONENDED, 0, 0); + FWnd := 0; + end; + end; +end; + +function TBIsAnimationInProgress: Boolean; +begin + Result := AnimateData.FRunning; +end; + +procedure TBEndAnimation(const Wnd: HWND); +begin + if AnimateData.FRunning and + ((Wnd = 0) or (AnimateData.FWnd = Wnd)) then + FinalizeAnimation; +end; + +procedure TBStartAnimation(const AWnd: HWND; const ABlend: Boolean; + const ADirection: TTBAnimationDirection); +var + ZeroPt: TPoint; + R: TRect; + Blend: TBlendFunction; + Rgn: HRGN; +begin + FinalizeAnimation; + + ZeroPt.X := 0; + ZeroPt.Y := 0; + + try + {$IFNDEF CLR} + { Note: The pointer cast avoids GetTls calls for every field access } + with PAnimateThreadFuncData(@AnimateData)^ do begin + {$ELSE} + with AnimateData do begin + {$ENDIF} + FWnd := AWnd; + FBlending := ABlend and {$IFNDEF CLR} Assigned(UpdateLayeredWindowProc) + {$ELSE} (Win32MajorVersion >= 5) {$ENDIF}; + FDirection := ADirection; + GetCursorPos(FLastPos); + GetClientRect(FWnd, FScreenClientRect); + MapWindowPoints(FWnd, 0, FScreenClientRect, 2); + GetWindowRect(FWnd, R); + FWndDC := GetDCEx(FWnd, 0, DCX_WINDOW or DCX_CACHE {or DCX_USESTYLE ?}); + if FWndDC = 0 then + RaiseLastOSError; + FSize.cx := R.Right - R.Left; + FSize.cy := R.Bottom - R.Top; + FBmp := CreateCompatibleBitmap(FWndDC, FSize.cx, FSize.cy {or $01000000 ?}); + if FBmp = 0 then + RaiseLastOSError; + FBmpDC := CreateCompatibleDC(FWndDC); + if FBmpDC = 0 then + RaiseLastOSError; + // AnimateWindow calls SetLayout, but I'm not sure that we need to. + //if Assigned(SetLayoutProc) then + // SetLayoutProc(FBmpDC, 0); + SelectObject(FBmpDC, FBmp); + //SetBoundsRect(FBmpDC, nil, DCB_RESET or DCB_ENABLE); + SendMessage(FWnd, WM_PRINT, WPARAM(FBmpDC), PRF_NONCLIENT or PRF_CLIENT or + PRF_ERASEBKGND or PRF_CHILDREN); + //GetBoundsRect + if FBlending then begin + SetWindowLong(FWnd, GWL_EXSTYLE, GetWindowLong(FWnd, GWL_EXSTYLE) or WS_EX_LAYERED); + FTime := 175; { actually more like ~147 because FCurStep starts at 40 } + FCurStep := 40; + Blend.BlendOp := AC_SRC_OVER; + Blend.BlendFlags := 0; + Blend.SourceConstantAlpha := FCurStep; + Blend.AlphaFormat := 0; + Win32Check(UpdateLayeredWindowProc(FWnd, 0, {$IFNDEF CLR}@{$ENDIF} R.TopLeft, + {$IFNDEF CLR}@{$ENDIF} FSize, FBmpDC, {$IFNDEF CLR}@{$ENDIF} ZeroPt, + 0, Blend, ULW_ALPHA)); + end + else begin + FTime := 150; + FCurStep := 0; + Rgn := CreateRectRgn(0, 0, 0, 0); + if not BOOL(SetWindowRgn(FWnd, Rgn, False)) then + DeleteObject(Rgn); { just in case } + end; + FStartStep := FCurStep; + FStartTime := GetTickCount; + FLastFrameTime := FStartTime; + { These are the same flags AnimateWindow uses. SWP_ASYNCWINDOWPOS is + needed or else it doesn't "save bits" properly. + Note: SWP_ASYNCWINDOWPOS seems to have no effect on Windows 95 & NT 4.0, + so bits behind the window are not saved & restored correctly. } + SetWindowPos(FWnd, 0, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE or + SWP_NOZORDER or SWP_NOACTIVATE or SWP_SHOWWINDOW or SWP_NOREDRAW or + SWP_NOOWNERZORDER or SWP_ASYNCWINDOWPOS); + FRunning := True; + end; + except + FinalizeAnimation; + raise; + end; +end; + +procedure TBUpdateAnimation; +var + ThisFrameTime: DWORD; + ElapsedTime, NewStep: Integer; + P: TPoint; + Blend: TBlendFunction; + X, Y: Integer; + Rgn: HRGN; +begin + {$IFNDEF CLR} + with PAnimateThreadFuncData(@AnimateData)^ do begin + {$ELSE} + with AnimateData do begin + {$ENDIF} + if not FRunning then + Exit; + + { If 10 msec hasn't passed since the last call, exit. We don't want to + monopolize the CPU. } + ThisFrameTime := GetTickCount; + if ThisFrameTime - FLastFrameTime < 10 then + Exit; + FLastFrameTime := ThisFrameTime; + + ElapsedTime := ThisFrameTime - FStartTime; + if (ElapsedTime < 0) or (ElapsedTime >= FTime) then begin + FinalizeAnimation; + Exit; + end; + NewStep := FStartStep + ((255 * ElapsedTime) div FTime); + if (NewStep < 0) or (NewStep >= 255) then begin + FinalizeAnimation; + Exit; + end; + + GetCursorPos(P); + if (P.X <> FLastPos.X) or (P.Y <> FLastPos.Y) then begin + if PtInRect(FScreenClientRect, P) then begin + FinalizeAnimation; + Exit; + end; + FLastPos := P; + end; + + if NewStep > FCurStep then begin + FCurStep := NewStep; + if FBlending then begin + Blend.BlendOp := AC_SRC_OVER; + Blend.BlendFlags := 0; + Blend.SourceConstantAlpha := NewStep; + Blend.AlphaFormat := 0; + UpdateLayeredWindowProc(FWnd, 0, nil, nil, 0, nil, 0, Blend, ULW_ALPHA); + end + else begin + if tbadDown in FDirection then + Y := MulDiv(FSize.cy, NewStep, 255) - FSize.cy + else if tbadUp in FDirection then + Y := FSize.cy - MulDiv(FSize.cy, NewStep, 255) + else + Y := 0; + if tbadRight in FDirection then + X := MulDiv(FSize.cx, NewStep, 255) - FSize.cx + else if tbadLeft in FDirection then + X := FSize.cx - MulDiv(FSize.cx, NewStep, 255) + else + X := 0; + Rgn := CreateRectRgn(X, Y, X + FSize.cx, Y + FSize.cy); + if not BOOL(SetWindowRgn(FWnd, Rgn, False)) then + DeleteObject(Rgn); { just in case } + BitBlt(FWndDC, X, Y, FSize.cx, FSize.cy, FBmpDC, 0, 0, SRCCOPY); + end; + end; + end; +end; + +initialization + {$IFNDEF CLR} + UpdateLayeredWindowProc := GetProcAddress(GetModuleHandle(user32), + 'UpdateLayeredWindow'); + {$ENDIF} +finalization + FinalizeAnimation; +end. diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2Common.pas b/official/2.2.2+2.4.2/TB2K/Source/TB2Common.pas new file mode 100644 index 0000000..e94bb9d --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Source/TB2Common.pas @@ -0,0 +1,1571 @@ +unit TB2Common; + +{ + Toolbar2000 + Copyright (C) 1998-2008 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2Common.pas,v 1.48 2008/09/17 19:46:30 jr Exp $ +} + +interface + +{$I TB2Ver.inc} + +uses + Windows, Classes, SysUtils, Messages, Controls, Forms; + +type + THandleWMPrintNCPaintProc = procedure(Wnd: HWND; DC: HDC; AppData: TObject); + TPaintHandlerProc = procedure(var Message: TWMPaint) of object; + + { The type of item a TList holds; it differs between Win32 and .NET VCL } + TListItemType = {$IFNDEF CLR} Pointer {$ELSE} TObject {$ENDIF}; + + {$IFNDEF CLR} + ClipToLongint = Longint; + {$ENDIF} + +function AddToFrontOfList(var List: TList; Item: TObject): Boolean; +function AddToList(var List: TList; Item: TObject): Boolean; +function ApplicationIsActive: Boolean; +function AreFlatMenusEnabled: Boolean; +function AreKeyboardCuesEnabled: Boolean; +procedure CallLockSetForegroundWindow(const ALock: Boolean); +function CallTrackMouseEvent(const Wnd: HWND; const Flags: DWORD): Boolean; +function CharToLower(const C: Char): Char; +{$IFDEF CLR} +function ClipToLongint(const I: Int64): Longint; inline; +{$ENDIF} +function CreateHalftoneBrush: HBRUSH; +function CreateMonoBitmap(const AWidth, AHeight: Integer; + const ABits: array of Byte): HBITMAP; +function CreateRotatedFont(DC: HDC): HFONT; +procedure DoubleBufferedRepaint(const Wnd: HWND); +procedure DrawHalftoneInvertRect(const DC: HDC; const NewRect, OldRect: TRect; + const NewSize, OldSize: TSize); +procedure DrawRotatedText(const DC: HDC; AText: String; const ARect: TRect; + const AFormat: Cardinal); +procedure DrawSmallWindowCaption(const Wnd: HWND; const DC: HDC; + const ARect: TRect; const AText: String; const AActive: Boolean); +function DrawTextStr(const DC: HDC; const AText: String; var ARect: TRect; + const AFormat: UINT): Integer; +function EscapeAmpersands(const S: String): String; +procedure FillRectWithGradient(const DC: HDC; const R: TRect; + const StartColor, EndColor: TColorRef; const HorizontalDirection: Boolean); +function FindAccelChar(const S: String): Char; +{$IFNDEF JR_D5} +procedure FreeAndNil(var Obj); +{$ENDIF} +function GetInputLocaleCodePage: UINT; +function GetMenuShowDelay: Integer; +function GetMessagePosAsPoint: TPoint; +function GetRectOfMonitorContainingPoint(const P: TPoint; const WorkArea: Boolean): TRect; +function GetRectOfMonitorContainingRect(const R: TRect; const WorkArea: Boolean): TRect; +function GetRectOfMonitorContainingWindow(const W: HWND; const WorkArea: Boolean): TRect; +function GetRectOfPrimaryMonitor(const WorkArea: Boolean): TRect; +function GetSystemNonClientMetrics(var Metrics: TNonClientMetrics): Boolean; +function GetSystemParametersInfoBool(const Param: UINT; const Default: BOOL): BOOL; +function GetTextExtentPoint32Str(const DC: HDC; const AText: String; + out ASize: TSize): BOOL; +function GetTextHeight(const DC: HDC): Integer; +function GetTextWidth(const DC: HDC; S: String; const Prefix: Boolean): Integer; +procedure HandleWMPrint(const Wnd: HWND; var Message: TMessage; + const NCPaintFunc: THandleWMPrintNCPaintProc; const AppData: TObject); +procedure HandleWMPrintClient(const PaintHandlerProc: TPaintHandlerProc; + const Message: {$IFNDEF CLR} TMessage {$ELSE} TWMPrintClient {$ENDIF}); +function IsWindowsXP: Boolean; +procedure InitTrackMouseEvent; +{$IFNDEF JR_D6} +function InvalidPoint(const At: TPoint): Boolean; +{$ENDIF} +function IsFillRectWithGradientAvailable: Boolean; +function Max(A, B: Integer): Integer; +function Min(A, B: Integer): Integer; +{$IFNDEF CLR} +function MethodsEqual(const M1, M2: TMethod): Boolean; +{$ENDIF} +function NeedToPlaySound(const Alias: String): Boolean; +procedure PlaySystemSound(const Alias: String); +procedure ProcessPaintMessages; +{$IFNDEF JR_D6} +procedure RaiseLastOSError; +{$ENDIF} +procedure RemoveMessages(const AMin, AMax: Integer); +procedure RemoveFromList(var List: TList; Item: TObject); +procedure SelectNCUpdateRgn(Wnd: HWND; DC: HDC; Rgn: HRGN); +function StripAccelChars(const S: String): String; +function StripTrailingPunctuation(const S: String): String; +function TextOutStr(const DC: HDC; const X, Y: Integer; + const AText: String): BOOL; +function UsingMultipleMonitors: Boolean; + +const + PopupMenuWindowNCSize = 3; + DT_HIDEPREFIX = $00100000; + +implementation + +uses + {$IFDEF CLR} Types, System.Security, System.Runtime.InteropServices, + System.Text, MultiMon, {$ENDIF} + MMSYSTEM, TB2Version; + +function ApplicationIsActive: Boolean; +{ Returns True if the application is in the foreground } +begin + Result := GetActiveWindow <> 0; +end; + +type + {$IFNDEF CLR} + PPrintEnumProcData = ^TPrintEnumProcData; + TPrintEnumProcData = record + {$ELSE} + TPrintEnumProcData = class + private + {$ENDIF} + PrintChildren: Boolean; + ParentWnd: HWND; + DC: HDC; + PrintFlags: LPARAM; + {$IFDEF CLR} + function PrintEnumProc(Wnd: HWND; LParam: LPARAM): BOOL; + {$ENDIF} + end; + +{$IFNDEF CLR} +function PrintEnumProc(Wnd: HWND; LParam: LPARAM): BOOL; stdcall; +{$ELSE} +function TPrintEnumProcData.PrintEnumProc(Wnd: HWND; LParam: LPARAM): BOOL; +{$ENDIF} +var + R: TRect; + SaveIndex: Integer; +begin + Result := True; { continue enumerating } + {$IFNDEF CLR} + with PPrintEnumProcData(LParam)^ do + {$ENDIF} + begin + { Skip window if it isn't a child/owned window of ParentWnd or isn't visible } + if (HWND(GetWindowLong(Wnd, GWL_HWNDPARENT)) <> ParentWnd) or + (GetWindowLong(Wnd, GWL_STYLE) and WS_VISIBLE = 0) then + { ^ don't use IsWindowVisible since it returns False if the window's + parent window is not visible } + Exit; + GetWindowRect(Wnd, R); + MapWindowPoints(0, ParentWnd, R, 2); + SaveIndex := SaveDC(DC); + { Like Windows, offset the window origin to the top-left coordinates of + the child/owned window } + MoveWindowOrg(DC, R.Left, R.Top); + { Like Windows, intersect the clipping region with the entire rectangle of + the child/owned window } + OffsetRect(R, -R.Left, -R.Top); + IntersectClipRect(DC, R.Left, R.Top, R.Right, R.Bottom); + { Send a WM_PRINT message to the child/owned window } + SendMessage(Wnd, WM_PRINT, WPARAM(DC), PrintFlags); + { Restore the DC's state, in case the WM_PRINT handler didn't put things + back the way it found them } + RestoreDC(DC, SaveIndex); + end; +end; + +procedure HandleWMPrint(const Wnd: HWND; var Message: TMessage; + const NCPaintFunc: THandleWMPrintNCPaintProc; const AppData: TObject); +{ note: AppData is an application-defined value which is passed to NCPaintFunc } +var + DC: HDC; + SaveIndex, SaveIndex2: Integer; + R: TRect; + P: TPoint; + Data: TPrintEnumProcData; +begin + if (Message.LParam and PRF_CHECKVISIBLE = 0) or IsWindowVisible(Wnd) then begin + DC := HDC(Message.WParam); + SaveIndex2 := SaveDC(DC); + try + if Message.LParam and PRF_NONCLIENT <> 0 then begin + SaveIndex := SaveDC(DC); + if Assigned(NCPaintFunc) then + NCPaintFunc(Wnd, DC, AppData); + RestoreDC(DC, SaveIndex); + end; + { Calculate the difference between the top-left corner of the window + and the top-left corner of its client area } + GetWindowRect(Wnd, R); + P.X := 0; P.Y := 0; + ClientToScreen(Wnd, P); + Dec(P.X, R.Left); Dec(P.Y, R.Top); + if Message.LParam and PRF_CLIENT <> 0 then begin + { Like Windows, the flags PRF_ERASEBKGND, PRF_CHILDREN, and PRF_OWNED + are ignored if PRF_CLIENT isn't also specified } + if Message.LParam and PRF_ERASEBKGND <> 0 then begin + { Send WM_ERASEBKGND } + SaveIndex := SaveDC(DC); + if Message.LParam and PRF_NONCLIENT <> 0 then + MoveWindowOrg(DC, P.X, P.Y); + SendMessage(Wnd, WM_ERASEBKGND, Message.WParam, 0); + RestoreDC(DC, SaveIndex); + end; + { Send WM_PRINTCLIENT } + SaveIndex := SaveDC(DC); + if Message.LParam and PRF_NONCLIENT <> 0 then + MoveWindowOrg(DC, P.X, P.Y); + SendMessage(Wnd, WM_PRINTCLIENT, Message.WParam, 0); + RestoreDC(DC, SaveIndex); + { Like Windows, always offset child/owned windows by the size of the + client area even if PRF_NONCLIENT isn't specified (a bug?) } + MoveWindowOrg(DC, P.X, P.Y); + {$IFDEF CLR} + Data := TPrintEnumProcData.Create; + {$ENDIF} + Data.ParentWnd := Wnd; + Data.DC := DC; + { Send WM_PRINT to child/owned windows } + if Message.LParam and PRF_CHILDREN <> 0 then begin + Data.PrintChildren := True; + Data.PrintFlags := (Message.LParam or (PRF_NONCLIENT or PRF_CLIENT or + PRF_ERASEBKGND or PRF_CHILDREN)) and not PRF_CHECKVISIBLE; + {$IFNDEF CLR} + EnumChildWindows(Wnd, @PrintEnumProc, LPARAM(@Data)); + {$ELSE} + EnumChildWindows(Wnd, Data.PrintEnumProc, 0); + {$ENDIF} + end; + if Message.LParam and PRF_OWNED <> 0 then begin + Data.PrintChildren := False; + Data.PrintFlags := Message.LParam; + {$IFNDEF CLR} + EnumWindows(@PrintEnumProc, LPARAM(@Data)); + {$ELSE} + EnumWindows(Data.PrintEnumProc, 0); + {$ENDIF} + end; + end; + finally + RestoreDC(DC, SaveIndex2); + end; + Message.Result := 1; + end + else begin + { Like Windows, return 0 when the PRF_CHECKVISIBLE flag is specified and + the window is not visible } + Message.Result := 0; + end; +end; + +procedure HandleWMPrintClient(const PaintHandlerProc: TPaintHandlerProc; + const Message: {$IFNDEF CLR} TMessage {$ELSE} TWMPrintClient {$ENDIF}); +var + DC: HDC; + Msg: TWMPaint; + SaveIndex: Integer; +begin + {$IFNDEF CLR} + DC := HDC(Message.WParam); + {$ELSE} + DC := Message.DC; + Msg := TWMPaint.Create; + {$ENDIF} + Msg.Msg := WM_PAINT; + Msg.DC := DC; + {$IFNDEF CLR} + Msg.Unused := 0; + {$ENDIF} + Msg.Result := 0; + SaveIndex := SaveDC(DC); + try + PaintHandlerProc(Msg); + finally + RestoreDC(DC, SaveIndex); + end; +end; + +function GetTextHeight(const DC: HDC): Integer; +var + TextMetric: TTextMetric; +begin + GetTextMetrics(DC, TextMetric); + Result := TextMetric.tmHeight; +end; + +function StripAccelChars(const S: String): String; +var + I: Integer; +begin + Result := S; + I := 1; + while I <= Length(Result) do begin + {$IFNDEF JR_WIDESTR} + if not(Result[I] in LeadBytes) then begin + {$ENDIF} + if Result[I] = '&' then + Delete(Result, I, 1); + Inc(I); + {$IFNDEF JR_WIDESTR} + end + else + Inc(I, 2); + {$ENDIF} + end; +end; + +function EscapeAmpersands(const S: String): String; +{ Replaces any '&' characters with '&&' } +var + I: Integer; +begin + Result := S; + I := 1; + while I <= Length(Result) do begin + {$IFNDEF JR_WIDESTR} + if not(Result[I] in LeadBytes) then begin + {$ENDIF} + if Result[I] = '&' then begin + Inc(I); + Insert('&', Result, I); + end; + Inc(I); + {$IFNDEF JR_WIDESTR} + end + else + Inc(I, 2); + {$ENDIF} + end; +end; + +function StripTrailingPunctuation(const S: String): String; +{ Removes any colon (':') or ellipsis ('...') from the end of S and returns + the resulting string } +var + L: Integer; +begin + Result := S; + L := Length(Result); + if (L > 1) and (Result[L] = ':') {$IFNDEF JR_WIDESTR} and (ByteType(Result, L) = mbSingleByte) {$ENDIF} then + SetLength(Result, L-1) + else if (L > 3) and (Result[L-2] = '.') and (Result[L-1] = '.') and + (Result[L] = '.') {$IFNDEF JR_WIDESTR} and (ByteType(Result, L-2) = mbSingleByte) {$ENDIF} then + SetLength(Result, L-3); +end; + +function GetTextWidth(const DC: HDC; S: String; const Prefix: Boolean): Integer; +{ Returns the width of the specified string using the font currently selected + into DC. If Prefix is True, it first removes "&" characters as necessary. } +var + Size: TSize; +begin + { This procedure is 10x faster than using DrawText with the DT_CALCRECT flag } + if Prefix then + S := StripAccelChars(S); + GetTextExtentPoint32Str(DC, S, Size); + Result := Size.cx; +end; + +procedure ProcessPaintMessages; +{ Dispatches all pending WM_PAINT messages. In effect, this is like an + 'UpdateWindow' on all visible windows } +var + Msg: TMsg; +begin + while PeekMessage(Msg, 0, WM_PAINT, WM_PAINT, PM_NOREMOVE) do begin + case Integer(GetMessage(Msg, 0, WM_PAINT, WM_PAINT)) of + -1: Break; { if GetMessage failed } + 0: begin + { Repost WM_QUIT messages } + PostQuitMessage(ClipToLongint(Msg.wParam)); + Break; + end; + end; + DispatchMessage(Msg); + end; +end; + +procedure RemoveMessages(const AMin, AMax: Integer); +{ Removes any messages with the specified ID from the queue } +var + Msg: TMsg; +begin + while PeekMessage(Msg, 0, AMin, AMax, PM_REMOVE) do begin + if Msg.message = WM_QUIT then begin + { Repost WM_QUIT messages } + PostQuitMessage(ClipToLongint(Msg.wParam)); + Break; + end; + end; +end; + +procedure SelectNCUpdateRgn(Wnd: HWND; DC: HDC; Rgn: HRGN); +var + R: TRect; + NewClipRgn: HRGN; +begin + if (Rgn <> 0) and (Rgn <> 1) then begin + GetWindowRect(Wnd, R); + if SelectClipRgn(DC, Rgn) = ERROR then begin + NewClipRgn := CreateRectRgnIndirect(R); + SelectClipRgn(DC, NewClipRgn); + DeleteObject(NewClipRgn); + end; + OffsetClipRgn(DC, -R.Left, -R.Top); + end; +end; + +function AddToList(var List: TList; Item: TObject): Boolean; +{ Returns True if Item didn't already exist in the list } +begin + if List = nil then + List := TList.Create; + Result := List.IndexOf(Item) = -1; + if Result then + List.Add(Item); +end; + +function AddToFrontOfList(var List: TList; Item: TObject): Boolean; +{ Returns True if Item didn't already exist in the list } +begin + if List = nil then + List := TList.Create; + Result := List.IndexOf(Item) = -1; + if Result then + List.Insert(0, Item); +end; + +procedure RemoveFromList(var List: TList; Item: TObject); +begin + if Assigned(List) then begin + List.Remove(Item); + if List.Count = 0 then begin + List.Free; + List := nil; + end; + end; +end; + +const + DefaultMenuShowDelay = 400; +{$IFNDEF CLR} +var + RegMenuShowDelay: Integer; + RegMenuShowDelayInited: BOOL = False; +function GetMenuShowDelay: Integer; + function ReadMenuShowDelayFromRegistry: Integer; + var + K: HKEY; + Typ, DataSize: DWORD; + Data: array[0..31] of Char; + Res: Longint; + E: Integer; + begin + Result := DefaultMenuShowDelay; + if RegOpenKeyEx(HKEY_CURRENT_USER, 'Control Panel\Desktop', 0, + KEY_QUERY_VALUE, K) = ERROR_SUCCESS then begin + DataSize := SizeOf(Data); + Res := RegQueryValueEx(K, 'MenuShowDelay', nil, @Typ, @Data, @DataSize); + RegCloseKey(K); + if Res <> ERROR_FILE_NOT_FOUND then begin + if (Res <> ERROR_SUCCESS) or (Typ <> REG_SZ) then + Result := 0 + else begin + Val(Data, Result, E); + if E <> 0 then Result := 0; + end; + end; + end; + end; +begin + if Lo(GetVersion) >= 4 then begin + if not SystemParametersInfo(106{SPI_GETMENUSHOWDELAY}, 0, @Result, 0) then begin + { SPI_GETMENUSHOWDELAY is only supported by Windows NT 4.0 and Windows 98. + On Windows 95, it must use the registry to retrieve this setting. } + if not RegMenuShowDelayInited then begin + RegMenuShowDelay := ReadMenuShowDelayFromRegistry; + InterlockedExchange(Integer(RegMenuShowDelayInited), Ord(True)); + end; + Result := RegMenuShowDelay; + end; + if Result < 0 then Result := 0; + end + else + Result := DefaultMenuShowDelay; +end; +{$ELSE} +function GetMenuShowDelay: Integer; +begin + { Since .NET requires Windows 98 or later, we can assume that + SPI_GETMENUSHOWDELAY is available } + if not SystemParametersInfo(SPI_GETMENUSHOWDELAY, 0, Result, 0) then + Result := DefaultMenuShowDelay; +end; +{$ENDIF} + +function AreFlatMenusEnabled: Boolean; +{ Returns True if "flat menus" are enabled. Always returns False on pre-XP + Windows versions. } +const + SPI_GETFLATMENU = $1022; +begin + { Interestingly, on Windows 2000, SystemParametersInfo(SPI_GETFLATMENU, ...) + succeeds and can return True in pvParam^ if the proper bit is set in + UserPreferencesMask. Since flat menus are not really used on Windows + 2000, call IsWindowsXP first to see if we're running at least XP. } + Result := IsWindowsXP and GetSystemParametersInfoBool(SPI_GETFLATMENU, False); +end; + +function AreKeyboardCuesEnabled: Boolean; +{ Returns True if "keyboard cues" are enabled. Always returns True on + pre-2000 Windows versions. } +const + SPI_GETKEYBOARDCUES = $100A; +begin + Result := (Win32MajorVersion < 5) or + GetSystemParametersInfoBool(SPI_GETKEYBOARDCUES, True); +end; + +function CreateFrameRectRgn(const ARect: TRect; const ASize: TSize): HRGN; +var + R: TRect; + InsideRgn: HRGN; +begin + if IsRectEmpty(ARect) then begin + { The rectangle is empty, so simply return a normalized empty region } + SetRectEmpty(R); + Result := CreateRectRgnIndirect(R); + end + else begin + Result := CreateRectRgnIndirect(ARect); + if Result <> 0 then begin + { Now hollow out the resulting region so that only a frame is left } + R := ARect; + InflateRect(R, -ASize.cx, -ASize.cy); + { If ASize is greater than the size of ARect, then InflateRect will + return a non-normalized rectangle larger than ARect. Test for this + condition by calling IsRectEmpty. } + if not IsRectEmpty(R) then begin + InsideRgn := CreateRectRgnIndirect(R); + if InsideRgn <> 0 then begin + CombineRgn(Result, Result, InsideRgn, RGN_XOR); + DeleteObject(InsideRgn); + end; + end; + end; + end; +end; + +procedure DrawInvertRect(const DC: HDC; const NewRect, OldRect: TRect; + const NewSize, OldSize: TSize; const Brush: HBRUSH); +{ Draws a dragging outline, hiding the old one if necessary. NewRect and/or + OldRect may be empty. } +var + SaveIndex: Integer; + UpdateRgn, OldRgn: HRGN; + R: TRect; +begin + { Create region containing the new rectangle } + UpdateRgn := CreateFrameRectRgn(NewRect, NewSize); + if UpdateRgn <> 0 then begin + { Combine that region with a region containing the old rectangle } + OldRgn := CreateFrameRectRgn(OldRect, OldSize); + if OldRgn <> 0 then begin + CombineRgn(UpdateRgn, OldRgn, UpdateRgn, RGN_XOR); + DeleteObject(OldRgn); + end; + + { Save the DC state so that the clipping region can be restored } + SaveIndex := SaveDC(DC); + try + { Draw the updated region } + SelectClipRgn(DC, UpdateRgn); + GetClipBox(DC, R); + SelectObject(DC, Brush); + PatBlt(DC, R.Left, R.Top, R.Right-R.Left, R.Bottom-R.Top, PATINVERT); + finally + RestoreDC(DC, SaveIndex); + end; + + DeleteObject(UpdateRgn); + end; +end; + +function CreateMonoBitmap(const AWidth, AHeight: Integer; + const ABits: array of Byte): HBITMAP; +begin + {$IFNDEF CLR} + Result := CreateBitmap(AWidth, AHeight, 1, 1, @ABits[0]); + {$ELSE} + { For some reason there isn't an overloaded version of CreateBitmap that + takes a TBytes parameter, so we have to use two calls } + Result := CreateBitmap(AWidth, AHeight, 1, 1, nil); + SetBitmapBits(Result, Length(ABits), ABits); + {$ENDIF} +end; + +function CreateHalftoneBrush: HBRUSH; +const + GrayPattern: array[0..15] of Byte = ( + $55, 0, $AA, 0, $55, 0, $AA, 0, $55, 0, $AA, 0, $55, 0, $AA, 0); +var + GrayBitmap: HBITMAP; +begin + GrayBitmap := CreateMonoBitmap(8, 8, GrayPattern); + Result := CreatePatternBrush(GrayBitmap); + DeleteObject(GrayBitmap); +end; + +procedure DrawHalftoneInvertRect(const DC: HDC; const NewRect, OldRect: TRect; + const NewSize, OldSize: TSize); +var + Brush: HBRUSH; +begin + Brush := CreateHalftoneBrush; + try + DrawInvertRect(DC, NewRect, OldRect, NewSize, OldSize, Brush); + finally + DeleteObject(Brush); + end; +end; + +var + GradientFillAvailable: Boolean; +{$IFNDEF CLR} +type + { Note: TTriVertex is unusable on Delphi 7 and earlier (COLOR16 is + misdeclared as a Shortint instead of a Word). } + TNewTriVertex = record + x: Longint; + y: Longint; + Red: Word; + Green: Word; + Blue: Word; + Alpha: Word; + end; +var + GradientFillFunc: function(DC: HDC; var Vertex: TNewTriVertex; + NumVertex: ULONG; Mesh: Pointer; NumMesh, Mode: ULONG): BOOL; stdcall; +{$ENDIF} + +procedure InitGradientFillFunc; +{$IFNDEF CLR} +var + M: HMODULE; +{$ENDIF} +begin + if (Win32MajorVersion >= 5) or + ((Win32MajorVersion = 4) and (Win32MinorVersion >= 10)) then begin + {$IFNDEF CLR} + M := {$IFDEF JR_D5} SafeLoadLibrary {$ELSE} LoadLibrary {$ENDIF} ('msimg32.dll'); + if M <> 0 then begin + GradientFillFunc := GetProcAddress(M, 'GradientFill'); + if Assigned(GradientFillFunc) then + GradientFillAvailable := True; + end; + {$ELSE} + GradientFillAvailable := True; + {$ENDIF} + end; +end; + +function IsFillRectWithGradientAvailable: Boolean; +begin + Result := GradientFillAvailable; +end; + +procedure FillRectWithGradient(const DC: HDC; const R: TRect; + const StartColor, EndColor: TColorRef; const HorizontalDirection: Boolean); +var + Vertexes: array[0..1] of {$IFNDEF CLR} TNewTriVertex {$ELSE} TTriVertex {$ENDIF}; + GradientRect: TGradientRect; + Mode: ULONG; +begin + if not GradientFillAvailable then + Exit; + Vertexes[0].x := R.Left; + Vertexes[0].y := R.Top; + Vertexes[0].Red := GetRValue(StartColor) shl 8; + Vertexes[0].Blue := GetBValue(StartColor) shl 8; + Vertexes[0].Green := GetGValue(StartColor) shl 8; + Vertexes[0].Alpha := 0; + Vertexes[1].x := R.Right; + Vertexes[1].y := R.Bottom; + Vertexes[1].Red := GetRValue(EndColor) shl 8; + Vertexes[1].Blue := GetBValue(EndColor) shl 8; + Vertexes[1].Green := GetGValue(EndColor) shl 8; + Vertexes[1].Alpha := 0; + GradientRect.UpperLeft := 0; + GradientRect.LowerRight := 1; + if HorizontalDirection then + Mode := GRADIENT_FILL_RECT_H + else + Mode := GRADIENT_FILL_RECT_V; + {$IFNDEF CLR} + GradientFillFunc(DC, Vertexes[0], 2, @GradientRect, 1, Mode); + {$ELSE} + GradientFill(DC, Vertexes, 2, GradientRect, 1, Mode); + {$ENDIF} +end; + +procedure DrawSmallWindowCaption(const Wnd: HWND; const DC: HDC; + const ARect: TRect; const AText: String; const AActive: Boolean); +{ Draws a (non-themed) small window caption bar. + On Windows Vista, a custom routine is used to work around an ugly bug in + DrawCaption that causes the text to be painted at the wrong coordinates. + Note: The value of the AText parameter may be ignored depending on which + routine is chosen. } + + procedure FillBackground; + const + CaptionBkColors: array[Boolean, Boolean] of Integer = + ((COLOR_INACTIVECAPTION, COLOR_ACTIVECAPTION), + (COLOR_GRADIENTINACTIVECAPTION, COLOR_GRADIENTACTIVECAPTION)); + var + LeftColor, RightColor: TColorRef; + begin + if GetSystemParametersInfoBool(SPI_GETGRADIENTCAPTIONS, False) and + IsFillRectWithGradientAvailable then begin + LeftColor := GetSysColor(CaptionBkColors[False, AActive]); + RightColor := GetSysColor(CaptionBkColors[True, AActive]); + if LeftColor <> RightColor then begin + FillRectWithGradient(DC, ARect, LeftColor, RightColor, True); + Exit; + end; + end; + FillRect(DC, ARect, GetSysColorBrush(CaptionBkColors[False, AActive])); + end; + +const + CaptionTextColors: array[Boolean] of Integer = + (COLOR_INACTIVECAPTIONTEXT, COLOR_CAPTIONTEXT); +var + Flags: UINT; + TextRect: TRect; + NonClientMetrics: TNonClientMetrics; + CaptionFont, SaveFont: HFONT; + SaveBkMode: Integer; + SaveTextColor: TColorRef; +begin + if ARect.Right <= ARect.Left then + Exit; + + { Prior to Windows Vista, continue to use DrawCaption. Don't want to risk + introducing new bugs on old OSes, plus on Windows 98, it's several times + faster than our custom routine. } + if Win32MajorVersion < 6 then begin + Flags := DC_TEXT or DC_SMALLCAP; + if AActive then + Flags := Flags or DC_ACTIVE; + if GetSystemParametersInfoBool(SPI_GETGRADIENTCAPTIONS, False) then + Flags := Flags or DC_GRADIENT; + DrawCaption(Wnd, DC, ARect, Flags); + end + else begin + FillBackground; + TextRect := ARect; + Inc(TextRect.Left, GetSystemMetrics(SM_CXEDGE)); + if (TextRect.Right > TextRect.Left) and + GetSystemNonClientMetrics(NonClientMetrics) then begin + CaptionFont := CreateFontIndirect(NonClientMetrics.lfSmCaptionFont); + if CaptionFont <> 0 then begin + SaveFont := SelectObject(DC, CaptionFont); + SaveBkMode := SetBkMode(DC, TRANSPARENT); + SaveTextColor := SetTextColor(DC, GetSysColor(CaptionTextColors[AActive])); + try + DrawTextStr(DC, AText, TextRect, DT_SINGLELINE or DT_NOPREFIX or + DT_VCENTER or DT_END_ELLIPSIS); + finally + SetTextColor(DC, SaveTextColor); + SetBkMode(DC, SaveBkMode); + SelectObject(DC, SaveFont); + DeleteObject(CaptionFont); + end; + end; + end; + end; +end; + +procedure DoubleBufferedRepaint(const Wnd: HWND); +var + ClientRect, ClipRect, R: TRect; + WndDC, BmpDC: HDC; + Bmp: HBITMAP; + SaveIndex: Integer; +begin + if IsWindowVisible(Wnd) and GetClientRect(Wnd, ClientRect) and + not IsRectEmpty(ClientRect) then begin + ValidateRect(Wnd, nil); + BmpDC := 0; + Bmp := 0; + WndDC := GetDC(Wnd); + if WndDC <> 0 then begin + try + { Only repaint the area that intersects the clipping rectangle } + if (GetClipBox(WndDC, ClipRect) <> Windows.ERROR) and + IntersectRect(R, ClientRect, ClipRect) then begin + Bmp := CreateCompatibleBitmap(WndDC, R.Right - R.Left, R.Bottom - R.Top); + if Bmp <> 0 then begin + BmpDC := CreateCompatibleDC(WndDC); + if BmpDC <> 0 then begin + SelectObject(BmpDC, Bmp); + SaveIndex := SaveDC(BmpDC); + SetWindowOrgEx(BmpDC, R.Left, R.Top, nil); + SendMessage(Wnd, WM_ERASEBKGND, WPARAM(BmpDC), 0); + SendMessage(Wnd, WM_PAINT, WPARAM(BmpDC), 0); + RestoreDC(BmpDC, SaveIndex); + BitBlt(WndDC, R.Left, R.Top, R.Right - R.Left, R.Bottom - R.Top, + BmpDC, 0, 0, SRCCOPY); + Exit; + end; + end; + end; + finally + if BmpDC <> 0 then DeleteDC(BmpDC); + if Bmp <> 0 then DeleteObject(Bmp); + ReleaseDC(Wnd, WndDC); + end; + end; + end; + { Fall back to invalidating if we didn't or couldn't double-buffer } + InvalidateRect(Wnd, nil, True); +end; + +{$IFNDEF CLR} +function MethodsEqual(const M1, M2: TMethod): Boolean; +begin + Result := (M1.Code = M2.Code) and (M1.Data = M2.Data); +end; +{$ENDIF} + +function GetRectOfPrimaryMonitor(const WorkArea: Boolean): TRect; +begin + if not WorkArea or not SystemParametersInfo(SPI_GETWORKAREA, 0, + {$IFNDEF CLR}@{$ENDIF} Result, 0) then + Result := Rect(0, 0, Screen.Width, Screen.Height); +end; + +{$IFNDEF CLR} +{ On Delphi for Win32, we don't use the MultiMon unit because its stubs for + MonitorFromRect and MonitorFromPoint are seriously bugged on Delphi 4. } +type + HMONITOR = type THandle; + TMonitorInfo = record + cbSize: DWORD; + rcMonitor: TRect; + rcWork: TRect; + dwFlags: DWORD; + end; +const + MONITOR_DEFAULTTONEAREST = $2; +var + MultiMonApis: record + MonitorFromRect: function(const lprcScreenCoords: TRect; dwFlags: DWORD): HMONITOR; stdcall; + MonitorFromPoint: function(ptScreenCoords: TPoint; dwFlags: DWORD): HMONITOR; stdcall; + MonitorFromWindow: function(hWnd: HWND; dwFlags: DWORD): HMONITOR; stdcall; + GetMonitorInfo: function(hMonitor: HMONITOR; var lpMonitorInfo: TMonitorInfo): BOOL; stdcall; + end; + MultiMonApisAvailable: Boolean; + +procedure InitMultiMonApis; +var + User32Handle: THandle; +begin + User32Handle := GetModuleHandle(user32); + MultiMonApis.MonitorFromRect := GetProcAddress(User32Handle, 'MonitorFromRect'); + MultiMonApis.MonitorFromPoint := GetProcAddress(User32Handle, 'MonitorFromPoint'); + MultiMonApis.MonitorFromWindow := GetProcAddress(User32Handle, 'MonitorFromWindow'); + MultiMonApis.GetMonitorInfo := GetProcAddress(User32Handle, 'GetMonitorInfoA'); + MultiMonApisAvailable := Assigned(MultiMonApis.MonitorFromRect) and + Assigned(MultiMonApis.MonitorFromPoint) and + Assigned(MultiMonApis.MonitorFromWindow) and + Assigned(MultiMonApis.GetMonitorInfo); +end; +{$ENDIF} + +function UsingMultipleMonitors: Boolean; +{ Returns True if the system has more than one display monitor configured. } +const + SM_CMONITORS = 80; +begin + { Note: On a single monitor Windows 95 or NT 4 system, GetSystemMetrics will + return 0 since those OSes do not support multiple monitors. On later + versions it returns 1. } + Result := {$IFNDEF CLR} MultiMonApisAvailable and {$ENDIF} + (GetSystemMetrics(SM_CMONITORS) > 1); +end; + +function GetRectOfMonitor(const M: HMONITOR; const WorkArea: Boolean; + var R: TRect): Boolean; +var + MonitorInfo: TMonitorInfo; +begin + {$IFNDEF CLR} + MonitorInfo.cbSize := SizeOf(MonitorInfo); + {$ELSE} + MonitorInfo.cbSize := Marshal.SizeOf(TypeOf(TMonitorInfo)); + {$ENDIF} + Result := {$IFNDEF CLR}MultiMonApis.{$ENDIF} GetMonitorInfo(M, MonitorInfo); + if Result then begin + if not WorkArea then + R := MonitorInfo.rcMonitor + else + R := MonitorInfo.rcWork; + end; +end; + +function GetRectOfMonitorContainingRect(const R: TRect; + const WorkArea: Boolean): TRect; +{ Returns the work area of the monitor which the rectangle R intersects with + the most, or the monitor nearest R if no monitors intersect. } +var + M: HMONITOR; +begin + if UsingMultipleMonitors then begin + M := {$IFNDEF CLR}MultiMonApis.{$ENDIF} MonitorFromRect(R, MONITOR_DEFAULTTONEAREST); + if GetRectOfMonitor(M, WorkArea, Result) then + Exit; + end; + Result := GetRectOfPrimaryMonitor(WorkArea); +end; + +function GetRectOfMonitorContainingPoint(const P: TPoint; + const WorkArea: Boolean): TRect; +{ Returns the screen area of the monitor containing the point P, or the monitor + nearest P if P isn't in any monitor's work area. } +var + M: HMONITOR; +begin + if UsingMultipleMonitors then begin + M := {$IFNDEF CLR}MultiMonApis.{$ENDIF} MonitorFromPoint(P, MONITOR_DEFAULTTONEAREST); + if GetRectOfMonitor(M, WorkArea, Result) then + Exit; + end; + Result := GetRectOfPrimaryMonitor(WorkArea); +end; + +function GetRectOfMonitorContainingWindow(const W: HWND; + const WorkArea: Boolean): TRect; +var + M: HMONITOR; +begin + if UsingMultipleMonitors then begin + M := {$IFNDEF CLR}MultiMonApis.{$ENDIF} MonitorFromWindow(W, MONITOR_DEFAULTTONEAREST); + if GetRectOfMonitor(M, WorkArea, Result) then + Exit; + end; + Result := GetRectOfPrimaryMonitor(WorkArea); +end; + +{$IFNDEF CLR} +var + TrackMouseEventInited: BOOL; + TrackMouseEventFunc: function(var EventTrack: TTrackMouseEvent): BOOL; stdcall; + +procedure InitTrackMouseEvent; +var + TrackMouseEventComCtlModule: THandle; +begin + { First look for TrackMouseEvent which is available on Windows 98 & NT 4 only. + If it doesn't exist, look for _TrackMouseEvent which is available on + Windows 95 if IE 3.0 or later is installed. } + if not TrackMouseEventInited then begin + TrackMouseEventFunc := GetProcAddress(GetModuleHandle(user32), + 'TrackMouseEvent'); + if @TrackMouseEventFunc = nil then begin + TrackMouseEventComCtlModule := + {$IFDEF JR_D5} SafeLoadLibrary {$ELSE} LoadLibrary {$ENDIF} (comctl32); + if TrackMouseEventComCtlModule <> 0 then + TrackMouseEventFunc := GetProcAddress(TrackMouseEventComCtlModule, + '_TrackMouseEvent'); + end; + InterlockedExchange(Integer(TrackMouseEventInited), Ord(True)); + end; +end; +{$ELSE} +procedure InitTrackMouseEvent; +begin +end; +{$ENDIF} + +function CallTrackMouseEvent(const Wnd: HWND; const Flags: DWORD): Boolean; +var + Track: TTrackMouseEvent; +begin + {$IFNDEF CLR} + Result := False; + if Assigned(TrackMouseEventFunc) then begin + Track.cbSize := SizeOf(Track); + Track.dwFlags := Flags; + Track.hwndTrack := Wnd; + Track.dwHoverTime := 0; + Result := TrackMouseEventFunc(Track); + end; + {$ELSE} + { .NET doesn't run on 95, so we can assume TrackMouseEvent is available } + Track.cbSize := Marshal.SizeOf(TypeOf(TTrackMouseEvent)); + Track.dwFlags := Flags; + Track.hwndTrack := Wnd; + Track.dwHoverTime := 0; + Result := TrackMouseEvent(Track); + {$ENDIF} +end; + +{$IFNDEF CLR} +var + LockSetForegroundWindowFunc: function(uLockCode: UINT): BOOL; stdcall; +{$ELSE} +[SuppressUnmanagedCodeSecurity, DllImport(user32, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'LockSetForegroundWindow')] +function LockSetForegroundWindowFunc(uLockCode: UINT): BOOL; external; +{$ENDIF} + +procedure CallLockSetForegroundWindow(const ALock: Boolean); +const + LSFW_LOCK = 1; + LSFW_UNLOCK = 2; +begin + {$IFNDEF CLR} + if Assigned(LockSetForegroundWindowFunc) then begin + {$ELSE} + if (Win32MajorVersion >= 5) or + ((Win32MajorVersion = 4) and (Win32MinorVersion >= 90)) then begin + {$ENDIF} + if ALock then + LockSetForegroundWindowFunc(LSFW_LOCK) + else + LockSetForegroundWindowFunc(LSFW_UNLOCK); + end; +end; + +{$IFNDEF JR_D5} +procedure FreeAndNil(var Obj); +var + P: TObject; +begin + P := TObject(Obj); + TObject(Obj) := nil; + P.Free; +end; +{$ENDIF} + +{$IFNDEF JR_D6} +procedure RaiseLastOSError; +begin + RaiseLastWin32Error; +end; +{$ENDIF} + +{$IFDEF CLR} +{ On .NET, when calling DrawText, GetTextExtentPoint32, or TextOut we can't + rely on the marshaller's automatic A/W function selection because they take + a character count. If we passed the result of Length(), as the VCL + incorrectly does in many places, the behavior would be incorrect on DBCS + Windows 9x/Me systems because when a Unicode string is downconverted to ANSI + the character count can increase (i.e. one Unicode character can become two + ANSI characters). + Below we define our own "A" function prototypes that take byte array + parameters, allowing us to pass the result of AnsiEncoding.GetBytes straight + to the functions without any conversion. (Borland's "A" prototypes use + "string" type parameters.) } +[SuppressUnmanagedCodeSecurity, DllImport(user32, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'DrawTextA')] +function _DrawTextA(hDC: HDC; [in] lpString: TBytes; nCount: Integer; + var lpRect: TRect; uFormat: UINT): Integer; external; +[SuppressUnmanagedCodeSecurity, DllImport(gdi32, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'GetTextExtentPoint32A')] +function _GetTextExtentPoint32A(DC: HDC; [in] Str: TBytes; Count: Integer; + out Size: TSize): BOOL; external; +[SuppressUnmanagedCodeSecurity, DllImport(gdi32, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'TextOutA')] +function _TextOutA(DC: HDC; X, Y: Integer; [in] Str: TBytes; + Count: Integer): BOOL; external; +{$ENDIF} + +function DrawTextStr(const DC: HDC; const AText: String; var ARect: TRect; + const AFormat: UINT): Integer; +{$IFNDEF CLR} +begin + Result := DrawText(DC, PChar(AText), Length(AText), ARect, AFormat); +end; +{$ELSE} +var + AnsiStr: TBytes; +begin + if Marshal.SystemDefaultCharSize = 1 then begin + AnsiStr := AnsiEncoding.GetBytes(AText); + Result := _DrawTextA(DC, AnsiStr, Length(AnsiStr), ARect, AFormat); + end + else + Result := DrawTextW(DC, AText, Length(AText), ARect, AFormat); +end; +{$ENDIF} + +function GetTextExtentPoint32Str(const DC: HDC; const AText: String; + out ASize: TSize): BOOL; +{$IFNDEF CLR} +begin + Result := GetTextExtentPoint32(DC, PChar(AText), Length(AText), ASize); +end; +{$ELSE} +var + AnsiStr: TBytes; +begin + if Marshal.SystemDefaultCharSize = 1 then begin + AnsiStr := AnsiEncoding.GetBytes(AText); + Result := _GetTextExtentPoint32A(DC, AnsiStr, Length(AnsiStr), ASize); + end + else + Result := GetTextExtentPoint32W(DC, AText, Length(AText), ASize); +end; +{$ENDIF} + +function TextOutStr(const DC: HDC; const X, Y: Integer; + const AText: String): BOOL; +{$IFNDEF CLR} +begin + Result := TextOut(DC, X, Y, PChar(AText), Length(AText)); +end; +{$ELSE} +var + AnsiStr: TBytes; +begin + if Marshal.SystemDefaultCharSize = 1 then begin + AnsiStr := AnsiEncoding.GetBytes(AText); + Result := _TextOutA(DC, X, Y, AnsiStr, Length(AnsiStr)); + end + else + Result := TextOutW(DC, X, Y, AText, Length(AText)); +end; +{$ENDIF} + +threadvar + FontExistsResult: Boolean; + +{$IFNDEF CLR} +function FontExistsCallback(const lplf: TLogFont; const lptm: TTextMetric; + dwType: DWORD; lpData: LPARAM): Integer; stdcall; +{$ELSE} +function FontExistsCallback([in] var lplf: TLogFont; [in] var lptm: TTextMetric; + dwType: DWORD; lpData: LPARAM): Integer; +{$ENDIF} +begin + FontExistsResult := True; + Result := 0; +end; + +function FontExists(const DC: HDC; const FaceName: String): Boolean; +begin + FontExistsResult := False; + EnumFonts(DC, {$IFNDEF CLR}PChar{$ENDIF}(FaceName), @FontExistsCallback, + {$IFNDEF CLR} nil {$ELSE} 0 {$ENDIF}); + Result := FontExistsResult; +end; + +function CreateRotatedFont(DC: HDC): HFONT; +{ Creates a font based on the DC's current font, but rotated 270 degrees } +var + LogFont: TLogFont; + TM: TTextMetric; + VerticalFontName: String; +begin + if GetObject(GetCurrentObject(DC, OBJ_FONT), + {$IFNDEF CLR} + SizeOf(LogFont), @LogFont + {$ELSE} + Marshal.SizeOf(TypeOf(TLogFont)), LogFont + {$ENDIF} + ) = 0 then begin + { just in case... } + Result := 0; + Exit; + end; + LogFont.lfEscapement := 2700; + LogFont.lfOrientation := 2700; + LogFont.lfOutPrecision := OUT_TT_ONLY_PRECIS; { needed for Win9x } + + { Don't let a random TrueType font be substituted when MS Sans Serif or + Microsoft Sans Serif are used. On Windows 2000 and later, hard-code Tahoma + because Arial can't display Japanese or Thai Unicode characters (on Windows + 2000 at least). On earlier versions, hard-code Arial since NT 4.0 doesn't + ship with Tahoma, and 9x doesn't do Unicode. } + {$IFNDEF CLR} + if (StrIComp(LogFont.lfFaceName, 'MS Sans Serif') = 0) or + (StrIComp(LogFont.lfFaceName, 'Microsoft Sans Serif') = 0) then begin + if Win32MajorVersion >= 5 then + StrPCopy(LogFont.lfFaceName, 'Tahoma') + else + StrPCopy(LogFont.lfFaceName, 'Arial'); + {$ELSE} + if SameText(LogFont.lfFaceName, 'MS Sans Serif', loInvariantLocale) or + SameText(LogFont.lfFaceName, 'Microsoft Sans Serif', loInvariantLocale) then begin + if Win32MajorVersion >= 5 then + LogFont.lfFaceName := 'Tahoma' + else + LogFont.lfFaceName := 'Arial'; + {$ENDIF} + { Set lfHeight to the actual height of the current font. This is needed + to work around a Windows 98 issue: on a clean install of the OS, + SPI_GETNONCLIENTMETRICS returns -5 for lfSmCaptionFont.lfHeight. This is + wrong; it should return -11 for an 8 pt font. With normal, unrotated text + this actually displays correctly, since MS Sans Serif doesn't support + sizes below 8 pt. However, when we change to a TrueType font like Arial, + this becomes a problem because it'll actually create a font that small. } + if GetTextMetrics(DC, TM) then begin + { If the original height was negative, keep it negative } + if LogFont.lfHeight <= 0 then + LogFont.lfHeight := -(TM.tmHeight - TM.tmInternalLeading) + else + LogFont.lfHeight := TM.tmHeight; + end; + end; + + { Use a vertical font if available so that Asian characters aren't drawn + sideways } + VerticalFontName := String('@') + LogFont.lfFaceName; + if FontExists(DC, VerticalFontName) then begin + {$IFNDEF CLR} + StrPLCopy(LogFont.lfFaceName, VerticalFontName, + (SizeOf(LogFont.lfFaceName) div SizeOf(LogFont.lfFaceName[0])) - 1); + {$ELSE} + LogFont.lfFaceName := VerticalFontName; + {$ENDIF} + end; + + Result := CreateFontIndirect(LogFont); +end; + +procedure DrawRotatedText(const DC: HDC; AText: String; const ARect: TRect; + const AFormat: Cardinal); +{ Like DrawText, but draws the text at a 270 degree angle. + The only format flag this function respects is DT_HIDEPREFIX. Text is always + drawn centered. } +var + RotatedFont, SaveFont: HFONT; + TextMetrics: TTextMetric; + X, Y, P, I, SU, FU: Integer; + SaveAlign: UINT; + SavePen, Pen: HPEN; +begin + RotatedFont := CreateRotatedFont(DC); + SaveFont := SelectObject(DC, RotatedFont); + + GetTextMetrics(DC, TextMetrics); + X := ARect.Left + ((ARect.Right - ARect.Left) - TextMetrics.tmHeight) div 2; + Y := ARect.Top + ((ARect.Bottom - ARect.Top) - GetTextWidth(DC, AText, True)) div 2; + + { Find the index of the character that should be underlined. Delete '&' + characters from the string. Like DrawText, only the last prefixed character + will be underlined. } + P := 0; + I := 1; + while I <= Length(AText) do begin + {$IFNDEF JR_WIDESTR} + if AText[I] in LeadBytes then + Inc(I) + else + {$ENDIF} + if AText[I] = '&' then begin + Delete(AText, I, 1); + { If the '&' was the last character, don't underline anything } + if I > Length(AText) then + P := 0 + else if AText[I] <> '&' then + P := I; + end; + Inc(I); + end; + + SaveAlign := SetTextAlign(DC, TA_BOTTOM); + TextOutStr(DC, X, Y, AText); + SetTextAlign(DC, SaveAlign); + { Underline } + if (P > 0) and (AFormat and DT_HIDEPREFIX = 0) then begin + SU := GetTextWidth(DC, Copy(AText, 1, P-1), False); + FU := SU + GetTextWidth(DC, AText[P], False); + Inc(X, TextMetrics.tmDescent - 2); + Pen := CreatePen(PS_SOLID, 1, GetTextColor(DC)); + SavePen := SelectObject(DC, Pen); + MoveToEx(DC, X, Y + SU, nil); + LineTo(DC, X, Y + FU); + SelectObject(DC, SavePen); + DeleteObject(Pen); + end; + + SelectObject(DC, SaveFont); + DeleteObject(RotatedFont); +end; + +function NeedToPlaySound(const Alias: String): Boolean; +{ This function checks the registry to see if the specified sound event alias + is assigned to a file. + The purpose of having this function is so it can avoid calls to PlaySound if + possible, because on Windows 2000 there is an annoying 1/3 second delay on + the first call to PlaySound. + Windows Explorer actually uses this same technique when playing sounds for + the Start menu. } +var + KeyName: String; + K: HKEY; + {$IFNDEF CLR} + Data: array[0..3] of WideChar; + {$ELSE} + Data: TBytes; + DataType: DWORD; + {$ENDIF} + DataSize: DWORD; + ErrorCode: Longint; +begin + if (Win32MajorVersion < 5) or (Win32Platform <> VER_PLATFORM_WIN32_NT) then begin + { No need to check pre-Windows 2000 versions since their PlaySound + functions don't have the delay; always return True. } + Result := True; + Exit; + end; + Result := False; + KeyName := 'AppEvents\Schemes\Apps\.Default\' + Alias + '\.Current'; + if RegOpenKeyEx(HKEY_CURRENT_USER, {$IFNDEF CLR}PChar{$ENDIF}(KeyName), + 0, KEY_QUERY_VALUE, K) = ERROR_SUCCESS then begin + try + {$IFNDEF CLR} + DataSize := SizeOf(Data); + { Note: Use the 'W' version of RegQueryValueEx for more speed } + ErrorCode := RegQueryValueExW(K, nil, nil, nil, @Data, @DataSize); + if ((ErrorCode = ERROR_SUCCESS) and (Data[0] <> #0)) or + (ErrorCode = ERROR_MORE_DATA) then + Result := True; + {$ELSE} + DataSize := 4 * SizeOf(WideChar); + SetLength(Data, DataSize); + ErrorCode := RegQueryValueExW(K, nil, nil, DataType, Data, DataSize); + if ((ErrorCode = ERROR_SUCCESS) and (Data[0] or Data[1] <> 0)) or + (ErrorCode = ERROR_MORE_DATA) then + Result := True; + {$ENDIF} + finally + RegCloseKey(K); + end; + end; +end; + +procedure PlaySystemSound(const Alias: String); +const + SND_SYSTEM = $00200000; +var + Flags: DWORD; +begin + Flags := SND_ALIAS or SND_ASYNC or SND_NODEFAULT; + if Win32Platform <> VER_PLATFORM_WIN32_NT then + Flags := Flags or SND_NOSTOP; { On 9x, native menus' sounds are NOSTOP } + if Win32MajorVersion >= 6 then + Flags := Flags or SND_SYSTEM; + PlaySound({$IFNDEF CLR}PChar{$ENDIF}(Alias), 0, Flags); +end; + +function Max(A, B: Integer): Integer; +begin + if A >= B then + Result := A + else + Result := B; +end; + +function Min(A, B: Integer): Integer; +begin + if A <= B then + Result := A + else + Result := B; +end; + +function FindAccelChar(const S: String): Char; +{ Finds the last accelerator key in S. Returns #0 if no accelerator key was + found. '&&' is ignored. } +{$IFNDEF CLR} +var + P: PChar; +begin + P := PChar(S); + Result := #0; + while True do begin + P := AnsiStrScan(P, '&'); + if P = nil then Break; + Inc(P); + if P^ <> '&' then begin + if P^ = #0 then Break; + Result := P^; + end; + Inc(P); + end; +end; +{$ELSE} +var + Len, I: Integer; +begin + Result := #0; + Len := Length(S); + if Len > 0 then begin { ensures S isn't nil } + I := 1; + while True do begin + I := System.String(S).IndexOf('&', I - 1) + 1; + if (I = 0) or (I >= Len) then + Break; + Inc(I); + if S[I] <> '&' then + Result := S[I]; + Inc(I); + end; + end; +end; +{$ENDIF} + +function IsWindowsXP: Boolean; +begin + Result := (Win32Platform = VER_PLATFORM_WIN32_NT) and + ((Win32MajorVersion > 5) or + ((Win32MajorVersion = 5) and (Win32MinorVersion >= 1))); +end; + +function GetInputLocaleCodePage: UINT; +{ Returns the code page identifier of the active input locale, or CP_ACP if + for some unknown reason it couldn't be determined. } +var + {$IFNDEF CLR} + Buf: array[0..15] of Char; + {$ELSE} + Buf: StringBuilder; + {$ENDIF} + ErrorCode: Integer; +begin + {$IFNDEF CLR} + if GetLocaleInfo(GetKeyboardLayout(0) and $FFFF, LOCALE_IDEFAULTANSICODEPAGE, + Buf, SizeOf(Buf) div SizeOf(Buf[0])) > 0 then begin + Buf[High(Buf)] := #0; { ensure null termination, just in case... } + Val(Buf, Result, ErrorCode); + {$ELSE} + Buf := StringBuilder.Create(16); + if GetLocaleInfo(GetKeyboardLayout(0) and $FFFF, LOCALE_IDEFAULTANSICODEPAGE, + Buf, Buf.Capacity) > 0 then begin + Val(Buf.ToString, Result, ErrorCode); + {$ENDIF} + { Just to be *completely* safe, verify that the code page returned by + GetLocaleInfo actually exists. The result of this function may be fed + into WideCharToMultiByte, and we don't want WideCharToMultiByte to fail + entirely because of a bad code page. } + if (ErrorCode <> 0) or not IsValidCodePage(Result) then + Result := CP_ACP; + end + else + Result := CP_ACP; +end; + +function GetMessagePosAsPoint: TPoint; +var + Pos: DWORD; +begin + Pos := GetMessagePos; + Result.X := Smallint(Pos and $FFFF); + Result.Y := Smallint(Pos shr 16); +end; + +function GetSystemNonClientMetrics(var Metrics: TNonClientMetrics): Boolean; +{$IFNDEF CLR} +begin + Metrics.cbSize := SizeOf(Metrics); + Result := SystemParametersInfo(SPI_GETNONCLIENTMETRICS, SizeOf(Metrics), + @Metrics, 0); +end; +{$ELSE} +begin + {$IFDEF JR_D11} + { On Delphi.NET 2007, Forms.GetNonClientMetrics is marked deprecated } + Metrics.cbSize := Marshal.SizeOf(TypeOf(TNonClientMetrics)); + Result := SystemParametersInfo(SPI_GETNONCLIENTMETRICS, Metrics.cbSize, + Metrics, 0); + {$ELSE} + Result := Forms.GetNonClientMetrics(Metrics); + {$ENDIF} +end; +{$ENDIF} + +function GetSystemParametersInfoBool(const Param: UINT; const Default: BOOL): BOOL; +{ Returns the value of the specified BOOL-type system parameter, or Default + if the function fails } +begin + if not SystemParametersInfo(Param, 0, {$IFNDEF CLR}@{$ENDIF} Result, 0) then + Result := Default; +end; + +{$IFDEF CLR} +{ Use our own declaration for CharLowerBuffA that takes a byte array directly + instead of StringBuilder } +[SuppressUnmanagedCodeSecurity, DllImport(user32, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'CharLowerBuffA')] +function _CharLowerBuffA([in, out] lpsz: TBytes; cchLength: DWORD): DWORD; external; +{$ENDIF} + +function CharToLower(const C: Char): Char; +{ Converts a single character to lowercase using the current code page } +{$IFNDEF CLR} +begin + Result := Char(CharLower(Pointer(Word(C)))); +end; +{$ELSE} +var + AnsiBytes: TBytes; +begin + { Note: On .NET we can't use LowerCase()/String.ToLower() because it uses + linguistic casing rules -- on a Turkish locale "I" is NOT mapped to "i". + This would break accelerator keys when running English apps. With + CharLower, "I" is always mapped to "i". } + if Marshal.SystemDefaultCharSize = 1 then begin + { On Windows 9x/Me we have to use CharLowerBuff since the character may be + two bytes when downconverted to ANSI. And we have to handle the + Unicode->ANSI conversion ourself so that we know the correct length to + pass to the function. } + AnsiBytes := AnsiEncoding.GetBytes(C); + _CharLowerBuffA(AnsiBytes, Length(AnsiBytes)); + Result := AnsiEncoding.GetChars(AnsiBytes)[0]; + end + else + Result := Char(Word(CharLowerW(IntPtr(Word(C))))); +end; +{$ENDIF} + +{$IFNDEF JR_D6} +function InvalidPoint(const At: TPoint): Boolean; +begin + Result := (At.X = -1) and (At.Y = -1); +end; +{$ENDIF} + +{$IFDEF CLR} +function ClipToLongint(const I: Int64): Longint; inline; +{ On Delphi.NET 2007, casting a LPARAM (THandle) directly into a Longint can + raise an overflow exception (possibly a bug?). By passing the LPARAM to + this function, which acts like a Longint(Int64()) cast, the exception can + be avoided. } +begin + Result := Longint(I); +end; +{$ENDIF} + +initialization + InitGradientFillFunc; + {$IFNDEF CLR} + InitMultiMonApis; + LockSetForegroundWindowFunc := GetProcAddress(GetModuleHandle(user32), + 'LockSetForegroundWindow'); + {$ENDIF} +end. diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2Consts.pas b/official/2.2.2+2.4.2/TB2K/Source/TB2Consts.pas new file mode 100644 index 0000000..fb29db0 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Source/TB2Consts.pas @@ -0,0 +1,34 @@ +unit TB2Consts; +{ $jrsoftware: tb2k/Source/TB2Consts.pas,v 1.8 2006/03/12 23:11:58 jr Exp $ } + +interface + +{$I TB2Ver.inc} + +resourcestring + { Exceptions } + STBToolbarIndexOutOfBounds = 'Toolbar item index out of range'; + STBToolbarItemReinserted = 'Toolbar item already inserted'; + STBToolbarItemParentInvalid = 'Toolbar item cannot be inserted into container of type %s'; + STBViewerNotFound = 'An item viewer associated the specified item could not be found'; + + { TTBChevronItem } + STBChevronItemMoreButtonsHint = 'More Buttons|'; + + { TTBMRUListItem } + STBMRUListItemDefCaption = '(MRU List)'; + + { TTBMDIWindowItem } + STBMDIWindowItemDefCaption = '(Window List)'; + + { TTBDock exception messages } + STBDockParentNotAllowed = 'A TTBDock control cannot be placed inside a tool window or another TTBDock'; + STBDockCannotChangePosition = 'Cannot change Position of a TTBDock if it already contains controls'; + + { TTBCustomDockableWindow exception messages } + STBToolwinNameNotSet = 'Cannot save dockable window''s position because Name property is not set'; + STBToolwinDockedToNameNotSet = 'Cannot save dockable window''s position because DockedTo''s Name property not set'; + +implementation + +end. diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2Dock.pas b/official/2.2.2+2.4.2/TB2K/Source/TB2Dock.pas new file mode 100644 index 0000000..cbc94b1 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Source/TB2Dock.pas @@ -0,0 +1,5670 @@ +unit TB2Dock; + +{ + Toolbar2000 + Copyright (C) 1998-2008 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2Dock.pas,v 1.127 2008/09/17 20:12:25 jr Exp $ +} + +interface + +{x$DEFINE TB2Dock_DisableLock} +{ Remove the 'x' to enable the define. It will disable calls to + LockWindowUpdate, which it calls to disable screen updates while dragging. + You may want to temporarily enable the define while debugging so you are able + to see your code window while stepping through the dragging routines. } + +{$I TB2Ver.inc} + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, IniFiles; + +type + TTBCustomForm = {$IFDEF JR_D3} TCustomForm {$ELSE} TForm {$ENDIF}; + + { TTBDock } + + TTBDockBoundLinesValues = (blTop, blBottom, blLeft, blRight); + TTBDockBoundLines = set of TTBDockBoundLinesValues; + TTBDockPosition = (dpTop, dpBottom, dpLeft, dpRight); + TTBDockType = (dtNotDocked, dtFloating, dtTopBottom, dtLeftRight); + TTBDockableTo = set of TTBDockPosition; + + TTBCustomDockableWindow = class; + TTBBasicBackground = class; + + TTBInsertRemoveEvent = procedure(Sender: TObject; Inserting: Boolean; + Bar: TTBCustomDockableWindow) of object; + TTBRequestDockEvent = procedure(Sender: TObject; Bar: TTBCustomDockableWindow; + var Accept: Boolean) of object; + + TTBDock = class(TCustomControl) + private + { Property values } + FPosition: TTBDockPosition; + FAllowDrag: Boolean; + FBoundLines: TTBDockBoundLines; + FBackground: TTBBasicBackground; + FBkgOnToolbars: Boolean; + FFixAlign: Boolean; + FCommitNewPositions: Boolean; + FLimitToOneRow: Boolean; + FOnInsertRemoveBar: TTBInsertRemoveEvent; + FOnRequestDock: TTBRequestDockEvent; + {$IFNDEF JR_D4} + FOnResize: TNotifyEvent; + {$ENDIF} + + { Internal } + FDisableArrangeToolbars: Integer; { Increment to disable ArrangeToolbars } + FArrangeToolbarsNeeded: Boolean; + FNonClientWidth, FNonClientHeight: Integer; + DockList: TList; { List of the toolbars docked, and those floating and have LastDock + pointing to the dock. Items are casted in TTBCustomDockableWindow's. } + DockVisibleList: TList; { Similar to DockList, but lists only docked and visible toolbars } + + { Property access methods } + //function GetVersion: TToolbar97Version; + procedure SetAllowDrag(Value: Boolean); + procedure SetBackground(Value: TTBBasicBackground); + procedure SetBackgroundOnToolbars(Value: Boolean); + procedure SetBoundLines(Value: TTBDockBoundLines); + procedure SetFixAlign(Value: Boolean); + procedure SetPosition(Value: TTBDockPosition); + //procedure SetVersion(const Value: TToolbar97Version); + + function GetToolbarCount: Integer; + function GetToolbars(Index: Integer): TTBCustomDockableWindow; + + { Internal } + procedure BackgroundChanged(Sender: TObject); + procedure ChangeDockList(const Insert: Boolean; const Bar: TTBCustomDockableWindow); + procedure ChangeWidthHeight(const NewWidth, NewHeight: Integer); + procedure CommitPositions; + procedure DrawNCArea(const DrawToDC: Boolean; const ADC: HDC; + const Clip: HRGN); + function GetDesignModeRowOf(const XY: Integer): Integer; + function HasVisibleToolbars: Boolean; + procedure RelayMsgToFloatingBars({$IFNDEF CLR}var{$ELSE}const{$ENDIF} Message: TMessage); + function ToolbarVisibleOnDock(const AToolbar: TTBCustomDockableWindow): Boolean; + procedure ToolbarVisibilityChanged(const Bar: TTBCustomDockableWindow; + const ForceRemove: Boolean); + + { Messages } + procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; + procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY; + procedure CMSysColorChange(var Message: TMessage); message CM_SYSCOLORCHANGE; + procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; + procedure WMMove(var Message: TWMMove); message WM_MOVE; + {$IFNDEF JR_D4} + procedure WMSize(var Message: TWMSize); message WM_SIZE; + {$ENDIF} + procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE; + procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT; + procedure WMPrint(var Message: TMessage); message WM_PRINT; + procedure WMPrintClient(var Message: {$IFNDEF CLR} TMessage {$ELSE} TWMPrintClient {$ENDIF}); message WM_PRINTCLIENT; + procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND; + protected + procedure AlignControls(AControl: TControl; var Rect: TRect); override; + procedure CreateParams(var Params: TCreateParams); override; + procedure DrawBackground(DC: HDC; const DrawRect: TRect); virtual; + function GetPalette: HPALETTE; override; + procedure InvalidateBackgrounds; + procedure Loaded; override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure SetParent(AParent: TWinControl); override; + procedure Paint; override; + function UsingBackground: Boolean; virtual; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + + procedure ArrangeToolbars; + procedure BeginUpdate; + procedure EndUpdate; + function GetCurrentRowSize(const Row: Integer; var AFullSize: Boolean): Integer; + function GetHighestRow(const HighestEffective: Boolean): Integer; + function GetMinRowSize(const Row: Integer; + const ExcludeControl: TTBCustomDockableWindow): Integer; + + property CommitNewPositions: Boolean read FCommitNewPositions write FCommitNewPositions; + property NonClientWidth: Integer read FNonClientWidth; + property NonClientHeight: Integer read FNonClientHeight; + property ToolbarCount: Integer read GetToolbarCount; + property Toolbars[Index: Integer]: TTBCustomDockableWindow read GetToolbars; + published + property AllowDrag: Boolean read FAllowDrag write SetAllowDrag default True; + property Background: TTBBasicBackground read FBackground write SetBackground; + property BackgroundOnToolbars: Boolean read FBkgOnToolbars write SetBackgroundOnToolbars default True; + property BoundLines: TTBDockBoundLines read FBoundLines write SetBoundLines default []; + property Color default clBtnFace; + property FixAlign: Boolean read FFixAlign write SetFixAlign default False; + property LimitToOneRow: Boolean read FLimitToOneRow write FLimitToOneRow default False; + property PopupMenu; + property Position: TTBDockPosition read FPosition write SetPosition default dpTop; + //property Version: TToolbar97Version read GetVersion write SetVersion stored False; + property Visible; + + {$IFDEF JR_D5} + property OnContextPopup; + {$ENDIF} + property OnInsertRemoveBar: TTBInsertRemoveEvent read FOnInsertRemoveBar write FOnInsertRemoveBar; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnRequestDock: TTBRequestDockEvent read FOnRequestDock write FOnRequestDock; + {$IFDEF JR_D4} + property OnResize; + {$ELSE} + property OnResize: TNotifyEvent read FOnResize write FOnResize; + {$ENDIF} + end; + + { TTBFloatingWindowParent - internal } + + TTBToolWindowNCRedrawWhatElement = (twrdBorder, twrdCaption, twrdCloseButton); + TTBToolWindowNCRedrawWhat = set of TTBToolWindowNCRedrawWhatElement; + + TTBFloatingWindowParentClass = class of TTBFloatingWindowParent; + TTBFloatingWindowParent = class(TCustomForm) + private + FCloseButtonDown: Boolean; { True if Close button is currently depressed } + FDockableWindow: TTBCustomDockableWindow; + FParentForm: TTBCustomForm; + FShouldShow: Boolean; + + procedure CallRecreateWnd; + function GetCaptionRect(const AdjustForBorder, MinusCloseButton: Boolean): TRect; + function GetCloseButtonRect(const AdjustForBorder: Boolean): TRect; + procedure SetCloseButtonState(Pushed: Boolean); + procedure RedrawNCArea(const RedrawWhat: TTBToolWindowNCRedrawWhat); + + procedure CMShowingChanged(var Message: TMessage); message CM_SHOWINGCHANGED; + procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY; + procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED; + procedure WMActivate(var Message: TWMActivate); message WM_ACTIVATE; + procedure WMClose(var Message: TWMClose); message WM_CLOSE; + procedure WMGetMinMaxInfo(var Message: TWMGetMinMaxInfo); message WM_GETMINMAXINFO; + procedure WMMouseActivate(var Message: TWMMouseActivate); message WM_MOUSEACTIVATE; + procedure WMMove(var Message: TWMMove); message WM_MOVE; + procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE; + procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST; + procedure WMNCLButtonDblClk(var Message: TWMNCLButtonDblClk); message WM_NCLBUTTONDBLCLK; + procedure WMNCLButtonDown(var Message: TWMNCLButtonDown); message WM_NCLBUTTONDOWN; + procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT; + procedure WMNCRButtonUp(var Message: TWMNCRButtonUp); message WM_NCRBUTTONUP; + procedure WMPrint(var Message: TMessage); message WM_PRINT; + procedure WMPrintClient(var Message: {$IFNDEF CLR} TMessage {$ELSE} TWMPrintClient {$ENDIF}); message WM_PRINTCLIENT; + protected + procedure AlignControls(AControl: TControl; var Rect: TRect); override; + procedure CreateParams(var Params: TCreateParams); override; + procedure DrawNCArea(const DrawToDC: Boolean; const ADC: HDC; + const Clip: HRGN; RedrawWhat: TTBToolWindowNCRedrawWhat); dynamic; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + property DockableWindow: TTBCustomDockableWindow read FDockableWindow; + property CloseButtonDown: Boolean read FCloseButtonDown; + public + property ParentForm: TTBCustomForm read FParentForm; + end; + + { TTBCustomDockableWindow } + + TTBDockChangingEvent = procedure(Sender: TObject; Floating: Boolean; + DockingTo: TTBDock) of object; + TTBDragHandleStyle = (dhDouble, dhNone, dhSingle); + TTBDockMode = (dmCanFloat, dmCannotFloat, dmCannotFloatOrChangeDocks); + TTBFloatingMode = (fmOnTopOfParentForm, fmOnTopOfAllForms); + TTBSizeHandle = (twshLeft, twshRight, twshTop, twshTopLeft, + twshTopRight, twshBottom, twshBottomLeft, twshBottomRight); + { ^ must be in same order as HTLEFT..HTBOTTOMRIGHT } + TTBPositionExtraData = {$IFNDEF CLR} Pointer {$ELSE} TObject {$ENDIF}; + TTBPositionReadIntProc = function(const ToolbarName, Value: String; const Default: Longint; + const ExtraData: TTBPositionExtraData): Longint; + TTBPositionReadStringProc = function(const ToolbarName, Value, Default: String; + const ExtraData: TTBPositionExtraData): String; + TTBPositionWriteIntProc = procedure(const ToolbarName, Value: String; const Data: Longint; + const ExtraData: TTBPositionExtraData); + TTBPositionWriteStringProc = procedure(const ToolbarName, Value, Data: String; + const ExtraData: TTBPositionExtraData); + TTBReadPositionData = record + ReadIntProc: TTBPositionReadIntProc; + ReadStringProc: TTBPositionReadStringProc; + ExtraData: TTBPositionExtraData; + end; + TTBWritePositionData = record + WriteIntProc: TTBPositionWriteIntProc; + WriteStringProc: TTBPositionWriteStringProc; + ExtraData: TTBPositionExtraData; + end; + TTBDockableWindowStyles = set of (tbdsResizeEightCorner, tbdsResizeClipCursor); + TTBShrinkMode = (tbsmNone, tbsmWrap, tbsmChevron); + + TTBCustomDockableWindow = class(TCustomControl) + private + { Property variables } + FAutoResize: Boolean; + FDockPos, FDockRow, FEffectiveDockPos, FEffectiveDockRow: Integer; + FDocked: Boolean; + FCurrentDock, FDefaultDock, FLastDock: TTBDock; + FCurrentSize: Integer; + FFloating: Boolean; + FOnClose, FOnDockChanged, FOnMove, FOnRecreated, + FOnRecreating, {$IFNDEF JR_D4} FOnResize, {$ENDIF} + FOnVisibleChanged: TNotifyEvent; + FOnCloseQuery: TCloseQueryEvent; + FOnDockChanging, FOnDockChangingHidden: TTBDockChangingEvent; + FActivateParent, FHideWhenInactive, FCloseButton, FCloseButtonWhenDocked, + FFullSize, FResizable, FShowCaption, FStretch, FUseLastDock: Boolean; + FBorderStyle: TBorderStyle; + FDockMode: TTBDockMode; + FDragHandleStyle: TTBDragHandleStyle; + FDockableTo: TTBDockableTo; + FFloatingMode: TTBFloatingMode; + FSmoothDrag: Boolean; + FDockableWindowStyles: TTBDockableWindowStyles; + FLastRowSize: Integer; + FInsertRowBefore: Boolean; + + { Misc. } + FUpdatingBounds, { Incremented while internally changing the bounds. This allows + it to move the toolbar freely in design mode and prevents the + SizeChanging protected method from begin called } + FDisableArrange, { Incremented to disable Arrange } + FDisableOnMove, { Incremented to prevent WM_MOVE handler from calling the OnMoved handler } + FHidden: Integer; { Incremented while the toolbar is temporarily hidden } + FArrangeNeeded, FMoved: Boolean; + FInactiveCaption: Boolean; { True when the caption of the toolbar is currently the inactive color } + FFloatingPosition: TPoint; + FDockForms: TList; + FSavedAtRunTime: Boolean; + //FNonClientWidth, FNonClientHeight: Integer; + FDragMode, FDragSplitting, FDragCanSplit: Boolean; + FSmoothDragging: Boolean; + + { When floating. These are not used in design mode } + FCloseButtonDown: Boolean; { True if Close button is currently depressed } + FCloseButtonHover: Boolean; + FFloatParent: TTBFloatingWindowParent; { Run-time only: The actual Parent of the toolbar when it is floating } + + { Property access methods } + //function GetVersion: TToolbar97Version; + function GetNonClientWidth: Integer; + function GetNonClientHeight: Integer; + function IsLastDockStored: Boolean; + function IsWidthAndHeightStored: Boolean; + procedure SetAutoResize(Value: Boolean); + procedure SetBorderStyle(Value: TBorderStyle); + procedure SetCloseButton(Value: Boolean); + procedure SetCloseButtonWhenDocked(Value: Boolean); + procedure SetCurrentDock(Value: TTBDock); + procedure SetDefaultDock(Value: TTBDock); + procedure SetDockPos(Value: Integer); + procedure SetDockRow(Value: Integer); + procedure SetDragHandleStyle(Value: TTBDragHandleStyle); + procedure SetFloating(Value: Boolean); + procedure SetFloatingMode(Value: TTBFloatingMode); + procedure SetFloatingPosition(Value: TPoint); + procedure SetFullSize(Value: Boolean); + procedure SetLastDock(Value: TTBDock); + procedure SetResizable(Value: Boolean); + procedure SetShowCaption(Value: Boolean); + procedure SetStretch(Value: Boolean); + procedure SetUseLastDock(Value: Boolean); + //procedure SetVersion(const Value: TToolbar97Version); + + { Internal } + procedure CancelNCHover; + procedure DrawDraggingOutline(const DC: HDC; const NewRect, OldRect: TRect; + const NewDocking, OldDocking: Boolean); + procedure RedrawNCArea; + procedure SetCloseButtonState(Pushed: Boolean); + procedure ShowNCContextMenu(const PosX, PosY: Smallint); + procedure Moved; + function GetShowingState: Boolean; + procedure UpdateCaptionState; + procedure UpdateTopmostFlag; + procedure UpdateVisibility; + procedure ReadSavedAtRunTime(Reader: TReader); + procedure WriteSavedAtRunTime(Writer: TWriter); + + { Messages } + procedure CMColorChanged(var Message: TMessage); message CM_COLORCHANGED; + procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; + procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED; + procedure CMShowingChanged(var Message: TMessage); message CM_SHOWINGCHANGED; + procedure CMVisibleChanged(var Message: TMessage); message CM_VISIBLECHANGED; + {$IFDEF JR_D5} + procedure WMContextMenu(var Message: TWMContextMenu); message WM_CONTEXTMENU; + {$ENDIF} + procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; + procedure WMMove(var Message: TWMMove); message WM_MOVE; + procedure WMMouseMove(var Message: TWMMouseMove); message WM_MOUSEMOVE; + procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE; + procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST; + procedure WMNCMouseLeave(var Message: TMessage); message $2A2 {WM_NCMOUSELEAVE}; + procedure WMNCMouseMove(var Message: TWMNCMouseMove); message WM_NCMOUSEMOVE; + procedure WMNCLButtonDblClk(var Message: TWMNCLButtonDblClk); message WM_NCLBUTTONDBLCLK; + procedure WMNCLButtonDown(var Message: TWMNCLButtonDown); message WM_NCLBUTTONDOWN; + procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT; + procedure WMNCRButtonUp(var Message: TWMNCRButtonUp); message WM_NCRBUTTONUP; + procedure WMPrint(var Message: TMessage); message WM_PRINT; + procedure WMPrintClient(var Message: {$IFNDEF CLR} TMessage {$ELSE} TWMPrintClient {$ENDIF}); message WM_PRINTCLIENT; + procedure WMSetCursor(var Message: TWMSetCursor); message WM_SETCURSOR; + {$IFNDEF JR_D4} + procedure WMSize(var Message: TWMSize); message WM_SIZE; + {$ENDIF} + protected + property ActivateParent: Boolean read FActivateParent write FActivateParent default True; + property AutoResize: Boolean read FAutoResize write SetAutoResize default True; + property BorderStyle: TBorderStyle read FBorderStyle write SetBorderStyle default bsSingle; + property Color default clBtnFace; + property CloseButton: Boolean read FCloseButton write SetCloseButton default True; + property CloseButtonDown: Boolean read FCloseButtonDown; + property CloseButtonHover: Boolean read FCloseButtonHover; + property CloseButtonWhenDocked: Boolean read FCloseButtonWhenDocked write SetCloseButtonWhenDocked default False; + property DefaultDock: TTBDock read FDefaultDock write SetDefaultDock; + property DockableTo: TTBDockableTo read FDockableTo write FDockableTo default [dpTop, dpBottom, dpLeft, dpRight]; + property DockableWindowStyles: TTBDockableWindowStyles read FDockableWindowStyles write FDockableWindowStyles; + property DockMode: TTBDockMode read FDockMode write FDockMode default dmCanFloat; + property DragHandleStyle: TTBDragHandleStyle read FDragHandleStyle write SetDragHandleStyle default dhSingle; + property FloatingMode: TTBFloatingMode read FFloatingMode write SetFloatingMode default fmOnTopOfParentForm; + property FullSize: Boolean read FFullSize write SetFullSize default False; + property InactiveCaption: Boolean read FInactiveCaption; + property HideWhenInactive: Boolean read FHideWhenInactive write FHideWhenInactive default True; + property Resizable: Boolean read FResizable write SetResizable default True; + property ShowCaption: Boolean read FShowCaption write SetShowCaption default True; + property SmoothDrag: Boolean read FSmoothDrag write FSmoothDrag default True; + property Stretch: Boolean read FStretch write SetStretch default False; + property UseLastDock: Boolean read FUseLastDock write SetUseLastDock default True; + //property Version: TToolbar97Version read GetVersion write SetVersion stored False; + + property OnClose: TNotifyEvent read FOnClose write FOnClose; + property OnCloseQuery: TCloseQueryEvent read FOnCloseQuery write FOnCloseQuery; + property OnDockChanged: TNotifyEvent read FOnDockChanged write FOnDockChanged; + property OnDockChanging: TTBDockChangingEvent read FOnDockChanging write FOnDockChanging; + property OnDockChangingHidden: TTBDockChangingEvent read FOnDockChangingHidden write FOnDockChangingHidden; + property OnMove: TNotifyEvent read FOnMove write FOnMove; + property OnRecreated: TNotifyEvent read FOnRecreated write FOnRecreated; + property OnRecreating: TNotifyEvent read FOnRecreating write FOnRecreating; + {$IFNDEF JR_D4} + property OnResize: TNotifyEvent read FOnResize write FOnResize; + {$ENDIF} + property OnVisibleChanged: TNotifyEvent read FOnVisibleChanged write FOnVisibleChanged; + + { Overridden methods } + procedure CreateParams(var Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetPalette: HPALETTE; override; + procedure Loaded; override; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + function PaletteChanged(Foreground: Boolean): Boolean; override; + procedure SetParent(AParent: TWinControl); override; + + { Methods accessible to descendants } + procedure Arrange; + function CalcNCSizes: TPoint; virtual; + procedure ChangeSize(AWidth, AHeight: Integer); + function ChildControlTransparent(Ctl: TControl): Boolean; dynamic; + procedure Close; + procedure ControlExistsAtPos(const P: TPoint; var ControlExists: Boolean); virtual; + function DoArrange(CanMoveControls: Boolean; PreviousDockType: TTBDockType; + NewFloating: Boolean; NewDock: TTBDock): TPoint; virtual; abstract; + procedure DoDockChangingHidden(NewFloating: Boolean; DockingTo: TTBDock); dynamic; + procedure DoubleClick; + procedure DrawNCArea(const DrawToDC: Boolean; const ADC: HDC; + const Clip: HRGN); virtual; + procedure GetBaseSize(var ASize: TPoint); virtual; abstract; + function GetDockedCloseButtonRect(LeftRight: Boolean): TRect; virtual; + function GetFloatingWindowParentClass: TTBFloatingWindowParentClass; dynamic; + procedure GetMinShrinkSize(var AMinimumSize: Integer); virtual; + procedure GetMinMaxSize(var AMinClientWidth, AMinClientHeight, + AMaxClientWidth, AMaxClientHeight: Integer); virtual; + function GetShrinkMode: TTBShrinkMode; virtual; + procedure InitializeOrdering; dynamic; + function IsAutoResized: Boolean; + procedure ResizeBegin(SizeHandle: TTBSizeHandle); dynamic; + procedure ResizeEnd; dynamic; + procedure ResizeTrack(var Rect: TRect; const OrigRect: TRect); dynamic; + procedure ResizeTrackAccept; dynamic; + procedure SizeChanging(const AWidth, AHeight: Integer); virtual; + public + property Docked: Boolean read FDocked; + property Canvas; + property CurrentDock: TTBDock read FCurrentDock write SetCurrentDock stored False; + property CurrentSize: Integer read FCurrentSize write FCurrentSize; + property DockPos: Integer read FDockPos write SetDockPos default -1; + property DockRow: Integer read FDockRow write SetDockRow default 0; + property DragMode: Boolean read FDragMode; + property DragSplitting: Boolean read FDragSplitting; + property EffectiveDockPos: Integer read FEffectiveDockPos; + property EffectiveDockRow: Integer read FEffectiveDockRow; + property Floating: Boolean read FFloating write SetFloating default False; + property FloatingPosition: TPoint read FFloatingPosition write SetFloatingPosition; + property LastDock: TTBDock read FLastDock write SetLastDock stored IsLastDockStored; + property NonClientWidth: Integer read GetNonClientWidth; + property NonClientHeight: Integer read GetNonClientHeight; + + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function GetParentComponent: TComponent; override; + function HasParent: Boolean; override; + procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override; + + procedure AddDockForm(const Form: TTBCustomForm); + procedure AddDockedNCAreaToSize(var S: TPoint; const LeftRight: Boolean); + procedure AddFloatingNCAreaToSize(var S: TPoint); + procedure BeginMoving(const InitX, InitY: Integer); + procedure BeginSizing(const ASizeHandle: TTBSizeHandle); + procedure BeginUpdate; + procedure DoneReadingPositionData(const Data: TTBReadPositionData); dynamic; + procedure EndUpdate; + procedure GetDockedNCArea(var TopLeft, BottomRight: TPoint; + const LeftRight: Boolean); + function GetFloatingBorderSize: TPoint; virtual; + procedure GetFloatingNCArea(var TopLeft, BottomRight: TPoint); + function IsMovable: Boolean; + procedure MoveOnScreen(const OnlyIfFullyOffscreen: Boolean); + procedure ReadPositionData(const Data: TTBReadPositionData); dynamic; + procedure RemoveDockForm(const Form: TTBCustomForm); + procedure WritePositionData(const Data: TTBWritePositionData); dynamic; + published + property Height stored IsWidthAndHeightStored; + property Width stored IsWidthAndHeightStored; + end; + + TTBBasicBackground = class(TComponent) + protected + procedure Draw(DC: HDC; const DrawRect: TRect); virtual; abstract; + function GetPalette: HPALETTE; virtual; abstract; + procedure RegisterChanges(Proc: TNotifyEvent); virtual; abstract; + procedure SysColorChanged; virtual; abstract; + procedure UnregisterChanges(Proc: TNotifyEvent); virtual; abstract; + function UsingBackground: Boolean; virtual; abstract; + end; + + TTBBackground = class(TTBBasicBackground) + private + FBitmap, FBitmapCache: TBitmap; + FBkColor: TColor; + FNotifyList: TList; + FTransparent: Boolean; + procedure BitmapChanged(Sender: TObject); + procedure SetBitmap(Value: TBitmap); + procedure SetBkColor(Value: TColor); + procedure SetTransparent(Value: Boolean); + protected + procedure Draw(DC: HDC; const DrawRect: TRect); override; + function GetPalette: HPALETTE; override; + procedure RegisterChanges(Proc: TNotifyEvent); override; + procedure SysColorChanged; override; + procedure UnregisterChanges(Proc: TNotifyEvent); override; + function UsingBackground: Boolean; override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + property Bitmap: TBitmap read FBitmap write SetBitmap; + property BkColor: TColor read FBkColor write SetBkColor default clBtnFace; + property Transparent: Boolean read FTransparent write SetTransparent default False; + end; + +procedure TBRegLoadPositions(const OwnerComponent: TComponent; + const RootKey: DWORD; const BaseRegistryKey: String); +procedure TBRegSavePositions(const OwnerComponent: TComponent; + const RootKey: DWORD; const BaseRegistryKey: String); +procedure TBIniLoadPositions(const OwnerComponent: TComponent; + const Filename, SectionNamePrefix: String); overload; +procedure TBIniLoadPositions(const OwnerComponent: TComponent; + const IniFile: TCustomIniFile; const SectionNamePrefix: String); overload; +procedure TBIniSavePositions(const OwnerComponent: TComponent; + const Filename, SectionNamePrefix: String); overload; +procedure TBIniSavePositions(const OwnerComponent: TComponent; + const IniFile: TCustomIniFile; const SectionNamePrefix: String); overload; + +procedure TBCustomLoadPositions(const OwnerComponent: TComponent; + const ReadIntProc: TTBPositionReadIntProc; + const ReadStringProc: TTBPositionReadStringProc; + const ExtraData: TTBPositionExtraData); +procedure TBCustomSavePositions(const OwnerComponent: TComponent; + const WriteIntProc: TTBPositionWriteIntProc; + const WriteStringProc: TTBPositionWriteStringProc; + const ExtraData: TTBPositionExtraData); + +function TBGetDockTypeOf(const Control: TTBDock; const Floating: Boolean): TTBDockType; +function TBGetToolWindowParentForm(const ToolWindow: TTBCustomDockableWindow): + TTBCustomForm; +function TBValidToolWindowParentForm(const ToolWindow: TTBCustomDockableWindow): + TTBCustomForm; + +implementation + +uses + {$IFDEF CLR} Types, System.Runtime.InteropServices, {$ENDIF} + Registry, Consts, Menus, + TB2Common, TB2Hook, TB2Consts; + +type + TControlAccess = class(TControl); + +const + DockedBorderSize = 2; + DockedBorderSize2 = DockedBorderSize*2; + DragHandleSizes: array[Boolean, TTBDragHandleStyle] of Integer = + ((9, 0, 6), (14, 14, 14)); + DragHandleXOffsets: array[Boolean, TTBDragHandleStyle] of Integer = + ((2, 0, 1), (3, 0, 5)); + HT_TB2k_Border = 2000; + HT_TB2k_Close = 2001; + HT_TB2k_Caption = 2002; + + DefaultBarWidthHeight = 8; + + ForceDockAtTopRow = 0; + ForceDockAtLeftPos = -8; + + PositionLeftOrRight = [dpLeft, dpRight]; + + twrdAll = [Low(TTBToolWindowNCRedrawWhatElement)..High(TTBToolWindowNCRedrawWhatElement)]; + + { Constants for TTBCustomDockableWindow registry values/data. + Don't localize any of these names! } + rvRev = 'Rev'; + rdCurrentRev = 2000; + rvVisible = 'Visible'; + rvDockedTo = 'DockedTo'; + rdDockedToFloating = '+'; + rvLastDock = 'LastDock'; + rvDockRow = 'DockRow'; + rvDockPos = 'DockPos'; + rvFloatLeft = 'FloatLeft'; + rvFloatTop = 'FloatTop'; + +threadvar + FloatingToolWindows: TList; + + +{ Misc. functions } + +function GetSmallCaptionHeight: Integer; +{ Returns height of the caption of a small window } +begin + Result := GetSystemMetrics(SM_CYSMCAPTION); +end; + +function GetMDIParent(const Form: TTBCustomForm): TTBCustomForm; +{ Returns the parent of the specified MDI child form. But, if Form isn't a + MDI child, it simply returns Form. } +var + I, J: Integer; +begin + Result := Form; + if Form = nil then Exit; + if {$IFDEF JR_D3} (Form is TForm) and {$ENDIF} + (TForm(Form).FormStyle = fsMDIChild) then + for I := 0 to Screen.FormCount-1 do + with Screen.Forms[I] do begin + if FormStyle <> fsMDIForm then Continue; + for J := 0 to MDIChildCount-1 do + if MDIChildren[J] = Form then begin + Result := Screen.Forms[I]; + Exit; + end; + end; +end; + +function TBGetDockTypeOf(const Control: TTBDock; const Floating: Boolean): TTBDockType; +begin + if Floating then + Result := dtFloating + else + if Control = nil then + Result := dtNotDocked + else begin + if not(Control.Position in PositionLeftOrRight) then + Result := dtTopBottom + else + Result := dtLeftRight; + end; +end; + +function TBGetToolWindowParentForm(const ToolWindow: TTBCustomDockableWindow): TTBCustomForm; +var + Ctl: TWinControl; +begin + Result := nil; + Ctl := ToolWindow; + while Assigned(Ctl.Parent) do begin + if Ctl.Parent is TTBCustomForm then + Result := TTBCustomForm(Ctl.Parent); + Ctl := Ctl.Parent; + end; + { ^ for compatibility with ActiveX controls, that code is used instead of + GetParentForm because it returns nil unless the form is the *topmost* + parent } + if Result is TTBFloatingWindowParent then + Result := TTBFloatingWindowParent(Result).ParentForm; +end; + +function TBValidToolWindowParentForm(const ToolWindow: TTBCustomDockableWindow): TTBCustomForm; +begin + Result := TBGetToolWindowParentForm(ToolWindow); + if Result = nil then + raise EInvalidOperation.{$IFDEF JR_D3}CreateFmt{$ELSE}CreateResFmt{$ENDIF} + (SParentRequired, [ToolWindow.Name]); +end; + +procedure SetWindowOwner(const Wnd, NewOwnerWnd: HWND); +begin + SetWindowLong(Wnd, GWL_HWNDPARENT, + {$IFDEF JR_D11} LONG_PTR {$ELSE} Longint {$ENDIF} (NewOwnerWnd)); +end; + +procedure ToolbarHookProc(Code: THookProcCode; Wnd: HWND; WParam: WPARAM; LParam: LPARAM); +var + I: Integer; + ToolWindow: TTBCustomDockableWindow; + WindowPos: {$IFNDEF CLR} PWindowPos {$ELSE} TWindowPos {$ENDIF}; + Form: TTBCustomForm; +begin + case Code of + hpSendActivate, + hpSendActivateApp: begin + if Assigned(FloatingToolWindows) then + for I := 0 to FloatingToolWindows.Count-1 do + { Hide or restore toolbars when a form or the application is + deactivated or activated, and/or update their caption state + (active/inactive) } + TTBCustomDockableWindow(FloatingToolWindows[I]).UpdateVisibility; + end; + hpSendWindowPosChanged: begin + if Assigned(FloatingToolWindows) then begin + {$IFNDEF CLR} + WindowPos := PWindowPos(LParam); + {$ELSE} + WindowPos := TWindowPos(Marshal.PtrToStructure(IntPtr(LParam), TypeOf(TWindowPos))); + {$ENDIF} + for I := 0 to FloatingToolWindows.Count-1 do begin + ToolWindow := TTBCustomDockableWindow(FloatingToolWindows[I]); + if (ToolWindow.FFloatingMode = fmOnTopOfParentForm) and ToolWindow.HandleAllocated then begin + { Call UpdateVisibility if parent form's visibility has + changed, or if it has been minimized or restored } + if ((WindowPos.flags and (SWP_SHOWWINDOW or SWP_HIDEWINDOW) <> 0) or + (WindowPos.flags and SWP_FRAMECHANGED <> 0)) then begin + Form := TBGetToolWindowParentForm(ToolWindow); + if Assigned(Form) and Form.HandleAllocated and ((Wnd = Form.Handle) or IsChild(Wnd, Form.Handle)) then + ToolWindow.UpdateVisibility; + end; + end; + end; + end; + end; + hpPreDestroy: begin + if Assigned(FloatingToolWindows) then + for I := 0 to FloatingToolWindows.Count-1 do begin + with TTBCustomDockableWindow(FloatingToolWindows[I]) do + { It must remove the form window's ownership of the tool window + *before* the form gets destroyed, otherwise Windows will destroy + the tool window's handle. } + if Assigned(Parent) and Parent.HandleAllocated and + (HWND(GetWindowLong(Parent.Handle, GWL_HWNDPARENT)) = Wnd) then + SetWindowOwner(Parent.Handle, Application.Handle); + { ^ Restore GWL_HWNDPARENT back to Application.Handle } + end; + end; + end; +end; + +type + {$IFNDEF CLR} + PFindWindowData = ^TFindWindowData; + TFindWindowData = record + {$ELSE} + TFindWindowData = class + private + {$ENDIF} + TaskActiveWindow, TaskFirstWindow, TaskFirstTopMost: HWND; + {$IFDEF CLR} + function DoFindWindow(Wnd: HWND; Param: LPARAM): BOOL; + {$ENDIF} + end; + +{$IFNDEF CLR} +function DoFindWindow(Wnd: HWND; Param: LPARAM): BOOL; stdcall; +{$ELSE} +function TFindWindowData.DoFindWindow(Wnd: HWND; Param: LPARAM): BOOL; +{$ENDIF} +begin + {$IFNDEF CLR} + with PFindWindowData(Param)^ do + {$ENDIF} + if (Wnd <> TaskActiveWindow) and (Wnd <> Application.Handle) and + IsWindowVisible(Wnd) and IsWindowEnabled(Wnd) then begin + if GetWindowLong(Wnd, GWL_EXSTYLE) and WS_EX_TOPMOST = 0 then begin + if TaskFirstWindow = 0 then TaskFirstWindow := Wnd; + end + else begin + if TaskFirstTopMost = 0 then TaskFirstTopMost := Wnd; + end; + end; + Result := True; +end; + +function FindTopLevelWindow(ActiveWindow: HWND): HWND; +var + FindData: TFindWindowData; +begin + {$IFDEF CLR} + FindData := TFindWindowData.Create; + {$ENDIF} + with FindData do begin + TaskActiveWindow := ActiveWindow; + TaskFirstWindow := 0; + TaskFirstTopMost := 0; + {$IFNDEF CLR} + EnumThreadWindows(GetCurrentThreadID, @DoFindWindow, LPARAM(@FindData)); + {$ELSE} + EnumThreadWindows(GetCurrentThreadID, DoFindWindow, 0); + {$ENDIF} + if TaskFirstWindow <> 0 then + Result := TaskFirstWindow + else + Result := TaskFirstTopMost; + end; +end; + +function IsAncestorOfWindow(const ParentWnd: HWND; Wnd: HWND): Boolean; +{ Returns True if Wnd is a child of, is owned by, or is the same window as + ParentWnd } +begin + while Wnd <> 0 do begin + if Wnd = ParentWnd then begin + Result := True; + Exit; + end; + Wnd := GetParent(Wnd); + end; + Result := False; +end; + +procedure RecalcNCArea(const Ctl: TWinControl); +begin + if Ctl.HandleAllocated then + SetWindowPos(Ctl.Handle, 0, 0, 0, 0, 0, SWP_FRAMECHANGED or + SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER); +end; + +procedure InvalidateAll(const Ctl: TWinControl); +{ Invalidate both non-client and client area, and erase. } +begin + if Ctl.HandleAllocated then + RedrawWindow(Ctl.Handle, nil, 0, RDW_FRAME or RDW_INVALIDATE or + RDW_ERASE or RDW_NOCHILDREN); +end; + +type + TSetCloseButtonStateProc = procedure(Pushed: Boolean) of object; + +function CloseButtonLoop(const Wnd: HWND; const ButtonRect: TRect; + const SetCloseButtonStateProc: TSetCloseButtonStateProc): Boolean; + function MouseInButton: Boolean; + var + P: TPoint; + begin + GetCursorPos(P); + Result := PtInRect(ButtonRect, P); + end; +var + Msg: TMsg; +begin + Result := False; + + SetCloseButtonStateProc(MouseInButton); + + SetCapture(Wnd); + + try + while GetCapture = Wnd do begin + case Integer(GetMessage(Msg, 0, 0, 0)) of + -1: Break; { if GetMessage failed } + 0: begin + { Repost WM_QUIT messages } + PostQuitMessage(ClipToLongint(Msg.wParam)); + Break; + end; + end; + + case Msg.Message of + WM_KEYDOWN, WM_KEYUP: + { Ignore all keystrokes while in a close button loop } + ; + WM_MOUSEMOVE: begin + { Note to self: WM_MOUSEMOVE messages should never be dispatched + here to ensure no hints get shown } + SetCloseButtonStateProc(MouseInButton); + end; + WM_LBUTTONDOWN, WM_LBUTTONDBLCLK: + { Make sure it doesn't begin another loop } + Break; + WM_LBUTTONUP: begin + if MouseInButton then + Result := True; + Break; + end; + WM_RBUTTONDOWN..WM_MBUTTONDBLCLK: + { Ignore all other mouse up/down messages } + ; + else + TranslateMessage(Msg); + DispatchMessage(Msg); + end; + end; + finally + if GetCapture = Wnd then + ReleaseCapture; + SetCloseButtonStateProc(False); + end; +end; + + +{ TTBDock - internal } + +constructor TTBDock.Create(AOwner: TComponent); +begin + inherited; + + ControlStyle := ControlStyle + [csAcceptsControls, csMenuEvents] - + [csClickEvents, csCaptureMouse, csOpaque]; + FAllowDrag := True; + FBkgOnToolbars := True; + DockList := TList.Create; + DockVisibleList := TList.Create; + Color := clBtnFace; + Position := dpTop; +end; + +procedure TTBDock.CreateParams(var Params: TCreateParams); +begin + inherited; + { Disable complete redraws when size changes. CS_H/VREDRAW cause flicker + and are not necessary for this control at run time } + if not(csDesigning in ComponentState) then + with Params.WindowClass do + Style := Style and not(CS_HREDRAW or CS_VREDRAW); +end; + +destructor TTBDock.Destroy; +begin + if Assigned(FBackground) then + FBackground.UnregisterChanges(BackgroundChanged); + inherited; + DockVisibleList.Free; + DockList.Free; +end; + +procedure TTBDock.SetParent(AParent: TWinControl); +begin + if (AParent is TTBCustomDockableWindow) or (AParent is TTBDock) then + raise EInvalidOperation.Create(STBDockParentNotAllowed); + + inherited; +end; + +procedure TTBDock.BeginUpdate; +begin + Inc(FDisableArrangeToolbars); +end; + +procedure TTBDock.EndUpdate; +begin + Dec(FDisableArrangeToolbars); + if FArrangeToolbarsNeeded and (FDisableArrangeToolbars = 0) then + ArrangeToolbars; +end; + +function TTBDock.HasVisibleToolbars: Boolean; +var + I: Integer; +begin + Result := False; + for I := 0 to DockList.Count-1 do + if ToolbarVisibleOnDock(TTBCustomDockableWindow(DockList[I])) then begin + Result := True; + Break; + end; +end; + +function TTBDock.ToolbarVisibleOnDock(const AToolbar: TTBCustomDockableWindow): Boolean; +begin + Result := (AToolbar.Parent = Self) and + (AToolbar.Visible or (csDesigning in AToolbar.ComponentState)); +end; + +function TTBDock.GetCurrentRowSize(const Row: Integer; + var AFullSize: Boolean): Integer; +var + I, J: Integer; + T: TTBCustomDockableWindow; +begin + Result := 0; + AFullSize := False; + if Row < 0 then Exit; + for I := 0 to DockList.Count-1 do begin + T := TTBCustomDockableWindow(DockList[I]); + if (T.FEffectiveDockRow = Row) and ToolbarVisibleOnDock(T) then begin + AFullSize := T.FullSize; + if not(Position in PositionLeftOrRight) then + J := T.Height + else + J := T.Width; + if J > Result then + Result := J; + end; + end; +end; + +function TTBDock.GetMinRowSize(const Row: Integer; + const ExcludeControl: TTBCustomDockableWindow): Integer; +var + I, J: Integer; + T: TTBCustomDockableWindow; +begin + Result := 0; + if Row < 0 then Exit; + for I := 0 to DockList.Count-1 do begin + T := TTBCustomDockableWindow(DockList[I]); + if (T <> ExcludeControl) and (T.FEffectiveDockRow = Row) and + ToolbarVisibleOnDock(T) then begin + J := T.FLastRowSize; + if J > Result then + Result := J; + end; + end; +end; + +function TTBDock.GetDesignModeRowOf(const XY: Integer): Integer; +{ Similar to GetRowOf, but is a little different to accomidate design mode + better } +var + HighestRowPlus1, R, CurY, CurRowSize: Integer; + FullSize: Boolean; +begin + Result := 0; + HighestRowPlus1 := GetHighestRow(True)+1; + CurY := 0; + for R := 0 to HighestRowPlus1 do begin + Result := R; + if R = HighestRowPlus1 then Break; + CurRowSize := GetCurrentRowSize(R, FullSize); + if CurRowSize = 0 then Continue; + Inc(CurY, CurRowSize); + if XY < CurY then + Break; + end; +end; + +function TTBDock.GetHighestRow(const HighestEffective: Boolean): Integer; +{ Returns highest used row number, or -1 if no rows are used } +var + I, J: Integer; +begin + Result := -1; + for I := 0 to DockList.Count-1 do + with TTBCustomDockableWindow(DockList[I]) do begin + if HighestEffective then + J := FEffectiveDockRow + else + J := FDockRow; + if J > Result then + Result := J; + end; +end; + +procedure TTBDock.ChangeWidthHeight(const NewWidth, NewHeight: Integer); +{ Same as setting Width/Height directly, but does not lose Align position. + Specifically, it ensures that a bottom-aligned dock stays above a + bottom-aligned TStatusBar when the only toolbar on the dock is undocked + and then redocked. } +begin + case Align of + alNone, alTop, alLeft: + SetBounds(Left, Top, NewWidth, NewHeight); + alBottom: + SetBounds(Left, Top-NewHeight+Height, NewWidth, NewHeight); + alRight: + SetBounds(Left-NewWidth+Width, Top, NewWidth, NewHeight); + end; +end; + +procedure TTBDock.AlignControls(AControl: TControl; var Rect: TRect); +begin + ArrangeToolbars; +end; + +function CompareDockRowPos(Item1, Item2: TListItemType): Integer; +begin + Result := TTBCustomDockableWindow(Item1).FDockRow - TTBCustomDockableWindow(Item2).FDockRow; + if Result = 0 then + Result := TTBCustomDockableWindow(Item1).FDockPos - TTBCustomDockableWindow(Item2).FDockPos; +end; + +procedure TTBDock.ArrangeToolbars; +{ The main procedure to arrange all the toolbars docked to it } +type + TPosDataRec = record + Row, ActualRow, PrecSpace, FullSize, MinimumSize, Size, Overlap, Pos: Integer; + ShrinkMode: TTBShrinkMode; + NeedArrange: Boolean; + end; +var + NewDockList: TList; + PosData: array of TPosDataRec; + + function IndexOfDraggingToolbar(const List: TList): Integer; + { Returns index of toolbar in List that's currently being dragged, or -1 } + var + I: Integer; + begin + for I := 0 to List.Count-1 do + if TTBCustomDockableWindow(List[I]).FDragMode then begin + Result := I; + Exit; + end; + Result := -1; + end; + + function ShiftLeft(const Row, StartIndex, MaxSize: Integer): Integer; + { Removes PrecSpace pixels from toolbars at or before StartIndex until the + right edge of the toolbar at StartIndex is <= MaxSize. + Returns the total number of PrecSpace pixels removed from toolbars. } + var + PixelsOffEdge, I, J: Integer; + begin + Result := 0; + PixelsOffEdge := -MaxSize; + for I := 0 to StartIndex do begin + if PosData[I].Row = Row then begin + Inc(PixelsOffEdge, PosData[I].PrecSpace); + Inc(PixelsOffEdge, PosData[I].Size); + end; + end; + if PixelsOffEdge > 0 then + for I := StartIndex downto 0 do begin + if PosData[I].Row = Row then begin + J := PixelsOffEdge; + if PosData[I].PrecSpace < J then + J := PosData[I].PrecSpace; + Dec(PosData[I].PrecSpace, J); + Dec(PixelsOffEdge, J); + Inc(Result, J); + if PixelsOffEdge = 0 then + Break; + end; + end; + end; + + function GetNextToolbar(const GoForward: Boolean; const Row: Integer; + const StartIndex: Integer): Integer; + var + I: Integer; + begin + Result := -1; + I := StartIndex; + while True do begin + if GoForward then begin + Inc(I); + if I >= NewDockList.Count then + Break; + end + else begin + Dec(I); + if I < 0 then + Break; + end; + if PosData[I].Row = Row then begin + Result := I; + Break; + end; + end; + end; + +var + LeftRight: Boolean; + EmptySize, HighestRow, R, CurPos, CurRowPixel, I, J, K, L, ClientW, + ClientH, MaxSize, TotalSize, PixelsPastMaxSize, Offset, CurRealPos, DragIndex, + MinRealPos, DragIndexPos, ToolbarsOnRow, CurRowSize: Integer; + T: TTBCustomDockableWindow; + S: TPoint; + RowIsEmpty: Boolean; +label FoundNextToolbar; +begin + if (FDisableArrangeToolbars > 0) or (csLoading in ComponentState) then begin + FArrangeToolbarsNeeded := True; + Exit; + end; + + NewDockList := nil; + Inc(FDisableArrangeToolbars); + try + { Work around VCL alignment bug when docking toolbars taller or wider than + the client height or width of the form. } + {if not(csDesigning in ComponentState) and HandleAllocated then + SetWindowPos(Handle, HWND_TOP, 0, 0, 0, 0, + SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);} + + LeftRight := Position in PositionLeftOrRight; + + if not HasVisibleToolbars then begin + EmptySize := Ord(FFixAlign); + if csDesigning in ComponentState then + EmptySize := 9; + if not LeftRight then + ChangeWidthHeight(Width, EmptySize) + else + ChangeWidthHeight(EmptySize, Height); + Exit; + end; + + { It can't read the ClientWidth and ClientHeight properties because they + attempt to create a handle, which requires Parent to be set. "ClientW" + and "ClientH" are calculated instead. } + ClientW := Width - FNonClientWidth; + if ClientW < 0 then ClientW := 0; + ClientH := Height - FNonClientHeight; + if ClientH < 0 then ClientH := 0; + + { Remove toolbars from DockList & DockVisibleList that are destroying, so + that no methods on these toolbars will be called. + This is needed because in certain rare cases ArrangeToolbars can be + indirectly called while a docked toolbar is being destroyed. } + for I := DockList.Count-1 downto 0 do begin + T := TTBCustomDockableWindow(DockList[I]); + if csDestroying in T.ComponentState then begin + DockList.Delete(I); + DockVisibleList.Remove(T); + end; + end; + + { If LimitToOneRow is True, only use the first row } + if FLimitToOneRow then + for I := 0 to DockList.Count-1 do + with TTBCustomDockableWindow(DockList[I]) do + FDockRow := 0; + + { Copy DockList to NewDockList, and ensure it is in correct ordering + according to DockRow/DockPos } + NewDockList := TList.Create; + NewDockList.Count := DockList.Count; + for I := 0 to NewDockList.Count-1 do + NewDockList[I] := DockList[I]; + I := IndexOfDraggingToolbar(NewDockList); + NewDockList.Sort(CompareDockRowPos); + DragIndex := IndexOfDraggingToolbar(NewDockList); + if (I <> -1) and TTBCustomDockableWindow(NewDockList[DragIndex]).FDragSplitting then begin + { When splitting, don't allow the toolbar being dragged to change + positions in the dock list } + NewDockList.Move(DragIndex, I); + DragIndex := I; + end; + DockVisibleList.Sort(CompareDockRowPos); + { Find highest row number } + HighestRow := GetHighestRow(False); + + { Create a temporary array that holds new position data for the toolbars } + SetLength(PosData, NewDockList.Count); + for I := 0 to NewDockList.Count-1 do begin + T := TTBCustomDockableWindow(NewDockList[I]); + PosData[I].ActualRow := T.FDockRow; + if ToolbarVisibleOnDock(T) then + PosData[I].Row := T.FDockRow + else + PosData[I].Row := -1; + PosData[I].Pos := T.FDockPos; + end; + + { Find FInsertRowBefore=True and FullSize=True toolbars and make sure there + aren't any other toolbars on the same row. If there are, shift them down + a row. } + for L := 0 to 1 do begin + R := 0; + while R <= HighestRow do begin + for I := 0 to NewDockList.Count-1 do begin + T := TTBCustomDockableWindow(NewDockList[I]); + if (PosData[I].ActualRow = R) and + (((L = 0) and T.FInsertRowBefore and not LimitToOneRow) or + ((L = 1) and T.FullSize)) then + for J := 0 to NewDockList.Count-1 do + if (J <> I) and (PosData[J].ActualRow = R) then begin + for K := 0 to NewDockList.Count-1 do begin + if K <> I then begin + if PosData[K].ActualRow >= R then + Inc(PosData[K].ActualRow); + if PosData[K].Row >= R then + Inc(PosData[K].Row); + end; + end; + Inc(HighestRow); + Break; + end; + end; + Inc(R); + end; + end; + + { Remove blank rows. + Note that rows that contain only invisible or currently floating toolbars + are intentionally not removed, so that when the toolbars are shown again, + they stay on their own row. } + R := 0; + while R <= HighestRow do begin + RowIsEmpty := True; + for I := 0 to NewDockList.Count-1 do + if PosData[I].ActualRow = R then begin + RowIsEmpty := False; + Break; + end; + if RowIsEmpty then begin + { Shift all ones higher than R back one } + for I := 0 to NewDockList.Count-1 do begin + if PosData[I].ActualRow > R then + Dec(PosData[I].ActualRow); + if PosData[I].Row > R then + Dec(PosData[I].Row); + end; + Dec(HighestRow); + end + else + Inc(R); + end; + + { Calculate positions and sizes of each row } + R := 0; + while R <= HighestRow do begin + if not LeftRight then + MaxSize := ClientW + else + MaxSize := ClientH; + + { Set initial sizes } + TotalSize := 0; + ToolbarsOnRow := 0; + MinRealPos := 0; + for I := 0 to NewDockList.Count-1 do begin + if PosData[I].Row = R then begin + T := TTBCustomDockableWindow(NewDockList[I]); + T.GetBaseSize(S); + if not LeftRight then + J := S.X + T.NonClientWidth + else + J := S.Y + T.NonClientHeight; + PosData[I].FullSize := J; + PosData[I].Size := J; + PosData[I].ShrinkMode := T.GetShrinkMode; + PosData[I].MinimumSize := 0; + T.GetMinShrinkSize(PosData[I].MinimumSize); + if PosData[I].MinimumSize > PosData[I].FullSize then + { don't allow minimum shrink size to be less than full size } + PosData[I].MinimumSize := PosData[I].FullSize; + if PosData[I].ShrinkMode = tbsmChevron then + Inc(MinRealPos, PosData[I].MinimumSize) + else + Inc(MinRealPos, PosData[I].FullSize); + { If the toolbar isn't the first toolbar on the row, and the toolbar + would go off the edge even after it's shrunk, then move it onto a + row of its own } + if (ToolbarsOnRow > 0) and (MinRealPos > MaxSize) and + not LimitToOneRow then begin + for K := I to NewDockList.Count-1 do begin + if PosData[K].ActualRow >= R then + Inc(PosData[K].ActualRow); + if PosData[K].Row >= R then + Inc(PosData[K].Row); + end; + Inc(HighestRow); + Break; + end; + Inc(TotalSize, J); + Inc(ToolbarsOnRow); + end; + end; + PixelsPastMaxSize := TotalSize - MaxSize; + + { Set initial arrangement; don't shrink toolbars yet } + DragIndexPos := 0; + CurPos := 0; + CurRealPos := 0; + MinRealPos := 0; + for I := 0 to NewDockList.Count-1 do begin + T := TTBCustomDockableWindow(NewDockList[I]); + if PosData[I].Row = R then begin + if (CurPos = 0) and (T.FullSize or T.Stretch) then + { Force to left } + J := 0 + else + J := T.FDockPos; + if I = DragIndex then + DragIndexPos := J; + { Don't let this toolbar overlap preceding toolbars by more than + the sum of their minimum sizes } + if J < MinRealPos then + J := MinRealPos; + if J > CurPos then begin + { There's a gap between the left edge or previous toolbar and + this toolbar } + if PixelsPastMaxSize <= 0 then begin + PosData[I].PrecSpace := J - CurPos; + CurPos := J; + end + else + { Don't allow a gap if exceeding MaxSize } + J := CurPos; + end + else begin + if J < CurRealPos then + PosData[I].Overlap := CurRealPos - J; + end; + + Inc(CurPos, PosData[I].Size); + CurRealPos := J + PosData[I].Size; + Inc(MinRealPos, PosData[I].MinimumSize); + end; + end; + + { If we aren't exceeding MaxSize, allow the toolbar being dragged + to push other toolbars to the left } + if (PixelsPastMaxSize < 0) and (DragIndex <> -1) and + (PosData[DragIndex].Row = R) then begin + I := GetNextToolbar(False, R, DragIndex); + if I <> -1 then begin + J := ShiftLeft(R, I, DragIndexPos); + if J > 0 then begin + { Ensure that toolbars that follow the toolbar being dragged stay + at the same place by increasing PrecSpace on the next toolbar } + I := GetNextToolbar(True, R, DragIndex); + if I <> -1 then + Inc(PosData[I].PrecSpace, J); + end; + end; + end; + + { If any toolbars are going off the edge of the dock, try to make them + at least partially visible by shifting preceding toolbars left } + I := GetNextToolbar(False, R, NewDockList.Count); + if I <> -1 then + ShiftLeft(R, I, MaxSize); + + { Shrink toolbars that overlap other toolbars (Overlaps[x] > 0) } + if PixelsPastMaxSize > 0 then begin + Offset := 0; + for I := 0 to NewDockList.Count-1 do begin + if PosData[I].Row <> R then + Continue; + T := TTBCustomDockableWindow(NewDockList[I]); + if (ToolbarsOnRow > 1) and T.FDragMode then + T.FDragCanSplit := True; + Inc(Offset, PosData[I].Overlap); + if Offset > PixelsPastMaxSize then + Offset := PixelsPastMaxSize; + if Offset > 0 then + for J := I-1 downto 0 do begin + if PosData[J].Row <> R then + Continue; + { How much can we shrink this toolbar J to get toolbar I to + its preferred position? } + if PosData[J].ShrinkMode = tbsmChevron then + L := Offset + else + L := 0; + K := -(PosData[J].Size - L - PosData[J].MinimumSize); { the number of pixels that exceed the minimum size } + if K > 0 then + { Don't shrink a toolbar below its minimum allowed size } + Dec(L, K); + Dec(PosData[J].Size, L); + Dec(PixelsPastMaxSize, L); + Dec(Offset, L); + if (Offset = 0) or + { This is needed so toolbars can push other toolbars to the + right when splitting: } + (J = DragIndex) then + Break; + end; + end; + end; + + { Still exceeding MaxSize? Make sure the rightmost toolbar(s) are + at least partially visible with a width of MinimumSize } + if PixelsPastMaxSize > 0 then begin + for I := NewDockList.Count-1 downto 0 do begin + if (PosData[I].Row <> R) or (PosData[I].ShrinkMode = tbsmNone) or + ((PosData[I].ShrinkMode = tbsmWrap) and (ToolbarsOnRow > 1)) then + Continue; + J := PosData[I].Size - PosData[I].MinimumSize; + if J > 0 then begin { can we shrink this toolbar any? } + if J > PixelsPastMaxSize then + J := PixelsPastMaxSize; + Dec(PosData[I].Size, J); + Dec(PixelsPastMaxSize, J); + end; + if PixelsPastMaxSize = 0 then + Break; + end; + end; + + { Set Poses, and adjust size of FullSize & Stretch toolbars } + CurPos := 0; + for I := 0 to NewDockList.Count-1 do begin + T := TTBCustomDockableWindow(NewDockList[I]); + if PosData[I].Row = R then begin + if T.FullSize or T.Stretch then begin + { Remove any preceding space from this toolbar } + Inc(PosData[I].Size, PosData[I].PrecSpace); + PosData[I].PrecSpace := 0; + end; + Inc(CurPos, PosData[I].PrecSpace); + if T.FullSize then begin + { Claim all space } + if PosData[I].Size < MaxSize then + PosData[I].Size := MaxSize; + end + else if T.Stretch then begin + { Steal any preceding space from the next toolbar } + for J := I+1 to NewDockList.Count-1 do + if PosData[J].Row = R then begin + Inc(PosData[I].Size, PosData[J].PrecSpace); + PosData[J].PrecSpace := 0; + goto FoundNextToolbar; + end; + { or claim any remaining space } + if PosData[I].Size < MaxSize - CurPos then + PosData[I].Size := MaxSize - CurPos; + FoundNextToolbar: + end; + PosData[I].Pos := CurPos; + Inc(CurPos, PosData[I].Size); + end; + end; + + Inc(R); + end; + + for I := 0 to NewDockList.Count-1 do begin + T := TTBCustomDockableWindow(NewDockList[I]); + T.FEffectiveDockRow := PosData[I].ActualRow; + T.FEffectiveDockPos := PosData[I].Pos; + { If FCommitNewPositions is True, update all the toolbars' DockPos and + DockRow properties to match the actual positions. + Also update the ordering of DockList to match NewDockList } + if FCommitNewPositions then begin + T.FDockRow := T.FEffectiveDockRow; + T.FDockPos := T.FEffectiveDockPos; + DockList[I] := NewDockList[I]; + end; + end; + + { Now actually move the toolbars } + CurRowPixel := 0; + for R := 0 to HighestRow do begin + CurRowSize := -1; + for I := 0 to NewDockList.Count-1 do begin + T := TTBCustomDockableWindow(NewDockList[I]); + if PosData[I].Row = R then begin + K := T.FCurrentSize; + T.FCurrentSize := PosData[I].Size; + if PosData[I].Size >= PosData[I].FullSize then begin + T.FCurrentSize := 0; + { Reason: so that if new items are added to a non-shrunk toolbar + at run-time (causing its width to increase), the toolbar won't + shrink unnecessarily } + end; + if (PosData[I].ShrinkMode <> tbsmNone) and (T.FCurrentSize <> K) then begin + { If Size is changing and we are to display a chevron or wrap, + call DoArrange to get an accurate row size } + S := T.DoArrange(False, TBGetDockTypeOf(Self, False), False, Self); + { Force a rearrange in case the actual size isn't changing but the + chevron visibility might have changed (which can happen if + items are added to a FullSize=True toolbar at run-time) } + PosData[I].NeedArrange := True; + end + else begin + if (PosData[I].ShrinkMode = tbsmWrap) and (PosData[I].Size < PosData[I].FullSize) then begin + { Preserve existing height (or width) on a wrapped toolbar + whose size isn't changing now } + S.X := T.Width - T.NonClientWidth; + S.Y := T.Height - T.NonClientHeight; + end + else + T.GetBaseSize(S); + end; + if not LeftRight then + K := S.Y + else + K := S.X; + T.FLastRowSize := K; + if K > CurRowSize then + CurRowSize := K; + end; + end; + if CurRowSize <> -1 then + Inc(CurRowSize, DockedBorderSize2) + else + CurRowSize := 0; + for I := 0 to NewDockList.Count-1 do begin + T := TTBCustomDockableWindow(NewDockList[I]); + if PosData[I].Row = R then begin + Inc(T.FUpdatingBounds); + try + K := T.FCurrentSize; + if PosData[I].NeedArrange then + T.FArrangeNeeded := True; + if not LeftRight then + T.SetBounds(PosData[I].Pos, CurRowPixel, PosData[I].Size, CurRowSize) + else + T.SetBounds(CurRowPixel, PosData[I].Pos, CurRowSize, PosData[I].Size); + if T.FArrangeNeeded then + { ^ don't arrange again if SetBounds call already caused one } + T.Arrange; + { Restore FCurrentSize since TTBToolbarView.DoUpdatePositions + clears it } + T.FCurrentSize := K; + finally + Dec(T.FUpdatingBounds); + end; + end; + end; + Inc(CurRowPixel, CurRowSize); + end; + + { Set the size of the dock } + if not LeftRight then + ChangeWidthHeight(Width, CurRowPixel + FNonClientHeight) + else + ChangeWidthHeight(CurRowPixel + FNonClientWidth, Height); + finally + Dec(FDisableArrangeToolbars); + FArrangeToolbarsNeeded := False; + FCommitNewPositions := False; + NewDockList.Free; + end; +end; + +procedure TTBDock.CommitPositions; +{ Copies docked toolbars' EffectiveDockRow and EffectiveDockPos properties + into DockRow and DockPos respectively. + Note that this does not reorder DockList like ArrangeToolbars does when + FCommitNewPositions=True. } +var + I: Integer; + T: TTBCustomDockableWindow; +begin + for I := 0 to DockVisibleList.Count-1 do begin + T := TTBCustomDockableWindow(DockVisibleList[I]); + T.FDockRow := T.FEffectiveDockRow; + T.FDockPos := T.FEffectiveDockPos; + end; +end; + +procedure TTBDock.ChangeDockList(const Insert: Boolean; + const Bar: TTBCustomDockableWindow); +{ Inserts or removes Bar from DockList } +var + I: Integer; +begin + I := DockList.IndexOf(Bar); + if Insert then begin + if I = -1 then begin + Bar.FreeNotification(Self); + DockList.Add(Bar); + end; + end + else begin + if I <> -1 then + DockList.Delete(I); + end; + ToolbarVisibilityChanged(Bar, False); +end; + +procedure TTBDock.ToolbarVisibilityChanged(const Bar: TTBCustomDockableWindow; + const ForceRemove: Boolean); +var + Modified, VisibleOnDock: Boolean; + I: Integer; +begin + Modified := False; + I := DockVisibleList.IndexOf(Bar); + VisibleOnDock := not ForceRemove and ToolbarVisibleOnDock(Bar); + if VisibleOnDock then begin + if I = -1 then begin + DockVisibleList.Add(Bar); + Modified := True; + end; + end + else begin + if I <> -1 then begin + DockVisibleList.Remove(Bar); + Modified := True; + end; + end; + + if Modified then begin + ArrangeToolbars; + + if Assigned(FOnInsertRemoveBar) then + FOnInsertRemoveBar(Self, VisibleOnDock, Bar); + end; +end; + +procedure TTBDock.Loaded; +begin + inherited; + { Rearranging is disabled while the component is loading, so now that it's + loaded, rearrange it. } + ArrangeToolbars; +end; + +procedure TTBDock.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if Operation = opRemove then begin + if AComponent = FBackground then + Background := nil + else if AComponent is TTBCustomDockableWindow then begin + DockList.Remove(AComponent); + DockVisibleList.Remove(AComponent); + end; + end; +end; + +function TTBDock.GetPalette: HPALETTE; +begin + if UsingBackground and Assigned(FBackground) then + { ^ by default UsingBackground returns False if FBackground isn't assigned, + but UsingBackground may be overridden and return True when it isn't } + Result := FBackground.GetPalette + else + Result := 0; +end; + +procedure TTBDock.WMEraseBkgnd(var Message: TWMEraseBkgnd); +var + R, R2: TRect; + P1, P2: TPoint; + SaveIndex: Integer; +begin + { Draw the Background if there is one, otherwise use default erasing + behavior } + if UsingBackground then begin + R := ClientRect; + R2 := R; + { Make up for nonclient area } + P1 := ClientToScreen(Point(0, 0)); + P2 := Parent.ClientToScreen(BoundsRect.TopLeft); + Dec(R2.Left, Left + (P1.X-P2.X)); + Dec(R2.Top, Top + (P1.Y-P2.Y)); + SaveIndex := SaveDC(Message.DC); + IntersectClipRect(Message.DC, R.Left, R.Top, R.Right, R.Bottom); + DrawBackground(Message.DC, R2); + RestoreDC(Message.DC, SaveIndex); + Message.Result := 1; + end + else + inherited; +end; + +procedure TTBDock.Paint; +var + R: TRect; +begin + inherited; + { Draw dotted border in design mode } + if csDesigning in ComponentState then begin + R := ClientRect; + with Canvas do begin + Pen.Style := psDot; + Pen.Color := clBtnShadow; + Brush.Style := bsClear; + Rectangle(R.Left, R.Top, R.Right, R.Bottom); + Pen.Style := psSolid; + end; + end; +end; + +procedure TTBDock.WMMove(var Message: TWMMove); +begin + inherited; + if UsingBackground then + InvalidateBackgrounds; +end; + +{$IFNDEF JR_D4} +procedure TTBDock.WMSize(var Message: TWMSize); +begin + inherited; + if not(csLoading in ComponentState) and Assigned(FOnResize) then + FOnResize(Self); +end; +{$ENDIF} + +procedure TTBDock.WMNCCalcSize(var Message: TWMNCCalcSize); + + procedure ApplyToRect(var R: TRect); + begin + if blTop in BoundLines then Inc(R.Top); + if blBottom in BoundLines then Dec(R.Bottom); + if blLeft in BoundLines then Inc(R.Left); + if blRight in BoundLines then Dec(R.Right); + end; + +{$IFDEF CLR} +var + Params: TNCCalcSizeParams; +{$ENDIF} +begin + inherited; + { note to self: non-client size is stored in FNonClientWidth & + FNonClientHeight } + {$IFNDEF CLR} + ApplyToRect(Message.CalcSize_Params.rgrc[0]); + {$ELSE} + Params := Message.CalcSize_Params; + ApplyToRect(Params.rgrc0); + Message.CalcSize_Params := Params; + {$ENDIF} +end; + +procedure TTBDock.DrawNCArea(const DrawToDC: Boolean; const ADC: HDC; + const Clip: HRGN); + + procedure DrawLine(const DC: HDC; const X1, Y1, X2, Y2: Integer); + begin + MoveToEx(DC, X1, Y1, nil); LineTo(DC, X2, Y2); + end; +var + RW, R, R2, RC: TRect; + DC: HDC; + HighlightPen, ShadowPen, SavePen: HPEN; + FillBrush: HBRUSH; +label SkipFillRect; +begin + { This works around WM_NCPAINT problem described at top of source code } + {no! R := Rect(0, 0, Width, Height);} + GetWindowRect(Handle, RW); + R := RW; + OffsetRect(R, -R.Left, -R.Top); + + if not DrawToDC then + DC := GetWindowDC(Handle) + else + DC := ADC; + try + { Use update region } + if not DrawToDC then + SelectNCUpdateRgn(Handle, DC, Clip); + + { Draw BoundLines } + R2 := R; + if (BoundLines <> []) and + ((csDesigning in ComponentState) or HasVisibleToolbars) then begin + HighlightPen := CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNHIGHLIGHT)); + ShadowPen := CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW)); + SavePen := SelectObject(DC, ShadowPen); + if blTop in BoundLines then begin + DrawLine(DC, R.Left, R.Top, R.Right, R.Top); + Inc(R2.Top); + end; + if blLeft in BoundLines then begin + DrawLine(DC, R.Left, R.Top, R.Left, R.Bottom); + Inc(R2.Left); + end; + SelectObject(DC, HighlightPen); + if blBottom in BoundLines then begin + DrawLine(DC, R.Left, R.Bottom-1, R.Right, R.Bottom-1); + Dec(R2.Bottom); + end; + if blRight in BoundLines then begin + DrawLine(DC, R.Right-1, R.Top, R.Right-1, R.Bottom); + Dec(R2.Right); + end; + SelectObject(DC, SavePen); + DeleteObject(ShadowPen); + DeleteObject(HighlightPen); + end; + Windows.GetClientRect(Handle, RC); + if not IsRectEmpty(RC) then begin + { ^ ExcludeClipRect can't be passed rectangles that have (Bottom < Top) or + (Right < Left) since it doesn't treat them as empty } + MapWindowPoints(Handle, 0, RC, 2); + OffsetRect(RC, -RW.Left, -RW.Top); + if EqualRect(RC, R2) then + { Skip FillRect because there would be nothing left after ExcludeClipRect } + goto SkipFillRect; + ExcludeClipRect(DC, RC.Left, RC.Top, RC.Right, RC.Bottom); + end; + FillBrush := CreateSolidBrush(ColorToRGB(Color)); + FillRect(DC, R2, FillBrush); + DeleteObject(FillBrush); + SkipFillRect: + finally + if not DrawToDC then + ReleaseDC(Handle, DC); + end; +end; + +procedure TTBDock.WMNCPaint(var Message: TMessage); +begin + DrawNCArea(False, 0, HRGN(Message.WParam)); +end; + +procedure DockNCPaintProc(Wnd: HWND; DC: HDC; AppData: TObject); +begin + TTBDock(AppData).DrawNCArea(True, DC, 0); +end; + +procedure TTBDock.WMPrint(var Message: TMessage); +begin + HandleWMPrint(Handle, Message, DockNCPaintProc, Self); +end; + +procedure TTBDock.WMPrintClient(var Message: + {$IFNDEF CLR} TMessage {$ELSE} TWMPrintClient {$ENDIF}); +begin + HandleWMPrintClient(PaintHandler, Message); +end; + +procedure TTBDock.CMSysColorChange(var Message: TMessage); +begin + inherited; + if Assigned(FBackground) then + FBackground.SysColorChanged; +end; + +procedure TTBDock.RelayMsgToFloatingBars({$IFNDEF CLR}var{$ELSE}const{$ENDIF} Message: TMessage); +var + I: Integer; + T: TTBCustomDockableWindow; +begin + for I := 0 to DockList.Count-1 do begin + T := TTBCustomDockableWindow(DockList[I]); + { Note: We must be careful about relaying WM_SYSCOMMAND. We can't send it + to classes that don't have special handling for it (as indicated by the + csMenuEvents style, which TTBToolWindow lacks) because the VCL's + default handling would send it back to the main form, resulting in + infinite recursion. } + if ((Message.Msg <> WM_SYSCOMMAND) or (csMenuEvents in T.ControlStyle)) and + T.Floating and T.CanFocus then begin + Message.Result := T.Perform(Message.Msg, Message.WParam, Message.LParam); + if Message.Result <> 0 then + Exit; + end; + end; +end; + +procedure TTBDock.WMSysCommand(var Message: TWMSysCommand); +begin + { Relay WM_SYSCOMMAND messages to floating toolbars which were formerly + docked. That way, items on floating menu bars can be accessed with Alt. } + if Message.CmdType and $FFF0 = SC_KEYMENU then + RelayMsgToFloatingBars({$IFNDEF CLR} TMessage(Message) {$ELSE} Message.OriginalMessage {$ENDIF}); +end; + +procedure TTBDock.CMDialogKey(var Message: TCMDialogKey); +begin + RelayMsgToFloatingBars({$IFNDEF CLR} TMessage(Message) {$ELSE} Message.OriginalMessage {$ENDIF}); + if Message.Result = 0 then + inherited; +end; + +procedure TTBDock.CMDialogChar(var Message: TCMDialogChar); +begin + RelayMsgToFloatingBars({$IFNDEF CLR} TMessage(Message) {$ELSE} Message.OriginalMessage {$ENDIF}); + if Message.Result = 0 then + inherited; +end; + +{ TTBDock - property access methods } + +procedure TTBDock.SetAllowDrag(Value: Boolean); +var + I: Integer; +begin + if FAllowDrag <> Value then begin + FAllowDrag := Value; + for I := 0 to ControlCount-1 do + if Controls[I] is TTBCustomDockableWindow then + RecalcNCArea(TTBCustomDockableWindow(Controls[I])); + end; +end; + +function TTBDock.UsingBackground: Boolean; +begin + Result := Assigned(FBackground) and FBackground.UsingBackground; +end; + +procedure TTBDock.DrawBackground(DC: HDC; const DrawRect: TRect); +begin + FBackground.Draw(DC, DrawRect); +end; + +procedure TTBDock.InvalidateBackgrounds; +{ Called after background is changed } +var + I: Integer; + T: TTBCustomDockableWindow; +begin + Invalidate; + { Synchronize child toolbars also } + for I := 0 to DockList.Count-1 do begin + T := TTBCustomDockableWindow(DockList[I]); + if ToolbarVisibleOnDock(T) then + { Invalidate both non-client and client area } + InvalidateAll(T); + end; +end; + +procedure TTBDock.SetBackground(Value: TTBBasicBackground); +begin + if FBackground <> Value then begin + if Assigned(FBackground) then + FBackground.UnregisterChanges(BackgroundChanged); + FBackground := Value; + if Assigned(Value) then begin + Value.FreeNotification(Self); + Value.RegisterChanges(BackgroundChanged); + end; + InvalidateBackgrounds; + end; +end; + +procedure TTBDock.BackgroundChanged(Sender: TObject); +begin + InvalidateBackgrounds; +end; + +procedure TTBDock.SetBackgroundOnToolbars(Value: Boolean); +begin + if FBkgOnToolbars <> Value then begin + FBkgOnToolbars := Value; + InvalidateBackgrounds; + end; +end; + +procedure TTBDock.SetBoundLines(Value: TTBDockBoundLines); +var + X, Y: Integer; + B: TTBDockBoundLines; +begin + if FBoundLines <> Value then begin + FBoundLines := Value; + X := 0; + Y := 0; + B := BoundLines; { optimization } + if blTop in B then Inc(Y); + if blBottom in B then Inc(Y); + if blLeft in B then Inc(X); + if blRight in B then Inc(X); + FNonClientWidth := X; + FNonClientHeight := Y; + RecalcNCArea(Self); + end; +end; + +procedure TTBDock.SetFixAlign(Value: Boolean); +begin + if FFixAlign <> Value then begin + FFixAlign := Value; + ArrangeToolbars; + end; +end; + +procedure TTBDock.SetPosition(Value: TTBDockPosition); +begin + if (FPosition <> Value) and (ControlCount <> 0) then + raise EInvalidOperation.Create(STBDockCannotChangePosition); + FPosition := Value; + case Position of + dpTop: Align := alTop; + dpBottom: Align := alBottom; + dpLeft: Align := alLeft; + dpRight: Align := alRight; + end; +end; + +function TTBDock.GetToolbarCount: Integer; +begin + Result := DockVisibleList.Count; +end; + +function TTBDock.GetToolbars(Index: Integer): TTBCustomDockableWindow; +begin + Result := TTBCustomDockableWindow(DockVisibleList[Index]); +end; + +(*function TTBDock.GetVersion: TToolbar97Version; +begin + Result := Toolbar97VersionPropText; +end; + +procedure TTBDock.SetVersion(const Value: TToolbar97Version); +begin + { write method required for the property to show up in Object Inspector } +end;*) + + +{ TTBFloatingWindowParent - Internal } + +procedure TTBFloatingWindowParent.CreateParams(var Params: TCreateParams); +const + ThickFrames: array[Boolean] of DWORD = (0, WS_THICKFRAME); +begin + inherited; + + { Disable complete redraws when size changes. CS_H/VREDRAW cause flicker + and are not necessary for this control at run time } + if not(csDesigning in ComponentState) then + with Params.WindowClass do + Style := Style and not(CS_HREDRAW or CS_VREDRAW); + + with Params do begin + { Note: WS_THICKFRAME and WS_BORDER styles are included to ensure that + sizing grips are displayed on child controls with scrollbars. The + thick frame or border is not drawn by Windows; TCustomToolWindow97 + handles all border drawing by itself. } + if not(csDesigning in ComponentState) then + Style := WS_POPUP or WS_BORDER or ThickFrames[FDockableWindow.FResizable] + else + Style := Style or WS_BORDER or ThickFrames[FDockableWindow.FResizable]; + { The WS_EX_TOOLWINDOW style is needed so there isn't a taskbar button + for the toolbar when FloatingMode = fmOnTopOfAllForms. } + ExStyle := WS_EX_TOOLWINDOW; + end; +end; + +procedure TTBFloatingWindowParent.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if (Operation = opRemove) and (AComponent = FParentForm) then + FParentForm := nil; +end; + +procedure TTBFloatingWindowParent.AlignControls(AControl: TControl; var Rect: TRect); +begin + { ignore Align setting of the child toolbar } +end; + +procedure TTBFloatingWindowParent.WMGetMinMaxInfo(var Message: TWMGetMinMaxInfo); +{$IFDEF CLR} +var + Temp: TMinMaxInfo; +{$ENDIF} +begin + inherited; + { Because the window uses the WS_THICKFRAME style (but not for the usual + purpose), it must process the WM_GETMINMAXINFO message to remove the + minimum and maximum size limits it imposes by default. } + {$IFNDEF CLR} + with Message.MinMaxInfo^ do begin + {$ELSE} + Temp := Message.MinMaxInfo; + with Temp do begin + {$ENDIF} + with ptMinTrackSize do begin + X := 1; + Y := 1; + { Note to self: Don't put GetMinimumSize code here, since + ClientWidth/Height values are sometimes invalid during a RecreateWnd } + end; + with ptMaxTrackSize do begin + { Because of the 16-bit (signed) size limitations of Windows 95, + Smallints must be used instead of Integers or Longints } + X := High(Smallint); + Y := High(Smallint); + end; + end; + {$IFDEF CLR} + Message.MinMaxInfo := Temp; + {$ENDIF} +end; + +procedure TTBFloatingWindowParent.CMShowingChanged(var Message: TMessage); +const + ShowFlags: array[Boolean] of UINT = ( + SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_HIDEWINDOW, + SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_SHOWWINDOW); +begin + { Must override TCustomForm/TForm's CM_SHOWINGCHANGED handler so that the + form doesn't get activated when Visible is set to True. } + SetWindowPos(WindowHandle, 0, 0, 0, 0, 0, ShowFlags[Showing and FShouldShow]); +end; + +procedure TTBFloatingWindowParent.CMDialogKey(var Message: TCMDialogKey); +begin + { If Escape if pressed on a floating toolbar, return focus to the form } + if (Message.CharCode = VK_ESCAPE) and + (KeyDataToShiftState(ClipToLongint(Message.KeyData)) = []) and + Assigned(ParentForm) then begin + ParentForm.SetFocus; + Message.Result := 1; + end + else + inherited; +end; + +procedure TTBFloatingWindowParent.CMTextChanged(var Message: TMessage); +begin + inherited; + RedrawNCArea([twrdCaption]); +end; + +function TTBFloatingWindowParent.GetCaptionRect(const AdjustForBorder, + MinusCloseButton: Boolean): TRect; +var + P: TPoint; +begin + Result := Rect(0, 0, ClientWidth, GetSmallCaptionHeight-1); + if MinusCloseButton then + Dec(Result.Right, Result.Bottom); + if AdjustForBorder then begin + P := FDockableWindow.GetFloatingBorderSize; + OffsetRect(Result, P.X, P.Y); + end; +end; + +function TTBFloatingWindowParent.GetCloseButtonRect(const AdjustForBorder: Boolean): TRect; +begin + Result := GetCaptionRect(AdjustForBorder, False); + Result.Left := Result.Right - (GetSmallCaptionHeight-1); +end; + +procedure TTBFloatingWindowParent.WMNCCalcSize(var Message: TWMNCCalcSize); + + procedure ApplyToRect(var R: TRect); + var + TL, BR: TPoint; + begin + FDockableWindow.GetFloatingNCArea(TL, BR); + Inc(R.Left, TL.X); + Inc(R.Top, TL.Y); + Dec(R.Right, BR.X); + Dec(R.Bottom, BR.Y); + end; + +{$IFDEF CLR} +var + Params: TNCCalcSizeParams; +{$ENDIF} +begin + { Doesn't call inherited since it overrides the normal NC sizes } + Message.Result := 0; + {$IFNDEF CLR} + ApplyToRect(Message.CalcSize_Params.rgrc[0]); + {$ELSE} + Params := Message.CalcSize_Params; + ApplyToRect(Params.rgrc0); + Message.CalcSize_Params := Params; + {$ENDIF} +end; + +procedure TTBFloatingWindowParent.WMNCPaint(var Message: TMessage); +begin + { Don't call inherited because it overrides the default NC painting } + DrawNCArea(False, 0, HRGN(Message.WParam), twrdAll); +end; + +procedure FloatingWindowParentNCPaintProc(Wnd: HWND; DC: HDC; AppData: TObject); +begin + with TTBFloatingWindowParent(AppData) do + DrawNCArea(True, DC, 0, twrdAll); +end; + +procedure TTBFloatingWindowParent.WMPrint(var Message: TMessage); +begin + HandleWMPrint(Handle, Message, FloatingWindowParentNCPaintProc, Self); +end; + +procedure TTBFloatingWindowParent.WMPrintClient(var Message: + {$IFNDEF CLR} TMessage {$ELSE} TWMPrintClient {$ENDIF}); +begin + HandleWMPrintClient(PaintHandler, Message); +end; + +procedure TTBFloatingWindowParent.WMNCHitTest(var Message: TWMNCHitTest); +var + P: TPoint; + R: TRect; + BorderSize: TPoint; + C: Integer; +begin + inherited; + with Message do begin + P := SmallPointToPoint(Pos); + GetWindowRect(Handle, R); + Dec(P.X, R.Left); Dec(P.Y, R.Top); + if Result <> HTCLIENT then begin + Result := HTNOWHERE; + if FDockableWindow.ShowCaption and PtInRect(GetCaptionRect(True, False), P) then begin + if FDockableWindow.FCloseButton and PtInRect(GetCloseButtonRect(True), P) then + Result := HT_TB2k_Close + else + Result := HT_TB2k_Caption; + end + else + if FDockableWindow.Resizable then begin + BorderSize := FDockableWindow.GetFloatingBorderSize; + if not(tbdsResizeEightCorner in FDockableWindow.FDockableWindowStyles) then begin + if (P.Y >= 0) and (P.Y < BorderSize.Y) then Result := HTTOP else + if (P.Y < Height) and (P.Y >= Height-BorderSize.Y-1) then Result := HTBOTTOM else + if (P.X >= 0) and (P.X < BorderSize.X) then Result := HTLEFT else + if (P.X < Width) and (P.X >= Width-BorderSize.X-1) then Result := HTRIGHT; + end + else begin + C := BorderSize.X + (GetSmallCaptionHeight-1); + if (P.X >= 0) and (P.X < BorderSize.X) then begin + Result := HTLEFT; + if (P.Y < C) then Result := HTTOPLEFT else + if (P.Y >= Height-C) then Result := HTBOTTOMLEFT; + end + else + if (P.X < Width) and (P.X >= Width-BorderSize.X-1) then begin + Result := HTRIGHT; + if (P.Y < C) then Result := HTTOPRIGHT else + if (P.Y >= Height-C) then Result := HTBOTTOMRIGHT; + end + else + if (P.Y >= 0) and (P.Y < BorderSize.Y) then begin + Result := HTTOP; + if (P.X < C) then Result := HTTOPLEFT else + if (P.X >= Width-C) then Result := HTTOPRIGHT; + end + else + if (P.Y < Height) and (P.Y >= Height-BorderSize.Y-1) then begin + Result := HTBOTTOM; + if (P.X < C) then Result := HTBOTTOMLEFT else + if (P.X >= Width-C) then Result := HTBOTTOMRIGHT; + end; + end; + end; + end; + end; +end; + +procedure TTBFloatingWindowParent.SetCloseButtonState(Pushed: Boolean); +begin + if FCloseButtonDown <> Pushed then begin + FCloseButtonDown := Pushed; + RedrawNCArea([twrdCloseButton]); + end; +end; + +procedure TTBFloatingWindowParent.WMNCLButtonDown(var Message: TWMNCLButtonDown); +var + P: TPoint; + R, BR: TRect; +begin + case ClipToLongint(Message.HitTest) of + HT_TB2k_Caption: begin + P := FDockableWindow.ScreenToClient(Point(Message.XCursor, Message.YCursor)); + FDockableWindow.BeginMoving(P.X, P.Y); + end; + HTLEFT..HTBOTTOMRIGHT: + if FDockableWindow.Resizable then + FDockableWindow.BeginSizing(TTBSizeHandle(ClipToLongint(Message.HitTest) - HTLEFT)); + HT_TB2k_Close: begin + GetWindowRect(Handle, R); + BR := GetCloseButtonRect(True); + OffsetRect(BR, R.Left, R.Top); + if CloseButtonLoop(Handle, BR, SetCloseButtonState) then + FDockableWindow.Close; + end; + else + inherited; + end; +end; + +procedure TTBFloatingWindowParent.WMNCLButtonDblClk(var Message: TWMNCLButtonDblClk); +begin + if ClipToLongint(Message.HitTest) = HT_TB2k_Caption then + FDockableWindow.DoubleClick; +end; + +procedure TTBFloatingWindowParent.WMNCRButtonUp(var Message: TWMNCRButtonUp); +begin + FDockableWindow.ShowNCContextMenu(Message.XCursor, Message.YCursor); +end; + +procedure TTBFloatingWindowParent.WMClose(var Message: TWMClose); +var + MDIParentForm: TTBCustomForm; +begin + { A floating toolbar does not use WM_CLOSE messages when its close button + is clicked, but Windows still sends a WM_CLOSE message if the user + presses Alt+F4 while one of the toolbar's controls is focused. Inherited + is not called since we do not want Windows' default processing - which + destroys the window. Instead, relay the message to the parent form. } + MDIParentForm := GetMDIParent(TBGetToolWindowParentForm(FDockableWindow)); + if Assigned(MDIParentForm) and MDIParentForm.HandleAllocated then + SendMessage(MDIParentForm.Handle, WM_CLOSE, 0, 0); + { Note to self: MDIParentForm is used instead of OwnerForm since MDI + childs don't process Alt+F4 as Close } +end; + +procedure TTBFloatingWindowParent.WMActivate(var Message: TWMActivate); +var + ParentForm: TTBCustomForm; +begin + if csDesigning in ComponentState then begin + inherited; + Exit; + end; + + ParentForm := GetMDIParent(TBGetToolWindowParentForm(FDockableWindow)); + + if Assigned(ParentForm) and ParentForm.HandleAllocated then + SendMessage(ParentForm.Handle, WM_NCACTIVATE, Ord(Message.Active <> WA_INACTIVE), 0); + + if Message.Active <> WA_INACTIVE then begin + { This works around a "gotcha" in TCustomForm.CMShowingChanged. When a form + is hidden, it uses the internal VCL function FindTopMostWindow to + find a new active window. The problem is that handles of floating + toolbars on the form being hidden can be returned by + FindTopMostWindow, so the following code is used to prevent floating + toolbars on the hidden form from being left active. } + if not IsWindowVisible(Handle) then + { ^ Calling IsWindowVisible with a floating toolbar handle will + always return False if its parent form is hidden since the + WH_CALLWNDPROC hook automatically updates the toolbars' + visibility. } + { Find and activate a window besides this toolbar } + SetActiveWindow(FindTopLevelWindow(Handle)) + else + { If the toolbar is being activated and the previous active window wasn't + its parent form, the form is activated instead. This is done so that if + the application is deactivated while a floating toolbar was active and + the application is reactivated again, it returns focus to the form. } + if Assigned(ParentForm) and ParentForm.HandleAllocated and + (Message.ActiveWindow <> ParentForm.Handle) then + SetActiveWindow(ParentForm.Handle); + end; +end; + +procedure TTBFloatingWindowParent.WMMouseActivate(var Message: TWMMouseActivate); +var + ParentForm, MDIParentForm: TTBCustomForm; +begin + if csDesigning in ComponentState then begin + inherited; + Exit; + end; + + { When floating, prevent the toolbar from activating when clicked. + This is so it doesn't take the focus away from the window that had it } + Message.Result := MA_NOACTIVATE; + + { Similar to calling BringWindowToTop, but doesn't activate it } + SetWindowPos(Handle, HWND_TOP, 0, 0, 0, 0, + SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE); + + { Since it is returning MA_NOACTIVATE, activate the form instead. } + ParentForm := TBGetToolWindowParentForm(FDockableWindow); + MDIParentForm := GetMDIParent(ParentForm); + if (FDockableWindow.FFloatingMode = fmOnTopOfParentForm) and + FDockableWindow.FActivateParent and + Assigned(MDIParentForm) and (GetActiveWindow <> Handle) then begin + { ^ Note to self: The GetActiveWindow check must be in there so that + double-clicks work properly on controls like Edits } + if MDIParentForm.HandleAllocated then + SetActiveWindow(MDIParentForm.Handle); + if (MDIParentForm <> ParentForm) and { if it's an MDI child form } + ParentForm.HandleAllocated then + BringWindowToTop(ParentForm.Handle); + end; +end; + +procedure TTBFloatingWindowParent.WMMove(var Message: TWMMove); +begin + inherited; + FDockableWindow.Moved; +end; + +procedure TTBFloatingWindowParent.DrawNCArea(const DrawToDC: Boolean; + const ADC: HDC; const Clip: HRGN; RedrawWhat: TTBToolWindowNCRedrawWhat); +{ Redraws all the non-client area (the border, title bar, and close button) of + the toolbar when it is floating. } +const + BorderColors: array[Boolean] of Integer = + (COLOR_ACTIVEBORDER, COLOR_INACTIVEBORDER); + CaptionBkColors: array[Boolean, Boolean] of Integer = + ((COLOR_ACTIVECAPTION, COLOR_INACTIVECAPTION), + (COLOR_GRADIENTACTIVECAPTION, COLOR_GRADIENTINACTIVECAPTION)); + CloseButtonState: array[Boolean] of UINT = (0, DFCS_PUSHED); +var + DC: HDC; + R, R2: TRect; + Gradient: Boolean; + SavePen: HPEN; + SaveIndex: Integer; + S: TPoint; +begin + if not HandleAllocated then Exit; + + if not DrawToDC then + DC := GetWindowDC(Handle) + else + DC := ADC; + try + { Use update region } + if not DrawToDC then + SelectNCUpdateRgn(Handle, DC, Clip); + + { Work around an apparent NT 4.0 & 2000 bug. If the width of the DC is + greater than the width of the screen, then any call to ExcludeClipRect + inexplicably shrinks the clipping rectangle to the screen width. I've + found that calling IntersectClipRect as done below magically fixes the + problem (but I'm not sure why). } + GetWindowRect(Handle, R); OffsetRect(R, -R.Left, -R.Top); + IntersectClipRect(DC, R.Left, R.Top, R.Right, R.Bottom); + + Gradient := GetSystemParametersInfoBool(SPI_GETGRADIENTCAPTIONS, False); + + { Border } + if twrdBorder in RedrawWhat then begin + { This works around WM_NCPAINT problem described at top of source code } + {no! R := Rect(0, 0, Width, Height);} + GetWindowRect(Handle, R); OffsetRect(R, -R.Left, -R.Top); + R2 := R; + DrawEdge(DC, R, EDGE_RAISED, BF_RECT or BF_ADJUST); + S := FDockableWindow.GetFloatingBorderSize; + InflateRect(R2, -(S.X - 1), -(S.Y - 1)); + FrameRect(DC, R2, GetSysColorBrush(COLOR_BTNFACE)); + SaveIndex := SaveDC(DC); + ExcludeClipRect(DC, R2.Left, R2.Top, R2.Right, R2.Bottom); + FillRect(DC, R, GetSysColorBrush(BorderColors[FDockableWindow.FInactiveCaption])); + RestoreDC(DC, SaveIndex); + end; + + if FDockableWindow.ShowCaption then begin + if (twrdCaption in RedrawWhat) and FDockableWindow.FCloseButton and + (twrdCloseButton in RedrawWhat) then + SaveIndex := SaveDC(DC) + else + SaveIndex := 0; + try + if SaveIndex <> 0 then + with GetCloseButtonRect(True) do + { Reduces flicker } + ExcludeClipRect(DC, Left, Top, Right, Bottom); + + { Caption } + if twrdCaption in RedrawWhat then begin + R := GetCaptionRect(True, FDockableWindow.FCloseButton); + DrawSmallWindowCaption(Handle, DC, R, Caption, + not FDockableWindow.FInactiveCaption); + + { Line below caption } + R := GetCaptionRect(True, False); + SavePen := SelectObject(DC, CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNFACE))); + MoveToEx(DC, R.Left, R.Bottom, nil); + LineTo(DC, R.Right, R.Bottom); + DeleteObject(SelectObject(DC, SavePen)); + end; + finally + if SaveIndex <> 0 then + RestoreDC(DC, SaveIndex); + end; + + { Close button } + if FDockableWindow.FCloseButton then begin + R := GetCloseButtonRect(True); + R2 := R; + InflateRect(R2, 0, -2); + Dec(R2.Right, 2); + if twrdCaption in RedrawWhat then begin + SaveIndex := SaveDC(DC); + ExcludeClipRect(DC, R2.Left, R2.Top, R2.Right, R2.Bottom); + FillRect(DC, R, GetSysColorBrush(CaptionBkColors[Gradient, + FDockableWindow.FInactiveCaption])); + RestoreDC(DC, SaveIndex); + end; + if twrdCloseButton in RedrawWhat then + DrawFrameControl(DC, R2, DFC_CAPTION, DFCS_CAPTIONCLOSE or + CloseButtonState[FCloseButtonDown]); + end; + end; + finally + if not DrawToDC then + ReleaseDC(Handle, DC); + end; +end; + +procedure TTBFloatingWindowParent.RedrawNCArea(const RedrawWhat: TTBToolWindowNCRedrawWhat); +begin + { Note: IsWindowVisible is called as an optimization. There's no need to + draw on invisible windows. } + if HandleAllocated and IsWindowVisible(Handle) then + DrawNCArea(False, 0, 0, RedrawWhat); +end; + +procedure TTBFloatingWindowParent.CallRecreateWnd; +{ This method exists for Delphi.NET: If we try to call RecreateWnd directly + in TTBCustomDockableWindow.SetResizable, we get this compiler error: + "Only methods of descendant types may access protected member + [Borland.Vcl]TWinControl.RecreateWnd across assembly boundaries" } +begin + RecreateWnd; +end; + + +{ TTBCustomDockableWindow } + +constructor TTBCustomDockableWindow.Create(AOwner: TComponent); +begin + inherited; + + ControlStyle := ControlStyle + + [csAcceptsControls, csClickEvents, csDoubleClicks, csSetCaption] - + [csCaptureMouse{capturing is done manually}, csOpaque]; + FAutoResize := True; + FActivateParent := True; + FBorderStyle := bsSingle; + FCloseButton := True; + FDockableTo := [dpTop, dpBottom, dpLeft, dpRight]; + FDockableWindowStyles := [tbdsResizeEightCorner, tbdsResizeClipCursor]; + FDockPos := -1; + FDragHandleStyle := dhSingle; + FEffectiveDockRow := -1; + FHideWhenInactive := True; + FResizable := True; + FShowCaption := True; + FSmoothDrag := True; + FUseLastDock := True; + + Color := clBtnFace; + + if not(csDesigning in ComponentState) then + InstallHookProc(Self, ToolbarHookProc, [hpSendActivate, hpSendActivateApp, + hpSendWindowPosChanged, hpPreDestroy]); + InitTrackMouseEvent; +end; + +destructor TTBCustomDockableWindow.Destroy; +begin + inherited; + FreeAndNil(FDockForms); { must be done after 'inherited' because Notification accesses FDockForms } + FreeAndNil(FFloatParent); + UninstallHookProc(Self, ToolbarHookProc); +end; + +function TTBCustomDockableWindow.HasParent: Boolean; +begin + if Parent is TTBFloatingWindowParent then + Result := False + else + Result := inherited HasParent; +end; + +function TTBCustomDockableWindow.GetParentComponent: TComponent; +begin + if Parent is TTBFloatingWindowParent then + Result := nil + else + Result := inherited GetParentComponent; +end; + +procedure TTBCustomDockableWindow.Moved; +begin + if not(csLoading in ComponentState) and Assigned(FOnMove) and (FDisableOnMove <= 0) then + FOnMove(Self); +end; + +procedure TTBCustomDockableWindow.WMMove(var Message: TWMMove); + + procedure Redraw; + { Redraws the control using an off-screen bitmap to avoid flicker } + var + CR, R: TRect; + W: HWND; + DC, BmpDC: HDC; + Bmp: HBITMAP; + begin + if not HandleAllocated then Exit; + CR := ClientRect; + W := Handle; + if GetUpdateRect(W, R, False) and EqualRect(R, CR) then begin + { The client area is already completely invalid, so don't bother using + an off-screen bitmap } + InvalidateAll(Self); + Exit; + end; + ValidateRect(W, nil); + BmpDC := 0; + Bmp := 0; + DC := GetDC(W); + try + BmpDC := CreateCompatibleDC(DC); + Bmp := CreateCompatibleBitmap(DC, CR.Right, CR.Bottom); + SelectObject(BmpDC, Bmp); + SendMessage(W, WM_NCPAINT, 0, 0); + SendMessage(W, WM_ERASEBKGND, WPARAM(BmpDC), 0); + SendMessage(W, WM_PAINT, WPARAM(BmpDC), 0); + BitBlt(DC, 0, 0, CR.Right, CR.Bottom, BmpDC, 0, 0, SRCCOPY); + finally + if BmpDC <> 0 then DeleteDC(BmpDC); + if Bmp <> 0 then DeleteObject(Bmp); + ReleaseDC(W, DC); + end; + end; + +begin + inherited; + FMoved := True; + if Docked and CurrentDock.UsingBackground then begin + { Needs to redraw so that the background is lined up with the dock at the + new position. } + Redraw; + end; + Moved; +end; + +{$IFNDEF JR_D4} +procedure TTBCustomDockableWindow.WMSize(var Message: TWMSize); +begin + inherited; + if not(csLoading in ComponentState) and Assigned(FOnResize) then + FOnResize(Self); +end; +{$ENDIF} + +procedure TTBCustomDockableWindow.UpdateCaptionState; +{ Updates the caption active/inactive state of a floating tool window. + Called when the tool window is visible or is about to be shown. } + + function IsPopupWindowActive: Boolean; + const + IID_ITBPopupWindow: TGUID = '{E45CBE74-1ECF-44CB-B064-6D45B1924708}'; + var + Ctl: TWinControl; + {$IFDEF CLR} + Intfs: array of System.Type; + I: Integer; + {$ENDIF} + begin + Ctl := FindControl(GetActiveWindow); + { Instead of using "is TTBPopupWindow", which would require linking to the + TB2Item unit, check if the control implements the ITBPopupWindow + interface. This will tell us if it's a TTBPopupWindow or descendant. } + {$IFNDEF CLR} + Result := Assigned(Ctl) and Assigned(Ctl.GetInterfaceEntry(IID_ITBPopupWindow)); + {$ELSE} + Result := False; + if Assigned(Ctl) then begin + Intfs := TypeOf(Ctl).GetInterfaces; + for I := Low(Intfs) to High(Intfs) do begin + if Intfs[I].GUID = IID_ITBPopupWindow then begin + Result := True; + Break; + end; + end; + end; + {$ENDIF} + end; + + function GetActiveFormWindow: HWND; + var + Ctl: TWinControl; + begin + Result := GetActiveWindow; + { If the active window is a TTBFloatingWindowParent (i.e. a control on a + floating toolbar is focused), return the parent form handle instead } + Ctl := FindControl(Result); + if Assigned(Ctl) and (Ctl is TTBFloatingWindowParent) then begin + Ctl := TTBFloatingWindowParent(Ctl).ParentForm; + if Assigned(Ctl) and Ctl.HandleAllocated then + Result := Ctl.Handle; + end; + end; + +var + Inactive: Boolean; + ActiveWnd: HWND; +begin + { Update caption state if floating, but not if a control on a popup window + (e.g. a TTBEditItem) is currently focused; we don't want the captions on + all floating toolbars to turn gray in that case. (The caption state will + get updated when we're called the next time the active window changes, + i.e. when the user dismisses the popup window.) } + if (Parent is TTBFloatingWindowParent) and Parent.HandleAllocated and + not IsPopupWindowActive then begin + Inactive := False; + if not ApplicationIsActive then + Inactive := True + else if (FFloatingMode = fmOnTopOfParentForm) and + (HWND(GetWindowLong(Parent.Handle, GWL_HWNDPARENT)) <> Application.Handle) then begin + { Use inactive caption if the active window doesn't own the float parent + (directly or indirectly). Note: For compatibility with browser-embedded + TActiveForms, we use IsAncestorOfWindow instead of checking + TBGetToolWindowParentForm. } + ActiveWnd := GetActiveFormWindow; + if (ActiveWnd = 0) or not IsAncestorOfWindow(ActiveWnd, Parent.Handle) then + Inactive := True; + end; + if FInactiveCaption <> Inactive then begin + FInactiveCaption := Inactive; + TTBFloatingWindowParent(Parent).RedrawNCArea(twrdAll); + end; + end; +end; + +function TTBCustomDockableWindow.GetShowingState: Boolean; + + function IsWindowVisibleAndNotMinimized(Wnd: HWND): Boolean; + begin + Result := IsWindowVisible(Wnd); + if Result then begin + { Wnd may not be a top-level window (e.g. in the case of an MDI child + form, or an ActiveForm embedded in a web page), so go up the chain of + parent windows and see if any of them are minimized } + repeat + if IsIconic(Wnd) then begin + Result := False; + Break; + end; + { Stop if we're at a top-level window (no need to check owner windows) } + if GetWindowLong(Wnd, GWL_STYLE) and WS_CHILD = 0 then + Break; + Wnd := GetParent(Wnd); + until Wnd = 0; + end; + end; + +var + HideFloatingToolbars: Boolean; + ParentForm: TTBCustomForm; +begin + Result := Showing and (FHidden = 0); + if Floating and not(csDesigning in ComponentState) then begin + HideFloatingToolbars := FFloatingMode = fmOnTopOfParentForm; + if HideFloatingToolbars then begin + ParentForm := TBGetToolWindowParentForm(Self); + if Assigned(ParentForm) and ParentForm.HandleAllocated and + IsWindowVisibleAndNotMinimized(ParentForm.Handle) then + HideFloatingToolbars := False; + end; + Result := Result and not (HideFloatingToolbars or (FHideWhenInactive and not ApplicationIsActive)); + end; +end; + +procedure TTBCustomDockableWindow.UpdateVisibility; +{ Updates the visibility of the tool window, and additionally the caption + state if floating and showing } +var + IsVisible: Boolean; +begin + if HandleAllocated then begin + IsVisible := IsWindowVisible(Handle); + if IsVisible <> GetShowingState then begin + Perform(CM_SHOWINGCHANGED, 0, 0); + { Note: CMShowingChanged will call UpdateCaptionState automatically + when floating and showing } + end + else if IsVisible and Floating then begin + { If we're floating and we didn't send the CM_SHOWINGCHANGED message + then we have to call UpdateCaptionState manually } + UpdateCaptionState; + end; + end; +end; + +function IsTopmost(const Wnd: HWND): Boolean; +begin + Result := GetWindowLong(Wnd, GWL_EXSTYLE) and WS_EX_TOPMOST <> 0; +end; + +procedure TTBCustomDockableWindow.UpdateTopmostFlag; +const + Wnds: array[Boolean] of HWND = (HWND_NOTOPMOST, HWND_TOPMOST); +var + ShouldBeTopmost: Boolean; +begin + if HandleAllocated then begin + if FFloatingMode = fmOnTopOfAllForms then + ShouldBeTopmost := True + else + ShouldBeTopmost := IsTopmost(HWND(GetWindowLong(Parent.Handle, GWL_HWNDPARENT))); + if ShouldBeTopmost <> IsTopmost(Parent.Handle) then + { ^ it must check if it already was topmost or non-topmost or else + it causes problems on Win95/98 for some reason } + SetWindowPos(Parent.Handle, Wnds[ShouldBeTopmost], 0, 0, 0, 0, + SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE); + end; +end; + +procedure TTBCustomDockableWindow.CMShowingChanged(var Message: TMessage); + + function GetPrevWnd(W: HWND): HWND; + var + WasTopmost, Done: Boolean; + ParentWnd: HWND; + begin + WasTopmost := IsTopmost(Parent.Handle); + Result := W; + repeat + Done := True; + Result := GetWindow(Result, GW_HWNDPREV); + ParentWnd := Result; + while ParentWnd <> 0 do begin + if WasTopmost and not IsTopmost(ParentWnd) then begin + Done := False; + Break; + end; + ParentWnd := HWND(GetWindowLong(ParentWnd, GWL_HWNDPARENT)); + if ParentWnd = W then begin + Done := False; + Break; + end; + end; + until Done; + end; + +const + ShowFlags: array[Boolean] of UINT = ( + SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_HIDEWINDOW, + SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_SHOWWINDOW); +var + Show: Boolean; + Form: TTBCustomForm; +begin + { inherited isn't called since TTBCustomDockableWindow handles CM_SHOWINGCHANGED + itself. For reference, the original TWinControl implementation is: + const + ShowFlags: array[Boolean] of Word = ( + SWP_NOSIZE + SWP_NOMOVE + SWP_NOZORDER + SWP_NOACTIVATE + SWP_HIDEWINDOW, + SWP_NOSIZE + SWP_NOMOVE + SWP_NOZORDER + SWP_NOACTIVATE + SWP_SHOWWINDOW); + begin + SetWindowPos(FHandle, 0, 0, 0, 0, 0, ShowFlags[FShowing]); + end; + } + if HandleAllocated then begin + Show := GetShowingState; + if Parent is TTBFloatingWindowParent then begin + if Show then begin + { If the toolbar is floating, set its "owner window" to the parent form + so that the toolbar window always stays on top of the form } + if FFloatingMode = fmOnTopOfParentForm then begin + Form := GetMDIParent(TBGetToolWindowParentForm(Self)); + if Assigned(Form) and Form.HandleAllocated and + (HWND(GetWindowLong(Parent.Handle, GWL_HWNDPARENT)) <> Form.Handle) then begin + SetWindowOwner(Parent.Handle, Form.Handle); + { Following is necessarily to make it immediately realize the + GWL_HWNDPARENT change } + SetWindowPos(Parent.Handle, GetPrevWnd(Form.Handle), 0, 0, 0, 0, SWP_NOACTIVATE or + SWP_NOMOVE or SWP_NOSIZE); + end; + end + else begin + SetWindowOwner(Parent.Handle, Application.Handle); + end; + { Initialize caption state after setting owner but before showing } + UpdateCaptionState; + end; + UpdateTopmostFlag; + { Show/hide the TTBFloatingWindowParent. The following lines had to be + added to fix a problem that was in 1.65d/e. In 1.65d/e, it always + kept TTBFloatingWindowParent visible (this change was made to improve + compatibility with D4's Actions), but this for some odd reason would + cause a Stack Overflow error if the program's main form was closed + while a floating toolwindow was focused. (This problem did not occur + on NT.) } + TTBFloatingWindowParent(Parent).FShouldShow := Show; + Parent.Perform(CM_SHOWINGCHANGED, 0, 0); + end; + SetWindowPos(Handle, 0, 0, 0, 0, 0, ShowFlags[Show]); + if not Show and (GetActiveWindow = Handle) then + { If the window is hidden but is still active, find and activate a + different window } + SetActiveWindow(FindTopLevelWindow(Handle)); + end; +end; + +procedure TTBCustomDockableWindow.CreateParams(var Params: TCreateParams); +begin + inherited; + + { Disable complete redraws when size changes. CS_H/VREDRAW cause flicker + and are not necessary for this control at run time } + if not(csDesigning in ComponentState) then + with Params.WindowClass do + Style := Style and not(CS_HREDRAW or CS_VREDRAW); +end; + +procedure TTBCustomDockableWindow.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if Operation = opRemove then begin + if AComponent = FDefaultDock then + FDefaultDock := nil + else + if AComponent = FLastDock then + FLastDock := nil + else + RemoveFromList(FDockForms, AComponent); + end; +end; + +procedure TTBCustomDockableWindow.MoveOnScreen(const OnlyIfFullyOffscreen: Boolean); +{ Moves the (floating) toolbar so that it is fully (or at least mostly) in + view on the screen } +var + R, S, Test: TRect; +begin + if Floating then begin + R := Parent.BoundsRect; + S := GetRectOfMonitorContainingRect(R, True); + + if OnlyIfFullyOffscreen and IntersectRect(Test, R, S) then + Exit; + + if R.Right > S.Right then + OffsetRect(R, S.Right - R.Right, 0); + if R.Bottom > S.Bottom then + OffsetRect(R, 0, S.Bottom - R.Bottom); + if R.Left < S.Left then + OffsetRect(R, S.Left - R.Left, 0); + if R.Top < S.Top then + OffsetRect(R, 0, S.Top - R.Top); + Parent.BoundsRect := R; + end; +end; + +procedure TTBCustomDockableWindow.ReadPositionData(const Data: TTBReadPositionData); +begin +end; + +procedure TTBCustomDockableWindow.DoneReadingPositionData(const Data: TTBReadPositionData); +begin +end; + +procedure TTBCustomDockableWindow.WritePositionData(const Data: TTBWritePositionData); +begin +end; + +procedure TTBCustomDockableWindow.InitializeOrdering; +begin +end; + +procedure TTBCustomDockableWindow.SizeChanging(const AWidth, AHeight: Integer); +begin +end; + +procedure TTBCustomDockableWindow.ReadSavedAtRunTime(Reader: TReader); +begin + FSavedAtRunTime := Reader.ReadBoolean; +end; + +procedure TTBCustomDockableWindow.WriteSavedAtRunTime(Writer: TWriter); +begin + { WriteSavedAtRunTime only called when not(csDesigning in ComponentState) } + Writer.WriteBoolean(True); +end; + +procedure TTBCustomDockableWindow.DefineProperties(Filer: TFiler); +begin + inherited; + Filer.DefineProperty('SavedAtRunTime', ReadSavedAtRunTime, + WriteSavedAtRunTime, not(csDesigning in ComponentState)); +end; + +procedure TTBCustomDockableWindow.Loaded; +var + R: TRect; +begin + inherited; + { Adjust coordinates if it was initially floating } + if not FSavedAtRunTime and not(csDesigning in ComponentState) and + (Parent is TTBFloatingWindowParent) then begin + R := BoundsRect; + MapWindowPoints(TBValidToolWindowParentForm(Self).Handle, 0, R, 2); + BoundsRect := R; + MoveOnScreen(False); + end; + InitializeOrdering; + { Arranging is disabled while component was loading, so arrange now } + Arrange; +end; + +procedure TTBCustomDockableWindow.BeginUpdate; +begin + Inc(FDisableArrange); +end; + +procedure TTBCustomDockableWindow.EndUpdate; +begin + Dec(FDisableArrange); + if FArrangeNeeded and (FDisableArrange = 0) then + Arrange; +end; + +procedure TTBCustomDockableWindow.AddDockForm(const Form: TTBCustomForm); +begin + if Form = nil then Exit; + if AddToList(FDockForms, Form) then + Form.FreeNotification(Self); +end; + +procedure TTBCustomDockableWindow.RemoveDockForm(const Form: TTBCustomForm); +begin + RemoveFromList(FDockForms, Form); +end; + +function TTBCustomDockableWindow.IsAutoResized: Boolean; +begin + Result := AutoResize or Assigned(CurrentDock) or Floating; +end; + +procedure TTBCustomDockableWindow.ChangeSize(AWidth, AHeight: Integer); +var + S: TPoint; +begin + if Docked then + CurrentDock.ArrangeToolbars + else begin + S := CalcNCSizes; + Inc(AWidth, S.X); + Inc(AHeight, S.Y); + { Leave the width and/or height alone if the control is Anchored + (or Aligned) } + if not Floating then begin + if (akLeft in Anchors) and (akRight in Anchors) then + AWidth := Width; + if (akTop in Anchors) and (akBottom in Anchors) then + AHeight := Height; + end; + Inc(FUpdatingBounds); + try + SetBounds(Left, Top, AWidth, AHeight); + finally + Dec(FUpdatingBounds); + end; + end; +end; + +procedure TTBCustomDockableWindow.Arrange; +var + Size: TPoint; +begin + if (FDisableArrange > 0) or + { Prevent flicker while loading } + (csLoading in ComponentState) or + { Don't call DoArrangeControls when Parent is nil. The VCL sets Parent to + 'nil' during destruction of a component; we can't have an OrderControls + call after a descendant control has freed its data. } + (Parent = nil) then begin + FArrangeNeeded := True; + Exit; + end; + + FArrangeNeeded := False; + + Size := DoArrange(True, TBGetDockTypeOf(CurrentDock, Floating), Floating, + CurrentDock); + if IsAutoResized then + ChangeSize(Size.X, Size.Y); +end; + +procedure TTBCustomDockableWindow.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); +begin + if not(csDesigning in ComponentState) and Floating then begin + { Force Top & Left to 0 if floating } + ALeft := 0; + ATop := 0; + if Parent is TTBFloatingWindowParent then + with Parent do + SetBounds(Left, Top, (Width-ClientWidth) + AWidth, + (Height-ClientHeight) + AHeight); + end; + if (FUpdatingBounds = 0) and ((AWidth <> Width) or (AHeight <> Height)) then + SizeChanging(AWidth, AHeight); + { This allows you to drag the toolbar around the dock at design time } + if (csDesigning in ComponentState) and not(csLoading in ComponentState) and + Docked and (FUpdatingBounds = 0) and ((ALeft <> Left) or (ATop <> Top)) then begin + if not(CurrentDock.Position in PositionLeftOrRight) then begin + FDockRow := CurrentDock.GetDesignModeRowOf(ATop+(Height div 2)); + FDockPos := ALeft; + end + else begin + FDockRow := CurrentDock.GetDesignModeRowOf(ALeft+(Width div 2)); + FDockPos := ATop; + end; + inherited SetBounds(Left, Top, AWidth, AHeight); { only pass any size changes } + CurrentDock.ArrangeToolbars; { let ArrangeToolbars take care of position changes } + end + else begin + inherited; + {if not(csLoading in ComponentState) and Floating and (FUpdatingBounds = 0) then + FFloatingPosition := BoundsRect.TopLeft;} + end; +end; + +procedure TTBCustomDockableWindow.SetParent(AParent: TWinControl); + procedure UpdateFloatingToolWindows; + begin + if Parent is TTBFloatingWindowParent then begin + AddToList(FloatingToolWindows, Self); + Parent.SetBounds(FFloatingPosition.X, FFloatingPosition.Y, + Parent.Width, Parent.Height); + end + else + RemoveFromList(FloatingToolWindows, Self); + end; + function ParentToCurrentDock(const Ctl: TWinControl): TTBDock; + begin + if Ctl is TTBDock then + Result := TTBDock(Ctl) + else + Result := nil; + end; +var + OldCurrentDock, NewCurrentDock: TTBDock; + NewFloating: Boolean; + SaveHandle: HWND; +begin + OldCurrentDock := ParentToCurrentDock(Parent); + NewCurrentDock := ParentToCurrentDock(AParent); + NewFloating := AParent is TTBFloatingWindowParent; + + if AParent = Parent then begin + { Even though AParent is the same as the current Parent, this code is + necessary because when the VCL destroys the parent of the tool window, + it calls TWinControl.Remove to set FParent instead of using SetParent. + However TControl.Destroy does call SetParent(nil), so it is + eventually notified of the change before it is destroyed. } + FCurrentDock := NewCurrentDock; + FFloating := NewFloating; + FDocked := Assigned(FCurrentDock); + UpdateFloatingToolWindows; + end + else begin + if not(csDestroying in ComponentState) and Assigned(AParent) then begin + if Assigned(FOnDockChanging) then + FOnDockChanging(Self, NewFloating, NewCurrentDock); + if Assigned(FOnRecreating) then + FOnRecreating(Self); + end; + + { Before changing between docked and floating state (and vice-versa) + or between docks, increment FHidden and call UpdateVisibility to hide the + toolbar. This prevents any flashing while it's being moved } + Inc(FHidden); + Inc(FDisableOnMove); + try + UpdateVisibility; + if Assigned(OldCurrentDock) then + OldCurrentDock.BeginUpdate; + if Assigned(NewCurrentDock) then + NewCurrentDock.BeginUpdate; + Inc(FUpdatingBounds); + try + if Assigned(AParent) then + DoDockChangingHidden(NewFloating, NewCurrentDock); + BeginUpdate; + try + { FCurrentSize probably won't be valid after changing Parents, so + reset it to zero } + FCurrentSize := 0; + + if Parent is TTBDock then begin + if not FUseLastDock or (FLastDock <> Parent) then + TTBDock(Parent).ChangeDockList(False, Self); + TTBDock(Parent).ToolbarVisibilityChanged(Self, True); + end; + + { By default, the VCL destroys a control's window handle when it + changes parents. Prevent that from happening by capturing the + current handle, detaching the control from its current parent, + then restoring the handle back. } + SaveHandle := 0; + if Assigned(AParent) then begin + SaveHandle := WindowHandle; + WindowHandle := 0; + end; + inherited SetParent(nil); + FCurrentDock := NewCurrentDock; + FFloating := NewFloating; + FDocked := Assigned(FCurrentDock); + try + if SaveHandle <> 0 then begin + WindowHandle := SaveHandle; + Windows.SetParent(SaveHandle, AParent.Handle); + SetWindowPos(SaveHandle, 0, 0, 0, 0, 0, SWP_FRAMECHANGED or + SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER); + end; + inherited; + except + { Failure is rare, but just in case, restore these back. } + FCurrentDock := ParentToCurrentDock(Parent); + FFloating := Parent is TTBFloatingWindowParent; + FDocked := Assigned(FCurrentDock); + raise; + end; + + { FEffectiveDockRow probably won't be valid on the new Parent, so + reset it to -1 so that GetMinRowSize will temporarily ignore this + toolbar } + FEffectiveDockRow := -1; + + { To conserve resources, free FFloatParent if it's no longer the + Parent. But don't do this while FSmoothDragging=True, because + destroying the window the user initially clicked down on causes + Windows to stop delivering mouse-move messages when the cursor is + moved over other applications' windows, even if we still have the + mouse capture. } + if not FSmoothDragging and + Assigned(FFloatParent) and (Parent <> FFloatParent) then + FreeAndNil(FFloatParent); + + if Parent is TTBDock then begin + if FUseLastDock and not FSmoothDragging then begin + LastDock := TTBDock(Parent); { calls ChangeDockList if LastDock changes } + TTBDock(Parent).ToolbarVisibilityChanged(Self, False); + end + else + TTBDock(Parent).ChangeDockList(True, Self); + end; + + UpdateFloatingToolWindows; + + { Schedule an arrange } + Arrange; + finally + EndUpdate; + end; + finally + Dec(FUpdatingBounds); + if Assigned(NewCurrentDock) then + NewCurrentDock.EndUpdate; + if Assigned(OldCurrentDock) then + OldCurrentDock.EndUpdate; + end; + finally + Dec(FDisableOnMove); + Dec(FHidden); + UpdateVisibility; + { ^ The above UpdateVisibility call not only updates the tool window's + visibility after decrementing FHidden, it also sets the + active/inactive state of the caption. } + end; + if Assigned(Parent) then + Moved; + + if not(csDestroying in ComponentState) and Assigned(AParent) then begin + if Assigned(FOnRecreated) then + FOnRecreated(Self); + if Assigned(FOnDockChanged) then + FOnDockChanged(Self); + end; + end; +end; + +procedure TTBCustomDockableWindow.AddDockedNCAreaToSize(var S: TPoint; + const LeftRight: Boolean); +var + TopLeft, BottomRight: TPoint; +begin + GetDockedNCArea(TopLeft, BottomRight, LeftRight); + Inc(S.X, TopLeft.X + BottomRight.X); + Inc(S.Y, TopLeft.Y + BottomRight.Y); +end; + +procedure TTBCustomDockableWindow.AddFloatingNCAreaToSize(var S: TPoint); +var + TopLeft, BottomRight: TPoint; +begin + GetFloatingNCArea(TopLeft, BottomRight); + Inc(S.X, TopLeft.X + BottomRight.X); + Inc(S.Y, TopLeft.Y + BottomRight.Y); +end; + +procedure TTBCustomDockableWindow.GetDockedNCArea(var TopLeft, BottomRight: TPoint; + const LeftRight: Boolean); +var + Z: Integer; +begin + Z := DockedBorderSize; { code optimization... } + TopLeft.X := Z; + TopLeft.Y := Z; + BottomRight.X := Z; + BottomRight.Y := Z; + if not LeftRight then begin + Inc(TopLeft.X, DragHandleSizes[CloseButtonWhenDocked, DragHandleStyle]); + //if FShowChevron then + // Inc(BottomRight.X, tbChevronSize); + end + else begin + Inc(TopLeft.Y, DragHandleSizes[CloseButtonWhenDocked, DragHandleStyle]); + //if FShowChevron then + // Inc(BottomRight.Y, tbChevronSize); + end; +end; + +function TTBCustomDockableWindow.GetFloatingBorderSize: TPoint; +{ Returns size of a thick border. Note that, depending on the Windows version, + this may not be the same as the actual window metrics since it draws its + own border } +const + XMetrics: array[Boolean] of Integer = (SM_CXDLGFRAME, SM_CXFRAME); + YMetrics: array[Boolean] of Integer = (SM_CYDLGFRAME, SM_CYFRAME); +begin + Result.X := GetSystemMetrics(XMetrics[Resizable]); + Result.Y := GetSystemMetrics(YMetrics[Resizable]); +end; + +procedure TTBCustomDockableWindow.GetFloatingNCArea(var TopLeft, BottomRight: TPoint); +begin + with GetFloatingBorderSize do begin + TopLeft.X := X; + TopLeft.Y := Y; + if ShowCaption then + Inc(TopLeft.Y, GetSmallCaptionHeight); + BottomRight.X := X; + BottomRight.Y := Y; + end; +end; + +function TTBCustomDockableWindow.GetDockedCloseButtonRect(LeftRight: Boolean): TRect; +var + X, Y, Z: Integer; +begin + Z := DragHandleSizes[CloseButtonWhenDocked, FDragHandleStyle] - 3; + if not LeftRight then begin + X := DockedBorderSize+1; + Y := DockedBorderSize; + end + else begin + X := (ClientWidth + DockedBorderSize) - Z; + Y := DockedBorderSize+1; + end; + Result := Bounds(X, Y, Z, Z); +end; + +function TTBCustomDockableWindow.CalcNCSizes: TPoint; +var + Z: Integer; +begin + if not Docked then begin + Result.X := 0; + Result.Y := 0; + end + else begin + Result.X := DockedBorderSize2; + Result.Y := DockedBorderSize2; + if CurrentDock.FAllowDrag then begin + Z := DragHandleSizes[FCloseButtonWhenDocked, FDragHandleStyle]; + if not(CurrentDock.Position in PositionLeftOrRight) then + Inc(Result.X, Z) + else + Inc(Result.Y, Z); + end; + end; +end; + +procedure TTBCustomDockableWindow.WMNCCalcSize(var Message: TWMNCCalcSize); + + procedure ApplyToRect(var R: TRect); + var + Z: Integer; + begin + InflateRect(R, -DockedBorderSize, -DockedBorderSize); + if CurrentDock.FAllowDrag then begin + Z := DragHandleSizes[FCloseButtonWhenDocked, FDragHandleStyle]; + if not(CurrentDock.Position in PositionLeftOrRight) then + Inc(R.Left, Z) + else + Inc(R.Top, Z); + end; + end; + +{$IFDEF CLR} +var + Params: TNCCalcSizeParams; +{$ENDIF} +begin + { Doesn't call inherited since it overrides the normal NC sizes } + Message.Result := 0; + if Docked then begin + {$IFNDEF CLR} + ApplyToRect(Message.CalcSize_Params.rgrc[0]); + {$ELSE} + Params := Message.CalcSize_Params; + ApplyToRect(Params.rgrc0); + Message.CalcSize_Params := Params; + {$ENDIF} + end; +end; + +procedure TTBCustomDockableWindow.WMSetCursor(var Message: TWMSetCursor); +var + P: TPoint; + R: TRect; + I: Integer; +begin + if Docked and CurrentDock.FAllowDrag and + (Message.CursorWnd = WindowHandle) and + (Smallint(Message.HitTest) = HT_TB2k_Border) and + (DragHandleStyle <> dhNone) then begin + GetCursorPos(P); + GetWindowRect(Handle, R); + if not(CurrentDock.Position in PositionLeftOrRight) then + I := P.X - R.Left + else + I := P.Y - R.Top; + if I < DockedBorderSize + DragHandleSizes[CloseButtonWhenDocked, DragHandleStyle] then begin + SetCursor(LoadCursor(0, IDC_SIZEALL)); + Message.Result := 1; + Exit; + end; + end; + inherited; +end; + +procedure TTBCustomDockableWindow.DrawNCArea(const DrawToDC: Boolean; + const ADC: HDC; const Clip: HRGN); +{ Redraws all the non-client area of the toolbar when it is docked. } +var + DC: HDC; + R: TRect; + VerticalDock: Boolean; + X, Y, Y2, Y3, YO, S, SaveIndex: Integer; + R2, R3, R4: TRect; + P1, P2: TPoint; + Brush: HBRUSH; + Clr: TColorRef; + UsingBackground, B: Boolean; + + procedure DrawRaisedEdge(R: TRect; const FillInterior: Boolean); + const + FillMiddle: array[Boolean] of UINT = (0, BF_MIDDLE); + begin + DrawEdge(DC, R, BDR_RAISEDINNER, BF_RECT or FillMiddle[FillInterior]); + end; + + function CreateCloseButtonBitmap: HBITMAP; + const + Pattern: array[0..15] of Byte = + (0, 0, $CC, 0, $78, 0, $30, 0, $78, 0, $CC, 0, 0, 0, 0, 0); + begin + Result := CreateMonoBitmap(8, 8, Pattern); + end; + + procedure DrawButtonBitmap(const Bmp: HBITMAP); + var + TempBmp: TBitmap; + begin + TempBmp := TBitmap.Create; + try + TempBmp.Handle := Bmp; + SetTextColor(DC, clBlack); + SetBkColor(DC, clWhite); + SelectObject(DC, GetSysColorBrush(COLOR_BTNTEXT)); + BitBlt(DC, R2.Left, R2.Top, R2.Right - R2.Left, R2.Bottom - R2.Top, + TempBmp.Canvas.Handle, 0, 0, $00E20746 {ROP_DSPDxax}); + finally + TempBmp.Free; + end; + end; + +const + CloseButtonState: array[Boolean] of UINT = (0, DFCS_PUSHED); +begin + if not Docked or not HandleAllocated then Exit; + + if not DrawToDC then + DC := GetWindowDC(Handle) + else + DC := ADC; + try + { Use update region } + if not DrawToDC then + SelectNCUpdateRgn(Handle, DC, Clip); + + { This works around WM_NCPAINT problem described at top of source code } + {no! R := Rect(0, 0, Width, Height);} + GetWindowRect(Handle, R); OffsetRect(R, -R.Left, -R.Top); + + VerticalDock := CurrentDock.Position in PositionLeftOrRight; + + Brush := CreateSolidBrush(ColorToRGB(Color)); + + UsingBackground := CurrentDock.UsingBackground and CurrentDock.FBkgOnToolbars; + + { Border } + if BorderStyle = bsSingle then + DrawRaisedEdge(R, False) + else + FrameRect(DC, R, Brush); + R2 := R; + InflateRect(R2, -1, -1); + if not UsingBackground then + FrameRect(DC, R2, Brush); + + { Draw the Background } + if UsingBackground then begin + R2 := R; + P1 := CurrentDock.ClientToScreen(Point(0, 0)); + P2 := CurrentDock.Parent.ClientToScreen(CurrentDock.BoundsRect.TopLeft); + Dec(R2.Left, Left + CurrentDock.Left + (P1.X-P2.X)); + Dec(R2.Top, Top + CurrentDock.Top + (P1.Y-P2.Y)); + InflateRect(R, -1, -1); + GetWindowRect(Handle, R4); + R3 := ClientRect; + with ClientToScreen(Point(0, 0)) do + OffsetRect(R3, X-R4.Left, Y-R4.Top); + SaveIndex := SaveDC(DC); + IntersectClipRect(DC, R.Left, R.Top, R.Right, R.Bottom); + ExcludeClipRect(DC, R3.Left, R3.Top, R3.Right, R3.Bottom); + CurrentDock.DrawBackground(DC, R2); + RestoreDC(DC, SaveIndex); + end; + + { The drag handle at the left, or top } + if CurrentDock.FAllowDrag then begin + SaveIndex := SaveDC(DC); + if not VerticalDock then + Y2 := ClientHeight + else + Y2 := ClientWidth; + Inc(Y2, DockedBorderSize); + S := DragHandleSizes[FCloseButtonWhenDocked, FDragHandleStyle]; + if FDragHandleStyle <> dhNone then begin + Y3 := Y2; + X := DockedBorderSize + DragHandleXOffsets[FCloseButtonWhenDocked, FDragHandleStyle]; + Y := DockedBorderSize; + YO := Ord(FDragHandleStyle = dhSingle); + if FCloseButtonWhenDocked then begin + if not VerticalDock then + Inc(Y, S - 2) + else + Dec(Y3, S - 2); + end; + Clr := GetSysColor(COLOR_BTNHIGHLIGHT); + for B := False to (FDragHandleStyle = dhDouble) do begin + if not VerticalDock then + R2 := Rect(X, Y+YO, X+3, Y2-YO) + else + R2 := Rect(Y+YO, X, Y3-YO, X+3); + DrawRaisedEdge(R2, True); + if not VerticalDock then + SetPixelV(DC, X, Y2-1-YO, Clr) + else + SetPixelV(DC, Y3-1-YO, X, Clr); + ExcludeClipRect(DC, R2.Left, R2.Top, R2.Right, R2.Bottom); + Inc(X, 3); + end; + end; + if not UsingBackground then begin + if not VerticalDock then + R2 := Rect(DockedBorderSize, DockedBorderSize, + DockedBorderSize+S, Y2) + else + R2 := Rect(DockedBorderSize, DockedBorderSize, + Y2, DockedBorderSize+S); + FillRect(DC, R2, Brush); + end; + RestoreDC(DC, SaveIndex); + { Close button } + if FCloseButtonWhenDocked then begin + R2 := GetDockedCloseButtonRect(VerticalDock); + if FCloseButtonDown then + DrawEdge(DC, R2, BDR_SUNKENOUTER, BF_RECT) + else if FCloseButtonHover then + DrawRaisedEdge(R2, False); + InflateRect(R2, -2, -2); + if FCloseButtonDown then + OffsetRect(R2, 1, 1); + DrawButtonBitmap(CreateCloseButtonBitmap); + end; + end; + + DeleteObject(Brush); + finally + if not DrawToDC then + ReleaseDC(Handle, DC); + end; +end; + +procedure TTBCustomDockableWindow.RedrawNCArea; +begin + { Note: IsWindowVisible is called as an optimization. There's no need to + draw on invisible windows. } + if HandleAllocated and IsWindowVisible(Handle) then + DrawNCArea(False, 0, 0); +end; + +procedure TTBCustomDockableWindow.WMNCPaint(var Message: TMessage); +begin + { Don't call inherited because it overrides the default NC painting } + DrawNCArea(False, 0, HRGN(Message.WParam)); +end; + +procedure DockableWindowNCPaintProc(Wnd: HWND; DC: HDC; AppData: TObject); +begin + with TTBCustomDockableWindow(AppData) do + DrawNCArea(True, DC, 0) +end; + +procedure TTBCustomDockableWindow.WMPrint(var Message: TMessage); +begin + HandleWMPrint(Handle, Message, DockableWindowNCPaintProc, Self); +end; + +procedure TTBCustomDockableWindow.WMPrintClient(var Message: + {$IFNDEF CLR} TMessage {$ELSE} TWMPrintClient {$ENDIF}); +begin + HandleWMPrintClient(PaintHandler, Message); +end; + +procedure TTBCustomDockableWindow.WMEraseBkgnd(var Message: TWMEraseBkgnd); +var + R, R2, R3: TRect; + P1, P2: TPoint; + SaveIndex: Integer; +begin + if Docked and CurrentDock.UsingBackground and CurrentDock.FBkgOnToolbars then begin + R := ClientRect; + R2 := R; + P1 := CurrentDock.ClientToScreen(Point(0, 0)); + P2 := CurrentDock.Parent.ClientToScreen(CurrentDock.BoundsRect.TopLeft); + Dec(R2.Left, Left + CurrentDock.Left + (P1.X-P2.X)); + Dec(R2.Top, Top + CurrentDock.Top + (P1.Y-P2.Y)); + GetWindowRect(Handle, R3); + with ClientToScreen(Point(0, 0)) do begin + Inc(R2.Left, R3.Left-X); + Inc(R2.Top, R3.Top-Y); + end; + SaveIndex := SaveDC(Message.DC); + IntersectClipRect(Message.DC, R.Left, R.Top, R.Right, R.Bottom); + CurrentDock.DrawBackground(Message.DC, R2); + RestoreDC(Message.DC, SaveIndex); + Message.Result := 1; + end + else + inherited; +end; + +function TTBCustomDockableWindow.GetPalette: HPALETTE; +begin + if Docked then + Result := CurrentDock.GetPalette + else + Result := 0; +end; + +function TTBCustomDockableWindow.PaletteChanged(Foreground: Boolean): Boolean; +begin + Result := inherited PaletteChanged(Foreground); + if Result and not Foreground then begin + { There seems to be a bug in Delphi's palette handling. When the form is + inactive and another window realizes a palette, docked TToolbar97s + weren't getting redrawn. So this workaround code was added. } + InvalidateAll(Self); + end; +end; + +procedure TTBCustomDockableWindow.DrawDraggingOutline(const DC: HDC; + const NewRect, OldRect: TRect; const NewDocking, OldDocking: Boolean); +var + NewSize, OldSize: TSize; +begin + with GetFloatingBorderSize do begin + if NewDocking then NewSize.cx := 1 else NewSize.cx := X; + NewSize.cy := NewSize.cx; + if OldDocking then OldSize.cx := 1 else OldSize.cx := X; + OldSize.cy := OldSize.cx; + end; + DrawHalftoneInvertRect(DC, NewRect, OldRect, NewSize, OldSize); +end; + +procedure TTBCustomDockableWindow.CMColorChanged(var Message: TMessage); +begin + { Make sure non-client area is redrawn } + InvalidateAll(Self); + inherited; { the inherited handler calls Invalidate } +end; + +procedure TTBCustomDockableWindow.CMTextChanged(var Message: TMessage); +begin + inherited; + if Parent is TTBFloatingWindowParent then + TTBFloatingWindowParent(Parent).Caption := Caption; +end; + +procedure TTBCustomDockableWindow.CMVisibleChanged(var Message: TMessage); +begin + if not(csDesigning in ComponentState) and Docked then + CurrentDock.ToolbarVisibilityChanged(Self, False); + inherited; + if Assigned(FOnVisibleChanged) then + FOnVisibleChanged(Self); +end; + +type + TRowSize = record + Size: Integer; + FullSizeRow: Boolean; + end; + TDockedSize = class + Dock: TTBDock; + BoundsRect: TRect; + Size: TPoint; + RowSizes: array of TRowSize; + end; + +procedure TTBCustomDockableWindow.BeginMoving(const InitX, InitY: Integer); +const + SplitCursors: array[Boolean] of {$IFNDEF CLR} PChar {$ELSE} Integer {$ENDIF} = + (IDC_SIZEWE, IDC_SIZENS); +var + UseSmoothDrag: Boolean; + DockList: TList; + NewDockedSizes: TList; + OriginalDock, MouseOverDock: TTBDock; + MoveRect: TRect; + StartDocking, PreventDocking, PreventFloating, WatchForSplit, SplitVertical: Boolean; + ScreenDC: HDC; + OldCursor: HCURSOR; + NPoint, DPoint: TPoint; + OriginalDockRow, OriginalDockPos: Integer; + FirstPos, LastPos, CurPos: TPoint; + + function FindDockedSize(const ADock: TTBDock): TDockedSize; + var + I: Integer; + begin + for I := 0 to NewDockedSizes.Count-1 do begin + Result := TDockedSize(NewDockedSizes[I]); + if Result.Dock = ADock then + Exit; + end; + Result := nil; + end; + + function GetRowOf(const RowSizes: array of TRowSize; const XY: Integer; + var Before: Boolean): Integer; + { Returns row number of the specified coordinate. Before is set to True if it + was in the top (or left) quarter of the row. } + var + HighestRow, R, CurY, NextY, CurRowSize, EdgeSize: Integer; + FullSizeRow: Boolean; + begin + Before := False; + HighestRow := High(RowSizes); + CurY := 0; + for R := 0 to HighestRow do begin + CurRowSize := RowSizes[R].Size; + FullSizeRow := FullSize or RowSizes[R].FullSizeRow; + if CurRowSize = 0 then + Continue; + NextY := CurY + CurRowSize; + if not FullSizeRow then + EdgeSize := CurRowSize div 4 + else + EdgeSize := CurRowSize div 2; + if XY < CurY + EdgeSize then begin + Result := R; + Before := True; + Exit; + end; + if not FullSizeRow and (XY < NextY - EdgeSize) then begin + Result := R; + Exit; + end; + CurY := NextY; + end; + Result := HighestRow+1; + end; + + procedure Dropped; + var + NewDockRow: Integer; + Before: Boolean; + MoveRectClient: TRect; + C: Integer; + DockedSize: TDockedSize; + begin + if MouseOverDock <> nil then begin + DockedSize := FindDockedSize(MouseOverDock); + MoveRectClient := MoveRect; + OffsetRect(MoveRectClient, -DockedSize.BoundsRect.Left, + -DockedSize.BoundsRect.Top); + if not FDragSplitting then begin + if not(MouseOverDock.Position in PositionLeftOrRight) then + C := (MoveRectClient.Top+MoveRectClient.Bottom) div 2 + else + C := (MoveRectClient.Left+MoveRectClient.Right) div 2; + NewDockRow := GetRowOf(DockedSize.RowSizes, C, Before); + if Before then + WatchForSplit := False; + end + else begin + NewDockRow := FDockRow; + Before := False; + end; + if WatchForSplit then begin + if (MouseOverDock <> OriginalDock) or (NewDockRow <> OriginalDockRow) then + WatchForSplit := False + else begin + if not SplitVertical then + C := FirstPos.X - LastPos.X + else + C := FirstPos.Y - LastPos.Y; + if Abs(C) >= 10 then begin + WatchForSplit := False; + FDragSplitting := True; + SetCursor(LoadCursor(0, SplitCursors[SplitVertical])); + end; + end; + end; + FDockRow := NewDockRow; + if not(MouseOverDock.Position in PositionLeftOrRight) then + FDockPos := MoveRectClient.Left + else + FDockPos := MoveRectClient.Top; + Parent := MouseOverDock; + if not FSmoothDragging then + CurrentDock.CommitNewPositions := True; + FInsertRowBefore := Before; + try + CurrentDock.ArrangeToolbars; + finally + FInsertRowBefore := False; + end; + end + else begin + WatchForSplit := False; + FloatingPosition := MoveRect.TopLeft; + Floating := True; + { Make sure it doesn't go completely off the screen } + MoveOnScreen(True); + end; + + { Make sure it's repainted immediately (looks better on really slow + computers when smooth dragging is enabled) } + Update; + end; + + procedure MouseMoved; + var + OldMouseOverDock: TTBDock; + OldMoveRect: TRect; + Pos: TPoint; + + function GetDockRect(Control: TTBDock): TRect; + var + I: Integer; + begin + for I := 0 to NewDockedSizes.Count-1 do + with TDockedSize(NewDockedSizes[I]) do begin + if Dock <> Control then Continue; + Result := Bounds(Pos.X-MulDiv(Size.X-1, NPoint.X, DPoint.X), + Pos.Y-MulDiv(Size.Y-1, NPoint.Y, DPoint.Y), + Size.X, Size.Y); + Exit; + end; + SetRectEmpty(Result); + end; + + function CheckIfCanDockTo(Control: TTBDock; R: TRect): Boolean; + const + DockSensX = 25; + DockSensY = 25; + var + S, Temp: TRect; + Sens: Integer; + begin + with Control do begin + Result := False; + + InflateRect(R, 3, 3); + S := GetDockRect(Control); + + { Like Office, distribute ~25 pixels of extra dock detection area + to the left side if the toolbar was grabbed at the left, both sides + if the toolbar was grabbed at the middle, or the right side if + toolbar was grabbed at the right. If outside, don't try to dock. } + Sens := MulDiv(DockSensX, NPoint.X, DPoint.X); + if (Pos.X < R.Left-(DockSensX-Sens)) or (Pos.X >= R.Right+Sens) then + Exit; + + { Don't try to dock to the left or right if pointer is above or below + the boundaries of the dock } + if (Control.Position in PositionLeftOrRight) and + ((Pos.Y < R.Top) or (Pos.Y >= R.Bottom)) then + Exit; + + { And also distribute ~25 pixels of extra dock detection area to + the top or bottom side } + Sens := MulDiv(DockSensY, NPoint.Y, DPoint.Y); + if (Pos.Y < R.Top-(DockSensY-Sens)) or (Pos.Y >= R.Bottom+Sens) then + Exit; + + Result := IntersectRect(Temp, R, S); + end; + end; + + var + R, R2: TRect; + I: Integer; + Dock: TTBDock; + Accept: Boolean; + TL, BR: TPoint; + begin + OldMouseOverDock := MouseOverDock; + OldMoveRect := MoveRect; + + GetCursorPos(Pos); + + if FDragSplitting then + MouseOverDock := CurrentDock + else begin + { Check if it can dock } + MouseOverDock := nil; + if StartDocking and not PreventDocking then + for I := 0 to DockList.Count-1 do begin + Dock := TTBDock(DockList[I]); + if CheckIfCanDockTo(Dock, FindDockedSize(Dock).BoundsRect) then begin + MouseOverDock := Dock; + Accept := True; + if Assigned(MouseOverDock.FOnRequestDock) then + MouseOverDock.FOnRequestDock(MouseOverDock, Self, Accept); + if Accept then + Break + else + MouseOverDock := nil; + end; + end; + end; + + { If not docking, clip the point so it doesn't get dragged under the + taskbar } + if MouseOverDock = nil then begin + R := GetRectOfMonitorContainingPoint(Pos, True); + if Pos.X < R.Left then Pos.X := R.Left; + if Pos.X > R.Right then Pos.X := R.Right; + if Pos.Y < R.Top then Pos.Y := R.Top; + if Pos.Y > R.Bottom then Pos.Y := R.Bottom; + end; + + MoveRect := GetDockRect(MouseOverDock); + + { Make sure title bar (or at least part of the toolbar) is still accessible + if it's dragged almost completely off the screen. This prevents the + problem seen in Office 97 where you drag it offscreen so that only the + border is visible, sometimes leaving you no way to move it back short of + resetting the toolbar. } + if MouseOverDock = nil then begin + R2 := GetRectOfMonitorContainingPoint(Pos, True); + R := R2; + with GetFloatingBorderSize do + InflateRect(R, -(X+4), -(Y+4)); + if MoveRect.Bottom < R.Top then + OffsetRect(MoveRect, 0, R.Top-MoveRect.Bottom); + if MoveRect.Top > R.Bottom then + OffsetRect(MoveRect, 0, R.Bottom-MoveRect.Top); + if MoveRect.Right < R.Left then + OffsetRect(MoveRect, R.Left-MoveRect.Right, 0); + if MoveRect.Left > R.Right then + OffsetRect(MoveRect, R.Right-MoveRect.Left, 0); + + GetFloatingNCArea(TL, BR); + I := R2.Top + 4 - TL.Y; + if MoveRect.Top < I then + OffsetRect(MoveRect, 0, I-MoveRect.Top); + end; + + { Empty MoveRect if it's wanting to float but it's not allowed to, and + set the mouse cursor accordingly. } + if PreventFloating and not Assigned(MouseOverDock) then begin + SetRectEmpty(MoveRect); + SetCursor(LoadCursor(0, IDC_NO)); + end + else begin + if FDragSplitting then + SetCursor(LoadCursor(0, SplitCursors[SplitVertical])) + else + SetCursor(OldCursor); + end; + + { Update the dragging outline } + if not UseSmoothDrag then + DrawDraggingOutline(ScreenDC, MoveRect, OldMoveRect, MouseOverDock <> nil, + OldMouseOverDock <> nil) + else + if not IsRectEmpty(MoveRect) then + Dropped; + end; + + procedure BuildDockList; + + function AcceptableDock(const D: TTBDock): Boolean; + begin + Result := D.FAllowDrag and (D.Position in DockableTo); + end; + + procedure Recurse(const ParentCtl: TWinControl); + var + D: TTBDockPosition; + I: Integer; + begin + if ContainsControl(ParentCtl) or not ParentCtl.HandleAllocated or + not IsWindowVisible(ParentCtl.Handle) then + Exit; + with ParentCtl do begin + for D := Low(D) to High(D) do + for I := 0 to ParentCtl.ControlCount-1 do + if (Controls[I] is TTBDock) and (TTBDock(Controls[I]).Position = D) then + Recurse(TWinControl(Controls[I])); + for I := 0 to ParentCtl.ControlCount-1 do + if (Controls[I] is TWinControl) and not(Controls[I] is TTBDock) then + Recurse(TWinControl(Controls[I])); + end; + if (ParentCtl is TTBDock) and AcceptableDock(TTBDock(ParentCtl)) and + (DockList.IndexOf(ParentCtl) = -1) then + DockList.Add(ParentCtl); + end; + + var + ParentForm: TTBCustomForm; + DockFormsList: TList; + I, J: Integer; + begin + { Manually add CurrentDock to the DockList first so that it gets priority + over other docks } + if Assigned(CurrentDock) and AcceptableDock(CurrentDock) then + DockList.Add(CurrentDock); + ParentForm := TBGetToolWindowParentForm(Self); + DockFormsList := TList.Create; + try + if Assigned(FDockForms) then begin + for I := 0 to Screen.{$IFDEF JR_D3}CustomFormCount{$ELSE}FormCount{$ENDIF}-1 do begin + J := FDockForms.IndexOf(Screen.{$IFDEF JR_D3}CustomForms{$ELSE}Forms{$ENDIF}[I]); + if (J <> -1) and (FDockForms[J] <> ParentForm) then + DockFormsList.Add(FDockForms[J]); + end; + end; + if Assigned(ParentForm) then + DockFormsList.Insert(0, ParentForm); + for I := 0 to DockFormsList.Count-1 do + Recurse(TWinControl(DockFormsList[I])); + finally + DockFormsList.Free; + end; + end; + +var + Accept: Boolean; + R: TRect; + Msg: TMsg; + NewDockedSize: TDockedSize; + I, J: Integer; +begin + Accept := False; + SplitVertical := False; + WatchForSplit := False; + OriginalDock := CurrentDock; + OriginalDockRow := FDockRow; + OriginalDockPos := FDockPos; + try + FDragMode := True; + FDragSplitting := False; + if Docked then begin + FDragCanSplit := False; + CurrentDock.CommitNewPositions := True; + CurrentDock.ArrangeToolbars; { needed for WatchForSplit assignment below } + SplitVertical := CurrentDock.Position in PositionLeftOrRight; + WatchForSplit := FDragCanSplit; + end; + DockList := nil; + NewDockedSizes := nil; + try + UseSmoothDrag := FSmoothDrag; + FSmoothDragging := UseSmoothDrag; + + NPoint := Point(InitX, InitY); + { Adjust for non-client area } + if not(Parent is TTBFloatingWindowParent) then begin + GetWindowRect(Handle, R); + R.BottomRight := ClientToScreen(Point(0, 0)); + DPoint := Point(Width-1, Height-1); + end + else begin + GetWindowRect(Parent.Handle, R); + R.BottomRight := Parent.ClientToScreen(Point(0, 0)); + DPoint := Point(Parent.Width-1, Parent.Height-1); + end; + Dec(NPoint.X, R.Left-R.Right); + Dec(NPoint.Y, R.Top-R.Bottom); + + PreventDocking := GetKeyState(VK_CONTROL) < 0; + PreventFloating := DockMode <> dmCanFloat; + + { Build list of all TTBDock's on the form } + DockList := TList.Create; + if DockMode <> dmCannotFloatOrChangeDocks then + BuildDockList + else + if Docked then + DockList.Add(CurrentDock); + + { Ensure positions of each possible dock are committed } + for I := 0 to DockList.Count-1 do + TTBDock(DockList[I]).CommitPositions; + + { Set up potential sizes for each dock type } + NewDockedSizes := TList.Create; + for I := -1 to DockList.Count-1 do begin + NewDockedSizes.Expand; + NewDockedSize := TDockedSize.Create; + try + with NewDockedSize do begin + if I = -1 then begin + { -1 adds the floating size } + Dock := nil; + SetRectEmpty(BoundsRect); + Size := DoArrange(False, TBGetDockTypeOf(CurrentDock, Floating), True, nil); + AddFloatingNCAreaToSize(Size); + end + else begin + Dock := TTBDock(DockList[I]); + BoundsRect := Dock.ClientRect; + MapWindowPoints(Dock.Handle, 0, BoundsRect, 2); + if Dock <> CurrentDock then begin + Size := DoArrange(False, TBGetDockTypeOf(CurrentDock, Floating), False, Dock); + AddDockedNCAreaToSize(Size, Dock.Position in PositionLeftOrRight); + end + else + Size := Point(Width, Height); + end; + end; + if Assigned(NewDockedSize.Dock) then begin + SetLength(NewDockedSize.RowSizes, NewDockedSize.Dock.GetHighestRow(True) + 1); + for J := 0 to High(NewDockedSize.RowSizes) do begin + NewDockedSize.RowSizes[J].Size := NewDockedSize.Dock.GetCurrentRowSize(J, + NewDockedSize.RowSizes[J].FullSizeRow); + end; + end; + except + NewDockedSize.Free; + raise; + end; + NewDockedSizes.Add(NewDockedSize); + end; + + { Before locking, make sure all pending paint messages are processed } + ProcessPaintMessages; + + { Save the original mouse cursor } + OldCursor := GetCursor; + + SetRectEmpty(MoveRect); + if not UseSmoothDrag then begin + { This uses LockWindowUpdate to suppress all window updating so the + dragging outlines doesn't sometimes get garbled. (This is safe, and in + fact, is the main purpose of the LockWindowUpdate function) + IMPORTANT! While debugging you might want to enable the 'TB2Dock_DisableLock' + conditional define (see top of the source code). } + {$IFNDEF TB2Dock_DisableLock} + LockWindowUpdate(GetDesktopWindow); + {$ENDIF} + { Get a DC of the entire screen. Works around the window update lock + by specifying DCX_LOCKWINDOWUPDATE. } + ScreenDC := GetDCEx(GetDesktopWindow, 0, + DCX_LOCKWINDOWUPDATE or DCX_CACHE or DCX_WINDOW); + end + else + ScreenDC := 0; + try + SetCapture(Handle); + + { Initialize } + StartDocking := Docked; + MouseOverDock := nil; + GetCursorPos(FirstPos); + LastPos := FirstPos; + MouseMoved; + StartDocking := True; + + { Stay in message loop until capture is lost. Capture is removed either + by this procedure manually doing it, or by an outside influence (like + a message box or menu popping up) } + while GetCapture = Handle do begin + case Integer(GetMessage(Msg, 0, 0, 0)) of + -1: Break; { if GetMessage failed } + 0: begin + { Repost WM_QUIT messages } + PostQuitMessage(ClipToLongint(Msg.wParam)); + Break; + end; + end; + + case Msg.Message of + WM_KEYDOWN, WM_KEYUP: + { Ignore all keystrokes while dragging. But process Ctrl and Escape } + case Word(Msg.wParam) of + VK_CONTROL: + if PreventDocking <> (Msg.Message = WM_KEYDOWN) then begin + PreventDocking := Msg.Message = WM_KEYDOWN; + MouseMoved; + end; + VK_ESCAPE: + Break; + end; + WM_MOUSEMOVE: begin + { Note to self: WM_MOUSEMOVE messages should never be dispatched + here to ensure no hints get shown during the drag process } + CurPos := GetMessagePosAsPoint; + if (LastPos.X <> CurPos.X) or (LastPos.Y <> CurPos.Y) then begin + MouseMoved; + LastPos := CurPos; + end; + end; + WM_LBUTTONDOWN, WM_LBUTTONDBLCLK: + { Make sure it doesn't begin another loop } + Break; + WM_LBUTTONUP: begin + Accept := True; + Break; + end; + WM_RBUTTONDOWN..WM_MBUTTONDBLCLK: + { Ignore all other mouse up/down messages } + ; + else + TranslateMessage(Msg); + DispatchMessage(Msg); + end; + end; + finally + { Since it sometimes breaks out of the loop without capture being + released } + if GetCapture = Handle then + ReleaseCapture; + + if not UseSmoothDrag then begin + { Hide dragging outline. Since NT will release a window update lock if + another thread comes to the foreground, it has to release the DC + and get a new one for erasing the dragging outline. Otherwise, + the DrawDraggingOutline appears to have no effect when this happens. } + ReleaseDC(GetDesktopWindow, ScreenDC); + ScreenDC := GetDCEx(GetDesktopWindow, 0, + DCX_LOCKWINDOWUPDATE or DCX_CACHE or DCX_WINDOW); + SetRectEmpty(R); + DrawDraggingOutline(ScreenDC, R, MoveRect, True, MouseOverDock <> nil); + ReleaseDC(GetDesktopWindow, ScreenDC); + + { Release window update lock } + {$IFNDEF TB2Dock_DisableLock} + LockWindowUpdate(0); + {$ENDIF} + end; + end; + + { Move to new position only if MoveRect isn't empty } + FSmoothDragging := False; + if Accept and not IsRectEmpty(MoveRect) then + { Note: Dropped must be called again after FSmoothDragging is reset to + False so that TTBDock.ArrangeToolbars makes the DockPos changes + permanent } + Dropped; + + { LastDock isn't automatically updated while FSmoothDragging=True, so + update it now that it's back to False } + if FUseLastDock and Assigned(CurrentDock) then + LastDock := CurrentDock; + + { To conserve resources, free FFloatParent if it's no longer the Parent. + (SetParent doesn't do this automatically when FSmoothDragging=True.) } + if Assigned(FFloatParent) and (Parent <> FFloatParent) then + FreeAndNil(FFloatParent); + finally + FSmoothDragging := False; + if not Docked then begin + { If we didn't end up docking, restore the original DockRow & DockPos + values } + FDockRow := OriginalDockRow; + FDockPos := OriginalDockPos; + end; + if Assigned(NewDockedSizes) then begin + for I := NewDockedSizes.Count-1 downto 0 do + TDockedSize(NewDockedSizes[I]).Free; + NewDockedSizes.Free; + end; + DockList.Free; + end; + finally + FDragMode := False; + FDragSplitting := False; + end; +end; + +function TTBCustomDockableWindow.ChildControlTransparent(Ctl: TControl): Boolean; +begin + Result := False; +end; + +procedure TTBCustomDockableWindow.ControlExistsAtPos(const P: TPoint; + var ControlExists: Boolean); +var + I: Integer; +begin + for I := 0 to ControlCount-1 do + if not ChildControlTransparent(Controls[I]) and Controls[I].Visible and + PtInRect(Controls[I].BoundsRect, P) then begin + ControlExists := True; + Break; + end; +end; + +procedure TTBCustomDockableWindow.DoubleClick; +begin + if Docked then begin + if DockMode = dmCanFloat then begin + Floating := True; + MoveOnScreen(True); + end; + end + else + if Assigned(LastDock) then + Parent := LastDock + else + if Assigned(DefaultDock) then begin + FDockRow := ForceDockAtTopRow; + FDockPos := ForceDockAtLeftPos; + Parent := DefaultDock; + end; +end; + +function TTBCustomDockableWindow.IsMovable: Boolean; +begin + Result := (Docked and CurrentDock.FAllowDrag) or Floating; +end; + +procedure TTBCustomDockableWindow.MouseDown(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +var + P: TPoint; + CtlExists: Boolean; +begin + inherited; + if (Button <> mbLeft) or not IsMovable then + Exit; + { Ignore message if user clicked on a child control } + P := Point(X, Y); + if PtInRect(ClientRect, P) then begin + CtlExists := False; + ControlExistsAtPos(P, CtlExists); + if CtlExists then + Exit; + end; + + if not(ssDouble in Shift) then begin + BeginMoving(X, Y); + MouseUp(mbLeft, [], -1, -1); + end + else + { Handle double click } + DoubleClick; +end; + +procedure TTBCustomDockableWindow.WMNCHitTest(var Message: TWMNCHitTest); +var + P: TPoint; + R: TRect; +begin + inherited; + if Docked then + with Message do begin + P := SmallPointToPoint(Pos); + GetWindowRect(Handle, R); + Dec(P.X, R.Left); Dec(P.Y, R.Top); + if Result <> HTCLIENT then begin + Result := HTNOWHERE; + if FCloseButtonWhenDocked and CurrentDock.FAllowDrag and + PtInRect(GetDockedCloseButtonRect( + TBGetDockTypeOf(CurrentDock, Floating) = dtLeftRight), P) then + Result := HT_TB2k_Close + else + Result := HT_TB2k_Border; + end; + end; +end; + +procedure TTBCustomDockableWindow.WMNCMouseMove(var Message: TWMNCMouseMove); +var + InArea: Boolean; +begin + inherited; + { Note: TME_NONCLIENT was introduced in Windows 98 and 2000 } + if (Win32MajorVersion >= 5) or + (Win32MajorVersion = 4) and (Win32MinorVersion >= 10) then + CallTrackMouseEvent(Handle, TME_LEAVE or $10 {TME_NONCLIENT}); + InArea := (ClipToLongint(Message.HitTest) = HT_TB2k_Close); + if FCloseButtonHover <> InArea then begin + FCloseButtonHover := InArea; + RedrawNCArea; + end; +end; + +procedure TTBCustomDockableWindow.WMNCMouseLeave(var Message: TMessage); +begin + if not MouseCapture then + CancelNCHover; + inherited; +end; + +procedure TTBCustomDockableWindow.CMMouseLeave(var Message: TMessage); +begin + inherited; + { On Windows versions that can't send a WM_NCMOUSELEAVE message, trap + CM_MOUSELEAVE to detect when the mouse moves from the non-client area to + another control. } + CancelNCHover; +end; + +procedure TTBCustomDockableWindow.WMMouseMove(var Message: TWMMouseMove); +begin + { On Windows versions that can't send a WM_NCMOUSELEAVE message, trap + WM_MOUSEMOVE to detect when the mouse moves from the non-client area to + the client area. + Note: We are overriding WM_MOUSEMOVE instead of MouseMove so that our + processing always gets done first. } + CancelNCHover; + inherited; +end; + +procedure TTBCustomDockableWindow.CancelNCHover; +begin + if FCloseButtonHover then begin + FCloseButtonHover := False; + RedrawNCArea; + end; +end; + +procedure TTBCustomDockableWindow.Close; +var + Accept: Boolean; +begin + Accept := True; + if Assigned(FOnCloseQuery) then + FOnCloseQuery(Self, Accept); + { Did the CloseQuery event return True? } + if Accept then begin + Hide; + if Assigned(FOnClose) then + FOnClose(Self); + end; +end; + +procedure TTBCustomDockableWindow.SetCloseButtonState(Pushed: Boolean); +begin + if FCloseButtonDown <> Pushed then begin + FCloseButtonDown := Pushed; + RedrawNCArea; + end; +end; + +procedure TTBCustomDockableWindow.WMNCLButtonDown(var Message: TWMNCLButtonDown); +var + R, BR: TRect; + P: TPoint; +begin + case ClipToLongint(Message.HitTest) of + HT_TB2k_Close: begin + GetWindowRect(Handle, R); + BR := GetDockedCloseButtonRect( + TBGetDockTypeOf(CurrentDock, Floating) = dtLeftRight); + OffsetRect(BR, R.Left, R.Top); + if CloseButtonLoop(Handle, BR, SetCloseButtonState) then + Close; + end; + HT_TB2k_Border: begin + P := ScreenToClient(GetMessagePosAsPoint); + if IsMovable then + BeginMoving(P.X, P.Y); + end; + else + inherited; + end; +end; + +procedure TTBCustomDockableWindow.WMNCLButtonDblClk(var Message: TWMNCLButtonDblClk); +begin + if ClipToLongint(Message.HitTest) = HT_TB2k_Border then begin + if IsMovable then + DoubleClick; + end + else + inherited; +end; + +procedure TTBCustomDockableWindow.ShowNCContextMenu(const PosX, PosY: Smallint); + + {$IFNDEF JR_D5} + { Note: this is identical to TControl.CheckMenuPopup (from Delphi 4), + except where noted. + TControl.CheckMenuPopup is unfortunately 'private', so it can't be called + outside of the Controls unit. } + procedure CheckMenuPopup; + var + Control: TControl; + PopupMenu: TPopupMenu; + begin + if csDesigning in ComponentState then Exit; + Control := Self; + while Control <> nil do + begin + { Added TControlAccess cast because GetPopupMenu is 'protected' } + PopupMenu := TControlAccess(Control).GetPopupMenu; + if (PopupMenu <> nil) then + begin + if not PopupMenu.AutoPopup then Exit; + SendCancelMode(nil); + PopupMenu.PopupComponent := Control; + { Changed the following. LPARAM of WM_NCRBUTTONUP is in screen + coordinates, not client coordinates } + {with ClientToScreen(SmallPointToPoint(Pos)) do + PopupMenu.Popup(X, Y);} + PopupMenu.Popup(PosX, PosY); + Exit; + end; + Control := Control.Parent; + end; + end; + {$ENDIF} + +begin + {$IFDEF JR_D5} + { Delphi 5 and later use the WM_CONTEXTMENU message for popup menus } + SendMessage(Handle, WM_CONTEXTMENU, WPARAM(Handle), MAKELPARAM(Word(PosX), Word(PosY))); + {$ELSE} + CheckMenuPopup; + {$ENDIF} +end; + +procedure TTBCustomDockableWindow.WMNCRButtonUp(var Message: TWMNCRButtonUp); +begin + ShowNCContextMenu(Message.XCursor, Message.YCursor); +end; + +{$IFDEF JR_D5} +procedure TTBCustomDockableWindow.WMContextMenu(var Message: TWMContextMenu); +{ Unfortunately TControl.WMContextMenu ignores clicks in the non-client area. + On docked toolbars, we need right clicks on the border, part of the + non-client area, to display the popup menu. The only way I see to have it do + that is to create a new version of WMContextMenu specifically for the + non-client area, and that is what this method is. + Note: This is identical to Delphi 2006's TControl.WMContextMenu, except where + noted. } +var + Pt, Temp: TPoint; + Handled: Boolean; + PopupMenu: TPopupMenu; +begin + { Added 'inherited;' here } + inherited; + if Message.Result <> 0 then Exit; + if csDesigning in ComponentState then + begin + inherited; + Exit; + end; + + Pt := SmallPointToPoint(Message.Pos); + if InvalidPoint(Pt) then + Temp := Pt + else + begin + Temp := ScreenToClient(Pt); + { Changed the following. We're only interested in the non-client area } + {if not PtInRect(ClientRect, Temp) then} + if PtInRect(ClientRect, Temp) then + begin + {inherited;} + Exit; + end; + end; + + Handled := False; + DoContextPopup(Temp, Handled); + Message.Result := Ord(Handled); + if Handled then Exit; + + PopupMenu := GetPopupMenu; + if (PopupMenu <> nil) and PopupMenu.AutoPopup then + begin + SendCancelMode(Self); + PopupMenu.PopupComponent := Self; + if InvalidPoint(Pt) then + Pt := ClientToScreen(Point(0, 0)); + PopupMenu.Popup(Pt.X, Pt.Y); + Message.Result := 1; + end; + + if Message.Result = 0 then + inherited; +end; +{$ENDIF} + +procedure TTBCustomDockableWindow.GetMinShrinkSize(var AMinimumSize: Integer); +begin +end; + +function TTBCustomDockableWindow.GetFloatingWindowParentClass: TTBFloatingWindowParentClass; +begin + Result := TTBFloatingWindowParent; +end; + +procedure TTBCustomDockableWindow.GetMinMaxSize(var AMinClientWidth, + AMinClientHeight, AMaxClientWidth, AMaxClientHeight: Integer); +begin +end; + +function TTBCustomDockableWindow.GetShrinkMode: TTBShrinkMode; +begin + Result := tbsmNone; +end; + +procedure TTBCustomDockableWindow.ResizeBegin; +begin +end; + +procedure TTBCustomDockableWindow.ResizeTrack(var Rect: TRect; const OrigRect: TRect); +begin +end; + +procedure TTBCustomDockableWindow.ResizeTrackAccept; +begin +end; + +procedure TTBCustomDockableWindow.ResizeEnd; +begin +end; + +procedure TTBCustomDockableWindow.BeginSizing(const ASizeHandle: TTBSizeHandle); +var + UseSmoothDrag, DragX, DragY, ReverseX, ReverseY: Boolean; + MinWidth, MinHeight, MaxWidth, MaxHeight: Integer; + DragRect, OrigDragRect: TRect; + ScreenDC: HDC; + OrigPos, OldPos: TPoint; + + procedure DoResize; + begin + BeginUpdate; + try + ResizeTrackAccept; + Parent.BoundsRect := DragRect; + SetBounds(Left, Top, Parent.ClientWidth, Parent.ClientHeight); + finally + EndUpdate; + end; + + { Make sure it doesn't go completely off the screen } + MoveOnScreen(True); + end; + + procedure MouseMoved; + var + Pos: TPoint; + OldDragRect: TRect; + begin + GetCursorPos(Pos); + { It needs to check if the cursor actually moved since last time. This is + because a call to LockWindowUpdate (apparently) generates a mouse move + message even when mouse hasn't moved. } + if (Pos.X = OldPos.X) and (Pos.Y = OldPos.Y) then Exit; + OldPos := Pos; + + OldDragRect := DragRect; + DragRect := OrigDragRect; + if DragX then begin + if not ReverseX then Inc(DragRect.Right, Pos.X-OrigPos.X) + else Inc(DragRect.Left, Pos.X-OrigPos.X); + end; + if DragY then begin + if not ReverseY then Inc(DragRect.Bottom, Pos.Y-OrigPos.Y) + else Inc(DragRect.Top, Pos.Y-OrigPos.Y); + end; + if DragRect.Right-DragRect.Left < MinWidth then begin + if not ReverseX then DragRect.Right := DragRect.Left + MinWidth + else DragRect.Left := DragRect.Right - MinWidth; + end; + if (MaxWidth > 0) and (DragRect.Right-DragRect.Left > MaxWidth) then begin + if not ReverseX then DragRect.Right := DragRect.Left + MaxWidth + else DragRect.Left := DragRect.Right - MaxWidth; + end; + if DragRect.Bottom-DragRect.Top < MinHeight then begin + if not ReverseY then DragRect.Bottom := DragRect.Top + MinHeight + else DragRect.Top := DragRect.Bottom - MinHeight; + end; + if (MaxHeight > 0) and (DragRect.Bottom-DragRect.Top > MaxHeight) then begin + if not ReverseY then DragRect.Bottom := DragRect.Top + MaxHeight + else DragRect.Top := DragRect.Bottom - MaxHeight; + end; + + ResizeTrack(DragRect, OrigDragRect); + if not UseSmoothDrag then + DrawDraggingOutline(ScreenDC, DragRect, OldDragRect, False, False) + else + DoResize; + end; +var + Accept: Boolean; + Msg: TMsg; + R: TRect; +begin + if not Floating then Exit; + + Accept := False; + + UseSmoothDrag := FSmoothDrag; + + MinWidth := 0; + MinHeight := 0; + MaxWidth := 0; + MaxHeight := 0; + GetMinMaxSize(MinWidth, MinHeight, MaxWidth, MaxHeight); + Inc(MinWidth, Parent.Width-Width); + Inc(MinHeight, Parent.Height-Height); + if MaxWidth > 0 then + Inc(MaxWidth, Parent.Width-Width); + if MaxHeight > 0 then + Inc(MaxHeight, Parent.Height-Height); + + DragX := ASizeHandle in [twshLeft, twshRight, twshTopLeft, twshTopRight, + twshBottomLeft, twshBottomRight]; + ReverseX := ASizeHandle in [twshLeft, twshTopLeft, twshBottomLeft]; + DragY := ASizeHandle in [twshTop, twshTopLeft, twshTopRight, twshBottom, + twshBottomLeft, twshBottomRight]; + ReverseY := ASizeHandle in [twshTop, twshTopLeft, twshTopRight]; + + ResizeBegin(ASizeHandle); + try + { Before locking, make sure all pending paint messages are processed } + ProcessPaintMessages; + + if not UseSmoothDrag then begin + { This uses LockWindowUpdate to suppress all window updating so the + dragging outlines doesn't sometimes get garbled. (This is safe, and in + fact, is the main purpose of the LockWindowUpdate function) + IMPORTANT! While debugging you might want to enable the 'TB2Dock_DisableLock' + conditional define (see top of the source code). } + {$IFNDEF TB2Dock_DisableLock} + LockWindowUpdate(GetDesktopWindow); + {$ENDIF} + { Get a DC of the entire screen. Works around the window update lock + by specifying DCX_LOCKWINDOWUPDATE. } + ScreenDC := GetDCEx(GetDesktopWindow, 0, + DCX_LOCKWINDOWUPDATE or DCX_CACHE or DCX_WINDOW); + end + else + ScreenDC := 0; + try + SetCapture(Handle); + if (tbdsResizeClipCursor in FDockableWindowStyles) and + not UsingMultipleMonitors then begin + R := GetRectOfPrimaryMonitor(False); + ClipCursor({$IFNDEF CLR}@{$ENDIF} R); + end; + + { Initialize } + OrigDragRect := Parent.BoundsRect; + DragRect := OrigDragRect; + if not UseSmoothDrag then begin + SetRectEmpty(R); + DrawDraggingOutline(ScreenDC, DragRect, R, False, False); + end; + GetCursorPos(OrigPos); + OldPos := OrigPos; + + { Stay in message loop until capture is lost. Capture is removed either + by this procedure manually doing it, or by an outside influence (like + a message box or menu popping up) } + while GetCapture = Handle do begin + case Integer(GetMessage(Msg, 0, 0, 0)) of + -1: Break; { if GetMessage failed } + 0: begin + { Repost WM_QUIT messages } + PostQuitMessage(ClipToLongint(Msg.wParam)); + Break; + end; + end; + + case Msg.Message of + WM_KEYDOWN, WM_KEYUP: + { Ignore all keystrokes while sizing except for Escape } + if Word(Msg.wParam) = VK_ESCAPE then + Break; + WM_MOUSEMOVE: + { Note to self: WM_MOUSEMOVE messages should never be dispatched + here to ensure no hints get shown during the drag process } + MouseMoved; + WM_LBUTTONDOWN, WM_LBUTTONDBLCLK: + { Make sure it doesn't begin another loop } + Break; + WM_LBUTTONUP: begin + Accept := True; + Break; + end; + WM_RBUTTONDOWN..WM_MBUTTONDBLCLK: + { Ignore all other mouse up/down messages } + ; + else + TranslateMessage(Msg); + DispatchMessage(Msg); + end; + end; + finally + { Since it sometimes breaks out of the loop without capture being + released } + if GetCapture = Handle then + ReleaseCapture; + ClipCursor(nil); + + if not UseSmoothDrag then begin + { Hide dragging outline. Since NT will release a window update lock if + another thread comes to the foreground, it has to release the DC + and get a new one for erasing the dragging outline. Otherwise, + the DrawDraggingOutline appears to have no effect when this happens. } + ReleaseDC(GetDesktopWindow, ScreenDC); + ScreenDC := GetDCEx(GetDesktopWindow, 0, + DCX_LOCKWINDOWUPDATE or DCX_CACHE or DCX_WINDOW); + SetRectEmpty(R); + DrawDraggingOutline(ScreenDC, R, DragRect, False, False); + ReleaseDC(GetDesktopWindow, ScreenDC); + + { Release window update lock } + {$IFNDEF TB2Dock_DisableLock} + LockWindowUpdate(0); + {$ENDIF} + end; + end; + + if not UseSmoothDrag and Accept then + DoResize; + finally + ResizeEnd; + end; +end; + +procedure TTBCustomDockableWindow.DoDockChangingHidden(NewFloating: Boolean; + DockingTo: TTBDock); +begin + if not(csDestroying in ComponentState) and Assigned(FOnDockChangingHidden) then + FOnDockChangingHidden(Self, NewFloating, DockingTo); +end; + +{ TTBCustomDockableWindow - property access methods } + +function TTBCustomDockableWindow.GetNonClientWidth: Integer; +begin + Result := CalcNCSizes.X; +end; + +function TTBCustomDockableWindow.GetNonClientHeight: Integer; +begin + Result := CalcNCSizes.Y; +end; + +function TTBCustomDockableWindow.IsLastDockStored: Boolean; +begin + Result := FCurrentDock = nil; {}{should this be changed to 'Floating'?} +end; + +function TTBCustomDockableWindow.IsWidthAndHeightStored: Boolean; +begin + Result := (CurrentDock = nil) and not Floating; +end; + +procedure TTBCustomDockableWindow.SetCloseButton(Value: Boolean); +begin + if FCloseButton <> Value then begin + FCloseButton := Value; + + { Update the close button's visibility } + if Parent is TTBFloatingWindowParent then + TTBFloatingWindowParent(Parent).RedrawNCArea([twrdCaption, twrdCloseButton]); + end; +end; + +procedure TTBCustomDockableWindow.SetCloseButtonWhenDocked(Value: Boolean); +begin + if FCloseButtonWhenDocked <> Value then begin + FCloseButtonWhenDocked := Value; + if Docked then + RecalcNCArea(Self); + end; +end; + +procedure TTBCustomDockableWindow.SetDefaultDock(Value: TTBDock); +begin + if FDefaultDock <> Value then begin + FDefaultDock := Value; + if Assigned(Value) then + Value.FreeNotification(Self); + end; +end; + +procedure TTBCustomDockableWindow.SetCurrentDock(Value: TTBDock); +begin + if not(csLoading in ComponentState) then begin + if Assigned(Value) then + Parent := Value + else + Parent := TBValidToolWindowParentForm(Self); + end; +end; + +procedure TTBCustomDockableWindow.SetDockPos(Value: Integer); +begin + FDockPos := Value; + if Docked then + CurrentDock.ArrangeToolbars; +end; + +procedure TTBCustomDockableWindow.SetDockRow(Value: Integer); +begin + FDockRow := Value; + if Docked then + CurrentDock.ArrangeToolbars; +end; + +procedure TTBCustomDockableWindow.SetAutoResize(Value: Boolean); +begin + if FAutoResize <> Value then begin + FAutoResize := Value; + if Value then + Arrange; + end; +end; + +procedure TTBCustomDockableWindow.SetBorderStyle(Value: TBorderStyle); +begin + if FBorderStyle <> Value then begin + FBorderStyle := Value; + if Docked then + RecalcNCArea(Self); + end; +end; + +procedure TTBCustomDockableWindow.SetDragHandleStyle(Value: TTBDragHandleStyle); +begin + if FDragHandleStyle <> Value then begin + FDragHandleStyle := Value; + if Docked then + RecalcNCArea(Self); + end; +end; + +procedure TTBCustomDockableWindow.SetFloating(Value: Boolean); +var + ParentFrm: TTBCustomForm; + NewFloatParent: TTBFloatingWindowParent; +begin + if FFloating <> Value then begin + if Value and not(csDesigning in ComponentState) then begin + ParentFrm := TBValidToolWindowParentForm(Self); + if FFloatParent = nil then begin + NewFloatParent := GetFloatingWindowParentClass.CreateNew(nil); + try + with NewFloatParent do begin + FDockableWindow := Self; + BorderStyle := bsToolWindow; + ShowHint := True; + Visible := True; + { Note: The above line doesn't actually make it visible at this + point since FShouldShow is still False. } + end; + except + NewFloatParent.Free; + raise; + end; + FFloatParent := NewFloatParent; + end; + ParentFrm.FreeNotification(FFloatParent); + FFloatParent.FParentForm := ParentFrm; + FFloatParent.Caption := Caption; + Parent := FFloatParent; + SetBounds(0, 0, Width, Height); + end + else + Parent := TBValidToolWindowParentForm(Self); + end; +end; + +procedure TTBCustomDockableWindow.SetFloatingMode(Value: TTBFloatingMode); +begin + if FFloatingMode <> Value then begin + FFloatingMode := Value; + if HandleAllocated then + Perform(CM_SHOWINGCHANGED, 0, 0); + end; +end; + +procedure TTBCustomDockableWindow.SetFloatingPosition(Value: TPoint); +begin + FFloatingPosition := Value; + if Floating and Assigned(Parent) then + Parent.SetBounds(Value.X, Value.Y, Parent.Width, Parent.Height); +end; + +procedure TTBCustomDockableWindow.SetFullSize(Value: Boolean); +begin + if FFullSize <> Value then begin + FFullSize := Value; + if Docked then + CurrentDock.ArrangeToolbars; + end; +end; + +procedure TTBCustomDockableWindow.SetLastDock(Value: TTBDock); +begin + if FUseLastDock and Assigned(FCurrentDock) then + { When docked, LastDock must be equal to DockedTo } + Value := FCurrentDock; + if FLastDock <> Value then begin + if Assigned(FLastDock) and (FLastDock <> Parent) then + FLastDock.ChangeDockList(False, Self); + FLastDock := Value; + if Assigned(Value) then begin + FUseLastDock := True; + Value.FreeNotification(Self); + Value.ChangeDockList(True, Self); + end; + end; +end; + +procedure TTBCustomDockableWindow.SetResizable(Value: Boolean); +begin + if FResizable <> Value then begin + FResizable := Value; + if Floating and (Parent is TTBFloatingWindowParent) then begin + { Recreate the window handle because Resizable affects whether the + tool window is created with a WS_THICKFRAME style } + TTBFloatingWindowParent(Parent).CallRecreateWnd; + end; + end; +end; + +procedure TTBCustomDockableWindow.SetShowCaption(Value: Boolean); +begin + if FShowCaption <> Value then begin + FShowCaption := Value; + if Floating then begin + { Recalculate FloatingWindowParent's NC area, and resize the toolbar + accordingly } + RecalcNCArea(Parent); + Arrange; + end; + end; +end; + +procedure TTBCustomDockableWindow.SetStretch(Value: Boolean); +begin + if FStretch <> Value then begin + FStretch := Value; + if Docked then + CurrentDock.ArrangeToolbars; + end; +end; + +procedure TTBCustomDockableWindow.SetUseLastDock(Value: Boolean); +begin + if FUseLastDock <> Value then begin + FUseLastDock := Value; + if not Value then + LastDock := nil + else + LastDock := FCurrentDock; + end; +end; + +(*function TTBCustomDockableWindow.GetVersion: TToolbar97Version; +begin + Result := Toolbar97VersionPropText; +end; + +procedure TTBCustomDockableWindow.SetVersion(const Value: TToolbar97Version); +begin + { write method required for the property to show up in Object Inspector } +end;*) + + +{ TTBBackground } + +{$IFNDEF CLR} +type + PNotifyEvent = ^TNotifyEvent; +{$ENDIF} + +constructor TTBBackground.Create(AOwner: TComponent); +begin + inherited; + FBkColor := clBtnFace; + FBitmap := TBitmap.Create; + FBitmap.OnChange := BitmapChanged; +end; + +destructor TTBBackground.Destroy; +{$IFNDEF CLR} +var + I: Integer; +{$ENDIF} +begin + inherited; + FBitmapCache.Free; + FBitmap.Free; + if Assigned(FNotifyList) then begin + {$IFNDEF CLR} + for I := FNotifyList.Count-1 downto 0 do + Dispose(PNotifyEvent(FNotifyList[I])); + {$ENDIF} + FNotifyList.Free; + end; +end; + +procedure TTBBackground.BitmapChanged(Sender: TObject); +var + I: Integer; +begin + { Erase the cache and notify } + FreeAndNil(FBitmapCache); + if Assigned(FNotifyList) then + for I := 0 to FNotifyList.Count-1 do + {$IFNDEF CLR} + PNotifyEvent(FNotifyList[I])^(Self); + {$ELSE} + TNotifyEvent(FNotifyList[I])(Self); + {$ENDIF} +end; + +procedure TTBBackground.Draw(DC: HDC; const DrawRect: TRect); +var + UseBmp: TBitmap; + R2: TRect; + SaveIndex: Integer; + DC2: HDC; + Brush: HBRUSH; + P: TPoint; +begin + if FBitmapCache = nil then begin + FBitmapCache := TBitmap.Create; + FBitmapCache.Palette := CopyPalette(FBitmap.Palette); + FBitmapCache.Width := FBitmap.Width; + FBitmapCache.Height := FBitmap.Height; + if not FTransparent then begin + { Copy from a possible DIB to our DDB } + BitBlt(FBitmapCache.Canvas.Handle, 0, 0, FBitmapCache.Width, + FBitmapCache.Height, FBitmap.Canvas.Handle, 0, 0, SRCCOPY); + end + else begin + with FBitmapCache do begin + Canvas.Brush.Color := FBkColor; + R2 := Rect(0, 0, Width, Height); + Canvas.BrushCopy(R2, FBitmap, R2, + FBitmap.Canvas.Pixels[0, Height-1] or $02000000); + end; + end; + FBitmap.Dormant; + end; + UseBmp := FBitmapCache; + + DC2 := 0; + SaveIndex := SaveDC(DC); + try + if UseBmp.Palette <> 0 then begin + SelectPalette(DC, UseBmp.Palette, True); + RealizePalette(DC); + end; + { Note: versions of Toolbar97 prior to 1.68 used 'UseBmp.Canvas.Handle' + instead of DC2 in the BitBlt call. This was changed because there + seems to be a bug in D2/BCB1's Graphics.pas: if you called + .Background.LoadFromFile() twice the background + would not be shown. } + if (UseBmp.Width = 8) and (UseBmp.Height = 8) then begin + { Use pattern brushes to draw 8x8 bitmaps. + Note: Win9x can't use bitmaps <8x8 in size for pattern brushes } + Brush := CreatePatternBrush(UseBmp.Handle); + GetWindowOrgEx(DC, P); + SetBrushOrgEx(DC, DrawRect.Left - P.X, DrawRect.Top - P.Y, nil); + FillRect(DC, DrawRect, Brush); + DeleteObject(Brush); + end + else begin + { BitBlt is faster than pattern brushes on large bitmaps } + DC2 := CreateCompatibleDC(DC); + SelectObject(DC2, UseBmp.Handle); + R2 := DrawRect; + while R2.Left < R2.Right do begin + while R2.Top < R2.Bottom do begin + BitBlt(DC, R2.Left, R2.Top, UseBmp.Width, UseBmp.Height, + DC2, 0, 0, SRCCOPY); + Inc(R2.Top, UseBmp.Height); + end; + R2.Top := DrawRect.Top; + Inc(R2.Left, UseBmp.Width); + end; + end; + finally + if DC2 <> 0 then + DeleteDC(DC2); + { Restore the palette and brush origin back } + RestoreDC(DC, SaveIndex); + end; +end; + +function TTBBackground.GetPalette: HPALETTE; +begin + Result := FBitmap.Palette; +end; + +procedure TTBBackground.SysColorChanged; +begin + if FTransparent and (FBkColor < 0) then + BitmapChanged(nil); +end; + +function TTBBackground.UsingBackground: Boolean; +begin + Result := (FBitmap.Width <> 0) and (FBitmap.Height <> 0); +end; + +procedure TTBBackground.RegisterChanges(Proc: TNotifyEvent); +var + I: Integer; + {$IFNDEF CLR} + P: PNotifyEvent; + {$ENDIF} +begin + if FNotifyList = nil then + FNotifyList := TList.Create; + for I := 0 to FNotifyList.Count-1 do begin + {$IFNDEF CLR} + P := FNotifyList[I]; + if MethodsEqual(TMethod(P^), TMethod(Proc)) then + {$ELSE} + if @TNotifyEvent(FNotifyList[I]) = @Proc then + {$ENDIF} + Exit; + end; + {$IFNDEF CLR} + FNotifyList.Expand; + New(P); + P^ := Proc; + FNotifyList.Add(P); + {$ELSE} + FNotifyList.Add(@Proc); + {$ENDIF} +end; + +procedure TTBBackground.UnregisterChanges(Proc: TNotifyEvent); +var + I: Integer; + {$IFNDEF CLR} + P: PNotifyEvent; + {$ENDIF} +begin + if FNotifyList = nil then + Exit; + for I := 0 to FNotifyList.Count-1 do begin + {$IFNDEF CLR} + P := FNotifyList[I]; + if MethodsEqual(TMethod(P^), TMethod(Proc)) then begin + {$ELSE} + if @TNotifyEvent(FNotifyList[I]) = @Proc then begin + {$ENDIF} + FNotifyList.Delete(I); + {$IFNDEF CLR} + Dispose(P); + {$ENDIF} + Break; + end; + end; +end; + +procedure TTBBackground.SetBkColor(Value: TColor); +begin + if FBkColor <> Value then begin + FBkColor := Value; + if FTransparent then + BitmapChanged(nil); + end; +end; + +procedure TTBBackground.SetBitmap(Value: TBitmap); +begin + FBitmap.Assign(Value); +end; + +procedure TTBBackground.SetTransparent(Value: Boolean); +begin + if FTransparent <> Value then begin + FTransparent := Value; + BitmapChanged(nil); + end; +end; + + +{ Global procedures } + +procedure TBCustomLoadPositions(const OwnerComponent: TComponent; + const ReadIntProc: TTBPositionReadIntProc; + const ReadStringProc: TTBPositionReadStringProc; + const ExtraData: TTBPositionExtraData); +var + Rev: Integer; + + function FindDock(AName: String): TTBDock; + var + I: Integer; + begin + Result := nil; + for I := 0 to OwnerComponent.ComponentCount-1 do + if (OwnerComponent.Components[I] is TTBDock) and + {$IFNDEF CLR} + (CompareText(OwnerComponent.Components[I].Name, AName) = 0) then begin + {$ELSE} + SameText(OwnerComponent.Components[I].Name, AName, loInvariantLocale) then begin + {$ENDIF} + Result := TTBDock(OwnerComponent.Components[I]); + Break; + end; + end; + + procedure ReadValues(const Toolbar: TTBCustomDockableWindow; const NewDock: TTBDock); + var + Pos: TPoint; + Data: TTBReadPositionData; + LastDockName: String; + ADock: TTBDock; + begin + with Toolbar do begin + DockRow := ReadIntProc(Name, rvDockRow, DockRow, ExtraData); + DockPos := ReadIntProc(Name, rvDockPos, DockPos, ExtraData); + Pos.X := ReadIntProc(Name, rvFloatLeft, 0, ExtraData); + Pos.Y := ReadIntProc(Name, rvFloatTop, 0, ExtraData); + Data.ReadIntProc := ReadIntProc; + Data.ReadStringProc := ReadStringProc; + Data.ExtraData := ExtraData; + ReadPositionData(Data); + FloatingPosition := Pos; + if Assigned(NewDock) then + Parent := NewDock + else begin + //Parent := Form; + Floating := True; + MoveOnScreen(True); + if (Rev >= 3) and FUseLastDock then begin + LastDockName := ReadStringProc(Name, rvLastDock, '', ExtraData); + if LastDockName <> '' then begin + ADock := FindDock(LastDockName); + if Assigned(ADock) then + LastDock := ADock; + end; + end; + end; + Arrange; + DoneReadingPositionData(Data); + end; + end; + +var + DocksDisabled: TList; + I: Integer; + ToolWindow: TComponent; + ADock: TTBDock; + DockedToName: String; +begin + DocksDisabled := TList.Create; + try + with OwnerComponent do + for I := 0 to ComponentCount-1 do + if Components[I] is TTBDock then begin + TTBDock(Components[I]).BeginUpdate; + DocksDisabled.Add(Components[I]); + end; + + for I := 0 to OwnerComponent.ComponentCount-1 do begin + ToolWindow := OwnerComponent.Components[I]; + if ToolWindow is TTBCustomDockableWindow then + with TTBCustomDockableWindow(ToolWindow) do begin + {}{should skip over toolbars that are neither Docked nor Floating } + if Name = '' then + Continue; + Rev := ReadIntProc(Name, rvRev, 0, ExtraData); + if Rev = 2000 then begin + Visible := ReadIntProc(Name, rvVisible, Ord(Visible), ExtraData) <> 0; + DockedToName := ReadStringProc(Name, rvDockedTo, '', ExtraData); + if DockedToName <> '' then begin + if DockedToName <> rdDockedToFloating then begin + ADock := FindDock(DockedToName); + if (ADock <> nil) and (ADock.FAllowDrag) then + ReadValues(TTBCustomDockableWindow(ToolWindow), ADock); + end + else + ReadValues(TTBCustomDockableWindow(ToolWindow), nil); + end; + end; + end; + end; + finally + for I := DocksDisabled.Count-1 downto 0 do + TTBDock(DocksDisabled[I]).EndUpdate; + DocksDisabled.Free; + end; +end; + +procedure TBCustomSavePositions(const OwnerComponent: TComponent; + const WriteIntProc: TTBPositionWriteIntProc; + const WriteStringProc: TTBPositionWriteStringProc; + const ExtraData: TTBPositionExtraData); +var + I: Integer; + N, L: String; + Data: TTBWritePositionData; +begin + for I := 0 to OwnerComponent.ComponentCount-1 do + if OwnerComponent.Components[I] is TTBCustomDockableWindow then + with TTBCustomDockableWindow(OwnerComponent.Components[I]) do begin + if Name = '' then + Continue; + if Floating then + N := rdDockedToFloating + else if Docked then begin + if CurrentDock.FAllowDrag then begin + N := CurrentDock.Name; + if N = '' then + raise Exception.Create(STBToolwinDockedToNameNotSet); + end + else + N := ''; + end + else + Continue; { skip if it's neither floating nor docked } + L := ''; + if Assigned(FLastDock) then + L := FLastDock.Name; + WriteIntProc(Name, rvRev, rdCurrentRev, ExtraData); + WriteIntProc(Name, rvVisible, Ord(Visible), ExtraData); + WriteStringProc(Name, rvDockedTo, N, ExtraData); + WriteStringProc(Name, rvLastDock, L, ExtraData); + WriteIntProc(Name, rvDockRow, FDockRow, ExtraData); + WriteIntProc(Name, rvDockPos, FDockPos, ExtraData); + WriteIntProc(Name, rvFloatLeft, FFloatingPosition.X, ExtraData); + WriteIntProc(Name, rvFloatTop, FFloatingPosition.Y, ExtraData); + Data.WriteIntProc := WriteIntProc; + Data.WriteStringProc := WriteStringProc; + Data.ExtraData := ExtraData; + WritePositionData(Data); + end; +end; + +type + TIniReadWriteData = class + private + IniFile: TCustomIniFile; + SectionNamePrefix: String; + end; + +function IniReadInt(const ToolbarName, Value: String; const Default: Longint; + const ExtraData: TTBPositionExtraData): Longint; +begin + Result := TIniReadWriteData(ExtraData).IniFile.ReadInteger( + TIniReadWriteData(ExtraData).SectionNamePrefix + ToolbarName, Value, Default); +end; +function IniReadString(const ToolbarName, Value, Default: String; + const ExtraData: TTBPositionExtraData): String; +begin + Result := TIniReadWriteData(ExtraData).IniFile.ReadString( + TIniReadWriteData(ExtraData).SectionNamePrefix + ToolbarName, Value, Default); +end; +procedure IniWriteInt(const ToolbarName, Value: String; const Data: Longint; + const ExtraData: TTBPositionExtraData); +begin + TIniReadWriteData(ExtraData).IniFile.WriteInteger( + TIniReadWriteData(ExtraData).SectionNamePrefix + ToolbarName, Value, Data); +end; +procedure IniWriteString(const ToolbarName, Value, Data: String; + const ExtraData: TTBPositionExtraData); +begin + TIniReadWriteData(ExtraData).IniFile.WriteString( + TIniReadWriteData(ExtraData).SectionNamePrefix + ToolbarName, Value, Data); +end; + +procedure TBIniLoadPositions(const OwnerComponent: TComponent; + const IniFile: TCustomIniFile; const SectionNamePrefix: String); +var + Data: TIniReadWriteData; +begin + Data := TIniReadWriteData.Create; + try + Data.IniFile := IniFile; + Data.SectionNamePrefix := SectionNamePrefix; + TBCustomLoadPositions(OwnerComponent, IniReadInt, IniReadString, Data); + finally + Data.Free; + end; +end; + +procedure TBIniLoadPositions(const OwnerComponent: TComponent; + const Filename, SectionNamePrefix: String); +var + IniFile: TIniFile; +begin + IniFile := TIniFile.Create(Filename); + try + TBIniLoadPositions(OwnerComponent, IniFile, SectionNamePrefix); + finally + IniFile.Free; + end; +end; + +procedure TBIniSavePositions(const OwnerComponent: TComponent; + const IniFile: TCustomIniFile; const SectionNamePrefix: String); +var + Data: TIniReadWriteData; +begin + Data := TIniReadWriteData.Create; + try + Data.IniFile := IniFile; + Data.SectionNamePrefix := SectionNamePrefix; + TBCustomSavePositions(OwnerComponent, IniWriteInt, IniWriteString, Data); + finally + Data.Free; + end; +end; + +procedure TBIniSavePositions(const OwnerComponent: TComponent; + const Filename, SectionNamePrefix: String); +var + IniFile: TIniFile; +begin + IniFile := TIniFile.Create(Filename); + try + TBIniSavePositions(OwnerComponent, IniFile, SectionNamePrefix); + finally + IniFile.Free; + end; +end; + +function RegReadInt(const ToolbarName, Value: String; const Default: Longint; + const ExtraData: TTBPositionExtraData): Longint; +begin + Result := TRegIniFile(ExtraData).ReadInteger(ToolbarName, Value, Default); +end; +function RegReadString(const ToolbarName, Value, Default: String; + const ExtraData: TTBPositionExtraData): String; +begin + Result := TRegIniFile(ExtraData).ReadString(ToolbarName, Value, Default); +end; +procedure RegWriteInt(const ToolbarName, Value: String; const Data: Longint; + const ExtraData: TTBPositionExtraData); +begin + TRegIniFile(ExtraData).WriteInteger(ToolbarName, Value, Data); +end; +procedure RegWriteString(const ToolbarName, Value, Data: String; + const ExtraData: TTBPositionExtraData); +begin + TRegIniFile(ExtraData).WriteString(ToolbarName, Value, Data); +end; + +procedure TBRegLoadPositions(const OwnerComponent: TComponent; + const RootKey: DWORD; const BaseRegistryKey: String); +var + Reg: TRegIniFile; +begin + Reg := TRegIniFile.Create(''); + try + {$IFDEF JR_D5} + Reg.Access := KEY_QUERY_VALUE; + {$ENDIF} + Reg.RootKey := RootKey; + if Reg.OpenKey(BaseRegistryKey, False) then + TBCustomLoadPositions(OwnerComponent, RegReadInt, RegReadString, Reg); + finally + Reg.Free; + end; +end; + +procedure TBRegSavePositions(const OwnerComponent: TComponent; + const RootKey: DWORD; const BaseRegistryKey: String); +var + Reg: TRegIniFile; +begin + Reg := TRegIniFile.Create(''); + try + Reg.RootKey := RootKey; + Reg.CreateKey(BaseRegistryKey); + if Reg.OpenKey(BaseRegistryKey, True) then + TBCustomSavePositions(OwnerComponent, RegWriteInt, RegWriteString, Reg); + finally + Reg.Free; + end; +end; + +end. diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConvertOptions.dfm b/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConvertOptions.dfm new file mode 100644 index 0000000000000000000000000000000000000000..9d5ad455139a68dd6c12b8f4c375030fc52b7d08 GIT binary patch literal 903 zcmaKr&yLeD5XQX;jq|7Ng2W1rJ@tr|Biy!WqgHA+r7VylRGY{DNnV93j;|KUi1^j6scC2YhKZ%TBe2(j*{C5uJQH2h4LF@y z(o3kwdkHAEs_ISO0qVwl87iO};!?Bg&SlO@w{UkWlS~1Ku;?6AXU_J(^LgQm$kx^e zza-YI4sytprobKZeQx};+|o|VZ5f%?E9Y?dXwjp7=}k||Ug2~(rXc z20N{#=+u*|qEpC=TFd0XcyiR@_UkG8v67W8m8pjQ!O- zLF+%9R==!iZnJPKir18V#OKXrCedJUg{a5!){NzEgcDMc0r!rQ>ck&9tcG0tX6QF{ C5*`@< literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConvertOptions.dfm.txt b/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConvertOptions.dfm.txt new file mode 100644 index 0000000..a1b062f --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConvertOptions.dfm.txt @@ -0,0 +1,65 @@ +object TBConvertOptionsForm: TTBConvertOptionsForm + Left = 225 + Top = 133 + BorderIcons = [biSystemMenu, biMinimize] + BorderStyle = bsDialog + Caption = 'Convert Menu' + ClientHeight = 90 + ClientWidth = 249 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 8 + Top = 8 + Width = 81 + Height = 13 + Caption = '&Menu to convert:' + FocusControl = MenuCombo + end + object MenuCombo: TComboBox + Left = 8 + Top = 24 + Width = 233 + Height = 21 + Style = csDropDownList + ItemHeight = 13 + TabOrder = 0 + end + object ConvertButton: TButton + Left = 8 + Top = 57 + Width = 73 + Height = 23 + Caption = '&Convert' + Default = True + ModalResult = 1 + TabOrder = 1 + end + object HelpButton: TButton + Left = 168 + Top = 57 + Width = 73 + Height = 23 + Caption = '&Help' + TabOrder = 2 + OnClick = HelpButtonClick + end + object Button1: TButton + Left = 88 + Top = 57 + Width = 73 + Height = 23 + Cancel = True + Caption = 'Cancel' + ModalResult = 2 + TabOrder = 3 + end +end diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConvertOptions.hpp b/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConvertOptions.hpp new file mode 100644 index 0000000..7e6e41a --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConvertOptions.hpp @@ -0,0 +1,64 @@ +// CodeGear C++Builder +// Copyright (c) 1995, 2008 by CodeGear +// All rights reserved + +// (DO NOT EDIT: machine generated header) 'Tb2dsgnconvertoptions.pas' rev: 20.00 + +#ifndef Tb2dsgnconvertoptionsHPP +#define Tb2dsgnconvertoptionsHPP + +#pragma delphiheader begin +#pragma option push +#pragma option -w- // All warnings off +#pragma option -Vx // Zero-length empty class member functions +#pragma pack(push,8) +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit + +//-- user supplied ----------------------------------------------------------- + +namespace Tb2dsgnconvertoptions +{ +//-- type declarations ------------------------------------------------------- +class DELPHICLASS TTBConvertOptionsForm; +class PASCALIMPLEMENTATION TTBConvertOptionsForm : public Forms::TForm +{ + typedef Forms::TForm inherited; + +__published: + Stdctrls::TComboBox* MenuCombo; + Stdctrls::TLabel* Label1; + Stdctrls::TButton* ConvertButton; + Stdctrls::TButton* HelpButton; + Stdctrls::TButton* Button1; + void __fastcall HelpButtonClick(System::TObject* Sender); +public: + /* TCustomForm.Create */ inline __fastcall virtual TTBConvertOptionsForm(Classes::TComponent* AOwner) : Forms::TForm(AOwner) { } + /* TCustomForm.CreateNew */ inline __fastcall virtual TTBConvertOptionsForm(Classes::TComponent* AOwner, int Dummy) : Forms::TForm(AOwner, Dummy) { } + /* TCustomForm.Destroy */ inline __fastcall virtual ~TTBConvertOptionsForm(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TTBConvertOptionsForm(HWND ParentWindow) : Forms::TForm(ParentWindow) { } + +}; + + +//-- var, const, procedure --------------------------------------------------- + +} /* namespace Tb2dsgnconvertoptions */ +using namespace Tb2dsgnconvertoptions; +#pragma pack(pop) +#pragma option pop + +#pragma delphiheader end. +//-- end unit ---------------------------------------------------------------- +#endif // Tb2dsgnconvertoptionsHPP diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConvertOptions.pas b/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConvertOptions.pas new file mode 100644 index 0000000..5c47a46 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConvertOptions.pas @@ -0,0 +1,67 @@ +unit TB2DsgnConvertOptions; + +{ + Toolbar2000 + Copyright (C) 1998-2005 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2DsgnConvertOptions.pas,v 1.6 2005/01/06 03:56:50 jr Exp $ +} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls; + +type + TTBConvertOptionsForm = class(TForm) + MenuCombo: TComboBox; + Label1: TLabel; + ConvertButton: TButton; + HelpButton: TButton; + Button1: TButton; + procedure HelpButtonClick(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +implementation + +{$R *.DFM} + +procedure TTBConvertOptionsForm.HelpButtonClick(Sender: TObject); +const + SMsg1 = 'This will import the contents of a TMainMenu or TPopupMenu ' + + 'component on the form.'#13#10#13#10 + + 'The new items will take the names of the old menu ' + + 'items. The old menu items will have "_OLD" appended to the end of ' + + 'their names.'#13#10#13#10 + + 'After the conversion process completes, you should verify that ' + + 'everything was copied correctly. Afterward, you may delete the ' + + 'old menu component.'; +begin + Application.MessageBox(SMsg1, 'Convert Help', MB_OK or MB_ICONINFORMATION); +end; + +end. diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConverter.dfm b/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConverter.dfm new file mode 100644 index 0000000000000000000000000000000000000000..f684c17f209da2e10834ba14db6c65666b920583 GIT binary patch literal 795 zcma)(v69m;5QY_-SdN`sLPbI2>PqHbArbLhW|DKp7F-F6y?60gkus73xksU-ypEPP z;2C%iYLM;V+;9!u?nv7I)3?6^MCptqH}B^uou_eB3{-j7zR%19hY(#PydVmgfkYLc2L4*=vi=6X z*w;S;5X7Q`!igYUYQT1`+BM~9T^@n!HK>Kix6a3)hB(EKkWZJTHZyq)SD-b!hq`U_ zIeuf$@3#WJ^t_XqM}((#l2khMSXGeVtjD)%e;AFK}NHMz6{qmyDC85!Bc{YElX;OC4^$2dNN HoDk6;D60O= literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConverter.dfm.txt b/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConverter.dfm.txt new file mode 100644 index 0000000..7d2cbaf --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConverter.dfm.txt @@ -0,0 +1,51 @@ +object TBConverterForm: TTBConverterForm + Left = 200 + Top = 104 + AutoScroll = False + Caption = 'Conversion Status' + ClientHeight = 218 + ClientWidth = 425 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = True + Position = poScreenCenter + OnClose = FormClose + PixelsPerInch = 96 + TextHeight = 13 + object MessageList: TListBox + Left = 8 + Top = 8 + Width = 409 + Height = 169 + Anchors = [akLeft, akTop, akRight, akBottom] + ItemHeight = 13 + TabOrder = 0 + end + object CloseButton: TButton + Left = 176 + Top = 185 + Width = 73 + Height = 23 + Anchors = [akRight, akBottom] + Cancel = True + Caption = '&Close' + Enabled = False + TabOrder = 1 + OnClick = CloseButtonClick + end + object CopyButton: TButton + Left = 256 + Top = 185 + Width = 161 + Height = 23 + Anchors = [akRight, akBottom] + Caption = 'C&opy Messages to Clipboard' + Enabled = False + TabOrder = 2 + OnClick = CopyButtonClick + end +end diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConverter.hpp b/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConverter.hpp new file mode 100644 index 0000000..e172540 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConverter.hpp @@ -0,0 +1,64 @@ +// CodeGear C++Builder +// Copyright (c) 1995, 2008 by CodeGear +// All rights reserved + +// (DO NOT EDIT: machine generated header) 'Tb2dsgnconverter.pas' rev: 20.00 + +#ifndef Tb2dsgnconverterHPP +#define Tb2dsgnconverterHPP + +#pragma delphiheader begin +#pragma option push +#pragma option -w- // All warnings off +#pragma option -Vx // Zero-length empty class member functions +#pragma pack(push,8) +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit + +//-- user supplied ----------------------------------------------------------- + +namespace Tb2dsgnconverter +{ +//-- type declarations ------------------------------------------------------- +class DELPHICLASS TTBConverterForm; +class PASCALIMPLEMENTATION TTBConverterForm : public Forms::TForm +{ + typedef Forms::TForm inherited; + +__published: + Stdctrls::TListBox* MessageList; + Stdctrls::TButton* CloseButton; + Stdctrls::TButton* CopyButton; + void __fastcall CloseButtonClick(System::TObject* Sender); + void __fastcall CopyButtonClick(System::TObject* Sender); + void __fastcall FormClose(System::TObject* Sender, Forms::TCloseAction &Action); +public: + /* TCustomForm.Create */ inline __fastcall virtual TTBConverterForm(Classes::TComponent* AOwner) : Forms::TForm(AOwner) { } + /* TCustomForm.CreateNew */ inline __fastcall virtual TTBConverterForm(Classes::TComponent* AOwner, int Dummy) : Forms::TForm(AOwner, Dummy) { } + /* TCustomForm.Destroy */ inline __fastcall virtual ~TTBConverterForm(void) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TTBConverterForm(HWND ParentWindow) : Forms::TForm(ParentWindow) { } + +}; + + +//-- var, const, procedure --------------------------------------------------- +extern PACKAGE void __fastcall DoConvert(const Tb2item::TTBCustomItem* ParentItem, const Classes::TComponent* Owner); + +} /* namespace Tb2dsgnconverter */ +using namespace Tb2dsgnconverter; +#pragma pack(pop) +#pragma option pop + +#pragma delphiheader end. +//-- end unit ---------------------------------------------------------------- +#endif // Tb2dsgnconverterHPP diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConverter.pas b/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConverter.pas new file mode 100644 index 0000000..e1a2456 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnConverter.pas @@ -0,0 +1,217 @@ +unit TB2DsgnConverter; + +{ + Toolbar2000 + Copyright (C) 1998-2005 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2DsgnConverter.pas,v 1.16 2005/01/06 03:56:50 jr Exp $ +} + +interface + +{$I TB2Ver.inc} + +uses + Windows, SysUtils, Classes, Controls, Forms, Menus, StdCtrls, + TB2Item; + +type + TTBConverterForm = class(TForm) + MessageList: TListBox; + CloseButton: TButton; + CopyButton: TButton; + procedure CloseButtonClick(Sender: TObject); + procedure CopyButtonClick(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + end; + +procedure DoConvert(const ParentItem: TTBCustomItem; const Owner: TComponent); + +implementation + +{$R *.DFM} + +uses + Clipbrd, TB2DsgnConvertOptions; + +procedure DoConvert(const ParentItem: TTBCustomItem; const Owner: TComponent); +const + SPropNotTransferred = 'Warning: %s property not transferred on ''%s''.'; +var + ConverterForm: TTBConverterForm; + + procedure Log(const S: String); + begin + ConverterForm.MessageList.Items.Add(S); + ConverterForm.MessageList.TopIndex := ConverterForm.MessageList.Items.Count-1; + ConverterForm.Update; + end; + + procedure Recurse(MenuItem: TMenuItem; TBItem: TTBCustomItem); + var + I: Integer; + Src: TMenuItem; + IsSep, IsSubmenu: Boolean; + Dst: TTBCustomItem; + N: String; + begin + for I := 0 to MenuItem.Count-1 do begin + Src := MenuItem[I]; + IsSep := (Src.Caption = '-'); + IsSubmenu := False; + if not IsSep then begin + if Src.Count > 0 then + IsSubmenu := True; + if not IsSubmenu then + Dst := TTBItem.Create(Owner) + else + Dst := TTBSubmenuItem.Create(Owner); + Dst.Action := Src.Action; + {$IFDEF JR_D6} + Dst.AutoCheck := Src.AutoCheck; + {$ENDIF} + Dst.Caption := Src.Caption; + Dst.Checked := Src.Checked; + if Src.Default then + Dst.Options := Dst.Options + [tboDefault]; + Dst.Enabled := Src.Enabled; + Dst.GroupIndex := Src.GroupIndex; + Dst.HelpContext := Src.HelpContext; + Dst.ImageIndex := Src.ImageIndex; + Dst.RadioItem := Src.RadioItem; + Dst.ShortCut := Src.ShortCut; + {$IFDEF JR_D5} + Dst.SubMenuImages := Src.SubMenuImages; + {$ENDIF} + Dst.OnClick := Src.OnClick; + end + else begin + Dst := TTBSeparatorItem.Create(Owner); + end; + Dst.Hint := Src.Hint; + Dst.Tag := Src.Tag; + Dst.Visible := Src.Visible; + if not IsSep then + { Temporarily clear the menu item's OnClick property, so that renaming + the menu item doesn't cause the function name to change } + Src.OnClick := nil; + try + N := Src.Name; + Src.Name := N + '_OLD'; + Dst.Name := N; + finally + if not IsSep then + Src.OnClick := Dst.OnClick; + end; + TBItem.Add(Dst); + {$IFDEF JR_D5} + if @Src.OnAdvancedDrawItem <> nil then + Log(Format(SPropNotTransferred, ['OnAdvancedDrawItem', Dst.Name])); + {$ENDIF} + if @Src.OnDrawItem <> nil then + Log(Format(SPropNotTransferred, ['OnDrawItem', Dst.Name])); + if @Src.OnMeasureItem <> nil then + Log(Format(SPropNotTransferred, ['OnMeasureItem', Dst.Name])); + if IsSubmenu then + Recurse(Src, Dst); + end; + end; + +var + OptionsForm: TTBConvertOptionsForm; + I: Integer; + C: TComponent; + Menu: TMenu; +begin + Menu := nil; + OptionsForm := TTBConvertOptionsForm.Create(Application); + try + for I := 0 to Owner.ComponentCount-1 do begin + C := Owner.Components[I]; + if (C is TMenu) and not(C is TTBPopupMenu) then + OptionsForm.MenuCombo.Items.AddObject(C.Name, C); + end; + if OptionsForm.MenuCombo.Items.Count = 0 then + raise Exception.Create('Could not find any menus on the form to convert'); + OptionsForm.MenuCombo.ItemIndex := 0; + if (OptionsForm.ShowModal <> mrOK) or (OptionsForm.MenuCombo.ItemIndex < 0) then + Exit; + Menu := TMenu(OptionsForm.MenuCombo.Items.Objects[OptionsForm.MenuCombo.ItemIndex]); + finally + OptionsForm.Free; + end; + ParentItem.SubMenuImages := Menu.Images; + ConverterForm := TTBConverterForm.Create(Application); + ConverterForm.Show; + ConverterForm.Update; + Log(Format('Converting ''%s'', please wait...', [Menu.Name])); + ParentItem.ViewBeginUpdate; + try + Recurse(Menu.Items, ParentItem); + finally + ParentItem.ViewEndUpdate; + end; + Log('Done!'); + ConverterForm.CloseButton.Enabled := True; + ConverterForm.CopyButton.Enabled := True; +end; + + +{ TTBConverterForm } + +procedure TTBConverterForm.FormClose(Sender: TObject; + var Action: TCloseAction); +begin + Action := caFree; +end; + +procedure TTBConverterForm.CloseButtonClick(Sender: TObject); +begin + Close; +end; + +procedure TTBConverterForm.CopyButtonClick(Sender: TObject); +begin + Clipboard.AsText := MessageList.Items.Text; +end; + + +procedure FreeConverterForms; +var + I: Integer; + Form: TCustomForm; +label Restart; +begin + Restart: + for I := 0 to Screen.CustomFormCount-1 do begin + Form := Screen.CustomForms[I]; + if Form is TTBConverterForm then begin + Form.Free; + goto Restart; + end; + end; +end; + +initialization +finalization + FreeConverterForms; +end. diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnItemEditor.dfm b/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnItemEditor.dfm new file mode 100644 index 0000000000000000000000000000000000000000..748a7cda66491df4c58d876553ae3d5180707d5a GIT binary patch literal 2866 zcma)8&2r;J5FX1vk}TPANO9oilZ(rS4a)=I$aW<~ymna%djwgUji(~ds7B*B=EPR< zAUwuixbqkscm;|h^o%sJtle5TWx6}_b@%u6wERyO1;O=gFr7~)x4~?&nxmJ4FC2t| z%!gLgAt`O~1AN7WrSO5P9}vweV{g`)y_7UM5lS+Bz_?)2vV&<|-g z^f4!I^ZULyB-layMG|`)hXOBTBeu0<84-k0v!BW)F{U1rj(K-M$B`gU@Si5s$G4@m zpkBfk&7(aGpbwyo0WCwnl5CNFBK3wGtzsniEXe(xnW~X56 zPt@^tJOhrbh~KD7&I)Hht?I(Gcy^!0P#FU70BZi8;Ju{}3fnk=ZoWfD?DjYz57g|0 ziIll_Lt^aX1VgioTAf=OL;uEwwZdV%pvl3u{0-Z$7!#Higlk2cVOYSzCZrG8?CZR_ z4ZKZw_%PutH3vGRJw+S$2fe z9?8ue$%NuYA9CJ*IVIlxmo&c(27YE{Z{KhY9R4ty)K4HYY54gx7B%Yqm=gA6}R3 z-Vyrf@74sCS_bsy>Ex!&`pb~R!;o*`hERA5`eYx8M+mu4WvR)DKA*tOrxG>PzJ;+F z6zkc8wHOkL`5@oVrCscgKk_+#Mt!&dWp809WU(iOBeOv3y~cYPz1|4{`%aIu4esGc z23oSQjwNkrc5k=g1D5;X890J=x$t(vcwx!~D5vGK6F}udWwrqXi;`*yU6rtiM+jWTWX#kXbN&+E{&)G~pO(^}fT%7I5|$V0(+o>+1MUx~t3O>G=g|Axxc=T+z; zZH;_u&Nx=jQ#0HiNtd}$>mzdpV$I}wgs&JKbI$fKHd67j3`ssHeqvu8nYBTMT5m0H zHxlNQhU)~!R^D0@{;k?jyKJIg0@R4>dMrKEpxYzqtYNpLuL|BO!OxBuHFReg!jFX- zd}pM*dC6^cuHtq|+(G4b4cMK)=j#Jxca*!;EZ6FHDxqq+W+}RHS!O=3!WXIkQ?IX& zdbxA + ColumnClick = False + DragMode = dmAutomatic + HideSelection = False + MultiSelect = True + ReadOnly = True + RowSelect = True + PopupMenu = TBPopupMenu1 + TabOrder = 1 + ViewStyle = vsReport + OnChange = ListViewChange + OnDblClick = ListViewDblClick + OnEnter = ListViewEnter + OnDragDrop = ListViewDragDrop + OnDragOver = ListViewDragOver + OnKeyDown = ListViewKeyDown + OnKeyPress = ListViewKeyPress + end + object Toolbar: TTBToolbar + Left = 0 + Top = 0 + Width = 440 + Height = 19 + Align = alTop + Caption = 'Toolbar' + DockPos = 0 + FullSize = True + LinkSubitems = ToolbarItems + ParentShowHint = False + ShowHint = True + TabOrder = 0 + end + object TBPopupMenu1: TTBPopupMenu + LinkSubitems = ToolbarItems + Left = 256 + Top = 120 + end + object TBItemContainer1: TTBItemContainer + Left = 224 + Top = 120 + object ToolbarItems: TTBSubmenuItem + object NewItemButton: TTBItem + Caption = 'New &Item' + Hint = 'New Item' + ImageIndex = 0 + ShortCut = 45 + OnClick = NewItemButtonClick + end + object NewSubmenuButton: TTBItem + Caption = 'New &Submenu' + Hint = 'New Submenu' + ImageIndex = 1 + ShortCut = 16429 + OnClick = NewSubmenuButtonClick + end + object NewSepButton: TTBItem + Caption = 'New Se¶tor' + Hint = 'New Separator' + ImageIndex = 2 + ShortCut = 189 + OnClick = NewSepButtonClick + end + object MoreMenu: TTBSubmenuItem + Caption = '&More' + Options = [tboDropdownArrow] + end + object TBSeparatorItem1: TTBSeparatorItem + end + object CutButton: TTBItem + Caption = 'Cu&t' + Enabled = False + Hint = 'Cut' + ImageIndex = 5 + OnClick = CutButtonClick + end + object CopyButton: TTBItem + Caption = '&Copy' + Enabled = False + Hint = 'Copy' + ImageIndex = 4 + OnClick = CopyButtonClick + end + object PasteButton: TTBItem + Caption = '&Paste' + Hint = 'Paste' + ImageIndex = 6 + OnClick = PasteButtonClick + end + object DeleteButton: TTBItem + Caption = '&Delete Item' + Enabled = False + Hint = 'Delete Item' + ImageIndex = 3 + ShortCut = 46 + OnClick = DeleteButtonClick + end + object TBSeparatorItem2: TTBSeparatorItem + end + object MoveUpButton: TTBItem + Caption = 'Move &Up' + Hint = 'Move Up' + ImageIndex = 7 + ShortCut = 32806 + OnClick = MoveUpButtonClick + end + object MoveDownButton: TTBItem + Caption = 'Move D&own' + Hint = 'Move Down' + ImageIndex = 8 + ShortCut = 32808 + OnClick = MoveDownButtonClick + end + object TBSeparatorItem3: TTBSeparatorItem + end + object TBSubmenuItem1: TTBSubmenuItem + Caption = '&Tools' + Options = [tboDropdownArrow] + object TConvertMenu: TTBItem + Caption = '&Convert TMainMenu/TPopupMenu...' + OnClick = TConvertMenuClick + end + end + end + end +end diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnItemEditor.hpp b/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnItemEditor.hpp new file mode 100644 index 0000000..bcf2cfd --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnItemEditor.hpp @@ -0,0 +1,189 @@ +// CodeGear C++Builder +// Copyright (c) 1995, 2008 by CodeGear +// All rights reserved + +// (DO NOT EDIT: machine generated header) 'Tb2dsgnitemeditor.pas' rev: 20.00 + +#ifndef Tb2dsgnitemeditorHPP +#define Tb2dsgnitemeditorHPP + +#pragma delphiheader begin +#pragma option push +#pragma option -w- // All warnings off +#pragma option -Vx // Zero-length empty class member functions +#pragma pack(push,8) +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit + +//-- user supplied ----------------------------------------------------------- + +namespace Tb2dsgnitemeditor +{ +//-- type declarations ------------------------------------------------------- +class DELPHICLASS TTBItemEditForm; +class PASCALIMPLEMENTATION TTBItemEditForm : public Designwindows::TDesignWindow +{ + typedef Designwindows::TDesignWindow inherited; + +__published: + Comctrls::TTreeView* TreeView; + Comctrls::TListView* ListView; + Extctrls::TSplitter* Splitter1; + Tb2toolbar::TTBToolbar* Toolbar; + Tb2item::TTBItem* NewSubmenuButton; + Tb2item::TTBItem* NewItemButton; + Tb2item::TTBItem* NewSepButton; + Tb2item::TTBItem* DeleteButton; + Tb2item::TTBSeparatorItem* TBSeparatorItem1; + Tb2item::TTBPopupMenu* TBPopupMenu1; + Tb2item::TTBItemContainer* TBItemContainer1; + Tb2item::TTBSubmenuItem* ToolbarItems; + Tb2item::TTBItem* CopyButton; + Tb2item::TTBItem* CutButton; + Tb2item::TTBItem* PasteButton; + Tb2item::TTBSubmenuItem* MoreMenu; + Tb2item::TTBSeparatorItem* TBSeparatorItem2; + Tb2item::TTBSubmenuItem* TBSubmenuItem1; + Tb2item::TTBItem* TConvertMenu; + Tb2item::TTBSeparatorItem* TBSeparatorItem3; + Tb2item::TTBItem* MoveUpButton; + Tb2item::TTBItem* MoveDownButton; + void __fastcall FormClose(System::TObject* Sender, Forms::TCloseAction &Action); + void __fastcall TreeViewChange(System::TObject* Sender, Comctrls::TTreeNode* Node); + void __fastcall NewSubmenuButtonClick(System::TObject* Sender); + void __fastcall NewItemButtonClick(System::TObject* Sender); + void __fastcall ListViewChange(System::TObject* Sender, Comctrls::TListItem* Item, Comctrls::TItemChange Change); + void __fastcall DeleteButtonClick(System::TObject* Sender); + void __fastcall NewSepButtonClick(System::TObject* Sender); + void __fastcall ListViewDragOver(System::TObject* Sender, System::TObject* Source, int X, int Y, Controls::TDragState State, bool &Accept); + void __fastcall ListViewDragDrop(System::TObject* Sender, System::TObject* Source, int X, int Y); + void __fastcall TreeViewEnter(System::TObject* Sender); + void __fastcall TreeViewDragDrop(System::TObject* Sender, System::TObject* Source, int X, int Y); + void __fastcall TreeViewDragOver(System::TObject* Sender, System::TObject* Source, int X, int Y, Controls::TDragState State, bool &Accept); + void __fastcall CopyButtonClick(System::TObject* Sender); + void __fastcall ListViewKeyDown(System::TObject* Sender, System::Word &Key, Classes::TShiftState Shift); + void __fastcall CutButtonClick(System::TObject* Sender); + void __fastcall PasteButtonClick(System::TObject* Sender); + void __fastcall FormActivate(System::TObject* Sender); + void __fastcall ListViewKeyPress(System::TObject* Sender, System::WideChar &Key); + void __fastcall ListViewDblClick(System::TObject* Sender); + void __fastcall ListViewEnter(System::TObject* Sender); + void __fastcall TreeViewKeyDown(System::TObject* Sender, System::Word &Key, Classes::TShiftState Shift); + void __fastcall TConvertMenuClick(System::TObject* Sender); + void __fastcall TreeViewKeyPress(System::TObject* Sender, System::WideChar &Key); + void __fastcall MoveUpButtonClick(System::TObject* Sender); + void __fastcall MoveDownButtonClick(System::TObject* Sender); + +private: + Classes::TComponent* FParentComponent; + Tb2item::TTBCustomItem* FRootItem; + Tb2item::TTBCustomItem* FSelParentItem; + Classes::TList* FNotifyItemList; + int FSettingSel; + int FRebuildingTree; + int FRebuildingList; + Comctrls::TListItem* __fastcall AddListViewItem(const int Index, const Tb2item::TTBCustomItem* Item); + MESSAGE void __fastcall CMDeferUpdate(Messages::TMessage &Message); + void __fastcall Copy(void); + void __fastcall CreateNewItem(const Tb2item::TTBCustomItemClass AClass); + void __fastcall Cut(void); + void __fastcall Delete(void); + void __fastcall DeleteItem(const Tb2item::TTBCustomItem* Item); + System::UnicodeString __fastcall GetItemTreeCaption(Tb2item::TTBCustomItem* AItem); + void __fastcall GetSelItemList(const Classes::TList* AList); + void __fastcall ItemNotification(Tb2item::TTBCustomItem* Ancestor, bool Relayed, Tb2item::TTBItemChangedAction Action, int Index, Tb2item::TTBCustomItem* Item); + void __fastcall MoreItemClick(System::TObject* Sender); + void __fastcall MoveItem(int CurIndex, int NewIndex); + void __fastcall Paste(void); + void __fastcall RebuildList(void); + void __fastcall RebuildTree(void); + void __fastcall SelectInObjectInspector(Classes::TList* AList); + void __fastcall SetSelParentItem(Tb2item::TTBCustomItem* ASelParentItem); + bool __fastcall TreeViewDragHandler(System::TObject* Sender, System::TObject* Source, int X, int Y, bool Drop); + void __fastcall UnregisterAllNotifications(void); + +protected: + virtual void __fastcall Notification(Classes::TComponent* AComponent, Classes::TOperation Operation); + virtual System::UnicodeString __fastcall UniqueName(Classes::TComponent* Component); + +public: + __fastcall virtual TTBItemEditForm(Classes::TComponent* AOwner); + __fastcall virtual ~TTBItemEditForm(void); + virtual bool __fastcall EditAction(Designintf::TEditAction Action); + virtual Designintf::TEditState __fastcall GetEditState(void); +public: + /* TCustomForm.CreateNew */ inline __fastcall virtual TTBItemEditForm(Classes::TComponent* AOwner, int Dummy) : Designwindows::TDesignWindow(AOwner, Dummy) { } + +public: + /* TWinControl.CreateParented */ inline __fastcall TTBItemEditForm(HWND ParentWindow) : Designwindows::TDesignWindow(ParentWindow) { } + +}; + + +class DELPHICLASS TTBItemsEditor; +class PASCALIMPLEMENTATION TTBItemsEditor : public Designeditors::TDefaultEditor +{ + typedef Designeditors::TDefaultEditor inherited; + +public: + virtual void __fastcall Edit(void); + virtual void __fastcall ExecuteVerb(int Index); + virtual System::UnicodeString __fastcall GetVerb(int Index); + virtual int __fastcall GetVerbCount(void); +public: + /* TComponentEditor.Create */ inline __fastcall virtual TTBItemsEditor(Classes::TComponent* AComponent, Designintf::_di_IDesigner ADesigner) : Designeditors::TDefaultEditor(AComponent, ADesigner) { } + +public: + /* TObject.Destroy */ inline __fastcall virtual ~TTBItemsEditor(void) { } + +}; + + +class DELPHICLASS TTBItemsPropertyEditor; +class PASCALIMPLEMENTATION TTBItemsPropertyEditor : public Designeditors::TStringProperty +{ + typedef Designeditors::TStringProperty inherited; + +public: + virtual void __fastcall Edit(void); + virtual Designintf::TPropertyAttributes __fastcall GetAttributes(void); + virtual System::UnicodeString __fastcall GetValue(); +public: + /* TPropertyEditor.Create */ inline __fastcall virtual TTBItemsPropertyEditor(const Designintf::_di_IDesigner ADesigner, int APropCount) : Designeditors::TStringProperty(ADesigner, APropCount) { } + /* TPropertyEditor.Destroy */ inline __fastcall virtual ~TTBItemsPropertyEditor(void) { } + +}; + + +//-- var, const, procedure --------------------------------------------------- +static const Word CM_DEFERUPDATE = 0x464; +extern PACKAGE void __fastcall TBRegisterItemClass(Tb2item::TTBCustomItemClass AClass, const System::UnicodeString ACaption, unsigned ResInstance); + +} /* namespace Tb2dsgnitemeditor */ +using namespace Tb2dsgnitemeditor; +#pragma pack(pop) +#pragma option pop + +#pragma delphiheader end. +//-- end unit ---------------------------------------------------------------- +#endif // Tb2dsgnitemeditorHPP diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnItemEditor.pas b/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnItemEditor.pas new file mode 100644 index 0000000..a8b35fc --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnItemEditor.pas @@ -0,0 +1,1439 @@ +unit TB2DsgnItemEditor; + +{ + Toolbar2000 + Copyright (C) 1998-2008 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2DsgnItemEditor.pas,v 1.63 2008/09/25 18:49:31 jr Exp $ +} + +interface + +{$I TB2Ver.inc} + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + {$IFDEF CLR} System.ComponentModel, {$ENDIF} + StdCtrls, ExtCtrls, Buttons, ComCtrls, ImgList, Menus, + TB2Item, TB2Toolbar, TB2Dock, + {$IFDEF JR_D6} + DesignIntf, DesignWindows, DesignEditors; + {$ELSE} + DsgnIntf, DsgnWnds, LibIntf; + {$ENDIF} + +const + CM_DEFERUPDATE = WM_USER + 100; + +type + TTBItemEditForm = class(TDesignWindow) + TreeView: TTreeView; + ListView: TListView; + Splitter1: TSplitter; + Toolbar: TTBToolbar; + NewSubmenuButton: TTBItem; + NewItemButton: TTBItem; + NewSepButton: TTBItem; + DeleteButton: TTBItem; + TBSeparatorItem1: TTBSeparatorItem; + TBPopupMenu1: TTBPopupMenu; + TBItemContainer1: TTBItemContainer; + ToolbarItems: TTBSubmenuItem; + CopyButton: TTBItem; + CutButton: TTBItem; + PasteButton: TTBItem; + MoreMenu: TTBSubmenuItem; + TBSeparatorItem2: TTBSeparatorItem; + TBSubmenuItem1: TTBSubmenuItem; + TConvertMenu: TTBItem; + TBSeparatorItem3: TTBSeparatorItem; + MoveUpButton: TTBItem; + MoveDownButton: TTBItem; + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure TreeViewChange(Sender: TObject; Node: TTreeNode); + procedure NewSubmenuButtonClick(Sender: TObject); + procedure NewItemButtonClick(Sender: TObject); + procedure ListViewChange(Sender: TObject; Item: TListItem; + Change: TItemChange); + procedure DeleteButtonClick(Sender: TObject); + procedure NewSepButtonClick(Sender: TObject); + procedure ListViewDragOver(Sender, Source: TObject; X, Y: Integer; + State: TDragState; var Accept: Boolean); + procedure ListViewDragDrop(Sender, Source: TObject; X, Y: Integer); + procedure TreeViewEnter(Sender: TObject); + procedure TreeViewDragDrop(Sender, Source: TObject; X, Y: Integer); + procedure TreeViewDragOver(Sender, Source: TObject; X, Y: Integer; + State: TDragState; var Accept: Boolean); + procedure CopyButtonClick(Sender: TObject); + procedure ListViewKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); + procedure CutButtonClick(Sender: TObject); + procedure PasteButtonClick(Sender: TObject); + procedure FormActivate(Sender: TObject); + procedure ListViewKeyPress(Sender: TObject; var Key: Char); + procedure ListViewDblClick(Sender: TObject); + procedure ListViewEnter(Sender: TObject); + procedure TreeViewKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); + procedure TConvertMenuClick(Sender: TObject); + procedure TreeViewKeyPress(Sender: TObject; var Key: Char); + procedure MoveUpButtonClick(Sender: TObject); + procedure MoveDownButtonClick(Sender: TObject); + private + FParentComponent: TComponent; + FRootItem, FSelParentItem: TTBCustomItem; + FNotifyItemList: TList; + FSettingSel, FRebuildingTree, FRebuildingList: Integer; + function AddListViewItem(const Index: Integer; + const Item: TTBCustomItem): TListItem; + procedure CMDeferUpdate(var Message: TMessage); message CM_DEFERUPDATE; + procedure Copy; + procedure CreateNewItem(const AClass: TTBCustomItemClass); + procedure Cut; + procedure Delete; + procedure DeleteItem(const Item: TTBCustomItem); + function GetItemTreeCaption(AItem: TTBCustomItem): String; + procedure GetSelItemList(const AList: TList); + procedure ItemNotification(Ancestor: TTBCustomItem; Relayed: Boolean; + Action: TTBItemChangedAction; Index: Integer; Item: TTBCustomItem); + procedure MoreItemClick(Sender: TObject); + procedure MoveItem(CurIndex, NewIndex: Integer); + procedure Paste; + procedure RebuildList; + procedure RebuildTree; + procedure SelectInObjectInspector(AList: TList); + procedure SetSelParentItem(ASelParentItem: TTBCustomItem); + function TreeViewDragHandler(Sender, Source: TObject; X, Y: Integer; + Drop: Boolean): Boolean; + procedure UnregisterAllNotifications; + protected + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + function UniqueName(Component: TComponent): String; override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + {$IFDEF JR_D6} + function EditAction(Action: TEditAction): Boolean; override; + {$ELSE} + procedure EditAction(Action: TEditAction); override; + {$ENDIF} + function GetEditState: TEditState; override; + end; + + TTBItemsEditor = class(TDefaultEditor) + public + procedure Edit; override; + procedure ExecuteVerb(Index: Integer); override; + function GetVerb(Index: Integer): String; override; + function GetVerbCount: Integer; override; + end; + + TTBItemsPropertyEditor = class(TStringProperty) + public + procedure Edit; override; + function GetAttributes: TPropertyAttributes; override; + function GetValue: String; override; + end; + +procedure TBRegisterItemClass(AClass: TTBCustomItemClass; + const ACaption: String; ResInstance: HINST); + +implementation + +{$R *.DFM} + +uses + {$IFDEF CLR} System.Drawing, System.IO, System.Reflection, {$ENDIF} + TypInfo, CommCtrl, TB2Version, TB2Common, TB2DsgnConverter; + +type +{$IFNDEF JR_D5} + TDesignerSelectionList = TComponentList; +{$ENDIF} +{$IFDEF JR_D6} + TDesignerSelectionList = IDesignerSelections; +{$ENDIF} + + TItemClassInfo = class + ItemClass: TTBCustomItemClass; + Caption: String; + ImageIndex: Integer; + end; + +var + ItemClasses: TList; + ItemImageList: TImageList; + +{$IFNDEF JR_D6} +function CreateSelectionList: TDesignerSelectionList; +begin + Result := TDesignerSelectionList.Create; +end; +{$ENDIF} + +procedure FreeItemClasses; +var + I: Integer; + IC: TList; +begin + if ItemClasses = nil then Exit; + IC := ItemClasses; + ItemClasses := nil; + for I := IC.Count-1 downto 0 do + TItemClassInfo(IC[I]).Free; + IC.Free; +end; + +{ Note: AFAIK, there is no need for a similar function on .NET since assemblies + can't be unloaded. When a design-time package is uninstalled, it remains + loaded until the IDE is restarted. } +{$IFNDEF CLR} +procedure UnregisterModuleItemClasses(AModule: {$IFDEF JR_D5} LongWord {$ELSE} Integer {$ENDIF}); +var + I: Integer; + Info: TItemClassInfo; +begin + I := 0; + while I < ItemClasses.Count do begin + Info := TItemClassInfo(ItemClasses[I]); + if FindClassHInstance(Info.ItemClass) = AModule then begin + ItemClasses.Delete(I); + Info.Free; + end + else + Inc(I); + end; + { Note: TTBItemEditForm also holds references to item classes, but since + Delphi automatically closes all editor forms before compiling/removing + a package, we don't need to remove them. } +end; +{$ENDIF} + +{$IFNDEF CLR} +function LoadItemImage(Instance: HINST; const ResName: String): Integer; +var + Bmp: TBitmap; +begin + Bmp := TBitmap.Create; + try + Bmp.Handle := LoadBitmap(Instance, {$IFNDEF CLR}PChar{$ENDIF}(ResName)); + if Bmp.Handle = 0 then + Result := -1 + else + Result := ItemImageList.AddMasked(Bmp, Bmp.Canvas.Pixels[0, Bmp.Height-1]); + finally + Bmp.Free; + end; +end; +{$ELSE} +function LoadItemImage(const AAssembly: System.Reflection.Assembly; + const ResName: String): Integer; +var + Bmp: TBitmap; + ResStream: System.IO.Stream; + ResBmp: System.Drawing.Bitmap; +begin + Bmp := TBitmap.Create; + try + ResStream := AAssembly.GetManifestResourceStream(ResName); + if ResStream = nil then begin + Result := -1; + Exit; + end; + try + ResBmp := System.Drawing.Bitmap.Create(ResStream); + try + Bmp.LoadFromBitmap(ResBmp); + finally + ResBmp.Dispose; + end; + finally + ResStream.Close; + end; + Result := ItemImageList.AddMasked(Bmp, Bmp.Canvas.Pixels[0, Bmp.Height-1]); + finally + Bmp.Free; + end; +end; +{$ENDIF} + +procedure TBRegisterItemClass(AClass: TTBCustomItemClass; + const ACaption: String; ResInstance: HINST); +var + I: Integer; + Info: TItemClassInfo; +begin + { Hack for Delphi.NET 2006 bug: + If you start Delphi, open & rebuild the tb2k_dn10 package only, then open + the Demo project, the IDE calls the Register procedure on tb2kdsgn_d10 a + second time, without reloading either of the two packages. As a result, + the TBRegisterItemClass calls are repeated. To avoid doubled items on the + editor form's More menu, check if the class was already registered. } + for I := 0 to ItemClasses.Count-1 do + if TItemClassInfo(ItemClasses[I]).ItemClass = AClass then + Exit; + Info := TItemClassInfo.Create; + Info.ItemClass := AClass; + Info.Caption := ACaption; + {$IFNDEF CLR} + Info.ImageIndex := LoadItemImage(ResInstance, + Uppercase(AClass.ClassName {$IFDEF JR_D9} , loInvariantLocale {$ENDIF})); + {$ELSE} + Info.ImageIndex := LoadItemImage(Assembly.GetCallingAssembly, + AClass.ClassName + '.bmp'); + {$ENDIF} + ItemClasses.Add(Info); +end; + +function GetItemClassImage(AClass: TTBCustomItemClass): Integer; +var + I: Integer; + Info: TItemClassInfo; +begin + for I := ItemClasses.Count-1 downto 0 do begin + Info := TItemClassInfo(ItemClasses[I]); + if AClass.InheritsFrom(Info.ItemClass) then begin + Result := Info.ImageIndex; + if Result >= 0 then + Exit; + end; + end; + if AClass.InheritsFrom(TTBSubmenuItem) then + Result := 1 + else if AClass.InheritsFrom(TTBSeparatorItem) then + Result := 2 + else + Result := 0; +end; + +procedure ShowEditForm(AParentComponent: TComponent; ARootItem: TTBCustomItem; + const ADesigner: {$IFDEF JR_D6} IDesigner {$ELSE} IFormDesigner {$ENDIF}); +var + I: Integer; + Form: TCustomForm; + EditForm: TTBItemEditForm; +begin + if Assigned(ARootItem.LinkSubitems) then begin + case MessageDlg(Format('The LinkSubitems property is set to ''%s''. ' + + 'Would you like to edit that item instead?', + [ARootItem.LinkSubitems.Name]), mtConfirmation, [mbYes, mbNo, mbCancel], 0) of + mrYes: begin + AParentComponent := ARootItem.LinkSubitems; + ARootItem := ARootItem.LinkSubitems; + end; + mrCancel: Exit; + end; + end; + for I := 0 to Screen.FormCount-1 do begin + Form := Screen.Forms[I]; + if Form is TTBItemEditForm then + if TTBItemEditForm(Form).FRootItem = ARootItem then begin + Form.Show; + if Form.WindowState = wsMinimized then + Form.WindowState := wsNormal; + Exit; + end; + end; + EditForm := TTBItemEditForm.Create(Application); + try + EditForm.Designer := ADesigner; + EditForm.FParentComponent := AParentComponent; + AParentComponent.FreeNotification(EditForm); + EditForm.FRootItem := ARootItem; + ARootItem.FreeNotification(EditForm); + EditForm.FSelParentItem := ARootItem; + EditForm.Caption := 'Editing ' + AParentComponent.Name; + EditForm.RebuildTree; + EditForm.RebuildList; + {$IFDEF JR_D9} + EditForm.PopupMode := pmExplicit; + {$ENDIF} + EditForm.Show; + except + EditForm.Free; + raise; + end; +end; + +function IsSubmenuItem(Item: TTBCustomItem): Boolean; +begin + Result := tbisSubitemsEditable in Item.GetItemStyle; +end; + +procedure ShowVersion; +const + AboutText = + '%s'#13#10 + + 'Copyright (C) 1998-2008 by Jordan Russell'#13#10 + + 'For conditions of distribution and use, see LICENSE.TXT.'#13#10 + + #13#10 + + 'Visit my web site for the latest versions of Toolbar2000:'#13#10 + + 'http://www.jrsoftware.org/'; +begin + MessageDlg(Format(AboutText, [Toolbar2000VersionPropText]), mtInformation, + [mbOK], 0); +end; + + +{ TTBItemEditForm } + +constructor TTBItemEditForm.Create(AOwner: TComponent); +var + I: Integer; + Info: TItemClassInfo; + Item: TTBItem; +begin + inherited; + FNotifyItemList := TList.Create; + ToolbarItems.SubMenuImages := ItemImageList; + ListView.SmallImages := ItemImageList; + { Populate the 'More' menu } + for I := 0 to ItemClasses.Count-1 do begin + Info := TItemClassInfo(ItemClasses[I]); + Item := TTBItem.Create(Self); + Item.Caption := Info.Caption; + Item.ImageIndex := GetItemClassImage(Info.ItemClass); + Item.Tag := {$IFNDEF CLR}Integer{$ELSE}TTag{$ENDIF}(Info.ItemClass); + Item.OnClick := MoreItemClick; + MoreMenu.Add(Item); + end; +end; + +destructor TTBItemEditForm.Destroy; +begin + inherited; + if Assigned(FNotifyItemList) then begin + UnregisterAllNotifications; + FNotifyItemList.Free; + FNotifyItemList := nil; + end; +end; + +procedure TTBItemEditForm.FormClose(Sender: TObject; + var Action: TCloseAction); +begin + Action := caFree; +end; + +procedure TTBItemEditForm.FormActivate(Sender: TObject); +begin + SetSelParentItem(FSelParentItem); +end; + +procedure TTBItemEditForm.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if (Operation = opRemove) and + ((AComponent = FParentComponent) or (AComponent = FRootItem)) then + { Must use Free instead of Close, since Close causes the freeing of the + form to be delayed until the next message. We have to destroy the form + immediately, otherwise Delphi will crash when Compile is clicked on the + TB2k package. } + Free; + {}{temp:} + (*if (Operation = opRemove) and (FNotifyItemList.IndexOf(AComponent) <> -1) then begin + outputdebugstring(pchar('Still in list: ' + AComponent.name)); + //beep; + end;*) +end; + +function TTBItemEditForm.UniqueName(Component: TComponent): String; +begin + Result := Designer.UniqueName(Component.ClassName); +end; + +function TTBItemEditForm.GetEditState: TEditState; +begin + Result := []; + if ActiveControl = ListView then begin + if Assigned(ListView.Selected) then + Result := [esCanDelete, esCanCut, esCanCopy]; + if ClipboardComponents then + Include(Result, esCanPaste); + end; +end; + +{$IFDEF JR_D6} +function TTBItemEditForm.EditAction(Action: TEditAction): Boolean; +{$ELSE} +procedure TTBItemEditForm.EditAction(Action: TEditAction); +{$ENDIF} +begin + {$IFDEF JR_D6} + Result := True; + {$ENDIF} + case Action of + eaCut: Cut; + eaCopy: Copy; + eaPaste: Paste; + eaDelete: Delete; + {$IFDEF JR_D6} + else + Result := False; + {$ENDIF} + end; +end; + +procedure TTBItemEditForm.UnregisterAllNotifications; +var + I: Integer; +begin + for I := FNotifyItemList.Count-1 downto 0 do begin + //outputdebugstring(pchar('Unregall: ' + TTBCustomItem(FNotifyItemList[I]).name)); + TTBCustomItem(FNotifyItemList[I]).UnregisterNotification(ItemNotification); + FNotifyItemList.Delete(I); + end; +end; + +procedure TTBItemEditForm.ItemNotification(Ancestor: TTBCustomItem; + Relayed: Boolean; Action: TTBItemChangedAction; Index: Integer; + Item: TTBCustomItem); +var + ListItem: TListItem; + TreeNode: TTreeNode; + I: Integer; + C: String; +begin + { Manipulate the list view when items are inserted, deleted, or their Caption + changes } + case Action of + tbicInserted: + begin + if (Ancestor = FSelParentItem) and not Relayed then + AddListViewItem(Index, Item); + if IsSubmenuItem(Item) then + RebuildTree; + end; + tbicDeleting: + if (Ancestor = FSelParentItem) and not Relayed then begin + ListItem := ListView.FindData(0, Item, True, False); + if Assigned(ListItem) then + ListItem.Delete; + end; + tbicInvalidateAndResize: + if (Ancestor = FSelParentItem) and not Relayed then begin + ListItem := ListView.FindData(0, Item, True, False); + if Assigned(ListItem) and (ListItem.Caption <> TTBCustomItem(Item).Caption) then + ListItem.Caption := TTBCustomItem(Item).Caption; + end; + end; + { Update tree view when an item is deleted, or a Caption changes } + if Action = tbicDeleting then begin + I := FNotifyItemList.IndexOf(Item); + if I <> -1 then begin + //outputdebugstring(pchar('Deleting, so unreging: ' + item.name)); + TTBCustomItem(Item).UnregisterNotification(ItemNotification); + FNotifyItemList.Delete(I); + end; + end; + if Action in [tbicDeleting, tbicInvalidateAndResize, tbicNameChanged] then begin + TreeNode := TreeView.Items.GetFirstNode; + while Assigned(TreeNode) do begin + if TreeNode.Data = Item then begin + if Action = tbicDeleting then begin + TreeNode.Delete; + if FSelParentItem = Item then + SetSelParentItem(TTBCustomItem(Item).Parent); + end + else begin + { tbicInvalidateAndResize, tbicNameChanged: } + C := GetItemTreeCaption(Item); + if TreeNode.Text <> C then + TreeNode.Text := C; + end; + Break; + end; + TreeNode := TreeNode.GetNext; + end; + end; +end; + +function TTBItemEditForm.GetItemTreeCaption(AItem: TTBCustomItem): String; +begin + if AItem <> FRootItem then begin + Result := AItem.Caption; + if Result = '' then + Result := '[' + AItem.Name + ']'; + end + else + Result := '(Root)'; +end; + +procedure TTBItemEditForm.RebuildTree; + + procedure Recurse(const AParentItem: TTBCustomItem; const ATreeNode: TTreeNode; + var FoundSelParentItem: TTreeNode); + var + I: Integer; + NewNode: TTreeNode; + ChildItem: TTBCustomItem; + begin + {}AParentItem.FreeNotification(Self); + AParentItem.RegisterNotification(ItemNotification); + FNotifyItemList.Add(AParentItem); + NewNode := TreeView.Items.AddChild(ATreeNode, GetItemTreeCaption(AParentItem)); + NewNode.Data := AParentItem; + if AParentItem = FSelParentItem then + FoundSelParentItem := NewNode; + for I := 0 to AParentItem.Count-1 do begin + ChildItem := AParentItem[I]; + if IsSubmenuItem(ChildItem) then + Recurse(ChildItem, NewNode, FoundSelParentItem); + end; + end; + +var + FoundSelParentItem: TTreeNode; +begin + Inc(FRebuildingTree); + try + TreeView.Items.BeginUpdate; + try + TreeView.Items.Clear; + UnregisterAllNotifications; + FoundSelParentItem := nil; + Recurse(FRootItem, nil, FoundSelParentItem); + if FoundSelParentItem = nil then + SetSelParentItem(FRootItem) + else + TreeView.Selected := FoundSelParentItem; + TreeView.Items[0].Expand(True); + finally + TreeView.Items.EndUpdate; + end; + finally + Dec(FRebuildingTree); + end; +end; + +function TTBItemEditForm.AddListViewItem(const Index: Integer; + const Item: TTBCustomItem): TListItem; +begin + Result := ListView.Items.Insert(Index); + Result.Data := Item; + if not(Item is TTBControlItem) then begin + Result.Caption := Item.Caption; + Result.Subitems.Add(Item.ClassName); + Result.ImageIndex := GetItemClassImage(TTBCustomItemClass(Item.ClassType)); + end + else begin + Result.Caption := '(Control)'; + Result.Subitems.Add(Item.ClassName); + Result.ImageIndex := -1; + end; +end; + +procedure TTBItemEditForm.RebuildList; +var + ChildItem: TTBCustomItem; + I: Integer; +begin + Inc(FRebuildingList); + try + ListView.Items.BeginUpdate; + try + ListView.Items.Clear; + if Assigned(FSelParentItem) then begin + for I := 0 to FSelParentItem.Count-1 do begin + ChildItem := FSelParentItem[I]; + { Check for csDestroying because deleting an item in the tree view + causes the parent item to be selected, and the parent item won't + get a notification that the item is deleting since notifications + were already sent } + if not(csDestroying in ChildItem.ComponentState) then + AddListViewItem(I, ChildItem); + end; + { Add an empty item to the end } + ListView.Items.Add.ImageIndex := -1; + end; + finally + ListView.Items.EndUpdate; + end; + { Work around a strange TListView bug(?). Without this, the column header + isn't painted properly. } + if HandleAllocated then + SetWindowPos(ListView.Handle, 0, 0, 0, 0, 0, SWP_FRAMECHANGED or + SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER); + finally + Dec(FRebuildingList); + end; +end; + +procedure TTBItemEditForm.SelectInObjectInspector(AList: TList); +var + CompList1, CompList2: TDesignerSelectionList; + I: Integer; + C: TComponent; +begin + { Designer.SetSelections will make components appear selected on the form. + It will also select the component in Object Inspector, but only if the + form has the focus. TDesignWindow.SetSelection will select the component + in Object Inspector regardless of whether the form has the focus. } + CompList1 := CreateSelectionList; + CompList2 := CreateSelectionList; + for I := 0 to AList.Count-1 do begin + C := TComponent(AList[I]); + { Must check for csDestroying. If SetSelection is passed a component that's + destroying, Delphi will crash. } + if not(csDestroying in C.ComponentState) then begin + CompList1.Add(C); + CompList2.Add(C); + end; + end; + if CompList1.Count = 0 then begin + {$IFNDEF JR_D6} + CompList1.Free; + CompList2.Free; + {$ENDIF} + end + else begin + Designer.SetSelections(CompList1); + { Note: Never pass an empty list to SetSelection or Delphi will crash } + { History here: + - 1.34: SetSelection call remarked out because it fixed Delphi 6 issue + with random AV's after the editor was closed. + - 1.38: SetSelection call restored because without it, Ctrl+X/C/V didn't + work. + - 1.40: SetSelection call disabled on Delphi 6 only because AV problem + still seems to exist despite another change which I thought fixed it. + On D6 it isn't necessary to call SetSelection for Ctrl+X/C/V to work. + Note: Using "ComponentDesigner.SetSelection(Designer, nil, CompList2);" + instead seems to fix the AV problem, but for consistency with Delphi's + TMainMenu editor (which only selects items when its parent form is + focused), I decided not to call SetSelection at all on D6. + } + {$IFNDEF JR_D6} + SetSelection(CompList2); + {$ENDIF} + end; +end; + +procedure TTBItemEditForm.GetSelItemList(const AList: TList); +var + ListItem: TListItem; +begin + ListItem := nil; + while True do begin + ListItem := ListView.GetNextItem(ListItem, sdAll, [isSelected]); + if ListItem = nil then + Break; + if Assigned(ListItem.Data) then + AList.Add(ListItem.Data); + end; +end; + +procedure TTBItemEditForm.SetSelParentItem(ASelParentItem: TTBCustomItem); +{ - Rebuilds the list view to match a new selection (ASelParentItem) in the + tree view + - Updates toolbar + - Selects selected item(s) into Object Inspector } +var + I: Integer; + TreeNode: TTreeNode; + ItemIsSelected: Boolean; + List: TList; +begin + if FSettingSel > 0 then + Exit; + List := TList.Create; + Inc(FSettingSel); + try + if FSelParentItem <> ASelParentItem then begin + FSelParentItem := ASelParentItem; + NewSubmenuButton.Enabled := Assigned(ASelParentItem); + NewItemButton.Enabled := Assigned(ASelParentItem); + NewSepButton.Enabled := Assigned(ASelParentItem); + for I := 0 to MoreMenu.Count-1 do + MoreMenu[I].Enabled := Assigned(ASelParentItem); + if not Assigned(TreeView.Selected) or (TreeView.Selected.Data <> FSelParentItem) then begin + if FSelParentItem = nil then + TreeView.Selected := nil + else begin + TreeNode := TreeView.Items.GetFirstNode; + while Assigned(TreeNode) do begin + if TreeNode.Data = FSelParentItem then begin + TreeView.Selected := TreeNode; + Break; + end; + TreeNode := TreeNode.GetNext; + end; + end; + end; + RebuildList; + end; + + ItemIsSelected := (ActiveControl = ListView) and Assigned(ListView.Selected) and + Assigned(ListView.Selected.Data); + if ItemIsSelected then + GetSelItemList(List); + + CutButton.Enabled := ItemIsSelected; + CopyButton.Enabled := ItemIsSelected; + PasteButton.Enabled := (ActiveControl = ListView); + DeleteButton.Enabled := ItemIsSelected or + ((ActiveControl = TreeView) and (FSelParentItem <> FRootItem)); + MoveUpButton.Enabled := ItemIsSelected and + (FSelParentItem.IndexOf(TTBCustomItem(List.First)) > 0); + MoveDownButton.Enabled := ItemIsSelected and + (FSelParentItem.IndexOf(TTBCustomItem(List.Last)) < FSelParentItem.Count-1); + + if ActiveControl = ListView then begin + if List.Count = 0 then + { No item was selected, or the blank item was selected. + Select the root item so it looks like no item was selected in + Object Inspector } + List.Add(FRootItem); + end + else if not Assigned(ASelParentItem) or (ASelParentItem = FRootItem) then + List.Add(FParentComponent) + else + List.Add(ASelParentItem); + SelectInObjectInspector(List); + finally + Dec(FSettingSel); + List.Free; + end; +end; + +procedure TTBItemEditForm.Cut; +begin + Copy; + Delete; +end; + +procedure TTBItemEditForm.Copy; +var + SelList: TList; + CompList: TDesignerSelectionList; + I: Integer; + Item: TTBCustomItem; +begin + if ListView.Selected = nil then Exit; + CompList := nil; + SelList := TList.Create; + try + GetSelItemList(SelList); + CompList := CreateSelectionList; + for I := 0 to SelList.Count-1 do begin + Item := TTBCustomItem(SelList[I]); + if Item is TTBControlItem then + raise EInvalidOperation.Create('Cannot cut or copy TTBControlItems'); + CompList.Add(Item); + end; + CopyComponents(FParentComponent.Owner, CompList); + finally + {$IFNDEF JR_D6} + CompList.Free; + {$ENDIF} + SelList.Free; + end; +end; + +procedure TTBItemEditForm.Paste; +var + CompList: TDesignerSelectionList; +begin + if FSelParentItem = nil then Exit; + CompList := CreateSelectionList; + try + PasteComponents(FParentComponent.Owner, FSelParentItem, CompList); + if CompList.Count <> 0 then + Designer.Modified; + finally + {$IFNDEF JR_D6} + CompList.Free; + {$ENDIF} + end; +end; + +procedure TTBItemEditForm.DeleteItem(const Item: TTBCustomItem); +begin + if csAncestor in Item.ComponentState then + raise EInvalidOperation.Create('Items introduced in an ancestor form cannot be deleted'); + //Designer.ValidateRename(Item, Item.Name, ''); + Item.Free; + Designer.Modified; +end; + +procedure TTBItemEditForm.Delete; +var + List: TList; + Item: TTBCustomItem; + ListItem: TListItem; +begin + List := TList.Create; + try + List.Add(FSelParentItem); + SelectInObjectInspector(List); + finally + List.Free; + end; + FSelParentItem.ViewBeginUpdate; + try + while Assigned(ListView.Selected) do begin + Item := TTBCustomItem(ListView.Selected.Data); + if Item = nil then + Break; + DeleteItem(Item); + end; + finally + FSelParentItem.ViewEndUpdate; + end; + { After deleting the items, select the item with the focus } + ListItem := ListView.GetNextItem(nil, sdAll, [isFocused]); + if Assigned(ListItem) then + ListItem.Selected := True; +end; + +procedure TTBItemEditForm.MoveItem(CurIndex, NewIndex: Integer); +var + WasFocused: Boolean; +begin + WasFocused := ListView.Items[CurIndex].Focused; + + FSelParentItem.Move(CurIndex, NewIndex); + Designer.Modified; + + if WasFocused then + ListView.Items[NewIndex].Focused := True; + ListView.Items[NewIndex].Selected := True; +end; + +procedure TTBItemEditForm.TreeViewChange(Sender: TObject; Node: TTreeNode); +var + NewSelectedParentItem: TTBCustomItem; +begin + if (FRebuildingTree > 0) or (FSettingSel > 0) then Exit; + if Node = nil then + NewSelectedParentItem := nil + else + NewSelectedParentItem := TTBCustomItem(Node.Data); + SetSelParentItem(NewSelectedParentItem); +end; + +procedure TTBItemEditForm.TreeViewEnter(Sender: TObject); +{ When the tree view gets the focus, act as if the currently selected item + was clicked. } +begin + ListView.Selected := nil; + SetSelParentItem(FSelParentItem); +end; + +procedure TTBItemEditForm.CMDeferUpdate(var Message: TMessage); +begin + SetSelParentItem(FSelParentItem); +end; + +procedure TTBItemEditForm.ListViewChange(Sender: TObject; Item: TListItem; + Change: TItemChange); +var + Msg: TMsg; +begin + if (FRebuildingList > 0) or (FSettingSel > 0) or (Change <> ctState) or + (csDestroying in ListView.ComponentState) then + Exit; + if not PeekMessage(Msg, Handle, CM_DEFERUPDATE, CM_DEFERUPDATE, + PM_NOREMOVE or PM_NOYIELD) then + PostMessage(Handle, CM_DEFERUPDATE, 0, 0); +end; + +procedure TTBItemEditForm.ListViewEnter(Sender: TObject); +begin + { When list view gets the focus, update the toolbar } + SetSelParentItem(FSelParentItem); +end; + +procedure TTBItemEditForm.ListViewDblClick(Sender: TObject); +var + SelItem: TTBCustomItem; + PropCount, I: Integer; + Props: {$IFNDEF CLR} PPropList {$ELSE} TPropList {$ENDIF}; + PropInfo: {$IFNDEF CLR} PPropInfo {$ELSE} TPropInfo {$ENDIF}; + MethodName: String; + Method: TMethod; +begin + SelItem := nil; + if Assigned(ListView.Selected) then + SelItem := TTBCustomItem(ListView.Selected.Data); + if SelItem = nil then Exit; + if IsSubmenuItem(SelItem) then begin + SetSelParentItem(SelItem); + Exit; + end; + {$IFNDEF CLR} + PropCount := GetPropList(SelItem.ClassInfo, [tkMethod], nil); + GetMem(Props, PropCount * SizeOf(PPropInfo)); + try + GetPropList(SelItem.ClassInfo, [tkMethod], Props); + {$ELSE} + Props := GetPropList(SelItem.ClassInfo, [tkMethod]); + PropCount := Length(Props); + {$ENDIF} + for I := PropCount-1 downto 0 do begin + PropInfo := Props[I]; + {$IFNDEF CLR} + if CompareText(String(PropInfo.Name), 'OnClick') = 0 then begin + {$ELSE} + if SameText(PropInfo.Name, 'OnClick', loInvariantLocale) then begin + {$ENDIF} + Method := GetMethodProp(SelItem, PropInfo); + MethodName := Designer.GetMethodName(Method); + if MethodName = '' then begin + MethodName := SelItem.Name + 'Click'; + Method := Designer.CreateMethod(MethodName, GetTypeData( + {$IFNDEF CLR} PropInfo.PropType^ {$ELSE} PropInfo.TypeInfo {$ENDIF})); + SetMethodProp(SelItem, PropInfo, Method); + Designer.Modified; + end; + if Designer.MethodExists(MethodName) then + Designer.ShowMethod(MethodName); + Break; + end; + end; + {$IFNDEF CLR} + finally + FreeMem(Props); + end; + {$ENDIF} +end; + +procedure TTBItemEditForm.ListViewKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); +begin + case Key of + VK_RETURN: begin + Key := 0; + ActivateInspector(#0); + end; + VK_INSERT: begin + Key := 0; + if ssCtrl in Shift then + NewSubmenuButtonClick(Sender) + else + NewItemButtonClick(Sender); + end; + VK_DELETE: begin + Key := 0; + Delete; + end; + end; +end; + +procedure TTBItemEditForm.TreeViewKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); +begin + case Key of + VK_RETURN: begin + Key := 0; + ActivateInspector(#0); + end; + VK_DELETE: begin + Key := 0; + DeleteButtonClick(Sender); + end; + end; +end; + +procedure TTBItemEditForm.TreeViewKeyPress(Sender: TObject; var Key: Char); +begin + if (Key >= #33) and (Key <= #126) then begin + ActivateInspector(Key); + Key := #0; + end + else if Key = #13 then + Key := #0; { suppress beep } +end; + +procedure TTBItemEditForm.ListViewKeyPress(Sender: TObject; var Key: Char); +begin + if Key = '-' then begin + NewSepButtonClick(Sender); + Key := #0; + end + else if (Key >= #33) and (Key <= #126) then begin + ActivateInspector(Key); + Key := #0; + end; +end; + +procedure TTBItemEditForm.ListViewDragOver(Sender, Source: TObject; X, + Y: Integer; State: TDragState; var Accept: Boolean); +{ List item dragged over the list view } +var + Item: TListItem; +begin + Accept := False; + if (Sender = ListView) and (Source = ListView) and (ListView.SelCount = 1) then begin + Item := ListView.GetItemAt(X, Y); + if Assigned(Item) and (Item <> ListView.Selected) then + Accept := True; + end; +end; + +procedure TTBItemEditForm.ListViewDragDrop(Sender, Source: TObject; X, + Y: Integer); +{ List item dropped onto another list item } +var + ListItem: TListItem; + Item: TTBCustomItem; + NewIndex: Integer; +begin + if (Sender = ListView) and (Source = ListView) and (ListView.SelCount = 1) then begin + ListItem := ListView.GetItemAt(X, Y); + if Assigned(ListItem) and (ListItem <> ListView.Selected) and Assigned(FSelParentItem) then begin + NewIndex := FSelParentItem.IndexOf(TTBCustomItem(ListItem.Data)); + if NewIndex <> -1 then begin + ListView.Items.BeginUpdate; + { For good performance and to prevent Object Inspector flicker, increment + FSettingSel to prevent calls to SetSelParentItem while moving items } + Inc(FSettingSel); + try + Item := TTBCustomItem(ListView.Selected.Data); + MoveItem(FSelParentItem.IndexOf(Item), NewIndex); + finally + Dec(FSettingSel); + ListView.Items.EndUpdate; + end; + { After decrementing FSettingSel, now call SetSelParentItem, to update + the toolbar buttons } + SetSelParentItem(FSelParentItem); + end; + end; + end; +end; + +function TTBItemEditForm.TreeViewDragHandler(Sender, Source: TObject; + X, Y: Integer; Drop: Boolean): Boolean; +var + Node: TTreeNode; + ListItem: TListItem; + Item, NewParentItem: TTBCustomItem; + ItemList: TList; + I: Integer; + NeedRebuildTree: Boolean; +begin + Result := False; + if (Sender = TreeView) and (Source = ListView) then begin + Node := TreeView.GetNodeAt(X, Y); + if Assigned(Node) and (Node <> TreeView.Selected) then begin + NewParentItem := TTBCustomItem(Node.Data); + ItemList := TList.Create; + try + ListItem := nil; + while True do begin + ListItem := ListView.GetNextItem(ListItem, sdAll, [isSelected]); + if ListItem = nil then + Break; + Item := TTBCustomItem(ListItem.Data); + if Assigned(Item) and (Item <> NewParentItem) and + not Item.ContainsItem(NewParentItem) and + not(Item is TTBControlItem) then begin + Result := True; + ItemList.Add(Item); + end; + end; + if Drop then begin + NeedRebuildTree := False; + for I := 0 to ItemList.Count-1 do begin + Item := TTBCustomItem(ItemList[I]); + Item.Parent.Remove(Item); + NewParentItem.Add(Item); + Designer.Modified; + if IsSubmenuItem(Item) then + NeedRebuildTree := True; + end; + if NeedRebuildTree then + RebuildTree; + end; + finally + ItemList.Free; + end; + end; + end; +end; + +procedure TTBItemEditForm.TreeViewDragOver(Sender, Source: TObject; X, + Y: Integer; State: TDragState; var Accept: Boolean); +{ List item dragged over the tree view } +begin + Accept := TreeViewDragHandler(Sender, Source, X, Y, False); +end; + +procedure TTBItemEditForm.TreeViewDragDrop(Sender, Source: TObject; X, + Y: Integer); +{ List item dropped onto the tree view } +begin + TreeViewDragHandler(Sender, Source, X, Y, True); +end; + +procedure TTBItemEditForm.CreateNewItem(const AClass: TTBCustomItemClass); +var + NewIndex: Integer; + NewItem: TTBCustomItem; + ListItem: TListItem; +begin + if FSelParentItem = nil then Exit; + NewIndex := -1; + if (GetKeyState(VK_SHIFT) >= 0) and Assigned(ListView.Selected) then + NewIndex := FSelParentItem.IndexOf(TTBCustomItem(ListView.Selected.Data)); + if NewIndex = -1 then + NewIndex := FSelParentItem.Count; + NewItem := AClass.Create(FParentComponent.Owner{Designer.Form}); + try + NewItem.Name := Designer.UniqueName(NewItem.ClassName); + FSelParentItem.Insert(NewIndex, NewItem); + except + NewItem.Free; + raise; + end; + Designer.Modified; + ListView.Selected := nil; + ListItem := ListView.FindData(0, NewItem, True, False); + if Assigned(ListItem) then begin + ListItem.Selected := True; + ListItem.Focused := True; + ListItem.MakeVisible(False); + ListView.SetFocus; + end; +end; + +procedure TTBItemEditForm.NewSubmenuButtonClick(Sender: TObject); +begin + CreateNewItem(TTBSubmenuItem); +end; + +procedure TTBItemEditForm.NewItemButtonClick(Sender: TObject); +begin + CreateNewItem(TTBItem); +end; + +procedure TTBItemEditForm.NewSepButtonClick(Sender: TObject); +begin + CreateNewItem(TTBSeparatorItem); +end; + +procedure TTBItemEditForm.MoreItemClick(Sender: TObject); +begin + CreateNewItem(TTBCustomItemClass((Sender as TTBItem).Tag)); +end; + +procedure TTBItemEditForm.CutButtonClick(Sender: TObject); +begin + Cut; +end; + +procedure TTBItemEditForm.CopyButtonClick(Sender: TObject); +begin + Copy; +end; + +procedure TTBItemEditForm.PasteButtonClick(Sender: TObject); +begin + Paste; +end; + +procedure TTBItemEditForm.DeleteButtonClick(Sender: TObject); +begin + if ActiveControl = ListView then + Delete + else if (ActiveControl = TreeView) and (FSelParentItem <> FRootItem) then + DeleteItem(FSelParentItem); +end; + +procedure TTBItemEditForm.MoveUpButtonClick(Sender: TObject); +var + SelList: TList; + I, J: Integer; + Item: TTBCustomItem; + ListItem: TListItem; +begin + if FSelParentItem = nil then Exit; + SelList := TList.Create; + try + GetSelItemList(SelList); + if SelList.Count = 0 then Exit; + + ListView.Items.BeginUpdate; + FSelParentItem.ViewBeginUpdate; + { For good performance and to prevent Object Inspector flicker, increment + FSettingSel to prevent calls to SetSelParentItem while moving items } + Inc(FSettingSel); + try + for I := 0 to SelList.Count-1 do begin + Item := TTBCustomItem(SelList[I]); + J := FSelParentItem.IndexOf(Item); + if J <> -1 then + MoveItem(J, J-1); + end; + ListItem := ListView.FindData(0, SelList[0], True, False); + if Assigned(ListItem) then + ListItem.MakeVisible(False); + finally + Dec(FSettingSel); + FSelParentItem.ViewEndUpdate; + ListView.Items.EndUpdate; + end; + { After decrementing FSettingSel, now call SetSelParentItem, to update + the toolbar buttons } + SetSelParentItem(FSelParentItem); + finally + SelList.Free; + end; +end; + +procedure TTBItemEditForm.MoveDownButtonClick(Sender: TObject); +var + SelList: TList; + I, J: Integer; + Item: TTBCustomItem; + ListItem: TListItem; +begin + if FSelParentItem = nil then Exit; + SelList := TList.Create; + try + GetSelItemList(SelList); + if SelList.Count = 0 then Exit; + + ListView.Items.BeginUpdate; + FSelParentItem.ViewBeginUpdate; + { For good performance and to prevent Object Inspector flicker, increment + FSettingSel to prevent calls to SetSelParentItem while moving items } + Inc(FSettingSel); + try + for I := SelList.Count-1 downto 0 do begin + Item := TTBCustomItem(SelList[I]); + J := FSelParentItem.IndexOf(Item); + if J <> -1 then + MoveItem(J, J+1); + end; + ListItem := ListView.FindData(0, SelList[SelList.Count-1], True, False); + if Assigned(ListItem) then + ListItem.MakeVisible(False); + finally + Dec(FSettingSel); + FSelParentItem.ViewEndUpdate; + ListView.Items.EndUpdate; + end; + { After decrementing FSettingSel, now call SetSelParentItem, to update + the toolbar buttons } + SetSelParentItem(FSelParentItem); + finally + SelList.Free; + end; +end; + +procedure TTBItemEditForm.TConvertMenuClick(Sender: TObject); +begin + if FSelParentItem = nil then Exit; + DoConvert(FSelParentItem, FParentComponent.Owner); +end; + + +{ TTBItemsEditor } + +procedure TTBItemsEditor.Edit; +var + Item: TTBCustomItem; +begin + if Assigned(Component) then begin + Item := TBGetItems(Component); + if Assigned(Item) then + ShowEditForm(Component, Item, Designer); + end; +end; + +procedure TTBItemsEditor.ExecuteVerb(Index: Integer); +begin + case Index of + 0: Edit; + 1: ShowVersion; + end; +end; + +function TTBItemsEditor.GetVerbCount: Integer; +begin + Result := 2; +end; + +function TTBItemsEditor.GetVerb(Index: Integer): String; +begin + case Index of + 0: Result := 'Edit...'; + 1: Result := 'Version...'; + else + Result := ''; + end; +end; + + +{ TTBItemsPropertyEditor } + +procedure TTBItemsPropertyEditor.Edit; +var + Editor: {$IFDEF JR_D6} IComponentEditor {$ELSE} TComponentEditor {$ENDIF}; +begin + if PropCount <> 1 then Exit; + Editor := GetComponentEditor(GetComponent(0) as TComponent, Designer); + try + Editor.Edit; + finally + {$IFNDEF JR_D6} + Editor.Free; + {$ENDIF} + end; +end; + +function TTBItemsPropertyEditor.GetAttributes: TPropertyAttributes; +begin + Result := inherited GetAttributes + [paDialog, paReadOnly]; +end; + +function TTBItemsPropertyEditor.GetValue: String; +begin + Result := '(TB2000 Items)'; +end; + +initialization + ItemImageList := TImageList.Create(nil); + {$IFNDEF CLR} + ItemImageList.Handle := ImageList_LoadImage(HInstance, 'TB2_DSGNEDITORIMAGES', + 16, 0, clFuchsia, IMAGE_BITMAP, 0); + {$ELSE} + { Initialize the image list as plain ILC_COLOR (4-bit), because on Windows + 2000, at color depths > 16 (what TImageList's ILC_COLORDDB would give us + when running on a true-color display), selected images are drawn with an + ugly dithering effect } + ItemImageList.Handle := ImageList_Create(16, 16, ILC_COLOR or ILC_MASK, 4, 4); + LoadItemImage(Assembly.GetExecutingAssembly, 'TB2DsgnEditorImages.bmp'); + {$ENDIF} + ItemClasses := TList.Create; + {$IFNDEF CLR} + AddModuleUnloadProc(UnregisterModuleItemClasses); + {$ENDIF} +finalization + {$IFNDEF CLR} + RemoveModuleUnloadProc(UnregisterModuleItemClasses); + {$ENDIF} + FreeItemClasses; + FreeAndNil(ItemImageList); +end. diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnItemEditor.res b/official/2.2.2+2.4.2/TB2K/Source/TB2DsgnItemEditor.res new file mode 100644 index 0000000000000000000000000000000000000000..938763ea4eb730d48f3bdec584a4c6e0b8f5642e GIT binary patch literal 2520 zcmd5;v2GJV5FIdz3uHN;KuH-Pq)<>8WGf(XIYfvkp>l1>mY}n{xPwojr|~CjaqaXe zU08A&YxCaB?VZn-6$ubzq`ldl-Ff%+?cUfTB2Um_^oDN3t{;iKK_te9@=;#PGx;oi zxsWqCmjQZj5zXZTd?v3D9bhim$#Lq5JVo~h8bc2Rps<-c>o*@WOd>Lyxx*7(w3#dx z3rvtKU37=1^N*tc-1_N_eOek+{;OFvY<9v1W2R+VXjWvZK_rhcuA1vGx|zeS_QGlq z7G|E|WQA(`^fU)9aYQ+}AkGvkL-{jdo*nKB^g1QsD4w&MXG z*a=pY`$_xT!bt$`Yd&#BI@;lTS|cdm9&vm~=RG>SLS0#6A504!?z=t0b!(H4`gte3 znh)n{qdIn8%cTc{3Dg=tmY-weqvebJKHBlD>-@48?EZA2^Ris-IN0s4>LTxD?FV?~ zxQrX9QBFDzwv#@G{iMGTxyB2hqj|k##Y|O_m2!Y8>9$)Nj}d08YGb)>-_1}65k)OD zhbOvL7g-;Ft2WwM;9I%kWuL+`K)<}hr*&l>OVs@PK^3XZ3o^9d5^8gXUyfWZ<-Prm z)ar=b3w>-qbJaEX_pSEacDzyj)A=2xsL#uWJ{k16ly^|)0=K7mgYJn&J9|h&d~HEH zq2s=TK?s5X4V5aO%D6A%Deo>%je0v8@n6U%v~&C)$*s5jrTuT63e;5=)?&S0v)&ie g>2y+$i@uMG$;8$bD_>tOEBc;xV7f;2Y)x;w1>5{Q8vp Value then begin + for I := 0 to FClients.Count - 1 do + if TBasicActionLink(FClients[I]) is TTBEditItemActionLink then + TTBEditItemActionLink(FClients[I]).SetEditCaption(Value); + FEditCaption := Value; + Change; + end; +end; + +procedure TTBEditAction.SetEditOptions(Value: TTBEditItemOptions); +var + I: Integer; +begin + if FEditOptions <> Value then begin + for I := 0 to FClients.Count - 1 do + if TBasicActionLink(FClients[I]) is TTBEditItemActionLink then + TTBEditItemActionLink(FClients[I]).SetEditOptions(Value); + FEditOptions := Value; + Change; + end; +end; + +procedure TTBEditAction.SetEditWidth(Value: Integer); +var + I: Integer; +begin + if FEditWidth <> Value then begin + for I := 0 to FClients.Count - 1 do + if TBasicActionLink(FClients[I]) is TTBEditItemActionLink then + TTBEditItemActionLink(FClients[I]).SetEditWidth(Value); + FEditWidth := Value; + Change; + end; +end; + +procedure TTBEditAction.SetOnAcceptText(Value: TTBAcceptTextEvent); +var + I: Integer; +begin + {$IFNDEF CLR} + if not MethodsEqual(TMethod(FOnAcceptText), TMethod(Value)) then begin + {$ELSE} + if @FOnAcceptText <> @Value then begin + {$ENDIF} + for I := 0 to FClients.Count - 1 do + if TBasicActionLink(FClients[I]) is TTBEditItemActionLink then + TTBEditItemActionLink(FClients[I]).SetOnAcceptText(Value); + FOnAcceptText := Value; + Change; + end; +end; + +procedure TTBEditAction.SetText(Value: String); +var + I: Integer; +begin + if FText <> Value then begin + for I := 0 to FClients.Count - 1 do + if TBasicActionLink(FClients[I]) is TTBEditItemActionLink then + TTBEditItemActionLink(FClients[I]).SetText(Value); + FText := Value; + Change; + end; +end; + + +{ TTBEditItemActionLink } + +procedure TTBEditItemActionLink.AssignClient(AClient: TObject); +begin + FClient := AClient as TTBEditItem; +end; + +function TTBEditItemActionLink.IsEditCaptionLinked: Boolean; +begin + if Action is TTBEditAction then + Result := TTBEditItem(FClient).EditCaption = TTBEditAction(Action).EditCaption + else + Result := False; +end; + +function TTBEditItemActionLink.IsEditOptionsLinked: Boolean; +begin + if Action is TTBEditAction then + Result := TTBEditItem(FClient).EditOptions = TTBEditAction(Action).EditOptions + else + Result := False; +end; + +function TTBEditItemActionLink.IsEditWidthLinked: Boolean; +begin + if Action is TTBEditAction then + Result := TTBEditItem(FClient).EditWidth = TTBEditAction(Action).EditWidth + else + Result := False; +end; + +function TTBEditItemActionLink.IsOnAcceptTextLinked: Boolean; +begin + if Action is TTBEditAction then + {$IFNDEF CLR} + Result := MethodsEqual(TMethod(TTBEditItem(FClient).OnAcceptText), + TMethod(TTBEditAction(Action).OnAcceptText)) + {$ELSE} + Result := @TTBEditItem(FClient).OnAcceptText = @TTBEditAction(Action).OnAcceptText + {$ENDIF} + else + Result := False; +end; + +function TTBEditItemActionLink.IsTextLinked: Boolean; +begin + if Action is TTBEditAction then + Result := TTBEditItem(FClient).Text = TTBEditAction(Action).Text + else + Result := False; +end; + +procedure TTBEditItemActionLink.SetEditCaption(const Value: String); +begin + if IsEditCaptionLinked then TTBEditItem(FClient).EditCaption := Value; +end; + +procedure TTBEditItemActionLink.SetEditOptions(Value: TTBEditItemOptions); +begin + if IsEditOptionsLinked then TTBEditItem(FClient).EditOptions := Value; +end; + +procedure TTBEditItemActionLink.SetEditWidth(const Value: Integer); +begin + if IsEditWidthLinked then TTBEditItem(FClient).EditWidth := Value; +end; + +procedure TTBEditItemActionLink.SetOnAcceptText(Value: TTBAcceptTextEvent); +begin + if IsOnAcceptTextLinked then TTBEditItem(FClient).OnAcceptText := Value; +end; + +procedure TTBEditItemActionLink.SetText(const Value: String); +begin + if IsTextLinked then TTBEditItem(FClient).Text := Value; +end; + + +{ TTBEditItem } + +constructor TTBEditItem.Create(AOwner: TComponent); +begin + inherited; + FEditOptions := EditItemDefaultEditOptions; + FEditWidth := EditItemDefaultEditWidth; +end; + +procedure TTBEditItem.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + inherited; + if Action is TTBEditAction then + with TTBEditAction(Sender) do + begin + if not CheckDefaults or (Self.EditCaption = '') then + Self.EditCaption := EditCaption; + if not CheckDefaults or (Self.EditOptions = []) then + Self.EditOptions := EditOptions; + if not CheckDefaults or (Self.Text = '') then + Self.Text := Text; + if not CheckDefaults or not Assigned(Self.OnAcceptText) then + Self.OnAcceptText := OnAcceptText; + end; +end; + +function TTBEditItem.GetActionLinkClass: TTBCustomItemActionLinkClass; +begin + Result := TTBEditItemActionLink; +end; + +function TTBEditItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + if not(tboUseEditWhenVertical in EditOptions) and + (AView.Orientation = tbvoVertical) then + Result := inherited GetItemViewerClass(AView) + else + Result := TTBEditItemViewer; +end; + +function TTBEditItem.NeedToRecreateViewer(AViewer: TTBItemViewer): Boolean; +begin + Result := GetItemViewerClass(AViewer.View) <> AViewer.ClassType; +end; + +procedure TTBEditItem.Clear; +begin + Text := ''; +end; + +procedure TTBEditItem.Click; +begin + inherited; +end; + +procedure TTBEditItem.DoBeginEdit(Viewer: TTBEditItemViewer); +begin + if Assigned(FOnBeginEdit) then + FOnBeginEdit(Self, Viewer, Viewer.EditControl); +end; + +function TTBEditItem.IsEditOptionsStored: Boolean; +begin + Result := (EditOptions <> EditItemDefaultEditOptions) and + ((ActionLink = nil) or not(ActionLink is TTBEditItemActionLink) or + not TTBEditItemActionLink(ActionLink).IsEditOptionsLinked); +end; + +function TTBEditItem.IsEditCaptionStored: Boolean; +begin + Result := (ActionLink = nil) or not(ActionLink is TTBEditItemActionLink) or + not TTBEditItemActionLink(ActionLink).IsEditCaptionLinked; +end; + +function TTBEditItem.IsEditWidthStored: Boolean; +begin + Result := (EditWidth <> EditItemDefaultEditWidth) and + ((ActionLink = nil) or not(ActionLink is TTBEditItemActionLink) or + not TTBEditItemActionLink(ActionLink).IsEditWidthLinked); +end; + +function TTBEditItem.IsTextStored: Boolean; +begin + Result := (ActionLink = nil) or not(ActionLink is TTBEditItemActionLink) or + not TTBEditItemActionLink(ActionLink).IsTextLinked; +end; + +procedure TTBEditItem.SetCharCase(Value: TEditCharCase); +begin + if FCharCase <> Value then begin + FCharCase := Value; + Text := Text; { update case } + end; +end; + +procedure TTBEditItem.SetEditOptions(Value: TTBEditItemOptions); +begin + if FEditOptions <> Value then begin + FEditOptions := Value; + Change(True); + end; +end; + +procedure TTBEditItem.SetEditCaption(Value: String); +begin + if FEditCaption <> Value then begin + FEditCaption := Value; + Change(True); + end; +end; + +procedure TTBEditItem.SetEditWidth(Value: Integer); +begin + if FEditWidth <> Value then begin + FEditWidth := Value; + Change(True); + end; +end; + +procedure TTBEditItem.SetMaxLength(Value: Integer); +begin + if FMaxLength <> Value then begin + FMaxLength := Value; + Change(False); + end; +end; + +procedure TTBEditItem.SetText(Value: String); +begin + case FCharCase of + ecUpperCase: Value := {$IFNDEF CLR} AnsiUpperCase {$ELSE} UpperCase {$ENDIF} (Value); + ecLowerCase: Value := {$IFNDEF CLR} AnsiLowerCase {$ELSE} LowerCase {$ENDIF} (Value); + end; + if FText <> Value then begin + FText := Value; + Change(False); + end; +end; + + +{ TTBEditItemViewer } + +procedure TTBEditItemViewer.EditWndProc(var Message: TMessage); +var + Item: TTBEditItem; + + procedure AcceptText; + var + S: String; + Accept: Boolean; + begin + S := FEditControl.Text; + Accept := True; + if Assigned(Item.FOnAcceptText) then + Item.FOnAcceptText(Self, S, Accept); + if Accept then + Item.Text := S; + end; + +begin + Item := TTBEditItem(Self.Item); + if Message.Msg = WM_CHAR then + case Word(Message.WParam) of + VK_TAB: begin + FEditControlStatus := [ecsAccept]; + AcceptText; + Exit; + end; + VK_RETURN: begin + FEditControlStatus := [ecsAccept, ecsClose]; + AcceptText; + Exit; + end; + VK_ESCAPE: begin + FEditControlStatus := []; + Exit; + end; + end; + TEditAccess(FEditControl).WndProc(Message); + if Message.Msg = WM_KILLFOCUS then begin + { Someone has stolen the focus from us, so 'cancel mode'. (We have to + handle WM_KILLFOCUS in addition to the upstream WM_CANCELMODE handling + since we don't always hold the mouse capture.) } + View.CancelMode; + FEditControlStatus := [ecsClose]; + end; +end; + +procedure TTBEditItemViewer.GetEditRect(var R: TRect); +var + Item: TTBEditItem; + DC: HDC; +begin + Item := TTBEditItem(Self.Item); + DC := GetDC(0); + try + SelectObject(DC, View.GetFont.Handle); + R := BoundsRect; + if not View.IsToolbar and (Item.EditCaption <> '') then begin + Inc(R.Left, GetTextWidth(DC, Item.EditCaption, True) + + EditMenuMidWidth + EditMenuTextMargin * 2); + end; + finally + ReleaseDC(0, DC); + end; +end; + +procedure TTBEditItemViewer.CalcSize(const Canvas: TCanvas; + var AWidth, AHeight: Integer); +var + Item: TTBEditItem; + DC: HDC; +begin + Item := TTBEditItem(Self.Item); + DC := Canvas.Handle; + AWidth := Item.FEditWidth; + AHeight := GetTextHeight(DC) + (EditMenuTextMargin * 2) + 1; + if not IsToolbarStyle and (Item.EditCaption <> '') then begin + Inc(AWidth, GetTextWidth(DC, Item.EditCaption, True) + EditMenuMidWidth + + EditMenuTextMargin * 2); + end; + { Review: Should the height include external leading on fonts that use it, + such as the default menu font on Windows Me Trad. Chinese? Office 2000 + seems to insist on using Tahoma on Chinese Windows, so I'm not sure how it + handles external leading on edit items. } +end; + +function TTBEditItemViewer.CaptionShown: Boolean; +begin + Result := not IsToolbarStyle and inherited CaptionShown; +end; + +function TTBEditItemViewer.GetCaptionText: String; +begin + Result := TTBEditItem(Item).EditCaption; +end; + +procedure TTBEditItemViewer.Paint(const Canvas: TCanvas; + const ClientAreaRect: TRect; IsSelected, IsPushed, UseDisabledShadow: Boolean); +const + FillColors: array[Boolean] of TColor = (clBtnFace, clWindow); + TextColors: array[Boolean] of TColor = (clGrayText, clWindowText); +var + Item: TTBEditItem; + S: String; + R: TRect; + W: Integer; +begin + Item := TTBEditItem(Self.Item); + R := ClientAreaRect; + + { Caption } + if not IsToolbarStyle and (Item.EditCaption <> '') then begin + S := Item.EditCaption; + W := GetTextWidth(Canvas.Handle, S, True) + EditMenuTextMargin * 2; + R.Right := R.Left + W; + if IsSelected then + Canvas.FillRect(R); + Inc(R.Left, EditMenuTextMargin); + DrawItemCaption(Canvas, R, S, UseDisabledShadow, DT_SINGLELINE or + DT_LEFT or DT_VCENTER); + R := ClientAreaRect; + Inc(R.Left, W + EditMenuMidWidth); + end; + + { Border } + if IsSelected and Item.Enabled then + DrawEdge(Canvas.Handle, R, BDR_SUNKENOUTER, BF_RECT); + InflateRect(R, -1, -1); + Canvas.Brush.Color := FillColors[not Item.Enabled]; + Canvas.FrameRect(R); + InflateRect(R, -1, -1); + + { Fill } + Canvas.Brush.Color := FillColors[Item.Enabled]; + Canvas.FillRect(R); + InflateRect(R, -1, -1); + + { Text } + if Item.Text <> '' then begin + S := Item.Text; + Canvas.Brush.Style := bsClear; { speed optimization } + Canvas.Font.Color := TextColors[Item.Enabled]; + DrawTextStr(Canvas.Handle, S, R, DT_SINGLELINE or DT_NOPREFIX); + end; +end; + +procedure TTBEditItemViewer.GetCursor(const Pt: TPoint; var ACursor: HCURSOR); +var + R: TRect; +begin + if not Item.Enabled then + Exit; + GetEditRect(R); + OffsetRect(R, -BoundsRect.Left, -BoundsRect.Top); + InflateRect(R, -2, -2); + if PtInRect(R, Pt) then + ACursor := LoadCursor(0, IDC_IBEAM); +end; + +function TTBEditItemViewer.EditLoop(const CapHandle: HWND): Boolean; + + procedure ControlMessageLoop; + + function PointInWindow(const Wnd: HWND; const P: TPoint): Boolean; + var + W: HWND; + begin + Result := False; + W := WindowFromPoint(P); + if W = 0 then Exit; + if W = Wnd then + Result := True + else + if IsChild(Wnd, W) then + Result := True; + end; + + function ContinueLoop: Boolean; + begin + Result := (ecsContinueLoop in FEditControlStatus) and + not View.IsModalEnding and FEditControl.Focused and Item.Enabled; + { Note: View.IsModalEnding is checked since TTBView.CancelMode doesn't + destroy popup windows; it merely hides them and calls EndModal. So if + IsModalEnding returns True we can infer that CancelMode was likely + called. } + end; + + var + Msg: TMsg; + IsKeypadDigit: Boolean; + ScanCode: Byte; + V: Integer; + begin + try + while ContinueLoop do begin + { Examine the next message before popping it out of the queue } + if not PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE) then begin + WaitMessage; + Continue; + end; + case Msg.message of + WM_SYSKEYDOWN: begin + { Exit immediately if Alt+[key] or F10 are pressed, but not + Alt+Shift, Alt+`, or Alt+[keypad digit] } + if not(Word(Msg.wParam) in [VK_MENU, VK_SHIFT, VK_HANJA]) then begin + IsKeypadDigit := False; + { This detect digits regardless of whether Num Lock is on: } + ScanCode := Byte(Msg.lParam shr 16); + if ScanCode <> 0 then + for V := VK_NUMPAD0 to VK_NUMPAD9 do + if MapVirtualKey(V, 0) = ScanCode then begin + IsKeypadDigit := True; + Break; + end; + if not IsKeypadDigit then begin + FEditControlStatus := [ecsClose]; + Exit; + end; + end; + end; + WM_SYSKEYUP: begin + { Exit when Alt is released by itself } + if Word(Msg.wParam) = VK_MENU then begin + FEditControlStatus := [ecsClose]; + Exit; + end; + end; + WM_LBUTTONDOWN, WM_LBUTTONDBLCLK, + WM_RBUTTONDOWN, WM_RBUTTONDBLCLK, + WM_MBUTTONDOWN, WM_MBUTTONDBLCLK, + WM_NCLBUTTONDOWN, WM_NCLBUTTONDBLCLK, + WM_NCRBUTTONDOWN, WM_NCRBUTTONDBLCLK, + WM_NCMBUTTONDOWN, WM_NCMBUTTONDBLCLK: begin + { If a mouse click outside the edit control is in the queue, + exit and let the upstream message loop deal with it } + if Msg.hwnd <> FEditControl.Handle then + Exit; + end; + WM_MOUSEMOVE, WM_NCMOUSEMOVE: begin + if GetCapture = CapHandle then begin + if PointInWindow(FEditControl.Handle, Msg.pt) then + ReleaseCapture; + end + else if GetCapture = 0 then begin + if not PointInWindow(FEditControl.Handle, Msg.pt) then + SetCapture(CapHandle); + end; + if GetCapture = CapHandle then + SetCursor(LoadCursor(0, IDC_ARROW)); + end; + end; + { Now pop the message out of the queue } + if not PeekMessage(Msg, 0, Msg.message, Msg.message, PM_REMOVE or PM_NOYIELD) then + Continue; + if ((Msg.message >= WM_MOUSEFIRST) and (Msg.message <= WM_MOUSELAST)) and + (Msg.hwnd = CapHandle) then + { discard, so that the selection doesn't get changed } + else begin + TranslateMessage(Msg); + DispatchMessage(Msg); + end; + end; + finally + { Make sure there are no outstanding WM_*CHAR messages } + RemoveMessages(WM_CHAR, WM_DEADCHAR); + RemoveMessages(WM_SYSCHAR, WM_SYSDEADCHAR); + end; + end; + + procedure RestoreEditControlWndProc; + {$IFNDEF CLR} + var + OrigWndProc: TWndMethod; + begin + { NOTE: We can't assign WndProc to WindowProc directly because on Delphi 4 + and 5, the compiler generates incorrect code, causing an AV at run-time } + OrigWndProc := TEditAccess(FEditControl).WndProc; + FEditControl.WindowProc := OrigWndProc; + end; + {$ELSE} + begin + IControl(FEditControl).RestoreWndProc; + end; + {$ENDIF} + +var + Item: TTBEditItem; + R: TRect; + ActiveWnd, FocusWnd: HWND; +begin + Item := TTBEditItem(Self.Item); + GetEditRect(R); + if IsRectEmpty(R) then begin + Result := False; + Exit; + end; + + ActiveWnd := GetActiveWindow; + FocusWnd := GetFocus; + + { Create the edit control } + InflateRect(R, -3, -3); + //View.FreeNotification(Self); + FEditControl := TEdit.Create(nil); + try + FEditControl.Visible := False; + FEditControl.BorderStyle := bsNone; + FEditControl.AutoSize := False; + FEditControl.Font.Assign(View.GetFont); + FEditControl.Text := Item.Text; + FEditControl.CharCase := Item.FCharCase; + FEditControl.MaxLength := Item.FMaxLength; + FEditControl.BoundsRect := R; + FEditControl.WindowProc := EditWndProc; + FEditControl.ParentWindow := View.Window.Handle; + FEditControl.SelectAll; + Item.DoBeginEdit(Self); + FEditControl.Visible := True; + FEditControl.SetFocus; + if GetActiveWindow <> ActiveWnd then + { don't gray out title bar of old active window } + SendMessage(ActiveWnd, WM_NCACTIVATE, 1, 0) + else + ActiveWnd := 0; + + FEditControlStatus := [ecsContinueLoop]; + ControlMessageLoop; + finally + { Restore the original window procedure before destroying the control so + it doesn't see a WM_KILLFOCUS message } + RestoreEditControlWndProc; + FreeAndNil(FEditControl); + end; + + { ensure the area underneath the edit control is repainted immediately } + View.Window.Update; + { If app is still active, set focus to previous control and restore capture + to CapHandle if another control hasn't taken it } + if GetActiveWindow <> 0 then begin + SetFocus(FocusWnd); + if GetCapture = 0 then + SetCapture(CapHandle); + end; + if ActiveWnd <> 0 then + SendMessage(ActiveWnd, WM_NCACTIVATE, Ord(GetActiveWindow = ActiveWnd), 0); + { The SetFocus call above can change the Z order of windows. If the parent + window is a popup window, reassert its topmostness. } + if View.Window is TTBPopupWindow then + SetWindowPos(View.Window.Handle, HWND_TOPMOST, 0, 0, 0, 0, + SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE); + { Send an MSAA "focus" event now that we're returning to the regular modal loop } + View.NotifyFocusEvent; + + Result := ecsClose in FEditControlStatus; + if not Result and (GetCapture = CapHandle) then begin + if ecsAccept in FEditControlStatus then + { if we are accepting but not closing, Tab must have been pressed } + View.Selected := View.NextSelectable(View.Selected, + GetKeyState(VK_SHIFT) >= 0); + end; +end; + +function TTBEditItemViewer.DoExecute: Boolean; +begin + { Close any delay-close popup menus before entering the edit loop } + View.CancelChildPopups; + Result := False; + if EditLoop(View.GetCaptureWnd) then begin + View.EndModal; + if ecsAccept in FEditControlStatus then + Result := True; + end; +end; + +procedure TTBEditItemViewer.MouseBeginEdit; +begin + if Item.Enabled then + Execute(True) + else begin + if (View.ParentView = nil) and not View.IsPopup then + View.EndModal; + end; +end; + +procedure TTBEditItemViewer.MouseDown(Shift: TShiftState; X, Y: Integer; + var MouseDownOnMenu: Boolean); +begin + if IsPtInButtonPart(X, Y) then { for TBX... } + MouseBeginEdit + else + inherited; +end; + +procedure TTBEditItemViewer.MouseUp(X, Y: Integer; MouseWasDownOnMenu: Boolean); +begin + if IsPtInButtonPart(X, Y) then { for TBX... } + MouseBeginEdit + else + inherited; +end; + +function TTBEditItemViewer.UsesSameWidth: Boolean; +begin + Result := False; +end; + +function TTBEditItemViewer.GetAccRole: Integer; +const + ROLE_SYSTEM_TEXT = $2a; { from OleAcc.h } +begin + Result := ROLE_SYSTEM_TEXT; +end; + +function TTBEditItemViewer.GetAccValue(var Value: WideString): Boolean; +begin + Value := TTBEditItem(Item).Text; + Result := True; +end; + + +{ TTBToolbarVisibilityItem } + +procedure TTBVisibilityToggleItem.Click; +begin + if Assigned(FControl) then + FControl.Visible := not FControl.Visible; + inherited; +end; + +procedure TTBVisibilityToggleItem.InitiateAction; +begin + UpdateProps; +end; + +procedure TTBVisibilityToggleItem.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if (Operation = opRemove) and (AComponent = FControl) then + Control := nil; +end; + +procedure TTBVisibilityToggleItem.SetControl(Value: TControl); +begin + if FControl <> Value then begin + FControl := Value; + if Assigned(Value) then begin + Value.FreeNotification(Self); + if (Caption = '') and not(csLoading in ComponentState) then + {$IFNDEF CLR} + Caption := TControlAccess(Value).Caption; + {$ELSE} + Caption := Value.GetText; + {$ENDIF} + end; + UpdateProps; + end; +end; + +procedure TTBVisibilityToggleItem.UpdateProps; +begin + if (ComponentState * [csDesigning, csLoading, csDestroying] = []) then + Checked := Assigned(FControl) and FControl.Visible; +end; + +end. diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2Hook.pas b/official/2.2.2+2.4.2/TB2K/Source/TB2Hook.pas new file mode 100644 index 0000000..fbc6f62 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Source/TB2Hook.pas @@ -0,0 +1,344 @@ +unit TB2Hook; + +{ + Toolbar2000 + Copyright (C) 1998-2006 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2Hook.pas,v 1.17 2006/03/12 23:11:59 jr Exp $ +} + +interface + +uses + Windows; + +type + THookProcCode = (hpSendActivate, hpSendActivateApp, hpSendWindowPosChanged, + hpPreDestroy, hpGetMessage); + THookProcCodes = set of THookProcCode; + + THookProc = procedure(Code: THookProcCode; Wnd: HWND; WParam: WPARAM; LParam: LPARAM); + +procedure InstallHookProc(AUser: TObject; AProc: THookProc; ACodes: THookProcCodes); +procedure UninstallHookProc(AUser: TObject; AProc: THookProc); + +implementation + +uses + {$IFDEF CLR} System.Runtime.InteropServices, {$ENDIF} + SysUtils, Classes, Messages, TB2Common; + +type + THookType = (htCallWndProc, htCBT, htGetMessage); + THookTypes = set of THookType; + + THookUserData = class + Prev: THookUserData; + User: TObject; + InstalledHookTypes: THookTypes; + end; + + THookProcData = class + Proc: THookProc; + Codes: THookProcCodes; + LastUserData: THookUserData; + end; + + THookInfo = class + Handles: array[THookType] of HHOOK; + Counts: array[THookType] of Longint; + end; + +threadvar + HookInfo: THookInfo; + HookProcList: TList; + + +function CallWndProcHook(Code: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; +{$IFNDEF CLR} stdcall; {$ENDIF} +type + THookProcCodeMsgs = hpSendActivate..hpSendWindowPosChanged; +const + MsgMap: array[THookProcCodeMsgs] of UINT = + (WM_ACTIVATE, WM_ACTIVATEAPP, WM_WINDOWPOSCHANGED); +var + J: THookProcCodeMsgs; + I: Integer; + CWPStruct: {$IFNDEF CLR} PCWPStruct {$ELSE} TCWPStruct {$ENDIF}; +begin + if Assigned(HookProcList) and (Code = HC_ACTION) then begin + {$IFNDEF CLR} + CWPStruct := PCWPStruct(LParam); + {$ELSE} + CWPStruct := TCWPStruct(Marshal.PtrToStructure(IntPtr(LParam), TypeOf(TCWPStruct))); + {$ENDIF} + for J := Low(J) to High(J) do + if CWPStruct.Message = MsgMap[J] then begin + for I := 0 to HookProcList.Count-1 do + try + with THookProcData(HookProcList.List[I]) do + if J in Codes then + Proc(J, CWPStruct.hwnd, CWPStruct.WParam, CWPStruct.LParam); + except + end; + Break; + end; + end; + Result := CallNextHookEx(HookInfo.Handles[htCallWndProc], Code, WParam, LParam); +end; + +function CBTHook(Code: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; +{$IFNDEF CLR} stdcall; {$ENDIF} +var + I: Integer; +begin + if Assigned(HookProcList) and (Code = HCBT_DESTROYWND) then + for I := 0 to HookProcList.Count-1 do + try + with THookProcData(HookProcList.List[I]) do + if hpPreDestroy in Codes then + Proc(hpPreDestroy, HWND(WParam), 0, 0); + except + end; + Result := CallNextHookEx(HookInfo.Handles[htCBT], Code, WParam, LParam); +end; + +function GetMessageHook(Code: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; +{$IFNDEF CLR} stdcall; {$ENDIF} +var + I: Integer; +begin + if Assigned(HookProcList) and (Code = HC_ACTION) then + for I := 0 to HookProcList.Count-1 do + try + with THookProcData(HookProcList.List[I]) do + if hpGetMessage in Codes then + Proc(hpGetMessage, 0, WParam, LParam); + except + end; + Result := CallNextHookEx(HookInfo.Handles[htGetMessage], Code, WParam, LParam); +end; + +function HookCodesToTypes(Codes: THookProcCodes): THookTypes; +const + HookCodeToType: array[THookProcCode] of THookType = + (htCallWndProc, htCallWndProc, htCallWndProc, htCBT, htGetMessage); +var + J: THookProcCode; +begin + Result := []; + for J := Low(J) to High(J) do + if J in Codes then + Include(Result, HookCodeToType[J]); +end; + +var + HookProcs: array[THookType] of TFNHookProc; +const + HookIDs: array[THookType] of Integer = + (WH_CALLWNDPROC, WH_CBT, WH_GETMESSAGE); + +procedure InstallHooks(ATypes: THookTypes; var InstalledTypes: THookTypes); +var + T: THookType; +begin + if HookInfo = nil then + HookInfo := THookInfo.Create; + + { Don't increment reference counts for hook types that were already + installed previously } + ATypes := ATypes - InstalledTypes; + + { Increment reference counts first. This should never raise an exception. } + for T := Low(T) to High(T) do + if T in ATypes then begin + Inc(HookInfo.Counts[T]); + Include(InstalledTypes, T); + end; + + { Then install the hooks } + for T := Low(T) to High(T) do + if T in InstalledTypes then begin + if HookInfo.Handles[T] = 0 then begin + { On Windows NT platforms, SetWindowsHookExW is used to work around an + apparent bug in Windows NT/2000/XP: if an 'ANSI' WH_GETMESSAGE hook + is called *before* a 'wide' WH_GETMESSAGE hook, then WM_*CHAR + messages passed to the 'wide' hook use ANSI character codes. + This is needed for compatibility with the combination of Tnt Unicode + Controls and Keyman. See "Widechar's and tb2k" thread on the + newsgroup from 2003-09-23 for more information. } + if Win32Platform = VER_PLATFORM_WIN32_NT then + HookInfo.Handles[T] := SetWindowsHookExW(HookIDs[T], HookProcs[T], + 0, GetCurrentThreadId) + else + HookInfo.Handles[T] := SetWindowsHookEx(HookIDs[T], HookProcs[T], + 0, GetCurrentThreadId); + { .NET note: A reference to the delegate passed to SetWindowsHookEx + must exist for as long as the hook is installed, otherwise the GC + will collect it and the app will crash. Hence we always pass a + global variable (HookProcs[]) to SetWindowsHookEx. } + end; + end; +end; + +procedure UninstallHooks(const ATypes: THookTypes; const Force: Boolean); +var + T: THookType; +begin + { HookInfo can be nil if InstallHooks was never called previously (e.g. when + we're being called with Force=True), or if it was called but failed with + an exception } + if HookInfo = nil then + Exit; + + { Decrement reference counts first. This should never raise an exception. } + if not Force then + for T := Low(T) to High(T) do + if T in ATypes then + Dec(HookInfo.Counts[T]); + + { Then uninstall the hooks } + for T := Low(T) to High(T) do + if T in ATypes then begin + if (Force or (HookInfo.Counts[T] = 0)) and (HookInfo.Handles[T] <> 0) then begin + UnhookWindowsHookEx(HookInfo.Handles[T]); + HookInfo.Handles[T] := 0; + end; + end; + + { If all hooks are uninstalled, free HookInfo } + for T := Low(T) to High(T) do + if (HookInfo.Counts[T] <> 0) or (HookInfo.Handles[T] <> 0) then + Exit; + FreeAndNil(HookInfo); +end; + +procedure InstallHookProc(AUser: TObject; AProc: THookProc; ACodes: THookProcCodes); +var + Found: Boolean; + I: Integer; + UserData: THookUserData; + ProcData: THookProcData; +label 1; +begin + if HookProcList = nil then + HookProcList := TList.Create; + Found := False; + UserData := nil; { avoid warning } + for I := 0 to HookProcList.Count-1 do begin + ProcData := THookProcData(HookProcList[I]); + if @ProcData.Proc = @AProc then begin + UserData := ProcData.LastUserData; + while Assigned(UserData) do begin + if UserData.User = AUser then begin + { InstallHookProc was already called for AUser/AProc. Go ahead and + call InstallHooks again just in case the hooks weren't successfully + installed last time. } + goto 1; + end; + UserData := UserData.Prev; + end; + UserData := THookUserData.Create; + UserData.Prev := ProcData.LastUserData; + UserData.User := AUser; + UserData.InstalledHookTypes := []; + ProcData.LastUserData := UserData; + Found := True; + Break; + end; + end; + if not Found then begin + UserData := THookUserData.Create; + try + UserData.Prev := nil; + UserData.User := AUser; + UserData.InstalledHookTypes := []; + HookProcList.Expand; + ProcData := THookProcData.Create; + except + UserData.Free; + raise; + end; + ProcData.Proc := AProc; + ProcData.Codes := ACodes; + ProcData.LastUserData := UserData; + HookProcList.Add(ProcData); + end; +1:InstallHooks(HookCodesToTypes(ACodes), UserData.InstalledHookTypes); +end; + +procedure UninstallHookProc(AUser: TObject; AProc: THookProc); +var + I: Integer; + ProcData: THookProcData; + NextUserData, UserData: THookUserData; + T: THookTypes; +begin + if HookProcList = nil then Exit; + for I := 0 to HookProcList.Count-1 do begin + ProcData := THookProcData(HookProcList[I]); + if @ProcData.Proc = @AProc then begin + { Locate the UserData record } + NextUserData := nil; + UserData := ProcData.LastUserData; + while Assigned(UserData) and (UserData.User <> AUser) do begin + NextUserData := UserData; + UserData := UserData.Prev; + end; + if UserData = nil then + Exit; + + { Remove record from linked list } + if NextUserData = nil then begin + { It's the last item in the list } + if UserData.Prev = nil then begin + { It's the only item in the list, so destroy the ProcData record } + HookProcList.Delete(I); + ProcData.Free; + end + else + ProcData.LastUserData := UserData.Prev; + end + else + NextUserData.Prev := UserData.Prev; + + T := UserData.InstalledHookTypes; + UserData.Free; + UninstallHooks(T, False); + Break; + end; + end; + if HookProcList.Count = 0 then + FreeAndNil(HookProcList); +end; + + +initialization + { Work around Delphi.NET 2005 bug: declaring a constant array of procedural + types crashes the compiler (see QC #10381; 2006 fixes it). So we instead + declare HookProcs as a variable, and initialize the elements here. } + HookProcs[htCallWndProc] := CallWndProcHook; + HookProcs[htCBT] := CBTHook; + HookProcs[htGetMessage] := GetMessageHook; +finalization + UninstallHooks([Low(THookType)..High(THookType)], True); +end. diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2Item.pas b/official/2.2.2+2.4.2/TB2K/Source/TB2Item.pas new file mode 100644 index 0000000..6891cdd --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Source/TB2Item.pas @@ -0,0 +1,6982 @@ +unit TB2Item; + +{ + Toolbar2000 + Copyright (C) 1998-2008 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2Item.pas,v 1.313 2008/09/19 16:35:48 jr Exp $ +} + +interface + +{$I TB2Ver.inc} +{x$DEFINE TB2K_NO_ANIMATION} + { Enabling the above define disables all menu animation. For debugging + purpose only. } +{x$DEFINE TB2K_USE_STRICT_O2K_MENU_STYLE} + { Enabling the above define forces it to use clBtnFace for the menu color + instead of clMenu, and disables the use of flat menu borders on Windows + XP with themes enabled. } + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + {$IFDEF CLR} TB2OleMarshal, {$ENDIF} + StdCtrls, CommCtrl, Menus, ActnList, ImgList, TB2Anim; + +type + TTBCustomItem = class; + TTBCustomItemClass = class of TTBCustomItem; + TTBCustomItemActionLink = class; + TTBCustomItemActionLinkClass = class of TTBCustomItemActionLink; + TTBItemViewer = class; + TTBItemViewerClass = class of TTBItemViewer; + TTBPopupWindow = class; + TTBPopupWindowClass = class of TTBPopupWindow; + TTBView = class; + + TTBDoneAction = (tbdaNone, tbdaCancel, tbdaClickItem, tbdaOpenSystemMenu, + tbdaHelpContext); + TTBDoneActionData = record + DoneAction: TTBDoneAction; + { tbdaClickItem-specific fields: } + ClickItem: TTBCustomItem; + Sound: Boolean; + { tbdaOpenSystemMenu-specific fields: } + Wnd: HWND; + Key: Word; + { tbdaHelpContext-specific fields: } + ContextID: Integer; + end; + TTBInsertItemProc = procedure(AParent: TComponent; AItem: TTBCustomItem) of object; + TTBItemChangedAction = (tbicInserted, tbicDeleting, tbicSubitemsChanged, + tbicSubitemsBeginUpdate, tbicSubitemsEndUpdate, tbicInvalidate, + tbicInvalidateAndResize, tbicRecreateItemViewers, tbicNameChanged, + tbicSubMenuImagesChanged); + TTBItemChangedProc = procedure(Sender: TTBCustomItem; Relayed: Boolean; + Action: TTBItemChangedAction; Index: Integer; Item: TTBCustomItem) of object; + TTBItemDisplayMode = (nbdmDefault, nbdmTextOnly, nbdmTextOnlyInMenus, nbdmImageAndText); + TTBItemOption = (tboDefault, tboDropdownArrow, tboImageAboveCaption, + tboLongHintInMenuOnly, tboNoAutoHint, tboNoRotation, tboSameWidth, + tboShowHint, tboToolbarStyle, tboToolbarSize); + TTBItemOptions = set of TTBItemOption; + TTBItemStyle = set of (tbisSubmenu, tbisSelectable, tbisSeparator, + tbisEmbeddedGroup, tbisClicksTransparent, tbisCombo, tbisNoAutoOpen, + tbisSubitemsEditable, tbisNoLineBreak, tbisRightAlign, tbisDontSelectFirst, + tbisRedrawOnSelChange, tbisRedrawOnMouseOverChange); + TTBPopupAlignment = (tbpaLeft, tbpaRight, tbpaCenter); + TTBPopupEvent = procedure(Sender: TTBCustomItem; FromLink: Boolean) of object; + TTBSelectEvent = procedure(Sender: TTBCustomItem; Viewer: TTBItemViewer; + Selecting: Boolean) of object; + + ETBItemError = class(Exception); + + TTBImageChangeLink = class(TChangeLink) + private + FLastWidth, FLastHeight: Integer; + end; + {$IFNDEF JR_D5} + TImageIndex = type Integer; + {$ENDIF} + + TTBCustomItem = class(TComponent) + private + FActionLink: TTBCustomItemActionLink; + FAutoCheck: Boolean; + FCaption: String; + FChecked: Boolean; + FDisplayMode: TTBItemDisplayMode; + FEnabled: Boolean; + FEffectiveOptions: TTBItemOptions; + FGroupIndex: Integer; + FHelpContext: THelpContext; + FHint: String; + FImageIndex: TImageIndex; + FImages: TCustomImageList; + FImagesChangeLink: TTBImageChangeLink; + FItems: TList; + FItemStyle: TTBItemStyle; + FLinkParents: TList; + FMaskOptions: TTBItemOptions; + FOptions: TTBItemOptions; + FInheritOptions: Boolean; + FNotifyList: TList; + FOnClick: TNotifyEvent; + FOnPopup: TTBPopupEvent; + FOnSelect: TTBSelectEvent; + FParent: TTBCustomItem; + FParentComponent: TComponent; + FRadioItem: Boolean; + FShortCut: TShortCut; + FSubMenuImages: TCustomImageList; + FSubMenuImagesChangeLink: TTBImageChangeLink; + FLinkSubitems: TTBCustomItem; + FVisible: Boolean; + + procedure DoActionChange(Sender: TObject); + function ChangeImages(var AImages: TCustomImageList; + const Value: TCustomImageList; var AChangeLink: TTBImageChangeLink): Boolean; + class procedure ClickWndProc(var Message: TMessage); {$IFDEF CLR} static; {$ENDIF} + function FindItemWithShortCut(AShortCut: TShortCut; + var ATopmostParent: TTBCustomItem): TTBCustomItem; + function FixOptions(const AOptions: TTBItemOptions): TTBItemOptions; + function GetAction: TBasicAction; + function GetCount: Integer; + function GetItem(Index: Integer): TTBCustomItem; + procedure ImageListChangeHandler(Sender: TObject); + procedure InternalNotify(Ancestor: TTBCustomItem; NestingLevel: Integer; + Action: TTBItemChangedAction; Index: Integer; Item: TTBCustomItem); + {$IFDEF JR_D6} + function IsAutoCheckStored: Boolean; + {$ENDIF} + function IsCaptionStored: Boolean; + function IsCheckedStored: Boolean; + function IsEnabledStored: Boolean; + function IsHelpContextStored: Boolean; + function IsHintStored: Boolean; + function IsImageIndexStored: Boolean; + function IsOnClickStored: Boolean; + function IsShortCutStored: Boolean; + function IsVisibleStored: Boolean; + procedure Notify(Action: TTBItemChangedAction; Index: Integer; Item: TTBCustomItem); + procedure RefreshOptions; + procedure SetAction(Value: TBasicAction); + procedure SetCaption(Value: String); + procedure SetChecked(Value: Boolean); + procedure SetDisplayMode(Value: TTBItemDisplayMode); + procedure SetEnabled(Value: Boolean); + procedure SetGroupIndex(Value: Integer); + procedure SetImageIndex(Value: TImageIndex); + procedure SetImages(Value: TCustomImageList); + procedure SetInheritOptions(Value: Boolean); + procedure SetLinkSubitems(Value: TTBCustomItem); + procedure SetMaskOptions(Value: TTBItemOptions); + procedure SetOptions(Value: TTBItemOptions); + procedure SetRadioItem(Value: Boolean); + procedure SetSubMenuImages(Value: TCustomImageList); + procedure SetVisible(Value: Boolean); + procedure SubMenuImagesChanged; + procedure TurnSiblingsOff; + protected + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); dynamic; + procedure Change(NeedResize: Boolean); virtual; + function CreatePopup(const ParentView: TTBView; const ParentViewer: TTBItemViewer; + const PositionAsSubmenu, SelectFirstItem, Customizing: Boolean; + const APopupPoint: TPoint; const Alignment: TTBPopupAlignment): TTBPopupWindow; virtual; + procedure DoPopup(Sender: TTBCustomItem; FromLink: Boolean); virtual; + procedure EnabledChanged; virtual; + function GetActionLinkClass: TTBCustomItemActionLinkClass; dynamic; + function GetChevronParentView: TTBView; virtual; + procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override; + function GetItemViewerClass(AView: TTBView): TTBItemViewerClass; virtual; + function GetPopupWindowClass: TTBPopupWindowClass; virtual; + class procedure IndexError; + procedure Loaded; override; + function NeedToRecreateViewer(AViewer: TTBItemViewer): Boolean; virtual; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + function OpenPopup(const SelectFirstItem, TrackRightButton: Boolean; + const PopupPoint: TPoint; const Alignment: TTBPopupAlignment; + const ReturnClickedItemOnly: Boolean): TTBCustomItem; + procedure RecreateItemViewers; + procedure SetChildOrder(Child: TComponent; Order: Integer); override; + procedure SetName(const NewName: TComponentName); override; + {$IFNDEF CLR} + procedure SetParentComponent(Value: TComponent); override; + {$ENDIF} + + property ActionLink: TTBCustomItemActionLink read FActionLink write FActionLink; + property ItemStyle: TTBItemStyle read FItemStyle write FItemStyle; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function HasParent: Boolean; override; + function GetParentComponent: TComponent; override; + + procedure Add(AItem: TTBCustomItem); + procedure Clear; + procedure Click; virtual; + function ContainsItem(AItem: TTBCustomItem): Boolean; + procedure Delete(Index: Integer); + function GetItemStyle: TTBItemStyle; + function GetShortCutText: String; + function IndexOf(AItem: TTBCustomItem): Integer; + procedure InitiateAction; virtual; + procedure Insert(NewIndex: Integer; AItem: TTBCustomItem); + function IsShortCut(var Message: TWMKey): Boolean; + procedure Move(CurIndex, NewIndex: Integer); + function Popup(X, Y: Integer; TrackRightButton: Boolean; + Alignment: TTBPopupAlignment = tbpaLeft; + ReturnClickedItemOnly: Boolean = False): TTBCustomItem; + procedure PostClick; + procedure RegisterNotification(ANotify: TTBItemChangedProc); + procedure Remove(Item: TTBCustomItem); + {$IFDEF CLR} + procedure SetParentComponent(Value: TComponent); override; + {$ENDIF} + procedure UnregisterNotification(ANotify: TTBItemChangedProc); + procedure ViewBeginUpdate; + procedure ViewEndUpdate; + + property Action: TBasicAction read GetAction write SetAction; + property AutoCheck: Boolean read FAutoCheck write FAutoCheck {$IFDEF JR_D6} stored IsAutoCheckStored {$ENDIF} default False; + property Caption: String read FCaption write SetCaption stored IsCaptionStored; + property Count: Integer read GetCount; + property Checked: Boolean read FChecked write SetChecked stored IsCheckedStored default False; + property DisplayMode: TTBItemDisplayMode read FDisplayMode write SetDisplayMode default nbdmDefault; + property EffectiveOptions: TTBItemOptions read FEffectiveOptions; + property Enabled: Boolean read FEnabled write SetEnabled stored IsEnabledStored default True; + property GroupIndex: Integer read FGroupIndex write SetGroupIndex default 0; + property HelpContext: THelpContext read FHelpContext write FHelpContext stored IsHelpContextStored default 0; + property Hint: String read FHint write FHint stored IsHintStored; + property ImageIndex: TImageIndex read FImageIndex write SetImageIndex stored IsImageIndexStored default -1; + property Images: TCustomImageList read FImages write SetImages; + property InheritOptions: Boolean read FInheritOptions write SetInheritOptions default True; + property Items[Index: Integer]: TTBCustomItem read GetItem; default; + property LinkSubitems: TTBCustomItem read FLinkSubitems write SetLinkSubitems; + property MaskOptions: TTBItemOptions read FMaskOptions write SetMaskOptions default []; + property Options: TTBItemOptions read FOptions write SetOptions default []; + property Parent: TTBCustomItem read FParent; + property ParentComponent: TComponent read FParentComponent write FParentComponent; + property RadioItem: Boolean read FRadioItem write SetRadioItem default False; + property ShortCut: TShortCut read FShortCut write FShortCut stored IsShortCutStored default 0; + property SubMenuImages: TCustomImageList read FSubMenuImages write SetSubMenuImages; + property Visible: Boolean read FVisible write SetVisible stored IsVisibleStored default True; + property OnClick: TNotifyEvent read FOnClick write FOnClick stored IsOnClickStored; + property OnPopup: TTBPopupEvent read FOnPopup write FOnPopup; + property OnSelect: TTBSelectEvent read FOnSelect write FOnSelect; + end; + + TTBCustomItemActionLink = class(TActionLink) + protected + FClient: TTBCustomItem; + procedure AssignClient(AClient: TObject); override; + {$IFDEF JR_D6} + function IsAutoCheckLinked: Boolean; virtual; + {$ENDIF} + function IsCaptionLinked: Boolean; override; + function IsCheckedLinked: Boolean; override; + function IsEnabledLinked: Boolean; override; + function IsHelpContextLinked: Boolean; override; + function IsHintLinked: Boolean; override; + function IsImageIndexLinked: Boolean; override; + function IsShortCutLinked: Boolean; override; + function IsVisibleLinked: Boolean; override; + function IsOnExecuteLinked: Boolean; override; + {$IFDEF JR_D6} + procedure SetAutoCheck(Value: Boolean); override; + {$ENDIF} + procedure SetCaption(const Value: String); override; + procedure SetChecked(Value: Boolean); override; + procedure SetEnabled(Value: Boolean); override; + procedure SetHelpContext(Value: THelpContext); override; + procedure SetHint(const Value: String); override; + procedure SetImageIndex(Value: Integer); override; + procedure SetShortCut(Value: TShortCut); override; + procedure SetVisible(Value: Boolean); override; + procedure SetOnExecute(Value: TNotifyEvent); override; + end; + + {$IFNDEF CLR} + TTBBaseAccObject = class(TInterfacedObject, IDispatch) + {$ELSE} + TTBBaseAccObject = class(TTBStandardOleMarshalObject) + {$ENDIF} + public + procedure ClientIsDestroying; virtual; abstract; + {$IFNDEF CLR} + { IDispatch } + function GetTypeInfoCount(out Count: Integer): HResult; stdcall; + function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall; + function GetIDsOfNames(const IID: TGUID; Names: Pointer; + NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall; + function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; + Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall; + {$ENDIF} + end; + + TTBItemViewer = class + private + FBoundsRect: TRect; + FClipped: Boolean; + FGroupLevel: Integer; + FItem: TTBCustomItem; + FOffEdge: Boolean; + FShow: Boolean; + FView: TTBView; + procedure AccSelect(const AExecute: Boolean); + function GetIndex: Integer; + protected + FAccObjectInstance: TTBBaseAccObject; + procedure CalcSize(const Canvas: TCanvas; var AWidth, AHeight: Integer); + virtual; + function CaptionShown: Boolean; dynamic; + function DoExecute: Boolean; virtual; + procedure DrawItemCaption(const Canvas: TCanvas; ARect: TRect; + const ACaption: String; ADrawDisabledShadow: Boolean; AFormat: UINT); virtual; + procedure Entering; virtual; + function GetAccRole: Integer; virtual; + function GetAccValue(var Value: WideString): Boolean; virtual; + function GetCaptionText: String; virtual; + procedure GetCursor(const Pt: TPoint; var ACursor: HCURSOR); virtual; + function GetImageList: TCustomImageList; + function ImageShown: Boolean; + function IsRotated: Boolean; + function IsToolbarSize: Boolean; + function IsPtInButtonPart(X, Y: Integer): Boolean; virtual; + procedure KeyDown(var Key: Word; Shift: TShiftState); virtual; + procedure Leaving; virtual; + procedure LosingCapture; virtual; + procedure MouseDown(Shift: TShiftState; X, Y: Integer; + var MouseDownOnMenu: Boolean); virtual; + procedure MouseMove(X, Y: Integer); virtual; + procedure MouseUp(X, Y: Integer; MouseWasDownOnMenu: Boolean); virtual; + procedure MouseWheel(WheelDelta: Integer; X, Y: Integer); virtual; + procedure Paint(const Canvas: TCanvas; const ClientAreaRect: TRect; + IsSelected, IsPushed, UseDisabledShadow: Boolean); virtual; + procedure PostAccSelect(const AExecute: Boolean); + function UsesSameWidth: Boolean; virtual; + public + State: set of (tbisInvalidated, tbisLineSep); + property BoundsRect: TRect read FBoundsRect; + property Clipped: Boolean read FClipped; + property Index: Integer read GetIndex; + property Item: TTBCustomItem read FItem; + property OffEdge: Boolean read FOffEdge; + property Show: Boolean read FShow; + property View: TTBView read FView; + constructor Create(AView: TTBView; AItem: TTBCustomItem; AGroupLevel: Integer); virtual; + destructor Destroy; override; + procedure Execute(AGivePriority: Boolean); + function GetAccObject: TTBBaseAccObject; + function GetHintText: String; + function IsAccessible: Boolean; + function IsToolbarStyle: Boolean; + function ScreenToClient(const P: TPoint): TPoint; + end; + TTBViewOrientation = (tbvoHorizontal, tbvoVertical, tbvoFloating); + TTBEnterToolbarLoopOptions = set of (tbetMouseDown, tbetExecuteSelected, + tbetFromMSAA); + TTBViewState = set of (vsModal, vsMouseInWindow, vsDrawInOrder, vsOppositePopup, + vsIgnoreFirstMouseUp, vsShowAccels, vsDropDownMenus, vsNoAnimation); + TTBViewStyle = set of (vsMenuBar, vsUseHiddenAccels, vsAlwaysShowHints); + TTBViewTimerID = (tiOpen, tiClose, tiScrollUp, tiScrollDown); + + TTBViewClass = class of TTBView; + TTBView = class(TComponent) + private + FViewers: TList; { at front to minimize code size } + FActiveTimers: set of TTBViewTimerID; + FBackgroundColor: TColor; + FBaseSize: TPoint; + FCapture: Boolean; + FCaptureWnd: HWND; + FChevronOffset: Integer; + FChevronParentView: TTBView; + FChevronSize: Integer; + FCurParentItem: TTBCustomItem; + FCustomizing: Boolean; + FDoneActionData: TTBDoneActionData; + FInternalViewersAtEnd: Integer; + FInternalViewersAtFront: Integer; + FIsPopup: Boolean; + FIsToolbar: Boolean; + FMaxHeight: Integer; + FMonitorRect: TRect; + FMouseOverSelected: Boolean; + FNewViewersGetHighestPriority: Boolean; + FOpenViewer: TTBItemViewer; + FOpenViewerView: TTBView; + FOpenViewerWindow: TTBPopupWindow; + FParentView: TTBView; + FParentItem: TTBCustomItem; + FPriorityList: TList; + FOrientation: TTBViewOrientation; + FScrollOffset: Integer; + FSelected: TTBItemViewer; + FSelectedViaMouse: Boolean; + FShowDownArrow: Boolean; + FShowUpArrow: Boolean; + FState: TTBViewState; + FStyle: TTBViewStyle; + FUpdating: Integer; + FUsePriorityList: Boolean; + FValidated: Boolean; + FWindow: TWinControl; + FWrapOffset: Integer; + + procedure DeletingViewer(Viewer: TTBItemViewer); + procedure DrawItem(Viewer: TTBItemViewer; DrawTo: TCanvas; Offscreen: Boolean); + procedure FreeViewers; + function GetViewer(Index: Integer): TTBItemViewer; + function GetViewerCount: Integer; {$IFDEF JR_D9} inline; {$ENDIF} + procedure ImagesChanged; + function InsertItemViewers(const NewIndex: Integer; + const AItem: TTBCustomItem; const AGroupLevel: Integer; + const AddToPriorityList, TopOfPriorityList: Boolean): Integer; + procedure ItemNotification(Ancestor: TTBCustomItem; Relayed: Boolean; + Action: TTBItemChangedAction; Index: Integer; Item: TTBCustomItem); + procedure LinkNotification(Ancestor: TTBCustomItem; Relayed: Boolean; + Action: TTBItemChangedAction; Index: Integer; Item: TTBCustomItem); + procedure RecreateItemViewer(const I: Integer); + procedure Scroll(ADown: Boolean); + procedure SetCustomizing(Value: Boolean); + procedure SetSelected(Value: TTBItemViewer); + procedure SetUsePriorityList(Value: Boolean); + procedure StartTimer(const ATimer: TTBViewTimerID; const Interval: Integer); + procedure StopAllTimers; + procedure StopTimer(const ATimer: TTBViewTimerID); + procedure UpdateCurParentItem; + protected + FAccObjectInstance: TTBBaseAccObject; + procedure AutoSize(AWidth, AHeight: Integer); virtual; + function CalculatePositions(const CanMoveControls: Boolean; + const AOrientation: TTBViewOrientation; + AWrapOffset, AChevronOffset, AChevronSize: Integer; + var ABaseSize, TotalSize: TPoint; + var AWrappedLines: Integer): Boolean; + procedure DoUpdatePositions(var ASize: TPoint); virtual; + function GetChevronItem: TTBCustomItem; virtual; + procedure GetMargins(AOrientation: TTBViewOrientation; var Margins: TRect); + virtual; + function GetMDIButtonsItem: TTBCustomItem; virtual; + function GetMDISystemMenuItem: TTBCustomItem; virtual; + function GetParentToolbarView: TTBView; + function GetRootView: TTBView; + function HandleWMGetObject(var Message: TMessage): Boolean; + procedure InitiateActions; + procedure KeyDown(var Key: Word; Shift: TShiftState); virtual; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure SetAccelsVisibility(AShowAccels: Boolean); + public + constructor Create(AOwner: TComponent; AParentView: TTBView; + AParentItem: TTBCustomItem; AWindow: TWinControl; + AIsToolbar, ACustomizing, AUsePriorityList: Boolean); reintroduce; virtual; + destructor Destroy; override; + procedure BeginUpdate; + procedure CancelCapture; + procedure CancelChildPopups; + procedure CancelMode; + procedure CloseChildPopups; + function ContainsView(AView: TTBView): Boolean; + procedure DrawSubitems(ACanvas: TCanvas); + procedure EndModal; + procedure EndModalWithClick(AViewer: TTBItemViewer); + procedure EndModalWithHelp(AContextID: Integer); + procedure EndModalWithSystemMenu(AWnd: HWND; AKey: Word); + procedure EndUpdate; + procedure EnterToolbarLoop(Options: TTBEnterToolbarLoopOptions); + procedure ExecuteSelected(AGivePriority: Boolean); + function Find(Item: TTBCustomItem): TTBItemViewer; + function FirstSelectable: TTBItemViewer; + function GetAccObject: TTBBaseAccObject; + function GetCaptureWnd: HWND; + function GetFont: TFont; virtual; + procedure GetOffEdgeControlList(const List: TList); + procedure GivePriority(AViewer: TTBItemViewer); + procedure HandleHintShowMessage(var Message: TCMHintShow); + function HighestPriorityViewer: TTBItemViewer; + procedure Invalidate(AViewer: TTBItemViewer); + procedure InvalidatePositions; virtual; + function IndexOf(AViewer: TTBItemViewer): Integer; + function IsModalEnding: Boolean; + function NextSelectable(CurViewer: TTBItemViewer; GoForward: Boolean): TTBItemViewer; + function NextSelectableWithAccel(CurViewer: TTBItemViewer; Key: Char; + RequirePrimaryAccel: Boolean; var IsOnlyItemWithAccel: Boolean): TTBItemViewer; + procedure NotifyFocusEvent; + function OpenChildPopup(const SelectFirstItem: Boolean): Boolean; + procedure RecreateAllViewers; + procedure ScrollSelectedIntoView; + procedure Select(Value: TTBItemViewer; ViaMouse: Boolean); + procedure SetCapture; + procedure TryValidatePositions; + procedure UpdateSelection(const P: TPoint; const AllowNewSelection: Boolean); + function UpdatePositions: TPoint; + procedure ValidatePositions; + function ViewerFromPoint(const P: TPoint): TTBItemViewer; + + property BackgroundColor: TColor read FBackgroundColor write FBackgroundColor; + property BaseSize: TPoint read FBaseSize; + property Capture: Boolean read FCapture; + property ChevronOffset: Integer read FChevronOffset write FChevronOffset; + property ChevronSize: Integer read FChevronSize write FChevronSize; + property Customizing: Boolean read FCustomizing write SetCustomizing; + property IsPopup: Boolean read FIsPopup; + property IsToolbar: Boolean read FIsToolbar; + property MouseOverSelected: Boolean read FMouseOverSelected; + property NewViewersGetHighestPriority: Boolean read FNewViewersGetHighestPriority + write FNewViewersGetHighestPriority; + property ParentView: TTBView read FParentView; + property ParentItem: TTBCustomItem read FParentItem; + property OpenViewer: TTBItemViewer read FOpenViewer; + property OpenViewerView: TTBView read FOpenViewerView; + property Orientation: TTBViewOrientation read FOrientation write FOrientation; + property Selected: TTBItemViewer read FSelected write SetSelected; + property SelectedViaMouse: Boolean read FSelectedViaMouse; + property State: TTBViewState read FState; + property Style: TTBViewStyle read FStyle write FStyle; + property UsePriorityList: Boolean read FUsePriorityList write SetUsePriorityList; + property Viewers[Index: Integer]: TTBItemViewer read GetViewer; + property ViewerCount: Integer read GetViewerCount; + property Window: TWinControl read FWindow; + property WrapOffset: Integer read FWrapOffset write FWrapOffset; + end; + + TTBRootItemClass = class of TTBRootItem; + TTBRootItem = class(TTBCustomItem); + { same as TTBCustomItem, except there's a property editor for it } + + TTBItem = class(TTBCustomItem) + published + property Action; + property AutoCheck; + property Caption; + property Checked; + property DisplayMode; + property Enabled; + property GroupIndex; + property HelpContext; + property Hint; + property ImageIndex; + property Images; + property InheritOptions; + property MaskOptions; + property Options; + property RadioItem; + property ShortCut; + property Visible; + + property OnClick; + property OnSelect; + end; + + TTBGroupItem = class(TTBCustomItem) + public + constructor Create(AOwner: TComponent); override; + published + property InheritOptions; + property LinkSubitems; + property MaskOptions; + property Options; + end; + + TTBSubmenuItem = class(TTBCustomItem) + private + function GetDropdownCombo: Boolean; + procedure SetDropdownCombo(Value: Boolean); + public + constructor Create(AOwner: TComponent); override; + published + property Action; + property AutoCheck; + property Caption; + property Checked; + //property DisplayAsToolbar; + property DisplayMode; + property DropdownCombo: Boolean read GetDropdownCombo write SetDropdownCombo default False; + property Enabled; + property GroupIndex; + property HelpContext; + property Hint; + property ImageIndex; + property Images; + property InheritOptions; + property LinkSubitems; + property MaskOptions; + property Options; + property RadioItem; + property ShortCut; + property SubMenuImages; + property Visible; + + property OnClick; + property OnPopup; + property OnSelect; + end; + + TTBSeparatorItem = class(TTBCustomItem) + private + FBlank: Boolean; + procedure SetBlank(Value: Boolean); + protected + function GetItemViewerClass(AView: TTBView): TTBItemViewerClass; override; + public + constructor Create(AOwner: TComponent); override; + published + property Blank: Boolean read FBlank write SetBlank default False; + property Hint; + property Visible; + end; + + TTBSeparatorItemViewer = class(TTBItemViewer) + protected + procedure CalcSize(const Canvas: TCanvas; + var AWidth, AHeight: Integer); override; + procedure Paint(const Canvas: TCanvas; const ClientAreaRect: TRect; + IsSelected, IsPushed, UseDisabledShadow: Boolean); override; + function UsesSameWidth: Boolean; override; + end; + + TTBControlItem = class(TTBCustomItem) + private + FControl: TControl; + FDontFreeControl: Boolean; + procedure SetControl(Value: TControl); + protected + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + property DontFreeControl: Boolean read FDontFreeControl write FDontFreeControl; + published + property Control: TControl read FControl write SetControl; + end; + + TTBPopupView = class(TTBView) + protected + procedure AutoSize(AWidth, AHeight: Integer); override; + public + function GetFont: TFont; override; + end; + + ITBPopupWindow = interface + ['{E45CBE74-1ECF-44CB-B064-6D45B1924708}'] + end; + + TTBPopupWindow = class(TCustomControl, ITBPopupWindow) + private + FAccelsVisibilitySet: Boolean; + FAnimationDirection: TTBAnimationDirection; + FView: TTBView; + procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW; + procedure CMShowingChanged(var Message: TMessage); message CM_SHOWINGCHANGED; + procedure WMClose(var Message: TWMClose); message WM_CLOSE; + procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; + procedure WMGetObject(var Message: TMessage); message WM_GETOBJECT; + procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE; + procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT; + procedure WMPaint(var Message: TWMPaint); message WM_PAINT; + procedure WMPrint(var Message: TMessage); message WM_PRINT; + procedure WMPrintClient(var Message: {$IFNDEF CLR} TMessage {$ELSE} TWMPrintClient {$ENDIF}); message WM_PRINTCLIENT; + protected + procedure CreateParams(var Params: TCreateParams); override; + procedure CreateWnd; override; + procedure DestroyWindowHandle; override; + function GetViewClass: TTBViewClass; dynamic; + procedure Paint; override; + procedure PaintScrollArrows; virtual; + public + constructor CreatePopupWindow(AOwner: TComponent; const AParentView: TTBView; + const AItem: TTBCustomItem; const ACustomizing: Boolean); virtual; + destructor Destroy; override; + + property View: TTBView read FView; + end; + + ITBItems = interface + ['{A5C0D7CC-3EC4-4090-A0F8-3D03271877EA}'] + function GetItems: TTBCustomItem; + end; + + TTBItemContainer = class(TComponent, ITBItems) + private + FItem: TTBRootItem; + function GetImages: TCustomImageList; + function GetItems: TTBCustomItem; + procedure SetImages(Value: TCustomImageList); + protected + procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + + property Items: TTBRootItem read FItem; + published + property Images: TCustomImageList read GetImages write SetImages; + end; + + TTBPopupMenu = class(TPopupMenu, ITBItems) + private + FItem: TTBRootItem; + //procedure SetItems(Value: TTBCustomItem); + function GetImages: TCustomImageList; + function GetItems: TTBCustomItem; + function GetLinkSubitems: TTBCustomItem; + function GetOptions: TTBItemOptions; + procedure RootItemClick(Sender: TObject); + procedure SetImages(Value: TCustomImageList); + procedure SetLinkSubitems(Value: TTBCustomItem); + procedure SetOptions(Value: TTBItemOptions); + protected + {$IFNDEF JR_D5} + procedure DoPopup(Sender: TObject); + {$ENDIF} + function GetRootItemClass: TTBRootItemClass; dynamic; + procedure SetChildOrder(Child: TComponent; Order: Integer); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override; + function IsShortCut(var Message: TWMKey): Boolean; override; + procedure Popup(X, Y: Integer); override; + function PopupEx(X, Y: Integer; ReturnClickedItemOnly: Boolean = False): TTBCustomItem; + published + property Images: TCustomImageList read GetImages write SetImages; + property Items: TTBRootItem read FItem; + property LinkSubitems: TTBCustomItem read GetLinkSubitems write SetLinkSubitems; + property Options: TTBItemOptions read GetOptions write SetOptions default []; + end; + + TTBCustomImageList = class(TImageList) + private + FCheckedImages: TCustomImageList; + FCheckedImagesChangeLink: TChangeLink; + FDisabledImages: TCustomImageList; + FDisabledImagesChangeLink: TChangeLink; + FHotImages: TCustomImageList; + FHotImagesChangeLink: TChangeLink; + FImagesBitmap: TBitmap; + FImagesBitmapMaskColor: TColor; + procedure ChangeImages(var AImageList: TCustomImageList; + Value: TCustomImageList; AChangeLink: TChangeLink); + procedure ImageListChanged(Sender: TObject); + procedure ImagesBitmapChanged(Sender: TObject); + procedure SetCheckedImages(Value: TCustomImageList); + procedure SetDisabledImages(Value: TCustomImageList); + procedure SetHotImages(Value: TCustomImageList); + procedure SetImagesBitmap(Value: TBitmap); + procedure SetImagesBitmapMaskColor(Value: TColor); + {$IFDEF CLR} + procedure WriteLeft(Writer: TWriter); + procedure WriteTop(Writer: TWriter); + {$ENDIF} + protected + procedure DefineProperties(Filer: TFiler); override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + property CheckedImages: TCustomImageList read FCheckedImages write SetCheckedImages; + property DisabledImages: TCustomImageList read FDisabledImages write SetDisabledImages; + property HotImages: TCustomImageList read FHotImages write SetHotImages; + property ImagesBitmap: TBitmap read FImagesBitmap write SetImagesBitmap; + property ImagesBitmapMaskColor: TColor read FImagesBitmapMaskColor + write SetImagesBitmapMaskColor default clFuchsia; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure DrawState(Canvas: TCanvas; X, Y, Index: Integer; + Enabled, Selected, Checked: Boolean); virtual; + end; + + TTBImageList = class(TTBCustomImageList) + published + property CheckedImages; + property DisabledImages; + property HotImages; + property ImagesBitmap; + property ImagesBitmapMaskColor; + end; + +const + {$IFNDEF TB2K_USE_STRICT_O2K_MENU_STYLE} + tbMenuBkColor = clMenu; + tbMenuTextColor = clMenuText; + {$ELSE} + tbMenuBkColor = clBtnFace; + tbMenuTextColor = clBtnText; + {$ENDIF} + + tbMenuVerticalMargin = 4; + tbMenuImageTextSpace = 1; + tbMenuLeftTextMargin = 2; + tbMenuRightTextMargin = 3; + + tbMenuSeparatorOffset = 12; + + tbMenuScrollArrowHeight = 19; + + tbDropdownArrowWidth = 8; + tbDropdownArrowMargin = 3; + tbDropdownComboArrowWidth = 11; + tbDropdownComboMargin = 2; + + tbLineSpacing = 6; + tbLineSepOffset = 1; + tbDockedLineSepOffset = 4; + + WM_TB2K_CLICKITEM = WM_USER + $100; + +function TBGetItems(const AObject: TObject): TTBCustomItem; +procedure TBInitToolbarSystemFont; + +var + ToolbarFont: TFont; + + +implementation + +uses + {$IFDEF CLR} System.Runtime.InteropServices, System.Text, System.Threading, + Types, WinUtils, {$ENDIF} + TB2Consts, TB2Common, IMM, TB2Acc; + +{$UNDEF ALLOCHWND_CLASSES} +{$IFNDEF CLR} + {$IFDEF JR_D6} + {$DEFINE ALLOCHWND_CLASSES} + {$ENDIF} +{$ENDIF} + +var + LastPos: TPoint; + +threadvar + ClickWndRefCount: Integer; + ClickWnd: HWND; + ClickList: TList; + +type + TTBModalHandler = class + private + FCreatedWnd: Boolean; + FInited: Boolean; + FWnd: HWND; + FRootPopup: TTBPopupWindow; + FSaveFocusWnd: HWND; + procedure WndProc(var Msg: TMessage); + public + constructor Create(AExistingWnd: HWND); + destructor Destroy; override; + procedure Loop(const RootView: TTBView; const AMouseDown, AExecuteSelected, + AFromMSAA, TrackRightButton: Boolean); + property RootPopup: TTBPopupWindow read FRootPopup write FRootPopup; + property Wnd: HWND read FWnd; + end; + + TItemChangedNotificationData = class + private + Proc: TTBItemChangedProc; + RefCount: Integer; + end; + + {$IFNDEF CLR} + TComponentAccess = class(TComponent); + TControlAccess = class(TControl); + {$ENDIF} + +const + ViewTimerBaseID = 9000; + MaxGroupLevel = 10; + + +{ Misc. } + +function TBGetItems(const AObject: TObject): TTBCustomItem; +{ If AObject is an item, returns AObject, otherwise finds the root item + associated with AObject. If AObject is not a TTBCustomItem and does not + implement the ITBItems interface, nil is returned. } +var + Intf: ITBItems; +begin + if AObject is TTBCustomItem then + Result := TTBCustomItem(AObject) + else begin + {$IFNDEF CLR} + if AObject.GetInterface(ITBItems, Intf) then + {$ELSE} + Intf := ITBItems(AObject); + if Assigned(Intf) then + {$ENDIF} + Result := Intf.GetItems + else + Result := nil; + end; +end; + +procedure DestroyClickWnd; +begin + if ClickWnd <> 0 then begin + {$IFDEF ALLOCHWND_CLASSES}Classes.{$ENDIF} DeallocateHWnd(ClickWnd); + ClickWnd := 0; + end; + FreeAndNil(ClickList); +end; + +procedure ReferenceClickWnd; +begin + Inc(ClickWndRefCount); +end; + +procedure ReleaseClickWnd; +begin + Dec(ClickWndRefCount); + if ClickWndRefCount = 0 then + DestroyClickWnd; +end; + +procedure QueueClick(const AItem: TObject; const AArg: Integer); +{ Adds an item to ClickList and posts a message to handle it. AItem must be + either a TTBCustomItem or TTBItemViewer. } +var + I: Integer; +begin + if ClickWnd = 0 then + ClickWnd := {$IFDEF ALLOCHWND_CLASSES}Classes.{$ENDIF} AllocateHWnd(TTBCustomItem.ClickWndProc); + if ClickList = nil then + ClickList := TList.Create; + + { Add a new item to ClickList or replace an empty one } + I := ClickList.IndexOf(nil); + if I = -1 then + I := ClickList.Add(AItem) + else + ClickList[I] := AItem; + + PostMessage(ClickWnd, WM_TB2K_CLICKITEM, AArg, I); +end; + +procedure RemoveFromClickList(const AItem: TObject); +{ Any class that potentially calls QueueClick needs to call RemoveFromClickList + before an instance is destroyed to ensure that any references to the + instance still in ClickList are removed. } +var + I: Integer; +begin + if Assigned(ClickList) and Assigned(AItem) then + for I := 0 to ClickList.Count-1 do + if ClickList[I] = AItem then + ClickList[I] := ClickList; + { ^ The special value of ClickList is assigned to the item instead of + of nil because we want the index to stay reserved until the + WM_TB2K_CLICKITEM message for the index is processed. We don't want + the WM_TB2K_CLICKITEM message that's still in the queue to later + refer to a different item; this would result in queued clicks being + processed in the wrong order in a case like this: + A.PostClick; B.PostClick; A.Free; C.PostClick; + C's click would end up being processed before A's, because C would + get A's index. } +end; + +function ProcessDoneAction(const DoneActionData: TTBDoneActionData; + const ReturnClickedItemOnly: Boolean): TTBCustomItem; +begin + Result := nil; + case DoneActionData.DoneAction of + tbdaNone: ; + tbdaClickItem: begin + if DoneActionData.Sound and NeedToPlaySound('MenuCommand') then + PlaySystemSound('MenuCommand'); + Result := DoneActionData.ClickItem; + if not ReturnClickedItemOnly then + Result.PostClick; + end; + tbdaOpenSystemMenu: begin + SendMessage(DoneActionData.Wnd, WM_SYSCOMMAND, SC_KEYMENU, DoneActionData.Key); + end; + tbdaHelpContext: begin + { Based on code in TPopupList.WndProc: } + if Assigned(Screen.ActiveForm) and + (biHelp in Screen.ActiveForm.BorderIcons) then + Application.HelpCommand(HELP_CONTEXTPOPUP, DoneActionData.ContextID) + else + Application.HelpContext(DoneActionData.ContextID); + end; + end; +end; + + +{ TTBCustomItemActionLink } + +procedure TTBCustomItemActionLink.AssignClient(AClient: TObject); +begin + FClient := AClient as TTBCustomItem; +end; + +{$IFDEF JR_D6} +function TTBCustomItemActionLink.IsAutoCheckLinked: Boolean; +begin + Result := (FClient.AutoCheck = (Action as TCustomAction).AutoCheck); +end; +{$ENDIF} + +function TTBCustomItemActionLink.IsCaptionLinked: Boolean; +begin + Result := inherited IsCaptionLinked and + (FClient.Caption = (Action as TCustomAction).Caption); +end; + +function TTBCustomItemActionLink.IsCheckedLinked: Boolean; +begin + Result := inherited IsCheckedLinked and + (FClient.Checked = (Action as TCustomAction).Checked); +end; + +function TTBCustomItemActionLink.IsEnabledLinked: Boolean; +begin + Result := inherited IsEnabledLinked and + (FClient.Enabled = (Action as TCustomAction).Enabled); +end; + +function TTBCustomItemActionLink.IsHelpContextLinked: Boolean; +begin + Result := inherited IsHelpContextLinked and + (FClient.HelpContext = (Action as TCustomAction).HelpContext); +end; + +function TTBCustomItemActionLink.IsHintLinked: Boolean; +begin + Result := inherited IsHintLinked and + (FClient.Hint = (Action as TCustomAction).Hint); +end; + +function TTBCustomItemActionLink.IsImageIndexLinked: Boolean; +begin + Result := inherited IsImageIndexLinked and + (FClient.ImageIndex = (Action as TCustomAction).ImageIndex); +end; + +function TTBCustomItemActionLink.IsShortCutLinked: Boolean; +begin + Result := inherited IsShortCutLinked and + (FClient.ShortCut = (Action as TCustomAction).ShortCut); +end; + +function TTBCustomItemActionLink.IsVisibleLinked: Boolean; +begin + Result := inherited IsVisibleLinked and + (FClient.Visible = (Action as TCustomAction).Visible); +end; + +function TTBCustomItemActionLink.IsOnExecuteLinked: Boolean; +begin + Result := inherited IsOnExecuteLinked and + {$IFNDEF CLR} + MethodsEqual(TMethod(FClient.OnClick), TMethod(Action.OnExecute)); + {$ELSE} + (@FClient.OnClick = @Action.OnExecute); + {$ENDIF} +end; + +{$IFDEF JR_D6} +procedure TTBCustomItemActionLink.SetAutoCheck(Value: Boolean); +begin + if IsAutoCheckLinked then FClient.AutoCheck := Value; +end; +{$ENDIF} + +procedure TTBCustomItemActionLink.SetCaption(const Value: string); +begin + if IsCaptionLinked then FClient.Caption := Value; +end; + +procedure TTBCustomItemActionLink.SetChecked(Value: Boolean); +begin + if IsCheckedLinked then FClient.Checked := Value; +end; + +procedure TTBCustomItemActionLink.SetEnabled(Value: Boolean); +begin + if IsEnabledLinked then FClient.Enabled := Value; +end; + +procedure TTBCustomItemActionLink.SetHelpContext(Value: THelpContext); +begin + if IsHelpContextLinked then FClient.HelpContext := Value; +end; + +procedure TTBCustomItemActionLink.SetHint(const Value: string); +begin + if IsHintLinked then FClient.Hint := Value; +end; + +procedure TTBCustomItemActionLink.SetImageIndex(Value: Integer); +begin + if IsImageIndexLinked then FClient.ImageIndex := Value; +end; + +procedure TTBCustomItemActionLink.SetShortCut(Value: TShortCut); +begin + if IsShortCutLinked then FClient.ShortCut := Value; +end; + +procedure TTBCustomItemActionLink.SetVisible(Value: Boolean); +begin + if IsVisibleLinked then FClient.Visible := Value; +end; + +procedure TTBCustomItemActionLink.SetOnExecute(Value: TNotifyEvent); +begin + if IsOnExecuteLinked then FClient.OnClick := Value; +end; + + +{ TTBCustomItem } + +{}function ItemContainingItems(const AItem: TTBCustomItem): TTBCustomItem; +begin + if Assigned(AItem) and Assigned(AItem.FLinkSubitems) then + Result := AItem.FLinkSubitems + else + Result := AItem; +end; + +constructor TTBCustomItem.Create(AOwner: TComponent); +begin + inherited; + FEnabled := True; + FImageIndex := -1; + FInheritOptions := True; + FItemStyle := [tbisSelectable, tbisRedrawOnSelChange, tbisRedrawOnMouseOverChange]; + FVisible := True; + ReferenceClickWnd; +end; + +destructor TTBCustomItem.Destroy; +var + I: Integer; +begin + Destroying; + RemoveFromClickList(Self); + { Changed in 0.33. Moved FParent.Remove call *after* the child items are + deleted. } + for I := Count-1 downto 0 do + Items[I].Free; + if Assigned(FParent) then + FParent.Remove(Self); + FreeAndNil(FItems); + FActionLink.Free; + FActionLink := nil; + FreeAndNil(FSubMenuImagesChangeLink); + FreeAndNil(FImagesChangeLink); + inherited; + if Assigned(FNotifyList) then begin + for I := FNotifyList.Count-1 downto 0 do + TItemChangedNotificationData(FNotifyList[I]).Free; + FNotifyList.Free; + end; + FLinkParents.Free; + ReleaseClickWnd; +end; + +{$IFDEF JR_D6} +function TTBCustomItem.IsAutoCheckStored: Boolean; +begin + Result := (ActionLink = nil) or not FActionLink.IsAutoCheckLinked; +end; +{$ENDIF} + +function TTBCustomItem.IsCaptionStored: Boolean; +begin + Result := (ActionLink = nil) or not FActionLink.IsCaptionLinked; +end; + +function TTBCustomItem.IsCheckedStored: Boolean; +begin + Result := (ActionLink = nil) or not FActionLink.IsCheckedLinked; +end; + +function TTBCustomItem.IsEnabledStored: Boolean; +begin + Result := (ActionLink = nil) or not FActionLink.IsEnabledLinked; +end; + +function TTBCustomItem.IsHintStored: Boolean; +begin + Result := (ActionLink = nil) or not FActionLink.IsHintLinked; +end; + +function TTBCustomItem.IsHelpContextStored: Boolean; +begin + Result := (ActionLink = nil) or not FActionLink.IsHelpContextLinked; +end; + +function TTBCustomItem.IsImageIndexStored: Boolean; +begin + Result := (ActionLink = nil) or not FActionLink.IsImageIndexLinked; +end; + +function TTBCustomItem.IsShortCutStored: Boolean; +begin + Result := (ActionLink = nil) or not FActionLink.IsShortCutLinked; +end; + +function TTBCustomItem.IsVisibleStored: Boolean; +begin + Result := (ActionLink = nil) or not FActionLink.IsVisibleLinked; +end; + +function TTBCustomItem.IsOnClickStored: Boolean; +begin + Result := (ActionLink = nil) or not FActionLink.IsOnExecuteLinked; +end; + +function TTBCustomItem.GetAction: TBasicAction; +begin + if FActionLink <> nil then + Result := FActionLink.Action + else + Result := nil; +end; + +function TTBCustomItem.GetActionLinkClass: TTBCustomItemActionLinkClass; +begin + Result := TTBCustomItemActionLink; +end; + +procedure TTBCustomItem.DoActionChange(Sender: TObject); +begin + if Sender = Action then ActionChange(Sender, False); +end; + +procedure TTBCustomItem.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + if Action is TCustomAction then + with TCustomAction(Sender) do + begin + {$IFDEF JR_D6} + if not CheckDefaults or (Self.AutoCheck = False) then + Self.AutoCheck := AutoCheck; + {$ENDIF} + if not CheckDefaults or (Self.Caption = '') then + Self.Caption := Caption; + if not CheckDefaults or (Self.Checked = False) then + Self.Checked := Checked; + if not CheckDefaults or (Self.Enabled = True) then + Self.Enabled := Enabled; + if not CheckDefaults or (Self.HelpContext = 0) then + Self.HelpContext := HelpContext; + if not CheckDefaults or (Self.Hint = '') then + Self.Hint := Hint; + if not CheckDefaults or (Self.ImageIndex = -1) then + Self.ImageIndex := ImageIndex; + if not CheckDefaults or (Self.ShortCut = scNone) then + Self.ShortCut := ShortCut; + if not CheckDefaults or (Self.Visible = True) then + Self.Visible := Visible; + if not CheckDefaults or not Assigned(Self.OnClick) then + Self.OnClick := OnExecute; + end; +end; + +procedure TTBCustomItem.SetAction(Value: TBasicAction); +begin + if Value = nil then begin + FActionLink.Free; + FActionLink := nil; + end + else begin + if FActionLink = nil then + FActionLink := GetActionLinkClass.Create(Self); + FActionLink.Action := Value; + FActionLink.OnChange := DoActionChange; + { Note: Delphi's Controls.pas and Menus.pas merely check for + "csLoading in Value.ComponentState" here. But that doesn't help when + the Action property references an action on another form / data module + that has already finished loading. So we check two things: + 1. csLoading in Value.ComponentState + 2. csLoading in ComponentState + In the typical case where the item and action list reside on the same + form, #1 and #2 are both true. + Only #1 is true when Action references an action on another form / data + module that is created *after* the item (e.g. if Form1.TBItem1.Action = + Form2.Action1, and Form1 is created before Form2). + Only #2 is true when Action references an action on another form / data + module that is created *before* the item (e.g. if Form2.TBItem1.Action = + Form1.Action1, and Form1 is created before Form2). } + ActionChange(Value, (csLoading in Value.ComponentState) or + (csLoading in ComponentState)); + Value.FreeNotification(Self); + end; +end; + +procedure TTBCustomItem.InitiateAction; +begin + if FActionLink <> nil then FActionLink.Update; +end; + +procedure TTBCustomItem.Loaded; +begin + inherited; + if Action <> nil then ActionChange(Action, True); +end; + +procedure TTBCustomItem.GetChildren(Proc: TGetChildProc; Root: TComponent); +var + I: Integer; +begin + for I := 0 to Count-1 do + Proc(Items[I]); +end; + +procedure TTBCustomItem.SetChildOrder(Child: TComponent; Order: Integer); +var + I: Integer; +begin + I := IndexOf(Child as TTBCustomItem); + if I <> -1 then + Move(I, Order); +end; + +function TTBCustomItem.HasParent: Boolean; +begin + Result := True; +end; + +function TTBCustomItem.GetParentComponent: TComponent; +begin + if (FParent <> nil) and (FParent.FParentComponent <> nil) then + Result := FParent.FParentComponent + else + Result := FParent; +end; + +procedure TTBCustomItem.SetName(const NewName: TComponentName); +begin + if Name <> NewName then begin + inherited; + if Assigned(FParent) then + FParent.Notify(tbicNameChanged, -1, Self); + end; +end; + +procedure TTBCustomItem.SetParentComponent(Value: TComponent); +var + RootItem: TTBCustomItem; +begin + if FParent <> nil then FParent.Remove(Self); + if Value <> nil then begin + RootItem := TBGetItems(Value); + if Assigned(RootItem) then + RootItem.Add(Self) + else + raise ETBItemError.CreateFmt(STBToolbarItemParentInvalid, [Value.ClassName]); + end; +end; + +procedure TTBCustomItem.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if Operation = opRemove then begin + RemoveFromList(FLinkParents, AComponent); + if AComponent = Action then Action := nil; + if AComponent = Images then Images := nil; + if AComponent = SubMenuImages then SubMenuImages := nil; + if AComponent = LinkSubitems then LinkSubitems := nil; + end; +end; + +class procedure TTBCustomItem.IndexError; +begin + raise ETBItemError.Create(STBToolbarIndexOutOfBounds); +end; + +class procedure TTBCustomItem.ClickWndProc(var Message: TMessage); +var + List: TList; + I: Integer; + Item: TObject; +begin + if Message.Msg = WM_TB2K_CLICKITEM then begin + List := ClickList; { optimization... } + if Assigned(List) then begin + I := ClipToLongint(Message.LParam); + if (I >= 0) and (I < List.Count) then begin + Item := List[I]; + List[I] := nil; + { If the item value is set to ClickList, then it was 'removed' from + the list by RemoveFromClickList } + if Item = List then + Item := nil; + end + else + Item := nil; + + { Remove trailing nil items from ClickList. This is not *necessary*, but + it will make RemoveFromClickList faster if we clean out items that + aren't used, and may never be used again. } + for I := List.Count-1 downto 0 do begin + if List[I] = nil then + List.Delete(I) + else + Break; + end; + + if Assigned(Item) then begin + try + if Item is TTBCustomItem then + TTBCustomItem(Item).Click + else if Item is TTBItemViewer then + TTBItemViewer(Item).AccSelect(Message.WParam <> 0); + except + Application.HandleException(Item); + end; + end; + end; + end + else + with Message do + Result := DefWindowProc(ClickWnd, Msg, wParam, lParam); +end; + +procedure TTBCustomItem.PostClick; +{ Posts a message to the message queue that causes the item's Click handler to + be executed when control is returned to the message loop. + This should be called instead of Click when a WM_SYSCOMMAND message is + (possibly) currently being handled, because TApplication.WndProc's + CM_APPSYSCOMMAND handler disables the VCL's processing of focus messages + until the Perform(WM_SYSCOMMAND, ...) call returns. (An OnClick handler which + calls TForm.ShowModal needs focus messages to be enabled or else the form + will be shown with no initial focus.) } +begin + QueueClick(Self, 0); +end; + +procedure TTBCustomItem.Click; +begin + if Enabled then begin + { Following code based on D6's TMenuItem.Click } + {$IFDEF JR_D6} + if (not Assigned(ActionLink) and AutoCheck) or + (Assigned(ActionLink) and not ActionLink.IsAutoCheckLinked and AutoCheck) then + {$ELSE} + if AutoCheck then + {$ENDIF} + Checked := not Checked; + { Following code based on D4's TControl.Click } + { Call OnClick if assigned and not equal to associated action's OnExecute. + If associated action's OnExecute assigned then call it, otherwise, call + OnClick. } + if Assigned(FOnClick) and (Action <> nil) and + {$IFNDEF CLR} + not MethodsEqual(TMethod(FOnClick), TMethod(Action.OnExecute)) then + {$ELSE} + (@FOnClick <> @Action.OnExecute) then + {$ENDIF} + FOnClick(Self) + else + if not(csDesigning in ComponentState) and (ActionLink <> nil) then + ActionLink.Execute {$IFDEF JR_D6}(Self){$ENDIF} + else + if Assigned(FOnClick) then + FOnClick(Self); + end; +end; + +function TTBCustomItem.GetCount: Integer; +begin + if FItems = nil then + Result := 0 + else + Result := FItems.Count; +end; + +function TTBCustomItem.GetItem(Index: Integer): TTBCustomItem; +begin + if (FItems = nil) or (Index < 0) or (Index >= FItems.Count) then begin + IndexError; + Result := nil; + Exit; + end; + Result := TTBCustomItem(FItems.List[Index]); +end; + +procedure TTBCustomItem.Add(AItem: TTBCustomItem); +begin + Insert(Count, AItem); +end; + +procedure TTBCustomItem.InternalNotify(Ancestor: TTBCustomItem; + NestingLevel: Integer; Action: TTBItemChangedAction; Index: Integer; + Item: TTBCustomItem); +{ Note: Ancestor is Item's parent, or in the case of a group item relayed + notification, it can also be a group item which *links* to Item's parent + (i.e. ItemContainingItems(Ancestor) = Item.Parent). } + + procedure RelayToParentOf(const AItem: TTBCustomItem); + begin + if NestingLevel > MaxGroupLevel then + Exit; + if (tbisEmbeddedGroup in AItem.ItemStyle) and Assigned(AItem.Parent) then begin + if Ancestor = Self then + AItem.Parent.InternalNotify(AItem, NestingLevel + 1, Action, Index, Item) + else + { Don't alter Ancestor on subsequent relays; only on the first. } + AItem.Parent.InternalNotify(Ancestor, NestingLevel + 1, Action, Index, Item); + end; + end; + +var + I: Integer; + P: TTBCustomItem; + SaveProc: TTBItemChangedProc; +begin + { If Self is a group item, relay the notification to the parent } + RelayToParentOf(Self); + { If any group items are linked to Self, relay the notification to + those items' parents } + if Assigned(FLinkParents) then + for I := 0 to FLinkParents.Count-1 do begin + P := TTBCustomItem(FLinkParents[I]); + if P <> Parent then + RelayToParentOf(P); + end; + if Assigned(FNotifyList) then begin + I := 0; + while I < FNotifyList.Count do begin + with TItemChangedNotificationData(FNotifyList[I]) do begin + SaveProc := Proc; + Proc(Ancestor, Ancestor <> Self, Action, Index, Item); + end; + { Is I now out of bounds? } + if I >= FNotifyList.Count then + Break; + { Only proceed to the next index if the list didn't change } + {$IFNDEF CLR} + if MethodsEqual(TMethod(TItemChangedNotificationData(FNotifyList[I]).Proc), + TMethod(SaveProc)) then + {$ELSE} + if @TItemChangedNotificationData(FNotifyList[I]).Proc = @SaveProc then + {$ENDIF} + Inc(I); + end; + end; +end; + +procedure TTBCustomItem.Notify(Action: TTBItemChangedAction; Index: Integer; + Item: TTBCustomItem); +begin + InternalNotify(Self, 0, Action, Index, Item); +end; + +procedure TTBCustomItem.ViewBeginUpdate; +begin + Notify(tbicSubitemsBeginUpdate, -1, nil); +end; + +procedure TTBCustomItem.ViewEndUpdate; +begin + Notify(tbicSubitemsEndUpdate, -1, nil); +end; + +procedure TTBCustomItem.Insert(NewIndex: Integer; AItem: TTBCustomItem); +begin + if Assigned(AItem.FParent) then + raise ETBItemError.Create(STBToolbarItemReinserted); + if (NewIndex < 0) or (NewIndex > Count) then IndexError; + if FItems = nil then + FItems := TList.Create; + FItems.Insert(NewIndex, AItem); + AItem.FParent := Self; + ViewBeginUpdate; + try + Notify(tbicInserted, NewIndex, AItem); + AItem.RefreshOptions; + finally + ViewEndUpdate; + end; +end; + +procedure TTBCustomItem.Delete(Index: Integer); +var + Item: TTBCustomItem; +begin + Item := Items[Index]; { will raise exception if out of range } + Notify(tbicDeleting, Index, Item); + Item.FParent := nil; + FItems.Delete(Index); +end; + +function TTBCustomItem.IndexOf(AItem: TTBCustomItem): Integer; +var + I: Integer; +begin + for I := 0 to Count-1 do + if FItems.List[I] = AItem then begin + Result := I; + Exit; + end; + Result := -1; +end; + +procedure TTBCustomItem.Remove(Item: TTBCustomItem); +var + I: Integer; +begin + I := IndexOf(Item); + //if I = -1 then raise ETBItemError.Create(STBToolbarItemNotFound); + if I <> -1 then + Delete(I); +end; + +procedure TTBCustomItem.Clear; +var + I: Integer; +begin + for I := Count-1 downto 0 do + Items[I].Free; +end; + +procedure TTBCustomItem.Move(CurIndex, NewIndex: Integer); +var + Item: TTBCustomItem; +begin + if CurIndex <> NewIndex then begin + if (NewIndex < 0) or (NewIndex >= Count) then IndexError; + Item := Items[CurIndex]; + ViewBeginUpdate; + try + Delete(CurIndex); + Insert(NewIndex, Item); + finally + ViewEndUpdate; + end; + end; +end; + +function TTBCustomItem.ContainsItem(AItem: TTBCustomItem): Boolean; +begin + while Assigned(AItem) and (AItem <> Self) do + AItem := AItem.Parent; + Result := Assigned(AItem); +end; + +procedure TTBCustomItem.RegisterNotification(ANotify: TTBItemChangedProc); +var + I: Integer; + Data: TItemChangedNotificationData; +begin + if FNotifyList = nil then FNotifyList := TList.Create; + for I := 0 to FNotifyList.Count-1 do + with TItemChangedNotificationData(FNotifyList[I]) do + {$IFNDEF CLR} + if MethodsEqual(TMethod(ANotify), TMethod(Proc)) then begin + {$ELSE} + if @ANotify = @Proc then begin + {$ENDIF} + Inc(RefCount); + Exit; + end; + FNotifyList.Expand; + Data := TItemChangedNotificationData.Create; + Data.Proc := ANotify; + Data.RefCount := 1; + FNotifyList.Add(Data); +end; + +procedure TTBCustomItem.UnregisterNotification(ANotify: TTBItemChangedProc); +var + I: Integer; + Data: TItemChangedNotificationData; +begin + if Assigned(FNotifyList) then + for I := 0 to FNotifyList.Count-1 do begin + Data := TItemChangedNotificationData(FNotifyList[I]); + {$IFNDEF CLR} + if MethodsEqual(TMethod(Data.Proc), TMethod(ANotify)) then begin + {$ELSE} + if @Data.Proc = @ANotify then begin + {$ENDIF} + Dec(Data.RefCount); + if Data.RefCount = 0 then begin + FNotifyList.Delete(I); + Data.Free; + if FNotifyList.Count = 0 then + FreeAndNil(FNotifyList); + end; + Break; + end; + end; +end; + +function TTBCustomItem.GetPopupWindowClass: TTBPopupWindowClass; +begin + Result := TTBPopupWindow; +end; + +procedure TTBCustomItem.DoPopup(Sender: TTBCustomItem; FromLink: Boolean); +begin + if Assigned(FOnPopup) then + FOnPopup(Sender, FromLink); + if not(tbisCombo in ItemStyle) then + Click; +end; + +var + PlayedSound: Boolean = False; + +function TTBCustomItem.CreatePopup(const ParentView: TTBView; + const ParentViewer: TTBItemViewer; const PositionAsSubmenu, SelectFirstItem, + Customizing: Boolean; const APopupPoint: TPoint; + const Alignment: TTBPopupAlignment): TTBPopupWindow; + + function CountObscured(X, Y, W, H: Integer): Integer; + var + I: Integer; + P: TPoint; + V: TTBItemViewer; + begin + Result := 0; + if ParentView = nil then + Exit; + P := ParentView.FWindow.ClientToScreen(Point(0, 0)); + Dec(X, P.X); + Dec(Y, P.Y); + Inc(W, X); + Inc(H, Y); + for I := 0 to ParentView.FViewers.Count-1 do begin + V := ParentView.Viewers[I]; + if V.Show and (V.BoundsRect.Left >= X) and (V.BoundsRect.Right <= W) and + (V.BoundsRect.Top >= Y) and (V.BoundsRect.Bottom <= H) then + Inc(Result); + end; + end; + +var + EventItem, ParentItem: TTBCustomItem; + Opposite: Boolean; + ChevronParentView: TTBView; + X, X2, Y, Y2, W, H: Integer; + P: TPoint; + RepeatCalcX: Boolean; + ParentItemRect: TRect; + MonitorRect: TRect; + AnimDir: TTBAnimationDirection; +begin + EventItem := ItemContainingItems(Self); + if EventItem <> Self then + EventItem.DoPopup(Self, True); + DoPopup(Self, False); + + ChevronParentView := GetChevronParentView; + if ChevronParentView = nil then + ParentItem := Self + else + ParentItem := ChevronParentView.FParentItem; + + Opposite := Assigned(ParentView) and (vsOppositePopup in ParentView.FState); + Result := GetPopupWindowClass.CreatePopupWindow(nil, ParentView, ParentItem, + Customizing); + try + if Assigned(ChevronParentView) then begin + ChevronParentView.FreeNotification(Result.View); + Result.View.FChevronParentView := ChevronParentView; + Result.View.FIsToolbar := True; + Result.View.Style := Result.View.Style + + (ChevronParentView.Style * [vsAlwaysShowHints]); + Result.Color := clBtnFace; + end; + + { Calculate ParentItemRect, and MonitorRect (the rectangle of the monitor + that the popup window will be confined to) } + if Assigned(ParentView) then begin + ParentView.ValidatePositions; + ParentItemRect := ParentViewer.BoundsRect; + P := ParentView.FWindow.ClientToScreen(Point(0, 0)); + OffsetRect(ParentItemRect, P.X, P.Y); + if not IsRectEmpty(ParentView.FMonitorRect) then + MonitorRect := ParentView.FMonitorRect + else + MonitorRect := GetRectOfMonitorContainingRect(ParentItemRect, False); + end + else begin + ParentItemRect.TopLeft := APopupPoint; + ParentItemRect.BottomRight := APopupPoint; + MonitorRect := GetRectOfMonitorContainingPoint(APopupPoint, False); + end; + Result.View.FMonitorRect := MonitorRect; + + { Initialize item positions and size of the popup window } + if ChevronParentView = nil then + Result.View.FMaxHeight := (MonitorRect.Bottom - MonitorRect.Top) - + (PopupMenuWindowNCSize * 2) + else + Result.View.WrapOffset := (MonitorRect.Right - MonitorRect.Left) - + (PopupMenuWindowNCSize * 2); + if SelectFirstItem then + Result.View.Selected := Result.View.FirstSelectable; + Result.View.UpdatePositions; + W := Result.Width; + H := Result.Height; + + { Calculate initial X,Y position of the popup window } + if Assigned(ParentView) then begin + if not PositionAsSubmenu then begin + if ChevronParentView = nil then begin + if (ParentView = nil) or (ParentView.FOrientation <> tbvoVertical) then begin + if GetSystemMetrics(SM_MENUDROPALIGNMENT) = 0 then + X := ParentItemRect.Left + else + X := ParentItemRect.Right - W; + Y := ParentItemRect.Bottom; + end + else begin + X := ParentItemRect.Left - W; + Y := ParentItemRect.Top; + end; + end + else begin + if ChevronParentView.FOrientation <> tbvoVertical then begin + X := ParentItemRect.Right - W; + Y := ParentItemRect.Bottom; + end + else begin + X := ParentItemRect.Left - W; + Y := ParentItemRect.Top; + end; + end; + end + else begin + X := ParentItemRect.Right - PopupMenuWindowNCSize; + Y := ParentItemRect.Top - PopupMenuWindowNCSize; + end; + end + else begin + X := APopupPoint.X; + Y := APopupPoint.Y; + case Alignment of + tbpaRight: Dec(X, W); + tbpaCenter: Dec(X, W div 2); + end; + end; + + { Adjust the Y position of the popup window } + { If the window is going off the bottom of the monitor, try placing it + above the parent item } + if (Y + H > MonitorRect.Bottom) and + ((ParentView = nil) or (ParentView.FOrientation <> tbvoVertical)) then begin + if not PositionAsSubmenu then + Y2 := ParentItemRect.Top + else + Y2 := ParentItemRect.Bottom + PopupMenuWindowNCSize; + Dec(Y2, H); + { Only place it above the parent item if it isn't going to go off the + top of the monitor } + if Y2 >= MonitorRect.Top then + Y := Y2; + end; + { If it's still going off the bottom (which can be possible if a menu bar + was off the screen to begin with), clip it to the bottom of the monitor } + if Y + H > MonitorRect.Bottom then + Y := MonitorRect.Bottom - H; + if Y < MonitorRect.Top then + Y := MonitorRect.Top; + + { Other adjustments to the position of the popup window } + if not PositionAsSubmenu then begin + if (ParentView = nil) and (Alignment = tbpaRight) and (X < MonitorRect.Left) then + Inc(X, W); + if X + W > MonitorRect.Right then begin + if Assigned(ParentView) or (Alignment <> tbpaLeft) then + X := MonitorRect.Right; + Dec(X, W); + end; + if X < MonitorRect.Left then + X := MonitorRect.Left; + if (ParentView = nil) or (ParentView.FOrientation <> tbvoVertical) then begin + Y2 := ParentItemRect.Top - H; + if Y2 >= MonitorRect.Top then begin + { Would the popup window obscure less items if it popped out to the + top instead? } + if (CountObscured(X, Y2, W, H) < CountObscured(X, Y, W, H)) or + ((Y < ParentItemRect.Bottom) and (Y + H > ParentItemRect.Top) and + (X < ParentItemRect.Right) and (X + W > ParentItemRect.Left)) then + Y := Y2; + end; + { Make sure a tall popup window doesn't overlap the parent item } + if (Y < ParentItemRect.Bottom) and (Y + H > ParentItemRect.Top) and + (X < ParentItemRect.Right) and (X + W > ParentItemRect.Left) then begin + if ParentItemRect.Right + W <= MonitorRect.Right then + X := ParentItemRect.Right + else + X := ParentItemRect.Left - W; + if X < MonitorRect.Top then + X := MonitorRect.Top; + end; + end + else begin + X2 := ParentItemRect.Right; + if X2 + W <= MonitorRect.Right then begin + { Would the popup window obscure less items if it popped out to the + right instead? } + if (CountObscured(X2, Y, W, H) < CountObscured(X, Y, W, H)) or + ((Y < ParentItemRect.Bottom) and (Y + H > ParentItemRect.Top) and + (X < ParentItemRect.Right) and (X + W > ParentItemRect.Left)) then + X := X2; + end; + { Make sure a wide popup window doesn't overlap the parent item } + if (Y < ParentItemRect.Bottom) and (Y + H > ParentItemRect.Top) and + (X < ParentItemRect.Right) and (X + W > ParentItemRect.Left) then begin + if ParentItemRect.Bottom + H <= MonitorRect.Bottom then + Y := ParentItemRect.Bottom + else + Y := ParentItemRect.Top - H; + if Y < MonitorRect.Top then + Y := MonitorRect.Top; + end; + end; + end + else begin + { Make nested submenus go from left to right on the screen. Each it + runs out of space on the screen, switch directions } + repeat + RepeatCalcX := False; + X2 := X; + if Opposite or (X2 + W > MonitorRect.Right) then begin + if Assigned(ParentView) then + X2 := ParentItemRect.Left + PopupMenuWindowNCSize; + Dec(X2, W); + if not Opposite then + Include(Result.View.FState, vsOppositePopup) + else begin + if X2 < MonitorRect.Left then begin + Opposite := False; + RepeatCalcX := True; + end + else + Include(Result.View.FState, vsOppositePopup); + end; + end; + until not RepeatCalcX; + X := X2; + if X < MonitorRect.Left then + X := MonitorRect.Left; + end; + + { Determine animation direction } + AnimDir := []; + if not PositionAsSubmenu then begin + if Y >= ParentItemRect.Bottom then + Include(AnimDir, tbadDown) + else if Y + H <= ParentItemRect.Top then + Include(AnimDir, tbadUp); + if X >= ParentItemRect.Right then + Include(AnimDir, tbadRight) + else if X + W <= ParentItemRect.Left then + Include(AnimDir, tbadLeft); + end + else begin + if X + W div 2 >= ParentItemRect.Left + (ParentItemRect.Right - ParentItemRect.Left) div 2 then + Include(AnimDir, tbadRight) + else + Include(AnimDir, tbadLeft); + end; + Result.FAnimationDirection := AnimDir; + + Result.SetBounds(X, Y, W, H); + if Assigned(ParentView) then begin + Result.FreeNotification(ParentView); + ParentView.FOpenViewerWindow := Result; + ParentView.FOpenViewerView := Result.View; + ParentView.FOpenViewer := ParentViewer; + if ParentView.FIsToolbar then begin + Include(ParentView.FState, vsDropDownMenus); + ParentView.Invalidate(ParentViewer); + ParentView.FWindow.Update; + end; + end; + Include(Result.View.FState, vsDrawInOrder); + if not NeedToPlaySound('MenuPopup') then begin + { Don't call PlaySound if we don't have to } + Result.Visible := True; + end + else begin + if not PlayedSound then begin + { Work around Windows 2000 "bug" where there's a 1/3 second delay upon the + first call to PlaySound (or sndPlaySound) by painting the window + completely first. This way the delay isn't very noticable. } + PlayedSound := True; + Result.Visible := True; + Result.Update; + PlaySystemSound('MenuPopup'); + end + else begin + PlaySystemSound('MenuPopup'); + Result.Visible := True; + end; + end; + CallNotifyWinEvent(EVENT_SYSTEM_MENUPOPUPSTART, Result.View.FWindow.Handle, + OBJID_CLIENT, CHILDID_SELF); + { Call NotifyFocusEvent now that the window is visible } + if Assigned(Result.View.Selected) then + Result.View.NotifyFocusEvent; + except + Result.Free; + raise; + end; +end; + +function TTBCustomItem.OpenPopup(const SelectFirstItem, TrackRightButton: Boolean; + const PopupPoint: TPoint; const Alignment: TTBPopupAlignment; + const ReturnClickedItemOnly: Boolean): TTBCustomItem; +var + ModalHandler: TTBModalHandler; + Popup: TTBPopupWindow; + DoneActionData: TTBDoneActionData; +begin + ModalHandler := TTBModalHandler.Create(0); + try + Popup := CreatePopup(nil, nil, False, SelectFirstItem, False, PopupPoint, + Alignment); + try + Include(Popup.View.FState, vsIgnoreFirstMouseUp); + ModalHandler.RootPopup := Popup; + ModalHandler.Loop(Popup.View, False, False, False, TrackRightButton); + DoneActionData := Popup.View.FDoneActionData; + finally + ModalHandler.RootPopup := nil; + { Remove vsModal state from the root view before any TTBView.Destroy + methods get called, so that NotifyFocusEvent becomes a no-op } + Exclude(Popup.View.FState, vsModal); + Popup.Free; + end; + finally + ModalHandler.Free; + end; + Result := ProcessDoneAction(DoneActionData, ReturnClickedItemOnly); +end; + +function TTBCustomItem.Popup(X, Y: Integer; TrackRightButton: Boolean; + Alignment: TTBPopupAlignment = tbpaLeft; + ReturnClickedItemOnly: Boolean = False): TTBCustomItem; +var + P: TPoint; +begin + P.X := X; + P.Y := Y; + Result := OpenPopup(False, TrackRightButton, P, Alignment, + ReturnClickedItemOnly); +end; + +function TTBCustomItem.FindItemWithShortCut(AShortCut: TShortCut; + var ATopmostParent: TTBCustomItem): TTBCustomItem; + + function DoItem(AParentItem: TTBCustomItem; LinkDepth: Integer): TTBCustomItem; + var + I: Integer; + NewParentItem, Item: TTBCustomItem; + begin + Result := nil; + NewParentItem := AParentItem; + if Assigned(NewParentItem.LinkSubitems) then begin + NewParentItem := NewParentItem.LinkSubitems; + Inc(LinkDepth); + if LinkDepth > 25 then + Exit; { prevent infinite link recursion } + end; + for I := 0 to NewParentItem.Count-1 do begin + Item := NewParentItem.Items[I]; + if Item.ShortCut = AShortCut then begin + Result := Item; + Exit; + end; + Result := DoItem(Item, LinkDepth); + if Assigned(Result) then begin + ATopmostParent := Item; + Exit; + end; + end; + end; + +begin + ATopmostParent := nil; + Result := DoItem(Self, 0); +end; + +function TTBCustomItem.IsShortCut(var Message: TWMKey): Boolean; +var + ShortCut: TShortCut; + ShiftState: TShiftState; + ShortCutItem, TopmostItem, Item, EventItem: TTBCustomItem; + I: Integer; +label StartOver; +begin + Result := False; + ShiftState := KeyDataToShiftState(ClipToLongint(Message.KeyData)); + ShortCut := Menus.ShortCut(Message.CharCode, ShiftState); +StartOver: + ShortCutItem := FindItemWithShortCut(ShortCut, TopmostItem); + if Assigned(ShortCutItem) then begin + { Send OnPopup/OnClick events to ShortCutItem's parents so that they can + update the Enabled state of ShortCutItem if needed } + Item := Self; + repeat + if not Item.Enabled then + Exit; + EventItem := ItemContainingItems(Item); + if not(csDesigning in ComponentState) then begin + for I := 0 to EventItem.Count-1 do + EventItem.Items[I].InitiateAction; + end; + if not(tbisEmbeddedGroup in Item.ItemStyle) then begin + if EventItem <> Item then begin + try + EventItem.DoPopup(Item, True); + except + Application.HandleException(Self); + end; + end; + try + Item.DoPopup(Item, False); + except + Application.HandleException(Self); + end; + end; + ShortCutItem := Item.FindItemWithShortCut(ShortCut, TopmostItem); + if ShortCutItem = nil then + { Can no longer find the shortcut inside TopmostItem. Start over + because the shortcut might have moved. } + goto StartOver; + Item := TopmostItem; + until Item = nil; + if ShortCutItem.Enabled then begin + try + ShortCutItem.Click; + except + Application.HandleException(Self); + end; + Result := True; + end; + end; +end; + +function TTBCustomItem.GetChevronParentView: TTBView; +begin + Result := nil; +end; + +function TTBCustomItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + Result := TTBItemViewer; +end; + +function TTBCustomItem.NeedToRecreateViewer(AViewer: TTBItemViewer): Boolean; +begin + Result := False; +end; + +function TTBCustomItem.GetItemStyle: TTBItemStyle; +begin + { This public method exists for TB2DsgnItemEditor. It needs access to + ItemStyle but can't access a protected member across assembly boundaries. } + Result := FItemStyle; +end; + +function TTBCustomItem.GetShortCutText: String; +var + P: Integer; +begin + P := Pos(#9, Caption); + if P = 0 then begin + if ShortCut <> 0 then + Result := ShortCutToText(ShortCut) + else + Result := ''; + end + else + Result := Copy(Caption, P+1, Maxint); +end; + +procedure TTBCustomItem.Change(NeedResize: Boolean); +const + ItemChangedActions: array[Boolean] of TTBItemChangedAction = + (tbicInvalidate, tbicInvalidateAndResize); +begin + if Assigned(FParent) then + FParent.Notify(ItemChangedActions[NeedResize], -1, Self); +end; + +procedure TTBCustomItem.RecreateItemViewers; +begin + if Assigned(FParent) then + FParent.Notify(tbicRecreateItemViewers, -1, Self); +end; + +procedure TTBCustomItem.ImageListChangeHandler(Sender: TObject); +var + Resize: Boolean; +begin + if Sender = FSubMenuImages then begin + FSubMenuImagesChangeLink.FLastWidth := FSubMenuImages.Width; + FSubMenuImagesChangeLink.FLastHeight := FSubMenuImages.Height; + SubMenuImagesChanged; + end + else begin + { Sender is FImages } + Resize := False; + if (FImagesChangeLink.FLastWidth <> FImages.Width) or + (FImagesChangeLink.FLastHeight <> FImages.Height) then begin + FImagesChangeLink.FLastWidth := FImages.Width; + FImagesChangeLink.FLastHeight := FImages.Height; + Resize := True; + end; + Change(Resize); + end; +end; + +procedure TTBCustomItem.SubMenuImagesChanged; +begin + Notify(tbicSubMenuImagesChanged, -1, nil); +end; + +procedure TTBCustomItem.TurnSiblingsOff; +var + I: Integer; + Item: TTBCustomItem; +begin + if (GroupIndex <> 0) and Assigned(FParent) then begin + for I := 0 to FParent.Count-1 do begin + Item := FParent[I]; + if (Item <> Self) and (Item.GroupIndex = GroupIndex) then + Item.Checked := False; + end; + end; +end; + +procedure TTBCustomItem.SetCaption(Value: String); +begin + if FCaption <> Value then begin + FCaption := Value; + Change(True); + end; +end; + +procedure TTBCustomItem.SetChecked(Value: Boolean); +begin + if FChecked <> Value then begin + FChecked := Value; + Change(False); + if Value then + TurnSiblingsOff; + end; +end; + +procedure TTBCustomItem.SetDisplayMode(Value: TTBItemDisplayMode); +begin + if FDisplayMode <> Value then begin + FDisplayMode := Value; + Change(True); + end; +end; + +procedure TTBCustomItem.EnabledChanged; +begin + Change(False); +end; + +procedure TTBCustomItem.SetEnabled(Value: Boolean); +begin + if FEnabled <> Value then begin + FEnabled := Value; + EnabledChanged; + end; +end; + +procedure TTBCustomItem.SetGroupIndex(Value: Integer); +begin + if FGroupIndex <> Value then begin + FGroupIndex := Value; + if Checked then + TurnSiblingsOff; + end; +end; + +procedure TTBCustomItem.SetImageIndex(Value: TImageIndex); +var + HadNoImage: Boolean; +begin + if FImageIndex <> Value then begin + HadNoImage := FImageIndex = -1; + FImageIndex := Value; + Change(HadNoImage xor (Value = -1)); + end; +end; + +function TTBCustomItem.ChangeImages(var AImages: TCustomImageList; + const Value: TCustomImageList; var AChangeLink: TTBImageChangeLink): Boolean; +{ Returns True if image list was resized } +var + LastWidth, LastHeight: Integer; +begin + Result := False; + LastWidth := -1; + LastHeight := -1; + if Assigned(AImages) then begin + LastWidth := AImages.Width; + LastHeight := AImages.Height; + AImages.UnregisterChanges(AChangeLink); + if Value = nil then begin + AChangeLink.Free; + AChangeLink := nil; + Result := True; + end; + end; + AImages := Value; + if Assigned(Value) then begin + Result := (Value.Width <> LastWidth) or (Value.Height <> LastHeight); + if AChangeLink = nil then begin + AChangeLink := TTBImageChangeLink.Create; + AChangeLink.FLastWidth := Value.Width; + AChangeLink.FLastHeight := Value.Height; + AChangeLink.OnChange := ImageListChangeHandler; + end; + Value.RegisterChanges(AChangeLink); + Value.FreeNotification(Self); + end; +end; + +procedure TTBCustomItem.SetImages(Value: TCustomImageList); +begin + if FImages <> Value then + Change(ChangeImages(FImages, Value, FImagesChangeLink)); +end; + +procedure TTBCustomItem.SetSubMenuImages(Value: TCustomImageList); +begin + if FSubMenuImages <> Value then begin + ChangeImages(FSubMenuImages, Value, FSubMenuImagesChangeLink); + SubMenuImagesChanged; + end; +end; + +procedure TTBCustomItem.SetInheritOptions(Value: Boolean); +begin + if FInheritOptions <> Value then begin + FInheritOptions := Value; + RefreshOptions; + end; +end; + +procedure TTBCustomItem.SetLinkSubitems(Value: TTBCustomItem); +begin + if Value = Self then + Value := nil; + if FLinkSubitems <> Value then begin + if Assigned(FLinkSubitems) then + RemoveFromList(FLinkSubitems.FLinkParents, Self); + FLinkSubitems := Value; + if Assigned(Value) then begin + Value.FreeNotification(Self); + AddToList(Value.FLinkParents, Self); + end; + Notify(tbicSubitemsChanged, -1, nil); + end; +end; + +function TTBCustomItem.FixOptions(const AOptions: TTBItemOptions): TTBItemOptions; +begin + Result := AOptions; + if not(tboToolbarStyle in Result) then + Exclude(Result, tboToolbarSize); +end; + +procedure TTBCustomItem.RefreshOptions; +const + NonInheritedOptions = [tboDefault]; + ChangeOptions = [tboDefault, tboDropdownArrow, tboImageAboveCaption, + tboNoRotation, tboSameWidth, tboToolbarStyle, tboToolbarSize]; +var + OldOptions, NewOptions: TTBItemOptions; + I: Integer; + Item: TTBCustomItem; +begin + OldOptions := FEffectiveOptions; + if FInheritOptions and Assigned(FParent) then + NewOptions := FParent.FEffectiveOptions - NonInheritedOptions + else + NewOptions := []; + NewOptions := FixOptions(NewOptions - FMaskOptions + FOptions); + if FEffectiveOptions <> NewOptions then begin + FEffectiveOptions := NewOptions; + if (OldOptions * ChangeOptions) <> (NewOptions * ChangeOptions) then + Change(True); + for I := 0 to Count-1 do begin + Item := Items[I]; + if Item.FInheritOptions then + Item.RefreshOptions; + end; + end; +end; + +procedure TTBCustomItem.SetMaskOptions(Value: TTBItemOptions); +begin + if FMaskOptions <> Value then begin + FMaskOptions := Value; + RefreshOptions; + end; +end; + +procedure TTBCustomItem.SetOptions(Value: TTBItemOptions); +begin + Value := FixOptions(Value); + if FOptions <> Value then begin + FOptions := Value; + RefreshOptions; + end; +end; + +procedure TTBCustomItem.SetRadioItem(Value: Boolean); +begin + if FRadioItem <> Value then begin + FRadioItem := Value; + Change(False); + end; +end; + +procedure TTBCustomItem.SetVisible(Value: Boolean); +begin + if FVisible <> Value then begin + FVisible := Value; + Change(True); + end; +end; + + +{ TTBGroupItem } + +constructor TTBGroupItem.Create(AOwner: TComponent); +begin + inherited; + ItemStyle := ItemStyle + [tbisEmbeddedGroup, tbisSubitemsEditable]; +end; + + +{ TTBSubmenuItem } + +constructor TTBSubmenuItem.Create(AOwner: TComponent); +begin + inherited; + ItemStyle := ItemStyle + [tbisSubMenu, tbisSubitemsEditable]; +end; + +function TTBSubmenuItem.GetDropdownCombo: Boolean; +begin + Result := tbisCombo in ItemStyle; +end; + +procedure TTBSubmenuItem.SetDropdownCombo(Value: Boolean); +begin + if (tbisCombo in ItemStyle) <> Value then begin + if Value then + ItemStyle := ItemStyle + [tbisCombo] + else + ItemStyle := ItemStyle - [tbisCombo]; + Change(True); + end; +end; + + +{ TTBSeparatorItem } + +constructor TTBSeparatorItem.Create(AOwner: TComponent); +begin + inherited; + ItemStyle := ItemStyle - [tbisSelectable, tbisRedrawOnSelChange, + tbisRedrawOnMouseOverChange] + [tbisSeparator, tbisClicksTransparent]; +end; + +function TTBSeparatorItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + Result := TTBSeparatorItemViewer; +end; + +procedure TTBSeparatorItem.SetBlank(Value: Boolean); +begin + if FBlank <> Value then begin + FBlank := Value; + Change(False); + end; +end; + + +{ TTBSeparatorItemViewer } + +procedure TTBSeparatorItemViewer.CalcSize(const Canvas: TCanvas; + var AWidth, AHeight: Integer); +begin + if not IsToolbarStyle then + { Office 2000's menu separators have a hard-coded height of 10 } + AHeight := 10 + else begin + AWidth := 6; + AHeight := 6; + end; +end; + +procedure TTBSeparatorItemViewer.Paint(const Canvas: TCanvas; + const ClientAreaRect: TRect; IsSelected, IsPushed, UseDisabledShadow: Boolean); +var + DC: HDC; + R: TRect; + ToolbarStyle, Horiz, LineSep: Boolean; +begin + DC := Canvas.Handle; + if TTBSeparatorItem(Item).FBlank then + Exit; + + R := ClientAreaRect; + ToolbarStyle := IsToolbarStyle; + Horiz := not ToolbarStyle or (View.FOrientation = tbvoVertical); + LineSep := tbisLineSep in State; + if LineSep then + Horiz := not Horiz; + if Horiz then begin + R.Top := R.Bottom div 2 - 1; + if not ToolbarStyle then + InflateRect(R, -tbMenuSeparatorOffset, 0) + else if LineSep then begin + if View.FOrientation = tbvoFloating then + InflateRect(R, -tbLineSepOffset, 0) + else + InflateRect(R, -tbDockedLineSepOffset, 0); + end; + DrawEdge(DC, R, EDGE_ETCHED, BF_TOP); + end + else begin + R.Left := R.Right div 2 - 1; + if LineSep then + InflateRect(R, 0, -tbDockedLineSepOffset); + DrawEdge(DC, R, EDGE_ETCHED, BF_LEFT); + end; +end; + +function TTBSeparatorItemViewer.UsesSameWidth: Boolean; +begin + Result := False; +end; + + +{ TTBControlItem } + +constructor TTBControlItem.Create(AOwner: TComponent); +begin + inherited; + ItemStyle := ItemStyle - [tbisSelectable] + [tbisClicksTransparent]; +end; + +destructor TTBControlItem.Destroy; +begin + inherited; + { Free the associated control *after* the item is completely destroyed } + if not FDontFreeControl and Assigned(FControl) and + not(csAncestor in FControl.ComponentState) then + FControl.Free; +end; + +procedure TTBControlItem.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if (Operation = opRemove) and (AComponent = FControl) then + Control := nil; +end; + +procedure TTBControlItem.SetControl(Value: TControl); +begin + if FControl <> Value then begin + FControl := Value; + if Assigned(Value) then + Value.FreeNotification(Self); + Change(True); + end; +end; + + +{ TTBItemViewer } + +constructor TTBItemViewer.Create(AView: TTBView; AItem: TTBCustomItem; + AGroupLevel: Integer); +begin + inherited Create; + FItem := AItem; + FView := AView; + FGroupLevel := AGroupLevel; + ReferenceClickWnd; +end; + +destructor TTBItemViewer.Destroy; +begin + RemoveFromClickList(Self); + if Assigned(FAccObjectInstance) then begin + FAccObjectInstance.ClientIsDestroying; + FAccObjectInstance := nil; + end; + inherited; + ReleaseClickWnd; +end; + +function TTBItemViewer.GetAccObject: TTBBaseAccObject; +begin + if FAccObjectInstance = nil then begin + if not InitializeOleAcc then begin + Result := nil; + Exit; + end; + FAccObjectInstance := TTBItemViewerAccObject.Create(Self); + end; + Result := FAccObjectInstance; +end; + +procedure TTBItemViewer.AccSelect(const AExecute: Boolean); +{ Called by ClickWndProc when an item of type TTBItemViewer is in ClickList } +var + Obj: {$IFNDEF CLR} IDispatch {$ELSE} TTBBaseAccObject {$ENDIF}; +begin + { Ensure FAccObjectInstance is created by calling GetAccObject. Store the + reference as an interface so that the object will be destroyed when we + exit if it's no longer used. } + Obj := GetAccObject; + if Assigned(Obj) then + (FAccObjectInstance as TTBItemViewerAccObject).HandleAccSelect(AExecute); +end; + +procedure TTBItemViewer.PostAccSelect(const AExecute: Boolean); +{ Internally called by TTBItemViewerAccObject. Don't call directly. } +begin + QueueClick(Self, Ord(AExecute)); +end; + +function TTBItemViewer.IsAccessible: Boolean; +{ Returns True if MSAA clients should know about the viewer, specifically + if it's either shown, off-edge, or clipped (in other words, not completely + invisible/inaccessible). } +begin + { Note: Can't simply check Item.Visible because the chevron item's Visible + property is always True } + Result := Show or OffEdge or Clipped; +end; + +function TTBItemViewer.GetCaptionText: String; +var + P: Integer; +begin + Result := Item.Caption; + P := Pos(#9, Result); + if P <> 0 then + SetLength(Result, P-1); +end; + +function TTBItemViewer.GetHintText: String; +begin + Result := GetShortHint(Item.Hint); + { If there is no short hint, use the caption for the hint. Like Office, + strip any trailing colon or ellipsis. } + if (Result = '') and not(tboNoAutoHint in Item.EffectiveOptions) and + (not(tbisSubmenu in Item.ItemStyle) or (tbisCombo in Item.ItemStyle) or + not CaptionShown) then + Result := StripAccelChars(StripTrailingPunctuation(GetCaptionText)); + { Call associated action's OnHint event handler to post-process the hint } + if Assigned(Item.ActionLink) and + (Item.ActionLink.Action is TCustomAction) then begin + if not TCustomAction(Item.ActionLink.Action).DoHint(Result) then + Result := ''; + { Note: TControlActionLink.DoShowHint actually misinterprets the result + of DoHint, but we get it right... } + end; + { Add shortcut text } + if (Result <> '') and Application.HintShortCuts and + (Item.ShortCut <> scNone) then + Result := Format('%s (%s)', [Result, ShortCutToText(Item.ShortCut)]); +end; + +function TTBItemViewer.CaptionShown: Boolean; +begin + Result := (GetCaptionText <> '') and (not IsToolbarSize or + (Item.ImageIndex < 0) or (Item.DisplayMode in [nbdmTextOnly, nbdmImageAndText])) or + (tboImageAboveCaption in Item.EffectiveOptions); +end; + +function TTBItemViewer.ImageShown: Boolean; +begin + {}{should also return false if Images=nil (use UsedImageList?)} + ImageShown := (Item.ImageIndex >= 0) and + ((Item.DisplayMode in [nbdmDefault, nbdmImageAndText]) or + (IsToolbarStyle and (Item.DisplayMode = nbdmTextOnlyInMenus))); +end; + +function TTBItemViewer.GetImageList: TCustomImageList; +var + V: TTBView; +begin + Result := Item.Images; + if Assigned(Result) then + Exit; + V := View; + repeat + if Assigned(V.FCurParentItem) then begin + Result := V.FCurParentItem.SubMenuImages; + if Assigned(Result) then + Break; + end; + if Assigned(V.FParentItem) then begin + Result := V.FParentItem.SubMenuImages; + if Assigned(Result) then + Break; + end; + V := V.FParentView; + until V = nil; +end; + +function TTBItemViewer.IsRotated: Boolean; +{ Returns True if the caption should be drawn with rotated (vertical) text, + underneath the image } +begin + Result := (View.Orientation = tbvoVertical) and + not (tboNoRotation in Item.EffectiveOptions) and + not (tboImageAboveCaption in Item.EffectiveOptions); +end; + +procedure TTBItemViewer.CalcSize(const Canvas: TCanvas; + var AWidth, AHeight: Integer); +var + ToolbarStyle: Boolean; + DC: HDC; + TextMetrics: TTextMetric; + H, LeftMargin: Integer; + ImgList: TCustomImageList; + S: String; + RotatedFont, SaveFont: HFONT; +begin + ToolbarStyle := IsToolbarStyle; + DC := Canvas.Handle; + ImgList := GetImageList; + if ToolbarStyle then begin + AWidth := 6; + AHeight := 6; + end + else begin + AWidth := 0; + AHeight := 0; + end; + if not ToolbarStyle or CaptionShown then begin + if not IsRotated then begin + GetTextMetrics(DC, TextMetrics); + Inc(AHeight, TextMetrics.tmHeight); + Inc(AWidth, GetTextWidth(DC, GetCaptionText, True)); + if ToolbarStyle then + Inc(AWidth, 6); + end + else begin + { Vertical text isn't always the same size as horizontal text, so we have + to select the rotated font into the DC to get an accurate size } + RotatedFont := CreateRotatedFont(DC); + SaveFont := SelectObject(DC, RotatedFont); + GetTextMetrics(DC, TextMetrics); + Inc(AWidth, TextMetrics.tmHeight); + Inc(AHeight, GetTextWidth(DC, GetCaptionText, True)); + if ToolbarStyle then + Inc(AHeight, 6); + SelectObject(DC, SaveFont); + DeleteObject(RotatedFont); + end; + end; + if ToolbarStyle and ImageShown and Assigned(ImgList) then begin + if not IsRotated and not(tboImageAboveCaption in Item.EffectiveOptions) then begin + Inc(AWidth, ImgList.Width + 1); + if AHeight < ImgList.Height + 6 then + AHeight := ImgList.Height + 6; + end + else begin + Inc(AHeight, ImgList.Height); + if AWidth < ImgList.Width + 7 then + AWidth := ImgList.Width + 7; + end; + end; + if ToolbarStyle and (tbisSubmenu in Item.ItemStyle) then begin + if tbisCombo in Item.ItemStyle then + Inc(AWidth, tbDropdownComboArrowWidth) + else + if tboDropdownArrow in Item.EffectiveOptions then begin + if View.Orientation <> tbvoVertical then + Inc(AWidth, tbDropdownArrowWidth) + else + Inc(AHeight, tbDropdownArrowWidth); + end; + end; + if not ToolbarStyle then begin + Inc(AHeight, TextMetrics.tmExternalLeading + tbMenuVerticalMargin); + if Assigned(ImgList) then begin + H := ImgList.Height + 3; + if H > AHeight then + AHeight := H; + LeftMargin := MulDiv(ImgList.Width + 3, AHeight, H); + end + else + LeftMargin := AHeight; + Inc(AWidth, LeftMargin + tbMenuImageTextSpace + tbMenuLeftTextMargin + + tbMenuRightTextMargin); + S := Item.GetShortCutText; + if S <> '' then + Inc(AWidth, (AHeight - 6) + GetTextWidth(DC, S, True)); + Inc(AWidth, AHeight); + end; +end; + +procedure TTBItemViewer.DrawItemCaption(const Canvas: TCanvas; ARect: TRect; + const ACaption: String; ADrawDisabledShadow: Boolean; AFormat: UINT); +var + DC: HDC; + + procedure Draw; + begin + if not IsRotated then + DrawTextStr(DC, ACaption, ARect, AFormat) + else + DrawRotatedText(DC, ACaption, ARect, AFormat); + end; + +var + ShadowColor, HighlightColor, SaveTextColor: DWORD; +begin + DC := Canvas.Handle; + if not ADrawDisabledShadow then + Draw + else begin + ShadowColor := GetSysColor(COLOR_BTNSHADOW); + HighlightColor := GetSysColor(COLOR_BTNHIGHLIGHT); + OffsetRect(ARect, 1, 1); + SaveTextColor := SetTextColor(DC, HighlightColor); + Draw; + OffsetRect(ARect, -1, -1); + SetTextColor(DC, ShadowColor); + Draw; + SetTextColor(DC, SaveTextColor); + end; +end; + +procedure TTBItemViewer.Paint(const Canvas: TCanvas; + const ClientAreaRect: TRect; IsSelected, IsPushed, UseDisabledShadow: Boolean); +var + ShowEnabled, HasArrow: Boolean; + MenuCheckWidth, MenuCheckHeight: Integer; + + function GetDrawTextFlags: UINT; + begin + Result := 0; + if not AreKeyboardCuesEnabled and (vsUseHiddenAccels in View.FStyle) and + not(vsShowAccels in View.FState) then + Result := DT_HIDEPREFIX; + end; + + procedure DrawSubmenuArrow; + var + BR: TRect; + Bmp: TBitmap; + + procedure DrawWithColor(AColor: TColor); + const + ROP_DSPDxax = $00E20746; + var + DC: HDC; + SaveTextColor, SaveBkColor: TColorRef; + begin + Canvas.Brush.Color := AColor; + DC := Canvas.Handle; + SaveTextColor := SetTextColor(DC, clWhite); + SaveBkColor := SetBkColor(DC, clBlack); + BitBlt(DC, BR.Left, BR.Top, MenuCheckWidth, MenuCheckHeight, + Bmp.Canvas.Handle, 0, 0, ROP_DSPDxax); + SetBkColor(DC, SaveBkColor); + SetTextColor(DC, SaveTextColor); + Canvas.Brush.Style := bsClear; + end; + + begin + Bmp := TBitmap.Create; + try + Bmp.Monochrome := True; + Bmp.Width := MenuCheckWidth; + Bmp.Height := MenuCheckHeight; + BR := Rect(0, 0, MenuCheckWidth, MenuCheckHeight); + DrawFrameControl(Bmp.Canvas.Handle, BR, DFC_MENU, DFCS_MENUARROW); + OffsetRect(BR, ClientAreaRect.Right - MenuCheckWidth, + ClientAreaRect.Top + ((ClientAreaRect.Bottom - ClientAreaRect.Top) - MenuCheckHeight) div 2); + if not UseDisabledShadow then begin + if ShowEnabled and (tbisCombo in Item.ItemStyle) and IsSelected then begin + OffsetRect(BR, 1, 1); + DrawWithColor(clBtnText); + end + else + DrawWithColor(Canvas.Font.Color); + end + else begin + OffsetRect(BR, 1, 1); + DrawWithColor(clBtnHighlight); + OffsetRect(BR, -1, -1); + DrawWithColor(clBtnShadow); + end; + finally + Bmp.Free; + end; + end; + + procedure DrawDropdownArrow(R: TRect; Rotated: Boolean); + + procedure DrawWithColor(AColor: TColor); + var + X, Y: Integer; + P: array[0..2] of TPoint; + begin + X := (R.Left + R.Right) div 2; + Y := (R.Top + R.Bottom) div 2; + if not Rotated then begin + Dec(Y); + P[0].X := X-2; + P[0].Y := Y; + P[1].X := X+2; + P[1].Y := Y; + P[2].X := X; + P[2].Y := Y+2; + end + else begin + Dec(X); + P[0].X := X; + P[0].Y := Y+2; + P[1].X := X; + P[1].Y := Y-2; + P[2].X := X-2; + P[2].Y := Y; + end; + Canvas.Pen.Color := AColor; + Canvas.Brush.Color := AColor; + Canvas.Polygon(P); + end; + + begin + if not UseDisabledShadow then + DrawWithColor(Canvas.Font.Color) + else begin + OffsetRect(R, 1, 1); + DrawWithColor(clBtnHighlight); + OffsetRect(R, -1, -1); + DrawWithColor(clBtnShadow); + end; + end; + + function GetDitherBitmap: TBitmap; + begin + Result := AllocPatternBitmap(clBtnFace, clBtnHighlight); + Result.HandleType := bmDDB; { needed for Win95, or else brush is solid white } + end; + +const + EdgeStyles: array[Boolean] of UINT = (BDR_RAISEDINNER, BDR_SUNKENOUTER); + BlackCheckMarkPoints: array[0..6] of TPoint = ( + (X: -2; Y: -2), (X: 0; Y: 0), (X: 4; Y: -4), + (X: 4; Y: -3), (X: 0; Y: 1), (X: -2; Y: -1), + (X: -2; Y: -2)); + WhiteCheckMarkPoints: array[0..4] of TPoint = ( + (X: -3; Y: -2), (X: -3; Y: -1), (X: 0; Y: 2), + (X: 5; Y: -3), (X: 5; Y: -5)); +var + ToolbarStyle, ImageIsShown: Boolean; + R, RC, RD: TRect; + S: String; + ImgList: TCustomImageList; + I, X, Y: Integer; + BlackPoints: array[0..6] of TPoint; + WhitePoints: array[0..4] of TPoint; + DrawTextFlags: UINT; + LeftMargin: Integer; + TextMetrics: TTextMetric; +begin + ToolbarStyle := IsToolbarStyle; + ShowEnabled := Item.Enabled or View.Customizing; + HasArrow := (tbisSubmenu in Item.ItemStyle) and + ((tbisCombo in Item.ItemStyle) or (tboDropdownArrow in Item.EffectiveOptions)); + MenuCheckWidth := GetSystemMetrics(SM_CXMENUCHECK); + MenuCheckHeight := GetSystemMetrics(SM_CYMENUCHECK); + ImgList := GetImageList; + ImageIsShown := ImageShown and Assigned(ImgList); + LeftMargin := 0; + if not ToolbarStyle then begin + if Assigned(ImgList) then + LeftMargin := MulDiv(ImgList.Width + 3, ClientAreaRect.Bottom, ImgList.Height + 3) + else + LeftMargin := ClientAreaRect.Bottom; + end; + + { Border } + RC := ClientAreaRect; + if ToolbarStyle then begin + if HasArrow then begin + if tbisCombo in Item.ItemStyle then begin + Dec(RC.Right, tbDropdownComboMargin); + RD := RC; + Dec(RC.Right, tbDropdownComboArrowWidth - tbDropdownComboMargin); + RD.Left := RC.Right; + end + else begin + if View.Orientation <> tbvoVertical then + RD := Rect(RC.Right - tbDropdownArrowWidth - tbDropdownArrowMargin, 0, + RC.Right - tbDropdownArrowMargin, RC.Bottom) + else + RD := Rect(0, RC.Bottom - tbDropdownArrowWidth - tbDropdownArrowMargin, + RC.Right, RC.Bottom - tbDropdownArrowMargin); + end; + end + else + SetRectEmpty(RD); + if (IsSelected and ShowEnabled) or Item.Checked or + (csDesigning in Item.ComponentState) then begin + if not(tbisCombo in Item.ItemStyle) then + DrawEdge(Canvas.Handle, RC, EdgeStyles[IsPushed or Item.Checked], BF_RECT) + else begin + DrawEdge(Canvas.Handle, RC, EdgeStyles[(IsPushed and View.FCapture) or Item.Checked], BF_RECT); + if (IsSelected and ShowEnabled) or + (csDesigning in Item.ComponentState) then + DrawEdge(Canvas.Handle, RD, EdgeStyles[IsPushed and not View.FCapture], BF_RECT); + end; + end; + if HasArrow then begin + if not(tbisCombo in Item.ItemStyle) and IsPushed then + OffsetRect(RD, 1, 1); + DrawDropdownArrow(RD, not(tbisCombo in Item.ItemStyle) and + (View.Orientation = tbvoVertical)); + end; + InflateRect(RC, -1, -1); + if Item.Checked and not (IsSelected and ShowEnabled) then begin + Canvas.Brush.Bitmap := GetDitherBitmap; + Canvas.FillRect(RC); + Canvas.Brush.Style := bsClear; + end; + InflateRect(RC, -1, -1); + if Item.Checked or + ((IsSelected and IsPushed) and + (not(tbisCombo in Item.ItemStyle) or View.FCapture)) then + OffsetRect(RC, 1, 1); + if HasArrow and not(tbisCombo in Item.ItemStyle) then begin + if View.Orientation <> tbvoVertical then + Dec(RC.Right, tbDropdownArrowWidth) + else + Dec(RC.Bottom, tbDropdownArrowWidth); + end; + end + else begin + { On selected menu items, fill the background with the selected color. + Note: This assumes the brush color was not changed from the initial + value. } + if IsSelected then begin + R := RC; + if ImageIsShown or Item.Checked then + Inc(R.Left, LeftMargin + tbMenuImageTextSpace); + if (tbisCombo in Item.ItemStyle) and IsSelected and ShowEnabled then + Dec(R.Right, MenuCheckWidth); + Canvas.FillRect(R); + end; + end; + + { Adjust brush & font } + Canvas.Brush.Style := bsClear; + if tboDefault in Item.EffectiveOptions then + with Canvas.Font do Style := Style + [fsBold]; + GetTextMetrics(Canvas.Handle, TextMetrics); + + { Caption } + if CaptionShown then begin + S := GetCaptionText; + R := RC; + DrawTextFlags := GetDrawTextFlags; + if ToolbarStyle then begin + if ImageIsShown then begin + if not IsRotated and not(tboImageAboveCaption in Item.EffectiveOptions) then + Inc(R.Left, ImgList.Width + 1) + else + Inc(R.Top, ImgList.Height + 1); + end; + DrawItemCaption(Canvas, R, S, UseDisabledShadow, + DT_SINGLELINE or DT_CENTER or DT_VCENTER or DrawTextFlags) + end + else begin + Inc(R.Left, LeftMargin + tbMenuImageTextSpace + tbMenuLeftTextMargin); + { Like standard menus, shift the text up one pixel if the text height + is 4 pixels less than the total item height. This is done so underlined + characters aren't displayed too low. } + if (R.Bottom - R.Top) - (TextMetrics.tmHeight + TextMetrics.tmExternalLeading) = tbMenuVerticalMargin then + Dec(R.Bottom); + Inc(R.Top, TextMetrics.tmExternalLeading); + DrawItemCaption(Canvas, R, S, UseDisabledShadow, + DT_SINGLELINE or DT_LEFT or DT_VCENTER or DrawTextFlags); + end; + end; + + { Shortcut and/or submenu arrow (menus only) } + if not ToolbarStyle then begin + S := Item.GetShortCutText; + if S <> '' then begin + R := RC; + R.Left := R.Right - (R.Bottom - R.Top) - GetTextWidth(Canvas.Handle, S, True); + { Like standard menus, shift the text up one pixel if the text height + is 4 pixels less than the total item height. This is done so underlined + characters aren't displayed too low. } + if (R.Bottom - R.Top) - (TextMetrics.tmHeight + TextMetrics.tmExternalLeading) = tbMenuVerticalMargin then + Dec(R.Bottom); + Inc(R.Top, TextMetrics.tmExternalLeading); + DrawItemCaption(Canvas, R, S, UseDisabledShadow, + DT_SINGLELINE or DT_LEFT or DT_VCENTER or DT_NOPREFIX); + end; + if tbisSubmenu in Item.ItemStyle then begin + if tbisCombo in Item.ItemStyle then begin + R := RC; + R.Left := R.Right - MenuCheckWidth; + if IsSelected and ShowEnabled then + DrawEdge(Canvas.Handle, R, BDR_SUNKENOUTER, BF_RECT or BF_MIDDLE) + else begin + Dec(R.Left); + if not IsSelected then + DrawEdge(Canvas.Handle, R, EDGE_ETCHED, BF_LEFT) + else + DrawEdge(Canvas.Handle, R, BDR_SUNKENOUTER, BF_LEFT); + end; + end; + DrawSubmenuArrow; + end; + end; + + { Image, or check box } + if ImageIsShown or (not ToolbarStyle and Item.Checked) then begin + R := RC; + if ToolbarStyle then begin + if not IsRotated and not(tboImageAboveCaption in Item.EffectiveOptions) then + R.Right := R.Left + ImgList.Width + 2 + else + R.Bottom := R.Top + ImgList.Height + 2; + end + else begin + R.Right := R.Left + LeftMargin; + if (IsSelected and ShowEnabled) or Item.Checked then + DrawEdge(Canvas.Handle, R, EdgeStyles[Item.Checked], BF_RECT or BF_MIDDLE); + if Item.Checked and not IsSelected then begin + InflateRect(R, -1, -1); + Canvas.Brush.Bitmap := GetDitherBitmap; + Canvas.FillRect(R); + Canvas.Brush.Style := bsClear; + InflateRect(R, 1, 1); + end; + if Item.Checked then + OffsetRect(R, 1, 1); + end; + if ImageIsShown then begin + X := R.Left + ((R.Right - R.Left) - ImgList.Width) div 2; + Y := R.Top + ((R.Bottom - R.Top) - ImgList.Height) div 2; + if ImgList is TTBCustomImageList then + TTBCustomImageList(ImgList).DrawState(Canvas, X, Y, Item.ImageIndex, + ShowEnabled, IsSelected, Item.Checked) + else + ImgList.Draw(Canvas, X, Y, Item.ImageIndex, ShowEnabled); + end + else + if not ToolbarStyle and Item.Checked then begin + { Draw default check mark or radio button image when user hasn't + specified their own } + X := (R.Left + R.Right) div 2; + Y := (R.Top + R.Bottom) div 2; + if Item.RadioItem then begin + Canvas.Pen.Color := clBtnText; + Canvas.Brush.Color := clBtnText; + Canvas.RoundRect(X-3, Y-3, X+2, Y+2, 2, 2); + Canvas.Pen.Color := clBtnHighlight; + Canvas.Brush.Style := bsClear; + Canvas.RoundRect(X-4, Y-4, X+3, Y+3, 6, 6); + end + else begin + Dec(X, 2); + Inc(Y); + for I := Low(BlackPoints) to High(BlackPoints) do begin + BlackPoints[I].X := X + BlackCheckMarkPoints[I].X; + BlackPoints[I].Y := Y + BlackCheckMarkPoints[I].Y; + end; + for I := Low(WhitePoints) to High(WhitePoints) do begin + WhitePoints[I].X := X + WhiteCheckMarkPoints[I].X; + WhitePoints[I].Y := Y + WhiteCheckMarkPoints[I].Y; + end; + Canvas.Pen.Color := clBtnText; + Polyline(Canvas.Handle, BlackPoints, Length(BlackPoints)); + Canvas.Pen.Color := clBtnHighlight; + Polyline(Canvas.Handle, WhitePoints, Length(WhitePoints)); + end; + end; + end; +end; + +procedure TTBItemViewer.GetCursor(const Pt: TPoint; var ACursor: HCURSOR); +begin +end; + +function TTBItemViewer.GetIndex: Integer; +begin + Result := View.IndexOf(Self); +end; + +function TTBItemViewer.IsToolbarSize: Boolean; +begin + Result := View.FIsToolbar or (tboToolbarSize in Item.FEffectiveOptions); +end; + +function TTBItemViewer.IsToolbarStyle: Boolean; +begin + Result := View.FIsToolbar or (tboToolbarStyle in Item.FEffectiveOptions); +end; + +function TTBItemViewer.IsPtInButtonPart(X, Y: Integer): Boolean; +var + W: Integer; +begin + Result := not(tbisSubmenu in Item.ItemStyle); + if tbisCombo in Item.ItemStyle then begin + if IsToolbarStyle then + W := tbDropdownComboArrowWidth + else + W := GetSystemMetrics(SM_CXMENUCHECK); + Result := X < (BoundsRect.Right - BoundsRect.Left) - W; + end; +end; + +procedure TTBItemViewer.MouseDown(Shift: TShiftState; X, Y: Integer; + var MouseDownOnMenu: Boolean); + + procedure HandleDefaultDoubleClick(const View: TTBView); + { Looks for a tboDefault item in View and ends the modal loop if it finds + one. } + var + I: Integer; + Viewer: TTBItemViewer; + Item: TTBCustomItem; + begin + for I := 0 to View.FViewers.Count-1 do begin + Viewer := View.Viewers[I]; + Item := Viewer.Item; + if (Viewer.Show or Viewer.Clipped) and (tboDefault in Item.EffectiveOptions) and + (tbisSelectable in Item.ItemStyle) and Item.Enabled and Item.Visible then begin + Viewer.Execute(True); + Break; + end; + end; + end; + +var + WasAlreadyOpen: Boolean; +begin + if not Item.Enabled then begin + if (View.FParentView = nil) and not View.FIsPopup then + View.EndModal; + Exit; + end; + if IsPtInButtonPart(X, Y) then begin + if IsToolbarStyle then begin + View.CancelChildPopups; + View.SetCapture; + View.Invalidate(Self); + end; + end + else begin + WasAlreadyOpen := (View.FOpenViewer = Self); + if View.OpenChildPopup(False) then begin + if WasAlreadyOpen and ((View.FParentView = nil) and not View.FIsPopup) then + MouseDownOnMenu := True; + if (ssDouble in Shift) and not(tbisCombo in Item.ItemStyle) then + HandleDefaultDoubleClick(View.FOpenViewerView); + end; + end; +end; + +procedure TTBItemViewer.MouseMove(X, Y: Integer); +begin +end; + +procedure TTBItemViewer.MouseUp(X, Y: Integer; MouseWasDownOnMenu: Boolean); +var + HadCapture, IsToolbarItem: Boolean; +begin + HadCapture := View.FCapture; + View.CancelCapture; + IsToolbarItem := (View.FParentView = nil) and not View.FIsPopup; + if not View.FMouseOverSelected or not Item.Enabled or + (tbisClicksTransparent in Item.ItemStyle) then begin + if IsToolbarItem then + View.EndModal; + Exit; + end; + if (tbisSubmenu in Item.ItemStyle) and not IsPtInButtonPart(X, Y) then begin + if IsToolbarItem and MouseWasDownOnMenu then + View.EndModal; + end + else begin + { it's a 'normal' item } + if not IsToolbarStyle or HadCapture then + Execute(True); + end; +end; + +procedure TTBItemViewer.MouseWheel(WheelDelta, X, Y: Integer); +begin +end; + +procedure TTBItemViewer.LosingCapture; +begin + View.Invalidate(Self); +end; + +procedure TTBItemViewer.Entering; +begin + if Assigned(Item.FOnSelect) then + Item.FOnSelect(Item, Self, True); +end; + +procedure TTBItemViewer.Leaving; +begin + if Assigned(Item.FOnSelect) then + Item.FOnSelect(Item, Self, False); +end; + +procedure TTBItemViewer.KeyDown(var Key: Word; Shift: TShiftState); +begin +end; + +function TTBItemViewer.ScreenToClient(const P: TPoint): TPoint; +begin + Result := View.FWindow.ScreenToClient(P); + Dec(Result.X, BoundsRect.Left); + Dec(Result.Y, BoundsRect.Top); +end; + +function TTBItemViewer.UsesSameWidth: Boolean; +{ If UsesSameWidth returns True, the item viewer's width will be expanded to + match the widest item viewer on the same view whose UsesSameWidth method + also returns True. } +begin + Result := (tboImageAboveCaption in Item.FEffectiveOptions) and + (tboSameWidth in Item.FEffectiveOptions) and IsToolbarSize; +end; + +function TTBItemViewer.DoExecute: Boolean; +{ Low-level 'execute' handler. Returns True if the caller should call + GivePriority on the viewer (normally, if the 'execute' operation was a + success and the modal loop is ending). } +begin + View.EndModalWithClick(Self); + Result := True; +end; + +procedure TTBItemViewer.Execute(AGivePriority: Boolean); +{ Calls DoExecute and, if applicable, View.GivePriority. Note that it is up to + the caller to check the viewer's visibility and enabled state. } +begin + if DoExecute and AGivePriority then + View.GivePriority(Self); +end; + +function TTBItemViewer.GetAccRole: Integer; +{ Returns the MSAA "role" of the viewer. } +const + { Constants from OleAcc.h } + ROLE_SYSTEM_CLIENT = $a; + ROLE_SYSTEM_MENUITEM = $c; + ROLE_SYSTEM_SEPARATOR = $15; + ROLE_SYSTEM_PUSHBUTTON = $2b; + ROLE_SYSTEM_BUTTONMENU = $39; +begin + if Item is TTBControlItem then + Result := ROLE_SYSTEM_CLIENT + else if tbisSeparator in Item.ItemStyle then + Result := ROLE_SYSTEM_SEPARATOR + else if View.IsPopup or (vsMenuBar in View.Style) then + Result := ROLE_SYSTEM_MENUITEM + else if tbisSubmenu in Item.ItemStyle then + Result := ROLE_SYSTEM_BUTTONMENU + else + Result := ROLE_SYSTEM_PUSHBUTTON; +end; + +function TTBItemViewer.GetAccValue(var Value: WideString): Boolean; +{ Gets the MSAA "value" text of the viewer. Returns True if something was + assigned to Value, or False if the viewer does not possess a "value". } +begin + Result := False; +end; + + +{ TTBView } + +constructor TTBView.Create(AOwner: TComponent; AParentView: TTBView; + AParentItem: TTBCustomItem; AWindow: TWinControl; + AIsToolbar, ACustomizing, AUsePriorityList: Boolean); +begin + {$IFDEF CLR} + { TB2Acc's IAccessible implementations must be called from the same thread + that created the view, so verify that the program has [STAThread] } + CheckThreadingModel(System.Threading.ApartmentState.STA); + {$ENDIF} + inherited Create(AOwner); + FViewers := TList.Create; + FBackgroundColor := clDefault; + FCustomizing := ACustomizing; + FIsPopup := not AIsToolbar; + FIsToolbar := AIsToolbar; + FNewViewersGetHighestPriority := True; + FParentView := AParentView; + FParentItem := AParentItem; + if Assigned(FParentItem) then begin + //FIsToolbar := FIsToolbar or FParentItem.FDisplayAsToolbar; + FParentItem.RegisterNotification(LinkNotification); + FParentItem.FreeNotification(Self); + end; + FUsePriorityList := AUsePriorityList; + FWindow := AWindow; + UpdateCurParentItem; +end; + +destructor TTBView.Destroy; +begin + CloseChildPopups; + if Assigned(FAccObjectInstance) then begin + FAccObjectInstance.ClientIsDestroying; + { Get rid of our own reference to FAccObjectInstance. Normally the + reference count will be now be zero and FAccObjectInstance will be + freed, unless MSAA still holds a reference. } + {$IFNDEF CLR} + FAccObjectInstance._Release; + {$ENDIF} + FAccObjectInstance := nil; + end; + { If parent view is a toolbar, invalidate the open item so that it's + redrawn back in the "up" position } + if Assigned(ParentView) and ParentView.FIsToolbar then begin + Include(ParentView.FState, vsNoAnimation); + if Assigned(ParentView.FOpenViewer) then + ParentView.Invalidate(ParentView.FOpenViewer); + end; + if Assigned(FCurParentItem) then + FCurParentItem.UnregisterNotification(ItemNotification); + if Assigned(FParentItem) then + FParentItem.UnregisterNotification(LinkNotification); + inherited; + FPriorityList.Free; + FreeViewers; + FreeAndNil(FViewers); + { Now that we're destroyed, "focus" the parent view } + if Assigned(FParentView) then + FParentView.NotifyFocusEvent; +end; + +function TTBView.GetAccObject: TTBBaseAccObject; +begin + if FAccObjectInstance = nil then begin + if not InitializeOleAcc then begin + Result := nil; + Exit; + end; + FAccObjectInstance := TTBViewAccObject.Create(Self); + { Strictly as an optimization, take a reference for ourself and keep it + for the lifetime of the view. (Destroy calls _Release.) } + {$IFNDEF CLR} + FAccObjectInstance._AddRef; + {$ENDIF} + end; + Result := FAccObjectInstance; +end; + +function TTBView.HandleWMGetObject(var Message: TMessage): Boolean; +begin + { Note: In a 64-bit build, object identifiers can come in either + sign-extended or zero-extended from 32 to 64 bits. Clip to 32 bits here + to ensure we accept both forms. } + if (ClipToLongint(Message.LParam) = Longint(OBJID_CLIENT)) and InitializeOleAcc then begin + Message.Result := LresultFromObjectFunc( + {$IFNDEF CLR} ITBAccessible {$ELSE} TypeOf(ITBAccessible).GUID {$ENDIF}, + Message.WParam, GetAccObject); + Result := True; + end + else + Result := False; +end; + +procedure TTBView.UpdateCurParentItem; +var + Value: TTBCustomItem; +begin + Value := ItemContainingItems(FParentItem); + if FCurParentItem <> Value then begin + CloseChildPopups; + if Assigned(FCurParentItem) then + FCurParentItem.UnregisterNotification(ItemNotification); + FCurParentItem := Value; + if Assigned(Value) then + Value.RegisterNotification(ItemNotification); + RecreateAllViewers; + if Assigned(Value) and not(csDesigning in Value.ComponentState) then + InitiateActions; + end; +end; + +procedure TTBView.InitiateActions; +var + I: Integer; +begin + { Use a 'while' instead of a 'for' since an InitiateAction implementation + may add/delete items } + I := 0; + while I < FViewers.Count do begin + Viewers[I].Item.InitiateAction; + Inc(I); + end; +end; + +procedure TTBView.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if Operation = opRemove then begin + if AComponent = FParentItem then begin + FParentItem := nil; + UpdateCurParentItem; + if Assigned(FParentView) then + FParentView.CloseChildPopups; + end + else if AComponent = FOpenViewerWindow then begin + FOpenViewerWindow := nil; + FOpenViewerView := nil; + FOpenViewer := nil; + end + else if AComponent = FChevronParentView then + FChevronParentView := nil; + end +end; + +function TTBView.ContainsView(AView: TTBView): Boolean; +begin + while Assigned(AView) and (AView <> Self) do + AView := AView.FParentView; + Result := Assigned(AView); +end; + +function TTBView.GetRootView: TTBView; +begin + Result := Self; + while Assigned(Result.FParentView) do + Result := Result.FParentView; +end; + +function TTBView.GetParentToolbarView: TTBView; +begin + Result := Self; + while Assigned(Result) and not Result.FIsToolbar do + Result := Result.FParentView; +end; + +function TTBView.GetViewer(Index: Integer): TTBItemViewer; +begin + if (Index < 0) or (Index >= FViewers.Count) then begin + TTBCustomItem.IndexError; + Result := nil; + Exit; + end; + Result := TTBItemViewer(FViewers.List[Index]); +end; + +function TTBView.GetViewerCount: Integer; +begin + Result := FViewers.Count; +end; + +procedure TTBView.FreeViewers; +var + I: Integer; + Viewer: TTBItemViewer; +begin + if Assigned(FViewers) then begin + for I := FViewers.Count-1 downto 0 do begin + Viewer := Viewers[I]; + FViewers.Delete(I); + Viewer.Free; + end; + end; +end; + +procedure TTBView.InvalidatePositions; +begin + if FValidated then begin + FValidated := False; + if Assigned(FWindow) and FWindow.HandleAllocated then + InvalidateRect(FWindow.Handle, nil, True); + end; +end; + +procedure TTBView.ValidatePositions; +begin + if not FValidated then + UpdatePositions; +end; + +procedure TTBView.TryValidatePositions; +begin + if (FUpdating = 0) and + (not Assigned(FParentItem) or not(csLoading in FParentItem.ComponentState)) and + (not Assigned(FParentItem.Owner) or not(csLoading in FParentItem.Owner.ComponentState)) then + ValidatePositions; +end; + +(*procedure TTBView.TryRevalidatePositions; +begin + if FValidated then begin + if FUpdating = 0 then begin + FreePositions; + UpdatePositions; + end + else + InvalidatePositions; + end; +end;*) + +function TTBView.Find(Item: TTBCustomItem): TTBItemViewer; +var + I: Integer; +begin + for I := 0 to FViewers.Count-1 do + if Viewers[I].Item = Item then begin + Result := Viewers[I]; + Exit; + end; + raise ETBItemError.Create(STBViewerNotFound); +end; + +function TTBView.IndexOf(AViewer: TTBItemViewer): Integer; +var + I: Integer; +begin + if Assigned(AViewer) then + for I := 0 to FViewers.Count-1 do + if FViewers.List[I] = AViewer then begin + Result := I; + Exit; + end; + Result := -1; +end; + +procedure TTBView.DeletingViewer(Viewer: TTBItemViewer); +begin + if FSelected = Viewer then + FSelected := nil; + if FOpenViewer = Viewer then + CloseChildPopups; +end; + +procedure TTBView.RecreateItemViewer(const I: Integer); +var + OldViewer, NewViewer: TTBItemViewer; + J: Integer; +begin + OldViewer := Viewers[I]; + DeletingViewer(OldViewer); + NewViewer := OldViewer.Item.GetItemViewerClass(Self).Create(Self, + OldViewer.Item, OldViewer.FGroupLevel); + FViewers[I] := NewViewer; + if Assigned(FPriorityList) then begin + J := FPriorityList.IndexOf(OldViewer); + if J <> -1 then + FPriorityList[J] := NewViewer; + end; + OldViewer.Free; +end; + +function TTBView.InsertItemViewers(const NewIndex: Integer; + const AItem: TTBCustomItem; const AGroupLevel: Integer; + const AddToPriorityList, TopOfPriorityList: Boolean): Integer; +var + NewViewer: TTBItemViewer; + LinkItem: TTBCustomItem; + I: Integer; +begin + if AGroupLevel > MaxGroupLevel then begin + Result := 0; + Exit; + end; + + FViewers.Expand; + NewViewer := AItem.GetItemViewerClass(Self).Create(Self, AItem, + AGroupLevel); + FViewers.Insert(NewIndex, NewViewer); + if AddToPriorityList and FUsePriorityList then begin + if not TopOfPriorityList then + AddToList(FPriorityList, NewViewer) + else + { When new items are inserted programmatically at run-time, place + them at the top of FPriorityList } + AddToFrontOfList(FPriorityList, NewViewer); + end; + Result := 1; + + { If a new group item is being inserted, insert all its child items too } + if not FCustomizing and (tbisEmbeddedGroup in AItem.ItemStyle) then begin + LinkItem := ItemContainingItems(AItem); + for I := 0 to LinkItem.Count-1 do begin + Inc(Result, InsertItemViewers(NewIndex + Result, LinkItem.Items[I], + AGroupLevel + 1, AddToPriorityList, TopOfPriorityList)); + end; + end; +end; + +procedure TTBView.ItemNotification(Ancestor: TTBCustomItem; Relayed: Boolean; + Action: TTBItemChangedAction; Index: Integer; Item: TTBCustomItem); + + procedure ItemInserted; + var + NewLevel, Start, InsertPoint, Last: Integer; + GroupItem, NextItem: TTBCustomItem; + Found, SearchAgain: Boolean; + begin + InvalidatePositions; + NewLevel := 0; + Start := 0; + if Ancestor = FCurParentItem then + InsertPoint := FViewers.Count + else begin + { Ancestor <> FCurParentItem, so apparently an item has been inserted + inside a group item } + repeat + Found := False; + while Start < FViewers.Count do begin + GroupItem := Viewers[Start].Item; + if (tbisEmbeddedGroup in GroupItem.ItemStyle) and (GroupItem = Ancestor) then begin + NewLevel := Viewers[Start].FGroupLevel + 1; + Inc(Start); + Found := True; + Break; + end; + Inc(Start); + end; + if not Found then + { Couldn't find Ancestor; it shouldn't get here } + Exit; + InsertPoint := Start; + SearchAgain := False; + while (InsertPoint < FViewers.Count) and + (Viewers[InsertPoint].FGroupLevel >= NewLevel) do begin + if (Viewers[InsertPoint].Item = Item) and + (Viewers[InsertPoint].FGroupLevel = NewLevel) then begin + { If the item we were going to insert already exists, then there + must be multiple instances of the same group item. This can + happen when are two group items on the same toolbar each + linking to the same submenu item, with the submenu item + containing a group item of its own, and an item is inserted + inside that. } + SearchAgain := True; + Break; + end; + Inc(InsertPoint); + end; + until not SearchAgain; + end; + if InsertPoint = FViewers.Count then begin + { Don't add items after the chevron or MDI buttons item } + Dec(InsertPoint, FInternalViewersAtEnd); + if InsertPoint < 0 then + InsertPoint := 0; { just in case? } + end; + { If the new item wasn't placed at the end, adjust InsertPoint accordingly } + if Index < Item.Parent.Count-1 then begin + Last := InsertPoint; + InsertPoint := Start; + NextItem := Item.Parent.Items[Index+1]; + while (InsertPoint < Last) and + ((Viewers[InsertPoint].Item <> NextItem) or + (Viewers[InsertPoint].FGroupLevel <> NewLevel)) do + Inc(InsertPoint); + end; + InsertItemViewers(InsertPoint, Item, NewLevel, True, + not(csLoading in Item.ComponentState) and FNewViewersGetHighestPriority); + end; + + procedure ItemDeleting; + + procedure DeleteItem(DeleteIndex: Integer); + var + Viewer: TTBItemViewer; + begin + Viewer := Viewers[DeleteIndex]; + DeletingViewer(Viewer); + RemoveFromList(FPriorityList, Viewer); + FreeAndNil(Viewer); + FViewers.Delete(DeleteIndex); + end; + + var + I: Integer; + DeleteLevel: Integer; + begin + InvalidatePositions; + I := 0; + DeleteLevel := 0; + while I < FViewers.Count do begin + if DeleteLevel > 0 then begin + if Viewers[I].FGroupLevel >= DeleteLevel then begin + DeleteItem(I); + Continue; + end + else + DeleteLevel := 0; + end; + if Viewers[I].Item = Item then begin + { Delete the item, and any group item children afterward } + DeleteLevel := Viewers[I].FGroupLevel + 1; + DeleteItem(I); + Continue; + end; + Inc(I); + end; + end; + +var + I: Integer; +begin + case Action of + tbicInserted: ItemInserted; + tbicDeleting: ItemDeleting; + tbicSubitemsChanged: begin + { If Relayed=True, LinkSubitems must have changed on a child group + item. Currently there isn't any optimized way of handling this + situation; just recreate all viewers. } + if Relayed then + RecreateAllViewers; + end; + tbicSubitemsBeginUpdate: BeginUpdate; + tbicSubitemsEndUpdate: EndUpdate; + tbicInvalidate: begin + for I := 0 to FViewers.Count-1 do + if Viewers[I].Item = Item then + Invalidate(Viewers[I]); + end; + tbicInvalidateAndResize: InvalidatePositions; + tbicRecreateItemViewers: begin + InvalidatePositions; + for I := 0 to FViewers.Count-1 do + if Viewers[I].Item = Item then + RecreateItemViewer(I); + end; + tbicSubMenuImagesChanged: ImagesChanged; + else + { Prevent TryValidatePositions from being called below on Actions other than + those listed above. Currently there are no other Actions, but for forward + compatibility, we should ignore unknown Actions completely. } + Exit; + end; + TryValidatePositions; +end; + +procedure TTBView.LinkNotification(Ancestor: TTBCustomItem; Relayed: Boolean; + Action: TTBItemChangedAction; Index: Integer; Item: TTBCustomItem); +{ This notification procedure watches for tbicSubitemsChanged notifications + from FParentItem } +begin + case Action of + tbicSubitemsChanged: begin + { LinkSubitems may have changed on FParentItem, e.g. on the root item + of a toolbar, so see if FCurParentItem needs updating } + UpdateCurParentItem; + end; + tbicSubMenuImagesChanged: begin + { In case the images were inherited from the actual parent instead of + the linked parent... } + if FParentItem <> FCurParentItem then + ImagesChanged; + end; + end; +end; + +procedure TTBView.ImagesChanged; +begin + InvalidatePositions; + TryValidatePositions; + if Assigned(FOpenViewerView) then + FOpenViewerView.ImagesChanged; +end; + +procedure TTBView.GivePriority(AViewer: TTBItemViewer); +{ Move item to top of priority list. Rearranges items if necessary. } +var + I: Integer; +begin + if Assigned(FChevronParentView) then begin + I := AViewer.Index + FChevronParentView.FInternalViewersAtFront; + if I < FChevronParentView.FViewers.Count then { range check just in case } + FChevronParentView.GivePriority(FChevronParentView.Viewers[I]); + Exit; + end; + if Assigned(FPriorityList) then begin + I := FPriorityList.IndexOf(AViewer); + if I <> -1 then begin + FPriorityList.Move(I, 0); + if not FValidated or AViewer.OffEdge then + UpdatePositions; + end; + end; + { Call GivePriority on parent view, so that if an item on a submenu is + clicked, the parent item of the submenu gets priority. } + if Assigned(FParentView) and Assigned(FParentView.FOpenViewer) then + FParentView.GivePriority(FParentView.FOpenViewer); +end; + +function TTBView.HighestPriorityViewer: TTBItemViewer; +{ Returns index of first visible, non-separator item at top of priority list, + or -1 if there are no items found } +var + I: Integer; + J: TTBItemViewer; +begin + ValidatePositions; + Result := nil; + if Assigned(FPriorityList) then begin + for I := 0 to FPriorityList.Count-1 do begin + J := TTBItemViewer(FPriorityList[I]); + if J.Show and not(tbisSeparator in J.Item.ItemStyle) then begin + Result := J; + Break; + end; + end; + end + else begin + for I := 0 to FViewers.Count-1 do begin + J := Viewers[I]; + if J.Show and not(tbisSeparator in J.Item.ItemStyle) then begin + Result := J; + Break; + end; + end; + end; +end; + +procedure TTBView.StartTimer(const ATimer: TTBViewTimerID; + const Interval: Integer); +{ Starts a timer. Stops any previously set timer of the same ID first. + Note: WM_TIMER messages generated by timers set by the method are handled + in PopupMessageLoop. } +begin + StopTimer(ATimer); + if (FWindow is TTBPopupWindow) and FWindow.HandleAllocated then begin + SetTimer(FWindow.Handle, ViewTimerBaseID + Ord(ATimer), Interval, nil); + Include(FActiveTimers, ATimer); + end; +end; + +procedure TTBView.StopAllTimers; +var + I: TTBViewTimerID; +begin + for I := Low(I) to High(I) do + StopTimer(I); +end; + +procedure TTBView.StopTimer(const ATimer: TTBViewTimerID); +begin + if ATimer in FActiveTimers then begin + if (FWindow is TTBPopupWindow) and FWindow.HandleAllocated then + KillTimer(FWindow.Handle, ViewTimerBaseID + Ord(ATimer)); + Exclude(FActiveTimers, ATimer); + end; +end; + +function TTBView.OpenChildPopup(const SelectFirstItem: Boolean): Boolean; +var + Item: TTBCustomItem; +begin + StopTimer(tiClose); + StopTimer(tiOpen); + if FSelected <> FOpenViewer then begin + CloseChildPopups; + if Assigned(FSelected) then begin + Item := FSelected.Item; + if Item.Enabled and (tbisSubmenu in Item.ItemStyle) then + Item.CreatePopup(Self, FSelected, not FIsToolbar, SelectFirstItem, + False, Point(0, 0), tbpaLeft); + end; + end; + Result := Assigned(FOpenViewer); +end; + +procedure TTBView.CloseChildPopups; +begin + if Assigned(FOpenViewerView) then + FOpenViewerView.CloseChildPopups; + StopTimer(tiClose); + FOpenViewerWindow.Free; + FOpenViewerWindow := nil; + FOpenViewerView := nil; + FOpenViewer := nil; +end; + +procedure TTBView.CancelChildPopups; +begin + if FIsToolbar then + Exclude(FState, vsDropDownMenus); + CloseChildPopups; +end; + +function TTBView.ViewerFromPoint(const P: TPoint): TTBItemViewer; +var + I: Integer; +begin + ValidatePositions; + for I := 0 to FViewers.Count-1 do begin + if Viewers[I].Show and + PtInRect(Viewers[I].BoundsRect, P) then begin + Result := Viewers[I]; + Exit; + end; + end; + Result := nil; +end; + +procedure TTBView.NotifyFocusEvent; +{ Notifies Active Accessibility of a change in "focus". Has no effect if the + view or the root view lacks the vsModal state, or if the modal loop is + ending (EndModal* was called). } +var + I, ChildID, J: Integer; +begin + { Note: We don't notify about windows not yet shown (e.g. a popup menu that + is still initializing) because that would probably confuse screen readers. + Also allocating a window handle at this point *might* not be a good idea. } + if (vsModal in FState) and (vsModal in GetRootView.FState) and + not IsModalEnding and + FWindow.HandleAllocated and IsWindowVisible(FWindow.Handle) then begin + if Assigned(FSelected) and FSelected.IsAccessible then + I := IndexOf(FSelected) + else + I := -1; + if (I < 0) and Assigned(FParentView) then begin + { If we have no selected item, report the the selected item on the parent + view as having the "focus". + Note: With standard menus, when you go from having a selection to no + selection on a submenu, it sends two focus events - first with the + client window as having the focus, then with the parent item. I + figure that's probably a bug, so I don't try to emulate that behavior + here. } + FParentView.NotifyFocusEvent; + end + else begin + if I >= 0 then begin + { Convert viewer index into a one-based child index. + (TTBViewAccObject.get_accChild does the inverse.) } + ChildID := 1; + for J := 0 to I-1 do + if Viewers[J].IsAccessible then + Inc(ChildID); + end + else begin + { If there is no (accessible) selection and no parent view, report + the client window itself as being "focused". This is what happens + when a standard context menu has no selection. } + ChildID := CHILDID_SELF; + end; + CallNotifyWinEvent(EVENT_OBJECT_FOCUS, FWindow.Handle, OBJID_CLIENT, ChildID); + end; + end; +end; + +procedure TTBView.SetSelected(Value: TTBItemViewer); +begin + Select(Value, False); +end; + +procedure TTBView.Select(Value: TTBItemViewer; ViaMouse: Boolean); +{ Sets the current selection. + When the selection is changing it will also, if necessary, open/close child + popups. How exactly this works depends on the setting of ViaMouse. If + ViaMouse is True it will delay the opening/closing of popups using timers. } +var + OldSelected: TTBItemViewer; + NewMouseOverSelected: Boolean; + P: TPoint; +begin + OldSelected := FSelected; + if Value <> OldSelected then begin + { If there's a new selection and the parent item on the parent view + isn't currently selected, select it. Also stop any timer running on + the parent view. } + if Assigned(Value) and Assigned(FParentView) and + Assigned(FParentView.FOpenViewer) and + (FParentView.FSelected <> FParentView.FOpenViewer) then begin + FParentView.Selected := FParentView.FOpenViewer; + FParentView.StopTimer(tiClose); + FParentView.StopTimer(tiOpen); + end; + + { Handle automatic closing of child popups } + if vsModal in FState then begin + { If the view is a toolbar, or if the new selection didn't come from + the mouse, close child popups immediately } + if FIsToolbar or not ViaMouse then begin + { Always stop any close timer because CloseChildPopups may not be + called below } + StopTimer(tiClose); + if Value <> FOpenViewer then + { ^ But don't close if selection is returning to the open item. + Needed for the "FParentView.Selected := FParentView.FOpenViewer" + line above to work. } + CloseChildPopups; + end + else begin + { Otherwise, delay-close any child popup } + if Assigned(FOpenViewerView) and not(tiClose in FActiveTimers) then + StartTimer(tiClose, GetMenuShowDelay); + end; + end; + + CancelCapture; + if Assigned(OldSelected) then + OldSelected.Leaving; + FSelected := Value; + FSelectedViaMouse := ViaMouse; + end; + + NewMouseOverSelected := False; + if Assigned(Value) and Assigned(FWindow) then begin + P := GetMessagePosAsPoint; + if FindDragTarget(P, True) = FWindow then begin + P := FWindow.ScreenToClient(P); + NewMouseOverSelected := (ViewerFromPoint(P) = Value); + if NewMouseOverSelected and FCapture and + not Value.IsPtInButtonPart(P.X - Value.BoundsRect.Left, + P.Y - Value.BoundsRect.Top) then + NewMouseOverSelected := False; + end; + end; + + if Value <> OldSelected then begin + FMouseOverSelected := NewMouseOverSelected; + if Assigned(OldSelected) and (tbisRedrawOnSelChange in OldSelected.Item.ItemStyle) then + Invalidate(OldSelected); + if Assigned(Value) then begin + if tbisRedrawOnSelChange in Value.Item.ItemStyle then + Invalidate(Value); + Value.Entering; + end; + NotifyFocusEvent; + + { Handle automatic opening of a child popup } + if vsModal in FState then begin + { If the view is a toolbar, immediately open any child popup } + if FIsToolbar then begin + if Assigned(Value) then begin + if ViaMouse and Assigned(FParentView) then begin + { On chevron popups, always drop down menus when mouse passes + over them, like Office 2000 } + Include(FState, vsDropDownMenus); + end; + if (vsDropDownMenus in FState) and + (ViaMouse or not(tbisNoAutoOpen in Value.Item.ItemStyle)) then + OpenChildPopup(not ViaMouse); + end; + end + else begin + { Otherwise, delay-open any child popup if the selection came from + the mouse } + StopTimer(tiOpen); + if ViaMouse and Assigned(Value) and (tbisSubmenu in Value.Item.ItemStyle) then + StartTimer(tiOpen, GetMenuShowDelay); + end; + end; + end + else if FMouseOverSelected <> NewMouseOverSelected then begin + FMouseOverSelected := NewMouseOverSelected; + if Assigned(Value) and FCapture and (tbisRedrawOnMouseOverChange in Value.Item.ItemStyle) then + Invalidate(Value); + end; +end; + +procedure TTBView.UpdateSelection(const P: TPoint; const AllowNewSelection: Boolean); +{ Called in response to a mouse movement, this method updates the current + selection, updates the vsMouseInWindow view state, and enables/disables + scroll timers. } + + function IsPtInScrollArrow(ADownArrow: Boolean): Boolean; + var + P2: TPoint; + R: TRect; + begin + Result := False; + if (vsModal in FState) and (vsMouseInWindow in FState) and not FCapture and + (P.X <> Low(Integer)) then begin + P2 := FWindow.ScreenToClient(P); + R := FWindow.ClientRect; + if PtInRect(R, P2) then begin + if ADownArrow then + Result := FShowDownArrow and (P2.Y >= R.Bottom - tbMenuScrollArrowHeight) + else + Result := FShowUpArrow and (P2.Y < tbMenuScrollArrowHeight); + end; + end; + end; + +var + NewSelected, ViewerAtPoint: TTBItemViewer; + P2: TPoint; + MouseWasInWindow: Boolean; +begin + ValidatePositions; + + if FCapture then begin + { If we have the capture, don't allow the selection to change. And always + set vsMouseInWindow so that if the mouse is released outside the window, + the "remove the selection" code below will be reached the next time + UpdateSelection is called. } + NewSelected := FSelected; + Include(FState, vsMouseInWindow); + end + else begin + { If modal, default to keeping the existing selection } + if vsModal in FState then + NewSelected := FSelected + else + NewSelected := nil; + + { Is the mouse inside the window? } + MouseWasInWindow := vsMouseInWindow in FState; + if (P.X <> Low(Integer)) and Assigned(FWindow) and (FindDragTarget(P, True) = FWindow) then begin + { If we're a popup window and the mouse is inside, default to no selection } + if FIsPopup then + NewSelected := nil; + Include(FState, vsMouseInWindow); + if AllowNewSelection or Assigned(FSelected) then begin + P2 := FWindow.ScreenToClient(P); + ViewerAtPoint := ViewerFromPoint(P2); + if Assigned(ViewerAtPoint) then + NewSelected := ViewerAtPoint; + end; + end + else begin + Exclude(FState, vsMouseInWindow); + { If we're a popup window and the mouse just moved outside the window + while no submenu was open or a non-submenu-displaying item was + selected, remove the selection } + if FIsPopup and Assigned(NewSelected) and MouseWasInWindow and + (not Assigned(FOpenViewerView) or not(tbisSubmenu in NewSelected.Item.ItemStyle)) then + NewSelected := nil; + end; + end; + + { Now we set the new Selected value } + Select(NewSelected, True); + + { Update scroll arrow timers } + if IsPtInScrollArrow(False) then begin + StopTimer(tiScrollDown); + if not(tiScrollUp in FActiveTimers) then + StartTimer(tiScrollUp, 100); + end + else if IsPtInScrollArrow(True) then begin + StopTimer(tiScrollUp); + if not(tiScrollDown in FActiveTimers) then + StartTimer(tiScrollDown, 100); + end + else begin + StopTimer(tiScrollUp); + StopTimer(tiScrollDown); + end; +end; + +procedure TTBView.RecreateAllViewers; +var + Item: TTBCustomItem; + I: Integer; +begin + { Since the FViewers list is being rebuilt, FOpenViewer and FSelected + will no longer be valid, so ensure they're set to nil. } + CloseChildPopups; + Selected := nil; + + InvalidatePositions; + + FreeAndNil(FPriorityList); + FreeViewers; + FInternalViewersAtFront := 0; + FInternalViewersAtEnd := 0; + + { MDI system menu item } + Item := GetMDISystemMenuItem; + if Assigned(Item) then + Inc(FInternalViewersAtFront, InsertItemViewers(FViewers.Count, Item, 0, + False, False)); + + { Items } + if Assigned(FCurParentItem) then begin + for I := 0 to FCurParentItem.Count-1 do + InsertItemViewers(FViewers.Count, FCurParentItem.Items[I], 0, + True, False); + end; + + { MDI buttons item } + Item := GetMDIButtonsItem; + if Assigned(Item) then begin + for I := 0 to Item.Count-1 do + Inc(FInternalViewersAtEnd, InsertItemViewers(FViewers.Count, + Item.Items[I], 0, False, False)); + end; + + { Chevron item } + Item := GetChevronItem; + if Assigned(Item) then + Inc(FInternalViewersAtEnd, InsertItemViewers(FViewers.Count, Item, 0, + False, False)); +end; + +function TTBView.CalculatePositions(const CanMoveControls: Boolean; + const AOrientation: TTBViewOrientation; + AWrapOffset, AChevronOffset, AChevronSize: Integer; + var ABaseSize, TotalSize: TPoint; + var AWrappedLines: Integer): Boolean; +{ Returns True if the positions have changed } +type + TTempPosition = record + BoundsRect: TRect; + Show, OffEdge, LineSep, Clipped, SameWidth: Boolean; + { Include an Integer field to enforce Integer alignment of the record + (which we don't get by default due to TRect being wrongly declared as + 'packed'). Needed to avoid alignment fault on Delphi.NET 2007 IA-64. } + DummyAlignment: Integer; + end; + TTempPositionArrayItem = record + Pos: TTempPosition; + end; +var + DC: HDC; + LeftX, TopY, CurX, CurY: Integer; + NewPositions: array of TTempPositionArrayItem; + GroupSplit, DidWrap: Boolean; + LineStart, HighestHeightOnLine, HighestWidthOnLine: Integer; + + function GetSizeOfGroup(const StartingIndex: Integer): Integer; + var + I: Integer; + begin + Result := 0; + for I := StartingIndex to FViewers.Count-1 do begin + with NewPositions[I] do begin + if not Pos.Show then + Continue; + if tbisSeparator in Viewers[I].Item.ItemStyle then + Break; + if AOrientation <> tbvoVertical then + Inc(Result, Pos.BoundsRect.Right) + else + Inc(Result, Pos.BoundsRect.Bottom); + end; + end; + end; + + procedure Mirror; + { Reverses the horizontal ordering (i.e. first item becomes last) } + var + I, NewRight: Integer; + begin + for I := 0 to FViewers.Count-1 do + with NewPositions[I] do + if Pos.Show then begin + NewRight := TotalSize.X - Pos.BoundsRect.Left; + Pos.BoundsRect.Left := TotalSize.X - Pos.BoundsRect.Right; + Pos.BoundsRect.Right := NewRight; + end; + end; + + procedure HandleMaxHeight; + { Decreases, if necessary, the height of the view to FMaxHeight, and adjusts + the visibility of the scroll arrows } + var + MaxOffset, I, MaxTop, MaxBottom: Integer; + begin + FShowUpArrow := False; + FShowDownArrow := False; + if (FMaxHeight > 0) and (TotalSize.Y > FMaxHeight) then begin + MaxOffset := TotalSize.Y - FMaxHeight; + if FScrollOffset > MaxOffset then + FScrollOffset := MaxOffset; + if FScrollOffset < 0 then + FScrollOffset := 0; + FShowUpArrow := (FScrollOffset > 0); + FShowDownArrow := (FScrollOffset < MaxOffset); + MaxTop := 0; + if FShowUpArrow then + MaxTop := tbMenuScrollArrowHeight; + MaxBottom := FMaxHeight; + if FShowDownArrow then + Dec(MaxBottom, tbMenuScrollArrowHeight); + for I := 0 to FViewers.Count-1 do begin + with NewPositions[I] do begin + if not IsRectEmpty(Pos.BoundsRect) then begin + OffsetRect(Pos.BoundsRect, 0, -FScrollOffset); + if Pos.Show and + ((Pos.BoundsRect.Top < MaxTop) or + (Pos.BoundsRect.Bottom > MaxBottom)) then begin + Pos.Show := False; + Pos.Clipped := True; + end; + end; + end; + end; + TotalSize.Y := FMaxHeight; + end + else + FScrollOffset := 0; + end; + + procedure FinalizeLine(const LineEnd: Integer; const LastLine: Boolean); + var + I, RightAlignStart: Integer; + Item: TTBCustomItem; + IsButton: Boolean; + Z: Integer; + begin + if LineStart <> -1 then begin + if DidWrap and (FChevronParentView = nil) then begin + { When wrapping on a docked toolbar, extend TotalSize.X/Y to + AWrapOffset so that the toolbar always fills the whole row } + if (AOrientation = tbvoHorizontal) and (TotalSize.X < AWrapOffset) then + TotalSize.X := AWrapOffset + else if (AOrientation = tbvoVertical) and (TotalSize.Y < AWrapOffset) then + TotalSize.Y := AWrapOffset; + end; + RightAlignStart := -1; + for I := LineStart to LineEnd do begin + with NewPositions[I] do begin + if not Pos.Show then + Continue; + Item := Viewers[I].Item; + if (RightAlignStart < 0) and (tbisRightAlign in Item.ItemStyle) then + RightAlignStart := I; + IsButton := FIsToolbar or (tboToolbarSize in Item.FEffectiveOptions); + if FIsToolbar then begin + if LastLine and not DidWrap and (AOrientation <> tbvoFloating) then begin + { In case the toolbar is docked next to a taller/wider toolbar... } + HighestWidthOnLine := TotalSize.X; + HighestHeightOnLine := TotalSize.Y; + end; + { Make separators on toolbars as tall/wide as the tallest/widest item } + if tbisSeparator in Item.ItemStyle then begin + if AOrientation <> tbvoVertical then + Pos.BoundsRect.Bottom := Pos.BoundsRect.Top + HighestHeightOnLine + else + Pos.BoundsRect.Right := Pos.BoundsRect.Left + HighestWidthOnLine; + end + else begin + { Center the item } + if AOrientation <> tbvoVertical then begin + Z := (HighestHeightOnLine - (Pos.BoundsRect.Bottom - Pos.BoundsRect.Top)) div 2; + Inc(Pos.BoundsRect.Top, Z); + Inc(Pos.BoundsRect.Bottom, Z); + end + else begin + Z := (HighestWidthOnLine - (Pos.BoundsRect.Right - Pos.BoundsRect.Left)) div 2; + Inc(Pos.BoundsRect.Left, Z); + Inc(Pos.BoundsRect.Right, Z); + end; + end; + end + else begin + { Make items in a menu as wide as the widest item } + if not IsButton then begin + with Pos.BoundsRect do Right := Left + HighestWidthOnLine; + end; + end; + end; + end; + if RightAlignStart >= 0 then begin + Z := 0; + for I := LineEnd downto RightAlignStart do begin + with NewPositions[I] do begin + if not Pos.Show then + Continue; + if AOrientation <> tbvoVertical then + Z := Min(AWrapOffset, TotalSize.X) - Pos.BoundsRect.Right + else + Z := Min(AWrapOffset, TotalSize.Y) - Pos.BoundsRect.Bottom; + end; + Break; + end; + if Z > 0 then begin + for I := RightAlignStart to LineEnd do begin + with NewPositions[I] do begin + if not Pos.Show then + Continue; + if AOrientation <> tbvoVertical then begin + Inc(Pos.BoundsRect.Left, Z); + Inc(Pos.BoundsRect.Right, Z); + end + else begin + Inc(Pos.BoundsRect.Top, Z); + Inc(Pos.BoundsRect.Bottom, Z); + end; + end; + end; + end; + end; + end; + LineStart := -1; + HighestHeightOnLine := 0; + HighestWidthOnLine := 0; + end; + + procedure PositionItem(const CurIndex: Integer; var Pos: TTempPosition); + var + O, X, Y: Integer; + IsLineSep, Vert: Boolean; + begin + if LineStart = -1 then begin + LineStart := CurIndex; + HighestHeightOnLine := 0; + HighestWidthOnLine := 0; + end; + IsLineSep := False; + Vert := (AOrientation = tbvoVertical); + if not Vert then + O := CurX + else + O := CurY; + if (AWrapOffset > 0) and (O > 0) then begin + if not Vert then + Inc(O, Pos.BoundsRect.Right) + else + Inc(O, Pos.BoundsRect.Bottom); + if (tbisSeparator in Viewers[CurIndex].Item.ItemStyle) and + ((GroupSplit and not(tbisNoLineBreak in Viewers[CurIndex].Item.ItemStyle)) + or (O + GetSizeOfGroup(CurIndex+1) > AWrapOffset)) then begin + DidWrap := True; + Inc(AWrappedLines); + if not Vert then begin + CurX := 0; + Inc(CurY, HighestHeightOnLine); + end + else begin + CurY := 0; + Inc(CurX, HighestWidthOnLine); + end; + FinalizeLine(CurIndex-1, False); + LineStart := CurIndex+1; + if not Vert then begin + Pos.BoundsRect.Right := 0; + Pos.BoundsRect.Bottom := tbLineSpacing; + end + else begin + Pos.BoundsRect.Right := tbLineSpacing; + Pos.BoundsRect.Bottom := 0; + end; + Pos.LineSep := True; + IsLineSep := True; + end + else if O > AWrapOffset then begin + { proceed to next row } + DidWrap := True; + Inc(AWrappedLines); + if not Vert then begin + CurX := LeftX; + Inc(CurY, HighestHeightOnLine); + end + else begin + CurY := TopY; + Inc(CurX, HighestWidthOnLine); + end; + GroupSplit := True; + FinalizeLine(CurIndex-1, False); + LineStart := CurIndex; + end; + end; + if Pos.BoundsRect.Bottom > HighestHeightOnLine then + HighestHeightOnLine := Pos.BoundsRect.Bottom; + if Pos.BoundsRect.Right > HighestWidthOnLine then + HighestWidthOnLine := Pos.BoundsRect.Right; + X := CurX; + Y := CurY; + if X < 0 then X := 0; + if Y < 0 then Y := 0; + OffsetRect(Pos.BoundsRect, X, Y); + if IsLineSep then begin + if not Vert then begin + CurX := LeftX; + Inc(CurY, tbLineSpacing); + end + else begin + CurY := TopY; + Inc(CurX, tbLineSpacing); + end; + GroupSplit := False; + end; + end; + +var + SaveOrientation: TTBViewOrientation; + ChevronItem: TTBCustomItem; + CalcCanvas: TCanvas; + LastWasSep, LastWasButton, IsButton, IsControl: Boolean; + Item: TTBCustomItem; + Ctl: TControl; + ChangedBold: Boolean; + I, HighestSameWidthViewerWidth, Total, J, TotalVisibleItems: Integer; + IsFirst: Boolean; + Viewer: TTBItemViewer; + UseChevron, NonControlsOffEdge, TempViewerCreated: Boolean; + Margins: TRect; +label FoundItemToHide; +begin + SaveOrientation := FOrientation; + AWrappedLines := 1; + ChevronItem := GetChevronItem; + DC := 0; + CalcCanvas := nil; + try + FOrientation := AOrientation; + + CalcCanvas := TCanvas.Create; + DC := GetDC(0); + CalcCanvas.Handle := DC; + CalcCanvas.Font.Assign(GetFont); + + SetLength(NewPositions, FViewers.Count); + + { Figure out which items should be shown } + LastWasSep := True; { set to True initially so it won't show leading seps } + for I := 0 to FViewers.Count-1 do begin + Item := Viewers[I].Item; + IsControl := Item is TTBControlItem; + with NewPositions[I] do begin + { Pos.Show is initially False since SetLength initializes to zero } + if Item = ChevronItem then + Continue; + if Assigned(FChevronParentView) then begin + if IsControl then + Continue; + FChevronParentView.ValidatePositions; + J := I + FChevronParentView.FInternalViewersAtFront; + if J < FChevronParentView.FViewers.Count then + { range check just in case } + Viewer := FChevronParentView.Viewers[J] + else + Viewer := nil; + if (Viewer = nil) or (not Viewer.OffEdge and not(tbisSeparator in Item.ItemStyle)) then + Continue; + end; + if not IsControl then begin + if not(tbisEmbeddedGroup in Item.ItemStyle) or FCustomizing then begin + Pos.Show := Item.Visible; + { Don't display two consecutive separators } + if Pos.Show then begin + if (tbisSeparator in Item.ItemStyle) and LastWasSep then + Pos.Show := False; + LastWasSep := tbisSeparator in Item.ItemStyle; + end; + end; + end + else begin + { Controls can only be rendered on a single Parent, so only + include the control if its parent is currently equal to + FWindow } + Ctl := TTBControlItem(Item).FControl; + if Assigned(Ctl) and Assigned(FWindow) and (Ctl.Parent = FWindow) and + (Ctl.Visible or (csDesigning in Ctl.ComponentState)) then begin + Pos.Show := True; + LastWasSep := False; + end; + end; + end; + end; + + { Hide any trailing separators, so that they aren't included in the + base size } + for I := FViewers.Count-1 downto 0 do begin + with NewPositions[I] do + if Pos.Show then begin + if not(tbisSeparator in Viewers[I].Item.ItemStyle) then + Break; + Pos.Show := False; + end; + end; + + { Calculate sizes of all the items } + HighestSameWidthViewerWidth := 0; + for I := 0 to FViewers.Count-1 do begin + Item := Viewers[I].Item; + IsControl := Item is TTBControlItem; + with NewPositions[I] do begin + { Pos.BoundsRect is currently empty since SetLength initializes to zero } + if not Pos.Show then + Continue; + if not IsControl then begin + ChangedBold := False; + if tboDefault in Item.EffectiveOptions then + with CalcCanvas.Font do + if not(fsBold in Style) then begin + ChangedBold := True; + Style := Style + [fsBold]; + end; + Viewer := Viewers[I]; + TempViewerCreated := False; + if Item.NeedToRecreateViewer(Viewer) then begin + if CanMoveControls then begin + RecreateItemViewer(I); + Viewer := Viewers[I]; + end + else begin + Viewer := Item.GetItemViewerClass(Self).Create(Self, Item, 0); + TempViewerCreated := True; + end; + end; + try + Viewer.CalcSize(CalcCanvas, Pos.BoundsRect.Right, Pos.BoundsRect.Bottom); + if Viewer.UsesSameWidth then begin + Pos.SameWidth := True; + if (Pos.BoundsRect.Right > HighestSameWidthViewerWidth) then + HighestSameWidthViewerWidth := Pos.BoundsRect.Right; + end; + finally + if TempViewerCreated then + Viewer.Free; + end; + if ChangedBold then + with CalcCanvas.Font do + Style := Style - [fsBold]; + end + else begin + Ctl := TTBControlItem(Item).FControl; + Pos.BoundsRect.Right := Ctl.Width; + Pos.BoundsRect.Bottom := Ctl.Height; + end; + end; + end; + + { Increase widths of SameWidth items if necessary. Also calculate + ABaseSize.X (or Y). } + ABaseSize.X := 0; + ABaseSize.Y := 0; + for I := 0 to FViewers.Count-1 do begin + with NewPositions[I] do begin + if Pos.SameWidth and (Pos.BoundsRect.Right < HighestSameWidthViewerWidth) then + Pos.BoundsRect.Right := HighestSameWidthViewerWidth; + if AOrientation <> tbvoVertical then + Inc(ABaseSize.X, Pos.BoundsRect.Right) + else + Inc(ABaseSize.Y, Pos.BoundsRect.Bottom); + end; + end; + + { Hide partially visible items, mark them as 'OffEdge' } + if AOrientation <> tbvoVertical then + Total := ABaseSize.X + else + Total := ABaseSize.Y; + NonControlsOffEdge := False; + UseChevron := Assigned(ChevronItem) and (AChevronOffset > 0) and + (Total > AChevronOffset); + if UseChevron then begin + Dec(AChevronOffset, AChevronSize); + while Total > AChevronOffset do begin + { Count number of items. Stop loop if <= 1 } + TotalVisibleItems := 0; + for I := FViewers.Count-1 downto 0 do begin + if NewPositions[I].Pos.Show and not(tbisSeparator in Viewers[I].Item.ItemStyle) then + Inc(TotalVisibleItems); + end; + if TotalVisibleItems <= 1 then + Break; + { Hide any trailing separators } + for I := FViewers.Count-1 downto 0 do begin + if NewPositions[I].Pos.Show then begin + if not(tbisSeparator in Viewers[I].Item.ItemStyle) then + Break; + NewPositions[I].Pos.Show := False; + if AOrientation <> tbvoVertical then + Dec(Total, NewPositions[I].Pos.BoundsRect.Right) + else + Dec(Total, NewPositions[I].Pos.BoundsRect.Bottom); + goto FoundItemToHide; + end; + end; + { Find an item to hide } + if Assigned(FPriorityList) then + I := FPriorityList.Count-1 + else + I := FViewers.Count-1; + while I >= 0 do begin + if Assigned(FPriorityList) then begin + Viewer := TTBItemViewer(FPriorityList[I]); + J := Viewer.Index; + end + else begin + Viewer := Viewers[I]; + J := I; + end; + if NewPositions[J].Pos.Show and not(tbisSeparator in Viewer.Item.ItemStyle) then begin + NewPositions[J].Pos.Show := False; + NewPositions[J].Pos.OffEdge := True; + if AOrientation <> tbvoVertical then + Dec(Total, NewPositions[J].Pos.BoundsRect.Right) + else + Dec(Total, NewPositions[J].Pos.BoundsRect.Bottom); + if not NonControlsOffEdge and not(Viewer.Item is TTBControlItem) then + NonControlsOffEdge := True; + goto FoundItemToHide; + end; + Dec(I); + end; + Break; { prevent endless loop } + FoundItemToHide: + { Don't show two consecutive separators } + LastWasSep := True; { set to True initially so it won't show leading seps } + for J := 0 to FViewers.Count-1 do begin + Item := Viewers[J].Item; + with NewPositions[J] do begin + if Pos.Show then begin + if (tbisSeparator in Item.ItemStyle) and LastWasSep then begin + Pos.Show := False; + if AOrientation <> tbvoVertical then + Dec(Total, Pos.BoundsRect.Right) + else + Dec(Total, Pos.BoundsRect.Bottom); + end; + LastWasSep := tbisSeparator in Item.ItemStyle; + end; + end; + end; + end; + end; + + { Hide any trailing separators after items were hidden } + for I := FViewers.Count-1 downto 0 do begin + with NewPositions[I] do + if Pos.Show then begin + if not(tbisSeparator in Viewers[I].Item.ItemStyle) then + Break; + Pos.Show := False; + end; + end; + + { Set the ABaseSize.Y (or X) *after* items were hidden } + for I := 0 to FViewers.Count-1 do begin + with NewPositions[I] do + if Pos.Show then begin + if AOrientation <> tbvoVertical then begin + if Pos.BoundsRect.Bottom > ABaseSize.Y then + ABaseSize.Y := Pos.BoundsRect.Bottom; + end + else begin + if Pos.BoundsRect.Right > ABaseSize.X then + ABaseSize.X := Pos.BoundsRect.Right; + end; + end; + end; + + { On menus, set all non-separator items to be as tall as the tallest item } + {if not FIsToolbar then begin + J := 0; + for I := 0 to FViewers.Count-1 do begin + Item := Viewers[I].Item; + with NewPositions[I] do + if Pos.Show and not(tbisSeparator in Item.ItemStyle) and + not(tboToolbarSize in Item.FEffectiveOptions) and + (Pos.BoundsRect.Bottom - Pos.BoundsRect.Top > J) then + J := Pos.BoundsRect.Bottom - Pos.BoundsRect.Top; + end; + for I := 0 to FViewers.Count-1 do begin + Item := Viewers[I].Item; + with NewPositions[I] do + if Pos.Show and not(tbisSeparator in Item.ItemStyle) and + not(tboToolbarSize in Item.FEffectiveOptions) then + Pos.BoundsRect.Bottom := Pos.BoundsRect.Top + J; + end; + end;} + + { Calculate the position of the items } + GetMargins(AOrientation, Margins); + LeftX := Margins.Left; + TopY := Margins.Top; + if AWrapOffset > 0 then begin + Dec(AWrapOffset, Margins.Right); + if AWrapOffset < 1 then AWrapOffset := 1; + end; + CurX := LeftX; + CurY := TopY; + GroupSplit := False; + DidWrap := False; + LastWasButton := FIsToolbar; + LineStart := -1; + for I := 0 to FViewers.Count-1 do begin + Item := Viewers[I].Item; + with NewPositions[I] do begin + if not Pos.Show then + Continue; + IsButton := FIsToolbar or (tboToolbarSize in Item.FEffectiveOptions); + if LastWasButton and not IsButton then begin + { On a menu, if last item was a button and the current item isn't, + proceed to next row } + CurX := LeftX; + CurY := TotalSize.Y; + end; + LastWasButton := IsButton; + PositionItem(I, NewPositions[I].Pos); + if IsButton and (AOrientation <> tbvoVertical) then + Inc(CurX, Pos.BoundsRect.Right - Pos.BoundsRect.Left) + else + Inc(CurY, Pos.BoundsRect.Bottom - Pos.BoundsRect.Top); + if Pos.BoundsRect.Right > TotalSize.X then + TotalSize.X := Pos.BoundsRect.Right; + if Pos.BoundsRect.Bottom > TotalSize.Y then + TotalSize.Y := Pos.BoundsRect.Bottom; + end; + end; + if FViewers.Count <> 0 then + FinalizeLine(FViewers.Count-1, True); + Inc(TotalSize.X, Margins.Right); + Inc(TotalSize.Y, Margins.Bottom); + if AOrientation = tbvoVertical then + Mirror; + HandleMaxHeight; + if CanMoveControls then begin + for I := 0 to FViewers.Count-1 do begin + Item := Viewers[I].Item; + if Item is TTBControlItem then begin + if NewPositions[I].Pos.Show then begin + Ctl := TTBControlItem(Item).FControl; + if not EqualRect(NewPositions[I].Pos.BoundsRect, Ctl.BoundsRect) then + Ctl.BoundsRect := NewPositions[I].Pos.BoundsRect; + end + else if NewPositions[I].Pos.OffEdge or NewPositions[I].Pos.Clipped then begin + { Simulate hiding of OddEdge controls by literally moving them + off the edge. Do the same for Clipped controls. } + Ctl := TTBControlItem(Item).FControl; + Ctl.SetBounds(FWindow.ClientWidth, FWindow.ClientHeight, + Ctl.Width, Ctl.Height); + end; + end; + end; + end; + { Set size of line separators } + if FIsToolbar then + for I := 0 to FViewers.Count-1 do begin + Item := Viewers[I].Item; + with NewPositions[I] do + if Pos.Show and (tbisSeparator in Item.ItemStyle) and + Pos.LineSep then begin + if AOrientation <> tbvoVertical then + Pos.BoundsRect.Right := TotalSize.X + else + Pos.BoundsRect.Bottom := TotalSize.Y; + end; + end; + + { Position the chevron item } + if UseChevron then begin + if CanMoveControls then + ChevronItem.Enabled := NonControlsOffEdge; + NewPositions[FViewers.Count-1].Pos.Show := True; + I := AChevronOffset; + if AOrientation <> tbvoVertical then begin + if I < TotalSize.X then + I := TotalSize.X; + NewPositions[FViewers.Count-1].Pos.BoundsRect := Bounds(I, 0, + AChevronSize, TotalSize.Y); + end + else begin + if I < TotalSize.Y then + I := TotalSize.Y; + NewPositions[FViewers.Count-1].Pos.BoundsRect := Bounds(0, I, + TotalSize.X, AChevronSize); + end; + end; + + { Commit changes } + Result := False; + if CanMoveControls then begin + for I := 0 to FViewers.Count-1 do begin + Viewer := Viewers[I]; + with NewPositions[I] do begin + if not Result and + (not EqualRect(Viewer.BoundsRect, Pos.BoundsRect) or + (Viewer.Show <> Pos.Show) or + ((tbisLineSep in Viewer.State) <> Pos.LineSep)) then + Result := True; + Viewer.FBoundsRect := Pos.BoundsRect; + Viewer.FShow := Pos.Show; + Viewer.FOffEdge := Pos.OffEdge; + Viewer.FClipped := Pos.Clipped; + if Pos.LineSep then + Include(Viewer.State, tbisLineSep) + else + Exclude(Viewer.State, tbisLineSep); + end; + end; + end; + finally + FOrientation := SaveOrientation; + if Assigned(CalcCanvas) then + CalcCanvas.Handle := 0; + if DC <> 0 then ReleaseDC(0, DC); + CalcCanvas.Free; + end; + if (ABaseSize.X = 0) or (ABaseSize.Y = 0) then begin + { If there are no visible items... } + {}{scale this?} + ABaseSize.X := 23; + ABaseSize.Y := 22; + if TotalSize.X < 23 then TotalSize.X := 23; + if TotalSize.Y < 22 then TotalSize.Y := 22; + end; +end; + +procedure TTBView.DoUpdatePositions(var ASize: TPoint); +{ This is called by UpdatePositions } +var + WrappedLines: Integer; +begin + { Don't call InvalidatePositions before CalculatePositions so that + endless recursion doesn't happen if an item's CalcSize uses a method that + calls ValidatePositions } + CalculatePositions(True, FOrientation, FWrapOffset, FChevronOffset, + FChevronSize, FBaseSize, ASize, WrappedLines); + FValidated := True; + { Need to call ValidateRect before AutoSize, otherwise Windows will + erase the client area during a resize } + if FWindow.HandleAllocated then + ValidateRect(FWindow.Handle, nil); + AutoSize(ASize.X, ASize.Y); + if FWindow.HandleAllocated then + DoubleBufferedRepaint(FWindow.Handle); +end; + +function TTBView.UpdatePositions: TPoint; +{ Called whenever the size or orientation of a view changes. When items are + added or removed from the view, InvalidatePositions must be called instead, + otherwise the view may not be redrawn properly. } +begin + Result.X := 0; + Result.Y := 0; + DoUpdatePositions(Result); +end; + +procedure TTBView.AutoSize(AWidth, AHeight: Integer); +begin +end; + +function TTBView.GetChevronItem: TTBCustomItem; +begin + Result := nil; +end; + +procedure TTBView.GetMargins(AOrientation: TTBViewOrientation; + var Margins: TRect); +begin + if AOrientation = tbvoFloating then begin + Margins.Left := 4; + Margins.Top := 2; + Margins.Right := 4; + Margins.Bottom := 1; + end + else begin + Margins.Left := 0; + Margins.Top := 0; + Margins.Right := 0; + Margins.Bottom := 0; + end; +end; + +function TTBView.GetMDIButtonsItem: TTBCustomItem; +begin + Result := nil; +end; + +function TTBView.GetMDISystemMenuItem: TTBCustomItem; +begin + Result := nil; +end; + +function TTBView.GetFont: TFont; +begin + if Assigned(ToolbarFont) then + Result := ToolbarFont + else begin + { ToolbarFont is destroyed during unit finalization, but in rare cases + this method may end up being called from ValidatePositions *after* + unit finalization if Application.Run is never called; see the + "EConvertError" newsgroup thread. We can't return nil because that would + cause an exception in the calling function, so just return the window + font. It's not the *right* font, but it shouldn't matter since the app + is exiting anyway. } + Result := {$IFNDEF CLR}TControlAccess{$ENDIF}(FWindow).Font; + end; +end; + +procedure TTBView.DrawItem(Viewer: TTBItemViewer; DrawTo: TCanvas; + Offscreen: Boolean); +const + COLOR_MENUHILIGHT = 29; + clMenuHighlight = TColor(COLOR_MENUHILIGHT or $80000000); +var + Bmp: TBitmap; + DrawToDC, BmpDC: HDC; + DrawCanvas: TCanvas; + R1, R2, R3: TRect; + IsOpen, IsSelected, IsPushed: Boolean; + ToolbarStyle: Boolean; + UseDisabledShadow: Boolean; + SaveIndex, SaveIndex2: Integer; + WindowOrg: TPoint; + BkColor: TColor; +begin + ValidatePositions; + + if tbisInvalidated in Viewer.State then begin + Offscreen := True; + Exclude(Viewer.State, tbisInvalidated); + end; + + R1 := Viewer.BoundsRect; + if not Viewer.Show or IsRectEmpty(R1) or (Viewer.Item is TTBControlItem) then + Exit; + R2 := R1; + OffsetRect(R2, -R2.Left, -R2.Top); + + IsOpen := FOpenViewer = Viewer; + IsSelected := (FSelected = Viewer); + IsPushed := IsSelected and (IsOpen or (FMouseOverSelected and FCapture)); + ToolbarStyle := Viewer.IsToolbarStyle; + + DrawToDC := DrawTo.Handle; + Bmp := nil; + { Must deselect any currently selected handles before calling SaveDC, because + if they are left selected and DeleteObject gets called on them after the + SaveDC call, it will fail on Win9x/Me, and thus leak GDI resources. } + DrawTo.Refresh; + SaveIndex := SaveDC(DrawToDC); + try + IntersectClipRect(DrawToDC, R1.Left, R1.Top, R1.Right, R1.Bottom); + GetClipBox(DrawToDC, R3); + if IsRectEmpty(R3) then + Exit; + + if not Offscreen then begin + MoveWindowOrg(DrawToDC, R1.Left, R1.Top); + { Tweak the brush origin so that the checked background drawn behind + checked items always looks the same regardless of whether the item + is positioned on an even or odd Left or Top coordinate. } + if GetWindowOrgEx(DrawToDC, WindowOrg) then + SetBrushOrgEx(DrawToDC, -WindowOrg.X, -WindowOrg.Y, nil); + DrawCanvas := DrawTo; + end + else begin + Bmp := TBitmap.Create; + Bmp.Width := R2.Right; + Bmp.Height := R2.Bottom; + DrawCanvas := Bmp.Canvas; + BmpDC := DrawCanvas.Handle; + SaveIndex2 := SaveDC(BmpDC); + SetWindowOrgEx(BmpDC, R1.Left, R1.Top, nil); + FWindow.Perform(WM_ERASEBKGND, WPARAM(BmpDC), 0); + RestoreDC(BmpDC, SaveIndex2); + end; + + { Initialize brush } + if not ToolbarStyle and IsSelected then begin + {$IFNDEF TB2K_USE_STRICT_O2K_MENU_STYLE} + if AreFlatMenusEnabled then + { Windows XP uses a different fill color for selected menu items when + flat menus are enabled } + DrawCanvas.Brush.Color := clMenuHighlight + else + {$ENDIF} + DrawCanvas.Brush.Color := clHighlight; + end + else + DrawCanvas.Brush.Style := bsClear; + + { Initialize font } + DrawCanvas.Font.Assign(GetFont); + if Viewer.Item.Enabled then begin + if not ToolbarStyle and IsSelected then + DrawCanvas.Font.Color := clHighlightText + else begin + if ToolbarStyle then + DrawCanvas.Font.Color := clBtnText + else + DrawCanvas.Font.Color := tbMenuTextColor; + end; + UseDisabledShadow := False; + end + else begin + DrawCanvas.Font.Color := clGrayText; + { Use the disabled shadow if either: + 1. The item is a toolbar-style item. + 2. The item is not selected, and the background color equals the + button-face color. + 3. The gray-text color is the same as the background color. + Note: Windows actually uses dithered text in this case. } + BkColor := ColorToRGB({$IFNDEF CLR}TControlAccess{$ENDIF}(FWindow).Color); + UseDisabledShadow := ToolbarStyle or + (not IsSelected and (BkColor = ColorToRGB(clBtnFace))) or + (ColorToRGB(clGrayText) = BkColor); + end; + + Viewer.Paint(DrawCanvas, R2, IsSelected, IsPushed, UseDisabledShadow); + + if Offscreen then + BitBlt(DrawToDC, R1.Left, R1.Top, Bmp.Width, Bmp.Height, DrawCanvas.Handle, + 0, 0, SRCCOPY); + finally + DrawTo.Refresh; { must do this before a RestoreDC } + RestoreDC(DrawToDC, SaveIndex); + Bmp.Free; + end; +end; + +procedure TTBView.DrawSubitems(ACanvas: TCanvas); +var + ClipRect: TRect; + + procedure DoDraw(const AViewer: TTBItemViewer); + var + Temp: TRect; + begin + { Speed optimization: Only call DrawItem on viewers that intersect the + canvas's clipping rectangle. Without this check, moving the mouse across + a toolbar with thousands of visible items uses 100% of the CPU. } + if AViewer.Show and IntersectRect(Temp, ClipRect, AViewer.BoundsRect) then + DrawItem(AViewer, ACanvas, False) + else begin + { Not going to draw the item. Go ahead and clear the tbisInvalidated + flag if it's set so it won't needlessly double-buffer next time. } + Exclude(AViewer.State, tbisInvalidated); + end; + end; + +var + I: Integer; +begin + ValidatePositions; + ClipRect := ACanvas.ClipRect; + + { Draw non-selected items before drawing the selected item, so that when the + selection is changing there's no brief window in which two items appear + to be selected } + for I := 0 to FViewers.Count-1 do begin + if (vsDrawInOrder in FState) or (Viewers[I] <> FSelected) then + DoDraw(Viewers[I]); + end; + if not(vsDrawInOrder in FState) and Assigned(FSelected) then + DoDraw(FSelected); + + Exclude(FState, vsDrawInOrder); +end; + +procedure TTBView.Invalidate(AViewer: TTBItemViewer); +begin + if not FValidated or not Assigned(FWindow) or not FWindow.HandleAllocated then + Exit; + if AViewer.Show and not IsRectEmpty(AViewer.BoundsRect) and + not(AViewer.Item is TTBControlItem) then begin + Include(AViewer.State, tbisInvalidated); + InvalidateRect(FWindow.Handle, {$IFNDEF CLR}@{$ENDIF} AViewer.BoundsRect, False); + end; +end; + +procedure TTBView.SetAccelsVisibility(AShowAccels: Boolean); +var + I: Integer; + Viewer: TTBItemViewer; +begin + { Always show accels when keyboard cues are enabled } + AShowAccels := AShowAccels or not(vsUseHiddenAccels in FStyle) or + AreKeyboardCuesEnabled; + if AShowAccels <> (vsShowAccels in FState) then begin + if AShowAccels then + Include(FState, vsShowAccels) + else + Exclude(FState, vsShowAccels); + if Assigned(FWindow) and FWindow.HandleAllocated and + IsWindowVisible(FWindow.Handle) then + { ^ the visibility check is just an optimization } + for I := 0 to FViewers.Count-1 do begin + Viewer := Viewers[I]; + if Viewer.CaptionShown and + (FindAccelChar(Viewer.GetCaptionText) <> #0) then + Invalidate(Viewer); + end; + end; +end; + +function TTBView.FirstSelectable: TTBItemViewer; +var + FirstViewer: TTBItemViewer; +begin + Result := NextSelectable(nil, True); + if Assigned(Result) then begin + FirstViewer := Result; + while tbisDontSelectFirst in Result.Item.ItemStyle do begin + Result := NextSelectable(Result, True); + if Result = FirstViewer then + { don't loop endlessly if all items have the tbisDontSelectFirst style } + Break; + end; + end; +end; + +function TTBView.NextSelectable(CurViewer: TTBItemViewer; + GoForward: Boolean): TTBItemViewer; +var + I, J: Integer; +begin + ValidatePositions; + Result := nil; + if FViewers.Count = 0 then Exit; + J := -1; + I := IndexOf(CurViewer); + while True do begin + if GoForward then begin + Inc(I); + if I >= FViewers.Count then I := 0; + end + else begin + Dec(I); + if I < 0 then I := FViewers.Count-1; + end; + if J = -1 then + J := I + else + if I = J then + Exit; + if (Viewers[I].Show or Viewers[I].Clipped) and Viewers[I].Item.Visible and + (tbisSelectable in Viewers[I].Item.ItemStyle) then + Break; + end; + Result := Viewers[I]; +end; + +function TTBView.NextSelectableWithAccel(CurViewer: TTBItemViewer; + Key: Char; RequirePrimaryAccel: Boolean; var IsOnlyItemWithAccel: Boolean): TTBItemViewer; + + function IsAccelItem(const Index: Integer; + const Primary, EnabledItems: Boolean): Boolean; + var + S: String; + LastAccel: Char; + Viewer: TTBItemViewer; + Item: TTBCustomItem; + begin + Result := False; + Viewer := Viewers[Index]; + Item := Viewer.Item; + if (Viewer.Show or Viewer.Clipped) and (tbisSelectable in Item.ItemStyle) and + (Item.Enabled = EnabledItems) and + Item.Visible and Viewer.CaptionShown then begin + S := Viewer.GetCaptionText; + if S <> '' then begin + LastAccel := FindAccelChar(S); + if Primary then begin + if LastAccel <> #0 then + Result := (CharToLower(LastAccel) = CharToLower(Key)); + end + else + if (LastAccel = #0) and (Key <> ' ') then + Result := (CharToLower(S[1]) = CharToLower(Key)); + end; + end; + end; + + function FindAccel(I: Integer; + const Primary, EnabledItems: Boolean): Integer; + var + J: Integer; + begin + Result := -1; + J := -1; + while True do begin + Inc(I); + if I >= FViewers.Count then I := 0; + if J = -1 then + J := I + else + if I = J then + Break; + if IsAccelItem(I, Primary, EnabledItems) then begin + Result := I; + Break; + end; + end; + end; + +var + Start, I: Integer; + Primary, EnabledItems: Boolean; +begin + ValidatePositions; + Result := nil; + IsOnlyItemWithAccel := False; + if FViewers.Count = 0 then Exit; + + Start := IndexOf(CurViewer); + for Primary := True downto False do + if not RequirePrimaryAccel or Primary then + for EnabledItems := True downto False do begin + I := FindAccel(Start, Primary, EnabledItems); + if I <> -1 then begin + Result := Viewers[I]; + IsOnlyItemWithAccel := not EnabledItems or + (FindAccel(I, Primary, EnabledItems) = I); + Exit; + end; + end; +end; + +procedure TTBView.EnterToolbarLoop(Options: TTBEnterToolbarLoopOptions); +var + ModalHandler: TTBModalHandler; +begin + if vsModal in FState then Exit; + ModalHandler := TTBModalHandler.Create(FWindow.Handle); + try + { remove all states except... } + FState := FState * [vsShowAccels]; + try + Include(FState, vsModal); + { Must ensure that DoneAction is reset to tbdaNone *before* calling + NotifyFocusEvent so that the IsModalEnding call it makes won't return + True } + FDoneActionData.DoneAction := tbdaNone; + { Now that the vsModal state has been added, send an MSAA focus event } + if Assigned(Selected) then + NotifyFocusEvent; + ModalHandler.Loop(Self, tbetMouseDown in Options, + tbetExecuteSelected in Options, tbetFromMSAA in Options, False); + finally + { Remove vsModal state from the root view before any TTBView.Destroy + methods get called (as a result of the CloseChildPopups call below), + so that NotifyFocusEvent becomes a no-op } + Exclude(FState, vsModal); + StopAllTimers; + CloseChildPopups; + UpdateSelection(Point(Low(Integer), Low(Integer)), True); + end; + finally + ModalHandler.Free; + end; + SetAccelsVisibility(False); + ProcessDoneAction(FDoneActionData, False); +end; + +procedure TTBView.SetCustomizing(Value: Boolean); +begin + if FCustomizing <> Value then begin + FCustomizing := Value; + RecreateAllViewers; + end; +end; + +procedure TTBView.BeginUpdate; +begin + Inc(FUpdating); +end; + +procedure TTBView.EndUpdate; +begin + Dec(FUpdating); + if FUpdating = 0 then + TryValidatePositions; +end; + +procedure TTBView.GetOffEdgeControlList(const List: TList); +var + I: Integer; + Item: TTBCustomItem; +begin + for I := 0 to FViewers.Count-1 do begin + Item := Viewers[I].Item; + if (Item is TTBControlItem) and Viewers[I].OffEdge and + (TTBControlItem(Item).FControl is TWinControl) then + List.Add(TTBControlItem(Item).FControl); + end; +end; + +procedure TTBView.SetCapture; +begin + FCapture := True; +end; + +procedure TTBView.CancelCapture; +begin + if FCapture then begin + FCapture := False; + LastPos.X := Low(LastPos.X); + if Assigned(FSelected) then + FSelected.LosingCapture; + end; +end; + +procedure TTBView.KeyDown(var Key: Word; Shift: TShiftState); + + procedure SelNextItem(const ParentView: TTBView; const GoForward: Boolean); + begin + ParentView.Selected := ParentView.NextSelectable(ParentView.FSelected, + GoForward); + ParentView.ScrollSelectedIntoView; + end; + + procedure HelpKey; + var + V: TTBView; + ContextID: Integer; + begin + ContextID := 0; + V := Self; + while Assigned(V) do begin + if Assigned(V.FSelected) then begin + ContextID := V.FSelected.Item.HelpContext; + if ContextID <> 0 then Break; + end; + V := V.FParentView; + end; + if ContextID <> 0 then + EndModalWithHelp(ContextID); + end; + +var + ParentTBView: TTBView; +begin + ParentTBView := GetParentToolbarView; + case Key of + VK_TAB: begin + SelNextItem(Self, GetKeyState(VK_SHIFT) >= 0); + end; + VK_RETURN: begin + ExecuteSelected(True); + end; + VK_MENU, VK_F10: begin + EndModal; + end; + VK_ESCAPE: begin + Key := 0; + if FParentView = nil then + EndModal + else + FParentView.CancelChildPopups; + end; + VK_LEFT, VK_RIGHT: begin + if (Self = ParentTBView) and (Orientation = tbvoVertical) then + OpenChildPopup(True) + else if Key = VK_LEFT then begin + if Assigned(ParentTBView) and (ParentTBView.Orientation <> tbvoVertical) then begin + if (Self = ParentTBView) or + (FParentView = ParentTBView) then + SelNextItem(ParentTBView, False) + else + FParentView.CloseChildPopups; + end + else begin + if Assigned(FParentView) then + FParentView.CancelChildPopups; + end; + end + else begin + if ((Self = ParentTBView) or not OpenChildPopup(True)) and + (Assigned(ParentTBView) and (ParentTBView.Orientation <> tbvoVertical)) then begin + { If we're on ParentTBView, or if the selected item can't display + a submenu, proceed to next item on ParentTBView } + SelNextItem(ParentTBView, True); + end; + end; + end; + VK_UP, VK_DOWN: begin + if (Self = ParentTBView) and (Orientation <> tbvoVertical) then + OpenChildPopup(True) + else + SelNextItem(Self, Key = VK_DOWN); + end; + VK_HOME, VK_END: begin + Selected := NextSelectable(nil, Key = VK_HOME); + ScrollSelectedIntoView; + end; + VK_F1: HelpKey; + else + Exit; { don't set Key to 0 for unprocessed keys } + end; + Key := 0; +end; + +function TTBView.IsModalEnding: Boolean; +begin + Result := (GetRootView.FDoneActionData.DoneAction <> tbdaNone); +end; + +procedure TTBView.EndModal; +var + RootView: TTBView; +begin + RootView := GetRootView; + RootView.FDoneActionData.DoneAction := tbdaCancel; +end; + +procedure TTBView.EndModalWithClick(AViewer: TTBItemViewer); +var + RootView: TTBView; +begin + RootView := GetRootView; + RootView.FDoneActionData.ClickItem := AViewer.Item; + RootView.FDoneActionData.Sound := AViewer.FView.FIsPopup; + RootView.FDoneActionData.DoneAction := tbdaClickItem; +end; + +procedure TTBView.EndModalWithHelp(AContextID: Integer); +var + RootView: TTBView; +begin + RootView := GetRootView; + RootView.FDoneActionData.ContextID := AContextID; + RootView.FDoneActionData.DoneAction := tbdaHelpContext; +end; + +procedure TTBView.EndModalWithSystemMenu(AWnd: HWND; AKey: Word); +var + RootView: TTBView; +begin + RootView := GetRootView; + RootView.FDoneActionData.Wnd := AWnd; + RootView.FDoneActionData.Key := AKey; + RootView.FDoneActionData.DoneAction := tbdaOpenSystemMenu; +end; + +procedure TTBView.ExecuteSelected(AGivePriority: Boolean); +{ Normally called after an Enter or accelerator key press on the view, this + method 'executes' or opens the selected item. It ends the modal loop, except + when a submenu is opened. } +var + Item: TTBCustomItem; +begin + if Assigned(FSelected) and FSelected.Item.Enabled then begin + Item := FSelected.Item; + if (tbisCombo in Item.ItemStyle) or not OpenChildPopup(True) then begin + if tbisSelectable in Item.ItemStyle then + FSelected.Execute(AGivePriority) + else + EndModal; + end + end + else + EndModal; + {$IFNDEF CLR} + Exit; asm db 0,'Toolbar2000 (C) 1998-2008 Jordan Russell',0 end; + {$ENDIF} +end; + +procedure TTBView.Scroll(ADown: Boolean); +var + CurPos, NewPos, I: Integer; +begin + ValidatePositions; + if ADown then begin + NewPos := High(NewPos); + CurPos := FMaxHeight - tbMenuScrollArrowHeight; + for I := 0 to FViewers.Count-1 do begin + with Viewers[I] do + if Clipped and not(tbisSeparator in Item.ItemStyle) and + (BoundsRect.Bottom < NewPos) and (BoundsRect.Bottom > CurPos) then + NewPos := BoundsRect.Bottom; + end; + if NewPos = High(NewPos) then + Exit; + Dec(NewPos, FMaxHeight - tbMenuScrollArrowHeight); + end + else begin + NewPos := Low(NewPos); + CurPos := tbMenuScrollArrowHeight; + for I := 0 to FViewers.Count-1 do begin + with Viewers[I] do + if Clipped and not(tbisSeparator in Item.ItemStyle) and + (BoundsRect.Top > NewPos) and (BoundsRect.Top < CurPos) then + NewPos := BoundsRect.Top; + end; + if NewPos = Low(NewPos) then + Exit; + Dec(NewPos, tbMenuScrollArrowHeight); + end; + Inc(FScrollOffset, NewPos); + UpdatePositions; +end; + +procedure TTBView.ScrollSelectedIntoView; +begin + ValidatePositions; + if (FSelected = nil) or not FSelected.Clipped then + Exit; + + if FSelected.BoundsRect.Top < tbMenuScrollArrowHeight then begin + Dec(FScrollOffset, tbMenuScrollArrowHeight - FSelected.BoundsRect.Top); + UpdatePositions; + end + else if FSelected.BoundsRect.Bottom > FMaxHeight - tbMenuScrollArrowHeight then begin + Dec(FScrollOffset, (FMaxHeight - tbMenuScrollArrowHeight) - + FSelected.BoundsRect.Bottom); + UpdatePositions; + end; +end; + +procedure TTBView.SetUsePriorityList(Value: Boolean); +begin + if FUsePriorityList <> Value then begin + FUsePriorityList := Value; + RecreateAllViewers; + end; +end; + +function TTBView.GetCaptureWnd: HWND; +begin + Result := GetRootView.FCaptureWnd; +end; + +procedure TTBView.CancelMode; +var + View: TTBView; +begin + EndModal; + + { Hide all parent/child popup windows. Can't actually destroy them using + CloseChildPopups because this method may be called while inside + TTBEditItemViewer's message loop, and it could result in the active + TTBEditItemViewer instance being destroyed (leading to an AV). } + View := Self; + while Assigned(View.FOpenViewerView) do + View := View.FOpenViewerView; + repeat + View.StopAllTimers; + if View.FWindow is TTBPopupWindow then + View.FWindow.Visible := False; + View := View.FParentView; + until View = nil; + + { Note: This doesn't remove the selection from a top-level toolbar item. + Unfortunately, we can't do 'Selected := nil' because it would destroy + child popups and that must'nt happen for the reason stated above. } +end; + +procedure TTBView.HandleHintShowMessage(var Message: TCMHintShow); + + procedure UpdateInfo(var Info: {$IFDEF JR_D12}Controls.{$ENDIF} THintInfo); + var + V: TTBItemViewer; + begin + Info.HintStr := ''; + V := ViewerFromPoint(Info.CursorPos); + if Assigned(V) then begin + Info.CursorRect := V.BoundsRect; + Info.HintStr := V.GetHintText; + Info.HintData := V; + end; + end; + +{$IFNDEF CLR} +begin + UpdateInfo(Message.HintInfo^); +end; +{$ELSE} +var + Info: THintInfo; +begin + Info := Message.HintInfo; + UpdateInfo(Info); + Message.HintInfo := Info; +end; +{$ENDIF} + + +{ TTBModalHandler } + +constructor TTBModalHandler.Create(AExistingWnd: HWND); + + procedure RemoveFocusIfOnOtherThread; + { This ensures that the message loop will receive key messages when an Adobe + Reader (8.1.2) control embedded in a TWebBrowser is currently focused. + The Reader control is actually hosted in a separate thread (in a separate + process, AcroRd32.exe). When Alt/Alt+[letter] is pressed, Reader calls + GetAncestor(..., GA_ROOT) and forwards the WM_SYSCOMMAND/WM_SYSCHAR + message to that window using SendMessage (not PostMessage, for some + reason). The focus, however, is left on the Reader control. Consequently, + any keystrokes will generate key messages in the Reader thread's queue + instead of ours. To avoid that, call SetFocus(0) to remove the focus if + it's currently on another thread's window. When no window has the focus, + key messages will be posted to the active window, which *should* be a + form owned by the same thread as us. } + var + FocusWnd: HWND; + begin + FocusWnd := GetFocus; + if (FocusWnd <> 0) and + (GetWindowThreadProcessId(FocusWnd, nil) <> GetCurrentThreadId) then begin + FSaveFocusWnd := FocusWnd; + SetFocus(0); + end; + end; + +begin + inherited Create; + LastPos := GetMessagePosAsPoint; + if AExistingWnd <> 0 then + FWnd := AExistingWnd + else begin + FWnd := {$IFDEF ALLOCHWND_CLASSES}Classes.{$ENDIF} AllocateHWnd(WndProc); + FCreatedWnd := True; + end; + RemoveFocusIfOnOtherThread; + { Like standard menus, don't allow other apps to steal the focus during + our modal loop. This also prevents us from losing activation when + "active window tracking" is enabled and the user moves the mouse over + another application's window. } + CallLockSetForegroundWindow(True); + SetCapture(FWnd); + SetCursor(LoadCursor(0, IDC_ARROW)); + CallNotifyWinEvent(EVENT_SYSTEM_MENUSTART, FWnd, OBJID_CLIENT, CHILDID_SELF); + FInited := True; +end; + +destructor TTBModalHandler.Destroy; +begin + CallLockSetForegroundWindow(False); + if FWnd <> 0 then begin + if GetCapture = FWnd then + ReleaseCapture; + if FInited then + CallNotifyWinEvent(EVENT_SYSTEM_MENUEND, FWnd, OBJID_CLIENT, CHILDID_SELF); + if FCreatedWnd then + {$IFDEF ALLOCHWND_CLASSES}Classes.{$ENDIF} DeallocateHWnd(FWnd); + end; + if (FSaveFocusWnd <> 0) and (GetFocus = 0) then + SetFocus(FSaveFocusWnd); + inherited; +end; + +procedure TTBModalHandler.WndProc(var Msg: TMessage); +begin + Msg.Result := DefWindowProc(FWnd, Msg.Msg, Msg.WParam, Msg.LParam); + if (Msg.Msg = WM_CANCELMODE) and Assigned(FRootPopup) then begin + try + { We can receive a WM_CANCELMODE message during a modal loop if a dialog + pops up. Respond by hiding menus to make it look like the modal loop + has returned, even though it really hasn't yet. + Note: Similar code in TTBCustomToolbar.WMCancelMode. } + FRootPopup.View.CancelMode; + except + Application.HandleException(Self); + end; + end; +end; + +procedure TTBModalHandler.Loop(const RootView: TTBView; + const AMouseDown, AExecuteSelected, AFromMSAA, TrackRightButton: Boolean); +var + OriginalActiveWindow: HWND; + + function GetActiveView: TTBView; + begin + Result := RootView; + while Assigned(Result.FOpenViewerView) do + Result := Result.FOpenViewerView; + end; + + function GetCaptureView: TTBView; + begin + Result := RootView; + while Assigned(Result) and not Result.FCapture do + Result := Result.FOpenViewerView; + end; + + procedure UpdateAllSelections(const P: TPoint; const AllowNewSelection: Boolean); + var + View, CapView: TTBView; + begin + View := GetActiveView; + CapView := GetCaptureView; + while Assigned(View) do begin + if (CapView = nil) or (View = CapView) then + View.UpdateSelection(P, AllowNewSelection); + View := View.FParentView; + end; + end; + + function GetSelectedViewer(var AView: TTBView; var AViewer: TTBItemViewer): Boolean; + { Returns True if AViewer <> nil. } + var + View: TTBView; + begin + { Look for a capture item first } + AView := GetCaptureView; + if Assigned(AView) then + AViewer := AView.FSelected + else begin + AView := nil; + AViewer := nil; + View := RootView; + repeat + if Assigned(View.FSelected) and View.FMouseOverSelected then begin + AView := View; + AViewer := View.FSelected; + Break; + end; + if vsMouseInWindow in View.FState then begin + { ...there is no current selection, but the mouse is still in the + window. This can happen if the mouse is over the non-client area + of the toolbar or popup window, or in an area not containing an + item. } + AView := View; + Break; + end; + View := View.FOpenViewerView; + until View = nil; + end; + Result := Assigned(AViewer); + end; + + function ContinueLoop: Boolean; + begin + { Don't continue if the mouse capture is lost, if a (modeless) top-level + window is shown causing the active window to change, or if EndModal* was + called. } + Result := (GetCapture = FWnd) and (GetActiveWindow = OriginalActiveWindow) + and not RootView.IsModalEnding; + end; + + function SendKeyEvent(const View: TTBView; var Key: Word; + const Shift: TShiftState): Boolean; + begin + Result := True; + if Assigned(View.FSelected) then begin + View.FSelected.KeyDown(Key, Shift); + if RootView.IsModalEnding then + Exit; + end; + if Key <> 0 then begin + View.KeyDown(Key, Shift); + if RootView.IsModalEnding then + Exit; + end; + Result := False; + end; + + procedure DoHintMouseMessage(const Ctl: TControl; const P: TPoint); + var + M: TMessage; + begin + {$IFDEF CLR} + M := TMessage.Create; + {$ENDIF} + M.Msg := WM_MOUSEMOVE; + M.WParam := 0; + M.LParam := MAKELPARAM(Word(P.X), Word(P.Y)); + M.Result := 0; + Application.HintMouseMessage(Ctl, M); + end; + + procedure MouseMoved; + var + Cursor: HCURSOR; + View: TTBView; + Viewer: TTBItemViewer; + P: TPoint; + begin + UpdateAllSelections(LastPos, True); + Cursor := 0; + if GetSelectedViewer(View, Viewer) then begin + P := View.FWindow.ScreenToClient(LastPos); + if ((vsAlwaysShowHints in View.FStyle) or + (tboShowHint in Viewer.Item.FEffectiveOptions)) and not View.FCapture then begin + { Display popup hint for the item. Update is called + first to minimize flicker caused by the hiding & + showing of the hint window. } + View.FWindow.Update; + DoHintMouseMessage(View.FWindow, P); + end + else + Application.CancelHint; + Dec(P.X, Viewer.BoundsRect.Left); + Dec(P.Y, Viewer.BoundsRect.Top); + Viewer.GetCursor(P, Cursor); + end + else + Application.CancelHint; + if Cursor = 0 then + Cursor := LoadCursor(0, IDC_ARROW); + SetCursor(Cursor); + if Assigned(Viewer) then + Viewer.MouseMove(P.X, P.Y); + end; + + procedure UpdateAppHint; + var + View: TTBView; + begin + View := RootView; + while Assigned(View.FOpenViewerView) and Assigned(View.FOpenViewerView.FSelected) do + View := View.FOpenViewerView; + if Assigned(View.FSelected) then + Application.Hint := GetLongHint(View.FSelected.Item.Hint) + else + Application.Hint := ''; + end; + + procedure HandleTimer(const View: TTBView; const ID: TTBViewTimerID); + begin + case ID of + tiOpen: begin + { Similar to standard menus, always close child popups, even if + Selected = OpenViewer. + Note: CloseChildPopups and OpenChildPopup will stop the tiClose + and tiOpen timers respectively. } + View.CloseChildPopups; + View.OpenChildPopup(False); + end; + tiClose: begin + { Note: CloseChildPopups stops the tiClose timer. } + View.CloseChildPopups; + end; + tiScrollUp: begin + if View.FShowUpArrow then + View.Scroll(False) + else + View.StopTimer(tiScrollUp); + end; + tiScrollDown: begin + if View.FShowDownArrow then + View.Scroll(True) + else + View.StopTimer(tiScrollDown); + end; + end; + end; + +var + MouseDownOnMenu: Boolean; + Msg: TMsg; + P: TPoint; + Ctl: TControl; + View: TTBView; + ConvertedKey: Char; + IsOnlyItemWithAccel: Boolean; + MouseIsDown: Boolean; + Key: Word; + Shift: TShiftState; + Viewer: TTBItemViewer; +begin + RootView.FDoneActionData.DoneAction := tbdaNone; + RootView.ValidatePositions; + try + try + RootView.FCaptureWnd := FWnd; + MouseDownOnMenu := False; + if AMouseDown then begin + P := RootView.FSelected.ScreenToClient(GetMessagePosAsPoint); + RootView.FSelected.MouseDown([], P.X, P.Y, MouseDownOnMenu); + if RootView.IsModalEnding then + Exit; + MouseDownOnMenu := False; { never set MouseDownOnMenu to True on first click } + end + else if AExecuteSelected then begin + RootView.ExecuteSelected(not AFromMSAA); + if RootView.IsModalEnding then + Exit; + end; + OriginalActiveWindow := GetActiveWindow; + while ContinueLoop do begin + TBUpdateAnimation; + { Examine the next message before popping it out of the queue } + if not PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE) then begin + { No message available; wait for one to arrive } + if TBIsAnimationInProgress then + { While animating, if no message arrives within 1 ms, loop back and + call TBUpdateAnimation again to see if it's ready for a new frame. + Note: We don't use a timer to call TBUpdateAnimation because on + Windows 98, timers only have a resolution of 55 ms in my tests, + too poor for smooth animation. (timeBeginPeriod does not help.) + Sleep and MsgWaitForMultipleObjects, on the other hand, appear to + have a resolution of 5 ms by default. (Better resolution is + possible with a call to timeBeginPeriod, but we don't need it.) + Note: On 2000/XP, timers and Sleep both have a resolution of 10-15 + ms by default. } + MsgWaitForMultipleObjects(0, {$IFNDEF CLR} THandle(nil^) {$ELSE} [] {$ENDIF}, + False, 1, QS_ALLINPUT) + else + WaitMessage; + Continue; + end; + case Msg.message of + WM_LBUTTONDOWN, WM_RBUTTONDOWN: begin + P := Msg.pt; + Ctl := FindDragTarget(P, True); + { Was the mouse not clicked on a popup, or was it clicked on a + popup that is not a child of RootView? + (The latter can happen when in customization mode, for example, + if the user right-clicks a popup menu being customized and + the context menu is displayed.) } + if not(Ctl is TTBPopupWindow) or + not RootView.ContainsView(TTBPopupWindow(Ctl).View) then begin + { If the root view is a popup, or if the root view is a toolbar + and the user clicked outside the toolbar or in its non-client + area (e.g. on its drag handle), exit } + if RootView.FIsPopup or (Ctl <> RootView.FWindow) or + not PtInRect(RootView.FWindow.ClientRect, RootView.FWindow.ScreenToClient(P)) then + Exit + else + if Msg.message = WM_LBUTTONDOWN then begin + { If the user clicked inside a toolbar on anything but an + item, exit } + UpdateAllSelections(P, True); + if (RootView.FSelected = nil) or not RootView.FMouseOverSelected or + (tbisClicksTransparent in RootView.FSelected.Item.ItemStyle) then + Exit; + end; + end; + end; + end; + { Now pop the message out of the queue } + if not PeekMessage(Msg, 0, Msg.message, Msg.message, PM_REMOVE or PM_NOYIELD) then + Continue; + case Msg.message of + $4D: + { This undocumented message is sent to the focused window when + F1 is pressed. Windows handles it by sending a WM_HELP message + to the same window. We don't want this to happen while a menu + is up, so swallow the message. } + ; + WM_CONTEXTMENU: + { Windows still sends WM_CONTEXTMENU messages for "context menu" + keystrokes even if WM_KEYUP messages are never dispatched, + so it must specifically ignore this message } + ; + WM_KEYFIRST..WM_KEYLAST: begin + Application.CancelHint; + MouseIsDown := (GetKeyState(VK_LBUTTON) < 0) or + (TrackRightButton and (GetKeyState(VK_RBUTTON) < 0)); + case Msg.message of + WM_KEYDOWN, WM_SYSKEYDOWN: + begin + if Msg.wParam = VK_PROCESSKEY then + { Don't let IME process the key } + Msg.wParam := WPARAM(ImmGetVirtualKey(Msg.hwnd)); + Key := Word(Msg.wParam); + if not MouseIsDown or (Key = VK_F1) then begin + if SendKeyEvent(GetActiveView, Key, + KeyDataToShiftState(ClipToLongint(Msg.lParam))) then + Exit; + { If it's not handled by a KeyDown method, translate + it into a WM_*CHAR message } + if Key <> 0 then + TranslateMessage(Msg); + end; + end; + WM_CHAR, WM_SYSCHAR: + if not MouseIsDown then begin + Key := Word(Msg.wParam); + View := GetActiveView; + {$IFDEF CLR} + { On .NET, under Windows 9x/Me we must convert the character + code from ANSI->Unicode. (We shouldn't get any double-byte + characters due to our VK_PROCESSKEY handling above.) } + if Marshal.SystemDefaultCharSize = 1 then + ConvertedKey := Encoding.GetEncoding(GetInputLocaleCodePage). + GetChars([Byte(Key)])[0] + else + {$ENDIF} + ConvertedKey := Chr(Key); + Viewer := View.NextSelectableWithAccel(View.FSelected, + ConvertedKey, False, IsOnlyItemWithAccel); + if Viewer = nil then begin + if (Key in [VK_SPACE, Ord('-')]) and + not RootView.FIsPopup and (View = RootView) and + (GetActiveWindow <> 0) then begin + RootView.EndModalWithSystemMenu(GetActiveWindow, Key); + Exit; + end + else + MessageBeep(0); + end + else begin + View.Selected := Viewer; + View.ScrollSelectedIntoView; + if IsOnlyItemWithAccel then + View.ExecuteSelected(True); + end; + end; + end; + end; + WM_TIMER: + begin + Ctl := FindControl(Msg.hwnd); + if Assigned(Ctl) and (Ctl is TTBPopupWindow) and + (Msg.wParam >= ViewTimerBaseID + Ord(Low(TTBViewTimerID))) and + (Msg.wParam <= ViewTimerBaseID + Ord(High(TTBViewTimerID))) then begin + if Assigned(TTBPopupWindow(Ctl).FView) then + HandleTimer(TTBPopupWindow(Ctl).FView, + TTBViewTimerID(Msg.wParam - ViewTimerBaseID)); + end + else + DispatchMessage(Msg); + end; + $118: ; + { ^ Like standard menus, don't dispatch WM_SYSTIMER messages + (the internal Windows message used for things like caret + blink and list box scrolling). } + WM_MOUSEFIRST..WM_MOUSELAST: + case Msg.message of + WM_MOUSEMOVE: begin + if (Msg.pt.X <> LastPos.X) or (Msg.pt.Y <> LastPos.Y) then begin + LastPos := Msg.pt; + MouseMoved; + end; + end; + WM_MOUSEWHEEL: + if GetSelectedViewer(View, Viewer) then begin + P := Viewer.ScreenToClient(Msg.pt); + Viewer.MouseWheel(Smallint(Msg.wParam shr 16), P.X, P.Y); + end; + WM_LBUTTONDOWN, WM_LBUTTONDBLCLK, WM_RBUTTONDOWN: + if (Msg.message <> WM_RBUTTONDOWN) or TrackRightButton then begin + Application.CancelHint; + MouseDownOnMenu := False; + Exclude(RootView.FState, vsIgnoreFirstMouseUp); + UpdateAllSelections(Msg.pt, True); + if GetSelectedViewer(View, Viewer) then begin + if Msg.message <> WM_LBUTTONDBLCLK then + Shift := [] + else + Shift := [ssDouble]; + P := Viewer.ScreenToClient(Msg.pt); + Viewer.MouseDown(Shift, P.X, P.Y, MouseDownOnMenu); + LastPos := GetMessagePosAsPoint; + end; + end; + WM_LBUTTONUP, WM_RBUTTONUP: + if (Msg.message = WM_LBUTTONUP) or TrackRightButton then begin + UpdateAllSelections(Msg.pt, False); + { ^ False is used so that when a popup menu is + displayed with the cursor currently inside it, the item + under the cursor won't be accidentally selected when the + user releases the button. The user must move the mouse at + at least one pixel (generating a WM_MOUSEMOVE message), + and then release the button. } + if not GetSelectedViewer(View, Viewer) then begin + { Mouse was not released over any item. Cancel out of the + loop if it's outside all views, or is inside unused + space on a topmost toolbar } + if not Assigned(View) or + ((View = RootView) and RootView.FIsToolbar) then begin + if not(vsIgnoreFirstMouseUp in RootView.FState) then + Exit + else + Exclude(RootView.FState, vsIgnoreFirstMouseUp); + end; + end + else begin + P := Viewer.ScreenToClient(Msg.pt); + Viewer.MouseUp(P.X, P.Y, MouseDownOnMenu); + end; + end; + end; + else + DispatchMessage(Msg); + end; + if not ContinueLoop then + Exit; + if LastPos.X = Low(LastPos.X) then begin + { The capture was released; generate a fake mouse movement to update + the selection } + LastPos := GetMessagePosAsPoint; + MouseMoved; + end; + UpdateAppHint; + end; + finally + RootView.CancelCapture; + end; + finally + RootView.FCaptureWnd := 0; + Application.Hint := ''; + { Make sure there are no outstanding WM_*CHAR messages } + RemoveMessages(WM_CHAR, WM_DEADCHAR); + RemoveMessages(WM_SYSCHAR, WM_SYSDEADCHAR); + { Nor any outstanding 'send WM_HELP' messages caused by an earlier press + of the F1 key } + RemoveMessages($4D, $4D); + end; +end; + + +{ TTBPopupView } + +procedure TTBPopupView.AutoSize(AWidth, AHeight: Integer); +begin + with FWindow do + SetBounds(Left, Top, AWidth + (PopupMenuWindowNCSize * 2), + AHeight + (PopupMenuWindowNCSize * 2)); +end; + +function TTBPopupView.GetFont: TFont; +begin + Result := (Owner as TTBPopupWindow).Font; +end; + + +{ TTBPopupWindow } + +constructor TTBPopupWindow.CreatePopupWindow(AOwner: TComponent; + const AParentView: TTBView; const AItem: TTBCustomItem; + const ACustomizing: Boolean); +begin + inherited Create(AOwner); + Visible := False; + SetBounds(0, 0, 320, 240); + ControlStyle := ControlStyle - [csCaptureMouse]; + ShowHint := True; + Color := tbMenuBkColor; + FView := GetViewClass.Create(Self, AParentView, AItem, Self, False, + ACustomizing, False); + Include(FView.FState, vsModal); + + { Inherit the font from the parent view, or use the system menu font if + there is no parent view } + if Assigned(AParentView) then + Font.Assign(AParentView.GetFont) + else + Font.Assign(ToolbarFont); + + { Inherit the accelerator visibility state from the parent view. If there + is no parent view (i.e. it's a standalone popup menu), then default to + hiding accelerator keys, but change this in CreateWnd if the last input + came from the keyboard. } + if Assigned(AParentView) then begin + if vsUseHiddenAccels in AParentView.FStyle then + Include(FView.FStyle, vsUseHiddenAccels); + if vsShowAccels in AParentView.FState then + Include(FView.FState, vsShowAccels); + end + else + Include(FView.FStyle, vsUseHiddenAccels); + + if Application.Handle <> 0 then + { Use Application.Handle if possible so that the taskbar button for the app + doesn't pop up when a TTBEditItem on a popup menu is focused } + ParentWindow := Application.Handle + else + { When Application.Handle is zero, use GetDesktopWindow() as the parent + window, not zero, otherwise UpdateControlState won't show the window } + ParentWindow := GetDesktopWindow; +end; + +destructor TTBPopupWindow.Destroy; +begin + Destroying; + { Before destroying the window handle we need to close any child popups so + that pixels behind the popups are properly restored without generating a + WM_PAINT message. } + if Assigned(FView) then + FView.CloseChildPopups; + { Ensure window handle is destroyed *before* FView is freed, since + DestroyWindowHandle calls CallNotifyWinEvent which may result in + FView.HandleWMObject being called } + if HandleAllocated then + DestroyWindowHandle; + FreeAndNil(FView); + inherited; +end; + +function TTBPopupWindow.GetViewClass: TTBViewClass; +begin + Result := TTBPopupView; +end; + +procedure TTBPopupWindow.CreateParams(var Params: TCreateParams); +const + CS_DROPSHADOW = $00020000; +begin + inherited; + with Params do begin + Style := (Style and not (WS_CHILD or WS_GROUP or WS_TABSTOP)) or WS_POPUP; + ExStyle := ExStyle or WS_EX_TOPMOST or WS_EX_TOOLWINDOW; + WindowClass.Style := WindowClass.Style or CS_SAVEBITS; + { Enable drop shadow effect on Windows XP and later } + if IsWindowsXP then + WindowClass.Style := WindowClass.Style or CS_DROPSHADOW; + end; +end; + +procedure TTBPopupWindow.CreateWnd; +const + WM_CHANGEUISTATE = $0127; + WM_QUERYUISTATE = $0129; + UIS_INITIALIZE = 3; + UISF_HIDEACCEL = $2; +var + B: Boolean; +begin + inherited; + { On a top-level popup window, send WM_CHANGEUISTATE & WM_QUERYUISTATE + messages to the window to see if the last input came from the keyboard + and if the accelerator keys should be shown } + if (FView.ParentView = nil) and not FAccelsVisibilitySet then begin + FAccelsVisibilitySet := True; + SendMessage(Handle, WM_CHANGEUISTATE, UIS_INITIALIZE, 0); + B := (SendMessage(Handle, WM_QUERYUISTATE, 0, 0) and UISF_HIDEACCEL = 0); + FView.SetAccelsVisibility(B); + end; +end; + +procedure TTBPopupWindow.DestroyWindowHandle; +begin + { Before destroying the window handle, we must stop any animation, otherwise + the animation thread will use an invalid handle } + TBEndAnimation(WindowHandle); + { Cleanly destroy any timers before the window handle is destroyed } + if Assigned(FView) then + FView.StopAllTimers; + CallNotifyWinEvent(EVENT_SYSTEM_MENUPOPUPEND, WindowHandle, OBJID_CLIENT, + CHILDID_SELF); + inherited; +end; + +procedure TTBPopupWindow.WMGetObject(var Message: TMessage); +begin + if not FView.HandleWMGetObject(Message) then + inherited; +end; + +procedure TTBPopupWindow.CMShowingChanged(var Message: TMessage); +const + ShowFlags: array[Boolean] of UINT = ( + SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_HIDEWINDOW, + SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_SHOWWINDOW); + SPI_GETMENUFADE = $1012; +var + Blend: Boolean; +begin + { Must override TCustomForm/TForm's CM_SHOWINGCHANGED handler so that the + form doesn't get activated when Visible is set to True. } + + { Handle animation. NOTE: I do not recommend trying to enable animation on + Windows 95 and NT 4.0 because there's a difference in the way the + SetWindowPos works on those versions. See the comment in the + TBStartAnimation function of TB2Anim.pas. } + {$IFNDEF TB2K_NO_ANIMATION} + if ((FView.ParentView = nil) or not(vsNoAnimation in FView.FParentView.FState)) and + Showing and (FView.Selected = nil) and not IsWindowVisible(WindowHandle) and + GetSystemParametersInfoBool(SPI_GETMENUANIMATION, False) then begin + Blend := GetSystemParametersInfoBool(SPI_GETMENUFADE, False); + if Blend or (FAnimationDirection <> []) then begin + TBStartAnimation(WindowHandle, Blend, FAnimationDirection); + Exit; + end; + end; + {$ENDIF} + + { No animation... } + if not Showing then begin + { Call TBEndAnimation to ensure WS_EX_LAYERED style is removed before + hiding, otherwise windows under the popup window aren't repainted + properly. } + TBEndAnimation(WindowHandle); + end; + SetWindowPos(WindowHandle, 0, 0, 0, 0, 0, ShowFlags[Showing]); +end; + +procedure TTBPopupWindow.WMEraseBkgnd(var Message: TWMEraseBkgnd); +begin + { May be necessary in some cases... } + TBEndAnimation(WindowHandle); + inherited; +end; + +procedure TTBPopupWindow.WMPaint(var Message: TWMPaint); +begin + { Must abort animation when a WM_PAINT message is received } + TBEndAnimation(WindowHandle); + inherited; +end; + +procedure TTBPopupWindow.Paint; +begin + FView.DrawSubitems(Canvas); + PaintScrollArrows; +end; + +procedure TTBPopupWindow.PaintScrollArrows; + + procedure DrawArrow(const R: TRect; ADown: Boolean); + var + X, Y: Integer; + P: array[0..2] of TPoint; + begin + X := (R.Left + R.Right) div 2; + Y := (R.Top + R.Bottom) div 2; + Dec(Y); + P[0].X := X-3; + P[0].Y := Y; + P[1].X := X+3; + P[1].Y := Y; + P[2].X := X; + P[2].Y := Y; + if ADown then + Inc(P[2].Y, 3) + else begin + Inc(P[0].Y, 3); + Inc(P[1].Y, 3); + end; + Canvas.Pen.Color := tbMenuTextColor; + Canvas.Brush.Color := tbMenuTextColor; + Canvas.Polygon(P); + end; + +begin + if FView.FShowUpArrow then + DrawArrow(Rect(0, 0, ClientWidth, tbMenuScrollArrowHeight), False); + if FView.FShowDownArrow then + DrawArrow(Bounds(0, ClientHeight - tbMenuScrollArrowHeight, + ClientWidth, tbMenuScrollArrowHeight), True); +end; + +procedure TTBPopupWindow.WMClose(var Message: TWMClose); +begin + { do nothing -- ignore Alt+F4 keypresses } +end; + +procedure TTBPopupWindow.WMNCCalcSize(var Message: TWMNCCalcSize); + + procedure ApplyToRect(var R: TRect); + begin + InflateRect(R, -PopupMenuWindowNCSize, -PopupMenuWindowNCSize); + end; + +{$IFDEF CLR} +var + Params: TNCCalcSizeParams; +{$ENDIF} +begin + {$IFNDEF CLR} + ApplyToRect(Message.CalcSize_Params.rgrc[0]); + {$ELSE} + Params := Message.CalcSize_Params; + ApplyToRect(Params.rgrc0); + Message.CalcSize_Params := Params; + {$ENDIF} + inherited; +end; + +procedure PopupWindowNCPaintProc(Wnd: HWND; DC: HDC; AppData: TObject); +var + R: TRect; + {$IFNDEF TB2K_USE_STRICT_O2K_MENU_STYLE} + Brush: HBRUSH; + {$ENDIF} +begin + GetWindowRect(Wnd, R); OffsetRect(R, -R.Left, -R.Top); + {$IFNDEF TB2K_USE_STRICT_O2K_MENU_STYLE} + if not AreFlatMenusEnabled then begin + {$ENDIF} + DrawEdge(DC, R, EDGE_RAISED, BF_RECT or BF_ADJUST); + FrameRect(DC, R, GetSysColorBrush(COLOR_BTNFACE)); + {$IFNDEF TB2K_USE_STRICT_O2K_MENU_STYLE} + end + else begin + FrameRect(DC, R, GetSysColorBrush(COLOR_BTNSHADOW)); + Brush := CreateSolidBrush(ColorToRGB(TTBPopupWindow(AppData).Color)); + InflateRect(R, -1, -1); + FrameRect(DC, R, Brush); + InflateRect(R, -1, -1); + FrameRect(DC, R, Brush); + DeleteObject(Brush); + end; + {$ENDIF} +end; + +procedure TTBPopupWindow.WMNCPaint(var Message: TMessage); +var + DC: HDC; +begin + DC := GetWindowDC(Handle); + try + SelectNCUpdateRgn(Handle, DC, HRGN(Message.WParam)); + PopupWindowNCPaintProc(Handle, DC, Self); + finally + ReleaseDC(Handle, DC); + end; +end; + +procedure TTBPopupWindow.WMPrint(var Message: TMessage); +begin + HandleWMPrint(Handle, Message, PopupWindowNCPaintProc, Self); +end; + +procedure TTBPopupWindow.WMPrintClient(var Message: + {$IFNDEF CLR} TMessage {$ELSE} TWMPrintClient {$ENDIF}); +begin + HandleWMPrintClient(PaintHandler, Message); +end; + +procedure TTBPopupWindow.CMHintShow(var Message: TCMHintShow); +begin + FView.HandleHintShowMessage(Message); +end; + + +{ TTBItemContainer } + +constructor TTBItemContainer.Create(AOwner: TComponent); +begin + inherited; + FItem := TTBRootItem.Create(Self); + FItem.ParentComponent := Self; +end; + +destructor TTBItemContainer.Destroy; +begin + FItem.Free; + inherited; +end; + +function TTBItemContainer.GetItems: TTBCustomItem; +begin + Result := FItem; +end; + +procedure TTBItemContainer.GetChildren(Proc: TGetChildProc; Root: TComponent); +begin + FItem.GetChildren(Proc, Root); +end; + +function TTBItemContainer.GetImages: TCustomImageList; +begin + Result := FItem.SubMenuImages; +end; + +procedure TTBItemContainer.SetImages(Value: TCustomImageList); +begin + FItem.SubMenuImages := Value; +end; + + +{ TTBPopupMenu } + +constructor TTBPopupMenu.Create(AOwner: TComponent); +begin + inherited; + FItem := GetRootItemClass.Create(Self); + FItem.ParentComponent := Self; + FItem.OnClick := RootItemClick; +end; + +destructor TTBPopupMenu.Destroy; +begin + FItem.Free; + inherited; +end; + +function TTBPopupMenu.GetItems: TTBCustomItem; +begin + Result := FItem; +end; + +procedure TTBPopupMenu.GetChildren(Proc: TGetChildProc; Root: TComponent); +begin + FItem.GetChildren(Proc, Root); +end; + +procedure TTBPopupMenu.SetChildOrder(Child: TComponent; Order: Integer); +begin + FItem.SetChildOrder(Child, Order); +end; + +function TTBPopupMenu.GetRootItemClass: TTBRootItemClass; +begin + Result := TTBRootItem; +end; + +function TTBPopupMenu.GetImages: TCustomImageList; +begin + Result := FItem.SubMenuImages; +end; + +function TTBPopupMenu.GetLinkSubitems: TTBCustomItem; +begin + Result := FItem.LinkSubitems; +end; + +function TTBPopupMenu.GetOptions: TTBItemOptions; +begin + Result := FItem.Options; +end; + +procedure TTBPopupMenu.SetImages(Value: TCustomImageList); +begin + FItem.SubMenuImages := Value; +end; + +procedure TTBPopupMenu.SetLinkSubitems(Value: TTBCustomItem); +begin + FItem.LinkSubitems := Value; +end; + +procedure TTBPopupMenu.SetOptions(Value: TTBItemOptions); +begin + FItem.Options := Value; +end; + +procedure TTBPopupMenu.RootItemClick(Sender: TObject); +begin + if Sender = FItem then + Sender := Self; + DoPopup(Sender); +end; + +{$IFNDEF JR_D5} +procedure TTBPopupMenu.DoPopup(Sender: TObject); +begin + if Assigned(OnPopup) then OnPopup(Sender); +end; +{$ENDIF} + +procedure TTBPopupMenu.Popup(X, Y: Integer); +begin + PopupEx(X, Y, False); +end; + +function TTBPopupMenu.PopupEx(X, Y: Integer; + ReturnClickedItemOnly: Boolean = False): TTBCustomItem; +begin + {$IFDEF JR_D5} + {$IFDEF JR_D9} + SetPopupPoint(Point(X, Y)); + {$ELSE} + PPoint(@PopupPoint)^ := Point(X, Y); + {$ENDIF} + {$ENDIF} + Result := FItem.Popup(X, Y, TrackButton = tbRightButton, + TTBPopupAlignment(Alignment), ReturnClickedItemOnly); +end; + +function TTBPopupMenu.IsShortCut(var Message: TWMKey): Boolean; +begin + Result := FItem.IsShortCut(Message); +end; + + +{ TTBImageList } + +constructor TTBCustomImageList.Create(AOwner: TComponent); +begin + inherited; + FCheckedImagesChangeLink := TChangeLink.Create; + FCheckedImagesChangeLink.OnChange := ImageListChanged; + FDisabledImagesChangeLink := TChangeLink.Create; + FDisabledImagesChangeLink.OnChange := ImageListChanged; + FHotImagesChangeLink := TChangeLink.Create; + FHotImagesChangeLink.OnChange := ImageListChanged; + FImagesBitmap := TBitmap.Create; + FImagesBitmap.OnChange := ImagesBitmapChanged; + FImagesBitmapMaskColor := clFuchsia; +end; + +destructor TTBCustomImageList.Destroy; +begin + FreeAndNil(FImagesBitmap); + FreeAndNil(FHotImagesChangeLink); + FreeAndNil(FDisabledImagesChangeLink); + FreeAndNil(FCheckedImagesChangeLink); + inherited; +end; + +procedure TTBCustomImageList.ImagesBitmapChanged(Sender: TObject); +begin + if not ImagesBitmap.Empty then begin + Clear; + AddMasked(ImagesBitmap, FImagesBitmapMaskColor); + end; +end; + +procedure TTBCustomImageList.ImageListChanged(Sender: TObject); +begin + Change; +end; + +{$IFDEF CLR} +procedure TTBCustomImageList.WriteLeft(Writer: TWriter); +begin + Writer.WriteInteger(DesignInfo shr 16); +end; + +procedure TTBCustomImageList.WriteTop(Writer: TWriter); +begin + Writer.WriteInteger(DesignInfo and $FFFF); +end; +{$ENDIF} + +procedure TTBCustomImageList.DefineProperties(Filer: TFiler); +{$IFNDEF CLR} +type + TProc = procedure(ASelf: TObject; Filer: TFiler); +{$ELSE} +var + Ancestor: TComponent; + AncestorInfo: Longint; + DesignInfo: Longint; +{$ENDIF} +begin + if (Filer is TReader) or FImagesBitmap.Empty then + inherited + else begin + {$IFNDEF CLR} + { Bypass TCustomImageList.DefineProperties when we've got an ImageBitmap } + TProc(@TComponentAccess.DefineProperties)(Self, Filer); + {$ELSE} + { On .NET I'm not aware of any way to bypass an inherited method, so we + have to handle DefineProperties all by ourself. The following code is + copied from TComponentHelper.DefineProperties, with references to + private fields changed and the Read* methods removed. } + AncestorInfo := 0; + DesignInfo := Self.DesignInfo; + Ancestor := TComponent(Filer.Ancestor); + if Ancestor <> nil then + AncestorInfo := Ancestor.DesignInfo; + Filer.DefineProperty('Left', nil, WriteLeft, (DesignInfo and $FFFF) <> + (AncestorInfo and $FFFF)); + Filer.DefineProperty('Top', nil, WriteTop, (DesignInfo shr 16) <> + (AncestorInfo shr 16)); + {$ENDIF} + end; +end; + +procedure TTBCustomImageList.DrawState(Canvas: TCanvas; X, Y, Index: Integer; + Enabled, Selected, Checked: Boolean); +begin + if not Enabled and Assigned(DisabledImages) then + DisabledImages.Draw(Canvas, X, Y, Index) + else if Checked and Assigned(CheckedImages) then + CheckedImages.Draw(Canvas, X, Y, Index, Enabled) + else if Selected and Assigned(HotImages) then + HotImages.Draw(Canvas, X, Y, Index, Enabled) + else + Draw(Canvas, X, Y, Index, Enabled); +end; + +procedure TTBCustomImageList.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if Operation = opRemove then begin + if AComponent = CheckedImages then CheckedImages := nil; + if AComponent = DisabledImages then DisabledImages := nil; + if AComponent = HotImages then HotImages := nil; + end; +end; + +procedure TTBCustomImageList.ChangeImages(var AImageList: TCustomImageList; + Value: TCustomImageList; AChangeLink: TChangeLink); +begin + if Value = Self then + Value := nil; + if AImageList <> Value then begin + if Assigned(AImageList) then + AImageList.UnregisterChanges(AChangeLink); + AImageList := Value; + if Assigned(Value) then begin + Value.RegisterChanges(AChangeLink); + Value.FreeNotification(Self); + end; + { Don't call Change while loading because it causes the Delphi IDE to + think the form has been modified (?). Also, don't call Change while + destroying since there's no reason to. } + if not(csLoading in ComponentState) and + not(csDestroying in ComponentState) then + Change; + end; +end; + +procedure TTBCustomImageList.SetCheckedImages(Value: TCustomImageList); +begin + ChangeImages(FCheckedImages, Value, FCheckedImagesChangeLink); +end; + +procedure TTBCustomImageList.SetDisabledImages(Value: TCustomImageList); +begin + ChangeImages(FDisabledImages, Value, FDisabledImagesChangeLink); +end; + +procedure TTBCustomImageList.SetHotImages(Value: TCustomImageList); +begin + ChangeImages(FHotImages, Value, FHotImagesChangeLink); +end; + +procedure TTBCustomImageList.SetImagesBitmap(Value: TBitmap); +begin + FImagesBitmap.Assign(Value); +end; + +procedure TTBCustomImageList.SetImagesBitmapMaskColor(Value: TColor); +begin + if FImagesBitmapMaskColor <> Value then begin + FImagesBitmapMaskColor := Value; + ImagesBitmapChanged(nil); + end; +end; + + +{ TTBBaseAccObject } + +{ According to the MSAA docs: + "With Active Accessibility 2.0, servers can return E_NOTIMPL from IDispatch + methods and Active Accessibility will implement the IAccessible interface + for them." + And there was much rejoicing. } + +{$IFNDEF CLR} +function TTBBaseAccObject.GetIDsOfNames(const IID: TGUID; Names: Pointer; + NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; +begin + Result := E_NOTIMPL; +end; + +function TTBBaseAccObject.GetTypeInfo(Index, LocaleID: Integer; + out TypeInfo): HResult; +begin + Result := E_NOTIMPL; +end; + +function TTBBaseAccObject.GetTypeInfoCount(out Count: Integer): HResult; +begin + Result := E_NOTIMPL; +end; + +function TTBBaseAccObject.Invoke(DispID: Integer; const IID: TGUID; + LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, + ArgErr: Pointer): HResult; +begin + Result := E_NOTIMPL; +end; +{$ENDIF} + + +{ Initialization & finalization } + +procedure TBInitToolbarSystemFont; +var + NonClientMetrics: TNonClientMetrics; +begin + if GetSystemNonClientMetrics(NonClientMetrics) then + ToolbarFont.Handle := CreateFontIndirect(NonClientMetrics.lfMenuFont); +end; + +initialization + ToolbarFont := TFont.Create; + TBInitToolbarSystemFont; +finalization + DestroyClickWnd; + FreeAndNil(ToolbarFont); +end. diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2MDI.pas b/official/2.2.2+2.4.2/TB2K/Source/TB2MDI.pas new file mode 100644 index 0000000..09ec768 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Source/TB2MDI.pas @@ -0,0 +1,714 @@ +unit TB2MDI; + +{ + Toolbar2000 + Copyright (C) 1998-2008 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2MDI.pas,v 1.15 2008/04/23 21:54:37 jr Exp $ +} + +interface + +{$I TB2Ver.inc} + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + Menus, TB2Item, TB2Toolbar; + +type + TTBMDIButtonsItem = class; + TTBMDISystemMenuItem = class; + + TTBMDIHandler = class(TComponent) + private + FButtonsItem: TTBMDIButtonsItem; + FSystemMenuItem: TTBMDISystemMenuItem; + FToolbar: TTBCustomToolbar; + procedure SetToolbar(Value: TTBCustomToolbar); + protected + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + property Toolbar: TTBCustomToolbar read FToolbar write SetToolbar; + end; + + TTBMDIWindowItem = class(TTBCustomItem) + private + FForm: TForm; + FOnUpdate: TNotifyEvent; + FWindowMenu: TMenuItem; + procedure ItemClick(Sender: TObject); + procedure SetForm(AForm: TForm); + protected + procedure EnabledChanged; override; + procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + public + constructor Create(AOwner: TComponent); override; + procedure InitiateAction; override; + published + property Enabled; + property OnUpdate: TNotifyEvent read FOnUpdate write FOnUpdate; + end; + + TTBMDISystemMenuItem = class(TTBCustomItem) + private + FImageList: TImageList; + procedure CommandClick(Sender: TObject); + protected + function GetItemViewerClass(AView: TTBView): TTBItemViewerClass; override; + public + constructor Create(AOwner: TComponent); override; + procedure Click; override; + end; + + TTBMDISystemMenuItemViewer = class(TTBItemViewer) + protected + procedure CalcSize(const Canvas: TCanvas; var AWidth, AHeight: Integer); + override; + procedure Paint(const Canvas: TCanvas; const ClientAreaRect: TRect; + IsSelected, IsPushed, UseDisabledShadow: Boolean); override; + end; + + TTBMDIButtonType = (tbmbMinimize, tbmbRestore, tbmbClose); + + TTBMDIButtonItem = class(TTBCustomItem) + private + FButtonType: TTBMDIButtonType; + protected + function GetItemViewerClass(AView: TTBView): TTBItemViewerClass; override; + public + constructor Create(AOwner: TComponent); override; + end; + + TTBMDIButtonItemViewer = class(TTBItemViewer) + protected + procedure CalcSize(const Canvas: TCanvas; var AWidth, AHeight: Integer); + override; + procedure Paint(const Canvas: TCanvas; const ClientAreaRect: TRect; + IsSelected, IsPushed, UseDisabledShadow: Boolean); override; + end; + + TTBMDISepItem = class(TTBSeparatorItem) + protected + function GetItemViewerClass(AView: TTBView): TTBItemViewerClass; override; + end; + + TTBMDISepItemViewer = class(TTBSeparatorItemViewer) + protected + procedure CalcSize(const Canvas: TCanvas; var AWidth, AHeight: Integer); + override; + end; + + TTBMDIButtonsItem = class(TTBCustomItem) + private + FMinimizeItem: TTBMDIButtonItem; + FRestoreItem: TTBMDIButtonItem; + FCloseItem: TTBMDIButtonItem; + FSep1, FSep2: TTBMDISepItem; + procedure InvalidateSystemMenuItem; + procedure ItemClick(Sender: TObject); + procedure UpdateState(W: HWND; Maximized: Boolean); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + end; + +implementation + +uses + {$IFDEF CLR} System.Text, System.Runtime.InteropServices, WinUtils, {$ENDIF} + TB2Common, TB2Consts, CommCtrl; + +type + TTBCustomToolbarAccess = class(TTBCustomToolbar); + +function GetMenuItemStr(const AMenu: HMENU; const APos: Integer): String; +{$IFNDEF CLR} +var + Buf: array[0..1023] of Char; +begin + if GetMenuString(AMenu, APos, Buf, SizeOf(Buf) div SizeOf(Buf[0]), MF_BYPOSITION) > 0 then + Result := Buf + else + Result := ''; +end; +{$ELSE} +var + Buf: StringBuilder; +begin + Buf := StringBuilder.Create(1024); + if GetMenuString(AMenu, APos, Buf, Buf.Capacity, MF_BYPOSITION) > 0 then + Result := Buf.ToString + else + Result := ''; +end; +{$ENDIF} + + +{ TTBMDIHandler } + +constructor TTBMDIHandler.Create(AOwner: TComponent); +begin + inherited; + FSystemMenuItem := TTBMDISystemMenuItem.Create(Self); + FButtonsItem := TTBMDIButtonsItem.Create(Self); +end; + +destructor TTBMDIHandler.Destroy; +begin + Toolbar := nil; + inherited; +end; + +procedure TTBMDIHandler.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if (AComponent = FToolbar) and (Operation = opRemove) then + Toolbar := nil; +end; + +procedure TTBMDIHandler.SetToolbar(Value: TTBCustomToolbar); +var + Rebuild: Boolean; +begin + if FToolbar <> Value then begin + if Assigned(FToolbar) then begin + Rebuild := False; + if TTBCustomToolbarAccess(FToolbar).FMDIButtonsItem = FButtonsItem then begin + TTBCustomToolbarAccess(FToolbar).FMDIButtonsItem := nil; + Rebuild := True; + end; + if TTBCustomToolbarAccess(FToolbar).FMDISystemMenuItem = FSystemMenuItem then begin + TTBCustomToolbarAccess(FToolbar).FMDISystemMenuItem := nil; + Rebuild := True; + end; + if Rebuild and Assigned(FToolbar.View) then + FToolbar.View.RecreateAllViewers; + end; + FToolbar := Value; + if Assigned(Value) then begin + Value.FreeNotification(Self); + TTBCustomToolbarAccess(Value).FMDIButtonsItem := FButtonsItem; + TTBCustomToolbarAccess(Value).FMDISystemMenuItem := FSystemMenuItem; + Value.View.RecreateAllViewers; + end; + end; +end; + + +{ TTBMDISystemMenuItem } + +constructor TTBMDISystemMenuItem.Create(AOwner: TComponent); +begin + inherited; + ItemStyle := ItemStyle + [tbisSubMenu, tbisDontSelectFirst] - + [tbisRedrawOnSelChange, tbisRedrawOnMouseOverChange]; + Caption := '&-'; + + {$R TB2MDI.res} + FImageList := TImageList.Create(Self); + FImageList.Handle := ImageList_LoadBitmap(HInstance, 'TB2SYSMENUIMAGES', + 16, 0, clSilver); + SubMenuImages := FImageList; +end; + +function TTBMDISystemMenuItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + Result := TTBMDISystemMenuItemViewer; +end; + +procedure TTBMDISystemMenuItem.Click; +var + I: Integer; + Form: TForm; + M: HMENU; + State: UINT; + ID: Word; + Item: TTBCustomItem; +begin + inherited; + Clear; + if Application.MainForm = nil then + Exit; + Form := Application.MainForm.ActiveMDIChild; + if Form = nil then + Exit; + M := GetSystemMenu(Form.Handle, False); + for I := 0 to GetMenuItemCount(M)-1 do begin + State := GetMenuState(M, I, MF_BYPOSITION); + if State and MF_SEPARATOR <> 0 then + Add(TTBSeparatorItem.Create(Self)) + else begin + Item := TTBCustomItem.Create(Self); + if State and MF_GRAYED <> 0 then + Item.Enabled := False; + Item.Caption := GetMenuItemStr(M, I); + ID := Word(GetMenuItemID(M, I)); + Item.Tag := {$IFDEF CLR}TTag{$ENDIF}(ID); + case ID and $FFF0 of + SC_RESTORE: Item.ImageIndex := 3; + SC_MINIMIZE: Item.ImageIndex := 2; + SC_MAXIMIZE: Item.ImageIndex := 1; + SC_CLOSE: begin + Item.ImageIndex := 0; + Item.Options := Item.Options + [tboDefault]; + end; + end; + Item.OnClick := CommandClick; + Add(Item); + end; + end; +end; + +procedure TTBMDISystemMenuItem.CommandClick(Sender: TObject); +var + Form: TForm; +begin + if Assigned(Application.MainForm) then begin + Form := Application.MainForm.ActiveMDIChild; + if Assigned(Form) then + SendMessage(Form.Handle, WM_SYSCOMMAND, Word(TTBCustomItem(Sender).Tag), + LPARAM(GetMessagePos())); + end; +end; + + +{ TTBMDISystemMenuItemViewer } + +procedure TTBMDISystemMenuItemViewer.CalcSize(const Canvas: TCanvas; + var AWidth, AHeight: Integer); +begin + AWidth := GetSystemMetrics(SM_CXSMICON) + 2; + AHeight := GetSystemMetrics(SM_CYSMICON) + 2; +end; + +procedure TTBMDISystemMenuItemViewer.Paint(const Canvas: TCanvas; + const ClientAreaRect: TRect; IsSelected, IsPushed, UseDisabledShadow: Boolean); + + function GetIconHandle: HICON; + var + Form: TForm; + begin + Result := 0; + if Assigned(Application.MainForm) then begin + Form := Application.MainForm.ActiveMDIChild; + if Assigned(Form) then + Result := Form.Icon.Handle; + end; + if Result = 0 then + Result := Application.Icon.Handle; + if Result = 0 then + Result := LoadIcon(0, IDI_APPLICATION); + end; + +var + R: TRect; + TempIcon: HICON; +begin + R := ClientAreaRect; + InflateRect(R, -1, -1); + TempIcon := CopyImage(GetIconHandle, IMAGE_ICON, R.Right - R.Left, + R.Bottom - R.Top, LR_COPYFROMRESOURCE); + DrawIconEx(Canvas.Handle, R.Left, R.Top, TempIcon, 0, 0, 0, 0, DI_NORMAL); + DestroyIcon(TempIcon); +end; + + +{ TTBMDIButtonItem } + +constructor TTBMDIButtonItem.Create(AOwner: TComponent); +begin + inherited; + ItemStyle := ItemStyle - [tbisSelectable, tbisRedrawOnSelChange] + + [tbisRightAlign]; +end; + +function TTBMDIButtonItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + Result := TTBMDIButtonItemViewer; +end; + + +{ TTBMDIButtonItemViewer } + +procedure TTBMDIButtonItemViewer.CalcSize(const Canvas: TCanvas; + var AWidth, AHeight: Integer); +begin + if NewStyleControls then begin + AWidth := GetSystemMetrics(SM_CXMENUSIZE) - 2; + if AWidth < 0 then AWidth := 0; + AHeight := GetSystemMetrics(SM_CYMENUSIZE) - 4; + if AHeight < 0 then AHeight := 0; + end + else begin + AWidth := 16; + AHeight := 14; + end; +end; + +procedure TTBMDIButtonItemViewer.Paint(const Canvas: TCanvas; + const ClientAreaRect: TRect; IsSelected, IsPushed, UseDisabledShadow: Boolean); +const + ButtonTypeFlags: array[TTBMDIButtonType] of UINT = (DFCS_CAPTIONMIN, + DFCS_CAPTIONRESTORE, DFCS_CAPTIONCLOSE); + PushedFlags: array[Boolean] of UINT = (0, DFCS_PUSHED); + EnabledFlags: array[Boolean] of UINT = (DFCS_INACTIVE, 0); +begin + DrawFrameControl(Canvas.Handle, ClientAreaRect, DFC_CAPTION, + ButtonTypeFlags[TTBMDIButtonItem(Item).FButtonType] or + PushedFlags[IsPushed] or EnabledFlags[Item.Enabled]); +end; + + +{ TTBMDISepItem } + +function TTBMDISepItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + Result := TTBMDISepItemViewer; +end; + + +{ TTBMDISepItemViewer } + +procedure TTBMDISepItemViewer.CalcSize(const Canvas: TCanvas; + var AWidth, AHeight: Integer); +begin + if View.Orientation <> tbvoVertical then begin + AWidth := 2; + AHeight := 6; + end + else begin + AWidth := 6; + AHeight := 2; + end; +end; + + +{ TTBMDIButtonsItem } + +var + CBTHookHandle: HHOOK; + MDIButtonsItems: TList; + +function WindowIsMDIChild(W: HWND): Boolean; +var + I: Integer; + MainForm, ChildForm: TForm; +begin + MainForm := Application.MainForm; + if Assigned(MainForm) then + for I := 0 to MainForm.MDIChildCount-1 do begin + ChildForm := MainForm.MDIChildren[I]; + if ChildForm.HandleAllocated and (ChildForm.Handle = W) then begin + Result := True; + Exit; + end; + end; + Result := False; +end; + +function CBTHook(Code: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; +{$IFNDEF CLR} stdcall; {$ENDIF} +var + Maximizing: Boolean; + WindowPlacement: TWindowPlacement; + I: Integer; +begin + case Code of + HCBT_SETFOCUS: begin + if WindowIsMDIChild(HWND(WParam)) and Assigned(MDIButtonsItems) then begin + for I := 0 to MDIButtonsItems.Count-1 do + TTBMDIButtonsItem(MDIButtonsItems[I]).InvalidateSystemMenuItem; + end; + end; + HCBT_MINMAX: begin + if WindowIsMDIChild(HWND(WParam)) and Assigned(MDIButtonsItems) and + (Word(LParam) in [SW_SHOWNORMAL, SW_SHOWMAXIMIZED, SW_MINIMIZE, SW_RESTORE]) then begin + Maximizing := (Word(LParam) = SW_MAXIMIZE); + if (Word(LParam) = SW_RESTORE) and not IsZoomed(HWND(WParam)) then begin + {$IFNDEF CLR} + WindowPlacement.length := SizeOf(WindowPlacement); + {$ELSE} + WindowPlacement.length := Marshal.SizeOf(TypeOf(TWindowPlacement)); + {$ENDIF} + GetWindowPlacement(HWND(WParam), {$IFNDEF CLR}@{$ENDIF} WindowPlacement); + Maximizing := (WindowPlacement.flags and WPF_RESTORETOMAXIMIZED <> 0); + end; + for I := 0 to MDIButtonsItems.Count-1 do + TTBMDIButtonsItem(MDIButtonsItems[I]).UpdateState(HWND(WParam), + Maximizing); + end; + end; + HCBT_DESTROYWND: begin + if WindowIsMDIChild(HWND(WParam)) and Assigned(MDIButtonsItems) then begin + for I := 0 to MDIButtonsItems.Count-1 do + TTBMDIButtonsItem(MDIButtonsItems[I]).UpdateState(HWND(WParam), + False); + end; + end; + end; + Result := CallNextHookEx(CBTHookHandle, Code, WParam, LParam); +end; + +const + { Note: On .NET, we must keep a reference to the delegate alive for as long + as the hook is installed, otherwise the GC will collect it and the app + will crash. Storing the delegate in a typed constant will do the trick. } + CBTHookDelegate: TFNHookProc = CBTHook; + +constructor TTBMDIButtonsItem.Create(AOwner: TComponent); + + function CreateItem(const AType: TTBMDIButtonType): TTBMDIButtonItem; + begin + Result := TTBMDIButtonItem.Create(Self); + Result.FButtonType := AType; + Result.OnClick := ItemClick; + end; + +begin + inherited; + ItemStyle := ItemStyle + [tbisEmbeddedGroup]; + FMinimizeItem := CreateItem(tbmbMinimize); + FRestoreItem := CreateItem(tbmbRestore); + FCloseItem := CreateItem(tbmbClose); + FSep1 := TTBMDISepItem.Create(Self); + FSep1.Blank := True; + FSep1.ItemStyle := FSep1.ItemStyle + [tbisRightAlign, tbisNoLineBreak]; + FSep2 := TTBMDISepItem.Create(Self); + FSep2.Blank := True; + FSep2.ItemStyle := FSep2.ItemStyle + [tbisRightAlign, tbisNoLineBreak]; + Add(FSep1); + Add(FMinimizeItem); + Add(FRestoreItem); + Add(FSep2); + Add(FCloseItem); + UpdateState(0, False); + if not(csDesigning in ComponentState) then begin + AddToList(MDIButtonsItems, Self); + if CBTHookHandle = 0 then + CBTHookHandle := SetWindowsHookEx(WH_CBT, CBTHookDelegate, 0, GetCurrentThreadId); + end; +end; + +destructor TTBMDIButtonsItem.Destroy; +begin + RemoveFromList(MDIButtonsItems, Self); + if (MDIButtonsItems = nil) and (CBTHookHandle <> 0) then begin + UnhookWindowsHookEx(CBTHookHandle); + CBTHookHandle := 0; + end; + inherited; +end; + +procedure TTBMDIButtonsItem.UpdateState(W: HWND; Maximized: Boolean); +var + HasMaxChild, VisibilityChanged: Boolean; + + procedure UpdateVisibleEnabled(const Item: TTBCustomItem; + const AEnabled: Boolean); + begin + if (Item.Visible <> HasMaxChild) or (Item.Enabled <> AEnabled) then begin + Item.Visible := HasMaxChild; + Item.Enabled := AEnabled; + VisibilityChanged := True; + end; + end; + +var + MainForm, ActiveMDIChild, ChildForm: TForm; + I: Integer; +begin + HasMaxChild := False; + ActiveMDIChild := nil; + if not(csDesigning in ComponentState) then begin + MainForm := Application.MainForm; + if Assigned(MainForm) then begin + for I := 0 to MainForm.MDIChildCount-1 do begin + ChildForm := MainForm.MDIChildren[I]; + if ChildForm.HandleAllocated and + (((ChildForm.Handle = W) and Maximized) or + ((ChildForm.Handle <> W) and IsZoomed(ChildForm.Handle))) then begin + HasMaxChild := True; + Break; + end; + end; + ActiveMDIChild := MainForm.ActiveMDIChild; + end; + end; + + VisibilityChanged := False; + UpdateVisibleEnabled(TTBMDIHandler(Owner).FSystemMenuItem, True); + UpdateVisibleEnabled(FSep1, True); + UpdateVisibleEnabled(FMinimizeItem, (ActiveMDIChild = nil) or + (GetWindowLong(ActiveMDIChild.Handle, GWL_STYLE) and WS_MINIMIZEBOX <> 0)); + UpdateVisibleEnabled(FRestoreItem, True); + UpdateVisibleEnabled(FSep2, True); + UpdateVisibleEnabled(FCloseItem, True); + + if VisibilityChanged and Assigned((Owner as TTBMDIHandler).FToolbar) then begin + TTBMDIHandler(Owner).FToolbar.View.InvalidatePositions; + TTBMDIHandler(Owner).FToolbar.View.TryValidatePositions; + end; +end; + +procedure TTBMDIButtonsItem.ItemClick(Sender: TObject); +var + MainForm, ChildForm: TForm; + Cmd: WPARAM; +begin + MainForm := Application.MainForm; + if Assigned(MainForm) then begin + ChildForm := MainForm.ActiveMDIChild; + if Assigned(ChildForm) then begin + { Send WM_SYSCOMMAND messages so that we get sounds } + if Sender = FRestoreItem then + Cmd := SC_RESTORE + else if Sender = FCloseItem then + Cmd := SC_CLOSE + else + Cmd := SC_MINIMIZE; + SendMessage(ChildForm.Handle, WM_SYSCOMMAND, Cmd, LPARAM(GetMessagePos())); + end; + end; +end; + +procedure TTBMDIButtonsItem.InvalidateSystemMenuItem; +var + View: TTBView; +begin + if Assigned((Owner as TTBMDIHandler).FToolbar) then begin + View := TTBMDIHandler(Owner).FToolbar.View; + View.Invalidate(View.Find(TTBMDIHandler(Owner).FSystemMenuItem)); + end; +end; + + +{ TTBMDIWindowItem } + +constructor TTBMDIWindowItem.Create(AOwner: TComponent); +var + Form: TForm; +begin + inherited; + ItemStyle := ItemStyle + [tbisEmbeddedGroup]; + Caption := STBMDIWindowItemDefCaption; + FWindowMenu := TMenuItem.Create(Self); + + if not(csDesigning in ComponentState) then begin + { Need to set WindowMenu before MDI children are created. Otherwise the + list incorrectly shows the first 9 child windows, even if window 10+ is + active. } + Form := Application.MainForm; + if (Form = nil) and (Screen.FormCount > 0) then + Form := Screen.Forms[0]; + SetForm(Form); + end; +end; + +procedure TTBMDIWindowItem.GetChildren(Proc: TGetChildProc; Root: TComponent); +begin +end; + +procedure TTBMDIWindowItem.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if (Operation = opRemove) and (AComponent = FForm) then + SetForm(nil); +end; + +procedure TTBMDIWindowItem.SetForm(AForm: TForm); +begin + if FForm <> AForm then begin + if Assigned(FForm) and (FForm.WindowMenu = FWindowMenu) then + FForm.WindowMenu := nil; + FForm := AForm; + if Assigned(FForm) then + FForm.FreeNotification(Self); + end; + if Assigned(FForm) then + FForm.WindowMenu := FWindowMenu; +end; + +procedure TTBMDIWindowItem.EnabledChanged; +var + I: Integer; +begin + inherited; + for I := 0 to Count-1 do + Items[I].Enabled := Enabled; +end; + +procedure TTBMDIWindowItem.InitiateAction; +var + MainForm: TForm; + I: Integer; + M: HMENU; + Item: TTBCustomItem; + ItemCount: Integer; +begin + inherited; + if csDesigning in ComponentState then + Exit; + MainForm := Application.MainForm; + if Assigned(MainForm) then + SetForm(MainForm); + if FForm = nil then + Exit; + if FForm.ClientHandle <> 0 then + { This is needed, otherwise windows selected on the More Windows dialog + don't move back into the list } + SendMessage(FForm.ClientHandle, WM_MDIREFRESHMENU, 0, 0); + M := FWindowMenu.Handle; + ItemCount := GetMenuItemCount(M) - 1; + if ItemCount < 0 then + ItemCount := 0; + while Count < ItemCount do begin + Item := TTBCustomItem.Create(Self); + Item.Enabled := Enabled; + Item.OnClick := ItemClick; + Add(Item); + end; + while Count > ItemCount do + Items[Count-1].Free; + for I := 0 to ItemCount-1 do begin + Item := Items[I]; + Item.Tag := {$IFDEF CLR}TTag{$ENDIF}(Word(GetMenuItemID(M, I+1))); + Item.Caption := GetMenuItemStr(M, I+1); + Item.Checked := GetMenuState(M, I+1, MF_BYPOSITION) and MF_CHECKED <> 0; + end; + if Assigned(FOnUpdate) then + FOnUpdate(Self); +end; + +procedure TTBMDIWindowItem.ItemClick(Sender: TObject); +var + Form: TForm; +begin + Form := Application.MainForm; + if Assigned(Form) then + PostMessage(Form.Handle, WM_COMMAND, Word(TTBCustomItem(Sender).Tag), 0); +end; + +end. diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2MDI.res b/official/2.2.2+2.4.2/TB2K/Source/TB2MDI.res new file mode 100644 index 0000000000000000000000000000000000000000..4a6203581a390a61c4fb08e5e23f5205e7b9749e GIT binary patch literal 712 zcmcJJI}QRd3`7S+k&+`&QX)>UAR$Bn4N!0cj*&9Q+M9(pn`8k2C8PK=9y_)qEwG%6 zk-p(Rl{zXpPj%5&Yn^q&j@s#@s}5uv?P2F}ZZ#iMElE4frHN*Ez@Og{C7xm|0Z)oW z^?i@vBOP)H_;Pnv`Zr=o$y>NbB2P7#n@0H&u@taYuQVx?KKP(J0{4d@k;k9&CcyeI uSpE3_prU(EaO02prvKRA4*0mg{$CdGJv)4$_mz8Ug9~U4rmwu!{~R9{E(V(b literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2MRU.pas b/official/2.2.2+2.4.2/TB2K/Source/TB2MRU.pas new file mode 100644 index 0000000..86f0bca --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Source/TB2MRU.pas @@ -0,0 +1,417 @@ +unit TB2MRU; + +{ + Toolbar2000 + Copyright (C) 1998-2006 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2MRU.pas,v 1.24 2006/03/12 23:11:59 jr Exp $ +} + +interface + +{$I TB2Ver.inc} + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + TB2Item, IniFiles, Registry; + +type + TTBMRUListClickEvent = procedure(Sender: TObject; const Filename: String) of object; + + TTBMRUList = class(TComponent) + private + FAddFullPath: Boolean; + FContainer: TTBCustomItem; + FHidePathExtension: Boolean; + FList: TStrings; + FMaxItems: Integer; + FOnChange: TNotifyEvent; + FOnClick: TTBMRUListClickEvent; + FPrefix: String; + procedure ClickHandler(Sender: TObject); + procedure SetHidePathExtension(Value: Boolean); + procedure SetList(Value: TStrings); + procedure SetMaxItems(Value: Integer); + protected + property Container: TTBCustomItem read FContainer; + function GetItemClass: TTBCustomItemClass; virtual; + procedure SetItemCaptions; virtual; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Add(Filename: String); + procedure Remove(const Filename: String); + procedure LoadFromIni(Ini: TCustomIniFile; const Section: String); + procedure LoadFromRegIni(Ini: TRegIniFile; const Section: String); + procedure SaveToIni(Ini: TCustomIniFile; const Section: String); + procedure SaveToRegIni(Ini: TRegIniFile; const Section: String); + published + { MaxItems must be published before Items } + property AddFullPath: Boolean read FAddFullPath write FAddFullPath default True; + property HidePathExtension: Boolean read FHidePathExtension write SetHidePathExtension default True; + property MaxItems: Integer read FMaxItems write SetMaxItems default 4; + property Items: TStrings read FList write SetList; + property OnClick: TTBMRUListClickEvent read FOnClick write FOnClick; + property OnChange: TNotifyEvent read FOnChange write FOnChange; + property Prefix: String read FPrefix write FPrefix; + end; + + TTBMRUListItem = class(TTBCustomItem) + private + FMRUList: TTBMRUList; + procedure SetMRUList(Value: TTBMRUList); + protected + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + public + constructor Create(AOwner: TComponent); override; + published + property MRUList: TTBMRUList read FMRUList write SetMRUList; + //property Caption; + //property LinkSubitems; + end; + +implementation + +uses + {$IFDEF CLR} System.Text, System.IO, {$ENDIF} + TB2Common, TB2Consts, CommDlg; + +procedure ChangeFileNameToTitle(var S: String); +{$IFNDEF CLR} +var + Buf: array[0..MAX_PATH-1] of Char; +begin + if GetFileTitle(PChar(S), Buf, SizeOf(Buf) div SizeOf(Buf[0])) = 0 then + S := Buf; +end; +{$ELSE} +var + Buf: StringBuilder; +begin + Buf := StringBuilder.Create(MAX_PATH); + if GetFileTitle(S, Buf, Buf.Capacity) = 0 then + S := Buf.ToString; +end; +{$ENDIF} + + +{ TTBMRUListStrings } + +type + TTBMRUListStrings = class(TStrings) + private + FInternalList: TStrings; + FMRUList: TTBMRUList; + procedure Changed; + public + constructor Create; + destructor Destroy; override; + procedure Clear; override; + procedure Delete(Index: Integer); override; + function Get(Index: Integer): String; override; + function GetCount: Integer; override; + function IndexOf(const S: String): Integer; override; + procedure Insert(Index: Integer; const S: String); override; + procedure Move(CurIndex, NewIndex: Integer); override; + procedure Put(Index: Integer; const S: String); override; + end; + +constructor TTBMRUListStrings.Create; +begin + inherited; + FInternalList := TStringList.Create; +end; + +destructor TTBMRUListStrings.Destroy; +begin + inherited; + FInternalList.Free; +end; + +procedure TTBMRUListStrings.Changed; +begin + if Assigned(FMRUList.FOnChange) and + not(csLoading in FMRUList.ComponentState) then + FMRUList.FOnChange(FMRUList); +end; + +procedure TTBMRUListStrings.Clear; +var + I: Integer; +begin + for I := FInternalList.Count-1 downto 0 do + Delete(I); +end; + +procedure TTBMRUListStrings.Delete(Index: Integer); +begin + FMRUList.FContainer[Index].Free; + FInternalList.Delete(Index); + FMRUList.SetItemCaptions; + Changed; +end; + +function TTBMRUListStrings.Get(Index: Integer): String; +begin + Result := FInternalList[Index]; +end; + +function TTBMRUListStrings.GetCount: Integer; +begin + Result := FInternalList.Count; +end; + +function TTBMRUListStrings.IndexOf(const S: String): Integer; +begin + { This is identical to TStrings.IndexOf except we use SameFileName. } + for Result := 0 to GetCount - 1 do + {$IFDEF JR_D6} + if SameFileName(Get(Result), S) then Exit; + {$ELSE} + if AnsiCompareFileName(Get(Result), S) = 0 then Exit; + {$ENDIF} + Result := -1; +end; + +procedure TTBMRUListStrings.Insert(Index: Integer; const S: String); +var + Item: TTBCustomItem; +begin + Item := FMRUList.GetItemClass.Create(FMRUList.FContainer); + Item.OnClick := FMRUList.ClickHandler; + FMRUList.FContainer.Insert(Index, Item); + FInternalList.Insert(Index, S); + FMRUList.SetItemCaptions; + Changed; +end; + +procedure TTBMRUListStrings.Move(CurIndex, NewIndex: Integer); +begin + FInternalList.Move(CurIndex, NewIndex); + FMRUList.FContainer.Move(CurIndex, NewIndex); + FMRUList.SetItemCaptions; + Changed; +end; + +procedure TTBMRUListStrings.Put(Index: Integer; const S: String); +begin + FInternalList[Index] := S; + FMRUList.SetItemCaptions; + Changed; +end; + + +{ TTBMRUList } + +constructor TTBMRUList.Create(AOwner: TComponent); +begin + inherited; + FAddFullPath := True; + FHidePathExtension := True; + FMaxItems := 4; + FPrefix := 'MRU'; + FList := TTBMRUListStrings.Create; + TTBMRUListStrings(FList).FMRUList := Self; + FContainer := TTBCustomItem.Create(nil); +end; + +destructor TTBMRUList.Destroy; +begin + FContainer.Free; + FList.Free; + inherited; +end; + +procedure TTBMRUList.Add(Filename: String); +var + I: Integer; +begin + if AddFullPath then + Filename := ExpandFileName(Filename); + { If Filename is already in the MRU list, move it to the top } + I := FList.IndexOf(Filename); + if I <> -1 then begin + if I > 0 then + FList.Move(I, 0); + FList[0] := Filename; { ...in case the capitalization changed } + end + else + FList.Insert(0, Filename); +end; + +procedure TTBMRUList.Remove(const Filename: String); +var + I: Integer; +begin + I := FList.IndexOf(Filename); + if I <> -1 then + FList.Delete(I); +end; + +procedure TTBMRUList.LoadFromIni(Ini: TCustomIniFile; const Section: String); +var + I: Integer; + S: String; +begin + FList.Clear; + for I := 1 to FMaxItems do begin + S := Ini.ReadString(Section, FPrefix + IntToStr(I), ''); + if S <> '' then + FList.Add(S); + end; +end; + +procedure TTBMRUList.LoadFromRegIni(Ini: TRegIniFile; const Section: String); +var + I: Integer; + S: String; +begin + FList.Clear; + for I := 1 to FMaxItems do begin + S := Ini.ReadString(Section, FPrefix + IntToStr(I), ''); + if S <> '' then + FList.Add(S); + end; +end; + +procedure TTBMRUList.SaveToIni(Ini: TCustomIniFile; const Section: String); +var + I: Integer; +begin + for I := 1 to FMaxItems do begin + if I <= FList.Count then + Ini.WriteString(Section, FPrefix + IntToStr(I), FList[I-1]) + else + Ini.DeleteKey(Section, FPrefix + IntToStr(I)); + end; +end; + +procedure TTBMRUList.SaveToRegIni(Ini: TRegIniFile; const Section: String); +var + I: Integer; +begin + for I := 1 to FMaxItems do begin + if I <= FList.Count then + Ini.WriteString(Section, FPrefix + IntToStr(I), FList[I-1]) + else + Ini.DeleteKey(Section, FPrefix + IntToStr(I)); + end; +end; + +procedure TTBMRUList.SetItemCaptions; +var + I, J: Integer; + Key: Char; + S: String; +begin + while FList.Count > FMaxItems do + FList.Delete(FList.Count-1); + for I := 0 to FContainer.Count-1 do begin + Key := #0; + if I < 9 then + Key := Chr(Ord('1') + I) + else begin + { No more numbers; try letters } + J := I - 9; + if J < 26 then + Key := Chr(Ord('A') + J); + end; + S := FList[I]; + if HidePathExtension then + ChangeFileNameToTitle(S); + S := EscapeAmpersands(S); + if Key <> #0 then + FContainer[I].Caption := Format('&%s %s', [Key, S]) + else + FContainer[I].Caption := S; + end; +end; + +procedure TTBMRUList.ClickHandler(Sender: TObject); +var + I: Integer; +begin + I := FContainer.IndexOf(TTBCustomItem(Sender)); + if I <> -1 then begin + if I > 0 then + FList.Move(I, 0); + if Assigned(FOnClick) then + FOnClick(Self, FList[0]); + end; +end; + +procedure TTBMRUList.SetHidePathExtension(Value: Boolean); +begin + if FHidePathExtension <> Value then begin + FHidePathExtension := Value; + SetItemCaptions; + end; +end; + +procedure TTBMRUList.SetList(Value: TStrings); +begin + FList.Assign(Value); +end; + +procedure TTBMRUList.SetMaxItems(Value: Integer); +begin + FMaxItems := Value; + SetItemCaptions; +end; + +function TTBMRUList.GetItemClass: TTBCustomItemClass; +begin + Result := TTBCustomItem; +end; + + +{ TTBMRUListItem } + +constructor TTBMRUListItem.Create(AOwner: TComponent); +begin + inherited; + ItemStyle := ItemStyle + [tbisEmbeddedGroup]; + Caption := STBMRUListItemDefCaption; +end; + +procedure TTBMRUListItem.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if (AComponent = FMRUList) and (Operation = opRemove) then + SetMRUList(nil); +end; + +procedure TTBMRUListItem.SetMRUList(Value: TTBMRUList); +begin + if FMRUList <> Value then begin + FMRUList := Value; + if Assigned(FMRUList) then begin + Value.FreeNotification(Self); + LinkSubitems := FMRUList.FContainer; + end + else + LinkSubitems := nil; + end; +end; + +end. diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2OleMarshal.pas b/official/2.2.2+2.4.2/TB2K/Source/TB2OleMarshal.pas new file mode 100644 index 0000000..fdca5c3 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Source/TB2OleMarshal.pas @@ -0,0 +1,203 @@ +unit TB2OleMarshal; + +{ + Toolbar2000 + Copyright (C) 1998-2008 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2OleMarshal.pas,v 1.4 2008/09/17 18:04:09 jr Exp $ + + This unit implements the TTBStandardOleMarshalObject class, an exact clone of + .NET Framework 2.0's StandardOleMarshalObject class, which isn't available + on the .NET Framework 1.1-based Delphi 2006. + On Delphi 2007, I had planned to switch to StandardOleMarshalObject, but it + turns out there's a bug that causes it raise AV's on x64 & IA-64 (seen as + E_POINTER on the client side). Coincidentally, TTBStandardOleMarshalObject + does not suffer from this bug (even though it was intended to be an exact + clone!). + + The class "replaces the standard common language runtime (CLR) free-threaded + marshaler with the standard OLE STA marshaler." It "prevents calls made into + a hosting object by OLE from entering threads other than the UI thread." + For more information, see: + http://msdn2.microsoft.com/system.runtime.interopservices.standardolemarshalobject.aspx +} + +interface + +{$I TB2Ver.inc} + +uses + System.Runtime.InteropServices, Windows; + +type + { Our declaration for IMarshal } + [ComImport, + GuidAttribute('00000003-0000-0000-C000-000000000046'), + InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + ITBMarshal = interface + [PreserveSig] + function GetUnmarshalClass([MarshalAs(UnmanagedType.LPStruct)] riid: Guid; + pv: IntPtr; dwDestContext: Longint; pvDestContext: IntPtr; + mshlflags: Longint; out pCid: Guid): HRESULT; + [PreserveSig] + function GetMarshalSizeMax([MarshalAs(UnmanagedType.LPStruct)] riid: Guid; + pv: IntPtr; dwDestContext: Longint; pvDestContext: IntPtr; + mshlflags: Longint; out pSize: Longint): HRESULT; + [PreserveSig] + function MarshalInterface([in, MarshalAs(UnmanagedType.Interface)] pStm: TObject; + [MarshalAs(UnmanagedType.LPStruct)] riid: Guid; pv: IntPtr; + dwDestContext: Longint; pvDestContext: IntPtr; mshlflags: Longint): HRESULT; + [PreserveSig] + function UnmarshalInterface([in, MarshalAs(UnmanagedType.Interface)] pStm: TObject; + [MarshalAs(UnmanagedType.LPStruct)] riid: Guid; out ppv: IntPtr): HRESULT; + [PreserveSig] + function ReleaseMarshalData([in, MarshalAs(UnmanagedType.Interface)] pStm: TObject): HRESULT; + [PreserveSig] + function DisconnectObject(dwReserved: Longint): HRESULT; + end; + + TTBStandardOleMarshalObject = class(System.MarshalByRefObject, ITBMarshal) + private + function GetStdMarshaller(const riid: Guid; const dwDestContext: Longint; + const mshlflags: Longint): IntPtr; + { IMarshal } + function GetUnmarshalClass(riid: Guid; pv: IntPtr; dwDestContext: Longint; + pvDestContext: IntPtr; mshlflags: Longint; out pCid: Guid): HRESULT; + function GetMarshalSizeMax(riid: Guid; pv: IntPtr; dwDestContext: Longint; + pvDestContext: IntPtr; mshlflags: Longint; out pSize: Longint): HRESULT; + function MarshalInterface(pStm: TObject; riid: Guid; pv: IntPtr; + dwDestContext: Longint; pvDestContext: IntPtr; mshlflags: Longint): HRESULT; + function UnmarshalInterface(pStm: TObject; riid: Guid; out ppv: IntPtr): HRESULT; + function ReleaseMarshalData(pStm: TObject): HRESULT; + function DisconnectObject(dwReserved: Longint): HRESULT; + end; + +implementation + +{ Note: According to http://blogs.msdn.com/cbrumme/archive/2003/04/15/51335.aspx + the Marshal.ReleaseComObject(pStm) calls are needed to work around a "quirk + of OLE32 on some versions of the operating system". } + +uses + System.Security; + +const + ole32 = 'ole32.dll'; + +[SuppressUnmanagedCodeSecurity, DllImport(ole32, CharSet = CharSet.Unicode, EntryPoint = 'CoGetMarshalSizeMax')] +function _CoGetMarshalSizeMax(out pulSize: Longint; + [in, MarshalAs(UnmanagedType.LPStruct)] riid: Guid; pUnk: IntPtr; + dwDestContext: Longint; pvDestContext: IntPtr; + mshlflags: Longint): HRESULT; external; +[SuppressUnmanagedCodeSecurity, DllImport(ole32, CharSet = CharSet.Unicode, EntryPoint = 'CoGetStandardMarshal')] +function _CoGetStandardMarshal([in, MarshalAs(UnmanagedType.LPStruct)] iid: Guid; + pUnk: IntPtr; dwDestContext: Longint; pvDestContext: IntPtr; + mshlflags: Longint; out ppMarshal: IntPtr): HRESULT; external; +[SuppressUnmanagedCodeSecurity, DllImport(ole32, CharSet = CharSet.Unicode, EntryPoint = 'CoMarshalInterface')] +function _CoMarshalInterface([in, MarshalAs(UnmanagedType.Interface)] pStm: TObject; + [in, MarshalAs(UnmanagedType.LPStruct)] riid: Guid; pUnk: IntPtr; + dwDestContext: Longint; pvDestContext: IntPtr; + mshlflags: Longint): HRESULT; external; + +function TTBStandardOleMarshalObject.GetStdMarshaller(const riid: Guid; + const dwDestContext: Longint; const mshlflags: Longint): IntPtr; +var + V_1: IntPtr; +begin + Result := nil; + V_1 := Marshal.GetIUnknownForObject(Self); + if V_1 <> nil then begin + try + if _CoGetStandardMarshal(riid, V_1, dwDestContext, nil, mshlflags, Result) = S_OK then + Exit; + finally + Marshal.Release(V_1); + end; + end; + { Note: Localizing this message isn't necessary because a user will never + see it; the .NET runtime will catch it and translate it into a + COR_E_EXCEPTION HRESULT. } + raise InvalidOperationException.Create('TTBStandardOleMarshalObject.GetStdMarshaller failed'); +end; + +function TTBStandardOleMarshalObject.GetUnmarshalClass(riid: Guid; pv: IntPtr; + dwDestContext: Longint; pvDestContext: IntPtr; mshlflags: Longint; + out pCid: Guid): HRESULT; +begin + { StandardOleMarshalObject does "pCid := TypeOf(IStdMarshal).GUID" here, but + we haven't declared IStdMarshal anywhere, so create a fresh Guid } + pCid := Guid.Create('00000017-0000-0000-C000-000000000046'); { CLSID_StdMarshal } + Result := S_OK; +end; + +function TTBStandardOleMarshalObject.GetMarshalSizeMax(riid: Guid; pv: IntPtr; + dwDestContext: Longint; pvDestContext: IntPtr; mshlflags: Longint; + out pSize: Longint): HRESULT; +var + V_0: IntPtr; +begin + V_0 := GetStdMarshaller(riid, dwDestContext, mshlflags); + try + Result := _CoGetMarshalSizeMax(pSize, riid, V_0, dwDestContext, pvDestContext, mshlflags); + finally + Marshal.Release(V_0); + end; +end; + +function TTBStandardOleMarshalObject.MarshalInterface(pStm: TObject; riid: Guid; + pv: IntPtr; dwDestContext: Longint; pvDestContext: IntPtr; + mshlflags: Longint): HRESULT; +var + V_0: IntPtr; +begin + V_0 := GetStdMarshaller(riid, dwDestContext, mshlflags); + try + Result := _CoMarshalInterface(pStm, riid, V_0, dwDestContext, pvDestContext, mshlflags); + finally + Marshal.Release(V_0); + if pStm <> nil then + Marshal.ReleaseComObject(pStm); + end; +end; + +function TTBStandardOleMarshalObject.UnmarshalInterface(pStm: TObject; + riid: Guid; out ppv: IntPtr): HRESULT; +begin + ppv := nil; + if pStm <> nil then + Marshal.ReleaseComObject(pStm); + Result := E_NOTIMPL; +end; + +function TTBStandardOleMarshalObject.ReleaseMarshalData(pStm: TObject): HRESULT; +begin + if pStm <> nil then + Marshal.ReleaseComObject(pStm); + Result := E_NOTIMPL; +end; + +function TTBStandardOleMarshalObject.DisconnectObject(dwReserved: Longint): HRESULT; +begin + Result := E_NOTIMPL; +end; + +end. diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2Reg.dcr b/official/2.2.2+2.4.2/TB2K/Source/TB2Reg.dcr new file mode 100644 index 0000000000000000000000000000000000000000..ec4d2e1fb13ce8677af59e46650b8783296f5868 GIT binary patch literal 5188 zcmd5=J#XAb5FHx<=Z(lnvM9Z)VVE>N?B17qbwg?kvQm*ot( z5p~r-6Wm)9#B9}dwhmG|a4Aw$kzacMKk@iksj?oh6V?}Ryw}^>D}f&druQ)p{oy`i zh9!OXi<&O^?hu~)L*9W$x=%iv%wh1~a+xP>mdiZpej>hfXQ6%IARqB-$o~lJlm5*y z!VnDa4Q~kYJ;;RjVvw8x zWiriKVYQv_j^Ve@$ahEb5xFnXUBu2j`Wu3Jw2;##gvxq~i?S+Eg#3WPAO;B;5f^2^ zQk9S&aFWS`o$3$H;(eVZZV2eRH(dSsta1d8y_I9^zZ2}cPuPi!p>OZ_+;YQdjvqH% zkC9>E);8h)4i7V)@=s>?wB?v43(gF*nFpB`S<<&d1H79Wd^ey6c~2|c0a3o62fs#&W;sP- zLoRWrnx?Eh)wHB-Bq675rW){(+bnD3FJstdGQ#tC0_~b@JeQuY*T_EXM>=AEdLM1{ z3}vuUI-CDEyIkd)Dw^f%KVe;-UxopnUxr0;KJ*j0^Gn0Jo3DHJ`_Xf%cvdg%ayYTe zd<-8fb^B}RDz+N7R75Enr$}sK6dtuT`i|Nfbw};}{j}Zi*6n?^D^3npy6t^-6&um} z`zS24JS&4hCxwWq-NF@p!}?LtqV@}4_%D+xD6MzjN32+4OB%FI|{l)%6;0ExsGc z(i$fstrzV^9r^rICd+$E6YIlNne3h3yS>Mfea7G8gO%>X9@}9fPK)2xTt=)LZK7`5 UV%lCz+t`i#Hm1t_UA$?dZ(Jd5%K!iX literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2Reg.hpp b/official/2.2.2+2.4.2/TB2K/Source/TB2Reg.hpp new file mode 100644 index 0000000..0344ed2 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Source/TB2Reg.hpp @@ -0,0 +1,53 @@ +// CodeGear C++Builder +// Copyright (c) 1995, 2008 by CodeGear +// All rights reserved + +// (DO NOT EDIT: machine generated header) 'Tb2reg.pas' rev: 20.00 + +#ifndef Tb2regHPP +#define Tb2regHPP + +#pragma delphiheader begin +#pragma option push +#pragma option -w- // All warnings off +#pragma option -Vx // Zero-length empty class member functions +#pragma pack(push,8) +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit + +//-- user supplied ----------------------------------------------------------- + +namespace Tb2reg +{ +//-- type declarations ------------------------------------------------------- +//-- var, const, procedure --------------------------------------------------- +extern PACKAGE void __fastcall TBRegisterClasses(Classes::TPersistentClass const *AClasses, const int AClasses_Size); +extern PACKAGE void __fastcall Register(void); + +} /* namespace Tb2reg */ +using namespace Tb2reg; +#pragma pack(pop) +#pragma option pop + +#pragma delphiheader end. +//-- end unit ---------------------------------------------------------------- +#endif // Tb2regHPP diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2Reg.pas b/official/2.2.2+2.4.2/TB2K/Source/TB2Reg.pas new file mode 100644 index 0000000..3cacb90 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Source/TB2Reg.pas @@ -0,0 +1,317 @@ +unit TB2Reg; + +{ + Toolbar2000 + Copyright (C) 1998-2008 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2Reg.pas,v 1.32 2008/09/18 19:08:40 jr Exp $ +} + +interface + +{$I TB2Ver.inc} + +uses + Windows, SysUtils, Classes, Graphics, Controls, Dialogs, ActnList, ImgList, + {$IFDEF JR_D6} DesignIntf, DesignEditors, VCLEditors, {$ELSE} DsgnIntf, {$ENDIF} + TB2Toolbar, TB2ToolWindow, TB2Dock, TB2Item, TB2ExtItems, TB2MRU, TB2MDI, + TB2DsgnItemEditor; + +procedure Register; +procedure TBRegisterClasses(const AClasses: array of TPersistentClass); + +implementation + +{$IFDEF CLR} +{ Delphi.NET doesn't use DCR files for component icons } +{$R 'Icons\TTBBackground.bmp'} +{$R 'Icons\TTBBackground16.bmp'} +{$R 'Icons\TTBDock.bmp'} +{$R 'Icons\TTBDock16.bmp'} +{$R 'Icons\TTBImageList.bmp'} +{$R 'Icons\TTBImageList16.bmp'} +{$R 'Icons\TTBItemContainer.bmp'} +{$R 'Icons\TTBItemContainer16.bmp'} +{$R 'Icons\TTBMDIHandler.bmp'} +{$R 'Icons\TTBMDIHandler16.bmp'} +{$R 'Icons\TTBMRUList.bmp'} +{$R 'Icons\TTBMRUList16.bmp'} +{$R 'Icons\TTBPopupMenu.bmp'} +{$R 'Icons\TTBPopupMenu16.bmp'} +{$R 'Icons\TTBToolbar.bmp'} +{$R 'Icons\TTBToolbar16.bmp'} +{$R 'Icons\TTBToolWindow.bmp'} +{$R 'Icons\TTBToolWindow16.bmp'} +{$ENDIF} + +uses + {$IFDEF CLR} WinUtils, {$ENDIF} + ImgEdit; + +{$IFDEF JR_D5} + +{ TTBImageIndexPropertyEditor } + +{ Unfortunately TComponentImageIndexPropertyEditor seems to be gone in + Delphi 6, so we have to use our own image index property editor class } + +type + TTBImageIndexPropertyEditor = class(TIntegerProperty + {$IFDEF JR_D6} , ICustomPropertyListDrawing {$ENDIF}) + public + function GetAttributes: TPropertyAttributes; override; + procedure GetValues(Proc: TGetStrProc); override; + function GetImageListAt(Index: Integer): TCustomImageList; virtual; + + // ICustomPropertyListDrawing + procedure ListMeasureHeight(const Value: string; ACanvas: TCanvas; + var AHeight: Integer); {$IFNDEF JR_D6} override; {$ENDIF} + procedure ListMeasureWidth(const Value: string; ACanvas: TCanvas; + var AWidth: Integer); {$IFNDEF JR_D6} override; {$ENDIF} + procedure ListDrawValue(const Value: string; ACanvas: TCanvas; + const ARect: TRect; ASelected: Boolean); {$IFNDEF JR_D6} override; {$ENDIF} + end; + +function TTBImageIndexPropertyEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paMultiSelect, paValueList, paRevertable]; +end; + +function TTBImageIndexPropertyEditor.GetImageListAt(Index: Integer): TCustomImageList; +begin + Result := nil; +end; + +procedure TTBImageIndexPropertyEditor.GetValues(Proc: TGetStrProc); +var + ImgList: TCustomImageList; + I: Integer; +begin + ImgList := GetImageListAt(0); + if Assigned(ImgList) then + for I := 0 to ImgList.Count-1 do + Proc(IntToStr(I)); +end; + +procedure TTBImageIndexPropertyEditor.ListDrawValue(const Value: string; + ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean); +var + ImgList: TCustomImageList; + X: Integer; +begin + ImgList := GetImageListAt(0); + ACanvas.FillRect(ARect); + X := ARect.Left + 2; + if Assigned(ImgList) then begin + ImgList.Draw(ACanvas, X, ARect.Top + 2, StrToInt(Value)); + Inc(X, ImgList.Width); + end; + ACanvas.TextOut(X + 3, ARect.Top + 1, Value); +end; + +procedure TTBImageIndexPropertyEditor.ListMeasureHeight(const Value: string; + ACanvas: TCanvas; var AHeight: Integer); +var + ImgList: TCustomImageList; +begin + ImgList := GetImageListAt(0); + AHeight := ACanvas.TextHeight(Value) + 2; + if Assigned(ImgList) and (ImgList.Height + 4 > AHeight) then + AHeight := ImgList.Height + 4; +end; + +procedure TTBImageIndexPropertyEditor.ListMeasureWidth(const Value: string; + ACanvas: TCanvas; var AWidth: Integer); +var + ImgList: TCustomImageList; +begin + ImgList := GetImageListAt(0); + AWidth := ACanvas.TextWidth(Value) + 4; + if Assigned(ImgList) then + Inc(AWidth, ImgList.Width); +end; + +{ TTBItemImageIndexPropertyEditor } + +type + TTBItemImageIndexPropertyEditor = class(TTBImageIndexPropertyEditor) + public + function GetImageListAt(Index: Integer): TCustomImageList; override; + end; + +function TTBItemImageIndexPropertyEditor.GetImageListAt(Index: Integer): TCustomImageList; +var + C: TPersistent; + Item: TTBCustomItem; +begin + Result := nil; + { ? I'm guessing that the Index parameter is a component index (one that + would be passed to the GetComponent function). } + C := GetComponent(Index); + if C is TTBCustomItem then begin + Item := TTBCustomItem(C); + repeat + Result := Item.Images; + if Assigned(Result) then + Break; + Item := Item.Parent; + if Item = nil then + Break; + Result := Item.SubMenuImages; + until Assigned(Result); + end; +end; + +{$ENDIF} + +{ TTBImageListEditor } + +type + TTBImageListEditor = class(TComponentEditor) + public + procedure Edit; override; + procedure ExecuteVerb(Index: Integer); override; + function GetVerb(Index: Integer): String; override; + function GetVerbCount: Integer; override; + end; + +procedure TTBImageListEditor.Edit; +var + ImgList: TTBImageList; +begin + ImgList := Component as TTBImageList; + if not ImgList.ImagesBitmap.Empty then begin + if MessageDlg('The image list''s ImagesBitmap property has ' + + 'a bitmap assigned. Because of this, any changes you make in the ' + + 'Image List Editor will not be preserved when the form is saved.'#13#10#13#10 + + 'Do you want to open the editor anyway?', mtWarning, + [mbYes, mbNo], 0) <> mrYes then + Exit; + end; + EditImageList(ImgList); +end; + +procedure TTBImageListEditor.ExecuteVerb(Index: Integer); +begin + if Index = 0 then + Edit; +end; + +function TTBImageListEditor.GetVerbCount: Integer; +begin + Result := 1; +end; + +function TTBImageListEditor.GetVerb(Index: Integer): String; +begin + if Index = 0 then + Result := 'ImageList Editor...' + else + Result := ''; +end; + + +procedure TBRegisterClasses(const AClasses: array of TPersistentClass); +{$IFDEF CLR} +var + I: Integer; + FoundClass: TPersistentClass; +{$ENDIF} +begin + {$IFDEF CLR} + { Hack for Delphi.NET (2006): If you recompile an already-installed package + the IDE doesn't unload the old package before installing the new one. + Therefore, we must search for and unregister any existing classes before + registering new ones, to avoid having two incompatible sets of classes + registered at the same time. + Without this, if we rebuild tb2kdsgn_dn10 (which implicitly reloads + tb2k_dn10) and then attempt to open the Demo project's main form in the + IDE, we get a "Toolbar item cannot be inserted into container of type + TTBToolbar" exception inside TTBCustomItem.SetParentComponent, because + apparently the TTBToolbar class it's trying to use is located in the new + assembly, while the item class is located in the old assembly. + Note: It appears that this issue only affects registered classes; there + is no need for an "UnRegisterComponents" call. } + for I := High(AClasses) downto Low(AClasses) do begin + { Unregister all classes with the same name } + while True do begin + FoundClass := GetClass(AClasses[I].ClassName); + if FoundClass = nil then + Break; + UnRegisterClass(FoundClass); + end; + end; + {$ENDIF} + RegisterClasses(AClasses); +end; + +procedure Register; +begin + { Note: On Delphi.NET 2006, it's possible for this procedure to be called + a second time on the same tb2kdsgn instance. See comments in + TBRegisterItemClass. } + + RegisterComponents('Toolbar2000', [TTBDock, TTBToolbar, TTBToolWindow, + TTBPopupMenu, TTBImageList, TTBItemContainer, TTBBackground, TTBMRUList, + TTBMDIHandler]); + {$IFDEF JR_D4} + RegisterActions('', [TTBEditAction], nil); + {$ENDIF} + RegisterNoIcon([TTBCustomItem]); + TBRegisterClasses([TTBItem, TTBGroupItem, TTBSubmenuItem, TTBSeparatorItem, + TTBEditItem, TTBMRUListItem, TTBControlItem, TTBMDIWindowItem, + TTBVisibilityToggleItem]); + + RegisterComponentEditor(TTBCustomToolbar, TTBItemsEditor); + RegisterComponentEditor(TTBItemContainer, TTBItemsEditor); + RegisterComponentEditor(TTBPopupMenu, TTBItemsEditor); + RegisterComponentEditor(TTBImageList, TTBImageListEditor); + RegisterPropertyEditor(TypeInfo(TTBRootItem), nil, '', TTBItemsPropertyEditor); + {$IFDEF JR_D5} + RegisterPropertyEditor(TypeInfo(TImageIndex), TTBCustomItem, 'ImageIndex', + TTBItemImageIndexPropertyEditor); + {$ENDIF} + {$IFDEF JR_D6} + { TShortCut properties show up like Integer properties in Delphi 6 + without this... } + RegisterPropertyEditor(TypeInfo(TShortCut), TTBCustomItem, '', + TShortCutProperty); + {$ENDIF} + + { Link in images for the toolbar buttons } + {$IFNDEF CLR} + {$R TB2DsgnItemEditor.res} + {$ELSE} + {$R 'Icons\TB2DsgnEditorImages.bmp'} + {$R 'Icons\TTBEditItem.bmp'} + {$R 'Icons\TTBGroupItem.bmp'} + {$R 'Icons\TTBMDIWindowItem.bmp'} + {$R 'Icons\TTBMRUListItem.bmp'} + {$ENDIF} + TBRegisterItemClass(TTBEditItem, 'New &Edit', HInstance); + TBRegisterItemClass(TTBGroupItem, 'New &Group Item', HInstance); + TBRegisterItemClass(TTBMRUListItem, 'New &MRU List Item', HInstance); + TBRegisterItemClass(TTBMDIWindowItem, 'New MDI &Windows List', HInstance); + TBRegisterItemClass(TTBVisibilityToggleItem, 'New &Visibility-Toggle Item', HInstance); +end; + +end. diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2ResCursors.res b/official/2.2.2+2.4.2/TB2K/Source/TB2ResCursors.res new file mode 100644 index 0000000000000000000000000000000000000000..e09ab15dfffb5b8fcb12fc48ac835711927ab2a5 GIT binary patch literal 1304 zcmds$Jx;_h5QU#(ln7~yAV8u(kTP^BD3LY`K`SJFBv=l>4YD?lyHNT zDY6W25?kyd6c7px6MY_!J+d7?4*(=Yq=nrj+c$pRFoyvxi&s~CQV5HbK|*q3_%-HS z8+^2)8~wyAla$ag;M&Rqc_tO%Qs#}+E-vX`fXydh?~#52q|OhS=Z$CRwt6a3IZBZ^ zsb9$ru?`HS#*{EN?bsdr-=Q0C@E|!68Q>g;C~%1p#yG(Q$2h|gt~qjr3%1^}*!R>2 zyyY}$S5buwmURl6&h;q;H)L_)A`= z5tS-BRO;3!_@t3O?!IeDHCn$1)~L-^25jFp-ZHiv|EC%i3mO%ypi`oi^!s|Ucn1ZG Bgx~-G literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2ToolWindow.pas b/official/2.2.2+2.4.2/TB2K/Source/TB2ToolWindow.pas new file mode 100644 index 0000000..90d5592 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Source/TB2ToolWindow.pas @@ -0,0 +1,258 @@ +unit TB2ToolWindow; + +{ + Toolbar2000 + Copyright (C) 1998-2005 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2ToolWindow.pas,v 1.18 2005/01/06 03:56:50 jr Exp $ +} + +interface + +{$I TB2Ver.inc} + +uses + Windows, Classes, Graphics, Controls, TB2Dock; + +type + { TTBToolWindow } + + TTBToolWindow = class(TTBCustomDockableWindow) + private + FMinClientWidth, FMinClientHeight, FMaxClientWidth, FMaxClientHeight: Integer; + FBarHeight, FBarWidth: Integer; + function CalcSize(ADock: TTBDock): TPoint; + function GetClientAreaWidth: Integer; + procedure SetClientAreaWidth(Value: Integer); + function GetClientAreaHeight: Integer; + procedure SetClientAreaHeight(Value: Integer); + procedure SetClientAreaSize(AWidth, AHeight: Integer); + protected + function DoArrange(CanMoveControls: Boolean; PreviousDockType: TTBDockType; + NewFloating: Boolean; NewDock: TTBDock): TPoint; override; + procedure GetBaseSize(var ASize: TPoint); override; + procedure GetMinMaxSize(var AMinClientWidth, AMinClientHeight, + AMaxClientWidth, AMaxClientHeight: Integer); override; + procedure Paint; override; + procedure SizeChanging(const AWidth, AHeight: Integer); override; + public + constructor Create(AOwner: TComponent); override; + + procedure ReadPositionData(const Data: TTBReadPositionData); override; + procedure WritePositionData(const Data: TTBWritePositionData); override; + published + property ActivateParent; + property Align; + property Anchors; + property BorderStyle; + property Caption; + property Color; + property CloseButton; + property CloseButtonWhenDocked; + property ClientAreaHeight: Integer read GetClientAreaHeight write SetClientAreaHeight; + property ClientAreaWidth: Integer read GetClientAreaWidth write SetClientAreaWidth; + property CurrentDock; + property DefaultDock; + property DockableTo; + property DockMode; + property DockPos; + property DockRow; + property DragHandleStyle; + property FloatingMode; + property Font; + property FullSize; + property HideWhenInactive; + property LastDock; + property MaxClientHeight: Integer read FMaxClientHeight write FMaxClientHeight default 0; + property MaxClientWidth: Integer read FMaxClientWidth write FMaxClientWidth default 0; + property MinClientHeight: Integer read FMinClientHeight write FMinClientHeight default 32; + property MinClientWidth: Integer read FMinClientWidth write FMinClientWidth default 32; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property Resizable; + property ShowCaption; + property ShowHint; + property Stretch; + property SmoothDrag; + property TabOrder; + property UseLastDock; + {}{property Version;} + property Visible; + + property OnClose; + property OnCloseQuery; + {$IFDEF JR_D5} + property OnContextPopup; + {$ENDIF} + property OnDragDrop; + property OnDragOver; + property OnDockChanged; + property OnDockChanging; + property OnDockChangingHidden; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnMove; + property OnRecreated; + property OnRecreating; + property OnResize; + property OnVisibleChanged; + end; + +implementation + +const + { Constants for TTBToolWindow-specific registry values. Do not localize! } + rvClientWidth = 'ClientWidth'; + rvClientHeight = 'ClientHeight'; + + +{ TTBToolWindow } + +constructor TTBToolWindow.Create(AOwner: TComponent); +begin + inherited; + FMinClientWidth := 32; + FMinClientHeight := 32; + { Initialize the client size to 32x32 } + SetBounds(Left, Top, 32, 32); +end; + +procedure TTBToolWindow.Paint; +var + R: TRect; +begin + { Draw dotted border in design mode } + if csDesigning in ComponentState then + with Canvas do begin + R := ClientRect; + Pen.Style := psDot; + Pen.Color := clBtnShadow; + Brush.Style := bsClear; + Rectangle(R.Left, R.Top, R.Right, R.Bottom); + Pen.Style := psSolid; + end; +end; + +procedure TTBToolWindow.ReadPositionData(const Data: TTBReadPositionData); +begin + inherited; + { Restore ClientAreaWidth/ClientAreaHeight variables } + if Resizable then + with Data do + SetClientAreaSize(ReadIntProc(Name, rvClientWidth, FBarWidth, ExtraData), + ReadIntProc(Name, rvClientHeight, FBarHeight, ExtraData)); +end; + +procedure TTBToolWindow.WritePositionData(const Data: TTBWritePositionData); +begin + inherited; + { Write values of FBarWidth/FBarHeight } + with Data do begin + WriteIntProc(Name, rvClientWidth, FBarWidth, ExtraData); + WriteIntProc(Name, rvClientHeight, FBarHeight, ExtraData); + end; +end; + +procedure TTBToolWindow.GetMinMaxSize(var AMinClientWidth, AMinClientHeight, + AMaxClientWidth, AMaxClientHeight: Integer); +begin + AMinClientWidth := FMinClientWidth; + AMinClientHeight := FMinClientHeight; + AMaxClientWidth := FMaxClientWidth; + AMaxClientHeight := FMaxClientHeight; +end; + +procedure TTBToolWindow.SizeChanging(const AWidth, AHeight: Integer); +begin + FBarWidth := AWidth; + if Parent <> nil then Dec(FBarWidth, Width - ClientWidth); + FBarHeight := AHeight; + if Parent <> nil then Dec(FBarHeight, Height - ClientHeight); +end; + +function TTBToolWindow.CalcSize(ADock: TTBDock): TPoint; +begin + Result.X := FBarWidth; + Result.Y := FBarHeight; + if Assigned(ADock) and (FullSize or Stretch) then begin + { If docked and stretching, return the minimum size so that the toolbar + can shrink below FBarWidth/FBarHeight } + if not(ADock.Position in [dpLeft, dpRight]) then + Result.X := FMinClientWidth + else + Result.Y := FMinClientHeight; + end; +end; + +procedure TTBToolWindow.GetBaseSize(var ASize: TPoint); +begin + ASize := CalcSize(CurrentDock); +end; + +function TTBToolWindow.DoArrange(CanMoveControls: Boolean; + PreviousDockType: TTBDockType; NewFloating: Boolean; NewDock: TTBDock): TPoint; +begin + Result := CalcSize(NewDock); +end; + +function TTBToolWindow.GetClientAreaWidth: Integer; +begin + if Parent = nil then + Result := Width + else + Result := ClientWidth; +end; + +procedure TTBToolWindow.SetClientAreaWidth(Value: Integer); +begin + SetClientAreaSize(Value, ClientAreaHeight); +end; + +function TTBToolWindow.GetClientAreaHeight: Integer; +begin + if Parent = nil then + Result := Height + else + Result := ClientHeight; +end; + +procedure TTBToolWindow.SetClientAreaHeight(Value: Integer); +begin + SetClientAreaSize(ClientAreaWidth, Value); +end; + +procedure TTBToolWindow.SetClientAreaSize(AWidth, AHeight: Integer); +var + Client: TRect; +begin + if Parent = nil then + SetBounds(Left, Top, AWidth, AHeight) + else begin + Client := GetClientRect; + SetBounds(Left, Top, Width - Client.Right + AWidth, + Height - Client.Bottom + AHeight); + end; +end; + +end. diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2Toolbar.pas b/official/2.2.2+2.4.2/TB2K/Source/TB2Toolbar.pas new file mode 100644 index 0000000..2264fd5 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Source/TB2Toolbar.pas @@ -0,0 +1,1794 @@ +unit TB2Toolbar; + +{ + Toolbar2000 + Copyright (C) 1998-2008 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2Toolbar.pas,v 1.126 2008/06/23 18:05:47 jr Exp $ +} + +interface + +{$I TB2Ver.inc} + +uses + {$IFDEF JR_D9} Types, {$ENDIF} + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, ImgList, + Menus, ActnList, + TB2Item, TB2Dock; + +type + TTBCustomToolbar = class; + TTBChevronItem = class; + TTBChevronItemClass = class of TTBChevronItem; + + TTBToolbarViewClass = class of TTBToolbarView; + TTBToolbarView = class(TTBView) + private + FToolbar: TTBCustomToolbar; + protected + procedure AutoSize(AWidth, AHeight: Integer); override; + procedure DoUpdatePositions(var ASize: TPoint); override; + function GetChevronItem: TTBCustomItem; override; + function GetMDIButtonsItem: TTBCustomItem; override; + function GetMDISystemMenuItem: TTBCustomItem; override; + public + constructor Create(AOwner: TComponent; AParentView: TTBView; + AParentItem: TTBCustomItem; AWindow: TWinControl; + AIsToolbar, ACustomizing, AUsePriorityList: Boolean); override; + function GetFont: TFont; override; + procedure InvalidatePositions; override; + end; + + TTBChevronPriorityForNewItems = (tbcpHighest, tbcpLowest); + + TTBCustomToolbar = class(TTBCustomDockableWindow, ITBItems) + private + FBaseSize: TPoint; + FChevronItem: TTBChevronItem; + FChevronMoveItems: Boolean; + FChevronPriorityForNewItems: TTBChevronPriorityForNewItems; + FDisableAlignArrange: Integer; + FFloatingWidth: Integer; + FIgnoreMouseLeave: Boolean; + FItem: TTBRootItem; + FLastWrappedLines: Integer; + FMenuBar: Boolean; + FOnShortCut: TShortCutEvent; + FProcessShortCuts: Boolean; + FMainWindowHookInstalled: Boolean; + FShrinkMode: TTBShrinkMode; + FSizeData: TObject; + FSystemFont: Boolean; + FUpdateActions: Boolean; + + procedure CancelHover; + function CalcChevronOffset(const ADock: TTBDock; + const AOrientation: TTBViewOrientation): Integer; + function CalcWrapOffset(const ADock: TTBDock): Integer; + function CreateWrapper(Index: Integer; Ctl: TControl): TTBControlItem; + function FindWrapper(Ctl: TControl): TTBControlItem; + function GetChevronHint: String; + function GetImages: TCustomImageList; + function GetItems: TTBCustomItem; + function GetLinkSubitems: TTBCustomItem; + function GetOptions: TTBItemOptions; + procedure InstallMainWindowHook; + function IsChevronHintStored: Boolean; + class function MainWindowHook(var Message: TMessage): Boolean; {$IFDEF CLR} static; {$ENDIF} + procedure SetChevronHint(const Value: String); + procedure SetChevronMoveItems(Value: Boolean); + procedure SetChevronPriorityForNewItems(Value: TTBChevronPriorityForNewItems); + procedure SetFloatingWidth(Value: Integer); + procedure SetImages(Value: TCustomImageList); + procedure SetLinkSubitems(Value: TTBCustomItem); + procedure SetMainWindowHook; + procedure SetMenuBar(Value: Boolean); + procedure SetOptions(Value: TTBItemOptions); + procedure SetProcessShortCuts(Value: Boolean); + procedure SetShrinkMode(Value: TTBShrinkMode); + procedure SetSystemFont(Value: Boolean); + procedure UninstallMainWindowHook; + procedure UpdateViewProperties; + + procedure CMColorChanged(var Message: TMessage); message CM_COLORCHANGED; + {$IFNDEF CLR} + procedure CMControlChange(var Message: TCMControlChange); message CM_CONTROLCHANGE; + procedure CMControlListChange(var Message: TCMControlListChange); message CM_CONTROLLISTCHANGE; + {$ENDIF} + procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED; + procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; + procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY; + procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW; + procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; + procedure CMShowHintChanged(var Message: TMessage); message CM_SHOWHINTCHANGED; + procedure CMWinIniChange(var Message: TWMWinIniChange); message CM_WININICHANGE; + procedure WMCancelMode(var Message: TWMCancelMode); message WM_CANCELMODE; + procedure WMGetObject(var Message: TMessage); message WM_GETOBJECT; + procedure WMMouseLeave(var Message: TMessage); message WM_MOUSELEAVE; + procedure WMNCMouseMove(var Message: TWMNCMouseMove); message WM_NCMOUSEMOVE; + {$IFNDEF JR_D5} + procedure WMRButtonUp(var Message: TWMRButtonUp); message WM_RBUTTONUP; + {$ENDIF} + procedure WMSetCursor(var Message: TWMSetCursor); message WM_SETCURSOR; + procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND; + protected + FMDIButtonsItem: TTBCustomItem; + FMDISystemMenuItem: TTBCustomItem; + FView: TTBToolbarView; + procedure AlignControls(AControl: TControl; var Rect: TRect); override; + procedure BuildPotentialSizesList(SizesList: TList); dynamic; + {$IFDEF CLR} + procedure ControlChange(Inserting: Boolean; Child: TControl); override; + procedure ControlListChange(Inserting: Boolean; Child: TControl); override; + {$ENDIF} + procedure ControlExistsAtPos(const P: TPoint; var ControlExists: Boolean); + override; + function DoArrange(CanMoveControls: Boolean; PreviousDockType: TTBDockType; + NewFloating: Boolean; NewDock: TTBDock): TPoint; override; + {$IFDEF JR_D5} + procedure DoContextPopup(MousePos: TPoint; var Handled: Boolean); override; + {$ENDIF} + procedure GetBaseSize(var ASize: TPoint); override; + procedure GetMinBarSize(var MinimumSize: TPoint); + procedure GetMinShrinkSize(var AMinimumSize: Integer); override; + function GetShrinkMode: TTBShrinkMode; override; + function GetChevronItemClass: TTBChevronItemClass; dynamic; + function GetItemClass: TTBRootItemClass; dynamic; + function GetViewClass: TTBToolbarViewClass; dynamic; + procedure Loaded; override; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); override; + procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; + procedure Paint; override; + procedure ResizeBegin(ASizeHandle: TTBSizeHandle); override; + procedure ResizeTrack(var Rect: TRect; const OrigRect: TRect); override; + procedure ResizeTrackAccept; override; + procedure ResizeEnd; override; + procedure SetChildOrder(Child: TComponent; Order: Integer); override; + + property SystemFont: Boolean read FSystemFont write SetSystemFont default True; + property OnShortCut: TShortCutEvent read FOnShortCut write FOnShortCut; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure BeginUpdate; + procedure EndUpdate; + procedure CreateWrappersForAllControls; + procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override; + procedure GetTabOrderList(List: TList); override; + procedure InitiateAction; override; + function IsShortCut(var Message: TWMKey): Boolean; + function KeyboardOpen(Key: Char; RequirePrimaryAccel: Boolean): Boolean; + procedure ReadPositionData(const Data: TTBReadPositionData); override; + procedure WritePositionData(const Data: TTBWritePositionData); override; + + property ChevronHint: String read GetChevronHint write SetChevronHint stored IsChevronHintStored; + property ChevronMoveItems: Boolean read FChevronMoveItems write SetChevronMoveItems default True; + property ChevronPriorityForNewItems: TTBChevronPriorityForNewItems read FChevronPriorityForNewItems + write SetChevronPriorityForNewItems default tbcpHighest; + property FloatingWidth: Integer read FFloatingWidth write SetFloatingWidth default 0; + property Images: TCustomImageList read GetImages write SetImages; + property Items: TTBRootItem read FItem; + property LinkSubitems: TTBCustomItem read GetLinkSubitems write SetLinkSubitems; + property Options: TTBItemOptions read GetOptions write SetOptions default []; + property MenuBar: Boolean read FMenuBar write SetMenuBar default False; + property ProcessShortCuts: Boolean read FProcessShortCuts write SetProcessShortCuts default False; + property ShrinkMode: TTBShrinkMode read FShrinkMode write SetShrinkMode default tbsmChevron; + property UpdateActions: Boolean read FUpdateActions write FUpdateActions default True; + property View: TTBToolbarView read FView; + published + property Hint stored False; { Hint is set dynamically; don't save it } + end; + + TTBToolbar = class(TTBCustomToolbar) + published + property ActivateParent; + property Align; + property Anchors; + property AutoResize; + property BorderStyle; + property Caption; + property ChevronHint; + property ChevronMoveItems; + property ChevronPriorityForNewItems; + property CloseButton; + property CloseButtonWhenDocked; + property Color; + property CurrentDock; + property DefaultDock; + property DockableTo; + property DockMode; + property DockPos; + property DockRow; + property DragHandleStyle; + property FloatingMode; + property FloatingWidth; + property Font; + property FullSize; + property HideWhenInactive; + property Images; + property Items; + property LastDock; + property LinkSubitems; + property MenuBar; + property Options; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ProcessShortCuts; + property Resizable; + property ShowCaption; + property ShowHint; + property ShrinkMode; + property SmoothDrag; + property Stretch; + property SystemFont; + property TabOrder; + property UpdateActions; + property UseLastDock; + property Visible; + + property OnClose; + property OnCloseQuery; + {$IFDEF JR_D5} + property OnContextPopup; + {$ENDIF} + property OnDragDrop; + property OnDragOver; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnMove; + property OnRecreated; + property OnRecreating; + property OnDockChanged; + property OnDockChanging; + property OnDockChangingHidden; + property OnResize; + property OnShortCut; + property OnVisibleChanged; + end; + +{ TTBChevronItem & TTBChevronItemViewer } + + TTBChevronItem = class(TTBCustomItem) + private + FToolbar: TTBCustomToolbar; + function GetDefaultHint: String; + protected + function GetChevronParentView: TTBView; override; + function GetItemViewerClass(AView: TTBView): TTBItemViewerClass; override; + public + constructor Create(AOwner: TComponent); override; + end; + + TTBChevronItemViewer = class(TTBItemViewer) + protected + procedure Paint(const Canvas: TCanvas; const ClientAreaRect: TRect; + IsSelected, IsPushed, UseDisabledShadow: Boolean); override; + end; + +const + tbChevronSize = 12; + + +implementation + +uses + {$IFDEF CLR} System.Runtime.InteropServices, System.Text, {$ENDIF} + TB2Consts, TB2Common, TB2Hook; + +const + { Constants for TTBCustomToolbar-specific registry values. Do not localize! } + rvFloatRightX = 'FloatRightX'; + DockTypeToOrientation: array[TTBDockType] of TTBViewOrientation = + (tbvoHorizontal, tbvoFloating, tbvoHorizontal, tbvoVertical); + +type + { Used internally by the TTBCustomToolbar.Resize* methods } + TToolbarSizeData = class + public + SizeHandle: TTBSizeHandle; + NewSizes: TList; { List of valid new sizes. Items are casted into TSmallPoints } + OrigWidth, OrigHeight, NCXDiff: Integer; + CurRightX: Integer; + DisableSensCheck, OpSide: Boolean; + DistanceToSmallerSize, DistanceToLargerSize: Integer; + end; + + +procedure HookProc(Code: THookProcCode; Wnd: HWND; WParam: WPARAM; + LParam: LPARAM); +var + Msg: {$IFNDEF CLR} PMsg {$ELSE} TMsg {$ENDIF}; + MainForm: TForm; +begin + { Work around an annoying Windows or VCL bug. If you close all MDI child + windows, the MDI client window gets the focus, and when it has the focus, + pressing Alt+[char] doesn't send a WM_SYSCOMMAND message to the form for + some reason. It seems silly to have to use a hook for this, but I don't + see a better workaround. + Also, route Alt+- to the main form so that when an MDI child form is + maximized, Alt+- brings up the TB2k MDI system menu instead of the + system's. } + if Code = hpGetMessage then begin + {$IFNDEF CLR} + Msg := PMsg(LParam); + {$ELSE} + Msg := TMsg(Marshal.PtrToStructure(IntPtr(LParam), TypeOf(TMsg))); + {$ENDIF} + if (Msg.message = WM_SYSCHAR) and (Msg.hwnd <> 0) then begin + { Note: On Windows NT/2000/XP, even though we install the hook using + SetWindowsHookExW, Msg.wParam may either be an ANSI character or a + Unicode character, due to an apparent bug on these platforms. It is + an ANSI character when the message passes through a separate + SetWindowsHookExA-installed WH_GETMESSAGE hook first, and that hook + calls us via CallNextHookEx. Windows apparently "forgets" to convert + the character from ANSI back to Unicode in this case. + We can't convert the character code because there seems to be no way + to detect whether it is ANSI or Unicode. So we can't really do much + with Msg.wParam, apart from comparing it against character codes that + are the same between ANSI and Unicode, such as '-'. } + MainForm := Application.MainForm; + if Assigned(MainForm) and MainForm.HandleAllocated and (GetCapture = 0) and + ((Msg.hwnd = MainForm.ClientHandle) or + ((Msg.wParam = Ord('-')) and (MainForm.ClientHandle <> 0) and + IsChild(MainForm.ClientHandle, Msg.hwnd))) then begin + { Redirect the message to the main form. + Note: Unfortunately, due to a bug in Windows NT 4.0 (and not + 2000/XP/9x/Me), modifications to the message don't take effect if + another WH_GETMESSAGE hook has been installed above this one. + (The bug is that CallNextHookEx copies lParam^ to a local buffer, but + does not propogate the changes made by the hook back to lParam^ when + it returns.) I don't know of any clean workaround, other than to + ensure other WH_GETMESSAGE hooks are installed *before* + Toolbar2000's. } + Msg.hwnd := MainForm.Handle; + {$IFDEF CLR} + Marshal.StructureToPtr(TObject(Msg), IntPtr(LParam), False); + {$ENDIF} + end; + end; + end; +end; + +constructor TTBChevronItem.Create(AOwner: TComponent); +begin + inherited; + FToolbar := AOwner as TTBCustomToolbar; + ItemStyle := ItemStyle + [tbisSubMenu, tbisNoAutoOpen]; + Hint := GetDefaultHint; + Caption := EscapeAmpersands(GetShortHint(Hint)); +end; + +function TTBChevronItem.GetChevronParentView: TTBView; +begin + Result := FToolbar.FView; +end; + +function TTBChevronItem.GetDefaultHint: String; +begin + Result := STBChevronItemMoreButtonsHint; +end; + +function TTBChevronItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + Result := TTBChevronItemViewer; +end; + +procedure TTBChevronItemViewer.Paint(const Canvas: TCanvas; + const ClientAreaRect: TRect; IsSelected, IsPushed, UseDisabledShadow: Boolean); +const + HorzPattern: array[0..15] of Byte = + ($CC, 0, $66, 0, $33, 0, $66, 0, $CC, 0, 0, 0, 0, 0, 0, 0); + VertPattern: array[0..15] of Byte = + ($88, 0, $D8, 0, $70, 0, $20, 0, $88, 0, $D8, 0, $70, 0, $20, 0); +var + DC: HDC; + R2: TRect; + TempBmp: TBitmap; + + procedure DrawPattern(const Color, Offset: Integer); + begin + SelectObject(DC, GetSysColorBrush(Color)); + BitBlt(DC, R2.Left, R2.Top + Offset, R2.Right - R2.Left, + R2.Bottom - R2.Top, TempBmp.Canvas.Handle, 0, 0, $00E20746 {ROP_DSPDxax}); + end; + +begin + DC := Canvas.Handle; + R2 := ClientAreaRect; + if Item.Enabled then begin + if IsPushed then + DrawEdge(DC, R2, BDR_SUNKENOUTER, BF_RECT) + else if IsSelected and not(csDesigning in Item.ComponentState) then + DrawEdge(DC, R2, BDR_RAISEDINNER, BF_RECT); + end; + + if View.Orientation <> tbvoVertical then begin + R2.Top := 4; + R2.Bottom := R2.Top + 5; + Inc(R2.Left, 2); + R2.Right := R2.Left + 8; + end + else begin + R2.Left := R2.Right - 9; + R2.Right := R2.Left + 5; + Inc(R2.Top, 2); + R2.Bottom := R2.Top + 8; + end; + if IsPushed then + OffsetRect(R2, 1, 1); + TempBmp := TBitmap.Create; + try + if View.Orientation = tbvoVertical then + TempBmp.Handle := CreateMonoBitmap(8, 8, VertPattern) + else + TempBmp.Handle := CreateMonoBitmap(8, 8, HorzPattern); + SetTextColor(DC, clBlack); + SetBkColor(DC, clWhite); + if Item.Enabled then + DrawPattern(COLOR_BTNTEXT, 0) + else begin + DrawPattern(COLOR_BTNHIGHLIGHT, 1); + DrawPattern(COLOR_BTNSHADOW, 0); + end; + finally + TempBmp.Free; + end; +end; + + +{ TTBToolbarView } + +constructor TTBToolbarView.Create(AOwner: TComponent; AParentView: TTBView; + AParentItem: TTBCustomItem; AWindow: TWinControl; + AIsToolbar, ACustomizing, AUsePriorityList: Boolean); +begin + FToolbar := AOwner as TTBCustomToolbar; + inherited; +end; + +procedure TTBToolbarView.AutoSize(AWidth, AHeight: Integer); +begin + FToolbar.FBaseSize := BaseSize; + if FToolbar.IsAutoResized then + FToolbar.ChangeSize(AWidth, AHeight); +end; + +procedure TTBToolbarView.DoUpdatePositions(var ASize: TPoint); +begin + { Reset CurrentSize because it probably won't be valid after positions + are recalculated [2001-06-24] } + FToolbar.CurrentSize := 0; + FToolbar.GetMinBarSize(ASize); + { On FullSize toolbars, increase ASize.X/Y to WrapOffset so that + right-aligned items always appear at the right edge even when the toolbar + isn't wrapping } + if FToolbar.FullSize then begin + if (Orientation = tbvoHorizontal) and (ASize.X < WrapOffset) then + ASize.X := WrapOffset + else if (Orientation = tbvoVertical) and (ASize.Y < WrapOffset) then + ASize.Y := WrapOffset; + end; + { Increment FDisableAlignArrange so that we don't recursively arrange when + CalculatePositions moves controls } + Inc(FToolbar.FDisableAlignArrange); + try + inherited; + finally + Dec(FToolbar.FDisableAlignArrange); + end; +end; + +procedure TTBToolbarView.InvalidatePositions; +begin + { Reset CurrentSize because it probably won't be valid after positions + are recalculated [2001-06-04] } + FToolbar.CurrentSize := 0; + inherited; +end; + +function TTBToolbarView.GetFont: TFont; +begin + if not FToolbar.SystemFont then + Result := FToolbar.Font + else + Result := inherited GetFont; +end; + +function TTBToolbarView.GetChevronItem: TTBCustomItem; +begin + Result := FToolbar.FChevronItem; +end; + +function TTBToolbarView.GetMDIButtonsItem: TTBCustomItem; +begin + Result := FToolbar.FMDIButtonsItem; +end; + +function TTBToolbarView.GetMDISystemMenuItem: TTBCustomItem; +begin + Result := FToolbar.FMDISystemMenuItem; +end; + + +{ TTBCustomToolbar } + +type + {}TTBCustomItemAccess = class(TTBCustomItem); + TTBItemViewerAccess = class(TTBItemViewer); + +constructor TTBCustomToolbar.Create(AOwner: TComponent); +begin + inherited; + ControlStyle := ControlStyle + [csAcceptsControls, csActionClient] - + [csCaptureMouse]; + DockableWindowStyles := DockableWindowStyles - [tbdsResizeEightCorner, + tbdsResizeClipCursor]; + FItem := GetItemClass.Create(Self); + FItem.ParentComponent := Self; + FChevronItem := GetChevronItemClass.Create(Self); + FChevronItem.LinkSubitems := FItem; + FChevronMoveItems := True; + FView := GetViewClass.Create(Self, nil, FItem, Self, True, False, + not(csDesigning in ComponentState)); + FView.BackgroundColor := clBtnFace; + FUpdateActions := True; + FShrinkMode := tbsmChevron; + FSystemFont := True; + Color := clBtnFace; + SetBounds(Left, Top, 23, 22);{} +end; + +destructor TTBCustomToolbar.Destroy; +begin + { Call Destroying to ensure csDestroying is in ComponentState now. Only + needed for Delphi 4 and earlier since Delphi 5 calls Destroying in + TComponent.BeforeDestruction } + Destroying; + UninstallHookProc(Self, HookProc); + UninstallMainWindowHook; + FreeAndNil(FView); + FreeAndNil(FChevronItem); + FreeAndNil(FItem); + inherited; +end; + +function TTBCustomToolbar.GetItems: TTBCustomItem; +begin + Result := FItem; +end; + +function TTBCustomToolbar.GetItemClass: TTBRootItemClass; +begin + Result := TTBRootItem; +end; + +function TTBCustomToolbar.GetViewClass: TTBToolbarViewClass; +begin + Result := TTBToolbarView; +end; + +function TTBCustomToolbar.GetChevronItemClass: TTBChevronItemClass; +begin + Result := TTBChevronItem; +end; + +procedure TTBCustomToolbar.CreateWrappersForAllControls; +{ Create wrappers for any controls that don't already have them } +var + L: TList; + I, J, C: Integer; +begin + if ControlCount = 0 then + Exit; + L := TList.Create; + try + L.Capacity := ControlCount; + for I := 0 to ControlCount-1 do + L.Add(Controls[I]); + C := FItem.Count-1; + for I := 0 to C do + if FItem[I] is TTBControlItem then begin + J := L.IndexOf(TTBControlItem(FItem[I]).Control); + if J <> -1 then + L[J] := nil; + end; + for I := 0 to L.Count-1 do + if Assigned(L[I]) then + CreateWrapper(FItem.Count, TControl(L[I])); + finally + L.Free; + end; +end; + +procedure TTBCustomToolbar.Loaded; +begin + CreateWrappersForAllControls; + inherited; +end; + +procedure TTBCustomToolbar.GetChildren(Proc: TGetChildProc; Root: TComponent); +begin + TTBCustomItemAccess(TTBCustomItem(FItem)).GetChildren(Proc, Root); + inherited; +end; + +procedure TTBCustomToolbar.SetChildOrder(Child: TComponent; Order: Integer); +begin + if Child is TTBCustomItem then + TTBCustomItemAccess(TTBCustomItem(FItem)).SetChildOrder(Child, Order); +end; + +procedure TTBCustomToolbar.AlignControls(AControl: TControl; var Rect: TRect); +{ VCL calls this whenever any child controls in the toolbar are moved, sized, + inserted, etc., and also when the toolbar is resized. } +begin + if FDisableAlignArrange = 0 then + Arrange; +end; + +procedure TTBCustomToolbar.InitiateAction; +begin + inherited; + {}{ also add this to popupmenu(?) } + { Update visible top-level items } + if FUpdateActions then + FView.InitiateActions; +end; + +procedure TTBCustomToolbar.CMColorChanged(var Message: TMessage); +begin + { Synchronize FView.BackgroundColor with the new color } + if Assigned(FView) then + FView.BackgroundColor := Color; + inherited; +end; + +function TTBCustomToolbar.CreateWrapper(Index: Integer; + Ctl: TControl): TTBControlItem; +var + I: Integer; + S: String; +begin + Result := TTBControlItem.Create(Owner); + Result.Control := Ctl; + if (csDesigning in ComponentState) and Assigned(Owner) then begin + { Needs a name for compatibility with form inheritance } + I := 1; + while True do begin + S := Format('TBControlItem%d', [I]); + if Owner.FindComponent(S) = nil then + Break; + Inc(I); + end; + Result.Name := S; + end; + FItem.Insert(Index, Result); +end; + +function TTBCustomToolbar.FindWrapper(Ctl: TControl): TTBControlItem; +var + I: Integer; + Item: TTBCustomItem; +begin + Result := nil; + for I := 0 to FItem.Count-1 do begin + Item := FItem[I]; + if (Item is TTBControlItem) and + (TTBControlItem(Item).Control = Ctl) then begin + Result := TTBControlItem(Item); + Break; + end; + end; +end; + +{$IFNDEF CLR} +procedure TTBCustomToolbar.CMControlChange(var Message: TCMControlChange); +{$ELSE} +procedure TTBCustomToolbar.ControlChange(Inserting: Boolean; Child: TControl); +{$ENDIF} +{ A CM_CONTROLCHANGE handler must be used instead of a CM_CONTROLLISTCHANGE + handler because when a CM_CONTROLLISTCHANGE message is sent it is relayed to + *all* parents. CM_CONTROLCHANGE messages are only sent to the immediate + parent. } + + procedure HandleControlChange(Inserting: Boolean; Child: TControl); + begin + { Don't automatically create TTBControlItem wrappers if the component + is loading or being updated to reflect changes in an ancestor form, + because wrappers will be streamed in } + if Inserting and not(csLoading in ComponentState) and + not(csUpdating in ComponentState) and + (FindWrapper(Child) = nil) then + CreateWrapper(FItem.Count, Child); + end; + +begin + inherited; + {$IFNDEF CLR} + HandleControlChange(Message.Inserting, Message.Control); + {$ELSE} + HandleControlChange(Inserting, Child); + {$ENDIF} +end; + +{$IFNDEF CLR} +procedure TTBCustomToolbar.CMControlListChange(var Message: TCMControlListChange); +{$ELSE} +procedure TTBCustomToolbar.ControlListChange(Inserting: Boolean; Child: TControl); +{$ENDIF} +{ Don't handle deletions inside CM_CONTROLCHANGE because CM_CONTROLCHANGE is + sent *before* a control begins removing itself from its parent. (It used + to handle both insertions and deletions inside CM_CONTROLCHANGE but this + caused AV's.) } + + procedure HandleControlListChange(Inserting: Boolean; Child: TControl); + var + Item: TTBControlItem; + begin + if not Inserting and Assigned(FItem) then begin + while True do begin + Item := FindWrapper(Child); + if Item = nil then Break; + { The control is being removed the control, not necessarily destroyed, + so set DontFreeControl to True } + Item.DontFreeControl := True; + Item.Free; + end; + end; + end; + +begin + inherited; + {$IFNDEF CLR} + HandleControlListChange(Message.Inserting, Message.Control); + {$ELSE} + HandleControlListChange(Inserting, Child); + {$ENDIF} +end; + +procedure TTBCustomToolbar.CMHintShow(var Message: TCMHintShow); +{ Since the items on a toolbar aren't "real" controls, it needs a CM_HINTSHOW + handler for their hints to be displayed. } +begin + FView.HandleHintShowMessage(Message); +end; + +procedure TTBCustomToolbar.CMShowHintChanged(var Message: TMessage); +begin + inherited; + if ShowHint then + FView.Style := FView.Style + [vsAlwaysShowHints] + else + FView.Style := FView.Style - [vsAlwaysShowHints]; +end; + +procedure TTBCustomToolbar.WMGetObject(var Message: TMessage); +begin + if not FView.HandleWMGetObject(Message) then + inherited; +end; + +procedure TTBCustomToolbar.WMSetCursor(var Message: TWMSetCursor); +var + P: TPoint; + Viewer: TTBItemViewer; + Cursor: HCURSOR; +begin + if not(csDesigning in ComponentState) and + (Message.CursorWnd = WindowHandle) and + (Smallint(Message.HitTest) = HTCLIENT) then begin + { Note: This should not change the selection, because we can receive this + message during a modal loop if a user sets "Screen.Cursor := crDefault" + inside a submenu's OnClick handler (which really isn't recommended, as + it won't necessarily restore the cursor we set originally). } + GetCursorPos(P); + P := ScreenToClient(P); + Viewer := FView.ViewerFromPoint(P); + if Assigned(Viewer) then begin + Cursor := 0; + Dec(P.X, Viewer.BoundsRect.Left); + Dec(P.Y, Viewer.BoundsRect.Top); + TTBItemViewerAccess(Viewer).GetCursor(P, Cursor); + if Cursor <> 0 then begin + SetCursor(Cursor); + Message.Result := 1; + Exit; + end; + end; + end; + inherited; +end; + +procedure TTBCustomToolbar.WMSysCommand(var Message: TWMSysCommand); +var + ConvertedKey: Char; +begin + if FMenuBar and CanFocus then + with Message do + if (CmdType and $FFF0 = SC_KEYMENU) and (Key <> VK_SPACE) and + (GetCapture = 0) then begin + {$IFNDEF CLR} + {$IFDEF JR_WIDESTR} + { Under Unicode Win32 VCL, no conversion required } + WideChar(ConvertedKey) := WideChar(Key); + {$ELSE} + if Win32Platform = VER_PLATFORM_WIN32_NT then begin + { On Windows NT 4/2000/XP, Key is a wide character, so we have to + convert it. Pressing Alt+N in a Russian input locale, for example, + results in a Key value of $0442. + This could perhaps be considered a bug in Windows NT since the + character codes in other messages such as WM_SYSCHAR aren't left + in Unicode form. + The conversion isn't done with the system code page, but rather + with the code page of the currently active input locale, like + Windows does when sending WM_(SYS)CHAR messages. } + if WideCharToMultiByte(GetInputLocaleCodePage, 0, @WideChar(Key), 1, + @AnsiChar(ConvertedKey), 1, nil, nil) <> 1 then + Exit; { shouldn't fail, but if it does, we can't continue } + end + else begin + { On Windows 95/98/Me, Key is not a wide character. } + AnsiChar(ConvertedKey) := AnsiChar(Key); + end; + {$ENDIF} + {$ELSE} + if Marshal.SystemDefaultCharSize = 2 then begin + { Strings are Unicode on .NET, so no need to downconvert to ANSI } + ConvertedKey := WideChar(Key); + end + else begin + { On Windows 98/Me, we have to convert ANSI->Unicode, using the + code page of the currently active input locale } + ConvertedKey := Encoding.GetEncoding(GetInputLocaleCodePage). + GetChars([Byte(Key)])[0]; + end; + {$ENDIF} + if not KeyboardOpen(ConvertedKey, False) then begin + if Key = Ord('-') then Exit; + MessageBeep(0); + end; + Result := 1; + end; +end; + +procedure TTBCustomToolbar.Paint; +var + R: TRect; +begin + { Draw dotted border in design mode on undocked toolbars } + if not Docked and (csDesigning in ComponentState) then + with Canvas do begin + R := ClientRect; + Pen.Style := psDot; + Pen.Color := clBtnShadow; + Brush.Style := bsClear; + Rectangle(R.Left, R.Top, R.Right, R.Bottom); + Pen.Style := psSolid; + end; + FView.DrawSubitems(Canvas); +end; + +procedure TTBCustomToolbar.CMDialogKey(var Message: TCMDialogKey); +begin + if not(csDesigning in ComponentState) and + (Message.CharCode = VK_MENU) and FMenuBar and CanFocus then + FView.SetAccelsVisibility(True); + inherited; +end; + +procedure TTBCustomToolbar.CMDialogChar(var Message: TCMDialogChar); +begin + { On toolbars that aren't menu bars, handle CM_DIALOGCHAR instead of + WM_SYSCOMMAND. + Note: We have to check for csDesigning because on Delphi 2005/2006 we get + CM_DIALOG* messages if Alt+[key] is pressed while a form with a toolbar is + open in the embedded designer, and a tab other than Design is currently + selected (e.g., Code). } + if not(csDesigning in ComponentState) and + not FMenuBar and CanFocus and (Message.CharCode <> 0) then + if KeyboardOpen(Chr(Message.CharCode), True) then begin + Message.Result := 1; + Exit; + end; + inherited; +end; + +procedure TTBCustomToolbar.CancelHover; +begin + if not MouseCapture then + FView.UpdateSelection(Point(Low(Integer), Low(Integer)), True); +end; + +procedure TTBCustomToolbar.CMMouseLeave(var Message: TMessage); +begin + CancelHover; + inherited; +end; + +{$IFDEF JR_D5} +procedure TTBCustomToolbar.DoContextPopup(MousePos: TPoint; + var Handled: Boolean); +begin + CancelHover; + inherited; +end; +{$ENDIF} + +{$IFNDEF JR_D5} +{ Delphi 4 and earlier don't have a DoContextPopup method; we instead have to + trap WM_RBUTTONUP to determine if a popup menu (might) be displayed } +procedure TTBCustomToolbar.WMRButtonUp(var Message: TWMRButtonUp); +begin + CancelHover; + inherited; +end; +{$ENDIF} + +procedure TTBCustomToolbar.MouseMove(Shift: TShiftState; X, Y: Integer); +var + P: TPoint; + Item: TTBCustomItem; +begin + if not(csDesigning in ComponentState) then begin + P := ClientToScreen(Point(X, Y)); + FView.UpdateSelection(P, True); + if Assigned(FView.Selected) then begin + Item := FView.Selected.Item; + if not(tboLongHintInMenuOnly in Item.EffectiveOptions) then + Hint := Item.Hint + else + Hint := ''; + end + else + Hint := ''; + end; + { Call TrackMouseEvent to be sure that we are notified when the mouse leaves + the window. We won't get a CM_MOUSELEAVE message if the mouse moves + directly from the toolbar to another application's window } + CallTrackMouseEvent(Handle, TME_LEAVE); + inherited; +end; + +procedure TTBCustomToolbar.WMCancelMode(var Message: TWMCancelMode); +begin + inherited; + { We can receive a WM_CANCELMODE message during a modal loop if a dialog + pops up. Respond by hiding menus to make it look like the modal loop + has returned, even though it really hasn't yet. + Note: Similar code in TTBModalHandler.WndProc. } + if vsModal in FView.State then + FView.CancelMode; +end; + +procedure TTBCustomToolbar.WMMouseLeave(var Message: TMessage); +begin + { A WM_MOUSELEAVE handler is necessary because the control won't get a + CM_MOUSELEAVE message if the user presses Alt+Space. Also, CM_MOUSELEAVE + messages are also not sent if the application is in a + Application.ProcessMessages loop. } + if not FIgnoreMouseLeave then + CancelHover; + inherited; +end; + +procedure TTBCustomToolbar.WMNCMouseMove(var Message: TWMNCMouseMove); +begin + Hint := ''; + CancelHover; + inherited; +end; + +function TTBCustomToolbar.KeyboardOpen(Key: Char; + RequirePrimaryAccel: Boolean): Boolean; +var + I: TTBItemViewer; + IsOnlyItemWithAccel: Boolean; +begin + Result := False; + { Sanity check: Bail out early if re-entered } + if vsModal in FView.State then + Exit; + I := nil; + FView.SetAccelsVisibility(True); + try + if Key = #0 then begin + I := FView.FirstSelectable; + if I = nil then Exit; + FView.Selected := I; + FView.EnterToolbarLoop([]); + end + else begin + I := FView.NextSelectableWithAccel(nil, Key, RequirePrimaryAccel, + IsOnlyItemWithAccel); + if (I = nil) or not I.Item.Enabled then + Exit; + if IsOnlyItemWithAccel then begin + FView.Selected := I; + FView.EnterToolbarLoop([tbetExecuteSelected]); + end + else if FMenuBar then begin + FView.Selected := I; + FView.EnterToolbarLoop([]); + end + else + Exit; + end; + Result := True; + finally + if Assigned(I) then + FView.SetAccelsVisibility(False); + end; +end; + +procedure TTBCustomToolbar.MouseDown(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); +var + OldParent: TWinControl; + P: TPoint; + Item: TTBCustomItem; +begin + OldParent := Parent; + inherited; + if Parent <> OldParent then + { if the inherited handler (TTBDockableWindow.MouseDown) changed the Parent + (due to the toolbar moving between docks), nothing else should be done } + Exit; + if not(csDesigning in ComponentState) and (Button = mbLeft) then begin + P := ClientToScreen(Point(X, Y)); + FView.UpdateSelection(P, True); + if Assigned(FView.Selected) then begin + Item := FView.Selected.Item; + if not(tbisClicksTransparent in TTBCustomItemAccess(Item).ItemStyle) then begin + FIgnoreMouseLeave := True; + try + FView.EnterToolbarLoop([tbetMouseDown]); + finally + FIgnoreMouseLeave := False; + end; + end; + end; + end; +end; + +procedure TTBCustomToolbar.CMFontChanged(var Message: TMessage); +begin + inherited; + if not FSystemFont then + Arrange; +end; + +function TTBCustomToolbar.GetChevronHint: String; +begin + Result := FChevronItem.Hint; +end; + +procedure TTBCustomToolbar.SetChevronHint(const Value: String); +begin + FChevronItem.Hint := Value; + FChevronItem.Caption := EscapeAmpersands(GetShortHint(Value)); +end; + +procedure TTBCustomToolbar.SetChevronMoveItems(Value: Boolean); +begin + if FChevronMoveItems <> Value then begin + FChevronMoveItems := Value; + FView.UsePriorityList := Value and not(csDesigning in ComponentState); + end; +end; + +procedure TTBCustomToolbar.SetChevronPriorityForNewItems(Value: TTBChevronPriorityForNewItems); +begin + FChevronPriorityForNewItems := Value; + FView.NewViewersGetHighestPriority := (Value = tbcpHighest); +end; + +function TTBCustomToolbar.IsChevronHintStored: Boolean; +begin + Result := (FChevronItem.Hint <> FChevronItem.GetDefaultHint); +end; + +function TTBCustomToolbar.GetImages: TCustomImageList; +begin + Result := FItem.SubMenuImages; +end; + +procedure TTBCustomToolbar.SetImages(Value: TCustomImageList); +begin + FItem.SubMenuImages := Value; +end; + +function TTBCustomToolbar.GetLinkSubitems: TTBCustomItem; +begin + Result := FItem.LinkSubitems; +end; + +procedure TTBCustomToolbar.SetLinkSubitems(Value: TTBCustomItem); +begin + FItem.LinkSubitems := Value; +end; + +procedure TTBCustomToolbar.SetMenuBar(Value: Boolean); +begin + if FMenuBar <> Value then begin + FMenuBar := Value; + if Value then begin + ControlStyle := ControlStyle + [csMenuEvents]; + FView.Style := FView.Style + [vsMenuBar, vsUseHiddenAccels]; + end + else begin + ControlStyle := ControlStyle - [csMenuEvents]; + FView.Style := FView.Style - [vsMenuBar, vsUseHiddenAccels]; + end; + if not(csLoading in ComponentState) then begin + FullSize := Value; + if Value then + ShrinkMode := tbsmWrap + else + ShrinkMode := tbsmChevron; + CloseButton := not Value; + ProcessShortCuts := Value; + end; + if Value and not(csDesigning in ComponentState) then + InstallHookProc(Self, HookProc, [hpGetMessage]) + else + UninstallHookProc(Self, HookProc); + SetMainWindowHook; + end; +end; + +function TTBCustomToolbar.GetOptions: TTBItemOptions; +begin + Result := FItem.Options; +end; + +procedure TTBCustomToolbar.SetOptions(Value: TTBItemOptions); +begin + FItem.Options := Value; +end; + +procedure TTBCustomToolbar.SetProcessShortCuts(Value: Boolean); +begin + if FProcessShortCuts <> Value then begin + FProcessShortCuts := Value; + SetMainWindowHook; + end; +end; + +procedure TTBCustomToolbar.SetSystemFont(Value: Boolean); +begin + if FSystemFont <> Value then begin + FSystemFont := Value; + Arrange; + end; +end; + +procedure TTBCustomToolbar.SetShrinkMode(Value: TTBShrinkMode); +begin + if FShrinkMode <> Value then begin + FShrinkMode := Value; + if Docked then + CurrentDock.ArrangeToolbars + else if not Floating then + Arrange; + end; +end; + +procedure TTBCustomToolbar.SetFloatingWidth(Value: Integer); +begin + if FFloatingWidth <> Value then begin + FFloatingWidth := Value; + if Floating then begin + UpdateViewProperties; + Arrange; + end; + end; +end; + +function TTBCustomToolbar.CalcWrapOffset(const ADock: TTBDock): Integer; +begin + if ADock = nil then + Result := FFloatingWidth + else begin + if FShrinkMode = tbsmWrap then begin + if not(ADock.Position in [dpLeft, dpRight]) then + Result := ADock.Width - ADock.NonClientWidth - NonClientWidth + else + Result := ADock.Height - ADock.NonClientHeight - NonClientHeight; + end + else + Result := 0; + end; +end; + +function TTBCustomToolbar.CalcChevronOffset(const ADock: TTBDock; + const AOrientation: TTBViewOrientation): Integer; +begin + if (FShrinkMode = tbsmChevron) and Docked and (ADock = CurrentDock) then begin + Result := CurrentSize; + { Subtract non-client size } + if AOrientation <> tbvoVertical then + Dec(Result, NonClientWidth) + else + Dec(Result, NonClientHeight); + if Result < 0 then + Result := 0; { in case CurrentSize wasn't properly initialized yet } + end + else + Result := 0; +end; + +procedure TTBCustomToolbar.UpdateViewProperties; +var + DT: TTBDockType; +begin + DT := TBGetDockTypeOf(CurrentDock, Floating); + FView.Orientation := DockTypeToOrientation[DT]; + FView.ChevronSize := tbChevronSize; + if Assigned(CurrentDock) or Floating then begin + FView.ChevronOffset := CalcChevronOffset(CurrentDock, FView.Orientation); + FView.WrapOffset := CalcWrapOffset(CurrentDock); + end + else begin + FView.ChevronOffset := 0; + FView.WrapOffset := 0; + { Only enable chevron/wrapping when the width of the toolbar is fixed } + if not AutoResize or ((akLeft in Anchors) and (akRight in Anchors)) then begin + if FShrinkMode = tbsmChevron then + FView.ChevronOffset := Width - NonClientWidth + else if FShrinkMode = tbsmWrap then + FView.WrapOffset := Width - NonClientWidth; + end; + end; +end; + +{}{DOCKING STUFF} + +procedure TTBCustomToolbar.ReadPositionData(const Data: TTBReadPositionData); +begin + inherited; + with Data do + FloatingWidth := ReadIntProc(Name, rvFloatRightX, 0, ExtraData); +end; + +procedure TTBCustomToolbar.WritePositionData(const Data: TTBWritePositionData); +begin + inherited; + with Data do + WriteIntProc(Name, rvFloatRightX, FFloatingWidth, ExtraData); +end; + +procedure TTBCustomToolbar.GetMinBarSize(var MinimumSize: TPoint); +var + WH: Integer; +begin + MinimumSize.X := 0; + MinimumSize.Y := 0; + if Docked then begin + WH := CurrentDock.GetMinRowSize(EffectiveDockRow, Self); + if not(CurrentDock.Position in [dpLeft, dpRight]) then + MinimumSize.Y := WH + else + MinimumSize.X := WH; + end; +end; + +procedure TTBCustomToolbar.GetBaseSize(var ASize: TPoint); +begin + FView.ValidatePositions; + ASize := FBaseSize; +end; + +function TTBCustomToolbar.DoArrange(CanMoveControls: Boolean; + PreviousDockType: TTBDockType; NewFloating: Boolean; NewDock: TTBDock): TPoint; +var + DT: TTBDockType; + O: TTBViewOrientation; + TempBaseSize: TPoint; +begin + //outputdebugstring (pchar(format('%s.DoArrange(%d)', [Name, Ord(CanMoveControls)]))); + if CanMoveControls then begin + UpdateViewProperties; + Result := FView.UpdatePositions; + end + else begin + DT := TBGetDockTypeOf(NewDock, NewFloating); + O := DockTypeToOrientation[DT]; + Result.X := 0; + Result.Y := 0; + FView.CalculatePositions(False, O, CalcWrapOffset(NewDock), + CalcChevronOffset(NewDock, O), tbChevronSize, TempBaseSize, Result, + FLastWrappedLines); + end; +end; + +procedure TTBCustomToolbar.ControlExistsAtPos(const P: TPoint; + var ControlExists: Boolean); +var + P2: TPoint; +begin + inherited; + if not ControlExists and not(csDesigning in ComponentState) then begin + P2 := ClientToScreen(P); + FView.UpdateSelection(P2, True); + if Assigned(FView.Selected) and + not(tbisClicksTransparent in TTBCustomItemAccess(FView.Selected.Item).ItemStyle) then + ControlExists := True; + end; +end; + +procedure TTBCustomToolbar.BuildPotentialSizesList(SizesList: TList); +var + Margins: TRect; + MinX, SaveWrapX: Integer; + X, PrevWrappedLines: Integer; + S: TPoint; + S2: TSmallPoint; +begin + View.GetMargins(tbvoFloating, Margins); + MinX := Margins.Left + Margins.Right; + SaveWrapX := FFloatingWidth; + try + { Add the widest size to the list } + FFloatingWidth := 0; + S := DoArrange(False, dtNotDocked, True, nil); + SizesList.Add(TListItemType(PointToSmallPoint(S))); + { Calculate and add rest of sizes to the list } + PrevWrappedLines := 1; + X := S.X-1; + while X >= MinX do begin + FFloatingWidth := X; + S := DoArrange(False, dtNotDocked, True, nil); + if S.X > X then { if it refuses to go any smaller } + Break + else + if X = S.X then begin + S2 := PointToSmallPoint(S); + if FLastWrappedLines <> PrevWrappedLines then + SizesList.Add(TListItemType(S2)) + else + SizesList[SizesList.Count-1] := TListItemType(S2); + PrevWrappedLines := FLastWrappedLines; + Dec(X); + end + else + X := S.X; + end; + finally + FFloatingWidth := SaveWrapX; + end; +end; + +function CompareSizesX(Item1, Item2: TListItemType): Integer; +begin + { Sorts in descending order } + Result := TSmallPoint(Item2).X - TSmallPoint(Item1).X; +end; + +function CompareSizesY(Item1, Item2: TListItemType): Integer; +begin + { Sorts in descending order } + Result := TSmallPoint(Item2).Y - TSmallPoint(Item1).Y; +end; + +procedure TTBCustomToolbar.ResizeBegin(ASizeHandle: TTBSizeHandle); +const + MaxDistance = 12; +var + I, NewSize: Integer; + S, N: TSmallPoint; + P: TPoint; +begin + inherited; + + FSizeData := TToolbarSizeData.Create; + + with TToolbarSizeData(FSizeData) do begin + SizeHandle := ASizeHandle; + OrigWidth := Parent.Width; + OrigHeight := Parent.Height; + NCXDiff := ClientToScreen(Point(0, 0)).X - Parent.Left; + CurRightX := FFloatingWidth; + DisableSensCheck := False; + OpSide := False; + + NewSizes := TList.Create; + BuildPotentialSizesList(NewSizes); + for I := 0 to NewSizes.Count-1 do begin + P := SmallPointToPoint(TSmallPoint(NewSizes[I])); + AddFloatingNCAreaToSize(P); + NewSizes[I] := TListItemType(PointToSmallPoint(P)); + end; + if ASizeHandle in [twshTop, twshBottom] then + NewSizes.Sort(CompareSizesY) + else + NewSizes.Sort(CompareSizesX); + + { Calculate distance in pixels to the nearest potential sizes smaller and + larger than the current size, up to a maximum of MaxDistance pixels. } + DistanceToSmallerSize := 0; + DistanceToLargerSize := 0; + for I := 0 to NewSizes.Count-1 do begin + S := TSmallPoint(NewSizes[I]); + if (S.X = OrigWidth) and (S.Y = OrigHeight) then begin + if I > 0 then begin + N := TSmallPoint(NewSizes[I-1]); + if ASizeHandle in [twshLeft, twshRight] then + NewSize := N.X - S.X + else + NewSize := N.Y - S.Y; + if NewSize > MaxDistance then + NewSize := MaxDistance; + DistanceToLargerSize := NewSize; + end; + if I < NewSizes.Count-1 then begin + N := TSmallPoint(NewSizes[I+1]); + if ASizeHandle in [twshLeft, twshRight] then + NewSize := S.X - N.X + else + NewSize := S.Y - N.Y; + if NewSize > MaxDistance then + NewSize := MaxDistance; + DistanceToSmallerSize := NewSize; + end; + Break; + end; + end; + end; +end; + +procedure TTBCustomToolbar.ResizeTrack(var Rect: TRect; const OrigRect: TRect); +var + Pos: TPoint; + NewOpSide: Boolean; + Reverse: Boolean; + I: Integer; + P: TSmallPoint; +begin + inherited; + + with TToolbarSizeData(FSizeData) do begin + Pos.X := Rect.Right - Rect.Left; + Pos.Y := Rect.Bottom - Rect.Top; + + { Like Office, don't change from the original size until the mouse is moved + a reasonable distance left/up or right/down. Without this, dragging the + mouse just one pixel in either direction would cause the toolbar to + change sizes. } + if SizeHandle in [twshLeft, twshRight] then + NewOpSide := Pos.X < OrigWidth + else + NewOpSide := Pos.Y < OrigHeight; + if (not DisableSensCheck) or (OpSide <> NewOpSide) then begin + DisableSensCheck := False; + OpSide := NewOpSide; + if SizeHandle in [twshLeft, twshRight] then begin + if (Pos.X > OrigWidth-DistanceToSmallerSize) and (Pos.X < OrigWidth+DistanceToLargerSize) then + Pos.X := OrigWidth; + end + else begin + if (Pos.Y > OrigHeight-DistanceToSmallerSize) and (Pos.Y < OrigHeight+DistanceToLargerSize) then + Pos.Y := OrigHeight; + end; + end; + + Rect := OrigRect; + + if SizeHandle in [twshLeft, twshRight] then + Reverse := Pos.X > OrigWidth + else + Reverse := Pos.Y > OrigHeight; + if not Reverse then + I := 0 + else + I := NewSizes.Count-1; + while True do begin + P := TSmallPoint(NewSizes[I]); + if SizeHandle in [twshLeft, twshRight] then begin + if (not Reverse and ((I = NewSizes.Count-1) or (Pos.X >= P.X))) or + (Reverse and ((I = 0) or (Pos.X <= P.X))) then begin + if I = 0 then + CurRightX := 0 + else + CurRightX := P.X - NCXDiff*2; + if SizeHandle = twshRight then + Rect.Right := Rect.Left + P.X + else + Rect.Left := Rect.Right - P.X; + Rect.Bottom := Rect.Top + P.Y; + DisableSensCheck := not EqualRect(Rect, OrigRect); + Break; + end; + end + else begin + if (not Reverse and ((I = NewSizes.Count-1) or (Pos.Y >= P.Y))) or + (Reverse and ((I = 0) or (Pos.Y <= P.Y))) then begin + if I = NewSizes.Count-1 then + CurRightX := 0 + else + CurRightX := P.X - NCXDiff*2; + if SizeHandle = twshBottom then + Rect.Bottom := Rect.Top + P.Y + else + Rect.Top := Rect.Bottom - P.Y; + Rect.Right := Rect.Left + P.X; + DisableSensCheck := not EqualRect(Rect, OrigRect); + Break; + end; + end; + if not Reverse then + Inc(I) + else + Dec(I); + end; + end; +end; + +procedure TTBCustomToolbar.ResizeTrackAccept; +begin + inherited; + FloatingWidth := TToolbarSizeData(FSizeData).CurRightX; +end; + +procedure TTBCustomToolbar.ResizeEnd; +begin + inherited; + if Assigned(FSizeData) then begin + with TToolbarSizeData(FSizeData) do + FreeAndNil(NewSizes); + FreeAndNil(FSizeData); + end; +end; + +function TTBCustomToolbar.GetShrinkMode: TTBShrinkMode; +begin + Result := FShrinkMode; +end; + +procedure TTBCustomToolbar.GetMinShrinkSize(var AMinimumSize: Integer); +var + I: TTBItemViewer; +begin + I := FView.HighestPriorityViewer; + if Assigned(I) then begin + if not(CurrentDock.Position in [dpLeft, dpRight]) then + AMinimumSize := I.BoundsRect.Right - I.BoundsRect.Left + else + AMinimumSize := I.BoundsRect.Bottom - I.BoundsRect.Top; + end; + if not(CurrentDock.Position in [dpLeft, dpRight]) then + Inc(AMinimumSize, NonClientWidth) + else + Inc(AMinimumSize, NonClientHeight); + Inc(AMinimumSize, tbChevronSize); +end; + +procedure TTBCustomToolbar.BeginUpdate; +begin + FView.BeginUpdate; +end; + +procedure TTBCustomToolbar.EndUpdate; +begin + FView.EndUpdate; +end; + +procedure TTBCustomToolbar.GetTabOrderList(List: TList); +var + CtlList: TList; + I, J: Integer; + CtlI, CtlJ: TWinControl; +begin + inherited; + { Remove off-edge items and their children from List } + CtlList := TList.Create; + try + FView.GetOffEdgeControlList(CtlList); + for I := 0 to CtlList.Count-1 do begin + CtlI := TWinControl(CtlList[I]); + J := 0; + while J < List.Count do begin + CtlJ := TWinControl(List[J]); + if (CtlJ = CtlI) or CtlI.ContainsControl(CtlJ) then + List.Delete(J) + else + Inc(J); + end; + end; + finally + CtlList.Free; + end; +end; + +procedure TTBCustomToolbar.CMWinIniChange(var Message: TWMWinIniChange); +begin + inherited; + if {$IFNDEF CLR}TMessage{$ENDIF}(Message).WParam = SPI_SETNONCLIENTMETRICS then begin + TBInitToolbarSystemFont; + Arrange; + end; +end; + +function TTBCustomToolbar.IsShortCut(var Message: TWMKey): Boolean; +begin + Result := False; + if Assigned(FOnShortCut) then + FOnShortCut(Message, Result); + Result := Result or FItem.IsShortCut(Message); +end; + +var + HookCount: Integer; + HookList: TList; + +class function TTBCustomToolbar.MainWindowHook(var Message: TMessage): Boolean; + + function GetActiveForm: TCustomForm; + var + Wnd: HWND; + Ctl: TWinControl; + begin + { Note: We don't use Screen.ActiveCustomForm because when an EXE calls a + DLL that shows a modal form, Screen.ActiveCustomForm doesn't change in + the EXE; it remains set to the last form that was active in the EXE. + Use FindControl(GetActiveWindow) instead to avoid this problem; it will + return nil when a form in another module is active. } + Result := nil; + Wnd := GetActiveWindow; + if Wnd <> 0 then begin + Ctl := FindControl(Wnd); + if Assigned(Ctl) and (Ctl is TCustomForm) then + Result := TCustomForm(Ctl); + end; + end; + + function HandleShortCutOnForm(const Form: TCustomForm): Boolean; + var + I: Integer; + Toolbar: TTBCustomToolbar; + {$IFDEF CLR} + KeyMsg: TWMKey; + {$ENDIF} + begin + Result := False; + if Form = nil then + Exit; + for I := 0 to HookList.Count-1 do begin + Toolbar := TTBCustomToolbar(HookList[I]); + if Toolbar.ProcessShortCuts and + (TBGetToolWindowParentForm(Toolbar) = Form) and + IsWindowEnabled(Form.Handle) then begin + {$IFNDEF CLR} + if Toolbar.IsShortCut(TWMKey(Message)) then begin + {$ELSE} + KeyMsg := TWMKey.Create(Message); + if Toolbar.IsShortCut(KeyMsg) then begin + {$ENDIF} + Message.Result := 1; + Result := True; + Exit; + end; + end; + end; + end; + + function TraverseControls(Container: TWinControl): Boolean; + var + I: Integer; + Control: TControl; + begin + Result := False; + if Container.Showing then + for I := 0 to Container.ControlCount - 1 do begin + Control := Container.Controls[I]; + if Control.Visible and Control.Enabled then begin + if (csMenuEvents in Control.ControlStyle) and + ((Control is TTBDock) or (Control is TTBCustomToolbar)) and + (Control.Perform(WM_SYSCOMMAND, TMessage(Message).WParam, + TMessage(Message).LParam) <> 0) or (Control is TWinControl) and + TraverseControls(TWinControl(Control)) then begin + Result := True; + Exit; + end; + end; + end; + end; + +var + ActiveForm: TCustomForm; + ActiveMDIChild: TForm; +begin + Result := False; + if (Message.Msg = CM_APPKEYDOWN) and Assigned(HookList) then begin + { Process shortcuts on toolbars. Search forms in this order: + 1. If the active form is an MDI parent form, the active MDI child form + if it has the focus. + 2. The active form. + 3. The main form. } + ActiveForm := GetActiveForm; + if Assigned(ActiveForm) and (ActiveForm is TForm) and + (TForm(ActiveForm).FormStyle = fsMDIForm) then begin + ActiveMDIChild := TForm(ActiveForm).ActiveMDIChild; + { Don't search the child form if a control on the MDI parent form is + currently focused (i.e. Screen.ActiveCustomForm <> ActiveMDIChild) } + if Assigned(ActiveMDIChild) and + (Screen.ActiveCustomForm = ActiveMDIChild) and + HandleShortCutOnForm(ActiveMDIChild) then begin + Result := True; + Exit; + end; + end; + if HandleShortCutOnForm(ActiveForm) then + Result := True + else begin + if (Application.MainForm <> ActiveForm) and + HandleShortCutOnForm(Application.MainForm) then + Result := True; + end; + end + else if Message.Msg = CM_APPSYSCOMMAND then begin + { Handle "Alt or Alt+[key] pressed on secondary form" case. If there's a + menu bar on the active form we want the keypress to go to it instead of + to the main form (the VCL's default handling). } + ActiveForm := GetActiveForm; + if Assigned(ActiveForm) and IsWindowEnabled(ActiveForm.Handle) and + IsWindowVisible(ActiveForm.Handle) and TraverseControls(ActiveForm) then begin + Message.Result := 1; + Result := True; + end; + end; +end; + +procedure TTBCustomToolbar.SetMainWindowHook; +begin + if (ProcessShortCuts or MenuBar) and not(csDesigning in ComponentState) then + InstallMainWindowHook + else + UninstallMainWindowHook; +end; + +procedure TTBCustomToolbar.InstallMainWindowHook; +begin + if FMainWindowHookInstalled then + Exit; + if HookCount = 0 then + Application.HookMainWindow(MainWindowHook); + Inc(HookCount); + AddToList(HookList, Self); + FMainWindowHookInstalled := True; +end; + +procedure TTBCustomToolbar.UninstallMainWindowHook; +begin + if not FMainWindowHookInstalled then + Exit; + FMainWindowHookInstalled := False; + RemoveFromList(HookList, Self); + Dec(HookCount); + if HookCount = 0 then + Application.UnhookMainWindow(MainWindowHook); +end; + +end. diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2Ver.inc b/official/2.2.2+2.4.2/TB2K/Source/TB2Ver.inc new file mode 100644 index 0000000..f96696b --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Source/TB2Ver.inc @@ -0,0 +1,64 @@ +{ $jrsoftware: tb2k/Source/TB2Ver.inc,v 1.11 2008/09/13 21:06:45 jr Exp $ } + +{ Determine Delphi/C++Builder version } +{$IFNDEF VER90} { if it's not Delphi 2.0 } + {$IFNDEF VER93} { and it's not C++Builder 1.0 } + {$DEFINE JR_D3} { then it must be at least Delphi 3 or C++Builder 3 } + {$IFNDEF VER100} { if it's not Delphi 3.0 } + {$IFNDEF VER120} { Delphi 4/5's command line compiler doesn't like the ObjExportAll directive, so don't include it on Delphi 4/5 } + {$IFNDEF VER130} + {$ObjExportAll On} { <- needed for compatibility with run-time packages in C++Builder 3+ } + {$ENDIF} + {$ENDIF} + {$IFNDEF VER110} { and it's not C++Builder 3.0 } + {$DEFINE JR_D4} { then it must be at least Delphi 4 or C++Builder 4 } + {$IFNDEF VER120} {$IFNDEF VER125} { if it's not Delphi 4 or C++Builder 4 } + {$DEFINE JR_D5} { then it must be at least Delphi 5 or C++Builder 5 } + {$IFNDEF VER130} { if it's not Delphi 5 or C++Builder 5 } + {$DEFINE JR_D6} { then it must be at least Delphi 6 or C++Builder 6 } + {$IFNDEF VER140} { if it's not Delphi 6 or C++Builder 6 } + {$DEFINE JR_D7} { then it must be at least Delphi 7 } + {$IFNDEF VER150} { if it's not Delphi 7 } + {$DEFINE JR_D8} { then it must be at least Delphi 8 } + {$IFNDEF VER160} { if it's not Delphi 8 } + {$DEFINE JR_D9} { then it must be at least Delphi 9 (2005) } + {$IFNDEF VER170} { if it's not Delphi 9 (2005) } + {$DEFINE JR_D10} { then it must be at least Delphi 10 (2006) } + { Delphi 11 (2007) is an odd case: it defines VER180 and VER185 on Win32, and VER190 on .NET } + {$IFDEF VER185} { if it's Win32 Delphi 11 (2007) exactly } + {$DEFINE JR_D11} { then it must be at least Delphi 11 (2007) } + {$ENDIF} + {$IFNDEF VER180} { if it's neither Delphi 10 (2006) nor Win32 Delphi 11 (2007) } + {$DEFINE JR_D11} { then it must be at least Delphi 11 (2007) } + {$IFNDEF VER190} { if it's not .NET Delphi 11 (2007) } + {$DEFINE JR_D12} { then it must be at least Delphi 12 (2009) } + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} +{$ENDIF} + +{$IFDEF JR_D6} + {$IF SizeOf(Char) > 1} + {$DEFINE JR_WIDESTR} { defined if String type = WideString } + {$IFEND} + {$IF not Defined(CLR) and (SizeOf(Pointer) <> 4)} + {$MESSAGE WARN 'This version of Toolbar2000 has not been tested on 64-bit Delphi for Win32'} + {$IFEND} +{$ENDIF} + +{$ALIGN ON} +{$BOOLEVAL OFF} +{$LONGSTRINGS ON} +{$TYPEDADDRESS OFF} +{$WRITEABLECONST ON} +{$IFDEF JR_D6} + {$WARN SYMBOL_PLATFORM OFF} +{$ENDIF} diff --git a/official/2.2.2+2.4.2/TB2K/Source/TB2Version.pas b/official/2.2.2+2.4.2/TB2K/Source/TB2Version.pas new file mode 100644 index 0000000..f9fb9c9 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/Source/TB2Version.pas @@ -0,0 +1,63 @@ +unit TB2Version; + +{ + Toolbar2000 + Copyright (C) 1998-2008 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2Version.pas,v 1.69 2008/09/13 21:39:24 jr Exp $ +} + +interface + +{$I TB2Ver.inc} + +const + Toolbar2000Version = '2.2.2'; + Toolbar2000VersionPropText = 'Toolbar2000 version ' + Toolbar2000Version + {$IFDEF CLR} + ' (.NET)' {$ENDIF}; + +type + TToolbar2000Version = type string; + +implementation + +const + Sig: {$IFNDEF CLR} PAnsiChar {$ELSE} AnsiString {$ENDIF} = + '- ' + Toolbar2000VersionPropText + + {$IFDEF VER90} '/D2'+ {$ENDIF} {$IFDEF VER93} '/CB1'+ {$ENDIF} + {$IFDEF VER100} '/D3'+ {$ENDIF} {$IFDEF VER110} '/CB3'+ {$ENDIF} + {$IFDEF VER120} '/D4'+ {$ENDIF} {$IFDEF VER125} '/CB4'+ {$ENDIF} + {$IFNDEF BCB} {$IFDEF VER130} '/D5'+ {$ENDIF} {$ELSE} {$IFDEF VER130} '/CB5'+ {$ENDIF} {$ENDIF} + {$IFNDEF BCB} {$IFDEF VER140} '/D6'+ {$ENDIF} {$ELSE} {$IFDEF VER140} '/CB6'+ {$ENDIF} {$ENDIF} + {$IFNDEF BCB} {$IFDEF VER150} '/D7'+ {$ENDIF} {$ELSE} {$IFDEF VER150} '/CB7'+ {$ENDIF} {$ENDIF} + {$IFNDEF BCB} {$IFDEF VER170} '/D9'+ {$ENDIF} {$ELSE} {$IFDEF VER170} '/CB9'+ {$ENDIF} {$ENDIF} + {$IFNDEF VER185} {$IFNDEF BCB} {$IFDEF VER180} '/D10'+ {$ENDIF} {$ELSE} {$IFDEF VER180} '/CB10'+ {$ENDIF} {$ENDIF} {$ENDIF} + {$IFNDEF BCB} {$IFDEF VER185} '/D11'+ {$ENDIF} {$ELSE} {$IFDEF VER185} '/CB11'+ {$ENDIF} {$ENDIF} + {$IFNDEF BCB} {$IFDEF VER190} '/D11'+ {$ENDIF} {$ELSE} {$IFDEF VER190} '/CB11'+ {$ENDIF} {$ENDIF} + {$IFNDEF BCB} {$IFDEF VER200} '/D12'+ {$ENDIF} {$ELSE} {$IFDEF VER200} '/CB12'+ {$ENDIF} {$ENDIF} + ', Copyright (C) 1998-2008 by Jordan Russell -'; + +{$IFNDEF CLR} +initialization + Sig := Sig; +{$ENDIF} +end. diff --git a/official/2.2.2+2.4.2/TB2K/TB2k-LICENSE.txt b/official/2.2.2+2.4.2/TB2K/TB2k-LICENSE.txt new file mode 100644 index 0000000..47984b4 --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/TB2k-LICENSE.txt @@ -0,0 +1,61 @@ +Toolbar2000 License v3.2 +======================== + +"Author" herein refers to Jordan Russell (the creator of the Toolbar2000 +components). +"Software" refers to all files bearing this notice, as well as any other +files and source code included with Toolbar2000 (typically extracted from a +.zip archive), and all content in them, regardless of whether any +modifications have been made. + +Except where otherwise noted, all of the documentation and Software included +in the Toolbar2000 package is copyrighted by Jordan Russell (the Author). + +Copyright (C) 1998-2008 Jordan Russell. All rights reserved. + +Use and distribution of the software is permitted provided that all of the +following terms are accepted: + +1. The Software is provided "as-is," without any express or implied + warranty. In no event shall the Author be held liable for any damages + arising from the use of the Software. + +2. All redistributions of the Software's files must be in their original, + unmodified form. Distributions of modified versions of the files is not + permitted without express written permission of the Author. + +3. All redistributions of the Software's files must retain all copyright + notices and web site addresses that are currently in place, and must + include this list of conditions without modification. + +4. None of the Software's files may be redistributed for profit or as part + of another software package without express written permission of the + Author. + +5. You are permitted to Compile the Software into any kind of applications. + ("Compile" here refers to the automatic process of translating the + Software's source code into executable machine code by a compiler such + as the one included with Borland's Delphi or C++Builder.) + However, compilation into commercial or shareware applications, or any + applications that you or your organization are profiting from, requires + registration (payment) of the software. Such payment is made to the Author + of the Software (Jordan Russell). + For information on registering, see the Toolbar2000 documentation or this + web page: + http://www.jrsoftware.org/tb2kreg.php + +6. Redistribution of any of the Software's files in object form (including + but not limited to .DCU and .OBJ formats) is strictly prohibited without + express written permission of the Author. + +7. Full backward compatibility in future versions of the Software is not + guaranteed. In no event shall the Author be held liable for any + inconvenience or damages arising from lack of backward compatibility. + +If you do not agree to all of the above terms, you are not permitted to +use the Software in any way, and all copies of it must be deleted from your +system(s). + +Jordan Russell +jr-2008 AT jrsoftware.org +http://www.jrsoftware.org/ diff --git a/official/2.2.2+2.4.2/TB2K/tb2k.chm b/official/2.2.2+2.4.2/TB2K/tb2k.chm new file mode 100644 index 0000000000000000000000000000000000000000..fb55b185d9a1741c0144dacf21b151aa3ab0cfef GIT binary patch literal 84104 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%0A$$7|FctQHjks3j%;U7RnpF7D?wB^V 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 + +

    Copyright © 1998-2008 Jordan Russell. All rights reserved.
    +For conditions of distribution and use, see LICENSE.txt. +

    + +

    2.2.2 (2008-09-25)

    +
      +
    • Added support for Delphi 2009, C++Builder 2009, and Delphi 2007 on .NET.
    • +
    • Fix: When the Caption of a toolbar item was changed to a new value with the same dimensions as the old value, it didn't enable double-buffering when redrawing the toolbar, resulting in some flicker.
    • +
    • Fix: A MenuBar=False toolbar would inappropriately continue to respond to accelerator keys after Visible or Enabled was changed to False on one of its parents.
    • +
    • Fix: When an Adobe Reader control inside a TWebBrowser was focused, menus would not respond to keystrokes.
    • +
    • Internal tweaks and trivial fixes.
    • +
    + +

    2.2.1 (2007-06-23)

    +
      +
    • Packages for Delphi 2007 (Win32) are now included. (Currently they are identical to the existing Delphi 2006 packages; only the filenames have changed.)
    • +
    • Menu sounds: On Windows Vista, it now passes the SND_SYSTEM flag when calling PlaySound so that the volume is controlled by the "Windows Sounds" mixer control. Also, on all NT platforms, for consistency with native menus it no longer passes the SND_NOSTOP flag.
    • +
    • TTBEditItem: Published the InheritOptions, MaskOptions, and Options properties.
    • +
    • Improved painting performance on toolbars with hundreds or thousands of visible items.
    • +
    • Fix: Added workaround for bug in Windows Vista's DrawCaption API that caused the title bar text on floating toolbars to be drawn at the wrong coordinates when the Aero Glass theme was selected.
    • +
    • Fix: In version 2.2.0 on Delphi 4 and 5 only, an access violation would occur when the focus left a TTBEditItem. This was due to a code generation bug in the Delphi compiler.
    • +
    • Fix: Eliminated small memory leak when toolbars were dragged between docks on different forms (which, by default, isn't allowed).
    • +
    • Fix: On Windows 95/98/Me, right-clicking a floating toolbar's title bar would not display the toolbar's context menu.
    • +
    • Fix: If Toolbar2000 was built with range checking enabled (by default, this compiler option is disabled), it was possible to receive a range check error when navigating nested submenus with the mouse.
    • +
    • Internal tweaks and trivial fixes.
    • +
    + +

    2.2.0 (2006-04-17)

    +
      +
    • Toolbar2000 now supports VCL.NET projects on Delphi 2006. The behavior of Toolbar2000 under .NET should be 100% consistent with Win32; no changes are required to existing forms and code.
      +Refer to the Support for .NET topic in the help file for more information.
    • +
    • Added new overloaded versions of the TBIniLoadPositions and TBIniSavePositions functions that take already-instantiated TCustomIniFile's.
    • +
    • On Windows 2000 and later, it now uses Tahoma as the font on vertical toolbars when the system menu font is set to Microsoft Sans Serif. It had previously used Arial, but its Unicode coverage was found to be lacking (which matters on .NET, where strings are Unicode).
    • +
    • Fix: Items on floating MenuBar=False toolbars could not be accessed with Alt+[key].
    • +
    • Numerous internal tweaks and trivial fixes.
    • +
    + +
    + +

    2.1.8 (2006-01-09)

    +
      +
    • Updated the Delphi 2006 package to support C++Builder 2006 as well, and added installation instructions for C++Builder 2006 to the documentation.
    • +
    • For correctness, changed the "usage" setting on the run-time packages from "Designtime and runtime" to "Runtime only".
    • +
    • Enabled compiler optimization on the C++Builder packages. It was inadvertently disabled before; packages created in C++Builder have Pascal optimization turned off by default, and I didn't notice this until now.
    • +
    • Fix: The TB2Common unit wouldn't compile on Delphi 4.
    • +
    + +

    2.1.7 (2005-12-17)

    +
      +
    • Packages for Delphi 2006 are now included.
    • +
    • Improved performance of the design-time item editor, and fixed the Delphi 2005 issue where the Object Inspector would go back to the Name property each time a new item was added.
    • +
    • When loading/saving positions, it now silently ignores toolbars with no name (Name='') instead of raising an exception.
    • +
    + +

    2.1.6 (2005-07-30)

    +
      +
    • The captions of floating toolbars are now grayed when their parent forms are inactive (e.g., when a modal dialog is up).
    • +
    • Replaced various global "var"s with "threadvar"s to improve thread safety when Toolbar2000 is used in a browser-embedded ActiveForm. (Note that this can never be 100% safe because the VCL itself has some thread safety issues.)
    • +
    • Fix: When running on an Athlon 64 CPU with the Cool'n'Quiet feature enabled, menus animated at approximately half the expected speed when the CPU utilization was low. (Previously, it used QueryPerformanceCounter to time the animation, but with Cool'n'Quiet enabled, the rate at which the performance counter increments actually varies depending on the current CPU clock frequency. Now it uses GetTickCount instead.)
    • +
    • Fix: In the Delphi 2005 IDE, toolbar editor forms could fall behind the IDE's main form.
    • +
    • Fix: When an EXE contained a Toolbar2000 menu bar, and a modal Delphi form hosted in a DLL was currently active, pressing Alt would open the menu bar in the EXE even though the form containing the menu bar was disabled/inactive.
    • +
    • Fix: Fixed MSAA bug reported in "Accessibility issue with Window-Eyes" thread on newsgroup 2005-06-21.
    • +
    • Internal tweaks and trivial fixes.
    • +
    + +

    2.1.5 (2004-12-13)

    +
      +
    • Packages for Delphi 2005 are now included.
    • +
    • Added new RadioItem property to TTBCustomItem and descendants. Like the property of the same name on TMenuItem, it causes the item to display a circle instead of a check mark when the item is checked and no other image has been specified.
    • +
    • Like standard menus, it now prevents other applications from stealing the focus while a menu is open. This should make it fully compatible with Tweak UI's X-Mouse option.
    • +
    • If the application displays a modal dialog of its own while a menu is open, the menu will now be hidden.
    • +
    • TTBCustomDockableWindow and descendants: Made Canvas a public property.
    • +
    • Fix "ImageIndex on toolbutton incorrectly overriden by action's imageindex" issue reported on newsgroup 2004-09-02 by Anthony Egerton.
      +(Note: The problem described in the thread isn't Toolbar2000 specific. Standard menus and controls will continue to exhibit the same problem.)
    • +
    • TMainMenu/TPopupMenu converter: Now additionally transfers the AutoCheck, GroupIndex, and RadioItem properties.
    • +
    • Internal tweaks.
    • +
    + +

    2.1.4 (2004-02-28)

    +
      +
    • Toolbar2000 may now alternatively, at your option, be used and/or distributed under the terms of the GNU General Public License. Please see the updated LICENSE.txt file for more information on the two licensing options.
      +Note that if you choose the GPL license option, your application as a whole must also be licensed under the GPL. Therefore, you cannot choose the GPL license option if your application is proprietary/closed-source.
    • +
    • Reworded point 5 of the Toolbar2000 License for clarity.
    • +
    • Added new ChevronPriorityForNewItems property to TTBToolbar.
    • +
    + +

    2.1.3 (2003-11-23)

    +
      +
    • Added new tboNoAutoHint value to the Options property. When set, the automatic hint generation feature (introduced in 2.1.1) will be disabled.
    • +
    • On Windows NT/2000/XP, use SetWindowsHookExW instead of SetWindowsHookEx to work around apparent OS bug reported on the newsgroup by George Kyrou 2003-09-23.
    • +
    • Tweak to HookProc in TB2Toolbar.pas to avoid ANSI/Unicode character set issue with hooks on Windows NT/2000/XP.
    • +
    • Fix: When a TTBEditItem was focused, it didn't inherit the font settings from the parent toolbar.
    • +
    + +

    2.1.2 (2003-08-10)

    +
      +
    • It's now possible to nest "group" items such as TTBGroupItem. Previously, placing one group item inside another did not work.
    • +
    • Tweaked the automatic hint generation introduced in the last version: It now will not generate hints for submenu items unless the submenu item has the DropdownCombo property set to True or the submenu item has no visible caption.
    • +
    • TTBControlItem is no longer explicitly registered. There is a slim chance that this change may affect you if your application initially used one of the very early Toolbar2000 betas. In those early betas, Toolbar2000 did not assign to the Name property of TTBControlItem components it created. If you have unnamed TTBControlItem components on your forms, you must now assign them names, otherwise you might receive a "class not found" error message when running your application.
    • +
    • Fix: TTBEditItem would lose the focus when Alt+[keypad digit] was pressed.
    • +
    • Internal tweaks.
    • +
    + +

    2.1.1-beta (2003-07-13)

    +
      +
    • Now automatically supplies short hints for items with no short hint assigned to the Hint property. The hint is derived from the item's caption, with accelerator keys and any trailing colon or ellipsis stripped.
    • +
    • Shortcut text is now displayed in the hints of items that don't have associated Actions.
    • +
    • Fix: In TTBMRUList, "&" characters in filenames weren't escaped when assigning item captions.
    • +
    • MSAA-related tweaks: +
        +
      • Escape any "&" characters when assigning text to chevron item's Caption property.
      • +
      • Work around bug in Delphi/C++Builder 4's ShortCutToText function.
      • +
      +
    • +
    • Internal tweaks.
    • +
    + +

    2.1.0-beta (2003-07-05)

    +
      +
    • Microsoft Active Accessibility support for Toolbar2000's menus and toolbars. This exclusive feature will make your application's user interface more accessible to users who rely on screen readers. For more details, see the MSAA Support topic in the help file.
    • +
    • When new items are inserted programmatically at run-time, they are now placed at the top of the "priority list" instead of at the bottom. This means that new items will now be the last to move onto the chevron menu when all items can't fit on the toolbar.
    • +
    • On popup menus, accelerator keys are now properly hidden if the last input came from the mouse.
    • +
    • On TTBMDIButtonsItem, the biMinimize setting of BorderIcons on MDI child forms is now respected.
    • +
    • As a performance optimization, the default image base of the Delphi design and run-time packages have been changed from $400000 to $3F800000 and $3FC00000 respectively.
      +(The C++Builder packages remain at $400000 due to a design flaw in the C++Builder linker: it strips the image's relocation table whenever the base address is changed from $400000. DLLs must have relocation tables in order to load properly in all cases.)
    • +
    • Fix: When a top-level DropdownCombo=True submenu item is selected using Alt+[accelerator key] the item is now clicked instead of opened.
    • +
    • Fix: When F1 was pressed on a menu item and Toolbar2000 handled it, a WM_HELP message would still reach the parent form.
    • +
    • Fix: A focused TTBEditItem would lose the focus when Alt+Shift was pressed.
    • +
    • Many internal changes, most of them necessary for supporting MSAA as cleanly as possible.
    • +
    + +
    + +

    2.0.16 (2003-03-28)

    +
      +
    • Added new tboSameWidth value to the Options property. When set along with tboImageAboveCaption on two or more items on the same view, the items will be stretched as necessary so that they all have the width in pixels.
    • +
    • Added ChevronMoveItems property to TTBToolbar. Normally, when an item on a toolbar's chevron popup menu is clicked, the clicked item will move into the visible area of the toolbar in place of the least recently clicked item. Setting this property to False will disable that behavior.
    • +
    • TTBCustomItem.Click now checks the Enabled property before calling any event handlers, like TMenuItem.Click does.
    • +
    • TTBPopupMenu.Popup now sets the PopupPoint property.
    • +
    • Published OnContextPopup event properties on TTBDock, TTBToolbar, and TTBToolWindow.
    • +
    • Fixed issues with Russian characters as accelerator keys on Windows NT/2000/XP.
    • +
    • Internal tweaks and trivial fixes.
    • +
    + +

    2.0.15 (2002-09-29)

    +
      +
    • Packages for Delphi 7 are now included.
    • +
    • Revised the Toolbar2000 License Agreement.
    • +
    • TTBMRUList: Added new Remove method.
      +TTBMRUListStrings: IndexOf method now uses AnsiCompareFileName instead of AnsiCompareText.
    • +
    • Fix: The issue reported in the "Problem with tb2k in Com Server/ActiveX" thread on the newsgroup has been fixed.
    • +
    • Internal tweaks and trivial fixes.
    • +
    + +

    2.0.14 (2002-05-10)

    +
      +
    • Added new tboNoRotation value to Options property. When set, the item and its caption will not be rotated 270 degrees when docked vertically.
    • +
    • Added Move Up and Move Down commands to the design-time editor to make it easier to move items.
    • +
    • Chevron popup windows now wrap if they are too wide to fit on the screen.
    • +
    • A toolbar's LastDock property is no longer updated when the toolbar is dragged over but not dropped on a dock.
    • +
    • When arranging toolbars on a dock, row numbers that contain only invisible or undocked toolbars are no longer removed. This way, when the toolbars are shown/docked again, they stay on their row. This was how Toolbar97 worked.
    • +
    • A toolbar's DockRow and DockPos properties got updated if you dragged the toolbar over a dock but didn't drop it on the dock. Now it restores the original DockRow and DockPos settings when a toolbar is not dropped on a dock.
    • +
    • Fix: When arranging toolbars on a dock, there was a case where LimitToOneRow wasn't being checked.
    • +
    • Internal tweaks.
    • +
    + +

    2.0.13 (2002-04-06)

    +
      +
    • New item class: TTBVisibilityToggleItem. This item class controls the Visible property of a control, such as a TTBToolbar.
    • +
    • On menus, it now uses clGrayText to draw disabled text when the menu background color doesn't equal clBtnFace. (That is how standard menus work.)
    • +
    • On vertically docked toolbars, it now uses a vertical font if one is available so that Asian characters aren't drawn sideways.
    • +
    • Now, if at design time you double click a TTBToolbar or TTBPopupMenu that has its LinkSubitems property assigned, it asks if you want to edit the item specified by LinkSubitems instead.
    • +
    • TTBEditItem: The outermost border is now transparent when the item is not selected.
    • +
    • In the functions that load toolbar positions, it now compares the dock names with case insensitivity.
    • +
    • Added new demo project file for C++Builder 6 - DemoBCB6 - because DemoBCB doesn't seem to compile under C++Builder 6.
    • +
    • Internal tweaks.
    • +
    + +

    2.0.12 (2002-03-06)

    +
      +
    • Menus now display scroll arrows when they are too tall to fit on the screen.
    • +
    • Packages for C++Builder 6 are now included.
    • +
    • Minor tweaks and documentation updates.
    • +
    + +

    2.0.11 (2002-02-23)

    +
      +
    • Fix: The new Stretch property introduced in 2.0.10 had some bugs.
    • +
    + +

    2.0.10 (2002-02-13)

    +
      +
    • Added new Stretch property to TTBToolWindow and TTBToolbar. When True, the toolbar, when docked, will stretch to fill any unused space on the row.
    • +
    • On TTBToolbar, chevrons now display a "More Buttons" hint, like Office 2000. The hint text can be customized by changing the new ChevronHint property, or globally by changing STBChevronItemMoreButtonsHint in TB2Consts.pas.
    • +
    • The OnMove event of TTBToolbar/TTBToolWindow now gets fired when the bar is floating also.
    • +
    • Fix: TTBPopupMenu.OnPopup was being called twice when the popup was displayed - once with the TTBPopupMenu as the Sender, and once with the internal TTBRootItem as the Sender. Now, it's called only once with the TTBPopupMenu as the Sender.
    • +
    • Fix: TTBEditItem: Fixed double-click issue ("TB2k Strange Behaviour").
    • +
    • Internal tweaks.
    • +
    + +

    2.0.9 (2002-01-11)

    +
      +
    • Added new TTBImageList component. It is an enhanced version of the standard TImageList component, designed for use with the Toolbar2000 components. It adds the ability to use special images for different item states (hot, disabled, checked). It also adds the ability to load the images from a bitmap instead of using TImageList's normal streaming mechanism, which has problems with older COMCTL32.DLL versions.
    • +
    • Added new OnSelect property to TTBCustomItem and descendants. This event lets you trap when the mouse enters or leaves an item.
    • +
    • Added new CharCase and OnBeginEdit properties to TTBEditItem.
    • +
    • Added C++Builder version of the Demo project - DemoBCB.
    • +
    • Minor tweaks and fixes.
    • +
    + +

    2.0.8 (2001-12-27)

    +
      +
    • Now supports "flat" menu borders on Windows XP.
    • +
    • The background of a selected menu item's image is now filled with clBtnFace. This seems to look better with Windows XP's white menus.
    • +
    • Made chevron popups colored clBtnFace instead of clMenu. This seems to look better on Windows XP with themes enabled.
    • +
    • Fix: Fixed "stack overflow" problem that may have occurred if you had a floating TTBToolWindow and pressed Alt on the keyboard.
    • +
    • Fix: On Delphi 6 the ActionComponent property of an action now gets set properly when the action is fired from a TB2k item.
    • +
    • Removed some Windows NT 3.51 support code since NT 3.51 is now officially unsupported.
    • +
    + +

    2.0.7 (2001-12-19)

    +
      +
    • Menus now display drop-shadows on Windows XP if they are enabled in the Display Properties.
    • +
    • When a menu is up, keystrokes will no longer get processed by an IME if one was active.
      +Note: The ImmGetVirtualKey function is used, which is not available on Windows NT 3.51. Therefore, NT 3.51 is now officially unsupported. (It never was officially supported anyway.)
    • +
    • TTBToolbar: Added new published FloatingWidth property.
    • +
    • Fix: Accessing menu bars on non-main forms with the keyboard should now work.
    • +
    • Minor fixes.
    • +
    + +

    2.0.6 (2001-11-14)

    +
      +
    • When a shortcut key is pressed, it now sends OnPopup/OnClick events to the selected item's parents so that they can update the Enabled state of the item if needed.
    • +
    • The OnPopup event of TTBPopupMenu is now fired when one of its items' shortcut keys is pressed.
    • +
    • TTBPopupMenu now processes shortcuts.
    • +
    • Added OnUpdate event to TTBMDIWindowItem.
    • +
    • Minor fixes.
    • +
    + +

    2.0.5 (2001-10-09)

    +
      +
    • Toolbars that are neither docked nor floating can now wrap or display a chevron (ShrinkMode is no longer ignored). For it to work, you must do at least one of the following: set AutoResize to False, set Align to one of [alTop, alBottom, alClient], or add [akLeft, akRight] to Anchors (which is now a published property).
    • +
    • TTBToolWindow: Published the Align and Anchors properties.
    • +
    • Now allows F1 to be handled while the mouse button is down (an odd quirk of standard menus).
    • +
    • Now always streams out the Width & Height properties of a toolbar that is neither docked nor floating. Needed to properly support anchored toolbars.
    • +
    • Fix: Fixed a GDI resource leak in TB2Item that occurred on Windows 9x/Me due to an undocumented difference/bug in the way SaveDC works.
    • +
    • Fix: Fixed resource leak with TTBMDIHandler: it was trying to free an icon handle with DeleteObject instead of DestroyIcon.
    • +
    • Fix: Made TTBPopupWindow a TCustomControl descendant instead of a TForm descendant. This resolves the issue with the Application window's taskbar button reappearing after the program initially hid it.
    • +
    • Fix: When destroying a toolbar on a dock that had another toolbar on the same dock linked to one of the destroying toolbar's subitems, an AV may have occurred.
    • +
    • Fix: Fixed problem in TTBView.GivePriority.
    • +
    + +

    2.0.4 (2001-09-30)

    +
      +
    • Added new tboImageAboveCaption value to Options property. When set, the item's caption will be displayed underneath its image, making for an Internet Explorer-like appearance.
    • +
    • Added Options property to TTBPopupMenu.
    • +
    • Fix: It was possible to "click" disabled top-level items by pressing Alt+[accelchar].
    • +
    • Fix: Shortcut keys now work on toolbars that are on frames.
    • +
    • Fixed issue with TActiveForms: OnClick events were always executed in the context of the first thread.
    • +
    • Minor tweaks.
    • +
    + +

    2.0.3 (2001-09-13)

    +
      +
    • Added AutoCheck property to TTBCustomItem and descendants.
    • +
    • Added Prefix property to TTBMRUList.
    • +
    • Added Enabled property to TTBMDIWindowItem.
    • +
    • Published GroupIndex property on TTBSubmenuItem and TTBEditItem.
    • +
    • TTBView's Selected property is now writable.
    • +
    • Fix: Sealed minor memory leak that occurred when when a TTBMDIHandler component was created, or when the LinkSubItems property of a toolbar was changed.
    • +
    • Fix: Modifying a TTBBackground's bitmap after a dock that used the background was destroyed may have caused an AV.
    • +
    • Fix: Alt+- didn't work unless the two keys were pressed simultaneously.
    • +
    • Fix: Shortcuts didn't work if TTBToolbar.LinkSubitems was set.
    • +
    • Fix: MDI buttons didn't show when FullSize=False and ShrinkMode=tbsmWrap.
    • +
    • Fix: Unwrapped floating toolbars were a pixel too high.
    • +
    • Fix: Hopefully fixed Delphi 6 AV with design-time editor again.
    • +
    + +

    2.0.2 (2001-08-19)

    +
      +
    • Added new component: TTBMDIHandler, which adds the MDI system menu and minimize/restore/close buttons to a menu bar. See the documentation for details.
    • +
    • Added new item type: TTBMDIWindowItem, which expands to a list of available MDI child windows at run-time. This is intended to be placed at the end of an MDI application's Window menu, following a separator.
    • +
    • The design-time menu converter can now convert TPopupMenu's too.
    • +
    • The Alignment property of TTBPopupMenu is now respected. Also added optional Alignment parameter to the TTBCustomItem.Popup method.
    • +
    • Added TTBCustomItem.Clear method.
    • +
    • Now respects the system's "menu drop alignment" setting when dropping down menus.
    • +
    • Pressing Home or End on a toolbar or menu now moves the selection to the first or last item.
    • +
    • Fix: TTBToolWindow's that had their FullSize properties set to True weren't the correct size when undocked.
    • +
    • Fix: Now doesn't attempt to draw or invalidate TTBControlItem's. Fixes issue with Transparent=True TLabel's.
    • +
    • Fix: Now doesn't display the size-all cursor on DragHandle=dhNone toolbars.
    • +
    • Fix: The keyboard shortcuts for Cut/Copy/Paste in the design-time editor now work again.
    • +
    • Some minor internal tweaks.
    • +
    + +

    2.0.1 (2001-08-04)

    +
      +
    • Added slide/fade animation support. It is enabled automatically if the user has menu animation enabled in Windows.
    • +
    • On vertical toolbars, the tboDropdownArrow arrows are now drawn rotated and below the text.
    • +
    • Fix: When you have ProcessShortCuts=True toolbars on multiple forms, it now first looks for shortcuts on the active form's toolbars, and then the main form's toolbars. Previously, it looked on all forms' toolbars.
    • +
    • Fix: It wasn't loading item icons correctly after design-time code was moved to the tb2kdsgn package.
    • +
    • Fix: Setting EditOptions on TTBEditAction had no effect.
    • +
    • Some minor internal tweaks.
    • +
    + +

    2.0.0 (2001-07-21)

    +
      +
    • Revised the Toolbar2000 License Agreement.
    • +
    • Moved design-time units to separate tb2kdsgn_* packages so that tb2k_* may now be used as run-time packages.
    • +
    • Tweaked the component icons.
    • +
    + +
    + +

    Beta Releases

    + +

    2.0-BETA6 (2001-07-18)

    +
      +
    • TTBMRUList: Added AddFullPath and HidePathExtension properties. Both are True by default. See documentation for details.
    • +
    • TTBMRUList: Added OnChange event.
    • +
    • Typing or pressing Enter on the design-time editor's tree view now activates the Object Inspector.
    • +
    • Fix: On Delphi 6, the ShortCut property of TTBCustomItem was showing up like an Integer property in Object Inspector, thanks to some change Borland made. Workaround added.
    • +
    • Fix: Removed call in design-time editor that appeared to cause AV's in certain cases.
    • +
    + +

    2.0-BETA5 (2001-07-09)

    +
      +
    • Now works around the Windows 2000 problem of delaying on the first PlaySound call by not calling PlaySound at all if there is no sound associated with the event.
    • +
    • Added LoadFromIni, LoadFromRegIni, SaveToIni, SaveToRegIni methods to TTBMRUList.
    • +
    • Updated documentation; added an index.
    • +
    • Updated demo project.
    • +
    • Fix: The change to the Click handling in 2.0-BETA4 broke exception handling.
    • +
    • Fix: The OnResize event was never fired.
    • +
    • A few very minor fixes and tweaks.
    • +
    + +

    2.0-BETA4 (2001-07-01)

    +
      +
    • Added UpdateActions property to TTBToolbar. Setting it to False can decrease CPU utilization. See the documentation for details.
    • +
    • Now, as with standard menus, when an item is clicked it posts a message to the queue so that the Click handler gets called when control returns to the message loop. This fixes the problem with modal forms not correctly getting the focus when an item is selected from a menu with the keyboard.
    • +
    • Fixed potential AV problem when Escape was pressed.
    • +
    • Improvements to design-time editor: +
        +
      • There's now an empty item at the end of the item list, similar to Delphi's menu editor. You can't (currently) type on this item item, but you can select it and press Insert to add a new item to the end.
      • +
      • You can now hold down Shift while pressing Insert or clicking one of the New buttons to add an item to the end instead of inserting it before the currently selected item.
      • +
      • Added keyboard shortcuts for New Subitem and New Separator.
      • +
      • Now selects root item when list view is focused and no item is selected.
      • +
      • After deleting the items, it now selects the item with the focus.
      • +
      +
    • +
    + +

    2.0-BETA3 (2001-06-25)

    +
      +
    • Context help (F1) is now supported on menu items.
    • +
    • Added a GroupIndex property to TTBCustomItem due to popular demand. See documentation for details on how it works.
    • +
    • Added a new ImageIndex property editor which is fully compatible with Delphi 6.
    • +
    • It now substitutes Arial for MS Sans Serif & Microsoft Sans Serif when drawing vertical text, instead of letting Windows pick a font.
    • +
    • Remarked out code in TTBDock.ArrangeToolbars that was there to work around a VCL alignment bug*, because it had some undesirable side effects. Now, if you want to avoid the bug, you need to right-click your alClient-aligned controls in the form designer and select "Send to Back." +
      * The VCL alignment bug: if a control is taller or wider than the client height or width of its parent, alClient-aligned controls may appear on top of the control, instead of being hidden from view.
    • +
    • Fix: When toolbars are dragged across a dock that has a background bitmap, they should no longer flicker.
    • +
    • Fix: The menu converter now transfers the Tag property.
    • +
    • Fix: The toolbar-dragging changes in 2.0-BETA2 broke the splitter.
    • +
    • Fix: Work around an annoying Windows or VCL bug. (If you close all MDI child windows, the MDI client window gets the focus, and when it has the focus, pressing Alt+[char] doesn't send a WM_SYSCOMMAND message to the form for some reason.)
    • +
    • Fix: In the design-time item editor, when a new item is created while the tree view has the focus, it now sets the focus to the list view so that the item becomes selected in Object Inspector.
    • +
    • Fix: On TTBDock, LimitToOneRow=True didn't actually limit to one row while dragging.
    • +
    • Various other minor tweaks and fixes.
    • +
    + +

    2.0-BETA2 (2001-06-18)

    +
      +
    • Delphi 6 is now supported. There is one limitation however: the ImageIndex property editor used by TTBCustomItem descendants had to be disabled because TComponentImageIndexPropertyEditor is gone in Delphi 6! Therefore, on Delphi 6, the dropdown lists of ImageIndex properties may not work correctly, at least for now.
    • +
    • Text on vertical toolbars is now drawn vertically!
    • +
    • Vastly improved the code that handles toolbar dragging. Previously, when you dragged a SmoothDrag=True docked toolbar over other docked toolbars, the toolbar may not have ended up on the row you were expecting. This was because the old code - ported from Toolbar97 - was not designed with smooth dragging in mind. Now it should function almost exactly like Office 2000.
    • +
    • TTBEditItem (and friends): Removed DisplayAsButton property; replaced with EditOptions property. Now, by default, edits on toolbars will automatically change into buttons when the toolbar is docked vertically. Add tboUseEditWhenVertical to EditOptions to disable this.
    • +
    • On wrapped toolbars, menus now pop out to the side which obscures the least amount of items, like Office 2000.
    • +
    • Up/Down/Left/Right arrow keys on vertical toolbars now work like Office 2000.
    • +
    • Fix: Hints on chevron popup's items didn't include shortcuts.
    • +
    • Fix: Deleting an item from a TTBMRUList via Items.Delete() did not refresh the keyboard shortcuts.
    • +
    • Fix: Fixed "Run-time creation of items and chevron" problem reported by Francois Rivierre.
    • +
    • Some very minor tweaks.
    • +
    + +

    2.0-BETA1 (2001-06-12)

    +
      +
    • Updated the Toolbar2000 License Agreement.
    • +
    • You can now display the version of Toolbar2000 by right-clicking a toolbar and selecting "Version".
    • +
    • Added an improved Demo project.
    • +
    • Made the margins of menu items a bit more like Office and standard menus.
    • +
    • Now includes size of a font's external leading when calculating an menu item's height.
    • +
    • Added workaround an apparent NT 4.0 & 2000 bug that was causing the right side of floating toolbars' non-client area to be painted incorrectly if the toolbar's width was greater than the screen width.
    • +
    • Various tweaks to the display of disabled toolbar & menu items.
    • +
    + + +

    +em_-SLEkV-y*QUVB8%%CBFn%J#_~LP@aqIF+Cb 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 W0000000000000000002s2LONyYi1k( literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4.2/TB2K/whatsnew.htm b/official/2.2.2+2.4.2/TB2K/whatsnew.htm new file mode 100644 index 0000000..1a15e9d --- /dev/null +++ b/official/2.2.2+2.4.2/TB2K/whatsnew.htm @@ -0,0 +1,419 @@ + + + +Toolbar2000 Revision History + + + + + + + +

    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Ξ%T_D#zu$1@aYEYHgr$L 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