From 8fb0b1380dacbd6e15dcd85f609b09994ee1c2df Mon Sep 17 00:00:00 2001 From: david Date: Fri, 27 Feb 2009 16:46:45 +0000 Subject: [PATCH] =?UTF-8?q?Importaci=C3=B3n=20inicial?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.TB2k-SpTBXLib@2 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 | 14 + .../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/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 | 26 + .../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 | 1977 ++++ .../SpTBXLib/Demos/Overview/Unit1.pas | 431 + .../SpTBXLib/Demos/Overview/hint.bmp | Bin 0 -> 21654 bytes official/2.2.2+2.4/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 -> 39958 bytes .../2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXItem.dcu | Bin 0 -> 333802 bytes .../SpTBXLib/Lib/D12/SpTBXLibDsgn_d12.bpl | Bin 0 -> 156160 bytes .../SpTBXLib/Lib/D12/SpTBXLibDsgn_d12.dcp | Bin 0 -> 11590 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 -> 1098186 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/SpTBXLib/Lib/D12/SpTBXReg.dcu | Bin 0 -> 11444 bytes .../2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXSkins.dcu | Bin 0 -> 106136 bytes .../2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXTabs.dcu | Bin 0 -> 118287 bytes official/2.2.2+2.4/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.dpk | 40 + .../SpTBXLib/Packages/SpTBXLibDsgn_d12.dproj | 120 + .../SpTBXLib/Packages/SpTBXLibDsgn_d12.res | Bin 0 -> 5056 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.dpk | 50 + .../SpTBXLib/Packages/SpTBXLib_d12.dproj | 130 + .../SpTBXLib/Packages/SpTBXLib_d12.res | Bin 0 -> 5056 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 .../__history/SpTBXLibDsgn_d12.dpk.~1~ | 40 + .../__history/SpTBXLibDsgn_d12.dpk.~2~ | 40 + .../Packages/__history/SpTBXLib_d12.dpk.~1~ | 50 + .../Packages/__history/SpTBXLib_d12.dpk.~2~ | 50 + official/2.2.2+2.4/SpTBXLib/Readme.txt | 63 + official/2.2.2+2.4/SpTBXLib/Registration.txt | 27 + .../SpTBXLib/Source/SpTBXColorPickerForm.dfm | 2882 +++++ .../SpTBXLib/Source/SpTBXColorPickerForm.pas | 446 + .../SpTBXLib/Source/SpTBXControls.pas | 4170 +++++++ .../SpTBXLib/Source/SpTBXCustomizer.pas | 1733 +++ .../SpTBXLib/Source/SpTBXCustomizerForm.dfm | 299 + .../SpTBXLib/Source/SpTBXCustomizerForm.pas | 520 + .../SpTBXLib/Source/SpTBXDefaultSkins.pas | 2101 ++++ .../SpTBXLib/Source/SpTBXDkPanels.pas | 3431 ++++++ .../SpTBXLib/Source/SpTBXEditors.pas | 3538 ++++++ .../SpTBXLib/Source/SpTBXExtEditors.pas | 1051 ++ .../SpTBXLib/Source/SpTBXFormPopupMenu.pas | 1128 ++ .../2.2.2+2.4/SpTBXLib/Source/SpTBXGlyphs.res | Bin 0 -> 3788 bytes .../2.2.2+2.4/SpTBXLib/Source/SpTBXItem.pas | 9731 +++++++++++++++++ .../2.2.2+2.4/SpTBXLib/Source/SpTBXMDIMRU.pas | 691 ++ .../2.2.2+2.4/SpTBXLib/Source/SpTBXReg.dcr | Bin 0 -> 119936 bytes .../2.2.2+2.4/SpTBXLib/Source/SpTBXReg.pas | 218 + .../2.2.2+2.4/SpTBXLib/Source/SpTBXSkins.pas | 3430 ++++++ .../2.2.2+2.4/SpTBXLib/Source/SpTBXTabs.pas | 3388 ++++++ .../2.2.2+2.4/SpTBXLib/SpTBXLib-LICENSE.txt | 57 + official/2.2.2+2.4/TB2K/DemoProj/.cvsignore | 5 + official/2.2.2+2.4/TB2K/DemoProj/Demo.cfg | 33 + official/2.2.2+2.4/TB2K/DemoProj/Demo.dof | 29 + official/2.2.2+2.4/TB2K/DemoProj/Demo.dpr | 22 + official/2.2.2+2.4/TB2K/DemoProj/Demo.res | Bin 0 -> 876 bytes official/2.2.2+2.4/TB2K/DemoProj/Demo1.dfm | Bin 0 -> 11901 bytes official/2.2.2+2.4/TB2K/DemoProj/Demo1.pas | 254 + official/2.2.2+2.4/TB2K/DemoProj/DemoBCB.bpr | 179 + official/2.2.2+2.4/TB2K/DemoProj/DemoBCB.cpp | 22 + official/2.2.2+2.4/TB2K/DemoProj/DemoBCB.res | Bin 0 -> 876 bytes official/2.2.2+2.4/TB2K/DemoProj/DemoBCB6.bpr | 115 + official/2.2.2+2.4/TB2K/DemoProj/DemoBCB6.cpp | 34 + official/2.2.2+2.4/TB2K/DemoProj/DemoBCB6.res | Bin 0 -> 876 bytes official/2.2.2+2.4/TB2K/GPL-LICENSE.txt | 340 + official/2.2.2+2.4/TB2K/Glyphs.zip | Bin 0 -> 11257 bytes official/2.2.2+2.4/TB2K/LICENSE.txt | 17 + official/2.2.2+2.4/TB2K/Lib/D12/TB2Acc.dcu | Bin 0 -> 45020 bytes official/2.2.2+2.4/TB2K/Lib/D12/TB2Anim.dcu | Bin 0 -> 6749 bytes official/2.2.2+2.4/TB2K/Lib/D12/TB2Common.dcu | Bin 0 -> 30393 bytes official/2.2.2+2.4/TB2K/Lib/D12/TB2Consts.dcu | Bin 0 -> 2247 bytes official/2.2.2+2.4/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/TB2K/Lib/D12/TB2ExtItems.dcu | Bin 0 -> 42648 bytes official/2.2.2+2.4/TB2K/Lib/D12/TB2Hook.dcu | Bin 0 -> 8747 bytes official/2.2.2+2.4/TB2K/Lib/D12/TB2Item.dcu | Bin 0 -> 188086 bytes official/2.2.2+2.4/TB2K/Lib/D12/TB2MDI.dcu | Bin 0 -> 30108 bytes official/2.2.2+2.4/TB2K/Lib/D12/TB2MRU.dcu | Bin 0 -> 16027 bytes official/2.2.2+2.4/TB2K/Lib/D12/TB2Reg.dcu | Bin 0 -> 11497 bytes .../2.2.2+2.4/TB2K/Lib/D12/TB2ToolWindow.dcu | Bin 0 -> 16362 bytes .../2.2.2+2.4/TB2K/Lib/D12/TB2Toolbar.dcu | Bin 0 -> 63981 bytes .../2.2.2+2.4/TB2K/Lib/D12/TB2Version.dcu | Bin 0 -> 907 bytes official/2.2.2+2.4/TB2K/Lib/D12/tb2k_d12.bpl | Bin 0 -> 279040 bytes official/2.2.2+2.4/TB2K/Lib/D12/tb2k_d12.dcp | Bin 0 -> 552472 bytes official/2.2.2+2.4/TB2K/Lib/D12/tb2k_d12.dcu | Bin 0 -> 2898 bytes .../2.2.2+2.4/TB2K/Lib/D12/tb2kdsgn_d12.bpl | Bin 0 -> 84992 bytes .../2.2.2+2.4/TB2K/Lib/D12/tb2kdsgn_d12.dcp | Bin 0 -> 68882 bytes .../2.2.2+2.4/TB2K/Lib/D12/tb2kdsgn_d12.dcu | Bin 0 -> 4606 bytes official/2.2.2+2.4/TB2K/Packages/.cvsignore | 10 + .../TB2K/Packages/BuildPackages_D12.groupproj | 48 + official/2.2.2+2.4/TB2K/Packages/tb2k_cb4.bpk | 183 + official/2.2.2+2.4/TB2K/Packages/tb2k_cb4.cpp | 29 + official/2.2.2+2.4/TB2K/Packages/tb2k_cb5.bpk | 96 + official/2.2.2+2.4/TB2K/Packages/tb2k_cb5.cpp | 29 + official/2.2.2+2.4/TB2K/Packages/tb2k_cb6.bpk | 130 + official/2.2.2+2.4/TB2K/Packages/tb2k_cb6.cpp | 14 + .../2.2.2+2.4/TB2K/Packages/tb2k_d10.bdsproj | 175 + official/2.2.2+2.4/TB2K/Packages/tb2k_d10.dpk | 48 + official/2.2.2+2.4/TB2K/Packages/tb2k_d10.res | Bin 0 -> 32 bytes official/2.2.2+2.4/TB2K/Packages/tb2k_d11.dpk | 49 + .../2.2.2+2.4/TB2K/Packages/tb2k_d11.dproj | 60 + official/2.2.2+2.4/TB2K/Packages/tb2k_d11.res | Bin 0 -> 32 bytes official/2.2.2+2.4/TB2K/Packages/tb2k_d12.dpk | 48 + .../2.2.2+2.4/TB2K/Packages/tb2k_d12.dproj | 131 + official/2.2.2+2.4/TB2K/Packages/tb2k_d12.res | Bin 0 -> 5056 bytes official/2.2.2+2.4/TB2K/Packages/tb2k_d4.dpk | 47 + official/2.2.2+2.4/TB2K/Packages/tb2k_d4.res | Bin 0 -> 32 bytes official/2.2.2+2.4/TB2K/Packages/tb2k_d5.dpk | 48 + official/2.2.2+2.4/TB2K/Packages/tb2k_d5.res | Bin 0 -> 32 bytes official/2.2.2+2.4/TB2K/Packages/tb2k_d6.dpk | 48 + official/2.2.2+2.4/TB2K/Packages/tb2k_d6.res | Bin 0 -> 32 bytes official/2.2.2+2.4/TB2K/Packages/tb2k_d7.dpk | 48 + official/2.2.2+2.4/TB2K/Packages/tb2k_d7.res | Bin 0 -> 32 bytes official/2.2.2+2.4/TB2K/Packages/tb2k_d9.dpk | 48 + official/2.2.2+2.4/TB2K/Packages/tb2k_d9.res | Bin 0 -> 32 bytes .../2.2.2+2.4/TB2K/Packages/tb2k_dn10.bdsproj | 197 + .../2.2.2+2.4/TB2K/Packages/tb2k_dn10.dpk | 120 + .../2.2.2+2.4/TB2K/Packages/tb2k_dn11.dpk | 120 + .../2.2.2+2.4/TB2K/Packages/tb2k_dn11.dproj | 82 + .../2.2.2+2.4/TB2K/Packages/tb2kdsgn_cb4.bpk | 181 + .../2.2.2+2.4/TB2K/Packages/tb2kdsgn_cb4.cpp | 23 + .../2.2.2+2.4/TB2K/Packages/tb2kdsgn_cb5.bpk | 95 + .../2.2.2+2.4/TB2K/Packages/tb2kdsgn_cb5.cpp | 23 + .../2.2.2+2.4/TB2K/Packages/tb2kdsgn_cb6.bpk | 125 + .../2.2.2+2.4/TB2K/Packages/tb2kdsgn_cb6.cpp | 18 + .../TB2K/Packages/tb2kdsgn_d10.bdsproj | 175 + .../2.2.2+2.4/TB2K/Packages/tb2kdsgn_d10.dpk | 42 + .../2.2.2+2.4/TB2K/Packages/tb2kdsgn_d10.res | Bin 0 -> 32 bytes .../2.2.2+2.4/TB2K/Packages/tb2kdsgn_d11.dpk | 43 + .../TB2K/Packages/tb2kdsgn_d11.dproj | 52 + .../2.2.2+2.4/TB2K/Packages/tb2kdsgn_d11.res | Bin 0 -> 32 bytes .../2.2.2+2.4/TB2K/Packages/tb2kdsgn_d12.bpi | Bin 0 -> 10388 bytes .../2.2.2+2.4/TB2K/Packages/tb2kdsgn_d12.dpk | 42 + .../TB2K/Packages/tb2kdsgn_d12.dproj | 129 + .../2.2.2+2.4/TB2K/Packages/tb2kdsgn_d12.hpp | 101 + .../2.2.2+2.4/TB2K/Packages/tb2kdsgn_d12.lib | Bin 0 -> 76800 bytes .../2.2.2+2.4/TB2K/Packages/tb2kdsgn_d12.res | Bin 0 -> 5056 bytes .../2.2.2+2.4/TB2K/Packages/tb2kdsgn_d4.dpk | 42 + .../2.2.2+2.4/TB2K/Packages/tb2kdsgn_d4.res | Bin 0 -> 32 bytes .../2.2.2+2.4/TB2K/Packages/tb2kdsgn_d5.dpk | 42 + .../2.2.2+2.4/TB2K/Packages/tb2kdsgn_d5.res | Bin 0 -> 32 bytes .../2.2.2+2.4/TB2K/Packages/tb2kdsgn_d6.dpk | 42 + .../2.2.2+2.4/TB2K/Packages/tb2kdsgn_d6.res | Bin 0 -> 32 bytes .../2.2.2+2.4/TB2K/Packages/tb2kdsgn_d7.dpk | 42 + .../2.2.2+2.4/TB2K/Packages/tb2kdsgn_d7.res | Bin 0 -> 32 bytes .../2.2.2+2.4/TB2K/Packages/tb2kdsgn_d9.dpk | 42 + .../2.2.2+2.4/TB2K/Packages/tb2kdsgn_d9.res | Bin 0 -> 32 bytes .../TB2K/Packages/tb2kdsgn_dn10.bdsproj | 188 + .../2.2.2+2.4/TB2K/Packages/tb2kdsgn_dn10.dpk | 111 + .../2.2.2+2.4/TB2K/Packages/tb2kdsgn_dn11.dpk | 112 + .../TB2K/Packages/tb2kdsgn_dn11.dproj | 82 + official/2.2.2+2.4/TB2K/README.txt | 22 + official/2.2.2+2.4/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/TB2K/Source/Icons/TTBDock.bmp | Bin 0 -> 406 bytes .../2.2.2+2.4/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/TB2K/Source/TB2Acc.pas | 1393 +++ official/2.2.2+2.4/TB2K/Source/TB2Anim.pas | 323 + official/2.2.2+2.4/TB2K/Source/TB2Common.pas | 1571 +++ official/2.2.2+2.4/TB2K/Source/TB2Consts.pas | 34 + official/2.2.2+2.4/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/TB2K/Source/TB2ExtItems.pas | 990 ++ official/2.2.2+2.4/TB2K/Source/TB2Hook.pas | 344 + official/2.2.2+2.4/TB2K/Source/TB2Item.pas | 6982 ++++++++++++ official/2.2.2+2.4/TB2K/Source/TB2MDI.pas | 714 ++ official/2.2.2+2.4/TB2K/Source/TB2MDI.res | Bin 0 -> 712 bytes official/2.2.2+2.4/TB2K/Source/TB2MRU.pas | 417 + .../2.2.2+2.4/TB2K/Source/TB2OleMarshal.pas | 203 + official/2.2.2+2.4/TB2K/Source/TB2Reg.dcr | Bin 0 -> 5188 bytes official/2.2.2+2.4/TB2K/Source/TB2Reg.hpp | 53 + official/2.2.2+2.4/TB2K/Source/TB2Reg.pas | 317 + .../2.2.2+2.4/TB2K/Source/TB2ResCursors.res | Bin 0 -> 1304 bytes .../2.2.2+2.4/TB2K/Source/TB2ToolWindow.pas | 258 + official/2.2.2+2.4/TB2K/Source/TB2Toolbar.pas | 1794 +++ official/2.2.2+2.4/TB2K/Source/TB2Ver.inc | 64 + official/2.2.2+2.4/TB2K/Source/TB2Version.pas | 63 + official/2.2.2+2.4/TB2K/TB2k-LICENSE.txt | 61 + official/2.2.2+2.4/TB2K/tb2k.chm | Bin 0 -> 84104 bytes official/2.2.2+2.4/TB2K/whatsnew.htm | 419 + 287 files changed, 86446 insertions(+) create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/Customizer.dpr create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/Unit1.dfm create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/Unit1.pas create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/Unit2.dfm create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/Unit2.pas create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/advanced.txt create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/faq.txt create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/gnugettext.pas create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/langcodes.txt create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/de/LC_MESSAGES/default.mo create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/de/LC_MESSAGES/default.po create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/default.po create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/es/LC_MESSAGES/default.mo create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/es/LC_MESSAGES/default.po create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/fi/LC_MESSAGES/default.mo create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/fi/LC_MESSAGES/default.po create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/fr/LC_MESSAGES/default.mo create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/fr/LC_MESSAGES/default.po create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/ignore.po create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/ja/LC_MESSAGES/default.mo create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/ja/LC_MESSAGES/default.po create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/ko/LC_MESSAGES/default.mo create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/ko/LC_MESSAGES/default.po create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/pt_BR/LC_MESSAGES/default.mo create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/pt_BR/LC_MESSAGES/default.po create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/ru/LC_MESSAGES/default.mo create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/ru/LC_MESSAGES/default.po create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/sr_Cyrillic/LC_MESSAGES/default.mo create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/sr_Cyrillic/LC_MESSAGES/default.po create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/sr_Latin/LC_MESSAGES/default.mo create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/sr_Latin/LC_MESSAGES/default.po create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/sv/LC_MESSAGES/default.mo create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/sv/LC_MESSAGES/default.po create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/tr/LC_MESSAGES/default.mo create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/tr/LC_MESSAGES/default.po create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/zh_CN/LC_MESSAGES/default.mo create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/zh_CN/LC_MESSAGES/default.po create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Customizer/translations.txt create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/FormPopupMenu/FormPopupMenu.dpr create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/FormPopupMenu/Unit1.dfm create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/FormPopupMenu/Unit1.pas create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/FormPopupMenu/Unit2.dfm create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/FormPopupMenu/Unit2.pas create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/FormPopupMenu/Unit3.dfm create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/FormPopupMenu/Unit3.pas create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Overview/Overview.dpr create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Overview/Skins/WMP11.skn create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Overview/Unit1.dfm create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Overview/Unit1.pas create mode 100644 official/2.2.2+2.4/SpTBXLib/Demos/Overview/hint.bmp create mode 100644 official/2.2.2+2.4/SpTBXLib/LICENSE.txt create mode 100644 official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXColorPickerForm.dcu create mode 100644 official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXControls.dcu create mode 100644 official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXCustomizer.dcu create mode 100644 official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXCustomizerForm.dcu create mode 100644 official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXDefaultSkins.dcu create mode 100644 official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXDkPanels.dcu create mode 100644 official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXEditors.dcu create mode 100644 official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXExtEditors.dcu create mode 100644 official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXFormPopupMenu.dcu create mode 100644 official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXItem.dcu create mode 100644 official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXLibDsgn_d12.bpl create mode 100644 official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXLibDsgn_d12.dcp create mode 100644 official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXLibDsgn_d12.dcu create mode 100644 official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXLib_d12.bpl create mode 100644 official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXLib_d12.dcp create mode 100644 official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXLib_d12.dcu create mode 100644 official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXMDIMRU.dcu create mode 100644 official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXReg.dcu create mode 100644 official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXSkins.dcu create mode 100644 official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXTabs.dcu create mode 100644 official/2.2.2+2.4/SpTBXLib/MPL-LICENSE.txt create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/BuildPackages_D12.groupproj create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLibDsgn_d10.bdsproj create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLibDsgn_d10.dpk create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLibDsgn_d10.res create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLibDsgn_d11.bdsproj create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLibDsgn_d11.dpk create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLibDsgn_d11.res create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLibDsgn_d12.dpk create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLibDsgn_d12.dproj create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLibDsgn_d12.res create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLibDsgn_d7.dpk create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLibDsgn_d7.res create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLibDsgn_d9.dpk create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLibDsgn_d9.res create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLib_d10.bdsproj create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLib_d10.dpk create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLib_d10.res create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLib_d11.bdsproj create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLib_d11.dpk create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLib_d11.res create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLib_d12.dpk create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLib_d12.dproj create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLib_d12.res create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLib_d7.dpk create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLib_d7.res create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLib_d9.dpk create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLib_d9.res create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/__history/SpTBXLibDsgn_d12.dpk.~1~ create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/__history/SpTBXLibDsgn_d12.dpk.~2~ create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/__history/SpTBXLib_d12.dpk.~1~ create mode 100644 official/2.2.2+2.4/SpTBXLib/Packages/__history/SpTBXLib_d12.dpk.~2~ create mode 100644 official/2.2.2+2.4/SpTBXLib/Readme.txt create mode 100644 official/2.2.2+2.4/SpTBXLib/Registration.txt create mode 100644 official/2.2.2+2.4/SpTBXLib/Source/SpTBXColorPickerForm.dfm create mode 100644 official/2.2.2+2.4/SpTBXLib/Source/SpTBXColorPickerForm.pas create mode 100644 official/2.2.2+2.4/SpTBXLib/Source/SpTBXControls.pas create mode 100644 official/2.2.2+2.4/SpTBXLib/Source/SpTBXCustomizer.pas create mode 100644 official/2.2.2+2.4/SpTBXLib/Source/SpTBXCustomizerForm.dfm create mode 100644 official/2.2.2+2.4/SpTBXLib/Source/SpTBXCustomizerForm.pas create mode 100644 official/2.2.2+2.4/SpTBXLib/Source/SpTBXDefaultSkins.pas create mode 100644 official/2.2.2+2.4/SpTBXLib/Source/SpTBXDkPanels.pas create mode 100644 official/2.2.2+2.4/SpTBXLib/Source/SpTBXEditors.pas create mode 100644 official/2.2.2+2.4/SpTBXLib/Source/SpTBXExtEditors.pas create mode 100644 official/2.2.2+2.4/SpTBXLib/Source/SpTBXFormPopupMenu.pas create mode 100644 official/2.2.2+2.4/SpTBXLib/Source/SpTBXGlyphs.res create mode 100644 official/2.2.2+2.4/SpTBXLib/Source/SpTBXItem.pas create mode 100644 official/2.2.2+2.4/SpTBXLib/Source/SpTBXMDIMRU.pas create mode 100644 official/2.2.2+2.4/SpTBXLib/Source/SpTBXReg.dcr create mode 100644 official/2.2.2+2.4/SpTBXLib/Source/SpTBXReg.pas create mode 100644 official/2.2.2+2.4/SpTBXLib/Source/SpTBXSkins.pas create mode 100644 official/2.2.2+2.4/SpTBXLib/Source/SpTBXTabs.pas create mode 100644 official/2.2.2+2.4/SpTBXLib/SpTBXLib-LICENSE.txt create mode 100644 official/2.2.2+2.4/TB2K/DemoProj/.cvsignore create mode 100644 official/2.2.2+2.4/TB2K/DemoProj/Demo.cfg create mode 100644 official/2.2.2+2.4/TB2K/DemoProj/Demo.dof create mode 100644 official/2.2.2+2.4/TB2K/DemoProj/Demo.dpr create mode 100644 official/2.2.2+2.4/TB2K/DemoProj/Demo.res create mode 100644 official/2.2.2+2.4/TB2K/DemoProj/Demo1.dfm create mode 100644 official/2.2.2+2.4/TB2K/DemoProj/Demo1.pas create mode 100644 official/2.2.2+2.4/TB2K/DemoProj/DemoBCB.bpr create mode 100644 official/2.2.2+2.4/TB2K/DemoProj/DemoBCB.cpp create mode 100644 official/2.2.2+2.4/TB2K/DemoProj/DemoBCB.res create mode 100644 official/2.2.2+2.4/TB2K/DemoProj/DemoBCB6.bpr create mode 100644 official/2.2.2+2.4/TB2K/DemoProj/DemoBCB6.cpp create mode 100644 official/2.2.2+2.4/TB2K/DemoProj/DemoBCB6.res create mode 100644 official/2.2.2+2.4/TB2K/GPL-LICENSE.txt create mode 100644 official/2.2.2+2.4/TB2K/Glyphs.zip create mode 100644 official/2.2.2+2.4/TB2K/LICENSE.txt create mode 100644 official/2.2.2+2.4/TB2K/Lib/D12/TB2Acc.dcu create mode 100644 official/2.2.2+2.4/TB2K/Lib/D12/TB2Anim.dcu create mode 100644 official/2.2.2+2.4/TB2K/Lib/D12/TB2Common.dcu create mode 100644 official/2.2.2+2.4/TB2K/Lib/D12/TB2Consts.dcu create mode 100644 official/2.2.2+2.4/TB2K/Lib/D12/TB2Dock.dcu create mode 100644 official/2.2.2+2.4/TB2K/Lib/D12/TB2DsgnConvertOptions.dcu create mode 100644 official/2.2.2+2.4/TB2K/Lib/D12/TB2DsgnConverter.dcu create mode 100644 official/2.2.2+2.4/TB2K/Lib/D12/TB2DsgnItemEditor.dcu create mode 100644 official/2.2.2+2.4/TB2K/Lib/D12/TB2ExtItems.dcu create mode 100644 official/2.2.2+2.4/TB2K/Lib/D12/TB2Hook.dcu create mode 100644 official/2.2.2+2.4/TB2K/Lib/D12/TB2Item.dcu create mode 100644 official/2.2.2+2.4/TB2K/Lib/D12/TB2MDI.dcu create mode 100644 official/2.2.2+2.4/TB2K/Lib/D12/TB2MRU.dcu create mode 100644 official/2.2.2+2.4/TB2K/Lib/D12/TB2Reg.dcu create mode 100644 official/2.2.2+2.4/TB2K/Lib/D12/TB2ToolWindow.dcu create mode 100644 official/2.2.2+2.4/TB2K/Lib/D12/TB2Toolbar.dcu create mode 100644 official/2.2.2+2.4/TB2K/Lib/D12/TB2Version.dcu create mode 100644 official/2.2.2+2.4/TB2K/Lib/D12/tb2k_d12.bpl create mode 100644 official/2.2.2+2.4/TB2K/Lib/D12/tb2k_d12.dcp create mode 100644 official/2.2.2+2.4/TB2K/Lib/D12/tb2k_d12.dcu create mode 100644 official/2.2.2+2.4/TB2K/Lib/D12/tb2kdsgn_d12.bpl create mode 100644 official/2.2.2+2.4/TB2K/Lib/D12/tb2kdsgn_d12.dcp create mode 100644 official/2.2.2+2.4/TB2K/Lib/D12/tb2kdsgn_d12.dcu create mode 100644 official/2.2.2+2.4/TB2K/Packages/.cvsignore create mode 100644 official/2.2.2+2.4/TB2K/Packages/BuildPackages_D12.groupproj create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_cb4.bpk create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_cb4.cpp create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_cb5.bpk create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_cb5.cpp create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_cb6.bpk create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_cb6.cpp create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_d10.bdsproj create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_d10.dpk create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_d10.res create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_d11.dpk create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_d11.dproj create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_d11.res create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_d12.dpk create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_d12.dproj create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_d12.res create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_d4.dpk create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_d4.res create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_d5.dpk create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_d5.res create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_d6.dpk create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_d6.res create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_d7.dpk create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_d7.res create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_d9.dpk create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_d9.res create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_dn10.bdsproj create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_dn10.dpk create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_dn11.dpk create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2k_dn11.dproj create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_cb4.bpk create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_cb4.cpp create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_cb5.bpk create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_cb5.cpp create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_cb6.bpk create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_cb6.cpp create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d10.bdsproj create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d10.dpk create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d10.res create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d11.dpk create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d11.dproj create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d11.res create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d12.bpi create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d12.dpk create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d12.dproj create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d12.hpp create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d12.lib create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d12.res create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d4.dpk create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d4.res create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d5.dpk create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d5.res create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d6.dpk create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d6.res create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d7.dpk create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d7.res create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d9.dpk create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d9.res create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_dn10.bdsproj create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_dn10.dpk create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_dn11.dpk create mode 100644 official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_dn11.dproj create mode 100644 official/2.2.2+2.4/TB2K/README.txt create mode 100644 official/2.2.2+2.4/TB2K/Source/.cvsignore create mode 100644 official/2.2.2+2.4/TB2K/Source/Icons/TB2DsgnEditorImages.bmp create mode 100644 official/2.2.2+2.4/TB2K/Source/Icons/TTBBackground.bmp create mode 100644 official/2.2.2+2.4/TB2K/Source/Icons/TTBBackground16.bmp create mode 100644 official/2.2.2+2.4/TB2K/Source/Icons/TTBDock.bmp create mode 100644 official/2.2.2+2.4/TB2K/Source/Icons/TTBDock16.bmp create mode 100644 official/2.2.2+2.4/TB2K/Source/Icons/TTBEditItem.bmp create mode 100644 official/2.2.2+2.4/TB2K/Source/Icons/TTBGroupItem.bmp create mode 100644 official/2.2.2+2.4/TB2K/Source/Icons/TTBImageList.bmp create mode 100644 official/2.2.2+2.4/TB2K/Source/Icons/TTBImageList16.bmp create mode 100644 official/2.2.2+2.4/TB2K/Source/Icons/TTBItemContainer.bmp create mode 100644 official/2.2.2+2.4/TB2K/Source/Icons/TTBItemContainer16.bmp create mode 100644 official/2.2.2+2.4/TB2K/Source/Icons/TTBMDIHandler.bmp create mode 100644 official/2.2.2+2.4/TB2K/Source/Icons/TTBMDIHandler16.bmp create mode 100644 official/2.2.2+2.4/TB2K/Source/Icons/TTBMDIWindowItem.bmp create mode 100644 official/2.2.2+2.4/TB2K/Source/Icons/TTBMRUList.bmp create mode 100644 official/2.2.2+2.4/TB2K/Source/Icons/TTBMRUList16.bmp create mode 100644 official/2.2.2+2.4/TB2K/Source/Icons/TTBMRUListItem.bmp create mode 100644 official/2.2.2+2.4/TB2K/Source/Icons/TTBPopupMenu.bmp create mode 100644 official/2.2.2+2.4/TB2K/Source/Icons/TTBPopupMenu16.bmp create mode 100644 official/2.2.2+2.4/TB2K/Source/Icons/TTBToolWindow.bmp create mode 100644 official/2.2.2+2.4/TB2K/Source/Icons/TTBToolWindow16.bmp create mode 100644 official/2.2.2+2.4/TB2K/Source/Icons/TTBToolbar.bmp create mode 100644 official/2.2.2+2.4/TB2K/Source/Icons/TTBToolbar16.bmp create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2Acc.pas create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2Anim.pas create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2Common.pas create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2Consts.pas create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2Dock.pas create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2DsgnConvertOptions.dfm create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2DsgnConvertOptions.dfm.txt create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2DsgnConvertOptions.hpp create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2DsgnConvertOptions.pas create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2DsgnConverter.dfm create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2DsgnConverter.dfm.txt create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2DsgnConverter.hpp create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2DsgnConverter.pas create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2DsgnItemEditor.dfm create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2DsgnItemEditor.dfm.txt create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2DsgnItemEditor.hpp create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2DsgnItemEditor.pas create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2DsgnItemEditor.res create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2ExtItems.pas create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2Hook.pas create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2Item.pas create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2MDI.pas create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2MDI.res create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2MRU.pas create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2OleMarshal.pas create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2Reg.dcr create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2Reg.hpp create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2Reg.pas create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2ResCursors.res create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2ToolWindow.pas create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2Toolbar.pas create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2Ver.inc create mode 100644 official/2.2.2+2.4/TB2K/Source/TB2Version.pas create mode 100644 official/2.2.2+2.4/TB2K/TB2k-LICENSE.txt create mode 100644 official/2.2.2+2.4/TB2K/tb2k.chm create mode 100644 official/2.2.2+2.4/TB2K/whatsnew.htm diff --git a/official/2.2.2+2.4/SpTBXLib/Demos/Customizer/Customizer.dpr b/official/2.2.2+2.4/SpTBXLib/Demos/Customizer/Customizer.dpr new file mode 100644 index 0000000..0202e78 --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Demos/Customizer/Unit1.dfm b/official/2.2.2+2.4/SpTBXLib/Demos/Customizer/Unit1.dfm new file mode 100644 index 0000000..a77ac8c --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Demos/Customizer/Unit1.pas b/official/2.2.2+2.4/SpTBXLib/Demos/Customizer/Unit1.pas new file mode 100644 index 0000000..a56db25 --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Demos/Customizer/Unit2.dfm b/official/2.2.2+2.4/SpTBXLib/Demos/Customizer/Unit2.dfm new file mode 100644 index 0000000..667975b --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Demos/Customizer/Unit2.pas b/official/2.2.2+2.4/SpTBXLib/Demos/Customizer/Unit2.pas new file mode 100644 index 0000000..cabfa6a --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Demos/Customizer/advanced.txt b/official/2.2.2+2.4/SpTBXLib/Demos/Customizer/advanced.txt new file mode 100644 index 0000000..bed4456 --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Demos/Customizer/faq.txt b/official/2.2.2+2.4/SpTBXLib/Demos/Customizer/faq.txt new file mode 100644 index 0000000..d6adc52 --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Demos/Customizer/gnugettext.pas b/official/2.2.2+2.4/SpTBXLib/Demos/Customizer/gnugettext.pas new file mode 100644 index 0000000..2a86dbc --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Demos/Customizer/langcodes.txt b/official/2.2.2+2.4/SpTBXLib/Demos/Customizer/langcodes.txt new file mode 100644 index 0000000..719173f --- /dev/null +++ b/official/2.2.2+2.4/SpTBXLib/Demos/Customizer/langcodes.txt @@ -0,0 +1,14 @@ +[de] German +[en] English +[es] Spanish +[fi] Finnish +[fr] French +[ja] Japanese +[ko] Korean +[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/SpTBXLib/Demos/Customizer/locale/de/LC_MESSAGES/default.mo b/official/2.2.2+2.4/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/SpTBXLib/Demos/Customizer/locale/default.po b/official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/default.po new file mode 100644 index 0000000..f9c44d4 --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Demos/Customizer/locale/es/LC_MESSAGES/default.mo b/official/2.2.2+2.4/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/SpTBXLib/Demos/Customizer/locale/es/LC_MESSAGES/default.po b/official/2.2.2+2.4/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/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/SpTBXLib/Demos/Customizer/locale/fi/LC_MESSAGES/default.mo b/official/2.2.2+2.4/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/SpTBXLib/Demos/Customizer/locale/fr/LC_MESSAGES/default.mo b/official/2.2.2+2.4/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/SpTBXLib/Demos/Customizer/locale/fr/LC_MESSAGES/default.po b/official/2.2.2+2.4/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/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/SpTBXLib/Demos/Customizer/locale/ignore.po b/official/2.2.2+2.4/SpTBXLib/Demos/Customizer/locale/ignore.po new file mode 100644 index 0000000..eec136a --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Demos/Customizer/locale/ja/LC_MESSAGES/default.mo b/official/2.2.2+2.4/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/SpTBXLib/Demos/Customizer/locale/ko/LC_MESSAGES/default.mo b/official/2.2.2+2.4/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/SpTBXLib/Demos/Customizer/locale/pt_BR/LC_MESSAGES/default.mo b/official/2.2.2+2.4/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/SpTBXLib/Demos/Customizer/locale/ru/LC_MESSAGES/default.mo b/official/2.2.2+2.4/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/SpTBXLib/Demos/Customizer/locale/sr_Cyrillic/LC_MESSAGES/default.mo b/official/2.2.2+2.4/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/SpTBXLib/Demos/Customizer/locale/sr_Latin/LC_MESSAGES/default.mo b/official/2.2.2+2.4/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/SpTBXLib/Demos/Customizer/locale/sv/LC_MESSAGES/default.mo b/official/2.2.2+2.4/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/SpTBXLib/Demos/Customizer/locale/sv/LC_MESSAGES/default.po b/official/2.2.2+2.4/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/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/SpTBXLib/Demos/Customizer/locale/tr/LC_MESSAGES/default.mo b/official/2.2.2+2.4/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/SpTBXLib/Demos/Customizer/locale/zh_CN/LC_MESSAGES/default.mo b/official/2.2.2+2.4/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/SpTBXLib/Demos/Customizer/locale/zh_CN/LC_MESSAGES/default.po b/official/2.2.2+2.4/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/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/SpTBXLib/Demos/Customizer/translations.txt b/official/2.2.2+2.4/SpTBXLib/Demos/Customizer/translations.txt new file mode 100644 index 0000000..77871a4 --- /dev/null +++ b/official/2.2.2+2.4/SpTBXLib/Demos/Customizer/translations.txt @@ -0,0 +1,26 @@ + +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 +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/index.htm \ No newline at end of file diff --git a/official/2.2.2+2.4/SpTBXLib/Demos/FormPopupMenu/FormPopupMenu.dpr b/official/2.2.2+2.4/SpTBXLib/Demos/FormPopupMenu/FormPopupMenu.dpr new file mode 100644 index 0000000..be00fa9 --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Demos/FormPopupMenu/Unit1.dfm b/official/2.2.2+2.4/SpTBXLib/Demos/FormPopupMenu/Unit1.dfm new file mode 100644 index 0000000..e026cd8 --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Demos/FormPopupMenu/Unit1.pas b/official/2.2.2+2.4/SpTBXLib/Demos/FormPopupMenu/Unit1.pas new file mode 100644 index 0000000..07f5a3c --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Demos/FormPopupMenu/Unit2.dfm b/official/2.2.2+2.4/SpTBXLib/Demos/FormPopupMenu/Unit2.dfm new file mode 100644 index 0000000..4828692 --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Demos/FormPopupMenu/Unit2.pas b/official/2.2.2+2.4/SpTBXLib/Demos/FormPopupMenu/Unit2.pas new file mode 100644 index 0000000..89faf97 --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Demos/FormPopupMenu/Unit3.dfm b/official/2.2.2+2.4/SpTBXLib/Demos/FormPopupMenu/Unit3.dfm new file mode 100644 index 0000000..21fa118 --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Demos/FormPopupMenu/Unit3.pas b/official/2.2.2+2.4/SpTBXLib/Demos/FormPopupMenu/Unit3.pas new file mode 100644 index 0000000..584a423 --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Demos/Overview/Overview.dpr b/official/2.2.2+2.4/SpTBXLib/Demos/Overview/Overview.dpr new file mode 100644 index 0000000..5ead0c3 --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Demos/Overview/Skins/WMP11.skn b/official/2.2.2+2.4/SpTBXLib/Demos/Overview/Skins/WMP11.skn new file mode 100644 index 0000000..2cf772c --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Demos/Overview/Unit1.dfm b/official/2.2.2+2.4/SpTBXLib/Demos/Overview/Unit1.dfm new file mode 100644 index 0000000..f37f056 --- /dev/null +++ b/official/2.2.2+2.4/SpTBXLib/Demos/Overview/Unit1.dfm @@ -0,0 +1,1977 @@ +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 = 133 + Anchors = [akLeft, akTop, akRight] + TabOrder = 4 + HotTrack = True + object Memo2: TMemo + Left = 2 + Top = 22 + Width = 248 + Height = 109 + 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 + TabOrder = 6 + Text = 'Arial' + Items.Strings = ( + 'Arial' + 'Arial Black' + 'Batang' + 'BatangChe' + 'Comic Sans MS' + 'Consolas' + 'Courier' + 'Courier New' + 'DejaVu Sans' + 'DejaVu Sans Condensed' + 'DejaVu Sans Light' + 'DejaVu Sans Mono' + 'DejaVu Serif' + 'DejaVu Serif Condensed' + 'Dotum' + 'DotumChe' + 'Estrangelo Edessa' + 'Fixedsys' + 'Franklin Gothic Medium' + 'Gautami' + 'Georgia' + 'Gulim' + 'GulimChe' + 'Gungsuh' + 'GungsuhChe' + 'Impact' + 'Kartika' + 'Latha' + 'Lucida Console' + 'Lucida Sans' + 'Lucida Sans Unicode' + 'Mangal' + 'Marlett' + 'Microsoft Sans Serif' + 'MingLiU' + 'Modern' + 'MS Gothic' + 'MS Mincho' + 'MS PGothic' + 'MS PMincho' + 'MS Sans Serif' + 'MS Serif' + 'MS UI Gothic' + 'MV Boli' + 'NSimSun' + 'OpenSymbol' + 'Palatino Linotype' + 'PMingLiU' + 'Raavi' + 'Roman' + 'Script' + 'Shruti' + 'SimHei' + 'SimSun' + 'SimSun-PUA' + 'Small Fonts' + 'Sylfaen' + 'Symbol' + 'System' + 'Tahoma' + 'Terminal' + 'Times New Roman' + 'Trebuchet MS' + 'Tunga' + 'Verdana' + 'Vrinda' + 'Webdings' + 'Wingdings' + 'WST_Czec' + 'WST_Engl' + 'WST_Fren' + 'WST_Germ' + 'WST_Ital' + 'WST_Span' + 'WST_Swed') + 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 + ExplicitTop = 532 + 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/SpTBXLib/Demos/Overview/Unit1.pas b/official/2.2.2+2.4/SpTBXLib/Demos/Overview/Unit1.pas new file mode 100644 index 0000000..6889a1c --- /dev/null +++ b/official/2.2.2+2.4/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 = SpTBXSpeedButton1, 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/SpTBXLib/Demos/Overview/hint.bmp b/official/2.2.2+2.4/SpTBXLib/Demos/Overview/hint.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3d32889374993e8296f61a903c26949cad1bccbd GIT binary patch literal 21654 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 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4/SpTBXLib/LICENSE.txt b/official/2.2.2+2.4/SpTBXLib/LICENSE.txt new file mode 100644 index 0000000..79e0329 --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Lib/D12/SpTBXColorPickerForm.dcu b/official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXColorPickerForm.dcu new file mode 100644 index 0000000000000000000000000000000000000000..66f17fd0dfe05313fd0037469c42940ff4a57c84 GIT binary patch literal 20785 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 OysKq0ECr`u=KLSpXkGCD literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXControls.dcu b/official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXControls.dcu new file mode 100644 index 0000000000000000000000000000000000000000..0268363fa9277b49d08a211dfe08bc28cdb2a135 GIT binary patch literal 176659 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 UR{=IphPY)8n~}0i9U2q=2dF~HLI3~& literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXCustomizer.dcu b/official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXCustomizer.dcu new file mode 100644 index 0000000000000000000000000000000000000000..d6057dadbee68986c41b5c6d61b31d581cb020ec GIT binary patch literal 65630 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

cG83hLAXNWKbyNoe9y|!UR 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 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXDefaultSkins.dcu b/official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXDefaultSkins.dcu new file mode 100644 index 0000000000000000000000000000000000000000..bba9805d89878822591df72a1bb2f642e2a944e6 GIT binary patch literal 77021 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 V<{3B7(L6`9t)(JRx+>qx{|^o-XB_|l literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXDkPanels.dcu b/official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXDkPanels.dcu new file mode 100644 index 0000000000000000000000000000000000000000..ce75974fe7a6cf77edc3bf5d7b59d26be0fe3026 GIT binary patch literal 111320 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 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXEditors.dcu b/official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXEditors.dcu new file mode 100644 index 0000000000000000000000000000000000000000..0ecabd8d429bc3d9fd8aded54608eebe6e135c27 GIT binary patch literal 128057 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 ooa(kMEd-Kl%< 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 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXExtEditors.dcu b/official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXExtEditors.dcu new file mode 100644 index 0000000000000000000000000000000000000000..20569185048d1e727b609b85ec479659c46a9305 GIT binary patch literal 42912 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 T(yR^(-sb+p{3uLWqjR}G>8DKN literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXFormPopupMenu.dcu b/official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXFormPopupMenu.dcu new file mode 100644 index 0000000000000000000000000000000000000000..8c3e37562733e6104ab42f2153309e640126cd91 GIT binary patch literal 39958 zcmeIb4O~^%l{b9uIp>~x&f(lI0z|A>uwcas6{C*Yn0kSW-b4@tG^DY50~fq0U&1Ak zOvpeGM{+}}ZOqg>F;hBqp4h3Kkk(9SYbs4lLML=$8avw7PMK$HrHS)OCuAfE@ch?4 z=iCn<&OGn$dB1+|knDT*UTf{O*Is+=wb$O~!}T1Ol=3vkJ^T0b6az9ps{WG(&wM#q}!X-iu_eO0xh}0#_E6U%vsMjr|0J0Ti(>xQXRN= zZmryAf9vCqiw;)1uX%8D6nR^_I{nb$=AwY6F>OUQj|P;>1Vy&&2@>J=5)qd99mK*diMuIIzO{z zl5k#fswA zy3dc@`n5X8_5h5bHBjJh4z;xeT)$51s!J#jG}aUcT3h{fftN0MtLiiidO=%DYg0>U zQ|nu0FWph6l$#JKsZ*$vcb4xi-Bwyz`jhs5`eL0ErGl-#(t<6%t%cjYC7*5i{omEu z0j${KE4Zs@yQkRu*_MABU?A_^yDPSp7H=!Bc%|d_d37#OG0?WHJAEaE+jf5EvES#_ zY9W8!&XU4{t)BAooxaUz$Lf;wsZ;82@izoukI+?Z(<))nTfmh1c5n7p6njf5Jte+kPlaz=$!$x( zP(u%OMWWB&ct5kIPTK+*Olg1I{!hQDQ_FXj?k?F@?z_kPw27oC;q0+>1);7@izMJs}Izi{dRtGt%M#Imv3f6q>}da;aNQX z{{N`6!9@24>uXki|AWaoWyf8+z2ya-QtuSwzSFbYSHc?feun|j)p}SrnZd2k6#S3c zBycV%DDZ48AhCCsdN3U2-rM^>TPJO)*y=5+_$gJhZmGbqyh&MwWeM|hDypow-M4v5 z#V@FA+fu;_BUF&LROD|%&EiW`(##T7W}Ua25LV@%hzRUUw(Z>F-LA{)E^mOvGfS;# zVwX_I2M^bZq$L5Gnil_qdi~A+&DvC_Y%koo+q>OU?tPKOa!}D%vct30SBRlw!|NoNXX{qe zuE{p_dd#MCrvI2%m+IZ&EveXDUR7S#q;QC-WLy57zCxNEpnAQp<)7;` z#tpD?@75w3vRbjyS5m=*)^z*1XWRBd?{-}*f^6{>dZV*Lx3cmr+ji=(`bQvD#He-z zTZ6DFGAcN~oxAh5LX^+8%nVf5$c7b?qo}j(EZ$vN?%htEsMRWV7Dpy{`%e=7woU`O z+*?slxxIYbb`34m+Ck%Of#=BoQe9)s*}vNVE6nF&U4!{|Z7wOiN_|NHl?Q(R0hnOd z%yX%A37|3O!%IX#d|;3M`f6I#5`KPaALA1>(bLQWFsd!VPz9Xk6QAOCFo{Z_yNU{L zdBuxFBUcz5y1a2sN}Y;^N(xFn(B%(loMe=k6-QzD1aq;*Vro0XXflyOP1^je1zYd>G{LFyl7fg9ARU}G zTXh1=X(v>a?+w<5%0p1vU-eeMTdP(SG&M9gH3k|(kNtVik1#$ZO`%|IyY~S=wsx<$ z4}N}Yur>7Nqks8L5N~S^wD@VQExFRR8B1}ba&BdF4f6$cAZ}^D^xvPVh(qu2*9Uci zMmWk}5;{4i_Rf}ID8Qt;JiBIDTcD+#qKuYWe|6wDgkBU=bIyYI``Hxb{#vX-_4VHU z)q!S`{e7ZHtSE)IhOp>ouD*2tvF^Fo0FU-*x2L9Nd!Y88i2jyXxH02@ONdXzAP^P= z8v~^+O;A%P7-)Ts2$Et5wg>z*tegL!%Mfh~lcEHgd0VeBN4AQle}#0l!iLpr-s!n? zcb!(0>@1t>YpeeyPrN|{a#OR8{OOlle_59i*I%kbF$*)RU^O$I zYa~Og-ewcL3j%l%tgV%yU_J99D$#fvYf6Ik_kR0tz5y&kzfemP!;&)yHX4A5J(ItK z9TzvX!GpAgLQRd6SI*R94jcFfKU(gGDet5}B(%4w=1|Hy9t;YK+0u7cpuKhLXG#zT z6z^vK^Db}I-#yB$f;RyL#f|mF2vEEJ^g|hu0cboW1>UX2+X}tw4JsD$v4Eg;Z|cc{ zIyb1uhx$r37i{sAZ1xuJ2PMoRDzagK6-}>nIsOdh9gC^CzpXV?P#=Vy(rR>$C{p7n z>M`i1GF~I}t+8mx>}d-%kqaCqWb!QJ_CPC8KP6OJ9EwHOe%LeS0Fk^wBn#q5SXcEh z^dCM3t1IG7!Y-a$S6?M{4(Ev`UOL7f1N9c6J{4CTN@;5FP}dQ^Vz%ji;O9j6$&VpK zcod}h|27fDDS7t1y+9OkN;W2tF6l4kv|^xRyYr7kloBh7Nz_<#k#HGtxTfkaZ4Wfp z!^IUMtB?1ui0l)wWE8J4Q`puLtP3_?C4x9PBLrkCV}yej2qF2|C^e_b$ei68&+U8r2M0^ zE5bd(k|424sJIc1pz{6IU#e?qYHO@XAfh;Xi4YYwwIOK9Z>y~hv;=B2B8(Hid~ef( zhKd}7{7kI+^+nD=>qFqL*X5%5<)R9=#8!aqVl}9~We&oyg*-wmjI9yBvs_E~I3w~k zK42`Ro98fv0g>{H2@$7u^gf^T(ppNWIL`xAQB!qW>vqB<#!8}hwp@oBea?k-P|(%X z_(0mGNwz35Crof-lkqSiXw8ctit3x-_8aRu2t%vG91NL!IU)cSsXRht&IsAoCVx$! z=FxbrklJ)=N9JG(Td>1{kNzrQXx-M^LmflJuMxr(i=d_V34$(+h3X@lA1n+KyC>%~ zWMck;Fe#CmG=m_5uK}Cf*1sg&tq~k;rGp5RbS3_hkXmkx)-SI9$8{_QiO9Sq5Ukr9 zN+C*jgbn(#GguSan@QlfQPcPCxio5Vr4JE zM$GbRthS96O}exB7ivXnxNmEqHq`Q!AI`)O>I68TVHHM*FwXLz3*BcH(}btsO79q3 zoeP^DY&<|!lKfZ`@N~--LK4P*cbT z!_ydSKuPzER;tuLu6bFq)apQ}C!yxLz&EzPbixjX$oB+X3e}AIZRYBSOrk0vOOL?fhKJawnzx@EvC>iq) z+pd0N0@0YUBV!wtf9gNBmbM!ae!0xV4P$FvyJff!(MJqg?`G_B{W+pR$Q)&1&@|TE zPAKd-qNv&N!W~2r*M3~Q@OeUiGM)i;Nlops0&F58_|2GBnsgEJ2@@w;VUxkXU{1p@ z58W8ZbhZ#0&L_$fXwx102#FaPMe44$nBWUy;js&T$sCq33w|jf<0OqN_}k}jja~4| z37Zz%CX6oL{Z`K59U<9Cs5tfOYnSe1Tkj?`9DB5*@w?G`2oJXs#T(1^y@ZGx5*7(# zDcd!NW&AePPxv_9>O=Vy!Q&L9!*MMA-w1_i9+je?zNt09_&zhIx%e>QF9{zfD0IV? z^;3kItyqQ$)ELv_yF?Nv6U9JS@%;7A5h~6UcKRDb=00g)4(~aq*x#E&GH1X3eIm)K zzyi`#Uk}w{PMC{?XV%{5;RF7!*Dal&l(smGg|WszLbM;lHbU!b+z|{s_-90lRXD2p ztsfrQ96#fIt>l|1$SV)wfW79|n`diAA4u4&zoB&l^(oGxjQRRBAtZgV{B+;0AL3?; zUP%3P;SXUjdV!)T{ZPEMc5_vEyj5Uija6@)WJvHdH`g2c>W!aE`d93HV<4Zs@WHkC z>d`|p8_5#q9O$^rI0)ki88>IpZj5XG7iwF&uay?B{t8{heh2eAGS2|&2z)L0i-z4c#DAOvJE=t5t8))El= zdLq<4)jEQ>bqIm=$~Ef=oRAxB>TmY!SqZvm)B0F_KrP2fM7K?v+CL=tf*5jgG$blJ zG@jIJF)?Bt;|8=!XBMHFf=~-PmB7k}8*)DV&YE7JAb@V3Bv(}A>j42m>B3+Od^IwE zZGXJFx<+NU>dLBcjcggKsu9 z*1DrL4Dfx=-Sdmu1yOM1*r}CReyi-U2kP8lSxrY%ZLRtKmd!1}<~u(8b0wD7Hgv`hu<7%Dt<;f&lVXvn?_nR!0v2KKIPl+UkH* zu{Y4bj%lj{w#xmiL?KhaN`u5~A$rfPPNemHxT?V(d-ts_!PiP~Z$opa{qKMLzN1bq z4fz@g)bz>+LY>M8_38S-o!YCT^d=ka@>1?r9 zuZgqhJZp8<0-V~Hm*TFzey1~fZ|E_O`>OnJc@J>h<+QA%c&hE≀H~1;tUFVl*ww zh8y1GkO4f9WXaeMd9!4|%5nBiz(3c4JR>Z^wi>Xc12SiA^brNa0;f&ZMh&V#B^Fth$@Fn5P z`!SyBxGf?iTYYf^?RMmZ`JEjsEjqA*_25T-g3*ck1kEhjcJ$EL*A;B<9>7Kd%**o z*)HpwiAB2~e*eO)2bZQ9b@gClC$?(1SHMWAF)$h5_bzvcTfRtdVtz7kb3Eht+sBrz zxEWP0b6(L?F)%NA=~J6I_4UUe%MdZ2YbB_P%dmO$jUGyOav4?+xeMequKH<9j%4FF z`LUU$w;FQKBXQ%7A71=2w>(9cWi|n14L^GM;Ni8fCyu)qQ66=d^_!*^M04MJDB-IS z<;7vaBKOd@2cP)#EzAQ4;*h`NxU{>ze))<16@S9#t|{WUC%H9ISGo)HEykJpQH;3L z0L{f%uh#=W)Oj7n%yb)Zwqbx6YL(-@&T-<>#MpQd-VV<+pnFeoFsx`C8G%2&EY_S& zqcC>c=={`-u zh!~0%$GB0?B<_a}#WIhMI=J4+8>3!}QU7g*8eK@2a9rbpB^m=5s#wZ#stZ!|no@jn zJ}EGHXi|_Vp?jYu0e1);FZMG`<8jV?;O?+Q^T#XS{&ajk1Hx4d6Dzqx4^P9H=+CthGG#g5ruc63k z7j%(D?CnC_Xvi6oey0k`xLwMyvYWJEojaXjxf?JUwonDd%dT`LNa$)-LV3Y%(gt}p z*yJ}j?zT=_mMaFzJg<%_=(It`5mUzW`DBc}=MFKKkeFq*I5DLqHsjOkvl4*R_tPy*KX00fdM@2s5U8(bz{BZ$K_1v_m62IR85JUqnX+EWQetyRqossvDrySrhB@JH*5g&schOCE} zfg1E#<-xbgK66uZjz18A zU>ixW#c^^WoWfaSTObiJHCgni$@=F0fgZ`k#%W7a)0bMo_zq(H!JKJ#&180SIVveIgA%Aq$E2L3O zHCf->bw+Oyf$=6{ToT7PZaK{-nX~?LjH73GV4P2kAN_d7ONnuw$@u1W7yG;%SQirO zrE#peSY<3DWo$HAFT3er#+)sJvzIuxAqa}`&~fTm9$CB1;K7xifV0VMjd~~!!&1pT z`^?r;n6>C;f`{|yJ~&wmhrjbY_c)g!;7}j67D^d>VF5CW$hkE)7y3hfl%(0wj2^mN zOvgjD*nsMMLHC$c{T~?AtT?KGdg_YnXq*l+NrxR~FL1bhlLeG?$a)4177^bxL_dZG z;lUoe5j!|55T6zn0KDirTIe-fxOwJ`&u z^!WuevV|I1dy_^;IVa3UKKmaiC)!A4t?*F;rEv|!P3IMSdR)}OrGMPQ0YL^#K^E(R z%--qdMuV^KfAf!vxknLv9gghh4pZ<5H9kYp+&RYT@XWI1H)o~Wo$fxNujh$v(br?S z61VdPxBEY>(5;)IdVgJO5yyR#`_eMQL(LJjpqMCeyTv#&2lMBMxf^pbR_3@N=hLnE z^>~0Ey-=y$%VsYOvz^llGuF7R==Z3RC*si7t2TY0DGVPaT(i{KM@(lC#1+0AZAxCLQqAa_2!A0WuMT8 zG@fVFG=jwRUtk(BOwD}-m(CZ_l-*8~E7fFZjNvSXO$dA0j3PKYq{0{mh&kfw7~b3x zmF-m+2{gQ&=2W)H+i=?Pyz$^CyZ0D-djrfHi20py%xUcOw}HS}BB|GyoQ_aUzb;A0%8rPKNZrCHXE0!v{UZ=eYUMFMG^-{J4 z&{%yV#s=sPW4m$($Hnfsa9o1pdG-`57`41^%6avvW6Dtl!giU$8mANS%9&+~)g~4P#_=U$w-#HkS&Ah-5q`53ONUCs|H%gGsexs)8;Bbiv~>p`+XetCb>gzw#*+DL z1U@F_>>Yi%mzrAi^g}USi5=yKn9Kf;Skls?KQu(Un_W7~ShI^|$-=zJo3fm<6Z;~u zTo5;avv*=v)o|DInwxpYm+S)~?je3ywPJdWQ#x~JS3-WzZStE}kKh;I>D|O}VI0R8 z3EAmKn#oaPulNNYV$aS)8hTleyEo(T<6QMK{IdD)q;d4;%8-d>x{wp;Sp35oVO%KK zW#O$7H)iGbbK;axFlpfxiJP!;4{_3zP|U5gOE})fi95GKVJ1u};CQZt!_5FD(Ze$< z5@L)3xKbHA3=^kDpH2fxb74s^P}N&HEH1air9XauhT*}`mc%Vls10`LfU=AQi^}?e z2m^endW+lQN}gLY>ia;aa-gfUxKiiR#V&!M+z!gkXox$w&sx-H!Rae*m>t@{4Jm0- zWs|?Pc`?CXEs~R_@|O?%N{_8#J(=mGp-k z&hlJJyJT?-SPsmJ^fH@yI*&2B+Amq2e%i9nM7s=h@^9sqL@hwtm*-_&%~-lkt0Xo_IrUlV&ZOz;v!FXfar@p5FIs%w4&H)gcG7-V2_zt zrHJ%T!-R?l%YZs=q7q=7=7A%StNcLrn@Gh#R#LsrE}%{rs9Z<9qXhoyD6`p_yYcxdism`fXMlxuU z-~~JLQ41o_@)-JziJm*LIvBxF3_5)r;$DIK*(L%F@`*EB2(ty?-K3hv=fZ>f=P=P`DSlhiEcD)fYDtt=vLTu zUtt(5oWULa7}?7v+EGL|s0_xf-yMdl@%LT(Ogrogj*w9cO}M zB@-r*ew<^@PxjV1JNy$lH%|75bkZbM3!}FvL@pV3BgkZ@Oth?{aoa)UQgKUx>RJ-? zv%x$iI)z1U|1@((N7N%Rj>&40CPql3Gg{=nsMk5F9;G^1BNdZAZjBVVhjhYY>L{8f zLVJWT*2!Q@bizKhk2vy(EKEW*X4Z?`DxI!h?T?W**`$?qS~vlb>(nVvs3&45Qw>UU zo#^DbG~B*o3q_iNTWK@4t!H^|+H14qS)aCK7`R;7^gyVYfg2JQcLokH=fh^HOc?g?G`QKnyGwa7E5t2dD@*;0P^gjD1aWe;029>bEc zku4dyxm>Pm_F)Iju)pt|y3Fio4dZoqCU>q|nPLR%O@dntZNwhRV4B=>UM7RvXp+sI zCLmF8j6uEh7&LK;Jts58dJSBjq(?r8XE=@Zm-=X~lRlHm%Hky=Qs)pAn?!Lo2-2ld zQdnSFge=wqLAESP2K%ct$ztsfRLi4OEQip?q>Nf0=vK_3+hx${i~SShd{LDo7qgMO zhw}(NY1uDVF6EoK=?q~7mO(t;NKgGh342B@h>=+BCuV@scZKZPxYgr81x%DwL=Ozo z6B()nT?m@+1T*BSW>0geRv;Tpq|-#=L0@{12(=$}gJ7RYkWduen*-U|1!S9vyans7 z{%~_VQ9p>4h-nZ6Y6GDT6CD?M$X;%0oR!e;!S$sCVm z;vNHPr4KTGXG{dXy90!GKZnSA7!2WIhvvgw)^X=dT+)0ec*JB4<3DWD-TE=-aYX82 zq$4J&8tph?{S15Fz~;qo6?Kn&EWwT0Z#u3ECaG1QnJSJSm}3YgfXJk}WKzxYTo0u) z+G~oHSi*N*HVIY30BJ&l=MqNOkkG)mA_6k$5@Jmmgqe(RQb{9*m|Ry(LOJ4ZRBn&% zF#QRBVkbUr88fN0ZH+MsQMpdtXSOA@5hde|sK}&FoX0hwj_yI*6WU|yjGJ}rW*yc+ z^z9Mdk#;0>#E?&zg6_bA7w`Z3R|eoX7~ ze9x6~f@~aVn4ib8L{Bx$k7QY54mM1fA*p_$&dGD1Oy&65%(=*2EAyLM5k8E^$34P2 zmy;#t?!cT^?IKL?j^y+VHDdm)hRU}fh0NhJ5&u8G3S2rKA-XUVs|Le#*pxQ6_oPeP zdsfa~FI6&|$hXM4f_Ofxrq9GqFuO({$RxMe<5!ih48VA7c4%r=s*{+E%M zs`WKy?^YluRnRCUJ3L7$9E<1tpUTpw472cBcu*H$XrsmMDdbY%<@l zu0!xr8s@^Aw*0x6`Eplbrbv)5u3`AcWhQ``d0gQQ7uaVYMon`I3U$97S+tU3*l8Fm_KHN;;~H7PhotG(Lz(Z~ z7U2>uk_D;zYSQ@|?LzmPT(8u9HmSEre#ae4(S6m?E3x)=cE9r5@E`kb&pdG=eEqgx z^=-{u5Pm!SDw7Qhz=B>e6PHE3SPS|pGGznPSC}a?k^^Vk+~K!liXr}cmhj8nucSxx z{x0->sCWiLeLdWvySM zOj*L4#OD)qJ#7-h&2rZ?*7HxcSzmI&u1$Ch#eS^|1Vr&;gikZGZA^iUZ65mzaPO#Ka-6#t#dkLU2) z?yGXI_x13ux4YjFdw0DNUo-qNn4tk;?0sE~N8Wb!o~o*vUf13cs2uLZP?mXpnME$| z{7xTL%(CuRZqRsQAYqIL(J!M@pDPmE9%4fp=4!k57jkX&=ESS6(DnAVK?+MOovkOD zi=TLBrNQ6_lTazEWSHQsCgMgs!Z0h{6|f3b_vl`$Y_`X|bf|JBeEoioY{W3tNalXd zgooG7{KX;ks`r`iV0IXEhYlV=!TEyqSzrzw{3;5s9z=x6S;9Yywd3%O-j|-BYOld# zz;*2nzuMU`!_9TAuR@(wyIux2ypXhm&2Mx1&@69T@mc{b6OVS?g^S3&Rv?p1U3X>D zso7Pk1s&R`jFT+pj2Ms@^&KP$^y1Gu|M?@M3kQDnh|S0nJ)HPcAmc(V_-%OYr%{;s z8p2^tM}Ctb6HTZ7Erv!QOz5)Peub$8uT~1bz++ml#(K_%vb%53)Tg3>OpHOQ3@Lt( ze}}obd)U%KgVbC6QTT)K_0C6ja?YNgK&J3PQvF|1FS}oQ7Fn*%Wek6KQ%&zd0y$qe z7+EPk@w_D*(`l9sZ`x|{YVX)F!Z9erHyanPt2FG@O2cUXAF)y{nEBcvv=z09TgWQd ze>35OTd_Rpwushr2Av%;7gABvHS^VrsHx|YENtbg+VvBSi!Pp%G&DWG3f zNY@*uWmkh??X2v6<=sPCCK|sQ?qLSqc@~m(?uV`q{E}oor(4QtlBef==Yhxdj>N?g ze+uSNK=?){4RdPvwc3|n&?hO3QH9MLdU&lc)3WpX=w5xM6>)`%vI4odcck0SVlhdweCN8}Lx+g`&f9wrJx&>h>&?F%d&5o_vCCg)HXhoo zHy&XgX3h5MOj)zNOoZFs>OD*X^&V!Tn9Ze!SzEn#t_!oadhfiQD5?G4!_+w3^v=rg zB>Cyu?jJr12u<{VfK%!wMl)Yyz0{*9UE@7x+vHbm+}KL$WRbX0gt`COqR?jRZur~o ztBUi{-+@WaPM|}p##CH#Y#<3O&H3OIW@FC{U}>uCrE?|2&Fh@UE(2wF2xrfmD3}X| z> zvzSfBg_c1M%U-sW7snU=5JKYjmnINu;;ApzpxnAXEZTKC!a5t2B+ zdiKCs=Yau?rt<|o+_bdVvC`jyR6ceLa4;;=#=c_aF!L863}>BS`8UGdk@bv4(a|ED zhxoa|Ozq(cL;-Xs>7Bb6xBpW-TwyU2%;bk{VCDuh#Np^K^WYSQW5e}9_+sp0kD&Fo zvz2@Q8niVtD{Fewv5FYMQ=j+U(sI@Zxa@zw6s~;t-+u|14*5;z51(T;lKN^l%K$S- zLFNzWNAEd>^N4TBOvx=pVl>RP|2Rf_EuV$jy6iW~!@s2P+K@~i-d^tw68%r3qI*Aj zwUY^B5{B;*v8w12n;{`vXc#CW(4$}xrll#4zZo=sp$b8cJ~NEImKz2-h)j8Dob%|}?uTSt#7yT4SkvCrmpqyP6!Mkt(1oSFQrtSv z7ALkyV@<*m@v$)xZBYk5!We|VMyvgcbV9E4)F;&!UZya9Clb1Jz4N7iM$23%6dN1B zjn;I&M8P5#`huR}olm^nk22T2jtgx*@T)c_;>fcoZ(wm`X!Txt@ObZ&fEaR@GIAUr zzPYytP^J^TNBZcYvj`Zd^{_|;9O5wZzgS^Dwl>wF=z#XG<81$m9V{j=YpI*U1m_Ez z_Jb>ey!6;T6}GsGFuOEEP-CkaV{eG(Voxb3;=V}!mZ|a8g8h8l1S)tq{P(ed@b%vB zy#mpCpP_g&EFcEzJxD=k_~rS-=$Ba(O&!rK^-xkKM*pR=;L$S^Qo^sHZ3@F7v#5K{ z!tRGNMJ|-kcaVsfSbaqg>(_(SHp@C+NXm?w357e6;JNCa-Ctzk^AAAGg%WY-!2;+X zp)~Wg7x7D`NZQ1S%mO&%0-bx$*$y>Y!Vrcx=?G9m{_Bvt=;81tx##R7cfKZOQv4MD zGE>IZOc6SzD2iMGMNx0{;y8i*YT=7__5AAL1qHXw!21{-!65`X{qE+w+TQ7Y#YHg? z+3Ns;Wa4KoeGFU{z7)P*+x^nFfuIoK?;+yB?;t<(An=Ev6XglYy94 z%>u*d@XsAQfC_DC&KI6Mgbc&mFH_O;)|jes`l3C{Suip+@;vffD7nvj9j6=b(lC&>nt2lO0@qC&jZcTY*SpWs zo{Q}V!o}})55Yyt(NWDrFWv#!yF_MC8?-lQIf)EE?Gg|nv~VFA4HboEb~Mw;lfK1g z=XE<_7ub`*9)&$O|3QsJ<*}2als#TK~M ziOBqC+4k_O*v$;X9vOMKlXPdC0KOb4(JtF4F*%IM^||kz1$AhBxSMLxekMdx>5eAc zO-PunE&OvZ|#T71`*@y8;DcS-Y|8JwWi(C3@izZtf^uLDJNG!?Hege2;4KIsWQl+OX znoCPVHcd*mWJn8em62SQNw8;X~>h_@^FpS z+j=S^k>0$xew^Ogftv&k>1{ovn?l|Kn5j1fc{@_9-m+1itv5el9Y|eBJ|s6%GSWt* zN~9{J08$XC0Vxwrp*g#ZZsJ;nl#SGmbPVa7Z8bg&f#E>PL+U`G%aM3KQ`R;Dyb+`1!6O@(iKdmvFVKA8>tpZ*mST*j4;(JTg5t(8>Y|pKb1hZD{K6fK4CTAFD3GA*2R3gb*VNYHS!(Sg?zh^#18^~X9eFO zX#CdY`ehm4B`nm&rF_epJP)oI~KqE=QQE??-l8DwfA-jM-E^2(KBbv?RdxbQ5w?D!3)RMv<6^LE~%OoU~FIF75Zqi0=i?wUE zOyPvM3F%2~g5|%fO@SY2I`pj0A&K9=7`aSVdT6z^N2GT2=3)@{0l!G6xm~l%oh;k3 zK}(g_X<2d#-!H7gn{+AsDRC9QHC@L#w2ks2zEjnFxD1G2=AT>wJ6H@m*bG8-(}r`v;m;l!RwG+S}%yG3(urriCT#)2EgiKSHHXvumueLO^kL5 zUY}cnk_t9ZvDKlSkf~Q1|1C`$kW005GDa+g&*L5Z37DuCgNac)FR$Q_SslDx)U-=z z@v^*}|Is?(q>v6Tyo%~0zf9+|#Bxc_<@f3$eQSYsP2K|og%Ma&v?E5CBNma1s{y8B@;E~FHsMf??UA-@5Jr`(~fQPTPK0Bz(Qnn#g& z53g#)%2T|TU!nPxT&+R57v{4Xb8t0(T3o^p2z!Z@)}?H~e3O z7W3LkFuf+O;N7ZA8-%+ZR@Q2lm1WvBWsx?CWK|vfs7=+}>K(jaS;80dOZhSgkftuw zvQ>vATZI)$m(Y1;CC$zszARl422v{V>fExEZhkp>vm7-O`33S?K9k=rC4zpD zR0zmoF-1(2Bnf4HF{X1OzeINNiLy(T_{F@)uS4B+yqK6MF6Gzqt3joTx#C)Jl`Qg^ zu0$+h4lxOoDd3mH%VEs4oFvp-#%r*aByka1NyM)TT3KBSNILqN zDBXkdLU3Ot=JF2kPt;U#HB^-dnSr6U_!Xerf>NTW$qvy02x^KBNrD6^`~qna&-1G# z5x?skBIFnO4g3aC=0#bB1W9lNiDEkOk`{q8)y{=GS&23@V3Qm!^d$-2M`E%p;8%;Q zwM1}Tfwt}dZaI4CLhoesTEl zc@bi@BylyrgqI}M)r>LO%iqnH@c1+pOLqXi2zIH#DQb>%`jr=xk|bq9Kj0;0iW?wNx(0oyJo>VP z;g^b=#MLART3d#8C4Pk}f){$qr=yc8$fbY}v@S|~F7HT8Qf09akPWbv6|kT?`4y52 zHn9g2-l6fJNklIeV-%ODx07tp9k^grT(~ZRJQz2O9_)f&i9SJCV3N=dY|GGi(sU;5 z)d7lhwBUdq2~XCs2=={1UX3<1KE)yPOC-^?67piCu=*_mbg8%jW3Ys%#f4ZxG_eG$ z#bQx}w-a9g#qn~73Y}!SdRM=(kM)G$fx*A zLaLY}_KIF>6}?jL5(oG-LW8hgJYqd+?XdUTv3FLvLB2;A6Q+bT1>c5{@XeVu%DCg2 zl@qxk-lvQc>>Te=CLP#aC*hlFeZq0UDxMb4h^f|7YI5SnM0`X-<}UD702KSA6_Q`# zr>uB(?=mFJlFmu(wp6)YnNZwz3-K5Q_?mU2G$I|dWiZ4VyB&Syu3@Y!`z_2K3BH;nm}5Z;O&x#?^p0gTsiJSPMZ=Y`SpTNC>E{=WuhG> z!A8tb?~ z0@;PjVxM!^+2Fe5!WLTM(u5;IkL<_CF`#WBP2H$^)c%AM32UJ2DIrU!5;CZplsRpE zg<#pjxb0QyZnltW<0LVMK{7BUxNPBd;*%qs7QEtwbiwX%{*;qUz&P3y^MIYecReMZ z%K>XSiCZHawO+Q8_R|0#kcOmTX-MD_r_dkL+ezz`lxAzQ_tzP#Rg;UmEVzv<^ zr>q&0Dsk(D^|mTofF}tz3VqVQ>X{=_5DPV69$^e)i#i^lkDwuq=Qax0NnEdRLA)mR zSpCi(w;!P!sC`18wVkMa!1ka8hsYr#_YB;ik$|#L}Kjz&jHCsv%Ihugi2zEl~7tR5;K;-&`qsj!qP6{UkJA_>* zawmi}>OMA1Cxt4l&B$dSDg@mr#7R{+I9SAUCxv!~J0*Cu4%YcoLMqV=2n5PTEYF=1 z-XI|dgf{JGq@DpGk0?$vNH!cQHz44oR1ybakr&X_B_elP@QH6ytwCW(dy8rf3LA;$ z41;9D!E=Mc+eC3jxTO7pD9#8zq8MV3Y-uUaoe?h5oEs9(3B$sOFfMq+4E0*VxINqP zOR6y>^iqv;$N(lS*MvAH93#XqGT9iA3T$aRaX(it25gL?z$`yqs?lE;tolqyC{8buvNyrh~ILb!%MunsDm~fg$_KI*^UQYvcg+Xylz;mNQjs&-P1tzyn z!lhCiv(- zQY|C8Nnt{mfIV#zxd~xVsUjHsrJ#UuzQ|1q$I**IiG$m9OhO4oJZFI)9uQ@?OOYI` z&z&u8ad1{KC|<*C9Fp2>$#Np|gz$V>Vz!uJ?UL}peOs4Y1+I7E)pxN0*1Q#;co6p? zQ-TjTh;87yhUR>lnCi|ZF^~~yaVo_(8pJl|n6Q!18RD4iC3FS|E(5(C&Qsha9&@x4 zGz)NQr9$E|M5`KfGoMUS921X=gW`~Q2_ts}UOb6J%o5YA`y{WeLGDxf;ncg-)P!Ti zCmWp3gU=3;%M$(Wa|Fu)G#To+JCVy4PbCZ`TuR8+inXBD;HYwCBPQi?L=RjHw_ZFC zfqU3&@jyt_^@<*G$l*aqzu zMzBgib5KDRxiYXnN3dODmDmG16&?&sh6R|mA40&Z`cXblVr_}h;N|vcITio%T?v_xc%;+J1y~jQp5$Z*L@E0;*@YnJmNk{VqFpmSS&5! zxeH=3K`sNPfD!I;f=bOM*eIaG(BV> z5@r&(OOSOX&rQIk0Wt;HH9%JJ+$6>q6J<(NtjX3iYliid)h}6Wic+OqCQ^%aO0+fL|ZoqdbRzIrWj`+x$ryheI z8zC8)&K*2QmrZ#83733)iv*WKd{_i^DVoW$V%~yl5vHhh4KiC0`GDk3%tKtZ@?0J+ zB|NvrdVLRguD4#lPruZ#OBqGDUTZ+OGusv(4`|G5t44a1y3Z!9I zug%A_Qq2Cs?xvfjVfO4r3SekX20n4(c7`bfgB5?HEE(oN?0A#wvqzTxvarQPP z1Z|gDxxp5+irDK>?*`DTAzQY+n3iR2X(fE+o8_;3`wud%`Ss^m6=bnA&@0GUAnQ?5bwE2j`(OeO3}^z)ZVq%AhM!YV%KJmadQ#cGw@PwjFQyIGLg0i~W- zlCf($nQ$iILPD{-4ZFtyQvETdnDw?_*-IjvRMMP&9=DSzJKz|1q&e>=2~R5ZWHKj} z5yyE)V>H_w&5j9O#PGDj*1{3ipf6!e+vON`TyiL`GS_jYnSRpDFcyO=ibXv^eHl^c z`y?mz>^QQgs9PgI4^ZYjAZG}92@tC~L^J;qs*Gc~u&Dd2JcPw(e1Iym@3V?9BOPN^ zX+D&(?pf4fV#QUdBh-Adx(n;sarHa_lU1*Ji5x&0wk2NGr|whR)XU^hGVrOzD%GzB z)dmJ+>)J+qU~Ejy!9KSio7ySIQRhjhEJ%I#s($_oWqj&IlByE5ELw)ElFj!@HN$n0 z#H#{0OS3xyjw~FVFhH^^%Qft}oC?o)$~9M>AxMH%DLpsshd(4^a^(gD=~ zyl;RSYE!Q;rH+w)PN}p_9%q0PB8|*tbrgH@lj24pQV8rl_9WiwcgjM1$E$v&LR!pmrD7ar zO8WzqBJ10LW^vdZZbzzPjl<`#IIYeMr-$+J5}zS$SR2vaq?*H8C)GrW+|7vgD9>2hPy9Wz;rM;50I;v&Zvr&Yx+N%g~Mau%f#{j#il`&Mb*x%M* z8afB6Uui!;?M-S2^~)js@|b>kT)%vo)HJE(*bnRFuj=JW`x9gzB#g)YB*7@acw03x zIA}r63laR(e9-Pj@4rqQg7&9~I%uD?2S~j^`w@Fk&-B?F^i02fAN7Kc!TRijSR&8a z+hk1IcF-QRp8}|zigbcXyZk}>)5Q6Ry^Bo~qUd5e>mha*>{sl4l;PZtBXk|N+Z{)# z{-oU;8TL6Hi=&TCb-Uvm#Ln*cCS6h;$64hyj()mkqaQ~Y*&4@1nok}_rDMq9cAaD` zo}yom020g~)8gP7aZZ|< zDqUU9BwGL0IJ;b9l z0aiIkmCLYu)krM?my6D_0&vbFu4`_bV2G?oy zDu z+I1bJ?1*a@_7%q|dmbaw=I&Q8B`&zuLwQ7Wf{K@1cDLJ|>`rwL;qDw(NsJJGtJgiq4mN!5Wn|g=+(96RaASw^r2)7< z``8iAQTG{!A0qH2_o(}vnHgd5^HjWsJ^BSRbIHt%GJ-2qv?MBtV`gTY!6&GgnwXY2 z#flac#hk=EY=_e^ee-ZmvkM0_ib~dKC*($el5ui@e|G^LOQl>{Vio#%{Sow|A@Tad zxO60Duo_uZqYn(Sso0&3vDfiOp3e zt`AHfLF$)E@yUGbq%`Ry&aY2MuS}nknh7)j&}o1Mq=VA~(u>%j{d9UzYTg9iXQajQ zIcbS>MrxiuCq0Yw9US=ob{Y7e$2rFZX(@JbOVta~ccw2RotKXB_`&0K7w`jAKd+vb z#`x(A^mCbh#-+2(Tyy?}v{0Iq7Rr-g?6#!}aT%EQy^ zZP3(8&STT0jW$i*Xj?w*u|0|po^B$r&z2$=+ft-5D!RBzym3`&TRUAvm0a8|6#X`y z-(}k{?MDg_dl%PWlcfe*{&a)w5bk>Ikry=c9kxYsmu->SWvk++J8VH=`k1XV9f*G0 zV(GYTv3$a|SnapHFn!$ihv^eY=WLzJxa-`oZIL!&TO?hwJ&*7%S(qNSO$yT^^fO8_ za2!G>4uKPY#kOdA4Cxw4iu;TJkK1lcPv}L&NZ9?nIXz{g&!1lBEOHV~G?HXRPEsxM z{nJ(?MQ)z9$PWSj5a17~R{0Nr{Q)=+4*>2wTIF3LKtcLBDXNNmS_F1N1a?9McApi9 z4lB5vwocHeIPfna$SKol@~Y`9 z9h{9?IjEH*ub9r3w@l~h;57iR2Y9_)I=x1IczUC}34P@d#PD7@bJ{1L-2|S+a-viw zC(66z+qqrx*6CtU7R!gFV)>7_=JCi(@Y7}TE@9d)e`6U;E+8+Kg7RXuL0&8e<@)J> z+&SGYKPxrJ&*EB)A=4YeV$S!-j_F=`lZ$iZACVVGN94oP$8_nAL%M!QcU;b&?ngR7 zm0a9OS&~koYXfqp4CzkGD)x9Pe@0%w4a&==PosNhkj@eHN^V$A!6q(6I$0xRQK)N7-Xo34Pfd@?A0c7qFe;Dp(|D|fX63lNRGN^N%H#6E=?SDMU2rS>j#Y6? zD+(+W4`V60QnHdOCM%n!QwyBnF%P%rh`Zg${teAKE;81!49ci@$%FAlvDh4m(si!E~Q6Vf<5$7>A3Qv=^h1! zc3f$7)h4d)RbvElAFLQv1`+$R8^Bx)&0}S>X)a}bZWSD Z4o)5aWXFQ(ETn8T9X#-W1%5gI{{;BmA}s&_ literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXItem.dcu b/official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXItem.dcu new file mode 100644 index 0000000000000000000000000000000000000000..1127a39d56ec1d74a58f88271d86f9c5b033b894 GIT binary patch literal 333802 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 #Xoh;!B-sCV{?N;FZ-r`L)aID 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

4Mbh1+$%(MvdvEuZ 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�%1e41xRw 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 L!(npvMuz`CGc5b; literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXLibDsgn_d12.dcu b/official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXLibDsgn_d12.dcu new file mode 100644 index 0000000000000000000000000000000000000000..a88ee69551d153800696aad7035b52efec3f0d33 GIT binary patch literal 4942 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 *#%YQh(iBswDXiedGMBP}Kh2;T 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 nl*+0pIXEBCdY-_Hpxl9yPAM}%j!QV}fkX+ChJ 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

jnABLlkX&zLplrf~XP;kvIFPIi44`>A! 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%0ApArNBk2P5#OxDR}^O0{|?aQE3T{uvF%HR z6`)QUq`iEeMXyq$U5HLq#^rH_=~6Lv)9IjRbA-Ff8K7GQxYN#1ZO;*gt~p7NwJHeb zstwrzV2hhk38?^)Z_xyO@qjDqQS_>6jLo=}67kYumNKfwJJjJG*Xa&Rj&M2GP22}m zh&R*u6#=+0#%i;QD}-T4J?%rVZdcaB`?H1>*aDH?h5D>TD7xg#a%W@lNTpyn0*%Uk zd56IQxxbJ8BZUxye|CC+=X7 zW`DB*eo%pPd-7T+x9J1Yd}dCr!<@`f%n6T`4_TT#@l&CQ&0fd z%G}g8j;ersZd_5mi1gIBshS>BBdPJLcNrtv)yRk+SE3EI*z0z)T6{u@3ewIc_TEkb zXSF4!L}U*C;L7M2Wfv@AL=)zeiYd&bC6sy*gCFuAV)YNhH8p`#oxz0w)Q=KvuTFc` z{;V?!lowF0<$%~UBrRp-_q>qhTw<@u8k4_JAyn9m8~2g@IoLf<>KSJQaB!l+jaFtp z9RZjRXB`N3R)djINIhi$U>VL2P~$$Q0u2f+TE!K5UX80L0ujELVXhKr&YKyTiz<|7 z%x)RaYf4DXEMq?r4muj`OS1OLGb${f5ad0Md7h@U)i@N7rOXZoi&4TR?s={zTq6=@ zZy(@qegZ@c0&+!z_?pyZ6yrt$B2^3ARSoA&!Ljuwf~^8O6ZBzf=s= z(JV-SLx|7S;-#k6IGxZY%JNY}ZUnuo4wk;V^HX1mJRGA=TtE z4dNu78oFV^94w@svRuPhIYzN(myfaNIa;(Ubq55|*y|-e^EFUW=G7R29`TX=3TjYl zT&a7<2zRNF+E$H*^8lB!HcYT)FTs{*Fly2oOs%7ryBKPzhAIYXl4^fB#IUs*mKv@Z ztC1aG&_)fK4=7(RCDH6GwpojnC>BSAsNP);u*eoI(uPQFhZX_K8DNzLumYfLv!duA zi|*2*^AJsYr6_JGi|f|nyyylp8H>wyA9K+(pa(!rd3@cP$;x0M4TdWYbeN`$a)t_P zsA8bZdebQe88)h6i_)+f*`*9Rph3ym(RJL+VmE8C4#b+9@a0hk8P*_vGsM)4FOM0y33&JP2-#p1cJ2a5ZxC%!YyX6dnjA@Vp!wMQ9+?MkU zu~S1hQ&znQHD;M$s9hQgbRaxmsUpO(tRgDyJt|c}? z%@J0fVvfpT9gsQ#nBZ=b1~3dB&T|Jzi=qm{J6=$(?qXUxrp3C|u>(yYu*F>(KK$_* zgB{mlX$KRKi^~^1WXn!yC{Oy{e1Zj-2|cO7+~8&2We&-1UCU6XG?X{f{@v~5cAR6# z(;70L%^K5mJIVg#77vy487-Pt)8R=`+!J9Y@wgV};d5z50}K}B*kDXF&Khy4d(MHI zgZOKVgoEtfW+KUaNjN|nkljR)6mo<|IIf&-!Bb&ZHCUeNG~@^}2j&Oz z13Gd-LlzhfkS3!&FiPw(!nvj)eFmh#4ryuJfiWe`4J}P!CUc~vC<*LQ^mbEA;mP2O zDLqBv1OZ${T7M|g!N3*eug_gpoZ(E~olJ>Yybt};(qg~lLN9(QL2 zbKzR4krf4o16(x39b=W)t;IXc$FK;phe3QAqySx@x@U2R#Ui{m!767!0~AlPRgl03 z<+H4MmS|{K>JC1F9grs&tW1Ns(>CG}Zl8RU;mS1}W+1kN`lG#=Ak*LF300I}A0@Sm zIU3TVFNv#zAFEyG59fgPY_B1+`c@Yr+O_y_D9?Vr#TmI=8}Nkv51U zkIaYCV(A!*p0<|7F4bajS05d>4LvwD?5;#*G7%fG!H(*GyN=xC*=%r}MLf)Vu zS(lcq(3~tqyaDf0L#l2qRi5g@S%l|#MuJ9rvsMG$6d(hFs28-J(grI}nNrqa-`#>5`&(O!yFh^lV%x8Hcn9C;m2r*MfzywD% zL|*M+&&F6HNtjtWM#M~;hADu{kx&jN5^lDRW4~~;U&k7{0K)QVCaMT(O&Hd&Y+ORu zvvtM@I!`Bi8>Zhh7&}kd66<9%2Yf<`(L+AAX`noHYzab@Iw2WX0+=y)!45I2(lMYj zreSPq9Z(ta=_!@rP7R2&aDzicX^~Ee{lcu9268Qr_J*k+XdVo)i{vQ5Vm$%PyJ=vF z=BSy22GH#~NTIq{18O&1asl{^7?Y4@+ccPi*AMDlmPa}CJvvoD4`|T*wpe^PPFI_g zfXj50!uz0(WUdDl8X@a+B>H{!1btx%VR49T(Y}Nm}447RE8{IXHy_Ht!f_EV7a{U17%G^ozPHut%LRbu_RN) z3Y{VQg=sYnXH#&ihQolUu=&NS$_2F1K9)kJjy12Wv5hCZvIA+m<12^zrHq`}W=aCjm{INC^Wc#smk zKP}ODEm1-1pym`4_MSBC#WXDK1|jSR(y*5_Y`#Lbi>YsY8uE&U6bZ=*Zb*Y&)nE`5 zH%PMKPcJd=O~X!TSX2xJtEjCn4SY=lO9W<^U7mS8Bq52hu!sU^tZ zw}VB$o&qK^>uuynQm2yUwF5h7!scpN)n^AJu0z-_%+hHv#bXC5k%qEsD9vF9ZYT}s z)^H|w9oQ{87WTrY;U;m`kz&M@BA}(n=&A#Mua1YRN;G^XM;-7F>2UT76M9;b%x*do z-ItcATusECh7yZUY#Pt{zwEt#OnXUoCwjTQzW#x)@vm!a-~u+-V8DR+;!b zrnfz6cg8dA+3{$Y9e0|UxyjJ|rKjC$MhVa?PWH0Zl0@SzIb)hfK@7Ef_p?0_9jvDji*e_W!nU%CIMY1eCZQF_gLvjwvD!4qg#^) zd12{TwoTL3q#>DGweAanBHpIZzkGEQ0|oF=pb|GxSH~VeC4fraKwVw`pj>I7Qa4bz z%G^@QGEfU`l>9PlMXFHik?kv&`YPzsZMx2vuU7RfhdZ!~ZLEcztkb2))~O7ty$KSv zO`=1!-)p(sfmv!}3@^9tM3CgWz%93N62ran_PcoV5&M#fSOGrM#&^Dqn&A#2`8JUI zvnRl2+gK9`jZFmm)(6nv?C8WIuZ^}|IpMFjTcG)m9?-0|X$+ug3;tJ8;Bsvo&IywoV53by zr*=0~_5*{9_J@Tw-U$445Bfo^o6yBJnzG-J?gys~zuCrHpSWK`Qq~#OR-4MkMkX~m z>p)k%>j!z}L)>nY*%{gGTf)RH<0Q}6PMfaD?$+I3B3of(yKOS5X%DV$^b$pmQIy&g zRz`92HY-t;m{{dDm80d=d(4LYV9rU6vDYRv-MnTV8;ulGMWsz+zJ1A>sQ&jC zex$M@t8FTHcIV&0i;G|Uxv#wSCee&8FpB*)1-^%I+baeS+M{h&*g=~JI}=(qyb0Vp zm2OhvVH=07O|!28`R;xM>8^ zKC8jWV`!3(oQdDLWa!g2TF1&rJ|g5FD6C>i*66xv_5Tjm)fiLqWv*XU$m+5eWvCWEUxWMT<$fHfACG5GPcP~MAo)EZH}4V z%oWE*o3!=9^=pQS-dZ;p(n6=KcDuiz{41~BYVRs>y;=@P?JQXIU0E}M`>Q7BTyO3MskKdt-3aSw zVEV90xz@XOgHmo$-t_57PIgVe-NN1S=_yX;(^Fc=N$1^HZOJjT$a;sTO=`aOj#0Z1 ziR_}@?`xB^eO83bvpy7PBU?@>!W9@U*v8?p!LNJ;`#hjF87kC5g;-x4+N4b*)?Q>>-?bs_w%Tm2O)g%wSetI?CS9~mckP|&zh2wH z^D=);@x(S1>q20KO#R+PB!{>BWsM@BxVFso)D^>Gi|%J$qRXrJvKGYuMi;&$_0NCr zC0Hb+aE*?J<|UY63je?VO;gvfd#(|@;{N3?>vz~7{T5f@x21`{5d2(o3`hAL&C6fY zml*a>xu~!!z3>;t7Bt<2(z}%(KWw2B{ITZcFX*cb{VKj5Sdm`& zwf+`1#k;jHzo9>1*w?sK!@l%Z<;R46NV<=b)OZgB-_Xocm2g#9^*;9PNgN-%tKzWZ z=hJl0hQ8|h9-pV9{@uHOA6)!WY= zJ-k}+QnvRh-9@{aya?OOU zTvSvx`J9?JYGyM*feG&Gb{j<=pn)#XGY4-b^PgRxfie3GgdzVi0 zFqQx81zkF;cJ=4)T@ZOl{!uHs@7%YmEB7w{=8l}?codqwQtj(M{l?G26#@_7vnrwF zJg}?J-&=(1%`FM=-j4Iou0FhX?pv-7VxX$;sP8_=JCE$@bNA*#Hi?{VOoE)VW>^2G zd*{979bpVsoX2+c@$awSIUlkf z-+hPWQJj}{^~L+hIs67j4CQ%rZIke6$*a$bNX~{`{nS(V(1BU|OJ)ymTm&SRFori< z0+#RUlAyE0q5jin;QHDpUTvDumhpLKX7(oM*FJ$)&t4_eWv%0xL}r;^$5oR%L~i4b zWrIWg^fQUf#yR{nO}4lC1;@&4O+ z+2c_E$+NP$x?FU9ldj1uC;J>vH879W>edb7CX1{ba6EOH{{)MsQ-g9pnwh>{d*HhN zRU|0~pQYxRrB&hlUGQNIG#EiKcT_)J+2!P`Q$l=8hsXt+FWi57~ zsreuc)k>A*d58MNdyDhLO+jMv&igaZzy8L|o3Pjq@lE3=Xc~@~L;b?N%Xs|K;#Cnp zb)$&KN$QTcvKTj^LE*h za;PudTd}Q+&8>TtjK_v!!J&TTnR)#8>|Eb|JL^b4i=D^*@AhzPkE8dN9E;ClBc9-N zJ(k{sNRFp&DsOiluxgLUYk886rDy3FH<{cJCFWRmJk}@^dyI(XbvsraPj#6+nU}q|nq`(8IfweQ z&mws1el=y!zV!&dcP>eW-@7xpZeM#A^9@BkeqWf0eQIBKsL6Yaeb;jo#3%GTdmQB< zeS`hYtGAxl?0JX!jb~s@L;0qV#P}cVhN{>%98Yz!+-_8gH4h(~r9ZawF4+qXb@>_U zbn6kpJ6S$@5V|p;G*=)knVQ;s=j}~<(V^y_so1;h;$xNh2kUmlzWFSR8m!iCKdM9e zfMXy;e+%|4hx+=xt9bkQOkyKjjod?d@9t^6$Z|E4o`$+qWs z>H$EjbF(Mr9$pW&_ZDpxhx*U&-36GRrnO!EM{`QXZPjO)1X>Q|H(C2eZTrtM`?NB% zyo&AMnF?+_lfp7vZHLcP@Kt7(x5IYiP~W(>+HXESNcr!aoo;wq+8=DKTWinKF`7@d zGYOBa$Bw7^q;7YqYbVj6_2gMLhBqIbq=Mg>nYrF>-b7Zdr_Zvde!2&$WIc1J|LdLl zzg4fRWzs{KK3cP|^KRAvGc36=OHqR|rt@V#uDt{E8=GOlfmi35b>xD!8(*1P?k=Q!#bzJUew4R;yK3U%j)^P0hDolK!yeXKcP8iK+93A#A&xwN_bv>Tda( zW7EO-(x+~`0gKqG>Y2qYKh?o}%>zBCwG^Vf??0Gf-Tuv=dz5}_@oTNqZPHMS?AW5n zPd#k8#r)O_j#vqAA6h)}Q+Hvv7&PCv)U21PmMuQ{sg9uQy#L)((Y7TZKlMQUx{Mps zP|*^UpSrTS&UNi?p=!OCw}kH7;&;7Vi}A==!m|2{_v(kRcDFh_Mc50kh|#0agR2wS zhp&^9^U;IIUHzfiw{Nj|M_sZ+yME^*BO15d0G9rdvU+@TDB(l$G2Sf*z8#?F6PCjDOf zGlO4elD>Zzi%0LzJOK5V)vr+#T+ME8sV^h`{>=2%NqF)t^=I&4>Sx}iZR)}mv%Vz$gR;bjq@R1d|XQ3Zip{=g;lQRdk(5Dx_a?cieKcjvG z`;D%}k7Ryd!9S9Du1l4lIKn5%o3mu}%ec)(g?x0^N_Q+9qU?_pKx8=$@Ql5{U>{0-hMmWm66q< zhr{nb8lHLnE-T%-5|@^;vfBUH2)MeoMo)XuJ--EMMOFih*@M};m^Fu5i)Bh$mDS-p zS>7gmn3Qs|I@)CX;4a3uG@Fpts7^nT?qOV7mvNzqDu3@ODkkNrj(0J?V?uj4FKx)U zqeex{PT!U3mgHB<{5h#0t7CVTaToc+h*Xr}OJ{{N7w>m0z1lYnZmrG3(&k64Q*IS? zE7QY}v_&n)dd;14dwYrvO53tJaA#H8G!FyP4%L^nL-SVTWAZmO+s@#Vc4gIfC)39$ zA9|#cj0=%WHFx%$8}8(*Cu-;EW6g?GmerA_NO!MhKh^Xr(LC;!_I?8Kjis+FRphUA znEsoO?&toG-~XY3|9@&=NsHH`hP#B0s7Y^%0nP!Y0V9Apz%bwjU7yT1@HpU4QRCp9WtN~&YYv;rOjdH`#H0l*``FyJBJJm3Lf0&pKN4Oj(S2CM+C z0`38>1C{|xfF-~x;4a`H;11w1;5J|#a0{@*CUk59S^+3b+9n2h0O50e&0CRwOz*WE#z!gBZUFgUH&I4uu7XX(5R{)m)Hvv_^65t|W1uzX*16%++1xx|f z0h54|L+D5Vx&h;WKEN1Y2yh;74loKB1Dpd)0!9GSfMLKTzz|>-FbKE-7yv8-`T+L< zJ%C4m3Sb@34cGvb0VNsj59kJz0DXW4z!0Doa1O8oFb3E#qI|$hz%1YeU=FYjmT1>6T*1grt30Z#!J0PBD$zy@Fv(BMM*1ImDL zKm{-c$fNmFv^zeN@9u^0ML7N#glaO%2Y~sDV z5q~CO29i@Q6Y4hxd>`Th%jpmtydE|5BgH8QAD}|O`&rz^8-K{#EWl6-@VxLtR@xQ4 zjp7!RY9@{XlgiB7L?db-{tfRGO^BgfrbXce-XaWI^r$gQ5uLmle^e6-{#?XaaG{iG zp+{u2PBT9!==mPuIbIaJ$lb>e@)op%3-z#}oc<;hdW=2D=MpT?tpFN5>I53`q2NF% z3>u+rRu5=^G!Lx|iv7S+-LBJmkYwna? zA0-NZ%Fmk7cB7yiV{PXI^)&xE{Ud>D42r+tN6jWs7>D^c#Yy26NIfdfp#0~U3?vEa z0hwLGt1~^&#q<2fp`R=LHG2wV_p*=~y}~T?|2022N_zdi_?%5|=0(z}QQ(bwz8TgF z*J(zcH=20lwlU3<_HB@N)I2NpA=D=r@#jQ8q}WT)gA-bNL2p5cAA`Q0M~L{__#SX| zfs+He^rBaIdB=xPGv6bc(3c!&GaGO;ZuFwrWQ4Y*5{g+2}pc)i6fg^NV5HcDS!e)S#TcGIO(*zK0s275i}vpU2m1dQei;SE5i~$OQ2Z;#(Il8fv8e-$ zU?=M8G@}L4S`KiS#>k!FhkuCnf!QNn8u=bn5~Cj9T>2zQ0Uh;GyYXJpFHE3!n$W_~ zh#>L~8&Brr1=$sYa3DHSb8eV%Cg(QCbs9gU8ZKCzGS7lbzii`mQD{*!IC$(ed# zkLbtD(j&YnIN03Ohh9k|q6eS8H6cXMD-4=p1<^x?=@0sR38fH~1@*IFytYC{iv_)e zIO(ASXa}_50n5;%*NdYV3u82bF=8BK2+;aY^cJ$AuY2pL?|-}t^C(mYACj`QzP zEu=STofyexv?-hEgucJ#y=FF(4Pq3KlwQ~gSS|j`uuJ`z4gBDM@sIqYCR$zez{*qm z{d0?bOvW;g;b9YBMV-ASFS6ke>Xik^3Y9?npT?YNgLSwHq35^i-hvL^ z3>loT1pUw^*}7@WS5CAv`i5wNofe>LS}&L}SJ{Ly=*lc&6bWNAHljdleGawDPImJn|AkDRifj@c(>I{906Oaq30u+bTS>Q0rA+-qnC($Zw zB;glUSwGF@>}Cq$#tEh$0sRqk7XM9gho%Nv0==OBEIN{nIvRBeralK%4T~llKMUbr z5+7nd#IgVej21;>rapnp1EvpjOp$*X)kI}61>qNl-rO|(pr$`ErBn_zJ2kJF79Ci) zIDx}ICQ+I$CNN=PvPA#IVu}r~8LB>S!qR9$a2fHDB+@l(D@F)@(cdQp@lW~Z!4S4_ z8jOtSD=>kW0eSSw=a3n*HhSd8NkeR<2T>p%je1(cQCq!?uFq^1`ZHOqiKY&rJM;|* z>P3HsWq^e?i2_uCegU0ZScRt1W~dUxHle3KXETC&5?#xNJbnC27(*tgaTYX_P>kb8 z&%^F}ufnsUi1qVx$W2Nhn+^K_dp2RV@qS45F>u7X1@cfW#`u1yfoAJTYJaR1h-#RB z0n%b5Vm5F=`eFWyq+ZeoxX@Z0T0k8Jg)h*^gvBO%fVp14nhlm3voCD8jeiyV$6ymd z4NFLkfo2q_A)7rARvSHxX8#Fj02T~0u^D~37+_tbX{BbFm7;bU#SA>mXsK^ISl^$;4CzFBw*OHwRsm>9vLa|l;UWJJeSkEL z@jwbV4fss}fYTheo%KCp60H~(LbZQOA`|D9t8 z7atM7bLrrYMoiz;%A9XhBoG}n`fD;LP4KVQo!rqh|LTR4t55U)i{#$_JRbAsczlAy zq5oiymo>|poF=M0FcvzCo!gywbDTr`;Ud4y2gN1bym7<0Yh1+*Uwjoz;Ql@?iHrqP^>V)xLTEw*O=#J{lRrSILZ=fmitz{)lhL_(GWxZ_+>F)0PFh z+gYcmm5*6cc2!oK7bbjhQs$Q|9_OVAuPku$NsB7`oDGU7NDnvyPJGzRh!-#vI}PUD zo~1r~Bwh=AnqT5q8OIV|^OEE6}bw8-o&X;SIQo6Xq{H4PcrJcC9qs}?l{*(PH1SB z`4ccVi5vya?dvQt!=EA1EOHc(9A_3z6jt~wp8yAo$YuGU<5|jHj$$y zTCn58QKFE8^k+zQ2;3@!+{H_G8k#jeEbfZ?qN>m76+_AxvbY^@ayCK~grcx16vbmP zrmN|Wbvg0#5N)0JIef%!onPY>hfi|y+!|hiOudb?eW1zM8}^hVJ#^6psyq~yfzn+9 zx6Y^SR?4{nvIf$6L@v)S+E@E?;+x=H;B#`3@CAN@&p^;Vp4;F*ASnxc5%Ml+(!!E( zB%BFB-I?x(^i{k9pB75;sXHfr861lIp1e&QihO}DfkQvu13yGJg_>5-iH7I>BTnEjM0 zSAtMcRK(A7yL_HBJn9+6SH1L{Rr5YS>VdG#<^IW{HdZulji);-i2~==5c8KHrbi=pdkE_RnE_ZmUjMGy&~rw@`7~+$ zT(=57p9CMDCQOt*5(Jb+eD{Izc?Em|n&s|!!UjO50&C(qANmC8HKQ3We;m2sNs%K70x?D=9+y|-T|dW z;KG^a8JE%oK~?*JDC&M9zFO~Z*Va*1406BABd1w9Rv zqy{o*PlshTP!}{8ngzYVwdI~0E)AD?&H@9cSrh8wr6{>dz01=_p}!}ID6uNm#S4Zg z_ok*Z(*^zKQCM2DPSr_+L~_kZcd!&)jdtx>I8-LaVhYn(+*nsNYu zU``TvF0Co(Uj;8!vq~5hGtUJuBF`-X^9Fb=Yc{$Qgj?1uY1V<$3*3_C)U`}$8KBEZ zL-QjY*<~+t5UP$0M=P z>S#KkjCsallHS1;G*Z8{KkciH%#WUqE(D}8D-cE_SJb2i41>jq{fRGA37aUvWa2h8 zNn62HbX7*GBWw!U(wt~cHD{W0jaD!Sl3*2NAtsrP+?FP0i`zC_`y(;QqUW|X>m&J* zGem3-ZbuX7N%n+$mwK~(a|#I<^~WTKgKLft#l7U7>xuRp_8j#r^u{Eoi7RRLgn)ZK zusW85crFuH)>MR`I~v#-+a23vjlQSZ7uH2Z7b87d&7a$8d%qSG06{uq6ziL%8rcGV@*vH9*;?* zB3IL-$2!KpN?$rX)+pMjhz}Hq!U-ZW~~S;Zs7|b9(MV6VdLu)nP>>SuZsu;cyt=FcHyrFExjtd0yZs72g>Ug$|^i zBJE=WN29T(qdXl#SbI5)FARu+78IAje_Y@w6(3;{(Sx)?dNd}zfY1F1+X6nKAfith zge=k?3Yh&TxH6SVNBcrGA(pNvINXpH|Uji#V* zKolX+G(hobd{#sFGolCy%EbRg6d~c5D8isoCSua-_;`l!ABiF?tW5l;W+3gV6HNqE zE1>x-zLFvQIiVuL>BL_Umx$2e1jQU^PC@ZGo{I=IEs;cpvMVNi-huadm0f$TimU26 zbYx?@lebK?igd>Z!`;;ZtT^FuP zR|7e|gyp|*bK$+umfkVx4I7sb5}m2eh0b*6n)||?Ru)c?8o!%v~jm zmlh~BCcO!3E9Au(As2;ncb$-nK%WBnWf)ciKkO>|=Z%H^0 zER7{eVM`#e!a)8k-X|t}KsX{!tk0UZ9(m7(w)NCg33DtSdC!O9vlS}6i2UcUS3fUu1)<@M z53Nutmcc>|a{hwAA%K}?7IoMbvNUM7fz85*{32fED8!_12;8=Cp^ZtuByu~#rM6^_ zNxv*`yFvqLzanrYp+k&G-^3D6(26v7*ZZo&s(;B}@mKwM5pRZVz_9z=%m~v84fa`R z;CNH3HE1QR6+*V8JaG^)G{8O;~r8 zs29|*dd{Ig{wB{I2}M0EXHJAw_aWg@I*KjLY*mP87@IM> z$8&XIlg(cj!sSR&|7lQN3Wm`JQC))W5>&s>a~I%13yy|RCQO5H{+RSHcKl5J+2T=LbDZs`5l~5<4c5-(ZmaV zG3gIsv$e`N>jttmCdS32m=Uw$s zgo^#K9-lie1hxaa7~B6w&-t{Kz+s?<$iIaJMpyb1m|1{-2U`m8J(x=^zGK64QEguQ zODHOaD3*3HEp}g8jHI}BLFY4U7_{&=gq@2c@yXhBf|hb|P%LYaBY_-Pz$L(-%p*rq ztL?0JYE5(Id9w#r@4Tnhm!P$G5)^-f3@KzV@>~khzeTexXgfL+w5DD_!v6y+mDXM= z(f)*FhFL>Wg~#S}QEQbvQn{BkrO20pc(4+yU~h z3uxR!ZBcjBn~)x2>xr}im3pMzM5!;rL?NX}DK+gDQeJ{#0v{joIR>AXdF~kT0L4!b ze+AYE@gT)d5&tAi5IF3RoM(u?3S$F&i16o#zXpo}fVId402UmV09aKt06xoe9b$r3 z2U>v7^PBQ=aL-ba}cu zostAI7ZF3#;pxb9Fcb=fLvw7=F(YG-P1 z+C7sZC(*oU4QXc#h?tCAOx&H;&d4(!M9mg1E+%y4&|b(lb2KAAa6kB2k|+U*EG8}? zO5i#-6`fiEUwDO*;^LHV`fEgz0txn!DUk?LlGDL0h*n)DSerVYI+#A2jz35|Sa`tZ z__Vkvs^XHkEUt)K;M;5wC^GKAJbDQVEeEsJYG!%X_Y;sa$iMV^_A zsMW0oQ_`@F%Zf=|YIY? z=~jaI@IGs#97G<&(n1VRFHVO-$E+3BL|K=Tu#%y`5{j7=IodcSXHN|@hoScZ4{r(u zR%d@qX&a&sX)_{60d>~Hc3cHR)5B1!xm=85VS-e9J>18z5I-2)Ikt?B9GNBBm?ulhli&X3n%Ayon zp|py)Cx(%R{lT6XoX$~NRji0fq`hL|Dxz;X8d?o)gf2rCQbSctPM3&iU#yBLG(0v8 zRT15r(hlHRJcBx4)pPq|aXR{7`@sQgg#$4~;vR|zq5;*%P&^QQZ2x{Js+99cJQVAb zDH@%J;$KohN8<71Ur~=e5*LV~CQ?d@2JVr#P25f}F~(8(*G2AFT$pLhR4DaSJQ34K z{jA8Hi1X9I@IIxUq3>pp`Zxp*cXp(3BR zaA)Gu)aKOEOcCAl@IgGhL-@LQF1k_qFNoZ^n4YF?0Snypn;3LfU09dX%Z7Pl+_=kc z(fZ~>%unxA&I_?FW{?wBr7rHmTMy)=sD>^Hc?ri$0wV&p<^sqaLN>&+kU~{xz$a4! z5*FwZ7D$9@I&=}jbm$u59L&O-FlHjwUX)F%s{{kYQ>*LHl~EOJ6FSg=zX~UuZbx@I zMMmmpu}IPFA{C2$2>>g6tFELw(b7hhMn)dxJu-8$uB@|8Q9oEmKM1g;v|AUq?pSj{ zb>;v?zXMOdZcnGq>>~0m_K>;?_`QdXqppg;`vT|F?dz&ImBGeNmk3HET1Xev#UR?x zV^sp28Mv@+C#VoEtPAOi!2JT2D!N6gWdvFcqVxQs$c1&UO4gL++UkM1NJ};yU+i2qeFTg$`=->sZa`j+h5!#m@#iqWNMNtV&=@+q1^v%1X8>P(szVOgZD6UP-@qqn0^>GSjz zhKfVgq5YxwSelk)E1;O832_x%um~f7#a9l%gyjl=8EX^}sYH}V9Lp*KSWRspIYY?> z#Ic+rfK^lx0IR1>04$oe0I*it0l*Sz7hn(z3IH!w5dc^M?EzrrQvtw&rwV{|&A#q~ zFM)ML`@tJc@FoM{E>6$auxXnc!WtYtcm7zHw&r~4F3!lG=?<*hwqx6+E!V{f{JE}Z zW2Xh@y1MQ{cd2XWI`jwDf~{mbu)Relgb*7|G4X{%hZ1Mwa(Z=SX=HgMGt!)&-QgpuWlrxigbfix+>kJ&4RlnNG1N%joIZl2 z6~npVm`>($`j8=JST+<4CkBJ@geYXgx*>097&?rnL?NSN7Y*Bnx4DEuv~F1jqHzYjMIShO|DGt z@@F)35~y0;kYz(LEbsS_`)7@1N*SUU*vlgx4C>0%#ne95JG=Z58^Ns3dxk?+@1Swb zxNad(3R2_-$x(UN)iEH${^Z2>Abr^oFfK|L z(s9?SZQEJmH>i4hhM+MnZ!rb!8zORMg!CDJKKG%bi|J-157{Z}De6PYrM{s>o9j_r zv;9f>xFumpS<<#NY9(A@n&~Oaf@PuqyuaR$-heVC^cXiL(i4)m8BvX4Il|;U8j~kc zDAXq#=~y>ttkYPSHx?Zi5@$g`H7*&Kjak-68^%kCGa+%=m_gEtaogBoreS7G<2+qU z!8ju{n9-LL$lD^^GG4Gwn=p1*ik5XHuN0K%fNwB3SQwNjU(%R2ZW*m+uunnRdF+_C z!Sj;kQjI5;Q;X7H?e7>+hUH0hYI{1OBahUw(d~45^MQqNbz+)22#G37J}H4#_w;%u z1C!e63)b!=N~5=|DE-O)6j;^zPx|K=lZ?@WLpud*7AI!ta3_PREueEKlRmbWj54yU z5%0wH;B0R^IdQ?1PAc&95zB@C^cBl_9r=P*j5xCgZG56(AdXwcRZGKis1zo5rc0O^ zXGzwQF>MQ!JNXX48188pLa93auq zY3+=5%A~uR(bKuw=_Z}mkl~`;RTWa_3HmMZpbQ>LIK4r^7G9^uNatbag=tMPm=&{R z*|BJCC4Pw}uX7AcH*LVrjn9$D=f--c1n)%5Tr*#o-Cc8C$u1uonKV3(nC~JYWhIZ9 zJQyF2VH)Xx%%;L!p2O_p*#@!pjVV+Te+&z;-gkq^SKvkR}2D2r$+8;m46>1+`R6OQyVO!=#l;QqU5$;bJ$O6`e;W zRl1aNwk_w9dl`=GtUE!CQ0QDRADWXSTmfphgcHYON>OVTJLgObr1)azd1um;HEo(I zu)G*u+nuMK2^ivxsR(1dXNpqp?asJq*;Fua)+G?O7xlLO)*mvqGutz+C;=maZ`dNE~Bh0>a;{6A3;WgX_;u~WZht* zIui?`UNU8{_apeM=roZJ;jEFyyh??AurN zJu6+>?L6-P81bWmgGA#(Vc+iR>Nd4 z2T&wUb#!AQEuYCNO&YCakXA`SXC_I?QQ8HX%pk3i$}dbE65d(@_ZNA0kZ@@-v=j0~ z9FaE7J6#*BQ%MOaB`rvcQh}oLQk+FqiCsj9OF8tR4vW$I=N%FQr||xyBOrq>5Cc4!$@-P{3iuybd2(v}?XA)s^j9 z={jyAR^V78*IAPrxz|oeY{eYwigzWj?#p$pb)6Ee2ZkYLPMDX?n^(6zcDl|8;X|ou zuql`iSlPtnoWuzLacJJ|%89>>jutalEF1Qc{m8!P*pNLv$9=I8swX;>xx~t+?5!HH zh0l?B*M4r-IwVIPmy34rHTI%h)IUV8qtz*`OjYmB(9sap1y+gq{^pt7Nz`%$vXg+A zJ>e6)S)Wo@xvQvu5qxNcORL*O@Agn_s3}gQD~jBUNY8fVyNX>UIAE{bkx|B+kZD`N zIoBKQ-Reh^U_zT`8CF1E?_w4=)3x4JR^|rdgUP|g!KJ~S!9&lL%QDN9O04T$%eK68 zr(YdJ6<|--kSP!0D%5VUYIziV$YUNNi7Q=E2f2YSJ#KIFeoI%vx@(Qw6ZWLNg3DOT z&R{p13i*z^P!+&>SDiX?hb7bBwDuSVmXIZkxqOFtsW+8<<)TTlYPqCF>#zhFMT7c~ z!4k0KEFIXMaMD$}7JCxT3KkK|JaC3C^Z*%==E7#d(pEE3TvSnVueM$cHR6!m~A z1&U?MBbr*&9o7KVVCRY?*o6+h3k!H;q2)^0uUH4_Nqo30b-jTY%Dz$1&ve|ysT0w=r05zZ}Uk>3fK{|3>?L66MoYq$w54s!w&sjVsai)AFBQg{4V`PwedoC| zOZjPrheI`1Xf7~H<%L34}J$i`fMM38`Yu2Tw+qTa7KZ5yIAjuY0Tebov zlx!7Skpg7|Hd}!dBdOT7iO+$p27kj2;SLepZ3WVdsMd5poY}N?#U8cq%6rcB?wsqy z9ULxG?lap3d=-0?=^VjIE3m+FU)c63L2I|#4=7+j;II`?8Hv?iqXfksupd*vgTP5E zu*gUP_A}~gT%D4m_L%*WMH>`d#+1=vfp#-?nr<+Ez=Mm(x!pjiEB1nY)4pwQp6A;m zc+>Y9+VIeEC?}kY&Wmoz0&}toid`7hnq9U~L2lx4X_p)d?jLduHYa(A9R&@TpaP66 zNWX3ee8#wS=Ll1#2wuGWA~jRQvF497Q=*Q!Rv=1&Idr5LV-P2valC|k8QBt4R+8SM z?MPC33V|hHK70<{WyP^TXNs|sI8Gf|%DRuh3Kh5Ss5#CYt3+_f&}R;|us(6*oYr1Kd9 z@Aqsl9tDzNQC8(m7Tu!aS8x}#DC2SM6!6Uu9oKYpT(>j=#F>K z;pW{!uhbXpi}i&R)t}dY4wztfsym7sdFkGIUszef1&*zeJi8qk>duRcbkG>;W~=?V zZpnpDs`g}i3O$=Wo4pHtc_qRMoTHk}p$M>|vZIihF0`^`Uab4DJK~x{k2vbB_tyH- z%CQn-+2T}LwL8_RtN3>CUPu9$1fWpD@FL3f}h+*9jW zWYj7#+3LoWM}chw;!HO?xJN*%!*cggcdgs)QhL=sn(Ma|-(ZI2%(C|A-UoWcik7W( zA3#*1KI>+lfaC6qzV(6PKy~0~;CLYDne!w(IhJ*e%DU`sbTd06xr*+so^tPE-?p+g zpbUlvHwN>JZi9+2pz={yfwD-hkgM1XBwU+BBDuDjV4Fy-E{|)$wL?0TktgPgyLPP@ z@@`ky6>%k9X;(#{Ofjhj3D?LAQ=jbYhX+8I8JR@sFXns4L48X~I>QUJemy zhT1ae`UUFjX;+!5%+V#W1J|j`?XHj*IagjZ5ZM+29{_H<)^%jwwp|^#$kia!uIp6$ zIl!{3rWLR@uDGo5K^~5!$2Z1nS{pD`*FGCjRo9l@i}(THBw)>z6Tbs^?CQ|}3g9W= zuQFKBe+$((cP)+=#y|KjTCMI%j3h^DBgZ2rBd72t2S?{e3;G{}_yU)Ke;M%7wWFn) zTq6EkfDP9Mn>^^M+84p0!>x52+>+Z0cK{iqqyD9#f}W=04tGIM&IPS|iD^uW_tkar%I~bcfVJWA?xah99tL}aG8AUb` zpo-v`2dt?!-I3w5V8`UjbofE>L3Q?=y2+M%?<$8Z{te`;xR-~s>|}trWQMbd(aLk* zogKbl#avQnJi(p41_e&tb$6JpIxgH62iQ@{;>pgj~ z#yr72dp-5u)jm)ET)$yxW2iEe^LcELj!X9XY^Y@stT6g}^SuF*ZL`OUc`MW#Bu-mB z?p~!gMCn^ShF%XaVH^2$dg?uwASA30pT1_k14>+1<_3}j>w~qyis!^r_eCh{4sQ5d z_DH>R6xr>G^(Jt8vc#_8T|aTO(YuW^F4`1aO@Idwn~tos?9j^Bx8B$2XT~esyNDan z`94{xDV}~`f1-b-KPG(%dWqu6CE{WLp8z<`_vOHi`S6py9>#pVuROGe!>^+u1((en z$kftpNC_*OBU>Y-@$$HyM&fF(GilE1)Fp3{5YOQapFTqrM z)SD#rm3sGkk9t#-R7PN-6-c)NYO_xWgP7kMy$X)zszbXE=*B6Ann@A_8l`bzd}7l?K|x|L-u;#D&dy; z%6%1NKue;$T;ERLo_~F$*%E7Lt}Wo2rOo>n@uV1(h7CwFWzoOq&%+d*;f(6)R#>y3 zeFghirPRMOxI4J-X^sPGnbvj4Rtv2$JufQjREd<5Ru+{ATYsdL4W`rr5iH~C>?z60 zohqyS>OhgG*Ol_X!N50Y0h3qe2XYgeM7pkI`nM?Oy0T62yi!qint|p1T^n}6d8Mp` z`pa;Ey9Yc2B^x$+1*L?0Dr$eGKij_wBe2kRz)8wqosf_bdH1;o$H$8Mdl=b}* zwP;Dn3`7PM&o7hbvZ6GU`Tos`>O^Bg4mSNGN6H#JHM@g*o_$Zvlk~25SG_xIe!Il= zyl>J(N11+woHfndl((q=82GvSRbOS~d^8@gj=9J3;xS!vRiG){#-h8UzWzDZoQZxY z8U~v5l|e0A>St@AEb6$#Y}&<;VR&V@I2;{;c96Z)Z)MqQI5`qgJZW~vw>Ysh**qtq zc*lTyU~VuyxaeK-7KV0wIDG;owb!06KCwE9HiJwQZytm+ThfC(u|d_l?A;&Q^Ih4h zjsfk!2F7R+=9P}tH%0;hnF(MWz=0e_DB2N4s1RTohj(ONlz|`^BvDXq^2~`T&2X2LGd8d?uscv<2@M;Zr162Zfx^HxORNr@ z4V(}BD%B-EP#k0?G&N8k)Os$xb3-vq2m8LLf7kzOq__0IuM^?&fZMan`{+z0JMb++ ztPK1HA*h_+WW#-+W6Hy=iAg2 z1+b_hlJI<+4rQA{#ytO-xb85C|_}B22TbH9uKY{ zbIM>9=kOhNjDFu>%A=(;-ype~4b8OqLCKD$@C{NINDpQQt#)WXI2dUs$aWZt5U_FN zL)SuH@`lo~WpKk=@a}kJ-zO0c&A~kortmlpjoVFxFMJVy+Mn|m{ZS&= zLVb&#P0t>4{A>-bPP0XY!K3y1ymhZS)Zvf&%l>d6InLJO0Z+^u9+rF_U)Y!Qo%^=^ zzL8l{V%np6Ds0tQ0J94D`iO51Z<0X4o*2o>H9U$pPN9NG#{Qi{5o_$*VRas&@lTuteg-FzUtQ@QDrP?j1iiK25}dWJGDrl_t9-lF~mz$HN1NG=00uR&j@qRZZZ zZ)dc5o#DuPisuTlzQ9ByxDcA3iOtT1SDCaq`aSfnk(@`~21aIlXuTEDB9f;rh^G>~ z8x*Lap$a7MiT4uJ9T>;)p(6E&Q?GW&J*2?J7sO5VZ37LUbC4{|WZ4ET$XtKhxbtnD zXg#X6!)`RjhZ-|mOqgx@T^QP-lF~!VL%XD<^pJ{Rb2qR&R2<$Mt_`0LclbI2TJ)6E zc$sD0qu-UGt7}ZHm5VYQ7^VBKbQ=^8%fOx!hE`$=DwWUoiaY@Fi6! zFuXLpI^3Y7Ac7qZs6ITrJWLCFEkz;-tboMefTHJyRS-3?vPc`BrQuxzna0&&tAje6 zjHd;-0`#&yT+sgk`r_uWHlQ$+$ALo1!`0!u{?o`&9S*SMASE9`j|Dw#qv zGblI8qVp7Okf!y21*#5ToFykH+3J&hDHdIzsLvPhEwZRe!bE&gU(8q3KaYMK^HoO< zMiT+gSY#|Zw#K3x0A;`a8=lzRrkgMN=aFoXp-#uqKGX|I2V`(O#YpaFg>P*nVz*x#@v zK+WIqC&p6a>iGJ2alAOO5?l@Lk$Sm?ze0_6;Xh;DyWu}z&3;HoX~a5GW6@)ZDkJfc z6B;VMkp%8HE{~ixBS~B!%Z!|no&&JY>5)ZXn|I32X)pzm)JiDg-8nF`H~bStyanWT z3hiadXpE!+TY-Z>3D2gcAotbYZUdL%;$uf+XQ8e~Y_foIOi8NwEm@@PjO5QvSPkMB-aCX2YIADYHtEVSkxT@O?zY39Ka z#WPCd<9uS1iQROi#70TUn@sGRDIa_nxtmBflO{&fquJ5IXnC|YdKp}sTA$jOvNFkJ zk}N$+k0mQIH9~IGLrK}u-01pfQU4lBrgG=UV-o>Jur(Saf&vb}cSggENrV#0cyjq* zG|Cd@DWQfZma)!e2?@%2IjRk$Sad-~TUb%+U?3F81ug?=(uy0=XkaO@NV(m>bd0G) z=njMf>w%5HUf?3I)Wk&s;jv{IvyKvo2NF1DN#md;I+l?!$$P+Y4H@$6StB~!1 z8K^LSP$&?@4McdH0#}RZ*jRilF_s^TPR>tCcrf8$`f&Py%}g<*9~j8@l^9!LlCP4W z*)e+1d3_9X2MipU5OSQMAHa3?2eh1Qtwq0cGxFV=k$-tJ@-J>i)>t{~GHl(}7(G8- z9;=R>Ge_Lv*akxuND1{ZdRBUqC2UcGb=*Df8{Z}Y<#7eU!1!*HT>oc~DTxuch7pIC zDqvVIVDiJ1itfJ1($_H+7RT9oY;AmhA~x-r@y*bAqZ`jOY(0RF8A>RRe?TUoIvxv_ zSzkCB-=mVNu%<5gDJKK;^jwGL38kJrZ!S@IFlHO93Q(!}@mV5Ob-K3x)*CjJ$z zW2_S=jOvt{TbY=fNKB;Iv)pHt;6p-d#c)mufr)54;SZ@P=O+G)PJRJQsA(%Rc3c>{ z^hmfeiL1*nSz9n!7p$a9Qqu}9yXGef6Acm$+i`3%|BfyaHdFtIIB!m9oiu_CPPE4< zCZ+mBN6;Pob9Q|TXW_nP;LoWt^@)E?SsD|6ZbaRQ?2jof2dz#TS^1!wU@Vvj?(!S7 z#YqM)S-U2YaIQtcDz0Sj2RqnIr6Lr<`-IS&f*!_T3vn0XTftycCbk5w2E!~CA(|R4 zJVse`-br&!&@fq;EKZhSSgMozlQAcT%tcV1B!!S2FHFX9p`E)7Qr}Mywh>HE(q55v zhlR-ylS?dhnSSe&CB95ea5-6;&4;rL^KXcwG(|f;=#@t3 zzip=cNfZ3LCTOrn=9`ZK&?6ypT2h{SYEIh+s7z&;M9Nh53Vx6JGCgTDr|k!UZ)%m5 z_V0;XbZU)7)~VSSrqn5VB4`DdAv&(Nt~f6ghB57}}`f_Uak#_>*^? zF8dzNA_Hj&{It`%tnd;Z2t-nt-KQ?Iq&*TNiD!!{)X2%{G=f!1OCiAK9>k}8Av#ys zd61k{XIEzr@M0A>XEM`k(|Fn=R0{y$gI)SG7MrIhmYHCds^#$%B?QiGYA5 zl0Yb_rOhN6%Cvcr2asBXA(;$Ql1wr)p@~-%s#sHtSE_hRg<5K{MT=K@#aq0k7JqUz zwJ50AqT+45MT@;?X{Cae>x|Mrt%&faT(*V=2Zz4qFVvuAe2yov=C z=P7SHN*r8xbm0Zc8->?Bjbp(V7v|8q%OSi~)yX{2mCC_ITNdM$2GowuIiFrkejEM# zG+yu``i0bxXW5%xG@{eD!HS)z)71(Zs1YFX7r{b{&MmsMcqV%vi{2qc172EqoLNI@ z#nBA*S}@6$#+KTZH;ev4=qsU!t4yb9g{bpNs4N5TXW+|F#o>x9?Q3o!>eY$V5xi{X zrgVB3t?<&N0H*nWvq~|5S`Lr*-^O`irbEtj{L;Rk2ghj!;=Si?(RxDd~v+;TxDY+ z)E=ljiifj!T*)7g;c*;~9Yo$(*$J><RNK3X}%a!7y?mUE_ZCd)ZfSt|cKTmE;R{BMPA z4z)1E+QQ1xw?^AsIc>X*Heo4k)J8r1EdHeqJzlw%X(dRXS&Jg}YC_@Xi7?kI!@*o&9V4lX*h=r9VM1BV^tMd%SPIl^M8AW?5$ zynFF3#&0kC+|ND_QhQrE79XO21B*KrA6C8`p)ZX{IjVd)PG2mM#V6Rm+ZLZ96B$Cc z-oE%WRbgcD7WQzKA&(Q)PB1;s9xo8_{>Ai?;3cYrMR^V5N+G<{akz%Fcv12qUX{$K z%Bm{H>ymgG0gAr57-#PBuN$vA&A`9KRfmQ1G%n7oN-H8`&L{$FUzMNrJlrOL%F`=E zxh&I7nIXI&IaoCW0BULaR?ISI(&yf)&+l@d$~`75v<%dq#bqyNa!bUsxtpc4xsTh= z=6)OhzJ|1A>C$-aiFDhA+%!znbBi4G90hwxE=3^mvYn6CAY(!E?vqkPPbjkotG|UIPl?hY_(Yi z#A1iXR_eG{oas1epXu0{E|oftTcu+9nC;kFVi{Oo?f6gIGF;+kU*tg>ewORsWe?W=19vTfsZ>%#4&)Kcl?iS%&||9jysOiM_M|P)6(r@4z$s6 zM=)JF@7P7(#?r;}_yF-(y8XB#WR=F~Gii|!h=nh(K#~nxM8$NKBmNL#+QDQ*` zN*v4}k_;5X$8pE$4CG>L7{dp+rHRNW7D2aL1RXxc=;OHKmp?ryIoCeV`5|$E z^QoMf&e>LJfwRgg&2%oaB6%%+!$*~~ro=WNR6FO2)y_si3OLu(b0ePDI{R&Fo%;o; z(TQdYI@hm36Zbhg1^bY5R1k-pjaI48xz8$XcW$*HrWtjL;tr=M>~!K*6lcD)6Mv)5 zGHDlOTP(YsI0l6SV04;ox6>}|#os>s?dPQrp!7kMK7`T-QSuP}4xsd5o_z$_N0EID z*+-Fe41Y(EeVl{ixS9ng)dV`EHU`iW_&bHa(>xnT)hsxrCeQ)3Ge|y*zj6GXbFQ~o z7Fy0bXW1?~XIU>eXNfo%EM0OwZ-Wx9IIp#(xvmwnTpz;0+JrsJm5_2>U&UXVV9#}} z6r?N86M~fH!iU?nm5R)Cm5HUUGMm>`W}oSLL@LFf7k{%|&;iyYT%x!Dm%UcFaQ~1i zU#h_0JXeiWg`>9kuNvKL84fK~yNaY``184nEPeo^F$1proRzNS_72xwVu$NNX{GC7 zDS*FD*Jr5)Yh5-mhzt0Gu4|>BYnBjkEwKe%OQf}~PfC5RM@h6HSCM@XfP=23(l%F< zIOMup8gdQe)tRmMcdNABRb#WbYInHG#T~9)g0$1sLNej#7ycGXyIl)$e0M$7VjpU; z&($vNcePvg1LXi!ZU85DJ@!K`kL|F_BOY?qN{8`x(A6p(acyobH8XybC(LzRaZ!mGTiHnEG|#3d#RY^UTVp5FPC!NKakw+^(3U% zJ>NdlJ>ORBo-fXHua`>QjQeaiLN0fiG>@n(mIZjk=__G@`!1;he^u_27E6hx+AUa? z;kF8&8*lKsualPH&*xrjUFKelv|I3ei&X7yL0XH|Pe?9Hz>T-IFzf`}`BJ0%25BWF zFSK;HXW7=eXIVSlv&6OTB~s80WxH?&R}>@eIZ~f{j%CpO4Wb-!V?EPtvu$xZ#38ps z8gVa`wzyZ}-&IJvQ{3X-C~b2uB&kQS^|-_Rysc=Vu+xpLVEj_eF1O3J+g&0Za+ixc z-R06QcaL`!xqGGKT*5JTj(7sUZ!_keFP#9- zQ>3VcmecM6+ZlI(c-Fn%WqHMN!M!BsoO_M!oV!?%F3`tC_g2#LCAY_R)$I|lxIOl( z?n>#ByFt2wzcdfZxoUGg4~w~;-%7cjT>`#fM09%ws19Ba{dpv>rwISvAQgLVu*~$l zQiP_i_AE;mD?H=r_G(YARjS}0@Ma4us)u!b;B!TZdoZ+dfZ;{eY)i+UNO!bixx6Y^OZ?1p5gOLXK1P zaoV%MYCG*YVFkrdhW(J|Y6iaHH!t5;SZOVvXcg3AT~E?SeFt=S#=8 z5C*cmVym0;jcA^@c2-z#S1|ICiJXfUAU&lIHGd}guke2c}M zKTGoF&&82tmNXMdGxI%CX}-rYnf;=gNq)`5RDUv_m(#Mkqku->;Ata6DuV08d zY{|bt+?IcXZA*S`y0ncxcIES!eQ*A?;^F+~Y=`qZ1Zi(RLf8HI=LOrL{El?-Q2qid z9{u#O!-}+{R-^?o@YqKmyE2e=JOgPL=@B8_{``Q5w8J9OA~rmZ+N2}-HPq9vkAOdq zG{%L*{(G-xK9b`x88$K@3$C>;KR_S6sS{E)Z-(kO!@339T_n{BvcVhg>-%1&2UWb_B zb=b1J!}cuivr?M(D265a$n~Nm8q^CXhh<2&_gcw|zhX*WXqoBF5livYVl%xDNTv9j z&6DRLc>$8=A!z~rDmX|LK&k;!<()58<8K*H_95AiWFM0J_zUplMkKF9a-+9QT8Y07 zZyM$pZ&*6L1@^Vx0$b4gQ8DO62N?3Y)5Rh01^Twqif{0!L*8u}_*M<0@b03IV3w`Z zyFClv@G(LhTsR3Xirc)Ru+4kBw8c9tZKq`TL`c2^HQ3?ZD2;mmB<xcGnRwi8sc*Zd=7c9TBXC@^$QUx z9QD?VN4)j6qh7xt9ifk7-t{hI9QRg=W8O+(3|Pm#4@xJzTP^qx>(Q3e;Cu?4PeT)D zyk(X%-X+pm@1uaTjC(!eIj_ey?tNYw_x?m2_rgZTy%hq!Rl^kM<03I|)n4%yiC4S{ z>56x)fG_YeX$8-dh#3VqU0EQC83miAtb!-;_mr4b@M|ff;5SJB4btC0+8a`C!FsB+ zyI_{BxL}smTQEy3E?6SXEU2O6(t-lp?1BPu9zD7&3jnyFV3kx+z`Q_J0s41AkyKq! zWLZ|gX05&gkIh%`4GDj?#)4nvbQJta>?pX9frMO9YNU^~goVzGrL0haLyGXnK4A3~ zxTGP@c%;B4jzGLEobfg=-d6BQX?sBpjf|rOIpS!+&!wFO&r?{ptDs!mS5R)-Ur=s8 zQ1GDTK*4j;fdW6S=qT{PofbsW@i>?+?Wd1}9Ptnk4;8#99WG$b_DDgF?N~vM^=Ltk zaHL?PbPRt-@i$hGCM*Su69r}Bc)|U)@dCL03kCbr?H3D9q+2c)EVJS%7;Kztq&|#CV6g;{DLGaarIbufP99vf59D7C~I&>C&6yw8E zTzDy6x?14I#Hes9u`LD7?7}(X0?^Mc{FJny@G+^hu)-=;7e0?M6bI#9w#LE^tGKc- zf@PS(BUWi8eKZ!1;i9fW+``&e7=ml1k7b49qSRTqo*Hs(p(q9mMIl(2FRd+XmqLZ> z5%J;xy-OS{EVm67UX~(-FuI|_W6WcX6gtEmg>!A&3vafM7S`r$FI**UFT4}qH%Oy} zJvk$VAHlyLk#-c`D{U*h7f0?N1nq-JdoX7k{@qdd5YivAj21qQe;=227BU;aLX%}z zp+nkDk2nelsrD8wk@oS&{dnA8c(Zh%kPUDL3ujpl70wb47H*af;qMryI$nrNQ&4D( zSK$OCJyqziohVF5r|@@%DvX&IIAN(tI9oVN8pq!`N-nXSFBEMTpoa^EWzu^>;+4W2+m*r!xYfdKaI1x|c(~OfxYZ(uEv@J$QdSXY@hV0UoGF%w+(k>J+@e~^ zTU0~ISUbXBnKZMg1Wzu3J}tp&izWYyFQr+YeBgsOJ^h;VOBNxAetvn4zdMqM#^TbM zTfbltZyuOYUVc|wbSTypx=Wv3J`jw%1}kr}bc_5)yaCyh+1|Y2?oe0aKW_fZk9zE@ zBg#*DzxwFjzw~6*Mx(u^mwRmf;Y6sv zJJg-yzkFR!28fm{p8LmRzwfcGj>fv1K6S<2W5rL$#v%u9tq5l<5BA1Gag+-?>!N)F z_(}2Ds!%K*iS|F2d-+h0jRa7s9kOiY{=p%X`_o;{a5zs%!|&U#2*x+o;YY|XQHD#& zXpizAC4ZYziLt!6c9jf6GM|8sp$R*Ry? z-@SI`FX3F4*&c0KO{)F+Bk3=P(*yloRItZZ7mRgB`h&fJljC>vVk=t6#eXtOy)+ zj^6U|+rWy{UO& zJJij~=O`vcraDfQu&#)NnX&ZP8lwGS>Ydc);q>|tGX-#9)zLSWTR~xJq91d9m7sV{ z8kCxIS$*Bzt)ZUxU;5f@Xg8{~)^0g?A{*`@`}^aG!>@!5DW6^Z`z2u;I%gu%Kg7is z8lp@M8MUyxP3)^tmZo4|=p6Nr%$8^bjw!bHk43w}>CG|TOwOA2*obUmWCf)0uI^0u zy+A*+2|V!MwvGe5C!@U;K5*!7$FA$Ku2|hv&pJc;iuyYCC8ND9^5M`g^OtPx5!)HN zYkybxa!=-px{lVi=2k}IY;V4&KNO>1vTsYEr)+Ba*wbML`M6*##H+vh&KGWK3gpI%}t?TOj%Y7XU?F*zgE5gpE=GMk_f!pwpzs}d@|JNb7}`N5 z7d*`1bx8HitDBh6Iq=POL$P=?2Fw1*%IDBGS`vYNs>9qDoPFU;f7`kS|MGUm*oKGJ zz-=qqne173s`EFYDh$cF8jlTumbw*zhWb{2)B9t;`}eR5@O%Jk48g9t;-7r|Umu4> zHLj~$vx--WVP&^rTxtx(sd{#T@GuOWSv zuQlMSZSd!?A`PZRdfbU%m_P#U{>HZU){eUNBS&xhPT19454AQo);8BR13l2bpzN)R z9^s}6tN+ZJup`>vF{H*e?6Q{C1hh|9J8X`@>ul%<=gQXi3d0IhPpp4 zKexe`btOXGTj)6#O~y4yM)0?v{ooU@!S;1+fu`FU{0)I7UJW~vR`J$ns?5f7Q*%qJ zA4*tYf2$%4uFIocL-A1eD53HuU%{LFb<&Z&xu+){N~pcXiD8&rVqI@!fD*s*#L3Iy zTrL_*3->pzoxQjxABt-9``S8M{hF>m|APasgtKA73E7BFc3ktdu-Bk#Lo-m7{A*f# zP4(@*+O}S58LARJv^Te~MiX>Kn}zSK{`QX6rk^U0{@*Ut{>3+XewIYYIcB0hTGz#cuIu7S*LCd;(O@_C0$=;q*A|Df z0`+z40=0f$W0&*Hj1XP(Ch7O&eF>Fr+l&A(jfv9>qH!?&I<{2baK z6xt-WK}A<6j)X=SMytQEd6l1guhqeb(n_vh&D_=_QiHbL#)?z#YV2g^7GM3s7g^(}&(*)9=iJ8Nz^X_rfnfBG(8y=LyI^0~ z4#m|42NFZE&~+Ez{_n7(6=oldBLrk=Bum)drqYP{Thqf?^vv8NeDiptO@O`s+|FULp^g&uJ%~4KTbn}tdM)|dhT4PB!oF8%T_7 z|Do$q*2+Evzneo``AlLPYQQ=be}Zi6iHVkjCr*l9@aWsKy2Cj%IJ_qFpbg8q3bs; zs|n`-rm-2LHPwbj#-3cp2+?L2g$3C^JvbQ7WxO!1*HIl06FVEIm@un8`S7u@4FpUS z8kCu+Ows*`wDn`(VxqSB(TkhfZ)S$(Z(N6GJ|?y8|1`9b34pp4zSc#TAVDUuDU|xe z@gA5u9-vJ6&V;=q(9p2Fxvrz_dt}ojSzBk@9sW)lV5(6%oUJBxwA@Sy4kR?xcC@!Q zlj~?&$cBGiT5UsJ!yQW~l_*;^%4&sDNn@0^DwK^HWvxP~q%q1BN@`P`j=z)Y>j5V% zl~H>s-Nn)sevr0EqgGNG^>rGx!V}b`8nu$jsNYNJRJ*1+wXt(3jr7M-mIqqf+F4|z zT111dt^E$F0%^3~@2jT z_0fC!sd*8zvN$}%tl!>F(Pgwh)StNjzU|M#bep1yNY99WGg2Bpe!~V>ciYBDPl9!` zFOPQp5Ab}wm_PP`Abru61>xL8up!iwxP2&21wZnu4?ho*=7CTwNHf=_b3?bG*Qi`5 z=^t@q^pG`2H}4lvYeG6rhg*2s3ZBV0p&?@5N!1iH)3j;^B5f_A0fT z_k+bRDBG(my*d_2AcTe=IGbE@kwT6P-tnNRCU})poU>xxPTfxYTIW{3>MW}axLUcq6-&wM9S5FpNJsQIZ zlUVFH@o@MW9ayqp->1sDbp$kKhq_8&CulnwryyGntzG%_2SahmDzNpiy7qqfS@P+ro~mSZ%3S(-9__um@{UU z1Mh$7^{_397_Se0`-RWMe-X~=ic@Wn*^NxNV?GIs_u3EKhj9cGh>k?0mwHmz1`A@V zMz0-O^Wm_a*!udrn*)etdmteK>o0Z#2lMm#_Z#rEO>cma;q=>kB4U{_gfq zgfn}3mPdv|-6uc0qEIfqA~amIG-lPFuHU!z5-p-d`X25))PRsQ5o?b^j3tZFMt|ul zMBijd3>!%=fBm|HJ()Bqfu4suYlh%HuvFGD028Z2yz!+aKmR#TYKY!rOzK}$*@Ach z>rQ=_KiK};u*gN7`SE`lgC69`9n(W*UE{i1%wrbZYpF!N*f>}_lt@JTubeyD8+Iex z-$auRa&%3%`RiAL5R=@-bu@CxX{)JlZaX)PmLMjO@r}g?>d*jnjehE>cRz9Y)0piO z7N&XsMC6&2hgmwyA}Rc90_`6q@LW7F_sfWT3`q@s-ztBE%3~Oh^vgB5wEoI(i5Z`? z-t*4HEeQY< zhQo~Z$t=p*D9^*BKQ8;=L+HMmG^&^Q-Zsa_;3f1q-FE{9vk-Vu>O9AZqS!z|&RS`p z?^Cu{pIsNklsb+OZY%Ek7e7LuKVPIL_?nDHw9LUZR(Xs6fw1A?ojb znes{vdC{&-t)YQlj1%?v%Ju$BBD+RUM)5prlIB<>9O-|J2n=$n1k`5dDchiV%I2oW z*2NR?-xGr#WmTttm9h-Y)*2cd!s;>8x^QoDL3mVjIT)0k zvJ8!&X4M9}HicufpqWiXh9*^s>Z3!L%-0U}^n_wq+9$$7y_zt@+#}c1L7DHVs=r1Jbi)H{oNQXyYeVwhCTzHPq!Yvgz^myu1yhcO94e=(_EmDG7Q>9 zC2Ohr@fON5^j2gsAJ9rU9=#;IPHjA0u39--k`Kk3XVzRnm2~O;ezqF&5z3(PoGqbI z0p`&$Ds7>hQnMT~&o+cSEY|y|5dZ@Eh7wUyE%w)oi*bjM-ax`gBMwaGtl;Ki& zB7=tY&r>Rm%UnjJ^0umt)JF*J3n`40oPVL50<|O=Hbe;YVZkl_CCV#Q^Jv*Mf)I}D z>lZvz=MCY^l!}d|^qAzh<#bB7(1!_srd)%y>OAycDbrwlveT%bro|v2Yk@~X_d-q@ zOfZ{=(_;G}n)*;(T3l(Ox@f6TAEh=^YKc5jG$8I(fN5gM7odQ6%?JMaSByOBjFZLg zBVYLbNI0up5#`R4wtvGUkM;P!{&UOvuosC`Ry(_12Hs6@AWFNH#j!# zSbe>{Q3O+=?s}@OK}qmuY)C+7lt@Vw7pfM)xaSgRX0VsV`df*;fd&CdV&kk7#!!r0elC_;6IaQlf3&Cr-|=t7%=@xvV>AH-O0NRuaEWS7f( zgW>r2&}ZJ#Xv%2?gz}Vb&1il?wbMM8ZdqgzolwFVI~OJoVp-t!k* zICBHGX+y!-($dRcgqSj?j()g@Ot!QHZU$=)uLKJ8t-XrB>!zJzD2aRmCp=!{UZGiRXRxjYbeRhWdwym}ZHI?z%*b%@Q%M#!QuMi#-2M!D);N#2%X@-=AT> z1%h%3Xvd^y{fl3OQ%~IwguPMz?f>)j8uVIa-I4kHSN~QJLm6da!TEf%vx`cTxX(Z?JzQHZ|n?wU|nL^XweVDS)k+m!>TK^X1 zDbp&(xIPN=Z43@$cOOR_{+;rbM%MDlW>z4?dxo+Na>M#C#`3~PC>Mc<#+c_~RV9}A zHf0*5;+X{fA1MVPlM0hC>!B}FvQasP zsQ4u18n(Qx;Imr>0Vx z;w@7W2t+IF{9wr2M1o}=R!tQ}w=#c)2$bej2}r%<&i+cdN^`2Y@(jZAVPs+j(1U0Q5d+F``ARh9?NyK(AskRQn^t_<&2BWVP$Hz49}cYCuJk_)&wZ$k>rOcLx~3& zV7a1LtdT|U;r*wJs0U$Y#<(d5Qrk_{<iHx@VkFbL4qQfk0~KqtjqJRLIX}<@mDXXCd7wE ztQPjuKuU{+UneK4bbC3QMd$}9L+M#OgOzxi(iJr;RxDerVCuy5L-8A?K2WykbSkd2 zlH4bIqj9ViZ%FNp&>eY~0Za(t`|czHMT5L3$t?GUHsrF|2JdrBQ%~)mF^B*;-WKT_ z=nc(nF0zJQU2$XFQBJ9Oy3|!T4N5b&3d&GME>#H-iEMsF;u6(T>3dun*-}@8Xt!xK zNvjxxT3p_B{Ua4t`huES*QD#47l=ghJ&L_>HMfxgBzIeV3oIZ4rTvt$as#weUUsNU zU7TM}aTOBOrTH#OP$Xwofr`5m6>Y-2n@+~E|vLxa_(T~ zF1hXf@D#=zwp!H^9T*yzN7-Iuc72p(&8MtujakNZqxTU-nUR7kZ*wf#&zBRZDhr4% zNje_eRhqCzKcKbMrIb~e0?t=KGfXm3j%OB7W|6TZGUZjILduYE|FYglnyLz!>+>si&C#4 zf>I+vAgDId>wn)A`t46Y@Dl4JlapToF_DyfkmE+dQ2q|ED*A(Sn4 z4&Wi0)V7kBux3$iN?Xa993an>q`4o9x!4O}&FKaSM&I^Y9?`H>gYNNrLkwB#Zfr4+ z9%WlN{h_LtSZnJ@$hx_u(6sFgQBVbS6oEJ$*yVe_=mClUA{y#oIvRP|@)eUTS{}s~ z$2et?8R$wiU<0r}Ozd$E>o-I|iq{dSYvHd_CMh*JbM?khsQ0&&OTAH-%g2>BDJMx* z*@?bISuPZ!{#>q1<#U$WKFyp9ORbOctsZ5kGVY-40;Q1V8Hlly^2pz@qR49u#;|J` zcNrily*|LT8K+`y$|k3z7OM{^Cz|_*h{8h@PK82Nbs;5EomnycmPZlgka4gau7?>0 z2w4Ny7!n~E1+nFnNbST*YkO*{3KkQA4MRDj`0VQ^>#c{aO?1z-TI=(cVli091inoFiIQG%IcgKJIP}4A$ z6uUyb` zC;$uevlYM@ltIo%#{mjsWhnyrrDA7XYjH>w?DhB4iIXK%J<o4GHuVmcjrz!45wXew%2Im=YQk#t9;JXz4RUM#i8Nr=eQ7T7-->#4@^k7JHI+_lKlPde|;mILz<&bOYPZDdP6ly4{KVe z*FXQpmS@5(EcEJMmkd)Lp~?H^>H&)VM}pTHIk z-(`_@edosTtW>>`oSH#W9QtX}8EgePBs!fR_}a36|0!3D!fF*MMwUr+bJyH|-&0-P zS6AI?W>G%zWQGE4j z5z)$Kpi>gsS~vc%dDs$j+1jJwaIf;7*Nx_~$x#s&i{eX(B2@|c9$if&1u5dQc(#S| zu20D`o)BpzB6oQ*)$v^)`J)MI7!f<6&<7tp(;S|L4z}{mCd6e#RFaHNs~4Pz_wDyg zNTs*jS)l64<5*-))WKK>ShS?!r}_*sAeQkX&(S@~XhJ1ei?f`2e|!6n^hKyAu#EfO z_shkKoon5rygtc*fAGB3`BNg4-LS51ep;YHuX~BIQ^gKYHr{DgConG)U8)jMJ<<<}{tKc|j9lZiZP@aC zg}>g=t`lzgB!;{k)kNkm>p{;)&fY|F$PtUKtUS|broyteb-C33;K1#Y`J^i9 zKDk^3IexD_Za+(_X3UJ`wAs5~D_7zpIZ3x<@ryTiM`+@pMe%p-`ImPT=`@ZMZqd{K zAu75DInko;mk(C$}j>BUc$upYwxnRQ4DesZA^7``p-4W!xm2;@3HBy6zMA zD7L4ElA8|Ee(<&9FDM!?P(VY>dP3bjL}GB%Tpm)Q8nc9nXujTpG$N%-C>xlhl8r=f z82U8&7My1Zbw`N8Fr;e~R6{u;x_ct&^y5$;5y?@vp_a0hj!?c~D3f_1%EH?O1EFAI z3z5hpG0#*^DWRY7QIWl68pnHeHx2f`skk8{EsZR+wi@dG0MW>vQ)@8UMU!Xv?k&5W z6B1B~?-7AKco`7LxXIJ8HMZkKB}WAYDy3Ce97^8rKZ#NvtaX&kLA*eDa&zhOP<3Vb zysvxg9$40#HV!v7`g>-GjeSkQhJ7g5iLw^BtB)b zmsVX*c_6MCA$zrJjJO$MS-F$(=tc1kY);xuYz@(~Ov`6H46iFiGy@(v>kyHc^?P{< zqF0x%Yaey&{s~0x3W@C-0Y%9?DkIetyLgRnofsy~ycL zJQ@GN?O{8Pa?9rw-aGR@&(eyCz8rZ|mSCAtkQo-SNH!4Z_Y>ju6A;Gb#r8B5=n7?a z4D;fU(p}erw_2K8=rvCM@+EtTIJXW<1naQI$X?!I@7CwAB)nVShMOVSRSq_mvZ9$^ z#E{LN=t>G-1H;H;p)Con&5Q57`3#opI$DyjvnfRnok04JQ3+qQ{ zo4#m2wQ)N3LAU?pn}zfiH@!!uylXtZX!mGWD1%me;%T@HTz_4N;X)8hh3WlYx+$b< zBLV@e%rrzctn03*EZ;ED3l_wsw5Dw!u>tRgu{)b;BJ5y%Z{)*l0d&^jU~DrZyWU8~ z?lMUssy7nxuE^{M=sd=%VY{dNcu|bt2PzixwdNZ6au>#~Vj4(t-yx7lgx}B7J>6oo zBuE7pFOiwghC7;-s94Hkz)+lD#1o3ITURkFGSoF|A^Ti1I}(X;PF2(3WY}ELR9QWZ zqRBfRypl{c(<-j6SaMes*SOz09q#hnfflpm=z`vd(?C}KeIR^+fMCp9{h!_iEcJi3 z(8l4GD5t7x+7S%k;CXDgqJnjins#imCt|~u)y&Z2SnP|}aMM&`Vv41iZX2c{0JmLI zjocwgfLO(iO82Z$t^r_(@1F)DJT46qntGQ^vk=Z9_b1q0Ra)7~>6P_$b+zI$HLcu& zX_T9_p*z7kE%ym`O;&_zg#1Xqyt0h`MI#$AOlkb#iW}u_NN^Y{5om8#^*9^8{;hVpd1Sxo9 zn+|hHMW;K=nHBqohdEPEWX7pBgpFp(&R77uy-=mzs;&ms`;b{ylH8>9tWA=)jGNz;o)9BSS>ekoBFjmT( zCmmx+@D|-Mcw)YR)wgldCTPO`OM6r~7tUjECU|9qF6`FATL$T$6jFAR(~ILLhtk`V zZaS1QqhnI7nN+I!C`Ek?L~a{1TbsCRE}H_Ki^mMbq~Tc&_8M0o>?7O~zHVx3P} zLQrgkE0>{8-o>yHfg3Yu7DJaSlXzxTWI())r3G99DhPvA}>-*F^D{5(3037wVyuEQU2~rUL_(Lar?*lX#J& zWu(Q*GJ>*RD4$iUk^eQW7gkixX59Oy&HaCmr)hX+sPXE?wgK9K(K-rDNYkMFja9(Z zDHy=?H&Mt&{SQL1UARf1OjmA_q+%PxI!_g=Tr5W(=)uNIA6QLI16czm{JOGlMbZsd zR;8>fD)|i2bXg%8aYZzNn^e0tF+@JDnZ~k)a@x66{yvs&mDhAN#!xt^-+dvp%Q5{J-q%k?Am|cK+Y-El*6!j-AIM2WfO`111x9 z!<-^A{H{ISaOINZ=##A!uoIc`TI=5F2}|1f|4YQ$$wYh?F4J^Err6)Kz2$UJrgoI3 zOTC&b@770}4lN4YyLFGI`wluV6VGVsQI#T-IK?@WHEohVG#&929{Lj=WUH9p=mr)3 zA|ShJk_`Z+lWGNO8WELgJgIEq!>vwx6gM>{JrIBYhSjLT5SF1)De`C4F%R(M69qMO zjcqMNsvmMEiYiu^wTCK?;pJ$q=WMmo*^iRZg^2VYm-gMTR5|bL> z|I3i$?rCu*HUIC#9I?sy@wX4u*G`D9*=TOupr20oFu5mWjXb^MC8mSCYB19eGEHMu z4M%rzUrIOEPp?c@Ds?c*Hb~M8w<(G@d~l&La}}nsw;qGebTBE5(_{n4yh$6jj^Eos zAiUq1t}LiLlSb6Zz3aOhQcYJWbd0B*shBQJDJPYngn#VV!kuPnG((4LQkHL0me9=B zbL24EbhA*yPd!>N#c>7Gg-jI>LYf~{FdZ7yVi-@=qo2P z4n=gOpVDCh62J0BlVxraoCsL6P1+L4us*y#&3>qpu!rwv0HzbTWZfuov2xshm`=(} z%Haj0o(S96Guu*NBAAXwW>9!FX(}w!&0iC&M!d#M=g4$5ns(9PaB@-8gDNImVayTS zrb$eBL~k0PCl?IF89#p62bJX(HK}`3nm!O$YWnvUmus6`+%(Qll^p#r#?HI{UFDTw z$Y8j<_NGg+$^7f1Omn&kFfVMn6P#RFbz{7Y=}L?K4GEf?&`u-0RL#t)a-n?A(eTr$ z%;ZfEQ>K9ZV;6mea zM9yJ~HeDf6T1wd);H@>q-ht`j7(<$HEPvdsU`nwk;H zc;DEh)i)hu^l0)6hwwtm*(C0`rYwkSH>hUX0#K9>PNscF&k@c}eYc)u*9DhqI_rg| zi{5&qcQ@rUb>FFQSSTW?xE4%3F1dVO?Hbk}=@%HN$h(csBV1vo`&`L9I@pQR$_j0j znz80${GE&!nsp5wrpX)N$&_)zN)GXSGd)>@I0riA4Df?@l(-~W^AU~(fU{of4fmR zEb+gg9n(dW6pqTGD|?@EdJQwN?se!%x;I@b(2;Ael5!aqYcC9`TN|eBr^A>=`)xGZ zsPgu`W(3pI0M1R*e^Z?;2%B@`D`D)X(%uETshHhi&P>zKyWquIIBD{OeJnbx7pKYW zYQi#`yveR0MHaS)NusC*Za6Q;!(7T6Fh2k|w`SJxz%0`vUetDktUKam8WtGoYFHKL zaM+3orqqhSjJDLMU*p@8BszzjL{bHADoKrW9QFn-sd4hZjth}QzmB`(>sX1(q*HN3 z%MSIjI+bx6BdQUU(akigyTXYKXBpbH zX2K~OxQt?wYAUPJjLx*03I&&G5-7#MCWcZdIMh7eq>CppK6%Q{5NDZHQ$bYb_A(`P z7Wsurqu%&1MJ>lDuQ$WgXt? zaPj#Wd!uqm8tpW$R%DVMNJaP>kw!j6-&Yr4XYyvQWFD2cOk* z_j-?3%yXA&xr!5_!d+Fkju4jxkcjYzTP>D#&wS>`LRXc@*OowH?W)Se16`7ar$_N5 zAArTvV_jAH-$l<&N3Q%@J#r7@QU7zdjeyes?CVZ?R$?>ISBogF{RY!sJgUE+bdVnC zC2raRJ%R_D?iZ4d(z9Q?AHLIuXWf16L-fq`#%^pM!L#vF@q zWT$IB?n0$=HFU*1KT=7Vbg}%mcDQD{@YAq3dDGma{P6Al7R%y2mP)!HV$<=A*^We4 z3{z+MSD;6b`xI`Z$Uv@Tb}sVxE#Gw046^9%3(68$F=na!eLUpRMHZB2oo$Z~^vi4e zNWXjiSH6_R;A}`|KP!pUJ~>sGEg}`aJB+jeIn6rT8S0ADlr+*m6r$H6k!d?SdVem# z>`5zjXX4o{{B3p?=y>-6MYc>K>`9xcQrHNIwx>bhkO{1N(n=MA`3^0dqHgqLnvf=3 z{MM5>S;DAmzE_J#bX}6sv>p1@YhGcyYrcH(m`P7(bZPJ0I-^+F=9({GTtsww55kDf zeYm`Lrm)2|U%tB4=#&^q?pr&9rNW2-NAKqt(b~4Ju9+W>g3f4MQ6u7)D{mD?hFh zoUZ~Sq+)0^3}f+H;iJ_;&^4z}zCS2=>|#jo`*qvLmI=<@eQ$Zzsh(-xu)v7e!*#Z>@81+YrcH3nU08|6t7r45D-?n=48uKsl}K6`0#U$ zg7X0sZ*xGR5i6OHp>6E>+uaeN!ZioiLv!CI6ET>RFFm=tPjEg1m<29 zZyOZmY2_6s$I3g}D()K+oHy@(%QIUouTZe^@B3I=)re5)nxkB~C%ZdV{JYP5a`P6! zx%JT7o|&%s@;!Yr0W1AquRb|zn^5eUqg+X-_m~Xgv5VHSTTOX*bc$@SzzRV zz3sW`RNRXq4@YLOFAaPw-z{8ms@hQuK&{!^b2eVTS8y)==G&f2PDMLUvNGTqzkG{MmmP&dg}a|1HyUdjp^k#R`giXgoA=}#Vf~~ ztF-&B=H*}{)-IL`;8D3sX$QU=?oHaA(>2>G-?2{IcweDQ%q<Dn-5QC24g?`waBGhVq1x zv`+fhT4JT&yP&Ujo#r*OrrPcL^Wd)+j^#{RyXU8&d3(ozUiV8&bLhO2J_#D=7|7D`b-CO4T@G+D``B|jz0i^&`(cee<~0ojxX12&Gp1JV6h1S|Qj=)5-yPLXb*DU-Lcvp%{`^ zp=H>Wm85pt>}=VW&=xy9$P9bSH>`r?Z}=}4j-$;oWZ7WxTe>X~OTto%rv(0wTIdG1 zu03g|JQTxL2!ER^-`%JaPg{{D5o;jgiYnn#NfL_aKIB{=%L6vK;`sg}5#Z-la9z;J z)mzS1#|hUD-1b!uCBvfl6}7m0EvHU4ldBL3%m=Xbmmd%fN)#vT@2}{62}zumH?caj z{R!e!3r@Y;ZAq-`Dl4?w{g-vF{$(EpprModn!fv2`c1VCJ7*Nr@T2Se^BwmM#Bb%!Z z$Jjn=0k)?x{Q=Q{W&69^N9TOxM$tPT)+i-zY68QMLFsQ8+mAF&rWRDIB46LBtBPTh zkyH~xZJwNGMdveAM=XQC;~i=N0teAn#vGn5#a@=B3e`v?t`aLHK#G-uqFFdD=H*U8 ztWi}g`NCD5So$4PlIlZ{>YHh?uM3&~7tjc$L?63ujC5|FomP&)>jX?x;9qSP zi=^{T6++I#?)u+`{gtEzh`+5w zSW`h?a`2@R#%4pPQ;UQO%!sg%qjD?blOjDgoEYlYAJ`#&HQ+Z-crsbFVp*oVSOVx8 zL{XeMI8><|Oq5LTfvc~q5xfuZKH-Kb-~sDbVdZ58>ijxSzWtgD)=uGBa^)*EyInbn zD__YFS3>df%#2s2q*o=J`N;stgnp};a)Zs4N@VQrm>CaGy>(n}2 z=Oi8OEJN=^hcmh7JGt}y0q`T~>#6fi01tUDsECFioZy2lL)0I#B~|<$ushT5genZE z_ENhKQ(1mI2#1X9dCB{ePUK7JDM}&9<#j@xhkNRi`RT{fpQ?buBbve^I)wwz%kUz=lcyTVc*aB1 zB8A-f1U_#naNH+v zJYP=Wy8)hMUARXyfD5_-mUWFP6li%ylBDO>~I1K^cY19z&xa+r|}4BM4oU?6e#0ySd28Rl!yv!&GD6uL*I zL%*<*4Tn@{c>-qwttgwY9|86@>lc!-g;E=^S?$U!7CXhngVRBlRZYlW0`l%@A#YKU zCsqgjSPtGuA>hXVe8}36EV5XdEw@GthbY+sAEX{tvE>NJL?8Uc8G`;YpvR^Qy-S7G z&9(II0T)+MTgE85#>9FcBhx?PUpMd`DF1dFC#PhtRa>s=l{H9G(D&c^OyIlieN` zU{|*xY_?to`0?q1GtrgT$_V^Pfcr9hwp97ut)b2Mg;V^LEp~J_2YVyk;3dATn>48W zOR``jn;AA}?5~ul%|?&UD{)3iM*UD<-w44x_wZTo8875MrOG{lnJ`p%R}%Ihgze0@ zoT>-|Kl0d@rUeV{K(Jp2?BKLu(+X$|q%lk09#*VFH~5v!dgZ@HGfLUQ;-EJA4YJV> zbx&GYq@|i%20I8?-BL|*nDHLq?#tLrVMYopYz!+vK$@u{=@x5D!;9+ycO-+t3j^A; z!i#w-mt=Y6mrF^jGr{0g#;1}Qh-K*@g1`>_IsmmTwI+jU4!BQ@s{M88AA18($kO%maK9mTq0=-0T&b- z_Sg-=Sd>5pHf^W&+cqJX;*$xi7+@pfP06w;3n0pPx-X8`knSeYuPThE=H(<-r8*3j6oU&T*~F3QPG$bl%t zCl60zd%@zE_*gOvEYj!cr)>rIEELzcQ0z5@UJ&RF^G{WE9e%Lz+s_zuMzJ1hB{yU~GBBt%9YfJ!y$# zJs`JbR@3g&!~)ikfy`7f<;lIOcd{~NLd@?3^Fx`%Db=wVdYiKEA+OH6O0oj|@(WU6 z%r+5xDqlHfR{8SX5bahyVtY5(j%Cs)Xi%bYKO770>VEhu`b{f%!!7T$oHQT`%Pd!p1B}BnLj4?+ID8CRojf`d*@*Cn6fX8CbCh4IjAy}y;}-H zW6gWP`by@{k~zcCtDNB}6wa?;Q-F5uq2QYb4kO1(@L0pnoqvn@7rF~?LKWj#s3;j;+k4J$4J)#NUKb=uY^gV_`@74*9^m8~>j*6bwDY#@ z_GAg|dbkFmL^+Rx?)|CD%4Vd&fWM(whHAhzb<5n~k^q6-bmPJ=rTwYIwF;+_gO~`z zeCp_`cXFa+5pK0A$rfR_;*Tn{4i!qv`b=_t3>vS8WNcf9u$QUW$z3ezB0@qB0=+nE z{iNv3eKe}5$vpzA*!(I)!s`KEMb)7I_l`gfe-7Hxa3A_e}z)cTU-WJ2NR9b4~|UIJvVZ(i!inCIKBl zyqNWgWC0DG<)bvd9#Juq8#O5m%mHGSop#C$RW=|p+dDo5qPkg@3&c|U-BTl;QW2Bt zo!Ud(z^t}Y4>3rY+C$E&m~uB(bZI=wk_Wt%_E<7rQrK3;!!|gz60026%)yX1SB_;6 zy**Yk&2a9#Dwn+Om@1bsyvm1!k^e6x%qphQhunZX`lu4>;!Q84+Gh7ISr|B%4|*d`jBp* zcx&0sH;miaKryNf6r+<26x$f`s5VgO573wEoco^ueZ|h4`vlOCbEk?X?++T#Og;Q1 z;JUNP!y919!|zqml%POg>m)aS9ys%|$;}&ZlHL6NsWA1v{`bK2O^V5U{UH@onPuta zOm+Ad0Na^O4&NZE!96pFe^dolrmaR`1FO3J{{if1Ho5*O zU{9;CW@wFbkx8M0x#JJv@L`VDqS;3NJUN9$xpGLS)d7 zgF!GyOku!Rd(n7S6&?=^eo%#%qeLCN`l2FX?+5ls&T_PuQTkGmzx)G0H``3vrXtFN znGTV!z7yP60Jk%THZYRlw3TTZ%66z=skJASF+gm06XX+sJdkra6*9BAw_92677W_P zLVRl|7?1YPL5HE$_T4H!IY?85*T3td+eCO6OpoQbQkm*k_yK%S1(w~N3XHWWvSzMD z_QDud=1Jh5$+`J~Z>Ok7c>ze@l;5UV@e!4UykMlVF#B~eVsZdXF6PuG*$bWQSKIVi z!#WtT8B^KFI4YX9vaJCXQV!zuwWsgKpDZNgM}WLLw*0pSevLlTT-l20pr?W4Vte3#U|DX>^~8CC?L*vHa|;&R2mp zp6jCtilJc)aEcQmIZ36B3ijP|?b-<96I^M6bMA}ZYyQ0puiKTR$tOcLDQC4633%U4 zUPZt9+0Q?9CD%>Cj$0lgQ5Uyyps%4oI>gw!VRUnOERzHbheav!ritpY96LY%l-rTB zXP1hP`nU~C#k<(C??Dw`UZ$TEUuhQ!^3QWr3wx}J_zYguZ2?>DkbaAbp5(!0waC)* zAH1Lj{~LgPjt6ym;c}M>^>uJ3vxG7`3CIi33n4bK%;_J-@#p?vFXG;A3_mOx>+B?K zV<-`eborp%#h=xutVYU`3JD^Psv^phTyq7`#t8}Ngkn1#+sKBDRWD0xg{URiLLp=2{3q$G&HU z1YQL25of8}qyn0O+R7Yw>^-jFnfRppc><<^6*suV4szi=m61&N)-{fqhe8V(6B9za*^u6Y8x@;gFd-y;q zvzMi{5TbsSJM?+2SOvSe*P0i%aRUh>ahq{Im>{xRaa4tFrl8j0n zR9Izz=~Xe!qqRoNpNC>0=7Vs59b7l5P5^k8>(xDT44y$Btj!_kTB?GZJ69Q;`j-~4 zr31Uv^~OZQJhd;P;{g539JtEEd}LtDq6Q78fkCya-%P{HR4{W5GcbCGnUqifoRuy* z8D!J~))DnD-$K(itSGUUZ;Q&DDnxTXU2-;uJQGyqS2>%UTI9QL zk~PY`40@k7`!_)A)+v3!9(S?#(+tptb;^S(n!HS5K!e^%VD2c?Io+)QzT(0vlmQkK zb#-w>@6`D!l*&e)wI{PtmHh#LyWKc+Yy?-lDNK|dIv$%85bG8y;4%QtbJM|NBci-w zQ3gQjNvBmn*|be1)UEN|3|yZZhmVc0x|t_Cd^|oWt|F)o_ZHxGy6FJ25x8{X1IQOt z9%hY56-hmWTn#pZ?xo3W-pwK8E7N6*T9UJ-zH}4Vj=E`OG^uv_l~Gs{(IY&t{$KXq z2PTp%%@d0ZA|fLq|B#WD{~>9TBC9H^3%Zi3q&s_?KC-)#ZN^Pc)6>i~bHmKg-8nls z+jJGxMPIRA&Yi2}G`ZSbEo*T)VASHvM$V`j zV*ty1_T=%yNfMv_S6}|y1?^jO%y+5MotCOLFHzNDCT|Jy%GTzLyjpAXDnzbnur@UU zt4)~9MSa!Q<{R(!zw^e>`|p4KowCjO0TPXwiIxYP^NF6B68{1c-qv0}lW_GMhfRr- zrr`S8DfeO0P7)Fiway8asK z3_d3*W2R9vlX?S51>JF4{HRT3Uqh_Yc zbF4F!Wn_x^H@Gg~@xxE_9!y$(6Pb&hIMBZfg;SCNu4pq<)q$z_!-vMXzC6pld}J}kj{+zm2=sL ztQAvM**QC-Wz(}FIlYjx6wVF~d z^Uk)-i~#Ao#;#C?9UM6gJh^5HOH+PP^Dp*k2!Gf;QzeN{z*vVZp} zCTk|wUCpI~-?%MV;P!Zn1y}4Es7~2f68sq|%hF6*3!6-PdBKb=#pQT``!do@8I70- zTh-L`3xRvX!O9yo`HDH=gnZu13J^27+PSd>G9DZ^QQdZ!C>1I%&j=tyo?=4cCfla7 znGXoQS_o70gvnRH*OxKCbuP0aCQa@&aI3V){9a_DZ=BU_kBOsH2uCYG;J>xV+C|Fb zQ_HC=pChHaYfM7gL^Kit-yDAWL|?Cll&@_wOuvb7nwZr0vAqDu+ZzlrU_vxwJTeDK zpx#NcVhx(8pn<9`8(SF!`rQGB9x~DXI%pbwfPHVcnOg9$iB(J+`ZIwGq{Gx=Mog}? zZ05jg9$~yulP9v3J#bnxEd7khQOvb2r1<^!_J&B7WOAYXV~?g49;Ew)-=l zd%c4R88;wtW+2LIM=(Xd`(-0~)EC|t@RwtcI5cO1*=?IZ&G0&Gzo`l~X}~^uD`IiQ zG_G}%|Do}Lk%aF_X>vpc1_n>ye)*%f@)lP|9h7+t0dY{K@<)GoktkBs;)>Ucq>E-z zfLgb>5_M3M-;U$VH8&y8uG#6hfHoKn%d>&JLwd2}?mdg{qAK05&J zH@NcoSvJ-Jj-}yAEQ7?{|MJORPOLYz`y2dKZh!(_lt;yd!rVmzVFCs3=hBl zqkqE{Z7D5jDSr7|H@Hre?fd$t!byTpDiO{VEePBbw$Uok^Ms;IprBM|*?=;K?F@L(kn4-aqE0uf;+y{D( zJbvMrx^B7WDkj!eT?`X_^1?|K+F_upYbkw=)sklLs%vS86~=3_u&Qj#Cg7Q(!#~Tj zEC&rlTzN0^CeZd4uCL>+NQ?K5w_gYa*sR1D5cd_S~m$6UOc{p^HgGin0x;{ml- ztXUdxd+8UYgommpX5t(*7o`#CvoA_%2I??Dir(bmgrNnzx5soAH@WueU)=-XokNzF zgb8rgUM}~Az*%rT9JQjPiE-52ibsmKc&P987>Kx1DX+?XyN&5R(t2`@RR3d3%E0NG z9pne3zIBV7VVdpdxtu!6H2aTkaOh}89V4nV3dN>b>_K!irO!C^3*H}P!0R`8jeV>u zn4gqV>?{xi2BOo3YN?9IdJe<7HDUhKFG}+alQA)hd8Cs7UcSiqS(ERqJ;zI+ z|MK;}*k-6P16AD-2R*DKjvKtY*77nZZ0VPy9!p%rNNq4X8!HoBW|OH+EU{KIX<*{I zTVAOU9=kxSVGOjQats?XW#Y}7sL^+&9=-3TThjza@6Ac-W#hN0`or%ZbV6JSMy zqKm%3vnyWex-$kZ&Q7kBMGFwEmpo5}F-ksbfUB!vPp^hKgI7}xM|w5P8%({3qx>o} zR1>U>!&Js`R>t4E!PVpgCNW)Q63a$>fk_+Xf38c*;#!QpWl^4D(mv!CER&l0=WdC+ zBlneWd_oaq8CNo}h*|VYwa>hw3p^E<=r5T(rO)_rYGU2RCT2COeEAl!-o-M4$&&im zyn@0X{n)ZyCuralO^)1GzT=5l z5wJE)77gC;JIeFcAfEzvvxZw$=o!Ys(&4789 z@RConW1?JVFDWBXih*`(KsC3G5omyc_Dm24P?jP6+Au;4GsM1$P*I#pEkDb!R()Wy z$%Gnrcv19m#y_m(m$O0qDaJoC`7+`g75i*~F^^3q4V#QvuE1w&3~*usD07vXdX{JG zQ>)ZnmNn<&NyF2BRFT z(F$mmy6xF&-KqiyO|bJ!D>c2h?bhw82w@|FVXeO4Ioa#A#NlH{3|^N0!vbR#m4l@GAr;oB@qn}{3kaZO-wq^*4K_G6T zaL2?)`j68Cr{YIyIPQz3)}_`2kY&9kOt5UWZD0k)UTGcorYhKE71n6yz)B3e+&bkQ zs9<|ctkr0>Dz2Gf(2dqSWwo4xl!=te4H!U`F^jFURlu|f)b~ZHOm>D_ZC&sVSJLh` zfeO^n=6g;38`;Ykf)7t zwW#Ja2b|;IhYQ!(m&PGYEV+EFpP_{SiH6o8CS#n9K=4Fy|}yD%n^ufoBb}%6%}T$C&diVl%`Ly=uhxh;_+He#6=~F31JeC4bB< z*z;P-vhwBccT$f`;e#bwSut1GC0c1%V}!=nh2jUg)`QQOamcB0o*cyHXX?JT9DO0jDx#va%*Ra zDe!hoo<{2}SY)bv4~Y1GG78MDiSd>(RG1pvPjkTS8Msc3O*pGJd?4#t%1=gU-$b3A zbsjPPfywvOyHkb)ZTe||JT!r4rkx^_b7Zn>ZHUIW$0pZNbM*(!20z*_^#mxZCnl)g z+%(Jtotl`&GxvOus9)YF4KPt96Q)+abtJ^!*)PSIAWIv0T4->cwyMit2x5^>8A3D> z_Ug-A2;$&HmW*OTtmVsDh})turo&`niVWLJ&6?QX8)j_HWY?b|XBf(BqRy?K956E% zGy(XjP5cbv&?B<2t6!Fwc@CRg*V%ikU@DWAVOG+JiIS_i2xlYfOce94}Ai*7dHpdP!~7Z4rr^=fdL6x_L+o)0jaj> zJGxCz8oU~teyrQ{9)sB#K+@&)nKPZ677kcOQYN_G;zE)2hO~jXcyVE~+FJKl@MjDl zhKusj!CGXEqL4FWqHC5S%EL-AQY_;JE4b>Vi1Ki;6FKrj9=y;Y6X!Z-byV(8%Hzdu zWVdR(7&ha0^f+g%kjnkEJbdg$_NwBInDMX_%QQ`kz8IId^4NhanIp%j0se@M965el z>JuB}SvGR~1dIDKTFkPzTw2hM7Kxsa~$zW|+K*an{~0KnCd-z9_9RRKY}@x0)kC>cTT7;_R~D z1mn+|{Q5?1kEJtbqRtt$90SaofU125n3}NVkntBxzNfNPQ)84O7KLSK(L`38HU};l zq2er=-1??1YDqKPvVp6%JL3W7ORgBa8oN^nFkf=jU}A+uzg`))-<5AGqPgc>fQHsJ z0~NO!O+?>TC@)iH+N!$Dx(UYq+2kjzXSJ4nNx)z|iYB7QdX#&4wrv5v9^p1BIJ4zp zA+y}8$J&+&2kWtE;x4iTF}~clC)*||uVt5W%ZRA=?mWLC^#vQ`dDgrC8Fsbiw1{Q# z%Rhi$c&>NT?$kDmpFh{T55U{0;+eTe?>+=?*W{h=-ACZ>nfwd8?@ul8u=Wkyx!$|T zn#Dm4zbY5cRv7=#kM^bqR#i;NQj#Isfjq-dy|Y` zGWqp;?>Yq1zDGJ7`&P;H4|iAN;8-j zbgB6ubt$ibx}ZyKS9htP39fXhM>Sn4Y$9s9RJqmfv@HhpE)}WZ%;tbDHLTB?cH346 zhb|R0aTj%|pN{Bp_S^QWdQ{Aar}wBCen{w>_R5Q_NBytdsJNhg?N8pp%18NRkp49W zrI|vi9W3??`V$sLaFm4|S796SK>UM2AmS!M>?YwiCbFYV<0h15j#bt9Ok?~BlkWtd z9WyeU+p{o(OqvjH8FH@HpT!t*%0$xQdv(1%OE5sr1kgIxnYw$n%L+GbVn|4J9X&f> zfV>Hy9kX)%JWH_z3MLPS87dVBujBR65bZI~m;kK0lM|2YE+2i8d6EI7cbq|HO~~0} zaXFU$oXM9TJk;wLkslNobKYb^KIM%8;0OTHH^(3gCWMYNl0&W^k!6S0eugtdYb+a! zCd^as+7AG4Y%<`I38XCxN;CZwsl7G8G_q`R?Kr9Pm{qavmpnUW(N_#WwGB^)m7=EP@D9*(i^mI$k_MKi30w$)6aT?dwzs({oNqZ#r`tOJ=q8$Km{^vUStz{8K3 zL*}lG9?0Rgi8Fo$nNsysFmT3pOpLv{0~63!0kS7JI3`&A#m5gP9_cn5&_D%>boWe{ z?XAowkLd6ls+dHEYH<4|PIxQ(DFf*H2-WI4FhOe7xB*$s6@!NPr2=73 zIF)3=Wc1U=IG@Rqt#V|M|6>zm#TB#J4|Qj^b{+Plf`QqjUp%D*+s`FZkn5HW>RhcNwVxpaAJOGvZ2VD#lzaGDi2&hZ12{u-( zh5HPWxSpz#88l(n>J2DZ;OJ(tlGjCcj1mW+%owscuBhA}yux5T*R?V%V#3_IpK+#V z{OPMKLh5>~DmPIxQk{kQ*I0z~^)!_bEi7h&mCBfdZM@eRZs2;NoRba{hbt>T`|R&N zeEczG95v$ZWzfOvyCGd<+=R-e2LTnl!C*tzhsr4@OjzaYE5u0;7;gCbL0MeV#Mx{7 z3Ke^=eGEHteS~DPXSi7=9?h}hW~f|*e~Upzua8#2QzjhEOdpYu3orjQhRs~hRAJL5 z7G0>?2~pvMyv-tHuV431xkYw%y+ zXZ~yTrUq@ijl#U|m?%i0^2jDaeostJ!$lWM_+qO=i7~w|#~g zF)=k8Z#(+2XOmfP54;WooN;mT%H&cxN(YJ|YiO&f5SY!h&=)sS0)H!Y`>R*eTIVVf!Z1ODX5~e?A&&lHKg{5F} zr9N{%Cj!Qd!RWM~-C{Xl?P%5nRDT!L~Ei~z0d~rC%G1Ee`;w2M>qdc|WZ$Xr6o{3sEL5`X)uYmBaFfl78 zqV`*WHKvYLlWQF6Ma<@H##=LaSP#>8>S)MhC-;DQXOyAVP1MC-F#!GU6hjwH^hIAW z0Q+8^<$S}y*7TNe3+pYL1~YCP|6eGdSV^~#ZD*|!UY`N`=mDKaU)GOuH2(bOKmU(@ zmzlLy{*>?gKt5n?@}G0#4g1=iKNXDAyzBg*_kAiKF_ZVF+}%S>`g0ibY49Hg*jNI&HayZJUYj{AAx+krG?0^eIvfQA71YXG4qIQVR& z_ZyF%eE2lO=IEdGW64J& z>fS*yAI0x~WAZb2IKA(G{lg#PvzddIEpIk{1xak%VCWGE$z~sJw`_Z}A73>ZoduwX z_q)r9M`8HepTu8blcdaNy=D5{@5bA+6CbtTWq-S)+3e$oYb`t8Y~l(j)pQJ|rInUl zZ#H>_sAoH#UdZ{Dy(>nqEFS`NM0|L`k_H7$ZJuKO1sk3RZA_M^{w-`8*bdHggUr{h5gppUU0KkZ7g zcK+EfM4*toX9;JU@-vGgXwp)5%XC)hkK+=SN|O?{e$FG=t1mpVMMW-4AQN%NvZY)N)jo zk6+pedwto?=a#`pk0rDj4*IhFSBXOjR;?aU>__p$`yX~?nZeDcbA)ou2y<;?VA;1p?TPseeVj{U>{*plt)kF&l`3h zK75#I9=V{ipJ@w*uTQ~ey^i7LQD1$pYGrsy>#|2{ly1kBMbM|VTjOt!r zv@^!I&pVpOeA)X~sIYQGs&3}=ejaHa_hoLx-88TzWR>S8695P zaXN0AykHzWBN0j=JI|W$e$$jM`|=gaM3Jh#uV<0Bn{rpK20e1c>)L3VzSgYr`D zp=N8GYMS+Bf8pw7DaU8?ELI2OO>lX^~*BTYi?zcj5^+7 zcA#nDIR!FgTp%IUw0MDMW;A0GV6G^Wlx(7D$(Q}+^D<8HYxhVg@}s9+udpeO?wft% z(fe$;WW!KEdpW zFa}R+T78b6Kq{)UU%;~VP;6Rz&d}0Zy(h_(bk2J{4y`}O+E5;9#>%G;4?@M~jIk7{ zdKZ8a|8O_7;mZzOS_Sp?Vp+z!;#F>U#l77OZThn5OGTE=V(r z>X}8H<e-w^|h2WrcST37z<| zPwVNRMwS7u91ta$Sv1P(Wu*JYGJ>&QsNZM&S#O!vt{29;qGIUOm;Ln0ssFX4c@!*N z;NI1gxb~BKy)w=Zr8v&#uWw&!gq80JV8;?K615W)zk;YVEka%-YBQ+#>#y9L$rU@Y zU1g~rcik_09_Ycfr<~V=4u5?|wniom23SL+xfkW`X;*@oh3a)hgTE5g{PmX=&Pp^+ z^fHML7lU4ZeP6aFUez8Bwwg1KKcm>6&j*A4`l~TDkt_XvCK&eDUyV5v;j-13TrhHh zkn&FyUZvYl1f%}?R?iS}r5-;LjQO*l)$4PHn14^5Jss@uXR}vHm}=^;Y+GW%xIg=! zU7DPEMNzF;dsJuQUSsF7PrtIId)n2_IzpBAS-Gz1@k1q;@Mq_*mRZuy{|8w-3?%*8 zH!jQK)lBAIpvPZ-T4%Jst60nJK$f%RQ>`z^K3elnu+^A3nryrogOz;}MNF6?Yf@WW^6EKV<@$ z3mQ|kApP@0R-$-~TZT#{&wn_O_1B;HnNrStZ>h^VpPzxim_Pegz51v~dZ)a)Yb^0R z?z&eg7e2?-myU_s6BzerU%OOV`OC|5`6-8MfeC;8%>*+))t`5kE4?~9@4RVTktqfy zpRa54o3}bSV!TuT)blj-6}sAyKj*K%wPcnL(nyz;)uHUZfBGU%!f1WvspVVx-tdk; z@2|gQV5U;<^I=lK=bQe5zy5xR8Mo54*-;P{t>~Y*pof{!kVmG`ejL1f_=vVd^bfUJ z{3ZYF^D2v`c+XjHn)lE7vrjHat2tIE*+o4{uO`ymC7nH z#^H;{wKLpz9_mAo=3l+Q_pX*FMVub!?)$neyg4u>q&=cG8WL! z9g3*8EcE!{if`Lrf3vV6|NPN{i;pWT`gSfbyQVy3^4w8{Ip6LDLxUL&Z-yRBBw0!^-?&zwgAK{X3TyuYB7M!%uwnRS&x*eW(8V zn-OM#s_z`sOI7EjM&(r9`(J;QdCYE#kNHX$*bh^7#eU$jDBh?Xm!2Jrt!7Q+!TobYu?~y+2kIYGsZ)aTy>k>ZoAD+B^&RxH5o@kqq`03Cdy|37&6`nF zTmV^fw?!w=U(q%p#DmW{<)z(htb^?{a#l}>S@>A@;S$$PqQE4 zJ45|2rQ#h5)IUslPS{`CqMv%OJW%(z>$x;4mi@>x61ZT2gMEEjRZ3GekE+HK_DMNc+Re}%-TDPwOyudPe=4m@Ll z`io;sQoXtGl4m?{@wRC1RTdrRJrh?Dap{a^#xr?APh%N>uGcp0nYv(zG2%aGCNt^D z1?ul2m;%@jx>oNB)mbtd^GpY_*Xy}gOiZN>k9zVKn1(X&GS6htQ@CJUD|g^>o@x2* zIT=oSW&-us)M`c5-sMj1u-=Mc!ZUlp7*j1xcVH-w#@VFL!=AY-M69`@o$~N7Yw^rq z(08g+gkND^-cIqVjDZ<`a%~|{f6=>I(v_#2hu0P_FyH6JVWEg}_4(elr3)-BjTgFE z>t)LWbnz8M`KsP|HoJLkIZ%I}>uehOS2A7k$|^NWTF=H;Pk80pN+5f;Ue~BfxcbK) zm`awetzP1MlvPsmn+X){@xv$aC-MBXwLtch=cZ^ZvQfl(8%SSa$!YZ3dZ7M#NL3lx zr{t_~L)VHI7|tsA#spO-fLTd z`im&%QZyD_*)OSFEosZO?F)2YCB35iQ}<4w{u){pyz;9rdLHgqJ{Tg~dg$K0p#G|4 zTwZ_M?!7?v2eobV8;__-e(-Lk5nN3JI5$oIU2?Wy+Pxph{!;za^p!C7<=0n8?vlj% z-3Ni}e^5WMihjOAT2c4mxycXqvFHMk&uB9Hw@FsLb6Zd14);-=ys$k?%8IdD^r+^% zobG}W@BHU0r`mA<%S7!@AGOy#;ze~wlJz5A8`{YQZb2=sx2T;4u;s|a#xIys8yQ~L zN`bQ4mV8-0^?6RMxUQPS!8ck8wh4w^qgLFDl?-E2D8C>;;00@quLOq z#&UPJjuxw2yAf?Tm~E{msS4CPtc_e++%h)xF+Ss<91Llr7Zmp_vUgC+Tv{kOaNrY<#m<}qD{PH4I3N{1IkqYT5xwdo)x+ARC}`T5%HQ*J6JZCR8K zEq`ebq$v7ijlpAD;kkXE7FVO%Oz@M)wVy}nEB?Rv`!^c+8x8!82LAu6fw7Fl*-tgW za?mK-9d5z04;lsC1MLUh1)T=n0o?}O20aAb0zC!Y1hrffEE}L+&?0CObR9Gex&}G~ zx(Yf9x&oR9T?SnOT>@PJT?E|(T>#w!od-PxodZ1qodvac1j`I)7_1kfNp>)pxdA#=n1F=)Z!B?B`4|=^b|Am z9)OO5?t_kj?txB#?tZL>XaRHpbPlv1 zbOAICx(u2ET?6d_-2hF3Zi6O3_dw&IhoBvxN)YuA8Uu}jra>d1BcNf>3D6*D4%7=e z1FC_}gE~MLK^4#yP!V(;)B?H*T5>=Spr@ewpeLY5pvRzM2=xyd0X+mwf*ydTLH9w2 zK=(jLL3csNL3coNpxdAY&@Iq8&`r=~&<)Tv&?4w2=sM^w=o;t&=ql(j=nAOVg!%{7 zK$k$npo^d}&;`&0=sai&bPjX?bQUxNIs-ZmS^%8_&4cDar$HA%bD(RWQ=l85lc3w6 z6QKK`KH z)IX>fv7Gj(0R~p&=t@v&^6Fa&~4BS&;!sS=rQOzD39v5%MSjx=lt{bjsKjNd4YH1ua9>N zf~xXPyg7N7@RnQV@AI#L6XNZHDoFfW?ht=p>P5&c{ObhnHW2OLH_JB=+sUhV_Tir@ zzYC5Bu^Crt_PP1{LO||CT6X;ZhHwj5dg_zAgb*L#TNx5Dg?HE+Nx_@?0sjEJHkJ>G z$wS)6OJ8lMbj#!BKa_mn$zSrqyY{#F+XC{$yVXBNDtCnd|64+rBq87J$e~k~`1km3 zLFSvCZ}Z)0%hDE;1c?j{h(8zq0zT6CX z)D&FheA@X|!ENs>=d~S@WaN~G%BW$rpaBTTDcX4LU$lA;_$n$vm3Yu*{+7@SnUyCy zO6w7v$V>H8v-Ai$bRt{@whb{Tj>LZr<&aR7F4V#6{5ORM{JXAC`Hz96uHlmIAkWlI z@K?IUzX8+@{saCk`3b_>5%(uZ#V$NSnzz;4m1p~H)R`Ogd<%K;@OMypbUD01|9B5b z-(h+=s~HbaZG1@ZA%Cbl{8NPxT8a;?1l5lGk{l<~Q3!QQb@Phk#NRuzj8YMzU6zF| z{+9d}{k18_I`-$t(PQfrc05icb9P_OO6dv>?* z0rb_4mM0633lqfHDaGb(jba-l~9<)+)#JqeK2}0$g2muHl$0^-F!3RHN$W<^Rj$LAX8{( z()t7sv=x$D*gv!mIRumDmOenf`=qZSN3AZ>uv0?)UJ5 z9HZTPTrJ4ux0tSE=`n@bpTYpjD3x7!kEq>UuI1X=t*Kkq5~)sF`Ob6Yp_ca7RtmeI zw-i`Ns$aAg=eLDB(DG|S8|ttHnjr1i(FW}pmYSvSNbjLV-a<{b| zhhT|4&{PZGF5QM+Zo^e*Lo4ltd>WIePXx$P@OM#G$`d&{x1m#)`UcVsG28ea^5DWK z;!?kc{@o^gAHBaFD3lHo$a(QW8tIknizIv~eTb)K^rHZCc}?Lo^cXzZQ#0Q?*nA0z;Ci)Ky(OEdo?Mk%}9C~_xE%YEr>G>rSyn2^Ey{Hs*m z;G^nQ+K{RODrPujar7jE#q+Yl5p7ejB$QYWDcNYptDnt)N z`gT-dAO9}ekN(t$L4$@PbR$%Tie}%8%7EIDPyMM)h6J<=z470|vxM9l10{@%^bX~T zxeP`psXxeJD6~V9kVO?3us1WAs3d65#Y|s2{*qa~#lM3_^fi>U9Tm|_WkAjZRIj>h*Y-VsZBfcW2s_Sl=ytA32w+aBk~)0kQ2Fk z24q6{i3YNvzP$i4Zo9DrvT3`$N<2Ha4l-%yHbAEA+>;|8muMC`d;DA^{K}I&Zq#iP zI>&=tw*5|LBE&^+zVRR9s_<{)!d;F(c5woiYsguP65YR>YdE2R>4sr>g9S`CoKir( z;aHxM36XD@6^PC?lw6#|%{6RU4F-9vK_D2M3$ALMOWtlcY&dE-REp|` zZSdB{EnJ8#@jDG0w!?cdlDpS1A}vcR%91K^o>IeJ!+yg7i*nrHuxi#GYsxBD7=zM~ zl$Q$9p0qDHtQ{m^zhPKfl9rSORVCa$QafqT1g{XpPYb1mAz@O8Q;`lD5|q!whGk_@ z-NZ6s3CXOfN9vF*W}mVriFwqpsw}Ho0|`26NQ?dAthgX9ip%1r6-u)9Q1Ol%#^nil zPwrtEK4xhR2`APCc}YG|W40dK?@{~;t@zBjlf+kR4TH|pUvoLMD51v;LU6yO$dBHsfPrzNx;B|u+ z6lPss;swF=y3(2?ab96qz%DO^h7rDiP+S%r6xJJ)t~I8=h%hd!ipQcwN?QA^L3v&7 zQSvq(@}k0E<2L0ZDnx`N(o$tEB1{N7u6|G6CIJx>_8U(L5d&r$2)o2ZSw#*|4I~B8 zI%@3?4QRZbO9>|~hc>2_w6J?X6YN}CICX^)U~xy>>ntn%!hnzwvcjmeA_c7x>zH-g zHbAB5N3f<1P}T>)k7%P*pkb&wg;15}hJ=Fc*N~wRL3A$>Zv@;E@a#M{EEJh^s?E4H zVJq3Z?znq3blNr6U9kOq#2OWn?oEm{igROqOeJX9w02ha}z?ILZ%Rw zM=nDGHz{PaobCH)5IMm~%`b=cvMDY~hf-Wl$UE|ovT7gDnqfkOUDps*fXLD0!I<%nF7-2TL}-i{bE|gnQToGxU@JYE->4KK;jLc3wpgHn#^UXsB1_(ytYSDhr~f~|Jn#u)1bI0P=6*n6=iD+0Y-5k-}5|>oEJ?u)0=l55#DqwQ*YT1MmD z+%$>y7Q9Q|4ex>1;hXlIDpWUlaYoz{7p<$-q@0Dd-jyv%Mnk>j5uEm>ef_?iZ`PO5 zBo9X!%zGETMem+>-;2+Ne0kprWpWlm62Qm;N7BY9Y!1qv@@7a^v*MD#$*}(7x^>Q* zZ(e4#L2r|UoJSSR0SP_Li7QO2^J3Imw61z_xm@$AKt;>4%oa|L*2(btgx(x)H^@6z0;xCHRa!{Ek?h?%F3Ak>aTNJ&lSuKe(a#YFsw%S*3 z2AOL0kRsui#U(L|(s?jQi6wqYQ=JO`^S{Tgz+CZ@a{@j>FQ ziK}7~sRdMSRTQNG>$a~WR7Af+Q&|_sy`uzL7uUoLKxhnWq9P4ikA3;j5^;*+x)_G= zW*4_ER;q8i|{UDsY?PzGh*qX-iC^B8Qbt$GUU2anhCcip?3VjptA| z)ZO+)O&Zg9Cr4I%*LUP|_%(lrf2)DYb}S~X7XKXbIN5;L6S2pt_!mN_l$#T>uKqDH z)yLv?16h?5G3?(E4jS-yDn|W^7qC;2LdP_T=T49!n#HLYl=eu1C|RUU-xxIui*!UG ziX=)02toCW(gcm08VCl8pfsg%POd{ztQqTsZN-)h&EMN;ppm8nEEwVhMzdl6slVj+ z23^#elTweAlG4(oG$rMvZD~i^1yXQxNxY2Uqwa&iPH-=12`Ql|O>%NQ;BWeqfu6v8 zU?DK2$xbeXNUQ!}AY2YoJzQEkkoNqMKq@d7Sc3oI4F-c#nqB4kVbVtZ+rbiEolb55 z&Pv9=7uXLtf&~P*RBjMn!(?D85W%Zk<%Zx!3UCvoJG5GWvVG-gct z6Qsy2jKQ3LimYk|B}h@&7|g>m!eBqM$m;-wjl*CR5!NDbV<^%vg-yVO>>vy+V;lv@ zP}n3KfJ20}2^@I>;}kXpZD}ZbJ1jTkO;K15`imp%hQLih-U5Y9L!&bYyXE9^kVooR z4(;i~O`dmDZr)R3pJ0vxA7gx!HFh=R{j*bH2$afEdWTmiaqb84w!Mw*p2 zq-lRK5F^N}G=rBZ?Jled!j~y*4v-?EbqO3{BNVnE%}e9J-G?2JmIE6UwkRz~r@(bP zxdq7*7!BkCD}lqnN|5yn8iFiVhjrMRw-&53);a6Eb(^9sNsCekwEv2eTa=DM@uvPJ zM`AN^l9zy80*rI-%GOAr8Q{) z+3Jh3Tj;nTU*oxLkhggbwWPhnbJVuqmAE}=JUEHy?@8RglnIXMUEx6TTEo_? zHD}A)R&81!9-zv5-^m?F1^;GXv}vNLbWgiKrG1m<4k73Ro;#AJsr#LR@DgW%nmU@M zH32T4?)!uWLqnnA&`4-BG##4OBs)hvGa2d$r9!#T3Kd0zc9#(eUEX2s2{AufvrZ~G zWkcCj_LT$WNI6zY$_9bG@U}MrRs~M8LIi~ctzPRe!tD4lbmV@H!ot>|HHR=5{2)B3 z0)<6TxG{ubT%=MiQdks@)-1x{#*oJ~L18g#)S5yVjCa(!DZPuDg6GsUM!dMS!x{w- zhP%V+A!8P|uEOqR$(SXq>!Bo}5>^VGCSNCR^${vz-34l#P)X~4sGm?tD}_#LA)ZTE zV-(V3Okx&cFt;cn1iiG!IushEury{H8uEZ%nz9au927PH?==b>40gXY zOd*5T0qZ0}+Ieoky35S;kafux4=vxDrcOF!jfVnc0Eew3ROf0zom1!4Wz_tFeOkK( z*U`Eyy$5qXVvYMxZ;!;Mwc9c`VjT;uHSHkzJ8%H4(^{v8%UCx;o1r7L&|nkw18OMK z+FhQ@g5Sk+&_6Yj90)ISd23ugZOXq;&;*q$SeGL!_~G{bNP!y1j5Q%!ns=Kw!;7s2 za(HL0g%_3qRo&d2H73tCuQYEr?=%;~8{s7&;Bn7eQ!n(tFe1}9v|!z_9W<|X7c{4b zTdSwAd||A020!#xYFM)N$OUqV=%Eze zk=TH3P05Nfq7=xrUB(NW{j6Bmln&dZZOXQ5Q|zUX*0j`=@$)|M%%R@btr~@Fz?WG>NDI#u ztzkB5ZdlWiP3CrPSbGA%Y+5O(ptYjQTf-D<%erYTA{JV~rgeZY+n5o~0fSbsWsNY$ zW!qYiBZ?zD)UMpzVvdd;5+eya)@`c;rMLmZVU4nMcdUCa#F&G#W1VXmzk5o!T`L6_ zsG00oI~Z=)dh$Y?4Yj*gk<#9?Qcyv=4YOlSFwCCS(VAqKJ*!5TeJceOs4?wXdl+Wl zx*16^%)WJ)Fb7r&DrlWNw{Oi*$RTFA#|S|aJFxCbG;KV##+nbP-5*!S(9nPz9Q=r?Kx#j*_B>J zBu&n}utSkF*&z=@$*;qD%F~fO>1}Ym^2!VQ#PyN@aC_k)$-C0~;DzOrrX5m7SPsfZ zO$F@@xJ}^EtR*66nvaPWk;8I76!n1T!txSHipmjr6`AXkxQN{If+JF-(3l*RHOPO< z%|+#@=DFt8<~?-Y^b1=rlu$nyeq!iY7=Gd)7=98U7=DuSSU3Y=@9`XUy!Rz8B@efZ zv}|D7NfR=JVTeh~vt%}gK`K z9oJ{cN6W&Mjkc|}t+nm76HZpSF?kO^1%1#)2n-(M@)#aqK4^_3e;vQ+4zC8aUuc`9 zF=G-^@%!!YYB0Z9Mi|Bnn&@m$*fgrLgfL77a`HBXsMa7}? zD?`e(qEK=xXkaAG-p`C`2a||!5ash(=1#()H!)@b~uOe1gyvQkR#yU#zFTvZ8vuy?9ZOBD= z1U%S^qC7_-oAQP{fsi{+ZbP1LTW>pT)2=734{-Eb;HQW^VFt}LC~g7<$h%$x)|MzZbgrx$I;E3^VFtF zSZ)xbL($>r99T!ud1_M@Wmr+76Vb`&#!bSZO^M2Ul%f*?ZHfj9{E|8PBosV=FgPR* z=vkjNYlu&ZN;xdfuq)wPe<9L}-!n%aRWxM`Xf!**Y*JWI@ha;G!)(;6>`+J;c4HqQ zXmmkkokAi?SScU`jV`Q2LI{Z}5k*1P(6}N>l0sriR9Qs`8dp@=r&t}ZKH`meYFsg8 z3VR6fO_U?zB$T)k0SA+WxRSpqQv4)V_r?$g_amWXZcfP`pwd!`C7PocDWyj_ZJ(zB zs0XsX1zuW-MQ4bYR#HkBxx-MDQsyb7Ur8$ogtR-kv@#N%iY`UBqbE@f;xXFvL%<&* zGlR;!c1z#}6%A0dh9SJ)k-1@I`^MglX%wXs6CY*zM*hYk&Gg2VU3J(tW((el-?4Pe zsx;FZR~E_7m{caz+1Olcfh{mjDU<4=CP*AT9Nk>hB$dl4Q)($D-d1ieYB0FdN={w7 zH540;?cFwy0s*Hjl@N*ko)hKBscdQbR$RRW_BpI%z+?xeSQi&K2-_ zeDma{_tt8Rb-Ed4L0MGRl^y2Co+_f6LoQI$GfDvuuqv~Pc59L5d2`B)x*6MwjmMkG z`V&78&EKQIu>pR^gtTGM2-}KUwwt+fuX91FihmOP%`|yE1V0IiAvOo zE=q-?uwCdz1P;=(?z)sn{qX51_*+VxvRvE41Q2PN9dGAM_v; zefvPkQOJ>Us0<2GQ3KVvXIYb6wn3)|Z+U@=heT^HliWzlBJy1_n#TKzeZ3){P z!A~&Zm;(GYfy2xrwkmUOcoC?*S**fO*k|l3x1zC~duz<;JW*zCE4Oy;&8pu)2RK#M zZ>^DxQ{_ZifsEH>?nIfh?cUnIw=UDN)TuIO-@a9pe~PABQZ@-&f{oY)7Q^(ZGC(S@ zs3qkDDtJTYO3Go3ihE2*MHSU3!Z9$5s=kD+sPndDz@sA*RHZREwF z9^On-EQhM7`)KnRycKo9Hix|a4)~fHyfs98O$7q!za?=Fb1i={EBS1aIYZR~V%3M@Ey*YVj>dvhC1c5OG zVy+oeckb-oDa!vAK^+Lfz~7;+ytw*eQU1RW6i3iEom^a<=v?mfzEpT=w`;O{R{b2T z1Xv$PTtZ#xnCmLa|2Kk?2>KQ#N@`L5cX;i=>$hQukd2?eCbofDl!oFXeV^ds;?m>ysvG?)zF{bNj*@E)W0LA-w->$Z6Bp!XrX{{SWlN&E<} z!+8B6{1d$X23|+-`U#fK@%o#19mVUXm?GizxA2<5>m#1aKvsfeW%2$PGbHRPU=B8+ zPO00f!#2of79I8t`(R*Edt&D%)ZB}+ux!PS`L0FnbBUW&mtTx`E^1Fb+!Q8jiC8K& z71M6#JLft_;@SA3_ABs8)MI^54Qc!;7FX11)a~EH%u8MD9Eh)XG1H_^_cqm2)nXHE z4qF(Fe^L8F<_hXoyqGvjENZ_72LvL1UFK%hLg!59FvS0Tftyo%@bDunp{S?G$!}oA z6sX_C(kRGpVZ{^Vx3RFP;x~)2prLwg+qdVLWiF~erNx^~HThEiOM@?++&yYW>)TQ( zU=_c<$!)6RT^VLR)Gf8+_9`vLZ>f{YNR|^0+VRF=o7xQ;IDD)5pV+oriQDx_jd8N_io~D6aqaS1Q357f%%sx zn4-?B?PxHlCsNiaY}F{z#29~q>ADZyxTGH4i4d=Z$~*uMqy4GspsZSKCAA-tG1)As z`S>~xBw^3Z<|UqJv)D$!gHvg-9h0UMG=wzbx5%7mJGNzRk0;jUR>W}FrYMHPrq~AW ztrO}a^9J9|Dg%S7|{qZ7aPv)VVG{0DizWPSOUDSP!JV4r^$eS3AKOvUO0rA=so- zv8E_ZIFg-rKl$O8J;Vk^8|zx1Y2v+;g-bEQht0 z48kN#!EB57HVHRv%h^uuty4eGVZmyj!t%ChTNpTa;?uS@+YW^lu#%}D44ybGX=0-l z`)>tsb4{~N;rsFX_-$-V!E6Ov94Po@#9O1VIoqsl2Pwbxvp;N?O-K9&W`(OQ^I2>`25DgKWik zo%$ehM{~F}+Xl@{wrtCZq3&GwZ1+yL-F* z_eZ){yVttcyEnQwyB#lgynH~q+ruhV6d34f*S6k`A7X~(Lmlkh-yl6vWyC1#5G`>5 zVRm>?wj_ldQ3po|8swpEAra|Lbr-q^iF1qwc?=FTb7Y&LkP{dSrF(-G(2i}p-P+6R z@?COtY~sD>y?H{Mq6sH~fTm8+l4-xbWE<^XAzsOLY8wC#7VXrwMj;k^$u^D<*s+q0 zbqI?+X74D^G-oh6S{y0IHbF(Z#eNDXrZX11e%8U5k(TT|j*{c3QFHZZql8uLqCJ<` zAZ3dR73LlO0SN=HXx@DY=-BJ=m?IdaG0<^-Mw_Nbe)^GTFo*Rk)^8mCN`qN8@J}UxaMlKcHFbg#C!N;wJ4UH&5tT#gu*dw&lg1 zcq*Qb_s0h?{Ex*;gqX1}+AWa89+vGZb`i%ExLNyxebuf|_#6OB_GSC3{7=!<7wz}S z>MYqu8mAj~8{;lbi)bU*2%hw>%KsXGWjk9bCP{mC&5?7=IJO;!jvc4ixGMhv04sKl zQrNKX*bnSp{c#tML3-RoqRE5hglF5QZvJyBWzaF<9CK~7?zSGcZrqr8G1k%FxrCE` z7|I-3N8YjT=y#4fH=SF~Q)kJ!WS78+oeMu{(bU(Wg}5WEk~xbb3ww?Or?;`#$j(m0 zQ9Xx_LuasYrm@4di*qMoZNQBa5wz4<@Gow*~mXicP?AGOn$6e;9bxArF@~Um87Sw_F{Qs2@OpsP9OY`rvFKQa$Ox;a z5l4r!-<9)?weGcV+>EN63!b&Q0lcy>LBmdVKR^?@7XH>Y02 zoE>Is%n|PB=;&v8pyvUp651pE4&ssyi;e+j#yRU;b*94k@ObOLq=q@+_^-&#A^y+k zeafM!uc19uDrhV`-#&e_)Ujk2AgF+1^gDCT1yuUB)6(c@JZ@RC%O+>kbAAXP(QPW6YUx62N7Omv#u`q^G3{J*?l||+gS5t3H_oG!(0O(d zaD*TQfpb*T7H5H>=Jl6l24A2iVR5FMdB$7RUx%GbjJrhr*aAUX<1(dbadtRYsLd@D@ypH?=Q?FybM`pXh%@9I zL9AZp=Q=H(BIU%3zI=$j9BkasU$^mUfd-iW=XItU=`>c#llPo>dT`BhPjHiPL6k+e zCtLIy#>*l4cd+rlrkd?>{x_6J8tKK@(HGrnoI2OE4eh@r7B$WP&UpAEiZkTQuzH+! zW*N;p#~3X*#~Gb*rtB1f+5!%GBF3x}Cp|$IojB?Vy5!6;y6l{0bj6uxbkzyj_C;YFx)-&h|avR~iepKSQrrLD-;c)HUv!a_OCcFq!ZeZ2vs0|Mbnt7YlcCHVEhCgH*zEws+C{)*DG)N_rg{D>jndIK=wrX$Nda=St^VXNl!)L)a0K zf!)TvMmoJU;28+@u!EJmjYZ)=Kza8XXX4^DQk`-QxuSh z8%;4NENA-xp5m?%JP9a#k1MMUdqzELo{`YHNOp`uMm_7EB(sU6$D*(xKqNiV;U^Kt z&-JZ;G^ZH{PJlF|bYYfPKc#;RY&=_RENfj6a1 zkp9vduFug%@j6Ml=+`n7tMZtuJWlJ6Spb+HFs$`^hjI39-@EG@^>+jZgQraeR<0RJ zCa*1M>snEprD%C{vrTPIe_YZIw0VNe;3(ieUKS`Pvs6;V*why3bq*rrLU>8KyWT2#=2fZha z!_Wkv#!H%8Yxvdwm%X&8*)P$ayyOb zEqy~0a*b2YyuY=N4oD0`W~R;UKQGUtv(H{@?X}lld+)Ws*4ZF=wYJ*0qM)I<9-3@0 zev_J6P`hbqNLwlT7G)jOTD4Sq8)Y)2onrpfIa*Z8kaisUU)64C?P7ESEY=WpY0>$H z;dVWXZbCKmB-!dwtvRb9w?B6zcOutN;4d&ZOPmYQa5;pz*UEI2`UQOB4Be5xwnC@U zRqN~Y1F^J!GpqeJNw}dMbIA%9qE!lT+tB9d=gi);o7RDJk1gQra}GJZ;z7RlJ0$mp z_Pb*6JuwKmuxoX?e%*?0M>nZoF!fr-tlQQSR=!etZfQMK%pJ%>B6#6ijcyhaW(8mP zpnvInjJ}edI$a&s;1rhN?of?WvVviqzBUDZ8n?1?osQ(sS?l}KuV*j zxz_0tO{&fx9PCrkPQhlYKDr=F+I;vkHI{2y*4zn`Wk5+ivMC;ejvZJnk{aVICmd91i z=D?%+jf|zNRmOddo|Ah1LFi{%zi!>NR-TT}++es(dM@b~;m!+Qt9lvRcV5+RGi+Tn zHL@-J0DQk1OzY+a*Wwx4sEB`HkKtuHRMZ|kNfq=WOO8+Wuz@)~dD0lK17|Lg5awiC zvX?o&VLT$*VAd9>a9% zw0XxoYbjw#ODX9%oIJfO>Z9lk{%K4#i`G$eF?lJufkpikT}#Hl>tNAV9Xi}*@^I@$JrXNt_=hGath!?F&RKxR-GM5k1%p`NKW(GXyv&d?AFTUlr@u)P708S3CjwP&_j>Md*O zG%Bw$j`fB$3hjm|!-fv?WVfLXwB%DrE{20x(2p2yQl2FSA6`dMEmMX~9p)1yhRS`w zG&~S7K9?Al3_FJU)YjCUGpeF3qACTiAmi2xe%quE4~8=GfmNf2`oKi;&+VW&WB~bg z(F^S+bh0uG8hTl~Vod_V!tg@uzGk=B+Ns||xfPmNEd2WW?R{>B>I+dr@^kV9` zc|5z+?k(~c&ADw4EU^^J^ju6`p%hDS4_u=cPG#C4_*N>LkH}0q(%&6*2n~cjAmECH}F}Y1YBwJTv`mq@NgiM||`0g;y)usle5eBIqj(t0(HSMgdhE10qamX+!2zu1Tr5qyR5Sr<5^x-&pvvNn=7eGC(X0w zd2=>=8{u0X!H2C5{05U61J+Lv2An1>Auqq`SJFk zz2DtH?T6bl`zhQu@0kPAOORf6%rZ->^ujhkRWdm?AdYvlGWtl(i$<)bdN+iB392*Y9 zp}1L2Q!x?05!%RfTed7a7GGK*jW*RLGAA=R+g#wzLPn@DrAyKF>$nvTN0z>ka^4!%$>{K zEwZ}T`7*SGamzZsxD`V>+Zwk_vxGC0a1Nbac50TCG;dk8tRXU&jPYs#McGDSb^(~D zT3xhkST4DP&rzcO_GAeB}4OnB!89lX5)PYk2r-o0Bp3*Uwlm1g; zo`#5+pRIPOKi*{7Y*OhaPEEmqdYb`u2rz$&JfHU%K$e1*ynaeW0T)ltol`nE-*H@N z+E$u@0P$&N7)FkIRcV?htuw737=<<7YPMQau(@YQ^QQUI{QC&A)kgFNfC6cYX-nAb zUdML#4qAUs3Y2J0t4nJDsx!@=0xM}vYfT$Y8%>*IJY6Z!yDhB`nT)0xkcC?WjHgYd z%`l1*k`B58zLY-)olcbAnxk-V7DWg*zN@FV7s%FkT5pJf8(;Nf zfVWn&s;#5vn6-gL{PbM1;@fdh+_VN6u$7+MR(KSlOY72iGd8kD&h#=da?<+=sY@SZ zltTn8N%y6fG6t3DBaAALKF-jS>^Vh(4>Px1ct1kY>GW3H3`5NlYMMFc&a;&3=?er} zh6C?<`bsnp0qAYaHg3ZL5$fGbx1RQ%p0{n-6q)v1Z~k`C663T?&%Jauw}?MIb6S<* z%J9P9R{?L%r7U~)Dx+GXr}gv(i`=BA_w*Laxb^flMH^1*-y3@#AGrdXX7G z5jd?d01*IUgZ~D`A8}7=53aTDj8ar*Z$@7R8{+z5hbLf(F;->fkTuTqW(~8pGH^Pc zcyL3f6NzQtX&puTFpW0QOFv%B(uJ1~m9FqW?YJ%u9Mr*|2k z1TL1`7y$7Zr9?P!dj9kVFdibDgmz|6&p|`+8H>ydd>u#+tH6!Z-cYz0?Ny+aZ=LpK zj%QY9wPw9YBPMl`zAW;USamG&#wd&0Y!fWwDfXPEY$}P?pWT|hojVW527CT8OT0qQdD|L`tkZMD z#^#gTHu78T&+=xkk!=| z3M-;Axax5^nI6FUm0v?exB=`}z6G;UpGk8g%qH>Pnwgko&r%UFHw0b98&MfSILwY9 zl4!)f6GbL4FwaA@?abXw9Z|FbxSqL_X)vO?dNao`bkBlfAroIWXt}<9GfALDRtanl z(wAAEmuPRb58C4kww?X%VRvG2zmmSX7|E=J!|-E}Xe^T^Y2r!eEZ*s?Z7^>%Z_6%o zs2m1IkoAxil;y*yJ_@h0P^|y;%+1U#CZ{V46Vfc2T=pwJ35w0kR@@YY7K;?Gv#^zM z+Rd~Xpa&L^tVS~%VSv``Q3?ZSb)u2UUdY+W(dDh=-OTgncjoun zXA8y|!wGu!WlvH@{nCY|^uhhsMU~Ar?>{1pV&K_j(;p`cfe3qW$a7}#; zvzy86ooroBL(X^(wOnRo4?s)yUPrK?w?N^XXDJsb$C>Q8?D_0PdYz@0>{+Ekj)pLo zy?$nljRN$><~u9diX2-`WzJ-tH~(gSt9{#1Qn1W8tx!={ve&X#>17o!^U7LS0fgvr z*f_RNIED*+u720L3pdRWVx1-2pnPv;lbiG=18fmMkwYHRJ4}xyIlC0va!PXc=p_ff zlQQ^)arPW?qhvcV_MG9I4QRJC_h#;H{(ybg*?LBm3bkid?31W^=}Hy&qNqIVB8SN^}c3>CE&*%0s z8Tv@1)!en*0Tvx3aW`|faPfjHZ;AgbDod6Z#JwQoA|`r1ZM%2f!;E-@WK7Jn=Xvr* z#aCCJH*btyb$RYQU*0%zGlRf|XdM&CoHs#0E7EvDfs1V*j5TkFwcVV&1{TlB3*c5M zEJqMhvvB9NvbYx^#eI2GOn~WB%sT7yTJy*Rjlc+v<;_s;{=8lQW+|gUULV7Dip!3? z*8EZXyz)HyL~EY4z));vzEC5@^U9}D)=qf14dyT8ujX&%&)XLqYmUXDMD>GYPH^V8 zXzyh{2=qQ$I951bI9E823E~j{3ieVCLp#-UQqi9`lD}$Sw{O`Ej!reL`wt+@cY$o@ zNd8#Q$-%KxO%tcVyfGw|Ic9JJk{FvrT;;GjazLTnr%++JMl0{JJj!Sj84*Rm zvErC;&oezOkW!}L!MB(Kcjr01t2O$XgJmUoT`0&b$U;6o3H;-=^xQkAl( zhZx7(&2}4{P`o5kB8%jZPYN6|5j6m(z=f@FD8k#6TY*cn=-tCSKn=i=)um-hHDg&v z&r*8>iv%e!H>F^BL%MjFPOw;7o0Nj1rEZ zJR2y7!C~G{K28ZoQADv*(VU}`wbMzvhc80+qA|ti8b#NfRsLy2d`wN7j5Bufn;%2R z#o<0wyNC?>+1nCUdwq=8hJA!J<6Ruji<@S9;5z9L59_JxQ^y}*^Ao69O>PGi(wUM0 zZpd*6&7n;c>Wfrj>euU7u};AKQlU;jOOiA)uBLg9%YjBXR^cg7xom|wh3mx6Q!wpXpeE@nphHPE1@RRO6wDMf6z&z8&y=2NJ>x5aQ>#c5 zDCjI$qIAB3hJt0{R#{MAK=Yjy5~>Ifz!XjW$Cc zabP?~v4qxCH^nla~6C|qXY zlyfB%joKdVfCs?@doD79~)C9MkGMB=Ysx~>7z5`Uc9W(OP^~YT1PMau34pxc6DjW zA77YQXe%a%12p1(7e$aMkOQtk$T;F!0K*$dMT|cUnn70yzENPymtj{w=3ncDeP>GD z4en|8DBS3$*yNa;81VTG?A9`j27R4_{)+k8imRH<+2#w^3VYAoEW*T?_Hox;n@nk2 zt~W_rvO;l*Lb90)-G#xz&cfb88cuE&&at^teBl;LkXX1K3U^qjE8Go*d!cYv`E_tK zV<1w|jLMCdzha?`Rewogq8XNjt1dK{Y4TvE`t=vK7WRYi4G;zqegR=8!rz95dkZ%U zZHzRB5{^ItYz;Y8I8(R_%U6A7qG-OTq`0+sx7fw#+{AJkQ`E)65_+9suO5b*S3U{e z>)`!9!kY+x$U>B#Yziu4qu9qNE9tpgSWTJk7AnrvNiX$;*emoissKUF_(&iqy|fbC ze5RM7`v~ee<2^ILqJtEzJL5kyL@)Jt8Da2IingBVJu^lxooD*a;PW`h)q7@w;iu?1 za%P4_=Gk+BO164t{mjOhMS5Ms%jTJ7hFc*nyJz;!tg+}iMO8(KMK@V=lcH99z_HDu zI}~-{YYru~XJ1jEXpg~V7UbzIQdofY71b4~DDEptq=3`W(_dsDWB?zDSQ*sLo-P7T z7R?m7>17Hpr3~)D7YN)!(NfV$k%Bdal_DQQR1)0=zNo2V(RvG}t=mPrMSD2?u(>2<(81!yn54zX9}fjs0c zDegpj>9fER4TE|d^waJE#%qwC^i4$u?CBCd4cc;V<5Hwu*xs??DO_JP%*gPO4D?0o zLVQycdK+b!F_JeCi!5ug4NI)cs7M3t*rS12*}_XD$_^au|K}8MvM!cWJi(GrQdvqs zI7QKt;%SPPQXIF&!))OzmRV5(_FSN6Yw;pc;X=gXCGlmXc$pBLI249a7{C`diU(8= zzXgG;zF2W8wA^ErLRmDX26L3o=a=-Y@g< z8jyCtiSC3_r#YcEYtneD#=%)Nj|gVXOF|-kI{XZpmpGf|YIa(O+^s3%b2LRtx8}N# zqxp&8(|Dq?vpeLKfcb&*YewZluLh$=p9Y6&{Tg3XG+yjbttb---tic=$CXJh%+tyH(9B4=!8y)=XoI0Su2mdi2v{P%|KZ`@s(R5ON`=4pOa^R#+H^RjY7Qz;kLHCu9FQ*(o~yanxUYvPn!n(qla zn(yH~M~)Xfb~R;0u!q~V_cWITS<>f-nIh>juS&YCR3yDDsPI!Hy@vQ}h<{c{O!_R| zKP%{x-hNQop)n*qskS9O$=i~?DcF0c49%K1S&gg}xZO6a7=P}19FARSJ!@FPhU)41X|D?L+E3#5-_-HiuLuh5w*|BIZ6!#p+7o<^)){Bh zKBaVNKhL?eKNf7-e-o_QdAX2754ZLPX}3fR?P}HXQf-Rh(LSUs(Y}rFZNaOBBnfcW zU1)nxss3x$JtJ7vE8?+hG_1X-+L0c^NwPgejX!XjVR?oMJi930B}FRgCckc;9-D=0UiQ)Lz@yq)VVuBDZbGZ%C$&oX zq*gCXXnTYyk|2Sb2KBV|yf8zh`vEtrO^BP*Ch+sxD&@TPcZ50oX0@Le76|R+7Qti* zOqRf8S^E~^Uq<+4VTJNY<5so2at&FpA?sCby09*0y@A4SqVP9S_)QdkODz003crKG z?~01u(`wW*okpq9X?U6Ltf0VePkUKV>A*XIi`VgdqK=m*>a;?P;_z3Zi z8lY-`>Hw-2K@9*k0OSWKK=N=LT=(Q~;zQ^Zg1U!kt-oW!YSUW=U7fFX_xt!iw(3%bZiQs=LN->1=Z4mTpik zZ0Y9c4gGjkr-%`Dbj%LyBBNd1*94iKMHTuuUZMY*5UJEINyvw~S) zM&+>T^-7yw&*$iGP@k~tHENe$qjc*vybDxr{OtP6LWv%dI^jvG(xbm5lCpT0xcU z6cRv(&bpFQU&ZB-Ul+W|GPzKnd^IhhL*9^_!TFOj5I!sT@#{>! zO2bcY@)Nil^a*8ea<5$IqsLJ4jWiktl5@GSk zm&AfDCo7dJ$xePb8Jfp$HJQ~U{9E8ni@_rKDQ<%(abG<^@LG}IMA0|#+Y-Us0K<1h zzLRVcwv#i3T~WY2(tZjrm!)WhJ*tJ2G-8sN^3ElwQJ11u8&dRgLkcWP%KJ)t%AlOj zNr{gVN>VB@MNFBE7VIf&Ns}f36-l012q{Q*wlsKg)<->w6<->?S!~0U65j-g$ zL;Pc$H|1r7FAJ3^WmM4W6dt#gJ|)zrTqP6Qkiskd5XcXK8d6$>fCvr(+zN0jz`>Ms zp_9N)t~Vt^*`JaT-ItQV_ooyK0|ZXshQM@dMG7Z7^bY8aQW3MM^p6tn3(f8 zsK!&y3lo$G`?=^i@VSsrrI>`tluTh-1jFNkgTIA*7T_6x=fs@nQOX6Bav`Nwm``~@ zSQK+!0?%d0xs05bfLam3s{pS7yaw=UN|Ufo;52RnrMe05O@KF0s!f2?669O(Xx>Rt zMsGoDJNT>*(vC7nST9dCF>(BYS3xOyIK({6ZzcNv~gy5=LZ@LZTIfYi&|jZ{=lczqYZ|md zpP@$>Ah44gG-N1;4H?lxh75k#P%MlX$_PAa&@0CbdVZXu3ETt{PZ-V%lavT5HDLCG zbNXq6NtiNV79@hGvM$({M zWz6T}jrr<$<7AYeGIlBitC1-x$7tf+#>;$;@v>kyKB=}F6};d!_VYrCk;zqRQT)b?R}+*8nsKC`G&=cl zNIGf!9buYsoE2hALgndS3Fr?7zEqVXYaiBL{%8UJi*#TchtHa;w@ z;J0dg7#`GDDHYC!Ih+j3H;ie*y3rxr6u~$l=5RhN-!htnO=GUGZR|kVH9N*ae%Dy2 z+%;Ymc8o6xd&ZY|MJi*YN@YjD^7vGfpi0dZ5=F2MU<1yj3;^p=3k5TQVcSz-+f!lN zQ!4~(>SIEVNNoqT3)J>hz2L&nErLq`E(N$0OiIAplUjyJLZLUcjQ6H~Sg1^;k+`rr z^&DTHdQMrN+9p(|ep_frO#_uaka`0F- zMi|XN>Vy1X>VxWm)UOIdsqegt|7>7USsc#~DQ@ufq61bbGBfRQr9%@mJ;Aq{o=}dMa7Vz1Nfs*vO$`Y`D?KK}{3em#q$ypPGNp6VrthYq z=rg7ie%6$toHM1UXH12{EPiwN;T`ZozzYF?7Vs|s{taQlWW|nA2e)WatCvh_`LgK* zzhcT%E}1fg6;rXWjNc-DE2c-3%ce*8Mbjhd6;mzXwSZIj1ixx>!n8!MnZCfSo6^p6 z9p|=8mtN+akL{XX=XXtS3A?8F1U}weMmkC~W3Fz_7IbFR1Lo*vrP6FR@doqLf|>oA zc&nMI&Ss9|bIfSu=I;o0a~aLqT>!bv-w;YgULNrBm_H(T%{P>op!mS2+H6u*n;#ac z%~eXD`8vYuLIcpKKtIp{paVb$fcBd^5OxTiW{8i^eazUT5?=>#^TDtv-w1LXg%Bg= zB4HH2G4q4)&1RNt!tCIu%#P?ObD1zr0y()EvtBuC*7I|e7&gTWn}Yqic{6MZev4+< z6f>KJE}P+!XnsUkMM8|AYlyCy3xy3TIwmSeh@C+BO*1SsC@>4%2F12HSJ*XQ< zvKGZR-~re|G+;~7fWgVK9uFl*qJh|p7V7EIfCull-1q_NB4GI-AGCZB_tAcZ3s~Z@ z6-199J^C#-Qjp_-0(QS>B;`GjB=f7cJ?^ zB}=+`(J~MvEYV}pG8F~TRFrz&vQ1Gumguo!xxt|btCkdg&61*Ax1^|7EiVXb_^so2 zQ_N!%d2CufEo@uTP%rpLk9cza5{}c(j&t1azWR#~{n5K8f0L7IYC3AqK5?$StMyWQ zM{h@EpsiO}`@p9-{^1UF?b*V|0$q+^TjSr~u$Ra?(j1PbYTA3d8Us(=p32eT?|$_K z*F)SjzNW9cC(w%gn)#aG^MQ*^ly_5f`7{2m;M50PO);0+gKa&5uJQjjWwa@#_TtkY z2{iV6@!|Ks))eCdygAUN8f*G;Q_R`+_LhLZ?fp~Zf#&GiuHL}2OK-f_tT^Xy=?-+$ z>xocWhqtpAz#l(#vbi})f;}4OIq&a&ro8=HV22P15~8-frl%{|*8CHK8YHNv2@;jJ zw{`b)^)~hd+uPoYNK_H*?(p|CKJ$J=9#w(od`RJMYYhAwA+!>=b6tUegxMp^i89aA zVC`@0@pg5!cWqwnSZvly)D?jye{T!KZM)VI==v$qD?Q!a!REHWHPT&kTv>UGzq`A< zE8y=5xO3xv(yT1=bu-w`pMEqGF^?Gg+R!g|G;7LkD~zJDC%rk^dp+1A@{@8VIX6W4 z#N5vX+x#speM~-0+1Wr-dsm<$u&=)Ly()d9kMU&-=gcYEA$Z16{oExUZ_>;^Uuv<@>It zxE_D=<5d;q7d$mJk4OFfg1kAlyyi-c=P~bDUu}(D{UcX%JOCA!FJ7uS??I}9uC1A- z=(86uUigJCDmR<8V%NFk@A9_>&>o?yruM=p)87Dd$#>;ZZ*8Tws?Jm8tMt_RE>@jM z2g5j&P*fz!{Ps^Wt~JMSB%WN$($$^r3j=#mBsVMDY_M z-cw%dd(2bo{Wig3!LBEy+^^TA{(kdGU$>Z#x6S`_OW@i&zjs#G#G}NOHIK3?Qj_+@ z>alG9eQb#amPEx#Znr+#mN`@l~-5y`NuL zTjl?&Nej+Z<>j6WXw-i;g z=w;ud=WG9t;xXrIS!9_a%Ja2nFCt~-8pYzI7$s(fkCz}U$v+Sg*jHVA{Ji(FC~sm- zD_T5jskQAa=;?p|V@=Vdd*9bLKGYO-zM`C7n&Y7sQE^nZTi^J~$D3pKK^5iHE|Ki= zqg9Mr6>8@dZ^LpbHP`E zs$JgZBtCg+O%Exp{v>8eau@`d!?qnrq)||g_;%X7v8Fh1*VdVXFuqx zpxyzhuMBs6uQ`r!1FXh-;T%<2Q*@oLs+I{IC$^s_FJ7+jUKYh7$a!Cd_n>!(t*qw! z#m7Zh%L|ZdzfnCF><*$;QKN$Kd;H4T3lOEC>()%;HD#z3lA&mhdA#yUU5)oL6{0Dw z_VLR74&L|W*gtHJ1G>grTV8j$=HlfzzFCcos>&~Upvx~(Jt+~tbQ!U(pQ4&b zRMb)V#mY)gRYl_tKqmmYaJCMum+VfJ^Su!4@&T+wf>j>C&JrwvWfqqDc_i+Jpm@w`r(w-y@9Sinq_n~`5Ob@ zA+#whgr|y5hNZ z?Q)>$ABa9F93JZN-z7w97y{FRU|Zl)S3A_y6AX0!1rcb&2rdWw*H|(CT9n}+FLa73 zXyzMYirZwXZU0wD*A(?ok^6rSu07El*Vr8z%`q=(E%^KY-5kpxn1KM$L4a`m9?))5 z2E2n+>K{MW|KsL(_UiDpT?<^l*rfWc&p*_x54Y>^D%dOJ+;FCc&w!Pr{Y6Kr8tL`^iFwrf?v zmZyI2_umE zpDHmk0F9@r+UON7)N zLS7DZ1NBuxnIlkaX6;9NMjs%Ozao;92ohFQaT@y9cfg8@_&Q-Nx2F|HNs+?}(L_qe z_@ko!hES&?l0zx&tsW{m=C9~&q8<2KB0O~mLQIc>)c?OhL=j3p+;3NjB0|Zb4kSwY zcemvdLWdXU?}|`=5yIzh<1aP^CWTnH^zfxktR zi~3grB}fWSfVPX#pfTw-M5rye2w@CQ5xKG~CVWIA^0hr18cH9%jVT%sDZi2s5o$;2 z&yrrcFA*xj@&I+Ny|K6ZGGR2~l8A+^5#gaSJJ334($(JfthsEL4T{VN6FjuY_!uE* z%-cttYiWnsZ)@%+42=%AVW`R1U|KMaVcunAX2p^!E?4Imo`u=L5m!XL|HRnYhmeWqCY!t>>8x z0!P%ExOR6?twoTteuXX7U98sG`%i!E($!|AzvXN@hRD|EOR9bpCT2||M%%X9cG1}U zBjv)kK7Aq3)YJ8AU%VAYC=y_Uh9y`g!ibg!U5GZbk~%z1uEc_|(Yd1ixwel}5>;bY zsNG*VTl2Zd4jHyy_!#kssL;?FBRe=E7j+c}XA=TL~G^$2_cTXXqXc({X zN|RKKRlQ&{02!CVWq{)JuNNmnC}FxRj|tNv;|uc6D=bd zh3KFB_H)g=zoiPZ?;cYBK?_3liv5+W_z5c90S+2Hz-^m=LnVsU@XO$WiP587{*GsY zjcmdnQ;YHcS%3EjJ}~nDYQDU^rM=7dy~f{ZRysnM^rT-K!oHkH<`A3DOIQBKUsLm8 zNga?zEYS-D<{O#BU;0)580MTUXM5Uep7CQ-=!d`RFK#};0O!$SF)}~XBLId4h_AJo z)(}_>HeOTE&ShvVQqBf(0tB-@ztfaZORs0!yRHSgYI^!w0&i-5^rwIxkTLsk@!hv~ zFdGZ4$k;;VA120%X}Ph_&%v5_sIheypI;ir>>~^<7BhUf{sp4Jl=*-~h^Fn@!-T?` z;{bJdzVHZ9MC2baU-$r_Pen4oDyh9MT!1nng53g3vJR2L+8>jXp_un3V&3XxM&=5D`_vX2KZC z8g645xlHvFK0>!*RlY&+2nC67Y)k(aLZO=-W_0k-?}Zk$Z5iF5s7Zef!bFnh`4!ZPwq~{ScKYqD6)J>zjn&#lbRbxZ#U9 zOc5i7tcow9!H5x>O^KW0-A#|y*F?4o)NE+f+a?)eJslk_p>=iXFKGW2E8j3k!Rq^4 zk;xA>&0}nhbgifZu z^6HDQyJ`4zd>O>V3*NLLxdgY47_f!BfJ>$-*acgS zm*0thwXyM!)&wb zrLVWQH6?LTlyU&x-*)OImcL#7%CpUhVA)7pQ@!11{aufC1v?)3>9455 zd0k|iXWh=cFZf_=_k{|99ii}<4=rzmXC;EmG4p9|@9O)w;}5=%!XHZP#hkEjc+1j` zqmd3wou7N+5($v!w5>N@Q!(O@7Mo6rX^Du9{8QihuiKa+Fd8-xp$N@^KR7p**>ut; zLZ!C&r-SSNr#ZHxyXR6@fRSeX;8SzWiBgXHWiPk6bpY#U_w7m)Hh<`Gt!$-ojtQ1TtC5iy9A0BTfK* z;jIfzjRC&)nLsPsrfm$w)LmyWnlc3xR7tEY9Gtl|N7MMeRNopOe)`rN>+2@Cx3#0E z?=QdflM~I#OFh0e0=577`%%pb)`G8gDT818hra>-rb|q%ojETSdEQZEvGZ zdoU7Z>we;rrRHTG1MhcvF)IWYlWuD zf^5;$5`3QR9%giQc0J38ZATHa^U&K!A3lmyY&K-rS!GbIl%cQF@F&h`yD6{h?JTp( zd*Hy>5noE*aozO*y?2*|jWCSmNA7`TnC)dk6}gX4RHz@2;=<^u`LO(c;coMT%{`<9 zQQ`N(AWVRR8asct5-<&VuQUC*9*`#T(4e?}6sx58KDY&gV%jtJl$PWO2ALB5cbhPL za1hJ!VCW=In54n_AlC{LzB{TtLWpF)kP=?SOV_bd@j6Q;+JoA1-vgsV z75$5MPAV>fZc`+7;mGZb)!Ah%)ap8pE##GdR|W@r+{b2ejETHsDcCgSSgx1vLv(lp z(8l|*e4o4zz6V|qjPRKP-6!vZ&D{|1unEZiF)`zP?|KP8MGomDg8TjvGvj~n9f@_(5J%B)&}K8s z=}so;;yo)LTMQT5LJB|M-u_X>zF71u3ysGW_sp~ot_$5gSTGPrHuV;VrDJ9Ycj)Ih z5^^x&1^byRo;xV#&`^6H27-A#h#QHl zUln3q&Q8r}1sR59#caIiVrD!oP2SEtc*iwl#G;sGbc~T;CWrP$Y1am`IdmIw`%)A? zVp!S7F{Z~%tq(K3m$C4LJ1ZrU?fx+&Nm}SS&~upgP*HJcmTiOV89fIx-q339$`w~e zu(vV8$)3fw&^qz1_2ugpcYWF3jIWJ!$nWJ z?qJjIe;HLQ7U_XI7U}35S;1WQEGJ9$Gpi}0m9QkoR8s`8s6Urjrouax2|b5um)Qrl z=gBh36Pu6Nz?*>Y*x%q3Te>)c9VGaf1(C+#gCq_ykCHoz#)?D2(RR1ED_A5J=RWom z3&oUYj?Zm>e3$ki8{J2I!*qk=u6*GWe=ToxAAF4z-RKVc{G<#qaY9Rb;b$A&;a=wN z02#8!K>iDmFxryyXdSqQyNfnZT-pQx`Fs>oA2=y&AiD3SaFZgmGfbJzL!$5#o^6uw z;EZP{6b+s7>>?U@m?Kj(x+BgrT#80p3VgO}E@5#ke&=%VWxy*O_etfCTrk_~W}7yW z>hi@47wRs7VpOEqFxz7Axf3170r+vP%z7R2+LVCR!1J1bzaj$VjPM+sssMXMghhk! z>F#s%4GVzJ|K-Auo~P8Y0MZCTACCauFT&-v#4xz%J_PIy5gTpOhhZ<17sx)zFN-96 zZs;hAHO7eM@w+m)Odk8us83v9;B$?4-p*!pvh+W{`usefs|};uZ`v=*BsOf0}T8 z|0|p|#v|^TA@)Jes_@YC0Pk^J7;zzH%!wIaG$j;}4U*?XfR@^Ajg)7k;D} z<#Y9-Oos_Y&Azz)(rY7pF>WD{$xnWJ`_C_ab6?9;&rFBZH5uE)r(TZz({q>WtefdY4LH+@`!`+0uKXvlLcNZ_Z4-V)W z(2v88==_N8AJPS=kB6V74FYg*BsPj3pBVDq2py52hp9R4(;OF_sR{Q&z!@68ltV{+ zgF_1yE0{{O4}UW|yo*R}F66`YHU!UH{pUZ7`$1yVt1pRFsOPws)K-}T;aj|w_gs9g zEzpICQ;FJ}V72$st?Y~=8ZwUNBjkb00iC+!76(KFeMs9 zJ(RCZNMn-pylacCDZfGrA!CV_`8LO$xe;Sa2!k@aE~3hB#6ZX$NyxOLgbd%qCppt0 zXKi&%gq(bOOlU(1LS-n^BtrvHKlol+L{kAs{gX5q)6mx?Redf^Q66Y%VZhhYMi7;J2zRn|?YL?9_x3Y8YA{%iBfyz>e%&w!KhG&(| zi+Hd;N38u4>rgMbLkU7B62$cv!S&-;U5W^{l5qjYR*7S%hun!H+qt2pMoce*>1z*t zI-Dozw@=~)k1jfgIF?sk2XU$ar#ByoC^TnPie3zXYbdr_4#oo#kL;9yqnNkYvY*${h$D z>Wn`~izds}#Bn{}ePdm@s(fQZxkiOqkP35r4;80?q~Q;vD1T*$j%Yw}kqroUnu`cI ze8@l?FM;E~Eh!=j&!>}aq2&Z+dW?8V%KA6ie4CWjnPamGZ=VN;CX`_{GE9{Jk3$)T z4ORJ6mu@MWpJAB8z91y#9x%_5KN!IrWjGiIE2uI(67%B?>A|5Du`UB^kGv{^b;J;R zmgKIyJJttIqs00wSl7#6yff=eVqGt>K3*l^pJ)^F3NY`KXGSpR!c~$@DhWu;vyZLT zuv1Lp?FH{4c`xQiVMaSbDY^TDx-_jwNQ;F_?8P>5u8u~gCX3xE<*#QgM{F{oQ(!u7 zOG9oaACxa%#6A13a@Hs~lq0E;x5_KZ@nRyA*U?eo@9`tXAD--pGn;Rw;X(&^a*51A z_X^+mGy3!4c~&_JJRwhrC~t%^Gf0_}Qeog)eazrW%48FEQsp^to|Bs~KMJW5rtOvY z!s{s?lh}%KfK5L@9y3xN$4@UpeuR|6qsU=Jettg#rhteHsFf{9e2?$n;qD6u-UXD+ zd1SLGFFqz4Qqi)MO~KDl(P1wM%EE^%WKowQvWV#A`SP@gi3yi>r*Q?MtVyC+L{Sbe zogHCQw9kL$hZaNBiMX^?F1uJi4d2%>m9IREDi$sq^ck zTtZWc+j2SF4QG%=Ulh7wSV3;@hBk?9Xi*=r0tj0=JoCF>sve1=RsHMxmHIlrzjO#& z)ki~E7vuW+t?X2>h9kL#wUr>)PDTAA+DaH(X+^@N$dgxBlfLezZUhu2=-Kq;#F1P&6DH} z67SGNCX)9Z90Q4c8`y70X(HIuR>uK*58>ZXy~N8SOM{U?Y)#agMx`9BM>S9>M>Y~tIhv4Jb@Zg-RdqyWvM10wvEY%_ zQ}_c~-Qdjmcs?6L(g>iUW#>AP<%sOL%NQJQo1eR1ifhS$LSU^rKn}mg!+`=Tx4jkl9kS>CNZEiW6Sn&ohJmvzUfC z!xPg6Fx>#t@Fp0}luZ$>$1=TrRrg^q-HlF(sLI33I=jU4$i@ertR|_gkeFA&F;Rh$ zEv)R=0F)MrRb&xMB#uYw6C4i}{R(*ID2x$2!=z+;Dqe|aT==&bBoSRR=TSUmeeG4Q z@hy4w5yyZ;g&xV(D-x_qq7o|bpHR3@aX-BkwH;O7Ad}l;xWpLlI{kZ_@?DwS6~mch zxaa9#$5nDpH(E#Z%SfNE+E)eseMuFE!wDwU$8P1vhBXo3E-A5Ak#OpRPpg57OTds3 zLN%W6mnD?MaA~i8#2T_}JVq5RT}A3jnp9sDaNuFRv9y^QTJ36ER34jgWXAltwQ215k->T?GQj^}VEYymI&IlUw2^b;|%#3&3CQbM|k zja*yk;0bl~?oy2G%{OIZ5<21VhCb1(GMaITCh3Unc_Q10k-ds@kPw+G;WjO*xfaVw z=<-H?Y=105_KpQqD1}%ruk^>9Q^=IntX`_PjT4nIcG<9y>EQBDo@1_!p=}p-Rit_& z9)k*F@XD?HgmV{Lu7&S=Ad_0zi8p1_5=AmmFx7|ln?m0zgRsmB!WoG$?p#>c1y=0= zc2>fw&+VVP0(adD+?<37CJnh2r~`#>}=5yhPg??%{msswgH!m7?mr%_1wQZ-PE z5-JvrQ`*S{vd|CYl7v)+kaf6`mAf$j)N%;rI1yQN)FBXAxefl70G3 z*{Xy;5xGG{6lO-TCQ+yl_E4zJcMt4UvMkmmg1B(+T_QPsW6#4#HY5_<4kvjZ6G2=( zL*JCpw|A^bMz9%1aNrwF9OC5xMzJMPpzrQGZWBSGyps`ZO9ZO@r8=Q?@)?HSkWgC58!DeP2_&|b4y#S*45RoG;+%xi>Xs*i7>{X(K zKY3{BcLV=K4F}e;uV6j5PjhISADO&6tR(YdkVq23J12E!@QKGRBQ->`L?mtsN&S;u znM#{NAWg(hA(2`oQnl!~O2;2S>u}IPP1Yu%m6Bg8kOmx9P}-aj(xp1+!qMDyff=K@ z*tsynWS2-a`=kdwI-2{im}Wk9p3-29bV>9PV`Mb7MV8YgbxfArySj13gt z5Y8DBTHL-P=Y&?J%%yl!<_qB*O34BtrByb8lvZqp9)-2xOv@2d}KqGbFYiitKvv)q0yo~MBP|MKsJ=WHp!p!L@R@A$an=qMt}_&4hQE*IJ`AN zJ?t-U>?zcga|7e`+AYWJX2r$`{1QP@NE_ihIqyVsPwp}c7?8*gcN37Pu;D>@1w%9u zirrE%#kPiUE?%7ZU_QgevGP(GrIL3_R0=jmNY<^d_1YTrItcnbts z_5m5%U%x~a-u^(9dqBnBF!hlr4_Y7S@^7OX4AF^${p;KEbM?Hkm(|>poF}R?Ci`2? zOnC<rF6n~Dsb|=RVwG2fVk>Ih? zl&g_Bqp1}@j!MXr67s;c?_-G|7?TKM&mFAV!TQDkkmC|E3FEGKGe;!R1c)Xiq7(Z> zZ2kczFDw8*DdDxi!-DS53)!{~s9xLv)l`VeaRMZfQ-^nTv1DVX!zscm72~v(QOxX9 z+&&ku$5I=e4W~H7!^?Po*(sh7^&B2 zhPt@VIeZrY9Z0#t`p=St*B!YN1UB#XGQwqvFzJXdKW{{H>D7#EMIwuj*dzf##*~^S zva1q-Mj|+GB#@=D#@0@TG|sY2|TYHUU@!!QzV*k$oF-+BF(>yYJoK8?}pV(r8dwo4%q zszVKsIy88uGrG~ZQN|TBAc-zEyeWe)gArO|y~GfmD_$a0?%NwRcU3f)LvcgIF8WPb zqC^#Uu`Ns?YVL+;Gsok`iIVZgtVp8P9AO%eMzo+4arh6>`)LePns_Mew+u@ZWU@g*SHG5d4q5gQ6sM!Vvtwcn5_&cG3{Mmn$T~T0Q%I#Tq+xZw$i5 z8OA^tJ8cO5huuM;h@CM6@AD3dZS|}nct3YgY^di9!Jq#f6f5d^L-3dntRp76WzzV< zdOK+v-vl1@&Eb@K;Xb$?*eYUu`yCXc>P18Fe(#_dQZE^T$9!QLSsS&@1Uqu8SY0f;k(!&y+m-|zk|Y~G8^xsBe8kFZTp`r zrz1L&TV*u{kNI5s4jt+6PAp@;e+Pw4WitlE3@_oH5E1DE7ucTh|yOO3(*m^&zj zl^$d8-+2ecfYNIW{=4s>=u`TP$1R!eP<01)P_!y5@5?}hT{FS@)t&C3@GGm0!T%d~ zP*f}Hjx`d@A{hBNGaiW4jmv3`0vEQ|KvL;c4GYZpsyni z#90Xs-9fPt6FAnAMC$ACNj!0Ub~Pqw4Bq!06iYF!#^8VM9TYP$oyOxx9Nz_Q~P52jKQCICqTp^sW+zI7(C{3g9zfX&X@sX@Sg9W2*wN=gZFX=MIdI# zh;0+POQYys?}ez288!y*{a%R5n320sT|~|KVn&ZuT?BENH)f3FVr9CAdm%hAZpSifYm}uD;uZ){OIDl{lVL!qpgnbBC5%wb7K-h_J2VpBhgECqcMCd^nKv<2? zkI;{>0bwgb9BIb&A*@37Z7?8ZXxs_RH>q6r3iHhOAwk7x)ItC zx)8b%+7WsX<{+#@XhT?!(26jC(2TGXp#k9}LLI^xgoy|j5XK{1MyNu#hERcU3!x0* zF2X&9GESk6mhB?cA>2V|L%5C5g>Va@2jM2dYJ@itHXz(U7(}>^uovMP!XbpK2uBgF zAe=(DjBo|v62c9HiwL(7E+ACIM$6_A>JZK$v?82EXh%4Mums^WLNCH8gw+Tq5z3=w z6AER#{IzxdX4H(nPPVJgo=TMG%JukV$~E#7WwAU%ewo*(tHB)k3p ze)~&4%)R${p7WgNJm;L}yxeo2N5!+aRLurtndT7_HIJc+OGR0{5^1j#<-|mJg}7c^ z2P#9(mekCTqQ43*NI6;xl(lEE9xY9 z335rquK`-kSPw{=;T99soAA5{+}Fz4q8t1Zorb(lUIgmpgrU5|)u7vqr$pJQxn(yX zNGZEj6%s5E7phA{QCz3W_`T9CLw;GjO1w(eL|HQ+L6W=x)M>;^T>{ROI$KT@*B}ok zut{zY%912IMU~02P+TXkb0&i8YUFhdaH~*C4@#$@)K2`rQeB{;G~z;V^2iIJI}b`J zLQ1z-AYTdUCO3b_Dx3&00jmsK%a zbSEYmnp_CTRcI@#(SoiQSF0YhiJclaJ4MhWq7+L}i_46wNjB&XTu>_>T$ex|)EjCK z?Lu6GGC^2il8_JDmZ|Zi@N%?QHz?AOgByAzJhhG`Xy41Ub;!dhE^uq&GFA4hfxM_G zd?&C3&=vAksDouhEiaOFz%P_P(XEQl3gUk8xlE7nMfaV8FfOW}5%9_0($5J(i?s7TLCBYv zepwK@KHyLy(0&u~<(bSik7gC*3#@og@s2UD8oWkx$B} z1`YQNg)NYOg=3Ek_;BpxFGk16@; zpnAlS&JejSoUfLJG4YsuUJ^W0(zw_l^~-~@OKDM##g`}MI-rbkvCEU`9g|246JoAI zR)q<%+mq!j6r5Aiq?jiaOQq7NR4(T_R8^Q14|{UFI9aUU_Ua!I4G z@QM<0olTfX@Oj)EkuRmo8S;ocAy3NPYPCM7<8ZZG(4`}iS3WMEkTaDm#Y42ZlqZ!- z9nt~mtTZM~O1hjb`zRxq)GOyI;}QwvlFrIq2?GfYo?#EpQmaC$)GZy<{5bv%ZA+;} zzTq>D#UGE)Rj5KUq-v>{ib*#omFEeTDUCaRNX5;Re43!jSqxI_ka0vzdV%<4NhhTu zc|two@+JJ3&Z=`j3Q_0aVL~l-sG^Vs)>@K~D;-wODy02Xd???m_NfDEpClwsp**Cw z6UvmD>gaGCbY&&vF{$#T9;Fw;%lRPbQHmXgD&$Fdj%r6hBnk7SF7*w5)2)WY;}T## z>AX5YX?#F;Ljb2J0WJSHDh{0RrWez8ghb+Oc?93$#tU=Jb(w=CdB8z5LI z(0zb;G@)4PR5M(~t}_HLM@8%4oTv$<(ztTKam=xa^i(d55V{ICexQ?7pI7Iegih(KkshBBUmo9pt~Vv^16VbLebR)H6Q3JD z5nt}mRN(;X`T%+p)Nl};rc;}esq}}WIJw;6)C9WOr%k!b9d3`%g^n_!P|H7QoH7(w zxxBSmAL;G`$jm${kBZp+|a=gzS|%oIfG;^h(u4agssG9ciM_D;+1u zDYVElDC#mN_9#K5Y1@@DR(Rvg;UbciQ=?0?ED2$oR(UMqK`q! z9VZ5^Mtc8AI(~BMalwq|r%CCZ!2!0vQ#^!i026KR__pOGyXg z4YDvP9YrY$RRLz#Jqaaj5`{R};a*vTxs=Jk7JJJbo85vUhvYFO9cH7$k*p;$O9;!C zA!o|z$^jLgs~iWkYH+jLaBV%olFU;0L?-IO%}?*evIgL$kp;e&>65` zU@{<~Y5O4rtg0W+L-ZWLvs)DC;!%Z=oSIma7$RHJAm=0=#%+=)v;Ya?(IIyx^vTpe z4$1inzbeeucgq<{2aP~<(~$5MHMYZYOG1Z3_6T%yGU0r}R6?pJ-{bRiklaV)WTb#u zJPI9;csm@1TR0|ndAdD^F;ZuFa{zLx!f}k8$C1LV3Mb?&r31H+l7{3e5I{;AG=~zB z<5AjEm|7$!b~ut?J}{w3C)jB~GXaD2r_j=H+6@K*(0ssP`c8um2i9N$0PO+{rmqil zIB1974`?}HOE8VWbfOm-E=>|>W^p*-NJ3A-KFlc zynb)Uo0|A%Qp6egkhdT6#VKi6?)DB*Wev*&>~Jg-g)?#oLCylEgVAzX0F_Zrun|B9 zpu-iKa8^E^aMI)To*?)rFoU37X$T{79<(>%)e{dB<~(o#U{=Y(D66a`$aP!}CFBrx z90RBy{9wGsP~N4$O~|Jce1w|-_8@RDW8=W3p^_)%5yDIYHw;xNbrhRdR8&88aV{T#tT;ONl7t;Ic&&a+M1^!81>}u!~=6*`27N>i zi46**I-(r%6nPui?BR$K63-LxsB!?Kc}Stz)Cr|e(bbTuI7XeFm`k1UoTT}!a8fx% z*ArlU+PdkZn;t;=t(!q6&k)JluM8{am2qWKX;1{1<6$L5^*M4AGDXr3iI?oS@DL_e zT+(DmoOVnLi3b&c&LdTpTBK$=^1Q>0M9jNy6GnP2Tt_o-ua8&F%+1L`>4hSW|#Lt+N$ zrbA746}dW?wb`e3n%7CjV~UF11vSTEl_PXR+j#C)PpZ0g z@m=vpF&Q7i`sp{+;R%6BGn77r;ZD(#wY8*zVQ4%@^T+E6sU$Bve?hnj)$2%iWN292 zOko0@?#Oc#VT#=CIO!O0oONVs(0iOC7vOx1k=2eJjw}tet2j_Mj50^V5mCkA!@~i` zLCj{4J9-?s#81KFAx9T@5vUg&PdoB7xW&{Ren-H}BA)|7js_FZ&orSsUeHipuVd6z zoX{t2La9<62VH&A7g4Ho2-fB5bG<;Sg2w??DUgO;iyX!5TJ3N#75W_^hgVqv26UGa zfu$-dO<0Dqz`V;;mVl$*aYiCF1|ZWglP2KERF(o0a-3z)4UUi^W35M}>qV*h9GR|C z*8H>>C~tsS%pP!!LNO>-ADZg`DIGjV98Q`zj5zvTMXXwisanR-9kR4ix}9{mG_UqN zl{HQ~jHC0I+Gwd-hSs7Vk)H%q(GD`H6m1JJbZJNAr@)a&o;Lu<(yEA$K$G_!)cC5k z4ovCth+_aZrzCW_2F&l>n0w%Y7Mc zc8_cLP!*IX;2dom<$Xe{{L)LK|()gratQLP7~_^E``o_&6A#5_x{qf4G%OI1zaMmrXMFL8(J}GFELT@I~2~_)>2NR*$`;`XhQN zEA26TH;HgUPfhTP88mY}q4&DS-Khz;l7uJpdTKH!^g;KKyD@s(9KAg+9Uz7$bv70b zvJ8vk&pUUx2i(JM-Ba%AXPOxx%?w~L7}ev9K`P6jKBg1GI! zQ9|P5MME*pQ_mkpl5q?daYl4hL(ySS(v2#k+VC48qk#e0xR!5pVd;{Eb?z}N zYNyv_aJi>l>hqIt-UiR@94$uFzx9 zGC73-j>}XtXN?i8$xq1nQsf~d4$+80ORt>xbViG{88~Of=b%K#<1-m7ixg5!i+R(k z=U9Lp@w^e?8*daPo-Gk}#M`I(eBri-m@q0u_ z#0QVx6J#L%9KYl-S@LyM*%*`^=ge>(2$eLUFohY zmk$Gam1`eqb;OzO%ETiYtLp#(Mx7Y|6f?j<%H=!~#<_m(MAP6LD1DXdZpv@c`5At> zhhIL&FZc4x7f4N$&Men`{P~OgxytorY9Azw&-E38(FEh?hIxaH7TgsvEmK5ZUiKs-x3(g7&bh2cTp0 zNIR&s%0K0LkT`d{4zO-Q6epO@dWhW_*Qo0x-3VUyDY}lkT<+79e$r*t4Etat&fUej zy373#v2(e!zBkDrc#NbKSc zI+f7Lp!*1_don!-49pw7o^%*jvZQ%fb{`~$$!rDw*45AmEykVek=Wp>c!YQe9T4{@B?)+r5dbSrK#tRGgXbhl(!(s(A*|q* z(sBq(`qQ2il#Va#^SnN9NbICqp>6ga#I< z#LmQhiKm#XMcz|vW24x+l3I3)Hw0uKUhL5Q8K$0LQqMu}5${>LIpjU;EoNIdhrOc= zf1bd@-VyJZbu+=>lk_--HTslw6Blnn^mu9{E_#eh)DykdO$vjj(ql?uYGMX^%%sPx z#2hS#)6ji$uuroC8#Fl#nM=rgfby~G7K8>A%tv?SiPb3Qg}YFWhQteZ;<7KXn58JC z6kT9YPLIbDzkD8h={p6XSvc-kW%M{!X(t@3u&}!?-0Rqx=4lpBI+hEkun!o!ZI)M3Yu!y}I70`MMnEY-#w z%hXXvb9l`0F#aCFhX1Q8!G99_98-=JSjDX{rW}ui744Dmq~nN)pJSL(;0LH zFNUY+N73+;qCM9vG;c`N;K@>31RrJ1;XExx((<)ql98$f14 zdyQCW4n7mS zFug8)N!W|OWW9jEDFCPFZ--O)V>%ww^_RkMC4mq8F9?}>lA5I_X*qh5k*VJr&ca`g z-W<-U zmA*P$u5S)kbMOv;{Q&#*vhWW5&TxR24wD$ML0=wj(Vr^-&kj9N?bH*sgZkCNLA@m0 z0m=^jKD9%C6W1IOHxpvGQ{N$l59trBM3d{%m#W?RQsc0`RO{C3!(ICR@G<>i^|1ah zuBE6lo)HFfu}61@d-Vd3;Ms6WU#Ona?+f>F>G~nv0Ho{JH-rc9H%N&*nEI>g5Q;Xe z@7EyRS>3=A&=5!Ug~EuwGJF=r8^zxkQLhok^#$65zCfMiiKmcw3cM79X%lHRud!40 z8V`hZ<6Zn=<)9nmVmR5@Nxd?~SfQpGE3_2jGvQSHWf?GwJG2GfQ!>t}Oip1~{qel#%Fq(J6r1Tiew0@MW-*_h6gY{Cl-{@4-A<{~- zaK=c~&Kim8u#sq-HK1u@L->qQ86M$E8%18{k=GbbB8(cV!sqcfhQD#3wKd`d@|?tB zlPSY3PXIiLzbX7F@nF72(Bn1D6|afjcum&hmxW#U^WrZ#9!3+LES~-rg;V1f3F#aJ zBai4di^7=zWyS9#DwuWwhF#2wUl7j4Umk(i2>J0&)fey7eDQn3`SD)}7jbHsbpb|Q zERJ6oF2!GYd>VM*fCYX9e;)k0|D;L~9=`YES3Q0%;p>8!#2xE4)i<@4g=%gKw9?7T z@bI-?5!9<&7tV&vuB~f$`HO3>5}TK0XWv}W)B$&fH_uAg>~H%Q5DK-?z)5wE4NXn; z0e|B=A2=GQbI|9R!9c5ir0xfG4l{E1_pg5ECqcLQkX_W$;jeFd>*j=D@G=XAswkU zZ7$qc{L;wBf(mNCaHE>EUkV!F89>c#sBeGu{OPxXj*4v?H*PJf{=3$XJrUHm1<=mg z0)-p5?8sPGr&h99g-ib9@>haRu;32n%9`3|7T|E>*uG=pE+QxqmYQ=5E zHBC_PbKl;O9MsC%iyH~I^2Z4cHMREeUJ#g-oOw&BGon%aKKI#!&(y_NvY;j`q}e|l zs`+DZag+e=kn2K?0r+1+$no}2pzTNBdY}?*DdK@Mdt1O?%aZ<-Fo`w{JcMjPNUWa| zJjDjDYOZCa2!`6)TRVrRqv2pN#0eUa`d5Tbwx!gm5pp>;A64 z8s>*LiQnH}m5O>SZa^@g5=eIK_5a?9dZa|0+DQ4wWp&Oj>G$=b|E)0}-m5iE3%(25R5aOOsvHSWCd84>zp|eqat7Scp*D z?m+F=h$wXqB5oYMelZeWXAcp{Wi}mUo4)_9$@~7(u?VPyTCR@}N%j<$71&6aR6Ayd zSt^=AGNb)%Vi{*MHZgU5dCfn32N}c2nBYjWd;Wm?lfldF7&zMYb+k9pw>txbOrC~> zjRWe(gi4J;F_VtC>j5%@AbF8U7RHb;yUVThPYL_M7%clh*H;f?3$?&H@bdkP2tP0f zAxv3_#*m*A(E>Y>;-*Z)6}>pwO|r?*x*Ht6zj0|PC}&H z5u56p{Oy<{Q1w;7ezVc&E+V6$ghgl0h8$Ky?w)}mTTzO6#1~`pL>e>CFA>6HXGT5v z%QF~l2o;8i(N_txAVQBqMeJ7F*9mud1XtXMHj5F9m-<(PjL(kR-epVs{uQ=2+F2)d zPX0c&;X%yUhTuoDs?)3-Zhv=`pN*UmMQ|&B8D$kyrjkHi`yzrSSZPUZl}*jd0IXXu zyNSI0o}2Es6^DmQu599cKDTePK3djgeBUyXs4z?@Y!9gcxjHP$1aZvzI6WBJhD(Hi*PgU@`6 zMsNN^@@)vUH~5=Jo*B9p<>3z(KKzd#K^gc1(QqNt%fA29pjuN;!9xG}^Zp|!@`l!q zw%y+=O?wXY!tSY7m>xzNa&HXA*VJ!lZ>-quuWh>h&CmPS2i**?8PPpqJ$JW<0mBq6 z8bYDq-^n7>yk>SjNuC{e+LvEw9Q4 z2p*##4#yJq?+Fzng;~cB5(4%+DjxH5#4`LE;bMvwyHNf*;bTewrLkZKJ%pLAafS)h zn!V~#B8d@}#&8TN{`$uV71Ktx`y1Og?he)0ek{=0JA?O(IpaUgAek{|e1b?2=&q)< zslFaMj}AN8zS>)%jc7Z+^KSqBK?I_hjg)4L3~mmecMh>w||mI)of;f zUU=rWe+a64MEOwHj_<>E@`scU6@DLPoj;K6WG+khT~}QJiyDP;cc&c$j)y~vdIYVb znMM9blitAU#RmECnRmuu6|G3pWV^{dB0VFvD!YICk+1H-=wO02?)EnZ1M5oOI1Zc4 zU=V^Ep7jL8+KAHf&V408yc|Mcp13v-V63ttIlXZ2r+!1rxc1tO?XC5+P{R|ZlGYPO zg33@sp!Ji#Y`quvY(+IPc28c=k1B%ShcN=NF$Fg=5hWzzSLAGGTm`cMghkW+?=N&;8V&O(XxBlIas_R^UG&D3d za;jDF>rfhszfH3;#?in-CAPkH`CEAo(cs)jT)BbwHge+lO!C^VG7vpbs|d9I!!>Ew zqV?OU*f8j4+gX>dzwW~|weesGg;64|zSscYb%{JI1=Ru3V8f&7!kb?%4JK4HV`g$Y zO$|`3^?|Rg{aIDeRng2!SlP6>vb5y8k91Vm)W(DdN8Pb4KPul>bNYS+f!VWJ#0~w% zS&M{n`}aS!-dJZw586iKGB?7_Sa!4$e&|Hc7=~lUf|+*~i}%q@M^?~$Fp|?9%GXnZ zZWCZ;m2u=;c7%v{{qRR+-wrM|iDt{}iG82H*2*lZ_TTk=?PxH*xvjmdHNZsp(1ov@ z3dRHlBknf6Usq2H3^a|j-~Cf=O)Ydr@jv-&kF^{#cy~o}AW+LA-LCx7O9z4orOZfe z@c7`PKdY&AGH_9CsJ*F`*WoO2DA0Q9%&_4xAIVevXlySq7O@EXXi8yUuzr|@if!&R zVi820pJLgNeWMb^GPB5{uJ3|GJ8Se7b3CE=O&Bd_VaD>JNHIYxMtMwT6gV4$%`6G| zAV%?~g3D&ZqtDwsEK&dytM#!gZ8&m)OySyta|DN{$ne4WhLfUDQo-2*cvI|dObBNy zNqtjWfC)u$kZNkt9iek{nGw;tljm-o%5!1$Mqs+@8_@{DsvhrX{0ZVR2`uQ#l_>4W@9@vT=8S zUM!#w_-k$p!XaTJ2K-0<)v_p+{#~rMnB5*XYYPCVpsgTsP_#Y&fiw&=8}W3 zVs{|W{;7kWsi4;sIhxw{@m-#%t>DR@2`&C+Fd<6H(g&*F*b>{%iF2TxG)5CTEQOF7 z0i*W*%R9ZyDM*Zc-`ckCT(jH5Dz_xG>z3M_wb{Fx>(QC< zFPK?S(cHdkZw(ofX7(1Q4oi>%?9pL$TpzlFjoi#h2_rYXz)mM;yZ$qXO^KSjdmgUJ~k^=%cbPn&dNlKbKcikc58DgcdZSfZx+PNPnu)k)OYz*rio>1 z`fr_|GNajI0$y|5tc7G;pSbkGVDo@xKP2C*e4BID+gd-HFShQ@$)QmL?(S&P)Vg*DrV*50+;feP0VLr14Lty~|b^R-LS2cK#FPb=b*tOKtIp7Hxsh3N-) zeg$GWiCXTQh}Gqbg;^_xcbdPylo}5;1k3#Of%f(Qdv{aSJS*e1Io1@e!2XVB-Fm!Y zqE?;(TeiGC=SuUfAAgM+XuIW>oaLd8n&oTQ@A?e0SAXVzARz6+%_`!5Qx?+)<|Wk0 zMzUe%j3eiLYTR_=H$Uzh@rnR5e|pE(Mn&Ai`fu^2D2rx_v^_AZh8Vk#T`D{NvSx0E zmo%u5eC7mrZjP5MBA@uq&Cv8+dy!h8`5c>Xl8q|36z|DQsivd%d1r8OH)D*Y=~($9 zEcq}R9l8oI@Y56D%O`C#nf=Xl_&1$bMKj+RL4#>8^#>b6b)8&??`PecW=?4)oQ zZ(R0_D2Hi-#Vo@~dk#~A=?iVT;I~vTXlYr(^$gT>H)ApqTl!hsf0)miCAwXjGmO25Lv6<2X z;Pm~GQ-ICBLvk9JSys}M0Q0Oc+n~Ht6tLDDnO=aZp~h(AH36NEyfO^o4h} z56CNG*5y2JYIcm>qLVLvcTd7wVAn6NvajuGS{fx&WsocOf1&Kc={?4o4whN;ha+=9|9&ta>|L zApk=@mZszWw)Upx!i~TsUZ`1lnVqjWco2Kn4X%$n@u@P{UxeX(=`LDeY;0|6YuoJ) zwSuYm=VkGH0>m0oDRvB2r==S=H8nMC^4DPRZv}$&m_eX5H3=o9e=n#7X>r>TZ5VN2 z;x>bgd@fD718Epc<@cKjucbN6(`}$idIe8xwpB(?FQnO3F%nKQN;~S?LwG$9AknnP z9yq2PRccn6al&V9<+L#p9eqg^zwqqvEnIN#lIBR*_hx+8?5m;kmVsKxBqBibjU=0l z(9bJy_1Gd?FQG`s{R)LBYJP9!2j=Puwm|dW^JOJ1ztbz-)gH;PodUumhyCzN9=BvFCy)x-o&_*HLu!F)Igi`_-m3>Yv&4 z!zXUUwJlEm^VJ*fxodAk_PvnV7LptsCmF}R@2xbqYG>nUPA-Y%9bmb6K@3Y_I!i?* z1%u^9gya)o;@AO>mClQE^jaLvjm_DFq!~K#>jb}@*TnFfQRq~QpSh(wou7TtKs-MM zp7qb(AEQXhalCs`QjEO8srv{zF<$+xmM_oSyQX*#A z;5UisD&G)8Hk;*iou|ZGXQ*AIsP#v!Y%f|++x`{h`nSmSxnts-*{UKOHSm!S`L5E^ z6(8+k)nQnCHC>}w8@(6AnTKIUr3Vr#yIn%>T%Y@<5A3w&Ss;hcqkf1RJTGM&S8%(3lCWokv< zuWgw#ZxtRYqiYZ7KFvTKk6Zcu&Fs31&ClFMrrg?*+lAJPky@RGOjE2(=cv=^+xe99 zr;)Q){KA8)ZNsHtn>?)6(&9Ftlsm~d=Dbe^(_ceS26rQaO!3Fli{@hu4vb?m@V!q4 z)8C&^1_zOWPkino8KlSixapy7Wn?MS3>cqA$$}7mzz=6HC|bFdv(x^XhxpUy9M$5@ z>G$0w)O<}`nKWB3Bs!Wzwuqi|jp)KG4q@{Fag!dW!BvZJ_dWOqDXvIa5C&PcD`txK z96pNeS1532h)L1>UJXm$u1K5i(%@hMsVTy2sX`HEh3wg)gM!DhF@++bHZUIT@7cq8 zo>k%~P-%;a;_UbKCT`lR;qz;-UyqNhs}vnk5?@&%tX6sR#23ETP>}i#Q#Y&K82xO9 z0{DV);5#imfB$A1lR&X64#B$jSrmNTNrMh-VGhu>UZ4+HXg5A~-4@OrYYc$D(GUD#3m=p96_j-g&_^tE zY}SOYI{^Gq3-4rl<9qv5t_|J59<#6p+p4Ac65*B}1MYYP$8z&=A{(&CE|0CM z$m=;G9cQG27O4?k8xVGq^^hS8n;gr?8~}(gjtO?gB4lj%?47V)mdUV%^-dET;mbi( z&4|ugL?5u4wz10VptR$C5O^u~dHpUZa4kI14NHr=aEd~ge%5di`Ts+~- z)eNB(h90xf-bf>%g*4k)0#Pp`8n=iNqRk>A!Vn{wut-ckw%1pb*&#+WX%Ts%eE7VA zXwEX4DT^l2-pry@M;TR|#s}8b?oAv;ryDUNf-zs6j;5wq_ywD6mMS_m09|tq=ya1V z+i73+0DCS|jk_O#buGMS`lyNT_|N4yC~mbkLNk5fBN`uTLdg-D>0=kslrx$XlP1R% zTO?6f&0`WPnxbLYU=eR0j7v4iYYM?axRZswErbUf;Z8=tL*f>IUSQE~_miKA(EN`; zh`o`>BsHYj=IDV5`_M?c?|TA{laZKp(}`!Da?SGuM7iTsBs|aj_)f0@5^u)I3ZLWj zqR{{R1VoObZ&B!yURK%69)B;g&V1Wxe!rUH=#KwH?^HXNjD9!y6c1S(5DD?m235Z^GI1+yDQuM(sIX6kHWyKsh ziJt77^C-$u_3R~D2fO8;yDAQ;Ba5s^$nz`E`;5J__M1?rI=U$Izxf12wR(P0=zqxx zhSW{mPC(?S-WU3R3LVvvz5UJ|qqR=HDFSy7F2(LPI ziGzx5S~qJ0#yoHFrHgox6A+V%ve=5=dy!g*dBJu`Cm_ZYeX$kle%={e`~<{V#kJT9 z+IA6^eE&K+O`P=vM8D!)Y=u0W&TE#JSiDmHJ0~CxDangNf5j6J9ZJe#D;nH%!DpU; z2q~$H5pHhQ7yfgcfbc8ni({jpP0wc5*qLEhcG8LEUWS=aJWicguqIwxY9}Cl{O%_(LyJMcG@5&8U{;m zfX|hnSSqH;iJFGo)*G834TZT{gwRO~;eR+uF4GV?3OTF>-Fj^k_^d;4Ee$jj5Nibj zFHwM~^|-%MY-VAx7ReNRX}_ArpVTx6OJSsv#LWobGhztR}db(^-G83LHMo0f9!;+!oA6GBK#>@mENn8Blr8>juUm! zC!Q9&;UB(AL5MU4{?+f!{V`MQ7Y|EE5hLJk@U-0nG!tQp934e9t`#n$FzhKJnCZ)e0QaJ(0m4pM3fU)reImJPH4{3Zg_jRjnX4#M9LZd_q1G zC;R1q+=I{sy)4&ftCd7Ucy2yjEVoFDiY!SmJ1LREO4!U8Zytv{?* z7Ky?S_c7!P)o}JLyl{X${J0way@emck2ahyzWCD1)k>NnyckkC;K2U8dWg~dq*_^~ z2|w|{-~AXeLjahUsucuzd3lPVe_joT;=<3n5RV5n_lsA4{p#;t`~B;0Tu6aSdHI!J z#39KlQTWA9a((*Bxg)5zd=;2qzj9QrRuB>4m3v6@zv)-T3H<7>`;}@1!4Q5uN&5fY zs}oQNA|SjPN9!RtBnc;StMc)Us!-bkg#H!tMk@oG`Hz~q1Pt#{s?Kro+lIafZ2;3Nvsy!ECF zGzfg~<~!s&`K^33%>!thWn-O0)h|&5arM1N*BMWQhJHSJ8xA%@&ZwKYlt4- zeWx3b2%hlHA$knIJB17oMB&|PiS!g!#9ZaLvcr1FLk~DhgbG}&AtA!Ogpbm*OH{-> z01#tA5#OZ>@QUeThL|a4vF>wR9+bVPf$LSl3(zUtmbisvFjq&|1ogItv+( z08{A{GC_S(?p2Bq1fW{E0l^W>3FuSPm`_}2b4YZlI{+6-#bXlM zJaxEg@uU)>n;oK0>7<(j2%<(Y0&sIwB=^1S<{&~X2#3UOAbZ43WJnH)o9WUmzVk&~ zj*32+q9z;#!HB3!$x@1h09~?d!bU}xlq#ho`j$^tQ30HeC@7i$J&lT4QVDT9E;4WP zJtBPnCQ5^ z3EmIdNwF9)DA>cOIE9BE;?fVe&SdT7k5dqo#5_r)1L82SF6op4r?Ue{6P2QjTH%1G ztEWlIK}JS}rb1>SeUa2h9EKpmB(mE^>-1GbLA}dkSbq~)YbC2v&6+OpF2ZNcFAg=8|8OC_1p;I069;Pfb3HYgDk}0gAid~tDI$f8AO)w3 zpEK_a3eVSv2sKl3snU%&CwTXVfrxnf>9!t%HLKp;OScX@8 z_(VpGv=PJ#Ar=SdcT_$|m-BKLgLTvIlzf0rqD*_WRSz5**DGG5SKE+IBsmRBGeCbLz z0*?4357d~h^hp#0C_@=i*ORTuQ2a^`#^z&8)Z_GrZL{zQ}klL!09m*iT@hit!)7+u3AQ1uOptK5dSfeZg z!?33#N-rXEC9@ergYwQdAbW?BC8n`!E^~Q&K*=+&EsWy<QR+wirFiOKPw3y4It(B2tbbV%J#9$dRrLpy@i z$YJ$Hqf7lt_%QyCs1IXGQlM#`#AE7eRK>1vue$%GH2AMpOVDXcw3F&L!za~ep!k=< zrxEZcJj9u!2@7XXsy90er50$10HV|O^k zQE(&Fnu1|S9qEMHFB#(3PQEO!7BNV z+giu&^#Tj^Ztp{%t8}x0kIQlK@Z1j^mN#^KQF4`L+r!In7ZjkHCe`yqbX0u$nT?P+Mm4UtO zr2%*duGy3FlV8>;h1<7oDOn z^S1kgMO&&$OSWD|@S+>HU;U?tx75W0Y=XA`JZ}FlbbOrI|;! z)+L%O!K|{hsB&BJ#_iwu{ELg~E(3f^(e@}9nU%cvwu8wKgV;WrdgK;HA0t}f4cnWF zTJMfH0fx6ZQynCt-6e2BVbLaERY~P78#nv5RTNcz7ex&&x}j*>EoCLX%1v9hmEN+w zc*_-Q>9=s}_6mkiB>j?dH~AYv_!6S6Xzveydf{)TyAW0?seAuh()#^DcIbkA56t!7 z_L)C?_nSdyMd>XYZ@i&m6OC680i@pP=eG|<+D4_%)fE~=iz(eU;P$XZ-d_~F+7 zXbEa~x(-g7%RbyX)*CeNRO#DLQMnb*ulF)++19eEvLAH*_7g!DuthiC0%Ymdipu9H zJC6n0TEffs$mdYgPN;wTmcorCzKV+N(s%mAVEo34TPl1v6m2N3tjIF{lmm}SQSZnG z9n;|-sa^Q`7q1WM729vA*t~W779Y#QRakjTMe&yFN{UK~w-hM?mj3qCPk(g)Ol@CWk}u9u8cS~d*4v*CIyRP~ z^A%U#^(kTP3=gI7P{U6jn8|;Xx=DZ|8~)~!dx+efa$@5&FQt}OJu^`@J8aMU;eY0T z{C+3}4;Iq$mCc+M$GF*@?y9bz-0Y^rq$R(?R>^)u=oqK9_&k8W2L9_fHePDanyY{p zihGP3qWohV{BqSX2Vws`=f^RHHRl>UvtLkVF)oKqv|XZK5>brrUyJCk>_9n2PMqSy zffCpn`X1vviSSqPuN+ge+bnwyfN8W}1 z_c(}#Q8V2iM;nUiU-c^_X|xQ$|8*Ql$2b9pF|#~hGZ*eLrgFMh-80lJVv^fz@LvcS z^$pFvTYd^2?hP{bG5yxG znvJzD&*-=IvG%{1gz!yi=lSjN4{n27Kn|mU-pY&4uJg$lyn-(N=wJSV2~p&fKMQ(* zQH+;_e=v5ks`KOIJS_%zf9CccHdA8$wK*Ykk;qe??fAl+KDyyY|pWZNEuRC=6=;dTzWwO+v;PR{Nm; z5=mq^*0m%u2bVWVq=?3|+2O)nRJIsD{E<$?2dr9R81<&kWk3*|8qC5P2Prk2P@Aoh z4$o7=vpU(PdVjF(Wh$8EHrUoW-dObe8k-&pcTxG^C2od5ye@t9@Bs_YBB%jI{e-?vgi=3BRSy78*vG4`@!e^d88Tc#+>W(Gvsod z9CbIg|K-lxt4LIijx;ZFhmNe?$9*{R*uFc|PR_=!4r(>^6`}e)fmZP+|L{@jv7BX$ z<8+<57sqG%f&ZMt+xSeEgY zSz|QO3Gfg)v{k}(d%aeK(PljqULTWrkXv^(4L!)V8)Z&Rx5!UiH zZ^NQ&t?f?}(lWL-B(eVfjD$4&n4w-y&&U(VNS@EmmK0c)=RXq?os885%X1@QP_@2D z;8-OD>iqD#!L4WOON5V60xu;q*By1gv?s@&1gl|0k7{Ec{TplF?A*IA;#ob4Cp}ww z{L`!?$b~+q;-S0#Oe9t}i*PAL2rcY_6WJsYSalI0Al(^|vuCCxjwoVs&*lqRa!ym&bbDi2|3r2~M~p=_`!#bYpNTfvGw%V_gtmO$^VEC- z_X$E+(<6?s6dP(pObK2?HAH3kuIE%JwfQ0nM1PBp2IvGJ7QnzQ?zm-sy z%Y4q5)02>ylN8jRz2 z5<#rEP$w(sU4*jwm8ABA(}LI<>W4q;cSVv~XtM&ZAe<$#g+rc@h-JHe zHoUEMeuVIrPHgETHSkd)uxi>OphkdU5Zm+Ztc|x_GaFTfe-90oQ7Ru%S?$5%h5BT^ zbhr*T&L)q&MHCW&rALd0S@Bhbvzmm3V^w^^Y&pkP{&pgMz4~vQjY(_+s3sDt zJ6lYwCU6rWElXe_d9l$5b^wdXGHV(bik^FS!5Qq3MQvi;&KLha(nu^SYglQl9VbH) z+w`oC=BMU0JzqW#Kr70gO=N2^kPjs0p_r@KA_|oG8w2%e;Rnw~hDrum`SI-u6iR?S zNH5><;fUp65L48>e_Q{pNQ31FR4-d1Y{e3xbtmvOwXv?wEXVD9zJ-B^CM=)-XxfTk zLQQ*naV@rg5Vww8?i-`2r^pLGR8BUWra9lq|K87L_tqcJ{cPjiVAJiBUhxs4GN*KW zVt64T=QaYyOcO7!xMy_`-U3*yvgMnV)0;0pE#PGaiwkgL89|@Bug5g3f0jx4eKy zB|!iTnk-ojkZIUQl$Xz7#oJ*aAuVU*Q9j|-pRKpDH{U1|GTQ1l?5@`=x9u|t_@41b zqA|TU*=hJTIPs$yeIZdF^wjVXVOFzmIrq$ z19wHvXRS;vbHuBI7cfzI_L<-^&ep>7^2G|DM094GiqM%wOeUPE{OP!8@fQ%4>3uIk z#V2YD31!8uFmXS4>N9(+sv#wrthsAZ>BdSEP?>o zSwrt?d%!W>XWEma!+%)E1~}4$X!$CrvGcGy6s)9rYkm z^lgO1s~r;0QV!4Va?*|2DlAM?36}voJ-h~Uvu_ra4=r4GD_(ePZKMUUX}GCVo)KE1 z|6Ko%F?RFTZl^#iG{X_q5sB3yW+S0~79=98txh8Zfps(>p)#3#fAXCIN6o_DxXtgRtzbeJ||Z%uti8zLTD z)zbK;WsYKL(HnU@huV)4jcHP;IM%@%W-)2;_JeDVB+N-bDV`?+vrolvAcH`@q1n{A zpQx7e3X7q#LXlio-`TvI8rctt(rmRhN;V?>m~duw*>EVjweI^@qA+XSMp4+r7b5(H z=Zi#S>N$pp`2#5;uhu`kC`m~GlgXE6C$ZbCUlNJgceCU3Ou#Xkq1BR~_|?TrwbX7sUt3xAz< zKclI)vVcl=9C@ueXw=kh>Zq^BnSjPWZTQ_E>HY2W2u}fQ39sc)I-d|<+{U*>+HNdc zTJZQ(O(2O|8R8#xKuB|?$Os4w8UDyN54m~`&h*Vnj#-0qJCr3~vR2b&rHSEbmX@4m z#zZM`V3Jl*d{YsfXu0H&CCmBum*~YXbQG^>&S)jeW>C&>(*czT!96qROe0O|Ge?C2 zm>;&?K;N$JUH=i&O9l7Ie+7@jU=wL31D@FKsGsFsG~c|<^)btShWif2DtA7tsJC5_}#V@edLzJv_7t3|sd~&4@Z!0^OcV0y$Lqj!4 zo7I#n58RM5&rBm_5w$a=kSsfJbQWy4ZGl`rQN%BjoBH@2_awWu^Qe!A5pON5K;DwmVFWC z<|oS+7nctv(K61f`mMK4(PZ;#;*ptNG~I^zDB$AX=`%%sbPhhWfV8H&rUxObw-Aa1 z;c;HJ%!dKlIJ2)=sV`Q$b6JfTp}>=#@nUojA_|f~d$~kc&r>2wO-pNMO%+)($1iXaa5tD8ny<@K7z|O~PJ_XZsTR9IUSxN1)WGZ~? zTFk-N{uQDx*^#WKO^+%UZD1DXd6e;@mV{};??y1O^5!To zGr^1xUy-pluymT7Ccwm$_uBa;r&N@hv5B^niw+1Z_ZS;Q2O=r)-YeG3h;+pSrfg^{ zlNIf{_br-@d1T1hJ7dgY%+|jzGuzB0!i-N(%!q9>sy?b?`wE*1*c=V(M6-Q<_}2!D z91v!*U3BDQTAXFJHJ81O3RQ>~cl<33gYg(xwb9D^oA*`8w9a+yJQ5&|*_;Ysg*D^; z%&knmO~5ATcJW!enZ0f|zMotsOVqHn)VDTbDV|AGBkl8K^!^jW*wAhlo#rvEnBj(O zS}{XjvL&VY>XH|OtM`4q?aWXW@9<{8yqOuzjIBApjF|W{jU!$h`0HyhR9l+nhpeb? zto;b<`~h>hXRWRHz9C~bb0$#HOs8jP0HC=88}~6Ew?d~?@;NFU?iYgTGb)jiv3-Q% zh9E7J7+EHBc5}r#E=zRvX^9hED>Cw#%hZ{K1@mBRAHy!n*iOh9ui@@_a%PvJJ=R5f#ZA%JKLjkkLR* zFH=aR&bF%d5Q|$LMZ(=-GDuZ69I~*x9gkW!P8SW~~N4e#h|2f7gb=ePI0{x1(h;tUT%v(KAY zyJ-XRcN{5ZBoGqc;njE4;!BUl0C1xmCv(0g&OGJ@^f``Jc~aZn1#o}hIE~}b0ovO; znW+Ho4URK1k||5d%hzTLNCb*;PT^b?dF2r8{;bWgkVkd@@y9g}k2+$4EX6b|M)l&q zr|kdsh$A-0QnYzLM4_E10`emXyNCajc-9dUWGPC=cu^GPM~59NJkvu!F)kBz+CM** zApGi2iDw+E5~g(!mOk-Is~R33a;#Wnrk|zLGfww?DNcPN;a+eWbgYU**p9A6O@qRC z_Wbh)pLlY>vBC-(ZRg3DiQ_#-pGsK$Z+}YccdRmBt=Neemk*@A^s%S=qFh+}FqO%; zQ2gm<5}pH>(-AIqBF2THS3i5o@gWcKx10Fila{kxLr1qIRQ~!;i6|JUy3C zi5O4zSY$_4GnQ+|=GbuUQ)@o7)NGMV8q28}U#-z}f^vB%q4F2~TW?(%`5>^Z zthK2Ib|7zWnkP<7NLtaq^{gnX!l%<+G2dja5QGJubXUwbnSd=^m=4F+jcjg=$3=B1?W9nDobxEtGH!r8NRf` zSDc0*{6G-kqJm>8D`#NRYF08aNd#6BR)`l-hyxNUL_$m<3U7c|%RK3Bg3^?pf7^)M zmka-w%W>OEoL-2TN>D_DM*{zHSWqP4c_Cf#(Tgyqs5G%~BUG9FcA8Q`CCB}mmN3+a zn+=HPwP5x+4lxY&T>g%8RAvm>eh!k{`*vDfF|O)`G!642HXq^@BUao2_}W)_gp0~o zYF5r2@SM0)(DQ}x$OLh1L0CTFgz)r25xkNREn^#9*C0>I1kK`lx*BQfX0}a84+wv; zojs6LLWWGQSrE2U{77&Z}JO;`ErOJpU&g#!AcICU!NPQ8r=sT4JYYe)LL}eQ2phj< zhj_2}Xe2n+qgq5;DDNi_tSzD~L~@IsHc1qO&!|?H0;Tw8M9rv%8xcW!^u3k#fG)P& z=U7^hDBp)DSFd=m(I$yK?nooW8)>oF+XI@|*iT>R65mtcySe?I=WTq|bcHR@QG}Z* zp4dK%ZR8C+hBabqzR4jr8~^EAr7}+PO3yzYQPtxV0}VxgA#96*b~VL7JH$9X{@zOa zK*>0o?~jRPAz1F*nWIeSh=%Y21wuMvF_~UkRN`z)R^nLzp7mGVZ)Zu0J8rR>{vs^f zS~64OYmj(v$vyVO>M{uwkVw|RrpIDqy@#h(&x&PV*%Pa4!RqdtVptjJ2HLi{$Op%( zwRAnQz{m47ROVAw4)&;NEQjg)4wTDP$mPC858iC65__AunTkFzC&$@Z%SXZS!G$q$ z!`Q{NmNOPZ>!?9Q2{wlOt5%ZnYH)mbAO$P*>}?!?M3W~@`j8^Zz}734 z+;3+~Epvy(!8Aaz9OzpoN?nfBnc}J$sRLGO^F+?H)a;lPrQe41KCxg%`UWe#c`hR+ zy|wc~3@X5&T5NH|a^P`5X=+F@J=dR0GiM^Nq*?s{CG4>Bm`z4o{oQ~pT12YA*)$JE zT^6I+h2>|vNZ3knIwb1aJ$6nQ+t?`{)T64U%hp8a6$BZiFHlwp!X8hW!ahbrSyaq_ zqbGkTjbKhAp2~1kH2Z7dA%IVH$owC%B%7tBX2bZ|-Z+tbTOi*t@y;0W5CP9J4=Q!! z(-uoJnq5rIfF(WKUV{@${U zESBcM#_5t;BQn8>XDN7|7axh?iFqF@J;dCJ*2Jfr5O>7lJ)0Kzi;3y%KL+-3lCH$? zr|DyDE#CT}YDG-JSq4;d<5mWyQLwKNZARg@i8Vo&X%l#*WzF{^%xG;>u6HuufU*K+AxDbip5~Ia`BholzbS;{nEA> z$1CUDcI0d^q=< zeLn679}O51NFfbrNCORNu;K*EO#p)pNl3tmBbpnykZVKu3RWDk!HN|}I;Jh1;)oUB z;v4+_T#gXgtU;CWHy_b)encDY#p5LoKvd`XY z?X}ll`+MJW*8j45^tGgahT%g=e5VHKI^k8eThgr;`j$zzCIu2c2H~1?+x;P`FITtQ z61bWnf{z0K3~7ndO`&};nQs#wsAWK^p+P^$tsg~crN`)0tAGAFMH@vm=y67 z0rz0$JBPv4oS{S8IdN4;&35U=M4|#xbGcVV(hm3JLa($bQ6(1tz6nvxQ-u^&c!a#e zUX?56tMJRnQ8FKIXSt`n>r^UZ7@#4f?+c7|Z1laj@8+{r<2NUa7}FN{tAz zH*YtTIo+rc)?k{&qX(wB^OA6;SRhQXGvM z3J%BLS>R8b?4`VJPcF#0c{a6#SMF|MP%l=sumS%gsGP&Vw_Eyg=O)?R+A_Rll~r_wZx)2g0CcCf3=^} zJr+G?^-Gkqk|5){gdqRC7VD>sEm+7gTmUlQENAmAW8*tK>lG4Wo96{rnry)^tSy=W z!)lUtD&{%iJUqO&Yhh_Jjuj>?&CYwI*}Q-qFglCdfd;brN`u8Kk*e@jES%=OND#nf z_NPXRXBoDjE?k!r#(9Rdv7r9fWbwPK-eESDF5Ho4WXN$$QU(dQtQK?38l6cOF3&eI zHbO862=YHm+9TA*L`vtR1;^+cLm&M`8 z4LW6k%6dWVwy0VzHvjytnn;5n^;jgAWjo_%R?wds1-;jzJA-D3)AZZ_@kx;TEV2vp zL#XE83|%R!B5du^j#Lw z`uvrgIBpSD>o$R?{r-ARod}{D$9EK%g5xwzXOku|xOe6oy>rSWh4ju=qj%1jv@~_8 z#YKS`J+mjcXUF8+-#`)GP_8)FgH!++R|Sgb&ZT{<6wPb@b0Ivr!kB#5}k zvpB<-wX>cTgD27kY!KWLgE_vXZJjMC?tS#F7_*7H$%uMp;_QIo^E{f}dm zvRwY&ELE0v2pZ4#94(^z+DuP1 z9Mf3GL6E02?9@AAEe1#MVS?!GcG`KwTXfZ;6Rm~Q5-pk?G|Qeu?zYoLBx#8pG~9?B z=Ae?3EwV~v+9VP!n$uD&TIdjpw9^nuvxv+%fTORoL{3S!D5`a~r&02YSWe7XB8D#O zecTS27BzJL6_2AGDeJb#;mb}Q0@mL_Ufmpv#bGrb?dgd=$IH(%>A~YL%+6Pdd@HMJ z-3h=K{B$xexxk_sPJN8I7t|tNXpu=xV|?|lL%tV{G1_8>Ijw$NY_SWyNcy+A&QwBeHZbWQ?kRo(f9w+XHLIO5@6j0-xpi*X5?Ts6K7yLNEGQfpDatO0GZS?&ypE=Fx%^Q86@Mlhwddu3g z25tDPpIYhd^PsIF?=V$kdh15tTCd%&mOJP$U`QC&&k@Sz>O**R1Nyfsb25g==(2!=2WS7U8I76&z!t^ z_u8W)M8VL}QKI*(Jvu`2U3hfl>%D6)2f=d8({j*fPHw$#qwi1hnNynHztIAYzF-Fn zD0QK)JrebSwQa@cV|xAN<3DqX)(1EGF7`X6kUJ_GHdXW5(8XsDxe24}H_d9pAG09v zS_GXmjB6x5;6Ls&r%7#OqwkaY%xO#;-RS#oe&&R$v5mez;b%_$+W5z;eB6rG0f~%P zd!k31SbM$=bfDF*J9*=EX_Fg$YkdF_kPw)-+O?^TzCZRerxtBy3EX?dI9e*z{D2{- z<8Tu1H!JoNjoR!+-zV{zQ;jya5rb~^6==C`fnNkjtJS`L|1W&zRIJS}VTuP?<&*!+ zDMMS>==;P!bBfj$SDPGHe+8JE>w=#-EvjL0tLy}py_;;BefeijGpZctTlwh?tsBAb zz&EH`obTd4bE;RJajTqCgWlY;c78Q#8qdQ;C|inyrJZ!e_2xH8~Cd@1*$`F77j@A~hw>cd?&2 z6{u-(z;x$^x#-WF^40V>?A*9c7yFr0o|+MNYFPSY;nV;BAg%Ic!7-x(8eUNyiwJuV zMr(kEN0@=I3t=(BPJ}fGI}kP^Y)9CFunl25!gC0_5Vj)hLD+(@A7L}XVT4Tx#}GCm zoJ81wa28=b!g+)>2%~jC!y`;Y=tG!>(2LNG(1S1^VF|(#gvAKG2#XL_A}l~yk1!u$ zE5ba4?Fe%a4j^TBq2Rcj1f1Bmy4&xs1F#h?YD>#Qm&M+{u%(zZvmb1@5LYT z<8Q093GneT?}#yMTHLVC6(R1DHXtQRRHcI`VH1mi^e8-U0OWm?NjV}OluqDzop{i- z3840*&3@6rvc=6RQY9v$V5CKGsQPV^%fZA{NO6ffxQq>Ag0xOt&(1*C7=&@6DDGy! zK?cQa=-@DxL3s;anN6~!3*K^ib;!6{xQT`FdYdmPt`+2D&}+fk$4D0Q8PGFUCF z=MtkFlDJa>6}4W^%T0hhxcn9w^hki6zyodx^@9$MIPgUw%>^kgaTD83Qq&00h==r9 z3dNWRNu<^xOYIQ1NxPuW6|lJ~sVMU@=%ORXrTEtY`UYt$yT_<$M4VVAu46l(kxSeK z9dwkl9_xrgnl_}dXU`&8#>T_5#ojq9eNyNkV;lqr@~gcNP0rXdKQIr z)Iz6LSdUumk**Ur`*WEt9uecDO)By`j_~?XE4tWT@T2x-ja+04UPr2tk(w(exU$8= zu*C*w7W6;zUWJ>ssbq6A>3hhh0DO7DvpR$HX?Y&~>xz+~%D?JR^lrS-1$Qa1Q5LvwFc|A6#$7~Fe)pNi7-bD~%i zA$-g6xF9?f@uVO;oBEU>{669tpva1Qo)d&lanFGaU1(Pw-}Y$@8vxoX&?`2QaOd~% znvE{p6>XceCx*|2r%~)~ip3(9PAvCm;TaTuGcr6=1sLtUnk&OK>q-f42tNlNH_^V; z=*Us=6T){WXNeQ<>*&Jwdc|Qe+BP1Jw{=wE!ROu>W589%PX-S**$B@52M<5-lNa9V z5eLLUaY!suMP2y869vHXZDV*xhDnb++`@`fNfI7@qM2hyKRO9S_6&eLx5()%(s_o2 zJX!*Pbt5$m>FuC20sS0=DKUe^IvHnrEmn*d)5Q!iM{E!q#V)Z`W`G-htb`R)Nsm36 zfs&XgJen>MF8E_Uz#i{`rjOSU`EkUHFf9m=6{$KCo~Tz^6uhLvgl9SchI@|J>6sEt zZvxeEoJ|1ab_x)-C5lHW;>w)=+1qW%A~}TfZ;!AJrBfMJenBNYKV70SCOkhKuMAUB zFZ`qud@4SgdkgPrFzIJ6G$D>cUwA88#funBdhur@$sq|pdpn+Ew7;0FCZaVLZ7)XS zM_1`3#7k5ceu{$C7i}+3h{?*LGfAwmp}1GllpYfD%FD?R5+MpNzee_X<#oRoXz>Gp zOwL!Q)G_-nNw-%Dlq9i%vb|cY^i#H1kyN5aiNY&g6#d1k(TJ`Sg;!@O`r0r05RFlV zUv#oAC05l*^lN1A44V^((c{XTI!R($HZ_eJ;X@>O zF=YxLBxC*o_&mCIA`!wwe?BNo68uz#3p80AQQbt7@wM&%i0EixqF2>*K^D8TKCNHt z*YUE6C`5{FT%AZU+14jj(twFYf1X#{w0L_Z^{#jrdroc87xgf^i_D)WCW&sbM648> z#D0vlNpVrER9Tdeh=c|8oIa|L>En8fy%Pe|bwUz2W3_R8LdP|+{T!0JK+x9-$)Z>5 z&^k3kp?PgVThv-?)WcH5OtD!^2Ajhnq~Nj1-e&Kx57^teh10|ql;~mtJ@jaERMQNM zMISOms6x7!qm^hmcDzl%q)d#^dDJyZ5;9N|ybQo3H^h_hb&^2k;9UYH<)BVO;ERz2 zH|l}+7MPTWu^kP*^^!n?+>Ir2(N-WvYb8W25c5T+R!N;IUrZC@saF??c^W?TWKxk> zAZCIXCkX{&k-bgc4QjFI(JF~rEEb7HprXeWi8<17&`QKst)6HlBEBa9EkP8D#XP)* zMzl#WNso56$(MoCBj)Mt#OXmJBthlPqELcn+zXmdoK^FQ<`cc*6y7I7KlFl@4H{ZO zZzWo#=o6jDhu-Of9k(%|Qf$*Z^fvhb`e!|owo5|2xQOgKM4~hrqo74d0)5zpAGDb?j5Wf8 z645t?kcMBdnKXh0W*lkg8?@5oOVu#ln7C+d|XV&4jjaB zaZF5sn(IYj48&w2PKdGCrh_;kj*F2XqPL8T`O-H*n-pbNAJHZ;(ifo{rlAR#G6B=W zjOccDI6Xw2LF>nYiq0}A4pPc2teWVmR}+|k2S=o9j#B5uS+NPJn{@#UcG=-}%!YT! z+fdSiIAISXo&`+FW6&SnVqP?s%mr8~k~dKct5lklDJ35V3Ggn83t~Pr-YN+T;v5bW zNDH$qii=3wCJBq;TsWT(!fdjw)z)sCvn|>Nq;$DKOVaDr?Wz!FD|Svg^Pm#Ck!&lF zF2n5Mv=upIXRmX}>2YD8*_6G}IRo-eCO}0;2CB0Y zEYY@lb=Nu}+SceOaT+@ZEj%(jHXOSR%(h~Zt-+S8P1B3M^w?qRwS`I1(jw7lnoHB7 zH9^G^pCk{<9%lv?0<0&kasg|g%}9=|SoiAndSXOUL~=wA-UwssmnEw&Dd zx7zw_oyJ42t&1Mc*(Pn>wC`!N4ckU-W43Wy52?^@>$eRe(n}Gl9#Q&8RF|!vf^OSw zR8*fWMLJ81$gnL#x;@T(n7%&(UD}o-O-U_w**WWq4{r~b@iLf^+Gd|VfyZ%Mo>b)6 zLSpD~fb^NQos;gMI?dYdG=f1RIYSzvWp36MFC|LDls1Q=M~sJPX_Ox3(F4Y)G7C_~ zE#*jg(l|vIZLw04l!oX8Rfk%NXp@vjgSaVra7yvgT~re);BM>Tp6zDJH$^CwA0Z*&Bh6E)S89}+c>1>})hjKif=lp8H9W0NYL~jCcc`+I^v_v5rJzyTW(2oKA=V^)mtswl#+UtO>3bAymhPiMNWUG{!#f8- zXp^Q-B50THC$>&0RYDtdNt#^a3e%uzpEQAQA*Q4mX%UBZ8C_Nw;89J(%en*7h%_rL zaGDc+TNnf*B|Jcd3`$K}B(V)iV_eJ(k3B(^prb($$Z?o-2 z%A}Mir<&pI7{a7PGSE>$+1+KB)L+qmmB1G4Wlzj&XM!v zBDq*Dkv+0kP9*E31tm1dNt7vFEJd#3oOGo~EIn8*?0b4q;WSVj(7{lH# zhs&RpovdB&)H9r!&Iz2%DZNOh)FM7Z7_z$3x4qL(+lrG*_$m8s`k(7E!xek+LgWMyJ%L}s4 znW+iugcgYGk^3;KjUjmw!WU#WRjx(ulxO5);2hwy z`k*|ZlsIRc&Ty24X=n}_k`O10X0Z^BYGA`-q{K5X?^W1>lY&AX^YFH0d8~kyFmG_g zN0AKX2CaluY8ddDI3DD&d_Cp8nPg&!=F#C{1nw=>!9b@hk8MuVpVhqzW! zNiYs?ZIo#MXH^~I$5@&;Mm>F;RjMP}Yquh80wqWYCs`VA;7PV9yAYpY9lSiJNGi+9 zkm}W<^&Bie-P|VeN-wAPkv_>vx{{#`@Pt7k=i|IML=QM)DZi(VQ=*J;@+hU&DD^nQ z&}2%-&v8zeAVL$OQ#?9Da@!O-Ud|bEc~2ZrqQi%{qJxT$H`1_@BtL=zMwA0Io=21c z#{$o=NCL-|NLAKhk4YSx!cC;Bg~J!POAvb@d5~cB)SrK??2}G0j8952+dG;VGhYsRN9{ZZ(IO zS-}4-rUIwbS$x4o^KzKxp#&jK^Ko(w|F?mgqeJV_8p+@d8hxHIsWs_Bl+dV+@Y#4$ zo6=^qIn2sWQz?yFGf|sxEF91VIS0|_wH9iTX008<=**ZTM$2ID)S@M>z7{K$*my#w zyc_+wi=QjoZ2OVcrDe)-2>Y}e-e~>W5tSvIE+RbCR2`R zf1vmX;uBONJxm%8lT1W5T2dyVU_4$Grr4Ag8<8me9;{giaH+_C7czD!k?iM7qw@N;2gIlj;WwWV}j_{&(Oq_q^IeT&O~PiCwJ;t zdXjWwC8QHnzurX_OVSJU8Y}{xdN(yt67u&@tEA{nSTcL5SyGV8gEfTjpeZt>r`c=l zKF6XX+S%(U^oNT=Os4fdn7+CoYOlCU|I%b>4YkG44w7VFawW4$TSJM6vK zSkJkd!aKrqqz7PeFJGrgnFZTzVD%zP48nS>?t5X5Mo5L3$?Q$~b5#2#{k#!8Zv^$c z0h{#(K97>57ijeM={3$lZigYN(U3mEPyW-VVW$bb%ie*#{RpRzlG^k924S2hOpsZk z?eX?09-X0RvOU8-OV&%nL#EwrFR)MF0&OzviSnfoNl6X31gL~(EL7Y+7(S00UJs69 zJELaw*<+oFu6ZtTfh79uE%rqn+nyR^Y{Vwz9BvU3<=Y{wh2JN1*{`LFwAnLU)3@WH z!=4t7D+`G1vCDRvVx08vm_3?D;`zUowiv8i@s0_cZ8TS3_+a=PG)dyL6#j3T9fjvR ziX7?IL#lwrDROvl-bo9u52wb-^`!O`SscCW@P1AoAo`+Hc4;oBYltTeQ&N&E-Bs)=ag9(U z*_G$YcNMrssWK@pH;)v7?s3()I{C4YQaka}270nha_Zx*bFN;OFMOP8*y3t;O;`_; z#CZ-W9j+;Q>~=ZBqr+#2+>I_eOLgeQ!vIF`^li|o-&G&JK%Aql1y@G+A~B4*X3*8r z!aty%H12xsK^{!sh+x8Hob_kHun2|H!ri>rx1--rp8~_8Yl_!d4xizRG3h+J^n}Ab z)Hi+$m<*q;Mh17d?4a?eIncv!Wy6QiNVwAh1N#td2yey@2c6+G93vgj&W9sy2NF(^ zc3t7IJa;@Uc!crr$?&Q00%;LHebL^2iajrdNJd`_*7NT`nLRWD^d zYN6VzMvML)`lm}x7TJLM3Q>pDON9w_4;xpr)N%E8{}BGh)qC-LKf;IA3AJCu1O6FR zM?^NGX8lZv*gLC6v01fQ^e?K%FB7VdXxe^N)52_iO~co}nl^9qM{5rr7Ty(NwXKd6 z?WB;b-KnQ&clwjG`&g2eX!9p)`8Izn{ga^`&x)wV_2n)-N8816v;~_#Q=4c0V(sis zwOTCEcB?*ZH}h!^`F+}Z*qtYfc)&k3+F|-~1G{JZZSXf}Td?Ig4)=c8Td1sAQ^jU& zi@!-b?QhWztHN>Id8Xo~IaO-Yvhe+C7IAiHF>0q4!@4LMA#~&T+^t=Tk9E16Ud_S! zG>6)!?e_O-x&D6btRPei16q_ms70wmS`-`9_WFnLH=rHy4;u<$&nt{*>;0qJdSQ$N z2?BPz0`|J%xEAA|z~7{ij9ssQJ+C;U#rdbSt^QdpYrPN=HHYfXX_=xQ=UCV`YC+3p zntrwJ)K6mD8Y%jndc3G=dJaALME`<@wushIQiKqzGZv4ZeB0 zJF#KiDW&Lp{b>eg1~}94!%R9jGxXd1Zas@ElB36{d3p@XC$61Bfxbm8*0)GS`W75D zFZGuYSA^g}W{d5>^T(MhGN_GvnSQ+s1Ci1b?RkmFLnz;uihj2JM?(P-%0-r7@7_0syc+9 zFo*Qr{z3gF|1c#d2qQXEM`3_beY1ZA3Xf4TT0ln&V6`6C9sUXYP3mW0%KCka*i~4bOQGeXOs25{1s4t*dbg$$OvqSDqLAGyE zo%St~X5Ye`_DlVd_AIhbw4JeN`)+@%5sgPQ-hPEY(TFA?nq)udPqrUdg`K-n?71w> zo~x$V%l&Ei%dkJVO{m_LX+O;J?PY47eNxtQ>?KUk!$1BUdxPT7w2vwNeEO%z&PPEp zzQQWD$M{R^F@neb>zxVJd%gCptkS+!ZLn_@D((0A8}R3~kBa!GQ39n=0;y3Fy!I){ zUrGNo&_6BqYN}YP-NDY;9crt6tN$GS+90K!NYz4zJ&JYOqtq^Y6t;jn{hj#hCQ^jZ zgPQf&kNbPo^CQyRDH!h~HHC+%_SxINB4fxk)nRsJawmmtkR)U17%Fk|24pGApt_Oq~M z?xOuJwrKx}f6+e87VICWi}rrWzhIA+{rGNBR52&Xjwn@gMCne)LFRPa=yy8qWs#28 z9ZtuGcn%X0NyNZ%U|=~N?IL)FMZfHr6#W|g6Ya>NYui|di^V!#@h3VG1pJp|1j#&z z5P6y>1D<0JTo1<&_x$^yuG>mUEpcLlbmIyN=+x}#O~wWZ$c zf~cw0p1SYemUg*N#ta}I6jH7f8mM|d+VjE7A;$ z;L{!6a)n&vS9oi+_VVY;Ssmv(^k~V?%bg*3K$KJ=71q{!ZyLVu{R)>UKQ*VO-gBz% z_t%A204dEx^1~-h`#p6h_f?g7=ZO$u5elmeE&f2Mu~w?P9N>3we2uc}OV9YKPQM?L zDce_9?Kx9=@&ihZu`-!Hc}*bn|0LQ{`EcEr2Wg(urQQ#Tu+GYqTk8chpg~zAiX)4^ zYiYdnpT6Dkhl;4I73#?OXEq~!ueZFa*2^6m7;2t8uD(&>G$fe*4!-Cq{-8p2*VXwd zPJ7F!xhv#c*vDH(Mw4=G_8HFT8M$7C&lb+G7a#k7g+HoUZUa;O<(98kS2*dbAo$TS zY=>9{;4jwv^?>@kjBFrSPtRJai<- z5KRnb7M?@RtGl+Us?u9_{?WbBhwo;tWE4i%GUaQe@77er z96OwA$uB%)3C@0!iVo+s$VTBu4i&>@PgA0cK94(ySF`t5RedGr=G*>d<7E}(IL0)v zk?Q*HSLF(JZ2t|g%#SD+6~C{(wiY%kJc*85mRGiE?hpT3@u{NICm|;!Gu5NQxuoxb zs?!y&yn#C^v@4GtxZ!AF@qwHV``?Bl$Br&pYVVxxf#Q%^b8zcd+B4e`-*!HRH&HX z`NTWjd(ABvKmh;(KxHravAz2n&Cepf5%P`cr>IO*RX2HG{AS(jAx%gtW-$A2zz)by`ZC~^+rR%%g~lIK z(J9`4=!ch=+b-Xo{_oA>*HqX`>rgsYK@6Mf&;QfEqoW2vSs)e!bOCr`%byrW<4Wa@ z@{F0}KQjOPd$1NFW`-qe{iMnDHMB)ArR>J~x-_t;~s$3G|Prj=BqN(Rs9%JR7cIB|KENS_JG zj(Sy9x=+EL*uG#e8U5}biSg5GFk;4mW3#H$zaXaAU?#I$7<#<6LWW5WR`#EWDP|QJ z(Ds)^OAMjGjT(@nX=%;IqtPJ$Ol%v2*=Qo+ZFQ*D2RQ3#VhGW5iGdn(hR7j}LS%da zQ(J|xMdPUM9byUT5n##o-sCIw5+hc+e6k}PR(;j1jEjh$3pSK7xtV0c zSe{cx;k1p6pbVc1&VW{-+4)mM*bqzz-85fH^pI9Hon&JoymEz5v?vC^nS3II3`kUx z!=E1^N>p%hrY9vM-PE6^3OC>7-xQy<0KJ3Kb546;rLtRzKJ`(rc6$R}zDSu6rn5CT5MWF)sU0nBl(8}#WCY(RM@OJ2^F-EQX)Tydc zG*ekN88@UyL!iNvj~-oGwgeG`S)0C8oth52ufp!Gu7;~>?uR7v&({4G3w=<^=f^&n z#ZWWmWXh9T;XOl}5x(y8{n8Elhg)f#;PcW777UBy#IR{O12z0jUQ5#T#KVr3Vu?BZ z+18RD;m~SCVn3VxBXj^GLLG)m;N||smBmLZfPBOASd?2R5xaqaGH4EC`l3zV@2(tf z#kR*l`KIj_j6&)3SgsXX`@sD_a@AJosY~(C{nc-NjCQxkrgPyJ|M@dIy2(=NlC^t5 zz_NyO3T?i)Y?rB$nYQUk@9&`pkY{MyNrgKL3-=mYQ_8c^yZ#!r4o*rnd>3xJ^vchp zf}s??T9BWV>SQ8Ehmy0oXQ%4zM2ZU~nf=;yi}*R>*c{4%N&&CqrrN60MyI|S$ge5H zm#~756eltc@TWX=b)P4$#1&jzO`}CP+fHIzR#js!xN8-43{O>91bCH=(!M}^8$t^T z-lyy)`ZAlCL-#TweJV67_Y|;~2+NE`=T096nlWYVCk|I?NZ#+ygwHH5$y`D+iG6(t zH|=1}2G~H<_)uzIok@f*QY;isVp(P>o}lMKUY>)-+;C$ zTfa(1ZlgoxR}zV|3=H-HCK-2Kb!Y0_XV7|25o2JmTEeoc=$;4ukN=+Nfq`eyVfMYAIxp>U z`iUbjuLN(>|GZfeA-pHrxt{p;^)uR&+v z@jz#NbMS!`FH7Po)rws&i^TEuvL)*8#h0_(dXN##I{OtoQ-<@ z=ZV4c1kYD}(%nRaGW;y;Bo@mP^>P+-8b~7^3jk<251#;c5r+j@6wJXFG#Z51l$s0a z7l_xwy$SG|bB8e#^TjWn7`Lo278sW=la~_b%1RVgRaBhfM;e@czDPVPD`9NC>FTBK zGU8Zit>D!%gIFwtr-1H8*FH!@3vMYuG`sd8qFN|80V-cm4-?JuCm*1NcKaj5gl@mA z^9;4!`X3e1W^!n!-SEr}KezfvD8<~QdDve^(}f8aNnPWGpB{d+A`<&fqjS`mxUhs5 zxQc#Q{*1oQA=@@Xzfx}qU|@xY#jLQ3E?^6IUfMO%5r^D|qwiQ#E+x^C$q;MS9(y)V zW!>jL{nc+*Y+H+S`OVx;;$Bm3a97z)oPn8mnFcVOv1PoJ*aBWCb9 z`DP!_W%^{gP_F&>ed)00%t?MDQ-|9p?%t+~XDA-SLGr*AMjg7I}t}izx=>bQDj^f3ebJcQ zvI4)}av@iIOeIl1pM5VR!}Mx*Aw@97T}VRK$7o@0eWA>Sq?mq1*VF^!8WQM4O&9kU zgaOa|7=X=;dC|EG$3&4CzLHWRR@)`lzfp5coBVR)uA5P zfS?Ct1&*tsyO=%?^xaL!TAFo z)wl&OLhp+(;Z>`bYYsqKq|74`S9#YL3s3AiV;pI-mR4PpgKK5Fd0pN=EqQ-j=iGK- zWtSOf)%iC&&r;vpB;RLyX}rYPlF|H_ACb zy}Bri#}F6dWGhr$@I=A|nhwp@<}yTn)^KRGYn6(Ij07&z^rgLAW^h;Ke4jC@ec7r) z%~s%yp}Q$_(-LSX&a>UnaP_7j`|!D*|AtQdrRl-%cAXW38=n5=&&AU8z}s6=X?oB* zFV`SuZ1CwMacyaO@T&ulB8u6g=#1|aQJ(~_Iin)>G>AdJy1t93b$0{md!^}1KMr)D z{Gc215k!~n$VU+gzSo{2-oP#PETW;eN$obI@I9<`H!+5kklTm}Tj_T5yovQa)J7cW zeI$8y`@wX1t93BM*~x5{2MOu@{9pIpemJ~(?srjX@^ZOEPUlxAN zuZIq$hn#Hl(DjT2^Wa(}m2SOc#hsM9v=r~MpbwP`+gIF{EfG(W#jK+$X}LtXQGk_J zrJS;WrUR{M9%~6ZOL=ShXTqzIw$p%g10Fzmj369g26T0GFm&~1g03Et2_xgkN88N1 ziy(>S-35tMA<}VOnj9?B1d6OCShF!pig|+)BqeykAW;mW)?a;Buq1sMRP^R$P|;hc zh)Jsm^Uf=%h`<_01;{91OMw_tf(2{_Q)H_N$`S90dc2&27)K?YGesvj@%|RQ(Pa!G zYW{WM*P;0n!ckh#^jJrv9pT48+7@B<-#W1HZB+tj;o12^hn|#xO&4|y?=MD$LMs}u zZK{J1?|p#TsjY-2yYvK&=eOdlbem%8!$m#_k@d2)LHK&2L@$kQMY}~L;zd5X$$)?u zJ&_&Y5m44ASWtVQY!DK3oK$_4zFTlGhd#`o5N@cw^lBec;~q8@Q%i5$rW@Bk&MpM~K%?oDrml#bAmO0If(`9v_O7r!YYVdQ^pzwT11<*W4@h%~69#IeILd6Qpid7SA z`zmRy#n3SBv#vVR6(jQpF|TO`i|>DL|@b-I%Aa*7@R?+m|} z_lb}KFo(K>ZLwg<+Pu_~L9#-R&m{8G5PARU?**F!(**%ossw&2D>T4i+EvBjE-L63 zW)k-qh9qXOL85T6j1kB*=4egYrODDf&aLF0X#e$3<=B-rS^BSEO0{1+$_ zX({<9D6D zeyNjQA2RSv^imb|q*?a_^-wpLe|=y*50=kg4Is&PK=MnI@R}4XduftfKKB+`GR+^a z%*`m7f!;0&zI!6!%@F>}8Z5v;dh3afU^WR?l9r~{yHM7Lzqp58L}gGEv&IWGbf;B>HIze(Fm6bxJ}oFCQhYU} zIabui7$_vS&ys8YN*CM|cn-a^CHZ$lezG_yeJ{AZt*%KM0yM)3G{aHeHYj1pD#03D zL7E5MJ(KLeglspwGlnRyCfexM8%U+^CMrkq`vq>$PXP3C+G=W}EC*q7k6UG}VkJV4 z=2z)d65d+Bs~B$JmP&&B>)-$Ql6ce8{55BlWd0HwY&T4-EAITM(A!aHjks;8OtkU! zK|u6;bE>H{FJeHiVlBwEet{ryUx&CB@xc&r*3K7u7M0eSXiJ=%czJ>nH}-C-&` zxd_>JZ5D2BlGne%IEHP|(hu=h9|t-w*Y602ux-Gb-<8&n@SyKMiTTr_tGR(&tL$ok z@|uKHJ#ZXAp6NN65aTi|>I$4#xWNHE)1(K(!41hA4$f_oLSPxkG3%`s_dilvM$ zWJ}>F_iVa4hx%HOZ+Rx8VUVk%ZMkJCe4h$;+_eXu)>`Bpufq!!08jBt8*S6QG`Ax6 zRf9lZ%;$Np{s>^Ac(0mXd9tXZpcYtEJ(vHiXVE4>D>7-R>(|;>k%jsh;rJC>yvD+a z7a!?stLaWg<|(m=_MqJ@ksCPKW0HfdSHQUSye28cdLG8D=QC-BQLat1<&KA`@My`c zl4v^ztEjMw43t!UdA^IRQOPr1`_T>!5T%ATP-H7rx5gsbbB)!S`VNSfh1oFqo5a-6 z`lTsUzXpql`GjBIQ{5JL-5M>DD|Ab9UJ^FR3R$kn;vnEfzH`UTIzb(NFwP}3Tl5uu zZ-&!bOnR{Oh79YqT3KD88=&)|usxC&e$M1bQ%v>niM?R-K-2+a^8Tq6+VjW`ne&L3A_-U}w$WJ&{$VM(N-gum5O=ibmn9 z8z={co3~E4MPIktL<%X>no6zMWAWL8CPpGh zb8@dq4z_cV!h30-l{0+Veg<>ew3jQ?70WI$4e{n5v6$>ZD<_f1xr|YZtSv2eM4aQqF_V}U zxw2*8^Tp^yU2xz86QU)@Eq3g&jbFXd)l{P!b-?2jxYYZ@CM+(+>Ik}UQ04urQ|%1u zYm+9U(brCl+H$W}yLeYS04IQ*@)f+R>4b1>d{+kfa6EW_*c8ur;-fS&nn{A!T?0IG z3f_vrX!hqBlhpvTEaRyLm?dAAPR`1?C)IvlXtprv?30~g&HhcPf}zu?NL%g+bNvfe3Vy>t%#8De zUYiH6$Na}FTsRQ!$11n)feq8jmk^@WoHz>@D)fdwG}nqYr!sG@($u^--=Fp+ggGTY z&iAK&31M6*h_g^M*EGY5fyM1Uq!h(ja7P!)dcl_v`jp~0-yiuBLZ?y^XF=;-NRhQ) zLTFJualTc5XAJ5Lf%%N8zsd_0^@=yn0ykY#k7W}li2^p#(ht|hK&|sCzBu0>_Yy*p zQu*<93SLMIRhGR!;8tqZXyo8KqmOwBAx)`|vye|i4HGIPSxT~kQV+2q16A@s9zYjntv9}PaHFLkoEHQO~`x^b$g++)r3xT+D@ELgxmk=7|iMUgv;{S;#U6r>8jv-kJ(`2AgA(RnLA`C+~hj39+ z9R+X)zktw#a2{a;!a0PU2xk%YBb-49k7!|22;uNEY!cxNLin3rtK{Mb&LEp{LV*?~PpveYcRRR3wT^7aQU{HmWYq^}=;$~^H!$6Hv zp%GzTxll78B(YtPp%e0yv^7E%uYv4MK*8Duv#le2r6_h*VgNoekglTe1gs}O3L!tr zA{?q1)JR8svwy3^)~VutK$HMz2&Dkh2zqezCyqLmfO@QZKgzYizXSE9`Xz8|tXy%= zdtyWs^2F%}k&p83j3Uf2!kkjU=aTjSg6S$lJ77cs{Yt+bh))ry|IQC{8PoSuxfC;S z$^JlCNC&|IuiikoiU9%*p=qIfiAvuDi4yW;!*W0~0}PX-Uj=UC*#%UoE5z++NelJr zR_Nz)JS-kS88Lu*a){gC7j@NfQoNcYcWq$Th&#c<)FaTzKmapPur^a^%q1NM+!Fkx ze#>=45T03owIKW|;#xuYLjs&txy9|cobDFYlW>|Q3V2O@LKME;CyxMZ2mj*|&?PEU>~n!*ygzJ?AL#v378G9oTkF}Bz$SV(JKu~4Z!i4Ra&W9 zZ_GDO)vzC4-q)|(nR z_LhV<$EEAYYHy7Kil9I$k-TV+X0%9=%yEm}$_MOA4Ipdsf#r~h)DpRY1ibxL5sG!F z!dujQ(ej-5H1vBX9uO`wQU_~Q3yABT>29f22DHhvj2bs3a-LN*X+dKS%8dP@y(i zQVCp0Q=RG<2O;{fo3)Vv5XOSBAM7X&ctf!e1`GJdlm$|NP==gJo2&!9K^$RWa2Gx& zeiu@mVu6A;W0>R=HPHVc zEgF4r4m8v;QUvY>lj6}QTag0bs912n0`5eyMTw-s5&_KRMPWdZiU;lY=vKfWlI!JS zB*ws#tXQm!;t@D4fMp_+Wr_}JxEw(5(CBCt$8FJ4veYY`lRL<2IY{bIivVm=1P{;M z@aEjBcgT1-helaF?l%EqlaGe&ROjJJyG3`C8Uz892O10os2~lOU)xwNQEus-kHfGN5cK#WcN>((2IxYmf#2n;Nl?QW`K7bRq@Ts27JQr4d+1BS_ic z0{Bmjng%eX0j(8oqGv=JqK$w@a_VkKh0_bCd$GCee))z|}N~QDoK@ zObtHZuq*(sU_hS0z?y+s69_)2Lk4(JD;fzd)E8~%V5SZk*fi%v+~chSkWdkD$2w=J@HN&zy< z0?nQ|nBH1#=WK1589Qv9wnYFT2>G@WUhyW|4zfcrroD5v89q5QOI?_56B+jmU1HPt zz;6fMLX*~Ey9KUiNqG`=E1qe_?7;tTU|MLhHA6hj)0F@=V3^>W30g+BX6{VeFQ6as zJaa1^+HA>67}fz{$krjn%ZYM^oGH8I>&b{iHkrZ7!%!#__o4*=KB4)l1-eWVeb}Zk z0gir6g@Jn~Au?}^!~hh=(43kSO^@S%gPF6%GSqm&HiZgOG@d9Ec$i0H(R@2)>yYEw zAZt^S)o#qh%aS^=8z5YnZn=~D#GkYE$migH8Hw|@UOZ|ta?IQMv4QYIQ0GaXVg!@G3RQs@NTA*GP^(Nd9AjCs35 zN+W^sct|G;BqG%Z+hkBAN%CM~_etd>I!VeT<0f+hlKIGZCyA0SP49tznH*r|MoP(- zxHIA+=`_WPB!2Zx!btXVChY72u>tXu-G#zME`rV8{*^BgHAhw9iXjY@e` zg+8o?LqL%k1t840lutSNV3B5Q_o5zy(um^L=ESEk0Sp6K1{j5E9v_Os(iF#y89^5! zEk+QhaWsmMP-DgrCZG!A(wI`jp+bz@bK-f(0+NmFl*g5Po;OxTk3?y)aymNd?IbQy zzQYLaGy*SaP2es(L%MtyC1=WwR6(JM)Gh*cNx$4oeDv5tEn5NvnHnHD4#=%!0xY~3 zYI7Jupm{MRP4Yy&aevDF7h6m&!?F93m-$ad0Cy`z|RA3Cd$c&0!qKD2EO3!Uw5v58pCo z^8VmqnYN#RuLj|hJRIgt*3CvKLn|92P1-OM46$K0f=$3X5Z}ex)MDPGU2IHz7Wul_ zZ>ii~)~Y=7p!v|xwyA2eUkFj!K_nn6IseMXnF# zMJ!i>Q;Ei2s8hU?x*hgK>58V1C?^r~lp>{A;d_HTrABE~3e-Mz3_iFuAc!?!IQ$0F zdJ)hcCjpx_sLo)EPz)@JVtr1;wgICV$+N(0F_y1ltrY+n(Ii+HQJiY5g2t*;+F<<- zluSSc$_)7DI7Uh$CDdcnHDD&(N7k=Lb72Cbee0+)ri^p;ML?<~D;UI$U>;P4xI!~Z z3dwJRumxpNxq@;xVb>#~qMb^&(uYbDRwO-fjFLWOOneVa{R)Sm8c?QeD;;* z3K}I=O;a;T$3!(5y)RAW_$g@yL`s^PLp(ygn#Ws$Zv^s*y8w8Wg!WQEks@plyy&=d z;>#$-i|{oR4=5O|m>1-sf1A}3-nH65j-*+&T?NJ*52Hx$PW7DT7ONrg zed-|JeLPQI>j%{5k0TgX8#r$x={JT=M-ycl$IpiIYO{jAJ%Nru+m(5BoR>1Ew(_dD zwR0p>(-O5DEl+EsY)&m+^JwkV*0j5!^n9&A>mbHxFeYg!*z!DpV)M}5UPV}-b@Af6 zNhZ#2S`W#o*P66*S}$d5Kw1mB+MGzkuoe4Gs-iZb_49lKl&=$e#6e>2#zP+(7Jl{7 z6#)Gbt>*#AWSFy#P;CfYWk#C?B-bcq7{}urBG{lI2f?h&YWct~86)BZNQB}^-5--X z(MkY*@r>Xl4AmxDPeR%(iHyZV3Q$+(#OEO- z5qnU==SbG)dHx0Bc5{J?fyXcv=FH>BDTK08smlaTM_PK2pE@;#yAW3DPL)P`Br!As zVWmZn; z@GgXp_~+$VxRaORSYBiAlC$hswndL-2OaUO4Dt-&!hiw*m*k%4+cA4764*R?D*Tt>}?Rve7oksk$zmMIC74K<;Py72x1E2x`I)0Gt z2bR)l{~-Q`*u4?L&ZuE_4c4M-q)~RGe~kInF_tglp;g3FFTfR80ygyG3_D9QW?7Uz zhnmczCUb1Be;$9cPu4_uU--*9SrAbUn zfcyGrWj_w!H~R61rS~==R{0*De@K4}@Li&wte~lrl_F73Qrbi{Npafz@k*EkLYU-F zQc@(O#WSSkFy!iD{xm9br;wqjm`&qYrc&t7z@HmaGm>)@2g`$kc}kW)U&#UzSeBZv zT<_0O9`P68uShwL=8P&-XWWUO9{8 zT@A{9y;-@LH7IZR8VumiR3W#7AC8Y zVLH%6f0){UF{Q$GSnTn}2c`fqQjPOF)vf+$N`^;y;AqDK!#iHxj4O}({fTMlK&L{RLt;cf;aGL>E~0^r+n=ttI$%*$}7bmoXHTY6PJ0M50ycl=S!A*o)2~* zzufWsN|*AXj_MWiv}^gI5Ajkj9fOmMgLf@NeiEMNm;BL(xR(EKxQ`DwbjN$UrDy|T zne+F6!~9Uc>dPFxuXKy9^Ca$Ee+|Fr%lxjd;tM|5_52EF@XK7u+YZ&1as5~E_`cE) z{c=z8a=?YX;o`lp>hLjq(^LES1GZnnr#tr;PcG(H^XXop?YDgLAG`EFzZ~k~T`nXy zF7+P`ZXySE5;?HbtIF{0A5y(#jpS!eKU7{`=j9%MFL_|!zgF0@3vbxxKCtgd&b~tK zo||3$gHpw{?B#)S>edvdxQJ%;RE@HvfT$B?^ke!pex2Ul2(7`mGPs+I}lS zjmBqnb^FfLp8CTq8eXZZ~@XZ2crdj2#rYxo}h2?)P3no zy_5VJbcl;!^K-;c+VS%z;@SCsX9vw8Mhv{Oeqle$A&!0V-jgww4u7JKmjCy0 zryOwkOjW%|cgb*DXAa-g&=<*HCtu2{Mf~cA+dZM~oy~7!KSOMAnqN;I*101B!=>|Y zH@scSee4@fsG-rms#8_9QRKZj;0+qD29m$UgOnQ5SRfd$XDsu=9O|by#GU4))bGv+nL*;$^n>XWq7Ne{`BOc7@ye>f!Fj)5x33GaYwA=;U6~qzZMcEwc zhU_m9`O~2S>fn66Ay|PdVnQxtAy*s%2N1^7pMM7{-mb6t>}x z<$H*-+_0Pie}BekeVkZAbRy@RaQEst^#qYZy23H+o%qKrU-mZiu8_R~{^{>luo&nI zy!#qRP(LJ=Byvk$b?OvMi!otMN`_n0KzF|N4$t?xzZA$Gj4mLDL17c=(L z4f+*JlZcr{pUKjPS^K@@QabV*9_I=Uv}1rH4jk~hj&13QDim=3!);bg9@$mgymRSTK~lgE!9%u(ck{tUt!M%4}(iev%Pd-WE$ zImXtma*0iW2aGdlbMe>*p7QWQ?u3CHO!7j%a`00Hm)pFbp1cMhh}d`WR{+4@ze$Z1k90retXKdVsjoBT1~`NR{~zJ|^hD3ruiB|de~a^lN< zCQ%|ON)dvasQVlDKfDd^q)XY%LWsvitDN#QkhkrcsZZCJn;)f{96{9A-)r}k zn~s;L*#k$fq`%nqcjX~&g#)w)t6s@oat$1sO+CcqP+!M^Z02_AAO33USEXf6UJY}S z<};tesG0FX`j5XReV2}_+HYHF ze8?f~>rcw56;9J^hVX}vzWHzb=({BS;n6FdODSBu{*4(|MYx&GlKxnNDG=${%8DWzk~73 z)2T0_BLDK%BU=K6o71=JXxcX_K4q%OH8Qy$nv>pM>Mds4^H1M-6Kq%rC^17MttVEe zEA*V;3YyNm5H%a;`fuFvoTUmdtbz-y)*Zmd(OG%{=YNxyOX_} zZa4glsNMGlgRO^-c;~|~(vj39AKm8-+o31_dg%J+!Z|V02dm!MVKgw!jYJ8yQhn9{ zXec#+VIKPCFNX@^a_SumKE2mD{|TJdN(_pgt>D&wSra2gr%|ikg+8Q(pGffJfggRd zWp*LqOGEAb`;SYuHy#o)y)sgKKzT=`})5J*v_;l*@^zK3fgf9~Tfx^Y zLSZj;T$-T?WPzo-APqPQqb1n-v#ZDfz(yUW3H8;$Y<7_xY>8_#S{#6iBcQ?qO5VYX zn1h4Jb4UtcD?d?F1N!~`BVRvP6I4-K4pIfD60%onL(PsK&i{&L7usFmOFt|R&-Jw^ zKECT4R-y4vi8VpFvb{0bLeHCUa*weIx;Qwr{^>_e*tP?x28)73uhhP#iQ5KrlB5cA6P|wp~l7TShCnUv~XkYEg%1QU`42{ zX2n|m8(5dibNt`0!8)Tt{@#qMe0RpxZov@)aSNn15Yk}7?|+w)cRmn|kFrdX14WT? zq9LBojhh>|pLf3tg{24glb9>#B=jx>!?0$4!dG0;&5h;?M;2&1&paRcr)N=(G+x82 z*+*UB)mlf{lFhH#M^oCXG`5{f7e_M-eZTE0LYLkv@V;G}P+djl?MpVaZl69!)m+IZ zG;zy~mrwb-mAkk|{p;5y6uEiyBY6*SllCmxq%95RaZj_TDC(PL8pT=ztpP52=_O-2 zgW)PA^NA&!OXCZc?pqoj6=jy+ZIZ%3HDpoPA?l_K)w5nv#+4H`i6;h$Ul*&QssG^widb z`bY9nd5WvnI-{rzwbli%)pDx{N?lVJ?}dm*uL{I`Ta6irc}I-}i1{FHO;2qbacg=^ z+lr)mHG}~VfM|Lg`4n!A(G1jMH4$9qpCDc2;KC+AEvu&8x;DBmjckPV(Y#AJcH0jaZu2RVhbweomPQwvgupy43mL);dPdNuifiu~O8{;Ru$w+@qE zTH%-OuwS+jM9i(o3K?C?owGa2IZ)$|rzYHbO~PM+@UF1%VmE|;6#3c>!HrPSjQ^Co zX2k6!`{Nd=wNo)kUuFAQ@{zFgyO!zFH>1?Z{QIwYE%T~qpXW2`% z*B-!~MnzU*qt%Mpgp0*Q?M z4#jKDqj^e6wtNJ(+`Q#!OW8xn8AFKWusfq*qNdO!XAk6T^IxfOjAGDj-Av`7!MCF} zt%~QlC^dYhPP#q}U6m&-?z7f|XjKGoIcel5ZqY|CG)T=|P;*bg71TiLtRWRo@GN_G zyq(oVuZc+PZiuZrdzPoOe;7NTnWJs`L3Y|c2E&GI1Vz3AZ~RrFFHxb z?a*=f+gC6i68(n6_s8=|9X3a`eYo(dnFN0bfoMm8)Yp|wk>DD|*0?3-%V9kr|R%?`OyFSr|id9a_;4B&AlZU+)Nyt1-RKv<)lz8HB>6Tr7d_f>mHN6jtLMo(00lcx0^rfB%|+|2C*=lGD0M=cU=Ur z$ROIa7au6qO}0b;4jTk>VPf;1R3?G0;ka8>t|zJ4AeI`5HGBA@%t8=95&*HxASyhb zG;SE#uHmI@$P=mH5hoxv}rm4;vGXEhK$56^Q-{WkBxv@Z&0nGsdn5w z0eX``cSa^fpzWUqt<6L;RoMdXGZIfP=jk(e5@@=nFExnV!O15Ka#AF7`Xqsv%D6rK1``|=ZnnlK zL2M(OZNOmjn%KhTXh_S029GncKqCp&+?rDc)n%TP5#7%<3>ow!a|H{lnBzi*4JN&Q zhsh2uTQbXe z#ta^hb^Y|BBsj3dA-v>qgT-ZD)PNxg%NIhnp3oU;w$Nzss0lx}m<9_2Nw3D(L})$$ zQ{z2OWzz&W$FT{cm}8!%CfUy|554zKQ)iT!<)NkT&PUg=xI563%IxycAMDfA5#{3Y z&>!m4)IsIa^3d<(X=;};w>mAA0YeraBb2KlENdO`VgI{MXPcMEACF^F1r4`a{2ir>T>&&mVekpQet= ze!qbwyo4e*j}nyi2hPaZ{?PB{X==Zmdo3jsJw=IIGQD!1KlESvG_^y{_lMr2r>RYH zz#n?go~BmIh5pbrK27z@MgGvzpQifcP5#ikewvyjm-s{P=4q-!F7+Fb<587-sZUdF za@jRmZk^c8N#*{!q(2BG+4_$Nu4*8_wgWk}31J(;4unkzfgotBN7#=rgzyZ)AVNZt ztwuPBa4*7HgjERV5bid)i?Ur(qzt4byH^8S6@Tghb{}}_q#UJ= zReC-F{FF*3`7(#?l2!nX^&VJ|DcvEdz;4})zZ~{A$nSQ@+$Au%v_t&ONx+18WW;VGe7#3U?G6eL%_~V19!|1jGl>bG z(x7!dbxI^`nJ4@*pa!2H{Ly}KKs+U$0l3|`IK<(`p8U*HepzC|lf(S>(?_57%L)@d z?Uz+1e8x|}qDTFNObIqv@bq5JcIKCW7QnY^!PK+eeuhFf}1?H@(+G_H50z# zm)9`i@9KH}zv>4JjqueYKrr>oYnkv5Jv{pBetBIA@LHu*$tPt4&@x|YmpY}>QZJYE zjTim$dYAAGAAtM-{Q_Vvzq|oht$xuB9FS@NQ=PC61Axkn{kx68XmtR>j$>hc^II>y z^6G0pdh^F`9jAQ$bDNw86fo&q-)w{Wo0#xT55XON`#UfH==EGy!nyzzST8+8tlthQ zUcwFfb{PMJx z0jQLU^s}Fy1^eAh_~{fc*PmY$CpiS)<$fYx#=T$u7!!UzDW)UCzbuo^Q2Z}1mmt|a zOt_qfTcD!)?IrdBkuZaES%=&sqsal5ti(RTQP=WVA2=yoIV8l8E{OpB5J*Pzy{r*1mz^5h$9-GLFx(U1Af!ISj4)NPJ0Dq zZxb5=Sm+)Z4}&%#)e)rYhN>!}m4I@Z?Ij_l$QYS046`ShhI9w^S5Xhk8DYW>+dJ4s z*hW4$#T=4bx+qrwGUo&u%Ax0Vf)A~1L?R4B&Gam)XyvTe-p*cuS$i0{Hisgs;Y2@r zb-E&lo<-Jw4VECcVumfClL@gEgw|J&?52u&Vm1JldXx!Zx*eu2s2%AEC9@q_=wKVr zDoD<0<`ezm2>VCKYS*v7&ABTnQ75~Dv>$;F+`Oyk!bzS)=w&OZ&GoXgGAe`pE{Yq5 zT54^YPssEc_7dX9+3V+IglB=Oj4oLS(eE6PcHu{xxJfJ(%S7tms>H`g8AS!fTadtk z`nf_6bKtU6k&Mj~r=(Nz7=Rf|fnzu;9)e1ZLX~h^gD&RR6^FA69;(gAZfXXT%FP`9MX_>;g*J} zQO^NGm4=SfWCQ>bCBIa}dkDHFtkYbM)H%kUfj?xh8uh+Nd>Lx|(io-%fNhg{_!yWi zy_tscreWx`G%w|&W6o2wp=N~Jb40uu?B$YQq_QiQ^2J>|1J|c zH}YpAgwJkilRU+RPt)&!bdKbmg5773eiWF)$jB)`sb5wJTC5klmEJR#dK(*x=tlFW*S!F~!!Pbo9(#qjlGgabbW zd7t@$elaUPigFx-&NGU`J}G)2dIAjRE~+Tr0T4SLRFnIX5S@$CM3z&5oSF~F)KW~24jqJ`3Us~Xu_pShR@z8R z5OM8vPt}nJomz0jpmx)}&_lQFu&S3zvqLwqk7ymRln4C^@R*O_ZU8;tkV4KIfy2(? z9uDt9ly+M#roozCWG@Bb3Aikk;bH(6uk%pmo&`HRlmmZ}uc#Nj#L*AWD35K2J4seM z`vwx6CE!@tI7Ft+04tRS{$aYA1#BuMJ+0knlrxkSOtt{;1~C-(G2`MM<6@Kx93##` zC?2PaB3w)u7iWzN7bPjTx7nw7l4<%ax1Xc3paDOKVHNd38({}=Dg_2dOt)uPHjSD= zAf8SEympqSy-2@p_DfWF9T<{FFi6^P{NNl_&<>8JI>K>Nr;wg1C^4P3&y%iBaF5w- zgd*9=Ayo0+k4rcLRi~hXq;NRgBZLpD2wi+;?4d5B%kCze%x(;qV}NCyv%g7&bHd(C z#1Z>G3dZcuI%udIvv1aJ_iMocEx1<;I85}Iox?ZLzan=ulRJy} zEtK?}{n^vht-IAEg2nW!N5@#6{Nm&3jmi1)$CQBlF||zYWzI5rfGw2CLv+DAI<@DciC=R!ZwE|G3PPEiN3emW(mI0xko3#a6} z7l!4pD5vEM!fE-}xCZ(mkkQ$~8A|UJMr1`90k-C-{3xLr!c=8KUZqaR&4Al%R?o_B zEsV)Y0Bt0Cqc9~qm2>iHbw+M=PRY*#X!F^H8T_Bsq+Nuxi}GsVY2HK9<{?d1R;jX5 z2fWQkfUwDxxD^%s`6@M4c?~FaujUx}}$FCHtf;Tx^S%XgEao}a*a8qc_SJIpT z0ACg<>(zj=9*COTl}*Y4z-2y#zT;Kg`xzpt8Dd5lqDn->4TL zK#aam9a8QC_+~ReHJcYsDX$~$b@dc@5P_dl$|OS+Cflc!P7!hV8KR#NSsc`pC!O!QEhXL69%)&YRpHc342q=xS%00@QQYxa=PAS0J ztXBb_nI%|(7a#nA8F(@J{dNwzDBRrWUldl6AQk=5kc#$7?W?e_-Tce%9I(J5#sO3` z<1a=~6C*%`^499QmSD@+vCHoTl%h{Jtsn*??iY6_*5V^q&GLd6RF%sXatxx%9FgPW zG^QCct@ts&q7?4}!x3NQYBoOOeJ!ijQ(UqSutwE2t)G)%J0No4J}(24mZ`(#jfvt|ChC~ z0F6#AEdl{)#f*%H_o!hvmY9GR4YhU6cYoo3-clREtBiu9)L`p^8U$nlSB#@KZx0@r zEc@$!t#xSmGP0uG-df$dgF{n>p)XA+kScvFTXyh(_Ccn&9gq0QLDDvW#PF*y-eg$V zjbDD}u%Kf_Zf$O;Cs$VA`A!g7;P8kbdG9^y>(I`{>c~|etgiYcMOD|;ZD~JP zO(>QouujSZS$<~Oe@J>J0DsBL!Bu>Fb*Lp+`VhSe%9BX9HZ-<#&*%=pZEk6b0K^r1 zRYb^UAmT>e?psTCmCnZiO9IJ9hnbw(RG0<` z8q)_$wNAW>4vX;mc*~0E&!*O@z+$azfc@u(?s~X3c}sO`urgF1tfW`ggLL<+nj;U_ ziaQz}{LA~F|Mvq9Ei<8pgJb_a;n%g^@U0HJ@r%FDI$Epl29^oEJN1qKvAq}?n}flU zgZp=c>fn`UVUOvHDdaWs!4x5HgmEGX$ABU%NS87AkFH9N_|;ze0C2>%e{#(}U`XI| zeUAIItGS`(U$e&BkSKh(=Zoj1nkS5oP=Mc!K7SX~opZNDx?78%&kcCa;_D5+7&v})>$QM0S9H6w-}ksAN? zM6y_bPu2|!mJ<;W3=x|_G#$g~kD=owGQji%bvI=a9k2_L^k@UYW)AoCKB8G%sJEIN zB3K-SuI5iD(vo9DYB^XzBmn6|l-ybutZvSwXbW8E7NEkm23JzNrG!uw@2x&q8+<=e zfG-jegjaO-ucBCso&3Grod@z_6lj@SP4R%ViHOnSHETZ*qhvR*3)WDq#ZkAm5#S)v z@`(m04=%3--Oz#1!62$=BODnDwtQ*zH{KVvuZ1cVH6U>Ry_JBH(+OX*65vQ(_CFE9 z@O(>w*6DwfA`P#E<-bI+h8J4^tq9-&olUL!)pXf1`N zd~$Kp4~P_To9_J|Qfx})u3&QuI#TpJx|1s#-l=`zU*h210`c$n4bV%Neqo&-*M|9j z{p(|u@R}+9b~L8ymf#yixZXsFuAcuw48WNSOVj`uU!rKB`GupyAd3HoC}tDjI;vN% zP`ue4R)E7FM3b#xg|8FYj9DBre*YVBBostUs{d$>2S{}M#Z0_wPB6jN{zRKR5d5&Y zdQcaQcfYBvJwv5!R?7SD`o@NXD0$wIpC+Y*P^w2#^9|p8m54^i##RgW2Vpq31}P*|BYBB~9I8j9MtpKSSorL<{;HnYDC z_5(?!I(}_<@SORx3wP8e7sSNBwDUVBEexaFGr@s=#A-48oGe~uzF`G~34YdK*mTM&HF+WrW)jJiXw>}!Bre?=(ASAts(1JoMMHNoos$EJ@yjjq5{FQbuB zN2y|FnmM$7Os?~K`7xl@a9sh}0 zm5~58(>TlFwUbQd6ySS|J&iwuM{D-W^br9cD&$JKJa^u949i1peoYaCgnPhM$={>Y zz}EiPi7zhDRD(~!iKXC=K-@s`{v!}~GX~H<0&x?V^&f$_IY9Tj1LCe#3V2uat*`&< zzoVbq+KlDR%k|HEhrp@%&EJ-MA`4xTHn4CYkdC*%Hcbn#NSB1ZZ+q}S>&qWPX;@I$ zsZ(rd{657elr%O15wW@z+isiwTgp3-X^Oew>@R0A6*R>ZY-?z^zZ~-&P4gR<5+B1< z(9E#s;Jp@>3&dhUPv^r6KHF+-uM3`s5!ghdE|lMAd9prVn{c27S!&;T5LSNf@BJIX zvjX1J@@ZA`{$MkGTG{e{NkBs7W*qLM#r*W6Pkg)9wJ)SWd6fqbw%sp(YA?+?BA%h~ zs-Y!BnVzNej!NV9rJFyWTI+3Wpe&NMThX3_&3C@_>`5AhA`sw>J$I*&t;2blzZmKWT=;WO3N&dJ)ZoZ|4^&! zYuSMnW9rv0lv`_nKK(dO7AZB=v=+PNLtp5LVrtL^He#|=6MWKu?35xNTd5HYDcbdo z;JxFnG=d)m#wFmEV>6mIboA9(d9YrOIQDNvuK;sabBZ39`Q_lx$eR(aj;~#}5{5=1 z^!?#c`_4LSE1BX^%=*U8L<|jWK&Sn0&|o(}tF|=M+)w-BcEEkp^_`!Ys>EDOyRnY& zC%^pDx6#GvBy9?bDNuEN%OFwG3<`a#xw*RL{@P~j%I^OH(EzH;rSr|L;Qmt>U z-w-9q;HEl@eba-jU!rKY5zQyaFHjVLl#|s3ds?uW98o$%#IRD$)Gt$9qLDzaCVxwj zc$lS$x#_^yo(H_J0enu9tM}CfwRUegSmcKHJ^0zhIn6m*Pn_9{$qeUk1F`+dVr+O= zQnTaM-N3bI*+`6Q7h^;blhrulp{}7Nr~y6F6nitJ%DqCWa)Mxgh%}TE>!MB|4!)}o zf0q;Im9nNS1*?fIxpFfO(V}faquXg&`$*Bp^?2I;vcxYDa6dDgBOM*UT4TS`;d<8O zRD(yKC~J>xN~l}>J7Ua;5w@j)9t&a<{O^grJcbT$Z^m{X`Q$WlM0{bW0tY<1``+dd zfB?bvHDZgknp!63A@ujJ6Hf$w-w>s35xz)7YHC`KVGwzf_$Q*hFNQ|X!9sZSq)p?$ zOHA+Xpn?NxS>HG$=+BitKpZ*N#Be1(Tz{as;h@%a&^aIZ#FrJr zM-qt~Y~~NmZXm8m5psQy#%{4h%(+l3xDb z{&In^;msxXS2Kw-iyTKm^*9WL$8)NgyC!gd4zCtgBC^Tx?N$>xQq7IB;M>DWoSdSZ zh{sN(sIt)?uEn944#9}>w*KViLrBC&Mk=>c*Zt>DxfkiCU~>?=g4#pB!i~)7CDgvv#H9>93q2~v{an?AtQFrA2 zQ$A-RI-e=M(*4ZMbO@l0PJm2k-4|-v-L|hD)5C}92uL@NFwjXKrKlu|Dy`oa+`m7# zpX>T0MW<3UuQ4r^=nq>O`Jnt5ks^H=&j`v7Drg3(?SB0U@`JvdBcT{@n6-&_mVbQr zuH7Fl+i~l*k{ur^{jvia9>D3)CMUeLwEpLhKlT{K(cr}&sAIhOi(9t;Z7tpoBEClc z1OhM#f3@M&S8D+*$Ri1ksSce(a|@4N;>jX(S`cB4k%7h$A@uwYx8`QqgVR20bzC(w zt5%Joxj#ePS3Wufqil>`>b}~VY0kq1qRG?IB*u9UI}K_~ZE zJOvHbIbj#^WLu3u#&4&?kocxjIk3P&2cIA|{j3AS4q!2o5xg>fmgrG-;yea}e3ZyK z+@6sfT8#ZXeMNym`B`F2(NAKq^hY<=cGiWD(P(I>+gIJZ=!q`ZTl2#^2(pE`f@k7b ziVndb{}nd?b(l6Go9ngm;w#*9m;dzP+LYamWVe;FE%kdf*5e^a+M6TKoCqK25gAfP zdq43XwLqMOn3B3WVr+Te*#AhYO*5U#0D|tNmK(Cav@%@B&`nylHF4$Rmu&tgyxck7rD4yB`J%+}> z&u3L8;lv2zOjc?S4jeF0i)Y8p?G5U*x7Jw@zQ6rP-`I!sszKJL9{sC+eiGwEI2Mkl znG7~aj}c{AgrdD30mAb{NQw~f81EpW|CXZDBGGp?hg$It7eA2se-kY=il%jPFA*s@ zLgLePh*Jq%A9`8+uCjrs6!+d8$boH&byzI(Dn}(nlSZT9f3x?*VQq3@#Jm~!vsY_^4y|{J zIon3Bo_p_q^Lfnr3?@_4=2|EZ{M5;3|Kb<7)an3jfEF|O$Y;$5tLv;?Qa>>pokfIM z>rTw0z~_k3=w>5~k-m!?@p4vdYEEa zwOP_wD3qoq7!OU(G-QRdPTd)y28X*73x!aJulY2W714-7@t}ubi%^>r!x@7+#QAQH z;nV!B*=n)4I0g-aOStu#B+&MrtJy?Qi90s64>) zdhnW()@Vr^Z(J9JZe{Thn!fcA6AbzKt_0T^1LF~sy7J=?=5rNuiD<54#&Z7i21~x?1%$E2nxW#*~u7Ii$$A#kackb33H^%P^ zXjZnlx;b19OLYpVSh|;EAh%)*E=pj02k0l-R4vT~5&M289yW;;zlZYpz~^y#7+v)keT8&tZ5wH9F5lUBx|L za&^^VLGfM0#l#$i6Te3DwinyHuhkM9HWsgfaWPx2o*`p6SkyCGr@e%sB`hhvYcx5x zEZw3w)kc%C{pvDeUP;xQy)oREhTqraep*5cp&6^O^T>sn&v=WP9(~~I23jY;OQ`eV zS+7>-*DgUtu(hp`CdiSN5`#w=r)J`bkk;?>Tt0Ng0i8Q9=0v-=Lbd%?&2#JVK)Mdw zA(*)H=kMY3P`JDsuAVi_4)`)QlCvfFgA&nE&n=NuOBmrz6A?OvgJ)pz+2WN~0=z4N zK+D36SILM;HA~7p|KbU|u#~R-U?WYA0&yz$iU;CGb2l$xGGg9W&@vuJhe>bv)p4$1 z36(l(DN}s)ysy}2tYA!ft&KTeq3SzGE%cFCu%)G;xj6E|481->xoZwAvObAdA!7wb zor!U)*G)-OCElg z+7@v@{3*;8^vBCB`TzHq+ofoGuW}oMgbnXU=KRJuxp=p*_y8IML>yQ0BKf#N`NR$i z*q%c9(EKQ}5)ORO*ihs>DBZ-Fh4RrYo69 zwcOlAq>~HY1L?7Qkh>eTwQd~q~c#YY_LZ^(TLw> z!$(f9)hr5J$s&siZqf&08pq-$@dWu?%~I!|Jjtp>bVToi7IW^^nu0i$AZBgA`E%n) zkKxorXK>Mr4wA7)>^^$cV~!uKF&}e$2uBJV&thQQr|1OY_Le=Zp*ngP`y_5npdHU5 zslIOl;^#m#ec0QL(}Y$1(GaEW!F~ASttOlXYwB273M;&B&!y?Ecfgf8><9GDDZ9H5^Ox;R3($ z$_vGhCcfPHi{wFdwf;&{99}N-hr;*XIW(YJkLa|Bj5^}}%U5FfTs@+--IOTCT7p@SPcY=E8H>>q`3oNR6MSL9Pap2DDZ+Ps4x;jhq z&f?u5&(o@JfAQ_d`_$F?y9_ZMEoVBP=KbeS^{T7=n#e`^an73l`M1CKM31_9xyBlQ ztl*p37&Q)YmS=vnaNVc7)D1WQ8K({Z?7`8UFRwJ-oCs&WnU`Z{ z`-P#;B>w2|FOrX_s{vF&A|ouCw1MP%j&`az>bQ`OI({ngUOMX7^!idSD!uvbq<-9o z-@rLb#FCoUgEWapBbvs2)H^a45oLJ=W*!kSZ*=6^T7w;sl|mVW2H^+JYHxmkzeXO*b}LM8gYnz~rTGDR zy@GSCF@#AFwi_p@Q>8%$Q=1UNl+Rds4YQG(&+ z@awU$cI6BCILq5MdUX6_I zY6cF}LtN~mhFBlO#%sWPP#__p2_+tkV>F6lxgp+av`NQNLr3NkbVM>0>mnTIx@>Fs zJ%I2gI*l(6C)QznS(RCKu%@nUe-Q8AhwAWRCz=$!SQV@b)rastBOlq0|Jmry$0bF` zw(U+vzo`C+g5qzhqcfEiCChdzLXS|h%7gx?g>R;o0%4$?Cw&7+JDt)lA=_;X4!kWP zNxGWt2)C^RxWAy?^Tedbnd8)YJmM+`@bIpz9DdR|y{t?3N_viJ%+~U8zf#H4ErYmS z=W*;biG2g-*^-4IR&J)Gh*U1utny;&VX=uD{OBX2JLi~iSjhJ5d=QX0;YSomwLCf( zBwp3UJ2givS8DEC<)mf5wuUTWUd#=O|9o_(O(d!Au)we>*>VZx5H{{ovcef6D=*aC zzbcVr5nW%Caw~D-$xd00VTHWXD1tux^IED9|9Nrr;- zZ!Mw#M|?*VD2ppdF?RjTyI~}K_SgMiUD3%at}Y2CZM%?d*G=UHX1jSZbQ>)@57xCK zGZK0Q-saRSiK4-le!gZEz6yx!ibYmwq^R+^H8-ve;N%{hn6B}}Q=~O$)L5-SnQaUPB}=__T@Cgm<{fJ!@}&=)gTda)-kuBB0dP zsnMOpipyCFKvOX>26-b2^>*YT8Jz%qECtuZNUXzg1!jp(i$n-np;{%nEfWcn{sy|3 z=!X(yaP8|;pM2;pTUMloK-@NrN!t;ovqe&=Kfht!;c6xpGo&*YloC@=P_A6o#i=!` zTv`^ji6$BF<-Lj5e;UUTkOfg=12tx+QE|yECEKYbjCArY^K_R?R ym{Fu-h}TD| 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 aRehSud|G;7leQ<&p{0TtPiyg4aQz?b!ki5N literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXReg.dcu b/official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXReg.dcu new file mode 100644 index 0000000000000000000000000000000000000000..0b853434ad92a386c79a49afb203a4d73e64e3d5 GIT binary patch literal 11444 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 bodCC*^yP`^b202%`C>X8-{LX-MbiHQgYO57 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXSkins.dcu b/official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXSkins.dcu new file mode 100644 index 0000000000000000000000000000000000000000..cbf6654b4f033abab3335c52f64f81af466a42fd GIT binary patch literal 106136 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 literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXTabs.dcu b/official/2.2.2+2.4/SpTBXLib/Lib/D12/SpTBXTabs.dcu new file mode 100644 index 0000000000000000000000000000000000000000..b7240022a45292528850e39916639e7fda3b4664 GIT binary patch literal 118287 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�|wxhU1nK zrshiuB!(B2mHxw?xj)>j2kBrA3A=nLnGEF;f#1URcImu)jo`C}a9$SI)O9dOBUhAR zz#E%nG)$ z64&JrdFG#Wkxrf&@A_!;2oXedroDRHYG+`PX$W=T|F+oHu3cY=rp6)&lg%sM@g`%P z&Ma&`kzk!RBCRo!)^MGCg4Bie<+Ez9#DCTGp_;j&s`^mn?9c4vUR9Ag@NL(Eapg*u+8S|Hsd!wo1&#O99FNg-Y5Ub>+i1yy$D3X5SC@H%@chU~R^e3a&y|mN!mw-r?K`qV%^} zuiHU%++`{PSLfBEbNK8y!&c3L?2}DT;L)5)dY&}<(9u3TI*%Q_NwR&`=w0WbD#g%f+5?*HSCx6?rYHR*B<*$~t zVfFaa5VW?h(xTUAl~-Ikd*S?sd6mR15xC6ZDdW?yQOBq?QcpYmw$#IrL!@zU1!=`H z%{M*>oS0^iSRxbs;{&l6cTJG=lNYD{$NS8ijwHEzg4CbMR3A7tE>orav427TQHg9^ z#uGr-u>W5c!7NE759EBj z<@BGz+Buqn%#mT=Ei)FT`X&^*OO+Ef@)d3F%1uW;6}3@CN-}bv_wX%GWcw!Qm;%UZ z9!A!gU*2{sA6ZrS*`^`i(v@%jtjIS3mjbjJ*5P1C47nmp{yJ|oa^<)w$n%X2c_)f} z6Nalia*_mBtSpf)_RFsyC`CTCB63oZ_ommj+&bPjA=^=&$n{Cv?cuYKE6Xk|5(9qp z4E6y$U*7i|Q1M5=a9p5|&BJ9qh4m*q`IZo6$14f(G4 z*7_%B_%0k)cJ7oajC-Fo&7P2MONWiH=ZpLCXe{u)^hS20^Q2EX&Omn2GK5f;`y7iQ zReP&R#W2(wZxvnC1$OmlrcAB|yK1iVB@RWCo17-gQX!$#1`jFhn<%|huIA9h6u~Gc zS9I1M|IJpZpJ~mOb;GezU-hC9mUVMRY5MGToC&=aZ}tEo@L_32o!GwMqy@mXKuG}p zIbNSZbg*$E{5DQ}@b1IQ(8rhl`}w=9t23>L&nitThXaT6$Uv?OmZp|-_5sg=J*8>t zC?HEXS(>J{xF+D~qSBz==HlbIrD@71re7~eLNHeY^+ZrhK(^i3UIB$GP zSq6Ti8%z8=?FA9CGD=dbTEkI_lNBgQnbmArJ%>wD7UK7x?<)ybVaufh_Lh$~mZXX$ z37|g@++Lj-%50oC#!*qFdGsnE=V01 z<*AR7@tBhF;l_zNK;X4=DnJG)Ubyqn_pMv=hedoROZ_;&)Qpl&21`@Q@VmtqD9tIC zuZB@IKx(BQT|@nV2%Ga7x1?;yOtY-u$$^QsMJL%VBj=%o|7AVLGE#k}kW`M36d{9AEo^haozt9=%cIvr1B`!OI^6uX_wHd(sf% z(U9=?2iWD2UAHfhUz!>YUyp8^!XI&P^^@y7Z)al$ z5od!7ENiQ68Njv0a8)}wsJ0k7h$k?>qGFN|w}6cQd5e2wnnpm22aLF`HePK?&;j41 zC7@gsGF-OFAcasbO(9gEKEvB>+;QS!ZrBJfSr`6etnVVW*w=;u$H+n3V zH8#Tror6_>kuSrc{j5a=YBQEfc<*2(xi%8eIGHRd!7#HOwi_1iUX%kAZxoQHlEGu? z-k&#Ee};Nw+p|wLrnZ3eHkQHLI5sv=F1BYOpg&`5TDjWJ#Zz7htEEo;k<3YDwZzeN7TqRqYDEOE~5zBHWzp#uw5MMbGDaMz!LVG65Mu3mEeq6gZ~xeKR!FL zj@qSyuC6=gaH)2c2C4EqKLye+rkwPedyoC58U{;Jx!~mRy!kMCmT}H{5N^igSB-;6 zhzOD=$br8q7v#u^661j({r&e!eD%z~^}kTXBc_Uaw^5D~R~1!&9d*2tb-a3*w~j&M zHi9qem?LjCa<^0ak9!^ST3~DtUZ%LBF~PDjE*gt@TRahr$`oXb%~mPA=@gCul{K+6 zySj^;H0lI5(gG!?Xfa|qC-X#|*)jQSeP^Udg?hWslZvCB6#b_ur}Xyr)DgCD0{@KeR_l z;HVxYAOzmGhXR`ZeZ8VMpohetp)9u<+0|JeG_vh=lyTw2M=|uY&NNZ_^nh1-x6(M5 zQwd|g#O10{){`YVz=o%dhf9J8w+S~7kNyM1ixYKbX+nd%+sN*oJ+#s=+9@WyMhaZy z`}6|8RT?Z;3&05w4okjr#|n^+sWCpJC#?E1%FT`#>7!r=Jqy1UOjnk@2E4r}Cp+i% z(K-1!sMn#P>!ticsL>MEYt)uh&pZPi(Cgn+pKt+lv_%-7Y;=L4-M?!7XeR47wz%hy zpmWX$l;nt9;=m)%O`xX^V9FJ0N;`DcKTs<3qe2mu`s|iM*R187sR{!wJ+a(+!f9-V zDRuH7b#1c9jJ2HdAAsS<&l_AW56A zx@$hyymmZt1*N!bOTblCXY&Qf^)AEp>|{!Tsn#{M*#7ue$^Ppe_U@&z?tGSWuPG;~ zMN${g(0DE6+k^F{M{YTK$m$8h$_@HR&v4R*s!YG&r~)Sq=a~;M{bw@0 z8RN?(Y7n*+ud>Af5(Z;7`%2RmMsTw(B4T?KU%Uqqr0)evQ_aGERH>gOOi%%#ca1Ez z*63O}?kVA2W=)Yci1H(f(t+l8iNb-9l1o#`_OS<==438489qNIpLNOjq#HhJi`3Ry zyjU^W`5K6I7uijtQ|*##aJOJrX|{-Y%x{yY?a&^WY~_*}GSzG(;BH`48CZ{@O+ui?%r8sX<`gs&yEsV$79g9{uc3k-jK7|PZ{oBzBD zF#gv;J3TxE6PQ+~bT^R63?JrPR~I=g4x3A8CmLomr=%9cK2bZto{B7deQmz)WEq!i zUgIi3n{P1vxwEu2Y=zaPgv3^mGY-zt;|-u_g?q^S&zt=&=2@kg%I3{)Yh8_w#@bmq z5qR(;@FJp{LJc4QqUu{xHkmRLEeT)5)!f43?qG2#8IJA*!y+Fd#)@M)dR+>~k`9-M zXR$Ko^MR5e>0Db;&HN>q*e}#61iV#}E4&bK{KaJ3t5pP&3uS&70^el>P8`}c578SC z{3jGVfB0a6gYj3Sz$uHRpeb{tJb9`mUG>^q5@-=8Tv&@>iN6K5gz!BjSqg4s-&K-t zOA~1_>Dx-uk^1!3k~}9|MO4e~EJ-()gdrJveWVIW zaZ3V+HCtCJ@dOo(xZ5mjrh)U8#U`;+{l>`{5k`M4utJzLaaM?VN=4pLsM@&!C0$$^I@+V zae+jQdrLP3a8K_+Q!Ld@G0}EobiYV}7?y!h_ljeHbcN-tznVawUUJp8a#eE zD31-NEUvztGBZjT$QYaFNEUKD&veVQ9&#hbIs{NT92BGx>kf%O6vjj+6Vz{}sdE z4luj<+w;kH$&rzFj~y@^1LU~haI}{*Nja)0D|+F3NkzrZic8c(hOr%|ax=DfT$KX` z-nWqVM6b{e-a_c(hIf)7Bb!-mmE1~xmwWlaKi0CYVI!pGYwJ2#v)Z-)J~^@@Lty()|^v1m1JCwA$@3Kzt2Trx~EMcPqi-72s%JnK`T56Gj;pR&xW zQ#S`Z8XSt^Ga;TEbx(@>>ZO|wvU#e#t43vX2jWrFuh8YY+AvL=`~?~Td2sw0Io`qOrmi9?!l^1C zclN=KD^w90$WWmH?cSn_b4Ousq>*ps!$TmiB&8A=PQuJ`X(E>)hfA_-cSg_aLB2GX z?i=8n5hvm!^buvljZ9-^_4HOrww)Vkz>7VWwWfNudW#cGcmam{ebT7pukRjzi?t1P zEVdWk#lFB;aZC~%3ow7kdrM@WRT9KudvU9ekL;lbMQO!YY1(JUWNBu3|0K(}kE?rE zA@(vnVRdhK+7q{vC%ihmBm>evM9!BaN*|C2$heRlzR&RUwutwV7P zCjpj|$nsso(mov_MYO{YzY%TA@WUYW2A?B_kGHCxu)`x{Mq}yWm4S0E>U#(v+gKbc zGT(K9=gAz|CrlZ(1(mWY&s3iUMC~7AF*m>!auq`^*#)%2>}YQznpZqFiW7%TVDs-} z^INa90jEV8#bzurOzoj4MZ#;;3GCe#!_Zq{@eLLZj=vzstCBF3Uk`&}F_A6UZ5Y}sf2l4kSo`FUlG#nC z5KryUBd}1#`3Vglc?`;9+ckQ4Be#IgC~e@Q`^&8DKAQ9K_M9<(h*N3z3&!JNIn>!B z7h~IAS|5Y+t+bbeFouxZ4KLTNOC@9ybAFKG-ig|~c*5Uune*ojTeaA6iAa5r!BQPo z*-oytiCjH8yU(yqCaq9MH{aiqFIO5KX#=+EQnlVSe3NyRyd8s{?Pw%hr9T+5gapZ5CHy{V9UPGt zv3gD^)Dx15ytu}fY;!w~w^K^(F@p~M5cVK@NS;z^o9C{iayr^toMRttc6*L`EcD)PwJb6#tvc@$cooPHdpn@BPl)Vg?ig7j#_^`%Id)KM z2F~(KJaoWMmu0NSn{e6!;Y}PgT$3#t)d6<%3Lmh2i^6V96jq;MM;ole6(w^m@GbB8 zVb7WM35-{xn?EpuBQ6eumQ@!~xfc!w#=QwLhbIiuUB z7fmZdx#yU2lXZ#+KJmMY)mOiwHU7*_X~=aH3fAMXdoaj3FVB&oAH22s zji;?rahP+O9UnwUbkM_`&j{wz5Cih+u4Zn>2)|G6;z(x#bM!PW-lA_`G5oxan&Fou zuy8XuuR&9|7~|?72e*l7aIEb&{Jl0v^GCpt-!G-d54Wn~WZ#CRvx~hB#WBzZ`Gx&I zWY~MVQL~2^;0}v@m&|{*CE()ibOeOMcET_otewHQ7Vp%BxIYjaHy3-vb=U|e`(m6G zRAU$IlRknrn*Hf@I2{#`OJY^pW|nr{7EfvJ5@-yHPsth6t&8(_$oba9UNv4qF|Q{J zv%><;G6i_efOZ(~A_-AHLBc!hD9J25+KFs!ri z+B}TquZwSV2Zw`Kbv$Ezt@K8`cA@b{zKO0E`&j(RD-8wIf7tVjlKMfmV^R*LWX3~N<}b(F+8#VL6kGOUt_Zv~DTMDTqc zodHCS9brg3`mL3Xb6!cw+jMH6D_$wGs@vT7J3uyTQ}X(fuyLZ?cfM7|*;WuI8p6J+ z=HM-O3B>x14_oCaH)Rx_L^FILAh-Xw`K*EsnJM|haH(H3>dApdkuTNv$grvz`N2Cx z&PT27{@XGtUz;_-nw(yx7bM`bwcL+O1R^IcuTL(jn$MFc3@SSgYXSFo7`W{QmkFH4 zfLd}rsLvQ`woQdc1o}sJfxcVQ%QEHSO)RrPJy4yMvSmxk^DeqW#sfWu|P#Aq7J&O!_JUzjev}O!9ft05dA}<^4#H-LvlQ+%8#tq~dTbxCC4jNdtY!0=SwfxqBdj;ZFx;OEjOtwkNNX|%5pfbUqZ?C|BI`D`frW#@fDyrTkK=L`Fmg$C^(I>36yimu2HDOqMoA zT>>N~$Hw?@WWr!F9p4B?T%L^suki+#VaHSnE3jcFF?||XK)|{PDYPNtFD#}EEXV!b zZ-kGq;Sg|&fo3|s?TxrmHVy(#Gq^PM?F_`6=E6)jn4tdZH-g5vKr;*|O@#x9Im5<4 zsB#;lzTShM63{;Il;R`qTs#+bA^uQiBQtW#lSz zfx-rq<$O0gxt(hR#b3B8Xuv`Jigp5nHV_@rVnCU4UJzPG+<7)mF=a6Q2>`@wb0U`qt_Z(VbbX?!+QK; zk!Aac?eNgF6}{eMLk-RBhnf8n0e)u0GY;?u1I{vFPKFuQM>7R{_lVsN_$CdPvv;;{ z|FEhnf_I~ql^dV7Qc~{9sQLtwOfIa_1n=m+)- zV|$ZufJY8;Es~7y6^!pN*c{1NhZzZp z2*_Oq64Woqz$|C&78B~-hKLzggvG=cV*xPnhydJU0NE0tlmv)LF?poP$~20{EZ-<_Sr}S3Sui+!iM8+XUzl14>iQRFB`PJS1pO7+L{obPvQP zsut*ry9I2!f#svkYy@vWL+tZsh-Q0c5EO4`Q=GE|YPUgUvHkT8V6eI1>KwWv&l^C# zzI13_vJBM4*NZNH$)M8I4OP$zpU9yD@QR^f5*PZey&25BcL^!>X~+~2k;0Um>XQyg zaSjwg53)B6Y1mczemuhh7qAcDr0Bubev~)ug)ppeAYEZKcHH$e-|KQg8^&sbK za#=tgWB}I#OY=BxiwudXYqt3bXvw9~8f^giCNzN}bR!+OU$7}Qs7%k&;jDZXQ)=ks zg8UBC$Fg<{F5?aA^aPZvYYx03@Mjr(w#3`oaA3bcoMRA$E`;5F2M!6~6ayS7fysL5 zz;S_{X0WU*E2DbqK&q(hbVFBSIZDeHh#3ZvBRM#F>_D-Alp9E{=e|VBFw6SSo)gmq zETmzRGppo4fjnI>O}lPF$5$I_Zk6d<*>!%)e-{un29Z}K-oz)WBi@M(CgXkg1G7M5 z%F=WL!}Q&iOS{xyX!!{jyusi=ia;$fs9ewGZDP^|W~sr@Ak%EymvOiGts-2mr6~;? z*a&S(#XMp5lYkwK>(11=h`|;l-h>BkO3J&!@U|G7;}WZo0HA!_wPa0K84z!+ahOZr zRL&RUanpn1U2Ra92hH`4>wSLf(W^y=bsIpCJm%x72B}Z371Y(5>RcV}&Jp2 z7?y!LUY`c9+}|R>*`x9aMn#`7NS9NApyDbC%^y`vDB5zjf#yJB=NyarT`kcmqf$mm z^z#PoTBUSL+`*A&kt>!dFKL`~REmAir&b;G1s@cS$~lAl+Q%05#)!A!(_h=BmaQ$BVK2}{Z_5?>i3KBBrGRlUK;G0n)1ceG)2=~Q`3=r zF*Qxo#DsOpzES&Ff+}FT!O?K&!GN#NHXQ`}e~pED#KE#b9!V0W^V_>N^5z zgP{r|r3Jy7A_ZN%#88J<@md8`L{4^kK>G86T53=^a?u5t1_Vk02pd3pmHyHlNDvqg zTEx)u)#iphX94qEIWR2-Qvi&aZsnnPfIbWZw90@A6F`jYSk|%Y0lV73hC5;E^dFhs z1yr{|jYxu0?6w2AS_8{+J=bKw>cBoR-qspSp7+iRLGKFC^#()-*3?nAgE>8M`h0K4Gp(`V=-2q6OEjZj_Bf!CS16ZHY zg2!zJQ3x4qgmx4F94}biVFO*P9Kb1p<6Q@m?4U^L~S5Z_*&y-x$v}dQk=q56S8Rx6;#>hgFSzV8kVHS@O@VmRM#y&6F)`Hn4pGd0gUE58wBo$KvggF6 zBH>dRR1zOTAPySD=*2bmx(I4vt0h_DJ6rA+84j5YgE}3L2;dP7gpXYxcY_=lRIs722j9P>Ycr|?0-u#R17VEKv8mEZbM;#ZAcH5z!ODPfamxHk`-BfoV_=DK?H)s9>d zldHgyOS@jCsP56-j!Z2kQ&D0jS7ED1uXf~HW%A|8T|}3Cd``;OGP=c)gbCUqPoCnURw_H=`R z2wNg9qN}}ZU=E5YYLmef+7pXi(``QMnsbEp>N7xZ;O#bHMQ<{6PvGtD;Ue&6$lk!) zy@Gz5mu>=Y4+{2o7`hC+wKT5m@gXc*BdB+2>J;^IeKdm8?kTOi+raR;wD#6z;ZER+ z)B^7gF+3FV9*vZ%rgMBBq*gss5`0E1n{e1WC3Cx2H*KC^>Gds0B_cPp96yM_2_EP8 z2BxIRFUl6jIUJ`K0*JO5OmJ39WlIgdc7@AG$H4_9(1Ql33_DPcV++!-KVm?cSis^d zgL&;+l&& z($++f`}o3cH%M32adZI%K5sz!tCz^gaT)<;=_P~l^Be>LiDwXAF(B6*2dv`|0t(z` za5-`=basQ|1Om!^(?IbRHJmne>GJ%6=ykyM8<^tAFPhgUAmq6N4Sm-@-BE-~Y&}xF zbw+sh*2!Dg>Y zfFCz-o)Upx@k>|otFSjH_-I? zZP*y1xGcXm0h#SZV(Wy+g$c-fgG?h&yy2I)`UG5&!3BW3u0?3^q6FAz1Hn z@dY&If;JfF;BGH6U1Mj0)4RlE@;beMUS~rg%2ES$y1amW-G+f<*uY#4FK}yY9N0w+ z>#~w$6sZD7F}w?d$@CSAoM?_Xvv(Uw4&3CGm9uPj$dWMg$B^mZYvOGNmVG>Nc5@ zdAi7xotS5}$uo$fi){Ic+18qDiGD6}6eZ@kUgwa`(KO$TKvh%ld4Sh%D z_!?iVGsI0eG-I(ZB@?cxV1YX>WqIDqKENC}R79U~lL0XpBv{z7#@4wa9*pjX)U4UBFo*xTwF)AadNdAsB9X?2=D52-F=KH91fv zh45Qt`Kabynvf)-fkpee{lc}r+n_uV6hOXyqKFl}$3UFX2hg)|rG$ds>jLQL0|5EB z=t02!8sJ=;JX0jrCJ$QV{mY^a92ofNBDHifwzqecDKe#U7X=d4OG2S5`0A{ z<1{McOQ&?ypBFr44C$!9WH6_2)L${cAsqF626Spi{Y`@%!cpIEKtnp}?;6+;j`~42 zD7mA4$bbfS)Q=d<5RUo>1~jyze%#8PJD&>-w z&+#G$b=0RA8M|AGMv&; z?>5kXz)@dqGM&;YQQu@>Lpkbw2KA{O^_xtVf51_{#bo;Q zj{0pT&p+g--(j+ST1WjZoujdmcTLNE!olJa@t^J#w@9mf`+c~FatPj1<;I(>s}5#N z;58KKOD*u-I}CpP2f~$l)GGHM$++aTj0uXm#Mh8oby@I)pzgKyXB^MCX8XxXO%D66 z4}f!OraX0zgSeSIb^p^ct8pgXw{k{k@iq+H-<`u}xQr{*&2M!*w{_UAVK_5n4a+uP z*2QnnOCcC}#ZOu+(uA*qiSReyTNlJ{ahbxtSS(oN8y0$_SFjQPfl(k9>!@$9NLT(i0Bwuhv#Kr=WwAc-eF48eUcN1=U66w0ilfb&El6 zadab%$Bd&0Bk3R3CuqMkTc5m=jQpR1k@KaJntO`;e(JPYh>AzTZMrP;TNG-)pq#CM zofBE+FmIV2W+|@kyG~lfWu~CyfAk=^J~`=sORD{aE8GC)!35b2tajR9L|bUPj}evg z2t*dnpSSREzScV@;s21o?ZL>V5)I@|(hX2*+09bys+_8Q4-$J)EqzZHPZwL(fCEVY zZrGa}x_G+8gCMIk%d9}~1Y$xf_+fth^zgqN z%f5|^$E`M*)E>%|Yndemo~{FeACmFY!%rTHX%m;enY0m9ew-E0x8SF#JGg*6tQcqr z4RV3yxP6P~Z5|98dAQ}edkfUlNl=BB`{pfR&v{^eq!n4_-YuT?co0akMp%wpw|IUz z31*~a-?;^3S0bcml;ys03)t%(7#jk|XU$z(JO)#&0e*BFA*pAy1vi@ewL*)Kf(RqJ z!h<@^lKULu`XDjKP#Ql@R;O!_*jobVFaZ2GL1Qe>y;^cpKN`orD~1-WY-y`s-NERZ zH3|apqajG@Im1eRn-;VZK>2aP&!l+z3&1l{`@i~h4{uwy?V6 zS;|FVM)lA?U%_(|K5O(6M-x8#4OfRhs`af7w224VA7=N-W)7%=YLz5icUqo9wT7Oz zSsJ_Zv#v~N_y5}oS+)&OUFAyAomA!Mqzgo0UrikUR-UEqu>lcQbR}62eXV@Uobtod zl|Xdh2%<*dcTa(3Zyn-UuO2mobJuW7Z5kpG*%ORVA(l^$gMC1~1CN>9VLc?3pzHZ@qCRJNcmDu901!V;;5e~*)CcqcIt&0mPSAJ_5_@w1?S)YMI6)KC zI#llU0rVCC{5V0M*C5U57y$e@K@%;<{vH?wAr3!I%vl=4ohAGn1DziyW)hIV!?5W{&kO10!fGyy+O zUQ=0|Iz~rE>c%u`+0$wa^+?f|y$+qD%62Bew zu%-{bY|%NK@GmA?L3x2(YkXZukG++-{==>W`n|_xaw$|CgVK*VoUocW=uZ8zWs^!aq$$(EbkY z`P6mP&$EP@*$IOoJK%p8QJ)KuFD!8MWio>9PMj8S7@LOp zd%aH|t6Q{qW6j6$k2Zxqi7yRK{je_gAw2#u9{L1PMl3~+Z5W817oR;QUc^U{wtid8 zAOCy*nD|pCcg05FDHqzT?U(zPe<|(%FSNH-J)9fgHTCyXx5ysg^vy( z+T}{@YuGEE1qGSK!viUb_spLDl+NL~>;Daso%~(y`V#2+!7K5f6uSX`?Fi*r@v1_R zkEKiQGYc=5f2agq%yJxP9#}#4f{f%xQjsDamgl)>@tGc`058!@hph0yCm?R_L!lr# zDS%IUf6i}cA^Wp_!*SZ5`Wwh?J;wif)(%+RX^(Nn=^w>P#nK)Vn9QEFqpVo!W6Zb0 zV$0So)=~>0YQ_H#^n_p~6`4iW4hNP;}jD;A3M9@Fh(Aqpv<4> zzI_8#6c0{iRtkxIDxr`M;P=6g@!yV67GzeVcV=PykE+fxrLW-)@od!3BqvcnLyNzt znG7jX|2itj8?`H}73o?8k#R5;nWs@u@kbH5)+5psEOM{N0z<7V*s`LsNQ73FH?*>3 zS+U_D3Mru;Z|w{nU`U)o={)gWeXtmwj(!7NHNex+LA0s(fgP(`wEp+8VDHn1WpliS zt_}rjr~Y2CYu;Hk6R#E6Sv3pXcC3FrCdWk6cQCRotM}=w_>L>SN|Tt#$MASym}2&5 z_zZFpCBY2IKOW`yRDbXIW*(&W4O-Asb&D3n_xAj+i>>Y}dj8iXR_wB#$F@?C*!=j* zN;jEN_58kDRv2m zH+3Xq;Qyg;>Y5z#&^mp?(O*}G)PI$ zZ)Agvj4!@O;aR`_C#7TlUd;xL``eZ?$DCl>gJWDq0 z#<}BCHWrSH@16P~n$d6fUUeMJ8}Dg#bl=_$ugA{IeW-F=N-c;%Nz8o+J)k?7h`e}( zb54gQ?@&#Jx;)8a2hJ`@rzYHogLP0o(V(obLy7W0&wZ!|N8GH9y;RHGhs3YTsTd35 z94IfF2JX(?_#_cWGaW~)i3SM{T{{ek6XfWJt7uO z-EA~y!?xU8ww<2>6ij_ms8K*K6mHB%%}>6s=P|V8SSYp2Im&k>Y)b3*Pu;dDt@q0o z3Z*_#p%!q?IKHXj6SN~tNc_b({&Wp0DB>)Y((~{mRE6&I;uRRG*dey!_u&Miwc*2c zXWFWe14dsucWpL)Z92C<@TCja`ZiriFHBmT#V}j&z%CvqW~n3by^G=}`(oq#e7r&z zbRCSvIqG3@N~b?o(0@jJ$0MBkRU`N3;Q1tMs(S8yI!}#}>z`hOWY()YuW#+<1&{DX z{@?Ci5{3vH%bkX5^=ujU=Q-aTuxtlSNMLs>nSz!Us0{IMfI@8#`_ zeX-!hsWCKTzwf@3jiJ9Q2{(p51o=ZDXj*@8AauBY*g(yJzV3JWo}er&R6&J;i2pW* zK0u}qkSQm3eHPU4ONm&o4WgfGsGY9nSSvb{d1a^ z5>%A#dLvh`KchFaF}2^{yQ&A~PXKZsnt4gB{rAOejlc814>@&OeSH*OGz@&8?`}jh z9^?eI!gqg4{14Cp!6XjLn7jUIq{pkq^q}K%H~g9pr!E3sSF$2j+qqG<&#mxH-EEf! zKipeB-peZaV427ChSvM~N4VRk$H(^B==&7H zd)nusf$y_@93tdyxDN^N7#&J*1*M8DfGZcDDcUL)if^Dqz1w`7LhE}EWNZ?T5+J%~ zMan5VrT;6aPnBx@*o-(C`6Q#>Z5iMT(x>HxF+{I2OL~-hF^Z-Rjve7va_k(A zuN@U%T0$3+Rg^AdU(Fj>t;xA=(c-@DH>mViUeWXMuZ4cuiQ;a&;$MRcoN2+x<1CG_?(<_49Y1LRRaz0N z8Rz1QJId- zdRgfA%RW4(bT_Z?#jD0)aJ?${ae@hbB+@Xv9cjm%MPo$zQCdpR+K*GZ^Lkh90k7j$ z?6ls{USEG<&)Scy7)Fpv^)uDI@Hk4Xc^UQ53y-~LH|&Xrj;e*n8)rAX-1}R?WT=|(QuMJCN3o;zfguD{X7*V#!5;nqgZvyMqAm~>Kt-t1L6 z#V()aG=jP7r{b}%=4fBTF@=$av#;SDt+Ra((vGMZ?us3u8?XTT4p!5ftym#kTfA6* zN9b)|e{e@=GbnGT>ohP_Vz6&ji zb@i7*$6~{K*B-UjoTeA1UkV*vm)%#hnL&dn~x7SPSLBKV6d<56IHe{wZ6@ zwkbg8b*ZS0X-DuaFuo}K{< zoJmzO_o0f5X*(zTy0216J=a|Vqr9Wy;*|axjBPV}+Jm~U;V1^CD3y8d^Y#0tZu?@z z#j)az6&J5SG~u0EQ+t7uaR{YwT;4+xH2Zz5Cwzo_7)9p_p*wZzHVA)T3RPrL{P5J* zl>(u(&$EGqkB@d`hhat;jtFbEg3!~8`M5Nd`gPcJim($CQ7_A^%pfcDCaJLS+ePzX zA>xc_h*mV~q<1z0^e_cJ^|e$rb3%UaoRvE~*&ZJccO~!zyTtB}>tiqBF$c{wBqg zkALWSTe~ppUtgD|+EFSGYOjLPdGLXxyCD1wIiPz!4s@U1`=r>^=q@mw)NM1t;wp;< zruQ)cS}SVIKUG5aaC-DBGL`O0MH%QN0(~FfI}mq(6LX&?B46&@ij`9SUn%2iR#=B~ zANnTSR#slv+T8VrFs1fB$v(l#>McCDy@O-gq>D^+6^a0ru7dES*S;*RV*?!pfR)?u z*4YhMzKW-dV1cu0d!7`%8}lQgua;}IE3hI}!EiVTIt-v1llu#~>zgs)RV*fV{SuD; zZ;FV9j9qRD9p%Imqgw(Ox5MAJ_E!|=$}9RpzY=Rx;W5YxJBs?1b_;qwPRZTy6Y7uj z1lMot&b{9UEtiiQwjtJyLaqK`y}ui{AD)wgAR^=-yg1PFq|m|cbK{}6dbjy&hpl}a zF7sQM!!QB<>g=cRzpSPZME3N-%`7#v7gLJD@1?IZD8BznUCQM6(zoJIv7C75@j11< z{XQt@uVyAIq<>NzD}|?6hQvNKI5z%GDnY#GVJ>*pUdhw7-c+Zr2X$h-g=0IuzY1d2 zq1kKWf9U-$UmS~%ketxsp%Y;a6sV zqgI4%yiQ*wE8%Qz{h&O+{~SUaRnS3>aAmWD4krQXa0Wwl)IcE@60%(hV&v)pKIy~W zhk;D#E>!~)MtsEbR6lo1R={F8v_VXdn5GBf|IP|vX1K2RF<}_jwX5;4VcWW!p9I3IyY3f9~t_j=iyyw3fQcr)Ys4_y${n|TDjk; zkI9w0Vv1p%WY~`m!T-Ooos!U`UL@}3W3 za#Ux{Ka(U z770Fc#&22qfo~Ckz^tFP@&}pog-0#ut#ADwR;`Pf{G;dv-n&zoR@BSD=Pn4&7mgkT zT>{9LX~hKtiYcuc*Z-E5yzxC)jf9mUzd{vT-@E;J${r-h!Q4Sp0EhF|r@w)=`{afY zLcdQVlHM<8&M&?KTlwlx>rbwdcj$|pdH-~<@dsbz6veIVK;I9A8xKS457wK5tv@_= zPD(U##=MngA?yOj8h?`2_~S$)42U0>HvW|3lrBBi_)~0VXmaNeiO&5k(FR*|dft$% z2VWWJdrOQ3I5ND8s~502oo@YUAKb+_)yGK>WEwz|AK;Ebx(&%6d}vqZ{ArzyGmNFY z6OC`e*ZB^i^5($%g7XXH0Nd>(?Xn?@KhuRXju+gxP6J6eMe1WW2S1+8TkNVJC>pCF9M9dHOnj0k%4y# z>!IwlBD>f4*5!fs?>Xa5u%riLcssFQ5nVX;y7LP!1KoOlsh%$SZ(&mB?=^qVniMU+ z^M#@PtHS9%co!2Fp8c1*Gv1vRwYb@K;GPEC_JzGAym4mmA@g+O8#k->FXK@Fk3A%b zp!dG@BxAS)P183b_nJAqV+k$=u3g(Fee*ul`rTc8IF`F=X_||+#WDx0Am{ueKS}h@ z{;c4|v_RkHiM0Nr?Hmr|*T6Qy;H$h}@^!SfaR1hx-EhJA0=*QVtApQ1eCs=3!(S+$ zB>utywP*AUzRNFN_W|DAR|=EJ4G-piE9s7tTWWg^;u|+EqTcy^&9ETxcb=_2pSG{B z49;;(A3gnpXZ5tO-O1eI?t4*`bvd@M&phA`UpSAof!E)Lt4rW(p$*o9clV1|{4br) zy$X7em^oh{gO~hba0v67yF0f9NUuce)BhLhrG2ElW?G0cGRn8|p~kl$sCUy{9gtP+ z*602fJHQ&qdFS$=Li#TN^*7k6m7cqc{1vEyJyb2uL9Gn$z+enyDiDT~mMxM{?lr#+ zFOBoLZ__%Zdmu%?@rE|V0E1VtAKyLw>do8hU&_>aiz{Fhy|sq~wSMbE5wS}4BLm14 zST1`cdvKnQh~X0F-U3o68~7YlQ&FbUMr8yZ*H_hOKwSD|aC~X)U{2Dnn{`_A2r>f2T*BOvfsffj(f0^?sA{)|+6g(tWj{6_g<;e{ucTyU#{G_6vsB_(a7!()oW8`w@4#f)2E+47~gn zxCiX=--F43-A!ovhXLWlIDNP8pV6##0c1JH3J-t|oDyTU!Ee$T7p|7?-y7to;?qBK zK4&9_{yu!P+>J=rBi17%=X0CHq`Y2&HypTk@8)Or4S4$9zWK^Xr5M&>61H=m)zm+ z(M+u(erO+j7y z#UC~TEFrpz`7eWSI{*E7>;1;y8}Bq`yKemRcV5$OoFAAWO(@_J|A&L;tydgK?Q?d} zGw8g5U&pi9FbtD}e4`PB9*kiHErVviGvjTD%kAd(xnuqH#vK70&cN3(*gFqpyPR=) z=|w(mXFQiwwMh0qw(>@k(~)v75oY_?*n0QzBjSmJz8~jvvj7g=zZ&CjJTfdIW$-G^U=nX%R%Q!yy;Fj-_I>Do$Dqc#H{KUY^uc8Ct#sk=v z-oJ9dYyRhh1K&l_y_a6W-&-%^XVFmaLVBU0kLw5xy1=NW?h@Z5I;0;Lr7PXRwdSrH z{{4LyIky{kFy4-}4ZaG0-8IrdnK7;myi9!wH$FDVi97H)tkh{MeQ>dg)4=-dD{ysL z*Q9*9xDLw*AY5Pj)0sUN54HyX6YaV&*EQ~6#BNP5w{Xt0?xYdl`WBzG^SN;>Ct09L z#P^*uoX_39A2@jZ!r%Zo?$SG0W`8E-b($AA;~%F+joRx1Y*@NErW<5BFun;~Ek`z` zf!>RpV`$Ic)qT4=B%dnOm!BJe2dd!l6sg|Ew@)|TwJg|yzPqrT@uQ}e1+m*3Rd|6G z8eZ4a*R!3^eG6$)f%@qfN;tpK@NWV8LD-zM- zMH@L@_jZ-@S8Vbl7$kB2$~WZnUa?pDQBR3qqu-oLOTsSJq*r2U|79E&1;(AY2PXCL zrvVqNzmwv(Pa*?7f=g8ib@xBsc?6w5DKz2XPN&dKO|JbCpE4mn@SSHkW%34}CwhRN z0(^gW4StylV3uH`=1)9dN$?s_de2kI;D=wv@okO2;`x8zb@^Yh4`=S*@Yv<_cW$6% zjBeJRr&M|mWqcWyZJWQm){tU5SNYn~&#w*sEb&d^Vb_cuR% z05JGw;(sP;f>A7cVDS0x@+>E8Js#if&!?3Gf1XQLwWV~fb9TIX>*Yr{7TVx>>GXLm z)t&XouTKzJU97ua8!M^lwIxZsPqCqCcmbA>^TYMfKTuuT zfWif#OLz+ZcM6}{RhsmB@RqQo=Xk~u^JSFMi$A5^(IUv+xakwXeTCctp=VThMuaU9 z`zc%&txp$%T50kB@^i#sX~8-eailN`Yn!w4~;V5Vi}{XGsR zR>yoB+-twfcDKmo^2=m!WH1A1*$qAMP0}YoC)4B4MKm*9`o&u2C7@*~TDvH|8nJla z`o`?wMEB4kKg9ub{=Var2jd?x{`dZ|tqV`QEP-u_K0O_TUf?`2xsGoo^fd@Pyu&Xi{QPBVO*|B>5k zR*PM49TI<%L6;=x)Qe>Az|X|v58B83t@ul6dmUyS*{k@(fIokRa`+;j!vnZLqE87A zem?jml-+yjMf|lCI2;{Zh5sR}QxS`1EVB z>ODx|>BgVL3O_OM9X`ca*eXE}Zw}(gdAjTM9|E~_n?JWKS*y#|pHS|kRb(lP178L2 zS#LwF)|<1}8-K>%(*F!5BhA@rWIZw@kHcMz#6RRZmga>sqVr3yTuEmRG`jrEfll!% z{^xc2p%bIq#mx4{KeYhE?UK_XYkGtJ>wOnGALq}d-+C!OSt{b)SUr-4OnRyWqdwWiN+Z@>z~lehFS z_4FIR-iY+;w{8;}_nE!vI`{ZKwo8064tJYmZqfdR?$!>R`3@h1SPw&>o#=c7(Z@8> zstU;uo5p2pTGpGO24t)`r5~Z~L%0mHv?L54%Vpe9`)BKX;eP_bGexK0=<{aM_iob; zy?*;ZaqQXnU&gvKRXFi3+-%C^ImcKOJuuyppId=m>~mA=&I6fxf5NGXjp^PU+u)yH z%zzJ44Ho*ND6tqpj1?noaSZ5z8SN)I?B~Sii2?2qDtiD_-Kih;Bu!IBi5P?d;nR@s|Vg&aPj***?|}0QkmDcgngaKw$$X%UfOEeye}9Ij%yi30zGc#+ z6w_yY89Xd*z-f){S*~7LCj&oImihjhp2fhiJF>sXvJ>IXPfw7a8m-ey{moD9f-Un6 zis_d#AU@!IN2vpyVD?a7CD4YJ*4m{39bpdik~zci*ZjD*N-M5`?^yf);dFlR+B1Am z+NU!jimNRA00BO5raOUyE|Xv3x|JULz<)<$Vrl>Rt{dgn%e1EpxTUtR<1Q5X>e;33?8Eq5DO zrMKmD+dX;w5QgGs_)G`;xt))QDIa<|jvo1&7eiowZ6IA@=d&5+TZdmer{Zu1SyMw zt>X~sLHfAT`5dXc^r}6rHODue{g;hgy!b*|B&Mgo?P-tyjYsh807N>Ck1?BYgLQx+ z`!o3E8vNLdn=XF%q0w5tJ0Yt%?>JL-NBUTE>s!%X{4MFTRP9j`3`;hK4>JiSG{Ydv4=MgTOairtMO;OQA zO*0e7C5-=QHHNLHhqlo@k6Wy{V&LH^*nixXz4>j@Yn)nS({CB8f)5IM~ z6Ggyf1RcSSkYj4%6q@*vos*Io`)S-P3f*t93l=UMWLOKT_hWv)T(i{i&<3<&*2Mk;` zf&2tGEM)`{V|g*FCe+`Z)qYOf0IOPjy^OAhkSj%1@Y)j-v)CFI?R{Rkn1X7rhlxCmh#Wu=H00NX@*3!ww)9mK;3DWt~` zHzFhjOA@Wiyb8UJs+~Xfd506w-){0zr2lr zWtO*&#swNv7$b@_E$=eYHAw$Mmp77?EmjnYeoSQqVI0BkDK@7-tSO^}6RU|8iX%F7 zPS!~g%$tuYjUH$ZtTmD?o>R0L)FRpLIb}|x;WPwj1{9tKd>RyPN7Y|I;aM~%3NIiA zg*T~V%xV#!Hnjf3ecE~wW&gD)Oahdla5KjL$59w_K_9voLW4Nshp_q})X29XbR+a4 z3?bB^EQZj5(Cp0?6NpC;#u29d73K`6J7ZLG%JxHD%_2VwYR@6eg3?6sf1>o?pV9^9 z94I+w6oQISYlz#JOKi=m6x*`Ezu?4IZ6$#QYx7R;c%T+F&6E}`Z!!V*fpa$a0Paus0> zSb_QGz+{Wwb1*3|CFDCb*dY*k@MFjaWs1E5$*7MMD%ch24&OzpQHNxc?=o~Twg_~x zj!sZ}3rW!joeXlIMz4=U<46vpyFP$tkzVj|3atP{R>TBAQ@#^0Hm}3Pd<^lUh@TMS z>NRs7>o5;)UI6Ll(R?06_&ad*5(MP$s6XaV_5Tn0V+Zpf{jrL8zy4?qVDm(1_PWG) z;DosViY~zPCu)MT%|+xFLE$BYMNpUEzd&dF6LojB^B#4}%q38A31-V8D7f%XI^+K{ zow1H}SjQ1$opc2b1-smgQ)tMTj4IClX z!3A4Vp}C3tCS+?1VUy$wN0eQRzV(kfsP;nRe%L{^2k^{6wGU}JsCFa%sDo+@Wz*^j za|@_$K{adwbsSF3ZREFs_71`}P#;CT4@G?g_K|h+89^0NyzAJgV7PTdz4suH;dcMY zXBbuc5&j`3pBVc5yO_pgxOJi~nZ{j+|1pMJFWSdxdI$-v%-jKWb|CKCpjMYwXo@yL z6m5B;j3CJF&=9nOi9sQM4xrv6(wCnhn+F@$l18U#8gP9S8?i7BnpltE?L zRs{-Un*)#PwsUM+%aunBgH?aR%(tCln@WY)DH*Iw3W)i(=h&+5Vm(rr^-2`GSU=Kn z>C-GBd64()gXi*ks}jYo-SSnb9(}w5n88LRlO=TrOX+6TqF%;!lmL@)M9sHRUncUO zL~Qk&#P5cE+8WZW7O*iXjA|}+(qyNK%}(1%AnMsgw38!x0gZhhfsl_`h?IN?BH4iL zpJ0L5xr@+aC=0SAM(<3IUT(&1VRoi~&1n_vY`HmV^RY8%u6fvu9Axvdhi#}qwyYMi zv&H6w?JP@~C2T>y#)@PI>(gB3wCy%vxh!H9AOu*OT**#`QS31nZ9&$ponVVng}G|` ztSOtPOuJcc=9mm_6~l~}6=+(<=Cy~JZp(!y%wY9lvkASW%nGy3^dNrN>@tIhPnf+J z!Kz-x7Ue>7h?mpI#b$C}I%WFUxomlY*noUB=(OCNHJLeYR_RSZxyV+u zFtRRo5v+2}Y_Xp}#p`TU3!5?fCG=2Yj@qj+QZDb^!qf-MzkpFo5W*bZYkp>zy+-Z7 z0Uj;~D?G*4^@kCHoMnhDMlljGW!RjzU*o-|9A&Ju6dBIXU*!f z$XByXV6$O=oNa+?XpT)-fL^IGjZq29w}s6dhsm}z(=2s-gQjZMf!-~S0Q$LzKF*pg zpzWCB6kC>0AW!`ln4M@d<~U>aaN0g>t>}4>y~^xI)g6sUTFJI`A1lR@?&z1;W|ql5 z6E?>jWmfG%Gv)B0lk=!qV9p>tDHo%5nN`zc&O5T%nQS(xnWC;cL{T@`e=LxvE#9H1 z{!iK2GIQCXuuHk@WROj10e0D8t~t)I6zE~s1FXXtFh!>|_>G{cJFoNJZ#Yn5nr`P= z;+_osL2H9e;MnJOewB-(8#<)Rc>z*z9V>3>r%`(zIE7fd3gJ_{4e6WDUffGQvX?x! zmwXCqdl}&(!Wn=w`X`So9k-MEH&_Zfjn?@Q=GMbzi_-)K1;C(yt;(j^;jCm^StWcD zpEJ!a=P9-(gB|56wl3#c`t=NwrX{gKv)7r6Rmn3G&MLMcSFlYvkkP_p&S%gtkBLqk zW}PMM2h}VG>(wR~vOmjaTXHtrhSPe?c?Au@NpgkNuuv|-N>ra>rTRIxo%Pj&rMYZT z4Olf!B3Xd;*=$F~gmRH|F&z^k9(Mj7#{MoFbC$vJSdkvhA^y-{R|0^1hDG%svxM_W z%svmZuVNykTU0IrkCW_2C9DRj{tZI*493T9av$^}pp}5;$n;S1*Y4juxXoN=D473DVao2y zmb|*H`Z?}gv($Zt!)n}lYzce+tuV7IX~L8-Q3{yN?q7ofDq(ecp~VHyvQ%0bPuqTn zH9!z`sftZ#C1#KNx>cnDS62p$+XAc+y0=kxn0@YxtVyqz30|GYi|g~S%|3&^t67Vl z4eFKgZFf!n5^F`Cq^8e(iMf??h>5{mtPR=&8V6EfPPxNun4Mu0KH9n}*sQP0oOkoR z-7a~=d3TVtf<~#V06SZ0F1rIPUn()z5U*#MVwcAhV;%>*+K-s;`994ss!e z-4lBNwuA+bMZINEZw=I2@H}NMdpzvj089G9>^*E6$Wiirhq>vgfG-=;;B~MVc7UW0 zLQ@XiSjc)|hP)9(6ku-`%J~ZB1alEleHDA7fZ2W2p8?(tqlYkil<^kJE z!$hCe{}Nz!AN5~ghSIQAz>3naXd1QwSX~;{l!k2s*6J%UJFt9RS%%r|D?mSCvzM2L z%{Y&P=5V^c+wCxuzJO(Zn&w2hyQy?>sk_*mO~V#^C(%_ggb`+p*+UciXi4pJSqtD^6k~pTfb$?$2Y>FvC{$&tsFnh7F$V{{Uh-;FKXg z37!u_7m%SBV4YC&J<jV&9(54`#Af>tfWd zfQ)!7fxcux&sx!=+(3Db(8RD8ttw~Ii22fp<)L-hsu4Cj{0=tmHO!d*dV2T@#15cV z!sB%ucaoq|4MeXGa2?w(i5eL%F+Rs~Xs0mJE)M5*M!-z?O;#u60pwz`yU-l*KM#WE zvUOh`Lb0W6{Itk8iNaDz4~e@QB3lW^aGd7ggV|+Srk}&X${&V$x@^w*bGd~Ijq*bn zE?9Tab>4lQEAO4GfH>!erGj%^E!O?)Nps1cF;!=wkf4`VQBI0}Cky8)DE)4)!`#3O zwg77iK*0qJ)*uDV9si{?ik5=ua#ospfL4SkR4voE*qkV;51Kgv6C@@wTWVx?WA-pT z;4@3n@sG}P-E- z4F`havJplMrRFl3gq&$-FS-xS+j3H@M3Pv6qOn3IDUufaX|Pa(!mVZ=C7b24Z2o^e zD`R;qEctNA@i7ghdF&*+s$E2>Lvlb>8&Vip2DHc6N#hC(_aJjHhjxZ}SXjxE&PaJU za#kUi?op{%D$!3N@25(6Sb2g*Fs@Qd#UWip{X9Uz45wK06zX~Ke~<@!@curkF5xFIR%w?rz}ehWEM(zIuR zN1664^jd*Z$bb+uXF0IKLnW$VXv$|;0o*u+$a%CU&@-UsHTVmjFe=zNtkXsFIgC)n z&H@%>m$4C5pneJHrAa}_hki`S)M$PsQVFoKW@;*c(@aoetzrS_e-SHiQmL0NNqHUz zyTWpz%fr%H)T37D2XmzK!@%b(aM3VgK*>Y?tWsupz_cbfEe|tz653yZ#7I~*4^}T5 z)USlbuP_~aT%skPAxz3j+!KERI3nU zcvv;oRso*$*CRclJc_^9wMW=fpmZh9=G9=V%hD+p*7DdDtSD#*T)71B@lLUFgJvix zPXdQ}=?tx-RBkF5(ZpE9DJD2cyNiW@S0N}p16pOX%J)xzfR_BzTHt?BwvzKzA?8+y zwJlaWf6ek}P9)pengR-BYJ^dv@^4rmPdP8;fv@cM42ua#V2NTNa~VurfMwJqh!Lc-^i1yq5Mqt2`F+XI~-DqL9<7}Lkd(%8A_f4pJ@;yMR@_7 zhIPiK7R0R10q!#M;Awy&L9fKxv_d4H#mFhh)22gPjz=LL^D}QTl{(4j7$42!bZotS%$QD)3pBz`23V0@&se_oAJN`3Aw+mEftM=KCvF zKywaiS0T5I0VP->1;Dc$98WT0D8(dO;FQPNwRA~6<+aCw8$++8ysKC}_>3WS610*4 zdl+Lfo-zB>zd9WTNVlHo3SVB3VQ14odoK_)OF zjSNkTx>w=IEyq^+G}bp8@M@R|)mUk$X`I+KR*yEI|#XZ5}UP0DM2s9 zKVi7S0tz-9sY7I zBo6v%2*e0|g8nFo-h(>L~)m67JRK#A&KfLYZWNq?Im7(yxy(0%QOpb3*%lV-cG z)7L@$Ol3{cb9$dJo7F0h%JZ^asZ*Ae94%j))jFwQE^A4d)e>;k`8`dZB~QpV?dzg~ z`7GT&?GAaGJh#T)Kt_@1xs1ma0g8*JF2KnY8&~{V=c$J3A5#_X=PFy4on_uVhUgiW!*HYF3;u-N>3!XVe94NmB%4Cu<{XGixiWPpK``1fP}dkecOoxlbOF zC*^f{Q%+E`&8%s4R$bJVH4MMQ8?{OuQkT>t4ND`^sFak3h)7#m4N^o-p^~(d)g!IQ zrCLbubIdztowBRcg|~?gNt9ZYVYNsP8KGcKaKR83nQg%ssnX$q=+MK6BH>&3Q0wd5tx5M2>m6AtPxD6NuHJc%BV7-Oe#A{ zr`oPk*C?^ADAaY0)Fd@a`SO~aqpT=P>aseoC1JA&HBy(O##QTTcXjY4wNjCs#3@Cf zM5psB)J>gK3Yek@l<0Hf4YMK;!G@j99PdV{PfE$MQloSz3(A(dtxjl7Ca`Ui8l@f7 zHza}Tv=OWs(0o_YFeL#Axr<;efHnf=kOV@~q(NJyh_hY2gjAbU<6NZ4w@Cy{V%HQ} z(T3*LCbi2Qa+e&FQ1VDZn>6nQ z>I&GaQ;GqGf1#jL(w%mKbpx6JEFcM8(yC)a611JHZmH9jvL&6H5>2>UN@Bu~gEM-h z9BR{pR!Ou8GND^a5hMoK7U&fA2|d!NW7DzZbi1OiHdn$mncf+Y?FXlcxQ@P1B7_aitMF zw5GKg&5j+H9&9gaS6>8@38~cq-J?heDK0fTl170d#HF#)&C+)DODG?bQjQ5KA3}{7 z$_ou4A=Nqa%R-fMbec+rQ8t5;VnrB|a&o7Sbg4v)VGv`|HtCEI@*}7QNnMkN!*k^LLjPS%9f<&nMl-uWY|N9xLkE0ac*PneKK9OEEw$eD82cv?N(o^j8* z^folll;rkCyyHixVzon9(12wi#10Vixp~mNs-A49` zBy3Baj&}9e0N4TGDid~4{w%U0GzdON7Ug#Jv&hQGUXuh_UJJCVzXO0S_i+8A%N^j2 z>yki;cJ&J=vZL;!Ot7Qr3&^^WeT)fiWPbx$KeCTA!H?{1WJAb4!Gw^!rU;&$tbBPz znb+3MS$mfw>WKy?3zEi@nvgFSc|_lgKWRM01X6gPU;^nld>j~&$D!MWT6x^r5}M9Q z92q~7Iua_3se-waRV(Lb*XB;=Ci6y1#|`Ea8lYRE{#JkFP|cyXL+yuF53LX+>i_bs>3_(&GGvKIS!OG%T4lve;l43fwXoD!CK^IxhF7AinUn|`RfAE>pNL3 zGAXKl>}jKNQl61F#I8@_Q;h-30Iv;&U=JKQ{GO~`db zzX^F<&IkQ+C1G6N@_$lrP*JB+r#5L@T9>WcR!Y@U@`SvK(ee~wLT)^?eki8m^+497 z+(V_4a!Ou7Ck2v_lDquBL*~k)98>f|4M+Np#ME+7V@fVM)K8VCV651&j)hE^l(%p? z+{v1jR}Rfk*|a<*FQBZL2~+YIL1w`MF+fUO!i?PM?(=MWb$=o-7f1qyDy-+MyyV}= znFeQ;!EQs9l)K22(O;8LQR7CrB+SW^N5+i`O_-M_-Lgma^>V>mkwM_;B0U%I3H{Y+YhG<#V2fFLF|W{vX>r6<<%856f_p}6r>Ez zA#BR?N=kqkh*GOGD_u%V=~GgMVF+9Dj8YrSDac1tQxmr3 zX=N*aJ3nPO3}HuJR#qW=9oR*{0HWenN|mV6nQlL%jH3^iLlBi&B@&E;^l+kJ2>o~r zL53w#7n~?aA?q^)U0GBbf=dO<$Oc@39j0t!urD+cnhNa{h)3GN&5|G8PvqkJI7M(P z-Ff|aT~0tlieKpnr;M;9_+ea4Qq3Gpr3NTw!wOTTlu|cf`AUvr2f@HSWMa)zy&@%F z*+4z)tz`Eu5v&wM@B<4lNRcw5tP(7OY1IIR?`cbwIc0-jQIM(wuwqGwDD%oT!D=x1 ze!xm3A&M!>G;S@-t}(#MB%ua#b`z`)L|y<4t6htU=Mby`_WKrK6_P-PJkA;5wgx47 zq!vd9O4U%UMuk8r+94a1K9yv=N%05QN>a2hQnD?Wf4Jyy>0v#mG^Zn{KPP2W`-Enq zLNFHY4flr=;kNwl{1~Qv!Y8ySV~(6)QP3Wm46TQnP_UdoMr3VMT9qx3^`s%RD$UtV zV4b#7kxJT?Hf1!JGEQkio8mvbo?8^v3ErW!E7O3V(S&wo`|#ugwb5Sn9467JYzBI% zMknmgQS^zuvjgl2j_Jf4dbK%iM{6-+=9al=A9wVs4`aSvikq5rftl9ODYn;6Wt&@N zT}qGE9bB&HRUb#^-AZq8jij#|OxJ^&*m%2?UiB>ch$-{bM@;Ef^z4-JuqJdXGY^Ob zs|7f|p>0g*J<_W_f>f^}7B&-odx`NuUu?ZG1wWO;%iM*%>NQZhPsuNg6!uWPKBZT2 z7p7=S?o}Fjy*{N5^{%5uztUFNN45GPM0Kczof-|)CsCGA+`)OmH=)E89r#{iLL6mJ zp=?NL4=z*LkdjbZP=@_Gp>XjW!UE2K%@&n>wMgw%N7ZpPL6aL+hLlOr^a`vsC6&FI z+d|M0Wmxe8iVc2P=^)6cGNLpA@`z6uQ4+z$;7Yz+&|ENFFkP@#kbfkH*f)s-N+|^F znj(xU3;CmEeFPm-l1gV@%D9fhsuIslmBk4lNFd1qI7E=A{9AGZ!P*Ap!U^%cTRsh4v ziA;-jg5`toGWx^GiB=#&up%{IO`#r6PWfQW7J`+6M>he3bwJGe1rqgAHKIke8m-o7 zDqcC-8tskFMd3FA8B0|^HHxUEY7-iTVd|+bkYKAFoQMFd{m*iA^iRw{ioa)u6QPp2EW#lp;s^T9!L|LucSJcc_7?O2ryl9yuv`!`H z6dZ9vt=h~csjxwH7fn%NgIcGGC@f$?o%(w;R)ZSXl0_pW&1{n)+o&eA@uFnO8r5!8 z8`LCf!&qogzeWQ#s@oW_Hw(!oRV?12T1_fJr^sw*#DK$8*sS&+?I)z0vBK?`TnQ7J z)F_iB6t<{!#da!eQJYmi=u^goW)ybIpiqk%(ff^dKD`#T8~tKSu@X2^wW>|<*TRle zJB#LN@D7|A+fk`f5!%)6s+#I1xWb@?)%BuHD(_S~)G3r#K|!liv~hH*P2khss-Xwv z>c;Ak>hbF7>M7%dCUmL8M`KkD)lt?Y0g)cHOP?{OjFU|00dhGKsb6$~V-!U=J@q1j z;_p-Yxp!q)oiUh87*!jOcO36JK7G8Qvazxir#5a$sxhrsBWqUF-Fmap0#D71A(=u_ zZ93k0y!-gf@utcdLotOhbxvz8nTkwDMxrxho{y_rC81+8hJjO}nm9goeCc>^st*Fsvm)}hULQF&2aP*>3{?3D#IsVx$036(`mB-aoY0gF~nRBlBld?;B~m(;ED z8M0cI;3k?P*a|#G{>ThjE#x|~6KoaAaST1cYC*zsv8}2b>ZWSf+**;=thE4zPAx>0 z*VI*Y7L{SntfF!e!PbH8GGH)g*3@w=O0W&!zYQ47nRUSG2)2n%-9QMux1pxACW38Y zm?&T{XEp(ACD^vQr8WXqDG6I}L3I#p2i~Yoz^ZUI1#E?;E^0e!6k}9N!j3wrtrHBN zJ!vg~osa}_PHquQ*JP~=u#-5bYEzm>{np12u?~NiV_t zAi)S=XQ2iGixVt_RY?I>4>hRGXu|}{!8*+Yb`EL~uvvoTYdKmCi2X3sAiS*$1S^8$ zwH2`QP=kQ25UdnLP62iSY7j(03X>qB zjS!>;Dzg_57y?mkoFKJOp>u#-VM2{IO^`aRR?DfHp}oFVYvX>h2Cc?yH9PGw`-XSa zw-I!QTEL3f`WrMd^IA&cB@r-sb46=KTZQGQYvKo}e6!8o;%suyyPLhk-Yr77MQhTw zF$ow2OJEa((aj>@pD=`8t<~r}-d5RHy+C4|(Bj$%Xa~nbTuX3$kGsY)jt!e#gE;QVDf+N&NWw@txzz%8my+ADl66Xu_B_ujklW zG4N-h_Ot~(-`36zmHLjb^f z9$4Qtgn4aKZ?r{Z4ZAWiG@ZBn{fZ)hdths< z6UXm>4;R7lzpV({S~5Bo?N`e&O;L|f8&TiUQfTu#4q-XSx z0_6AMO4FNgj|NwoK4bg=Txp2@&?kiS>5_#Ky|k@#v@BINTeeiTQ8q_+GDZ3vE-{6O z9%Vf;rW@7c#vCr!geV{}g4E~Z5?bP1OiU5kZ>tBp`4{H31SKNV7f$2pmk!fUFUuMIQ$QZlxAL+6mICPXH2t znF1u>LvKStEfuuulPG{0*bYboK|1s)Kw$E90Mba1PJJ2>7XU zGNtQ)oQI;9uan`1w`1M77@Y6 zyoBf)+~bI@GhqeMqi}R1dJO(;M2|CJ9nlkzU_?(sY!N*LS2m(gFku_f({NlP`XrpEu_Rc(bm-32sYuC^GL=c61L=c4{L=c5iL=c4t zB8Wm15k#Q|5k#RD5k#R5(GyU=h#(4$h#(40h#(5hh#(3rh#(5Bh#(4WHrh_nCSx7 zthv{{qyCw|RzXdqHDX;B$iv7=2)i9uW-NHga}|S4M1I8i~n>O|}6(YTFFhDUq@* z+1xg~KcK|2ZOyiB(@lS-B!p3gNtA5ca%^}WF>hP2EuzXa?`z3cNkXt}+jjV!oz6bz zuye(^<{WlSyQ-*Q#kOG+P2H@^8Oa&S9e*I2*Oa#VCoHVD*8GMo4LY+qOx$*)!T>+pK3?tBy zfyVE|2hrVTj~N4EZB$STP`5d3j+mqP4tf=CTDQHOdaOmlZx7jX>>Y$b9dOz*Hx=?# zHJUwky28^#k)kbr)7ND7n+xFNeGd*gvN z>1jCZTJZ()sE>{=ZPKOt@>lN5U%fAX?Y{gI_vN3uFaO#5@}Ivif8)OVtpoXP=?Z4j z4l*UpK6~6gX&>`V`10XWU(pp_(r2Ib=w7?G$Xn{|@g;m?z7?HrhTE~)efFu{vMyi0 zuUk5g5?Y6(+0T31u#cm^BJ`&55~6v(ebY|wdX_yozH#&>?Upp4Y{O2^dzL&=->Oam zNqrGs6TZpNY-lOeP|+s+23pWc52cru7Bt7`@DVH-(C^J2LkuQ z`uMAeE^tbV^cd(tEHZ9iuy>&E--I;xnBCH4#4*lZuygh?5RKDdZ?X^ZK1R$5`|xgR zgr`Q$lzp4C(zrQok9nGWZD6G-o%F<{In85mGmmG?Ssu@ub39%!=XtzjF7SB8T-3?# zUo~g!$=%eL{>e0KVi(pTeGw8&_4-4J&}e8ZR97)tv7^vcBQf`)z1CCb*$%)9tl|T4 zz(n;ddZ7|Kew8)`W+`VH+kZTj|5;kaldNl`!i6i0| zp+pf9ZTO7>(8jTmMKz<28bI(<2w63bByTZJf1B|l>n?z8jyah~*@pZ(h}#`0>PJXA zCW%CSj!{R_G3J;eV)XN5ulhAmH|faSh1n1H9?p&}k%gC%b_%+uu z+Ju}9&Jnzl>BM7{gvagWSLQo-{L$fxV^f-St-E&IactE~e6(dkIpVCr+mIDXMv-iA zE=n}pTD(L03b?D*nZ%vKMCo?v8lQEibDiQA>~|ZKXhmW(lh~p}o3qQgok{Fu5+WXS z2`~L}&}d?BnnQ90nKjyMH4>y{ z=a8!*6vd^{qVk`yOjLEqHNs)F;rZ}FIC{95qtHSfi!Qs%?`ox_>~bU7&dWMz^dh{b z>!gxWJk6?cb@P%QDrv+kyBH;!@nnl$8)AEM^}157C6GXO+udF6-oQ{`U3w9V(BbN% zs=|<~pE`?S6-Qigno2L8dl7C4%Jd;QjLe4gJ!qB@S5t0#ZfEZL1A5+8-cH^yAAE#5 znBYt>N`0pAT5LfhL8E6?WVo$7;Ln@N8{@UdsrDiY)?E`+dkHVgxUI7a97FCd&!lID zKbaz{Z<05eB22bicDElDrm4}kE99Ob=#EQv)6~|b?_g50dyY3);C~mXW|OuRuHC}XQ{kh{UmzobZ<$IfPh`@J!@zvFdx_mYz8)@B1R^r zI|JxA)OTp?(8i%Hd`^Ik!@b6bU#H=d?g{q>jW~|PlzZB}rqjWRQoY{h&=wU5))3po zI`i(m2PQivjFfpie+_x^Jv$!Jj{X+hqDQt8+i)`E5zvoJKervP zjFy3Y7sPcGBqdwWPrwy)VZGYefE-7>Av@IQsyiRMaWj96HszVc-iw`?3fAz3!|iG0 z1&es&K`rv_z>&U)A2{vP!w{jo!d zL*2o(U@OP7jd~vTPI%iXF@i)#CecZWQ9!yfiEf(0DBhM$czXzzL;~J+&~^&r@==4E z5r0KZ1s=X))uz2$kzPJbA61|7&U^bQF^xn#lSoiv29TjlVmOl+p~NhTk~FYD@;^qP zCGVnd+)CJe6U3A&Ub`>HN9*3@>w(Ql7HNtkV8uIuHJkCx`4)YXc8Jfa7q8Fp=se|{ zqE6Sm&AvY0G_AuLmbcp%_svkXb+7F6QzhRli3nXgjKMCY&K7;kzBy{J2{wuNn$pH< zEsALzJzx(M!PpuL&B4GWqj-$NC;VbS4&;X{Lkw6$>a7-wKE8LRd`13Je;t@>#y@%} z5^N7mX0LNgj=HrhZ%Q5PXe@0-?+x7#J8u?)FNZ9%XVK>mMM5p588yvL=M7E9#ayvwMh3alW99kg99cbR?U$qM! zVcQqtpf-Oe2lo5dh=MyD+{Op$!%*B4wd0EfdIEOvqZpbDPltEH{{OeBuK{f(yV8{O zq;lzBC8_FJwn~<4$+m1uPi4!Gc4!T)M?1tJ4o^)STElvI9-@Gk2<#9yQ5ZE(VHDO& z6k5Z$X*W^x+>FCIj6)noVHGg6mN>-2IJAaQSTF0LJ**cLMlc@GvJT_Re&<$Rrv>-t zoO|xM=brmpx9%wgd(nu>hO zRW+an-$UEbtZ=6TN4%--sUz+IYjh!k;{_Ra81;ztWyDDl+!&N4J#s1!IQL^Y;^Ny3 zLU-^Cp5UP7Lc84X{zAP;Ru&1-lLw!o`n+HCtZ~#TF7y}@K&?Tke}{I-BmD0O*OfKSChx-dDJm6Z51Kwu)(PBJs>(jVLuG^H zrCmoIhyiR{u!&GMdB!4fZevaDDA=r^BDA`eAJ(yy7US1*y}9)S8G_)xvZCLmYXz2L z{i&5iCDG7!IExaoxWbZrr<6%&*UF9312_QUhF_b!QH(>cqOs|jr^@r}l5c%jqc*^; z$%l1{I1$++W-=lx4+mV|^24QxeUd-$a2d#rhYhNm`fwGG0(o45OWzNcV&_=-Q5l!r@0--fi+;k%^8jRgFY2tcaKyDuY7 zj>n3G7Q7z59kz@bW1Xo%!kJW)6-~zFEi8{XFbPoXdbp3Msz+5sBW~#T2KV=fBu1=m zh7)d@gYec@4nzX6&rD_-CEO0He?Y%{#%%`{-DsHG;S)X$_5w>f-AZ8fGxH#w8)V$* zB!l54%oqe3A`W1sZSsec~%HC1~vkld^TOx!RZbN~ww`iVvDLSf(kx7$uAJg>R%N2wl za+F6aL48bH!b>q6tDv);1Xl3MTVEWgLPYb~kq-?)rY`uHu}pWdD6C+}WbvxJnrvv$ z3sUg{-AotV2Z1%-ba`q5btFEL7|}-735X!FII=XtC))&~J0sPR#b7zu4ffP*C?D#Z ze+dRlBL&VN!25n~q%@R9)p8?Ra6M=Vt>Og@B+iXk=Wpk~L%n5f#5w=xFC%Z0C~G6% zehC*jt8MBTg^_LC^4y{5CN6wdM|$Refimfl*ZGHs-CU#^*^gRMzacGGQ6eF_v3RnT z>^!n?mR#8A_WMlMVv@?Ze)J=Dm@%(e`LgJyCZ;)v z^DbE$Ee*W`JyMMpgPGuVuo|od8^KmEqG~35o|uxXV~Mf+7+&+z%hu*-<})-UH9uXO zhbAB+agE@^T{wCN*Dvv~Z~hyw=#Lsh&9RH<1#g)SXhh-n~LL6m6rgE16*ruNl4 z;u8QG3R3xgEf8D`HACm2{qSNW87w{6)Y7P0A#Or7deHwOD54DB zJ@B)5Xn%qCgC)@9)l>Cewc?(Re(SuHX z5=vnIya>%vh5Oh^Tf^HP49I3E9!`L2IlM#Jn>;(w=Ev6ge!E0nzZGhY-J@hn*c#4| zI@%$cv9rXwjqY$2GLEew%Lc@*;T_^K(VRiW*P#{4e~uoxgYyfj)~b%6OnKgBIUR8u zqBD;C*yh+8Npc>#15>@)>tl5=&6B+6p?jeB=shKWBSQ`_u z*9prw5NSu66BiR!oYrEF;|F%S&U>hqH7tio3Co~95BEu7=sOayD)79|$l+r6Fnq+% z1@~Y8TA%1oRCo*Qa=*^~J*ssLgq`rd9z8e8lOJpUo4-?ef#5(Njx)bwMr*1e9IZNwxqQgt# zb|1MK&rRefXbVq^E_%2#(&Uo1X!=@=tWO+F z9ZuEa2k{=pZyMve6gft*myy%x{-eR8Sn3v6?#^g?brz}Mj>rXSiD>ckCC?NRFDIN4a;a>RfT8{?a>uDa(4Bd%8)D&u7S zWR++?JqSn~)Votpij-v+h?9vH%z086S9=pZE}?~2xiOL9%NP2}5KX~dgk1zGl^2gGb8T18p4=%Iws zu?hm(VedzeNIy9MM0gl&M~_KAISw{}I0fn~dO{p>$h{YB;L`?v)N3=E;~J?%F`Chr zu|7mEV7&BSG1~T#i7w36V4Cw7ZF>k7C2pR6gx3Boa<>706JZCIO!EGwp8dGB$P-m2CjYR-^*CS zDJh>k&@MRtF8S**&9q0R51X;&>FT^}rhIxlz~4VoT;=V)8RPTnHY{*DlN-~`*~;8@ zB9=UWLBJJfcun$^W7SwKR*$XWgCuxK9s4fz|9Y&)Df-k-jo4A_MAG{4lahUY1^A<=< zen8gO+9XV9@tj|rEKgzwfeSv98$7)*xr+OfpxA`v2c7C|PZoGWc@nilp>fK$KiQZ( znAA98kq{@aH)>7te)`hz$T_tFYomjy%PD6(!zr^wc@Ddz&g2S5tdiVUc%`_;!90Pt zuvy~IY?i4K26JKNV&-7BJuA&=bEUZrPFEm0%an5pMo(x_CyF_oI+`l-#BHj3U@9_2 z7Ed421Ak=dcchls)W7J#hkpquKK0>WA<(8uJXe`mW?>)o!H=P?)v2ZQUw;kBxv45w z<AWcn=GCla(PqQfQ36y!hLjiOep|=4X56|Ai8Y(`TGfk8e0D z(*bT{P@V2@Y?n&k!(4a8!E5RS$J5Q}*7S$(B6D;4_tY%S=?}LMw5EHUs!y5DaNYQ? zUj_DptW8ltx_unb654>%+>zFo z(0hM69!~(&=T$_T@$5`~W_zYOqu0=49fk@i4?e_#Ce-5H`o85h9+;`m^peMqPB`yOY9*E9)mfvQftkq6I_H_4*`P2n zlbtExk~kt6L^mm_%`75nG*Qo6npvBs5^A^33&& zadvZdclL7jZuWR?n-`Ox*`aV1jZo%@?U@RN1!|L*kzFcv6U*iHOq~-|XZ9#8quCl< z_yYp#Xu~58o^Zd#{ZmT1z@7E>%Ls4$?##=syggf=J(@kAy`DYi87`=_8(eW8%yc>8 zk`Tt(z-(+5UvGlmni%OaAOXZsv+ONHk^eaFFj zN-rX7c~&1|e-y$v7l3`~>RfKl;-_9`^&{sl%8)oH!*0NEhyt6lDn~>py^ZqY986I9 z6@=-}E^@>YrQbm|UhS9Mi*wbv#$0QzGj~6i<#fxGQAQ17bE_PYql_A4(JQ+&NA{^? zy=sJ6YBsT%*ngDggzJ=Z1p?>iN<-99b92SH0#Di`9tD7Zm`Oe@wTE)mL?%&4Y;(dL z;!&Qfpb)+W?9Ck~?r<<2NFFCIlbw`vVKZIkloevR2T^u8Sfh+5b4^IbyW06&Cvlm) zN#3S9T64ZPzqC+U*yEJ@l<^$$A8_!Hz#F`~z-?2=JeZRc$2{SLINqU_)?z`VHItP-d0a+CQHeBau=;pX`@ zFXx8JIZlvmVmnb4-bWX0C;B|;mSpN;GQUaOQ8f(4;P@Vgm{!q$*Dl9kV^3OG(OUJn0vIy!<|POt%aO@npT`9dN67o^3_RED#trXV9US4-7VI>bWnYQUb;OOIeDDGhe1i}RiN z*g}CE?+YEde}qDh(xAvCQbqkrAvikhqiv??|JAf;*%TCl*@2)Y2j zy;fMj@js+7YBkQPPX3y<&w&OpDQUafvDVTKNG}zwu94BxvG#r1uC%lxPIyfInRY_- z7pVRL0d8k8WN9JL~Q?UnR~f-ykSTOj{ZnkWdpnl32lP+eG<7}Jq-EFDK8j8LfKq;u(7x}M%o zH_|F!Se*#zsnMB^b3^kOXkq6?jj&1uAk3wUT%c`|qkxl|z4Q*rwwXRimr0`SPkC0T z;2jh|#^lu6r=)ST3E_TBW|a*f(g;t}-zVOe>0QpdM*d~GPQh*Zud-gN{QzHg+%ie_ zXg_@_f_D&1Nb|D-)5@)ZKQt}`0omm{e9ry2mXD)?*sk?;9sza z-DuiMZ9U1_(?ZOi7PIz0V=*{{fd33|=>c1{R|Q+nzAp$l`^^wQcpLULQP{8#M3CRx zSi%1M3!befCHuUvX`dIj?en&hebvOa?X3rF)2+ru}E^*!~Z!Wq;uT`qb_c+CaDM z@3FT1X9$0R@E^rfd%}dshKY6T?-&eQhOXUZyR^H+E3mz^|3`KO*R_8G;g)c1e{Pue zm~QO2nr0VGeY|08VwJ z4EV(zHbcVk4#}uFg80T?SkxR}W6O@OA^uZ@AG3_(V|3Ga9DZ@tkz_gU zUK8_XWf6J~NPs337jbl>iJ0`^&$6M^y z@sVU2-ZBj!nbrBGXm$RKNzRT%l$%d_FzBWm6a&hN7h z974d~2fS)#J$Qx-T;vye@Q@~3Ky+haedqIVYRh!%oD&AlIq}x{3cGdwC*jul|JVRd zbv>p26Tvs0BQ8IS;i7ch_4FxJrn&q=!sQneuHUeX>nXMAvdbZ4T@FLmm1a5D3xnZb z4QrsvgKFL7w{5tdI@Vm@VjHf%V0qU^Y~A&1R?zuxg8!!LHCA-JZrFCcBZB{q%PW>$ z^FrD67Aw2n6?R$kXX{(q3RXkrIcY|3!x5`{z88|=vShT+)tQ$n5K>(fotqvc8?{swEoArwzs z=wjS$38${t!l-T=WNk=y?n2*BnJ!#Oq3cSTyQs&d>osC_mst8jA zJ@dzG-TfHwn+V@z8+yqFBo`parkjtpqT42HyIr;&_q*bb`?qWxuIP?omV{?3xwojQ zWw%4DxG|>PudoVS)%^-?oCkn~02-o0vP9e0JiJ3EN84&V-40K4R^xq)lAfpba#HHk?cw5EaH9GU_i z7gIeIlL#$DJYFH@@rrTJ+qRhJZIGQ_eT2%YtGt!#xniXpXYMQYy$9K3bU zvy>qvYC;;)j_=2GVB7Zd5jNeXx2T7u;)>14bKn6 zL(kue4bR`QBhT+}H~wGQp6CC<{oZ!yahec;ckIEZ(T+WP7C|2j6V(c*fa<=TBLe&|$-+M-Z=oz5@Ev^O#-h z)Hk5+0p0UVvK!AAS)b4b16~&4TE4+F@C4bd=M{FRqw&hfV8l7IQ3|qq#+d>|f59W)|&P3a?A3R?Kb!&Av4 zwxvIDoJn7>ok?5lOnS@KmcGMU(vR4w^mD*JXXm;w7gAL0N>Ou1iV9unF}u{!SCH`< zGG0kD>{@z--RS5Z(0!nL(i^M~cPqU{y=Nc|i+9qna4$V4(CGDwR{SA?#p|_Mz4OfI zeS=xxoL*34m*f=$$@^cJ?0rVm0k2C?y)H4}{RLCuBHpKjjsYD9I_CWxOArd*B=?dF zvPJK>VM#}2fXaBIEbE;%EPJsN+JfCdT3Gd_Z7bd_whEV{VhjeH;v4cfnqBjbvpn3o zj>e%q3?>Yw4WJ5eo8D*GpTR2Wv9RrZEEc{0jcvp2=(3g|RN3pYmAr4VGF-*`f^=T> zdW2oCN8I&(nbo~t7Hi%QY&Gw{v8uOh0s`Ki_gNTCzYnc6pq+j1KeC4RpV=X?^%#zz zkz@RU#Ie`Uj=VGMgwQEN(;F2}y-{<^8x>Byk6D}amol7r74h7w2p2k4$LkQf_(z}) zG~9)|)X`T!Uju#R{UW=DyV21-p!-1gylK{lyY;>ZLumu=6Y?4PnvuKg2~JCRh!gsQFOw zm~UWWOTK4BlJR|2$ojr2W_(5y%aXV1LygcjIB;C^xme!!oF=|?pI<2W{NjesZ(H}h z&kArGa7EuU($=;Q-=^@HOxwQCvmLk+<-%4MvQ&I#Q`KiSmwiuJ1+EHL({t64YY(~V zzR$5exP3z7(Zc5t4tx%=0n`E9AxVT5@d?6_FU5{^@C4uqz^3mx_05*gE1degV%z7n zwS2F$Q@A$VneQoOJ_q%=?=idZy=v&_#dJ~3C5q|#-ei|>S32c2D6f4OUZCvhlzmX$ zg1Qf3Zs7(xRh|2bxbbNYGdk{`p%{|b}+uNne6r3$JD zs8vu!;9@#u9F%eYW0nA=rc*A0Y6;Yfpjv{<=#*JdX2EkAlq)*rDyVXxUIkSSZjC50 z#QfxfY~4R;*dR&_FQ9P9YAX0Kyx@xdE#8daxr2|L?tpq5ym$Ps7)m-FPaBSO)G<)U$b5pT zH1*6aWIP3fQ)F!U-(YQ>@(h$`pgafVh5tDxB%X|*oOQXZ#fyQCo616 z#t2J2DWi;v{5N7n4wzU~#&-m(a>2yPa`^$`P)KM{yl3E7mwjo7KApqwB>PjDu0cg$=LdD zna<^u*pXA_j{JmmNy3!jQdYz(h;>aFQ!smQ2tC;$-pFsU9$a63PR({J+r&FLX&A^) zYHS)vnVeNR^_LZLsDFVQ*nv1;aBv8k;t(}ZF9MxV-a+^dTT-?tIfLXZk~7LA z%fc-ylZF*y1}i0noR{SkuVGEWz5sJ`UU?!Gl)n@{vBzO z2|&UG3OutE6zmN)l!_UIM`pIEyr3;jQ3;D>6pZ#a*akL huc|zw8ttM+HAOJh6hGTl##vnnLp1y+3Vg%H{|BLq86yAy literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4/SpTBXLib/MPL-LICENSE.txt b/official/2.2.2+2.4/SpTBXLib/MPL-LICENSE.txt new file mode 100644 index 0000000..04d4a55 --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Packages/BuildPackages_D12.groupproj b/official/2.2.2+2.4/SpTBXLib/Packages/BuildPackages_D12.groupproj new file mode 100644 index 0000000..42f6ce1 --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Packages/SpTBXLibDsgn_d10.bdsproj b/official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLibDsgn_d10.bdsproj new file mode 100644 index 0000000..3549e3d --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Packages/SpTBXLibDsgn_d10.dpk b/official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLibDsgn_d10.dpk new file mode 100644 index 0000000..7d622d0 --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Packages/SpTBXLibDsgn_d10.res b/official/2.2.2+2.4/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/SpTBXLib/Packages/SpTBXLibDsgn_d11.bdsproj b/official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLibDsgn_d11.bdsproj new file mode 100644 index 0000000..a1e48d5 --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Packages/SpTBXLibDsgn_d11.dpk b/official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLibDsgn_d11.dpk new file mode 100644 index 0000000..51307da --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Packages/SpTBXLibDsgn_d11.res b/official/2.2.2+2.4/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/SpTBXLib/Packages/SpTBXLibDsgn_d12.dpk b/official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLibDsgn_d12.dpk new file mode 100644 index 0000000..1669b52 --- /dev/null +++ b/official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLibDsgn_d12.dpk @@ -0,0 +1,40 @@ +package SpTBXLibDsgn_d12; + +{$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 + tb2k_d12, + tb2kdsgn_d12, + SpTBXLib_d12, + dclstd, + vcl; + +contains + SpTBXReg in '..\Source\SpTBXReg.pas'; + +end. diff --git a/official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLibDsgn_d12.dproj b/official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLibDsgn_d12.dproj new file mode 100644 index 0000000..5935154 --- /dev/null +++ b/official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLibDsgn_d12.dproj @@ -0,0 +1,120 @@ + + + {0CD140C3-3ADC-4BF2-8A9C-6B5FAA587036} + SpTBXLibDsgn_d12.dpk + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + ..\Lib\D12 + ..\Lib\D12;$(DCC_UnitSearchPath) + ..\Lib\D12 + ..\Lib\D12 + true + 4F800000 + 1 + ..\Lib\D12\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/SpTBXLib/Packages/SpTBXLibDsgn_d12.res b/official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLibDsgn_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/SpTBXLib/Packages/SpTBXLibDsgn_d7.dpk b/official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLibDsgn_d7.dpk new file mode 100644 index 0000000..e3a57af --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Packages/SpTBXLibDsgn_d7.res b/official/2.2.2+2.4/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/SpTBXLib/Packages/SpTBXLibDsgn_d9.dpk b/official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLibDsgn_d9.dpk new file mode 100644 index 0000000..282eb87 --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Packages/SpTBXLibDsgn_d9.res b/official/2.2.2+2.4/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/SpTBXLib/Packages/SpTBXLib_d10.bdsproj b/official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLib_d10.bdsproj new file mode 100644 index 0000000..1f6ec4f --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Packages/SpTBXLib_d10.dpk b/official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLib_d10.dpk new file mode 100644 index 0000000..2033886 --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Packages/SpTBXLib_d10.res b/official/2.2.2+2.4/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/SpTBXLib/Packages/SpTBXLib_d11.bdsproj b/official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLib_d11.bdsproj new file mode 100644 index 0000000..a04ffdd --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Packages/SpTBXLib_d11.dpk b/official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLib_d11.dpk new file mode 100644 index 0000000..88083c9 --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Packages/SpTBXLib_d11.res b/official/2.2.2+2.4/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/SpTBXLib/Packages/SpTBXLib_d12.dpk b/official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLib_d12.dpk new file mode 100644 index 0000000..f7a1e78 --- /dev/null +++ b/official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLib_d12.dpk @@ -0,0 +1,50 @@ +package SpTBXLib_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 $4FC00000} +{$DESCRIPTION 'Toolbar2000 -- SpTBXLib'} +{$RUNONLY} +{$IMPLICITBUILD ON} + +requires + vcl, + tb2k_d12, + rtl, + vclx; + +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/SpTBXLib/Packages/SpTBXLib_d12.dproj b/official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLib_d12.dproj new file mode 100644 index 0000000..710ef78 --- /dev/null +++ b/official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLib_d12.dproj @@ -0,0 +1,130 @@ + + + {1EB74E79-E290-4976-B63E-8E6B50611D5F} + SpTBXLib_d12.dpk + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + false + ..\Lib\D12 + ..\Lib\D12 + ..\Lib\D12 + true + $(BDSCOMMONDIR)\DCP + ..\Lib\D12\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 + + + 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/SpTBXLib/Packages/SpTBXLib_d12.res b/official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLib_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/SpTBXLib/Packages/SpTBXLib_d7.dpk b/official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLib_d7.dpk new file mode 100644 index 0000000..5189670 --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Packages/SpTBXLib_d7.res b/official/2.2.2+2.4/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/SpTBXLib/Packages/SpTBXLib_d9.dpk b/official/2.2.2+2.4/SpTBXLib/Packages/SpTBXLib_d9.dpk new file mode 100644 index 0000000..8b8047f --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Packages/SpTBXLib_d9.res b/official/2.2.2+2.4/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/SpTBXLib/Packages/__history/SpTBXLibDsgn_d12.dpk.~1~ b/official/2.2.2+2.4/SpTBXLib/Packages/__history/SpTBXLibDsgn_d12.dpk.~1~ new file mode 100644 index 0000000..1669b52 --- /dev/null +++ b/official/2.2.2+2.4/SpTBXLib/Packages/__history/SpTBXLibDsgn_d12.dpk.~1~ @@ -0,0 +1,40 @@ +package SpTBXLibDsgn_d12; + +{$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 + tb2k_d12, + tb2kdsgn_d12, + SpTBXLib_d12, + dclstd, + vcl; + +contains + SpTBXReg in '..\Source\SpTBXReg.pas'; + +end. diff --git a/official/2.2.2+2.4/SpTBXLib/Packages/__history/SpTBXLibDsgn_d12.dpk.~2~ b/official/2.2.2+2.4/SpTBXLib/Packages/__history/SpTBXLibDsgn_d12.dpk.~2~ new file mode 100644 index 0000000..1669b52 --- /dev/null +++ b/official/2.2.2+2.4/SpTBXLib/Packages/__history/SpTBXLibDsgn_d12.dpk.~2~ @@ -0,0 +1,40 @@ +package SpTBXLibDsgn_d12; + +{$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 + tb2k_d12, + tb2kdsgn_d12, + SpTBXLib_d12, + dclstd, + vcl; + +contains + SpTBXReg in '..\Source\SpTBXReg.pas'; + +end. diff --git a/official/2.2.2+2.4/SpTBXLib/Packages/__history/SpTBXLib_d12.dpk.~1~ b/official/2.2.2+2.4/SpTBXLib/Packages/__history/SpTBXLib_d12.dpk.~1~ new file mode 100644 index 0000000..f7a1e78 --- /dev/null +++ b/official/2.2.2+2.4/SpTBXLib/Packages/__history/SpTBXLib_d12.dpk.~1~ @@ -0,0 +1,50 @@ +package SpTBXLib_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 $4FC00000} +{$DESCRIPTION 'Toolbar2000 -- SpTBXLib'} +{$RUNONLY} +{$IMPLICITBUILD ON} + +requires + vcl, + tb2k_d12, + rtl, + vclx; + +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/SpTBXLib/Packages/__history/SpTBXLib_d12.dpk.~2~ b/official/2.2.2+2.4/SpTBXLib/Packages/__history/SpTBXLib_d12.dpk.~2~ new file mode 100644 index 0000000..f7a1e78 --- /dev/null +++ b/official/2.2.2+2.4/SpTBXLib/Packages/__history/SpTBXLib_d12.dpk.~2~ @@ -0,0 +1,50 @@ +package SpTBXLib_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 $4FC00000} +{$DESCRIPTION 'Toolbar2000 -- SpTBXLib'} +{$RUNONLY} +{$IMPLICITBUILD ON} + +requires + vcl, + tb2k_d12, + rtl, + vclx; + +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/SpTBXLib/Readme.txt b/official/2.2.2+2.4/SpTBXLib/Readme.txt new file mode 100644 index 0000000..1a8fe1d --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Registration.txt b/official/2.2.2+2.4/SpTBXLib/Registration.txt new file mode 100644 index 0000000..0627a0e --- /dev/null +++ b/official/2.2.2+2.4/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/SpTBXLib/Source/SpTBXColorPickerForm.dfm b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXColorPickerForm.dfm new file mode 100644 index 0000000..7c7cb7a --- /dev/null +++ b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXColorPickerForm.dfm @@ -0,0 +1,2882 @@ +object SpTBXColorPickerForm: TSpTBXColorPickerForm + Left = 156 + Top = 89 + ClientHeight = 196 + ClientWidth = 225 + Color = clBtnFace + Constraints.MinHeight = 211 + Constraints.MinWidth = 217 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Shell Dlg 2' + Font.Style = [] + OldCreateOrder = False + Position = poDesigned + OnCreate = FormCreate + OnDestroy = FormDestroy + OnResize = FormResize + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object SpTBXTabControl1: TSpTBXTabControl + Left = 0 + Top = 26 + Width = 225 + Height = 170 + Align = alClient + ActiveTabIndex = 0 + OnActiveTabChange = SpTBXTabControl1ActiveTabChange + HiddenItems = <> + 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 = 225 + Height = 147 + Caption = 'Eye Dropper' + ImageIndex = -1 + DesignSize = ( + 225 + 147) + TabItem = 'SpTBXTabItem3' + object imgColorPicker: TImage + Left = 2 + Top = 0 + Width = 219 + Height = 143 + Align = alClient + Visible = False + ExplicitLeft = 0 + ExplicitWidth = 202 + ExplicitHeight = 121 + end + object btnColorPicker: TSpTBXSpeedButton + Left = 54 + Top = 60 + Width = 113 + Height = 22 + Caption = 'Click && Drag' + Anchors = [] + DragMode = dmAutomatic + OnEndDrag = btnColorPickerEndDrag + OnStartDrag = btnColorPickerStartDrag + end + end + object SpTBXTabSheet2: TSpTBXTabSheet + Left = 0 + Top = 23 + Width = 225 + Height = 147 + Caption = 'Swatches' + ImageIndex = -1 + DesignSize = ( + 225 + 147) + TabItem = 'SpTBXTabItem2' + object SpTBXColorListBox1: TSpTBXColorListBox + Left = 5 + Top = 5 + Width = 212 + Height = 132 + Style = [clbsSystemColors, clbsIncludeNone, clbsPrettyNames, clbsNoneAsTransparent] + Anchors = [akLeft, akTop, akRight, akBottom] + ItemHeight = 16 + TabOrder = 0 + OnClick = SpTBXColorListBox1Click + Selected = clActiveBorder + end + end + object SpTBXTabSheet1: TSpTBXTabSheet + Left = 0 + Top = 23 + Width = 225 + Height = 147 + 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 + 33FF6633FF6633FF6633FF6633FF660101010101010101010101010101010101 + 0101010101010101010101010101010100000000000000000000000000000000 + 0000000000000000000000000000010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101000000000000000000000000000000000000000000000000 + 0000000000000101010101010101010101010101010101010101010101010101 + 0101010100330000330000330000330000330000330000330000330000330001 + 0101006600006600006600006600006600006600006600006600006600010101 + 00990000990000990000990000990000990000990000990000990001010100CC + 0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0001010100FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00010101000033000033 + 0000330000330000330000330000330000330000330101010033330033330033 + 3300333300333300333300333300333300333301010100663300663300663300 + 6633006633006633006633006633006633010101009933009933009933009933 + 00993300993300993300993300993301010100CC3300CC3300CC3300CC3300CC + 3300CC3300CC3300CC3300CC3301010100FF3300FF3300FF3300FF3300FF3300 + FF3300FF3300FF3300FF33010101000066000066000066000066000066000066 + 0000660000660000660101010033660033660033660033660033660033660033 + 6600336600336601010100666600666600666600666600666600666600666600 + 6666006666010101009966009966009966009966009966009966009966009966 + 00996601010100CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC + 6601010100FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6601 + 0101010101010101010101010101010101010101010101010101010101010101 + 0000000000000000000000000000000000000000000000000000000000000101 + 0101010101010101010101010101010101010101010101010101010100330000 + 3300003300003300003300003300003300003300003300010101006600006600 + 0066000066000066000066000066000066000066000101010099000099000099 + 0000990000990000990000990000990000990001010100CC0000CC0000CC0000 + CC0000CC0000CC0000CC0000CC0000CC0001010100FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF000101010000330000330000330000330000 + 3300003300003300003300003301010100333300333300333300333300333300 + 3333003333003333003333010101006633006633006633006633006633006633 + 0066330066330066330101010099330099330099330099330099330099330099 + 3300993300993301010100CC3300CC3300CC3300CC3300CC3300CC3300CC3300 + CC3300CC3301010100FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF33 + 00FF330101010000660000660000660000660000660000660000660000660000 + 6601010100336600336600336600336600336600336600336600336600336601 + 0101006666006666006666006666006666006666006666006666006666010101 + 00996600996600996600996600996600996600996600996600996601010100CC + 6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6601010100FF6600 + FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF66010101010101010101 + 0101010101010101010101010101010101010101010101010000000000000000 + 0000000000000000000000000000000000000000000001010101010101010101 + 0101010101010101010101010101010101010101003300003300003300003300 + 0033000033000033000033000033000101010066000066000066000066000066 + 0000660000660000660000660001010100990000990000990000990000990000 + 990000990000990000990001010100CC0000CC0000CC0000CC0000CC0000CC00 + 00CC0000CC0000CC0001010100FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0001010100003300003300003300003300003300003300003300 + 0033000033010101003333003333003333003333003333003333003333003333 + 0033330101010066330066330066330066330066330066330066330066330066 + 3301010100993300993300993300993300993300993300993300993300993301 + 010100CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC33010101 + 00FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF330101010000 + 6600006600006600006600006600006600006600006600006601010100336600 + 3366003366003366003366003366003366003366003366010101006666006666 + 0066660066660066660066660066660066660066660101010099660099660099 + 6600996600996600996600996600996600996601010100CC6600CC6600CC6600 + CC6600CC6600CC6600CC6600CC6600CC6601010100FF6600FF6600FF6600FF66 + 00FF6600FF6600FF6600FF6600FF660101010101010101010101010101010101 + 0101010101010101010101010101010100000000000000000000000000000000 + 0000000000000000000000000000010101010101010101010101010101010101 + 0101010101010101010101010033000033000033000033000033000033000033 + 0000330000330001010100660000660000660000660000660000660000660000 + 6600006600010101009900009900009900009900009900009900009900009900 + 00990001010100CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC + 0001010100FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0001 + 0101000033000033000033000033000033000033000033000033000033010101 + 0033330033330033330033330033330033330033330033330033330101010066 + 3300663300663300663300663300663300663300663300663301010100993300 + 993300993300993300993300993300993300993300993301010100CC3300CC33 + 00CC3300CC3300CC3300CC3300CC3300CC3300CC3301010100FF3300FF3300FF + 3300FF3300FF3300FF3300FF3300FF3300FF3301010100006600006600006600 + 0066000066000066000066000066000066010101003366003366003366003366 + 0033660033660033660033660033660101010066660066660066660066660066 + 6600666600666600666600666601010100996600996600996600996600996600 + 996600996600996600996601010100CC6600CC6600CC6600CC6600CC6600CC66 + 00CC6600CC6600CC6601010100FF6600FF6600FF6600FF6600FF6600FF6600FF + 6600FF6600FF6601010101010101010101010101010101010101010101010101 + 0101010101010101000000000000000000000000000000000000000000000000 + 0000000000000101010101010101010101010101010101010101010101010101 + 0101010100330000330000330000330000330000330000330000330000330001 + 0101006600006600006600006600006600006600006600006600006600010101 + 00990000990000990000990000990000990000990000990000990001010100CC + 0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0001010100FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00010101000033000033 + 0000330000330000330000330000330000330000330101010033330033330033 + 3300333300333300333300333300333300333301010100663300663300663300 + 6633006633006633006633006633006633010101009933009933009933009933 + 00993300993300993300993300993301010100CC3300CC3300CC3300CC3300CC + 3300CC3300CC3300CC3300CC3301010100FF3300FF3300FF3300FF3300FF3300 + FF3300FF3300FF3300FF33010101000066000066000066000066000066000066 + 0000660000660000660101010033660033660033660033660033660033660033 + 6600336600336601010100666600666600666600666600666600666600666600 + 6666006666010101009966009966009966009966009966009966009966009966 + 00996601010100CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC + 6601010100FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6601 + 0101010101010101010101010101010101010101010101010101010101010101 + 0000000000000000000000000000000000000000000000000000000000000101 + 0101010101010101010101010101010101010101010101010101010100330000 + 3300003300003300003300003300003300003300003300010101006600006600 + 0066000066000066000066000066000066000066000101010099000099000099 + 0000990000990000990000990000990000990001010100CC0000CC0000CC0000 + CC0000CC0000CC0000CC0000CC0000CC0001010100FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF000101010000330000330000330000330000 + 3300003300003300003300003301010100333300333300333300333300333300 + 3333003333003333003333010101006633006633006633006633006633006633 + 0066330066330066330101010099330099330099330099330099330099330099 + 3300993300993301010100CC3300CC3300CC3300CC3300CC3300CC3300CC3300 + CC3300CC3301010100FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF33 + 00FF330101010000660000660000660000660000660000660000660000660000 + 6601010100336600336600336600336600336600336600336600336600336601 + 0101006666006666006666006666006666006666006666006666006666010101 + 00996600996600996600996600996600996600996600996600996601010100CC + 6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6601010100FF6600 + FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF66010101010101010101 + 0101010101010101010101010101010101010101010101010000000000000000 + 0000000000000000000000000000000000000000000001010101010101010101 + 0101010101010101010101010101010101010101003300003300003300003300 + 0033000033000033000033000033000101010066000066000066000066000066 + 0000660000660000660000660001010100990000990000990000990000990000 + 990000990000990000990001010100CC0000CC0000CC0000CC0000CC0000CC00 + 00CC0000CC0000CC0001010100FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0001010100003300003300003300003300003300003300003300 + 0033000033010101003333003333003333003333003333003333003333003333 + 0033330101010066330066330066330066330066330066330066330066330066 + 3301010100993300993300993300993300993300993300993300993300993301 + 010100CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC33010101 + 00FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF330101010000 + 6600006600006600006600006600006600006600006600006601010100336600 + 3366003366003366003366003366003366003366003366010101006666006666 + 0066660066660066660066660066660066660066660101010099660099660099 + 6600996600996600996600996600996600996601010100CC6600CC6600CC6600 + CC6600CC6600CC6600CC6600CC6600CC6601010100FF6600FF6600FF6600FF66 + 00FF6600FF6600FF6600FF6600FF660101010101010101010101010101010101 + 0101010101010101010101010101010100000000000000000000000000000000 + 0000000000000000000000000000010101010101010101010101010101010101 + 0101010101010101010101010033000033000033000033000033000033000033 + 0000330000330001010100660000660000660000660000660000660000660000 + 6600006600010101009900009900009900009900009900009900009900009900 + 00990001010100CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC + 0001010100FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0001 + 0101000033000033000033000033000033000033000033000033000033010101 + 0033330033330033330033330033330033330033330033330033330101010066 + 3300663300663300663300663300663300663300663300663301010100993300 + 993300993300993300993300993300993300993300993301010100CC3300CC33 + 00CC3300CC3300CC3300CC3300CC3300CC3300CC3301010100FF3300FF3300FF + 3300FF3300FF3300FF3300FF3300FF3300FF3301010100006600006600006600 + 0066000066000066000066000066000066010101003366003366003366003366 + 0033660033660033660033660033660101010066660066660066660066660066 + 6600666600666600666600666601010100996600996600996600996600996600 + 996600996600996600996601010100CC6600CC6600CC6600CC6600CC6600CC66 + 00CC6600CC6600CC6601010100FF6600FF6600FF6600FF6600FF6600FF6600FF + 6600FF6600FF6601010101010101010101010101010101010101010101010101 + 0101010101010101000000000000000000000000000000000000000000000000 + 0000000000000101010101010101010101010101010101010101010101010101 + 0101010100330000330000330000330000330000330000330000330000330001 + 0101006600006600006600006600006600006600006600006600006600010101 + 00990000990000990000990000990000990000990000990000990001010100CC + 0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0001010100FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00010101000033000033 + 0000330000330000330000330000330000330000330101010033330033330033 + 3300333300333300333300333300333300333301010100663300663300663300 + 6633006633006633006633006633006633010101009933009933009933009933 + 00993300993300993300993300993301010100CC3300CC3300CC3300CC3300CC + 3300CC3300CC3300CC3300CC3301010100FF3300FF3300FF3300FF3300FF3300 + FF3300FF3300FF3300FF33010101000066000066000066000066000066000066 + 0000660000660000660101010033660033660033660033660033660033660033 + 6600336600336601010100666600666600666600666600666600666600666600 + 6666006666010101009966009966009966009966009966009966009966009966 + 00996601010100CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC + 6601010100FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6601 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101} + OnMouseMove = imgPaletteMouseMove + OnMouseUp = imgPaletteMouseUp + end + end + end + object SpTBXDock1: TSpTBXDock + Left = 0 + Top = 0 + Width = 225 + Height = 26 + object SpTBXToolbar1: TSpTBXToolbar + Left = 0 + Top = 0 + BorderStyle = bsNone + DockMode = dmCannotFloatOrChangeDocks + DragHandleStyle = dhNone + Images = ImageList1 + ShrinkMode = tbsmNone + Stretch = True + TabOrder = 0 + Caption = 'SpTBXToolbar1' + object tColorBtn: TSpTBXItem + CustomWidth = 50 + OnDrawItem = tColorBtnDrawItem + end + object tLabel: TSpTBXRightAlignSpacerItem + CustomWidth = 127 + end + object tColorNone: TSpTBXItem + ImageIndex = 1 + OnClick = tColorNoneClick + OnSelect = tColorNoneSelect + CustomWidth = 22 + CustomHeight = 22 + end + object tColorDialog: TSpTBXItem + ImageIndex = 0 + OnClick = tColorDialogClick + OnSelect = tColorDialogSelect + CustomWidth = 22 + end + end + end + object Timer1: TTimer + Interval = 25 + OnTimer = Timer1Timer + Left = 112 + Top = 152 + end + object ColorDialog1: TColorDialog + Options = [cdFullOpen] + Left = 144 + Top = 152 + end + object ImageList1: TImageList + Left = 80 + 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 +end diff --git a/official/2.2.2+2.4/SpTBXLib/Source/SpTBXColorPickerForm.pas b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXColorPickerForm.pas new file mode 100644 index 0000000..2448a8c --- /dev/null +++ b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXColorPickerForm.pas @@ -0,0 +1,446 @@ +unit SpTBXColorPickerForm; + +{============================================================================== +Version 2.4 + +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; + 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; + ColorDialog1: TColorDialog; + ImageList1: TImageList; + SpTBXDock1: TSpTBXDock; + SpTBXToolbar1: TSpTBXToolbar; + tColorBtn: TSpTBXItem; + tLabel: TSpTBXRightAlignSpacerItem; + tColorNone: TSpTBXItem; + tColorDialog: TSpTBXItem; + SpTBXColorListBox1: TSpTBXColorListBox; + 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 imgPaletteMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure SpTBXTabControl1ActiveTabChange(Sender: TObject; + TabIndex: Integer); + procedure SpTBXColorListBox1Click(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure tColorBtnDrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; + ItemInfo: TSpTBXMenuItemInfo; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); + procedure tColorNoneClick(Sender: TObject); + procedure tColorDialogClick(Sender: TObject); + procedure tColorNoneSelect(Sender: TTBCustomItem; Viewer: TTBItemViewer; + Selecting: Boolean); + procedure tColorDialogSelect(Sender: TTBCustomItem; Viewer: TTBItemViewer; + Selecting: Boolean); + protected + FSelectedColor: 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} + +//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); + // Don't move SourceR outside of the screen visible area + if SourceR.Left < 0 then SourceR.Left := 0 + else if SourceR.Left + zoomW > Screen.Width then SourceR.Left := Screen.Width - zoomW; + if SourceR.Top < 0 then SourceR.Top := 0 + else if SourceR.Top + zoomH > Screen.Height then SourceR.Top := Screen.Height - zoomH; + + 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; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXColorPickerForm } + +procedure TSpTBXColorPickerForm.FormCreate(Sender: TObject); +begin + SpTBXTabSheet1.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); +begin + 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.SpTBXColorListBox1Click(Sender: TObject); +begin + SetSelectedColor(SpTBXColorListBox1.Selected); +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.imgPaletteMouseUp(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +var + C: TColor; +begin + C := imgPalette.Picture.Bitmap.Canvas.Pixels[X, Y]; + SetSelectedColor(C); +end; + +procedure TSpTBXColorPickerForm.SpTBXTabControl1ActiveTabChange(Sender: TObject; + TabIndex: Integer); +begin + CenterImages; +end; + +procedure TSpTBXColorPickerForm.tColorDialogClick(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); + if ColorDialog1.Execute then + EditButton.SelectedColor := ColorDialog1.Color; + P.ClosePopup(False); + end; +end; + +procedure TSpTBXColorPickerForm.tColorDialogSelect(Sender: TTBCustomItem; + Viewer: TTBItemViewer; Selecting: Boolean); +begin + tLabel.Caption := SSpTBXColorPicker; +end; + +procedure TSpTBXColorPickerForm.tColorBtnDrawItem(Sender: TObject; + ACanvas: TCanvas; ARect: TRect; ItemInfo: TSpTBXMenuItemInfo; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if PaintStage = pstPrePaint then begin + PaintDefault := False; + InflateRect(ARect, -3, -3); + if tColorBtn.CaptionGlowColor = clNone then + SpDrawCheckeredBackground(ACanvas, ARect) + else begin + ACanvas.Brush.Color := tColorBtn.CaptionGlowColor; + ACanvas.FillRect(ARect); + end; + SpDrawRectangle(ACanvas, ARect, 0, clBtnShadow, clBtnHighlight); + end; +end; + +procedure TSpTBXColorPickerForm.tColorNoneClick(Sender: TObject); +begin + SetSelectedColor(clNone); +end; + +procedure TSpTBXColorPickerForm.tColorNoneSelect(Sender: TTBCustomItem; + Viewer: TTBItemViewer; Selecting: Boolean); +begin + UpdateColorLabel(clNone); + tLabel.Caption := SSpTBXTransparentColor; +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(tColorBtn.CaptionGlowColor); + FreeAndNil(FColorPickerDragObject); +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 + tColorBtn.CaptionGlowColor := AColor; + tLabel.Caption := SpColorToHTML(AColor); +end; + +end. diff --git a/official/2.2.2+2.4/SpTBXLib/Source/SpTBXControls.pas b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXControls.pas new file mode 100644 index 0000000..1fa0978 --- /dev/null +++ b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXControls.pas @@ -0,0 +1,4170 @@ +unit SpTBXControls; + +{============================================================================== +Version 2.4 + +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: +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 IsCheckedLinked: 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; + 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 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 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 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 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 + FGroupIndex: Integer; + FStateChanged: Boolean; + procedure UpdateExclusive; + 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; + 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; + 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 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 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 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 Bitmap; + property BitmapTransparent; + property Cancel; + property CaptionGlow; + property CaptionGlowColor; + property Checked; + property Default; + property DrawPushedCaption; + property DropDownArrow; + property DropDownMenu; + 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; + + { 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; + XPThemes: Boolean; +begin + Flags := 0; + XPThemes := SpTBXSkinType(SkinType) = sknWindows; + 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 XPThemes 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 + if XPThemes then + DrawThemeText(ThemeServices.Theme[teButton], ACanvas.Handle, BP_GROUPBOX, Flags, PWideChar(ACaption), -1, TextFlags, 0, CaptionRect) + else begin + if CurrentSkin.Options(skncPanel, sknsNormal).TextColor <> clNone then + ACanvas.Font.Color := CurrentSkin.Options(skncPanel, sknsNormal).TextColor; + SpDrawXPText(ACanvas, ACaption, CaptionRect, TextFlags); + 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 SpIsWinVista 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 SpIsWinVista 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.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; + +procedure TSpTBXTextObjectActionLink.SetCaption(const Value: String); +begin + if IsCaptionLinked then + if Action is TTntAction 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 TTntAction 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; + + {$IFNDEF UNICODE} + if Action is TTntAction then + with TTntAction(Sender) do begin + if not CheckDefaults or (Self.Caption = '') then + Self.Caption := Caption; + if not CheckDefaults or (Self.Hint = '') then + Self.Hint := Hint; + end; + {$ENDIF} + + 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, ghlGlyphLeft, 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, + ghlGlyphLeft, 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; + +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: 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; + + // Draw the hint in the HintBitmap + 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 + + // Recalculate TextR + 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; + // Draw the hint + R := Rect(0, 0, SpStockHintBitmap.Width, SpStockHintBitmap.Height); + SpStockHintBitmap.Canvas.FillRect(R); + 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.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; + 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; + FGroupIndex := -1; + 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 + T := SpTBXSkinType(SkinType); + + Result := inherited DoDrawItem(ACanvas, ARect, PaintStage); + if Result and (PaintStage = pstPrePaint) 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 + 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.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 + Checked := not Checked; + 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 + // 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 + if (I = 0) or (I = Count - 1) then TickDelta := FirstTickSize + else TickDelta := TickSize; + 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 + 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 + if (I = 0) or (I = Count - 1) then TickDelta := FirstTickSize + else TickDelta := TickSize; + 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; + + 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/SpTBXLib/Source/SpTBXCustomizer.pas b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXCustomizer.pas new file mode 100644 index 0000000..332ca19 --- /dev/null +++ b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXCustomizer.pas @@ -0,0 +1,1733 @@ +unit SpTBXCustomizer; + +{============================================================================== +Version 2.4 + +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: +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(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(OptionsList: TStrings); overload; + procedure Save(MemIni: TMemIniFile); overload; + procedure Save(const Filename: string); overload; + procedure Save(const RootKey: DWORD; BaseRegistryKey: string); overload; + procedure Reset; + 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(MemIni: TMemIniFile; 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(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; + +{ SpTBMemIniLoadPositions and SpTBMemIniSavePositions are the same as TBIniLoadPositions/TBIniSavePositions + of the TB2Dock unit but uses 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 } +procedure SpTBMemIniLoadPositions(const OwnerComponent: TComponent; MemIni: TMemIniFile; SectionNamePrefix: string); +procedure SpTBMemIniSavePositions(const OwnerComponent: TComponent; MemIni: TMemIniFile; SectionNamePrefix: string); + +{ Ini/Reg } +procedure SpMemIniEraseSection(MemIni: TMemIniFile; Section: string; EraseKeysOnly: Boolean); +procedure SpMemIniSaveStringList(MemIni: TMemIniFile; Section: string; L: TStringList); +procedure SpMemIniLoadStringList(MemIni: TMemIniFile; 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(MemIni: TMemIniFile; L: TStringList); overload; +procedure SpLoadLayoutList(const RootKey: DWORD; BaseRegistryKey: string; L: TStringList); overload; +procedure SpLoadLayout(const OwnerComponent: TComponent; MemIni: TMemIniFile; LayoutName: string; ExtraOptions: TStringList = nil); overload; +procedure SpLoadLayout(const OwnerComponent: TComponent; const RootKey: DWORD; BaseRegistryKey, LayoutName: string; ExtraOptions: TStringList = nil); overload; +procedure SpSaveLayout(const OwnerComponent: TComponent; MemIni: TMemIniFile; LayoutName: string; ExtraOptions: TStringList = nil); overload; +procedure SpSaveLayout(const OwnerComponent: TComponent; const RootKey: DWORD; BaseRegistryKey, LayoutName: string; ExtraOptions: TStringList = nil); overload; + +{ Items } +procedure SpLoadItems(const OwnerComponent: TComponent; MemIni: TMemIniFile; ShortcutsList: TSpTBXMenuBarShortcuts = nil; ExtraOptions: TStringList = nil); overload; +procedure SpLoadItems(const OwnerComponent: TComponent; const RootKey: DWORD; BaseRegistryKey: string; ShortcutsList: TSpTBXMenuBarShortcuts = nil; ExtraOptions: TStringList = nil); overload; +procedure SpSaveItems(const OwnerComponent: TComponent; MemIni: TMemIniFile; ShortcutsList: TSpTBXMenuBarShortcuts = nil; ExtraOptions: TStringList = nil); overload; +procedure SpSaveItems(const OwnerComponent: TComponent; const RootKey: DWORD; BaseRegistryKey: string; ShortcutsList: TSpTBXMenuBarShortcuts = nil; ExtraOptions: TStringList = nil); overload; + +{ 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 + Exit + 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 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 +{ SpTBMemIniLoadPositions/SpTBMemIniSavePositions } + +procedure SpTBMemIniLoadPositions(const OwnerComponent: TComponent; + MemIni: TMemIniFile; SectionNamePrefix: string); +begin + SpTBIniLoadPositions(OwnerComponent, MemIni, SectionNamePrefix); +end; + +procedure SpTBMemIniSavePositions(const OwnerComponent: TComponent; + MemIni: TMemIniFile; SectionNamePrefix: string); +begin + SpTBIniSavePositions(OwnerComponent, MemIni, SectionNamePrefix); + if FileExists(MemIni.FileName) then + MemIni.UpdateFile; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Ini/Reg } + +procedure SpMemIniEraseSection(MemIni: TMemIniFile; Section: string; EraseKeysOnly: Boolean); +var + I: Integer; + Keys: TStringList; +begin + if EraseKeysOnly then begin + Keys := TStringList.Create; + try + MemIni.ReadSection(Section, Keys); + for I := 0 to Keys.Count - 1 do + MemIni.DeleteKey(Section, Keys[I]); + finally + Keys.Free; + end; + end + else + MemIni.EraseSection(Section); +end; + +procedure SpMemIniSaveStringList(MemIni: TMemIniFile; Section: string; L: TStringList); +var + I: integer; +begin + if not Assigned(L) then Exit; + SpMemIniEraseSection(MemIni, Section, True); + if L.Count > 0 then begin + MemIni.WriteInteger(Section, rvCount, L.Count); + for I := 0 to L.Count - 1 do + MemIni.WriteString(Section, IntToStr(I), L[I]); + if FileExists(MemIni.FileName) then + MemIni.UpdateFile; + end; +end; + +procedure SpMemIniLoadStringList(MemIni: TMemIniFile; Section: string; L: TStringList); +var + I, C: integer; +begin + if not Assigned(L) then Exit; + L.Clear; + C := MemIni.ReadInteger(Section, rvCount, -1); + for I := 0 to C - 1 do + L.Add(MemIni.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(MemIni: TMemIniFile; L: TStringList); overload; +begin + SpMemIniLoadStringList(MemIni, rvLayoutList, L); +end; + +procedure SpLoadLayoutList(const RootKey: DWORD; BaseRegistryKey: string; + L: TStringList); overload; +begin + BaseRegistryKey := IncludeTrailingRegKeyDelimiter(BaseRegistryKey) + rvLayoutList; + SpRegLoadStringList(L, RootKey, BaseRegistryKey); +end; + +procedure SpSaveLayout(const OwnerComponent: TComponent; + MemIni: TMemIniFile; LayoutName: string; ExtraOptions: TStringList = nil); overload; +var + L: TStringList; +begin + L := TStringList.Create; + try + // Save the LayoutList + SpMemIniLoadStringList(MemIni, rvLayoutList, L); + if L.IndexOf(LayoutName) = -1 then + L.Add(LayoutName); + SpMemIniSaveStringList(MemIni, rvLayoutList, L); + + // Save the Layout + SpTBMemIniSavePositions(OwnerComponent, MemIni, LayoutName + ' @ '); + + // Save the Multidocks + if Assigned(ExtraOptions) then + SpMemIniSaveStringList(MemIni, LayoutName + ' @ ' + rvExtraOptions, ExtraOptions); + finally + L.Free; + end; +end; + +procedure SpSaveLayout(const OwnerComponent: TComponent; const RootKey: DWORD; + BaseRegistryKey, LayoutName: string; ExtraOptions: TStringList = nil); overload; +var + L: TStringList; + S: string; +begin + L := TStringList.Create; + try + // Save the LayoutList + S := IncludeTrailingRegKeyDelimiter(BaseRegistryKey) + rvLayoutList; + SpRegLoadStringList(L, RootKey, S); + if L.IndexOf(LayoutName) = -1 then + L.Add(LayoutName); + SpRegSaveStringList(L, RootKey, S); + + // Save the Layout + S := IncludeTrailingRegKeyDelimiter(BaseRegistryKey) + rvLayoutRegList + '\' + LayoutName; + TBRegSavePositions(OwnerComponent, RootKey, S); + + // Save the MultiDocks + if Assigned(ExtraOptions) then + SpRegSaveStringList(ExtraOptions, RootKey, S + '\' + rvExtraOptions); + finally + L.Free; + end; +end; + +procedure SpLoadLayout(const OwnerComponent: TComponent; + MemIni: TMemIniFile; LayoutName: string; ExtraOptions: TStringList = nil); overload; +var + L: TStringList; +begin + // Check if the layout exists on the layout list and load it + L := TStringList.Create; + try + SpMemIniLoadStringList(MemIni, rvLayoutList, L); + if L.IndexOf(LayoutName) > -1 then begin + SpTBMemIniLoadPositions(OwnerComponent, MemIni, LayoutName + ' @ '); + + SpMemIniLoadStringList(MemIni, LayoutName + ' @ ' + rvExtraOptions, L); + if Assigned(ExtraOptions) then + ExtraOptions.Assign(L); + end; + finally + L.Free; + end; +end; + +procedure SpLoadLayout(const OwnerComponent: TComponent; const RootKey: DWORD; + BaseRegistryKey, LayoutName: string; ExtraOptions: TStringList = nil) overload; +var + L: TStringList; + S: string; +begin + // Check if the layout exists on the layout list and load it + L := TStringList.Create; + try + S := IncludeTrailingRegKeyDelimiter(BaseRegistryKey) + rvLayoutList; + SpRegLoadStringList(L, RootKey, S); + if L.IndexOf(LayoutName) > -1 then begin + S := IncludeTrailingRegKeyDelimiter(BaseRegistryKey) + rvLayoutRegList + '\' + LayoutName; + TBRegLoadPositions(OwnerComponent, RootKey, S); + + SpRegLoadStringList(ExtraOptions, RootKey, S + '\' + rvExtraOptions); + if Assigned(ExtraOptions) then + ExtraOptions.Assign(L); + end; + finally + L.Free; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Items } + +procedure SpSaveItems(const OwnerComponent: TComponent; MemIni: TMemIniFile; + ShortcutsList: TSpTBXMenuBarShortcuts = nil; ExtraOptions: TStringList = nil); overload; +var + L: TStringList; +begin + L := TStringList.Create; + try + SaveItemOptions(OwnerComponent, ShortcutsList, L); + SpMemIniSaveStringList(MemIni, rvItemsList, L); + SpMemIniSaveStringList(MemIni, rvExtraOptions, ExtraOptions); + finally + L.Free; + end; +end; + +procedure SpSaveItems(const OwnerComponent: TComponent; const RootKey: DWORD; + BaseRegistryKey: string; ShortcutsList: TSpTBXMenuBarShortcuts = nil; + ExtraOptions: TStringList = nil); overload; +var + L: TStringList; +begin + L := TStringList.Create; + try + BaseRegistryKey := IncludeTrailingRegKeyDelimiter(BaseRegistryKey); + SaveItemOptions(OwnerComponent, ShortcutsList, L); + SpRegSaveStringList(L, RootKey, BaseRegistryKey + rvItemsList); + SpRegSaveStringList(ExtraOptions, RootKey, BaseRegistryKey + rvExtraOptions); + finally + L.Free; + end; +end; + +procedure SpLoadItems(const OwnerComponent: TComponent; MemIni: TMemIniFile; + ShortcutsList: TSpTBXMenuBarShortcuts = nil; ExtraOptions: TStringList = nil); overload; +var + L: TStringList; +begin + L := TStringList.Create; + try + SpMemIniLoadStringList(MemIni, rvItemsList, L); + ApplyItemOptions(OwnerComponent, ShortcutsList, L); + SpMemIniLoadStringList(MemIni, rvExtraOptions, ExtraOptions); + finally + L.Free; + end; +end; + +procedure SpLoadItems(const OwnerComponent: TComponent; const RootKey: DWORD; BaseRegistryKey: string; + ShortcutsList: TSpTBXMenuBarShortcuts = nil; ExtraOptions: TStringList = nil); overload; +var + L: TStringList; +begin + L := TStringList.Create; + try + BaseRegistryKey := IncludeTrailingRegKeyDelimiter(BaseRegistryKey); + SpRegLoadStringList(L, RootKey, BaseRegistryKey + rvItemsList); + ApplyItemOptions(OwnerComponent, ShortcutsList, L); + SpRegLoadStringList(ExtraOptions, RootKey, BaseRegistryKey + rvExtraOptions); + 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(OptionsList: TStrings; LoadLastLayout: Boolean = True); +var + MemIni: TMemIniFile; + ExtraL: TStringList; + ShortcutsL: TSpTBXMenuBarShortcuts; +begin + MemIni := TMemIniFile.Create(''); + ExtraL := TStringList.Create; + ShortcutsL := TSpTBXMenuBarShortcuts.Create; + try + MemIni.SetStrings(OptionsList); + + // Load Shortcuts + if Assigned(MenuBar) then + GetShortcutList(ShortcutsL); + + // Save the ResetState, save only the Items and Toolbar state + SaveResetState(ShortcutsL); + + // Load Items + SpLoadItems(Owner, MemIni, ShortcutsL, ExtraL); + + // Fill Extra Options + DoLoad(ExtraL); + if FSaveFormState then + SpLoadFormState(Application.MainForm, ExtraL); + SkinManager.SetSkin(ExtraL.Values[rvSkin]); + + // Load Layouts + SpLoadLayoutList(MemIni, FLayouts); + if LoadLastLayout then + LoadLayout(OptionsList, rvLastLayout); + finally + MemIni.Free; + ExtraL.Free; + ShortcutsL.Free; + end; +end; + +procedure TSpTBXCustomizer.Load(const Filename: string; LoadLastLayout: Boolean = True); +var + L: TStringList; +begin + L := TStringList.Create; + try + if FileExists(Filename) then begin + L.LoadFromFile(Filename); + Load(L, LoadLastLayout); + end; + finally + L.Free; + end; +end; + +procedure TSpTBXCustomizer.Load(const RootKey: DWORD; BaseRegistryKey: string; 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, RootKey, BaseRegistryKey, ShortcutsL, ExtraL); + + // Fill Extra Options + DoLoad(ExtraL); + if FSaveFormState then + SpLoadFormState(Application.MainForm, ExtraL); + SkinManager.SetSkin(ExtraL.Values[rvSkin]); + + // Load Layouts + SpLoadLayoutList(RootKey, BaseRegistryKey, FLayouts); + if LoadLastLayout then + LoadLayout(RootKey, BaseRegistryKey, rvLastLayout); + finally + ExtraL.Free; + ShortcutsL.Free; + end; +end; + +procedure TSpTBXCustomizer.Save(MemIni: TMemIniFile); +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, MemIni, ShortcutsL, ExtraL); + + // Save Layouts + SaveLayout(MemIni, 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 L contents to MemIni + Save(MemIni); + OptionsList.Clear; + MemIni.GetStrings(OptionsList); // Transfer MemIni contents to L + 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 + 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, RootKey, BaseRegistryKey, ShortcutsL, ExtraL); + + // Save Layouts + SaveLayout(RootKey, BaseRegistryKey, rvLastLayout); + finally + ExtraL.Free; + ShortcutsL.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); + // 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(OptionsList: TStrings; LayoutName: string); +var + MemIni: TMemIniFile; + ExtraL: TStringList; +begin + MemIni := TMemIniFile.Create(''); + ExtraL := TStringList.Create; + try + MemIni.SetStrings(OptionsList); + + SpLoadLayout(Owner, MemIni, LayoutName, ExtraL); + DoLayoutLoad(LayoutName, ExtraL); + finally + ExtraL.Free; + MemIni.Free; + end; +end; + +procedure TSpTBXCustomizer.LoadLayout(const Filename, LayoutName: string); +var + L: TStringList; +begin + L := TStringList.Create; + try + if FileExists(Filename) then begin + L.LoadFromFile(Filename); + LoadLayout(L, LayoutName); + end; + finally + L.Free; + end; +end; + +procedure TSpTBXCustomizer.LoadLayout(const RootKey: DWORD; + BaseRegistryKey, LayoutName: string); +var + ExtraL: TStringList; +begin + ExtraL := TStringList.Create; + try + SpLoadLayout(Owner, RootKey, BaseRegistryKey, LayoutName, ExtraL); + DoLayoutLoad(LayoutName, ExtraL); + finally + ExtraL.Free; + end; +end; + +procedure TSpTBXCustomizer.SaveLayout(MemIni: TMemIniFile; LayoutName: string); +var + ExtraL: TStringList; +begin + if LayoutName = '' then Exit; + ExtraL := TStringList.Create; + try + DoLayoutSave(LayoutName, ExtraL); + SpSaveLayout(Owner, MemIni, LayoutName, ExtraL); + SpLoadLayoutList(MemIni, 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); + + SaveLayout(MemIni, LayoutName); + + // Reload OptionsList + OptionsList.Clear; + MemIni.GetStrings(OptionsList); + finally + MemIni.Free; + end; +end; + +procedure TSpTBXCustomizer.SaveLayout(const Filename, LayoutName: string); +var + L: TStringList; +begin + L := TStringList.Create; + try + if FileExists(Filename) then + L.LoadFromFile(Filename); + SaveLayout(L, LayoutName); + L.SaveToFile(Filename); + finally + L.Free; + end; +end; + +procedure TSpTBXCustomizer.SaveLayout(const RootKey: DWORD; + BaseRegistryKey, LayoutName: string); +var + ExtraL: TStringList; +begin + if LayoutName = '' then Exit; + ExtraL := TStringList.Create; + try + DoLayoutSave(LayoutName, ExtraL); + SpSaveLayout(Owner, RootKey, BaseRegistryKey, LayoutName, ExtraL); + SpLoadLayoutList(RootKey, BaseRegistryKey, FLayouts); + finally + ExtraL.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); + SpMemIniSaveStringList(TempIni, rvItemsList, FResetState); + SpSaveLayout(Owner, TempIni, rvLastLayout, nil); + FResetState.Clear; + TempIni.GetStrings(FResetState); + finally + TempIni.Free; + end; + end; +end; + +function TSpTBXCustomizer.DeleteLayout(OptionsList: TStrings; + LayoutName: string): Boolean; +var + MemIni: TMemIniFile; + L: TStringList; + I, P: Integer; + S: string; +begin + Result := False; + MemIni := TMemIniFile.Create(''); + L := TStringList.Create; + try + MemIni.SetStrings(OptionsList); + + SpMemIniLoadStringList(MemIni, rvLayoutList, L); + I := L.IndexOf(LayoutName); + if I > -1 then begin + Result := True; + L.Delete(I); + SpMemIniSaveStringList(MemIni, rvLayoutList, L); + + MemIni.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 + MemIni.EraseSection(L[I]); + end; + end; + + SpLoadLayoutList(MemIni, FLayouts); + + // Reload OptionsList + OptionsList.Clear; + MemIni.GetStrings(OptionsList); + end; + finally + MemIni.Free; + L.Free; + end; +end; + +function TSpTBXCustomizer.DeleteLayout(const Filename, LayoutName: string): Boolean; +var + L: TStringList; +begin + Result := False; + L := TStringList.Create; + try + if FileExists(Filename) then begin + L.LoadFromFile(Filename); + Result := DeleteLayout(L, LayoutName); + if Result then + L.SaveToFile(Filename); + end; + finally + L.Free; + end; +end; + +function TSpTBXCustomizer.DeleteLayout(const RootKey: DWORD; BaseRegistryKey, + LayoutName: string): Boolean; +var + Reg: TRegistry; + L: TStringList; + S: string; + I: integer; +begin + Result := False; + L := TStringList.Create; + try + S := IncludeTrailingRegKeyDelimiter(BaseRegistryKey) + rvLayoutList; + SpRegLoadStringList(L, RootKey, S); + I := L.IndexOf(LayoutName); + if I > -1 then begin + Result := True; + L.Delete(I); + SpRegSaveStringList(L, RootKey, S); + + Reg := TRegistry.Create; + try + Reg.RootKey := RootKey; + S := IncludeTrailingRegKeyDelimiter(BaseRegistryKey) + rvLayoutRegList + '\' + LayoutName; + Reg.DeleteKey(S); + finally + Reg.Free; + end; + + SpLoadLayoutList(RootKey, BaseRegistryKey, FLayouts); + end; + finally + L.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/SpTBXLib/Source/SpTBXCustomizerForm.dfm b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXCustomizerForm.dfm new file mode 100644 index 0000000..27c807c --- /dev/null +++ b/official/2.2.2+2.4/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 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 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 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/SpTBXLib/Source/SpTBXCustomizerForm.pas b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXCustomizerForm.pas new file mode 100644 index 0000000..5970312 --- /dev/null +++ b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXCustomizerForm.pas @@ -0,0 +1,520 @@ +unit SpTBXCustomizerForm; + +{============================================================================== +Version 2.4 + +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 lbCommandsDrawItem(Control: TWinControl; Index: Integer; + Rect: TRect; State: TOwnerDrawState); + 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 lbShortcutsDrawItem(Control: TWinControl; Index: Integer; + Rect: TRect; State: TOwnerDrawState); + 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); + protected + procedure DoFillCommands(ToolbarList, ItemList, ShortcutsList: TTntStringList); override; + procedure DoSkinChange; override; + end; + +implementation + +uses + ActnList; + +{$R *.dfm} + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Helpers } + +procedure SpDrawListboxItem(L: TTntListBox; 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: TTntListBox; + I: Integer; + Item: TTBCustomItem; + Sep: TTBSeparatorItem; +begin + L := Sender as TTntListBox; + 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(Control: TWinControl; + Index: Integer; Rect: TRect; State: TOwnerDrawState); +begin + if Index = 0 then begin + // Draw the separator + SpDrawXPText(TTntListBox(Control).Canvas, SSpTBXCustomizerFormSeparator, Rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER); + end + else + if (Index = 1) and Customizer.BlankSeparators then begin + // Draw the blank separator + SpDrawXPText(TTntListBox(Control).Canvas, SSpTBXCustomizerFormBlankSeparator, Rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER); + end + else + SpDrawListboxItem(Control as TTntListBox, Index, Rect, State, False, Customizer.Images); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Shortcuts tab } + +procedure TSpTBXCustomizeForm.lbShortcutsDrawItem(Control: TWinControl; + Index: Integer; Rect: TRect; State: TOwnerDrawState); +begin + SpDrawListboxItem(Control as TTntListBox, Index, Rect, State, True, Customizer.Images); +end; + +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.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/SpTBXLib/Source/SpTBXDefaultSkins.pas b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXDefaultSkins.pas new file mode 100644 index 0000000..6813662 --- /dev/null +++ b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXDefaultSkins.pas @@ -0,0 +1,2101 @@ +unit SpTBXDefaultSkins; + +{============================================================================== +Version 2.4 + +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: +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; + procedure FillOptions; override; + function GetBrushMetalColor(Component: TSpTBXSkinComponentsType; State: TSpTBXSkinStatesType): TColor; virtual; + public + procedure PaintBackground(ACanvas: TCanvas; ARect: TRect; Component: TSpTBXSkinComponentsType; State: TSpTBXSkinStatesType; Background, Borders: Boolean; Vertical: Boolean = False; ForceRectBorders: TAnchors = []); override; + constructor Create; override; + destructor Destroy; 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) + protected + procedure FillOptions; override; + end; + + TSpTBXDreamSkin = class(TSpTBXSkinOptions) + protected + procedure FillOptions; override; + end; + + TSpTBXEosSkin = class(TSpTBXSkinOptions) + protected + procedure FillOptions; override; + end; + + TSpTBXHumanSkin = class(TSpTBXSkinOptions) + protected + procedure FillOptions; override; + public + procedure PaintBackground(ACanvas: TCanvas; ARect: TRect; Component: TSpTBXSkinComponentsType; State: TSpTBXSkinStatesType; Background, Borders: Boolean; Vertical: Boolean = False; ForceRectBorders: TAnchors = []); override; + end; + + TSpTBXLeopardSkin = class(TSpTBXSkinOptions) + protected + procedure FillOptions; override; + public + procedure PaintBackground(ACanvas: TCanvas; ARect: TRect; Component: TSpTBXSkinComponentsType; State: TSpTBXSkinStatesType; Background, Borders: Boolean; Vertical: Boolean = False; ForceRectBorders: TAnchors = []); override; + end; + + TSpTBXXitoSkin = class(TSpTBXSkinOptions) + protected + procedure FillOptions; override; + end; + + { Office Skins } + + TSpTBXOfficeXPSkin = class(TSpTBXSkinOptions) + protected + 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; + procedure FillOptions; override; + public + constructor Create; 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; + 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(skncListItem, sknsNormal).TextColor := clBlack; + + 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); + Options(skncListItem, sknsChecked).Body.Fill(5, clWhite, $DADADA, $D0D0D0, $E0E0E0); + + 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, $EFEFEF, 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, $7E99A9, $7E99A9, $D2FBFF, $D2FBFF); + Options(skncToolbarItem, sknsPushed).Body.Fill(7, $70BAFC, $59A5F3, $388FEF, $64CDFD); + Options(skncToolbarItem, sknsPushed).Borders.Fill(1, $65818E, $AEBDC3, $34CFFF, $34CFFF); + Options(skncToolbarItem, sknsChecked).Body.Fill(7, $A8D6FE, $61AFFC, $329BFB, $ACF0FF); + Options(skncToolbarItem, sknsChecked).Borders.Fill(1, $65818E, $AEBDC3, $34CFFF, $34CFFF); + Options(skncToolbarItem, sknsCheckedAndHotTrack).Body.Fill(7, $70BAFC, $59A5F3, $388FEF, $64CDFD); + Options(skncToolbarItem, sknsCheckedAndHotTrack).Borders.Fill(1, $65818E, $AEBDC3, $34CFFF, $34CFFF); + + 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/SpTBXLib/Source/SpTBXDkPanels.pas b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXDkPanels.pas new file mode 100644 index 0000000..e9231d3 --- /dev/null +++ b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXDkPanels.pas @@ -0,0 +1,3431 @@ +unit SpTBXDkPanels; + +{============================================================================== +Version 2.4 + +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 TSplitter or a TSpTBXSplitter on the Form. + +History: +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; + FLoadedBarSize: TSize; + FLoadedDockPos: Integer; + FLoadedState: TWindowState; + FManualSizing: Boolean; + 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 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 + FMouseSplitControl: TControl; + FMouseActiveControl: TWinControl; + FMouseBrush: TBrush; + FMouseDownPos: TPoint; + FMousePrevSplitControlSize: Integer; + FMouseDownOnGrip: Boolean; + FMouseOverGrip: Boolean; + FMouseLineDC: HDC; + FMouseLineVisible: Boolean; + FMousePrevBrush: HBrush; + FMinSize: Integer; + FMaxSize: Integer; + FNewSize: Integer; + FOldSize: Integer; + FSplitLinePaintingPos: Integer; + FRestorePos: Integer; + FAutoCalcMaxSize: Boolean; + FMoving: Boolean; + FGripSize: Integer; + FGripHotTrack: Boolean; + FOldKeyDown: TKeyEvent; + FResizeStyle: TResizeStyle; + FOnDrawBackground: TSpTBXDrawEvent; + FOnMoving: TSpTBXCanResizeEvent; + FOnMoved: TNotifyEvent; + FSkinType: TSpTBXSkinType; + 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 + 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 SpTBUpdateAfterLoad(const OwnerComponent: TComponent); +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, 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 TSpTBXToolWindow registry values. Do not localize! + rvMultiDockWidth = 'MultiDockWidth'; + rvMultiDockHeight = 'MultiDockHeight'; + rvFloatingClientWidth = 'FloatingClientWidth'; + rvFloatingClientHeight = 'FloatingClientHeight'; + rvRestoreSize = 'RestoreSize'; + rvState = 'State'; + +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 + 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; + +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; +// Resize the DP to NewSize, if ProportionalSizing is true the +// remaining pixels are distributed proportionally, if it's false only the +// inmediate sibling is resized. +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 not IsDPSiblingAdjacent then + SpDPUpdateDockPos(MultiDock) // Update all DockPos when DP and DPSibling are not adjacent + else + 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; + 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 SpTBUpdateAfterLoad(const OwnerComponent: TComponent); +// 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 + I, J: Integer; + M: TSpTBXMultiDock; + DP: TSpTBXCustomDockablePanel; + L: TList; + Sz: TSize; + R: TRect; +begin + // Update the size and position of the DPs after calling TBCustomLoadPositions + for I := 0 to OwnerComponent.ComponentCount - 1 do + if OwnerComponent.Components[I] is TSpTBXMultiDock then begin + M := TSpTBXMultiDock(OwnerComponent.Components[I]); + 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; +end; + +procedure SpTBRegLoadPositions(const OwnerComponent: TComponent; + const RootKey: DWORD; const BaseRegistryKey: String); +begin + TBRegLoadPositions(OwnerComponent, RootKey, BaseRegistryKey); + SpTBUpdateAfterLoad(OwnerComponent); +end; + +procedure SpTBRegSavePositions(const OwnerComponent: TComponent; + const RootKey: DWORD; const BaseRegistryKey: String); +begin + TBRegSavePositions(OwnerComponent, RootKey, BaseRegistryKey); +end; + +procedure SpTBIniLoadPositions(const OwnerComponent: TComponent; + const Filename, SectionNamePrefix: String); +begin + TBIniLoadPositions(OwnerComponent, Filename, SectionNamePrefix); + SpTBUpdateAfterLoad(OwnerComponent); +end; + +procedure SpTBIniLoadPositions(const OwnerComponent: TComponent; + const IniFile: TCustomIniFile; const SectionNamePrefix: String); +begin + TBIniLoadPositions(OwnerComponent, IniFile, SectionNamePrefix); + SpTBUpdateAfterLoad(OwnerComponent); +end; + +procedure SpTBIniSavePositions(const OwnerComponent: TComponent; + const Filename, SectionNamePrefix: String); +begin + TBIniSavePositions(OwnerComponent, Filename, SectionNamePrefix); +end; + +procedure SpTBIniSavePositions(const OwnerComponent: TComponent; + const IniFile: TCustomIniFile; const SectionNamePrefix: String); +begin + TBIniSavePositions(OwnerComponent, IniFile, SectionNamePrefix); +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; + + 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; + FManualSizing := 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 + FManualSizing := 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 + FManualSizing := 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 + FManualSizing := 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; +begin + inherited; + + if Floating and Assigned(Parent) then begin + if IsVerticalTitleBar then begin + // If the Panel is left/right aligned + Parent.Constraints.MinWidth := FPanel.Width + GetFloatingBorderSize.X * 2; + Parent.Constraints.MinHeight := 0; + if (FState.DockedState = wsMinimized) and (Parent.ClientWidth > FPanel.Width) then begin + FState.DockedState := wsNormal; + FOptions.SetupButtonIcon(FOptions.MinimizeButton); + end; + end + else begin + Parent.Constraints.MinWidth := 0; + Parent.Constraints.MinHeight := FPanel.Height + GetFloatingBorderSize.Y * 2; + if (FState.DockedState = wsMinimized) and (Parent.ClientHeight > FPanel.Height) then begin + FState.DockedState := wsNormal; + FOptions.SetupButtonIcon(FOptions.MinimizeButton); + end; + 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; + FManualSizing := 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 + FManualSizing := 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; + + 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; + AcceptDock: Boolean; + 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 + SetCursor(LoadCursor(0, IDC_NO)) + else 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; + 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; + + MultiDock := nil; + AcceptDock := False; + if not PreventDocking then begin + MultiDock := SpPtInMultiDock(CursorPos, DockList); + if Assigned(MultiDock) then begin + AcceptDock := True; + MultiDock.DoRequestDock(MultiDock, Self, AcceptDock); + end; + end; + + if AcceptDock 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; + OldCursorPos := CursorPos; + end + 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 FManualSizing 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 FManualSizing 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; + R: TRect; +begin + if PaintStage = pstPrePaint then begin + PaintDefault := False; + + DefaultPainting := True; + DoDrawCaptionPanel(ACanvas, ARect, pstPrePaint, DefaultPainting); + if DefaultPainting then begin + R := ARect; + if Docked and not Floating then begin + // When the DP is not floating draws the TitleBar borders on the NC area + // Just draw 1 pixel from the left and right, and 2 pixels from the top + if IsVerticalTitleBar then begin + InflateRect(R, 0, 1); + R.Left := R.Left - DockedBorderSize; + end + else begin + InflateRect(R, 1, 0); + R.Top := R.Top - DockedBorderSize; + end; + // R.Bottom should remain the same + end; + SpDrawXPDockablePanelTitleBar(ACanvas, R, True, IsVerticalTitleBar); + end; + + DefaultPainting := True; + DoDrawCaptionPanel(ACanvas, ARect, pstPostPaint, DefaultPainting); + end; +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 := 20; + 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; + MinClientHeight := FPanel.Height; + MinClientWidth := 20; + 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); +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 + // Just draw 1 pixel from the left and right, and 2 pixels from the top + 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; + SpDrawXPDockablePanelTitleBar(ACanvas, ARect, True, IsVerticalTitleBar); + 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.FManualSizing := True; + if SpDPResize(DP, DP.FState.RestoreSize, dprtMinimizeOrRestore) then + PrevRestoreSize.Add(DP); + DP.FManualSizing := 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.FManualSizing := True; + SpDPResize(DP, DP.CaptionPanelSize.Y, dprtMinimizeOrRestore); + DP.FManualSizing := 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); +var + W, H: Integer; + MultiDock: TSpTBXMultiDock; + Splitter: TSpTBXCustomSplitter; +begin + inherited; + // Restore the MultiDock size, use the size of the first DP, since + // all the DPs on the dock should have the same size. + if Resizable and Assigned(CurrentDock) and (CurrentDock is TSpTBXMultiDock) then begin + MultiDock := TSpTBXMultiDock(CurrentDock); + if CurrentDock.ToolbarCount > 0 then begin + with Data do begin + W := ReadIntProc(Name, rvMultiDockWidth, -1, ExtraData); + H := ReadIntProc(Name, rvMultiDockHeight, -1, ExtraData); + end; + + Splitter := MultiDock.GetAdjacentSplitter; + 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; + end; + + // 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); +var + MultiDock: TSpTBXMultiDock; +begin + inherited; + // Save the MultiDock size, use the size of the first DP, since + // all the DPs on the dock should have the same size. + if Assigned(CurrentDock) and (CurrentDock is TSpTBXMultiDock) and + (CurrentDock.ToolbarCount > 0) then + begin + MultiDock := TSpTBXMultiDock(CurrentDock); + with Data do begin + WriteIntProc(Name, rvMultiDockWidth, MultiDock.Width, ExtraData); + WriteIntProc(Name, rvMultiDockHeight, MultiDock.Height, ExtraData); + end; + end; + + // 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: 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; + + 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 + + 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/SpTBXLib/Source/SpTBXEditors.pas b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXEditors.pas new file mode 100644 index 0000000..ffa1b32 --- /dev/null +++ b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXEditors.pas @@ -0,0 +1,3538 @@ +unit SpTBXEditors; + +{============================================================================== +Version 2.4 + +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: +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; + published + property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify; + end; + + { TSpTBXEdit } + + TSpTBXEdit = class(TSpTBXUnicodeEdit) + private + FHotTrack: Boolean; + FSkinType: TSpTBXSkinType; + FMouseInControl: Boolean; + 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 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 + FAutoItemHeight: Boolean; + FFontChanging: Boolean; + FHotTrack: Boolean; + FInternalItemHeight: Integer; + FMouseInControl: Boolean; + FMouseInDropDownButton: Boolean; + FMouseTimer: TTimer; + FSkinType: TSpTBXSkinType; + FOnDrawBackground: TSpTBXDrawEvent; + FOnDrawItemBackground: TDrawItemEvent; + 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 + procedure CreateParams(var Params: TCreateParams); override; + procedure CloseUp; override; + procedure DoDrawBackground(ACanvas: TCanvas; ARect: TRect; 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 GetMouseInDropDownButton: Boolean; + procedure InvalidateFrame; + property MouseInControl: Boolean read FMouseInControl; + published + 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 OnDrawItemBackground: TDrawItemEvent 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 OnDrawItemBackground: TSpTBXDrawListItemEvent read FOnDrawItemBackground write FOnDrawItemBackground; + end; + + { TSpTBXCheckListBox } + + TSpTBXCheckListBox = class(TTntCheckListBox) + private + FHotTracking: Boolean; + FHotTrack: Boolean; + FSkinType: TSpTBXSkinType; + FChildFocused: Boolean; + FOnDrawItemBackground: TDrawItemEvent; + 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 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 OnDrawItemBackground: TDrawItemEvent 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 } +function SpFocusEditItem(Item: TTBCustomItem; View: TTBView): Boolean; +function SpStartsTextW(const ASubText, AText: WideString): Boolean; + +{ Painting helpers } +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 } + +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 } + +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 SpIsWinVista 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; + +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; + 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 then InvalidateFrame; + end; +end; + +procedure TSpTBXEdit.CMMouseLeave(var Message: TMessage); +begin + inherited; + if FMouseInControl then + if not Focused then begin + FMouseInControl := False; + if FHotTrack 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.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 + inherited; + if BorderStyle <> bsNone then + if SpTBXSkinType(FSkinType) <> sknNone then begin + if FHotTrack then + HotTrackFrame := FMouseInControl or Focused + else + HotTrackFrame := False; + SpDrawXPEditFrame(Self, HotTrackFrame, FSkinType, False); + end; +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; + 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; + +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; + Canvas.Font.Color := CurrentSkin.GetTextColor(skncListItem, SknState, 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.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.DrawItem(Index: Integer; Rect: TRect; + State: TOwnerDrawState); +var + Flags: Integer; +begin + // Draw the item text + if Assigned(OnDrawItem) then + OnDrawItem(Self, Index, Rect, State) + else begin + Flags := DrawTextBiDiModeFlags(DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX); + Inc(Rect.Left, 2); + SpDrawXPText(Canvas, Items[Index], Rect, Flags); + end; +end; + +procedure TSpTBXComboBox.DrawItemBackground(Index: Integer; Rect: TRect; + State: TOwnerDrawState); +begin + // Draw the list items background + if Assigned(OnDrawItemBackground) then + OnDrawItemBackground(Self, Index, Rect, State) + else + SpDrawXPListItemBackground(Canvas, Rect, odSelected in State, False, odFocused in State, SkinType); +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.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); + ButtonR := R; + ButtonR.Left := ButtonR.Right - ButtonWidth; + + 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 SpIsWinVista 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; + + case T of + sknNone: + begin + InflateRect(ButtonR, 0, -1); + OffsetRect(ButtonR, -1, 0); + end; + sknWindows: + begin + InflateRect(ButtonR, 0, -1); + OffsetRect(ButtonR, -1, 0); + end; + sknSkin: + begin + SpDrawParentBackground(Self, ACanvas.Handle, R); + InflateRect(ButtonR, 0, -2); + OffsetRect(ButtonR, -2, 0); + end; + end; + + 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; + InvalidateBorders; + end; +end; + +procedure TSpTBXListBox.CMMouseLeave(var Message: TMessage); +begin + inherited; + if FHotTrack and FHotTracking and not FChildFocused then begin + FHotTracking := False; + 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, Canvas, ARect, Index, State, pstPrePaint, 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, Canvas, ARect, Index, State, pstPrePaint, PaintDefault); +end; + +procedure TSpTBXListBox.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); + + // 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 + if not UseRightToLeftAlignment then + Inc(Rect.Left, 3) + else + Dec(Rect.Right, 3); + SpDrawXPText(Canvas, Items[Index], Rect, 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; + Canvas.Font.Color := CurrentSkin.GetTextColor(skncListItem, SknState, 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 then + if 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; + InvalidateBorders; + end; +end; + +procedure TSpTBXCheckListBox.CMMouseLeave(var Message: TMessage); +begin + inherited; + if FHotTrack and FHotTracking and not FChildFocused then begin + FHotTracking := False; + InvalidateBorders; + end; +end; + +procedure TSpTBXCheckListBox.WMSpSkinChange(var Message: TMessage); +begin + inherited; + InvalidateBorders; +end; + +procedure TSpTBXCheckListBox.DrawItem(Index: Integer; Rect: TRect; + State: TOwnerDrawState); +var + Flags: Integer; +begin + // Draw the item text + if Assigned(OnDrawItem) then + OnDrawItem(Self, Index, Rect, State) + else begin + Flags := DrawTextBiDiModeFlags(DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX); + // Add a margin to the rect + if not UseRightToLeftAlignment then + Inc(Rect.Left, 2) + else + Dec(Rect.Right, 2); + SpDrawXPText(Canvas, Items[Index], Rect, Flags); + end; +end; + +procedure TSpTBXCheckListBox.DrawItemBackground(Index: Integer; Rect: TRect; + State: TOwnerDrawState); +var + ACheckWidth: Integer; + R: TRect; +begin + // Draw the checkbox, background and focus + if Assigned(OnDrawItemBackground) then + OnDrawItemBackground(Self, Index, Rect, State) + else + 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; + +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); + + if not UseRightToLeftAlignment then + Inc(rcItem.Left) + else + Dec(rcItem.Right); + SknState := CurrentSkin.GetState(not (odDisabled in State), False, odSelected in State, False); + Canvas.Brush.Style := bsClear; + Canvas.Font.Color := CurrentSkin.GetTextColor(skncListItem, SknState, 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 then + if 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/SpTBXLib/Source/SpTBXExtEditors.pas b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXExtEditors.pas new file mode 100644 index 0000000..339ef72 --- /dev/null +++ b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXExtEditors.pas @@ -0,0 +1,1051 @@ +unit SpTBXExtEditors; + +{============================================================================== +Version 2.4 + +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: +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 CreateWnd; override; + procedure Click; override; + procedure CloseUp; override; + procedure DropDown; override; + procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + property MRUCount: Integer read FMRUCount; + published + 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); +procedure SpCalcMaxDropDownWidth(Combo: TSpTBXComboBox); + +{ 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, 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; + +procedure SpCalcMaxDropDownWidth(Combo: TSpTBXComboBox); +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 := Sz.cx + GetSystemMetrics(SM_CXVSCROLL) + 150; + if Combo.Width < MaxWidth then + SendMessage(Combo.Handle, CB_SETDROPPEDWIDTH, MaxWidth, 0); + finally + C.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 + TSpTBXColorEdit(Owner).UpdateTextFromValue; + 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; + 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); + FFontNamePreview := True; + FFontPreview := True; + FMaxMRUItems := 5; + AutoItemHeight := False; + ItemHeight := 23; +end; + +procedure TSpTBXFontComboBox.CreateWnd; +begin + inherited; + FMRUCount := 0; + {$IFNDEF UNICODE} + SpFillFontNames(Items.AnsiStrings); + {$ELSE} + SpFillFontNames(Items); + {$ENDIF} + SpCalcMaxDropDownWidth(Self); +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; + +destructor TSpTBXFontComboBox.Destroy; +begin + FreeAndNil(FPreviewWindow); + inherited; +end; + +procedure TSpTBXFontComboBox.DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); +var + Flags, ImageIndex: Integer; + R: TRect; +const + Spacing = 4; +begin + if Assigned(OnDrawItem) then + inherited + else begin + // Draw the item glyph if the font is TrueType/OpenType + R := Rect; + 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(Canvas, R.Left, R.Top, ImageIndex); + + // Draw the item text + R := Rect; + R.Left := Spacing + FontGlyphImgList.Width + Spacing; + if FFontNamePreview then + Canvas.Font.Name := Items[Index]; + Flags := DrawTextBiDiModeFlags(DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX); + SpDrawXPText(Canvas, Items[Index], R, Flags); + + // Draw the MRU separator line + if FMaxMRUItems > 0 then begin + if Index = MRUCount - 1 then + SpDrawLine(Canvas, Rect.Left, Rect.Bottom - 1, Rect.Right, Rect.Bottom - 1, $C0C0C0); + if Index = MRUCount then + SpDrawLine(Canvas, Rect.Left, Rect.Top, Rect.Right, Rect.Top, $C0C0C0); + end; + end; + + // Show Font Preview Window + if Assigned(FPreviewWindow) and (odSelected in State) then + FPreviewWindow.PreviewPanel.Font.Name := Items[Index]; +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]; + // Add the selected font name to the MRU list + if AddMRU and (Items.Count > FMRUCount) and (FMaxMRUItems > 0) then begin + // Exit if it's already on the list + for I := 0 to FMRUCount - 1 do + if SameText(FSelectedFont, Items[I]) then Exit; + // Add the font to the top and delete the last MRU item if necessary + Items.InsertObject(0, FSelectedFont, Items.Objects[ItemIndex]); + if FMRUCount >= FMaxMRUItems then + Items.Delete(FMRUCount) + else + Inc(FMRUCount); + end; + 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/SpTBXLib/Source/SpTBXFormPopupMenu.pas b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXFormPopupMenu.pas new file mode 100644 index 0000000..12dc2af --- /dev/null +++ b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXFormPopupMenu.pas @@ -0,0 +1,1128 @@ +unit SpTBXFormPopupMenu; + +{============================================================================== +Version 2.4 + +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: +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 + 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 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; + FSizeGrip: TSpTBXPopupSizeGrip; + 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; + 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 + procedure CMShowingChanged(var Message: TMessage); message CM_SHOWINGCHANGED; + procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; + protected + procedure DestroyWindowHandle; override; + procedure PaintBackground(ACanvas: TCanvas; ARect: TRect); override; + public + destructor Destroy; override; + published + property Height; + property Width; + property BorderStyle; + property ShowShadows; + property OnRollDown; + property OnRollUp; + 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); + 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 FSkinType 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; + 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; +begin + Message.Result := 1; + if (csDestroying in ComponentState) then Exit; + + ACanvas := TCanvas.Create; + ACanvas.Handle := Message.DC; + try + R := ClientRect; + + // Draw the background + PaintDefault := True; + DoDrawBackground(ACanvas, R, pstPrePaint, PaintDefault); + if PaintDefault then begin + GR := Rect(0, 0, 0, 0); + SpDrawXPStatusBar(ACanvas, R, GR, sknSkin, 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 then C1 := clBtnShadow; + C2 := SkinManager.CurrentSkin.Options(skncStatusBarGrip).Body.Color2; + if C2 = clNone 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 + 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 } + +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, FFormPopupMenu.SkinType); +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. + 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 + FWrapperForm.RollUp(Selected); +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. + 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; + +end. diff --git a/official/2.2.2+2.4/SpTBXLib/Source/SpTBXGlyphs.res b/official/2.2.2+2.4/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/SpTBXLib/Source/SpTBXItem.pas b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXItem.pas new file mode 100644 index 0000000..e3e30c9 --- /dev/null +++ b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXItem.pas @@ -0,0 +1,9731 @@ +unit SpTBXItem; + +{============================================================================== +Version 2.4 + +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: + - Anchored items on vertical toolbars. + - Toolbar.Stretch property doesn't work, I don't know how to fix it + without changin the sources of TB2K. + http://news.jrsoftware.org/read/article.php?id=8176&group=jrsoftware.toolbar2000#8176 + +History: +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 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 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 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 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; + public + constructor Create(AOwner: TComponent); 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 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 SpDrawXPToolbar(W: TTBCustomDockableWindow; ACanvas: TCanvas; ARect: TRect; PaintOnNCArea: Boolean; PaintBorders: Boolean = True; SkinComponent: TSpTBXSkinComponentsType = skncToolbar); +procedure SpDrawXPToolbarGrip(W: TTBCustomDockableWindow; 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 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 SpIsWinVista 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 (SpIsWinVista 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 SpIsWinVista 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 SpIsWinVista 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 SpIsWinVista 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 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 SpIsWinVista 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 + DrawThemeBackground(ThemeServices.Theme[teMenu], ACanvas.Handle, MENU_POPUPGUTTER, 0, GutterR, nil); + 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 + CurrentSkin.PaintBackground(ACanvas, GutterR, skncGutter, sknsNormal, True, True); + 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 SpDrawXPToolbar(W: TTBCustomDockableWindow; ACanvas: TCanvas; + ARect: TRect; PaintOnNCArea: Boolean; PaintBorders: Boolean = True; + SkinComponent: TSpTBXSkinComponentsType = skncToolbar); +var + R: TRect; + PaintDefault, DrawSkinBody, DrawSkinBorders: Boolean; + TD: TSpTBXDock; + Toolbar: TTBCustomDockableWindowAccess; + IsMenuBar, IsFloatingNoBody, IsVertical: Boolean; +begin + if CurrentSkin.Options(SkinComponent, sknsNormal).Body.IsEmpty then + SkinComponent := skncToolbar; + + Toolbar := TTBCustomDockableWindowAccess(W); + IsVertical := SpIsVerticalToolbar(Toolbar); + DrawSkinBody := True; + DrawSkinBorders := True; + + if Toolbar.Docked then begin + // Try to use OnDrawBackground to paint the background + if Toolbar.CurrentDock is TSpTBXDock then begin + TD := TSpTBXDock(Toolbar.CurrentDock); + if Assigned(TD.OnDrawBackground) then begin + PaintDefault := True; + TD.OnDrawBackground(TD, ACanvas, ARect, pstPrePaint, PaintDefault); + if not PaintDefault then + Exit; + end; + end; + // Paint the Dock background + 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; + if (Toolbar.CurrentDock is TSpTBXDock) or SpIsDockUsingBitmap(Toolbar.CurrentDock) then + TTBDockAccess(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 + DrawSkinBorders := False + else 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; + IsMenuBar := False; + IsFloatingNoBody := False; + if W is TSpTBXToolbar then begin + IsMenuBar := TSpTBXToolbar(W).MenuBar; + if IsMenuBar then + IsFloatingNoBody := Toolbar.Floating and CurrentSkin.Options(skncMenuBar, sknsNormal).Body.IsEmpty + else + IsFloatingNoBody := Toolbar.Floating and CurrentSkin.Options(SkinComponent, sknsNormal).Body.IsEmpty; + TSpTBXToolbar(W).DoDrawBackground(ACanvas, ARect, pstPrePaint, PaintDefault); + end + else + if W is TSpTBXCustomToolWindow then begin + IsFloatingNoBody := Toolbar.Floating and CurrentSkin.Options(skncToolbar, sknsNormal).Body.IsEmpty; + TSpTBXCustomToolWindow(W).DoDrawBackground(ACanvas, ARect, pstPrePaint, PaintDefault); + end; + + if PaintDefault then begin + R := ARect; + if Toolbar.Color <> clNone then begin + ACanvas.Brush.Color := Toolbar.Color; + ACanvas.FillRect(R); + end + else begin + case SkinManager.GetSkinType of + sknNone: + if PaintBorders and Toolbar.Docked then + Windows.DrawEdge(ACanvas.Handle, R, BDR_RAISEDINNER, BF_RECT or BF_ADJUST); + sknWindows: + if PaintBorders and Toolbar.Docked then + SpDrawRectangle(ACanvas, R, 0, SpLighten(clBtnFace, 24), SpLighten(clBtnFace, -32)); + sknSkin: + if Toolbar.Docked or Toolbar.Floating then begin + if IsFloatingNoBody then begin + CurrentSkin.PaintBackground(ACanvas, R, skncDock, sknsNormal, True, False); + end + else + if IsMenuBar then + CurrentSkin.PaintBackground(ACanvas, R, skncMenuBar, sknsNormal, DrawSkinBody, DrawSkinBorders and PaintBorders, IsVertical) + else + CurrentSkin.PaintBackground(ACanvas, R, SkinComponent, sknsNormal, DrawSkinBody, DrawSkinBorders and PaintBorders, IsVertical); + end; + end; + end; + 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; + +//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 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.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 TTntAction then + Result := (Action is TCustomAction) and (FUnicodeClient.Caption = (Action as TTntAction).Caption) + else + Result := inherited IsCaptionLinked; +end; + +function TSpTBXCustomItemActionLink.IsHintLinked: Boolean; +begin + if Action is TTntAction then + Result := (Action is TCustomAction) and (FUnicodeClient.Hint = (Action as TTntAction).Hint) + else + Result := inherited IsCaptionLinked; +end; + +procedure TSpTBXCustomItemActionLink.SetCaption(const Value: String); +begin + if IsCaptionLinked then + if Action is TTntAction 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 TTntAction 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; + +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 TTntAction then begin + with TTntAction(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; + 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); + + // 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 - 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: Widestring; + R, TextR, CursorR: TRect; + PaintDefault: Boolean; +begin + HintInfo := TCMHintShow(Message).HintInfo; + CursorR := BoundsRect; + WideHint := GetHintText; + + // 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; + + // Draw the hint in the HintBitmap + PaintDefault := True; + DoDrawHint(SpStockHintBitmap, HintInfo.CursorPos, CursorR, WideHint, PaintDefault); + if PaintDefault then begin + // 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 + + // Recalculate TextR + 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; + // Draw the hint + R := Rect(0, 0, SpStockHintBitmap.Width, SpStockHintBitmap.Height); + SpStockHintBitmap.Canvas.FillRect(R); + 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 SpIsWinVista 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 SpIsWinVista 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; +begin + Form := GetSystemMenuParentForm; + if Assigned(Form) then + SendMessage(Form.Handle, WM_SYSCOMMAND, TTBCustomItem(Sender).Tag, GetMessagePos); +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 begin + case SkinManager.GetSkinType of + sknNone: + begin + ACanvas.Brush.Color := clBtnFace; + ACanvas.FillRect(ARect); + end; + sknWindows: + begin + if Position in [dpLeft, dpRight] 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, Position in [dpLeft, dpRight]); + end; + end + 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 := SpIsVerticalToolbar(Self); + // 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 := SpIsVerticalToolbar(Self); + 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 + 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; + +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.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 + if HandleAllocated then begin + // 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; + + 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 SpIsWinVista 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; +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; + +//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 } + +constructor TSpTBXTitleToolbar.Create(AOwner: TComponent); +begin + inherited; + CompoundToolbar := True; +end; + +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; + 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); + + // Max position + MMI^.ptMaxPosition.X := WorkArea.Left; + MMI^.ptMaxPosition.Y := WorkArea.Top; + + // Max Size + 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 + MMI^.ptMaxTrackSize.X := MMI^.ptMaxSize.X; + MMI^.ptMaxTrackSize.Y := MMI^.ptMaxSize.Y; + + // Change the ParentForm constraints + // http://news.jrsoftware.org/read/article.php?id=12734&group=jrsoftware.toolbar2000.thirdparty + FParentForm.Constraints.MaxWidth := MMI^.ptMaxSize.X; + FParentForm.Constraints.MaxHeight := MMI^.ptMaxSize.Y; + + 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.Right := FDock.Width + (FloatingBorderSize.X * 2); + 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 + if (TCustomFormAccess(FParentForm).FormStyle = fsMDIChild) then + FDock.Visible := FParentForm.WindowState <> wsMaximized; + 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/SpTBXLib/Source/SpTBXMDIMRU.pas b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXMDIMRU.pas new file mode 100644 index 0000000..a56a45d --- /dev/null +++ b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXMDIMRU.pas @@ -0,0 +1,691 @@ +unit SpTBXMDIMRU; + +{============================================================================== +Version 2.4 + +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: +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 + 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 + S := ExtractFileName(S); + A.Caption := '&' + IntToStr(I + 1) + ' ' + S; + end; +end; + +procedure TSpTBXMRUListItem.LoadFromIni(Ini: TCustomIniFile; const Section: string); +var + I: Integer; + S: string; +begin + Clear; + for I := FMaxItems downto 1 do begin + S := Ini.ReadString(Section, IntToStr(I), ''); + if S <> '' then + MRUAdd(S); + end; +end; + +procedure TSpTBXMRUListItem.SaveToIni(Ini: TCustomIniFile; const Section: string); +var + I: Integer; + A: TSpTBXMRUItem; +begin + for I := 1 to FMaxItems do begin + if I <= Count then begin + A := TSpTBXMRUItem(Items[I - 1]); + Ini.WriteString(Section, IntToStr(I), A.MRUString) + 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/SpTBXLib/Source/SpTBXReg.dcr b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXReg.dcr new file mode 100644 index 0000000000000000000000000000000000000000..c3f2986888938c8b2d1eacc02e5571675cfa1b15 GIT binary patch literal 119936 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 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 + +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); +end; + +end. diff --git a/official/2.2.2+2.4/SpTBXLib/Source/SpTBXSkins.pas b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXSkins.pas new file mode 100644 index 0000000..ec05299 --- /dev/null +++ b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXSkins.pas @@ -0,0 +1,3430 @@ +unit SpTBXSkins; + +{============================================================================== +Version 2.4 + +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: +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: [sknsNormal, 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, cttHTML, cttIdentAndHTML); + + { 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; + 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; + FOptions: array [TSpTBXSkinComponentsType, TSpTBXSkinStatesType] of TSpTBXSkinOptionCategory; + FOfficeIcons: Boolean; + FOfficeMenuSeparator: Boolean; + FOfficeStatusBar: Boolean; + FFloatingWindowBorderSize: Integer; + 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 FillOptions; virtual; + public + constructor Create; virtual; + destructor Destroy; override; + procedure CopyOptions(AComponent, ToComponent: TSpTBXSkinComponentsType); + 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; + + // 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; + + property FloatingWindowBorderSize: Integer read GetFloatingWindowBorderSize write SetFloatingWindowBorderSize; + property OfficeMenuSeparator: Boolean read GetOfficeMenuSeparator write FOfficeMenuSeparator; + property OfficePopup: Boolean read GetOfficePopup; + property OfficeStatusBar: Boolean read GetOfficeStatusBar write FOfficeStatusBar; + property OfficeIcons: Boolean read GetOfficeIcons write FOfficeIcons; + property ColorBtnFace: TColor read FColorBtnFace write FColorBtnFace; + 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; + 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; + 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); overload; +procedure SpDrawXPGrip(ACanvas: TCanvas; ARect: TRect; LoC, HiC: TColor); +procedure SpDrawXPHeader(ACanvas: TCanvas; ARect: TRect; IsFirstItem, 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 SpIsWinVista: 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; + +//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 - CaptionSz.cy) div 2; // Vertically centered + R.Bottom := R.Top + CaptionSz.cy; + case CaptionAlignment of + taCenter: + R.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.Right + R.Left - (GlyphSize.cx + Spacing.X + CaptionSz.cx)) div 2; + TextOffset.X := (GlyphSize.cx + Spacing.X) div 2; + end + else + AGlyphRect.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 - GlyphSize.cy) div 2 + else begin + AGlyphRect.Top := (R.Top + R.Bottom - (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 - 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 - ChildWidth) div 2; + Result.Right := Result.Left + ChildWidth; + Result.Top := (Parent.Top + Parent.Bottom - ChildHeight) div 2; + 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 - 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 - 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 SpIsWinVista 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 + 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: 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); + SpDrawParentBackground(AWinControl, ACanvas.Handle, R); + SpDrawXPEditFrame(ACanvas, R, AWinControl.Enabled, HotTracking, SkinType, False, AutoAdjust); + 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; IsFirstItem, 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; +begin + 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; +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 SpIsWinVista: 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; + +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.OfficeStatusBar := FOfficeStatusBar; + DestOp.OfficeIcons := FOfficeIcons; + DestOp.FSkinName := FSkinName; + DestOp.ColorBtnFace := FColorBtnFace; + end + else inherited AssignTo(Dest); +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; +var + C: TSpTBXSkinComponentsType; + S: TSpTBXSkinStatesType; +begin + FSkinName := 'Default'; + FColorBtnFace := clBtnFace; + FFloatingWindowBorderSize := 4; + FOfficeStatusBar := False; + FOfficeIcons := False; + 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', 'ColorBtnFace', SpColorToString(FColorBtnFace)); + MemIni.WriteBool('Skin', 'OfficeStatusBar', FOfficeStatusBar); + MemIni.WriteBool('Skin', 'OfficeIcons', FOfficeIcons); + MemIni.WriteInteger('Skin', 'FloatingWindowBorderSize', FFloatingWindowBorderSize); + + 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 + Reset; + MemIni := TMemIniFile.Create(''); + try + MemIni.SetStrings(L); + + FSkinName := MemIni.ReadString('Skin', 'Name', ''); + FColorBtnFace := StringToColor(MemIni.ReadString('Skin', 'ColorBtnFace', 'clBtnFace')); + FOfficeStatusBar := MemIni.ReadBool('Skin', 'OfficeStautsBar', False); + FOfficeIcons := MemIni.ReadBool('Skin', 'OfficeIcons', False); + FFloatingWindowBorderSize := MemIni.ReadInteger('Skin', 'FloatingWindowBorderSize', 4); + + 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; + 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 SpIsWinVista) 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 SpIsWinVista 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 SpIsWinVista 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) div 2 - 1; + Y := (ARect.Top + ARect.Bottom) 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 SpIsWinVista 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 := GetTextColor(skncRadioButton, State); + ACanvas.Brush.Color := CheckColor; + ACanvas.Pen.Color := CheckColor; + X := (ARect.Left + ARect.Right) div 2 - 1; + Y := (ARect.Top + ARect.Bottom) div 2 + 1; + ACanvas.RoundRect(X - 2, Y - 4, X + 4, Y + 2, 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 - 13) div 2; + ARect.Right := ARect.Left + 13; + ARect.Top := (ARect.Top + ARect.Bottom - 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; +end; + +procedure TSpTBXSkinManager.BroadcastSkinNotification; +begin + Broadcast; +end; + +procedure TSpTBXSkinManager.LoadFromFile(Filename: WideString); +begin + FCurrentSkin.LoadFromFile(Filename); + Broadcast; +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 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); + Broadcast; + 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/SpTBXLib/Source/SpTBXTabs.pas b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXTabs.pas new file mode 100644 index 0000000..0a37bdc --- /dev/null +++ b/official/2.2.2+2.4/SpTBXLib/Source/SpTBXTabs.pas @@ -0,0 +1,3388 @@ +unit SpTBXTabs; + +{============================================================================== +Version 2.4 + +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: + - Close button in tabs + - Tabbed docking + +History: +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; + procedure BeginUpdateHidden; + procedure EndUpdateHidden; + 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; + 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 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 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, sivtInmediate); + if not Assigned(NextTab) then + NextTab := GetNextTab(False, sivtInmediate); + 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 +// BeginUpdateHidden; + 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; +// EndUpdateHidden; + 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 + // ActiveTabIndex to -1 and click the next tab. + // Update the checked tab on WM_INVALIDATETABBACKGROUND + Tab := Items[1] as TSpTBXTabItem; + Tab.Click; + end + else + Toolbar.FActiveTabIndex := -1; + end + else + SetActiveTabIndex(I - 1); // Prev tab + 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.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.WMSpSkinChange(var Message: TMessage); +begin + inherited; + RealignTabSheets; +end; + +end. diff --git a/official/2.2.2+2.4/SpTBXLib/SpTBXLib-LICENSE.txt b/official/2.2.2+2.4/SpTBXLib/SpTBXLib-LICENSE.txt new file mode 100644 index 0000000..bfea00e --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/DemoProj/.cvsignore b/official/2.2.2+2.4/TB2K/DemoProj/.cvsignore new file mode 100644 index 0000000..9783b61 --- /dev/null +++ b/official/2.2.2+2.4/TB2K/DemoProj/.cvsignore @@ -0,0 +1,5 @@ +*.dcu +*.exe +*.hpp +*.obj +*.tds diff --git a/official/2.2.2+2.4/TB2K/DemoProj/Demo.cfg b/official/2.2.2+2.4/TB2K/DemoProj/Demo.cfg new file mode 100644 index 0000000..6b67b6f --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/DemoProj/Demo.dof b/official/2.2.2+2.4/TB2K/DemoProj/Demo.dof new file mode 100644 index 0000000..d8a22f2 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/DemoProj/Demo.dpr b/official/2.2.2+2.4/TB2K/DemoProj/Demo.dpr new file mode 100644 index 0000000..1697c6c --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/DemoProj/Demo.res b/official/2.2.2+2.4/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/TB2K/DemoProj/Demo1.pas b/official/2.2.2+2.4/TB2K/DemoProj/Demo1.pas new file mode 100644 index 0000000..77c64b9 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/DemoProj/DemoBCB.bpr b/official/2.2.2+2.4/TB2K/DemoProj/DemoBCB.bpr new file mode 100644 index 0000000..9800232 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/DemoProj/DemoBCB.cpp b/official/2.2.2+2.4/TB2K/DemoProj/DemoBCB.cpp new file mode 100644 index 0000000..b4ea3e5 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/DemoProj/DemoBCB.res b/official/2.2.2+2.4/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/TB2K/DemoProj/DemoBCB6.bpr b/official/2.2.2+2.4/TB2K/DemoProj/DemoBCB6.bpr new file mode 100644 index 0000000..28a1267 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/DemoProj/DemoBCB6.cpp b/official/2.2.2+2.4/TB2K/DemoProj/DemoBCB6.cpp new file mode 100644 index 0000000..c762f01 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/DemoProj/DemoBCB6.res b/official/2.2.2+2.4/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/TB2K/GPL-LICENSE.txt b/official/2.2.2+2.4/TB2K/GPL-LICENSE.txt new file mode 100644 index 0000000..45645b4 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Glyphs.zip b/official/2.2.2+2.4/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/TB2K/LICENSE.txt b/official/2.2.2+2.4/TB2K/LICENSE.txt new file mode 100644 index 0000000..47c1846 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Lib/D12/TB2Acc.dcu b/official/2.2.2+2.4/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/TB2K/Lib/D12/TB2Anim.dcu b/official/2.2.2+2.4/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/TB2K/Lib/D12/TB2Common.dcu b/official/2.2.2+2.4/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/TB2K/Lib/D12/TB2Consts.dcu b/official/2.2.2+2.4/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 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%0Aj7z`2p* zN;6%5eelV_r-uOH=E1Fen;v>CzBay&ypFz(zrOsW`$^e=n+JV7si*+6_UZYj7oXnH zrb1MP6el{w$`m>@W*QFg$^C_)}3O%MoHX#s+>ai+h>Mg2K|(Om2HN1vJD?1SKLytjQBKkw8e2pOD@SR3 zsuivgbw7=|sB)d|Qe9MuC>_*I!(A$6TomPENN|oFM}kA@gyNgRnwwVa+23ayAtk32 zJoaoZ8zp#F$z>}pWY!huXM<;s>q=fJC|k;ovZwS+>4}af8Msxb?WVG=?3h{?l=5eX1lv~9pB;X7>f~g82S=DgpT)B`RM=CF-V{D7WkW{J%#(Y5 zxA4<_nV1ph$#tA0Z|ehwYhP&gdiH$2v|x{?jGTc#Qi}S@Qv0Lo$3w5`WQdna0|(ID zwbE0v5&Hx6f$u@!K@IV%FM32rjyY@)T&&21E=Pf!RRdjjprf>Jz>9g*Kr$oxAD|pksLtmTvwd>BPu~XMbbSUG| z9VO0*lYq{mr{`ero`P+!CSpsp*9hxQ9xv0=+OUqcpNEf59-ln9Ai`lCowKLrFX<39 zu1me~yzLUrgwFH!ieO0{JwCgpY)Y4X6L{OBY+ASeru*iGvKie;CiM1}vRU1BCj7Qf z*_^JFiM$;$BD=2J$wc3Zl-ZwzQx^KPVpQj&&!xrmmxNQg1Z? z&UGFmhFRCObf+lz2wvBn0cC}j=wsc5u51jMcg#j>Xk=%k=km<%DkL(Zv#Y#DuBmJ5 z_7v*3soQ7vcSj3{Sykm90dMK5%2$C&J=7RxTlav-w{_R%$XIUdZ0zJw`u*gai#L|H zyZACpUvmcHHl!V0m{{uRM7>2Hp#k@Fx4I||??%_xDSEr!sgDypq>t+p1P|+D`jnm? z2_|XS5rX5^T1ubRuTiH7eFstvL8cpq?64EJr4C#L32*dM)c|k9kT+}^`ootKSAi;v zRZ@6*($t^%EVK35=6qzKyEGI|6K6$ChFyJzvRlZO^f{5Vv7;{ycirc>KuY<9j>NO8 z9}>TeUUv1-%yy=f*~#o?PBMu%sW+K7S<=Fue$!B1s4x5>vAL(O>+|@qatj|FE*N{p zjH^47qk-<}tNQgp=0N{PM7XN|4`jSm;CtrFq1({z!XFd-K)=ECsjmk*fkVbaUH>QK z(d+tJupYdA{vV0gy1r#d81qE3u0Pdp4%&nugMty$sje>$s`~mZBc8+@F}ozIB%5R* z;*maXY7ZOD7PD&3n>Wox^O1R*ba9NwO?E@T5H^%(fG7IC-ed3?{u8qx6n3buCcH_= zP-E8)+u*g%a%af(g-4LYIi^6`aE^;#ySVfDS|JY)uv9V9jk4da=y z=ZnmiXO%ho+@G3YbkyIU(J(!RgXzG+pAWLtY2U(MP}XNSGG5*twMnnWP;75=ZbjbD$QDerKMG-gqYKA_(9=&edqo$;u|3YlE4Eto# zEi}6V13e&B2M8C21Ily^it+!U>n~S^+^iBP%&Q^KTI2D5rN&o=|3+fJHe^G8^)ACM zGbqMgW7VV#8;384JLV&6U}VT%BTntc;%tARPK52oh_OL16&$V`k0|RjhK&j1e<#`r z<6jSwV?r(%qw_4PD;TegH^y6IYxri^Vm>u1mX76QfU#q2l0_7ZCF2f8*&>45#E9{4 zh`BxE;ruCCTg|vLRdbgFJ`Nu{e|m=%lrR>!k%Me zb^2iXa`qtPTL>)dFLdvJ<^K(?0{nOX-{8NesWc!$1iJUn$dFsc>#40^^u6+X9b%yc zJL?$#k;dFHesz$1jgoWYKMj(97y!>{v?PQpYSuGu`))sE*Q0vIvgK&PIe9o4aMq@7 zJjR*$%r!}*XAGNSrnad^Eqg|z>4u;;#(=40>X>ec%q=c|R81EIzh&@!(+AtlPPE22? zNuioHVv||ZxSius`NqPY4c?!^)0H4n|3~Ey?n}?swrctm<~+c;ja1C zykl)y&#m7koV020gU-v8j*!x(_H@dZ$2z_D!RfQh4oOCt2%tE>3HXf zk}xLhiL;MGtU62_6^FNnRd)S(8`p7fhMl;OyJ_CSm0TYl^qvdUFRgyJZ(3~4DGf(i zDc51`(E{OC~s%{Jyty|VJYrr11N9{XfyJO|CB&$y0 ziWhe}+<}uyQ?|`6180dLu0Nb3(9Likf>PBDhDOar6DE({ z>@%m$8S@swRWn^I-Zo*ftLB6`#cE0>Ob;4g6m1B&%V?IVK^{?2#ayA@Hj&vQiUo7Y zTs0q<_X(lMt|?auUNrAB_yLh8NdX_A8lzSx5=Z76bAwtn&1dFI^AWXbnLFkSbJu)K zty;)lqHtwC8PuJdduY=f6t2wID6+-41vhKAq$~%PHm*wMAW=qHUY?ct%CV z60mfrwZ-DJL@hDPIdyNhcq~541@&mRge(zOLpQLoR9c!Nt&#S~)yVaTXfxWH<0Z!x zqjybYQkKCPN$-aXcw9mk%{DAO_l^73-FGYO9fQ2Z$ew)X0k_=cZruf3ghM|AGTn)- zumz84)5~Y8$7==Y@&{E{->>Sdo~+qf`-0`ht+L#frSHCFZ1w54Y#AD6iHKW@+=0bz zi`df4E)Oiq093OyEXE&XEyEbiAxyar_`uK`7SU?K;IBuVwzREc+qFkWH-;fZPF3@i zo?5z={4loHZA;R+VZF5GY#X*?Sa%49oFB&ax^2nW_H2i?hV96v*nReZ{R$PhAC-QHlpmi=gSYpgStA2tw) zwDr(lA8i1%3t)H50}>`o63fA80ywxI(Z=nJt?|QgI;F}FTg}{=rDmt=9H(P#T=t+2 zY&dPO1k^)ya~M02OH0!l9T~ETHU-MI*z7jdR-lS5hDcL*?9O9Xig?<$9$V9c%%wF$nX0v6 z%@UUf*1EN8%@LP}fSn*tJ+pRT3SBE(BCo7%o5emfdN_77R+>?}fyLB4H1Wj{eM@yrX(fX(YquM2rh$9_l0#_=%BTydT{$O4YRPD4?1{DV|*gbpI zeqcYeE2GKL^yuE8qGqczOC}TV!jiA;`-6&-ZQoY4ZH^Vkw#EkTyGmjgabk8bvTi@1 zf`T)*+DP7hNKF(#^Y#n73S)?l$Hw#Ho8z?sRuO%wqxAunI=VI59`%hS$5L1mnqwDZ z4HAqp5*SM`V0vtGtTMJYc0}S+Mna?2(F4qgdLd}gM+x8Y_ z*o8ejx-ps`JsNFN-^LN&Xm<2sv^5O>Zyeb|y>T>#iE>KRj3XE0n`%MbR!i!xN)zfz zZBqrgh|`g?k+dyi%i_9I9cwV#s(IY)Bi zh4JFxAZjEKtcL^3Cm+3`*egF0osC70lXTdy#SZ08N9^}IE9a>`z7T<(^vI#3_-P;C z%|ZY((syi56eb3{rz`ks#g??CY-QVlt%m;x!(;E`noXQ&Gs~L2Zl}3`P#45Qc!HC` z4B3HA_Uy6I!T3D(l6}|SwMRyynEIiy=vZrPz*-5IyWgiXaIFKml^8x@x5kX)sqy{s zOZZd@*mgkq2DHyc!(&;vPy2X!yo2|gv1`Hei4C0()z0 z8&mBXx7o<7^6G$YjN#Loa0E_oz-wY`AoTQTbSyR&AG3_p)8E8+b^Ktw!l-509C+t7 z2J>gY%YaU2^c<7odb9_6mNBNNBV-d;ZbIXk@$K>QcuCz?2kM|%M#u=9$KDBQ(9Ol@ zC0b=5ygaWQDmSITC@gBa}?vK zj(5i^Y69c~CRsxMiH0(z;9z3S+=F^BfN7lF>;){h9IXcpX!?uek)}-q>s4!1D0fCpKE0%*PRaR4umg{25?pc47d_VKK zL_GckyTIwkcUK|i(~2quomc?tIX)G)H+_KIB+)b#_67W-(7VVXEvGQ zR7aPhJ?@J9Y1~1t1YVP$CELh2vW^>CvbnP3meRaq$I++NV$)G_lpPgE-7#cFaSO#= z$ARO}(Z@UE*v#Oy!pp~j_>lOEaK&YZ>b_Yz{HXi!!7BvDIEAPHb918QI>p#7r~1Mu z?4yDg5xb8qxXc%Ma{0vhsqYQjQPv%2j-)F&a}L`+pWE~s1J?n?OgwoejAkr0$LI_1 zx#1;7&xD04PEfQHS1mN9iD8*g%@|P&@CzV0sc=dhI&K|4GYvk(e#6u#J+VHKpPCxgA$T0OxQgEPmHy~+cJ2YgkB(>NHRc*xT;TFPxL16deuaK zB2670O`J`10LoA&N66Alx|zsQ-SNZ)E9M4;OIBDXx+frWJ5i8!L>!@=O@t>mf|skc zwek}MM-c_-lsx6d#O1{4YJ0W2+E_bUYpr$TxA8-^|Gk*V_)ZzTwbqGu<5#FDNL#co zxSS|2wie4vdrR%rqqU7h>qX_|xlRY&T}}|>CU(vobQdfqU^;1M)mex6G@V1PbLOD0 zSWTVP9H8zDHF)nFd|po|{*eF3f4ypncGk{cI|YG32l4=9?PBe6&CZj(_a@HfdaLJa z=Q@d;Gx|E7tfH4QXUA!A`EYQ5u9NR-8k2R@v`|Mir5Tm=b~|DBm;Eh&fAu(exmNtd zi7!_4HT{Y1TArz6ljP`}3{NH|uf*Sn@}iTm$>ij_%7& z*uMje_+t1PQ!cP1a{_9^gjL_wx?;ab}$bXUKI-BoJ*oPbg!=G3y@DvNM&CsP+kN zcRHQbcbS8CnZtLP+PjR0rzphfEc$(Sxh;Q_x(hgy&J>i`G9$zeAe(lUzTd^^09bO8 z4{1R;qRZ)On-L!eaOm5^vG0&ebXicqK%LY@*jaWSJG;*FL7@VS zOXmeCD2(id6CW%9Z(-;5+$CW|oGNP3JT2%+XWCov zwdZk($@nWfvr&9K0VYs!rkM@yVN@4rx$Qp)+E*i=utl@u^dX+1 zxTWqtTPlSsEAy8xia0GZqF!$!WCRbO7kF|WlAO1@@sYr zId_$+wq3if9IM)OIlZN|qO_xd@&^SE!}HPao-4!(VGHc9;kpFx*RBX&2IY=jv|dFm zn0Y72T)Mib8$?u8E=}!BwXv9aurQ?8av2rhy@GCmQpDTbiBt9|bt;Z8Sz+5TwZ*K>K9yn!X+rSf)$j0BOVD8y;i=Tr`E-_5 z=BP4`x586X8w`*qz{XS&A4AxrL2XWLPZ6_h+rBwdfTX7rR7I%f=?Gd}DQxq5M6T2kS?$q@Z-h?Ju zbfyldJ*T=4Em&szXl+4{Dqi`ov-S=8jku3l;e?1K-Sj1g7Hd{>pAsnVrjJ0hNtXrp z4vU8l+-HO0uA4%nLwASh7u{u6q=*UcrGkO7n;nE4y9=KEX?g~s`r>mWy8PS)>+_O2 zz}F4jE%y}zTod5jO&_N?Wyfe;_YJGKC6+86J3jbIb}Cv?B=b=y<3q;I;P{RTIQEo1 z`yL}@3m$ssWSf~p!Lx-gtU-!^lo+Jp*Bw}JS!`swjIS7BN+Z=FU7yY|v~~KeOlJstf4VVUVUA>f zIzQ)GIC&UdElNImOwpJ=x_^BC{C?zNQBp->d-`-f&nRqKq3e_B)9Lo~`E-k!{ps`` z^M8PSaP#tX@E9C*#6WxcN-i;bm@cyRTlCwTF0sN6<9a4Avr8G{jAy1y}rnV0Eyv3G;I>s6e%4!jcEEBu@76PVnHeV#-i$Bn+rXo=lCS1F@zFhx!8rpl^RC~H z_u8BF4fzjQ>s{};_ewsc=h9^`c8baxt0;SWIHaKC3mW5K6z^Eh`syrVsCaAMb#!+n zpAmsQ4D=EsYA^zO-X@b6ZW4g-2^({VjrtnnK4Lg^lm{bi0Gp(8&MQaDXghU%lYygdxy8-X20eJNiCtOlqyj%?N!qHMxf z@NN0RgaUI$cH4I<2nam}Pb3G=BMXv`p66wJ%JbdiDT`?{kgpMWnZYT~jw)K}gDMbT&R)naz(NIuv)2)#vq^k?79l^-PMP>9*JgSv0?Rnp zUq~`HQ<=RBcBt{iY#&wX-2Pl+j>63X>#|7P9?qW4ZjI2k4>!Devld*XQ0KM>fF7DD zbH+K#+~Cn8J%kJd+w;D~b-a{T$5r3J@(P7FC$r_b_271}x_G_R3UA=b^5&y;e4r5< zzu7b9!OvzpEWN<%;bhgz&=I1*8TPF7WTy(WTlfM9=9zd*TbGLJ%U-29L z7XJ}d6d`GfWp7Yn!T548pyNTs&D@Y*1m>Z?#+>1q|Aee|YwjG3ur+#X?lKU*cXe-l zK0kjlZw#eFo1rG*Y|l}s-Xc1sImK_sZZ+bM`FF98Ji<=$lyG(+)geE-)Vnhm4p+ms zD`LbG2}BZ+YNQ>xyF^o-Qv&P3vwOfi`Wqjkf3!LVe#?J`E<9|kXMW#Z8n{b4%vjIK zaBgw_H+%h_yK$l&gXa~*$iIt0|;nyduz7r5_!4xi>RYKKJJG8mrv=RHEV4S5} z!34F920c`a2d{!Y8^VTEa3i=Gq_sXk@DvIm8=l0ZgL!0kf|cOF2{wa&NGeSSYxl09 ztNc9KdpUF*YK6i!_@)dn_ZgjLFk-_VKNH*q;DCA1M({WorQWi^GH?!pC&3W2qHOT& zVecV3irWlY=F9Wl`RmZo!v4}(xQwqzg_)W*gAtbQ1fwji1Y^w5_JiS1;tWy^o-yBB z4-Ga2Ga30|bUXPi${CUS4{UXn6VWWGd` zC3-JIQjXut0+ zvwX4Kzh8TAlihl=&tK2)Q2*Td{4O=i&z}NRBv2l6Xp3m)=L_?@xDj_aUz^`19yb9f zLc(b#vEBL1KyvfhyR=ODIl<=~I;4d83bkp@pTqTB&f~%h&QRa2Dzv6F-^(TUKi+4O ztP-j*q=uZKaOi-@q+uBq*x*&@keEt`vY{GfGRPdUHgzg)!ccRp`_0h$U3yIIi=iDx zp&DYYwis%LJPYB4!lFHVy4+t$MjCLD?26#P)^``mxLQ`nt+U=jf8l~?bESn#>ZuWG zQt=pf(pn^|!se(&C=H3^6S#>a-AVH2x%y+gpXPAgo_j8aaFt!)(x|@tch#|A2KXNGiw)*sfTDPv=6X;RQH(4nm;Yx~-viTVcHR5ggTH+C!^SqYu?=R1)q1q7#;ftn z7%G8Bw zaaF2N1*xve)1!)|BGr|MLiDKW>iO#Z&i#gTYw6s3&bjB_d+z`HeZKd6w=!vX=6KeJ z144H)X?{cAuTamln8$W;NvHPg8duBm&v&11iFtZMWq9Ts=<}XUZ;3hD?wg<4K)_rH zwk4rwY5$RbH+VOB6jIE)R}B{QYa#!v^vnU{9lOuT)?f-YJ2 zJdZvv!2+6t@~t993mL~?DlH9@CxsWq7kwmohHMqE4U&ev5~l@Q+w*7T=auI*yp6be zUVo0QIo`z5`2d;**l>`x_&yokM^(%p@?d{JNj z=$ne%gQ1ny^Wcm7;IkL!L(4QjAHBF3strZG$HOPXs&V!B))dd=@44K4=V>G?=v5(XER$RyNlAvV%S?Mxq(<1Y z;Ym~VMm=#ZL?KxoGe@FjY(`H#8zg!JG{fiQBTx2?zeNERNbohJ;%RwugN4EJU}cbA z8aYNHBRMWv@oc~GcX--)D#5wu5+mx`vr8GBdm5e_kGvzk1Rfno4rH+Nq+RFn@Y%3D zB(EV8!~K~YWh zMDUBKc*i}k1&g&6+*l0{=7x5M=#RY%oCJeH-m2H%g?cUydc5=|FYDd*=Doo#bmHQm*Bj={P!}em z;-Jmj=XHABU}e4g-m*6=OS!#KMBMg9y3nnQgZ|&96O|eLNF~Z6#N-G!LoNKzdF+i- zp-Na)4~NQl?yBO6r#93aN_i7h8KuEGI^5k*5*NHdT!Bate}C|d3#MfPjg43vl-0rD z4l1ECbmYDBZc*srV4N3dk2k>KV21K95AF^f4V?}ZyjiN<@?gT-qSmYomWH;xHLrrW z6;!qA9=WB?a{^9*r*kq`8v@sIdQX^mep7 z))=d+KE#_Z2cB6KbUaiSH9Chs-*nh(Hb-Wz%U6LghRPXc#QquAjCaOAQ=hrUJ>38bnee9O)AQ89@nGfMLcaVJ zIY!$#biMQ*@_i_2B=0bHyfm|34*UIK|0%D+!!eWrRda-aa_&_OmwAPs)1X1ms(W|% zw6V+GJ?d0$R6v1{F!pyv;)jPzG94SUeWR^!h{r?_rZ2YYWk zGC`L`Hm0gm4X*bMrLP!Kj~HMHgSWGKq&jl$zw`&kv_V5KA3O|}gLk|RydzDLc8oYj z`bS!X_Hk5YrTJKGrJ5YcjA#jo05RMnW*JG2*kmL<;;^E?v619R3UYliksjFqal~6K zHgbip`QXnV2oPUhb(6sJ{@7?@^knpObbst%?0W1R>5q(V1rxZ^5yuy1@QHymE?sVo=f`))_r?n_ z?oom?j6ya?yneqwF_z&0ajR$)S|hR1I4UDMp5t*@6M`OK@s|WNfb0Z8W}weM#tkg zd8G(#kzy`i)}Ie%NXF%J`Q84IKa1I_>hB*5jzz|@6yWxG{C9rW*fA!^o3UF=aLuut z4ZX+Xi;l%7HYT=hSQdydjMMd`9ZJ~aa|K|-(uP|0V1CPBek=NK{W~zWwo7F~!}zJ( z+rgvY9!Yt9$$)1fG?AK2PiAli;ZJBH@%j#?-K>~4J%UdL{jUJF8fo=F+$IL7rv4#Oep2JPr^kcR0YBRg{b>(eaX@4=+)@mXeH1J*{0&* z1JXZt9gh5EB5fe!Sg0=iM^@Cb!|(BXG4u1q#$O>;A17mes?&o1 zm?AmRrD)W|{PNy>&rieU5)F1cdN@|b>|qFeKwZD!=j&n-HVJS2#nD`FJGc`p1rLJR z@k?Ad$GV6ml$KAJ)x_=9X%L5 z9+RI5y`z~?8wTJGR`iR&RUm}9;*?t5I~pCWlC&Smq({#P4UW>V<10sSba&J|b`WR< zGQpjRSg0OSO`r1p^?fg{KA@vQ=}~teGp?H0nk>!kL@p@h%xGea?~pU2`BB4IIvAU( zy-ZH;PdBH_Gc_t)X0!kmYonLc7c!&!Zwk>Gy&^5Lqs7tIXr0g;pSrIJ-RAAkAT*E2 ztXW$!?SWSkeJ~2L^5Of ziQ>e?glf_-xe+>>y_{{%?(jE0)avp+XdhEkYfKSP1yp$IzI*AK3C*BgvAH3oNs9hZ zyPw8nCF%M6?xnmZl&3fKxOXNslb+d_$;@PDP>aNG2KvdBcPhd zOv*3l?ltH~?%|opOl&4TbH=AFPasI8%?0|$om2xm=sntCKk;?~y8#y=c_418t0GR} z)B@oktl#6&j3_#j6ApT8^kfq#2aW>A0Xn;L6`-ZSO9}1=PS7d+Gz}ggj1Kag^Jp1y zgGNF*5TbeSE?|a1O@A;L#5I1byLW;7e3&B9+TjK}6buKW!3fE=0!~;g;0)5Lg#*82 zi?gKu3DR@I|8w~L!B*Q7_`zU>gi^s=P&;`r$yef3&=ZP;&O$e#@>KR^`DG|voIa*9 zq=R)FSEa2Ie@lXC|Ag2Z7#xL(L)?6&)ueyYHF-+ikCy1vcm*R{URY~b#j3OjWN=(M zG#(pIV;HJJ>d+Z!kO|6CZ?;rNIBuNfi+OeOZ1N(Mo7$PW#0P}&?giPq`G4wn!HucL zOPs02Y}0~q8`acRSl;!h#v2n`uryQ;8)j(V+>C@4=e(&6;}?9t zY#2YDNJAsMLW7R^adQZVzA?yS&{YAmFpZ`7^4>}dUx&nLhjGI)w-nWSKt{!OvCkp< zB9$4>TyWuRL7pMU$vSCY$Qkm7v{Q+fN8!C0>|4;qscKHg^YTm3ap!D}>(Ls&K>6Y0tLY%X%mDeuI_WMXzZ()dr*&3~d^ z)A*`P+`PJ*-Q}5IPpDtrE4<_YTW0Q)| zeyAMUd0BjU8QGsZMR_;)xTOZwhAtp12sLs&p-UPiUKGF1xz|L7aZ;^8NFV7X{-mNuX*E}*a@@;NFTUlu}JQ4dM4+^neWl(Ciq zuR_g`fslI0Ic0`9H6W^~{wdpkpbk4SZh)(vGEDuD_G67ubn5bDFnl! z0Ro3dpl)U=JC&c>oAUEWL5g$$D=;C7R0cu@YuksYnWpZh!mk?Ka^uO=>C_GXyY6&q zkMG>8Q@6a&RHq_5p(wf6(8)t{$ITQD62VuzjPuY0xr&!5PNd0ozTDzOmh=b?jC0pNbmEP^_N8osl9Bxyn9)q1Zpo~)$V2U zH?Ov4>FzxZbv#Ot9*TYwKOqoH>D1`7)`)uU|dkh1sHUmy~ZyP z0J#F=5&U}ih8OXcT-9`w6D=yQZQ3!-H!7~_(sXt9HlmulnrqJ0qt3f|}g^ zX)SrKX@l&UWzRt#?rR{W;B;uZpOY?fn_uv7!b@&)+An({&Wmt2#ocr_s(5eu-VVKO zcB30>QgM2BraI%AEzYJQN0BX9djrck)0)Z1s0ViHv)!oJ;&eaO+c>P)=Va20MLauW znBAsiO4IUcd_Hr9mmWJZOJ3$Lz`CBvccVQ^)3jPAW@=zHFiY&pOxg(KW-h_JrHP{( z>(Tynb=oo0#}@>e`YH7S<-0%KHvsR#soc^p55ouY#tMBiSj;#vho|4 z!`breemA=L;k04KJX4;HQn`+%i!+r7UHwLz(O)uk8HrK--b||_ankH=S}{YB?$b(8 z)F$-Wo00cA{?F}Xax=E2;8JJ_dnHUw_dAmWxPEZsOH?eJ`{MhR#D9v1eGQhU#Ec(t z>2z~$CP>oQmY|?B1(YoxIiMmO%$&?P&`NyaKbSd>*ydbw!MTk&^ZfRFbm4g6ke7X? zI$N7N)M)6({RNI_CQ38l1c#(mm&yyW?b&S|B(VhK+ee4?=|P zITZ|@2^({nxh%|L)9umhoR$Y2%o$+aS=gH^!Z`o_+`*iUv(M)o6r+M=usZi<<*Lq| z&)vd;Sa2Z(tNrxKL=|=R(17cwI9GGmbNI#(RnnWO&&>lp6xf_o%+pI0)TwGdJijrY zTyRAjD}F8!>_M}c=jn?D&iOFUKQbSo{JryJoj%4{Tk~;ZCFbcBVUnTv1>px4=Tgx&soFkqp;4OPRtPILzK}bH)xaJPUqQ4w)lF96}m0vdcyGNF=&I zR{e`y|GkBMd?&8dgU**(*jdQqLkLCA8m1RiIn;7-p&9io?#Iqz^o0a6nzXZ!h~kVd z3bJs$coeI|a`6M6`XQx$yg(lafQbmKOAC%@FnY9fv3$hCD-_;XkiQskNxQY?!cnZg za>7GTDbx|APY9fG#yM#ijMAqAqR|Vg%EPD%76fZcq2)_1Q75+&^^1!r>{+zInYWZq zo!cDb21{;X%}~2oTv4z2*RpHnwQxKi|297wwwPOP@`epAwkWD&Q2{G{f|J`R{8JK% zFQyjN4(ec92WGqY;^pG?Vq?*~WLt79xiMd4mJALk7GETWcPX}HCb{I|`C=WCswH|O zA6laEYNLSE;t^h`dok6}6cmAce91w1rjc@Hsn3CS*jTJBx)CkBlwR6ca>DSQu(fDF z@_kGFB%0yb`^9PW^Btbe?oyDy+}~OBiwoFQ=NF5}N5!YJ<0Zd1g{CB1jz@TvPu$4T zF^m+_tHwhpsuF2IEaN5rEPS%}s6^WxFIE?KAy-{)s6GMz7=LcO55KzD;(LVaMFrmn zH5OIeH!P{SZ(h=J-?oIO2DGqki454`If3J3!46Y0a;CC-c+Gkp7@heg6oQjs?na1N zLH;pL#;M@drMo5Da)QwFrN+|j5-uO&9MF<~*%0fCHDf0$Ne7nB8ba=t%*(cA2aGdH zC_Bj-Kt-41%gN=;a*1!y@0L=_f54ynfP9DcbmrwW&uxP;hmptSEvkI~n^+klLP#LB zoLkOu!EMr|xV#TrmwC?ErI;tn)#bYC8&p}#1 zJS!K(RQ%TN+ir}kzSSr{RctSI5{s`~Qtwg!R-ynVw+y#(MN)>?G05mjiSn_ zfSkq7VP3dK6VyQrpACV39II1YdS~lg*;^^B6j!bt*grI(rK}az7X>s(t`+mFcvt)@ zq}2^2t5`{`q(R{#tvb*}cW zx>nt*o>hF-2bEG;$*mSv%d6GZ)3w@KW39E;q`VGMYZSdjtyhNeM<&2`64M^@o>SDFEy0PYjNl+oXs#xonk^HLb9&z6z9#{(%ay$z! z@wS0B)$LGZXVp)PJ;V>n$o^{R9tqzg5sF{n>P3lH1lm;7rI*rbj2MTjTWfI{IbKcN zBguOtMe)nLXic>a(JHHH3Ohx#4H>yu-MU9I_ehqaRe5bR)pY3me07_`uAuD>A$3$r zUPfB0yVNX=)m!jd5KyDCs59NJ#@CW-1(LF@dDe=AIM!TiB^mLo?NjSH!SP_>X>k*P zL>1ObYfUvxfsh6NKQP)|$~@X#${4+zkuh3%WlaBD%=iX7q&y>QTWe)PqHF23BN^FP ztC04jX?kq~0@*cu^d0XP*G@PZ)gzQ3XRC+-O>z+TA6*;?%$ zxx7cN2svFlTdNaN1!C6F_Tg;pYVCGS6?ep)@l<>xZq`s`pRHY!*agyT$jH^&%{_8^ zkK7SbLjp}gE`gZw4SPJmt+j}84KuU~*uDjV9PSbIJ)$L~fgm$Ja*wuJGZ3SRNM;#P z#clV9;~wcFqy>G=8tO}`I1WCef(`L_yq|&$@nGCVh&k?!yJf^5_dLX!O(k@L>xW1f z@u^XrD6w1f8Y#Ks20mJ0?p*T$LcH+|umCWBJQw#Mp~{ZR}m#nzxZ=HXeD1eMvF?@kWnU`&7Wspw+!>4>7NH zQt)d(5`;}5sKuX2T8$>GHHty4k%hD`07IasSwy>O6`mTS+F>cCofTu+Wfs%^RE%nW z%HrB}$|!+MlE^H9m`Oki`b(S2wAL!5wWBPn{bMPs{d@TMazIX7RcdnDR2#?~Ia-yJ z*Cte&yf!70h{y`sO+o)uS=8#q1Fc0WYJb2E0Q=e>!7${46&aSHZdu#TjSYay&_Z;$BoVpR7`6V`o=ML7J97}mYt9!8>3Kuotu2_;|| zEsod;-4hlEBy~@Ol`?l^6#BJTbvz+eVg`CczWNDpC$+G0^$dY+T z7Ij~2-`D-VxUc(+m2{s8CEee#yzc+7BH%#x={urCx6on3RO^GS8xig2a-K&b0JU^U$zuq)k%@IOS@AF*@5weB^w zYD1@!Zge`$txnh0(ETO50o(%aaYl&4ojP-<6Rc)7;Ou7{4xALZwqz&oifz%8y4!omrg<*DGa=hoa_j}jsjtD!X0=U zEo`<$I&kU`=1yWA?QQW6qm<~dx5YZ_EYb0dMF3GiqGJGZ1CSfQXTbyD2fz=29{@i9 zen1)N_!4+uVsSvCV;%lF(ppFOI>OfxZyoX0A+yes9j9%-7B*M*I=mesKFix76*>;| zY_H>joI{Ja*I~A^LPx@m08ck~;coC^gdI45T|0o?5|-@+w%ZFV{SesQBVffoV8yqQ za>@lDp~_<&slZaY4s_PpybYFenxW`|K!=%2tU(_ru`MdN+jazS&JbI(((LZBu{WxGva_N5z|HsU$ zU!Yii#PaLsSWv$xg!G?&gqUHyNsQ=CQc@pQYQlQO1D4eHKVV^fh_p)jcICdly{!m#39t_+>woz@X>UTs0ltfn7A4_6g?^m-1sU!%ns35?eg7QXhXSaYmnGF*O zN(HWux4=>u>`Y~VG)AnUUDO)dCAHxN(*g{{7GRf>TR~8oAqkVL%t36u&}Ts18$_kk zU}AlSXRP1wT8}n$8>||y;rB$Z;a`~B@EZb++n`V~znoeSsfBQXJ!p8sLV&QGcLaGy zk$1%4V^Kg%X2-!!fE@=b0Z1BNQ$wc=8Zm9qDAR_=Y{T$MN*TTn|NCsqfChdlWDJs+ zF$7rF5D;<{LoaL_@Bt!&Qkgd>+qMl>wgbomb}9JR!XEM|7{=R+hIOfE_zv4Me8dWX zlB~u)f)Aj^f#CzTZ}=`dM8f#NW&l9LDss_aH9&yP0Og6HhaE$+Qv(*8O`&Qqisy!L z>B2CjsTr1G^YOp3bL4Sh_?T48<2vsj@Va-eNC~S8XJaZ(v9Jn*f6ZI z8$iSG3FuG68^e!)`<3jL$}GU_BY}}M4LCkz*raMu7~4gav0YLaA2Ss|ZG0>kjO!F+ zMvx6bX5(KloAIxh!}yx&wa;kOIE_ZB-)Iz_#&OmU=rb-dm+=v@5d6l^s4jy>>`#oM z7&Mw#*k}iCXA$EgWyClP8k3|ElcVvAEDj&PgpuHPS&H&_Dx{J12C_~Y-)Cv#x5c#a zW3~aYSBA<#8V^0uIj5_6s@d-PntR4wfqbQvrtE$n*&H(2! zy9V~95g$@A4zWwXm0V?Y=zR^n>&6%C8qgp%h8RkBi|gz+sDxX`>=p76wF!trw!5 zq8RUdSB!SP%i^8yvqYx?uj4j_WT#F_b?P+9&L=DdNOlf@9?+yazbK|V{~5f0X6ep8 zrI>^Rs!yp&b?#!P(s`<68=b$Tfwa}xE@nF0m0QRz1K8?(3i_!s(}}HT=Z8|R^ZS~u z&VOS$ikPK{+p-;9W>I?|@;f5zb!>%dSr$VFiZRxi2?Y5iFx5eAe0d_}HPlaZu zMQU|gM1^USDnw-xMV0AYrZPQ)A7E-zK+wuT1_T)pWI&JsL1qNm0Ep$l*H0WK>`qLN z(Be~m6YpaolTH~j^|FX*frMfvyBIUgv8ZWIh*OeJg@nl{B~5RO3DfVhr0GMJFnuVc zOrKE;q)i&lhUtBA!}OYMn7$)!nf_VYFnN@0i<}LUUx}a$YTSeei;U?flw8&%NjcLa zF>CU%9ESk#Nhxdk3Io8$XfbWlOtfQam+~f`xM%u9&7SG!Y{%qPvV!R~B~wH)CDWu> zGJTPiOdr7i9xIxD$oA!O9H1T!Opn;1>5*_`TBjHl#5gv6O{|#ymK_65O$vNVYE!J5 zESd|`tXMO>FV&FB1&8m0{uK281WoW6=%0c9Iq<(@Rlucb9ZHJVrdMLa^mD0U%06J% zrY#k_k@LGXwTpKs!7ZBO&h(5mW5yO=V!OG)!% zmI9>B0gAbWn^aq7Bg@EASxDs|l{J5b$Ch{(P_C5C8wn!GN(oR1*y+c`2w((#QH6-A0fI6Ux;>F+C`70z0GBL zhj{>Q%K{5p)+soI;4p$imbX~gGRZF-rpCmOo<& zK!$X~kU`9x1x;i58r!zKrftiP#V+P8c4^mQ*X&rn#PXJJuwBastYD$7>ZVXcY9)(N zS+>kcMav2+0S+wdV$t%xcwl*-6)hiv{!l!$e5@&3ehU1j>=1Bd`G^K~#e%kUieW`-r6U)!osbw8XwN))T@yzmxP__J=odM1*d_JjJbjq4#l3iLpdkWRB zphw+elx{3ee2mIcRK4NT2K&wr5NN~Z(Bgjp9-Nj1y>4Apb-krjb$x}YyPi@{ z(RMu%3|&ZnbIRP+E1J8$!5m$m;bVWBQ~h1P(e!2c2Rb~Tlvze}Z+B3<~W z-`~~Lvj{l|FtY8g05$ebmniOZeVOIEs3^j2mn7|VNy^=>Cu|Q;kl7`$_q(LFQrA0d zA8;VE54+mMa#y=_*!6;y0Y}6Zgi05BGfuKsy6o&2aMJbZXQ;{3E|Xa8GD%lm@ixtA zSD%Vqb%j;zv};2po_6i2Se2aXE;RHbq0xo!b9D`{o33HuwhPnCQ{k>lCpEitVzX4rJpPYSi zcB~FqFta+9njJXE&83tIaDc@rG>z}OSwDLRedgG@AXcn>O6l0TuVjaCKyvJgNbLiV zFo9CBX4^ofRqVuyLAEKLS?4t8*58HyZFX+mQL-~DEJ2-FOGS z*7}KXYyID>CWBP7(oWY33p%$}JeOU`4vetfSzrGH;%RNr#$Zb*MT6}c&xkf{8=Rn8 z(%O#I%xOb!5Zd}-ak1a_RpzpNRdCxrrNzc$!_%VeLk5uiw*M~rZCO02*y`x=widQm zHm!;UZKV8E#1>RaQQNsv6SYGn=C!}3 zf$q1ri$Qz46taH=>#rZNkp0h?-~K;X*v>~y1i?`RN9^M)3WyO~FU0Mln6Qh=gx$pA z_P1D4mQF!B4e6Bq2}=Vu>?j+SRXf4EEMv!fg{N%0Bxdb@$hIkxAmGTCfCFF3yuF9* z*dMc9J74AZ>^iYv*C`A3r>tPVQY!cCSmF!h9FXddghRV1m7zr0Ze?YAKzV4NgFnZP zC>RqqihPVBpV*C>ihY?K15N;^a<(|l1tYM6vTC=pGr+lBp5wGozHt;fS2!+$IKSH5|J3H?HEjzy2*G=o4($>v6 zeciYj4-S5A*$c{ESoWgiJ)MkoKYEJZo$L zEY}l2TEcdZ9q>Jtmvh8%5@8QH?jgtBo=H~dc}*2q?7<5nl)r@PDE0WHV$WZ}|0}jH zr+t9550UmE(mv?fJ+a>NUR%8JLlnb~aTalm3sJ|X5@xuV!>CC*{;QaDe2>Ls z0R3~&{|fqFS<10aVq1<;G2{4>lyUrsZ8?6*vJR9$5OPR=8z&34k!{ZLF54mYBO&h) zrCkS}N*xxq3)qvTaRx!a2?S*k(gjB^D>>--YT&>zsX26DL+JQNcHsDbz_F~B9qU8F zrsc>nuBkej_%qMpQn4e)wu+rOJ{^*t;@|imiq{TIxz~;ZrFi2=tAraz4SN_zT!fPs z5qc%EJI62Aq)nr$_e&aE@4tw)Ud90MvGarN+y|ga4@4Clgkxfu(;;FOuf3ZCZemY+0HHpPuld{xnl8U_ptkC=4 zSP5_-$38^tGGZSgb{Vmc5c?3ZkLB1Wh<%FKRm46;>=VSS0?vCs5@7J+q8F!ndqw4C zFTNz-+skTzOF+H1SGewdEuhsKy;kw2*DBriS~ZQ{VRi$!1+);16ci81W~!)EKNQ;( z4||ykpavKo@?bN9Z3uQC*bKG}-~c!u^0K=g+C}$6yVU>Cu5mql&D;+^W&IETiFxJV e5Q2jU_9Hm>@Ea_IU_XK*46PRP$^Q>{`Zmn~ literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4/TB2K/Lib/D12/TB2DsgnConvertOptions.dcu b/official/2.2.2+2.4/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/TB2K/Lib/D12/TB2DsgnConverter.dcu b/official/2.2.2+2.4/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/TB2K/Lib/D12/TB2DsgnItemEditor.dcu b/official/2.2.2+2.4/TB2K/Lib/D12/TB2DsgnItemEditor.dcu new file mode 100644 index 0000000000000000000000000000000000000000..adf0e7890818fd085412f9877253ba132177ee7c GIT binary patch literal 47711 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 Bh1mcA literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4/TB2K/Lib/D12/TB2ExtItems.dcu b/official/2.2.2+2.4/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/TB2K/Lib/D12/TB2MRU.dcu b/official/2.2.2+2.4/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/TB2K/Lib/D12/TB2Toolbar.dcu b/official/2.2.2+2.4/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/TB2K/Lib/D12/TB2Version.dcu b/official/2.2.2+2.4/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 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

xS2GBQ(Qx=>m@v^+si< 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ǪQ`XbA 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 Py|`_;9=ENJ3I6{BL08a( literal 0 HcmV?d00001 diff --git a/official/2.2.2+2.4/TB2K/Lib/D12/tb2kdsgn_d12.dcu b/official/2.2.2+2.4/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/TB2K/Packages/.cvsignore b/official/2.2.2+2.4/TB2K/Packages/.cvsignore new file mode 100644 index 0000000..b86ea9b --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/BuildPackages_D12.groupproj b/official/2.2.2+2.4/TB2K/Packages/BuildPackages_D12.groupproj new file mode 100644 index 0000000..5cf3560 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_cb4.bpk b/official/2.2.2+2.4/TB2K/Packages/tb2k_cb4.bpk new file mode 100644 index 0000000..71a7b35 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_cb4.cpp b/official/2.2.2+2.4/TB2K/Packages/tb2k_cb4.cpp new file mode 100644 index 0000000..65d5caa --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_cb5.bpk b/official/2.2.2+2.4/TB2K/Packages/tb2k_cb5.bpk new file mode 100644 index 0000000..21efbe7 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_cb5.cpp b/official/2.2.2+2.4/TB2K/Packages/tb2k_cb5.cpp new file mode 100644 index 0000000..33d2c2b --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_cb6.bpk b/official/2.2.2+2.4/TB2K/Packages/tb2k_cb6.bpk new file mode 100644 index 0000000..580309c --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_cb6.cpp b/official/2.2.2+2.4/TB2K/Packages/tb2k_cb6.cpp new file mode 100644 index 0000000..79fe10f --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_d10.bdsproj b/official/2.2.2+2.4/TB2K/Packages/tb2k_d10.bdsproj new file mode 100644 index 0000000..5915d11 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_d10.dpk b/official/2.2.2+2.4/TB2K/Packages/tb2k_d10.dpk new file mode 100644 index 0000000..450237d --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_d10.res b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_d11.dpk b/official/2.2.2+2.4/TB2K/Packages/tb2k_d11.dpk new file mode 100644 index 0000000..4ff1052 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_d11.dproj b/official/2.2.2+2.4/TB2K/Packages/tb2k_d11.dproj new file mode 100644 index 0000000..7237486 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_d11.res b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_d12.dpk b/official/2.2.2+2.4/TB2K/Packages/tb2k_d12.dpk new file mode 100644 index 0000000..41f57e6 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_d12.dproj b/official/2.2.2+2.4/TB2K/Packages/tb2k_d12.dproj new file mode 100644 index 0000000..98a3b0a --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_d12.res b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_d4.dpk b/official/2.2.2+2.4/TB2K/Packages/tb2k_d4.dpk new file mode 100644 index 0000000..c4b03d9 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_d4.res b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_d5.dpk b/official/2.2.2+2.4/TB2K/Packages/tb2k_d5.dpk new file mode 100644 index 0000000..28e5be4 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_d5.res b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_d6.dpk b/official/2.2.2+2.4/TB2K/Packages/tb2k_d6.dpk new file mode 100644 index 0000000..ea37a26 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_d6.res b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_d7.dpk b/official/2.2.2+2.4/TB2K/Packages/tb2k_d7.dpk new file mode 100644 index 0000000..bc6fb9c --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_d7.res b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_d9.dpk b/official/2.2.2+2.4/TB2K/Packages/tb2k_d9.dpk new file mode 100644 index 0000000..56949e2 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_d9.res b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_dn10.bdsproj b/official/2.2.2+2.4/TB2K/Packages/tb2k_dn10.bdsproj new file mode 100644 index 0000000..89d1181 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_dn10.dpk b/official/2.2.2+2.4/TB2K/Packages/tb2k_dn10.dpk new file mode 100644 index 0000000..001eaf6 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_dn11.dpk b/official/2.2.2+2.4/TB2K/Packages/tb2k_dn11.dpk new file mode 100644 index 0000000..836af2d --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2k_dn11.dproj b/official/2.2.2+2.4/TB2K/Packages/tb2k_dn11.dproj new file mode 100644 index 0000000..e347261 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_cb4.bpk b/official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_cb4.bpk new file mode 100644 index 0000000..e3fe08e --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_cb4.cpp b/official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_cb4.cpp new file mode 100644 index 0000000..08b9d21 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_cb5.bpk b/official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_cb5.bpk new file mode 100644 index 0000000..2950fbf --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_cb5.cpp b/official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_cb5.cpp new file mode 100644 index 0000000..ba1bbd8 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_cb6.bpk b/official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_cb6.bpk new file mode 100644 index 0000000..1223631 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_cb6.cpp b/official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_cb6.cpp new file mode 100644 index 0000000..6fabfa6 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_d10.bdsproj b/official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d10.bdsproj new file mode 100644 index 0000000..e208fd9 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_d10.dpk b/official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d10.dpk new file mode 100644 index 0000000..6286adf --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_d10.res b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_d11.dpk b/official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d11.dpk new file mode 100644 index 0000000..6ea006f --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_d11.dproj b/official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d11.dproj new file mode 100644 index 0000000..454a446 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_d11.res b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_d12.bpi b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_d12.dpk b/official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d12.dpk new file mode 100644 index 0000000..b3ebd84 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_d12.dproj b/official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d12.dproj new file mode 100644 index 0000000..ea19959 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_d12.hpp b/official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d12.hpp new file mode 100644 index 0000000..0e40bac --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_d12.lib b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_d12.res b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_d4.dpk b/official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d4.dpk new file mode 100644 index 0000000..b9c2f4e --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_d4.res b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_d5.dpk b/official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d5.dpk new file mode 100644 index 0000000..bb80ebc --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_d5.res b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_d6.dpk b/official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d6.dpk new file mode 100644 index 0000000..da87e9e --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_d6.res b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_d7.dpk b/official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d7.dpk new file mode 100644 index 0000000..805b074 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_d7.res b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_d9.dpk b/official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_d9.dpk new file mode 100644 index 0000000..ca4e64a --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_d9.res b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_dn10.bdsproj b/official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_dn10.bdsproj new file mode 100644 index 0000000..149e279 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_dn10.dpk b/official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_dn10.dpk new file mode 100644 index 0000000..418a15d --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_dn11.dpk b/official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_dn11.dpk new file mode 100644 index 0000000..b36d21b --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Packages/tb2kdsgn_dn11.dproj b/official/2.2.2+2.4/TB2K/Packages/tb2kdsgn_dn11.dproj new file mode 100644 index 0000000..621b653 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/README.txt b/official/2.2.2+2.4/TB2K/README.txt new file mode 100644 index 0000000..c8c520e --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Source/.cvsignore b/official/2.2.2+2.4/TB2K/Source/.cvsignore new file mode 100644 index 0000000..a328cf4 --- /dev/null +++ b/official/2.2.2+2.4/TB2K/Source/.cvsignore @@ -0,0 +1,5 @@ +*.dcu +*.dcuil +*.obj +*.hpp +_* diff --git a/official/2.2.2+2.4/TB2K/Source/Icons/TB2DsgnEditorImages.bmp b/official/2.2.2+2.4/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/TB2K/Source/Icons/TTBBackground.bmp b/official/2.2.2+2.4/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/TB2K/Source/Icons/TTBBackground16.bmp b/official/2.2.2+2.4/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/TB2K/Source/Icons/TTBEditItem.bmp b/official/2.2.2+2.4/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/TB2K/Source/Icons/TTBImageList.bmp b/official/2.2.2+2.4/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/TB2K/Source/Icons/TTBImageList16.bmp b/official/2.2.2+2.4/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/TB2K/Source/Icons/TTBItemContainer.bmp b/official/2.2.2+2.4/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/TB2K/Source/Icons/TTBItemContainer16.bmp b/official/2.2.2+2.4/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/TB2K/Source/Icons/TTBMDIHandler16.bmp b/official/2.2.2+2.4/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/TB2K/Source/Icons/TTBMRUList.bmp b/official/2.2.2+2.4/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/TB2K/Source/Icons/TTBMRUList16.bmp b/official/2.2.2+2.4/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/TB2K/Source/Icons/TTBPopupMenu16.bmp b/official/2.2.2+2.4/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/TB2K/Source/Icons/TTBToolWindow16.bmp b/official/2.2.2+2.4/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/TB2K/Source/Icons/TTBToolbar.bmp b/official/2.2.2+2.4/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/TB2K/Source/Icons/TTBToolbar16.bmp b/official/2.2.2+2.4/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/TB2K/Source/TB2Anim.pas b/official/2.2.2+2.4/TB2K/Source/TB2Anim.pas new file mode 100644 index 0000000..96d9756 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Source/TB2Common.pas b/official/2.2.2+2.4/TB2K/Source/TB2Common.pas new file mode 100644 index 0000000..e94bb9d --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Source/TB2Consts.pas b/official/2.2.2+2.4/TB2K/Source/TB2Consts.pas new file mode 100644 index 0000000..fb29db0 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Source/TB2Dock.pas b/official/2.2.2+2.4/TB2K/Source/TB2Dock.pas new file mode 100644 index 0000000..cbc94b1 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Source/TB2DsgnConvertOptions.dfm b/official/2.2.2+2.4/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/TB2K/Source/TB2DsgnConvertOptions.dfm.txt b/official/2.2.2+2.4/TB2K/Source/TB2DsgnConvertOptions.dfm.txt new file mode 100644 index 0000000..a1b062f --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Source/TB2DsgnConvertOptions.hpp b/official/2.2.2+2.4/TB2K/Source/TB2DsgnConvertOptions.hpp new file mode 100644 index 0000000..7e6e41a --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Source/TB2DsgnConvertOptions.pas b/official/2.2.2+2.4/TB2K/Source/TB2DsgnConvertOptions.pas new file mode 100644 index 0000000..5c47a46 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Source/TB2DsgnConverter.dfm b/official/2.2.2+2.4/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/TB2K/Source/TB2DsgnConverter.dfm.txt b/official/2.2.2+2.4/TB2K/Source/TB2DsgnConverter.dfm.txt new file mode 100644 index 0000000..7d2cbaf --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Source/TB2DsgnConverter.hpp b/official/2.2.2+2.4/TB2K/Source/TB2DsgnConverter.hpp new file mode 100644 index 0000000..e172540 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Source/TB2DsgnConverter.pas b/official/2.2.2+2.4/TB2K/Source/TB2DsgnConverter.pas new file mode 100644 index 0000000..e1a2456 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Source/TB2DsgnItemEditor.dfm b/official/2.2.2+2.4/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/TB2K/Source/TB2DsgnItemEditor.hpp b/official/2.2.2+2.4/TB2K/Source/TB2DsgnItemEditor.hpp new file mode 100644 index 0000000..bcf2cfd --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Source/TB2DsgnItemEditor.pas b/official/2.2.2+2.4/TB2K/Source/TB2DsgnItemEditor.pas new file mode 100644 index 0000000..a8b35fc --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Source/TB2DsgnItemEditor.res b/official/2.2.2+2.4/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/TB2K/Source/TB2Hook.pas b/official/2.2.2+2.4/TB2K/Source/TB2Hook.pas new file mode 100644 index 0000000..fbc6f62 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Source/TB2Item.pas b/official/2.2.2+2.4/TB2K/Source/TB2Item.pas new file mode 100644 index 0000000..6891cdd --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Source/TB2MDI.pas b/official/2.2.2+2.4/TB2K/Source/TB2MDI.pas new file mode 100644 index 0000000..09ec768 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Source/TB2MDI.res b/official/2.2.2+2.4/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/TB2K/Source/TB2MRU.pas b/official/2.2.2+2.4/TB2K/Source/TB2MRU.pas new file mode 100644 index 0000000..86f0bca --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Source/TB2OleMarshal.pas b/official/2.2.2+2.4/TB2K/Source/TB2OleMarshal.pas new file mode 100644 index 0000000..fdca5c3 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Source/TB2Reg.dcr b/official/2.2.2+2.4/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/TB2K/Source/TB2Reg.hpp b/official/2.2.2+2.4/TB2K/Source/TB2Reg.hpp new file mode 100644 index 0000000..0344ed2 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Source/TB2Reg.pas b/official/2.2.2+2.4/TB2K/Source/TB2Reg.pas new file mode 100644 index 0000000..3cacb90 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Source/TB2ResCursors.res b/official/2.2.2+2.4/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/TB2K/Source/TB2ToolWindow.pas b/official/2.2.2+2.4/TB2K/Source/TB2ToolWindow.pas new file mode 100644 index 0000000..90d5592 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Source/TB2Toolbar.pas b/official/2.2.2+2.4/TB2K/Source/TB2Toolbar.pas new file mode 100644 index 0000000..2264fd5 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Source/TB2Ver.inc b/official/2.2.2+2.4/TB2K/Source/TB2Ver.inc new file mode 100644 index 0000000..f96696b --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/Source/TB2Version.pas b/official/2.2.2+2.4/TB2K/Source/TB2Version.pas new file mode 100644 index 0000000..f9fb9c9 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/TB2k-LICENSE.txt b/official/2.2.2+2.4/TB2K/TB2k-LICENSE.txt new file mode 100644 index 0000000..47984b4 --- /dev/null +++ b/official/2.2.2+2.4/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/TB2K/tb2k.chm b/official/2.2.2+2.4/TB2K/tb2k.chm new file mode 100644 index 0000000000000000000000000000000000000000..fb55b185d9a1741c0144dacf21b151aa3ab0cfef GIT binary patch literal 84104 zcmeFZWl&v9yDmC$cL^Tc-QC??1Hs)V?(XjH5Fof~aCZw5AOr~(+=3ri`Lb5_-TTzJ z_s6X|KUPzty8C@z>t}S2Ipzz6l&Xq27ytm!f4M+jE;lHW6&P>;0QnKbtK4%MB?lgm zH$wdV2g?6r{;L1luzqy_xBv92$iD{T|LLDzoxZd%$^Q&~O#xD>DvGZX)t3wQRraC} z`qI71o?qIl=(W9$UuCa3Stfw$(i2UiWZ(YE>DBfX|J@YjBxDC6U#0OmXeoH0f~;)4kCY1RnbyW6_W$_o96Sr%v2Q= zr9@OfqMkK^7+TVGO^fs=~4$(Lqpwq;L$R;!>tg7IFp_wjkjxw1FRJ zU>Hahgr%kARa8O33v7}FFc?TRG=zXaJ0lANCkq!7Sqob$;A@8X|0AI2XlHNY=;Z!l zYypn)sv=|J?rP^~{I?zEe-jF;I+~b(gk|cV%KjDYzgUPGI2nM1N6{u*q5n5SIRpEb zIB%G-{~Pj08d8J^3?g>6PA0ZaKzeg?BM?B9DKvwHje(iTU+X~oJvK5oadEV>r8l!M z1qn+LcfkD(n3*^^S=gEZoeUhEOpKZ6?QP9KLZ>l8K>jxx%)c}~V}_{xZ!}nbX{=hs zS^sY|Sbu38X=Dha|IPzw(?ToB`Az|45>{x$TO1*L+YXNln1;@zvJK+5ZJDJ$L68N%5OdNly#PRyG{TW+M zR7%po*4X+to($$Mg87FFIc2qf{Kq@^^ZyxM(azr4Ue3hU`Iqk~7k{-sZB^~;tPKtR z6F6MKU;WR(ub_s7t+Ac!FXKoue|Z zv$40c{k12YY(N5oG^1=$e}l$$PPQga^yV)>KqgWW0O>biYT)pfG&Ef%9vbJj^uO+p zUuM-vv9f4?D_GkZ8d$&VzE_7EFhvUJe;`1hfus8`uW^{+Y=0YB*uHEyYwN#|ugw1K zx+uSmENq<|?f#P2Fr}$r{4IXDPp`}R6({&3XCTDi&a5qrOl*NBe;JK{N1*?0WMg6G z_;Rjo&HjP{KIug8A^&!012i!BB_6>_arirDM-#J`z4CIaUzan76@~M66h{*m^Ve+5|{%1O$SFrE&yOVgHWtUpMZnVQ`vNnD*b?zTmHW&(Y3W>ScL< zc@CN43K9O(frvBE$2{|Bzu4RZby{^!`d`VLxFNpbx%>OY1dLV-SbfB1bx{y9*88J|jrDEzskR~2;& z6W9N+9P;EAPw*%H$ASBcvwX2|;GZF0@L$K`pDaF^ggX7b{a;x5eJ1~ke}kQ`{3qxC z0spaXQ4T@-bMgNi+P~~4K_Zp^jIUy1Z}76O>>U5`kO&%r@Mj1WXG5EpL;sILgh1HK zL*qYZ^(DdI2mdudV1tZ*gu|Z<{BiRC%AkukM(j`eU)lS$T^2k`y-EJ?t8M|bFto6? zaB^3*Gc&U``6q)xtuTFbZtmBQ92I*5BNGOB1Dn4di~s;H<)3numzBLdGa2MmL|zV@ zqX`gbV*L9<22e;GG>$|2|4RL3TfYVaSmIIrAN5}{vX!zmwF4MJGyETwRUHj%fu?qj zHVm)NT>vln`~MFno*d#L%$!`TjC5S0EKGDvOrkF%VP+0GMn)k<5iTY%E)fn9@0X|S z%LB^R$mDeeuP+1^|38ONHUXMAsTvqsn*jVF^;aAd69Dk# z#{^*fvL<+d96$vi@;_pp01klo3&srK1aJXZ0gM2;mtGXW0$_R>F}?hVzQ_R5ueA~Y z;I+sgtF0;WTCwML!jr3p-mvR(cLrdQJ{T<`_lJcJG^g4eotSrM*;ljE%EPfLIAKA;eTEjnHd=w2_;Re?O)am0dO*8wt8`f z0Qj>8@ZuX5@b|aGm$icfa2KDk;9vUJhVW9`Q6*84lZ)wwcnwSPm-N3^d45-M{-^%c z8c;#{T z#~b`-03i-FE(*Xe5Ud%k%*=I`uh5L#w5{H(ndRHhr%#Dko+U?!?g_Ho%iuet2*L<= zn5qa7N{!_YjR-dKII5TnLdj~KqqrV{xC@p1XJdxGt$DUr1&)Lplr7NonQ-i#00#gd z1Eq$T5b(@#^XX>2y|cB|75GR-mp(o!RflD*PDeBbkDAbAQ)6ALX^Jd%3fUay=Laqn z2SJJ@>IM!X2;xWBLl_2N4G6#j>yRJ*hQdT3@)i3oJ)={nNqxos=(8lS)3hukznD4c zeiICgN2Jolbi>p(@sY)T@lb&6`F#4h>!(?OsqyMH+8`Ecs@qKH=XW3ZjCg<~hAO5T zVCPXICpYhSI@kd5oX{6&@Zs|g3XWKnVVtsdbpD8O1fp1cSRv1JcfzJWi)Y3SCS_0z z;PZXY8Ruz47N%L)x;zXbPvAPAS-?ar5j?83&5rk2Yz=+;)z1?;0oDNycP+M4QlhjZ zYv)Icw0-^7PBAV&=>oOV>Fn--A^Ma#jGW801jUu2`7I%d(+>o5 zH-zVk&^p?UAIV(OZ41vKoB;a1790@O5)$;5+aQV>6u!IV76yuy{L!!A1f>_)7iX|X zjKQay84oQ0BBum)qcBEfXKTDV65W-1r6MU_y_=D?|6LBvP53<>+ zWj-=IJifaDYSDHT=9~6fATHK;hGRm1Zf;;!p+9ctYJ4L{oTSJSrzF5E?wf*BVx<9I zASz@fCq?I&E~jRtpG{uAj=Ym!neWHuLl$mUz|mu0q>i5;M1;3+@{&(+(kMF)kWeoL~%X^cI1(+7CGQd zm*5TE5ZU83qYm+ z`dlN9dr*32FuGaDC#^A?BR?*BJ=^KpnV1fupJD-s0p}eW#%w#w(Nq<(wapCZ(&XUy zdrup?`FLD_@zM$Ix!Y==C;3G5u5YK;h2cWG*npX{2lhUKLXZWnWr)keUJB1-D5g(% zZ&Sj*(L#vYv_bCo47 zfrha-iW6_^wj(bsMh|zP@NYCF48jz~(3$sA3R*7RY@`lDAQ*An!1Zk(qyy&89E#zt z9HeHGulhJ^@k^QCQ1LPM^er>TZOs9wfi7edTJ`w`2xAs3D2YVdtoilsTqS|oK zwVWqoDG4kq7zIE~`a7y`w%@1>gW*<#p=?WCkI06%348RzcW-h5JAAU4{U7nS7@QA2 zhqF7fflxC>fPl&j0NBI1VS7 z8rLz_#8>OSUY?CQl>ginn?(Fhq_)w0x`zh3D+ZFKh!AZY`;(oU-Nu*-OGu#GMwY=R z&Ua1dq{B?(@{ShpVY1U9)7&-UcUCB%dD6`sZQ{b08S!`M%?rFS^8&Tsqw-bZ%*7LM zJf$uVCR9`j<+i&j)6)1a%#j1;1=jfp2YctlKMOF={lv`d7TTv5$KV#>P?l4H z?M9ZI#+c}nBsTo6P{eEg<{sGVgq2TYh^tP>H>T}6FEn8q`n@HoffFYC5S0{&KeV?p znB)W=NLU1-WbDqQu;qXw!Sg{C25UQ!S#d^B#U%@TKxW7DOI1FW=?2rr+OafTD3)7d z;sw0!(5Oc5oY4FvchDW&HmGbDJWVU@yDV?hZRvP;PymYC5V{Lir{^$Zc2k+0HDEH-lpv z1_T0}igjV5D*&YNSyUvcmZ_nQmUQq~bYVFZ&0h~WA!Q$RgFWp~1xnj69!v;Fuoju1 zru0rTXoHJ*$6_U+r9Uolwid`y$NK+Z9J8*hyF&-gQ_>ADtxHN2EPh?@STq#TW46QA)5@wEsQulf-Gd{H#9 zxV@@Jk4;IY*IsC^PLtgFp|xK$ov64t4}P;wH=%*yQaD;uzx`vg_->LHU``|=$$FU# zNwy2BDBB5B`?5Q-GPFjAamLC2nD;$T*b*Zly8KsvgU?TIy=#!0)Vwi@q}X|+GnqP^ z0s6&K&AMYPSJTkG8#bd{smuumXAkm=)!FH-weKSJdM-dYW2-86ko7O~W$#!kPjFc3 z@GbNhsHvoN^s{hk<})w9jINbrWS7hv2z?RJKvT8fl_=_$AN;XUJjV3idVhLpF}q=k zKx6#U_d4C!H!>owt}yo$-r&4_I$i(?&ILQx~XTF$kI_+Ux5QMU#{vUQIX4y^2QtQ20&5^?gXw8&WAKkHt;@4OLQVr~3M z9`I3TN4ZaZZejyTv=VVFP%)iIe?^puHc`Hltiq{I(eIJFEE%$!Qj)S<0ZwZ(WMi}4 zG0xhxK(a#CnM|kSE*E7*k8tuV9aA+Ko78`E34T)K_D4d^*p+`x1d2&1{g|Ae19%_D zBiG|p87K%cGWnq(86IiTkGwI|!^y)O5qUCQLyfYqNrk0P{Mp~NNXx`1ds<;A{DIlk zT98ZdpOc%SSer|vh33$u=h;5zG>jYqwwZ50CG?SSVml#Q%VM%kDPTfNvBJ()kRheS z{32EDDDtvVr3QFg3O;&d+7u$ge*$N7 zW{`i>gITdJFQzN4^4}2wSse<(yajiDHm`J&H$)iE+oFSn@}e27o+}QAL#O-EM72bW zin5x)M5i|CSm;1Jhaa9JrB$6+JiD5s(DgO79E@!+Pvuja7@gjjO9%(c38M&=R&UBx zwaNnjx}qkPSDr4iR@CtqYn4QCN@d4MTaP}4FS*Ms8rpq8J0L4rwsIhqzuc;&r^j%N zPqa+S?fQUEjI=P{QGU2D(_G7#HiA4oYukVjMcsONQK3DQysZ}7n68ck6fe9UU9mD( z4*H$)IbMEUBKiphs*)qhR?4>~Cx@($v&bTf7}WMoz2^pZNv15AxiM#|bw|jWGVp{7 zyD9So%_&3NW~gkNV!J$OHd!u~h@`5IdEqOl(#xZu!dn~=o$QG1fG`JIZYt61O?%i* zOdVg+nEK++8f259%Z5&ZU~~hK5AU}e-C~L1$TTZOn6zw1#0#Z~bk%#r@0zt6YNch= zy56ud_k;|TE(9~($A>|wkfxx(*^`)muy+89d+fBlg{M`-jAbZ<4(`s?K>UD}ig#%i zWfgPJ%d{vhM!*J8F8#o-G32Sqr~SUO{OwaL5)(DL3Z4b)dr71>>BTz8&bpLY3asgu zA5{vkxFI2y3efiYm3hs4_6mwZs9loc1hIPkk;E%|S7`fB zccc2aqaUCN0EIn%&!CDJ#E{Y{*y>3)vy{RT1ei5b!JHEU2NrdB`JCCx*?6$4Y)lf$ zKZ4OQ;=rgjK>VRGcEW0_2p5_)O1=l_G-Yv@Y{ua0DF^7qRLxjg*;+3et2XO3nr82X ztO%&$a3TTqe`xo$*6hwS`$;!BKv~Lq=Js!K<{OT?C!=i5MGs`I!nkfwmL&Rb9C1Ip z-ai)TjY?S+B1l7P(dFu|^I>{2Ri--gS!vI{6=xU%F0(*kbh)t#fdwl|Qbo@S7A7gm z4zSKqy4;uG-^Cl4oJ{v+=q|x=_lrJuAaVHm1T1-UVY+O+VO{eebM={TSM1-pwIEf3r7Tv?z)N}%Ck5VR8+fcxCK{sG3fPpdRbdrJ-N3Tnn2ugxprc^R zRXpp995;@$1P+Jt;xsYO%qM#qPlf=Nj&RLF>fhGm%t7F2&WCLZkqRX5Rgu4Qt|Myv zh7x4oR^(k^Zmf3AK8fmJX_zm6AO{s#VE-N?CC=ez96zVxm(vA8ceUkH&Q+h5!B3!S zo!0S`+O<)N>D*Eq=akUz$(#3TLEzFlRFtu2$PynRY-ek4@G`tWqkZ!A%N8qwNz&U) z-U+gStb9Z8B|cQo^F=vBa|S&vmsu3U zG8E-L3>{6V_Aa)enL(0rc#?pML)HGijE$jUs+ChlN?{q%0Y)u;m12f#AHmzyH&F|r zR=^YQ612vy`H9%HB`$+dFH`WoQSjK>tNtt)cS!3U2t0lgxEIt>8-gRJak8_qKNOuO zk_g&3e{KVk$|ET3`(~_K%xp2Fc6({JXqHBK2%{#uk>FmbDqi>{n`x(*dbr@|j;COM z{W;yf(0LOG|Hwtmfn?*6#$#oj0gp|;3*PSL=R#8;AxQeyvV&sZd5D?q1uhq42+7d- zYy4P-`iEL&%W?w}ecwi4jIUrBo9&eHv8b5l23?Tyiowi8fKHrQzh=QMyx4kinhPqi z9F_S6gm46kw;*3DJ2~D4tz9tT ziSKK7nm(T1mN`(zcrs2^h|p|ul7*~Fw7~{cRdP?cZ1KG*78xB>NwZXPurex|(!gHj zyNqx{suCFkTi6H-6-|ZrAWz9Sl~RcwM$yeRZ|g|io80Sp#a$o0*t|3oMiU+q7Z%uA ztgA^ROlEJ5EF>XkPZ@;3W_WeJPaE76t+44S&t+qVnMi)&K6(i4WBf?)NOm zdLp@`oo8bsb=xZc@)-<_QRo-~O3}E86|_@L<2^=oa~UG?ILF#;m4k<38_|!%!9RB} z;R)Q2;)NJ`Cg&aCX7_Yb#0Dd7(JLEYgX&OsAvqmJy+NPu!F z37*TILbZGc?;b4T9{5|cp62`=-5=-W78x%)y)&ZtlQJfXqN)WN6=Qh0m`SJ+FJ=c4 zgI6`0>`tlU-otJfAdaWtI%j6Q$6{O*uRigEkLzf=zPZmvk#Ql;PKFF(DxkTYBKkyB z%T{g9CExJ_r9$tmN~%e}CGGm?PD+sJ4kKvjTgWz^=1AxKJlRI`6E%dCz_+MaBgd%& zBf%uRcG?7(jH0DRoYEpf2$A=(84b@663YUkSp$$-O|ud?UaG0FHTbd92hYwuqlv&&>@iNIvvLV-N*p%!r~5 zanPQl!pwN0@S&X-$nVJ?;Ovazhsv17X)d0E)#G+wc`hXytjBp64N+Hh$L19qY1TDQ z%MCYR$iwX( zUx<&IX>_ha)We9#ek*Lzta!?qSXp zsHVFds(S~F-4B_%{ZgbL(qS;CF(zo|YR9(7bE=MVw|)ePz79+yFz;$ML)%YenRr9* zcm8;@{npodZw=5k)64rkbKl<$)*f~(Y3ka;?U6@$B{F*cyJx5eEbyy}v`TkLQ1glF zi63~!&0}iZ?Zw!r+)BVs_sRNTG~dl0bH{fB-0O7&m5_eNZrjf-msK)pb5bIf>>zYr z%RGL`L-uu`AI>~M-BClq;Z~R0Q!p~I-fwQ!m$c_hXg=rMYqgXfJ1X!WMqW}6OBtE4 zqnXg7yArNl+9N8REBI4*_?9?%CU37hlqWrDc#nDrroItZMY50IU#K()Iv(H6Bpw`{ z8ky%DszlhrsFaLELPc#40c=&~7cF7ov_hnx;*%eextc2bcJ&_*fyB2sAMBz{E@ely z9nj4_WZ^7LQD3yEtRtqYXL1u5D&5AOZGC-Dzdm_j30oitTr}i@LW`);fQ{H)Zsvx*1IqfU|YptFsK&EQA93q8t;Xz29K{rwyhGMLO!)O54&iHRt!3N4y` z0aOiSYb6y9gbElwF+C5=x$P~1AJ-YJ>M4N7(k!m0i)N6K{YshS5)~O8*xHbQ*`{Ut z#<;Js^%MDFX>>_al_~*8E9Af!p`TKDb*bo~Ubw^RLCf^dD1M8{3`!x6Nh8T&8~qRP z3&WoULw{bTWQhm+EpzFEvgk?ox7*R`YrJEB-q?d}SUX_w!Wj0xeS>}@okF>YxZsRv zF!6rtD*ChnlNpuz=eTc`XN$ZvPWTVTNl$xMQ`l;@R?%xT+u%lX+_z(kE`VuCQB#=$ znQkR1BnR*@n(f*v=jUJ|{FPS6+3~U}lYL6zC6OW3zHxdQ(fW*{({XH|$T->@%2Q}` z`A8mZOWAh`tq1bW+tgBp{0(&KY|W8zWna7gbkhhb`QW5`g(frc2G3NJWah(=ky2Rof*}b?r`hSv7&d(gs8Sfp^HK>PsTj4tUCfQhsH~{+QHD+5n|cGA z!B5uDAI}nS$LeT78nl}Pk9^0vYTXwpG>d#IEVH**NgO}Th*9##)borayA?FvIQIBK zL<}Tsp!G+@a!8^Jg;5I5TMWcegL~zh)Cq8{AMm6=G^&1Rpum{kr@cEHes^-FRT<7C znn2|+oI+H8CULE_41FI}1TW?}-5%Uuu5v2Ntu>-0-%x1rgQ?rJIeK}!uXb=kVlD*8 zTE)_TS_726+8rJ7C@svyBD{-;Jr*+GRKDw5+b1zvrNQ_lz?sh!re?*GllS@KlZ-p$ zx)VcAWOrgH0?YJ-PL7$mh0j%>ohc2NGt4(BI8Yu1_Wmb5GGk(Fli`3OVfeK+5q3NI zx661iyJu+^qQiBh`=>}z_#^lRr1D60NltE*?PL`w&QXHuU}B?u<*a_=AwE+$OCHpS zgq41K(hz0Pp@Jo}LLmJJo}o@#l2Ng~h*vQxyaI{B)#4|t z9URRDV4#MoWAxoF5rF!S310|~$dcCB0BmGd&XPb%h%)@*OwFtC_#9r_7#^q45LdPBZ6sCFNo}G9;61vjZd`6u-=J zVlYc2Wo*Ay0mbs|a@-fy@2L07n@j-ZhMpiSJOr>_UvEv~{?Bgo$xVz&jnKq6i3T~e zit|J_VJ=5S8LEQvBk_s2JNX0V>N-zSL$G&r7XqZEvh)}fPz>%oSIh2&dEl0=IO!l| zvdq%qr`yF}qxiuKw`wUhtZ=in7pXW*k*v6g((}{@tz92Ib`Ms$M&H|&Amx3&LF@p0 z0e?>TMx1LhJ=_#YOgLBz#~5E@F(+%JD2bKCnHpIjp{n^68uCUXJoe zPJ|x!KoY+IQK?hm;7IMLdq`1@ZMMf{N~~j6x>T0FJDux!O69IJ>Xwp!mI#^O9&@b7 zRe3IXXAG8LsyFG`kt|uBPDA;jJ-$t#7i}tL_q*D=4$|L zW?bbU5`m~2S(pblRlCRC!}
_Ac1Op!ydrN0-9L0!n7AItWQPvmcax7wp-hRBX>* zVnCzr0!+OjJ#rc7{61Sudug2Lj>(F}H}rqN8>^~FSWlu*40a(^C4#HKZ^q7mMng>( zRLweLX)mUxzt5vT=AFDOkEWC1NKDX#^ zgPQHJ6;+9C^7}1(sn_b)oc1~FQ3>JWHcji#bVRn~Gk=2TE_{bStl_pXBx-6Qq}AtH zt?Hm57eq)gtGmjq!u_zS?SP-@EqVoauT5t2kuPmis&+J~3=r^j3!z_L%bB79l0m^? zi~xjKq)at{ZvWDWd_)!4KIwZCS)4!0y!(Ocwen@uFYZSk5XN zp=n${HVEdA^i1Ee18fW05DInWbSU7rZXI3{(Guz7lC4b3+Ip}1)+wX|D1kgVm{`w+ z1>@QWus*~ja^Rrw9Bzzs35}hVQKzqOrxLdJSfEgA7y&L*Tntc*6N$@VTK7u#00$QR zv1o)KFK5nQavP=Yc%#E-eJn!U$D{vtwR5#pIokomFhC?Wpl$fA1Tj-?vdBjxR%HX4 zI#s=BvYCkC%bjk#0oU?aUt)SY$#*@%*N5((qWkfDKxjN#4lBl@(c5&*14pB~rFx*k zITPFBXb_81~g(q`QsDJn-<-le3u!z7~E@x0tmx70u}( zura(FY#Y@B3tv2iUDDVJl|&ci3-u!!r?whFHaaO2|v@w+1RDRpTg64;xcG}E+k z&06y~u#gzm@9x-lGjtfd5qYF@gC|uQG6-f}5!o+!mp-Q4I(c2H4b5`wmJ}lSPY2l$ z^j@pMJM;s~-g1@UP%B%AZVvMrJ!0XpVxZdx+b3kxlJy zC?t+EkVZBqY_DFhPKPh3kXoEtbTH@Vr?fNlKFfjJvJ{7|un4RE@f?!72FTD2=Y+T7 zNEOl~;^0T9x_!kqnimLmF|kunhX$K@lnj}X2j8&$4kn~g3#4<`KVoEbTyO$^X>mBl z3xa2I4SwO}7b_+ip>{0pKx6gL0h=41Zfuj=&GX$9td+vnY@5aO_|Kwr4JOs)@|e9Q zyUg+F(Ie??RIp#;Jn-h`LB8x7PVy|K<<0Q(WRW0#^kh=Q%>rLmiBfg9?hj?;&Ru7d z>YG6cp}>LKRmur5AnAV)zO0qkf4C_cl$G6YJbfPyen=sCTdQBdf(3^Q1r>e~Yc|;cYSnk!%AW3Iy z$4$wH^D{Pp^YK&}6Rk@cP8lERyUUzFe54!HuL>?+;|Tf;Zi4}__iMm=qUvK>%QZVP z&uKViYRw#go0EwgDTh#|+zPfZk&vfi^kV zAj?DZjy5_&=N5JED9H51w25<6=14q!KNfdi7l@^m@b@!mWtQZJVcc8@ZI1OT@Pe^VD zOT7%sM~5ZKX6u9EGzZY}1%=`b6sV%%UX1eKg<1@pLb@RT?cv1$HP%LUox@8b6$R+eo!|u#IdX(uT><0 zxO+me4TpqgI<=9L-F`s9G~X>U}QHO7CL`FovBa&9tTOExGHvDvWi)nR|o-eXo!~#%uTReUi|)d2`E%(~fw?svFua|i7bgi4@6)ud7B-tf_j|hWaO&V8S zLLA+$?FGTY9C~CHe!X+nmh2F?d>Z#%)8y182zyWRmE}hU?Hmfy4-?DeiZ1xNd;KfM zWs}E>QO}{_cRo}VElG={7TNDw=2n%_;{!>uO`9tb~>4*7p3^QI}&8+VF$==oq1 zzQQ;(#4A|+M4XB(wQC?RzTL%@yB|A4X>Jku(OrxBv?%nOb^W&Ok**C00h_qLGb6Xo zqo>b-kXa~*`m*2Ynac%!5+?AYA86pW3;u5#Keo9;cWr&9P6I;gd9HKZ2kUMS;B%+C zx_aV!Ff;A^w0wrI@SPW}E8R&CzI+m> z2FJ1fCi^OBcD%;Vc#bVs*9-{QaYs9;juam;2w zB~Y^trAkYJvmgRMVnvq?^({j2gN3bz9GsU<8Yx<}(nAOMH4K& z**Ag7EAmgmMU{;$dNeZPtL|G9Uu%(yqszDLNvrt+iJN7;C&=v7H+6lG@Tv&IvLrb;PX4-;~J+!?KA}AIui==FoHM*@Wg3 zhOet#x^0)yHa!ws`|_dZL*-))9{uNg-r@}^Ua?b@A+MH$nKcRh?4t$tnL1r7#G6@| z^V=-Ge6w>0HVbU>fG7YO@%YC+-w49D!$^?{GG?dQW?UW@0w}oOCy3xhFhWPXDxk#9 zQf@$!jh;V1tb{ovo56Jx2sA&(!+3f*VmC4$QD&n!;l<^u8t<}W3its+jRMvV5`*z)vo{Vr7%JhI{R{z{RDt2=QDXoG z_y!eGM_i*>FJ!fE3{E01{|jU>6s@xAL%l~W&e*3oVu*#cA{E9%(-4s_RP0`{C?>M( zn}fNhJVj$G$#;394%#!ICkzkddkPdxtA**kAO3a4)Z(YX#O$mD^txhJ3^6ZyQC}8sIot@oe zjSD*%WA`jNScKESXuJd@cGN^NF6>38i253wJJ=HbFCNAY@TQsOqg;!G2;T$fm7Dox zQwZ*2WIq~dRdW)L@tj{g8C!&GkvMvB?pfU?F*E2X!$B}z$GETFJs$>1b#ZK%?8f-h z-WZCv>+#?VEeKNIV>*9GyO1a-Z&^G^M-ud&Yfc~!ovFY4^zx;l*HkU%dP{PP{A@Y8`A@WU?%Pm&a!wXaYI2&r0!i8Wl8q0=YxS_)rIP{H5R$J7vZ* z%H~KXXYHPEC(lh!-*-P8F9-?YM60G7flSx>pO*P(_X6Y+yo5{BY=g|K7Rr8dX4!Dg zDRLt{<1f&m@3ChGiG+0xoE2EYwAOSao+|LtKY^ynr&k0ecf{=7U5S$DC1?nJ=W4Xu zc#@V2Uv~L;CV87efJrk6L0XT2@^jt#!{qrqKoQ?w6Zp;#VX;RO`6Q~6Uv<5htlLP zlbkdX*k^WN-#Syzk>^&nSx$9VdNhwb6~(8%XQ*i)dbrj!{VH1JYKawwTL{u=h>)y9 zoXBH(wb?eBx{b=_izgR~nL7c6v;h{2v=X11HNf*A$dX7fE-SW1$S>J4 z6)SB#9^n#-(m4#HKnJ6rU=v-=FzHM7BpmTwzjiCCRh~E@Uz@SLb62fgn+aJ1nfF&w|HLR)tAh0fQxjTR z?i@rN^~oq0sua*?e)WaDZFdZikqSGe>7PM4Dg@$H%-&phzO)UpiYh)mJMpx$P16D+ z*c;5kRjB^e$Gtb{0d@Rb&_cU}{{DScB?^CS7qD`NQ9XsL@grSoi2Z$ApR-rG2VCQM_qm2t3**${Mn2-up* z-#I`kB}+)&ax0(N_|#052jbR!<&LUpn&&{F&SE?VwCo8oSFP2IbUhSfUrDp+6fBQq z(v`B^c;jl&Y09qP_jB!CND#^W6>kA~9y@>Qs2joaC(vpka{i}TWTu>sH@HL({$Z^# zTLJkg-oD{tv`EZ4JHrNTZzjzGUczh7)_eye5jI$D1K` z5s0`ki92JGkNUUK#jUNS1xiSSvq@K!^?tmJC{gOqCy6J_kR`6O>md1R(dGdT=3uHe z{Dm-F`K^XtBt;T^zQwU|OxA?Iv2x=q(ve%%tRwYN1_YW>Zec~>R0g`;SyfKw(UU94OGF-c7!u$`Ytx`%90WrIC@=U< zm%4UMm2AL56!YhM?tHX5@@>9|-+5v=l*omgVDjgxs!{PL4aH*=GxwoYN@#wP+Z=ep zgZ6|xfPbhxz6u7(7oSDOa2G8XQ;s0=>^IIxf7E8>jW!D`?%!G(e3Mks@WJh7HWCA~kT(8!UkjxQ?si28<{~Kb{nao9 zhLOY7Y90Dvv%eu)?mD`T#P>|hje-w(sMAa5L#K)s!sWN{0#2Pb1-E7FED}#-zI3Oj zA806Q-{FoQ1kzL3bFpt!x%wYgp1I6oNqk+#Fy;)4GweaAR`$Rau zOL>>)-*K+={c)_1?3{Q>_>2GO78!IFhf$=><2@3Dt56*(J!nota?OQQGkGB?#XDVr zalD^+PTyoF+Ki)0BLaoDqRA=s{SO=H<=U#c`mLwdfQu`AtBnC_X3FSh8lEJ*vFEN%nf9SQOzP-9><|tTHlo_x zPeHH^tj_{npF1jQNFhytM;aVT${5m&;}Ty;a?_Aw$s>Sj-tVfxORc=A>QZB7(uvX4 z;pPypg2U2_jPfUktvKx57MY+M_HV}L(liJKhiEVdvgQKbz}qpSga+Wj$HxCI^%<`w9!Qo zVhMqBG*GTyT?VY?r#A~#V8RMXX9u|5q7Kil}5$4Uf6ULbQ6WbsxcH-{7+0)0(esBBv9@?ET zGEP?=b3L@iBkbuwSOYm^>QlVcX*9mz)jcIEba-fV97e#FXC5HvpqT04V(>Iv7FEbh zz`%;#X+Q)G3Rr+rDs|_k?78`h zT0}0Ix;7quL~2KJ#rv8s-~U4a-d~(RE1nTHyPIIQGp_ecGohRK>q;4{bHPhVlmnE+ zVgOle9AQ64KY#AKzscDUOsTP@5K*_oP@m9tw(WL~BOvtH$_z=7W=El82_>-TD$}ky zL@aa1-(&mHA6u>{u~U$O~*vdb`bASs{u)B^xjVHn-?jYjIe?(O(c*2y!(+ zsf-`swd{Q7(TK0HgF&}36xacQZ)lqubv7_^by)n0w>i>TSwf!~nkBi<_O4~r$i z3akGN+%|3FXTjFySm9=sH51k11+l!02&%~#-Kc?JBr;n*wXU0H^gg+r>BAHtKS}+FS9}1zHET%FpbU zeh1E4Ovz0(^`y~;#;w&it57sJPCX&Hlqh#II;31wRVb!B)L1e<@Q%H*u3EI50TcEK zDVfj(=Vaun^~_vj`FR{Pu!hr-d~gBgsjyNTYRUxdp_2U&uT-Np0(lCRZ^_bYL_uVR zS17I5@FyXGlLiKmGuG;XPR;eh?43=FGMq%6>4xSRgiB9842dfa%akfM&Bn1B+i|}6oTN%jE-$hQ?KFRLAa9fvGL#PAwp}rqi+rjRX-Q{xL`c4* z;gCs1=qryZFb?z-zTlv1%aUQ1bWUBN`i_uij2HuMCX1aOS0h_G&b8Y4W7xB;lob80 zxk?b)hCY`NT?hdg-3kmK%&N}<03ey*%)K91J0{m#kmN~fbj|;8-i?SXN<6!9EFbI5 ztM{d@f^?2;ihA!S#)se6=e>oonvR`w+MR{h#Y^-saqY z#ylW9J*1;d%F|coqI_OPJd(yw5^5T~O@~|;i=kFY$MBYeT1k$fZjE@H!*H5*b;2Ou z^1RcPIV2<1RX8W~0svSHokbz+cTFDzICigHzaQ&P!4lxKtWXo!{h9bn?GN`)WLbvhpbKM@5zGQx?+!o&j(dB$TsaXY~( z$Dqqq`aO&bpXB?v1}Uq(_|$U{y|wSyPTO+sOd?vr9TGVb0&$bMXRTooS~pl+xmsjz}&$veWP}P&1mo07l}dXQn6gL{C_5 zQe!Qq(m*Mp`8D%%0$6-+ z_kp*)gFy*2ZxlgUi=%c+>DE2T#fgDV#l#i2;4YAuQ}z$|7IwMHar<{^{-@X5zoU>5x5R$Z-zFGSlMHnrK{}Ad1wZA?6F@yEAB%{S$Vp2PQfVH0>C+VKZR{0y z6EU2JFM6I_tLi7J$!W=`7zKr+#U|9JxlCjt9sQJ!(l+idb98%rhqt4X3s0{uoHA6j zqqJTe5&)2{cfXdxiNAx<77)wzJbz0>E7n=N58&-B>6Ix2SB8EjqdrFjd--$j(dXI^ z`$PPEXUF63kAf~Zj)gJsCY5Tgu{l12MZ+VpE%b3o+sg)H3^PfMTq3Z`l$Q{^>r-x3 znhVm547i?(TH_T(Wl$7jNfY-~3IaUK32uk`V9y3lHa8 zrB3a|RUl1??gT7&#Lz9>%9QBN3WN}&nh+jj6T7NkX@hJYQ>f6;dFPZStw>4#nnhEt z9YKN+sT!KMA{4oQm^v)Pmvl))ALIn@&CEAV9?O_5~aa8Z&-sE_qXD;VIJ?J)t#xO#@XPfGDMhHSb4Qfd0gI?oE?#y70ls#lSsrvV2VIIFl4mDva1c!3S zVIsE1JoyB3fT)wcbW2$$LfW6fLCG1QpZKvDzm?*{=bS{^&?K9g9th?o<2grqTI>!1 z-ZK3j+fuYNi*Lh7dv9`6oTcZ9d-}GHELzbTYnFX7i`5~e@e;Q7d6E|E>NVpB>rtge z$>)aM@V}px$pmS;%PTmA6A>btTYs<%HXQh5%Mtb|k!Gyun>&r!&;p1dS0BZ3((`Dj9FUg6Gu6vw6;-P0RVQ?5gL|7gF>gc=XDzG>>udCRLBiF zPgFStme*|qUf5$0yV?eT7^l+)OwEMbTlA zWOhZ^m0q*vU%^qHy@*9(l`O@{kmEtxR=*m>N*)Z2k^0I6n@k(M68XlqdTcLrBH0pg z>0GC>Qdko)a;4m*b@-?UaYJj|`k2Z~wqno9;?zzm1hQHaGVBx7(HD`X_qT2N#imMg zjLWhJ<{FNc^(t#FaLN@~Gy!M(6j-usepD_KR*p)dK!$xJMrCZawGOyAo#A20cQ@`iMzHE2FdBC%;+Ut_vTkZO)Noon7aSe%5UoiXDz*SKCFxh^Ssa{n8nl*c zrG#<_eciP5F;hV_0kURUMP&|w>1_Ei8hc`LVU4}|8xb@L$7NPr6&Cc3SDC*^c22ct zyx|zWR0(Iusd)yjJKt5>yAL^XlqQlhca1eynLSB(@JDj-Cd13_q{yda)Dk9Y{*`)oVGFa zWGM{F@`^l8uKWNV+5%2rjUh?jCYSk+neD~s>gl*%#A{1?jzAWrAOk zH2Qo07~aP&>GB*kE{#2$?BfQ&c-j$Sv_X@zVP#pkf#PRFCuFD%<@IIeMVZ2pA|00h zxufk6I*nxBEZ%xhHPzHUHPhmjVuh2v7#y%hWCk`rmuERt$$#p%7g{2rl=N5u9Od9n zNPq%+FG^N*G*4-)I;wpQreb=R9jUV;T1;%)XtfNcS12O{;jvY(C`t>(8>k&m$>{Jz zy+DN|e5J5CIEbQ>z(E(ay|L&3N7zY4AW0Zfy+_-YJb0zdLvTaIOjLSywlstJDr~-V zfwlA|L{#6(dok}{6H422tZ@FHCdIV=YMFkA(~~H=?Kl<^hXj7PvOtzDL{uX-F)TL? zPOYwVdy}LZoP9hF?u+e>+Jxb4@D{cM){ib`jkI}%Q<0&~ePX!ZAQBKP=8%-|m^sjM zFY=)ZL$MOe5!!&jLwA+M3|&bb?7M6VVD|gmaS-S00M>JmTIoSLX8HkXX7igjmw)Q1 zP5Iy6z4(<;mY8eaFbzkI-lh!H>~j04+g)W0fKCkWa=*ZhyGkz_dUvol#vaeRp+wrJ zW6X9Z2@>4INU)&}=1=|>kFn*pxS9tDgmIh2uXW~%Ro_t*_yV`5+6w?;gNF3{2=@3= z`+iquNM$O$F``y`*Fa&K&8Y50=*d8Kgd>$2$RR*ER#r3;_QK5j0ER{@jL9PCi->c= zHD55}fanlhm_b<6eju1n1-z)telIBMB3l$>-LlMmDe;IGOk!7)Plg{X{~MMj!9*)F z$HD&Ew*JdgaLRiIx_+_0VX@Ho=I3L6(x+L9Va#^gOTWd4waclZ$K!gjHoHtM>DCyQ z8O%{G<@%vG!F~uY`pq|d_uj&UJFVAfu4<*AHMN5cNS;4aG4-r-GtqVR<`*W%qZ$#` zx2Z`9UXNZ48%!m5!XRaM5aLiWfm|fqKLi7<3?QIYnW#QV?f9{R;`f~hl33&Bc;Ue~RD@U=;VvQ1{y?JnX1xP{>%1mxC zg^0ptlA*<<40Mbm0_gv;PuxX&SL(GVFEeZ6%4YUkZw2!e>{TfAe{P4?eas}v!w0}H zW)(F^OwA!=WaraU?f3cg_de%vJk-vHb5&yj1<@<+ zNjK_)d&+Ac51d4VN}(ZR7{-v_x#){62c#rDepdVVI-vF*ku-(8@fD-~3;=q}Mgzo( zPVXJ=5v*JDmycussn;Je`;7o!1^xT3aKEc=u3ds!4g)tv@yCB(J@0SGcc^tBgs8rE zpuK;Ckum%~H&$(vte5Oh*Sn6rL`Uz+W0Aa!h`Pj0 z4nF?)OcZb%Z?+&`lhA9#O5RI=kY!kzb%gi;zW9oBxiDxq6IR3{9oKvnhLe{4GEHNA zl#minCGs6&xvd=>{$;-SQ3`KXkLq5rOSp)6+1NPAEykaEg^lVB^bJ6bsa`_{>5e0v zQnWbQ$%Eg{=iW8B!knv*ocp512Oq=44Rmd!Coy?}Ob?iDvwDsZL*ygBkgr7iK>E zb>HNuRPt{KhD0#XWK@2Sz>Oh0pj_!NEIbbr7VoEB7bt6ULw6lzR?s?JL~m0DUQL;772{% zX;u|}@Kscg&$dM!LA4`J1^Upv)!)EfVmS3w{BN!)ef)>lr%WiJO|z=IXTpKHK4^{u z%7&siQ6?gTci(vNHtndauPWt&K)gd9{bV9W1GAdD?!lu^-dWT64%+8xu-BiCIXc<} zX0xJ!q{$`TZ^wWvWmfZ+7YcDh>Ut!|uvq5qLjme2?Y3rg zp1^V5Z#A*vn-zx!!J$O)d*T~51(oA1Y~VtgnM`1Ye`0c9%o%1R_1g=QqkNfsuz^P; z7-2(s9_Q4}qdQe2qvXQ1V*|71Hx}8xvG9KdQ{28^LtL3JF0;`Z6)=ne+dkkGR91QS zXScoIiD?JyP$Z+*^xTfk z(jgbm)qqR$qXo5A?6k4kk;ydL35#S&f`7Kh^jkg_+*~pMjWziw*&9{bb@vOg3o^rp zvKbgsd^q3HC(U@abU=y!YKDpSTjL;!74$+z=uX7ngxKvfxXYXuyRa(9?Q}NPRnkK< zZUL_!E5n5RUvtvzq(ad*Tx1BSI>#&aMRukw6n+M*s3jjPtKQxG*Vtp8$s1&V+@;(2 zTqPCL{J%6sBReccxPT zh5K> zc3Q>)id)u_SC>mkE0I2(XK@BcTL+P#2ZcwN471v(XR`D8!4r*!Mosb#{-k`WmX?;4GF`X?N0u|OJtq4i_JBJB-ou5GoU<26<^mV3p z>oGLf9%M}NO!E~e1D`mC;=v)ECNSuPnk%r!HD4arpcc+951{Dg?CzOI*7^VN7zn#reN-3f)1GVBP4^j3zA;oKD)WQj#pJr zCzgDny-UhJp1a67)(cTtKxRd~9d!cH75II+^+FmI2<5x>H+7bLfEJXwnvQ-A<^n^# zuW5S$ymy8sBgNR)B~yf1+n@;u&J4&R^oQ34OVq*~olzd`>2&)6_3VkZ1Yw8R ziH~eCcVVAlOOK)Mo<*G0dA8S&D{JUfT+ z(uwT0RUl+LQ64_&%XcQbeuq96w&iJXH{!e%b~6VsozgL#T8a8?8jk3#kZsz1fbKul zqva?*;Cc%#xTrxF5@AOb!zc2@(--*&82R4&-Ma%Gz!tj-M3`@rO>g(aAyCBQ$BNbW zgY@cqj@-y7!jl)@0N*$SfF&QpnQC)Y<@bNzpHD5M8&zqQSa2^khJZz-XDX z3eXRe9$jTWao&|Uc^HF%I$5Nc=FL?_Ir6JdYM4$owFMGqgi!>oGK} zVdhoc!jnj?WUjRgOae+~T{N8-#a&!%lEpRv)5%C}(>2{SCPhx%jT7ZbNUP?&uJw}M zoxf<1W<$OnGS}GH^|?;Ma*e-<*2F@;OznANJf1S))Io!O5+u0xC3%L z?zt^W=BV!fw!da&hT`jH>+{z>QMWN-T4CJGzxR+>%e%+H3wAVF=?oVrk=`_^^xXqi zhWC5B#4+ZHl#2@l?(3~$mpLq7gTF5)Sv;7rZU(Z+mAXCsoy%!I@STHPmT+Tw;iIb| zq@Z)*YnH@}L&KQciAq-KUUs?Tc`EbecqaXmQxJMNg+e>{T&Rm`#L0d!gCK8Xd{sA8 zr>SEJP;ep{H?msioQVk(-maWF;Nqofk3ek%r=;};y+J)ivIu*&)BomRZa{Q0Q^Xx@ z6`g$uaV!1)N!T278Kgr4ukViWb!N`Yp)f0-EW!Bq`v$>)X$=9KeD8XUNPXbnTjJHu z0d%tHPhDXmU4&j1M6jsPB1u)b zD{zlab*74LZi%`oBu?;LNru$RO1$o?7VSz*|H>{UzE>Xfr-kLaGw+`zEM#Rf1v|1db8l~Q^<6j;ZK~O$}GT8OLM&gC+h)xMvjKs^NaDiG0o$cDX zlIFj5inW>W5==Ct9Y7Bo9&mf>fW>mU?|f8b(WO^x&{VXP&f;{ok8AY`4KK}(=vV{( zR&0512hlZ$K-pz0flt{}3o#}&r27kP5^h;EBhjkuuO{P$Ld}ur^{g(Rr!*_y(?nZG zcc;lG2vjL;>k3hO)+|0si1)p}7H@C|AS@EXxWf%je@32+PPx36poo;5nm}6V3}Y&&}~l+Td0Lp}|7C z9bP`Lfje7MRBH*`S%IVx=QQrBuWCn>cgOGoC}$`!7&6TYizxQi4#yVh>V z>BOA%lkS4pr)Z&UTiDzX&%q~kYQArv-1z2bL!GG`Bz^`JP!}Kb@f17Rr{tetOLp<_ zb@8ms>j^>Z)@b-?uCntzr^r!|I33oXsnu?YqmoD(wMF9?BUZ_<-QfY2gb!q{ECoq+ zf*M(aC1wjgmJJq7c0eyx)6~sijWb!T;RK=t5yggxoDM13H!2%5o_WR1{_bXQjukBs zJ%iZAILVU6&FP-0B*W{tkmZQ8Ivy!kSN;%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/TB2K/whatsnew.htm b/official/2.2.2+2.4/TB2K/whatsnew.htm new file mode 100644 index 0000000..1a15e9d --- /dev/null +++ b/official/2.2.2+2.4/TB2K/whatsnew.htm @@ -0,0 +1,419 @@ + + + +Toolbar2000 Revision History + + + + + + + +

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